|
|
  |
Как в си объявить массив с возможностью изменения его размера? |
|
|
|
Jul 9 2011, 13:40
|

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

|
Цитата(GetSmart @ Jul 9 2011, 15:36)  Сразу же хочется заменить функции на массив. И не только. Можно и на структуры и на юнионы. По логике, должны прокатить конструкции Код a = (flag ? s1 : s2).field1; a = (flag ? p1 : p2)->field2; a = (flag ? mass1 : mass2)[10]; Первая строка не покатит, а всё остальное указатели (для массивов тут, как и в других выражениях кроме двух уже обсосанных, автоматическая конверсия), как и с указателем на функцию -- прекрасно работает. Почему бы указатель на функцию вёл себя иначе остальных... Как я уже тоже писал -- это ещё в Алголе-68 было, только запись корявее Код value := if flag then sin else cos fi (x) Жаль, поработать не пришлось. Там много интересного, включая возмжность создать имя для перегруженного созданного для данного типа оператора и задать ему приоритет. Не нужно стандартные слова с прибитыми к ним гвоздями приоритетами и прочими свойстваим перегружать :-) Цитата(GetSmart @ Jul 9 2011, 15:36)  Называется - доигрались  Но ведь работает :-)
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Jul 9 2011, 13:50
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(ReAl @ Jul 9 2011, 18:40)  Первая строка не покатит То есть так по идее должно работать? Код a = (flag ? &s1 : &s2)->field1;
Сообщение отредактировал GetSmart - Jul 9 2011, 13:51
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jul 9 2011, 13:50
|

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

|
QUOTE (sasamy @ Jul 9 2011, 15:42)  Я вам могу привести пример и там нет никаких указателей Нормальный такой пример. Ручками поместили массив и минимальную функцию в общую .text секцию которую разместили в RAM. Соответственно для такого искусственно созданного (поместить в регистр скорретированный программый счетчик)случая необходимости в использовании указателя на объект в .data просто не возникло и он был соптимизирован. Компилятор оказался, как ни странно, вопреки Вашим предыдущим обвинениям не говнокомпилятором и когда ему была представлена ФИЗИЧЕСКАЯ возможность все сделал хорошо. QUOTE доказательство - это стандарт языка. Доказательство, простите, чего??? Вернитесь к своему посту №80. Перечитайте несколько раз. И объясните хотя-бы себе самому неоднократную отсылку к стандарту языка, который к этому вопросу нималейшего отношения не имеет, поскольку наличие в памяти указателя на массив для работы работы с массивом есть совершенно объективная реальность не нормируемая никакими стандартами. Да и что могло-бы написано в гипотетическом стандарте - "колеса должны быть круглыми"" указатель должен быть", "колеса должны быть квадратными""указателя не должно быть"?
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 9 2011, 13:58
|

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

|
Цитата(GetSmart @ Jul 9 2011, 16:50)  То есть так по идее должно работать? Код a = (flag ? &s1 : &s2)->field1; Обязано. Причём со времён K&R-1, в отличие от составных литералов (которые (struct foo){1,2} ), появившихся в стандарте каких-то 12 лет назад. Об одном братишка стандарт просит, чтобы указатели были одного типа, включая квалификаторы.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Jul 9 2011, 14:05
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(ReAl @ Jul 9 2011, 18:58)  Обязано. Причём со времён K&R-1, в отличие от составных литералов (которые (stuct foo){1,2} ), появившихся в стандарте каких-то 12 лет назад. То есть результат выражения (или как оно там называется) "?" может быть только скаляр, не арегат, при этом указатель считается скаляром? А как насчёт вот так Код mass0 = (flag ? mass1 : mass2); а ещё круче так Код struc0 = (flag ? struc1 : struc2); Можно даже без скобок, наверное. Цитата(ReAl @ Jul 9 2011, 18:58)  Об одном братишка стандарт просит, чтобы указатели были одного типа, включая квалификаторы. Ну это само собой. Не дурак.
Сообщение отредактировал GetSmart - Jul 9 2011, 14:06
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jul 9 2011, 14:15
|

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

|
Цитата(GetSmart @ Jul 9 2011, 17:05)  А как насчёт вот так Код mass0 = (flag ? mass1 : mass2); Нельзя, и массивы не присваиваются, и порождўнный из имени массива указатель таки ж константный. Цитата(GetSmart @ Jul 9 2011, 17:05)  а ещё круче так Код struc0 = (flag ? struc1 : struc2); Можно даже без скобок, наверное. Так можно и всегда было можно. Если можно написать a = b;, то можно написать и a = flag ? b1 : b2;А вот когда ?: в левой части, то тогда только указатели и только под * либо под ->Т.е. Код if (flag) a = 5; else b = 5; заменяется только на Код *(flag ? &a : &b) = 5; Цитата(GetSmart @ Jul 9 2011, 17:05)  Ну это само собой. Не дурак. Э-э-э, а вот тут я ошибся. Сразу усомнился, как только послал сообщение, полез в C89. С типами-то понятно, а квалификаторы могут быть разными, они суммируются. Т.е. type of ( flag ? pointer_to_const : pointer_to_volatile ) == pointer_to_const_volatile
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Jul 9 2011, 14:37
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(ReAl @ Jul 9 2011, 19:15)  Так можно и всегда было можно. Если можно написать a = b;, то можно написать и a = flag ? b1 : b2; Вот и получается нестыковка. Результатом выражения "?" в скобках способна быть структура (не указатель на структуру), при этом нельзя от неё брать поле. Хоть структура, хоть юнион. Цитата(ReAl @ Jul 9 2011, 19:15)  Нельзя, и массивы не присваиваются, и порождўнный из имени массива указатель таки ж константный. Опять странно. Массивы не присваиваются, а структуры/юнионы присваиваются. Тогда может так Код mass0 = *(flag ? mass1 : mass2);
Сообщение отредактировал GetSmart - Jul 9 2011, 14:29
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jul 9 2011, 16:45
|

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

|
QUOTE (Danis @ Jul 8 2011, 21:49)  Давайте ТС лучше поможем. Для помощи в решении задачи (не совсем ясно до сих пор какой) прежде всего надо выкинуть из головы лобовые решения типа "хочу массив переменного размера" - я пишу а он растет и растет. Если уж на то пошло  вешайте дополнительную память, поднимайте файловую систему и пользуясь write() пишите, пишите пишите. QUOTE Функция realloc Для микроконтролера неимеющего механизмов виртуализации памяти функция маловразумительная  . 1)Для начала по любому придется выделить под heap каку-то память. 2)Если этой памятью будет еще кто-то пользоваться, то сколько ее останется неведомо и очень печальный факт в том, что она будет в конце концов фрагментированна. Максимум, что теоретически можно в realloc для борьбы с фрагментацией реализовать, это находить фрагменты памяти побольше и копировать содержимое  . Очень громоздкое и не решающее проблемы фрагментации решение. 3)Если этой памятью более никто на пользуется, то тогда зачем realloc()  4)RAM на контроллерах всегда маловато, посему если только для решения этой криво поставленной задачи, то заводить heap, отдавать под него память самое плохое решение. 5)Если уж упорствовать и продолжать трясти пальму хотеть переменный массив, то тогда уже выделять его на стеке и ждать чем это все кончится при нехватке глубины стека. В данном случае хоть под стек можно отдать всю оставшуюся память. QUOTE // Дальше САМИ Бессмысленно пытаться применять то, что не знаете как устроено и работает реально.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 9 2011, 18:08
|

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

|
Цитата(zltigo @ Jul 9 2011, 19:45)  Для микроконтролера неимеющего механизмов виртуализации памяти функция маловразумительная  . тема называлась так: Как в си объявить массив с возможностью изменения его размера? я показал, как это сделать. Про микроконтроллеры ни в теме ни в посте ТС ни слову, так что извините… P.S. Думаю, ТС нужно создать новую тему, где он четко поставит задачу. Тогда не потребуется 10-ти страниц разговоров, сарказмов и т.п. не относящихся к теме, а мы попробуем ему помочь.
--------------------
Magic Friend
|
|
|
|
|
Jul 9 2011, 18:23
|

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

|
QUOTE (Danis @ Jul 9 2011, 21:08)  Про микроконтроллеры ни в теме ни в посте ТС ни слову, так что извините… Ну если не считать черным по белому первые слова в первом посте: QUOTE Необходимо в Кейле объявить массив без указания его размера. Микроконтроллеры сегодня, конечно местами совсем не микро, так-что Вы в чем-то правы. Ну а в общем давайте в советах исходить из того, что Автор, судя по его другим постам, что-то уровня STM32 (STM32F103VET6) мучает.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 9 2011, 18:29
|

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

|
Цитата(ReAl @ Jul 9 2011, 16:40)  Цитата(GetSmart @ Jul 9 2011, 15:36)  Сразу же хочется заменить функции на массив. И не только. Можно и на структуры и на юнионы. По логике, должны прокатить конструкции Код a = (flag ? s1 : s2).field1; ... Первая строка не покатит Стоп. Сейчас я в этом уже не так уверен. Надо почитать-подумать. Просто с указателями обычно работа идёт и с ними такие фокусы иногда пишу, становится виднее суть, чем в if. А с цельными объектами такого не делал. Код struct sss { int a, b, c; }; struct sss foo(); int moo() { return foo().c; } вроде как всегда было можно, значит, и с ?: должно бы. Цитата(GetSmart @ Jul 9 2011, 17:37)  Опять странно. Массивы не присваиваются, а структуры/юнионы присваиваются. Это к отцам-основателям... В С массивы не копируются вообще. Не копируются и тут. Код int i1[3], i2[3]; struct { int a[3]; } s1, s2; ... s1 = s2; // можно i1 = i2; // нельзя, это вообще указатели на первые элементы i1[] = i2[]; // а это просто рассматривается компилятором как бессмыслица... Цитата(GetSmart @ Jul 9 2011, 17:37)  Тогда может так Код mass0 = *(flag ? mass1 : mass2); Тогда Код *mass0 = *(flag ? mass1 : mass2); с чего никакой дополнительной радости, так как это просто работа с тремя указателями на первые элементы, к которым автоматически привелись имена массивов.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Jul 9 2011, 20:53
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(ReAl @ Jul 9 2011, 16:51)  Вот как раз идентификаторы функций ведут себя ближе к массивам, чем к переменным. Т.е. идентификатор функции при отсутствии возле него sizeof либо унарного & автоматически приводится к указателю на функцию. Для функции &func и func одно и то же абсолютно. Для массива не одно и то же. Можно даже функции вызывать (&func)(params). Со звёздочкой вообще приколы знатные. Я так понял, унарная операция "звёздочка" вынуждает объект определённого типа "автоматически преобразоваться". Амперсанд же не вынуждает, а работает с исходным объектом. Все эти варианты делают одно и то же Код dbl1 = sin(0.57); dbl2 = (&sin)(0.57); dbl3 = (*&sin)(0.57); dbl4 = (*&*&sin)(0.57); dbl3 = (&&&sin)(0.57); // так нельзя dbl3 = (&(&(&sin)))(0.57); // так тоже нельзя Цитата(ReAl @ Jul 9 2011, 23:29)  Это к отцам-основателям... В С массивы не копируются вообще. Не копируются и тут. Попробовал. Пока не удалось никак. Видимо это жертва за удобство в другом. Upd. Хотя вру. Не всегда одно и то же. Только то, что &func это указатель на функцию с какими-то параметрами. А func преобразуется в большинстве случаев к этому же типу. У массива в первом случае массив, во втором - первый элемент массива. По логике операции ?: мне не очень понятно. Она может работать с целыми объектами. Но зачем-то вынуждает объект преобразоваться. В то же время простые скобки не вынуждают объект преобразовываться. Код double (*p)(double);
p = &(sin); // работает p = &(flag ? sin : cos); // не работает
Сообщение отредактировал GetSmart - Jul 9 2011, 20:35
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|