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.