Необходимо прочитать значение элементов массива из одной функции внутри другой функции, используя указатель

#c

#c

Вопрос:

Я разрабатываю код, в котором мне нужно прочитать значение из одной функции («Read()») в другую функцию («compare»), используя указатель. Необходимо получить доступ к значениям «буфера», присутствующим в функции «Read()». Я попробовал приведенный ниже подход, я новичок в реализации указателей, поэтому не могу много пробовать. «buffer» будет содержать 9 элементов, которые я скопировал в «adata» в функции «Read ()», эти данные должны быть в функции «Compare». Ниже приведен мой фрагмент кода:

     int16_t *Read (uint8_t *buffer, const uint16_t length)
    {
      static uint32_t totalBytes = 0;
      static uint32_t respNo = 0;
      int i;

      GPIO_ClearValue(PMAP_GPIO_PORT_DIR_RS485, PMAP_GPIO_PIN_DIR_RS485);             

      UartRxFlush(UARW_UART_INDEX_RS485); //this function needs to be executed after the GPIO_ClearValue in order to remove the "zero" value from the buffer
      respNo  ;

      int counter = 0; // counts n. valid bytes put in slave response buffer[]
      do 
      {
        OSTimeDly(2);

        int8_t newBytesRcv = UartReceive(UARW_UART_INDEX_RS485,
                                         (uint8_t*)amp;(buffer[counter]), length-counter);
        totalBytes  = newBytesRcv;
        counter = totalBytes;
      }
      while (counter < length);

      totalBytes = 0;
      printf("n");
      printf("Byte received........");
      int16_t adata[9] = {0x09,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30};  

      for (i=0; i<9;i  )
      {
       printf("%d  ",buffer[i]);
       adata[i] = buffer[i];
      } 
       printf("n");

    }

    int16_t Compare(uint8_t * message, uint16_t len)
    {
      rs485_message_t rs485Msg;
      int StP15Vmsg[9] = {0x09,0x31,0x33,0x30,0x30,0x30,0x30,0x30,0x34};    
      int adata[9] = {0x09,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30};  
      uint8_t buffer[9];
      const uint8_t length;
      for (int j=0; j<=9; j  )
      {
       adata[j] = *Read(buffer, j);
      }
if(compareArray(FWmsg,arduinodata,7)==0)
  {  

   char res;  
   uint8_t add, fwcommand, fwaction;
   uint16_t fwvalue;
   rs485_message_t rs485Msg; 
   proto485ComposeMsg(amp;rs485Msg, amp;add, amp;fwcommand, amp;fwaction, amp;fwvalue);
   res = GetABFWversion(amp;add, amp;fwcommand, amp;fwaction, amp;fwvalue); 
  }
     }
  

Пожалуйста, укажите….

Спасибо

Комментарии:

1. В вашей Compare функции вы выходите за пределы adata массива.

2. вы никогда return не получаете значение из Read

3. @sebastian Спасибо за ответ, какое значение я должен вернуть в функции «Read ()», я пытался вернуть «adata», но это выдает мне ошибку «Ошибка [Pe120]: тип возвращаемого значения («int16_t *») не соответствует типу функции («int16_t»)» даже после попытки вернуть «buffer»

4. вы никогда не возвращаете значение в Compare , вы просто устанавливаете локальный массив, который никогда не использовался после, и никогда не делаете что-то похожее на compare, почему название «Сравнить»? Compare не использует его параметры. При чтении вы также задаете локальный массив adata впустую

5. @bruno Я внес изменения на основе ваших комментариев, но не смог получить значения «buffer» в функции «Compare()». он показывает значения мусора………

Ответ №1:

Примечание: это не в строгом смысле «ответ», а скорее список замечаний


О чтении

подпись

 int16_t *Read (uint8_t *buffer, const uint16_t length)
  

но функция никогда не возвращает значение, вероятно, вы хотите вернуть количество прочитанных байтов, в этом случае

 int16_t Read (uint8_t *buffer, const uint16_t length)
  

Статическая переменная respNo только увеличивается и никогда не используется, эти две строки можно удалить :

 static uint32_t respNo = 0;
respNo  ;
  

Нет причин иметь статическое значение totalBytes, потому что вы сбрасываете его значение в 0 перед печатью буфера, поэтому нет хронологии от вызова к следующему. Оно должно быть локальным.

счетчик бесполезен, потому что он всегда имеет значение totalBytes


UartReceive всегда успешен и никогда не возвращает значение, указывающее на ошибку?

  • если да, то бесполезно, чтение возвращает значение, потому что оно всегда будет длиной
  • если нет, вы должны принять во внимание ошибку и, вероятно, Read придется возвращать totalBytes, оценивая количество прочитанных байтов

В

  printf("n");
 printf("Byte received........");
 int16_t adata[9] = {0x09,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30}; 

 for (i=0; i<9;i  )
 {
  printf("%d  ",buffer[i]);
  adata[i] = buffer[i];
 } 
  printf("n");
  
  • вы выполняете цикл от 1 до 9, а не от 0 до 8, так что вы, по крайней мере, выходите из adata и не печатаете значение первого байта в буфере
  • вы только устанавливаете adata и никогда им не пользуетесь, его можно удалить.
  • формат должен быть %u, а не %d

Вероятно, цикл должен быть от 0 до totalBytes - 1 , чтобы быть совместимым с приведенным выше кодом :

  printf("nByte received : ");

 for (i=0; i<totalBytes;i  )
 {
  printf("%u ",buffer[i]);
 } 
 putchar('n');
  

О сравнении

В

  rs485_message_t rs485Msg;
 int StP15Vmsg[9] = {0x09,0x31,0x33,0x30,0x30,0x30,0x30,0x30,0x34};    
 int adata[9] = {0x09,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30};  
 uint8_t buffer[9];
 const uint8_t length;
 for (int j=0; j<=9; j  )
 {
  adata[j] = *Read(buffer, j);
 }
  

rs485Msg и StP15Vmsg бесполезны, удалите их

Я не понимаю, почему вы вызываете Read несколько раз в цикле с увеличением длины каждый раз, поэтому вы будете переписывать несколько раз в буфер. Я тоже не понимаю, пока вы сохраняете возвращаемое значение Read (которые возвращают значение в данный момент)

Вероятно, вы хотите именно этого :

 uint8_t buffer[9];
uint8_t length = Read(buffer, 9);
  

В

 if(compareArray(FWmsg,arduinodata,7)==0)
 {     
  char res;  
  uint8_t add, fwcommand, fwaction;
  uint16_t fwvalue;
  rs485_message_t rs485Msg; 
  proto485ComposeMsg(amp;rs485Msg, amp;add, amp;fwcommand, amp;fwaction, amp;fwvalue);
  res = GetABFWversion(amp;add, amp;fwcommand, amp;fwaction, amp;fwvalue); 
 }
  

У меня нет ссылки на приведенный выше код, и res установлен, но никогда не использовался


Compare никогда не выполняет сравнение, почему оно называется Compare? Он никогда не возвращает значение, какое значение он должен возвращать?