如何将结构传递给 C 中的函数
How to pass structures to a function in C
我写了一个由这些文件组成的 C 代码:main.c、kernel.c。以下是文件:
main.c:
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
typedef struct{
float x;
float y;
float z;
} vect_xyz;
vect_xyz *coll_vcm1;
#include "kernel.c"
//==============================================================
int main(void){
int Np=10, i;
float xx = 1;
coll_vcm1=(vect_xyz*)malloc(Np*sizeof(vect_xyz));
for(i=0;i<Np;i++){
coll_vcm1[i].x = xx;
coll_vcm1[i].y = 2*xx;
coll_vcm1[i].z = 3*xx;
xx = xx + 1;
}
for(i=0;i<Np;i++){
collisione(coll_vcm1[i].x,i);
}
return 0;
}
kernel.c
void collisione(vect_xyz *coll_vcm1,int i){
printf("coll_vcm1[%d].x=%f\n",i,coll_vcm1[i].x);
}
这是生成文件:
CC=gcc
CFLAGS=-Wall
OBJS = main.o
all: eseguibile
eseguibile: $(OBJS)
$(CC) $(CFLAGS) $(OBJS) -o eseguibile -lm
main.o: main.c kernel.c
$(CC) -c $(CFLAGS) main.c
clean:
rm -rf *.o eseguibile
(注意标签)。当我通过键入 make 运行 时,我收到此错误消息:
main.c: In function ‘main’:
main.c:30:7: error: incompatible type for argument 1 of ‘collisione’
collisione(coll_vcm1[i].x,i);
^
In file included from main.c:14:0:
kernel.c:1:6: note: expected ‘struct vect_xyz *’ but argument is of type ‘float’
void collisione(vect_xyz *coll_vcm1,int i){
^
make: *** [main.o] Error 1
调用函数collisione()当然会出错,但我不明白为什么。我认为错误的另一件事是在 kernel.c 文件中;事实上,我认为写 vect_xyz *coll_vcm1
是错误的,因为我没有指定索引 i.
所以这是我的问题:
- 我应该在 kernel.c 文件中写什么,以便每次在 for 循环中打印结构的值?
PS:我想保持循环
for(i=0;i<Np;i++){
collisione(coll_vcm1[i].x,i);
}
在 kernel.c 文件之外。
你应该改变这个
collisione(coll_vcm1[i].x,i);
到
collisione(coll_vcm1, i);
你在数组中的 i
位置传递 x
字段,而不是指向数组 coll_vcm1
的指针
另外,请注意 casting the return value from malloc()
让你自己重复一遍。
coll_vcm1=(vect_xyz*)malloc(Np*sizeof(vect_xyz));
可能只是
coll_vcm1 = malloc(Np * sizeof(vect_xyz));
而你实际上应该做的是检查 return 值,错误 malloc()
returns NULL
,所以
coll_vcm1 = malloc(Np * sizeof(vect_xyz));
if (coll_vcm1 == NULL)
tragedy_cannotAllocateMemory_DoNot_Continue();
最后花点时间格式化您的代码,以便其他人和您可以阅读并理解它。
错误消息不言而喻,不是吗?
incompatible type for argument 1 of ‘collisione’
expected ‘struct vect_xyz *’ but argument is of type ‘float’
你的函数原型是
void collisione(vect_xyz *coll_vcm1,int i)
并且您正在像这样调用此函数
collisione(coll_vcm1[i].x,i);
其中,第一个提供的参数 coll_vcm1[i].x
的类型为 float
。您需要将其更改为
collisione(coll_vcm1, i);
所以第一个参数的类型是 vect_xyz *
。
注意:请do not castmalloc()
和家人的return值。
我写了一个由这些文件组成的 C 代码:main.c、kernel.c。以下是文件:
main.c:
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
typedef struct{
float x;
float y;
float z;
} vect_xyz;
vect_xyz *coll_vcm1;
#include "kernel.c"
//==============================================================
int main(void){
int Np=10, i;
float xx = 1;
coll_vcm1=(vect_xyz*)malloc(Np*sizeof(vect_xyz));
for(i=0;i<Np;i++){
coll_vcm1[i].x = xx;
coll_vcm1[i].y = 2*xx;
coll_vcm1[i].z = 3*xx;
xx = xx + 1;
}
for(i=0;i<Np;i++){
collisione(coll_vcm1[i].x,i);
}
return 0;
}
kernel.c
void collisione(vect_xyz *coll_vcm1,int i){
printf("coll_vcm1[%d].x=%f\n",i,coll_vcm1[i].x);
}
这是生成文件:
CC=gcc
CFLAGS=-Wall
OBJS = main.o
all: eseguibile
eseguibile: $(OBJS)
$(CC) $(CFLAGS) $(OBJS) -o eseguibile -lm
main.o: main.c kernel.c
$(CC) -c $(CFLAGS) main.c
clean:
rm -rf *.o eseguibile
(注意标签)。当我通过键入 make 运行 时,我收到此错误消息:
main.c: In function ‘main’:
main.c:30:7: error: incompatible type for argument 1 of ‘collisione’
collisione(coll_vcm1[i].x,i);
^
In file included from main.c:14:0:
kernel.c:1:6: note: expected ‘struct vect_xyz *’ but argument is of type ‘float’
void collisione(vect_xyz *coll_vcm1,int i){
^
make: *** [main.o] Error 1
调用函数collisione()当然会出错,但我不明白为什么。我认为错误的另一件事是在 kernel.c 文件中;事实上,我认为写 vect_xyz *coll_vcm1
是错误的,因为我没有指定索引 i.
所以这是我的问题: - 我应该在 kernel.c 文件中写什么,以便每次在 for 循环中打印结构的值?
PS:我想保持循环
for(i=0;i<Np;i++){
collisione(coll_vcm1[i].x,i);
}
在 kernel.c 文件之外。
你应该改变这个
collisione(coll_vcm1[i].x,i);
到
collisione(coll_vcm1, i);
你在数组中的 i
位置传递 x
字段,而不是指向数组 coll_vcm1
另外,请注意 casting the return value from malloc()
让你自己重复一遍。
coll_vcm1=(vect_xyz*)malloc(Np*sizeof(vect_xyz));
可能只是
coll_vcm1 = malloc(Np * sizeof(vect_xyz));
而你实际上应该做的是检查 return 值,错误 malloc()
returns NULL
,所以
coll_vcm1 = malloc(Np * sizeof(vect_xyz));
if (coll_vcm1 == NULL)
tragedy_cannotAllocateMemory_DoNot_Continue();
最后花点时间格式化您的代码,以便其他人和您可以阅读并理解它。
错误消息不言而喻,不是吗?
incompatible type for argument 1 of ‘collisione’
expected ‘struct vect_xyz *’ but argument is of type ‘float’
你的函数原型是
void collisione(vect_xyz *coll_vcm1,int i)
并且您正在像这样调用此函数
collisione(coll_vcm1[i].x,i);
其中,第一个提供的参数 coll_vcm1[i].x
的类型为 float
。您需要将其更改为
collisione(coll_vcm1, i);
所以第一个参数的类型是 vect_xyz *
。
注意:请do not castmalloc()
和家人的return值。