【问题标题】:How to pass structures to a function in C如何将结构传递给C中的函数
【发布时间】:2015-02-18 13:37:37
【问题描述】:

我编写了一个由以下文件组成的 C 代码:main.ckernel.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 文件之外。

【问题讨论】:

    标签: c function struct argument-passing


    【解决方案1】:

    你应该改变这个

    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));
    

    你实际上应该做的是检查返回值,错误malloc()返回NULL,所以

    coll_vcm1 = malloc(Np * sizeof(vect_xyz));
    if (coll_vcm1 == NULL)
        tragedy_cannotAllocateMemory_DoNot_Continue();
    

    最后花点时间格式化您的代码,以便其他人和您可以阅读并理解它。

    【讨论】:

      【解决方案2】:

      错误信息不言自明,不是吗?

      “collisione”的参数 1 的类型不兼容

      预期为“struct vect_xyz *”,但参数类型为“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()和family的返回值。

      【讨论】:

        猜你喜欢
        • 2021-08-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-06
        • 2013-04-12
        • 2015-01-03
        相关资源
        最近更新 更多