Verstehe Fehlermeldung nicht ganz
-
Hallo nochmals;
Ich benötige wieder eure Hilfe:
Ich versuch ein Programm einzubinden:#include <stdio.h> #include <stdlib.h> #include "list_genrator.h" int main(int argc, char *argv[]) { printf("Hello world!\n\n"); verkettete_liste(argc, argv); return 0; }
Die header Datei:
#ifndef list_genrator_h #define list_genrator_h int verkettete_liste(int aargc, char *aargv[]); struct data { char zeichen; int anzahl_zeichen; struct data *pNext; }; struct data *pHead=NULL,*pNew=NULL,*pScan=NULL,*pHalter=NULL; FILE *pFile=NULL; int wertcounter=0; #endif
#include <stdio.h> #include <stdlib.h> #include <string.h> #include "list_genrator.h" int verkettete_liste(int aargc, char *aargv[]) { FILE *pWrite=NULL,*pFile=NULL; char string[50]; char tokener='\0'; if(aargv[1]==NULL) { printf("Error, Keine Argumente angegeben\n"); exit(EXIT_FAILURE); } sprintf(string,"%s",aargv[1]); pFile=fopen(string,"rt"); if(pFile==NULL) perror("Error, Konnte Datei nicht Laden\n"); while(!feof(pFile)) { if(pNew==NULL)//Speicherallokation für das 1. Element=================================================================== { pNew=(struct data*)malloc(sizeof(struct data)); if(pNew==NULL) perror("Konnte keinen Speicher reservieren (pNew 1)\n"); pHead=pNew;//pHead zeigt kontinuirlich auf das erste Element======================================================== pScan=pHead;//pScan zeigt auf das erste Element um dan zu scannen=================================================== pNew->pNext=NULL; pHalter=pNew; fscanf(pFile,"%c",&tokener); wertcounter++; pNew->zeichen=tokener; pNew->anzahl_zeichen=1; } else { fscanf(pFile,"%c",&tokener); wertcounter++; while(pScan!=NULL) { if(pScan->zeichen==tokener) { pScan->anzahl_zeichen++; break; } else pScan=pScan->pNext; } //Abfrage: Wenn die eingescannte Zahl gleich groß der Zahl der Struktur, UND sie mehr als 1 mal vorkommt...===================== //Das ganze NUR WENN pScan !=NULL ist, da nur diese Bedingung für das finden zutrifft=========================================== if(pScan!=NULL && tokener==pScan->zeichen && pScan->anzahl_zeichen>1) { pScan=pHead; continue; } else pScan=pHead; //============================================================================================================================== //Speicherallokation für das darauf folgende Element============================================================================ pNew=(struct data*)malloc(sizeof(struct data)); if(pNew==NULL) perror("Konnte keinen Speicher reservieren (pNew 2)\n"); pHalter->pNext=pNew; pHalter=pNew; pNew->zeichen=tokener; pNew->anzahl_zeichen=1; pNew->pNext=NULL; } } //Audgabe der Elemente========================================================================================================== pWrite=fopen("output.txt","wt"); if(pWrite==NULL) perror("Konnte Datei nicht erstellen\n"); pScan=pHead; while(pScan!=NULL) { printf("Wert=%d\t\tAnzahl=%d\n",pScan->zeichen,pScan->anzahl_zeichen); //fprintf(pWrite,"Wert=%d\t\tAnzahl=%d\n",pScan->zeichen,pScan->anzahl_zeichen); pScan=pScan->pNext; } pScan=pHead; //============================================================================================================================== return 0; }
Es tut mit leid, dass so viel code rufstelle, aber beim compillieren bekomme ich folgendes:
obj\Debug\list_genrator.o||In function
verkettete\_liste':| multiple definition of
pHead'|
first defined here|
obj\Debug\list_genrator.o||In functionverkettete\_liste':| multiple definition of
pNew'|
first defined here|
obj\Debug\list_genrator.o||In functionverkettete\_liste':| multiple definition of
pScan'|
first defined here|
obj\Debug\list_genrator.o||In functionverkettete\_liste':| multiple definition of
pHalter'|
first defined here|
obj\Debug\list_genrator.o||In functionverkettete\_liste':| multiple definition of
pFile'|
first defined here|
obj\Debug\list_genrator.o||In functionverkettete\_liste':| multiple definition of
wertcounter'|
first defined here|
||=== Build finished: 12 errors, 0 warnings ===|Vielen Dank für eure Geduld
-
Du bindest die list_genrator.h in main.c und list_genrator.c ein und jedesmal werden da die (globalen) Variablen definiert.
struct data *pHead=NULL,*pNew=NULL,*pScan=NULL,*pHalter=NULL; FILE *pFile=NULL; int wertcounter=0;
Also gibt es in main.c und list_genrator.c jeweils ein pHead, pNew,....
Und der Linker weiß nicht recht was er damit machen soll.
Mach dich mal über extern schlau.
-
Nein, das wird nicht der Fehler sein, da ifndef/define benutzt wird.
Ich glaube du hast nicht nur die drei genannten Dateien im Projekt, sondern noch anderen Code, der die Variablen definiert und nicht gegen Mehrfachverwendung geschützt ist.
-
Ich bedanke mich vielmals für deine Hilfe DirkB, hab viel dazugelernt.
-
Also so funktionert es jetzt:
#ifndef list_genrator_h #define list_genrator_h int verkettete_liste(int aargc, char *aargv[]); struct data { char zeichen; int anzahl_zeichen; struct data *pNext; }; extern struct data *pHead,*pNew,*pScan,*pHalter; extern FILE *pFile; extern int wertcounter; #endif
#include <stdio.h> #include <stdlib.h> #include <string.h> #include "list_genrator.h" struct data *pHead=NULL,*pNew=NULL,*pScan=NULL,*pHalter=NULL; FILE *pFile=NULL; int wertcounter=0; int verkettete_liste(int aargc, char *aargv[]) { .... return 0; }
-
Wutz schrieb:
Nein, das wird nicht der Fehler sein, da ifndef/define benutzt wird.
Das hilft doch nur dagegen, dass die .h nicht nochmal im selben .c eingebunden wird.