|
Как в си объявить массив с возможностью изменения его размера? |
|
|
|
Jul 7 2011, 13:49
|
■ ■ ■ ■
    
Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443

|
Цитата Как в си объявить массив с возможностью изменения его размера? Никак. ..остальное изврат. Использовать динамическое выделение памяти и указатель.
--------------------
Делай что должен и будь что будет.
|
|
|
|
|
Jul 8 2011, 07:27
|

Местный
  
Группа: Свой
Сообщений: 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; }
|
|
|
|
|
Jul 8 2011, 08:01
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(011119xx @ Jul 7 2011, 08:36)  Необходимо в Кейле объявить массив без указания его размера. А потом по необходимости использования массива задать размер в зависимости от условий. Можно ли это сделать на си и как? Приведите пример того, что хотите делать с массивом (использование массива). Для начала для массива константного размера. Я покажу как это сделать с массивом переменной длины. Не слушайте zltigo. У него плохое настроение
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jul 8 2011, 08:05
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Цитата(zltigo @ Jul 8 2011, 11:53)  Абсолютный ужас. Полное непонимание не только языка, но и собственно физического смысла творимого  Публичный дом, молодая проститутка выбегает из номера клиента в растрепанных чувствах и с воплями - УЖАС, УЖАС, УЖАС!!!! Мадам успокаивает проститутку и сама идет к клиенту. Через некоторое время выходит, и говорит - Ну да, ну ужас. Ну уж никак не УЖАС, УЖАС, УЖАС!
|
|
|
|
|
Jul 8 2011, 08:06
|

Местный
  
Группа: Свой
Сообщений: 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); } Это работает. Но это вариант с явным указанием размера буфера при объявлении. Я так понял иначе и нельзя.
|
|
|
|
|
Jul 8 2011, 08:14
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(jorikdima @ Jul 8 2011, 13:01)  Поддержу, пожалуй. Если у форума одна из задач - интерактивное обучение, естественно в такой форме чтобы у вопрошающего не отбивалось желание вообще заниматься, то это не лучший подход. Старческое брюзжание. Представьте такого человека в роли препода в любом заведении и учиться сразу расхочется. Ветка называется "в помощь начинающему". Расслабьтесь, профи  Цитата(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
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jul 8 2011, 08:27
|

Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Jul 8 2011, 08:43
|

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

|
QUOTE (GetSmart @ Jul 8 2011, 11:14)  Если у форума одна из задач - интерактивное обучение Задачи обучения ставят, как в младшей ясельной группе детского сада, так и в Аспирантуре. Весь вопрос в том, как позиционировать этот форум, как ясельную группу, или хотя-бы как начальную школу?
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 8 2011, 08:45
|

фанат дивана
     
Группа: Свой
Сообщений: 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); } Массив (обычно) создаётся на стеке. То есть, если вам ваш массив переменной длины нужен временно, то это отличный вариант.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Jul 8 2011, 08:55
|

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

|
QUOTE (011119xx @ Jul 8 2011, 11:29)  Можете хоть головой об стенку биться Биться головой о стенку, причем дооолго и безрезультатно предстоит Вам, ибо при таком подходе к делу (думать не будем, учиться понимать язык не будем, будем сразу "программировать") это неизбежно  . Утверждать, Вы можете, что угодно, но приведенная мною Ваша строчка 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
|
|
|
|
|
Jul 8 2011, 09:00
|
Профессионал
    
Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007

|
Цитата(GetSmart @ Jul 8 2011, 11:55)  Для работы понадобится указатель на один элемент массива (первый) и один или несколько переменных-описалово данных внутри массива. С указателем, как я уже подкорректировал внутри CODE можно работать как с массивом. Вы, надеюсь, понимаете, что ваш подход, кроме изврата, ничего не содержит? Если в вашей функции виден сам массив, на кой лишний указатель и ненужная переменная, в качестве индекса?
|
|
|
|
|
Jul 8 2011, 09:00
|

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

|
Это Код ptr_buffer = &Buffer; как раз и заносит в указатель адрес нулевого элемента массива. Код ptr_buffer = &Buffer; и Код ptr_buffer = &Buffer[0]; одно и тоже
|
|
|
|
|
Jul 8 2011, 09:08
|

Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Jul 8 2011, 09:09
|

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

|
Цитата(sergeeff @ Jul 8 2011, 15:00)  Вы, надеюсь, понимаете, что ваш подход, кроме изврата, ничего не содержит? Если в вашей функции виден сам массив, на кой лишний указатель и ненужная переменная, в качестве индекса? Дело в том что когда я читаю ширину и высоту символа мне нужно создать массив размером = ширина*высота и в этот массив скопировать некую картинку такого размера. Это скажем так: фон для символа. Потом в этот массив копируется сам символ, но при этом затирает только очертания символа. Потом из этого массива данные выводятся в дисплей Цитата(zltigo @ Jul 8 2011, 15:08)  Разумеется нет. "это" бессмысленное выражение которое любой вменяемый компилятор обязан послать нафиг. Да ну вас! Ни один компилятор никогда не посылал.
|
|
|
|
|
Jul 8 2011, 09:11
|
Профессионал
    
Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007

|
Цитата(011119xx @ Jul 8 2011, 12:00)  Это Код ptr_buffer = &Buffer; как раз и заносит в указатель адрес нулевого элемента массива. Код ptr_buffer = &Buffer; и Код ptr_buffer = &Buffer[0]; одно и тоже  Хоть меня частенько критикуют за любовь к печатным изданиям, но вам, любезный, книги надобно почитать. Если объявлен массив abc[10], то abc - это указатель на массив и его значение в точности равно адресу первого элемента, т.е. &abc[0]. А &abc - дает адрес указателя на массив, что, согласитесь, совсем не то, что вы хотите получить и использовать. на что вам и указал уважаемый zltigo.
|
|
|
|
|
Jul 8 2011, 09:11
|

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

|
QUOTE (GetSmart @ Jul 8 2011, 12:05)  А почему сразу бред? А проверить? Что проверить? Что указатель на int не является кирпичом? QUOTE А почему не УЖАС, УЖАС, УЖАС!!! ???  Потому,что я это уже сказал ранее.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 8 2011, 09:18
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(011119xx @ Jul 8 2011, 14:09)  Дело в том что когда я читаю ширину и высоту символа мне нужно создать массив размером = ширина*высота и в этот массив скопировать некую картинку такого размера. Это скажем так: фон для символа. Потом в этот массив копируется сам символ, но при этом затирает только очертания символа. Потом из этого массива данные выводятся в дисплей Так создайте сразу статичный массив с размером под максимально большой символ, который потребуется. При работе с малыми символами конец массива использоваться не будет. Велика беда. Иначе можно выделять место в стеке, как предлагал AHTOXA. Цитата(zltigo @ Jul 8 2011, 14:11)  Потому,что я это уже сказал ранее. Так это были Вы?
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jul 8 2011, 09:20
|

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

|
Цитата(AHTOXA @ Jul 8 2011, 15:11)  Вы случайно в пылу полемики не пропустили мой пост ( №19)?  По идее как раз подходит. Не пропустил. Спасибо. Хороший вариант. Буду пробовать
|
|
|
|
|
Jul 8 2011, 09:44
|

Местный
  
Группа: Свой
Сообщений: 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); } Массив (обычно) создаётся на стеке. То есть, если вам ваш массив переменной длины нужен временно, то это отличный вариант. В данном случае массив объявляется внутри функции. Мне нужно чтобы массив был глобальным, он потом используется в другой функции.
|
|
|
|
|
Jul 8 2011, 09:45
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(sergeeff @ Jul 8 2011, 14:37)  Что вы подразумеваете под несуществующим указателем на массив? Код u16 abc[10]; void *p;
main() { p = &abc; ... } Чему равен p? Цитата А &abc - дает адрес указателя на массив Что такое адрес указателя на массив?
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jul 8 2011, 09:49
|
Профессионал
    
Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007

|
Цитата(GetSmart @ Jul 8 2011, 13:42)  В стеке нужно будет иметь гарантированно нужный объём памяти при самом наихудшем случае. А вдруг не хватит? В статике же один раз выделил и не напрягаешься. По этому поводу есть рассуждения в умных книжках. Мы давайте "заср...м" глобальным массивом дефицитную память процессора, а пользоваться им будем где-то в процедуре. А кто мешает в этой самой функции объявлять такой же массив (если стека хватает)? Хотя я писал уже, что в данной задаче и массив то этот не нужен вовсе. А по поводу &abc можете почитать у отцов основателей http://www.realcoding.net/article/view/1094Цитата Что такое адрес указателя на массив? Указатель лежит в памяти. Адрес указателя - это адрес этой памяти.
|
|
|
|
|
Jul 8 2011, 09:55
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(sergeeff @ Jul 8 2011, 14:49)  А по поводу &abc можете почитать у отцов основателей http://www.realcoding.net/article/view/1094Не читал, но осуждаю  Но на элементарный вопрос не ответить - надо уметь. Цитата(sergeeff @ Jul 8 2011, 14:49)  Хотя я писал уже, что в данной задаче и массив то этот не нужен вовсе. В названии топика есть вопрос. На него и отвечаем. Остальное вторично. Тем более, кто сказал, что память дефицитная. Если подобный массив в стеке будет только в одном месте выделяться, то статичный вариант лучше во всех отношениях. Точнее, если такая квазидинамическая память больше в программе не используется.
Сообщение отредактировал GetSmart - Jul 8 2011, 09:56
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jul 8 2011, 10:08
|
■ ■ ■ ■
    
Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443

|
Цитата А по поводу &abc можете почитать у отцов основателей http://www.realcoding.net/article/view/1094От туда: Цитата Операция & применима только к переменным и элементам массива, abc есть константа. Не?  UPD: Т.е. запись &abc просто нелогична, ну как получить адрес адреса.
--------------------
Делай что должен и будь что будет.
|
|
|
|
|
Jul 8 2011, 10:15
|
.
     
Группа: Участник
Сообщений: 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
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jul 8 2011, 10:23
|

Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Jul 8 2011, 10:28
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(zltigo @ Jul 8 2011, 15:23)  Замените КАК ЭТО СДЕЛАНО В ПЕРВОИСТОЧНИКЕ: u16 *p
И компилятор ответит, что он думает "Чему равен p" Адресу массива, не сомневайтесь. Но согласитесь, на УЖАС, УЖАС, УЖАС это не тянет. Так, мелкое хулиганство  Причём меньшее, чем не посылка NAK в протоколе I2C.
Сообщение отредактировал GetSmart - Jul 8 2011, 10:29
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jul 8 2011, 10:32
|
Профессионал
    
Группа: Свой
Сообщений: 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;
|
|
|
|
|
Jul 8 2011, 10:40
|

Гуру
     
Группа: Свой
Сообщений: 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 Но согласитесь, на УЖАС, УЖАС, УЖАС это не тянет. Так, мелкое хулиганство  Не соглашусь, однако.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 8 2011, 10:41
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(zltigo @ Jul 8 2011, 15:34)  Хвала Аллаху, что у компиляторописателей голова растет не из ануса, посему на это: ... Реагируют посылкой в анус того, кто так пишет. Но всё-таки она вертится!? Ведь результат &mass является адресом массива, хоть и с другими атрибутами, чем первый его элемент. Чтобы не париться, его всегда можно присвоить нетипизированному указателю. И это работает не только с массивами, но и с записами, юнионами, функциями и возможно ещё что упустил. Очень интересная новость после стольких лет...
Сообщение отредактировал GetSmart - Jul 8 2011, 10:45
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jul 8 2011, 10:44
|

Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Jul 8 2011, 10:48
|

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

|
QUOTE (GetSmart @ Jul 8 2011, 13:41)  Но всё-таки она вертится!? Ведь результат &mass является адресом массива, хоть и с другими атрибутами, чем первый его элемент. Что значит "вертится" и "является адресом", если компиляторы ВЫВАЛИВАЕТСЯ с ошибкой и соответственно НЕ генерят никакого кода? Кто здесь пытается вертеться, как уж на сковородке, видно невооруженным взглядом  . QUOTE И это работает не только... Это не работает. Как там было у Задорнова - "Пива нет. СОВСЕМ нет!" - СОВСЕМ не раболтает. О чем я сразу и написал увидя этo: CODE uint16_t Buffer[50]; uint16_t *ptr_buffer; ..... ptr_buffer = &Buffer; Именно ЭТО увидел и именно об ЭТОМ а не чем-то другом написал.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 8 2011, 10:48
|
Местный
  
Группа: Участник
Сообщений: 406
Регистрация: 1-03-06
Пользователь №: 14 821

|
Цитата(sergeeff @ Jul 8 2011, 11:49)  Указатель лежит в памяти. Адрес указателя - это адрес этой памяти. :-))) Цитата из Вашей ссылки Цитата Очевидно существует очень тесное соответствие между ин- дексацией и арифметикой указателей. в действительности ком- пилятор преобразует ссылку на массив в указатель на начало массива. В результате этого имя массива является указатель- ным выражением. Отсюда вытекает несколько весьма полезных следствий. Так как имя массива является синонимом местополо- жения его нулевого элемента, то присваивание PA=&A[0] можно записать как PA = A По моему Вы и zltigo сомневались и учебники читать отправляли.
|
|
|
|
|
Jul 8 2011, 10:52
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(zltigo @ Jul 8 2011, 15:48)  Кто здесь пытается вертеться, как уж на сковородке, видно невооруженным взглядом  . Это смотря какой вопрос. То, что было изначально у ТС я не утверждал, что компилируется (вообще). Но то, что амперсанд можно применять ко многим объектам, включая массивы, и результат будет предсказуем, то бишь равен адресу объекта - я ещё раз повторяю. Если я уж, то сижу спокойно, в центре сковородки
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jul 8 2011, 10:55
|
Профессионал
    
Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007

|
Цитата(andron86 @ Jul 8 2011, 13:48)  По моему Вы и zltigo сомневались и учебники читать отправляли. Вы это к чему? Там же ниже прямо написано Цитата конструкции типа A=PA или A++,или P=&A будут незаконными. Чего вы мне хотели сказать?
|
|
|
|
|
Jul 8 2011, 10:56
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(zltigo @ Jul 8 2011, 15:48)  Это не работает. Как там было у Задорнова - "Пива нет. СОВСЕМ нет!" Преобразования типов нет. СОВСЕМ НЕТ! © zltigo С сегодняшнего дня типизированные указатели не могут присваиваться к другим типизированным указателям. Аминь. Upd. zltigo, Вы верите, что void *p можно присвоить адрес любого типа? Даже так p = &mass. Это что, незаконно? СОВСЕМ? Вобщем если пива нет, но очень хочется, то пиво есть
Сообщение отредактировал GetSmart - Jul 8 2011, 11:14
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jul 8 2011, 10:57
|
Местный
  
Группа: Участник
Сообщений: 406
Регистрация: 1-03-06
Пользователь №: 14 821

|
Цитата(sergeeff @ Jul 8 2011, 12:55)  Вы это к чему? Там же ниже прямо написано Звиняюсь, & операцию у ТС не увидел :-(
|
|
|
|
|
Jul 8 2011, 11:28
|

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

|
Цитата(sergeeff @ Jul 8 2011, 17:04)  Уважаемый. Вы понимаете про что говорите? Статический массив автору был нужен для копирования тела символа. Где гарантия, что в другом шрифте, символы "влезут" в этот массив? А вы попробуйте для интереса иногда читать то, на что возражаете. Выделяем массив размера как максимальный символ. И всё. Размер этот известен на этапе компиляции. Цитата(sergeeff @ Jul 8 2011, 17:04)  Странное это программирование, основанное на предположениях и утверждениях "и так катит". Это вы уже сами что-то себе выдумали, и доблестно с этим воюете. Грубите, кстати.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Jul 8 2011, 11:47
|
Профессионал
    
Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007

|
Цитата(AHTOXA @ Jul 8 2011, 14:28)  А вы попробуйте для интереса иногда читать то, на что возражаете. Выделяем массив размера как максимальный символ. И всё. Размер этот известен на этапе компиляции.Это вы уже сами что-то себе выдумали, и доблестно с этим воюете. Грубите, кстати. Это вы придумали такой вариант реализации системы, где шрифты подключаются на этапе сборки проекта. Откуда мне и вам знать, может они на SD карточке лежат? А в чем грубость то? Объясните старику. Да, и не плохо бы примерчик, где линкер ругается на размер массива, в который вы собираетесь что то копировать.
|
|
|
|
|
Jul 8 2011, 12:01
|
Знающий
   
Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858

|
Цитата(sergeeff @ Jul 8 2011, 13:11)  Хоть меня частенько критикуют за любовь к печатным изданиям, но вам, любезный, книги надобно почитать. Если объявлен массив abc[10], то
abc - это указатель на массив и его значение в точности равно адресу первого элемента, т.е. &abc[0]. А &abc - дает адрес указателя на массив, что, согласитесь, совсем не то, что вы хотите получить и использовать. Вам бы самому хоть немного почитать. abc -- это указатель-константа которая равна адресу первого элемента массива с нулевым индексом, у константы не может быть адреса.
|
|
|
|
|
Jul 8 2011, 12:35
|

фанат дивана
     
Группа: Свой
Сообщений: 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)
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Jul 8 2011, 13:31
|

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

|
QUOTE (GetSmart @ Jul 8 2011, 13:56)  zltigo, Вы верите, что void *p можно присвоить адрес любого типа? Даже так p = &mass. Это что, незаконно? СОВСЕМ? Вобщем если пива нет, но очень хочется, то пиво есть  Хватит пытаться вертеться, о присвоении указателя на void. Речь не шла. Когда Вы пытаясь, как Вам кажется, "изящно" выкрутиться ПОДМЕНИЛИ в исходном тексте указатель на short указателем на void, я Вам сразу указал на это, Вы начали передергивать подсовывая другой заведомо глотаемый сишным компилятором вариант. QUOTE Вобщем если пива нет, но очень хочется, то пиво есть Да, тогда такие, как Вы насцав а бокал делаете вид что лично Вы пьете пиво  . Все. Точка, шулер Вы наш  . QUOTE (ViKo @ Jul 8 2011, 16:12)  Со стеком или любым другим ДИНАМИЧЕСКИМ выделением памяти проблем, совершенно нет по определению. Единственно, что выделять фиг знает какой объем памяти в стеке явно не кошерно, посему остается естественное и контролируемое на ошибки динамическое выделение памяти из heap. Другое дело, что все идет к тому, что для данного случая просто все надо делать на лету, а не бездумно трясти пальму.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 8 2011, 13:42
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Ничё не сделал, только вошёл  И сразу мошенник. Себя почитайте Цитата(zltigo @ Jul 8 2011, 14:08)  Цитата как раз и заносит в указатель адрес нулевого элемента массива. Код ptr_buffer = &Buffer; "это" бессмысленное выражение которое любой вменяемый компилятор обязан послать нафиг. Вы заявили, что амперсанд применительно к массиву без индекса является бессмысленной операцией. Я же подправил, что она осмысленная, но малость не соответствует по типу указателя. Нельзя же так относиться к мелким ошибкам ТС - бред, бред! УЖАС, УЖАС, УЖАС!
Сообщение отредактировал GetSmart - Jul 8 2011, 13:55
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jul 8 2011, 14:28
|

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

|
QUOTE (GetSmart @ Jul 8 2011, 16:42)  Себя почитайте Не, для Вас, поскольку Вы даже не шулер, который таки-боится получить в реале канделябром по голове, а просто моральный урод  . Я себя почитаю: 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. Это еще не касаясь осмысленности производимых действий  и index_buffer = 32; Если это "мелкие ошибки", то что тогда крупные  .
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 8 2011, 14:46
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(zltigo @ Jul 8 2011, 19:28)  Если это "мелкие ошибки", то что тогда крупные  . Я уже писал - отсутствие NAK в протоколе I2C. Вы как истеричка  Вся соль в посте №72. Он почти неурезанный. И на этом я закончу.
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jul 8 2011, 15:13
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 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)  Вы как истеричка  Вся соль в посте №72. Он почти неурезанный. И на этом я закончу. Хм... А нужную-то цитату Вы и в своём сообщении привели. Цитата(GetSmart @ Jul 8 2011, 16:42)  Себя почитайте
"это" бессмысленное выражение которое любой вменяемый компилятор обязан послать нафиг. Вы заявили, что амперсанд применительно к массиву без индекса является бессмысленной операцией. Речь-то идёт не о применении & к имени массива, а о выражении, присвавающем результат переменной другого типа. Цитата(zltigo @ Jul 8 2011, 12:08)  Код ptr_buffer = &Buffer; Разумеется нет. "это" бессмысленное выражение которое любой вменяемый компилятор обязан послать нафиг. Это Код double d; float *pf = &d; тоже «всего лишь слегка не совпадает по типу», не так ли? Но любой вменяемый компилятор тоже обязан послать нафиг.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Jul 8 2011, 15:41
|
Знающий
   
Группа: Участник
Сообщений: 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
|
|
|
|
|
Jul 8 2011, 16:02
|
Профессионал
    
Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007

|
Цитата(AHTOXA @ Jul 8 2011, 16:35)  Код int array[100500]; (предвидя придирки - на mega8) Перечитал 3 (три) раза. Круто. А магическую циферку 100500 надо, естественно, ручками вычислить, перед включением нового фонта? Если забыл это сделать, или описался (нолик пропустил, по случаю жаркой погоды)? Никто, ни компилятор, ни линкер, даже не колыхнутся, вам об этом любезно сообщить. И будете долго думать, чего это программа грохается. Мораль - никакая это не диагностика. Тем более не диагностика этапа компиляции. Нужно использовать, например, механизм static_assert, но это только под С++. P.S. Это не придирки.
|
|
|
|
|
Jul 8 2011, 16:41
|

Гуру
     
Группа: Свой
Сообщений: 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 ...смысл в том что имя массива это константа и под нее вообще не выделяется память точно  значит имеется константа имеющая некоторое value, но оно НИГДЕ не хранится, только при необходимости святым духом появляется  . Так-что память выделяется, вопрос только в том, способен и обязан-ли компилятор выдавать адреса констант всегда и любых.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 8 2011, 17:13
|
Знающий
   
Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858

|
Цитата(zltigo @ Jul 8 2011, 20:41)  А если подумать Бла, бла, бла - тут о массивах в С речь - это ясно ? Цитата точно  значит имеется константа имеющая некоторое value, но оно НИГДЕ не хранится, только при необходимости святым духом появляется  . Так-что память выделяется, вопрос только в том, способен и обязан-ли компилятор выдавать адреса констант всегда и любых. Тоесть вы утверждаете, что при определении массива char abc[10]; кроме 10 * sizeof(char) выделяется память для указателя abc ? Если да - потрудитесь привести пример, если нет то мне больше не о чем с вами говорить.
Сообщение отредактировал sasamy - Jul 8 2011, 17:14
|
|
|
|
|
Jul 8 2011, 17:31
|

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

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

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

|
Цитата(011119xx @ Jul 7 2011, 06:36)  Необходимо в Кейле объявить массив без указания его размера. А потом по необходимости использования массива задать размер в зависимости от условий. Можно ли это сделать на си и как? Используйте функции динамического распределения памяти: malloc, calloc, realloc, free. Если Вы новичок в Си временно забудьте об этом и используйте статические массивы.
--------------------
Magic Friend
|
|
|
|
|
Jul 8 2011, 18:02
|
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; } Естественно что все напечатанные адреса одинаковые.
|
|
|
|
|
Jul 8 2011, 18:06
|

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

|
Keil не ругается на выражение Код ptr_buffer = &Buffer; Кроме того, выражение Код ptr_buffer = &Buffer[0]; его тоже устраивает. Настолько, что он воспринимает их как одинаковыми. По существу для себя уже решил объявить массив максимально возможного размера, тем более памяти достаточно (96кб). А шрифты хранятся в самой флэш, тем более что ее тоже много (1Мб). Можно хранить конечно и в SD-карте, но даже при чтении через SDIO, скорость чтения получается меньше, чем при хранении во флэш.
Сообщение отредактировал 011119xx - Jul 8 2011, 18:07
|
|
|
|
|
Jul 8 2011, 18:06
|

Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Jul 8 2011, 18:11
|

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
|
|
|
|
|
Jul 8 2011, 18:15
|
self made
   
Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795

|
Цитата(zltigo @ Jul 8 2011, 14:06)  Ну в этом случае, надеюсь Вы действительно будете помалкивать, и думать, как я и просил. Потому, что:
32 бита памяти под указатель на abc[] видите? Или все еще будете думать, что это value берется ниоткуда? Ничего не вижу. Вижу что вы язык сами не очень понимаете. Чего и сколько там комприлятор разместил - хз, да это и не важно, важно только какой смысл создатели языка заложили в эту конструкцию. А вот понимания этого у вас у самого не наблюдается
|
|
|
|
|
Jul 8 2011, 18:21
|

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

|
QUOTE (ar__systems @ Jul 8 2011, 21:02)  Строго говоря вы не правы. Выражение &Buffer имеет вполне определенный смысл. Значение его такое же как и &Buffer[0], но тип другой. Мне уже точно надоело  . Похоже Вы читать не умеете  . Именно о ТИПЕ - "Что указатель на int не является кирпичом" я, подчеркиваю я, а не вертящийся на сковородке GetSmart речь все время и вел и веду. Не приписываете мне то чего я не говорил. Выражение присваивающее указателю на int указатель на массив БЕССМЫСЛЕННО из-за разных типов. Любой вменяемый компилятор НЕ должен такое тупо и молча переваривать. Выражения присваивающие указателю на void указатель на массив void *ptr = &buffer, или указатель на первый элемент массива void *ptr = buffer являются СОВЕРШЕННО нормальными с точки зрения компилятора и я НИ РАЗУ ничего против не говорил. QUOTE (ar__systems @ Jul 8 2011, 21:15)  Ничего не вижу. ..... Чего и сколько там комприлятор разместил - хз  Глупейшая отмазка. На уровне страуса прячущего голову в песок  .
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 8 2011, 18:25
|
self made
   
Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795

|
Цитата(GetSmart @ Jul 8 2011, 11:32)  Я к тому и вёл, что ТС взял адрес массива вместо адреса нулевого элемента массива. Причём адреса оба равны. Только типом отличаются и только компилятор руганётся на это. Самое смешное, что для того чтобы в этом убедиться, не обязательно даже читать книжку. Достаточно потратить 5 минут на то, чтобы скомпилировать это выражение. g++ выдает вполне развернутое сообщение об ошибке, из которого ясно, что проблема в неправильном типе. Но гуру экспериментировать западло, это же значит надо в собственных непоколебимых знаниях усомниться. Цитата(zltigo @ Jul 8 2011, 14:21)  Мне уже точно надоело  . Похоже Вы читать не умеете  . Именно о ТИПЕ - "Что указатель на int не является кирпичом" я, подчеркиваю я, а не вертящийся на сковородке GetSmart речь все время и вел и веду. Не приписываете мне то чего я не говорил. Выражение присваивающее указателю на int указатель на массив БЕССМЫСЛЕННО из-за разных типов. Бессмысленно? Это на С, которому грубо говоря начихать на типы? Ну-ну. GetSmart все правильно написал, на сковордке это вы вертитесь, впадая в истерику от УЖАСНЫХ УЖАСНЫХ УЖАСНЫХ ошибок
|
|
|
|
|
Jul 8 2011, 18:32
|

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

|
QUOTE (ar__systems @ Jul 8 2011, 21:25)  Это на С, которому грубо говоря начихать на типы? Хорошо быть страусом и игнорировать очевидные вещи, типа наличия выделенной памяти под указатель и приведенные мной вопли сишного компилятора, которому таки не начихать на типы. Считайте, что в своей глупости Вы меня уже убедили. Достаточно, можете не продолжать.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 8 2011, 18:38
|
self made
   
Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795

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

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
|
|
|
|
|
Jul 8 2011, 18:57
|

Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|