【问题标题】:How to access values from one function with pointer as an argument in other function with pointer as argument?如何在以指针为参数的另一个函数中以指针为参数访问一个函数的值?
【发布时间】:2019-03-27 22:05:58
【问题描述】:

我正在开发一个代码,在其中我将值从一个函数 (func1) 访问到另一个函数 (func2)。这两个函数都有指针作为参数。我在另一个文件中调用“func2”以进一步传递值以通过 UART 写入。

下面是代码sn-p:

func1: (文件 one.c)

int16_t driver485Compare(uint8_t * message, uint16_t len)
{
  int j = 0;
  uint8_t FWmsg[9] = {0x09,0x30,0x30,0x32,0x32,0x31,0x31,0x30,0x36};         
  uint8_t adata[9] = {0x09,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30};  

    printf("compare command..........");    
    for (j=0; j<9; j++)
    {
      adata[j] = message[j] ;
      printf("%d ",adata[j]);
    }

    if(compareArray(FWmsg,adata,7)==0)
    {   
      uint8_t add, fwcommand, fwaction;
      uint16_t fwvalue;
      GetABFWversion(&message, &add, &fwcommand, &fwaction, &fwvalue);

      printf("elements matched \n");
      // HERE I NEED TO read VALUES OF add, fwcommand, fwaction, fwvalue and pass to "message"

    }

  else
  {
    printf("Arrays have different elements.\n");
  } 

  return 0;
}

func2:(文件二.c)

int8_t GetABFWversion(uint8_t* add, uint8_t* fwcommand, uint8_t* fwaction, uint16_t* fwvalue)             
{      
    char MyCopy[10];  
    strcpy (MyCopy, FIRMWARE_VERSION);
    char MyCopy1[10];
    for (int k=0; k<9; k++)
    {
      int l=1;
      MyCopy1[k] = MyCopy[k+l]; 
    }

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

    uint16_t val = atoi(FWversion_AB);
    *add = RS485_ADDRESS;                //values read from enum
    *fwcommand = CMD_GET_VERSION_AB;     //values read from enum
    *fwaction = CMD_ACTION_AB;           //values read from enum
    *fwvalue = val;

// NEED TO PASS VALUES OF add, fwcommand, fwaction, fwval to "driver485Compare()"
}

func3:(在不同的文件(three.c)中)

void TaskSlave(void *p_arg) //b - communication Task
{
    uint8_t res; 
    rs485_message_t rs485Msg;

    (void)p_arg;
    while(1)
    {      
      res = driver485Read((uint8_t *)&rs485Msg, RS485_MSG_LENGTH);      

      res = driver485Compare((uint8_t *)&rs485Msg, RS485_MSG_LENGTH); 
      //add, fwcommad, fwaction, fwval SHOULD BE REFLECTED HERE WHILE CALLING "driver485Compare()" IN ABOVE STATEMENT.

    }      
}

【问题讨论】:

    标签: c


    【解决方案1】:

    什么不工作?默认情况下,C 中的所有函数都应用了extern,因此没有理由不能从另一个源调用在一个源中声明的函数。您只需提供一个函数原型,例如int fn_in_other_file (params); 用于在您实际使用它之前 使用它的文件中的函数。就像在同一源文件中使用函数一样。

    链接器将在将目标文件链接在一起时解析所有符号名称,尽管函数是在单独的源文件中定义的。在那里你不需要做任何特别的事情。

    举一个非常基本的 3 个文件示例,其中一个文件中的函数在另一个文件中被调用:

    文件 1 (a.c)

    int funA (void)
    {
        return 2;
    }
    

    文件 2 (b.c) 调用 funA()

    int funA (void);        /* function prototype for funA() in file where it is used */
    
    int funB (void)
    {
        return funA() + 3;
    }
    

    (注意: 在调用funA() 之前,funA() 的原型如何包含在b.c 的开头。(通常使用头文件完成)您可以将原型编写为extern int funA (void); 是显式的,但没有必要,extern 关键字是隐含的。)

    文件 3 (main.c) 调用 funB()

    #include <stdio.h>
    
    int funB(void);        /* function prototype for funB() in file where it is used */
    
    int main (void) {
    
        printf ("funB() : %d\n", funB());
    }
    

    查看流程可以推断main() 的输出应该是"funB() : 5",因此编译所有三个并检查:

    $ gcc -Wall -Wextra -pedantic-std=gnu11 -O2 a.c b.c -o bin/main main.c
    

    预期的输出是:

    $ ./bin/main
    funB() : 5
    

    这与您在问题中遇到的情况完全相同,您可以应用它来解决您的问题。试一试,如果您还有其他问题,请告诉我。

    【讨论】:

    • 我需要帮助来编写一段代码,该代码将从“func2”中获取值“add、fwcommand、fwaction、fwvalue”,以便在“func3”中反映相同的值。在“func3”中,我将使用“proto485OnlyWrite(message->address, message->command, message->action, message->value);”在 UART 上传递这些值在“driver485Compare()”调用之后。
    猜你喜欢
    • 1970-01-01
    • 2021-12-08
    • 2011-02-21
    • 2019-08-22
    • 1970-01-01
    • 1970-01-01
    • 2018-08-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多