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

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


Гуру
******

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



QUOTE (ar__systems @ Jul 8 2011, 21:02) *
Строго говоря вы не правы. Выражение &Buffer имеет вполне определенный смысл. Значение его такое же как и &Buffer[0], но тип другой.

Мне уже точно надоело sad.gif. Похоже Вы читать не умеете sad.gif. Именно о ТИПЕ - "Что указатель на int не является кирпичом" я, подчеркиваю я, а не вертящийся на сковородке GetSmart речь все время и вел и веду. Не приписываете мне то чего я не говорил. Выражение присваивающее указателю на int указатель на массив БЕССМЫСЛЕННО из-за разных типов. Любой вменяемый компилятор НЕ должен такое тупо и молча переваривать.
Выражения присваивающие указателю на void указатель на массив void *ptr = &buffer, или указатель на первый элемент массива void *ptr = buffer являются СОВЕРШЕННО нормальными с точки зрения компилятора и я НИ РАЗУ ничего против не говорил.

QUOTE (ar__systems @ Jul 8 2011, 21:15) *
Ничего не вижу. ..... Чего и сколько там комприлятор разместил - хз

sm.gif Глупейшая отмазка. На уровне страуса прячущего голову в песок sad.gif.


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


self made
****

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



Цитата(GetSmart @ Jul 8 2011, 11:32) *
Я к тому и вёл, что ТС взял адрес массива вместо адреса нулевого элемента массива. Причём адреса оба равны. Только типом отличаются и только компилятор руганётся на это.


Самое смешное, что для того чтобы в этом убедиться, не обязательно даже читать книжку. Достаточно потратить 5 минут на то, чтобы скомпилировать это выражение. g++ выдает вполне развернутое сообщение об ошибке, из которого ясно, что проблема в неправильном типе. Но гуру экспериментировать западло, это же значит надо в собственных непоколебимых знаниях усомниться.


Цитата(zltigo @ Jul 8 2011, 14:21) *
Мне уже точно надоело sad.gif. Похоже Вы читать не умеете sad.gif. Именно о ТИПЕ - "Что указатель на int не является кирпичом" я, подчеркиваю я, а не вертящийся на сковородке GetSmart речь все время и вел и веду. Не приписываете мне то чего я не говорил. Выражение присваивающее указателю на int указатель на массив БЕССМЫСЛЕННО из-за разных типов.

Бессмысленно? Это на С, которому грубо говоря начихать на типы? Ну-ну. GetSmart все правильно написал, на сковордке это вы вертитесь, впадая в истерику от УЖАСНЫХ УЖАСНЫХ УЖАСНЫХ ошибок sm.gif
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jul 8 2011, 18:28
Сообщение #93


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

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



Цитата(sasamy @ Jul 8 2011, 21:06) *
А вы вообще в курсе о каком адресе речь ?
http://electronix.ru/forum/index.php?showt...st&p=949672
адрес указателя-константы мы никогда не получим потому что в памяти его просто нет, хотя я чую эти объяснения могут тянуться бесконечно - троллям ничего не объяснишь, более того через пару-тройку постов начнут утверждать что это именно я говорил обратное

Смотрел и на это ваше сообщение, пытаясь понять, что же вы имели в виду. Поясните подробнее.
Это я-то троль? За что!? sm.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 8 2011, 18:32
Сообщение #94


Гуру
******

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



QUOTE (ar__systems @ Jul 8 2011, 21:25) *
Это на С, которому грубо говоря начихать на типы?

Хорошо быть страусом и игнорировать очевидные вещи, типа наличия выделенной памяти под указатель и приведенные мной вопли сишного компилятора, которому таки не начихать на типы. Считайте, что в своей глупости Вы меня уже убедили. Достаточно, можете не продолжать.



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


self made
****

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



Я понял, откуда растет это волна негодования. Если исходить из того, что Buffer указывает на первый элемент массива, то &Buffer будет указывать вообще хз куда. т.е. это уже получится &(&Buffer[0]). Тут я соглашусь получается УЖАС - эта конструкция не имеет смысла. Но не надо забывать, что Buffer приравняли к &Buffer[0] исключительно для удобства пользователя языка, т.е. это сделано искуственно. А когда вы пишите &Buffer, компилятор не производит подстановку (Buffer > &Buffer[0]).
Цитата
Хорошо быть страусом и игнорировать очевидные вещи, типа наличия выделенной памяти под указатель и приведенные мной вопли сишного компилятора, которому таки не начихать на типы. Считайте, что в своей глупости Вы меня уже убедили. Достаточно, можете не продолжать.

Да вы чушь пишите про выделение указателя. Вы понятия не имеет для чего они лишнее слово выдели, и строите нелепые предположения, что для указателя.
Go to the top of the page
 
+Quote Post
Danis
сообщение Jul 8 2011, 18:49
Сообщение #96


Twilight Zone
***

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



Цитата(ar__systems @ Jul 8 2011, 22:38) *
Да вы чушь пишите про выделение указателя. Вы понятия не имеет для чего они лишнее слово выдели, и строите нелепые предположения, что для указателя.


Мужики! Хорош.

Давайте ТС лучше поможем.

char *realloc(ptr,size);

Функция realloc изменяет размер ранее захваченного блока
памяти. Аргумент ptr указывает на начало блока. Аргумент size за-
дает новый размер блока в байтах. Содержимое блока не изменяется.


Код
unsigned char *alloc = NULL;

/* захватываем достаточное пространство для 8 байт */

alloc = (unsigned char*)malloc( 8 * sizeof(unsigned char) );

if ( NULL == alloc ){ /* Обработаем */ }

for ( int i= 0; i < 8; i++ )
alloc[i] = i;

/* перезахватывает блок, который содержащий 8 байт, добавляем еще 8 */
if (alloc != NULL)
alloc = (unsigned char*)realloc( alloc,16 * sizeof(unsigned char));

if ( NULL == alloc ){ /* Обработаем */ }

for ( int i = 8; i < 16; i++ )
alloc[i] = i;

// Дальше САМИ


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


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

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



Цитата(zltigo @ Jul 9 2011, 00:06) *
Код
     50          char abc[10];
   \                     abc:
   \   00000000                      DS8 12


А если сделать char abc[12]; ? Или для надёжности даже char abc[16]?


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


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(ar__systems @ Jul 8 2011, 22:38) *
Да вы чушь пишите про выделение указателя. Вы понятия не имеет для чего они лишнее слово выдели, и строите нелепые предположения, что для указателя.

А кто это - они? sm.gif

В приведённом куске кода прекрасно видно, что адрес массива (указатель) грузится в R0 из флеш памяти, в которой под него, соответственно, было выделено место в размере 32 бит.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 8 2011, 18:57
Сообщение #99


Гуру
******

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



QUOTE (ar__systems @ Jul 8 2011, 21:38) *
Вы понятия не имеет для чего они лишнее слово выдели, и строите нелепые предположения, что для указателя.

Страус увидел "лишнее слово" в памяти. Но то, что в этом слове лежит указатель (и даже компилятор назвал это слово именем массива, т.е. abc) страус видеть все еще не желает. Пусть оно будет "лишними словом" решил страус и успокоился. "лишнее слово" - и все опять в голове страуса становится просто и понятно - есть массив, если нужно из ниоткуда будет взят указатель на этот массив. Все остальное считать "нелепыми предположениями". Ну честно говоря, фиг с ним с этим страусом - это пока его проблемы. Имеющие разум да поймут.
QUOTE (AHTOXA @ Jul 8 2011, 21:49) *
А если сделать char abc[12]; ? Или для надёжности даже char abc[16]?

Какая разница?


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jul 8 2011, 19:03
Сообщение #100


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

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



Цитата(zltigo @ Jul 9 2011, 00:57) *
Какая разница?
Пардон, я невнимательно прочитал.


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


Знающий
****

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



Цитата(zltigo @ Jul 8 2011, 22:06) *
Ну в этом случае, надеюсь Вы действительно будете помалкивать, и думать, как я и просил. Потому, что:
Код
     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 берется ниоткуда?



Вижу - только к выделению памяти для abc[] он не имеет никакого отношения. Как в анекдоте - а какой он апельсин ? Паровоз видел - видел, так вот совсем не похож.
abc - это чисто адрес-константа, а в теле программы может быть еще 1000 ссылок на нее.

Сообщение отредактировал sasamy - Jul 8 2011, 19:29
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 8 2011, 20:19
Сообщение #102


Гуру
******

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



QUOTE (sasamy @ Jul 8 2011, 22:09) *
abc - это чисто адрес-константа, а в теле программы может быть еще 1000 ссылок на нее

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

Потрудился показать, что для работы с массивом abc[] компилятор выделяет память для указателя abc. Если с массивом НЕ работать, память под указатель выделяться не будет, но и сам массив будет выкинут при оптимизации по причине его нахренненужности.
QUOTE ( @ Jul 8 2011, 22:09)
Вижу - только

Вижу еще одного страуса. Интересно, а где еще GetSmart sm.gif.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jul 8 2011, 20:27
Сообщение #103


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(sasamy @ Jul 8 2011, 18:41) *
ууу... тут наверно книжки не помогут - не нужно изобретать своих определений, все уже определено без вас, в том числе термин "константа"
Код
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).

Хотя написал некорректно, смысл в том что имя массива это константа и под нее вообще не выделяется память, память выделяется для массива - никакого адреса поэтому не получить.
Ну и где там написано, что адрес констаты нельзя получить? Там написано только то, что значение, связанное с идентификатором константы, обычно нельзя изменить. В фортране так и без никаких «circumvent»-ов, просто по неосторожности.
Если речь идёт о С, то изобретательность проявили Вы -- в стандарте С «константами» называются только числа, идентификаторы enum и символьные литералы. Имя массива в нём константой не называется. Даже строковые литералы не называются «константами».
А у «константного объекта» адрес может и браться, в зависимости от.

Но я не об этом, не о «взятии адреса константы».

Несмотря на Вашу уверенность как в том, что abc есть константа, так и в том, что адрес константы получить нельзя
Цитата(sasamy @ Jul 8 2011, 15:01) *
Вам бы самому хоть немного почитать. abc -- это указатель-константа которая равна адресу первого элемента массива с нулевым индексом, у константы не может быть адреса.
&abc вполне себе возвращает адрес, только не константы, а массива. Не первого элемента массива, а всего массива.
По одной причине -- имя массива не есть «константный указатель». Имя массива -- выражение, означающее «массив элементов такого-то типа». К выражению «указатель на объект такого-то типа» со значением адреса первого элемента массива оно только автоматически приводится, но не всегда. Одно из мест -- как раз обсуждаемый унарный &.
Другое -- sizeof(abc), который возвращает размер не «указателя-константы которая равна адресу первого элемента массива с нулевым индексом», а массива.
И строковый литерал "foo" в контексте инициализации символьного массива ведёт себя не как «константный указатель на первый элемент» строки (неявного массива символов). И, кстати, &"foo" допустимо на тех же правах, что и &abc.

Так что почитайте книги, если считаете что Вам, в отличие от меня, они ещё помогут.

____________________________
-- Множество чего?
-- Просто множество.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
andron86
сообщение Jul 8 2011, 21:10
Сообщение #104


Местный
***

Группа: Участник
Сообщений: 406
Регистрация: 1-03-06
Пользователь №: 14 821



Цитата(011119xx @ Jul 8 2011, 20:06) *
Keil не ругается на выражение
Код
ptr_buffer = &Buffer;


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

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

Уважаемый, не тупите, и почитайте(внимательно) всё написанное выше, ведь из за Вас всё это бодание началось.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jul 8 2011, 22:53
Сообщение #105


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

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



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

Это именно что придирки. Речь шла не о проверке компилятором того, что программист правильно указал размер массива, а о проверке компилятором того, что под указанный программистом размер массива хватит памяти. Вот вам цитата из моего сообщения (к которому вы придрались изначально):

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


1. Если нужен глобальный, то объявляйте максимально возможного размера и не парьтесь.

Максимально возможного размера это такого размера, который допускает компилятор+линкер, т.е. вся доступная свободная память.

2. Это будет самый простой и надёжный вариант.

Ой ли.

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

Ничего этот максимальный размер не гарантирует.

4. Ведь вам в любом случае нужно иметь память под самый большой шрифт, пусть она сразу и будет выделена.

Эта фраза входит в полное противоречие с пп.1-3. На самом деле, максимального возможного размера надо интерпретировать, как минимально необходимого для копирования максимально широкого символа максимального большого шрифта используемого в настоящий момент в программе.

Учитесь, мой друг, свои мысли однозначно излагать, а не считать всех старыми козлами. Я ваш текст читаю, а не шарады разгадываю на тему, что вы там имели в виду.

Go to the top of the page
 
+Quote Post

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

 


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


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