Fichier d’en-tête ne fonctionnera pas – référence définie à `méthode ‘

Le fichier d’en-tête ne semble pas fonctionner correctement. Je suis nouveau en C et je ne sais pas vraiment ce que je fais

error - findvals.c:(.text+0x561): undefined reference to `approxEqual' 

findvals.c

 #include  #include  #include  #include  #include "utils.h" int main(int argc, char **argv) { //printf("GRR ENTAR SOMETHANG"); //char word[64]; //scanf("%s", word); int count = 0; int ret; double x; double y; int i = 0; int c = 0; char *refStr, *tolStr; double refDub; double tolDub; int noArgs = 0; //double temp; //scanf("%lf" , &temp); //printf("DUBBB %lf" , temp); refStr = tolStr = NULL; //Add code to read arguments, in ANY order ie -r can come before or after -t int processCount = 0; for(i = 1; i < 5; i++) { if (strcmp(argv[i], "-r")) { tolStr = argv[i+1]; i++; //printf("\nIM HERE r"); } else if (strcmp(argv[i], "-t")) { refStr = argv[i+1]; i++; //printf("\nIM HERE t"); } } refDub = atof(refStr); tolDub = atof(tolStr); //printf("\nrefDub = %f", refDub); //printf("\ntolDub = %f", tolDub); //Check if arguments were passed in correctly. if (argc != 5 || refStr == NULL || tolStr == NULL) { fprintf(stderr, "Usage: %s -r ref -t tol\n", argv[0]); exit(1); } //Add code to note start time and date and then print it. //Right now printing just a default string struct tm *local; time_t start, end; time(&start); // read and record clock local = localtime(&start); printf("\n# Start time and date: %s", asctime(local)); //char * tnd="Wed 15 Oct 2014 19:18:13 IST"; //printf("# Start time and date: %s", tnd ); // Add rest of the functionality. //READ int rows; // Sixe x axis of the array int cols; // Sixe y axis o the array scanf("%d" , &rows); scanf("%d" , &cols); double opArray[rows][cols]; // Array for operations for(i = 0 ; i < rows; i++) { for(c = 0 ; c < cols; c++) { scanf("%lf" , &opArray[i][c]); } } //read in the matrix double **mat = (double **) malloc(sizeof(double *)*rows); int j=0; for(i=0; i<rows; i++) /* Allocate array, store pointer */ mat[i] = (double *) malloc(sizeof(double)*cols); for(i=0; i<rows; i++) { for(j=0; j<cols; j++) { scanf("%lf",&mat[i][j]); } } // The following print statement should be a part of a loop // Uncomment it tailor it to your code but ONLY the part that // comes after: \n", // fprintf(stdout, "r=%d, c=%d: %.6f\n", r, c, rows[r][c]); for(i= 0; i < rows ; i++) { for(j = 0 ; j <cols ; j++) { ret = approxEqual(mat[i][j],refDub,tolDub); if (ret == 1) { fprintf(stdout, "r=%d, c=%d: %.6f\n", i, j, mat[i][j]); count++; } } } // output the final count of matches. Again, you may ONLY modify // the part of the print statement after: \n", // fprintf(stdout, "Found %d approximate matches.\n", count); //finally, print out the end time and date. Right now only printing //a default string. time(&end); // read and record clock local = localtime(&end); printf("\n# End time and date: %s", asctime(local)); exit(0); } 

utils.c

 #include "utils.h" int approxEqual(double x, double r, double t) { int ceiling = r+t; int floored = rt; if(x > floored && x < ceiling) return 1; else return 0; } 

utils.h

 #if ! defined(UTILS_H) #define UTILS_H int approxEqual(double x, double r, double t); #endif 

Si quelqu’un pouvait me diriger dans la bonne direction, ce serait formidable

Comment je l’ai compilé

 gcc -c utils.c gcc findvals.o utils.o -o findvals gcc -c findvals.c 

gcc -c utils.c findvals.c utils.h

gcc findvals.o utils.o -o findvals

Vérifie ça. Cela fonctionnera.

Utilisez un fichier makefile tel que celui présenté ci-dessous.

 .PHONY: all clean SRCS := findvals.c utils.c OBJS := $(SRCS:%.c=%.o) all: findvals findvals: $(OBJS) clean: rm -rf *.o findvals 

Enregistrez simplement ce fichier dans le même répertoire que votre source, appelez-le “makefile” ou “Makefile” et utilisez la commande

 make 

En note de côté. Dans votre fonction principale, vous devez append une vérification si l’utilisateur ne fournit pas suffisamment d’arguments en ligne de commande. Vous pouvez savoir combien sont fournis en utilisant la variable argc et vous ne devez référencer aucune valeur argv supérieure à argc-1 sous peine de provoquer un crash.