реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Аргумент в функции - was set but never used
Jenya7
сообщение Jun 26 2017, 09:53
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Есть функция
Код
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
Что то не могу понять где подвох.

Go to the top of the page
 
+Quote Post
novikovfb
сообщение Jun 26 2017, 10:00
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 518
Регистрация: 29-09-11
Пользователь №: 67 450



В строке block_start_addr = (char*)&p[0]; входному параметру присваивается адрес начала массива, на который указывает p. Больше этот параметр не используется, т.е. где-то ошибка (зачем присваивать значение, если его нигде не использовать?).
PS лучше писать так:
block_start_addr = (char*)p;
смысл абсолютно тот же самый.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jun 26 2017, 10:07
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(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; однако на него компайлер не ругается.

Сообщение отредактировал Jenya7 - Jun 26 2017, 10:12
Go to the top of the page
 
+Quote Post
conan
сообщение Jun 26 2017, 10:14
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 56
Регистрация: 3-11-11
Пользователь №: 68 126



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

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


Сообщение отредактировал conan - Jun 26 2017, 10:16
Go to the top of the page
 
+Quote Post
novikovfb
сообщение Jun 26 2017, 10:15
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 518
Регистрация: 29-09-11
Пользователь №: 67 450



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

но наружу это присвоение не действует! Меняется только копия, переданная в функцию, именно на эту несуразицу и ругается компилятор.
А вот *text_type = type; записывает по адресу в text_type значение type.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jun 26 2017, 10:21
Сообщение #6


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



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

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

Сообщение отредактировал Jenya7 - Jun 26 2017, 10:23
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 26 2017, 10:24
Сообщение #7


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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

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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jun 26 2017, 10:29
Сообщение #8


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(Сергей Борщ @ 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);

Сообщение отредактировал Jenya7 - Jun 26 2017, 10:33
Go to the top of the page
 
+Quote Post
novikovfb
сообщение Jun 26 2017, 10:38
Сообщение #9


Знающий
****

Группа: Участник
Сообщений: 518
Регистрация: 29-09-11
Пользователь №: 67 450



Цитата(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;
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jun 26 2017, 10:50
Сообщение #10


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(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] - начало блока.
Go to the top of the page
 
+Quote Post
novikovfb
сообщение Jun 26 2017, 10:52
Сообщение #11


Знающий
****

Группа: Участник
Сообщений: 518
Регистрация: 29-09-11
Пользователь №: 67 450



Цитата(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] абсолютно тождественны в правой части выражения, смотрите учебник по языку Си.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jun 26 2017, 11:15
Сообщение #12


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



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

да. точно. что то я ступил. )
Go to the top of the page
 
+Quote Post
Lagman
сообщение Jun 26 2017, 14:18
Сообщение #13


Знающий
****

Группа: Свой
Сообщений: 875
Регистрация: 28-10-05
Пользователь №: 10 245



Я видел как делают другие, чтобы избавиться от этого предупреждения, надо в начале функции до всяких if написать block_start_addr = block_start_addr;
Go to the top of the page
 
+Quote Post
novikovfb
сообщение Jun 26 2017, 14:23
Сообщение #14


Знающий
****

Группа: Участник
Сообщений: 518
Регистрация: 29-09-11
Пользователь №: 67 450



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

И потом долго-долго искать ошибку.
Go to the top of the page
 
+Quote Post
andrew_b
сообщение Jun 27 2017, 04:41
Сообщение #15


Профессионал
*****

Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



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

Можно написать в любом месте, но обычно пишут либо в начале, либо в конце, чтобы сразу бросалось в глаза.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th April 2024 - 16:57
Рейтинг@Mail.ru


Страница сгенерированна за 0.01505 секунд с 7
ELECTRONIX ©2004-2016