Toon posts:

[C] Meerdere 'units'

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hoe kun je in de c taal zoiets maken zoals in delphi gaat met uses. Het is de bedoeling dat ik een main.c heb en daaruit van allerlei functies kan aanroepen uit een andere naam.c . Daarbij geldt ook dat ik in de main en in de naam.c ook nog dezelfde imports moet gebreuken. Namelijk reg535.h . Hoe moet ik dit precies doen?

Nog een voorbeeld ter verduidelijking.
code:
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.C

#include <reg535.h>
#include <sturing.c>
.....
.....
.....
void main(void)
{
  int dir=0;
  int stuurcor=0;
  initialize_serial_interface ();
  initialise_timer_2 ();
  external_interrupt_0_init ();
  calib_stuur(&stuurcor, 1650);

  while(1)
  {
    stuur(1650, stuurcor); //procedure uit sturing.c
    rijden(0,dir);      //procedure uit sturing.c
  }
}


//STURING.C
#include <reg535.h>

void stuur (int stand, correctie)
{
  CC3 = 0xFFFF - (stand+correctie);
}

void rijden (int speed,richting)
{
  MotorRichting = richting;
  CC2 = 0xFFFF - (speed);
}

PS: Ik weet dat het een oneindige lus is. Hij gaat om een aansturing van een tripod. Dit hoort zo. Fouten wat ik nu dus krijg zijn REDIFINITION doordat ik reg535.h 2* import en de functies zijn niet public. Dit heeft iets te maken met extern wat ik begrepen heb, maar ik weet niet precies hoe dit nou in z'n werk gaat. :?

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 09-09 11:02
Header files zijn in principe uitsluitend voor de definities van prototypes! Toch gaat er wel eens wat mis wanneer types worden gedefinieerd in header files die meerdere keren gebruikt worden. Daarom is het common practice geworden om met behulp van precompiler directives ervoor te zorgen dat elke header file maar één keer wordt geinclude:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// MijnHeaderFile.h

#ifndef __MIJNHEADERFILE_H
#define __MIJNHEADERFILE_H

// Datatypes

typedef struct x { int a, b, c} x;

// Functie prototypes

void MijnFunctie1(x a);
int MijnFunctie2();
void MijnFunctie3(int a, int b);

#endif

Dat is inderdaad vrij ranzig, maar het werkt wel en wordt eigenlijk overal toegepast bij gebrek aan een betere methode.

Verwijderd

Topicstarter
Sorry ik had een foutje in de code.

Import moest zijn include.

Ik hoop dat dit eigenlijk wat uitmaakt, want het antwoord snap ik niet echt. :?

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Op woensdag 24 april 2002 22:48 schreef DvRipperD het volgende:
Sorry ik had een foutje in de code.

Import moest zijn include.

Ik hoop dat dit eigenlijk wat uitmaakt, want het antwoord snap ik niet echt. :?
Dan zal ik nog een poging wagen.

Owkay elke class heeft meestal een .h file waarin elke functie en variabele van de klasse gedeclareerd staat. Deze include je dus om gebruik te kunnen maken van die klasse.

Je moet dan ook in je main NIET sturing.c includen maar sturing.h !!

Om er nou voor te zorgen dat .h file niet 20x geïncluded wordt door 20 verschillende classes komt er een if statement omheen ( dat #ifndef ) dat is voor de precompiler (dacht ik) een teken dat hij moet kijken of er al iets met die naam gedefinieerd is. Is dit zo, dan include hij niets.

De code van Soultaker is dan ook code van een .h (header) file

Verwijderd

Topicstarter
Dus het moet zo iets worden als ik het goed begrijp:
code:
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
//MAIN.C
#include <reg535.h>

.....

void main(void)
{
......

  while(1)
  {
    stuur(1650, stuurcor); //procedure uit sturing.h
    rijden(0,dir);      //procedure uit sturing.h
  }
}
#endif

//STURING.H
#ifndef <reg535.h>
#include <reg535.h>

void stuur (int stand, correctie)
{
  CC3 = 0xFFFF - (stand+correctie);
}

void rijden (int speed,richting)
{
  MotorRichting = richting;
  CC2 = 0xFFFF - (speed);
}

#endif

Klopt dit een beetje?

  • PrinsEdje80
  • Registratie: Oktober 2001
  • Laatst online: 01-01 15:26

PrinsEdje80

Holographic, not grated...

Bijna, voor zover ik het lees met betrekking tot de header files...

Als ik het goed begrijp heb je STURING.H nodig in je main (althans, daarin staan je functies gedeCLAREERD) en ook nog reg535.h. Maar deze gebruik je ook in STURING.H.

Dit doe je als volgt:

main.c
code:
1
#include <reg535.h>

sturing.h
code:
1
2
3
4
#ifndef _INCLUDED_REG535_H
#include <reg535.h>
#define _INCLUDED_REG535_H
#endif

Dit zijn de koppen van de code.
Eventueel kun je de zgn include-guards ook in de main.c zetten, voor het geval dat je een andere header-file include die reg535.h ook gebruikt, maar deze eerder deFINIEERT. (Groot verschil tussen declareren en definieren!!!!!!!)

Maar dit gaat alsnog fout: nl elke keer dat je sturing.h includeert definieer je opnieuw en opnieuw de functies stuur en rijden. Voor compileren alleen: geen probleem, op het moment van linken: probleem, want elke keer weer is er een definitie van stuur en rijden, maw de linker wordt gek :? (<-in het kwadraat)

De bedoeling is het volgende:

sturing.h
code:
1
2
3
4
5
6
7
#ifndef _INCLUDED_REG535_H
#include <reg535.h>
#define _INCLUDED_REG535_H
#endif

void stuur (int stand, correctie);
void rijden (int speed,richting);

stuur.c
code:
1
2
3
4
5
#include "sturing.h"
void stuur (int stand, correctie)
{
  CC3 = 0xFFFF - (stand+correctie);
}

zelfde voor rijden.

Nu alleen stuur.c compileren. NIET linken (onder linux: gcc -c stuur.c)
Vervolgens kun je nu je main.c gewoon zo laten zoals boven, met evt. include-guards. Zo zou het moeten zijn.

[edit]
Vergeet ik dus nog te zeggen dat je main.c moet compileren en linken met de objecten die nodig zijn. In dit geval (onder linux):
code:
1
2
gcc -Wall main.c -o main stuur.o rijden.o
     ^1^    ^2^  ^3^ ^4^   ^5^  ^5^

^1^: geef alle foutmeldingen
^2^: naam bestand met main
^3^: andere output naam dan a.out
^4^: dit is dan die andere naam
^5^: de mee te linken objecten

Used to be Down Under... Foto gallery


Verwijderd

Topicstarter
Ok. Zover snap ik het wel, maar moet ik dan wel niet in main ook:
code:
1
#include <sturing.h>

toevoegen?

Anders weet de main toch niet waar deze functies staan?

Of zie ik dit verkeerd?

  • PrinsEdje80
  • Registratie: Oktober 2001
  • Laatst online: 01-01 15:26

PrinsEdje80

Holographic, not grated...

Oeps, sorry... forgot that. Thnx :*

Used to be Down Under... Foto gallery


Verwijderd

Topicstarter
Maakt niks. ;)

Bedankt voor je hulp. Ik ga het morgen meteen uit proberen op school. Thxs voor de hulp. *D

  • PrinsEdje80
  • Registratie: Oktober 2001
  • Laatst online: 01-01 15:26

PrinsEdje80

Holographic, not grated...

You're always welcome... Maar nu begin ik te twijfelen: heb ik je geholpen met huiswerk?!? :P

[edit]
Nu vergeet ik idd nog een opmerking van Soultaker mbt de include-guards IN de sturing.h header-file. Dit moet je ook doen (hoeft niet voor kleine projectjes, maar wel voor gigantische projecten, dus leer je nu maar aan...)

Forgot the above...

Used to be Down Under... Foto gallery


Verwijderd

Topicstarter
Neuh niet echt. We moeten een driewielertje laten rijden en ik wou de main opsplitsen.

Maar onze docent is nogal "slim" en kon het ons gewoonweg dus niet uitleggen. Erg handig moet ik zeggen.

Hij zou het wel over een week of 4 ofzo uitleggen en ik had geen zin om daar op te wachten. Dit werkt veel overzichtelijker vandaar deze vraag. ;)

BTW: Nou breng je me wel op leuke ideën. :P

Verwijderd

Topicstarter
Je bedoelt dit?

sturing.h
code:
1
2
3
4
5
6
7
8
9
10
#ifndef _INCLUDED_REG535_H
#include <reg535.h>
#define _INCLUDED_REG535_H

//functies

void stuur (int stand, correctie);
void rijden (int speed,richting);

#endif

  • Dash2in1
  • Registratie: November 2001
  • Laatst online: 31-08 22:49
dat zal hij denk ik bedoelen .. of in reg535.h eenzelfde constructie (wat ik persoonlijk netter zou vinden).

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 09-09 11:02
code:
1
2
3
#ifndef _INCLUDED_REG535_H
#include <reg535.h>
#define _INCLUDED_REG535_H

Dat lijkt me niet echt de juiste manier. Op die manier kan je nog steeds meerdere keren dezelfde header file includen. Ik heb deze constructie dan ook nog nooit in een echt project gezien. Gebruik dus liever de defines alleen in de headerfile. Dat doet precies wat je wilt en voorkomt dat je je sourcefiles hoeft te wijzigen (elke sourcefile die de header nodig heeft include 'm).

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Nee dit is inderdaad niet de goede manier. Wat is wel de goede manier:
code:
1
2
3
4
5
6
#ifndef __NAMESPACENAAM_STURING_H
#define __NAMESPACENAAM_STURING_H

//sturing.h file

#endif

  • PrinsEdje80
  • Registratie: Oktober 2001
  • Laatst online: 01-01 15:26

PrinsEdje80

Holographic, not grated...

Op donderdag 25 april 2002 08:25 schreef Glimi het volgende:
Nee dit is inderdaad niet de goede manier. Wat is wel de goede manier:
code:
1
2
3
4
5
6
#ifndef __NAMESPACENAAM_STURING_H
#define __NAMESPACENAAM_STURING_H

//sturing.h file

#endif
Niet helemaal mee eens. Ik stel dit voor:
code:
1
2
3
4
5
6
#ifndef _INCLUDED_STURING_H
#define _INCLUDED_STURING_H

//sturing.h file

#endif

Dat heeft meer te maken hoe je jezelf aanleert om de naamgeving van include-guards te maken. De manier die ik gebruik is de conventie (is geen geintje hoor!!). Dit heb ik geleerd van (wat mij verteld is) de C/C++ goeroe van het Noorden Frank B. Brokken.

Used to be Down Under... Foto gallery


  • PrinsEdje80
  • Registratie: Oktober 2001
  • Laatst online: 01-01 15:26

PrinsEdje80

Holographic, not grated...

Op donderdag 25 april 2002 02:10 schreef Soultaker het volgende:
code:
1
2
3
#ifndef _INCLUDED_REG535_H
#include <reg535.h>
#define _INCLUDED_REG535_H

Dat lijkt me niet echt de juiste manier. Op die manier kan je nog steeds meerdere keren dezelfde header file includen. Ik heb deze constructie dan ook nog nooit in een echt project gezien. Gebruik dus liever de defines alleen in de headerfile. Dat doet precies wat je wilt en voorkomt dat je je sourcefiles hoeft te wijzigen (elke sourcefile die de header nodig heeft include 'm).
Echt wel, lees maar na: stel je heb reg535.h al eerder geincludeerd, dan is _INCLUDED_REG535_H gedefinieerd en dan is de 1e regel niet waar, dus wordt het niet uitgevoerd. Op het moment dat hij niet eerder is geincludeerd is de eerste regel waar en wordt de volgende regel wel uitgevoerd, inclusief definitie van _INCLUDED_REG535_H

Just basic programming language ;)

Used to be Down Under... Foto gallery


  • Dash2in1
  • Registratie: November 2001
  • Laatst online: 31-08 22:49
Op donderdag 25 april 2002 10:27 schreef PrinsEdje80 het volgende:
Echt wel, lees maar na: stel je heb reg535.h al eerder geincludeerd, dan is _INCLUDED_REG535_H gedefinieerd en dan is de 1e regel niet waar, dus wordt het niet uitgevoerd. Op het moment dat hij niet eerder is geincludeerd is de eerste regel waar en wordt de volgende regel wel uitgevoerd, inclusief definitie van _INCLUDED_REG535_H

Just basic programming language ;)
Hmm, dan moet je dat wel overal neerzetten waar je dat bestand include, lijkt me nogal irri. Doe dan in reg535.h zelf:
code:
1
2
3
4
5
6
#ifndef _INCLUDED_REG535_H
#define _INCLUDED_REG535_H
..
hier de eigenlijke header code
..
#endif

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Op donderdag 25 april 2002 10:24 schreef PrinsEdje80 het volgende:
Niet helemaal mee eens. Ik stel dit voor:
code:
1
2
3
4
5
6
#ifndef _INCLUDED_STURING_H
#define _INCLUDED_STURING_H

//sturing.h file

#endif

Dat heeft meer te maken hoe je jezelf aanleert om de naamgeving van include-guards te maken. De manier die ik gebruik is de conventie (is geen geintje hoor!!). Dit heb ik geleerd van (wat mij verteld is) de C/C++ goeroe van het Noorden Frank B. Brokken.
Mwoah, ik laat borland dit meestal uitzoeken ;) Het ging er iig om dat je de ifndef om de header file heen zet en niet om de #include directive

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 09-09 11:02
Op donderdag 25 april 2002 10:27 schreef PrinsEdje80 het volgende:
Echt wel, lees maar na: stel je heb reg535.h al eerder geincludeerd, dan is _INCLUDED_REG535_H gedefinieerd en dan is de 1e regel niet waar, dus wordt het niet uitgevoerd. Op het moment dat hij niet eerder is geincludeerd is de eerste regel waar en wordt de volgende regel wel uitgevoerd, inclusief definitie van _INCLUDED_REG535_H
Nee hoor. Stel ik include abc.h in reg535.h, en abc.h include zelf ook reg535.h (zonder dat 'ie 'm verder nodig heeft). Omdat je pas NA de verwerking je define uitvoert, zal je in een eindeloze cyclus verwikkelt raken. Dit kan op de 'normale' manier niet gebeuren.

  • PrinsEdje80
  • Registratie: Oktober 2001
  • Laatst online: 01-01 15:26

PrinsEdje80

Holographic, not grated...

Dat is dus een reden om on elke include die je doet ook een include-guard te zetten...

Used to be Down Under... Foto gallery


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 09-09 11:02
Op donderdag 25 april 2002 13:03 schreef PrinsEdje80 het volgende:
Dat is dus een reden om on elke include die je doet ook een include-guard te zetten...
En dat is dus al voldoende. Ook in de source files 'guards' neerzetten levert je niets meer op.

  • PrinsEdje80
  • Registratie: Oktober 2001
  • Laatst online: 01-01 15:26

PrinsEdje80

Holographic, not grated...

Daar heb je een puntje, maar je moet rekening houden met de 'onvoorzichtige' programmeurs, die ooit jouw source-codes zullen gebruiken :P

Used to be Down Under... Foto gallery

Pagina: 1