/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
prototyper, funktioner, variabler og heade~
Fra : Heine Laursen


Dato : 17-03-05 18:48

Hejsa.

Jeg har efterhånden fået lavet (efter min mening) en stor c fil, Og det
hele begynder at blive uoverskuligt. Jeg vil derfor gerne dele denne c fil
op i 2 mindre filer. Men når jeg nu har delt den op, kan jeg ikke få
fileren compilet.
Sådan som jeg har forstået (prøvet at læse mig til ) det, så skulde
jeg kunde fra main() kalde en en funktion ved:

int main ()
[
   minfunktion();
}
Men for at det kan lade sig gøre, er jeg nød til at erklære en
prototype for minfinktion:

void minfunktion();
main
{
   minfinktion()
}

Er det rigtigt forstået?
For at gøre det hele være, så har jeg også en lang række variabler
der skal med over i funktionen. Og her er jeg fuldstændig på vildspor.
jeg har en main.c med følgende:
int main()
{ // Variabler
SDL_Surface *screen, *image, *back;
int i=0;
SDL_Rect Sprite, Bground, rect ;
int matrix[200];
int WhereAreWe;

.......
loop();
}

Alle overstående variabler skal med over i funktionen loop()
Jeg har derfor lavet en header.h der skal indeholde prodotypen:
#include <stdlib.h>
#include "SDL.h"

void loop(SDL_Surface *screen, SDL_Surface *image, SDL_Surface *back, int
i, SDL_Rect Sprite, SDL_Rect Bground, SDL_Rect rect, int matrix, int
WhereAreWe); // dette er en lang linje

header.h inkludere jeg så i main.c og loop.c
main.c kommer så til at se sådan her ud:

include "header.h"
int main()
{
   ....
   ....
   loop(screen, image, back, i, Sprite, Bground, rect, matrix, WhereAreWe);
   ....
}
og loop.c:

#include "header.h"

extern SDL_Surface *screen, *image, *back;
extern int i
extern SDL_Rect Sprite, Bground, rect ; //Linie 5
extern int matrix[200];
extern int WhereAreWe;

void loop( *screen, *image, *back, i, Sprite, Bground, rect, matrix,
WhereAreWe) // en lang linje, Linje 9
{ // Linje 10
   ....
   ....
   ....
}

Men det virker ikke. Jeg får følgende compiler fejl:

make
gcc -O2 -ggdb -I/usr/include/SDL -D_REENTRANT -c main.c
main.c: In function `main':
main.c:68: warning: passing arg 8 of `loop' makes integer from pointer
without a cast
gcc -O2 -ggdb -I/usr/include/SDL -D_REENTRANT -c loop.c
loop.c:5: error: syntax error before "extern"
loop.c:10: error: parse error before '*' token
loop.c: In function `loop':
loop.c:11: error: number of arguments doesn't match prototype
header.h:4: error: prototype declaration
loop.c:127: error: `i' undeclared (first use in this function)
loop.c:127: error: (Each undeclared identifier is reported only once
loop.c:127: error: for each function it appears in.)
loop.c:163: error:`z' undeclared (first use in this function)
make: ***[loop.o] Error 1

Hvad gør jeg forkert?

--
Mvh
Heine Laursen

 
 
Bertel Brander (17-03-2005)
Kommentar
Fra : Bertel Brander


Dato : 17-03-05 20:16

Heine Laursen wrote:
> Hejsa.
>
> Jeg har efterhånden fået lavet (efter min mening) en stor c fil, Og det
> hele begynder at blive uoverskuligt. Jeg vil derfor gerne dele denne c fil
> op i 2 mindre filer. Men når jeg nu har delt den op, kan jeg ikke få
> fileren compilet.
> Sådan som jeg har forstået (prøvet at læse mig til ) det, så skulde
> jeg kunde fra main() kalde en en funktion ved:
>
> int main ()
> [
>    minfunktion();
> }
> Men for at det kan lade sig gøre, er jeg nød til at erklære en
> prototype for minfinktion:
>
> void minfunktion();

Jeg ville putte prototypen i en headerfil. Så skal
du ikke ændre prototypen mere end et sted hvis den
bliver brugt af flere og den ændres.

> For at gøre det hele være, så har jeg også en lang række variabler
> der skal med over i funktionen. Og her er jeg fuldstændig på vildspor.
> jeg har en main.c med følgende:
> int main()
> { // Variabler
> SDL_Surface *screen, *image, *back;
> int i=0;
> SDL_Rect Sprite, Bground, rect ;
> int matrix[200];
> int WhereAreWe;
>
> .......
> loop();
> }
>
> Alle overstående variabler skal med over i funktionen loop()
> Jeg har derfor lavet en header.h der skal indeholde prodotypen:
> #include <stdlib.h>
> #include "SDL.h"
>
> void loop(SDL_Surface *screen, SDL_Surface *image, SDL_Surface *back, int
> i, SDL_Rect Sprite, SDL_Rect Bground, SDL_Rect rect, int matrix, int
> WhereAreWe); // dette er en lang linje
>
> header.h inkludere jeg så i main.c og loop.c
> main.c kommer så til at se sådan her ud:
>
> include "header.h"
> int main()
> {
>    ....
>    ....
>    loop(screen, image, back, i, Sprite, Bground, rect, matrix, WhereAreWe);
>    ....
> }
> og loop.c:
>
> #include "header.h"
>
> extern SDL_Surface *screen, *image, *back;
> extern int i

Der mangler en ; i slutningen af ovenstående linie.

> extern SDL_Rect Sprite, Bground, rect ; //Linie 5
> extern int matrix[200];
> extern int WhereAreWe;
>
> void loop( *screen, *image, *back, i, Sprite, Bground, rect, matrix,
> WhereAreWe) // en lang linje, Linje 9

Du mangler typerne her.

Hvis du giver argumenterne med i kaldet til funktionen
behøver du ikke lave dem extern.


--
Absolutely not the best homepage on the net:
http://home20.inet.tele.dk/midgaard
But it's mine - Bertel

Heine Laursen (17-03-2005)
Kommentar
Fra : Heine Laursen


Dato : 17-03-05 23:46

On Thu, 17 Mar 2005 20:15:38 +0100, Bertel Brander wrote:

> Heine Laursen wrote:
>> void loop( *screen, *image, *back, i, Sprite, Bground, rect, matrix,
>> WhereAreWe) // en lang linje, Linje 9
>
> Du mangler typerne her.

Jeg troede sådan set det var det, prototyperne var til.

> Hvis du giver argumenterne med i kaldet til funktionen behøver du ikke
> lave dem extern.

Jeg ved ikke hvad du mener med dette! Jeg har dog fået det hele til at
virke, uden at angive extern.

En anden ting der drillede, var arrayet matrix[[200]. Programmet gik
simpelhend ned, hvis den blev erkleret i main.c og ført med over i loop()
funktionen. Så dennes funktion var jeg nød til at kode ind i selve
loop.c, med den effekt at der var mindre varibler der skulde med! filerne
kom til at se sådan ud.

header.h:
#include <stdlib.h>
#include "SDL.h"
void loop(SDL_Surface *screen, SDL_Surface *image, SDL_Surface *back,
SDL_Rect Sprite, SDL_Rect Bground, SDL_Rect rect);

main.c:
#include "header.h"
int main()
{
   ....
   ....
   loop(screen, image, back, Sprite, Bground, rect);
}

loop.c:
#include "header.h"
void loop( SDL_Surface *screen, SDL_Surface *image, SDL_Surface *back,
SDL_Rect Sprite, SDL_Rect Bground, SDL_Rect rect)
{
   ....
   ....
}

Mange tak for hjælpen.

--
Mvh
Heine Laursen


Bertel Brander (18-03-2005)
Kommentar
Fra : Bertel Brander


Dato : 18-03-05 00:09

Heine Laursen wrote:
> On Thu, 17 Mar 2005 20:15:38 +0100, Bertel Brander wrote:
>
>
>>Heine Laursen wrote:
>>
>>>void loop( *screen, *image, *back, i, Sprite, Bground, rect, matrix,
>>>WhereAreWe) // en lang linje, Linje 9
>>
>>Du mangler typerne her.
>
>
> Jeg troede sådan set det var det, prototyperne var til.

En prototype er til for at brugerne af funktionen kan se hvordan
den ser ud, hvis brugeren ikke kan se selve funktionen.

>
>>Hvis du giver argumenterne med i kaldet til funktionen behøver du ikke
>>lave dem extern.
>
>
> Jeg ved ikke hvad du mener med dette! Jeg har dog fået det hele til at
> virke, uden at angive extern.

Det jeg mener er, at hvis du overfører en parameter gennem funktions
kaldet, behøver du ikke også have en extern på variablen.
Det er vist også det du har fundet ud af.

> En anden ting der drillede, var arrayet matrix[[200]. Programmet gik
> simpelhend ned, hvis den blev erkleret i main.c og ført med over i loop()
> funktionen.

Det tyder på at der er et problem i loop().
Bemærk at når man overfører et array gennem en funktions parameter,
overfører man kun en pointer, ikke selve array'et. Det betyder f.ex.
at funktionen ikke kan se størrelsen på arrayet.

--
Absolutely not the best homepage on the net:
http://home20.inet.tele.dk/midgaard
But it's mine - Bertel

Søg
Reklame
Statistik
Spørgsmål : 177459
Tips : 31962
Nyheder : 719565
Indlæg : 6408176
Brugere : 218881

Månedens bedste
Årets bedste
Sidste års bedste