|
|
  |
Как в си объявить массив с возможностью изменения его размера? |
|
|
|
Jul 8 2011, 15:41
|
Знающий
   
Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858

|
Цитата(ReAl @ Jul 8 2011, 19:13)  "Ой".
Утверждение "&abc это адрес указателя" неправильно, но и Вы что-то странное написали. С «у константы не может быть адреса» можно согласиться, если определиться, что под словом «константа» имеется ввиду литерал. const int ci = 5; // тоже ведь константа ууу... тут наверно книжки не помогут - не нужно изобретать своих определений, все уже определено без вас, в том числе термин "константа" Цитата In computer programming, a constant is an identifier whose associated value cannot typically be altered by the program during its execution (though in some cases this can be circumvented, e.g. using self-modifying code). Хотя написал некорректно, смысл в том что имя массива это константа и под нее вообще не выделяется память, память выделяется для массива - никакого адреса поэтому не получить.
Сообщение отредактировал sasamy - Jul 8 2011, 16:02
|
|
|
|
|
Jul 8 2011, 16:02
|
Профессионал
    
Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007

|
Цитата(AHTOXA @ Jul 8 2011, 16:35)  Код int array[100500]; (предвидя придирки - на mega8) Перечитал 3 (три) раза. Круто. А магическую циферку 100500 надо, естественно, ручками вычислить, перед включением нового фонта? Если забыл это сделать, или описался (нолик пропустил, по случаю жаркой погоды)? Никто, ни компилятор, ни линкер, даже не колыхнутся, вам об этом любезно сообщить. И будете долго думать, чего это программа грохается. Мораль - никакая это не диагностика. Тем более не диагностика этапа компиляции. Нужно использовать, например, механизм static_assert, но это только под С++. P.S. Это не придирки.
|
|
|
|
|
Jul 8 2011, 16:41
|

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

|
QUOTE (sasamy @ Jul 8 2011, 18:41)  ууу... тут наверно книжки не помогут Конечно не помогут, тут надо головой думать, а не дергать общие определения из книг. QUOTE In computer programming, a constant is an identifier whose associated value cannot typically be altered by the program during its execution (though in some cases this can be circumvented, e.g. using self-modifying code). А если подумать, то "константа" целиком и полностью подпадающая под это совершенно правильное и всеобъемлющее определение может оказаться: - в RAM; - в ROM; - в регистре; - являться частью операнда. QUOTE ...смысл в том что имя массива это константа и под нее вообще не выделяется память точно  значит имеется константа имеющая некоторое value, но оно НИГДЕ не хранится, только при необходимости святым духом появляется  . Так-что память выделяется, вопрос только в том, способен и обязан-ли компилятор выдавать адреса констант всегда и любых.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 8 2011, 17:13
|
Знающий
   
Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858

|
Цитата(zltigo @ Jul 8 2011, 20:41)  А если подумать Бла, бла, бла - тут о массивах в С речь - это ясно ? Цитата точно  значит имеется константа имеющая некоторое value, но оно НИГДЕ не хранится, только при необходимости святым духом появляется  . Так-что память выделяется, вопрос только в том, способен и обязан-ли компилятор выдавать адреса констант всегда и любых. Тоесть вы утверждаете, что при определении массива char abc[10]; кроме 10 * sizeof(char) выделяется память для указателя abc ? Если да - потрудитесь привести пример, если нет то мне больше не о чем с вами говорить.
Сообщение отредактировал sasamy - Jul 8 2011, 17:14
|
|
|
|
|
Jul 8 2011, 17:31
|

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

|
Цитата(sergeeff @ Jul 8 2011, 22:02)  P.S. Это не придирки. Это именно что придирки. Речь шла не о проверке компилятором того, что программист правильно указал размер массива, а о проверке компилятором того, что под указанный программистом размер массива хватит памяти. Вот вам цитата из моего сообщения (к которому вы придрались изначально): Цитата(AHTOXA @ Jul 8 2011, 16:41)  Если нужен глобальный, то объявляйте максимально возможного размера и не парьтесь. Это будет самый простой и надёжный вариант. Он гарантирует, что памяти хватит на самый большой шрифт, и при этом не использует динамического распределения памяти. Ведь вам в любом случае нужно иметь память под самый большой шрифт, пусть она сразу и будет выделена. Почитайте раз пять, для надёжности. И если вдруг возникнет желание ещё что-то написать, то подумайте ещё немного, и не делайте этого, хватит уже позориться, на старости-то лет
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Jul 8 2011, 18:02
|

Twilight Zone
  
Группа: Свой
Сообщений: 454
Регистрация: 17-02-09
Из: Челябинск
Пользователь №: 44 990

|
Цитата(011119xx @ Jul 7 2011, 06:36)  Необходимо в Кейле объявить массив без указания его размера. А потом по необходимости использования массива задать размер в зависимости от условий. Можно ли это сделать на си и как? Используйте функции динамического распределения памяти: malloc, calloc, realloc, free. Если Вы новичок в Си временно забудьте об этом и используйте статические массивы.
--------------------
Magic Friend
|
|
|
|
|
Jul 8 2011, 18:02
|
self made
   
Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795

|
Цитата(zltigo @ Jul 8 2011, 05:11)  Что проверить? Что указатель на int не является кирпичом?
Потому,что я это уже сказал ранее. Строго говоря вы не правы. Выражение &Buffer имеет вполне определенный смысл. Значение его такое же как и &Buffer[0], но тип другой. Код char Buffer[100];
#include <stdio.h> int main(){
const char * A = Buffer; char * B = &Buffer; // Warning in C, error in C++ char (*B1)[100] = &Buffer; // No warnings here const char * C = &Buffer[0];
printf(" A %p\n",A); printf(" B %p\n",B); printf(" B1 %p\n",B1); printf(" C %p\n",C); return 0; } Естественно что все напечатанные адреса одинаковые.
|
|
|
|
|
Jul 8 2011, 18:06
|

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

|
Keil не ругается на выражение Код ptr_buffer = &Buffer; Кроме того, выражение Код ptr_buffer = &Buffer[0]; его тоже устраивает. Настолько, что он воспринимает их как одинаковыми. По существу для себя уже решил объявить массив максимально возможного размера, тем более памяти достаточно (96кб). А шрифты хранятся в самой флэш, тем более что ее тоже много (1Мб). Можно хранить конечно и в SD-карте, но даже при чтении через SDIO, скорость чтения получается меньше, чем при хранении во флэш.
Сообщение отредактировал 011119xx - Jul 8 2011, 18:07
|
|
|
|
|
Jul 8 2011, 18:06
|

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

|
QUOTE (sasamy @ Jul 8 2011, 20:13)  кроме 10 * sizeof(char) выделяется память для указателя abc ? Если да - потрудитесь привести пример, если нет то мне больше не о чем с вами говорить. Ну в этом случае, надеюсь Вы действительно будете помалкивать, и думать, как я и просил. Потому, что: CODE 50 char abc[10]; \ abc: \ 00000000 DS8 12 51 52 ulong test(void) 53 { 54 return( (ulong)abc ); \ test: \ 00000000 00009FE5 LDR R0,??test_0 ;; abc \ 00000004 0EF0A0E1 MOV PC,LR ;; return \ ??test_0: \ 00000008 ........ DC32 abc 55 } 32 бита памяти под указатель на abc[] видите? Или все еще будете думать, что это value берется ниоткуда?
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 8 2011, 18:11
|

Twilight Zone
  
Группа: Свой
Сообщений: 454
Регистрация: 17-02-09
Из: Челябинск
Пользователь №: 44 990

|
Цитата(ViKo @ Jul 8 2011, 20:43)  Имя массива - это и есть его адрес, адрес его первого элемента. Тут надо быть аккуратным, в контексте этой цитаты и выше приведенных указателей на первый элемент массива подмечу: Код unsigned char Data[] = {0,1,2,3,4,5,6,7};
int X = sizeof(Data); // Получим 8 - размер массива в байтах
unsigned char* ptr_Data = &Data[0]; или unsigned char* ptr_Data = Data; // Но так менее информативно
int y = sizeof(ptr_Data); // Получим размер указателя
--------------------
Magic Friend
|
|
|
|
|
Jul 8 2011, 18:15
|
self made
   
Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795

|
Цитата(zltigo @ Jul 8 2011, 14:06)  Ну в этом случае, надеюсь Вы действительно будете помалкивать, и думать, как я и просил. Потому, что:
32 бита памяти под указатель на abc[] видите? Или все еще будете думать, что это value берется ниоткуда? Ничего не вижу. Вижу что вы язык сами не очень понимаете. Чего и сколько там комприлятор разместил - хз, да это и не важно, важно только какой смысл создатели языка заложили в эту конструкцию. А вот понимания этого у вас у самого не наблюдается
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|