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

#c

#c

Вопрос:

У меня есть задача получить несколько значений из одной функции, определенной в одном файле.c, в другую функцию, определенную в двух файлах.c.

Пожалуйста, найдите ниже фрагмент кода из обоих файлов и любезно помогите получить доступ к значениям из одного файла.c в два файла.c.

файл one.c:

 void GetABFWversion(uint8_t* fwcommand, uint8_t* fwaction, uint16_t* fwvalue)             
{
    uint16_t FW_slot=SdusAutoDetectSlotForNewFirmware();

    char MyCopy[10];  
    strcpy (MyCopy, BrakeBoardInfo.firmwareVersion);
    char MyCopy1[10];
    for (int k=0; k<9; k  )
    {
      int l=1;
      MyCopy1[k] = MyCopy[k l]; 
    }

    char FWversion_AB[10] = {0};
    int z = 0;
    for(int x=6;x<10;x  )
    {
      FWversion_AB[z] = MyCopy1[x];
      z  ;
    }

    char res=0;

    uint16_t val = atoi(FWversion_AB);
    //res = proto485OnlyWrite(0x09,0x02,0x00,val);
    printf("n");
    printf("FW version is sent to Arduino!!!   ");
    RESULT = 1;
    *fwcommand = 0x02;
    *fwaction = 0x00;
    *fwvalue = val;
}
  

файл two.c:

 int16_t driver485Read (uint8_t *buffer, const uint16_t length)
{
  char head[20];  
  const char *format="KLx:";
  int16_t wait_loop_cnt=0;
  static uint32_t totalBytes = 0;
  static uint32_t respNo = 0;

  GPIO_ClearValue(PMAP_GPIO_PORT_DIR_RS485, PMAP_GPIO_PIN_DIR_RS485);             

  UartRxFlush(UARW_UART_INDEX_RS485); /
  respNo  ;

  int counter = 0; 

  do
  {
    OSTimeDly(2);

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

  uint8_t i = 0;
  format="OKx:";

  printf("Byte received........");
  int FWmsg[9] = {0x09,0x30,0x30,0x32,0x32,0x31,0x31,0x31,0x31};
  int arduinodata[9] = {0x09,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30};  

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

  if(compareArray(FWmsg,arduinodata,7)==0)
  {  
    printf("Arrays have same elements.n");
    printArray(FWmsg,9);

  char res = 0;

  uint8_t fwc, fwa;
  uint16_t fwv;

  GetABFWversion(amp;fwc, amp;fwa, amp;fwv); 
  res = proto485OnlyWrite(0x09,fwc,fwa,fwv);
  printf("n");
  printf("FW version is sent to Arduino!!!   ");
 }
 else
  {
  printf("Arrays have different elements.n");
  }     

  /* 1st byte is the slave address byte which value should be >= RS485_ADDRESS_SLAVE_FIRST  amp;amp;
  <= RS485_ADDRESS_SLAVE_LAST and is already checked in dePadLeft() */
  for(int i = 1; i < length amp;amp; buffer[i] >= RS485_PAYLOAD_VALID_MIN amp;amp; buffer[i] <= RS485_PAYLOAD_VALID_MAX; i  );

  counter = i; // to be OK, i = length = RS485_MSG_LENGTH if response (after eventual dePad..) is OK
  printf("driver485Read %dn",counter);


#ifdef RS485_DEBUG  
  static uint32_t i = 0;
  i  ;
#endif

  return counter;

  GPIO_SetValue(PMAP_GPIO_PORT_DIR_RS485, PMAP_GPIO_PIN_DIR_RS485);  
}
  

файл three.c:

 uint8_t proto485OnlyWrite(uint8_t address, uint8_t command, uint8_t action, uint16_t value)               
{
  uint8_t res=ERROR_FOUND;

  OSSemPend(pbSemaphore, 0, amp;res);
  if (res == OS_ERR_NONE)
  {
    rs485_message_t rs485Msg;        
    if (command ==CMD_POWER_PUMP_PB)
    {
      printf("CMD_POWER_PUMP_PB");
    }

    proto485ComposeMsg(amp;rs485Msg, address, command, action, value);

    res = (RS485_MSG_LENGTH == driver485Write((uint8_t *)amp;rs485Msg, sizeof(rs485Msg))) ? 
  NO_ERROR: 
    ERROR_FOUND;

    OSSemPost(pbSemaphore);
  }    
  return res;
}
  

Я хочу получить значения «fwcommand», «fwaction» и «fwvalue», определенные в файле one.c, в файл two.c в том месте, где я передаю то же самое в «res = proto485OnlyWrite(0x09,fwc, fwa, fwv);» вместо «fwc», «fwa» и «fwv» соответственно.

Спасибо….

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

1. Посмотрите, как использовать файлы заголовков. Определите свои функции с помощью прототипов в файлах заголовков. Добавьте инструкции «include» для файлов заголовков в других файлах. Таким образом, другие файлы будут «знать» о внешних ссылках, и вы сможете получить к ним доступ.

2. Просто поместите определения функций, которые вы хотите использовать, в начало одного из них.c, например uint8_t proto485OnlyWrite(uint8_t address, uint8_t command, uint8_t action, uint16_t value); . Затем вы компилируете и связываете все три файла вместе, например gcc -o myExe one.c two.c three.c .

3. И в чем проблема? Вы правильно используете указатели для извлечения значения из одной функции в другую, а затем в третью. Игнорируя то, что вы разместили в своей программе тонну несвязанного кода, который можно безопасно удалить, вы затем передаете значения в другую функцию. Все выглядит нормально.

4. что касается: return counter; GPIO_SetValue( PMAP_GPIO_PORT_DIR_RS485, PMAP_GPIO_PIN_DIR_RS485); Вызов GPIO_SetValue() никогда не будет выполнен, поскольку предыдущий return оператор уже вышел из функции }`

5. @bruceg, Ваше предложение сделать так, чтобы каждая из (представляющих интерес переменных -VOI-) имела «область действия файла», которая не будет работать. Гораздо лучше иметь файл заголовка, в котором перечислены все -VOI- как ‘extern’ в файле заголовка и #include этот файл заголовка в любом файле .c, который хочет получить доступ к этим -VOI — Однако тогда другие файлы также могут изменять эти -VOI — Поэтому лучше всего написать функции ‘accessor’ для этих -VOI- и поместить прототипы для этих функций ‘accessor’ в файл заголовка, который любой, кто хочет использовать эти -VOI-включает в свой файл (продолжение)