2016-08-01 85 views
1

我試圖創建緩衝區來存儲無限大小的符號。在C中緩衝區的分配

我有這樣的結構:

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

在我file.h

我也有功能緩衝:

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; 
} 

在我file.c我想創建緩衝區:

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 ... 
      } 
     } 
    } 

問題是,當我試圖做到這一點,視覺工作室給我錯誤:

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

我沒看到wa出去。我究竟做錯了什麼 ?

+0

頭文件中是否有一些定義的數據?順便說一句,當你定義你的結構時,不需要在struct關鍵字後放置緩衝區。 –

+0

爲聲明添加一個初始化:'bufferStruct * buffer = NULL;' – Barmar

+1

請填寫完整的代碼。 – Sergio

回答

1

有你的代碼中的多個問題:

  • 你不應該把代碼中的頭文件。功能BufferInitialize不應位於file.h,除非它被定義爲inline

  • 測試while (c = fgetc(fp))是不正確的:您使用的分配作爲測試表達,這是很容易出錯,你至少應該加上括號賦值表達式,並可能測試EOF而不是'\0'while ((c = fgetc(fp)) != EOF)。此外,c必須定義爲int。發佈實際的代碼,而不是僞代碼。

  • 初始化tempBuff->bufferSize到一個潛在的非零值,而allocatedSize0和緩衝是未分配的。這看起來不正確。

在你的實際代碼中可能有很多問題,我們看不到代碼是什麼,怎麼能告訴你這些問題?總是發佈一個完整的,可編譯的代碼來展示問題。

+0

我將函數聲明移至'.c文件'。 while代碼在我的代碼中是正確的。我也無法檢查EOF,因爲我需要繼續EOF。我相信有比我看到的更多的錯誤,但我剛開始。不幸的是,我被困在這個緩衝區錯誤。 –

+0

您必須瞭解**聲明**(例如'extern token * getNextToken(token * tokenT);'屬於頭文件(** .h **擴展名))之間的區別,並告訴您的編譯器函數如何*定義*在另一個模塊中,以及**定義**,如'token * getNextToken(token * tokenT){/ *一些代碼* /返回NULL; }'屬於C源文件(** .c **擴展名),並且不能在同一文件或不同文件中複製。 – chqrlie

+0

我知道,我沒有任何重複。我只是對緩衝區的功能感到困惑,所以我嘗試了一些東西。 –