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

 
 
12 страниц V  « < 4 5 6 7 8 > »   
Reply to this topicStart new topic
> Как в си объявить массив с возможностью изменения его размера?
GetSmart
сообщение Jul 8 2011, 15:32
Сообщение #76


.
******

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



Цитата(ReAl @ Jul 8 2011, 20:13) *
Речь-то идёт не о применении & к имени массива, а о выражении, присвавающем результат переменной другого типа.

Я к тому и вёл, что ТС взял адрес массива вместо адреса нулевого элемента массива. Причём адреса оба равны. Только типом отличаются и только компилятор руганётся на это. При использовании нетипизированных указателей (например в параметре функции) или при явном приведении типа (безусловно лучше без него, но...) программа заработает так, как и хотел ТС. Человек на начальном уровне знаком с Си и только истеричка будет так реагировать на его мелкие ошибки. Нельзя же при присваивании указателя на однин тип указателю на другой тип заявлять, что выражение бессмысленное!?

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


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


Знающий
****

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jul 8 2011, 16:02
Сообщение #78


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

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


Гуру
******

Группа: Свой
Сообщений: 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
...смысл в том что имя массива это константа и под нее вообще не выделяется память

точно sm.gif значит имеется константа имеющая некоторое value, но оно НИГДЕ не хранится, только при необходимости святым духом появляется sm.gif. Так-что память выделяется, вопрос только в том, способен и обязан-ли компилятор выдавать адреса констант всегда и любых.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
sasamy
сообщение Jul 8 2011, 17:13
Сообщение #80


Знающий
****

Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858



Цитата(zltigo @ Jul 8 2011, 20:41) *
А если подумать


Бла, бла, бла - тут о массивах в С речь - это ясно ?

Цитата
точно sm.gif значит имеется константа имеющая некоторое value, но оно НИГДЕ не хранится, только при необходимости святым духом появляется sm.gif. Так-что память выделяется, вопрос только в том, способен и обязан-ли компилятор выдавать адреса констант всегда и любых.


Тоесть вы утверждаете, что при определении массива
char abc[10];
кроме 10 * sizeof(char) выделяется память для указателя abc ? Если да - потрудитесь привести пример, если нет то мне больше не о чем с вами говорить.

Сообщение отредактировал sasamy - Jul 8 2011, 17:14
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jul 8 2011, 17:31
Сообщение #81


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

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



Цитата(sergeeff @ Jul 8 2011, 22:02) *
P.S. Это не придирки.

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

Почитайте раз пять, для надёжности. И если вдруг возникнет желание ещё что-то написать, то подумайте ещё немного, и не делайте этого, хватит уже позориться, на старости-то летsm.gif


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


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(sasamy @ Jul 8 2011, 18:41) *
Хотя написал некорректно, смысл в том что имя массива это константа и под нее вообще не выделяется память, память выделяется для массива - никакого адреса поэтому не получить.

Имя массива - это и есть его адрес, адрес его первого элемента. И почему ж тогда "не получить никакого адреса"? Это в классической книге основоположников C описано.
Go to the top of the page
 
+Quote Post
Danis
сообщение Jul 8 2011, 18:02
Сообщение #83


Twilight Zone
***

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



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


Используйте функции динамического распределения памяти: malloc, calloc, realloc, free.
Если Вы новичок в Си временно забудьте об этом и используйте статические массивы.


--------------------
Magic Friend
Go to the top of the page
 
+Quote Post
ar__systems
сообщение Jul 8 2011, 18:02
Сообщение #84


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


Естественно что все напечатанные адреса одинаковые.
Go to the top of the page
 
+Quote Post
011119xx
сообщение Jul 8 2011, 18:06
Сообщение #85


Местный
***

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



Keil не ругается на выражение
Код
ptr_buffer = &Buffer;


Кроме того, выражение
Код
ptr_buffer = &Buffer[0];

его тоже устраивает. Настолько, что он воспринимает их как одинаковыми.

По существу для себя уже решил объявить массив максимально возможного размера, тем более памяти достаточно (96кб). А шрифты хранятся в самой флэш, тем более что ее тоже много (1Мб). Можно хранить конечно и в SD-карте, но даже при чтении через SDIO, скорость чтения получается меньше, чем при хранении во флэш.

Сообщение отредактировал 011119xx - Jul 8 2011, 18:07
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 8 2011, 18:06
Сообщение #86


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
sasamy
сообщение Jul 8 2011, 18:06
Сообщение #87


Знающий
****

Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858



Цитата(ViKo @ Jul 8 2011, 21:43) *
Имя массива - это и есть его адрес, адрес его первого элемента. И почему ж тогда "не получить никакого адреса"? Это в классической книге основоположников C описано.


А вы вообще в курсе о каком адресе речь ?
http://electronix.ru/forum/index.php?showt...st&p=949672

адрес указателя-константы мы никогда не получим потому что в памяти его просто нет, хотя я чую эти объяснения могут тянуться бесконечно - троллям ничего не объяснишь, более того через пару-тройку постов начнут утверждать что это именно я говорил обратное sm.gif
Go to the top of the page
 
+Quote Post
ar__systems
сообщение Jul 8 2011, 18:11
Сообщение #88


self made
****

Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795



Цитата(vvs157 @ Jul 8 2011, 06:02) *
Вообще-то в случае обявленного массива array[n] указатель &array, скорее всего будет равен указателю array. Скорее всего - потому что зависит от реализации компилятора. Но пользоваться этим очень плохо, так как в случае динамичесого массива, созданного через calloc/malloc это точно будет не так.


Вот это неграмотно. &Array и просто Array ВСЕГДА будут указывать в одно и тоже место, отличаются эти выражения только типом.
Go to the top of the page
 
+Quote Post
Danis
сообщение Jul 8 2011, 18:11
Сообщение #89


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
Go to the top of the page
 
+Quote Post
ar__systems
сообщение Jul 8 2011, 18:15
Сообщение #90


self made
****

Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795



Цитата(zltigo @ Jul 8 2011, 14:06) *
Ну в этом случае, надеюсь Вы действительно будете помалкивать, и думать, как я и просил. Потому, что:

32 бита памяти под указатель на abc[] видите? Или все еще будете думать, что это value берется ниоткуда?


Ничего не вижу. Вижу что вы язык сами не очень понимаете. Чего и сколько там комприлятор разместил - хз, да это и не важно, важно только какой смысл создатели языка заложили в эту конструкцию. А вот понимания этого у вас у самого не наблюдается
Go to the top of the page
 
+Quote Post

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

 


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


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