011119xx 0 7 июля, 2011 Опубликовано 7 июля, 2011 · Жалоба Необходимо в Кейле объявить массив без указания его размера. А потом по необходимости использования массива задать размер в зависимости от условий. Можно ли это сделать на си и как? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
V_G 8 7 июля, 2011 Опубликовано 7 июля, 2011 · Жалоба За Кейл не скажу, а в Винде делал указатель на указатель (**) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ukpyr 0 7 июля, 2011 Опубликовано 7 июля, 2011 (изменено) · Жалоба без выделения памяти - никак, объявите массив максимальной емкости и переменную с текущим размером. с выделением памяти через malloc/free - при каждом изменении размера в большую сторону нужно выделять новый массив, копировать содержимое старого и освобождать старый, в меньшую - изменять переменную с текущим размером Изменено 7 июля, 2011 пользователем ukpyr Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 7 июля, 2011 Опубликовано 7 июля, 2011 · Жалоба В C99 можно задать размер массива в момент его описания (через переменную). Так же можно выделить массив на стеке, через alloca. Что из этого поддерживает Keil мне неведомо :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GetSmart 0 7 июля, 2011 Опубликовано 7 июля, 2011 · Жалоба А потом по необходимости использования массива задать размер в зависимости от условий. Си же вроде не контролирует индексацию внутри массивов. Значит реальный размер массива ему "до лампочки". Лишь бы размер был больше константной индексации. Поэтому имхо вопрос заключается в создании указателя на пустой массив, потом по ходу проги присваивание указателю адреса (на статик, динамик или прочий буфер) и хранение размера массива во второй целочисленной переменной. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
011119xx 0 7 июля, 2011 Опубликовано 7 июля, 2011 · Жалоба Не могли бы привести код в качестве примера? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
skripach 5 7 июля, 2011 Опубликовано 7 июля, 2011 · Жалоба Как в си объявить массив с возможностью изменения его размера? Никак. ..остальное изврат. Использовать динамическое выделение памяти и указатель. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
011119xx 0 8 июля, 2011 Опубликовано 8 июля, 2011 · Жалоба Поэтому имхо вопрос заключается в создании указателя на пустой массив, потом по ходу проги присваивание указателю адреса (на статик, динамик или прочий буфер) и хранение размера массива во второй целочисленной переменной. В данном случае это должно быть как-то так? 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; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 0 8 июля, 2011 Опубликовано 8 июля, 2011 · Жалоба В данном случае это должно быть как-то так? Абсолютный ужас. Полное непонимание не только языка, но и собственно физического смысла творимого :( НЕМЕДЛЕННО! Бросить "программировать" и ЧИТАТЬ учебники, иначе дальше без осознания хоть какой-то основы будет только хуже. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GetSmart 0 8 июля, 2011 Опубликовано 8 июля, 2011 · Жалоба Необходимо в Кейле объявить массив без указания его размера. А потом по необходимости использования массива задать размер в зависимости от условий. Можно ли это сделать на си и как? Приведите пример того, что хотите делать с массивом (использование массива). Для начала для массива константного размера. Я покажу как это сделать с массивом переменной длины. Не слушайте zltigo. У него плохое настроение :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jorikdima 0 8 июля, 2011 Опубликовано 8 июля, 2011 · Жалоба Абсолютный ужас. Полное непонимание не только языка, но и собственно физического смысла творимого :( НЕМЕДЛЕННО! Бросить "программировать" и ЧИТАТЬ учебники, иначе дальше без осознания хоть какой-то основы будет только хуже. Поддержу, пожалуй. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 8 июля, 2011 Опубликовано 8 июля, 2011 · Жалоба Абсолютный ужас. Полное непонимание не только языка, но и собственно физического смысла творимого :( :bb-offtopic: Публичный дом, молодая проститутка выбегает из номера клиента в растрепанных чувствах и с воплями - УЖАС, УЖАС, УЖАС!!!! Мадам успокаивает проститутку и сама идет к клиенту. Через некоторое время выходит, и говорит - Ну да, ну ужас. Ну уж никак не УЖАС, УЖАС, УЖАС! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
011119xx 0 8 июля, 2011 Опубликовано 8 июля, 2011 · Жалоба Не много поправлюсь: 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); } Это работает. Но это вариант с явным указанием размера буфера при объявлении. Я так понял иначе и нельзя. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GetSmart 0 8 июля, 2011 Опубликовано 8 июля, 2011 (изменено) · Жалоба Поддержу, пожалуй. Если у форума одна из задач - интерактивное обучение, естественно в такой форме чтобы у вопрошающего не отбивалось желание вообще заниматься, то это не лучший подход. Старческое брюзжание. Представьте такого человека в роли препода в любом заведении и учиться сразу расхочется. Ветка называется "в помощь начинающему". Расслабьтесь, профи :) ... слегка подправил: void main(void) { ptr_buffer = &Buffer; index_buffer = 32; ptr_buffer[index_buffer] = 0х0010; value = ptr_buffer[index_buffer]; } Это работает. Но это вариант с явным указанием размера буфера при объявлении. Я так понял иначе и нельзя. Иначе буферов может быть много и разных. Хоть с заданным размером на этапе компиляции, хоть с неявным, выделенным в динамической памяти (куче). И по ходу проги, одному общему указателю (ptr_buffer) можно присваивать разные адреса (адреса разных буферов). Тогда один общий алгоритм будет фактически "шарить" по разным буферам. Частный случай переменной-указателя - параметр функции. Изменено 8 июля, 2011 пользователем GetSmart Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 0 8 июля, 2011 Опубликовано 8 июля, 2011 · Жалоба Не много поправлюсь: Ничего себе немного - каждой строчке были ошибки, поменяли все строчки, кроме одной: ptr_buffer = &Buffer; В этой, естественно осталась полная лажа, посему вот это: Это работает. Неправда. При всем этом попытались исправить (но не исправили) только формальные ошибки не позволявшие сие даже скомпилировать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться