2016-08-01 1 views
1

J'essaie de créer un tampon pour stocker la taille infinie des symboles.Allocation de tampon en C

J'ai cette structure:

typedef struct buffer { 
    int bufferSize; 
    int literalSize; 
    int allocatedSize; 
    char *bufferPtr; 
} bufferStruct; 

Dans mon fichier.h.

Je fonctionne également pour le tampon:

bufferStruct *BufferInitialize(int size) { 
    bufferStruct *tempBuff; 
    tempBuff = (bufferStruct *)malloc(sizeof(bufferStruct)); 
    if (tempBuff == NULL) { 
     exit(99);  // MEMORY_ERROR 
    } 
    tempBuff->bufferSize = size; 
    tempBuff->literalSize = 0; 
    tempBuff->bufferPtr = NULL; 
    tempBuff->allocatedSize = 0; 

    return (tempBuff); 
} 

int addToBuffer(bufferStruct *buffer, char c) { 
    if (buffer == NULL) { 
     return 99;  // MEMORY_ERROR 
    } 
    if (buffer->allocatedSize > buffer->literalSize) { 
     buffer->bufferPtr[buffer->literalSize++] = c; 
    } else { 
     buffer->bufferPtr = realloc(buffer->bufferPtr, (buffer->allocatedSize + buffer->bufferSize) * sizeof(char)); 
     if (buffer->bufferPtr == NULL) { 
      return 99;  // MEMORY_ERROR 
     } 
     buffer->allocatedSize += buffer->bufferSize; 
     buffer->bufferSize <<= 1; // bS = bS * 2 
     buffer->bufferPtr[buffer->literalSize++] = c; 
    } 
    return 0; 
} 

int bufferDestroy(bufferStruct *buffer) { 
    if (buffer == NULL) { 
     return 99;  // MEMORY_ERROR 
    } 
    free(buffer->bufferPtr); 
    free(buffer); 
    return 0; 
} 

Dans mon file.c Je suis en train de créer un tampon:

token *getNextToken(token *tokenT) { 
    token *actualToken = NULL; 
    char *bufferData = NULL; 
    int charFromFile; 
    eState state = stateInit; 

    bufferStruct *bufferT = NULL; 

    while ((charFromFile = fgetc(fp))) {     
     switch (state) { 
      case stateInit: { 
       if (isdigit(charFromFile)) { 
        bufferT = BufferInitialize(8); 
        addToBuffer(bufferT, charFromFile); 
        state = stateInt; 
       } else 
       if (isalpha(charFromFile) || (charFromFile == '_')) { 
        state = stateId; 
        bufferT = BufferInitialize(16); 
        addToBuffer(bufferT, charFromFile); 
       } else 
       if (isspace(charFromFile)) { 
        state = stateInit; 

       ... some more conditions ... it's similar, a lot. 

      case stateInt: { 
       if (isdigit(charFromFile)) { 
        state = stateInt; 
        addToBuffer(bufferT, charFromFile); 
       } else 
       if ((charFromFile == 'e') || (charFromFile == 'E')) { 
        state = stateExp; 
        addToBuffer(bufferT, charFromFile); 
       } else 
       if (charFromFile = '.') { 
        state = stateDouble; 
        addToBuffer(bufferT, charFromFile); 
       } else { 
        bufferData = bufferT->bufferPtr; 
        //strcpy(actualToken->content, bufferData); 
        addToBuffer(bufferT, '\0'); 
        bufferDestroy(bufferT); 
        actualToken->type = tokenInt; 
        return actualToken; 
       } 
      } break; 

       ... other similar cases ... 
      } 
     } 
    } 

Le problème est quand je suis en train de faire, Visual studio me donner l'erreur:

One or more multiply defined symbols found Also gives me already defined in main.obj for every function I have.

Je ne vois pas le wa y out. Qu'est-ce que je fais mal ?

+0

Y a-t-il des données définies dans le fichier d'en-tête? Et btw lorsque vous définissez votre structure, pas besoin de mettre un tampon après le mot-clé struct. –

+0

Ajouter une initialisation à la déclaration: 'bufferStruct * buffer = NULL;' – Barmar

+1

Post code complet, s'il vous plaît. – Sergio

Répondre

1

Il y a plusieurs questions dans votre code:

  • Vous ne devriez pas mettre le code dans les fichiers d'en-tête. La fonction BufferInitialize ne doit pas être située dans file.h sauf si elle est définie inline.

  • Le test while (c = fgetc(fp)) est incorrect: vous utilisez une affectation comme une expression de test, il est très sujette aux erreurs, vous devriez au moins parenthésée l'expression d'affectation, et probablement pour tester EOF au lieu de '\0': while ((c = fgetc(fp)) != EOF). En outre, c doit être défini comme int. Publiez le code réel, pas le pseudo-code.

  • Vous initialisez tempBuff->bufferSize à une valeur potentiellement non nulle, alors que allocatedSize est 0 et le tampon n'est pas alloué. Cela semble incorrect.

Il pourrait y avoir beaucoup plus de problèmes dans votre code actuel, nous ne pouvons pas voir ce que le code, comment peut-être vous dire au sujet de ceux? Toujours poster un code complet et compilable qui démontre le problème.

+0

J'ai déplacé la déclaration des fonctions vers le fichier '.c'. La condition while est correcte dans mon code. Je ne peux pas non plus vérifier l'EOF parce que je dois continuer derrière EOF. Je crois qu'il y a plus d'erreurs que je ne peux le voir, mais je viens juste de commencer. Malheureusement, je me suis coincé à cette erreur de tampon. –

+0

Vous devez apprendre la différence entre une ** déclaration ** telle que 'extern token * getNextToken (token * tokenT);' qui appartient à un fichier d'en-tête (** .h ** extension) et indique à votre compilateur comment la fonction est * défini * dans un autre module, et une ** définition ** telle que 'token * getNextToken (token * tokenT) {/ * du code */return NULL; } 'qui appartient à un fichier source C (**. c ** extension) et ne doit pas être dupliqué dans le même fichier ou dans des fichiers différents. – chqrlie

+0

Je le sais et je n'ai pas de doublons.J'étais juste un peu confus au sujet de la fonction de tampon, alors j'essayais des choses. –