2016-08-01 5 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 ... 
      } 
     } 
    } 

Проблема заключается в том, когда я пытаюсь сделать это, Visual studio дайте мне ошибку:

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

Я не вижу wa Вы т. Что я делаю не так ?

+0

Есть ли определенные данные в файле заголовка? И btw, когда вы определяете свою структуру, не нужно класть буфер после ключевого слова 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 к потенциально ненулевого значения, в то время как allocatedSize является 0 и буфер нераспределенной. Это кажется неправильным.

В вашем фактическом коде может быть еще много проблем, мы не можем видеть, что такое код, как можно рассказать об этом? Всегда отправляйте полный компилируемый код, который демонстрирует проблему.

+0

Я переместил объявление функций в .c файл. Условие while корректно в моем коде. Я также не могу проверить EOF, потому что мне нужно продолжать работу по EOF. Я считаю, что ошибок больше, чем я могу видеть, но я только начал. К несчастью, я застрял в этой ошибке буфера. –

+0

Вы должны узнать разницу между ** объявлением **, таким как «extern token» getNextToken (токен * tokenT); ', который принадлежит файлу заголовка (**. H ** extension) и сообщает вашему компилятору, * определен * в другом модуле и ** определение **, такое как «токен» getNextToken (токен * токенT) {/ * некоторый код */return NULL; } ', который принадлежит исходному файлу C (**. c ** extension) и не должен дублироваться в том же файле или в разных файлах. – chqrlie

+0

Я знаю это, и у меня нет никаких дубликатов.Я немного смутился о функции буфера, поэтому я пытался что-то делать. –

 Смежные вопросы

  • Нет связанных вопросов^_^