реклама на сайте
подробности

 
 
12 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> Как в си объявить массив с возможностью изменения его размера?
011119xx
сообщение Jul 7 2011, 03:36
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544



Необходимо в Кейле объявить массив без указания его размера. А потом по необходимости использования массива задать размер в зависимости от условий. Можно ли это сделать на си и как?
Go to the top of the page
 
+Quote Post
V_G
сообщение Jul 7 2011, 04:17
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



За Кейл не скажу, а в Винде делал указатель на указатель (**)
Go to the top of the page
 
+Quote Post
ukpyr
сообщение Jul 7 2011, 04:44
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1 264
Регистрация: 17-06-08
Из: бандустан
Пользователь №: 38 347



без выделения памяти - никак, объявите массив максимальной емкости и переменную с текущим размером.
с выделением памяти через malloc/free - при каждом изменении размера в большую сторону нужно выделять новый массив, копировать содержимое старого и освобождать старый, в меньшую - изменять переменную с текущим размером

Сообщение отредактировал ukpyr - Jul 7 2011, 04:45
Go to the top of the page
 
+Quote Post
XVR
сообщение Jul 7 2011, 05:55
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



В C99 можно задать размер массива в момент его описания (через переменную). Так же можно выделить массив на стеке, через alloca. Что из этого поддерживает Keil мне неведомо sm.gif
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jul 7 2011, 07:00
Сообщение #5


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(011119xx @ Jul 7 2011, 08:36) *
А потом по необходимости использования массива задать размер в зависимости от условий.

Си же вроде не контролирует индексацию внутри массивов. Значит реальный размер массива ему "до лампочки". Лишь бы размер был больше константной индексации.
Поэтому имхо вопрос заключается в создании указателя на пустой массив, потом по ходу проги присваивание указателю адреса (на статик, динамик или прочий буфер) и хранение размера массива во второй целочисленной переменной.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
011119xx
сообщение Jul 7 2011, 08:27
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544



Не могли бы привести код в качестве примера?
Go to the top of the page
 
+Quote Post
skripach
сообщение Jul 7 2011, 13:49
Сообщение #7


■ ■ ■ ■
*****

Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443



Цитата
Как в си объявить массив с возможностью изменения его размера?

Никак. ..остальное изврат.
Использовать динамическое выделение памяти и указатель.


--------------------
Делай что должен и будь что будет.
Go to the top of the page
 
+Quote Post
011119xx
сообщение Jul 8 2011, 07:27
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544



Цитата(GetSmart @ Jul 7 2011, 13:00) *
Поэтому имхо вопрос заключается в создании указателя на пустой массив, потом по ходу проги присваивание указателю адреса (на статик, динамик или прочий буфер) и хранение размера массива во второй целочисленной переменной.

В данном случае это должно быть как-то так?
Код
uint16_t Buffer[];
uint16_t *ptr_buffer;
uint16_t index_buffer;
uint16_t value;

void main(void)
{
ptr_buffer = &Buffer;
index_buffer = 32;
value = ptr_buffer + 32;
}

Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 8 2011, 07:53
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (011119xx @ Jul 8 2011, 10:27) *
В данном случае это должно быть как-то так?

Абсолютный ужас. Полное непонимание не только языка, но и собственно физического смысла творимого sad.gif
НЕМЕДЛЕННО! Бросить "программировать" и ЧИТАТЬ учебники, иначе дальше без осознания хоть какой-то основы будет только хуже.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jul 8 2011, 08:01
Сообщение #10


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(011119xx @ Jul 7 2011, 08:36) *
Необходимо в Кейле объявить массив без указания его размера. А потом по необходимости использования массива задать размер в зависимости от условий. Можно ли это сделать на си и как?

Приведите пример того, что хотите делать с массивом (использование массива). Для начала для массива константного размера.
Я покажу как это сделать с массивом переменной длины.

Не слушайте zltigo. У него плохое настроение sm.gif


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
jorikdima
сообщение Jul 8 2011, 08:01
Сообщение #11


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280



Цитата(zltigo @ Jul 8 2011, 11:53) *
Абсолютный ужас. Полное непонимание не только языка, но и собственно физического смысла творимого sad.gif
НЕМЕДЛЕННО! Бросить "программировать" и ЧИТАТЬ учебники, иначе дальше без осознания хоть какой-то основы будет только хуже.

Поддержу, пожалуй.
Go to the top of the page
 
+Quote Post
XVR
сообщение Jul 8 2011, 08:05
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(zltigo @ Jul 8 2011, 11:53) *
Абсолютный ужас. Полное непонимание не только языка, но и собственно физического смысла творимого sad.gif

bb-offtopic.gif
Публичный дом, молодая проститутка выбегает из номера клиента в растрепанных чувствах и с воплями
- УЖАС, УЖАС, УЖАС!!!!
Мадам успокаивает проститутку и сама идет к клиенту. Через некоторое время выходит, и говорит
- Ну да, ну ужас. Ну уж никак не УЖАС, УЖАС, УЖАС!
Go to the top of the page
 
+Quote Post
011119xx
сообщение Jul 8 2011, 08:06
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544



Не много поправлюсь:
Код
uint16_t Buffer[50];
uint16_t *ptr_buffer;
uint16_t index_buffer;
uint16_t value;

void main(void)
{
ptr_buffer = &Buffer;
index_buffer = 32;
Buffer[index_buffer] = 0х0010;
value = *(ptr_buffer + index_buffer);
}


Это работает. Но это вариант с явным указанием размера буфера при объявлении. Я так понял иначе и нельзя.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jul 8 2011, 08:14
Сообщение #14


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(jorikdima @ Jul 8 2011, 13:01) *
Поддержу, пожалуй.

Если у форума одна из задач - интерактивное обучение, естественно в такой форме чтобы у вопрошающего не отбивалось желание вообще заниматься, то это не лучший подход. Старческое брюзжание. Представьте такого человека в роли препода в любом заведении и учиться сразу расхочется.

Ветка называется "в помощь начинающему". Расслабьтесь, профи sm.gif

Цитата(011119xx @ Jul 8 2011, 13:06) *
Код
...

слегка подправил:
Код
void main(void)
{
ptr_buffer = &Buffer;
index_buffer = 32;
ptr_buffer[index_buffer] = 0х0010;
value = ptr_buffer[index_buffer];
}


Цитата
Это работает. Но это вариант с явным указанием размера буфера при объявлении. Я так понял иначе и нельзя.

Иначе буферов может быть много и разных. Хоть с заданным размером на этапе компиляции, хоть с неявным, выделенным в динамической памяти (куче).
И по ходу проги, одному общему указателю (ptr_buffer) можно присваивать разные адреса (адреса разных буферов). Тогда один общий алгоритм будет фактически "шарить" по разным буферам. Частный случай переменной-указателя - параметр функции.

Сообщение отредактировал GetSmart - Jul 8 2011, 16:21


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 8 2011, 08:27
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (011119xx @ Jul 8 2011, 11:06) *
Не много поправлюсь:

Ничего себе немного - каждой строчке были ошибки, поменяли все строчки, кроме одной:
CODE
ptr_buffer = &Buffer;

В этой, естественно осталась полная лажа, посему вот это:
QUOTE
Это работает.

Неправда.

При всем этом попытались исправить (но не исправили) только формальные ошибки не позволявшие сие даже скомпилировать.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
011119xx
сообщение Jul 8 2011, 08:29
Сообщение #16


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544



Не ожидал господа от вас таких ответов. Извините, если чем то разозлил. Но последний код, который я привел, работает. Можете хоть головой об стенку биться
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jul 8 2011, 08:30
Сообщение #17


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Может автор ветки откроет великую тайну, зачем ему понадобились массивы переменной длины? Так, для нашего понимания.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 8 2011, 08:43
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (GetSmart @ Jul 8 2011, 11:14) *
Если у форума одна из задач - интерактивное обучение

Задачи обучения ставят, как в младшей ясельной группе детского сада, так и в Аспирантуре. Весь вопрос в том, как позиционировать этот форум, как ясельную группу, или хотя-бы как начальную школу?


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jul 8 2011, 08:45
Сообщение #19


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(011119xx @ Jul 8 2011, 14:06) *
Это работает. Но это вариант с явным указанием размера буфера при объявлении. Я так понял иначе и нельзя.


Есть ещё вариант. Стандарт C99 поддерживает автоматические переменные-массивы переменной длины:
Код
int mean_of_N_samples(int N)
{
    int arr[N];
    for (int i = 0; i < N; i++)
    {
        arr[i] = get_sample();
    }
    return mean(arr, N);
}

Массив (обычно) создаётся на стеке. То есть, если вам ваш массив переменной длины нужен временно, то это отличный вариант.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
011119xx
сообщение Jul 8 2011, 08:49
Сообщение #20


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544



Например в шрифте символы имеют разную ширину при одинаковой высоте. При перемножении ширины на высоту получаем массив, причем его размер меняется в зависимости от ширины символа.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jul 8 2011, 08:53
Сообщение #21


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(011119xx @ Jul 8 2011, 11:49) *
Например в шрифте символы имеют разную ширину при одинаковой высоте. При перемножении ширины на высоту получаем массив, причем его размер меняется в зависимости от ширины символа.


Вы собираетесь шрифт динамически генерить из, например, true type, или собираетесь использовать готовый? В готовом уже все в массивах лежит.

Пример не катит.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jul 8 2011, 08:55
Сообщение #22


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(011119xx @ Jul 8 2011, 13:49) *
Например в шрифте символы имеют разную ширину при одинаковой высоте. При перемножении ширины на высоту получаем массив, причем его размер меняется в зависимости от ширины символа.

Для работы понадобится указатель на один элемент массива (первый) и один или несколько переменных-описалово данных внутри массива.
С указателем, как я уже подкорректировал внутри CODE можно работать как с массивом.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 8 2011, 08:55
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (011119xx @ Jul 8 2011, 11:29) *
Можете хоть головой об стенку биться

Биться головой о стенку, причем дооолго и безрезультатно предстоит Вам, ибо при таком подходе к делу (думать не будем, учиться понимать язык не будем, будем сразу "программировать") это неизбежно sad.gif.
Утверждать, Вы можете, что угодно, но приведенная мною Ваша строчка
CODE
uint16_t Buffer[50];
uint16_t *ptr_buffer;
.....
ptr_buffer = &Buffer;

не имеет право даже быть откомпилированной.
Ибо бред. И тут уж либо так
ptr_buffer = &Buffer[0];
либо так:
ptr_buffer = Buffer;


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jul 8 2011, 09:00
Сообщение #24


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(GetSmart @ Jul 8 2011, 11:55) *
Для работы понадобится указатель на один элемент массива (первый) и один или несколько переменных-описалово данных внутри массива.
С указателем, как я уже подкорректировал внутри CODE можно работать как с массивом.


Вы, надеюсь, понимаете, что ваш подход, кроме изврата, ничего не содержит? Если в вашей функции виден сам массив, на кой лишний указатель и ненужная переменная, в качестве индекса?
Go to the top of the page
 
+Quote Post
011119xx
сообщение Jul 8 2011, 09:00
Сообщение #25


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544



Это
Код
ptr_buffer = &Buffer;

как раз и заносит в указатель адрес нулевого элемента массива.
Код
ptr_buffer = &Buffer;

и
Код
ptr_buffer = &Buffer[0];

одно и тоже biggrin.gif
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jul 8 2011, 09:05
Сообщение #26


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(zltigo @ Jul 8 2011, 13:55) *
...
Ибо бред.

А почему сразу бред? А проверить?

А почему не УЖАС, УЖАС, УЖАС!!! ??? sm.gif

Сообщение отредактировал GetSmart - Jul 8 2011, 09:07


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 8 2011, 09:08
Сообщение #27


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (011119xx @ Jul 8 2011, 12:00) *
Это
CODE
ptr_buffer = &Buffer;

как раз и заносит в указатель адрес нулевого элемента массива.
CODE
ptr_buffer = &Buffer;

Разумеется нет. "это" бессмысленное выражение которое любой вменяемый компилятор обязан послать нафиг.



--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
011119xx
сообщение Jul 8 2011, 09:09
Сообщение #28


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544



Цитата(sergeeff @ Jul 8 2011, 15:00) *
Вы, надеюсь, понимаете, что ваш подход, кроме изврата, ничего не содержит? Если в вашей функции виден сам массив, на кой лишний указатель и ненужная переменная, в качестве индекса?

Дело в том что когда я читаю ширину и высоту символа мне нужно создать массив размером = ширина*высота и в этот массив скопировать некую картинку такого размера. Это скажем так: фон для символа. Потом в этот массив копируется сам символ, но при этом затирает только очертания символа. Потом из этого массива данные выводятся в дисплей

Цитата(zltigo @ Jul 8 2011, 15:08) *
Разумеется нет. "это" бессмысленное выражение которое любой вменяемый компилятор обязан послать нафиг.

Да ну вас! Ни один компилятор никогда не посылал.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jul 8 2011, 09:11
Сообщение #29


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(011119xx @ Jul 8 2011, 12:00) *
Это
Код
ptr_buffer = &Buffer;

как раз и заносит в указатель адрес нулевого элемента массива.
Код
ptr_buffer = &Buffer;

и
Код
ptr_buffer = &Buffer[0];

одно и тоже biggrin.gif


Хоть меня частенько критикуют за любовь к печатным изданиям, но вам, любезный, книги надобно почитать.
Если объявлен массив abc[10], то

abc - это указатель на массив и его значение в точности равно адресу первого элемента, т.е. &abc[0]. А &abc - дает адрес указателя на массив, что, согласитесь, совсем не то, что вы хотите получить и использовать.

на что вам и указал уважаемый zltigo.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jul 8 2011, 09:11
Сообщение #30


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(011119xx @ Jul 8 2011, 15:08) *
Дело в том что когда я читаю ширину и высоту символа мне нужно создать массив размером = ширина*высота и в этот массив скопировать некую картинку такого размера.
...
Потом из этого массива данные выводятся в дисплей


Вы случайно в пылу полемики не пропустили мой пост (№19)? sm.gif По идее как раз подходит.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 8 2011, 09:11
Сообщение #31


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (GetSmart @ Jul 8 2011, 12:05) *
А почему сразу бред? А проверить?

Что проверить? Что указатель на int не является кирпичом?
QUOTE
А почему не УЖАС, УЖАС, УЖАС!!! ??? sm.gif

Потому,что я это уже сказал ранее.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jul 8 2011, 09:18
Сообщение #32


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(011119xx @ Jul 8 2011, 14:09) *
Дело в том что когда я читаю ширину и высоту символа мне нужно создать массив размером = ширина*высота и в этот массив скопировать некую картинку такого размера. Это скажем так: фон для символа. Потом в этот массив копируется сам символ, но при этом затирает только очертания символа. Потом из этого массива данные выводятся в дисплей

Так создайте сразу статичный массив с размером под максимально большой символ, который потребуется. При работе с малыми символами конец массива использоваться не будет. Велика беда. Иначе можно выделять место в стеке, как предлагал AHTOXA.

Цитата(zltigo @ Jul 8 2011, 14:11) *
Потому,что я это уже сказал ранее.

Так это были Вы? sm.gif


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jul 8 2011, 09:19
Сообщение #33


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(GetSmart @ Jul 8 2011, 12:13) *
Так создайте сразу статичный массив с размером под максимально большой символ, который потребуется. При работе с малыми символами конец массива использоваться не будет. Велика беда. Иначе можно выделять место в стеке, как предлагал AHTOXA.


Да уж, прав наш гуру zltigo, надо бы все-таки, научиться голову включать. На кой нужен этот вспомогательный массив автору топика? Маску наложить на байт из массива? Ту и кто мешает это делать при побайтном копировании тела буквы на дисплей?
Go to the top of the page
 
+Quote Post
011119xx
сообщение Jul 8 2011, 09:20
Сообщение #34


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544



Цитата(AHTOXA @ Jul 8 2011, 15:11) *
Вы случайно в пылу полемики не пропустили мой пост (№19)? sm.gif По идее как раз подходит.

Не пропустил. Спасибо. Хороший вариант. Буду пробовать
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jul 8 2011, 09:30
Сообщение #35


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(sergeeff @ Jul 8 2011, 14:11) *
А &abc - дает адрес указателя на массив, что, согласитесь, совсем не то, что вы хотите получить и использовать.

на что вам и указал уважаемый zltigo.

Право, какая глупость. Это что за адрес несуществующего "указателя" на массив?


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
011119xx
сообщение Jul 8 2011, 09:35
Сообщение #36


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544



Цитата(GetSmart @ Jul 8 2011, 15:18) *
Так создайте сразу статичный массив с размером под максимально большой символ, который потребуется. При работе с малыми символами конец массива использоваться не будет. Велика беда.

Сейчас так и делаю... А если у меня не один шрифт? Выделять буфер размером с самый большой символ самого крупного шрифта? Это весьма расточительно будет. Представьте символ высотой 40 и шириной 35. На каждый цвет приходится 16 бит. Получаем буфер 2800 байт. Причем большой шрифт будет использоваться очень редко, а память будет потрачена.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jul 8 2011, 09:37
Сообщение #37


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(GetSmart @ Jul 8 2011, 13:30) *
Право, какая глупость. Это что за адрес несуществующего "указателя" на массив?


Что вы подразумеваете под несуществующим указателем на массив?
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jul 8 2011, 09:42
Сообщение #38


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(011119xx @ Jul 8 2011, 14:35) *
Причем большой шрифт будет использоваться очень редко, а память будет потрачена.

В стеке нужно будет иметь гарантированно нужный объём памяти при самом наихудшем случае. А вдруг не хватит? В статике же один раз выделил и не напрягаешься. По этому поводу есть рассуждения в умных книжках.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
011119xx
сообщение Jul 8 2011, 09:44
Сообщение #39


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544



Цитата(AHTOXA @ Jul 8 2011, 14:45) *
Есть ещё вариант. Стандарт C99 поддерживает автоматические переменные-массивы переменной длины:
Код
int mean_of_N_samples(int N)
{
    int arr[N];
    for (int i = 0; i < N; i++)
    {
        arr[i] = get_sample();
    }
    return mean(arr, N);
}

Массив (обычно) создаётся на стеке. То есть, если вам ваш массив переменной длины нужен временно, то это отличный вариант.

В данном случае массив объявляется внутри функции. Мне нужно чтобы массив был глобальным, он потом используется в другой функции.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jul 8 2011, 09:45
Сообщение #40


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(sergeeff @ Jul 8 2011, 14:37) *
Что вы подразумеваете под несуществующим указателем на массив?

Код
u16 abc[10];
void *p;

main()
{
p = &abc;
...
}

Чему равен p?
Цитата
А &abc - дает адрес указателя на массив

Что такое адрес указателя на массив?


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
vvs157
сообщение Jul 8 2011, 09:47
Сообщение #41


Профессионал
*****

Группа: Свой
Сообщений: 1 526
Регистрация: 8-04-05
Пользователь №: 3 960



Цитата(ukpyr @ Jul 7 2011, 08:44) *
без выделения памяти - никак, объявите массив максимальной емкости и переменную с текущим размером.
с выделением памяти через malloc/free - при каждом изменении размера в большую сторону нужно выделять новый массив, копировать содержимое старого и освобождать старый, в меньшую - изменять переменную с текущим размером
А чем realloc не устраивает?
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jul 8 2011, 09:49
Сообщение #42


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(GetSmart @ Jul 8 2011, 13:42) *
В стеке нужно будет иметь гарантированно нужный объём памяти при самом наихудшем случае. А вдруг не хватит? В статике же один раз выделил и не напрягаешься. По этому поводу есть рассуждения в умных книжках.


Мы давайте "заср...м" глобальным массивом дефицитную память процессора, а пользоваться им будем где-то в процедуре. А кто мешает в этой самой функции объявлять такой же массив (если стека хватает)? Хотя я писал уже, что в данной задаче и массив то этот не нужен вовсе.

А по поводу &abc можете почитать у отцов основателей http://www.realcoding.net/article/view/1094

Цитата
Что такое адрес указателя на массив?


Указатель лежит в памяти. Адрес указателя - это адрес этой памяти.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jul 8 2011, 09:55
Сообщение #43


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(sergeeff @ Jul 8 2011, 14:49) *
А по поводу &abc можете почитать у отцов основателей http://www.realcoding.net/article/view/1094

Не читал, но осуждаю sm.gif
Но на элементарный вопрос не ответить - надо уметь.

Цитата(sergeeff @ Jul 8 2011, 14:49) *
Хотя я писал уже, что в данной задаче и массив то этот не нужен вовсе.

В названии топика есть вопрос. На него и отвечаем. Остальное вторично. Тем более, кто сказал, что память дефицитная. Если подобный массив в стеке будет только в одном месте выделяться, то статичный вариант лучше во всех отношениях. Точнее, если такая квазидинамическая память больше в программе не используется.

Сообщение отредактировал GetSmart - Jul 8 2011, 09:56


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
vvs157
сообщение Jul 8 2011, 10:02
Сообщение #44


Профессионал
*****

Группа: Свой
Сообщений: 1 526
Регистрация: 8-04-05
Пользователь №: 3 960



Цитата(GetSmart @ Jul 8 2011, 13:45) *
Чему равен p?
Вообще-то в случае обявленного массива array[n] указатель &array, скорее всего будет равен указателю array. Скорее всего - потому что зависит от реализации компилятора. Но пользоваться этим очень плохо, так как в случае динамичесого массива, созданного через calloc/malloc это точно будет не так.
Go to the top of the page
 
+Quote Post
skripach
сообщение Jul 8 2011, 10:08
Сообщение #45


■ ■ ■ ■
*****

Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443



Цитата
А по поводу &abc можете почитать у отцов основателей http://www.realcoding.net/article/view/1094

От туда:
Цитата
Операция & применима только к переменным и элементам массива,

abc есть константа. Не? 05.gif
UPD:
Т.е. запись &abc просто нелогична, ну как получить адрес адреса.


--------------------
Делай что должен и будь что будет.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jul 8 2011, 10:15
Сообщение #46


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(vvs157 @ Jul 8 2011, 15:02) *
.. в случае динамичесого массива, созданного через calloc/malloc это точно будет не так.

Потому как это совершенно разные вещи. Динамического массива в виде идентификатора не существует, существует указатель на него или просто пустой указатель. А это уже совсем другая история. Адрес функции, кстати, тоже можно брать через амперсанд, и у неё к сожалению или счастью нет индекса.

Цитата(skripach @ Jul 8 2011, 15:08) *
UPD:
Т.е. запись &abc просто нелогична, ну как получить адрес адреса.

Однако, компиляторописатели (хвала аллаху, что zltigo не из них) думают, что логична. Т.к. результат - всегда адрес. И глаз программера этот амперсанд так же примечает.

Сообщение отредактировал GetSmart - Jul 8 2011, 10:16


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
vvs157
сообщение Jul 8 2011, 10:21
Сообщение #47


Профессионал
*****

Группа: Свой
Сообщений: 1 526
Регистрация: 8-04-05
Пользователь №: 3 960



Цитата(GetSmart @ Jul 8 2011, 14:15) *
Потому как это совершенно разные вещи.
Но вот именно поэтому в C++ фокус с ссылкой на адрес статического элемента уже не прокатит
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 8 2011, 10:23
Сообщение #48


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (GetSmart @ Jul 8 2011, 12:45) *
void *p;
}

Замените КАК ЭТО СДЕЛАНО В ПЕРВОИСТОЧНИКЕ:

u16 *p

И компилятор ответит, что он думает "Чему равен p"


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
vvs157
сообщение Jul 8 2011, 10:24
Сообщение #49


Профессионал
*****

Группа: Свой
Сообщений: 1 526
Регистрация: 8-04-05
Пользователь №: 3 960



Цитата(GetSmart @ Jul 8 2011, 14:15) *
Однако, компиляторописатели (хвала аллаху, что zltigo не из них) думают, что логична.
Это очень стремная радость. В один прекрасный момент решат, что это не "по фен-шую" и количество головной боли у тех, кто пользуется подобными недокументированными фичами будет весьма велико.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jul 8 2011, 10:28
Сообщение #50


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(zltigo @ Jul 8 2011, 15:23) *
Замените КАК ЭТО СДЕЛАНО В ПЕРВОИСТОЧНИКЕ:

u16 *p

И компилятор ответит, что он думает "Чему равен p"

Адресу массива, не сомневайтесь.
Но согласитесь, на УЖАС, УЖАС, УЖАС это не тянет. Так, мелкое хулиганство sm.gif
Причём меньшее, чем не посылка NAK в протоколе I2C.

Сообщение отредактировал GetSmart - Jul 8 2011, 10:29


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jul 8 2011, 10:32
Сообщение #51


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(vvs157 @ Jul 8 2011, 14:24) *
Это очень стремная радость. В один прекрасный момент решат, что это не "по фен-шую" и количество головной боли у тех, кто пользуется подобными недокументированными фичами будет весьма велико.


А самое главное зачем писать неправильную и более длинную конструкцию

Код
char abc[10];
char *p = &abc;


вместо короткой и правильной

Код
char abc[10];
char *p = abc;

Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 8 2011, 10:40
Сообщение #52


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (GetSmart @ Jul 8 2011, 13:15) *
Однако, компиляторописатели (хвала аллаху, что zltigo не из них) думают, что логична. Т.к. результат - всегда адрес. И глаз программера этот амперсанд так же примечает.

Хвала Аллаху, что у компиляторописателей голова растет не из ануса, посему на это:
CODE
u16 abc[10];
u16 *p;

main()
{
p = &abc;
...
}

компиляторрописатели IAR:
Error[Pe513]: a value of type "u16 (*)[10]" cannot be assigned to an entity of type "u16 *"

а это для разгообразия PowerCraft:
(139): operands of = have illegal types `pointer to u16' and `pointer to array 10 of u16t'

Реагируют посылкой в анус того, кто так пишет.

QUOTE (GetSmart @ Jul 8 2011, 13:28) *
Адресу массива, не сомневайтесь.

Разуваем глаза и смотрим на вышенаписанное.
QUOTE
Но согласитесь, на УЖАС, УЖАС, УЖАС это не тянет. Так, мелкое хулиганство sm.gif

Не соглашусь, однако.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jul 8 2011, 10:41
Сообщение #53


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(zltigo @ Jul 8 2011, 15:34) *
Хвала Аллаху, что у компиляторописателей голова растет не из ануса, посему на это:
...
Реагируют посылкой в анус того, кто так пишет.

Но всё-таки она вертится!?
Ведь результат &mass является адресом массива, хоть и с другими атрибутами, чем первый его элемент. Чтобы не париться, его всегда можно присвоить нетипизированному указателю. И это работает не только с массивами, но и с записами, юнионами, функциями и возможно ещё что упустил.
Очень интересная новость после стольких лет...

Сообщение отредактировал GetSmart - Jul 8 2011, 10:45


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jul 8 2011, 10:41
Сообщение #54


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(011119xx @ Jul 8 2011, 15:44) *
В данном случае массив объявляется внутри функции. Мне нужно чтобы массив был глобальным, он потом используется в другой функции.

Если нужен глобальный, то объявляйте максимально возможного размера и не парьтесь. Это будет самый простой и надёжный вариант. Он гарантирует, что памяти хватит на самый большой шрифт, и при этом не использует динамического распределения памяти.
Ведь вам в любом случае нужно иметь память под самый большой шрифт, пусть она сразу и будет выделена.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 8 2011, 10:44
Сообщение #55


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (sergeeff @ Jul 8 2011, 13:32) *
вместо короткой и правильной

Более длинная и что важно, тоже правильная конструкция:
char *p = &abc[0];
может быть применена для подчеркивания того факта, что abc это массив. Иногда такое бывает удобно при быстром чтении.



--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jul 8 2011, 10:47
Сообщение #56


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(AHTOXA @ Jul 8 2011, 14:41) *
Если нужен глобальный, то объявляйте максимально возможного размера и не парьтесь. Это будет самый простой и надёжный вариант. Он гарантирует, что памяти хватит на самый большой шрифт, и при этом не использует динамического распределения памяти.
Ведь вам в любом случае нужно иметь память под самый большой шрифт, пусть она сразу и будет выделена.


Ну ну. Сегодня шрифт такой, завтра шеф (заказчик) запросит другой. Ну хоть проверку на размерность массива вставьте!
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 8 2011, 10:48
Сообщение #57


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (GetSmart @ Jul 8 2011, 13:41) *
Но всё-таки она вертится!?
Ведь результат &mass является адресом массива, хоть и с другими атрибутами, чем первый его элемент.

Что значит "вертится" и "является адресом", если компиляторы ВЫВАЛИВАЕТСЯ с ошибкой и соответственно НЕ генерят никакого кода?
Кто здесь пытается вертеться, как уж на сковородке, видно невооруженным взглядом sad.gif.
QUOTE
И это работает не только...

Это не работает. Как там было у Задорнова - "Пива нет. СОВСЕМ нет!" - СОВСЕМ не раболтает. О чем я сразу и написал увидя этo:
CODE
uint16_t Buffer[50];
uint16_t *ptr_buffer;
.....
ptr_buffer = &Buffer;

Именно ЭТО увидел и именно об ЭТОМ а не чем-то другом написал.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
andron86
сообщение Jul 8 2011, 10:48
Сообщение #58


Местный
***

Группа: Участник
Сообщений: 406
Регистрация: 1-03-06
Пользователь №: 14 821



Цитата(sergeeff @ Jul 8 2011, 11:49) *
Указатель лежит в памяти. Адрес указателя - это адрес этой памяти.

:-))) Цитата из Вашей ссылки

Цитата
Очевидно существует очень тесное соответствие между ин-
дексацией и арифметикой указателей. в действительности ком-
пилятор преобразует ссылку на массив в указатель на начало
массива. В результате этого имя массива является указатель-
ным выражением. Отсюда вытекает несколько весьма полезных
следствий. Так как имя массива является синонимом местополо-
жения его нулевого элемента, то присваивание PA=&A[0] можно
записать как

PA = A


По моему Вы и zltigo сомневались и учебники читать отправляли.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jul 8 2011, 10:52
Сообщение #59


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(zltigo @ Jul 8 2011, 15:48) *
Кто здесь пытается вертеться, как уж на сковородке, видно невооруженным взглядом sad.gif.

Это смотря какой вопрос. То, что было изначально у ТС я не утверждал, что компилируется (вообще). Но то, что амперсанд можно применять ко многим объектам, включая массивы, и результат будет предсказуем, то бишь равен адресу объекта - я ещё раз повторяю. Если я уж, то сижу спокойно, в центре сковородки sm.gif


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jul 8 2011, 10:55
Сообщение #60


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(andron86 @ Jul 8 2011, 13:48) *
По моему Вы и zltigo сомневались и учебники читать отправляли.


Вы это к чему? Там же ниже прямо написано

Цитата
конструкции типа
A=PA или A++,или P=&A будут незаконными.


Чего вы мне хотели сказать?
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jul 8 2011, 10:55
Сообщение #61


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(sergeeff @ Jul 8 2011, 16:47) *
Ну ну. Сегодня шрифт такой, завтра шеф (заказчик) запросит другой. Ну хоть проверку на размерность массива вставьте!
Вы о чём? Речь идёт о задании размера во время компиляции/линковки. Если не хватит памяти под новый шрифт, то линкер обругается, вот и проверка.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jul 8 2011, 10:56
Сообщение #62


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(zltigo @ Jul 8 2011, 15:48) *
Это не работает. Как там было у Задорнова - "Пива нет. СОВСЕМ нет!"

Преобразования типов нет. СОВСЕМ НЕТ! © zltigo
С сегодняшнего дня типизированные указатели не могут присваиваться к другим типизированным указателям. Аминь.

Upd.
zltigo, Вы верите, что void *p можно присвоить адрес любого типа? Даже так p = &mass. Это что, незаконно? СОВСЕМ?
Вобщем если пива нет, но очень хочется, то пиво есть sm.gif

Сообщение отредактировал GetSmart - Jul 8 2011, 11:14


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
andron86
сообщение Jul 8 2011, 10:57
Сообщение #63


Местный
***

Группа: Участник
Сообщений: 406
Регистрация: 1-03-06
Пользователь №: 14 821



Цитата(sergeeff @ Jul 8 2011, 12:55) *
Вы это к чему? Там же ниже прямо написано

Звиняюсь, & операцию у ТС не увидел :-(
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jul 8 2011, 11:04
Сообщение #64


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(AHTOXA @ Jul 8 2011, 13:55) *
Вы о чём? Речь идёт о задании размера во время компиляции/линковки. Если не хватит памяти под новый шрифт, то линкер обругается, вот и проверка.


Уважаемый. Вы понимаете про что говорите? Статический массив автору был нужен для копирования тела символа. Где гарантия, что в другом шрифте, символы "влезут" в этот массив? Кто мешает использвать шрифт, с меньшим количеством используемых символов (т.е. сам шрифт может быть компактнее), но при этом сами символы крупнее. И что вам тут линкер скажет? Странное это программирование, основанное на предположениях и утверждениях "и так катит".
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jul 8 2011, 11:28
Сообщение #65


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(sergeeff @ Jul 8 2011, 17:04) *
Уважаемый. Вы понимаете про что говорите? Статический массив автору был нужен для копирования тела символа. Где гарантия, что в другом шрифте, символы "влезут" в этот массив?

А вы попробуйте для интереса иногда читать то, на что возражаете. Выделяем массив размера как максимальный символ. И всё. Размер этот известен на этапе компиляции.
Цитата(sergeeff @ Jul 8 2011, 17:04) *
Странное это программирование, основанное на предположениях и утверждениях "и так катит".
Это вы уже сами что-то себе выдумали, и доблестно с этим воюете. Грубите, кстати.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jul 8 2011, 11:47
Сообщение #66


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(AHTOXA @ Jul 8 2011, 14:28) *
А вы попробуйте для интереса иногда читать то, на что возражаете. Выделяем массив размера как максимальный символ. И всё. Размер этот известен на этапе компиляции.Это вы уже сами что-то себе выдумали, и доблестно с этим воюете. Грубите, кстати.


Это вы придумали такой вариант реализации системы, где шрифты подключаются на этапе сборки проекта. Откуда мне и вам знать, может они на SD карточке лежат?

А в чем грубость то? Объясните старику. Да, и не плохо бы примерчик, где линкер ругается на размер массива, в который вы собираетесь что то копировать.
Go to the top of the page
 
+Quote Post
sasamy
сообщение Jul 8 2011, 12:01
Сообщение #67


Знающий
****

Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858



Цитата(sergeeff @ Jul 8 2011, 13:11) *
Хоть меня частенько критикуют за любовь к печатным изданиям, но вам, любезный, книги надобно почитать.
Если объявлен массив abc[10], то

abc - это указатель на массив и его значение в точности равно адресу первого элемента, т.е. &abc[0]. А &abc - дает адрес указателя на массив, что, согласитесь, совсем не то, что вы хотите получить и использовать.


Вам бы самому хоть немного почитать. abc -- это указатель-константа которая равна адресу первого элемента массива с нулевым индексом, у константы не может быть адреса.
Go to the top of the page
 
+Quote Post
skripach
сообщение Jul 8 2011, 12:22
Сообщение #68


■ ■ ■ ■
*****

Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443



sasamy, поддержу.


--------------------
Делай что должен и будь что будет.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jul 8 2011, 12:35
Сообщение #69


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(sergeeff @ Jul 8 2011, 17:47) *
Это вы придумали такой вариант реализации системы, где шрифты подключаются на этапе сборки проекта. Откуда мне и вам знать, может они на SD карточке лежат?

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

Цитата(sergeeff @ Jul 8 2011, 17:47) *
А в чем грубость то? Объясните старику.

Фу-ты ну-ты. Я что, должен вас пожалеть? Давайте, раз вы старик, вы будете читать мои сообщения два раза, прежде чем отвечать на них, хорошо? И свои перед отправкой - тоже читайте. Потому что иначе получаются наезды не по существу.

Цитата(sergeeff @ Jul 8 2011, 17:47) *
Да, и не плохо бы примерчик, где линкер ругается на размер массива, в который вы собираетесь,что то копировать.

Код
int array[100500];

(предвидя придирки - на mega8)


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jul 8 2011, 13:12
Сообщение #70


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



http://chitay.org/c/04/0409.htm
upd. и еще оттуда
http://chitay.org/c/11/1105.htm

http://www.keil.com/support/man/docs/armcc...ef_bcfgjjhf.htm
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 8 2011, 13:31
Сообщение #71


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (GetSmart @ Jul 8 2011, 13:56) *
zltigo, Вы верите, что void *p можно присвоить адрес любого типа? Даже так p = &mass. Это что, незаконно? СОВСЕМ?
Вобщем если пива нет, но очень хочется, то пиво есть sm.gif

Хватит пытаться вертеться, о присвоении указателя на void. Речь не шла. Когда Вы пытаясь, как Вам кажется, "изящно" выкрутиться ПОДМЕНИЛИ в исходном тексте указатель на short указателем на void, я Вам сразу указал на это, Вы начали передергивать подсовывая другой заведомо глотаемый сишным компилятором вариант.
QUOTE
Вобщем если пива нет, но очень хочется, то пиво есть

Да, тогда такие, как Вы насцав а бокал делаете вид что лично Вы пьете пиво sad.gif. Все. Точка, шулер Вы наш sad.gif.


QUOTE (ViKo @ Jul 8 2011, 16:12) *

Со стеком или любым другим ДИНАМИЧЕСКИМ выделением памяти проблем, совершенно нет по определению. Единственно, что выделять фиг знает какой объем памяти в стеке явно не кошерно, посему остается естественное и контролируемое на ошибки динамическое выделение памяти из heap. Другое дело, что все идет к тому, что для данного случая просто все надо делать на лету, а не бездумно трясти пальму.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jul 8 2011, 13:42
Сообщение #72


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Ничё не сделал, только вошёл sm.gif И сразу мошенник.

Себя почитайте
Цитата(zltigo @ Jul 8 2011, 14:08) *
Цитата
как раз и заносит в указатель адрес нулевого элемента массива.
Код
ptr_buffer = &Buffer;

"это" бессмысленное выражение которое любой вменяемый компилятор обязан послать нафиг.

Вы заявили, что амперсанд применительно к массиву без индекса является бессмысленной операцией. Я же подправил, что она осмысленная, но малость не соответствует по типу указателя. Нельзя же так относиться к мелким ошибкам ТС - бред, бред! УЖАС, УЖАС, УЖАС!

Сообщение отредактировал GetSmart - Jul 8 2011, 13:55


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 8 2011, 14:28
Сообщение #73


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (GetSmart @ Jul 8 2011, 16:42) *
Себя почитайте

Не, для Вас, поскольку Вы даже не шулер, который таки-боится получить в реале канделябром по голове, а просто моральный урод sad.gif. Я себя почитаю:
CODE
uint16_t Buffer[50];
uint16_t *ptr_buffer;
.....
ptr_buffer = &Buffer;

не имеет право даже быть откомпилированной.
Ибо бред. И тут уж либо так
ptr_buffer = &Buffer[0];
либо так:
ptr_buffer = Buffer;

QUOTE (GetSmart)
А почему сразу бред? А проверить?


QUOTE (zltigo)
"это" бессмысленное выражение которое любой вменяемый компилятор обязан послать нафиг.
....
Что проверить? Что указатель на int не является кирпичом?


После этого GetSmart таки сам проверил и получив, как и было обещано отлуп о компилятора
Начал жульничать, заменив как ни всем ни бывало uint_16 *ptr_buffer на void *

QUOTE (GetSmart)
CODE
u16 abc[10];
void *p;

main()
{
p = &abc;
...
}


Однако, компиляторописатели (хвала аллаху, что zltigo не из них) думают, что логична.


На что ему было сразу указано:

QUOTE (zltigo)
Замените КАК ЭТО СДЕЛАНО В ПЕРВОИСТОЧНИКЕ:
u16 *p
И компилятор ответит, что он думает "Чему равен p"


То, что думают компиляторы было продемонстрировано:
QUOTE
компиляторрописатели IAR:
Error[Pe513]: a value of type "u16 (*)[10]" cannot be assigned to an entity of type "u16 *"

а это для разгообразия PowerCraft:
(139): operands of = have illegal types `pointer to u16' and `pointer to array 10 of u16t'

Реагируют посылкой в анус того, кто так пишет.


Дальше GertSmat, ведет себя совершенно ожидаемо и традиционно, как известной русской присказке про божью росу.
Надоело.

QUOTE
Нельзя же так относиться к мелким ошибкам ТС - бред, бред! УЖАС, УЖАС, УЖАС!

Приходится напоминать, что слова о бреде относились к исходнику ТС. Вот он полностью:
CODE
uint16_t Buffer[];
uint16_t *ptr_buffer;
uint16_t index_buffer;
uint16_t value;

void main(void)
{
ptr_buffer = &Buffer;
index_buffer = 32;
value = ptr_buffer + 32;
}

Могу только повторить, что кроме void main(void){ }
Все остальное или бред:
uint16_t Buffer[];
ptr_buffer = &Buffer;
value = ptr_buffer + 32;

либо, как uint16_t index_buffer; просто неразумность для ARM.
Это еще не касаясь осмысленности производимых действий sad.gif и
index_buffer = 32;

Если это "мелкие ошибки", то что тогда крупные sad.gif.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jul 8 2011, 14:46
Сообщение #74


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(zltigo @ Jul 8 2011, 19:28) *
Если это "мелкие ошибки", то что тогда крупные sad.gif.

Я уже писал - отсутствие NAK в протоколе I2C.

Вы как истеричка sm.gif
Вся соль в посте №72. Он почти неурезанный. И на этом я закончу.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jul 8 2011, 15:13
Сообщение #75


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(sasamy @ Jul 8 2011, 15:01) *
abc -- это указатель-константа которая равна адресу первого элемента массива с нулевым индексом, у константы не может быть адреса.
"Ой".

Утверждение "&abc это адрес указателя" неправильно, но и Вы что-то странное написали.
С «у константы не может быть адреса» можно согласиться, если определиться, что под словом «константа» имеется ввиду литерал.
const int ci = 5; // тоже ведь константа

abc -- это идентификатор массива, который в выражениях в большинстве случаев автоматически приводится к указателю на его первый элемент, т.е. к величине (включая как тип, так и значение), тождественной &abc[0].
Но не во всех.

sizeof(abc) даст размер массива в байтах, тогда как sizeof(&abc[0]) даст длину указателя.

&abc даст адрес массива, что и было продемонстрировано в приведенной выдаче компилятора.
(«кстати о птичках»™, в С нет многомерных массивов, есть одномерные массивы, включая массивы других одномерных массивов).
Численно он равен адресу первого элемента, но по типу отличается. Указатель на первый элемент даёт обращение к одному элменту, указатель на массив даёт обращение к массиву.
sizeof(* &abc) также даст размер массива в байтах.

Переменная ptr_abc_0, имеющая тот же тип, что и &abc[0], при инкременте будет увеличиваться на размер (с учётом выравнивания) элемента массива.

Переменная ptr_abc, имеющая тот же тип, что и &abc, будет увеличиваться на длину массива.


Цитата(GetSmart @ Jul 8 2011, 17:46) *
Вы как истеричка sm.gif
Вся соль в посте №72. Он почти неурезанный. И на этом я закончу.
Хм... А нужную-то цитату Вы и в своём сообщении привели.
Цитата(GetSmart @ Jul 8 2011, 16:42) *
Себя почитайте

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

Речь-то идёт не о применении & к имени массива, а о выражении, присвавающем результат переменной другого типа.

Цитата(zltigo @ Jul 8 2011, 12:08) *
Код
ptr_buffer = &Buffer;
Разумеется нет. "это" бессмысленное выражение которое любой вменяемый компилятор обязан послать нафиг.

Это
Код
double d;
float *pf = &d;
тоже «всего лишь слегка не совпадает по типу», не так ли? Но любой вменяемый компилятор тоже обязан послать нафиг.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jul 8 2011, 15:32
Сообщение #76


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(ReAl @ Jul 8 2011, 20:13) *
Речь-то идёт не о применении & к имени массива, а о выражении, присвавающем результат переменной другого типа.

Я к тому и вёл, что ТС взял адрес массива вместо адреса нулевого элемента массива. Причём адреса оба равны. Только типом отличаются и только компилятор руганётся на это. При использовании нетипизированных указателей (например в параметре функции) или при явном приведении типа (безусловно лучше без него, но...) программа заработает так, как и хотел ТС. Человек на начальном уровне знаком с Си и только истеричка будет так реагировать на его мелкие ошибки. Нельзя же при присваивании указателя на однин тип указателю на другой тип заявлять, что выражение бессмысленное!?

Сообщение отредактировал GetSmart - Jul 8 2011, 15:36


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
sasamy
сообщение Jul 8 2011, 15:41
Сообщение #77


Знающий
****

Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858



Цитата(ReAl @ Jul 8 2011, 19:13) *
"Ой".

Утверждение "&abc это адрес указателя" неправильно, но и Вы что-то странное написали.
С «у константы не может быть адреса» можно согласиться, если определиться, что под словом «константа» имеется ввиду литерал.
const int ci = 5; // тоже ведь константа


ууу... тут наверно книжки не помогут - не нужно изобретать своих определений, все уже определено без вас, в том числе термин "константа"

Цитата
In computer programming, a constant is an identifier whose associated value cannot typically be altered by the program during its execution (though in some cases this can be circumvented, e.g. using self-modifying code).


Хотя написал некорректно, смысл в том что имя массива это константа и под нее вообще не выделяется память, память выделяется для массива - никакого адреса поэтому не получить.

Сообщение отредактировал sasamy - Jul 8 2011, 16:02
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jul 8 2011, 16:02
Сообщение #78


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(AHTOXA @ Jul 8 2011, 16:35) *
Код
int array[100500];

(предвидя придирки - на mega8)


Перечитал 3 (три) раза. Круто. А магическую циферку 100500 надо, естественно, ручками вычислить, перед включением нового фонта? Если забыл это сделать, или описался (нолик пропустил, по случаю жаркой погоды)? Никто, ни компилятор, ни линкер, даже не колыхнутся, вам об этом любезно сообщить. И будете долго думать, чего это программа грохается.

Мораль - никакая это не диагностика. Тем более не диагностика этапа компиляции.

Нужно использовать, например, механизм static_assert, но это только под С++.

P.S. Это не придирки.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 8 2011, 16:41
Сообщение #79


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (sasamy @ Jul 8 2011, 18:41) *
ууу... тут наверно книжки не помогут

Конечно не помогут, тут надо головой думать, а не дергать общие определения из книг.
QUOTE
In computer programming, a constant is an identifier whose associated value cannot typically be altered by the program during its execution (though in some cases this can be circumvented, e.g. using self-modifying code).

А если подумать, то "константа" целиком и полностью подпадающая под это совершенно правильное и всеобъемлющее определение может оказаться:
- в RAM;
- в ROM;
- в регистре;
- являться частью операнда.
QUOTE
...смысл в том что имя массива это константа и под нее вообще не выделяется память

точно sm.gif значит имеется константа имеющая некоторое value, но оно НИГДЕ не хранится, только при необходимости святым духом появляется sm.gif. Так-что память выделяется, вопрос только в том, способен и обязан-ли компилятор выдавать адреса констант всегда и любых.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
sasamy
сообщение Jul 8 2011, 17:13
Сообщение #80


Знающий
****

Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858



Цитата(zltigo @ Jul 8 2011, 20:41) *
А если подумать


Бла, бла, бла - тут о массивах в С речь - это ясно ?

Цитата
точно sm.gif значит имеется константа имеющая некоторое value, но оно НИГДЕ не хранится, только при необходимости святым духом появляется sm.gif. Так-что память выделяется, вопрос только в том, способен и обязан-ли компилятор выдавать адреса констант всегда и любых.


Тоесть вы утверждаете, что при определении массива
char abc[10];
кроме 10 * sizeof(char) выделяется память для указателя abc ? Если да - потрудитесь привести пример, если нет то мне больше не о чем с вами говорить.

Сообщение отредактировал sasamy - Jul 8 2011, 17:14
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jul 8 2011, 17:31
Сообщение #81


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(sergeeff @ Jul 8 2011, 22:02) *
P.S. Это не придирки.

Это именно что придирки. Речь шла не о проверке компилятором того, что программист правильно указал размер массива, а о проверке компилятором того, что под указанный программистом размер массива хватит памяти. Вот вам цитата из моего сообщения (к которому вы придрались изначально):
Цитата(AHTOXA @ Jul 8 2011, 16:41) *
Если нужен глобальный, то объявляйте максимально возможного размера и не парьтесь. Это будет самый простой и надёжный вариант. Он гарантирует, что памяти хватит на самый большой шрифт, и при этом не использует динамического распределения памяти.
Ведь вам в любом случае нужно иметь память под самый большой шрифт, пусть она сразу и будет выделена.

Почитайте раз пять, для надёжности. И если вдруг возникнет желание ещё что-то написать, то подумайте ещё немного, и не делайте этого, хватит уже позориться, на старости-то летsm.gif


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jul 8 2011, 17:43
Сообщение #82


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(sasamy @ Jul 8 2011, 18:41) *
Хотя написал некорректно, смысл в том что имя массива это константа и под нее вообще не выделяется память, память выделяется для массива - никакого адреса поэтому не получить.

Имя массива - это и есть его адрес, адрес его первого элемента. И почему ж тогда "не получить никакого адреса"? Это в классической книге основоположников C описано.
Go to the top of the page
 
+Quote Post
Danis
сообщение Jul 8 2011, 18:02
Сообщение #83


Twilight Zone
***

Группа: Свой
Сообщений: 454
Регистрация: 17-02-09
Из: Челябинск
Пользователь №: 44 990



Цитата(011119xx @ Jul 7 2011, 06:36) *
Необходимо в Кейле объявить массив без указания его размера. А потом по необходимости использования массива задать размер в зависимости от условий. Можно ли это сделать на си и как?


Используйте функции динамического распределения памяти: malloc, calloc, realloc, free.
Если Вы новичок в Си временно забудьте об этом и используйте статические массивы.


--------------------
Magic Friend
Go to the top of the page
 
+Quote Post
ar__systems
сообщение Jul 8 2011, 18:02
Сообщение #84


self made
****

Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795



Цитата(zltigo @ Jul 8 2011, 05:11) *
Что проверить? Что указатель на int не является кирпичом?

Потому,что я это уже сказал ранее.


Строго говоря вы не правы. Выражение &Buffer имеет вполне определенный смысл. Значение его такое же как и &Buffer[0], но тип другой.

Код
char Buffer[100];

#include <stdio.h>
int main(){

const char * A = Buffer;
char * B = &Buffer; // Warning in C, error in C++
char (*B1)[100] = &Buffer; // No warnings here
const char * C = &Buffer[0];

printf(" A %p\n",A);
printf(" B %p\n",B);
printf(" B1 %p\n",B1);
printf(" C %p\n",C);
return 0;
}


Естественно что все напечатанные адреса одинаковые.
Go to the top of the page
 
+Quote Post
011119xx
сообщение Jul 8 2011, 18:06
Сообщение #85


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544



Keil не ругается на выражение
Код
ptr_buffer = &Buffer;


Кроме того, выражение
Код
ptr_buffer = &Buffer[0];

его тоже устраивает. Настолько, что он воспринимает их как одинаковыми.

По существу для себя уже решил объявить массив максимально возможного размера, тем более памяти достаточно (96кб). А шрифты хранятся в самой флэш, тем более что ее тоже много (1Мб). Можно хранить конечно и в SD-карте, но даже при чтении через SDIO, скорость чтения получается меньше, чем при хранении во флэш.

Сообщение отредактировал 011119xx - Jul 8 2011, 18:07
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 8 2011, 18:06
Сообщение #86


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (sasamy @ Jul 8 2011, 20:13) *
кроме 10 * sizeof(char) выделяется память для указателя abc ? Если да - потрудитесь привести пример, если нет то мне больше не о чем с вами говорить.

Ну в этом случае, надеюсь Вы действительно будете помалкивать, и думать, как я и просил. Потому, что:
CODE
     50          char abc[10];
   \                     abc:
   \   00000000                      DS8 12
     51          
     52          ulong test(void)
     53          {
     54              return( (ulong)abc );
   \                     test:
   \   00000000   00009FE5           LDR      R0,??test_0     ;; abc
   \   00000004   0EF0A0E1           MOV      PC,LR           ;; return
   \                     ??test_0:
   \   00000008   ........           DC32     abc
     55          }


32 бита памяти под указатель на abc[] видите? Или все еще будете думать, что это value берется ниоткуда?




--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
sasamy
сообщение Jul 8 2011, 18:06
Сообщение #87


Знающий
****

Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858



Цитата(ViKo @ Jul 8 2011, 21:43) *
Имя массива - это и есть его адрес, адрес его первого элемента. И почему ж тогда "не получить никакого адреса"? Это в классической книге основоположников C описано.


А вы вообще в курсе о каком адресе речь ?
http://electronix.ru/forum/index.php?showt...st&p=949672

адрес указателя-константы мы никогда не получим потому что в памяти его просто нет, хотя я чую эти объяснения могут тянуться бесконечно - троллям ничего не объяснишь, более того через пару-тройку постов начнут утверждать что это именно я говорил обратное sm.gif
Go to the top of the page
 
+Quote Post
ar__systems
сообщение Jul 8 2011, 18:11
Сообщение #88


self made
****

Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795



Цитата(vvs157 @ Jul 8 2011, 06:02) *
Вообще-то в случае обявленного массива array[n] указатель &array, скорее всего будет равен указателю array. Скорее всего - потому что зависит от реализации компилятора. Но пользоваться этим очень плохо, так как в случае динамичесого массива, созданного через calloc/malloc это точно будет не так.


Вот это неграмотно. &Array и просто Array ВСЕГДА будут указывать в одно и тоже место, отличаются эти выражения только типом.
Go to the top of the page
 
+Quote Post
Danis
сообщение Jul 8 2011, 18:11
Сообщение #89


Twilight Zone
***

Группа: Свой
Сообщений: 454
Регистрация: 17-02-09
Из: Челябинск
Пользователь №: 44 990



Цитата(ViKo @ Jul 8 2011, 20:43) *
Имя массива - это и есть его адрес, адрес его первого элемента.


Тут надо быть аккуратным, в контексте этой цитаты и выше приведенных указателей на первый элемент массива подмечу:

Код
unsigned char Data[] = {0,1,2,3,4,5,6,7};

int X = sizeof(Data);  // Получим 8 -  размер массива в байтах

unsigned char* ptr_Data = &Data[0]; или unsigned char* ptr_Data = Data; // Но так менее информативно

int y = sizeof(ptr_Data); // Получим размер указателя


--------------------
Magic Friend
Go to the top of the page
 
+Quote Post
ar__systems
сообщение Jul 8 2011, 18:15
Сообщение #90


self made
****

Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795



Цитата(zltigo @ Jul 8 2011, 14:06) *
Ну в этом случае, надеюсь Вы действительно будете помалкивать, и думать, как я и просил. Потому, что:

32 бита памяти под указатель на abc[] видите? Или все еще будете думать, что это value берется ниоткуда?


Ничего не вижу. Вижу что вы язык сами не очень понимаете. Чего и сколько там комприлятор разместил - хз, да это и не важно, важно только какой смысл создатели языка заложили в эту конструкцию. А вот понимания этого у вас у самого не наблюдается
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 8 2011, 18:21
Сообщение #91


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (ar__systems @ Jul 8 2011, 21:02) *
Строго говоря вы не правы. Выражение &Buffer имеет вполне определенный смысл. Значение его такое же как и &Buffer[0], но тип другой.

Мне уже точно надоело sad.gif. Похоже Вы читать не умеете sad.gif. Именно о ТИПЕ - "Что указатель на int не является кирпичом" я, подчеркиваю я, а не вертящийся на сковородке GetSmart речь все время и вел и веду. Не приписываете мне то чего я не говорил. Выражение присваивающее указателю на int указатель на массив БЕССМЫСЛЕННО из-за разных типов. Любой вменяемый компилятор НЕ должен такое тупо и молча переваривать.
Выражения присваивающие указателю на void указатель на массив void *ptr = &buffer, или указатель на первый элемент массива void *ptr = buffer являются СОВЕРШЕННО нормальными с точки зрения компилятора и я НИ РАЗУ ничего против не говорил.

QUOTE (ar__systems @ Jul 8 2011, 21:15) *
Ничего не вижу. ..... Чего и сколько там комприлятор разместил - хз

sm.gif Глупейшая отмазка. На уровне страуса прячущего голову в песок sad.gif.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
ar__systems
сообщение Jul 8 2011, 18:25
Сообщение #92


self made
****

Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795



Цитата(GetSmart @ Jul 8 2011, 11:32) *
Я к тому и вёл, что ТС взял адрес массива вместо адреса нулевого элемента массива. Причём адреса оба равны. Только типом отличаются и только компилятор руганётся на это.


Самое смешное, что для того чтобы в этом убедиться, не обязательно даже читать книжку. Достаточно потратить 5 минут на то, чтобы скомпилировать это выражение. g++ выдает вполне развернутое сообщение об ошибке, из которого ясно, что проблема в неправильном типе. Но гуру экспериментировать западло, это же значит надо в собственных непоколебимых знаниях усомниться.


Цитата(zltigo @ Jul 8 2011, 14:21) *
Мне уже точно надоело sad.gif. Похоже Вы читать не умеете sad.gif. Именно о ТИПЕ - "Что указатель на int не является кирпичом" я, подчеркиваю я, а не вертящийся на сковородке GetSmart речь все время и вел и веду. Не приписываете мне то чего я не говорил. Выражение присваивающее указателю на int указатель на массив БЕССМЫСЛЕННО из-за разных типов.

Бессмысленно? Это на С, которому грубо говоря начихать на типы? Ну-ну. GetSmart все правильно написал, на сковордке это вы вертитесь, впадая в истерику от УЖАСНЫХ УЖАСНЫХ УЖАСНЫХ ошибок sm.gif
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jul 8 2011, 18:28
Сообщение #93


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(sasamy @ Jul 8 2011, 21:06) *
А вы вообще в курсе о каком адресе речь ?
http://electronix.ru/forum/index.php?showt...st&p=949672
адрес указателя-константы мы никогда не получим потому что в памяти его просто нет, хотя я чую эти объяснения могут тянуться бесконечно - троллям ничего не объяснишь, более того через пару-тройку постов начнут утверждать что это именно я говорил обратное

Смотрел и на это ваше сообщение, пытаясь понять, что же вы имели в виду. Поясните подробнее.
Это я-то троль? За что!? sm.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 8 2011, 18:32
Сообщение #94


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (ar__systems @ Jul 8 2011, 21:25) *
Это на С, которому грубо говоря начихать на типы?

Хорошо быть страусом и игнорировать очевидные вещи, типа наличия выделенной памяти под указатель и приведенные мной вопли сишного компилятора, которому таки не начихать на типы. Считайте, что в своей глупости Вы меня уже убедили. Достаточно, можете не продолжать.



--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
ar__systems
сообщение Jul 8 2011, 18:38
Сообщение #95


self made
****

Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795



Я понял, откуда растет это волна негодования. Если исходить из того, что Buffer указывает на первый элемент массива, то &Buffer будет указывать вообще хз куда. т.е. это уже получится &(&Buffer[0]). Тут я соглашусь получается УЖАС - эта конструкция не имеет смысла. Но не надо забывать, что Buffer приравняли к &Buffer[0] исключительно для удобства пользователя языка, т.е. это сделано искуственно. А когда вы пишите &Buffer, компилятор не производит подстановку (Buffer > &Buffer[0]).
Цитата
Хорошо быть страусом и игнорировать очевидные вещи, типа наличия выделенной памяти под указатель и приведенные мной вопли сишного компилятора, которому таки не начихать на типы. Считайте, что в своей глупости Вы меня уже убедили. Достаточно, можете не продолжать.

Да вы чушь пишите про выделение указателя. Вы понятия не имеет для чего они лишнее слово выдели, и строите нелепые предположения, что для указателя.
Go to the top of the page
 
+Quote Post
Danis
сообщение Jul 8 2011, 18:49
Сообщение #96


Twilight Zone
***

Группа: Свой
Сообщений: 454
Регистрация: 17-02-09
Из: Челябинск
Пользователь №: 44 990



Цитата(ar__systems @ Jul 8 2011, 22:38) *
Да вы чушь пишите про выделение указателя. Вы понятия не имеет для чего они лишнее слово выдели, и строите нелепые предположения, что для указателя.


Мужики! Хорош.

Давайте ТС лучше поможем.

char *realloc(ptr,size);

Функция realloc изменяет размер ранее захваченного блока
памяти. Аргумент ptr указывает на начало блока. Аргумент size за-
дает новый размер блока в байтах. Содержимое блока не изменяется.


Код
unsigned char *alloc = NULL;

/* захватываем достаточное пространство для 8 байт */

alloc = (unsigned char*)malloc( 8 * sizeof(unsigned char) );

if ( NULL == alloc ){ /* Обработаем */ }

for ( int i= 0; i < 8; i++ )
alloc[i] = i;

/* перезахватывает блок, который содержащий 8 байт, добавляем еще 8 */
if (alloc != NULL)
alloc = (unsigned char*)realloc( alloc,16 * sizeof(unsigned char));

if ( NULL == alloc ){ /* Обработаем */ }

for ( int i = 8; i < 16; i++ )
alloc[i] = i;

// Дальше САМИ


--------------------
Magic Friend
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jul 8 2011, 18:49
Сообщение #97


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(zltigo @ Jul 9 2011, 00:06) *
Код
     50          char abc[10];
   \                     abc:
   \   00000000                      DS8 12


А если сделать char abc[12]; ? Или для надёжности даже char abc[16]?


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jul 8 2011, 18:52
Сообщение #98


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(ar__systems @ Jul 8 2011, 22:38) *
Да вы чушь пишите про выделение указателя. Вы понятия не имеет для чего они лишнее слово выдели, и строите нелепые предположения, что для указателя.

А кто это - они? sm.gif

В приведённом куске кода прекрасно видно, что адрес массива (указатель) грузится в R0 из флеш памяти, в которой под него, соответственно, было выделено место в размере 32 бит.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 8 2011, 18:57
Сообщение #99


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (ar__systems @ Jul 8 2011, 21:38) *
Вы понятия не имеет для чего они лишнее слово выдели, и строите нелепые предположения, что для указателя.

Страус увидел "лишнее слово" в памяти. Но то, что в этом слове лежит указатель (и даже компилятор назвал это слово именем массива, т.е. abc) страус видеть все еще не желает. Пусть оно будет "лишними словом" решил страус и успокоился. "лишнее слово" - и все опять в голове страуса становится просто и понятно - есть массив, если нужно из ниоткуда будет взят указатель на этот массив. Все остальное считать "нелепыми предположениями". Ну честно говоря, фиг с ним с этим страусом - это пока его проблемы. Имеющие разум да поймут.
QUOTE (AHTOXA @ Jul 8 2011, 21:49) *
А если сделать char abc[12]; ? Или для надёжности даже char abc[16]?

Какая разница?


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jul 8 2011, 19:03
Сообщение #100


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(zltigo @ Jul 9 2011, 00:57) *
Какая разница?
Пардон, я невнимательно прочитал.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post

12 страниц V   1 2 3 > » 
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 16:18
Рейтинг@Mail.ru


Страница сгенерированна за 0.02743 секунд с 7
ELECTRONIX ©2004-2016