我正在使用嵌入式C,
double bmenge[20];
我在代码中多次使用这些句子:
fmasccfp.bmen01 = bmenge[0];
fmasccfp.bmen02 = bmenge[1];
....
....
fmasccfp.bmen20 = bmenge[19];
fmasccfp
是一个包含许多其他字段的结构,bmen%i
是结构字段。
我想把这些行放在一个循环中:
char count_field_number (int k )
{
char buffer_cat[20];
if (k <10)
{
sprintf(buffer_cat, "fmasccfp.bmen0%d",k+1);
}
else
{
sprintf(buffer_cat, "fmasccfp.bmen%d",k+1);
}
return buffer_cat;
}
主要:
for ( int k = 0; k < 20; k++)
{
buffer_cat = count_field_number(k);
buffer_cat = bmenge[k];
}
我知道我不能指定类型'double'来输入'char [20]'。
你能帮忙吗?
答案 0 :(得分:0)
几点说明:
char buffer_cat[20];
不是一个字符,你不能使用return buffer_cat;
,它基本上会将一个POINTER返回给第一个字符,但是它返回一个CHAR,所以值将在0到255之间。
功能应该是:
char* count_field_number(int k)
因为您正在返回一个char POINTER,一个指向该字符数组的指针。 现在,你可以返回一个指针,你可以,但它没用,据说 - 记忆丢失了。数组内容可能仍然在那里但是它被分配在堆栈内存中,因此在函数返回后释放内存 - 你应该动态地分配它,所以即使在函数返回之后它也会保持不变。按照以下方式进行:
char* buffer_cat = malloc(sizeof(char)*20);
当malloc()
基本上是一个分配您请求的字节数的函数时。我已经请求了sizeof(char)字节的20倍,这基本上是20,因为sizeof(char)总是1个字节。这样,当函数返回时,内存不会被释放,但是当参数是指针(free()
时,当你使用函数free(buffer_cat);
完成它时,你需要手动释放它。 )。
for循环的目的是什么?
buffer_cat = count_field_number(k);
buffer_cat = bmenge[k];
您丢失了count_field_number()
调用的返回值,并使用bmenge [k]重写它。
当您说buffer_cat = bmenge[k];
时,编译器会将其视为已授予,并将指针赋予double而不是该字符串CONTENT的double值 - 它不会将双精度赋值给字符串是什么({{ 1}}例如)。你不能在C语言的程序中执行未知的命令,据我所知,你可能会以某种方式实现它,但它真的很复杂,我要说。
取而代之的是,我只需使用指针将fmasccfp.bmen01
分配给内存中的该地址。让我们说bmenge[k]
和bmen01
最多20个是双打 - 我使用bmen02
(指向内存中双重位置的指针),将其分配给{ {1}}(该双地址)然后分配double* my_double_pointer
(将&fmasccfp.bmen01
分配给my_double_pointer所指向的地方)并在循环中递增*my_double_pointer = bmenge[k];
,不需要任何函数。只要变量在该结构中一个接一个地声明,bmenge[k]
到my_double_pointer++;
,根据顺序,这将有效。
它基本上只是将bmen01
分配给bmen20
,然后它会使用bmenge[k]
递增它,这意味着它会跳过那个双倍(bmen01
)并继续下一个变量(sizeof(double);
)。
无论如何,为什么你没有在结构中创建bmen01
数组以便于使用?
答案 1 :(得分:0)
我同意@JonathanLeffler关于你的结构设计的评论。 但是,要回答你的问题,我会使用指针来浏览连续的字段:
double * bmen = &fmasccfp.bmen01;
for(size_t i=0; i<20; i++)
{
*bmen = bmenge[i];
bmen++;
}