jenya7 0 26 июня, 2017 Опубликовано 26 июня, 2017 · Жалоба Есть функция 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 17 26 июня, 2017 Опубликовано 26 июня, 2017 · Жалоба В строке block_start_addr = (char*)&p[0]; входному параметру присваивается адрес начала массива, на который указывает p. Больше этот параметр не используется, т.е. где-то ошибка (зачем присваивать значение, если его нигде не использовать?). PS лучше писать так: block_start_addr = (char*)p; смысл абсолютно тот же самый. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 26 июня, 2017 Опубликовано 26 июня, 2017 (изменено) · Жалоба В строке block_start_addr = (char*)&p[0]; входному параметру присваивается адрес начала массива, на который указывает p. Больше этот параметр не используется, т.е. где-то ошибка (зачем присваивать значение, если его нигде не использовать?). PS лучше писать так: block_start_addr = (char*)p; смысл абсолютно тот же самый. Я пользуюсь этим указателем снаружи для вычисления позиции в строке (idx = block_start_addr - text). Аргумент text_type я тоже передаю наружу *text_type = type; однако на него компайлер не ругается. Изменено 26 июня, 2017 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
conan 0 26 июня, 2017 Опубликовано 26 июня, 2017 (изменено) · Жалоба Я пользуюсь этим указателем снаружи для вычисления позиции в строке (idx = block_start_addr - text). Аргумент text_type я тоже передаю наружу *text_type = type; однако на него компайлер не ругается. Ну так ведь в одном случае вы записываете в саму переменную-аргумент (block_start_addr =), а в другом в переменную, на которую ссылается указатель (*text_type =) Изменено 26 июня, 2017 пользователем conan Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
novikovfb 17 26 июня, 2017 Опубликовано 26 июня, 2017 · Жалоба Я пользуюсь этим указателем снаружи для вычисления позиции в строке (idx = block_start_addr - text). Аргумент text_type я тоже передаю наружу *text_type = type; однако на него компайлер не ругается. но наружу это присвоение не действует! Меняется только копия, переданная в функцию, именно на эту несуразицу и ругается компилятор. А вот *text_type = type; записывает по адресу в text_type значение type. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 26 июня, 2017 Опубликовано 26 июня, 2017 (изменено) · Жалоба но наружу это присвоение не действует! Меняется только копия, переданная в функцию, именно на эту несуразицу и ругается компилятор. А вот *text_type = type; записывает по адресу в text_type значение type. а как быть? нужен указатель на указатель? (char** block_start_addr) Изменено 26 июня, 2017 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 117 26 июня, 2017 Опубликовано 26 июня, 2017 · Жалоба а как быть? нужен указатель на указатель? (char** block_start_addr) указатель на то, что вы хотите менять. Желательно константный Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 26 июня, 2017 Опубликовано 26 июня, 2017 (изменено) · Жалоба указатель на то, что вы хотите менять. Желательно константный я хочу сохранить адрес если найден маркер (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); Изменено 26 июня, 2017 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
novikovfb 17 26 июня, 2017 Опубликовано 26 июня, 2017 · Жалоба я хочу сохранить адрес если найден маркер (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 0 26 июня, 2017 Опубликовано 26 июня, 2017 · Жалоба а в функции: *block_start_addr = (char*)p; да. только текущий адрес p[2] так как выполнилось условие if(p[0] == 'S' && p[1] == 'O' && (p[2] == 'I' || p[2] == 'A')). а мне надо именно p[0] - начало блока. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
novikovfb 17 26 июня, 2017 Опубликовано 26 июня, 2017 · Жалоба да. только текущий адрес p[2] так как выполнилось условие if(p[0] == 'S' && p[1] == 'O' && (p[2] == 'I' || p[2] == 'A')). а мне надо именно p[0] - начало блока. выражения p и &p[0] абсолютно тождественны в правой части выражения, смотрите учебник по языку Си. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 26 июня, 2017 Опубликовано 26 июня, 2017 · Жалоба выражения p и &p[0] абсолютно тождественны в правой части выражения, смотрите учебник по языку Си. да. точно. что то я ступил. ) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lagman 1 26 июня, 2017 Опубликовано 26 июня, 2017 · Жалоба Я видел как делают другие, чтобы избавиться от этого предупреждения, надо в начале функции до всяких if написать block_start_addr = block_start_addr; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
novikovfb 17 26 июня, 2017 Опубликовано 26 июня, 2017 · Жалоба Я видел как делают другие, чтобы избавиться от этого предупреждения, надо в начале функции до всяких if написать block_start_addr = block_start_addr; И потом долго-долго искать ошибку. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 27 июня, 2017 Опубликовано 27 июня, 2017 · Жалоба Я видел как делают другие, чтобы избавиться от этого предупреждения, надо в начале функции до всяких if написать block_start_addr = block_start_addr;Стандартный способ подавить предупреждения компилятора о неиспользуемом аргументе функции (void) block_start_addr; Можно написать в любом месте, но обычно пишут либо в начале, либо в конце, чтобы сразу бросалось в глаза. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться