[C] case statement en pointer

Pagina: 1
Acties:

  • FendtVario
  • Registratie: Januari 2002
  • Laatst online: 12-05-2025

FendtVario

The leader drives Vario!

Topicstarter
Ik heb in een c programmatje en boom gemaakt die bestaat uit een aantal verschillende elementen. In een element kan een link worden gemaakt naar een niveau dieper. De elementen zijn opgeslagen in een struct.
code:
1
2
3
4
5
6
7
8
9
typedef struct
{
   int          type;
   struct alternatief   *alt;
   char          pipe;
   EXPR_LINK        expr;
} alternatief;

typedef alternatief     *ALT_LINK;

De print functie:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
09 void printAlt(ALT_LINK alternatief)
10 {
11     switch( alternatief->type  )
12     {
13           case ALT_ALT_EXPR:
14               printAlt( alternatief->alt );
15               printf("%s", alternatief->pipe );
16               printExpr( alternatief->expr);
17               break;
18
19           case ALT_EXPR:
20               printExpr( alternatief->expr );
21               break;
22    }
23 }

Maar bij het compileren krijg ik dit:
code:
1
2
3
4
5
6
7
# gcc -c print.c

print.c: In function `printAlt':
print.c:13: case label does not reduce to an integer constant
print.c:14: warning: passing arg 1 of `printAlt' from incompatible pointer type
print.c:19: case label does not reduce to an integer constant
print.c:14: warning: unreachable code at beginning of switch statement

De foutmeldingen komen vaker voor maar voor dit voorbeeld neem ik alleen het alternatief. Mijn vragen:
1) waarom een fout in regel 13? ALT_ALT_EXPR is gedefineerd als "const int ALT_ALT_EXPR = 0;"
2) hoe kom in aan een incompatible pointer type, hoe anders is *alternatief dan ALT_LINK?

Chris

(alt_alt_link was typo -> alt_alt_expr)

www.fendt.com | Nikon D7100 | PS5


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 18:21
Op woensdag 03 juli 2002 20:11 schreef FendtVario het volgende:
1) waarom een fout in regel 13? ALT_ALT_LINK is gedefineerd als "const int ALT_ALT_LINK = 0;"
Er staat in je code ALT_ALT_EXPR; verder zou het goed moeten zijn (of we zien het beiden over het hoofd).
2) hoe kom in aan een incompatible pointer type, hoe anders is *alternatief dan ALT_LINK?
Kijk eens goed naar je code:
code:
1
2
3
4
5
6
7
typedef struct
{
   int          type;
   struct alternatief   *alt;
   char          pipe;
   EXPR_LINK        expr;
} alternatief;

Je declareert een ANONIEME struct, en deze geef je als typedef (alias) 'alternatief'.

'alt' is echter een pointer naar 'struct alternatief' en 'struct alternatief' is niet (hier) gedefinieerd. Omdat de compiler best een pointer wil maken naar een struct die 'ie nog niet kent (diehoeft 'ie op dit punt ook niet te kennen) krijg je geen error (hoewel een warning prettig zou zijn geweest).

De oplossing is dus om ofwel je struct een naam te geven, of 'alternatief' als type te gebruiken.

Qua stijl zou ik het persoonlijk trouwens mooier vinden als je aangeeft dat een alternatief een 'eindpunt' in je boom is, door je pointer op NULL te zetten. Je kunt dan je type achterwege laten en je case wijzigen in:
code:
1
2
3
4
5
6
void printAlt(ALT_LINK alternatief)
{
  if(alternatief->alt != NULL)
    printAlt(alternatief->alt);  
  printExpr(alternatief->expr);
}

  • FendtVario
  • Registratie: Januari 2002
  • Laatst online: 12-05-2025

FendtVario

The leader drives Vario!

Topicstarter
Ik ben compleet noob met c, heb je misschien een klein voorbeeldje?

www.fendt.com | Nikon D7100 | PS5


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 18:21
Op woensdag 03 juli 2002 20:25 schreef FendtVario het volgende:
Ik ben compleet noob met c, heb je misschien een klein voorbeeldje?
Sorry, nee. Ik heb al wat voorbeeldcode gegeven en tenzij je me op specifieke onduidelijkheden kunt wijzen, denk ik dat ik helder genoeg hebt uitgelegd hoe je je probleem kunt oplossen.

Het enige fundamentele begrip dat je nodig hebt, is dat je met 'struct x' een struct met de naam x definieert, die vervolgens als type te gebruiken is als 'struct x'.

Als je dat nog niet (goed) wist, kijk dan goed naar deze code:
code:
1
2
3
4
5
6
7
typedef struct naam
{
  ..
} alias;

struct naam var1; /* geldige code */
alias    var2; /* geldig alternatief */

  • Sjonny
  • Registratie: Maart 2001
  • Laatst online: 14:02

Sjonny

Fratser

hoewel een const int wel een constant integer is, kan deze niet in een switch() worden gebruikt. je moet iets hebben als
code:
1
#define ALT_ALT_EXPR 0

The problem is in the part of your brain that handles intelligence.


Verwijderd

Op woensdag 03 juli 2002 20:11 schreef FendtVario het volgende:
code:
1
2
3
4
5
6
7
8
9
typedef struct
{
   int          type;
   struct alternatief   *alt;
   char          pipe;
   EXPR_LINK        expr;
} alternatief;

typedef alternatief     *ALT_LINK;
Dit ziet er enorm cool uit. :D. Leg me eens uit wat de bedoeling van deze code is? Ik kan er werkelijk geen wijs uit worden...

Met bovenstaande code zou de volgende declaratie [...]
code:
1
static *ALT_LINK *blaat;

[...] geldig zijn. Maar wat wil je daarmee bereiken?

M.a.w., ben ik nou zo ontzettend dom of wordt het tijd om "C voor beginners" eens uit de bieb te halen? ;).

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 18:21
Op woensdag 03 juli 2002 20:45 schreef beelzebubu het volgende:
Met bovenstaande code zou de volgende declaratie [...]
code:
1
static *ALT_LINK *blaat;

[...] geldig zijn. Maar wat wil je daarmee bereiken?
Het wordt tijd om "C voor beginners" eens uit de bibliotheek te halen. ;)

ALT_LINK is gedefinieerd als zijnde van type (alternatief * ).
code:
1
2
alternatief *a; /* Ok. */
ALT_LINK     b; /* Equivalent. */

edit:
Blijf gvd van m'n tekst af, Topix!
Pagina: 1