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

 
 
12 страниц V  « < 2 3 4 5 6 > »   
Reply to this topicStart new topic
> Как в си объявить массив с возможностью изменения его размера?
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

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 23:48
Рейтинг@Mail.ru


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