c:stack Beispiel funktioniert nicht

Diskussionen zu Tutorials, Änderungs- und Erweiterungswünsche
Antworten
Benutzeravatar
stampuhh
Beiträge: 211
Registriert: Sa Nov 07, 2009 4:39 pm
Wohnort: Paderborn

c:stack Beispiel funktioniert nicht

Beitrag von stampuhh » Sa Nov 07, 2009 4:52 pm

Hallo,

ich arbeite mich gerade durch das C-Tutorial. Auch wenn es noch nicht ganz fertig ist war es doch schon ganz gut geschrieben.

Jetzt bin ich aber bei dem Stack-Beispiel hängen geblieben.

Und zwar kommen beim compilieren einige Fehlermeldungen. :(

Die ersten konnte ich noch beheben (Denke ich zumindest):
Zeile 16: Warnung: Implizite Deklaration der Funktion »malloc«|
habe ich behoben durch das einfügen von #include <stdlib.h>.

Zeile 40: Warnung: »return« ohne Wert in nicht-void zurückgebender Funktion
da hab ich einfach hinter das return eine 0 geschrieben damit der Rückgabewert vom Typ int ist.

Das letzte Problem wo ich allerdings noch nicht weiter weiß, bzw. gar nicht weiß was der Compiler da von mir will:
Zeile 55 (Code: stack = (unsigned int *)0;): Warnung: Zuweisung von inkompatiblem Zeigertyp|

Vielleicht könnte mir da jemand weiterhelfen (und das Tutorial korrigieren wenn es sich um wirkliche Fehler handelt)?

Danke schon mal!

gruß stampuhh
NachDenkSeiten.de

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: c:stack Beispiel funktioniert nicht

Beitrag von nufan » Sa Nov 07, 2009 5:27 pm

Ich hab dir mal schnell ein funktionierendes auf dem Code basierendes Beispiel zusammengebastelt:

Code: Alles auswählen

#include <stdio.h>
#include <stdlib.h>


typedef struct 
{
   unsigned int* esp;
   unsigned int size;
   unsigned int maxSize;
} Stack;
 
 
Stack * CreateStack( unsigned int maxSize );
void Push( Stack * stack, unsigned int value );
unsigned int Pop( Stack * stack );
void DestroyStack( Stack * stack );
 
 
 int main ()
 {
 
   Stack *s;
   int i;
 
   s = CreateStack (5);
   
   for (i = 0; i < 5; i++)
     Push (s, i);
 
   for (i = 0; i < 5; i++)
     printf ("Element %d: %u\n", i + 1, Pop (s));
  
   DestroyStack (s);
 
   return 0;
 
 }
 
 
Stack * CreateStack( unsigned int maxSize )
{
   if( maxSize <= 0 )
      return 0;
 
   Stack * stack = (Stack*) malloc( sizeof( Stack ) );
   stack->maxSize = maxSize;
   stack->size = 0;
   stack->esp = (unsigned int *) malloc( maxSize );
 
   return stack;
}
 
void Push( Stack * stack, unsigned int value )
{
   if( stack == 0 )
      return;
 
   if( stack->size >= stack->maxSize )
      return;
 
   stack->esp--;
   *( stack->esp ) = value;
   stack->size++;
}
 
unsigned int Pop( Stack * stack )
{
   if(stack == 0)
      return 0;
 
   if( stack->size <= 0 ) 
      return 0;
 
   unsigned int result = *( stack->esp );
   stack->esp++;
   stack->size--;
   return result;
}
 
void DestroyStack( Stack * stack )
{
   free( stack->esp );
   free( stack );
   stack = NULL;
}
Ich bin eher gegen die returns in Push und Pop. Bei Push weiß man nicht, ob der Wert nun wirklich geschrieben wurde und bei Pop kann man nicht sagen, ob da jetzt der Wert 0 auf dem Stack gelegt wurde oder ob man seinen Bereich überschritten hat. Eine meiner Meinung nach schönere Lösung wären die Funktionen isEmpty und isFull. Dann ist der Benutzer des Codes selbst verantwortlich für das richtige Schreiben und Lesen, hat aber auch eine einfache Mögleichkeit die Belegung im Stack zu prüfen.
Auf jeden Fall sollte das Beispiel überarbeitet (-> ausführbar gemacht, kommentiert) werden.

Benutzeravatar
+Fuss+
Beiträge: 385
Registriert: Fr Nov 14, 2008 8:16 pm

Re: c:stack Beispiel funktioniert nicht

Beitrag von +Fuss+ » Sa Nov 07, 2009 5:29 pm

Willkommen im Forum!

Ich schätze mal das Inkludieren von stdlib.h wird für so etwas als selbstverständlich angesehen und steht deshalb nicht im Quellcode.

Das return; wurde gefixt.

Und zu dem anderen Fehler kann ich leider keine Auskunft geben, wobei ich davon ausgehe das wahrscheinlich nur Adressoperator oder Asterix fehlt.

MfG Fuss

Edit: War schon wieder einer schneller...

Benutzeravatar
stampuhh
Beiträge: 211
Registriert: Sa Nov 07, 2009 4:39 pm
Wohnort: Paderborn

Re: c:stack Beispiel funktioniert nicht

Beitrag von stampuhh » Sa Nov 07, 2009 5:40 pm

Danke euch beiden für die schnelle Antwort.

zu dem malloc und dem Includen. Ja das mag sein ;)
Ich bin aber noch neu in C und habe die Standartbibliotheken nicht automatisch drin. Daher meine Anmerkung dazu.

@nufan:
Dein Beispiel arbeitet soweit ganz gut. Allerdings gibt es Probleme beim "DestroyStack (s);". Wenn ich das auskommentiere läuft alles gut. Wenn ich das allerdings drin habe dann bekomme ich nach den gewollten Ausgaben noch allerlei kryptisches Zeugs ;)

Code: Alles auswählen

*** glibc detected *** ./Ueben: free(): invalid pointer: 0x086f0018 ***
+ Backtrace und Memorymap

Arbeite unter Ubuntu mit Code::Blocks falls das wichtig ist.

Hoffe du weißt auch dafür eine Lösung?

gruß stampuhh
NachDenkSeiten.de

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: c:stack Beispiel funktioniert nicht

Beitrag von nufan » Sa Nov 07, 2009 6:16 pm

stampuhh hat geschrieben:Dein Beispiel arbeitet soweit ganz gut. Allerdings gibt es Probleme beim "DestroyStack (s);". Wenn ich das auskommentiere läuft alles gut. Wenn ich das allerdings drin habe dann bekomme ich nach den gewollten Ausgaben noch allerlei kryptisches Zeugs ;)

Code: Alles auswählen
*** glibc detected *** ./Ueben: free(): invalid pointer: 0x086f0018 ***
Also ein Problem mit Zeigern... am DestroyStack selbst liegts mal sicher nicht. Schätze mal ein veränderter Pointer, der danach nicht mehr auf den Anfang des Speicherbereichs zeigt. Auf jeden Fall wird im CreateStack nicht genug Speicher reserviert, da die Anzahl der Bytes nicht maxSize sondern maxSize * sizeof (unsigned int) ist. Und um weitere Fehler zu verhindern verwende ich jetzt Indizes statt die Pointer selbst zu ändern:

Code: Alles auswählen

#include <stdio.h>
#include <stdlib.h>


typedef struct
{
  unsigned int* esp;
  unsigned int size;
  unsigned int maxSize;
} Stack;


Stack * CreateStack( unsigned int maxSize );
void Push( Stack * stack, unsigned int value );
unsigned int Pop( Stack * stack );
void DestroyStack( Stack * stack );
int isEmpty (Stack *stack);
int isFull (Stack *stack);


int main ()
{

  Stack *s;
  int i;

  s = CreateStack (5);
  
  for (i = 0; i < 10; i++)
    if (!isFull (s))
      Push (s, i);

  for (i = 0; i < 10; i++)
    if (!isEmpty (s))
      printf ("Element %d: %u\n", i + 1, Pop (s));

  DestroyStack (s);

  return 0;

}


Stack * CreateStack( unsigned int maxSize )
{
  if( maxSize <= 0 )
    return 0;

  Stack * stack = (Stack*) malloc( sizeof( Stack ) );
  stack->maxSize = maxSize;
  stack->size = 0;
  stack->esp = (unsigned int *) malloc( maxSize * sizeof (unsigned int));

  return stack;
}

void Push( Stack * stack, unsigned int value )
{
  stack->esp[stack->size] = value;
  stack->size++;
}

unsigned int Pop( Stack * stack )
{
  stack->size--;
  return stack->esp[stack->size];
}

void DestroyStack( Stack * stack )
{
    free( stack->esp );
    free( stack );
    stack = NULL;
}

int isEmpty (Stack * s)
{
  return (s->size == 0);
}

int isFull (Stack * s)
{
  return (s->size == s->maxSize);
}
Wie du siehst wird jetzt in main bewusst die Größe des Stacks überschritten, aber das Zuweisen und Abfragen mittels den beiden neuen Funktionen verhindert.

Benutzeravatar
stampuhh
Beiträge: 211
Registriert: Sa Nov 07, 2009 4:39 pm
Wohnort: Paderborn

Re: c:stack Beispiel funktioniert nicht

Beitrag von stampuhh » Sa Nov 07, 2009 6:24 pm

Sehr gut. Das klappt ohne Probleme. Mir gefällt die Lösung mit den isEmpty und isFull-Funktionen auch viel besser!

Danke! :)

gruß stampuhh
NachDenkSeiten.de

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: c:stack Beispiel funktioniert nicht

Beitrag von Xin » Sa Nov 07, 2009 7:23 pm

Blöde Frage am Rande... der Code im Wiki ist aber jetzt so korrigiert, dass er anfängertauglich ist?

Ansonsten willkommen im Forum, Stampuhh und erstmal vielen Dank, hier den Fehler zu melden. So hilfst Du uns wunderbar das Tutorial zu verbessern. Wenn Dir zuvor andere Stolpersteine aufgefallen sind, nur raus damit.
Und aus Neugier interessiert mich: Wie hast Du das Tutorial gefunden?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: c:stack Beispiel funktioniert nicht

Beitrag von nufan » Sa Nov 07, 2009 7:40 pm

Xin hat geschrieben:Blöde Frage am Rande... der Code im Wiki ist aber jetzt so korrigiert, dass er anfängertauglich ist?
Ich hab jetzt mal meine Version reinkopiert, die ist zumindest kompilier- und ausführbar.

Benutzeravatar
stampuhh
Beiträge: 211
Registriert: Sa Nov 07, 2009 4:39 pm
Wohnort: Paderborn

Re: c:stack Beispiel funktioniert nicht

Beitrag von stampuhh » Sa Nov 07, 2009 7:44 pm

Was den Code im Tutorial angeht komme ich damit klar ;)
(Habe allerdings auch schon etwas Erfahrung, nur halt in Java und nicht in C)

Der ein oder andere "Stolperstein" war da sicher noch. Kann ich bei Gelegenheit auch gerne noch mal ein neues Thema aufmachen wo ich eine Liste rein stelle mit dem was mir so aufgefallen ist. Ist denke mal besser als für jeden Fehler ein Thema zu eröffnen.

Wie ich zu euch gekommen bin:
Grob gesagt über google. Genauer gesagt über das Forum und diesen Thread.
Ich habe mir das C++ von A bis Z (so heißt es glaube ich, habs nicht zur Hand gerade) gekauft. Auf der CD war noch das OpenBook C von A bis Z. Das Beispiel aus dem verlinkten Thread entstammt dem Buch und das lief bei mir nicht wie gewünscht.

gruß stampuhh
NachDenkSeiten.de

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: c:stack Beispiel funktioniert nicht

Beitrag von Xin » Sa Nov 07, 2009 9:36 pm

stampuhh hat geschrieben:Was den Code im Tutorial angeht komme ich damit klar ;)
(Habe allerdings auch schon etwas Erfahrung, nur halt in Java und nicht in C)
Ich hoffe dieses Jahr das C-Tutorial einmal komplett durchgehen zu können. Bisher wurde vorrangig Text wieder verwertet und zugefügt. Aber das ganze muss halt noch in einen Fluss gebracht werden.
stampuhh hat geschrieben:Der ein oder andere "Stolperstein" war da sicher noch. Kann ich bei Gelegenheit auch gerne noch mal ein neues Thema aufmachen wo ich eine Liste rein stelle mit dem was mir so aufgefallen ist. Ist denke mal besser als für jeden Fehler ein Thema zu eröffnen.
Da wäre ich dankbar für :-)
stampuhh hat geschrieben:Wie ich zu euch gekommen bin:
Grob gesagt über google.
Das wollte ich hören :-)
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten