Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как в си объявить массив с возможностью изменения его размера?
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Страницы: 1, 2, 3, 4
sergeeff
Цитата(vvs157 @ Jul 8 2011, 14:24) *
Это очень стремная радость. В один прекрасный момент решат, что это не "по фен-шую" и количество головной боли у тех, кто пользуется подобными недокументированными фичами будет весьма велико.


А самое главное зачем писать неправильную и более длинную конструкцию

Код
char abc[10];
char *p = &abc;


вместо короткой и правильной

Код
char abc[10];
char *p = abc;

zltigo
QUOTE (GetSmart @ Jul 8 2011, 13:15) *
Однако, компиляторописатели (хвала аллаху, что zltigo не из них) думают, что логична. Т.к. результат - всегда адрес. И глаз программера этот амперсанд так же примечает.

Хвала Аллаху, что у компиляторописателей голова растет не из ануса, посему на это:
CODE
u16 abc[10];
u16 *p;

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

компиляторрописатели IAR:
Error[Pe513]: a value of type "u16 (*)[10]" cannot be assigned to an entity of type "u16 *"

а это для разгообразия PowerCraft:
(139): operands of = have illegal types `pointer to u16' and `pointer to array 10 of u16t'

Реагируют посылкой в анус того, кто так пишет.

QUOTE (GetSmart @ Jul 8 2011, 13:28) *
Адресу массива, не сомневайтесь.

Разуваем глаза и смотрим на вышенаписанное.
QUOTE
Но согласитесь, на УЖАС, УЖАС, УЖАС это не тянет. Так, мелкое хулиганство sm.gif

Не соглашусь, однако.
GetSmart
Цитата(zltigo @ Jul 8 2011, 15:34) *
Хвала Аллаху, что у компиляторописателей голова растет не из ануса, посему на это:
...
Реагируют посылкой в анус того, кто так пишет.

Но всё-таки она вертится!?
Ведь результат &mass является адресом массива, хоть и с другими атрибутами, чем первый его элемент. Чтобы не париться, его всегда можно присвоить нетипизированному указателю. И это работает не только с массивами, но и с записами, юнионами, функциями и возможно ещё что упустил.
Очень интересная новость после стольких лет...
AHTOXA
Цитата(011119xx @ Jul 8 2011, 15:44) *
В данном случае массив объявляется внутри функции. Мне нужно чтобы массив был глобальным, он потом используется в другой функции.

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

Более длинная и что важно, тоже правильная конструкция:
char *p = &abc[0];
может быть применена для подчеркивания того факта, что abc это массив. Иногда такое бывает удобно при быстром чтении.

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


Ну ну. Сегодня шрифт такой, завтра шеф (заказчик) запросит другой. Ну хоть проверку на размерность массива вставьте!
zltigo
QUOTE (GetSmart @ Jul 8 2011, 13:41) *
Но всё-таки она вертится!?
Ведь результат &mass является адресом массива, хоть и с другими атрибутами, чем первый его элемент.

Что значит "вертится" и "является адресом", если компиляторы ВЫВАЛИВАЕТСЯ с ошибкой и соответственно НЕ генерят никакого кода?
Кто здесь пытается вертеться, как уж на сковородке, видно невооруженным взглядом sad.gif.
QUOTE
И это работает не только...

Это не работает. Как там было у Задорнова - "Пива нет. СОВСЕМ нет!" - СОВСЕМ не раболтает. О чем я сразу и написал увидя этo:
CODE
uint16_t Buffer[50];
uint16_t *ptr_buffer;
.....
ptr_buffer = &Buffer;

Именно ЭТО увидел и именно об ЭТОМ а не чем-то другом написал.
andron86
Цитата(sergeeff @ Jul 8 2011, 11:49) *
Указатель лежит в памяти. Адрес указателя - это адрес этой памяти.

:-))) Цитата из Вашей ссылки

Цитата
Очевидно существует очень тесное соответствие между ин-
дексацией и арифметикой указателей. в действительности ком-
пилятор преобразует ссылку на массив в указатель на начало
массива. В результате этого имя массива является указатель-
ным выражением. Отсюда вытекает несколько весьма полезных
следствий. Так как имя массива является синонимом местополо-
жения его нулевого элемента, то присваивание PA=&A[0] можно
записать как

PA = A


По моему Вы и zltigo сомневались и учебники читать отправляли.
GetSmart
Цитата(zltigo @ Jul 8 2011, 15:48) *
Кто здесь пытается вертеться, как уж на сковородке, видно невооруженным взглядом sad.gif.

Это смотря какой вопрос. То, что было изначально у ТС я не утверждал, что компилируется (вообще). Но то, что амперсанд можно применять ко многим объектам, включая массивы, и результат будет предсказуем, то бишь равен адресу объекта - я ещё раз повторяю. Если я уж, то сижу спокойно, в центре сковородки sm.gif
sergeeff
Цитата(andron86 @ Jul 8 2011, 13:48) *
По моему Вы и zltigo сомневались и учебники читать отправляли.


Вы это к чему? Там же ниже прямо написано

Цитата
конструкции типа
A=PA или A++,или P=&A будут незаконными.


Чего вы мне хотели сказать?
AHTOXA
Цитата(sergeeff @ Jul 8 2011, 16:47) *
Ну ну. Сегодня шрифт такой, завтра шеф (заказчик) запросит другой. Ну хоть проверку на размерность массива вставьте!
Вы о чём? Речь идёт о задании размера во время компиляции/линковки. Если не хватит памяти под новый шрифт, то линкер обругается, вот и проверка.
GetSmart
Цитата(zltigo @ Jul 8 2011, 15:48) *
Это не работает. Как там было у Задорнова - "Пива нет. СОВСЕМ нет!"

Преобразования типов нет. СОВСЕМ НЕТ! © zltigo
С сегодняшнего дня типизированные указатели не могут присваиваться к другим типизированным указателям. Аминь.

Upd.
zltigo, Вы верите, что void *p можно присвоить адрес любого типа? Даже так p = &mass. Это что, незаконно? СОВСЕМ?
Вобщем если пива нет, но очень хочется, то пиво есть sm.gif
andron86
Цитата(sergeeff @ Jul 8 2011, 12:55) *
Вы это к чему? Там же ниже прямо написано

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


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

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


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

А в чем грубость то? Объясните старику. Да, и не плохо бы примерчик, где линкер ругается на размер массива, в который вы собираетесь что то копировать.
sasamy
Цитата(sergeeff @ Jul 8 2011, 13:11) *
Хоть меня частенько критикуют за любовь к печатным изданиям, но вам, любезный, книги надобно почитать.
Если объявлен массив abc[10], то

abc - это указатель на массив и его значение в точности равно адресу первого элемента, т.е. &abc[0]. А &abc - дает адрес указателя на массив, что, согласитесь, совсем не то, что вы хотите получить и использовать.


Вам бы самому хоть немного почитать. abc -- это указатель-константа которая равна адресу первого элемента массива с нулевым индексом, у константы не может быть адреса.
skripach
sasamy, поддержу.
AHTOXA
Цитата(sergeeff @ Jul 8 2011, 17:47) *
Это вы придумали такой вариант реализации системы, где шрифты подключаются на этапе сборки проекта. Откуда мне и вам знать, может они на SD карточке лежат?

Наконец-то вы поняли, о чём я писал. А если шрифты лежат на карточке, то да, надо будет проверять размер. Но сама идея от этого не изменится.

Цитата(sergeeff @ Jul 8 2011, 17:47) *
А в чем грубость то? Объясните старику.

Фу-ты ну-ты. Я что, должен вас пожалеть? Давайте, раз вы старик, вы будете читать мои сообщения два раза, прежде чем отвечать на них, хорошо? И свои перед отправкой - тоже читайте. Потому что иначе получаются наезды не по существу.

Цитата(sergeeff @ Jul 8 2011, 17:47) *
Да, и не плохо бы примерчик, где линкер ругается на размер массива, в который вы собираетесь,что то копировать.

Код
int array[100500];

(предвидя придирки - на mega8)
zltigo
QUOTE (GetSmart @ Jul 8 2011, 13:56) *
zltigo, Вы верите, что void *p можно присвоить адрес любого типа? Даже так p = &mass. Это что, незаконно? СОВСЕМ?
Вобщем если пива нет, но очень хочется, то пиво есть sm.gif

Хватит пытаться вертеться, о присвоении указателя на void. Речь не шла. Когда Вы пытаясь, как Вам кажется, "изящно" выкрутиться ПОДМЕНИЛИ в исходном тексте указатель на short указателем на void, я Вам сразу указал на это, Вы начали передергивать подсовывая другой заведомо глотаемый сишным компилятором вариант.
QUOTE
Вобщем если пива нет, но очень хочется, то пиво есть

Да, тогда такие, как Вы насцав а бокал делаете вид что лично Вы пьете пиво sad.gif. Все. Точка, шулер Вы наш sad.gif.


QUOTE (ViKo @ Jul 8 2011, 16:12) *

Со стеком или любым другим ДИНАМИЧЕСКИМ выделением памяти проблем, совершенно нет по определению. Единственно, что выделять фиг знает какой объем памяти в стеке явно не кошерно, посему остается естественное и контролируемое на ошибки динамическое выделение памяти из heap. Другое дело, что все идет к тому, что для данного случая просто все надо делать на лету, а не бездумно трясти пальму.
GetSmart
Ничё не сделал, только вошёл sm.gif И сразу мошенник.

Себя почитайте
Цитата(zltigo @ Jul 8 2011, 14:08) *
Цитата
как раз и заносит в указатель адрес нулевого элемента массива.
Код
ptr_buffer = &Buffer;

"это" бессмысленное выражение которое любой вменяемый компилятор обязан послать нафиг.

Вы заявили, что амперсанд применительно к массиву без индекса является бессмысленной операцией. Я же подправил, что она осмысленная, но малость не соответствует по типу указателя. Нельзя же так относиться к мелким ошибкам ТС - бред, бред! УЖАС, УЖАС, УЖАС!
zltigo
QUOTE (GetSmart @ Jul 8 2011, 16:42) *
Себя почитайте

Не, для Вас, поскольку Вы даже не шулер, который таки-боится получить в реале канделябром по голове, а просто моральный урод sad.gif. Я себя почитаю:
CODE
uint16_t Buffer[50];
uint16_t *ptr_buffer;
.....
ptr_buffer = &Buffer;

не имеет право даже быть откомпилированной.
Ибо бред. И тут уж либо так
ptr_buffer = &Buffer[0];
либо так:
ptr_buffer = Buffer;

QUOTE (GetSmart)
А почему сразу бред? А проверить?


QUOTE (zltigo)
"это" бессмысленное выражение которое любой вменяемый компилятор обязан послать нафиг.
....
Что проверить? Что указатель на int не является кирпичом?


После этого GetSmart таки сам проверил и получив, как и было обещано отлуп о компилятора
Начал жульничать, заменив как ни всем ни бывало uint_16 *ptr_buffer на void *

QUOTE (GetSmart)
CODE
u16 abc[10];
void *p;

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


Однако, компиляторописатели (хвала аллаху, что zltigo не из них) думают, что логична.


На что ему было сразу указано:

QUOTE (zltigo)
Замените КАК ЭТО СДЕЛАНО В ПЕРВОИСТОЧНИКЕ:
u16 *p
И компилятор ответит, что он думает "Чему равен p"


То, что думают компиляторы было продемонстрировано:
QUOTE
компиляторрописатели IAR:
Error[Pe513]: a value of type "u16 (*)[10]" cannot be assigned to an entity of type "u16 *"

а это для разгообразия PowerCraft:
(139): operands of = have illegal types `pointer to u16' and `pointer to array 10 of u16t'

Реагируют посылкой в анус того, кто так пишет.


Дальше GertSmat, ведет себя совершенно ожидаемо и традиционно, как известной русской присказке про божью росу.
Надоело.

QUOTE
Нельзя же так относиться к мелким ошибкам ТС - бред, бред! УЖАС, УЖАС, УЖАС!

Приходится напоминать, что слова о бреде относились к исходнику ТС. Вот он полностью:
CODE
uint16_t Buffer[];
uint16_t *ptr_buffer;
uint16_t index_buffer;
uint16_t value;

void main(void)
{
ptr_buffer = &Buffer;
index_buffer = 32;
value = ptr_buffer + 32;
}

Могу только повторить, что кроме void main(void){ }
Все остальное или бред:
uint16_t Buffer[];
ptr_buffer = &Buffer;
value = ptr_buffer + 32;

либо, как uint16_t index_buffer; просто неразумность для ARM.
Это еще не касаясь осмысленности производимых действий sad.gif и
index_buffer = 32;

Если это "мелкие ошибки", то что тогда крупные sad.gif.
GetSmart
Цитата(zltigo @ Jul 8 2011, 19:28) *
Если это "мелкие ошибки", то что тогда крупные sad.gif.

Я уже писал - отсутствие NAK в протоколе I2C.

Вы как истеричка sm.gif
Вся соль в посте №72. Он почти неурезанный. И на этом я закончу.
ReAl
Цитата(sasamy @ Jul 8 2011, 15:01) *
abc -- это указатель-константа которая равна адресу первого элемента массива с нулевым индексом, у константы не может быть адреса.
"Ой".

Утверждение "&abc это адрес указателя" неправильно, но и Вы что-то странное написали.
С «у константы не может быть адреса» можно согласиться, если определиться, что под словом «константа» имеется ввиду литерал.
const int ci = 5; // тоже ведь константа

abc -- это идентификатор массива, который в выражениях в большинстве случаев автоматически приводится к указателю на его первый элемент, т.е. к величине (включая как тип, так и значение), тождественной &abc[0].
Но не во всех.

sizeof(abc) даст размер массива в байтах, тогда как sizeof(&abc[0]) даст длину указателя.

&abc даст адрес массива, что и было продемонстрировано в приведенной выдаче компилятора.
(«кстати о птичках»™, в С нет многомерных массивов, есть одномерные массивы, включая массивы других одномерных массивов).
Численно он равен адресу первого элемента, но по типу отличается. Указатель на первый элемент даёт обращение к одному элменту, указатель на массив даёт обращение к массиву.
sizeof(* &abc) также даст размер массива в байтах.

Переменная ptr_abc_0, имеющая тот же тип, что и &abc[0], при инкременте будет увеличиваться на размер (с учётом выравнивания) элемента массива.

Переменная ptr_abc, имеющая тот же тип, что и &abc, будет увеличиваться на длину массива.


Цитата(GetSmart @ Jul 8 2011, 17:46) *
Вы как истеричка sm.gif
Вся соль в посте №72. Он почти неурезанный. И на этом я закончу.
Хм... А нужную-то цитату Вы и в своём сообщении привели.
Цитата(GetSmart @ Jul 8 2011, 16:42) *
Себя почитайте

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

Речь-то идёт не о применении & к имени массива, а о выражении, присвавающем результат переменной другого типа.

Цитата(zltigo @ Jul 8 2011, 12:08) *
Код
ptr_buffer = &Buffer;
Разумеется нет. "это" бессмысленное выражение которое любой вменяемый компилятор обязан послать нафиг.

Это
Код
double d;
float *pf = &d;
тоже «всего лишь слегка не совпадает по типу», не так ли? Но любой вменяемый компилятор тоже обязан послать нафиг.
GetSmart
Цитата(ReAl @ Jul 8 2011, 20:13) *
Речь-то идёт не о применении & к имени массива, а о выражении, присвавающем результат переменной другого типа.

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


Хотя написал некорректно, смысл в том что имя массива это константа и под нее вообще не выделяется память, память выделяется для массива - никакого адреса поэтому не получить.
sergeeff
Цитата(AHTOXA @ Jul 8 2011, 16:35) *
Код
int array[100500];

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


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

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

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

P.S. Это не придирки.
zltigo
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. Так-что память выделяется, вопрос только в том, способен и обязан-ли компилятор выдавать адреса констант всегда и любых.
sasamy
Цитата(zltigo @ Jul 8 2011, 20:41) *
А если подумать


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

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


Тоесть вы утверждаете, что при определении массива
char abc[10];
кроме 10 * sizeof(char) выделяется память для указателя abc ? Если да - потрудитесь привести пример, если нет то мне больше не о чем с вами говорить.
AHTOXA
Цитата(sergeeff @ Jul 8 2011, 22:02) *
P.S. Это не придирки.

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

Почитайте раз пять, для надёжности. И если вдруг возникнет желание ещё что-то написать, то подумайте ещё немного, и не делайте этого, хватит уже позориться, на старости-то летsm.gif
ViKo
Цитата(sasamy @ Jul 8 2011, 18:41) *
Хотя написал некорректно, смысл в том что имя массива это константа и под нее вообще не выделяется память, память выделяется для массива - никакого адреса поэтому не получить.

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


Используйте функции динамического распределения памяти: malloc, calloc, realloc, free.
Если Вы новичок в Си временно забудьте об этом и используйте статические массивы.
ar__systems
Цитата(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;
}


Естественно что все напечатанные адреса одинаковые.
011119xx
Keil не ругается на выражение
Код
ptr_buffer = &Buffer;


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

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

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


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


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

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


Вот это неграмотно. &Array и просто Array ВСЕГДА будут указывать в одно и тоже место, отличаются эти выражения только типом.
Danis
Цитата(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); // Получим размер указателя
ar__systems
Цитата(zltigo @ Jul 8 2011, 14:06) *
Ну в этом случае, надеюсь Вы действительно будете помалкивать, и думать, как я и просил. Потому, что:

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


Ничего не вижу. Вижу что вы язык сами не очень понимаете. Чего и сколько там комприлятор разместил - хз, да это и не важно, важно только какой смысл создатели языка заложили в эту конструкцию. А вот понимания этого у вас у самого не наблюдается
zltigo
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.
ar__systems
Цитата(GetSmart @ Jul 8 2011, 11:32) *
Я к тому и вёл, что ТС взял адрес массива вместо адреса нулевого элемента массива. Причём адреса оба равны. Только типом отличаются и только компилятор руганётся на это.


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


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

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

Смотрел и на это ваше сообщение, пытаясь понять, что же вы имели в виду. Поясните подробнее.
Это я-то троль? За что!? sm.gif
zltigo
QUOTE (ar__systems @ Jul 8 2011, 21:25) *
Это на С, которому грубо говоря начихать на типы?

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

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

Да вы чушь пишите про выделение указателя. Вы понятия не имеет для чего они лишнее слово выдели, и строите нелепые предположения, что для указателя.
Danis
Цитата(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;

// Дальше САМИ
AHTOXA
Цитата(zltigo @ Jul 9 2011, 00:06) *
Код
     50          char abc[10];
   \                     abc:
   \   00000000                      DS8 12


А если сделать char abc[12]; ? Или для надёжности даже char abc[16]?
sonycman
Цитата(ar__systems @ Jul 8 2011, 22:38) *
Да вы чушь пишите про выделение указателя. Вы понятия не имеет для чего они лишнее слово выдели, и строите нелепые предположения, что для указателя.

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

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

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

Какая разница?
AHTOXA
Цитата(zltigo @ Jul 9 2011, 00:57) *
Какая разница?
Пардон, я невнимательно прочитал.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.