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 -должно быть адресом и понятное дело не может быть однобайтным...
??
Да, пожалуй точней будет так.
Мне нужен в памяти програмы(FLASH) адрес начала массива "TAB1"
Иными словами -хочу организовать чтение с таблиц.
Данные в таблице однобайтные.
pnp_machinist писал(а):Да, пожалуй точней будет так.
Мне нужен в памяти програмы(FLASH) адрес начала массива "TAB1"
Иными словами -хочу организовать чтение с таблиц.
Данные в таблице однобайтные.
адрес начала массива - это идентификатор массива, вам уже говорили. в чем смысл выверта чтения массива через сторонний указатель, если индексная адресация массива принципиально ничем не отличается?!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Результат тот-же. -( error: #144: a value of type "const char *" cannot be used to initialize an entity of type "int *"
Или я совсем что-то не понимаю.
Не плохо -бы увидеть пример с комментариями.
optima писал(а):int* lab = tab1;
int *lab = tab1;
Разницы не замечаешь?
а она есть?
компилятору не нравится, что тип указателей разный. лично мне не очевидно, что если есть квалификатор const, то это массив во flash, и не только мне не очевидно - по стандарту Си const не несет этого смысла. но видимо компилятор ваш считает иначе, поэтому надо присваивать адрес массива указателю соответствующего типа:
Да всё там очевидно...
const там не при чём... Тривиальное приведение типов... что отрицалось несколько постов назад... а зря...
Пример есть на прошлой странице... только uint32_t поменять на uint8_t...
И вообще... во избежание непоняток всегда вместо стандартных определений нужно использовать переопределения... типа uint8_t, uint32_t и т.д. ... Почитайте MISRA...
"Я не даю готовых решений, я заставляю думать!"(С)
int arr[3] = {1,2,3};
char *chat_ptr;
int *int_ptr;
long *long_ptr;
int_ptr = arr;
char_ptr = arr;
long_ptr = arr;
все это очевидно правильно с токи зрения стандарта Си. хотя варнинги (не ошибки!) обязаны быть на последнюю и предпоследнюю строки. а вот то, что у кого-то возникает ошибка, а не варнинг - это уже не очевидно.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Массив константный, по этому компилятор не имеет права присвоить его адрес указателю на неконстанту. Ибо по этому указателю можно потом будет изменить значения. Отсюда указаетль должен быть тоже на константный чар.
Массив константный, по этому компилятор не имеет права присвоить его адрес указателю на неконстанту. Ибо по этому указателю можно потом будет изменить значения..
формально компилятор не должен так делать, т.к. "может быть изменено" и "будет изменено" - это разные вещи. это в С++ строгое соблюдение типов, а для Си должен быть варнинг.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Аlex писал(а):Массив константный, по этому компилятор не имеет права присвоить его адрес указателю на неконстанту.
Сам хоть понял... что написал???
const в данном случае - принадлежность к региону памяти...
Волатильность... да... данные могут быть волатильными, а указатель нет... Но если указать, то и указатель будет волатильным...
И вообще... что... ни у кого нет проекта под рукой под F103 в режиме симуляции??? Закинул и посмотрел... чего гадать...
Приведение же типов здесь важно... потому что Cortex может обращаться к данным как к байту, полуслову и слову... здесь наобум не прокатит...
"Я не даю готовых решений, я заставляю думать!"(С)
ARV писал(а):формально компилятор не должен так делать, т.к. "может быть изменено" и "будет изменено" - это разные вещи
Т.е. компилятор может спокойно дать записать адрес на константу в казатель, указывающий на неконстантную переменную ? А потом будет отслеживать, что и в какой момент записано в этом указателе и не давать изменять данные по нему ?
Не кажется это странным ? Проще запретить такую возможность и всё.
HHIMERA писал(а):Сам хоть понял... что написал???
Конечно понял. Если ты прочитаешь это ещё несколько раз, может и ты поймёшь
HHIMERA писал(а):const в данном случае - принадлежность к региону памяти...
Причём тут регион памяти ? Давно ли этот квалификатор имел отношения к определённой области памяти ? Естественно, не учитывая всякие фишки конкретных компиляторов.
HHIMERA писал(а):Приведение же типов здесь важно...
Приведение типов везде важно. Никто не говорит, что проблема у ТС'а конкретно в константах. Это всего-лишь одна из его ошибок.