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

 
 
12 страниц V  < 1 2 3 4 5 > »   
Reply to this topicStart new topic
> Как в си объявить массив с возможностью изменения его размера?
zltigo
сообщение Jul 8 2011, 09:11
Сообщение #31


Гуру
******

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



QUOTE (GetSmart @ Jul 8 2011, 12:05) *
А почему сразу бред? А проверить?

Что проверить? Что указатель на int не является кирпичом?
QUOTE
А почему не УЖАС, УЖАС, УЖАС!!! ??? sm.gif

Потому,что я это уже сказал ранее.


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


.
******

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



Цитата(011119xx @ Jul 8 2011, 14:09) *
Дело в том что когда я читаю ширину и высоту символа мне нужно создать массив размером = ширина*высота и в этот массив скопировать некую картинку такого размера. Это скажем так: фон для символа. Потом в этот массив копируется сам символ, но при этом затирает только очертания символа. Потом из этого массива данные выводятся в дисплей

Так создайте сразу статичный массив с размером под максимально большой символ, который потребуется. При работе с малыми символами конец массива использоваться не будет. Велика беда. Иначе можно выделять место в стеке, как предлагал AHTOXA.

Цитата(zltigo @ Jul 8 2011, 14:11) *
Потому,что я это уже сказал ранее.

Так это были Вы? sm.gif


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


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

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(GetSmart @ Jul 8 2011, 12:13) *
Так создайте сразу статичный массив с размером под максимально большой символ, который потребуется. При работе с малыми символами конец массива использоваться не будет. Велика беда. Иначе можно выделять место в стеке, как предлагал AHTOXA.


Да уж, прав наш гуру zltigo, надо бы все-таки, научиться голову включать. На кой нужен этот вспомогательный массив автору топика? Маску наложить на байт из массива? Ту и кто мешает это делать при побайтном копировании тела буквы на дисплей?
Go to the top of the page
 
+Quote Post
011119xx
сообщение Jul 8 2011, 09:20
Сообщение #34


Местный
***

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



Цитата(AHTOXA @ Jul 8 2011, 15:11) *
Вы случайно в пылу полемики не пропустили мой пост (№19)? sm.gif По идее как раз подходит.

Не пропустил. Спасибо. Хороший вариант. Буду пробовать
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jul 8 2011, 09:30
Сообщение #35


.
******

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



Цитата(sergeeff @ Jul 8 2011, 14:11) *
А &abc - дает адрес указателя на массив, что, согласитесь, совсем не то, что вы хотите получить и использовать.

на что вам и указал уважаемый zltigo.

Право, какая глупость. Это что за адрес несуществующего "указателя" на массив?


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


Местный
***

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



Цитата(GetSmart @ Jul 8 2011, 15:18) *
Так создайте сразу статичный массив с размером под максимально большой символ, который потребуется. При работе с малыми символами конец массива использоваться не будет. Велика беда.

Сейчас так и делаю... А если у меня не один шрифт? Выделять буфер размером с самый большой символ самого крупного шрифта? Это весьма расточительно будет. Представьте символ высотой 40 и шириной 35. На каждый цвет приходится 16 бит. Получаем буфер 2800 байт. Причем большой шрифт будет использоваться очень редко, а память будет потрачена.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jul 8 2011, 09:37
Сообщение #37


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

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(GetSmart @ Jul 8 2011, 13:30) *
Право, какая глупость. Это что за адрес несуществующего "указателя" на массив?


Что вы подразумеваете под несуществующим указателем на массив?
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jul 8 2011, 09:42
Сообщение #38


.
******

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



Цитата(011119xx @ Jul 8 2011, 14:35) *
Причем большой шрифт будет использоваться очень редко, а память будет потрачена.

В стеке нужно будет иметь гарантированно нужный объём памяти при самом наихудшем случае. А вдруг не хватит? В статике же один раз выделил и не напрягаешься. По этому поводу есть рассуждения в умных книжках.


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


Местный
***

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



Цитата(AHTOXA @ Jul 8 2011, 14:45) *
Есть ещё вариант. Стандарт C99 поддерживает автоматические переменные-массивы переменной длины:
Код
int mean_of_N_samples(int N)
{
    int arr[N];
    for (int i = 0; i < N; i++)
    {
        arr[i] = get_sample();
    }
    return mean(arr, N);
}

Массив (обычно) создаётся на стеке. То есть, если вам ваш массив переменной длины нужен временно, то это отличный вариант.

В данном случае массив объявляется внутри функции. Мне нужно чтобы массив был глобальным, он потом используется в другой функции.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jul 8 2011, 09:45
Сообщение #40


.
******

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



Цитата(sergeeff @ Jul 8 2011, 14:37) *
Что вы подразумеваете под несуществующим указателем на массив?

Код
u16 abc[10];
void *p;

main()
{
p = &abc;
...
}

Чему равен p?
Цитата
А &abc - дает адрес указателя на массив

Что такое адрес указателя на массив?


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


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

Группа: Свой
Сообщений: 1 526
Регистрация: 8-04-05
Пользователь №: 3 960



Цитата(ukpyr @ Jul 7 2011, 08:44) *
без выделения памяти - никак, объявите массив максимальной емкости и переменную с текущим размером.
с выделением памяти через malloc/free - при каждом изменении размера в большую сторону нужно выделять новый массив, копировать содержимое старого и освобождать старый, в меньшую - изменять переменную с текущим размером
А чем realloc не устраивает?
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jul 8 2011, 09:49
Сообщение #42


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

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(GetSmart @ Jul 8 2011, 13:42) *
В стеке нужно будет иметь гарантированно нужный объём памяти при самом наихудшем случае. А вдруг не хватит? В статике же один раз выделил и не напрягаешься. По этому поводу есть рассуждения в умных книжках.


Мы давайте "заср...м" глобальным массивом дефицитную память процессора, а пользоваться им будем где-то в процедуре. А кто мешает в этой самой функции объявлять такой же массив (если стека хватает)? Хотя я писал уже, что в данной задаче и массив то этот не нужен вовсе.

А по поводу &abc можете почитать у отцов основателей http://www.realcoding.net/article/view/1094

Цитата
Что такое адрес указателя на массив?


Указатель лежит в памяти. Адрес указателя - это адрес этой памяти.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jul 8 2011, 09:55
Сообщение #43


.
******

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



Цитата(sergeeff @ Jul 8 2011, 14:49) *
А по поводу &abc можете почитать у отцов основателей http://www.realcoding.net/article/view/1094

Не читал, но осуждаю sm.gif
Но на элементарный вопрос не ответить - надо уметь.

Цитата(sergeeff @ Jul 8 2011, 14:49) *
Хотя я писал уже, что в данной задаче и массив то этот не нужен вовсе.

В названии топика есть вопрос. На него и отвечаем. Остальное вторично. Тем более, кто сказал, что память дефицитная. Если подобный массив в стеке будет только в одном месте выделяться, то статичный вариант лучше во всех отношениях. Точнее, если такая квазидинамическая память больше в программе не используется.

Сообщение отредактировал GetSmart - Jul 8 2011, 09:56


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


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

Группа: Свой
Сообщений: 1 526
Регистрация: 8-04-05
Пользователь №: 3 960



Цитата(GetSmart @ Jul 8 2011, 13:45) *
Чему равен p?
Вообще-то в случае обявленного массива array[n] указатель &array, скорее всего будет равен указателю array. Скорее всего - потому что зависит от реализации компилятора. Но пользоваться этим очень плохо, так как в случае динамичесого массива, созданного через calloc/malloc это точно будет не так.
Go to the top of the page
 
+Quote Post
skripach
сообщение Jul 8 2011, 10:08
Сообщение #45


■ ■ ■ ■
*****

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



Цитата
А по поводу &abc можете почитать у отцов основателей http://www.realcoding.net/article/view/1094

От туда:
Цитата
Операция & применима только к переменным и элементам массива,

abc есть константа. Не? 05.gif
UPD:
Т.е. запись &abc просто нелогична, ну как получить адрес адреса.


--------------------
Делай что должен и будь что будет.
Go to the top of the page
 
+Quote Post

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

 


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


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