Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[C] Reference argument naar structure

Pagina: 1
Acties:

  • HammerT
  • Registratie: April 2004
  • Laatst online: 08-11 12:23
Okee, voorbeeldje reference argument:

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void swap( int *num1, int *num2 );

int main()
{
    int x, y;
    .
    .
    .
    swap( &x, &y );
}

void swap( int *num1, int *num2 )
{
    int t;

    t = *num1;
    *num1 = *num2;
    *num2 = t;
}


Alleen ik wil dus een referentie naar een structure. Nu weet ik wel dat ik -> moet gebruiken in plaats van een punt. Dus dan zou je in mij ogen dit moeten doen:

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
typedef struct{
    int foo;
    int bar;
}foobar;

void swap( foobar * value );

int main()
{
    foobar blaat;
    .
    .
    .
    swap( &blaat );
}

void swap( foobar * value )
{
    int t;

    t = *value->foo;
    *value->foo = *value->bar;
    *value->bar = t;
}


Maar dan krijg ik een error met de melding: "type error: pointer expected" ( @ regel 21 ;) )

  • Koppensneller
  • Registratie: April 2002
  • Laatst online: 14:25

Koppensneller

winterrrrrr

En als je er nu dit van maakt?

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
typedef struct{
    int foo;
    int bar;
}foobar;

void swap( foobar &value );

int main()
{
    foobar blaat;
    .
    .
    .
    swap( blaat );
}

void swap( foobar  &value )
{
    int t;

    t = value->foo;
    value->foo = value->bar;
    value->bar = t;
}

Verwijderd

Ik ben niet helemaal into C.
Maar het argument 'value' van void swap is toch al een pointer?

door op regel 21 *value te doen, maak je dan niet een pointer pointer? als dat al mogelijk is met deze syntax.
code:
1
2
3
4
5
6
7
8
void swap( foobar  *value ) 
{ 
    int t; 

    t = value->foo; 
    value->foo = value->bar; 
    value->bar = t; 
}


edit: net getest. bovenstaande code werkt prima :P

[ Voor 32% gewijzigd door Verwijderd op 08-04-2008 14:38 ]


  • HammerT
  • Registratie: April 2004
  • Laatst online: 08-11 12:23
KoppenSneller schreef op dinsdag 08 april 2008 @ 14:31:
En als je er nu dit van maakt?

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
typedef struct{
    int foo;
    int bar;
}foobar;

void swap( foobar &value );

int main()
{
    foobar blaat;
    .
    .
    .
    swap( blaat );
}

void swap( foobar  &value )
{
    int t;

    t = value->foo;
    value->foo = value->bar;
    value->bar = t;
}
Dat is C++
Verwijderd schreef op dinsdag 08 april 2008 @ 14:34:
Ik ben niet helemaal into C.
Maar het argument 'value' van void swap is toch al een pointer?

door op regel 21 *value te doen, maak je dan niet een pointer pointer? als dat al mogelijk is met deze syntax.
code:
1
2
3
4
5
6
7
8
void swap( foobar  *value ) 
{ 
    int t; 

    t = value->foo; 
    value->foo = value->bar; 
    value->bar = t; 
}
Dan krijg je toch het adres?

Edit:
Blijkbaar niet dus, thx :*)

Verwijderd

Verwijderd schreef op dinsdag 08 april 2008 @ 14:34:
Ik ben niet helemaal into C.
Maar het argument 'value' van void swap is toch al een pointer?

door op regel 21 *value te doen, maak je dan niet een pointer pointer? als dat al mogelijk is met deze syntax.
code:
1
2
3
4
5
6
7
8
void swap( foobar  *value ) 
{ 
    int t; 

    t = value->foo; 
    value->foo = value->bar; 
    value->bar = t; 
}


edit: net getest. bovenstaande code werkt prima :P
Bijna, je neemt de value van een reference, vervolgens neem je daar de value van en daarvan een property. En dat gaat dus fout :)

De -> is in C++ ingevoerd, en sindsdien ook in C99 (een update van K&R C en ANSI C). Deze is equivalient met *().. Een voorbeeld:
code:
1
2
blaat->foo = 9;
*(blaat).foo = 9;

Dus door * en -> te gebruiken krijg je
code:
1
**(blaat).foo = 9;

wat dus bepaald niet de bedoeling was.

TS mag dus kiezen
code:
1
2
blaat->foo = 9;
*blaat.foo = 9;

[ Voor 3% gewijzigd door Verwijderd op 08-04-2008 14:45 ]


Verwijderd

Kijk een kenner :)
Ben ik ook weer bij.

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
Bijna goed, alleen de geschiedenis niet. -> is heel veel ouder dan C99, ik denk zelfs K&R 1 (maar die heb ik niet paraat).

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Verwijderd

MSalters schreef op dinsdag 08 april 2008 @ 15:14:
Bijna goed, alleen de geschiedenis niet. -> is heel veel ouder dan C99, ik denk zelfs K&R 1 (maar die heb ik niet paraat).
K&R is uit '78. Ik heb hier een boek uit '86 waar nog geen woord gerept wordt over ->. Ik ben nu nog aan het zoeken wanneer deze voor het eerst in een standaard is opgenomen.
edit:

Het lijkt dat je toch gelijk hebt, -> bestond ook al in K&R, ik heb me vergist met de // die niet in K&R zit, maar wel in C++ en C99.

Overigens heb ik me ook vergist in de equivalent:
code:
1
2
(*blaat).foo = 9;
blaat->foo = 9;

Dus met de asterisk binnen de haakjes.
:$

[ Voor 26% gewijzigd door Verwijderd op 08-04-2008 20:47 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 08:45

.oisyn

Moderator Devschuur®

Demotivational Speaker

.edit: bliep, die laatste twee reacties compleet over het hoofd gezien :$. Spuit 11 dus.
Verwijderd schreef op dinsdag 08 april 2008 @ 14:42:
De -> is in C++ ingevoerd, en sindsdien ook in C99 (een update van K&R C en ANSI C). Deze is equivalient met *().. Een voorbeeld
Onzin. De -> is al zo oud als C is :).
code:
1
2
blaat->foo = 9;
*(blaat).foo = 9;

Dus door * en -> te gebruiken krijg je
code:
1
**(blaat).foo = 9;

wat dus bepaald niet de bedoeling was.

TS mag dus kiezen
code:
1
2
blaat->foo = 9;
*blaat.foo = 9;
Fout. *blaat.foo doet niet wat je wilt. Het sleutelwoord hier is operator precedence. De . gaat voor de *, dus hier staat *(blaat.foo), oftewel, dereference de pointer blaat.foo. Alleen is foo geen pointer maar een int, en blaat geen struct maar een pointer. Het equivalent van blaat->foo is dus (*blaat).foo.

[ Voor 5% gewijzigd door .oisyn op 08-04-2008 21:25 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 07:40

Creepy

Tactical Espionage Splatterer

Het boek dat ik hier heb, The C Programming Language second edition, dat qua datum 1988 heeft en (uiteraard) geschreven is door K&R bevat de -> al wel. In de inleiding wordt gesproken over "The ANSI standard for C" die in het boek wordt beschreven.
offtopic:
.oisyn is weer eens snel :P

[ Voor 16% gewijzigd door Creepy op 08-04-2008 21:28 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 16-11 18:33
Overigens heb je het niet over reference arguments ( die zoals aangegeven niet bestaan in C ) maar over pointer arguments.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.

Pagina: 1