if broken it is, fix it you should
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.
Laat eens wat code zien
Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz
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):
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.
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
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:
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
Ik zie niet in waarom deze header die msdos_*.h headers nodig heeftelgringo 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;
[ Voor 7% gewijzigd door Verwijderd op 04-03-2003 15:07 ]
Daar heb je gelijk in, ik zat aan een declaration teveel te denken
r. 13:
Daar kun je toch gewoon} DIRECTORY_ENTRY;
1
| }; |
Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz
staan onderin methoden die referen naar de msdos_rd.hVerwijderd schreef op 04 March 2003 @ 15:05:
[...]
Ik zie niet in waarom deze header die msdos_*.h headers nodig heeftEn 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.
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
Ik gebruik een typedef (moet volgens coding standards)drm schreef op 04 March 2003 @ 15:06:
.oisyn
Daar heb je gelijk in, ik zat aan een declaration teveel te denken
r. 13:
[...]
Daar kun je toch gewoon
code:van maken
1 };Of is het nou echt te lang geleden
if broken it is, fix it you should
Verwijderd
__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...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)
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...
drm schreef op 04 March 2003 @ 15:06:
.oisyn
[...]
Daar kun je toch gewoon
code:van maken
1 };Of is het nou echt te lang geleden
dat is een verschil tussen C en C++
als je in C een struct definieert, dan maakt ie er nog geen type van:
1
2
3
4
| struct S { }; S aars; /* error */ struct S aars; /* ok */ |
met typedef kun je er een type van maken:
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.
__packed__ is het probleem niet.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...
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
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...elgringo schreef op 04 March 2003 @ 15:29:
__packed__ is het probleem niet.
Datgene wat je nodig hebt in de msdos_fs zetten... Hoe? Via de "C&P methodiek"maar is declaraties van msdos_rd (en _wr en _cm) naar msdos_fs verplaatsen, hoe en wat?
(cut and paste dus, FYI)
Dat wil ik dus niet, ik wil net zoals ik dit ooit met C++ gedaan heb: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"
(cut and paste dus, FYI)
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
struct xxxelgringo 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....
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...
C&P?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...
if broken it is, fix it you should
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.
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
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
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.
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.
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
if broken it is, fix it you should
/me weet geen leuke quote voor in zijn signature
jaKnoppenSpook schreef op 05 March 2003 @ 09:58:
je hebt er nog wel steeds #ifndef _BLAAT_H_ #define _BLAAT_H_ etc omheen staan?
(#ifndef _common_h)
eroros zijn (overigens):
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
Je zou kunnen werken met 'extern'...
/me weet geen leuke quote voor in zijn signature
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
(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
Suc6!