[C] modulen probleem

Pagina: 1
Acties:

  • Krooswijk.com
  • Registratie: Mei 2000
  • Laatst online: 17-08-2024
Hallo, we zitten met het volgende probleem:
We hebben een driver geschreven, bestaande uit een achttal modules. Vanuit de mainfunctie die in de class main.c staat gaat het hele zaakje draaien. In deze main.c worden een aantal andere .c files ge-include. De modulatie die we hebben toegepast heeft eigenlijk alleen nut in verband met overzichtelijkheid. De acht files zijn zo ge-include dat alles netjes wordt aangeroepen voordat eventueel een andere module deze (een van de functies) aanroept. We krijgen echter constant meldingen als: "redefinition of ...". Het zit toch als volgt in een c-file: als je bv include <General.c> doet, dan wordt toch alleen die file letterlijk in de aanroepende module (karakter voor karakter) overgenomen? Dus in principe is main.c dan gewoon toch één grote file? Of zie ik het nu fout? Herkent iemand het probleem?

  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
Waarom include je direct de source files i.p.v. gebruik te maken van headerfiles zoals het hoort ?

  • Primal
  • Registratie: Augustus 2001
  • Laatst online: 07-09 07:32
Het includen van dezelfde header-files in meerdere source-files lijdt inderdaad tot problemen. Je kunt deze problemen op de volgende manier voorkomen:

1) Check in iedere header-file of een constante bestaat met de naam van bijv. de header-file
2) Definieer in iedere header-file een constante (bijv. met de naam van de header-file, als die constante niet bestaat.



Dus zo:
code:
1
2
3
4
5
6
#ifndef __GENERAL_H__
#define __GENERAL_H__

 // Hier tussen al je functie definities, constante declaraties, variabelen, includen header-files etc. etc.

#endif

This will help.


.edit

Euhm. Ik had je post niet goed gelezen en weet dus niet of mijn oplossing je gaat helpen. Maar zoals hierboven ook al gevraagd: "Waarom include je .C files?". Waarom stop je niet de functie definities in aparte header-files en dan include je die?

"The fastest code, is the code that is never called."


  • Krooswijk.com
  • Registratie: Mei 2000
  • Laatst online: 17-08-2024
Op vrijdag 24 mei 2002 22:14 schreef Primal het volgende:
...Maar zoals hierboven ook al gevraagd: "Waarom include je .C files?". Waarom stop je niet de functie definities in aparte header-files en dan include je die?
Dit hebben we inderdaad ook gedaan, van elke module een .h file gemaakt en deze in de goede volgorde geinclude, dit leverde hetzelfde soort probleem op. Kan het een probleem zijn dat we ook 1 .h file hebben met globale variabelen, die door elke module (een van zijn functies) aan dient te worden geroepen?

  • JayTaph
  • Registratie: Oktober 1999
  • Laatst online: 28-11-2025

JayTaph

Portability is for canoes.

Op zaterdag 25 mei 2002 11:30 schreef Da Snake het volgende:

[..]

Dit hebben we inderdaad ook gedaan, van elke module een .h file gemaakt en deze in de goede volgorde geinclude, dit leverde hetzelfde soort probleem op. Kan het een probleem zijn dat we ook 1 .h file hebben met globale variabelen, die door elke module (een van zijn functies) aan dient te worden geroepen?
Ja, wel als je het op deze manier doet:

globals.h:
code:
1
2
3
4
5
6
7
8
9
10
11
#ifndef __GLOBALS_H__
#define __GLOBALS_H__

#define EEN_NUMMERTJE = 1234

char testdata[] = "blaataap";

int print_string (char *string);
int print_eenint (int i);

#endif // __GLOBALS_H__

Het probleem ontstaat tijdens het linken, je hebt namelijk een aantal verschillende object-files, die allemaal de gezamelijke data "testdata[]" bevatten (omdat je die per c-file gedeclareerd hebt).

Als je het goed wilt doen, doe je dit:

globals.h
code:
1
2
3
4
5
6
7
8
9
10
11
#ifndef __GLOBALS_H__
#define __GLOBALS_H__

#define EEN_NUMMERTJE = 1234

extern char testdata[];

int print_string (char *string);
int print_eenint (int i);

#endif // __GLOBALS_H__

globals.c
code:
1
2
3
#include "globals.h"

char testdata[] = "blaataap";

In de header file geef je als het ware het prototype op van testdata (met extern), en pas in je global.c declareer je hem. Hierdoor ziet de linker in totaal maar 1 testdata[], en dan gaat het goed.

Yo dawg, I heard you like posts so I posted below your post so you can post again.


  • Primal
  • Registratie: Augustus 2001
  • Laatst online: 07-09 07:32
Op zaterdag 25 mei 2002 11:56 schreef JayTaph het volgende:

[..]

Ja, wel als je het op deze manier doet: ....
Inderdaad precies dezelfde manier zoals ik ook vermeld heb in mijn post. Overigens is dit ook de enige manier waarop je dit soort problemen kunt voorkomen. Nou da's dan 2 mensen die je een goede, bruikbare tip geleverd hebben. :)

"The fastest code, is the code that is never called."


  • JayTaph
  • Registratie: Oktober 1999
  • Laatst online: 28-11-2025

JayTaph

Portability is for canoes.

Op zaterdag 25 mei 2002 16:04 schreef Primal het volgende:

[..]

Inderdaad precies dezelfde manier zoals ik ook vermeld heb in mijn post. Overigens is dit ook de enige manier waarop je dit soort problemen kunt voorkomen. Nou da's dan 2 mensen die je een goede, bruikbare tip geleverd hebben. :)
Euh, heb ik je nou wel of juist niet geholpen? :? :+

Yo dawg, I heard you like posts so I posted below your post so you can post again.


  • Primal
  • Registratie: Augustus 2001
  • Laatst online: 07-09 07:32
Op zaterdag 25 mei 2002 20:24 schreef JayTaph het volgende:

[..]

Euh, heb ik je nou wel of juist niet geholpen? :? :+
Euhm.... volgens mij zie je het verkeerd. Ik ben niet de topicstarter :D

"The fastest code, is the code that is never called."


  • JayTaph
  • Registratie: Oktober 1999
  • Laatst online: 28-11-2025

JayTaph

Portability is for canoes.

Op zaterdag 25 mei 2002 21:34 schreef Primal het volgende:

[..]

Euhm.... volgens mij zie je het verkeerd. Ik ben niet de topicstarter :D
Aaaaarggghhh.. welke 2 mensen heb ik dan wel geholpen.. (djee snapt er geen zak meer van :+ :+)

Yo dawg, I heard you like posts so I posted below your post so you can post again.


  • Primal
  • Registratie: Augustus 2001
  • Laatst online: 07-09 07:32
Op zondag 26 mei 2002 02:48 schreef JayTaph het volgende:

[..]

Aaaaarggghhh.. welke 2 mensen heb ik dan wel geholpen.. (djee snapt er geen zak meer van :+ :+)
Hehe, wij hebben 'Da Snake' geholpen :)

"The fastest code, is the code that is never called."


  • Krooswijk.com
  • Registratie: Mei 2000
  • Laatst online: 17-08-2024
beetje late reply, maar ik heb een main file waarin ik alles include.
code:
1
2
3
4
                1*
                /|\
              2* * *4
                 3

dus in 1 wordt geinclude:
2 (alle variabelen declaratie) .h
3 headers een c source file .h
4 headers een c source file .h

1 start een proces uit 3 op. 3 gebruikt misschien weer een functie uit 4. en 3 en 4 bewerken allebei data die gedeclareerd is in 2. dit is zo'n beetje grofweg de opzet.
in 2 staan voornamelijk arrays die globaal dienen te zijn.

ik ga iig aan de slag met bovenstaande oplossingen.

  • dawuss
  • Registratie: Maart 2001
  • Laatst online: 01-02 20:46

dawuss

gadgeteer

het zou inderdaad opgelost moeten zijn met #ifndef statements

micheljansen.org
Fulltime Verslaafde Commandline Fetisjist ©

Pagina: 1