Fehler im Programm



  • H:\Neuer Ordner\Neuer Ordner\binbaum.cpp(87) : error C2664: 'free' : Konvertierung des Parameters 1 von 'int' in 'void *' nicht moeglich
    Die Konvertierung eines ganzzahligen Typs in einen Zeigertyp erfordert ein reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
    H:\Neuer Ordner\Neuer Ordner\binbaum.cpp(97) : error C2664: 'free' : Konvertierung des Parameters 1 von 'int' in 'void *' nicht moeglich
    Die Konvertierung eines ganzzahligen Typs in einen Zeigertyp erfordert ein reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
    H:\Neuer Ordner\Neuer Ordner\binbaum.cpp(106) : error C2664: 'free' : Konvertierung des Parameters 1 von 'int' in 'void *' nicht moeglich
    Die Konvertierung eines ganzzahligen Typs in einen Zeigertyp erfordert ein reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
    H:\Neuer Ordner\Neuer Ordner\binbaum.cpp(129) : error C2664: 'free' : Konvertierung des Parameters 1 von 'int' in 'void *' nicht moeglich
    Die Konvertierung eines ganzzahligen Typs in einen Zeigertyp erfordert ein reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
    Fehler beim Ausführen von cl.exe.

    binbaum.exe - 4 Fehler, 0 Warnung(en)

    Warum ist das den nun falsch?

    Hier das Programm:

    [/cpp]
    #include<iostream.h>
    #include<stdio.h>
    #include<stdlib.h>
    #include<malloc.h>

    struct baum{
    int wert;
    struct baum *links;
    struct baum *rechts;
    };

    struct baum *wurzel;
    void suche_knoten(struct baum **, int);
    void loesche(struct baum **);
    void zeige_baum(struct baum *);
    struct baum *einbinden(struct baum *, int);
    void suche_ersatz(struct baum **, int *);

    struct baum *einbinden(struct baum *zeiger, int zahl)
    {
    if(zeiger == NULL)
    {
    zeiger=(struct baum*)malloc(sizeof(struct baum));
    zeiger->wert=zahl;
    zeiger->links=zeiger->rechts=NULL;
    }
    else if(zeiger->wert >= zahl)
    zeiger->links=einbinden(zeiger->links,zahl);
    else if(zeiger->wert < zahl)
    zeiger->rechts=einbinden(zeiger->rechts,zahl);
    return (zeiger);
    }

    void zeige_baum(struct baum *zeiger)
    {
    if(zeiger != NULL)
    {
    cout<<zeiger->wert<<" ";
    zeige_baum(zeiger->links);
    zeige_baum(zeiger->rechts);
    }
    }

    void suche_knoten(struct baum **zeiger, int such)
    {
    if((*zeiger) == NULL)
    {
    cout<<"Der Baum ist leer!";
    }
    else
    {
    if((*zeiger)->wert == such)
    {
    loesche(zeiger);
    }
    else
    {
    if((*zeiger)->wert > such)
    {
    suche_knoten(&((*zeiger)->links), such);
    }
    else
    {
    suche_knoten(&((*zeiger)->rechts),such);
    }
    }
    }
    }

    void loesche(struct baum **zeiger)
    {
    struct baum *temp;
    int tempwert;
    if(wurzel == *zeiger)
    {
    cout<<"Wurzel kann nicht geloescht werden!!!";
    return ;
    }
    if((*zeiger) != NULL)
    {
    if((*zeiger)->links==NULL && (*zeiger)->rechts==NULL)
    {
    free(temp->wert);
    free(*zeiger);
    *zeiger=NULL;
    }
    else
    {
    if((*zeiger)->links==NULL)
    {
    temp=*zeiger;
    *zeiger=(*zeiger)->rechts;
    free(temp->wert);
    free(temp);
    }
    else
    {
    if((*zeiger)->rechts==NULL)
    {
    temp=*zeiger;
    *zeiger=(*zeiger)->links;
    free(temp->wert);
    free(temp);
    }
    else
    {
    //suche_ersatz(&tempwert,&((*zeiger)->rechts));
    (*zeiger)->wert=tempwert;
    }
    }
    }
    }
    }

    void suche_ersatz(struct baum **zeiger, int *neuwert)
    {
    struct baum *temp;
    if(*zeiger != NULL)
    {
    if((*zeiger)->links ==NULL)
    {
    *neuwert=(*zeiger)->wert;
    temp=*zeiger;
    *zeiger=(*zeiger)->rechts;
    free(temp->wert);
    free(temp);
    }
    else
    {
    suche_ersatz(&((*zeiger)->links),neuwert);
    }
    }
    }

    int main()
    {
    int wahl,zahl,such;
    wurzel=NULL;
    cout<<"-------------------------------"<<endl;
    cout<<"-------------------------------"<<endl<<endl;
    do
    {
    cout<<endl<<"1:Eingabe"<<endl;
    cout<<"2:Ausgabe"<<endl;
    cout<<"3:Loeschen"<<endl;
    cout<<"4:Ende"<<endl;
    cout<<"Ihre Wahl:";
    cin>>wahl;
    switch(wahl)
    {
    case 1: cout<<"Geben sie den Wert ein: ";
    cin>>zahl;
    wurzel=einbinden(wurzel,zahl);
    break;
    case 2: zeige_baum(wurzel);
    break;
    case 3: cout<<"Welcher Knoten soll geloescht werden:";
    cin>>such;
    //globale_wurzel=wurzel;
    suche_knoten(&wurzel, such);
    break;
    case 4:break;
    default: cout<<"Falsche Eingabe!!!";
    }
    }while(wahl != 4);
    return 0;
    }



  • Ich denke der Fehler ist das Du kein int in void* wandeln kannst ?



  • Und wie kann man das sonst machen?



  • Zeig doch mal die Zeilen in den der Fehler passiert. Ich hab ehrlich gesagt keine Lust Zeilen in einem Source zu zählen der zudem keine Codetags hat.



  • void loesche(struct baum **zeiger)
    {
    struct baum *temp;
    int tempwert;
    if(wurzel == *zeiger)
    {
    cout<<"Wurzel kann nicht geloescht werden!!!";
    return ;
    }
    if((*zeiger) != NULL)
    {
    if((*zeiger)->links==NULL && (*zeiger)->rechts==NULL)
    {
    free(temp->wert); //<<<<----HIER IST DER 1. FEHLER
    free(*zeiger);
    *zeiger=NULL;
    }
    else
    {
    if((*zeiger)->links==NULL)
    {
    temp=*zeiger;
    *zeiger=(*zeiger)->rechts;
    free(temp->wert); //<<<<-----Hier der 2. Fehler free(temp);
    else
    {
    if((*zeiger)->rechts==NULL)
    {
    temp=*zeiger;
    *zeiger=(*zeiger)->links;
    free(temp->wert); //<<<<<---Hier der 3. Fehler
    free(temp);
    }
    //...

    void suche_ersatz(struct baum **zeiger, int *neuwert)
    {
    struct baum *temp;
    if(*zeiger != NULL)
    {
    if((*zeiger)->links ==NULL)
    {
    *neuwert=(*zeiger)->wert;
    temp=*zeiger;
    *zeiger=(*zeiger)->rechts;
    free(temp->wert); <<<<<<<<---------- Der 4. Fehler
    free(temp);
    }
    else
    {
    suche_ersatz(&((*zeiger)->links),neuwert);
    }
    }
    }



  • Baum::Wert ist vom Typ int. Free verlangt aber einen Zeiger auf irgendwas (=void). Das das nicht klappt ist klar. Äpfel != Birnen.

    Wenn also Baum::Wert auf einen Speicherbereich zeigen soll, der irgendwann freigegeben werden muß, dann mußt Du das auch richtig in Deiner Struktur deklararieren.


Anmelden zum Antworten