2016-08-01 90 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

我知道,我没有任何重复。我只是对缓冲区的功能感到困惑,所以我尝试了一些东西。 –