|
|
  |
Как в си объявить массив с возможностью изменения его размера? |
|
|
|
Jul 9 2011, 03:08
|
self made
   
Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795

|
Цитата(zltigo @ Jul 8 2011, 14:57)  Страус увидел "лишнее слово" в памяти. Но то, что в этом слове лежит указатель (и даже компилятор назвал это слово именем массива, т.е. abc) страус видеть все еще не желает. Пусть оно будет "лишними словом" решил страус и успокоился. "лишнее слово" - и все опять в голове страуса становится просто и понятно - есть массив, если нужно из ниоткуда будет взят указатель на этот массив. Все остальное считать "нелепыми предположениями". Ну честно говоря, фиг с ним с этим страусом - это пока его проблемы. Имеющие разум да поймут. Вы прекрасно понимаете, что компилятор и его авторы имеют право делать все что им заблагорассудится, выделять и размещать сколько угодно памяти подо что им захочется - лишь бы все работало в соответсвии со спецификацией языка. Но делать какие-то выводы о семантике языка основываясь на деталях реализации отдельно взятым компилятором - это круто. В данном случае они поступили довольно кривым образом, т.к. адрес массива - это константа известная на момент линковки, и именно константа, те. литерал, должна была оказаться в коде, а не храниться и браться из памяти, как сделали они. А следуя вашей замечательной логике основанной на кривой реализации, компилятор и под каждую функцию будет размещать слово, в котором будет лежать ее адрес. Уверен, что вы и сами прекрасно понимаете что были неправы, а теперь пытаетесь свернуть разговор на другие рельсы и оправдаться совершенно нелепыми ссылками на "а вот у кейла так сделано". Да они могут перед каждым массивом и слово для хранения размера резервировать - а вот захотелось так, для тестирования или еще и что вы тогда скажете, так в языке задумано? Цитата(zltigo @ Jul 8 2011, 14:57)  есть массив, если нужно из ниоткуда будет взят указатель на этот массив. На эту фразу хотелось бы обратить особое внимание. Оказывается ваше невежество глубже чем казалось. Вы что, считаете что компилятор генерирует слово с адресом вообще всего? написали &IntVar - ну какже, адрес переменной же не может взяться из ниоткуда, значит, под него слово будет зарезервировано, и туда написан адрес этой переменной. Адрес, взятый из ниоткуда. Вы вообще знаете для чего линкер существует? Остается надеяться, что этот бред вы написали хорошо расслабившись после тяжелой трудовой недели - другого объяснения я не вижу
|
|
|
|
|
Jul 9 2011, 05:15
|
Знающий
   
Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858

|
Цитата(dxp @ Jul 9 2011, 08:28)  Наверное-таки, не константа, а литерал. У константы может быть адрес (константа - неизменяемый объект). Странно, но большинство видимо стандарты не признают  ISO/IEC 9899 Цитата An address constant is a null pointer, a pointer to an lvalue designating an object of static storage duration, or a pointer to a function designator; it shall be created explicitly using the unary & operator or an integer constant cast to pointer type, or implicitly by the use of an expression of array or function type. The array-subscript [] and member-access . and -> operators, the address & and indirection * unary operators, and pointer casts may be used in the creation of an address constant, but the value of an object shall not be accessed by use of these operators. Цитата(zltigo @ Jul 8 2011, 22:21)   Глупейшая отмазка. На уровне страуса прячущего голову в песок  . Глупости тут пишите только вы, хакир-орнитолог вы наш. Не создается никаких указателей при определении массивов - неужели не понятно ? Этот указатель - внутренний изврат компилятора.
|
|
|
|
|
Jul 9 2011, 05:41
|

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

|
Цитата(sergeeff @ Jul 9 2011, 04:53)  На самом деле, максимального возможного размера надо интерпретировать, как минимально необходимого для копирования максимально широкого символа максимального большого шрифта используемого в настоящий момент в программе. Наконец-то вы поняли то, что всем кроме вас было понятно сразу. Есть, мой старый друг, такое понятие как контекст. И читать сообщения надо не буквально, но в контексте. (Вам - несколько раз, до полного понимания). Причём в процессе чтения желательно исходить из посылки, что написавший - не дурак, и знает что пишет. Поэтому, увидев какое-то спорное на ваш взгляд утверждение, не надо бросаться сразу его опровергать, а вместо этого надо подумать, вдруг вы просто что-то не так поняли. Вот увидите, с таким подходом вы гораздо реже станете садиться в лужу.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Jul 9 2011, 06:39
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Пожалуй добавлю кой-чего. Цитата(ar__systems @ Jul 8 2011, 23:38)  Я понял, откуда растет это волна негодования. Если исходить из того, что Buffer указывает на первый элемент массива, то &Buffer будет указывать вообще хз куда. т.е. это уже получится &(&Buffer[0]). Тут я соглашусь получается УЖАС - эта конструкция не имеет смысла. Но не надо забывать, что Buffer приравняли к &Buffer[0] исключительно для удобства пользователя языка, т.е. это сделано искуственно. А когда вы пишите &Buffer, компилятор не производит подстановку (Buffer > &Buffer[0]). Я в начале ветки просил обратить внимание на другие объекты Си - на структуры и юнионы. Применение амперсанда ко всем объектам в языке Си должно быть логически одинаковым. Кроме того, при сравнении использования структур, юнионов и массивов проявляется, как уже многие подчёркивали, искусственность подмены идентификатора массива в указатель на его первый элемент. Это видно при применении индексации к любому типизированному указателю. В структурах и юнионах не так. Там есть два разных вида доступа к полям - из самого объекта и из указателя на объект. И нет автоматической подмены указателя и объекта. Так вот, если есть юнион abc и выражение p = &abc, то было бы совсем непоследовательно со стороны разработчиков, если они для юнионов и структур брали бы при этом указатель на объект, а для массивов (ввиду их избирательной автоматической подмены) сделали бы взятие указателя на указатель на массив, который ещё и разместить где-то надо, и точно не в ROM-e. Амперсанд функций и простых переменных так же показывает целостность картины использования амперсанда - есть объект и, если перед ним стоит амперсанд, то будет взят адрес объекта с типом самого объекта. При этом автоматическая подмена объекта/идентификатора массива (и только массива) в указатель на первый его элемент сыграла злую шутку с программистами со старой "прошивкой"
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jul 9 2011, 07:18
|
Профессионал
    
Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007

|
Цитата(AHTOXA @ Jul 9 2011, 09:41)  Наконец-то вы поняли то, что всем кроме вас было понятно сразу. Есть, мой старый друг, такое понятие как контекст. И читать сообщения надо не буквально, но в контексте. (Вам - несколько раз, до полного понимания). Причём в процессе чтения желательно исходить из посылки, что написавший - не дурак, и знает что пишет. Поэтому, увидев какое-то спорное на ваш взгляд утверждение, не надо бросаться сразу его опровергать, а вместо этого надо подумать, вдруг вы просто что-то не так поняли. Вот увидите, с таким подходом вы гораздо реже станете садиться в лужу. Ну ладно, если вам так жить удобнее, постановим, что вы умнейший умница, а я глупейший глупец. Простим друг друга и пойдем отдыхать.
|
|
|
|
|
Jul 9 2011, 08:18
|

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

|
QUOTE (ar__systems @ Jul 9 2011, 06:08)  Но делать какие-то выводы о семантике языка основываясь на деталях реализации отдельно взятым компилятором - это круто. В данном случае они поступили довольно кривым образом, т.к. адрес массива - это константа известная на момент линковки, и именно константа, те. литерал, должна была оказаться в коде, а не храниться и браться из памяти, как сделали они. Зачем надо было писать так много глупых слов? Вы себе даже не представляете, как "легко" и просто Вы можете посрамить одним махом и меня и писателей кривых компиляторов  . Для этого просто надо написать эти несколько строк на Ассемблере "правильно", так, что-бы абсолютный адрес брался не из ячейки памяти а из типа ниоткуда. Жду с нетерпением демонстрации извлечения абсолютного адреса объекта не так, "как это криво сделали они" - взяв этот 32bit указатель из 32bit ячейки памяти, а каким-то неведомым "им" и мне способом. QUOTE и что вы тогда скажете, так в языке задумано? Нет, не надейтесь, ни в каких языках это не задумано. Для этого я Вам выше предложил выполнить необходимое действие прямо на Ассемблере, или, если Вы считаете, что Ассемблер тоже связывает полет Вашей фантазии, то в машинных кодах. Жду. QUOTE Вы вообще знаете для чего линкер существует? Не надо приписывать другим свои невежественные мысли и трактовки. Никогда не говорил, и не мог говорить что компилятор выполняет работу линкера. Каждый делает свою работу. QUOTE Остается надеяться, что этот бред вы написали хорошо расслабившись после тяжелой трудовой недели - другого объяснения я не вижу  Вы начинаете бить рекорды человеческой глупости и самоуверенности  QUOTE (sasamy @ Jul 9 2011, 08:15)  Этот указатель - внутренний изврат компилятора. И Вас тоже приглашаю дать так сказать мастер класс извращенным писателям компиляторов ну и, конечно мне  , и присоединится к ar__systems в написании нескольких восхитительно прямых команд. Жду.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 9 2011, 08:26
|
Знающий
   
Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858

|
Цитата(zltigo @ Jul 9 2011, 12:18)  И Вас тоже приглашаю дать так сказать мастер класс извращенным писателям компиляторов ну и, конечно мне  , и присоединится к ar__systems в написании нескольких восхитительно прямых команд. Жду. Интересно -- кто-то еще будет на этом форуме слушать ваши советы после такой конкретной тупизны которую вы тут упорно выставляете на показ ? У вас все смешалось в голове, начинаете доказывать что-то про язык С основываясь листингом ассемблерного кода какого-то говнокомпилятора а то что существуют стандарты - это для вас не показатель. Так вот я еще раз предлагаю привести пример чтобы после объявления массива вы смогли бы оперировать его имнем как указателем (естествеено в С - не ассембере и не перфокарте) - ведь по вашему это указатель и он создается и по вашему стандарту обязан быть.
Сообщение отредактировал sasamy - Jul 9 2011, 08:39
|
|
|
|
|
Jul 9 2011, 08:53
|

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

|
QUOTE (GetSmart @ Jul 9 2011, 09:39)  При этом автоматическая подмена объекта/идентификатора массива (и только массива) в указатель на первый его элемент сыграла злую шутку с программистами со старой "прошивкой"  Вы похоже совсем э...., ибо все происходит с точностью до НАОБОРОТ. На Ваши личные завихрения мне наплевать,но мимо того,что Вы походя продолжаете дезинформировать всех читающих я пройти не могу. В выражении int *ptr = &Buffer как раз и НЕ производится "автоматическая подмена объекта/идентификатора массива (и только массива) в указатель на первый его элемент". Не имеет права нормально написанным компилятором производится. Ругань компиляторов на действия "программиста" ожидающего такую замену я приводил. Ругается естественно на то, что указателю на int не может быть присвоен указатель на массив. Пустой треп за то, что числа-то одинаковые и все и так могло быть хорошо а так-же обвинения языка C в небрежении с типами это Ваш пустой треп  . Выражения явно берущие адрес первого элемента массива int *ptr = &Buffer[0], и выражение int *ptr = Buffer неявно, но документировано по стандарту так-же берущее адрес первого элемента массива совершенно нормальны, и были мной приведены в первом-же посте, как вариант безошибочно-правильного выражения мысли программиста. Посему обо всех Ваших последующих выкрутасах и говорить-то нечего. QUOTE (sasamy @ Jul 9 2011, 11:26)  Интересно -- кто-то еще будет на этом форуме слушать ваши советы после такой конкретной тупизны которую вы тут упорно выставляете на показ ? Зачем опять эти нелепые, пустые и пафосные фразы, когда все можно развеять в пух и прах одним примером? QUOTE У вас все смешалось в голове, начинаете доказывать что-то про язык С Все еще хуже - любой язык  QUOTE какого-то говнокомпилятора Все еще хуже - абсолютно любого компилятора  . И не только компилятора,но и ассемблера  QUOTE Так вот я еще раз предлагаю привести пример... Зачем еще раз мне приводить? Он приведен. Один страус сказал, что это "лишняя переменная", Второй страус сказал, что это, "Апельсино-Паровоз". Оба страуса сошлись во мнении (а действительно, что еще делать страусам, когда они видят "необъяснимое" явление), что это все проделки "говнокомпилятора" - его дяди не просили этого делать, а он взял и разместил в памяти указатель на массив. Больше страусов на данный момент не объявилось.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 9 2011, 08:59
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Хватит уже сопли жевать. Одного слова Ужас и "бессмысленности" было достаточно для понимания того, что у Вас в голове творится. Цитата(zltigo) В выражении int *ptr = &Buffer как раз и НЕ производится "автоматическая подмена объекта/идентификатора массива (и только массива) в указатель на первый его элемент" Я именно и говорил, что не производится и не должна, т.к. потеряется логика работы амперсанда. Но то, что не будь контроля типов указателей, у ТС всё бы заработало чудесно. Как он говорит, у него так и заработало в Кейле. Мелкая ошибка, даже не ужас vs УЖАС УЖАС УЖАС! Учитесь правильно оценивать величину ошибок. Может тогда научитесь адекватно воспринимать свои гораздо более серьёзные ошибки
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jul 9 2011, 09:10
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Щас доспоритесь до того, что придётся в стандарт вводить допустимость такого Код int *p;
void main() { p = &115; ... } Причём компилятору придётся автоматически решить где размещать объект - в стеке, в раме или в роме. В зависимости от того, к какому типу указателя идёт присвоение.
Сообщение отредактировал GetSmart - Jul 9 2011, 10:02
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jul 9 2011, 09:12
|

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

|
QUOTE (sasamy @ Jul 9 2011, 12:03)  Это не пример ниразу, поэтому я прошу привести пример на _С_ или цитатут из стандарта языка _С_ где говорится что при создании объекта типа массив созается указатель с которым можно далее работать как с указателем - не как с адресом-константой а как с указателем - взять его адрес, изменить значение в соответствии с типом. А Вы не высасывайте из СВОЕГО пальца слова и не приписывайте их мне. Начните, с цитирования того того места, где я, яко-бы утверждаю, что "при создании объекта типа массив созается указатель с которым можно далее работать как с указателем - не как с адресом-константой а как с указателем - взять его адрес, изменить значение в соответствии с типом." Жду, а то страусы сотворили для себя глупость и с упоением воют
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 9 2011, 09:21
|
Знающий
   
Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858

|
Цитата(zltigo @ Jul 9 2011, 13:12)  А Вы не высасывайте из СВОЕГО пальца слова и не приписывайте их мне. Как же быть если вы отвечаете на мои слова http://electronix.ru/forum/index.php?showt...st&p=949780кому и чего я приписываю если вы утверждаете что создается указатель, я говорю что указатель не создается. Что непонятно ? А вот с чего началось - товарищ сделал совершенно неправильное заявление, на что я и возразил http://electronix.ru/forum/index.php?showt...st&p=949672на что вы начали умничать с ассемблером и гнать жуткую пургу.
Сообщение отредактировал sasamy - Jul 9 2011, 09:42
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|