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

 
 
> Как в си объявить массив с возможностью изменения его размера?
011119xx
сообщение Jul 7 2011, 03:36
Сообщение #1


Местный
***

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



Необходимо в Кейле объявить массив без указания его размера. А потом по необходимости использования массива задать размер в зависимости от условий. Можно ли это сделать на си и как?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
011119xx
сообщение Jul 8 2011, 08:06
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 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
AHTOXA
сообщение Jul 8 2011, 08:45
Сообщение #3


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(011119xx @ Jul 8 2011, 14:06) *
Это работает. Но это вариант с явным указанием размера буфера при объявлении. Я так понял иначе и нельзя.


Есть ещё вариант. Стандарт 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
011119xx
сообщение Jul 8 2011, 09:44
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 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
AHTOXA
сообщение Jul 8 2011, 10:41
Сообщение #5


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(011119xx @ Jul 8 2011, 15:44) *
В данном случае массив объявляется внутри функции. Мне нужно чтобы массив был глобальным, он потом используется в другой функции.

Если нужен глобальный, то объявляйте максимально возможного размера и не парьтесь. Это будет самый простой и надёжный вариант. Он гарантирует, что памяти хватит на самый большой шрифт, и при этом не использует динамического распределения памяти.
Ведь вам в любом случае нужно иметь память под самый большой шрифт, пусть она сразу и будет выделена.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jul 8 2011, 10:47
Сообщение #6


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

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



Цитата(AHTOXA @ Jul 8 2011, 14:41) *
Если нужен глобальный, то объявляйте максимально возможного размера и не парьтесь. Это будет самый простой и надёжный вариант. Он гарантирует, что памяти хватит на самый большой шрифт, и при этом не использует динамического распределения памяти.
Ведь вам в любом случае нужно иметь память под самый большой шрифт, пусть она сразу и будет выделена.


Ну ну. Сегодня шрифт такой, завтра шеф (заказчик) запросит другой. Ну хоть проверку на размерность массива вставьте!
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jul 8 2011, 10:55
Сообщение #7


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(sergeeff @ Jul 8 2011, 16:47) *
Ну ну. Сегодня шрифт такой, завтра шеф (заказчик) запросит другой. Ну хоть проверку на размерность массива вставьте!
Вы о чём? Речь идёт о задании размера во время компиляции/линковки. Если не хватит памяти под новый шрифт, то линкер обругается, вот и проверка.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jul 8 2011, 11:04
Сообщение #8


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

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



Цитата(AHTOXA @ Jul 8 2011, 13:55) *
Вы о чём? Речь идёт о задании размера во время компиляции/линковки. Если не хватит памяти под новый шрифт, то линкер обругается, вот и проверка.


Уважаемый. Вы понимаете про что говорите? Статический массив автору был нужен для копирования тела символа. Где гарантия, что в другом шрифте, символы "влезут" в этот массив? Кто мешает использвать шрифт, с меньшим количеством используемых символов (т.е. сам шрифт может быть компактнее), но при этом сами символы крупнее. И что вам тут линкер скажет? Странное это программирование, основанное на предположениях и утверждениях "и так катит".
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jul 8 2011, 11:28
Сообщение #9


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(sergeeff @ Jul 8 2011, 17:04) *
Уважаемый. Вы понимаете про что говорите? Статический массив автору был нужен для копирования тела символа. Где гарантия, что в другом шрифте, символы "влезут" в этот массив?

А вы попробуйте для интереса иногда читать то, на что возражаете. Выделяем массив размера как максимальный символ. И всё. Размер этот известен на этапе компиляции.
Цитата(sergeeff @ Jul 8 2011, 17:04) *
Странное это программирование, основанное на предположениях и утверждениях "и так катит".
Это вы уже сами что-то себе выдумали, и доблестно с этим воюете. Грубите, кстати.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jul 8 2011, 11:47
Сообщение #10


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

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



Цитата(AHTOXA @ Jul 8 2011, 14:28) *
А вы попробуйте для интереса иногда читать то, на что возражаете. Выделяем массив размера как максимальный символ. И всё. Размер этот известен на этапе компиляции.Это вы уже сами что-то себе выдумали, и доблестно с этим воюете. Грубите, кстати.


Это вы придумали такой вариант реализации системы, где шрифты подключаются на этапе сборки проекта. Откуда мне и вам знать, может они на SD карточке лежат?

А в чем грубость то? Объясните старику. Да, и не плохо бы примерчик, где линкер ругается на размер массива, в который вы собираетесь что то копировать.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jul 8 2011, 12:35
Сообщение #11


фанат дивана
******

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


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jul 8 2011, 16:02
Сообщение #12


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

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



Цитата(AHTOXA @ Jul 8 2011, 16:35) *
Код
int array[100500];

(предвидя придирки - на mega8)


Перечитал 3 (три) раза. Круто. А магическую циферку 100500 надо, естественно, ручками вычислить, перед включением нового фонта? Если забыл это сделать, или описался (нолик пропустил, по случаю жаркой погоды)? Никто, ни компилятор, ни линкер, даже не колыхнутся, вам об этом любезно сообщить. И будете долго думать, чего это программа грохается.

Мораль - никакая это не диагностика. Тем более не диагностика этапа компиляции.

Нужно использовать, например, механизм static_assert, но это только под С++.

P.S. Это не придирки.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 011119xx   Как в си объявить массив с возможностью изменения его размера?   Jul 7 2011, 03:36
- - V_G   За Кейл не скажу, а в Винде делал указатель на ука...   Jul 7 2011, 04:17
- - ukpyr   без выделения памяти - никак, объявите массив макс...   Jul 7 2011, 04:44
|- - vvs157   Цитата(ukpyr @ Jul 7 2011, 08:44) без выд...   Jul 8 2011, 09:47
- - XVR   В C99 можно задать размер массива в момент его опи...   Jul 7 2011, 05:55
- - GetSmart   Цитата(011119xx @ Jul 7 2011, 08:36) А по...   Jul 7 2011, 07:00
|- - 011119xx   Цитата(GetSmart @ Jul 7 2011, 13:00) Поэт...   Jul 8 2011, 07:27
|- - zltigo   QUOTE (011119xx @ Jul 8 2011, 10:27) В да...   Jul 8 2011, 07:53
|- - jorikdima   Цитата(zltigo @ Jul 8 2011, 11:53) Абсолю...   Jul 8 2011, 08:01
||- - GetSmart   Цитата(jorikdima @ Jul 8 2011, 13:01) Под...   Jul 8 2011, 08:14
||- - zltigo   QUOTE (GetSmart @ Jul 8 2011, 11:14) Если...   Jul 8 2011, 08:43
|- - XVR   Цитата(zltigo @ Jul 8 2011, 11:53) Абсолю...   Jul 8 2011, 08:05
- - 011119xx   Не могли бы привести код в качестве примера?   Jul 7 2011, 08:27
- - skripach   ЦитатаКак в си объявить массив с возможностью изме...   Jul 7 2011, 13:49
- - GetSmart   Цитата(011119xx @ Jul 7 2011, 08:36) Необ...   Jul 8 2011, 08:01
|- - zltigo   QUOTE (011119xx @ Jul 8 2011, 11:06) Не м...   Jul 8 2011, 08:27
|- - AHTOXA   Цитата(sergeeff @ Jul 8 2011, 22:02) P.S....   Jul 8 2011, 17:31
- - 011119xx   Не ожидал господа от вас таких ответов. Извините, ...   Jul 8 2011, 08:29
|- - zltigo   QUOTE (011119xx @ Jul 8 2011, 11:29) Може...   Jul 8 2011, 08:55
|- - GetSmart   Цитата(zltigo @ Jul 8 2011, 13:55) ... Иб...   Jul 8 2011, 09:05
|- - zltigo   QUOTE (GetSmart @ Jul 8 2011, 12:05) А по...   Jul 8 2011, 09:11
|- - ar__systems   Цитата(zltigo @ Jul 8 2011, 05:11) Что пр...   Jul 8 2011, 18:02
- - sergeeff   Может автор ветки откроет великую тайну, зачем ему...   Jul 8 2011, 08:30
- - 011119xx   Например в шрифте символы имеют разную ширину при ...   Jul 8 2011, 08:49
|- - sergeeff   Цитата(011119xx @ Jul 8 2011, 11:49) Напр...   Jul 8 2011, 08:53
|- - GetSmart   Цитата(011119xx @ Jul 8 2011, 13:49) Напр...   Jul 8 2011, 08:55
|- - sergeeff   Цитата(GetSmart @ Jul 8 2011, 11:55) Для ...   Jul 8 2011, 09:00
|- - 011119xx   Цитата(sergeeff @ Jul 8 2011, 15:00) Вы, ...   Jul 8 2011, 09:09
|- - AHTOXA   Цитата(011119xx @ Jul 8 2011, 15:08) Дело...   Jul 8 2011, 09:11
||- - 011119xx   Цитата(AHTOXA @ Jul 8 2011, 15:11) Вы слу...   Jul 8 2011, 09:20
|- - GetSmart   Цитата(011119xx @ Jul 8 2011, 14:09) Дело...   Jul 8 2011, 09:18
|- - sergeeff   Цитата(GetSmart @ Jul 8 2011, 12:13) Так ...   Jul 8 2011, 09:19
|- - 011119xx   Цитата(GetSmart @ Jul 8 2011, 15:18) Так ...   Jul 8 2011, 09:35
|- - GetSmart   Цитата(011119xx @ Jul 8 2011, 14:35) Прич...   Jul 8 2011, 09:42
|- - sergeeff   Цитата(GetSmart @ Jul 8 2011, 13:42) В ст...   Jul 8 2011, 09:49
|- - GetSmart   Цитата(sergeeff @ Jul 8 2011, 14:49) А по...   Jul 8 2011, 09:55
|- - andron86   Цитата(sergeeff @ Jul 8 2011, 11:49) Указ...   Jul 8 2011, 10:48
|- - sergeeff   Цитата(andron86 @ Jul 8 2011, 13:48) По м...   Jul 8 2011, 10:55
|- - andron86   Цитата(sergeeff @ Jul 8 2011, 12:55) Вы э...   Jul 8 2011, 10:57
- - 011119xx   Это Кодptr_buffer = &Buffer; как раз и заносит...   Jul 8 2011, 09:00
|- - zltigo   QUOTE (011119xx @ Jul 8 2011, 12:00) Это ...   Jul 8 2011, 09:08
||- - GetSmart   Ничё не сделал, только вошёл И сразу мошенник. С...   Jul 8 2011, 13:42
||- - zltigo   QUOTE (GetSmart @ Jul 8 2011, 16:42) Себя...   Jul 8 2011, 14:28
||- - GetSmart   Цитата(zltigo @ Jul 8 2011, 19:28) Если э...   Jul 8 2011, 14:46
|- - sergeeff   Цитата(011119xx @ Jul 8 2011, 12:00) Это ...   Jul 8 2011, 09:11
|- - GetSmart   Цитата(sergeeff @ Jul 8 2011, 14:11) А ...   Jul 8 2011, 09:30
||- - sergeeff   Цитата(GetSmart @ Jul 8 2011, 13:30) Прав...   Jul 8 2011, 09:37
||- - GetSmart   Цитата(sergeeff @ Jul 8 2011, 14:37) Что ...   Jul 8 2011, 09:45
||- - vvs157   Цитата(GetSmart @ Jul 8 2011, 13:45) Чему...   Jul 8 2011, 10:02
|||- - GetSmart   Цитата(vvs157 @ Jul 8 2011, 15:02) .. в с...   Jul 8 2011, 10:15
||||- - vvs157   Цитата(GetSmart @ Jul 8 2011, 14:15) Пото...   Jul 8 2011, 10:21
||||- - vvs157   Цитата(GetSmart @ Jul 8 2011, 14:15) Одна...   Jul 8 2011, 10:24
|||||- - sergeeff   Цитата(vvs157 @ Jul 8 2011, 14:24) Это оч...   Jul 8 2011, 10:32
|||||- - zltigo   QUOTE (sergeeff @ Jul 8 2011, 13:32) вмес...   Jul 8 2011, 10:44
||||- - zltigo   QUOTE (GetSmart @ Jul 8 2011, 13:15) Одна...   Jul 8 2011, 10:40
||||- - GetSmart   Цитата(zltigo @ Jul 8 2011, 15:34) Хвала ...   Jul 8 2011, 10:41
||||- - zltigo   QUOTE (GetSmart @ Jul 8 2011, 13:41) Но в...   Jul 8 2011, 10:48
||||- - GetSmart   Цитата(zltigo @ Jul 8 2011, 15:48) Кто зд...   Jul 8 2011, 10:52
||||- - GetSmart   Цитата(zltigo @ Jul 8 2011, 15:48) Это не...   Jul 8 2011, 10:56
||||- - zltigo   QUOTE (GetSmart @ Jul 8 2011, 13:56) zlti...   Jul 8 2011, 13:31
|||- - ar__systems   Цитата(vvs157 @ Jul 8 2011, 06:02) Вообще...   Jul 8 2011, 18:11
||- - zltigo   QUOTE (GetSmart @ Jul 8 2011, 12:45) void...   Jul 8 2011, 10:23
||- - GetSmart   Цитата(zltigo @ Jul 8 2011, 15:23) Замени...   Jul 8 2011, 10:28
|- - sasamy   Цитата(sergeeff @ Jul 8 2011, 13:11) Хоть...   Jul 8 2011, 12:01
|- - ReAl   Цитата(sasamy @ Jul 8 2011, 15:01) abc --...   Jul 8 2011, 15:13
|- - GetSmart   Цитата(ReAl @ Jul 8 2011, 20:13) Речь-то ...   Jul 8 2011, 15:32
||- - ar__systems   Цитата(GetSmart @ Jul 8 2011, 11:32) Я к ...   Jul 8 2011, 18:25
||- - zltigo   QUOTE (ar__systems @ Jul 8 2011, 21:25) Э...   Jul 8 2011, 18:32
|- - sasamy   Цитата(ReAl @ Jul 8 2011, 19:13) "Ой...   Jul 8 2011, 15:41
|- - zltigo   QUOTE (sasamy @ Jul 8 2011, 18:41) ууу......   Jul 8 2011, 16:41
||- - sasamy   Цитата(zltigo @ Jul 8 2011, 20:41) А если...   Jul 8 2011, 17:13
||- - zltigo   QUOTE (sasamy @ Jul 8 2011, 20:13) кроме ...   Jul 8 2011, 18:06
||- - ar__systems   Цитата(zltigo @ Jul 8 2011, 14:06) Ну в э...   Jul 8 2011, 18:15
||- - AHTOXA   Цитата(zltigo @ Jul 9 2011, 00:06) Код 5...   Jul 8 2011, 18:49
|- - ViKo   Цитата(sasamy @ Jul 8 2011, 18:41) Хотя н...   Jul 8 2011, 17:43
|- - sasamy   Цитата(ViKo @ Jul 8 2011, 21:43) Имя масс...   Jul 8 2011, 18:06
||- - ViKo   Цитата(sasamy @ Jul 8 2011, 21:06) А вы в...   Jul 8 2011, 18:28
||- - ar__systems   Я понял, откуда растет это волна негодования. Если...   Jul 8 2011, 18:38
||- - Danis   Цитата(ar__systems @ Jul 8 2011, 22:38) Д...   Jul 8 2011, 18:49
||- - sonycman   Цитата(ar__systems @ Jul 8 2011, 22:38) Д...   Jul 8 2011, 18:52
||- - zltigo   QUOTE (ar__systems @ Jul 8 2011, 21:38) В...   Jul 8 2011, 18:57
||- - AHTOXA   Цитата(zltigo @ Jul 9 2011, 00:57) Какая ...   Jul 8 2011, 19:03
|- - Danis   Цитата(ViKo @ Jul 8 2011, 20:43) Имя масс...   Jul 8 2011, 18:11
- - skripach   ЦитатаА по поводу &abc можете почитать у отцов...   Jul 8 2011, 10:08
- - skripach   sasamy, поддержу.   Jul 8 2011, 12:22
- - ViKo   http://chitay.org/c/04/0409.htm upd. и еще оттуда ...   Jul 8 2011, 13:12
- - Danis   Цитата(011119xx @ Jul 7 2011, 06:36) Необ...   Jul 8 2011, 18:02
- - 011119xx   Keil не ругается на выражение Кодptr_buffer = ...   Jul 8 2011, 18:06
- - zltigo   QUOTE (ar__systems @ Jul 8 2011, 21:02) С...   Jul 8 2011, 18:21
2 страниц V   1 2 >


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

 


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


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