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

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

|
Цитата(GetSmart @ Jul 9 2011, 12:10)  Щас доспоритесь до того, что придётся в стандарт вводить допустимость такого Код int *p; void main() { p = &115; ... } Ну так нельзя, вот так (почти так же) уже давно можно: Код struct foo { int a, b; }; struct foo foo1; void baa(struct foo *); void fa(int []); void fap(int (*)[]);
void moo() { foo1 = (struct foo){1, 2}; // Можно для скаляров baa( &(struct foo){ 1, 2} ); // Нельзя для скаляров fa( (int[]){5} ); fap( &(int[]){5} ); } («почти» ввиду разницы времени жизни, статическому указателю так не присвоить) Почему нельзя для скаляров делать то, что можно для агрегатов -- непонятно.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Jul 9 2011, 10:06
|

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

|
QUOTE (sasamy @ Jul 9 2011, 12:21)  Как же быть если вы отвечаете на мои слова http://electronix.ru/forum/index.php?showt...st&p=949780кому и чего я приписываю если вы утверждаете что создается указатель, я говорю что указатель не создается. Что непонятно ? Указатель создается. Теперь поговорим какой. Тут я думаю, Вам следует почитать первоисточники, благо Вы теперь знаете где их брать  Даю намек, что указатели в языке 'C' предусмотрены стандартом разные, int *ptr const int *ptr int * const ptr const int * const ptr Это все, подчеркиваю, все называются указателями. Нет в требований, того, что-бы указатель, если использовать придуманый Вами термин не являлись "адресом-константой". И так, совершенно очевидно создается константный указатель. После чего я этот факт явно подтвердил в ответ на Ваш вопрос "Именно так адрес-константа созданная компилятором для хранения указателя на массив abc[]. Соответственно будет использоваться компилятором, когда потребуется указатель на массив abc[]" Теперь когда этот указатель создается. Ни в посте на котороый Вы ссылаетесь, ни в каких либо других я не утверждал, что этот указатель создается при создании объекта, как Вы мне еще и это пытаетесь походя приписать  . По этому поводу даже есть мое проигнорированное разъяснение, что этот указатель создается для/при необходимости работы с массивом. Вот цитата из поста с тем самым примером: QUOTE Потрудился показать, что для работы с массивом abc[] компилятор выделяет память для указателя abc. Если с массивом НЕ работать, память под указатель выделяться не будет, но и сам массив будет выкинут при оптимизации по причине его нахренненужности. Но страусам, все это по барабану - при засунутой в песок голове не только думать, но и дышать приходится через другое место. Посему рождается: QUOTE Интересно -- кто-то еще будет на этом форуме слушать ваши советы после такой конкретной тупизны которую вы тут упорно выставляете на показ .... Это не пример ниразу, поэтому я прошу привести пример на _С_ или цитатут из стандарта языка _С_ где говорится что при создании объекта типа массив созается указатель с которым можно далее работать как с указателем - не как с адресом-константой а как с указателем - взять его адрес, изменить значение в соответствии с типом. С какого-это испуга некоторые указатели в языке 'C' вдруг стали как-бы т не указателями, и почему для неких неведомых мне "настоящих" указателей Вами выдвинуто требование их автоматического создания при создании объекта объяснить Вы, разумеется не сможете  . Посему ничего кроме продолжения Вами трепа в стиле: QUOTE Интересно -- кто-то еще будет на этом форуме слушать ваши советы после такой конкретной тупизны которую вы тут упорно выставляете на показ. Я уже не жду.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 9 2011, 10:09
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(ReAl @ Jul 9 2011, 14:54)  Ну так нельзя, вот так (почти так же) уже давно можно: Код struct foo { int a, b; }; struct foo foo1; ...
void moo() { foo1 = (struct foo){1, 2}; // Можно для скаляров ... } («почти» ввиду разницы времени жизни, статическому указателю так не присвоить) Почему нельзя для скаляров делать то, что можно для агрегатов -- непонятно. Я оставил то, что совсем не то, о чём я написал. Это копирование объекта/структуры. Тут же спор об автоматическом создании объекта, на который постоянно (или хоть локально внутри функции) существует/актуален указатель. Копирование - не есть передача указателя на всеобщее юзание. Из-за этого много интересных моментов не проявляется. Например, константой было число 115 или переменной. Если константой, то указатель должен был быть не int *p, а const int *p. А вот остальное, убранное, в принципе похоже. Однако, как поведёт себя компилятор, когда функция будет объявлена например так: Код void baa(const struct foo *); Догадается ли он поместить структуру в ROM, применительно к ARM-ам? Или если для других платформ, то const заменить на другой атрибут, например __flash.
Сообщение отредактировал GetSmart - Jul 9 2011, 10:57
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jul 9 2011, 10:23
|

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

|
QUOTE (SysRq @ Jul 9 2011, 13:06)  Мда. zltigo вернулся. Предгалаю переименовать тему в "Рандеву с zltigo". Традиционнее, и более соответствовать будет.  Что поделаешь, если есть форумчане движимые в основном целью, которую максимально четко и откровенно, и за откровенность ему мое уважение! Сфрмулировал novchok: QUOTE А если хотите отомстить, подловите на неточностях в темах по армам. Армы это его больное место, главное качественно подловить, а потом со всего размаху и по полной программе. Обязательны к употреблению слова "не знаешь Арм нечего тупые советы давать" Вот и имеем достаточно постоянную группу "имеющих желание, но не имеющих возможности". Кстати, я и тогда и сейчас отвечу: QUOTE Попробуйте! Заодно у Вас есть шанс поучится, а там глядишь и я чего-нибудь в копилочку знаний положу. Учиться нужно постоянно, чем я и занимаюсь на этом форуме!
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 9 2011, 10:39
|

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

|
QUOTE (GetSmart @ Jul 9 2011, 13:32)  Отсюда возникает логичное предположение - писал не он. Хотя заявлял, что он. Было-бы крайне глупо выкладывать в интернет под своим именем чужое, посему по этому поводу расслабьтесь. Все мое, и ошибки, буде таковые бывали и будут, тоже мои. QUOTE (GetSmart @ Jul 9 2011, 13:32)  Я уже как-то указывал zltigo на ошибку в драйвере I2C. Или не ошибке, честно говоря тогда, да и сейчас разбираться в коде написанном на рубеже веков было недосуг. Так и живет, плодится и работает этот код с "ошибкой". Но до чего диагноз данный novichok верен  - буквы I2C даже в этой теме GetSmart повторил уже не единожды  .
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 9 2011, 10:42
|
Знающий
   
Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858

|
Цитата(zltigo @ Jul 9 2011, 14:06)  Указатель создается. Теперь поговорим какой. Тут я думаю, Вам следует почитать первоисточники, благо Вы теперь знаете где их брать  Даю намек, что указатели в языке 'C' предусмотрены стандартом разные, int *ptr const int *ptr int * const ptr const int * const ptr Это все, подчеркиваю, все называются указателями. Нет в требований, того, что-бы указатель, если использовать придуманый Вами термин не являлись "адресом-константой". И так, совершенно очевидно создается константный указатель. После чего я этот факт явно подтвердил в ответ на Ваш вопрос "Именно так адрес-константа созданная компилятором для хранения указателя на массив abc[]. Соответственно будет использоваться компилятором, когда потребуется указатель на массив abc[]" Если это указатель - возьмите его адрес, даже если это константный указатель у него должен быть адрес - так, или это волшебный указатель ? но только вы ведь обломаетесь - амперсанд вернет не адрес указателя а адрес массива. Указатель _не создается_ - не вводите людей в заблуждение, то что вы привели в ассемблерном листинге - _это не указатель С_, это внутренняя конструкция созданная компилятором для своих внутренних потребностей и скрыта от программиста.
|
|
|
|
|
Jul 9 2011, 10:59
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(zltigo @ Jul 9 2011, 15:39)  Но до чего диагноз данный novichok верен  - буквы I2C даже в этой теме GetSmart повторил уже не единожды  . Ваш доктор айболит нервно курит в сторонке. И Вы вместе с ним. Оцените суть происходящего, если есть чем. Я ни за кем не гонялся. Нашёл ошибку - один раз сигнализировал. Здесь же на Ваш неадекват по отношению к начинающему (ТС) сначала намекал, что ничего страшного не произошло. Вы же распалились как горящая ёлка. Пришлось ко всему прочему для сравнения и Ваши ошибки выставлять на обзор чтобы в разум привести. А то ведь истерика до сих пор не прошла. Цитата(zltigo @ Jul 9 2011, 15:39)  Было-бы крайне глупо выкладывать в интернет под своим именем чужое, посему по этому поводу расслабьтесь. Все мое, и ошибки, буде таковые бывали и будут, тоже мои. Может быть. Это только предположение. Тогда тем более странен полученный ответ. Мол я выложил, а то, что там ошибка, ну и чёрт с ней. Если я не видел, значит её там нет. Но проверять всё равно не буду.
Сообщение отредактировал GetSmart - Jul 9 2011, 13:57
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jul 9 2011, 11:35
|

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

|
Цитата(GetSmart @ Jul 9 2011, 13:09)  Я оставил то, что совсем не то, о чём я написал. Это копирование объекта/структуры. ... А вот остальное, убранное, в принципе похоже. Автоматически, "на ходу" созданной структуры. Я для того и написал, чтобы сравнить: в int можно записать 5, в функцию, ожидающую int* -- нельзя передать &5. А со структурами и массивами -- можно и структуре присвоить не другую заведённую мной ранее структуру, а по-месту сочинённое {1, 2}, и в функцию передать указатель на такой объект. Код foo1 = (struct foo){1,2}; // можно a = (int)5; // можно (приведение так, для единства стиля) moo_foo( & (struct foo){1,2} ); // можно moo_int( & (int){5} ); // нельзя Впрочем, в С++ под ссылку можно передать константу, при этом, равно как и в С99 с показанными структурой и массивом, заводится (меня не касается где) временный объект, инициализируется даннйо константой (как тут структура инициализируется двумя константами) и передаётся на него указатель. Цитата(GetSmart) Из-за этого много интересных моментов не проявляется. Например, константой было число 115 или переменной. Да-да-да :-) Именно с этим у Фортрана и были весёлые танцы. Вызываешь FOO(42), после чего константа 42 изменилась во всей программе (или, по крайней мере, в единице трансляции), так как FOO внутри себя меняет свой аргумент. Ну уж это можно как-то разрулить, считать константой и не передавать под int *, передавать только под const int *
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Jul 9 2011, 11:48
|

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

|
QUOTE (sasamy @ Jul 9 2011, 13:42)  Если это указатель Да, конечно, я уже слышал  , это Апельсин или Паровоз. QUOTE - возьмите его адрес, даже если это константный указатель у него должен быть адрес - так, или это волшебный указатель ? но только вы ведь обломаетесь - амперсанд вернет не адрес указателя а адрес массива. Указатель _не создается_ - не вводите людей в заблуждение, то что вы привели в ассемблерном листинге - _это не указатель С_, это внутренняя конструкция созданная компилятором для своих внутренних потребностей и скрыта от программиста. Радует уже то, что с указателя втихую сняты обвинения в константности яко-бы неподобающей указателю. Или такти нет? Теперь все это вышенаписанное можно свести к одной "проблеме", что этот указатель, подчеркиваю указатель, а не "Апельсин". Скрыт от программиста. Естественно скрыт, поскольку был создан компилятором а не программистом. Точно так-же компилятор для своих нужд порождает переменные, если они ему нужны, но их не объявил программист. К таким переменным программист так-же не имеет доступа, но это не мешает им быть переменными. Программист может сам явно объявить объект и компилятор им воспользуется. Хотя может и напротив, выкинуть за ненадобностью  . QUOTE (GetSmart @ Jul 9 2011, 13:59)  Ваш доктор айболит нервно курит в сторонке.... Я ни за кем не гонялся. Так со сторонки оно это зачастую очень правильная позиция. В русском языке есть даже такие выражения - "посмотреть со стороны" и "со стороны виднее". QUOTE Если я не видел, значит её там нет. Но проверять всё равно не буду. Этот код, как мне помнится, был выложен в ответ на чью-то просьбу в совершенно публичной ветке форума. Вы посчитали, что там яко-бы имеется ошибка. Я по причинам описанным выше вступать в разговоры был-ли мальчик не стал и ответил, так, как ответил. Все заитересованные лица могли и полагаю, сейчас могут ознакомится с проблемой и составить собственное мнение. Что собственно стряслось, то Вы спустя какое-то количество лет об этом вспоминаете по несколько раз на дню?
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 9 2011, 11:51
|

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

|
Цитата(GetSmart @ Jul 9 2011, 09:39)  Амперсанд функций и простых переменных так же показывает целостность картины использования амперсанда - есть объект и, если перед ним стоит амперсанд, то будет взят адрес объекта с типом самого объекта. При этом автоматическая подмена объекта/идентификатора массива (и только массива) в указатель на первый его элемент сыграла злую шутку с программистами со старой "прошивкой"  Вот как раз идентификаторы функций ведут себя ближе к массивам, чем к переменным. Т.е. идентификатор функции при отсутствии возле него sizeof либо унарного & автоматически приводится к указателю на функцию. Более того, даже тут это делается: Код foo(); Т.е. идентификатор функции сначала автоматически приводится к указателю на функцию, потом этот указатель скармливается круглым скобкам в роли оператора вызова функции. Аналогично массивам, под sizeof(foo) идентификатор функции не превращается автоматически в указатель на. При этом нарушаются требования для оператора sizeof и имеем ошибку. Однако, в отличие от массива, в выражениях &foo означает в точности то же, что и foo. Посему первые две строки функции moo() полностью равноправны. Код void foo(void); void (* volatile pvf)();
void moo() { pvf = foo; // (1) pvf = &foo; // (2) pvf(); // (3) (*pvf)(); // (4) } А вот с последними двумя строками интересно. С (3) всё правильно, () по стандарту ждут выражение типа "указатель на функцию" (я уже не раз приводил пример с абсолютно легитимным a = (flag ? sin : cos)(x), где в первых скобках мы имеем как раз выражение типа "указатель на функцию"). А вот в (4)... Такое ощущение, что сначала указатель на функцию в результате разименования превращается в тот самый function designator, который тут же автоматически первращается назад в pointer to function, который уже скармливается скобкам. А тут Код (*******pvf)(); это происходит семь раз.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Jul 9 2011, 12:36
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(ReAl @ Jul 9 2011, 16:51)  я уже не раз приводил пример с абсолютно легитимным a = (flag ? sin : cos)(x), где в первых скобках мы имеем как раз выражение типа "указатель на функцию" Сразу же хочется заменить функции на массив. И не только. Можно и на структуры и на юнионы. По логике, должны прокатить конструкции Код a = (flag ? s1 : s2).field1; a = (flag ? p1 : p2)->field2; a = (flag ? mass1 : mass2)[10]; Цитата(ReAl @ Jul 9 2011, 16:51)  это происходит семь раз. Называется - доигрались
Сообщение отредактировал GetSmart - Jul 9 2011, 12:40
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jul 9 2011, 12:42
|
Знающий
   
Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858

|
Цитата(zltigo @ Jul 9 2011, 15:48)  Радует уже то, что с указателя втихую сняты обвинения в константности яко-бы неподобающей указателю. Или такти нет? Теперь все это вышенаписанное можно свести к одной "проблеме", что этот указатель, подчеркиваю указатель, а не "Апельсин". Скрыт от программиста. Естественно скрыт, поскольку был создан компилятором а не программистом. Еще раз повторяю, Zitigo - читайте вдумчиво, никаких указателей не создается при объявлении массива, ваш листинг - это фуфло порожденное компилятором. Я вам могу привести пример и там нет никаких указателей, но это тоже не доказательство, доказательство - это стандарт языка. Код Disassembly of section .text:
00000000 <main>: char abc[10];
int main(void) { return (int)abc; 0: e59f3004 ldr r3, [pc, #4]; c <main+0xc> } 4: e1a00003 mov r0, r3 8: e12fff1e bx lr c: 00000000 .word 0x00000000
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|