[c / c++] cross reference

Pagina: 1
Acties:

  • elgringo
  • Registratie: Januari 2001
  • Laatst online: 20-08 14:20
Ik heb 2 files: msdos_fs.h msdos_rd.h

in msdos_fs.h worden structs en varaiabeles gedefinieerd die msdos_rd.h moet kennen, msdos_fs.h wordt dus geincluded.
msdos_fs.h moet op zijn beurt weer de methoden van msdos_rd.h kennen. Nu heb ik dus een cross reference.....

Bij headers hebben hebben ifndef erin en alles wordt met gcc gecompileerd.

Hoe los ik dit op (ik krijg foutmeldingen dat mijn struct al eens gedinieerd is)

if broken it is, fix it you should


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

je structs van tevoren declareren ipv definieren

C:
1
2
3
4
5
6
7
8
9
10
11
12
struct Child;

struct Parent
{
    struct Child * child;   /* Child is gedeclareerd, maar niet gedefinieerd */
    /* ... */
};

struct Child
{
    struct Parent * parent; /* Parent is hier gedefinieerd */
};

[ Voor 3% gewijzigd door .oisyn op 04-03-2003 14:46 ]

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.


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

:? Dat moet met een ifndef gewoon opgelost zijn, volgens mij :?

Laat eens wat code zien :)

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

drm schreef op 04 maart 2003 @ 14:47:
:? Dat moet met een ifndef gewoon opgelost zijn, volgens mij :?


een ifdef lost het probleem wat ik in mijn vorige post beschreef niet op
Als Parent in parent.h staat, en Child in child.h, dan krijg je zoiets (chronologische compilevolgorde):

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
31
32
33
34
35
36
37
// main.cpp:
#include "parent.h"

// parent.h
#ifndef PARENT_H
#define PARENT_H
#include "child.h"

// child.h
#ifndef CHILD_H
#define CHILD_H

#include "parent.h"

// parent.h
#ifndef PARENT_H   // PARENT_H is op dit moment al gedefinieerd
// ...
#endif /* PARENT_H */

// terug in child.h

struct Child
{
    struct Parent * parent;   // <-- error, Parent is nog niet gedefinieerd
};

#endif /* CHILD_H */

// terug in parent.h
#endif /* PARENT_H */

// terug in main.cpp

int main ()
{
    // ...
}

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.


  • elgringo
  • Registratie: Januari 2001
  • Laatst online: 20-08 14:20
msdos_fs.h:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#ifndef _MSDOSFS_H
#define _MSDOSFS_H
...
#include "msdos_rd.h"
#include "msdos_cm.h"
#include "msdos_wr.h"
...
typedef struct _DIRECTORY_ENTRY         // 289 bytes
{
   char           pcSfn[11];             // Short File Name
....  
   u_int16        usTopLevelCluster;     // cluster to upper dir (0 if this dir is the root)
} DIRECTORY_ENTRY;

.....

#endif

msdos_rd.h
C:
1
2
3
4
5
6
7
8
9
10
#ifndef _MSDOSRD_H
#define _MSDOSRD_H
...
#include "msdos_fs.h"
....
DIRECTORY_ENTRY*  MSDOS_NextDirEntry(void);
DIRECTORY_ENTRY* MSDOS_GetDirEntry(char* pcSfn);
DIRECTORY_ENTRY*  MSDOS_FirstDirEntry(void);
....
#endif


Belangrijkste is zo weergegeven

met de fout:
code:
1
2
"D:\proj\usb_mass_ht\hal\ata\msdos_fs.h", line 93: Serious error: type disagreement for 'DIRECTORY_ENTRY'
"D:\proj\usb_mass_ht\hal\ata\msdos_fs.h", line 93: Serious error: duplicate definition of 'DIRECTORY_ENTRY'

[ Voor 6% gewijzigd door elgringo op 04-03-2003 14:58 ]

if broken it is, fix it you should


Verwijderd

elgringo schreef op 04 March 2003 @ 14:57:
msdos_fs.h:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
#ifndef _MSDOSFS_H
#define _MSDOSFS_H
...
#include "msdos_rd.h"
#include "msdos_cm.h"
#include "msdos_wr.h"
...
typedef struct _DIRECTORY_ENTRY         // 289 bytes
{
   char           pcSfn[11];             // Short File Name
....  
   u_int16        usTopLevelCluster;     // cluster to upper dir (0 if this dir is the root)
} DIRECTORY_ENTRY;
Ik zie niet in waarom deze header die msdos_*.h headers nodig heeft :? En vergeet niet __packed__ want je heb het nodig, echt! Anders kun je er niet vanuitgaan dat de struct letterlijk wordt wat jij wil en sloop je gemakkelijk je filesystem! Gebruik daarvoor ook asserts in je code op de "sizeof" van de structs.

[ Voor 7% gewijzigd door Verwijderd op 04-03-2003 15:07 ]


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

.oisyn
Daar heb je gelijk in, ik zat aan een declaration teveel te denken :z
r. 13:
} DIRECTORY_ENTRY;
Daar kun je toch gewoon
code:
1
};
van maken :? Of is het nou echt te lang geleden :o

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • elgringo
  • Registratie: Januari 2001
  • Laatst online: 20-08 14:20
Verwijderd schreef op 04 March 2003 @ 15:05:
[...]


Ik zie niet in waarom deze header die msdos_*.h headers nodig heeft :? En vergeet niet __packed__ want je heb het nodig, echt! Anders kun je er niet vanuitgaan dat de struct letterlijk wordt wat jij wil! Gebruik ook asserts in je code op de "sizeof" van de structs.
staan onderin methoden die referen naar de msdos_rd.h

en __packed__ waar dient dat voor, want dat heb ik nog nooit gebruikt. (maar nu we het in een box moeten gaan draaien werkt het niet)

(box = settopbox = sat receiver)

if broken it is, fix it you should


  • elgringo
  • Registratie: Januari 2001
  • Laatst online: 20-08 14:20
drm schreef op 04 March 2003 @ 15:06:
.oisyn
Daar heb je gelijk in, ik zat aan een declaration teveel te denken :z
r. 13:

[...]

Daar kun je toch gewoon
code:
1
};
van maken :? Of is het nou echt te lang geleden :o
Ik gebruik een typedef (moet volgens coding standards)

if broken it is, fix it you should


Verwijderd

elgringo schreef op 04 maart 2003 @ 15:08:
en __packed__ waar dient dat voor, want dat heb ik nog nooit gebruikt. (maar nu we het in een box moeten gaan draaien werkt het niet)
__packed__ (of #pragma pack) moet ervoor zorgen dat je daadwerkelijk een packed-struct krijgt met de size van 289 bytes, waar we het al eerder over gehad hebben voor het uitlezen van je MBR. Als je de compiler niet vertelt dat de struct gepacked moet zijn, is er een redelijk grote kans dat de size van je struct groter is dan 289 bytes...

Enige argument voor cross reference is als je datatype A heb met een verwijzing naar datatype B en tegelijkertijd andersom, volgens mij. Dat is op te lossen zoals .oisyn aangaf. In jouw geval lijkt het er meer op dat je wat declaraties uit je msdos_rd.h naar je msdos_fs.h moet verschuiven...

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

drm schreef op 04 March 2003 @ 15:06:
.oisyn
[...]
Daar kun je toch gewoon
code:
1
};
van maken :? Of is het nou echt te lang geleden :o


dat is een verschil tussen C en C++ :)

als je in C een struct definieert, dan maakt ie er nog geen type van:
C:
1
2
3
4
struct S { };

S aars; /* error */
struct S aars;  /* ok */


met typedef kun je er een type van maken:
C:
1
2
3
4
5
struct S { };
typedef struct S S;

/* of in het kort: */
typedef struct S { } S;

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.


  • elgringo
  • Registratie: Januari 2001
  • Laatst online: 20-08 14:20
Verwijderd schreef op 04 March 2003 @ 15:21:

Enige argument voor cross reference is als je datatype A heb met een verwijzing naar datatype B en tegelijkertijd andersom, volgens mij. Dat is op te lossen zoals .oisyn aangaf. In jouw geval lijkt het er meer op dat je wat declaraties uit je msdos_rd.h naar je msdos_fs.h moet verschuiven...
__packed__ is het probleem niet.

maar is declaraties van msdos_rd (en _wr en _cm) naar msdos_fs verplaatsen, hoe en wat?

if broken it is, fix it you should


Verwijderd

elgringo schreef op 04 March 2003 @ 15:29:
__packed__ is het probleem niet.
Nee, dat weet ik, dat was offtopic, maar de kans is -afhankelijk van je compiler en je compileeropties- behoorlijk groot dat dit je eerstvolgende probleem wordt...
maar is declaraties van msdos_rd (en _wr en _cm) naar msdos_fs verplaatsen, hoe en wat?
Datgene wat je nodig hebt in de msdos_fs zetten... Hoe? Via de "C&P methodiek" :X

(cut and paste dus, FYI)

  • elgringo
  • Registratie: Januari 2001
  • Laatst online: 20-08 14:20
Verwijderd schreef op 04 maart 2003 @ 15:39:
[...]

Nee, dat weet ik, dat was offtopic, maar de kans is -afhankelijk van je compiler en je compileeropties- behoorlijk groot dat dit je eerstvolgende probleem wordt...


[...]

Datgene wat je nodig hebt in de msdos_fs zetten... Hoe? Via de "C&P methodiek" :X

(cut and paste dus, FYI)
Dat wil ik dus niet, ik wil net zoals ik dit ooit met C++ gedaan heb:

class xxx

Als je een cross-reference met een class hebt, maar met een typedef struct wil het niet....

if broken it is, fix it you should


Verwijderd

elgringo schreef op 04 March 2003 @ 15:41:
[...]


Dat wil ik dus niet, ik wil net zoals ik dit ooit met C++ gedaan heb:

class xxx

Als je een cross-reference met een class hebt, maar met een typedef struct wil het niet....
struct xxx
:?

  • elgringo
  • Registratie: Januari 2001
  • Laatst online: 20-08 14:20
dat werkt dus niet :(

if broken it is, fix it you should


Verwijderd

struct xxx werkt wel in C++, dus je gebruikt C, geen C++. Volgens mij is C&P naar msdos_fs.h de beste mogelijkheid in C...

  • elgringo
  • Registratie: Januari 2001
  • Laatst online: 20-08 14:20
Verwijderd schreef op 04 March 2003 @ 15:54:
[...]

struct xxx werkt wel in C++, dus je gebruikt C, geen C++. Volgens mij is C&P naar msdos_fs.h de beste mogelijkheid in C...
C&P?

if broken it is, fix it you should


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

Het werkt wel, zoals ik al eerder uitgelegd heb. Punt is dat je in C geen nieuw type krijgt zonder typedef. Dit werkt prima in C:

C:
1
2
3
typedef struct _xxx xxx;

xxx * bla;


ook als _xxx nog niet gedefinieerd is

[ Voor 11% gewijzigd door .oisyn op 04-03-2003 15:58 ]

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.


  • GambitRS
  • Registratie: Juni 2001
  • Laatst online: 13-06-2013

GambitRS

w00t

MechWarrior || Monsters Game


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
De nette C methode is
code:
1
2
3
4
5
6
#ifndef _MSDOSRD_H 
#define _MSDOSRD_H 
...
struct _DIRECTORY_ENTRY;
struct _DIRECTORY_ENTRY* MSDOS_NextDirEntry(void); 
...

afgezien dan dat _D een prefix is die gereserveerd is voor de compiler. Stop de _ aan de achterkant; er zijn geen gereserveerde suffixen.

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


  • nhimf
  • Registratie: September 2000
  • Laatst online: 19-08 10:00

nhimf

Lekker belangrijk allemaal

het probleem is volgens mij dat de bestanden elkaar includen.
Dat gaat zeker fout.
voorbeeld:
a include b
b include a

a wordt dan ingelezen. "hee ik moet b includen"
en bij b: "hee ik moet a includen"

tot in de oneindigheid. Daardoor geeft hij een fout, want de compiler snapt dat dit niet goed gaat.

Wat je kan proberen is de include onder de #define te zetten. Want dan breek je de ketting.
Als a al is ingelezen, dan gaat hij niet nog een keer proberen b in te lezen.

Ik stink niet, ik ruik gewoon anders


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

nhimf: lees de draad voor je blaat :(

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.


  • nhimf
  • Registratie: September 2000
  • Laatst online: 19-08 10:00

nhimf

Lekker belangrijk allemaal

Erhm, ik had ooit een soortgelijk iets, en dat was op deze manier opgelost. Hij gaf nl ook een opmerking dat iets al was gedefinieerd. Dus jah ik blaat nadat ik de draad had gelezen.
Ik wil alleen een eventuele oplossing bieden die bij mij iig geholpen heeft. Maar als dat niet op prijs wordt gesteld dan wil ik graag mijn posting leeghalen of laten deleten.

edit:

ok ik had over het kleine stukje code heen gelezen waar de #includes stond
Maar dan kan je iig wel ff op een andere toon zeggen dat ik ergens overheen had gelezen

[ Voor 21% gewijzigd door nhimf op 04-03-2003 17:22 ]

Ik stink niet, ik ruik gewoon anders


  • elgringo
  • Registratie: Januari 2001
  • Laatst online: 20-08 14:20
Ik heb nu de nodige info in een aparte header gezet en deze door de files die hem gebruiken laten includen (msdos_cm, msdos_wr en msdos_rd ). Het compilen werkt, maar met het lkinken krijg ik de fout dat alles wat in de aparte header staat al eens gedefinieerd is (msdos_cm en msdos_rd zijn de oorzaak). Hoe verhelp ik dit?

if broken it is, fix it you should


  • KnoppenSpook
  • Registratie: Augustus 2000
  • Laatst online: 04-09-2023
je hebt er nog wel steeds #ifndef _BLAAT_H_ #define _BLAAT_H_ etc omheen staan?

/me weet geen leuke quote voor in zijn signature


  • elgringo
  • Registratie: Januari 2001
  • Laatst online: 20-08 14:20
KnoppenSpook schreef op 05 March 2003 @ 09:58:
je hebt er nog wel steeds #ifndef _BLAAT_H_ #define _BLAAT_H_ etc omheen staan?
ja

(#ifndef _common_h)

eroros zijn (overigens):
code:
1
Error: Global ubNumberOfPartitions multiply defined (in msdos_cm.o and msdos_rd.o).


(dit is fouten van globale variabelen en defines)

if broken it is, fix it you should


  • KnoppenSpook
  • Registratie: Augustus 2000
  • Laatst online: 04-09-2023
Dan defineer je al in je h file in plaats van alleen declareren.
Je zou kunnen werken met 'extern'...

/me weet geen leuke quote voor in zijn signature


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

aha, het zijn dus link errors, geen compile errors
dan is het idd dat extern probleem :)

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.


Verwijderd

Ik had een zelfde probleem met structs en al, en heb het opgelost met een apparte data.h.
(wat er dus nu uiteindelijk ook is en met typedef). Toen liep het nog niet door idd die stomme multiple declaration. Dit had ik opgelost door de data.h EERDER te includen dan de andere headers.
hopelijk is het daarmee op gelost.
Op verzoek wil ik wel wat code posten maar ik denk (ja ja ik denk ja :D ) dat mijn uitleg zo wel voldoende is. Anders laat het maar weten.
Suc6!
Pagina: 1