0

I wrote a C code which is formed by these files: main.c, kernel.c. Here are the files:

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

Here is the make file:

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

(watch out for the tabs). When I run it by typing make I get this error message:

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

Of course the mistake occurs when I call the function collisione() but I don't understand why. The other thing that I suppose to be wrong is in the kernel.c file; as a matter of fact I believe that writing vect_xyz *coll_vcm1 is wrong because I am not specifying the index i.

So here is my question: - What should I write in the kernel.c file in order to print the values of structure everytime in the for loop?

PS: I want to keep the loop

for(i=0;i<Np;i++){
  collisione(coll_vcm1[i].x,i);
}

outside of the kernel.c file.

Sourav Ghosh
  • 133,132
  • 16
  • 183
  • 261
Federico Gentile
  • 5,650
  • 10
  • 47
  • 102

2 Answers2

4

You should change this

collisione(coll_vcm1[i].x,i);

to

collisione(coll_vcm1, i);

you where passing the x field at position i in the array, instead of the pointer to the array coll_vcm1

Also, note that casting the return value from malloc() makes you among other things, repeat yourself.

coll_vcm1=(vect_xyz*)malloc(Np*sizeof(vect_xyz));

could just be

coll_vcm1 = malloc(Np * sizeof(vect_xyz));

and what you actually should do, is check the return value, on error malloc() returns NULL, so

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

and finally take your time to format your code, so others and you can read it and understand it.

Community
  • 1
  • 1
Iharob Al Asimi
  • 52,653
  • 6
  • 59
  • 97
2

The error message speaks for itself, isn't it?

incompatible type for argument 1 of ‘collisione’

expected ‘struct vect_xyz *’ but argument is of type ‘float’

Your function prototype is

void collisione(vect_xyz *coll_vcm1,int i)

and you're calling this function like

collisione(coll_vcm1[i].x,i);

where, the first supplied argument coll_vcm1[i].x is of type float. You need to change that to

collisione(coll_vcm1, i);

so that the first argument is of type vect_xyz *.

Note: Please do not cast the return value of malloc() and family.

Community
  • 1
  • 1
Sourav Ghosh
  • 133,132
  • 16
  • 183
  • 261