Toon posts:

[C] Recursive struct members

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb er helaas niet veel concreets over bijelkaar kunnen googlen, maar is het mogelijk in C recursive members in een structure te hebben?

Dus dit:

C:
1
2
3
4
5
6
typdef struct
{
  char *content;
  tree_struct *left;
  tree_struct *top;
} tree_struct;

Of moet het echt zo gebeuren:

C:
1
2
3
4
5
6
typdef struct
{
  char *content;
  void *left;
  void *top;
} tree_struct;

En dan bij het gebruik de void * gaan typecasten naar een tree_struct.

Verwijderd

je kan refererenaar het zelfde tpye struct binnen eens struct:

bv
code:
1
2
3
4
typedef struct LinkedListEl_ {
   void *data;
   struct LinkedListEl_ *next;
} LinkedListEl;

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

En anders kan je het zo doen:

code:
1
2
3
4
5
6
7
8
9
10
struct A;
struct B;

struct A {
    B* b;
};

struct B {
    A* a;
};


met forward declarations. Dit kan overigens alleen als je pointers gebruikt als members. Denk maar aan het resultaat van sizeof(A); ...

Verwijderd

Topicstarter
Zoijar schreef op 22 december 2002 @ 14:54:
code:
1
2
3
4
5
6
7
8
9
10
struct A;
struct B;

struct A {
    B* b;
};

struct B {
    A* a;
};
Dit werkte in mijn voorbeeld merkwaardigerwijs niet...
maar ik bekijk het zodadelijk even :-)

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Ben ik blij dat geavanceerdere talen over multipass parsers beschikken.

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 24-08 22:38
Dit is ook nog een mogelijkheid:

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
25
26
27
28
29
30
/* Forward declaration of tree node structure */
struct _tree_struct;

/* The types */
typedef _tree_struct tree_struct, *p_tree_struct;

/* The struct */
struct _tree_struct
{
    char content[1024];
    p_tree_struct prev;
    p_tree_struct next;
};

int main()
{
    tree_struct first;
    tree_struct second;

    p_tree_struct p = 0;
    
    p = &first;

    p->next = &second;

    p = &second;
    p->prev = &first;

    return 0;
}      

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.


  • Bigs
  • Registratie: Mei 2000
  • Niet online
Gewoon een naam geven aan je typedeclaratie zoals tijnbraun doet en dan moet het werken :)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17:04

.oisyn

Moderator Devschuur®

Demotivational Speaker

Alarmnummer schreef op 22 december 2002 @ 16:12:
Ben ik blij dat geavanceerdere talen over multipass parsers beschikken.


Definieer multipass
Verder is het niet echt een constructieve opmerking voor deze thread...

[ Voor 15% gewijzigd door .oisyn op 23-12-2002 12:09 ]

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.


  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Een mulipass parser is een parser die eerst je hele source parsed, daar wat informatie over opslaat die dan gebruikt kan worden voor de volgende "pass". Het resultaat is dat je gemakkelijk een struct kan gebruiken voordat deze gedeclareerd/definieerd is.
Het hoeft trouwens niet een extra pass over je source te zijn in de parsing fase, maar kan ook een extra pass over je abstract syntax tree zijn in je semantic analysis fase.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17:04

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ik weet wat multipass op zich inhoudt, maar het punt is dat er meerder interpretaties van zijn. Vroeger was multipass namelijk dat de source echt 2x wordt gescanned/geparsed, denk aan de oude assemblers. Tegenwoordig is dat helemaal niet meer het geval, waardoor het dus nogal vaag wordt of iets single of multipass gebeurt

Java bijvoorbeeld, waar Alarmnummer ongetwijfeld op doelt met z'n 'geavanceerdere talen', is in principe ook wel in singlepass te parsen. Maar daar is het probleem ook vrij simpel, de enige typen die je zelf kunt definieren zijn classes (en dan reken ik interfaces ook even tot de classes). Een 2e pass over de AST is dus totaal niet nodig, je kunt simpelweg voldoen met eerst verzamelen van de class definities en dan elke class definitie apart gaan analyseren. Je doorloopt de boom dan in 1 pass, zij het in een andere volgorde

En is C++ bijvoorbeeld multipass? Daar kun je in principe 2 antwoorden op geven. Ten eerste zou je zeggen: nee, aangezien de types van tevoren bekend moeten zijn
Ten tweede kun je zeggen: ja, je kunt in een class definitie gebruik maken van een member function/variable terwijl die pas verderop gedefinieerd wordt
Dus wat is het nou? :)

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.


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

.oisyn schreef op 23 december 2002 @ 12:46:
Ik weet wat multipass op zich inhoudt, maar het punt is dat er meerder interpretaties van zijn. Vroeger was multipass namelijk dat de source echt 2x wordt gescanned/geparsed, denk aan de oude assemblers. Tegenwoordig is dat helemaal niet meer het geval, waardoor het dus nogal vaag wordt of iets single of multipass gebeurt
Ik zou zelf ook niet zo vast houden aan 2 keer. Waar ik voornamelijk op doel is dat je een AST opbouwt, en daar later meerdere keren over heen gaat, en dan kan je dit soort problemen zeer eenvoudig oplossen

class A{
B b;
}

class B{
A a;
}

Ipv dat je met allerlei onnodige forward declaraties moet komen. Dit komt over het algemeen de leesbaarheid ten goeie. En ik vind het persoonlijk ook wel zo handig werken omdat je niet bezig hoeft te houden met allerlei tekortkomingen in de parser die al lang verholpen hadden kunnen worden (tenslotte zijn die technieken tot in den treure beschreven).
Java bijvoorbeeld, waar Alarmnummer ongetwijfeld op doelt met z'n 'geavanceerdere talen',
Niet alleen Java hoor, maar ik heb het zelf ook meerdere keren toegepast en het is zeer eenvoudig (als je een beetje een goeie AST hebt).
is in principe ook wel in singlepass te parsen. Maar daar is het probleem ook vrij simpel, de enige typen die je zelf kunt definieren zijn classes (en dan reken ik interfaces ook even tot de classes).
:?
Een 2e pass over de AST is dus totaal niet nodig, je kunt simpelweg voldoen met eerst verzamelen van de class definities en dan elke class definitie apart gaan analyseren. Je doorloopt de boom dan in 1 pass, zij het in een andere volgorde
Zie mijn voorbeeld. Een andere volgorde die classes parsen heeft ook geen nut, omdat het probleem symetrisch is.
En is C++ bijvoorbeeld multipass? Daar kun je in principe 2 antwoorden op geven. Ten eerste zou je zeggen: nee, aangezien de types van tevoren bekend moeten zijn

Ten tweede kun je zeggen: ja, je kunt in een class definitie gebruik maken van een member function/variable terwijl die pas verderop gedefinieerd wordt
Dus wat is het nou? :)
Ik ben niet echt thuis in c++ of de parsetechnieken die daarvoor gebruikt zijn.

[ Voor 8% gewijzigd door Alarmnummer op 23-12-2002 13:33 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17:04

.oisyn

Moderator Devschuur®

Demotivational Speaker

[nohtml]
Alarmnummer schreef op 23 December 2002 @ 13:29:
[...]

Ik zou zelf ook niet zo vast houden aan 2 keer. Waar ik voornamelijk op doel is dat je een AST opbouwt, en daar later meerdere keren over heen gaat, en dan kan je dit soort problemen zeer eenvoudig oplossen

class A{
B b;
}

class B{
A a;
}
dit is natuurlijk ook te doen door maar 1 keer door de boom heen te gaan, zij het in een andere volgorde
Ik bedoel, de boom zou er bij dit voorbeeld er ongeveer zo uit zien:

code:
1
2
3
4
5
6
7
8
9
Source file
|
+-+ class definition (A)
| |
| +-- class member (B b)
|
+-+ class definition (B)
  |
  +-- class member (A a)


Je kunt dan eerst alle kinderen van Source file afgaan, en alle class definitions verzamelen. Dan heb je in feite alle types, zodat je vervolgens van elke class de rest kunt gaan analyseren. Je gaat maar 1x door de boom, alleen niet postorder. Dat lijkt me geen multipass

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.

Pagina: 1