Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Аргумент в функции - was set but never used
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Jenya7
Есть функция
Код
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
Что то не могу понять где подвох.

novikovfb
В строке block_start_addr = (char*)&p[0]; входному параметру присваивается адрес начала массива, на который указывает p. Больше этот параметр не используется, т.е. где-то ошибка (зачем присваивать значение, если его нигде не использовать?).
PS лучше писать так:
block_start_addr = (char*)p;
смысл абсолютно тот же самый.
Jenya7
Цитата(novikovfb @ Jun 26 2017, 15:00) *
В строке block_start_addr = (char*)&p[0]; входному параметру присваивается адрес начала массива, на который указывает p. Больше этот параметр не используется, т.е. где-то ошибка (зачем присваивать значение, если его нигде не использовать?).
PS лучше писать так:
block_start_addr = (char*)p;
смысл абсолютно тот же самый.

Я пользуюсь этим указателем снаружи для вычисления позиции в строке (idx = block_start_addr - text). Аргумент text_type я тоже передаю наружу *text_type = type; однако на него компайлер не ругается.
conan
Цитата(Jenya7 @ Jun 26 2017, 13:07) *
Я пользуюсь этим указателем снаружи для вычисления позиции в строке (idx = block_start_addr - text). Аргумент text_type я тоже передаю наружу *text_type = type; однако на него компайлер не ругается.

Ну так ведь в одном случае вы записываете в саму переменную-аргумент (block_start_addr =), а в другом в переменную, на которую ссылается указатель (*text_type =)
novikovfb
Цитата(Jenya7 @ Jun 26 2017, 14:07) *
Я пользуюсь этим указателем снаружи для вычисления позиции в строке (idx = block_start_addr - text). Аргумент text_type я тоже передаю наружу *text_type = type; однако на него компайлер не ругается.

но наружу это присвоение не действует! Меняется только копия, переданная в функцию, именно на эту несуразицу и ругается компилятор.
А вот *text_type = type; записывает по адресу в text_type значение type.
Jenya7
Цитата(novikovfb @ Jun 26 2017, 15:15) *
но наружу это присвоение не действует! Меняется только копия, переданная в функцию, именно на эту несуразицу и ругается компилятор.
А вот *text_type = type; записывает по адресу в text_type значение type.

а как быть? нужен указатель на указатель? (char** block_start_addr)
Сергей Борщ
QUOTE (Jenya7 @ Jun 26 2017, 13:21) *
а как быть? нужен указатель на указатель? (char** block_start_addr)

указатель на то, что вы хотите менять. Желательно константный
Jenya7
Цитата(Сергей Борщ @ Jun 26 2017, 15:24) *
указатель на то, что вы хотите менять. Желательно константный

я хочу сохранить адрес если найден маркер (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);
novikovfb
Цитата(Jenya7 @ Jun 26 2017, 14:29) *
я хочу сохранить адрес если найден маркер (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;
Jenya7
Цитата(novikovfb @ Jun 26 2017, 15:38) *
а в функции:
*block_start_addr = (char*)p;

да. только текущий адрес p[2] так как выполнилось условие if(p[0] == 'S' && p[1] == 'O' && (p[2] == 'I' || p[2] == 'A')). а мне надо именно p[0] - начало блока.
novikovfb
Цитата(Jenya7 @ Jun 26 2017, 14:50) *
да. только текущий адрес p[2] так как выполнилось условие if(p[0] == 'S' && p[1] == 'O' && (p[2] == 'I' || p[2] == 'A')). а мне надо именно p[0] - начало блока.

выражения p и &p[0] абсолютно тождественны в правой части выражения, смотрите учебник по языку Си.
Jenya7
Цитата(novikovfb @ Jun 26 2017, 15:52) *
выражения p и &p[0] абсолютно тождественны в правой части выражения, смотрите учебник по языку Си.

да. точно. что то я ступил. )
Lagman
Я видел как делают другие, чтобы избавиться от этого предупреждения, надо в начале функции до всяких if написать block_start_addr = block_start_addr;
novikovfb
Цитата(Lagman @ Jun 26 2017, 18:18) *
Я видел как делают другие, чтобы избавиться от этого предупреждения, надо в начале функции до всяких if написать block_start_addr = block_start_addr;

И потом долго-долго искать ошибку.
andrew_b
Цитата(Lagman @ Jun 26 2017, 17:18) *
Я видел как делают другие, чтобы избавиться от этого предупреждения, надо в начале функции до всяких if написать block_start_addr = block_start_addr;
Стандартный способ подавить предупреждения компилятора о неиспользуемом аргументе функции
Код
(void) block_start_addr;

Можно написать в любом месте, но обычно пишут либо в начале, либо в конце, чтобы сразу бросалось в глаза.
Сергей Борщ
QUOTE (andrew_b @ Jun 27 2017, 07:41) *
Стандартный способ подавить предупреждения компилятора о неиспользуемом аргументе функции
Это не указывать этот аргумент. Т.е. если у нас функция int test(in arg) не использует arg, то и писать его не нужно:
CODE
int test(int)
{
    ......
}

Но автор ветки, как оказалось, хотел использовать аргумент, просто не сумел это с первой попытки правильно объяснить компилятору.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.