Nieuws:

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: [Opgelost][C] Probleem met eerste header file  (gelezen 2186 keer)

Offline Joshua822

  • Lid
[Opgelost][C] Probleem met eerste header file
« Gepost op: 2009/10/30, 23:22:55 »
Hallo allemaal.

Ik heb een probleem. Ik heb vandaag voor de lol eens geprobeerd om mijn eigen header file voor C te schrijven. Het betreffen gewoon wat functies die in string.h teruggevonden kunnen worden. Hier is de broncode:

van het C programma dat deze header gebruikt :
#include <C:\Documents and Settings\\My Documents\TestC\mem_functions.h>
#include <stdio.h>

int main ()
{
   short i;
   char zin[6] = "Hallo";
   int getallen1[5] = { 5, 22, 3, 14, 6 }, getallen2[5];
   printf ( "%d", strlen ( zin ) );
   memmove ( getallen2, getallen1, 5 );
   for ( i = 0; i < 5; i++ )
     printf ( "%d \n", getallen2[i] );
   memsetw ( getallen2, 6, 5 );
   for ( i = 0; i < 5; i++ )
     printf ( "%d \n", getallen2[i] );
   getchar();
   return 0;
}
van de header :
#ifndef mem_functions.h

#define mem_functions.h

#endif

int i;

void memset ( char * mem_block, unsigned char val, int sizeofblock )
   for ( i = 0; i < sizeofblock; i++ )
     mem_block[i] = val;
void memsetw ( char * mem_block, unsigned short val, int sizeofblock )
   for ( i = 0; i < sizeofblock; i++ )
     mem_block[i] = val;
int * memmove ( int * dest, int * src, int sizeofblock )
   for ( i = sizeofblock; i > 0; i++ )
     dest[i] = src[i];
int * memcpy ( int * dest, int * src, int sizeofblock )
   for ( i = 0; i < sizeofblock; i++ )
     dest[i] = src[i];
int strlen ( char * string )
{
   for ( i = 0; string[i] != '\0'; i++ )
   return i;
}

Dit zijn alle foutmeldingen die ik krijg :
C:\Documents and Settings\\My Documents\TestC\mem_functions.h|1|warning: extra tokens at end of #ifndef directive|
C:\Documents and Settings\\My Documents\TestC\mem_functions.h|3|warning: ISO C requires whitespace after the macro name|
C:\Documents and Settings\\My Documents\TestC\mem_functions.h|10|error: expected initializer before "for"|
C:\Documents and Settings\\My Documents\TestC\mem_functions.h|10|error: expected constructor, destructor, or type conversion before '<' token|
C:\Documents and Settings\\My Documents\TestC\mem_functions.h|10|error: expected constructor, destructor, or type conversion before '++' token|
C:\Documents and Settings\\My Documents\TestC\mem_functions.h|13|error: expected initializer before "for"|
C:\Documents and Settings\\My Documents\TestC\mem_functions.h|13|error: expected constructor, destructor, or type conversion before '<' token|
C:\Documents and Settings\\My Documents\TestC\mem_functions.h|13|error: expected constructor, destructor, or type conversion before '++' token|
C:\Documents and Settings\\My Documents\TestC\mem_functions.h|16|error: expected initializer before "for"|
C:\Documents and Settings\\My Documents\TestC\mem_functions.h|16|error: expected constructor, destructor, or type conversion before '>' token|
C:\Documents and Settings\\My Documents\TestC\mem_functions.h|16|error: expected constructor, destructor, or type conversion before '++' token|
C:\Documents and Settings\\My Documents\TestC\mem_functions.h|19|error: expected initializer before "for"|
C:\Documents and Settings\\My Documents\TestC\mem_functions.h|19|error: expected constructor, destructor, or type conversion before '<' token|
C:\Documents and Settings\\My Documents\TestC\mem_functions.h|19|error: expected constructor, destructor, or type conversion before '++' token|
C:\Documents and Settings\\My Documents\TestC\mem_functions.h|25|warning: no newline at end of file|
C:\Documents and Settings\\My Documents\TestC\testmemfuncs.c||In function `int main()':|
C:\Documents and Settings\\My Documents\TestC\testmemfuncs.c|10|error: `memmove' was not declared in this scope|
C:\Documents and Settings\\My Documents\TestC\testmemfuncs.c|13|error: `memsetw' was not declared in this scope|
||=== Build finished: 14 errors, 3 warnings ===|

Ik hoop dat iemand me wat uitleg over de foutmeldingen kan geven. Alvast bedankt !
« Laatst bewerkt op: 2009/11/01, 18:41:54 door Joshua822 »

Offline Mossie

  • Lid
Re: [C] Probleem met eerste header file
« Reactie #1 Gepost op: 2009/10/31, 11:43:17 »
De eerste 2 foutmeldingen: in een macro (dus dingen met #define ervoor) mag geen punt staan. Je kan er beter mem_functions van maken.
De foutmeldingen die daar op volgen: in C geldt dat je bij if, for en while blokken geen {} hoeft te plaatsen als er maar 1 regel code in staat. Dit geldt niet voor functies. Voorbeeld: memset moet worden:
void memset(char *mem_block, unsigned char mem_val, size_t sizeofblock) {  // Hier mag je de {} niet weglaten
    for (i = 0; i < sizeofblock; i++) { // Hier mag je de {} wel weglaten
        mem_block[i] = mem_val;
    }
}
size_t is een standaard type in linux en is eigenlijk een unsigned int.

Om eigen header files te gebruiken moet je eigenlijk #include "eigen_header.h" doen in plaats van #include <eigen_header.h>. Ook hoef je hier niet het absolute pad te geven.

Ook zie ik een aantal functies waar je wel "int *" voor hebt gezet, maar niks returned (bijv memmove). Dit moet je dus ook aanpassen.

Ook is het beter om de #endif aan het einde van de header te plaatsen. Zo heeft die #idndef aan het begin nog nut.

_san

  • Gast
Re: [C] Probleem met eerste header file
« Reactie #2 Gepost op: 2009/10/31, 18:41:31 »
Wat is het doel hiervan? Deze functies zijn standaard C/C++ functies, dus het is niet nodig om ze zelf te kopieëren om wat voor reden dan ook.

Zoals Mossie al zei, functies hebben altijd een '{' voor opening en een '}' voor sluiten. Het is eigenlijk niet gebruikelijk dat je functies uitschrijft in een header file. In een header file zet je alleen de definities van de functies, niet de functies zelf. Gebruik daar een source file voor.

Je gebruikt ook de "header guard" op een verkeerde manier. Het moet zijn:

#ifndef HEADER_NAAM
#define HEADER_NAAM
// code hier
#endif

Wanneer je meerdere source files hebt zal dit voorkomen dat je dingen meerdere malen invoegt.

Offline Joshua822

  • Lid
Re: [C] Probleem met eerste header file
« Reactie #3 Gepost op: 2009/10/31, 19:34:23 »
Oké, ik heb nu de volgende code :

voor het hoofd C programma :
#include "mem_functions.h"
#include <stdio.h>

int main ()
{
   unsigned short i;
   char zin[6] = "Hallo";
   unsigned int getallen1[5] = { 5, 22, 3, 14, 6 }, getallen2[5];
   printf ( "%d", strlen ( zin ) );
   memmove ( getallen2, getallen1, 5 );
   for ( i = 0; i < 5; i++ )
     printf ( "%d \n", getallen2[i] );
   memsetw ( getallen2, 6, 5 );
   for ( i = 0; i < 5; i++ )
     printf ( "%d \n", getallen2[i] );
   getchar();
   return 0;
}
De code van de header :
#ifndef mem_functions_h
#define mem_functions_h

int i;

void memset ( char * mem_block, unsigned char val, int sizeofblock )
{
   for ( i = 0; i < sizeofblock; i++ )
     mem_block[i] = val;
}
void memsetw ( int * mem_block, unsigned int val, int sizeofblock )
{
   for ( i = 0; i < sizeofblock; i++ )
     mem_block[i] = val;
}
void memmove ( int * dest, int * src, int sizeofblock )
{
   for ( i = sizeofblock; i > 0; i++ )
     dest[i] = src[i];
}
void memcpy ( int * dest, int * src, int sizeofblock )
{
   for ( i = 0; i < sizeofblock; i++ )
     dest[i] = src[i];
}
int strlen ( char * string )
{
   for ( i = 0; string[i] != '\0'; i++ )
   return i;
}

#endif

Echter, alhoewel alles zonder fouten compileert, krijg ik als ik het programma uitvoer enkel het getal 0 als output, en daarna stopt het programma.

Heeft iemand hier nog raad voor ?



Offline Joshua822

  • Lid
Re: [C] Probleem met eerste header file
« Reactie #4 Gepost op: 2009/11/01, 18:41:36 »
Dit probleem is opgelost.

Sorry, maar mijn gedachtengang was helemaal fout.

Ik heb in de header file alleen maar de prototypes van de functies behouden. Voor de rest heb ik alle functie declaraties uit deze header file naar een apart C broncode bestand verplaatst en heb ik het C broncode bestand dat main() bevat aan dit nieuwe C broncode bestand gelinkt. Dit werkt als een zonnetje.

Toch bedankt voor alle uitleg.