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 ofpHead'|
    first defined here|
    obj\Debug\list_genrator.o||In function verkettete\_liste':| multiple definition ofpNew'|
    first defined here|
    obj\Debug\list_genrator.o||In function verkettete\_liste':| multiple definition ofpScan'|
    first defined here|
    obj\Debug\list_genrator.o||In function verkettete\_liste':| multiple definition ofpHalter'|
    first defined here|
    obj\Debug\list_genrator.o||In function verkettete\_liste':| multiple definition ofpFile'|
    first defined here|
    obj\Debug\list_genrator.o||In function verkettete\_liste':| multiple definition ofwertcounter'|
    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.


Anmelden zum Antworten