Перейти к содержанию
    

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

Необходимо в Кейле объявить массив без указания его размера. А потом по необходимости использования массива задать размер в зависимости от условий. Можно ли это сделать на си и как?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

За Кейл не скажу, а в Винде делал указатель на указатель (**)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

без выделения памяти - никак, объявите массив максимальной емкости и переменную с текущим размером.

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

Изменено пользователем ukpyr

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В C99 можно задать размер массива в момент его описания (через переменную). Так же можно выделить массив на стеке, через alloca. Что из этого поддерживает Keil мне неведомо :)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А потом по необходимости использования массива задать размер в зависимости от условий.

Си же вроде не контролирует индексацию внутри массивов. Значит реальный размер массива ему "до лампочки". Лишь бы размер был больше константной индексации.

Поэтому имхо вопрос заключается в создании указателя на пустой массив, потом по ходу проги присваивание указателю адреса (на статик, динамик или прочий буфер) и хранение размера массива во второй целочисленной переменной.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Никак. ..остальное изврат.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Поэтому имхо вопрос заключается в создании указателя на пустой массив, потом по ходу проги присваивание указателю адреса (на статик, динамик или прочий буфер) и хранение размера массива во второй целочисленной переменной.

В данном случае это должно быть как-то так?

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. У него плохое настроение :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Абсолютный ужас. Полное непонимание не только языка, но и собственно физического смысла творимого :(

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

Поддержу, пожалуй.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Абсолютный ужас. Полное непонимание не только языка, но и собственно физического смысла творимого :(

:bb-offtopic:

Публичный дом, молодая проститутка выбегает из номера клиента в растрепанных чувствах и с воплями

- УЖАС, УЖАС, УЖАС!!!!

Мадам успокаивает проститутку и сама идет к клиенту. Через некоторое время выходит, и говорит

- Ну да, ну ужас. Ну уж никак не УЖАС, УЖАС, УЖАС!

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не много поправлюсь:

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);
}

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Поддержу, пожалуй.

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

 

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

 

...

слегка подправил:

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

 

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

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

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

Изменено пользователем GetSmart

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не много поправлюсь:

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

ptr_buffer = &Buffer;

В этой, естественно осталась полная лажа, посему вот это:

Это работает.

Неправда.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...