[(ansi) C] Linked list pass naar functie

Pagina: 1
Acties:

  • _cyclops_
  • Registratie: Mei 2000
  • Laatst online: 07-03-2025
Hoi,

'k ben wat aan 't maken met C onder linux (ansi c dus :) )
Het gaat allemaal redelijk, ik heb alleen een 'vaag' probleem.
Ik heb in m'n progel een linked list zitten. Deze wil ik opbouwen in een apparte functie, het ziet er ongeveer zo uit..
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
struct lijst {
  int x;
  struct lijst *next;
};
void GetList(struct lijst *list) {
  int i;
  struct lijst *tmp;
  for (i=0;i<10;i++) {
    tmp = (struct lijst *) malloc(sizeof(struct lijst));
    tmp -> x = i;
    tmp -> next = list;
    list = tmp;
  }
}

void main() {
  struct lijst *list,*tmp;

  list = null;

  GetList(list);

  while (list) {
    printf("Lijstding : %d\n",list -> x);
    tmp = list;
    list = list -> next;
    free(tmp);
  }
}

(even met de hand getikt dus fouten zullen er wel zijn :) )

echter, dit werkt niet...... list is na 't aanroepen van GetList(); nogsteeds NULL.
Kan iemand me uitleggen wat ik hier fout doe, of het eigenlijk wel zo kan?

alvast bedankt :)

  • whoami
  • Registratie: December 2000
  • Laatst online: 21:42
Ik zie niet direct het probleem, maar heb je al eens met de debugger door uw programma gestapt?

Verder een cosmetische opmerking:
het zou mooier zijn dat uw GetList functie geen parameters neemt, maar een return-type heeft van het type lijst* ipv void.

https://fgheysels.github.io/


  • _cyclops_
  • Registratie: Mei 2000
  • Laatst online: 07-03-2025
Op zondag 05 mei 2002 11:36 schreef whoami het volgende:
Ik zie niet direct het probleem, maar heb je al eens met de debugger door uw programma gestapt?
Dat is het probleem... lijst is gewoon nog NULL na het aanroepen van de functie. de while(list) wordt dus niet doorgelopen... het geeft dusook geen foutmelding of iets dergelijks.. :'(
Verder een cosmetische opmerking:
het zou mooier zijn dat uw GetList functie geen parameters neemt, maar een return-type heeft van het type lijst* ipv void.
Ja klopt, maar in m'n 'echte' progel return ik een int omdat daar dan een error code aanvast hangt. als ik de lijst return werkt het wel, maar dat wil ik dus niet....

Verwijderd

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void GetList(struct lijst **list) {
  int i;
  struct lijst *tmp;
  for (i=0;i<10;i++) {
    tmp = (struct lijst *) malloc(sizeof(struct lijst));
    tmp -> x = i;
    tmp -> next = *list;
    *list = tmp;
  }
}
void main() {
  struct lijst *list,*tmp;

  list = NULL;

  GetList(&list);

  while (list) {
    printf("Lijstding : %d\n",list -> x);
    tmp = list;
    list = list -> next;
    free(tmp);
  }
}

  • _cyclops_
  • Registratie: Mei 2000
  • Laatst online: 07-03-2025
Op zondag 05 mei 2002 12:02 schreef Yarvieh het volgende:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void GetList(struct lijst **list) {
  int i;
  struct lijst *tmp;
  for (i=0;i<10;i++) {
    tmp = (struct lijst *) malloc(sizeof(struct lijst));
    tmp -> x = i;
    tmp -> next = *list;
    *list = tmp;
  }
}
void main() {
  struct lijst *list,*tmp;

  list = NULL;

  GetList(&list);

  while (list) {
    printf("Lijstding : %d\n",list -> x);
    tmp = list;
    list = list -> next;
    free(tmp);
  }
}
great, dat werkt!
thx...
kun je misschien ook wat uitleg erbij geven, waarom dit zo moet bv?

Verwijderd

Je was druk bezig de pointer die op de stack stond te manipuleren ;)

[edit]
Ok uitleg is misschien nog iets te vaag laten we die pointer en die linked list er es uit mollen om het een beetje overzichtelijker te maken, dan komt jouw code op ongeveer dit neer.
code:
1
2
3
4
5
6
7
8
9
10
11
12
void GetInt(int x)
{
    x=5;
}

void main()
{
    int a;
    a=0;
    GetInt(a);
    printf("%d\n",a);
}

Kortom de functie GetInt krijgt de waarde van a mee op de stack, op de stack mag je deze aanpassen naar wens maar de orignele waarde van a blijft onaangetast, wil je de waarde van beinvloeden zal je een pointer naar a mee moeten geven.
code:
1
2
3
4
5
6
7
8
9
10
11
12
void GetInt(int *x)
{
    *x=5;
}

void main()
{
    int a;
    a=0;
    GetInt(&a);
    printf("%d\n",a);
}

Met pointers werkt dit precies het zelfde, alleen geef je een pointer naar 'n pointer mee ipv een pointer naar 'n int.

  • _cyclops_
  • Registratie: Mei 2000
  • Laatst online: 07-03-2025
Op zondag 05 mei 2002 12:17 schreef Yarvieh het volgende:
Je was druk bezig de pointer die op de stack stond te manipuleren ;)
juist... right...
nu beetje meer basic uitleg :?
ben nog niet zo ver met dat C enzo....

Verwijderd

Was ik al aan het typen ;)

  • _cyclops_
  • Registratie: Mei 2000
  • Laatst online: 07-03-2025
Op zondag 05 mei 2002 12:32 schreef Yarvieh het volgende:
Was ik al aan het typen ;)
ik zie het...
't is een beetje verwarrend, want 'list' is in mijn geval al een pointer, maar een pointer naar een allocated stukje geheugen.....

als je dus de pointer wil weizigen moet je dus een pointer naar de pointer maken..

begrijp 'k het nu goed? :)

Verwijderd

Je wilt een int wijzigen dus je geeft 'n pointer naar een int mee, je wilt 'n pointer wijzigen dus je geeft 'n pointer naar 'n pointer mee klinkt logish toch?

  • _cyclops_
  • Registratie: Mei 2000
  • Laatst online: 07-03-2025
dat is idd logischer ja...

't blijft voor me erg verwarrend maar 't wordt langzaam wel duidelijker...

heb je hier tutorials over of goeie boeken, die dit duidelijk uitleggen?

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 04-09 14:38

curry684

left part of the evil twins

Je moet er gewoon niet al te moeilijk over nadenken... je hebt het concept pointer denk ik goed door en da's 95% van de klus. Nu moet je gewoon voor ieder sterretje hetzelfde concept nog een keer toepassen :)

Om een leuk COM-voorbeeld uit de praktijk te geven (serieus gezien ooit):
code:
1
void __stdcall MyImplClass::DoSomething(IUnknown***** p_Interface);

Dit is dus een pointer naar een pointer naar een pointer naar een pointer naar een pointer naar een IUnknown object.

p_Interface wijst hier dus naar een IUnknown****, wat wijst naar een IUnknown***, wat wijst naar een IUnknown**, wat wijst naar een IUnknown*, wat wijst naar het feitelijke object.

Snappu ;)

Professionele website nodig?


  • _cyclops_
  • Registratie: Mei 2000
  • Laatst online: 07-03-2025
dat is idd wel duidelijker...

'k denk dat 'k na verloop van tijd dat ik aan code sluitel dat misschien wel over 't hoofd ga zien... goed onthouden dus..

thx alle2 voor de tips e.d. :Y)
Pagina: 1