Перейти к содержанию
    

Аргумент в функции - was set but never used

Есть функция

const char* PARSER_ParseBlock(const char* text, char* buf, uint32_t buf_size, uint32_t *text_type, char* block_start_addr) 
{
    char type = 0;
    char* b = buf;
    uint32_t s = buf_size;
    const char* p = text; 
    for(;*p != 0; p++)
    {
    if(p[0] == 'S' && p[1] == 'O' && (p[2] == 'I' || p[2] == 'A')) // check start of block SOI-start of instraction, SOA-start of action
        { 
        if (type != 0) // start of next block without end of previous, start over
            { 
        b = buf;
        s = buf_size;
        }
            
            block_start_addr = (char*)&p[0];
        type = p[2];
            *text_type =  type;
        p += 2;
    }
        else if(type)
        { 
            // write in a buffer
        if (p[0] == 'E' && p[1] == 'O' && (p[2] == 'I' || p[2] == 'A')) // check end of block
            { 
        if(type != p[2]) //end of block not this type 
                { 
            b = buf;
            s = buf_size;
            type = 0;
        } 
                else
                {
            *b = 0;
            return p + 3;
        }
        } 
            else if(s > 1)
            {
                // there is a place in buffer
        *b = *p;
         s--;
         b++;
        }
            else
            {
              *buf = 0;
            }
    }
    }
    *b = 0;
      
    return NULL;
}

При компиляции получаю Warning[Pe550]: parameter "block_start_addr" was set but never used

Что то не могу понять где подвох.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В строке block_start_addr = (char*)&p[0]; входному параметру присваивается адрес начала массива, на который указывает p. Больше этот параметр не используется, т.е. где-то ошибка (зачем присваивать значение, если его нигде не использовать?).

PS лучше писать так:

block_start_addr = (char*)p;

смысл абсолютно тот же самый.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В строке block_start_addr = (char*)&p[0]; входному параметру присваивается адрес начала массива, на который указывает p. Больше этот параметр не используется, т.е. где-то ошибка (зачем присваивать значение, если его нигде не использовать?).

PS лучше писать так:

block_start_addr = (char*)p;

смысл абсолютно тот же самый.

Я пользуюсь этим указателем снаружи для вычисления позиции в строке (idx = block_start_addr - text). Аргумент text_type я тоже передаю наружу *text_type = type; однако на него компайлер не ругается.

Изменено пользователем Jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я пользуюсь этим указателем снаружи для вычисления позиции в строке (idx = block_start_addr - text). Аргумент text_type я тоже передаю наружу *text_type = type; однако на него компайлер не ругается.

Ну так ведь в одном случае вы записываете в саму переменную-аргумент (block_start_addr =), а в другом в переменную, на которую ссылается указатель (*text_type =)

 

Изменено пользователем conan

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я пользуюсь этим указателем снаружи для вычисления позиции в строке (idx = block_start_addr - text). Аргумент text_type я тоже передаю наружу *text_type = type; однако на него компайлер не ругается.

но наружу это присвоение не действует! Меняется только копия, переданная в функцию, именно на эту несуразицу и ругается компилятор.

А вот *text_type = type; записывает по адресу в text_type значение type.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

но наружу это присвоение не действует! Меняется только копия, переданная в функцию, именно на эту несуразицу и ругается компилятор.

А вот *text_type = type; записывает по адресу в text_type значение type.

а как быть? нужен указатель на указатель? (char** block_start_addr)

Изменено пользователем Jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а как быть? нужен указатель на указатель? (char** block_start_addr)

указатель на то, что вы хотите менять. Желательно константный

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

указатель на то, что вы хотите менять. Желательно константный

я хочу сохранить адрес если найден маркер (SOI,SOA) в block_start_addr.

 

Переделал так

const char* PARSER_ParseBlock(const char* text, char* buf, uint32_t buf_size, uint32_t *text_type, char** block_start_addr)

И потом передаю в функцию

char *pchr_start = 0;

PARSER_ParseBlock(test_buffer, buf, 512, &type, &pchr_start);

Изменено пользователем Jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

я хочу сохранить адрес если найден маркер (SOI,SOA) в block_start_addr.

 

Переделал так

const char* PARSER_ParseBlock(const char* text, char* buf, uint32_t buf_size, uint32_t *text_type, char** block_start_addr)

И потом передаю в функцию

char *pchr_start = 0;

PARSER_ParseBlock(test_buffer, buf, 512, &type, &pchr_start);

а в функции:

*block_start_addr = (char*)p;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а в функции:

*block_start_addr = (char*)p;

да. только текущий адрес p[2] так как выполнилось условие if(p[0] == 'S' && p[1] == 'O' && (p[2] == 'I' || p[2] == 'A')). а мне надо именно p[0] - начало блока.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

да. только текущий адрес p[2] так как выполнилось условие if(p[0] == 'S' && p[1] == 'O' && (p[2] == 'I' || p[2] == 'A')). а мне надо именно p[0] - начало блока.

выражения p и &p[0] абсолютно тождественны в правой части выражения, смотрите учебник по языку Си.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

выражения p и &p[0] абсолютно тождественны в правой части выражения, смотрите учебник по языку Си.

да. точно. что то я ступил. )

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я видел как делают другие, чтобы избавиться от этого предупреждения, надо в начале функции до всяких if написать block_start_addr = block_start_addr;

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я видел как делают другие, чтобы избавиться от этого предупреждения, надо в начале функции до всяких if написать block_start_addr = block_start_addr;

И потом долго-долго искать ошибку.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я видел как делают другие, чтобы избавиться от этого предупреждения, надо в начале функции до всяких if написать block_start_addr = block_start_addr;
Стандартный способ подавить предупреждения компилятора о неиспользуемом аргументе функции

(void) block_start_addr;

Можно написать в любом месте, но обычно пишут либо в начале, либо в конце, чтобы сразу бросалось в глаза.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...