如何从以指针作为参数的一个函数访问另一个以指针作为参数的函数的值?

时间:2019-03-27 22:05:58

标签: c

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

下面是代码段:

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 :(文件two.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 :(在其他文件中(三个.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.

    }      
}

1 个答案:

答案 0 :(得分:0)

什么不起作用?默认情况下,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()之前,b.c的原型如何包含在funA()的开头(通常通过头文件完成)您可以将原型写为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

这是您在问题中遇到的相同情况,可以将其应用于解决问题。试试看,如果您还有其他问题,请告诉我。