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

Keil Uvision5 обращение к массиву через указатель

Добрый день всем!
В устройстве, над которым сейчас работаю, принимаю 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. В принципе Кейл позволяет выполнять подобные операции, т.е. читать массивы через дополнительно определённые указатели?

 

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


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

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). Ошибки формирует компилятор, а среда их лишь отображает в соотв. окне.

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


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

54 minutes ago, Forger said:

В данном случае вы пытаетесь указателю на один тип данных присвоить значение указателя на совершенной другой тип данных.

Вы невнимательно читаете. До указателя на uint16_t разговор ещё не дошёл.

Компилятор не видит объявление указателя P8DataMas (вторую строчку из приведённого кода). Зато видит третью строчку, но из-за устаревшей 50 лет назад магии считает, что эта переменная имеет тип по умолчанию - int (см. варнинг). А присвоить int'у указатель без явного приведения не может (это уже ошибка, на которой компиляция останавливается). 

 

1 hour ago, Forger said:

и как он хранится в пямяти в том или ином МК/CPU

А как он хранится в памяти в том или ином МК ? Одинаково они хранятся, и в том МК, и в ином CPU.

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


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

Тогда не понятно, почему

5 минут назад, esaulenka сказал:

...Компилятор не видит объявление указателя P8DataMas (вторую строчку из приведённого кода)...


Возможно, между теми строками еще какой-то код, а может даже обрамленный в директивы условной компиляции или как-то еще.

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


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

56 minutes ago, esaulenka said:

Вы невнимательно читаете. 

Как раз внимательно: перед своим ответом эти 6 строк кода я лично скормил компилятору (причем в оба: v5 и v6).

Все именно так, как я описал выше.

Убедитесь сами.

Впрочем, это видно и без компилятора.

 

В первых 3х строчках нет никакого криминала. Явная ошибка только в пятой строке: P16DataMas = P8DataMas;

Если конечно, между этими строками действительно ничего больше нет.

 

 

56 minutes ago, esaulenka said:

А как он хранится в памяти в том или ином МК ? Одинаково они хранятся, и в том МК, и в ином CPU.

 

Ну, ну :mosking:

Вангую, тема будет зажигательно веселой ))

 

 

 

 

2 hours ago, NikP said:

Однако Keil в строчке (1) выдал ошибку компилятора:

Warning - это не ошибка, а лишь предупреждение.

Повторю вопрос: 

1 hour ago, Forger said:

Какой компилятор?

В смысле версия какая? Не keil, а именно компилятор. Это РАЗНЫЕ вещи, многие их тут почемуто путают.

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


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

ТС - возможно что-то наплетено блоке с #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 на этом коде.

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


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

59 минут назад, Forger сказал:

В первых 3х строчках нет никакого криминала. Явная ошибка только в пятой строке: P16DataMas = P8DataMas;

Повторю то, что Вам уже посоветовали: Внимательно перечитайте исходный пост ТС-а.

У него компилятор ругается именно на 3-ю строку. О чём он сам говорит, и что видно из сообщения об ошибке. А не на последующие, вне зависимости от того - есть там ошибки или нет.

Причину можно понять только просмотрев весь исходник, а не этот его обрывок. Вангую, что у ТС-а где-то дублируются объявления переменной P8DataMas. Да ещё - с разным типом. Но это только гадание, точно судить можно только по полному коду.

1 час назад, Forger сказал:

Вангую, тема будет зажигательно веселой ))

Вангую, что тема будет сродни допросу партизана в гестапо: придётся из ТСа клещами по каплям вытягивать полезную инфу....  :biggrin:

1 час назад, Arlleex сказал:

Возможно, между теми строками еще какой-то код, а может даже обрамленный в директивы условной компиляции или как-то еще.

Или этот код он впендюрил в макрос, который потом вызвал несколько раз.  :wink:

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


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

Вангую, что ТС написал это на глобальном уровне (вне какой либо функции). Так действительно будет ругаться

2 ТС - попробуйте так:

uint8_t DataMas[16] ;
uint8_t * P8DataMas = (uint8_t*) DataMas;

 

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


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

19 minutes ago, jcxz said:

Повторю то, что Вам уже посоветовали: Внимательно перечитайте исходный пост ТС-а.

Согласно исходному посту, код компилируется без указанного предупреждения, а ошибка есть лишь в пятой строке: P16DataMas = P8DataMas;

 

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

 

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


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

4 минуты назад, Forger сказал:

Согласно исходному посту, код компилируется без указанного предупреждения, а ошибка есть лишь в пятой строке: P16DataMas = P8DataMas;

У Вас что-ли? Я вам говорю - прочитайте какие ошибки у ТСа выдаёт компилятор!

Это потому, что вы компилируете только кусок, выложенный ТСом. А в реальности у него там ещё что-то есть. И ещё неизвестно как и куда он этот кусок вставил.

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


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

4 minutes ago, jcxz said:

Это потому, что вы компилируете только кусок, выложенный ТСом.

Именно. Что тут выложено, то и компилирую. А другого кода ТС пока не выложил.

Как выложит, тогда и видно будет. Скорее всего даже без компилирования. А пока что это - "гадания на кофейной гуще".

 

6 minutes ago, jcxz said:

Я вам говорю - прочитайте какие ошибки у ТСа выдаёт компилятор!

Они не соответствуют приведенному ТС коду.

Как будет выложен код, приводящий к этим ошибкам, можно будет их обсудить.

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


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

Всем спасибо за обсуждение и приношу  извинения за потраченное время. Мне наши компетентные товарищи ткнули носом, что строка 

P8DataMas = & DataMas[0];

оказалась в начале программного модуля , а должна быть внутри функции. Внёс изменения - всё заработало. 

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


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

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

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

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

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

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

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

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

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

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