|
|
  |
Как в си объявить массив с возможностью изменения его размера? |
|
|
|
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; тоже «всего лишь слегка не совпадает по типу», не так ли? Но любой вменяемый компилятор тоже обязан послать нафиг.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|