我正在开发一个代码,在其中我可以将一个函数(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.
}
}
答案 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
这是您在问题中遇到的相同情况,可以将其应用于解决问题。试试看,如果您还有其他问题,请告诉我。