Ошибка С, "'ожидаемая' = '', ''; ', 'asm' или '__attribute__' перед 'Bufferpar' " - PullRequest
2 голосов
/ 28 апреля 2011

Небольшой проект кодирования, использующий IDE Code :: Blocks, работал над функциональностью разбора буфера, при компиляции я получил странную ошибку (как видно выше).Я провел некоторые исследования в Интернете, как правило, это потому, что Code :: Blocks пытается скомпилировать код C, когда это C ++, это не так.Это C.

Точное сообщение снова выглядит следующим образом:

Line 3 : error: expected '=', ',', 'ASM', or '__attribute__' before 'BufferPar'

Казалось бы, все остальное нормально компилируется, кроме этого маленького кусочка кода.Я понятия не имею, есть идеи?Боюсь, я могу упускать из виду некоторые мелкие детали ....

#include <string.h>

PCHAR BufferPar(PCHAR pPagebuffer, PCHAR pInitchar, PCHAR pFinalchar)
{
    PCHAR vPointer, pNchar, *phLocate;
    CHAR String[1024];

    if(pPagebuffer == NULL) return NULL;

    if((vPointer=strstr(pPagebuffer, pInitchar) == NULL){
       return vPointer;}
       else vPointer += strlen(pInitchar);

    *phLocate = vPointer;

    if((pNchar=strstr(vPointer, pFinalchar) == NULL)){
    return pNchar;}
    else pNchar[0]='\0';

    strcpy(String, vPointer);

    pNchar=[0]=pFinalchar=[0];

    return String;

}

Ответы [ 2 ]

2 голосов
/ 28 апреля 2011

Вам необходим #define, typedef или соответствующий заголовок для объявления / определения PCHAR.

Если вы в растерянности, попробуйте добавить следующее после #include <string.h>:

typedef char CHAR;
typedef char* PCHAR;

В сниппете есть несколько других проблем, о которых вам скажет компилятор, поэтому я позволю вам просто решить их таким образом.Однако я скажу, что вам следует обратить пристальное внимание на операции присваивания в предложениях if.

Я бы даже посоветовал вам изменить код, соответствующий следующему шаблону:

if((vPointer=strstr(pPagebuffer, pInitchar) == NULL){ ... } 

to:

vPointer=strstr(pPagebuffer, pInitchar);

if(vPointer == NULL){ ... }

Я думаю, что в долгосрочной перспективе вы сэкономите немного горя, избежав ненужной сложности в условном выражении оператора if.

1 голос
/ 28 апреля 2011

Множество проблем за пределами этого кода не компилируется.

Вы должны включить windows.h вверху файла, чтобы избавиться от проблемы, связанной с PCHAR, и ошибки, связанной с BufferPar.

#include <windows.h>

Но это все равно не решит проблему компиляции.

Ваше выражение:

if((vPointer=strstr(pPagebuffer, pInitchar) == NULL){

Не скомпилируется, потому что вам не хватает дополнительного набора паренов. Попробуйте вместо этого:

if((vPointer=strstr(pPagebuffer, pInitchar)) == NULL){

То же самое здесь:

if((pNchar=strstr(vPointer, pFinalchar) == NULL)){

Должно быть:

if((pNchar=strstr(vPointer, pFinalchar)) == NULL)){

(также, условие else после pNchar не работает)

И эта строка не имеет абсолютно никакого смысла:

pNchar=[0];=pFinalchar=[0];

Эта строка ...

strcpy(String, vPointer);

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

И самое главное:

 return String;

Нет, нет, нет !!! Не возвращайте указатель на переменную стека - ваша программа в лучшем случае потерпит крах (или, что еще хуже, будет иметь недетерминированную ошибку в зависимости от того, как ваша функция вызывается и использует возвращаемое значение). Последующие вызовы функций после возврата BufferPar приведут к удалению памяти, содержащейся в «String»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...