NikP 0 18 апреля, 2022 Опубликовано 18 апреля, 2022 · Жалоба Добрый день всем! В устройстве, над которым сейчас работаю, принимаю 2-х байтовые параметры через УАРТ (т.е. по 1-му байту). Захотел соригинальничать : принимаемые данные поместить в 1-байтный массив, а параметры из него считывать через 2-х байтовый указатель. Т.е. создать часть программы в таком виде: uint8_t DataMas[16] ; uint8_t * P8DataMas ; (1) P8DataMas = & DataMas[0]; uint16_t *P16DataMas, Param; P16DataMas = P8DataMas; Param = *P16DataMas; Однако Keil в строчке (1) выдал ошибку компилятора: UART.c(60): warning: #77-D: this declaration has no storage class or type specifier P8DataMas = & DataMas[0]; UART.c(60): error: #147: declaration is incompatible with "uint8_t *P8DataMas" (declared at line 59) P8DataMas = & DataMas[0]; А во всплывающей подсказке в окне программного модуля: error: redefinition of 'P8DataMas' with a different type: 'int' vs 'uint8_t * ' (aka 'unsignet char *' ) ; warning: type specifier missing, defaults to 'int' Возникают вопросы: 1. В чём ошибка? С моей точки зрения формально всё правильно. 2. В принципе Кейл позволяет выполнять подобные операции, т.е. читать массивы через дополнительно определённые указатели? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 18 апреля, 2022 Опубликовано 18 апреля, 2022 · Жалоба 6 minutes ago, NikP said: Однако Keil в строчке (1) выдал ошибку компилятора: Какой компилятор? Какой МК? 9 minutes ago, NikP said: 1. В чём ошибка? С моей точки зрения формально всё правильно. В данном случае вы пытаетесь указателю на один тип данных присвоить значение указателя на совершенной другой тип данных. Без приведения типа это невозможно, о чем закономерно ругается компилятор. Вам следует (для себя) разобраться с пониманием что такое указатель и как он хранится в пямяти в том или ином МК/CPU. 11 minutes ago, NikP said: 2. В принципе Кейл позволяет выполнять подобные операции, т.е. читать массивы через дополнительно определённые указатели? К Keil это не имеет никакого отношения, в данном случае это - базовые основы языка си, раздел "указатели". Для справки: Keil - это лишь среда программирования, внутри него есть на выбор старый (legacy) компилятор v5 и современный v6 (от ARM). Ошибки формирует компилятор, а среда их лишь отображает в соотв. окне. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 18 апреля, 2022 Опубликовано 18 апреля, 2022 · Жалоба 54 minutes ago, Forger said: В данном случае вы пытаетесь указателю на один тип данных присвоить значение указателя на совершенной другой тип данных. Вы невнимательно читаете. До указателя на uint16_t разговор ещё не дошёл. Компилятор не видит объявление указателя P8DataMas (вторую строчку из приведённого кода). Зато видит третью строчку, но из-за устаревшей 50 лет назад магии считает, что эта переменная имеет тип по умолчанию - int (см. варнинг). А присвоить int'у указатель без явного приведения не может (это уже ошибка, на которой компиляция останавливается). 1 hour ago, Forger said: и как он хранится в пямяти в том или ином МК/CPU А как он хранится в памяти в том или ином МК ? Одинаково они хранятся, и в том МК, и в ином CPU. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 183 18 апреля, 2022 Опубликовано 18 апреля, 2022 · Жалоба Тогда не понятно, почему 5 минут назад, esaulenka сказал: ...Компилятор не видит объявление указателя P8DataMas (вторую строчку из приведённого кода)... Возможно, между теми строками еще какой-то код, а может даже обрамленный в директивы условной компиляции или как-то еще. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 18 апреля, 2022 Опубликовано 18 апреля, 2022 · Жалоба 56 minutes ago, esaulenka said: Вы невнимательно читаете. Как раз внимательно: перед своим ответом эти 6 строк кода я лично скормил компилятору (причем в оба: v5 и v6). Все именно так, как я описал выше. Убедитесь сами. Впрочем, это видно и без компилятора. В первых 3х строчках нет никакого криминала. Явная ошибка только в пятой строке: P16DataMas = P8DataMas; Если конечно, между этими строками действительно ничего больше нет. 56 minutes ago, esaulenka said: А как он хранится в памяти в том или ином МК ? Одинаково они хранятся, и в том МК, и в ином CPU. Ну, ну Вангую, тема будет зажигательно веселой )) 2 hours ago, NikP said: Однако Keil в строчке (1) выдал ошибку компилятора: Warning - это не ошибка, а лишь предупреждение. Повторю вопрос: 1 hour ago, Forger said: Какой компилятор? В смысле версия какая? Не keil, а именно компилятор. Это РАЗНЫЕ вещи, многие их тут почемуто путают. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 27 18 апреля, 2022 Опубликовано 18 апреля, 2022 · Жалоба ТС - возможно что-то наплетено блоке с #include < > , почистить-проверить номенклатуру заголовочных файлов. Проверить определение типа через uint8_t -> Go_To_Definition /* exact-width unsigned integer types */ typedef unsigned char uint8_t; typedef unsigned short int uint16_t; typedef unsigned int uint32_t; typedef unsigned __INT64 uint64_t; Выложить урезанный проект с наличием этого warn. Хотя после урезания не исключено, что вопрос отпадет сам собой. У меня нет warn на этом коде. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 18 апреля, 2022 Опубликовано 18 апреля, 2022 · Жалоба 59 минут назад, Forger сказал: В первых 3х строчках нет никакого криминала. Явная ошибка только в пятой строке: P16DataMas = P8DataMas; Повторю то, что Вам уже посоветовали: Внимательно перечитайте исходный пост ТС-а. У него компилятор ругается именно на 3-ю строку. О чём он сам говорит, и что видно из сообщения об ошибке. А не на последующие, вне зависимости от того - есть там ошибки или нет. Причину можно понять только просмотрев весь исходник, а не этот его обрывок. Вангую, что у ТС-а где-то дублируются объявления переменной P8DataMas. Да ещё - с разным типом. Но это только гадание, точно судить можно только по полному коду. 1 час назад, Forger сказал: Вангую, тема будет зажигательно веселой )) Вангую, что тема будет сродни допросу партизана в гестапо: придётся из ТСа клещами по каплям вытягивать полезную инфу.... 1 час назад, Arlleex сказал: Возможно, между теми строками еще какой-то код, а может даже обрамленный в директивы условной компиляции или как-то еще. Или этот код он впендюрил в макрос, который потом вызвал несколько раз. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 18 апреля, 2022 Опубликовано 18 апреля, 2022 · Жалоба Вангую, что ТС написал это на глобальном уровне (вне какой либо функции). Так действительно будет ругаться 2 ТС - попробуйте так: uint8_t DataMas[16] ; uint8_t * P8DataMas = (uint8_t*) DataMas; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 18 апреля, 2022 Опубликовано 18 апреля, 2022 · Жалоба 19 minutes ago, jcxz said: Повторю то, что Вам уже посоветовали: Внимательно перечитайте исходный пост ТС-а. Согласно исходному посту, код компилируется без указанного предупреждения, а ошибка есть лишь в пятой строке: P16DataMas = P8DataMas; Мы действительно можем еще долго ванговать, какой там код на самом деле, чтобы воспроизвести это предупреждение и ошибку. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 18 апреля, 2022 Опубликовано 18 апреля, 2022 · Жалоба 4 минуты назад, Forger сказал: Согласно исходному посту, код компилируется без указанного предупреждения, а ошибка есть лишь в пятой строке: P16DataMas = P8DataMas; У Вас что-ли? Я вам говорю - прочитайте какие ошибки у ТСа выдаёт компилятор! Это потому, что вы компилируете только кусок, выложенный ТСом. А в реальности у него там ещё что-то есть. И ещё неизвестно как и куда он этот кусок вставил. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 18 апреля, 2022 Опубликовано 18 апреля, 2022 · Жалоба 4 minutes ago, jcxz said: Это потому, что вы компилируете только кусок, выложенный ТСом. Именно. Что тут выложено, то и компилирую. А другого кода ТС пока не выложил. Как выложит, тогда и видно будет. Скорее всего даже без компилирования. А пока что это - "гадания на кофейной гуще". 6 minutes ago, jcxz said: Я вам говорю - прочитайте какие ошибки у ТСа выдаёт компилятор! Они не соответствуют приведенному ТС коду. Как будет выложен код, приводящий к этим ошибкам, можно будет их обсудить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
NikP 0 18 апреля, 2022 Опубликовано 18 апреля, 2022 · Жалоба Всем спасибо за обсуждение и приношу извинения за потраченное время. Мне наши компетентные товарищи ткнули носом, что строка P8DataMas = & DataMas[0]; оказалась в начале программного модуля , а должна быть внутри функции. Внёс изменения - всё заработало. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться