Вопросы по языку СИ

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Открыл глаза
Сообщения: 40
Зарегистрирован: Вс окт 21, 2012 17:32:00
Откуда: СССР

Сообщение pnp_machinist »

Добрый день дорогие коллеги!!
Так сказать "осваиваю" Си.(STM32 -Keil4) И вот столкнулся c необходимостью косвенной адресации - не работает....

Код: Выделить всё

const  char tab1[2]= {0x01,0x02};
int* lab1;

// далее в программе xoчу видеть адрес "tab1"
lab1 = &tab;
Ругается -main.c(230): error: #513: a value of type "const char (*)[]" cannot be assigned to an entity of type "int"
Как -бы Lab1 -должно быть адресом и понятное дело не может быть однобайтным...
??
Реклама
Опытный кот
Аватара пользователя
Сообщения: 830
Зарегистрирован: Пт ноя 16, 2007 11:21:37

Сообщение Pavel_1978 »

У Вас массив состоит из char а ты пытаешся указывать на int.
Приведи к одному типу данные.
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

при чем тут приведение к одному типу?! для начала надо уяснить, что массива tab просто нет:
pnp_machinist писал(а):// далее в программе xoчу видеть адрес "tab1"
lab1 = &tab;
далее, надо вспомнить, что имя массива - это и есть указатель на его первый элемент, т.е. правильно так:

Код: Выделить всё

int *lab = tab1;
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница

Сообщение urry »

чем смущает запись char *lab ?
в стм32 этот указатель 4 байтовый, насколько помню.
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Сообщение HHIMERA »

ARV писал(а):при чем тут приведение к одному типу?!]
При том!!!
Дальше вообще ерунда...
"Я не даю готовых решений, я заставляю думать!"(С)
Реклама
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Сообщение HHIMERA »

pnp_machinist писал(а):столкнулся c необходимостью косвенной адресации - не работает....
Конкретизируйте вопрос...
Если нужно просто знать адрес - это одно... а если привязать указатель - это другое...
"Я не даю готовых решений, я заставляю думать!"(С)
Реклама
Открыл глаза
Сообщения: 40
Зарегистрирован: Вс окт 21, 2012 17:32:00
Откуда: СССР

Сообщение pnp_machinist »

Да, пожалуй точней будет так.
Мне нужен в памяти програмы(FLASH) адрес начала массива "TAB1"
Иными словами -хочу организовать чтение с таблиц.
Данные в таблице однобайтные.
Держит паяльник хвостом
Аватара пользователя
Сообщения: 958
Зарегистрирован: Вс дек 02, 2012 16:58:33
Откуда: от туда

Сообщение GARMIN »

Код: Выделить всё

#define NUM_ELEMENTS 5

uint8_t data1[NUM_ELEMENTS] = {1, 2, 3, 4, 5};
uint8_t *pdata1 = data1;
uint8_t data2;

data2 = data1[3];
*pdata1 = data2;
pdata1++;
data2 = *pdata1;
как-то так.
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

pnp_machinist писал(а):Да, пожалуй точней будет так.
Мне нужен в памяти програмы(FLASH) адрес начала массива "TAB1"
Иными словами -хочу организовать чтение с таблиц.
Данные в таблице однобайтные.
адрес начала массива - это идентификатор массива, вам уже говорили. в чем смысл выверта чтения массива через сторонний указатель, если индексная адресация массива принципиально ничем не отличается?!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Открыл глаза
Сообщения: 40
Зарегистрирован: Вс окт 21, 2012 17:32:00
Откуда: СССР

Сообщение pnp_machinist »

Да я уже и так тоже делал.

Код: Выделить всё

int* lab = tab1;
Результат тот-же. -( error: #144: a value of type "const char *" cannot be used to initialize an entity of type "int *"
Или я совсем что-то не понимаю.
Не плохо -бы увидеть пример с комментариями.
Прорезались зубы
Аватара пользователя
Сообщения: 232
Зарегистрирован: Вт май 08, 2012 10:42:29

Сообщение optima »

int* lab = tab1;
int *lab = tab1;
Разницы не замечаешь?
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

optima писал(а):int* lab = tab1;
int *lab = tab1;
Разницы не замечаешь?
а она есть?

компилятору не нравится, что тип указателей разный. лично мне не очевидно, что если есть квалификатор const, то это массив во flash, и не только мне не очевидно - по стандарту Си const не несет этого смысла. но видимо компилятор ваш считает иначе, поэтому надо присваивать адрес массива указателю соответствующего типа:

Код: Выделить всё

const char *ptr = tab1;
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Сообщение HHIMERA »

Да всё там очевидно...
const там не при чём... Тривиальное приведение типов... что отрицалось несколько постов назад... а зря...
Пример есть на прошлой странице... только uint32_t поменять на uint8_t...
И вообще... во избежание непоняток всегда вместо стандартных определений нужно использовать переопределения... типа uint8_t, uint32_t и т.д. ... Почитайте MISRA...
"Я не даю готовых решений, я заставляю думать!"(С)
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

HHIMERA писал(а):Да всё там очевидно...

Код: Выделить всё

int arr[3] = {1,2,3};
char *chat_ptr;
int *int_ptr;
long *long_ptr;

int_ptr = arr;
char_ptr = arr;
long_ptr = arr;
все это очевидно правильно с токи зрения стандарта Си. хотя варнинги (не ошибки!) обязаны быть на последнюю и предпоследнюю строки. а вот то, что у кого-то возникает ошибка, а не варнинг - это уже не очевидно.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

HHIMERA писал(а):const там не при чём...
Массив константный, по этому компилятор не имеет права присвоить его адрес указателю на неконстанту. Ибо по этому указателю можно потом будет изменить значения. Отсюда указаетль должен быть тоже на константный чар.

Код: Выделить всё

const	char	arr[]={1,2,3,4,5};
const   char*	char_p;
char_p=arr;
Ну а вообще, в том коде куча ошибок - const, разные типы (char и int), ошибка в имени массива.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Аlex писал(а):
HHIMERA писал(а):const там не при чём...
Массив константный, по этому компилятор не имеет права присвоить его адрес указателю на неконстанту. Ибо по этому указателю можно потом будет изменить значения..
формально компилятор не должен так делать, т.к. "может быть изменено" и "будет изменено" - это разные вещи. это в С++ строгое соблюдение типов, а для Си должен быть варнинг.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Сообщение HHIMERA »

Аlex писал(а):Массив константный, по этому компилятор не имеет права присвоить его адрес указателю на неконстанту.
Сам хоть понял... что написал??? :)))
const в данном случае - принадлежность к региону памяти...
Волатильность... да... данные могут быть волатильными, а указатель нет... Но если указать, то и указатель будет волатильным...
И вообще... что... ни у кого нет проекта под рукой под F103 в режиме симуляции??? Закинул и посмотрел... чего гадать...
Приведение же типов здесь важно... потому что Cortex может обращаться к данным как к байту, полуслову и слову... здесь наобум не прокатит...
"Я не даю готовых решений, я заставляю думать!"(С)
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

ARV писал(а):формально компилятор не должен так делать, т.к. "может быть изменено" и "будет изменено" - это разные вещи
Т.е. компилятор может спокойно дать записать адрес на константу в казатель, указывающий на неконстантную переменную ? А потом будет отслеживать, что и в какой момент записано в этом указателе и не давать изменять данные по нему ?
Не кажется это странным ? :) Проще запретить такую возможность и всё.
HHIMERA писал(а):Сам хоть понял... что написал???
Конечно понял. Если ты прочитаешь это ещё несколько раз, может и ты поймёшь :)))
HHIMERA писал(а):const в данном случае - принадлежность к региону памяти...
Причём тут регион памяти ? Давно ли этот квалификатор имел отношения к определённой области памяти ? Естественно, не учитывая всякие фишки конкретных компиляторов.
HHIMERA писал(а):Приведение же типов здесь важно...
Приведение типов везде важно. Никто не говорит, что проблема у ТС'а конкретно в константах. Это всего-лишь одна из его ошибок.
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Сообщение HHIMERA »

Аlex писал(а):Если ты прочитаешь это ещё несколько раз, может и ты поймёшь :)))
:facepalm:
Давно ли этот квалификатор имел отношения к определённой области памяти ? Естественно, не учитывая всякие фишки конкретных компиляторов.
Да лет уже... как МК появились... :)))
"Я не даю готовых решений, я заставляю думать!"(С)
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

:facepalm:
О чём вообще спор, не пойму...
Для тех, кто в танке и любит просто потрепать языком :
СпойлерИзображение
СпойлерИзображение
Вложения
scr_2.jpg
(210.67 КБ) 1048 скачиваний
scr_1.jpg
(240.42 КБ) 1017 скачиваний
Ответить

Вернуться в «ARM»