Nieuws:

We zijn er weer.

Na lange tijd van afwezigheid zijn we er weer  :laugh:
We hebben alle wachtwoorden gereset, je oude wachtwoord werkt niet meer.Je moet via het "wachtwoord vergeten"-linkje je wachtwoord resetten. Je krijgt hiervoor een mailtje op het adres dat je bij ons geregistreerd hebt.

De komende tijd zijn we nog druk bezig om de rest van de site op te bouwen, dus het kan zijn dat sommige onderdelen (tijdelijk) niet werken.

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: [C] Héél raar voorval  (gelezen 3235 keer)

Offline Joshua822

  • Documentatieteam
  • Steunpunt: Nee
[C] Héél raar voorval
« Gepost op: 2009/11/27, 18:04:12 »
Hallo allemaal.

Ik heb vandaag, gewoon om de leerstof even te herhalen, even rap de code voor een linked list geschreven :
/* A linked list in C */

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

struct node
{
  unsigned short value;
  struct node * next;
};

void travel_linked_list ( struct node * ll );
void delete_linked_list ( struct node * ll );

int main ( )
{
  struct node * root = ( struct node * ) malloc ( sizeof ( struct node ) );
  root->value = 86;
  root->next = ( struct node * ) malloc ( sizeof ( struct node ) );
  root->next->value = 210;
  travel_linked_list ( root );
  delete_linked_list ( root );
  return 0;
}
 
void travel_linked_list ( struct node * ll )
{
  while ( ll->next != 0 )
  {
    printf ( "%hu \n", ll->value );
    ll = ll->next;
  }   
}
void delete_linked_list ( struct node * ll )
{
  while ( ll )
  {
    struct node * freemem = ll;
    ll = ll->next;
    free ( freemem );
  }
}

Echter, als ik dit uitvoer print Windows ( ja, sorry :P ) eindeloos gewoon willekeurige getallen naar het scherm, en ik moet het programma afsluiten.

Is er iets dat ik fout doe ?

Alvast bedankt ;)

Offline Mossie

  • Lid
  • Steunpunt: Nee
Re: [C] Héél raar voorval
« Reactie #1 Gepost op: 2009/11/27, 19:04:58 »
Je hebt de waarde root->next->next niet op NULL gezet. Hierdoor blijft ie oneindig willekeurige getallen afdrukken. In Linux hou dat programma denk segmentatiefout geven.

Offline Joshua822

  • Documentatieteam
  • Steunpunt: Nee
Re: [C] Héél raar voorval
« Reactie #2 Gepost op: 2009/11/27, 19:47:55 »
Dat is volgens mij het probleem niet. Als je een pointer nog geen adres geeft zal de pointer gewoon op 0 / NULL staan.

Ook heb ik het getest met zowel NULL en O, het baat jammer genoeg niet veel.

Offline Joshua822

  • Documentatieteam
  • Steunpunt: Nee
Re: [C] Héél raar voorval
« Reactie #3 Gepost op: 2009/11/27, 20:20:33 »
Sorry voor de dubbelpost, maar ik denk het knelpunt gevonden te hebben.

Kijk eens naar deze code :
/* A linked list in C */

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

struct node
{
  unsigned short value;
  struct node * next;
};

void travel_linked_list ( struct node * ll );
void delete_linked_list ( struct node * ll );

int main ( )
{
  struct node * root = ( struct node * ) malloc ( sizeof ( struct node ) );
  root->value = 86;
  root->next = ( struct node * ) malloc ( sizeof ( struct node ) );
  root->next->value = 210;
  root->next->next = 0;
  travel_linked_list ( root );
  delete_linked_list ( root );
  return 0;
}
 
void travel_linked_list ( struct node * ll )
{
  while ( ! ll = NULL)
  {
    printf ( "%hu \n", ll->value );
    ll = ll->next;
  }   
}
void delete_linked_list ( struct node * ll )
{
  while ( ll )
  {
    struct node * freemem = ll;
    ll = ll->next;
    free ( freemem );
  }
}

Kijk vooral naar de lijn while ( ! ll == NULL ). Hier zit het hem : gcc zegt dat hier een vergelijking tussen een pointer en een integer plaats vindt.

Persoonlijk begrijp ik niet wat ik moet doen. Ik dacht toch echt dat "NULL" betekende dat de pointer naar niets verwijst, maar het kan ook een bug zijn, of waarschijnlijk ben ik weer aan het klungelen met alles ;)

Offline Rachid

  • Vertaalteam
    • rachidbm
    • Mijn blog
  • Steunpunt: Nee
Re: [C] Héél raar voorval
« Reactie #4 Gepost op: 2009/11/27, 23:01:29 »
Er staat   while ( ! ll = NULL)

Moet dit niet zijn:   while ( ! ll == NULL) ??
Ben je ook blij dat Ubuntu zo toegankelijk en gratis is, en wil je graag net als ik iets terugdoen, kijk dan eens rond bij mwanzo, dé poort naar het bijdragen aan Ubuntu en haar gemeenschap!

Offline Rachid

  • Vertaalteam
    • rachidbm
    • Mijn blog
  • Steunpunt: Nee
Re: [C] Héél raar voorval
« Reactie #5 Gepost op: 2009/11/27, 23:03:10 »
In php zou ik het volgende doen:
while(ll = ll->next)
Kan in C denk ik ook wel...?
Ben je ook blij dat Ubuntu zo toegankelijk en gratis is, en wil je graag net als ik iets terugdoen, kijk dan eens rond bij mwanzo, dé poort naar het bijdragen aan Ubuntu en haar gemeenschap!

Offline Joshua822

  • Documentatieteam
  • Steunpunt: Nee
Re: [C] Héél raar voorval
« Reactie #6 Gepost op: 2009/11/27, 23:13:47 »
Laat maar. Ik heb het zo al opgelost :
/* A linked list in C */

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

struct node
{
  unsigned short value;
  struct node * next;
};

void travel_linked_list ( struct node * ll );
void delete_linked_list ( struct node * ll );

int main ( )
{
  struct node * root = ( struct node * ) malloc ( sizeof ( struct node ) );
  root->value = 86;
  root->next = ( struct node * ) malloc ( sizeof ( struct node ) );
  root->next->value = 210;
  root->next->next = 0;
  travel_linked_list ( root );
  delete_linked_list ( root );
  return 0;
}
 
void travel_linked_list ( struct node * ll )
{
  while ( ll )
  {
    printf ( "%hu \n", ll->value );
    ll = ll->next;
  }   
}
void delete_linked_list ( struct node * ll )
{
  while ( ll )
  {
    struct node * freemem = ll;
    ll = ll->next;
    free ( freemem );
  }
}

Offline Floris

  • Lid
  • Steunpunt: Nee
Re: [C] Héél raar voorval
« Reactie #7 Gepost op: 2009/11/28, 10:51:29 »
Ik denk dat je de ! verkeerd had staan: while ( ! ll == NULL ) moet while ( ll != NULL ) of while( !( ll == NULL )) zijn.  In C kun je daar gewoon while ( ll ) van maken: NULL wordt namelijk als false geïnterpreteerd.
Als je vraag beantwoord is, wees dan zo vriendelijk om de titel van je eerste post met "[OPGELOST]" te beginnen (klik op verander).

Offline Joshua822

  • Documentatieteam
  • Steunpunt: Nee
Re: [C] Héél raar voorval
« Reactie #8 Gepost op: 2009/12/01, 20:56:19 »
Wel, verdorie, het zelfde gebeurt weer !

Hier is de code :
#include <stdio.h>
#include <stdlib.h>

struct node
{
  unsigned short waarde;
  struct node * volgende;
};

struct node * tll ( struct node * ll, unsigned char print );
void nn ( struct node * ll );
void dll ( struct node * ll );

int main ()
{
  struct node * root = ( struct node * ) malloc ( sizeof ( struct node ) );
  root->waarde = 10;
  root->volgende = ( struct node * ) malloc ( sizeof ( struct node ) );
  tll ( root, 1 );
  dll ( root );
  return 0;
}
struct node * tll ( struct node * ll, unsigned char print ) 
{
  if ( !print )
    while ( ll )
      ll = ll->volgende;
  else
    while ( ll )
    {
      printf ( "%hu", ll->waarde );
      ll = ll->volgende;
    }
  return ll;
}

void nn ( struct node * ll )
{
  tll ( ll, 0 );
  ll = ( struct node * ) malloc ( sizeof ( struct node ) );
}

void dll ( struct node * ll )
{
  while ( ll )
  {
    struct node * free_mem = ll;
    ll = ll->volgende;
    free ( free_mem );
  }
}


Sorry, ik zou wat extra informatie willen geven, maar die heb ik niet.

Offline profoX

  • Lid
    • wesley
    • Lionslink
  • Steunpunt: Nee
Re: [C] Héél raar voorval
« Reactie #9 Gepost op: 2009/12/01, 21:11:04 »
Works for me.
Wel zou ik nog een expliciete waarde geven aan het 2e element in de lijst:
Citaat
int main ()
{
  struct node * root = ( struct node * ) malloc ( sizeof ( struct node ) );
  root->waarde = 10;
  root->volgende = ( struct node * ) malloc ( sizeof ( struct node ) );
  root->volgende->waarde = 20;
  tll ( root, 1 );
  dll ( root );
  return 0;
}

En de tll functie kan je eventueel wat inkorten door de if-test ergens anders te plaatsen:
Citaat
struct node * tll ( struct node * ll, unsigned char print )
{
  while ( ll ) {
    if (print)
      printf ( "%hu\n", ll->waarde );
    ll = ll->volgende;
  }
  return ll;
}
exacte tijdscomplexiteit is zo wel iets groter, maar orde-van-grootte tijdscomplexiteit niet, en de code is leesbaarder en korter

Bij jouw programma krijg ik de output "100"
als je een newline laat zetten krijg ik "10\n0\n"
als ik de waarde 20 toeken aan het 2e element krijg ik "10\n20\n"
lijkt dus toch te werken?
Human Knowledge Belongs To The World -- Antitrust (2001)
Nederlandstalige Ubuntu documentatie van Ubuntu-NL (wiki)

Offline Joshua822

  • Documentatieteam
  • Steunpunt: Nee
Re: [C] Héél raar voorval
« Reactie #10 Gepost op: 2009/12/01, 21:45:54 »
Ach, ja, dan zal het wel aan mijn tijdelijke *kuch* besturingssysteem *kuch* liggen.

Nog bedankt voor de tips ;)

Offline JanClaeys

  • Lid
  • Steunpunt: Nee
Re: [C] Héél raar voorval
« Reactie #11 Gepost op: 2009/12/07, 17:01:02 »
Als je op Windows werkt gebruik je waarschijnlijk de MS Visual C++-compiler?  Zoals de naam al zegt is dat een C++-compiler, en die kan geen C compileren zoals het hoort.

Als je C wil compileren, gebruik je best een C-compiler, vb. van MinGW (een Windows-versie van GCC, open source), Digital Mars, ...
Jan Claeys
Ubuntu-nl IRC team - Ubuntu-be LoCoTeam Contact

Offline Joshua822

  • Documentatieteam
  • Steunpunt: Nee
Re: [C] Héél raar voorval
« Reactie #12 Gepost op: 2009/12/07, 18:56:06 »
Ik gebruik GCC in MinGW ;) Ik hou van GCC, omdat ik het direct via de commandline kan gebruiken. Alleen werken de opties ansi, Wall, en pedantic niet goed in Windows.

Offline JanClaeys

  • Lid
  • Steunpunt: Nee
Re: [C] Héél raar voorval
« Reactie #13 Gepost op: 2009/12/07, 20:03:34 »
Dan moet je misschien bugs melden, aangezien die hetzelfde zouden moeten werken (tenzij dat onmogelijk is i.v.m. "Win32-compatibiliteit" misschien)?  IIRC is MinGW wel vaak achter op de "normale" GCC-versies ook.

Een andere optie voor gcc op Windows is Cygwin natuurlijk...
Jan Claeys
Ubuntu-nl IRC team - Ubuntu-be LoCoTeam Contact