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:(文件二.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.
}
}
解决方案
什么不工作?默认情况下, 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;
}
(注意:如何调用beforefunA()
开头的原型。(通常用头文件完成)您可以将原型写成明确的,但没有必要,关键字是隐含的。)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
这与您在问题中遇到的情况完全相同,您可以应用它来解决您的问题。试一试,如果您还有其他问题,请告诉我。
推荐阅读
- javascript - 有没有一种简单的方法可以将 LaTeX(MathLive 输出)转换为 TypeScript/JavaScript 或 Java 中的 Excel 单元格公式?
- html - 在css中闪烁背景图像
- python-3.x - 将芹菜结果组合在一起
- python - txt 到 csv 的尝试。无法理解来自 re 的 TypeError
- node.js - Gcloud app deploy 不能忽略 Dockerfile
- azure-service-fabric - 可靠词典的可靠词典
- android - React Native APK 在 MI mobile 中崩溃
- php - 从href链接获取域名
- blazor - 带有尾风/postcss 的 Blazor 组件隔离 css
- rabbitmq - RabbitTemplate.invoke(OperationsCallBack) 在消息被取消/返回/超时时不会抛出异常