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

 
 
12 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> Как в си объявить массив с возможностью изменения его размера?
011119xx
сообщение Jul 7 2011, 03:36
Сообщение #1


Местный
***

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



Необходимо в Кейле объявить массив без указания его размера. А потом по необходимости использования массива задать размер в зависимости от условий. Можно ли это сделать на си и как?
Go to the top of the page
 
+Quote Post
V_G
сообщение Jul 7 2011, 04:17
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



За Кейл не скажу, а в Винде делал указатель на указатель (**)
Go to the top of the page
 
+Quote Post
ukpyr
сообщение Jul 7 2011, 04:44
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1 264
Регистрация: 17-06-08
Из: бандустан
Пользователь №: 38 347



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

Сообщение отредактировал ukpyr - Jul 7 2011, 04:45
Go to the top of the page
 
+Quote Post
XVR
сообщение Jul 7 2011, 05:55
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



В C99 можно задать размер массива в момент его описания (через переменную). Так же можно выделить массив на стеке, через alloca. Что из этого поддерживает Keil мне неведомо sm.gif
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jul 7 2011, 07:00
Сообщение #5


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(011119xx @ Jul 7 2011, 08:36) *
А потом по необходимости использования массива задать размер в зависимости от условий.

Си же вроде не контролирует индексацию внутри массивов. Значит реальный размер массива ему "до лампочки". Лишь бы размер был больше константной индексации.
Поэтому имхо вопрос заключается в создании указателя на пустой массив, потом по ходу проги присваивание указателю адреса (на статик, динамик или прочий буфер) и хранение размера массива во второй целочисленной переменной.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
011119xx
сообщение Jul 7 2011, 08:27
Сообщение #6


Местный
***

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



Не могли бы привести код в качестве примера?
Go to the top of the page
 
+Quote Post
skripach
сообщение Jul 7 2011, 13:49
Сообщение #7


■ ■ ■ ■
*****

Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443



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

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


--------------------
Делай что должен и будь что будет.
Go to the top of the page
 
+Quote Post
011119xx
сообщение Jul 8 2011, 07:27
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 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;
}

Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 8 2011, 07:53
Сообщение #9


Гуру
******

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



QUOTE (011119xx @ Jul 8 2011, 10:27) *
В данном случае это должно быть как-то так?

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jul 8 2011, 08:01
Сообщение #10


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(011119xx @ Jul 7 2011, 08:36) *
Необходимо в Кейле объявить массив без указания его размера. А потом по необходимости использования массива задать размер в зависимости от условий. Можно ли это сделать на си и как?

Приведите пример того, что хотите делать с массивом (использование массива). Для начала для массива константного размера.
Я покажу как это сделать с массивом переменной длины.

Не слушайте zltigo. У него плохое настроение sm.gif


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
jorikdima
сообщение Jul 8 2011, 08:01
Сообщение #11


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280



Цитата(zltigo @ Jul 8 2011, 11:53) *
Абсолютный ужас. Полное непонимание не только языка, но и собственно физического смысла творимого sad.gif
НЕМЕДЛЕННО! Бросить "программировать" и ЧИТАТЬ учебники, иначе дальше без осознания хоть какой-то основы будет только хуже.

Поддержу, пожалуй.
Go to the top of the page
 
+Quote Post
XVR
сообщение Jul 8 2011, 08:05
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(zltigo @ Jul 8 2011, 11:53) *
Абсолютный ужас. Полное непонимание не только языка, но и собственно физического смысла творимого sad.gif

bb-offtopic.gif
Публичный дом, молодая проститутка выбегает из номера клиента в растрепанных чувствах и с воплями
- УЖАС, УЖАС, УЖАС!!!!
Мадам успокаивает проститутку и сама идет к клиенту. Через некоторое время выходит, и говорит
- Ну да, ну ужас. Ну уж никак не УЖАС, УЖАС, УЖАС!
Go to the top of the page
 
+Quote Post
011119xx
сообщение Jul 8 2011, 08:06
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 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);
}


Это работает. Но это вариант с явным указанием размера буфера при объявлении. Я так понял иначе и нельзя.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jul 8 2011, 08:14
Сообщение #14


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(jorikdima @ Jul 8 2011, 13:01) *
Поддержу, пожалуй.

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

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

Цитата(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


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 8 2011, 08:27
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post

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

 


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


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