[n00b]Как смаллочить тип int (*)[4]?
for(i=0;i<4;i++)
{
vb->color[i]=malloc(300*sizeof(int;
}
for(int i=0;i<4;i++) {
vb->color[i] = malloc(300 * sizeof( int ;
}
int (*a)[4];
for(i=0;i<4;i++)
{
/*14*/ a[i]=malloc(10*sizeof(int;
}
Я всегда считал, что int (*)[4] - это указатель на массив, а не наоборот.
arr.c: In function `main':
arr.c: 14: incompatible types in assignment
![](/images/graemlins/confused.gif)
Иными словами, ни в одном компиляторе (мне их доступно два, с разными фронтэндами) такое не работает.
arr.c: In function `main':arr.c: 14: incompatible types in assignmentмб тогда
for(int i=0;i<4;i++) {
vb->color[i] = (int*)malloc(300 * sizeof( int ;
}
2-й gcc обычно на ассигнования разнотиповых указателей просто ворнинг дает, насколько я представляю.
А тут выдает ошибку.
del, туплю
Я всегда считал, что int (*)[4] - это указатель на массив, а не наоборот.что значит наоборот?
int - переменная
int* - массив переменной длины
int[4] - массив длины 4
int[4][4] - двумерный массив 4 на 4, в нем 16 элементов, обращаться к ним через строчки и столбцы
(int*)[4] - двумерный массив у которого 4 строки и переменное число столбцов
(int[4])* - двумерный массив у которого 4 столбца и переменное число строк
int** - двумерный массив с переменным числом строк и переменным числом столбцов
все что переменное можно выделить malloc
все что не переменное выделить нельзя!
(int*)[4] = malloc - нельзя
(int[4])* = malloc - можно
не забываем никогда приводить типы, тоесть перед malloc в скобках ставить желаемый тип
Другой компилятор пишет:
"arr.c", line 14: error: expression must be a modifiable lvalueПричем если смаллочить
a[i]=(int *)malloc(10*sizeof(int;
^
a = (void *)malloc( 40 * sizeof( int ;
забив на ворнинг, то получится массив a[i][j], i = 0...9, j=0...3.
(int*)[4] - двумерный массив у которого 4 строки и переменное число столбцовбалин
(int[4])* - двумерный массив у которого 4 столбца и переменное число строк
по ходу дела напутал
(int*)[4] - двумерный массив у которого 4 столбца и переменное число строк
(int[4])* - двумерный массив у которого 4 строки и переменное число столбцов
тогда в первом случае для каждой строки выделяем столбцы
int *(color[4]);
color[0] = (int*)malloc(300*sizeof(int;
и во втором случае вы деляем все строки
int (*color)[4];
color = (int(*)[4])malloc(300*sizeof(int;
(int(*)[4])Спасибо. Собственно, это мне и было нужно.
![](/images/graemlins/smile.gif)
ЗЫ. Впрочем, как показала практика, (void *) тоже прокатывает...
Впрочем, как показала практика, (void *) тоже прокатывает...и это безобразие
когда так пишешь то 1) не понимаешь, что ты хочешь выделить строки или столбцы
2) и компилятор тебе этого не подскажет
int* - массив переменной длиныне угадал
эта штука называется указатель на переменную типа int (или на первый элемент массива int-ов, в зависимости от использования)
"массив переменной длины" - это не синоним, а грубое заблуждение, которое приводит к очень смешным ошибкам типа чтения/записи информации через неинициализированный указатель и т.п., встречающимся обычно у новичков, не понимающих что такое указатели, динамическое выделение памяти и т.д..
А массивы переменной длинны тоже есть - они появились в последнем стандарте (ISO 9899:1999) и обозначаются иначе.
int** - двумерный массив с переменным числом строк и переменным числом столбцова эта штука называется указатель на указатель на int.
Здесь проблема "массива переменной длины", описанная выше, как бы возведена в квадрат: чтобы получилось функциональное подобие двумерного массива переменной размерности нужно сперва присвоить данной переменной (указателю на указатель) указатель на буфер указателей нужного размера, а потом заполнить этот буфер указателями на буферы для элементов - только после этого будет доступ к самим элементам, и все упомянутые буферы (динамически или статически выделенные) должны быть взаимно непересекающимися, иначе это уже не будет строго говоря "двумерным массивом переменной размерности".
(int*)[4] - двумерный массив у которого 4 строки и переменное число столбцова эта штука называется массивом из четырех указателей.
С ним аналогичная ситуация.
АВТОРУ ТРЕДА: не используй извращенческих типов данных, и тогда не будет никаких проблем с компиляцией и самое главное - с последующим выполнением. Многомерные массивы, указатели на массивы (не путать с указателями на первый элемент массива) и подобное - это порождение злого архимага Сотоны, в гораздо большей степени чем оператор goto (который многие почему-то не любят).
в конце концов, что может быть читабельней, чем следующее простое объявление:
int f(int;
![](/images/graemlins/confused.gif)
Неужели просто * недостаточно и парочки функций для чтения/записи в соотв. хрень? Зато хоть будешь знать точно, где отваливается. :/
Как предлагаешь работать с хотя бы трёхразмерными тензорами?
Про всякие гиперкубы я пока промолчу, чтобы не ранить твоей психики.
> указатели на массивы <...> - это порождение злого архимага Сотоны
Предлагается автоматизировать пересборку и перезапуск программы,
если вдруг понадобилось удлиннить массив?
Или здравствуй, фортран, со статическим выделением памяти?
---
"Математик может говорить, что ему хочется,
но физик должен, хотя бы в какой-то мере, быть в здравом рассудке."
чуваки, я-то вообще ничего не использую, это до меня кто-то поиспользовал...
![](/smiles/pray.gif)
да ну? разве не начиная с 90?
---
...Я работаю антинаучным аферистом...
извращенческие типы данных рулят.не рулят, но указатели на функции не являются таковыми, если чо.
без указателей на функции иногда нельзя обойтись, а вот без многомерных массивов и иже с ними обойтись можно всегда и при этом код будет более читабельным.
в конце концов, что может быть читабельней, чем следующее простое объявление:
int f(int;
![](/images/graemlins/shocked.gif)
ох и читабельность же - трудно придумать что будет менее читабельно
(ИМХО если эта запись не вызывает синтаксическую ошибку - это тоже порождение Сотоны, а если вызывает, то и слава богу)
а более читабельно - все что угодно
например (если я вообще понял, что подразумевалось под "int f(int;"):
typedef int (*int_funcvoid);
int f(int_func Param);
или хотя бы:
int f( int (*Paramvoid) );
> и при этом код будет более читабельным.
И много ты написал кода хотя бы с двумерными такими массивами?
---
"Математик может говорить, что ему хочется,
но физик должен, хотя бы в какой-то мере, быть в здравом рассудке."
> Многомерные массивы,разумеется при помощи указателя на первый элемент, придумав заранее какое-то удобное для конкретной задачи расположение элементов тензора в памяти.
Как предлагаешь работать с хотя бы трёхразмерными тензорами?
> без многомерных массивов и иже с ними обойтись можно всегда
> и при этом код будет более читабельным.
И много ты написал кода хотя бы с двумерными такими массивами?
да
> указатели на массивы <...> - это порождение злого архимага Сотоныугога
Предлагается автоматизировать пересборку и перезапуск программы,
если вдруг понадобилось удлиннить массив?
![](/images/graemlins/grin.gif)
![](/images/graemlins/grin.gif)
![](/images/graemlins/grin.gif)
обожаю чтение моих постов по диагонали с последующим выраванием фраз из контекста.
программистами в здравом уме для реализации динамического массива используется указатель на первый элемент массива (с которым я прямым текстом просил не путать и его типом является указатель_на_элемент, а не указатель_на_массив, хотя поскольку он указывает на начало расположения массива в памяти его можно назвать и указателем на массив. Эта двусмысленность понимания фразы "указатель на массив" является еще одним важным аргументом в пользу того, что C-шный тип указатель_на_массив - это порождение Сотоны.
> при помощи указателя на первый элемент разумеется,
> придумав заранее какое-то удобное для конкретной задачи расположение элементов тензора в памяти.
Вообще-то, языки высокого уровня, и си в том числе (как это ни странно
придумали именно для того, чтобы не запоминать такие вещи.
Хотя бы --- расположение данных в памяти.
>>> без многомерных массивов и иже с ними обойтись можно всегда
>>> и при этом код будет более читабельным.
>> И много ты написал кода хотя бы с двумерными такими массивами?
> да
Тогда я могу поздравить тебя.
Ты --- настоящий программист и закатывать солнце вручную --- твоё призвание.
Вот только не верю я, что постоянное выписывание в явном виде
смещения куда-то внутрь трёхмерного массива так уж читаемо.
Особенно на фоне сёвого одноуровневого пространства имён.
>>> указатели на массивы <...> - это порождение злого архимага Сотоны
>> Предлагается автоматизировать пересборку и перезапуск программы,
>> если вдруг понадобилось удлиннить массив?
> программистами в здравом уме для реализации динамического массива
> используется указатель на первый элемент массива
И размерности массива хранят отдельно, в том числе на бумажке,
в комментариях к программе и тому подобных местах.
> и его типом является указатель_на_элемент, а не указатель_на_массив,
Твои рассуждения на корню убивают некоторые способы оптимизации.
> Эта двусмысленность понимания фразы "указатель на массив"
> является еще одним важным аргументом в пользу того,
> что C-шный тип указатель_на_массив - это порождение Сотоны.
Двусмысленность только у тебя в голове.
Если судить по-твоему, то sizeof("string") должен быть равен размеру слова,
потому что "string" является ничем иным, как постоянным указателем,
либо размеру байта, потому что "string" является указателем на байт.
Это не так даже в си, не говоря уж про человеческое понимание,
как оно должно быть.
---
...Я работаю антинаучным аферистом...
![](/images/graemlins/crazy.gif)
странно, вообще говоря. должен был просто не скомпилироваться
Вообще-то, языки высокого уровня, и си в том числе (как это ни странно
придумали именно для того, чтобы не запоминать такие вещи.
Хотя бы --- расположение данных в памяти.
Вот только не верю я, что постоянное выписывание в явном видесмешно даже такое комментировать
смещения куда-то внутрь трёхмерного массива так уж читаемо.
Особенно на фоне сёвого одноуровневого пространства имён.
как говорится "плохому танцору и х** мешает"
Элементарная функциональность языка C такая как функции, макросы и т.п. позволяет сделать так, чтобы все было читабельно и запоминать ничего не пришлось.
А вот многомерные массивы являются например причиной глупых неоднозначностей, которые ухудшают читабельность, например если выражение "A[j][k]" имеет тип double, то какой тип имеет объект "A"? - Он может быть или указателем на указатель или многомерным массивом, что вопиюще различные и совершенно не взаимозаменяемые типы. Мелочь конечно, но досадно. А самое досадное, что эти многомерные массивы приходится реализовывать создателям компиляторов, вникая во всю их долбанутую логику плохо стыкующуюся с концепцией имени массива как константы-указателя на первый элемент, в то время как их почти никогда не используют в реальных приложениях, а вот "имя массива как константа-указатель на первый элемент" используется постоянно.
> программистами в здравом уме для реализации динамического массиваГде хотят, там и хранят.
> используется указатель на первый элемент массива
И размерности массива хранят отдельно, в том числе на бумажке,
в комментариях к программе и тому подобных местах.
Если размерность массива вообще нужна (т.е. если структура данных не имеет служебных ограничителей типа нулевого символа в C-строке то обычно хранят в специально предназначенной для этого переменной.
Твои рассуждения на корню убивают некоторые способы оптимизации.оказывается я могущественный маг - одни лишь мои рассуждения убивают
О каких именно не любимых мной фичах и предоставляемых ими возможностях оптимизации идет речь?
> Эта двусмысленность понимания фразы "указатель на массив"если учесть, что это я разъяснял суть этой двусмысленности, то не факт, что у меня
> является еще одним важным аргументом в пользу того,
> что C-шный тип указатель_на_массив - это порождение Сотоны.
Двусмысленность только у тебя в голове.
![](/images/graemlins/smile.gif)
Разумеется эта двусмысленность в головах программистов, использующих C, где же ей еще быть. Именно это и проблема.
Если судить по-твоему, то sizeof("string") должен быть равен размеру слова,точнее размеру указателя (который вовсе не обязательно равен размеру слова)
потому что "string" является ничем иным, как постоянным указателем,
может и так, но вообще и существующему положению вещей можно придумать логическое обоснование в рамках "жизни без многомерных массивов".
А вот если массив считать таким же типом как и все остальные, то почему например нельзя присвоить один массив другому при помощи оператора "="?
либо размеру байта, потому что "string" является указателем на байт.а это с какого фига?
Это не так даже в си, не говоря уж про человеческое понимание,ну так в C тоже не так как в "человеческом понимании"
как оно должно быть.
>> смещения куда-то внутрь трёхмерного массива так уж читаемо.
>> Особенно на фоне сёвого одноуровневого пространства имён.
> Элементарная функциональность языка C такая как функции, макросы и т.п.
> позволяет сделать так, чтобы все было читабельно и запоминать ничего не пришлось.
Элементарная функциональность языка С позволяет выписывать многомерные массивы без заведения функций
и привлечения внешних средств, таких, как макроподстановки.
> А вот многомерные массивы являются например причиной глупых неоднозначностей,
> которые ухудшают читабельность, например если выражение "A[j][k]"
> имеет тип double, то какой тип имеет объект "A"? -
Очевидно, массив.
> Он может быть или указателем на указатель или многомерным массивом,
> что вопиюще различные и совершенно не взаимозаменяемые типы.
Ну да?
Если массив представлять указателем, то очень даже взаимозаменяемые.
> Мелочь конечно, но досадно.
Что досадно?
Что массив это самостоятельный тип данных, отличающийся, в общем случае, от указателя?
> А самое досадное, что эти многомерные массивы приходится реализовывать создателям компиляторов,
> вникая во всю их долбанутую логику плохо стыкующуюся с концепцией
> имени массива как константы-указателя на первый элемент,
Создателям _которых_ компиляторов?
Не вижу никаких трудностей. Массив не есть указатель, и это очевидно.
На разных архитектурах многомерный массив может представляться поразному,
это очевидно и не вызывает нареканий. То, как оно должно представляться,
очевидным образом зависит от машины, которая может не поддерживать
умножения, может поддерживать (быструю) выборку из одномерного
или сразу двумерного массива.
> в то время как их почти никогда не используют в реальных приложениях,
> а вот "имя массива как константа-указатель на первый элемент" используется постоянно.
Что ты называешь "реальными приложениями"?
Ты просто не умеешь писать на высокоуровневых языках.
Даже на таких низкоуровневых, как си.
Тебя огорчает тот факт, что массив не является указателем,
только потому, что с 70-х годов си стал употребляться не только
на машинах класса K-11 или M68K, но ещё и на куче сильно от них отличающихся,
взять хотя бы PIC, 8051, ARM и какой-нибудь DSP.
>>> программистами в здравом уме для реализации динамического массива
>>> используется указатель на первый элемент массива
>> И размерности массива хранят отдельно, в том числе на бумажке,
>> в комментариях к программе и тому подобных местах.
> Где хотят, там и хранят.
> Если размерность массива вообще нужна (т.е. если структура данных
> не имеет служебных ограничителей типа нулевого символа в C-строке
Идиотская привычка.
> то обычно хранят в специально предназначенной для этого переменной.
>> Твои рассуждения на корню убивают некоторые способы оптимизации.
> О каких именно не любимых мной фичах и предоставляемых ими возможностях оптимизации идет речь?
О той, что массив не есть указатель на элемент, хотя и может таковым являться.
В многомерном массиве A[][] главным является то, что A[][] является элементом.
При этом совершенно не важно то, чем являются A и A[].
Например, в целях оптимизации может быть удобно,
чтобы A был указателем на указатель, а не на элемент.
Собственно, думаю, даже на KA-11 было бы лучше именно так.
>>> Эта двусмысленность понимания фразы "указатель на массив"
>>> является еще одним важным аргументом в пользу того,
>>> что C-шный тип указатель_на_массив - это порождение Сотоны.
>> Двусмысленность только у тебя в голове.
> если учесть, что это я разъяснял суть этой двусмысленности, то не факт, что у меня
> Разумеется эта двусмысленность в головах программистов, использующих C, где же ей еще быть.
> Именно это и проблема.
Если использующем си программистом считать каждого, кто способен написать "a=b",
поставить точку с запятой и фигурные скобки, то да, это проблема.
>> Если судить по-твоему, то sizeof("string") должен быть равен размеру слова,
>> потому что "string" является ничем иным, как постоянным указателем,
> точнее размеру указателя (который вовсе не обязательно равен размеру слова)
> может и так, но вообще и существующему положению вещей
> можно придумать логическое обоснование в рамках "жизни без многомерных массивов".
Придумывай.
> А вот если массив считать таким же типом как и все остальные,
> то почему например нельзя присвоить один массив другому при помощи оператора "="?
Так устроен мир.
А на самом деле, есть ещё и соображение "чтобы не писали медленный код."
>> либо размеру байта, потому что "string" является указателем на байт.
> а это с какого фига?
Потому что любая переменная --- это постоянный указатель,
который имеет свойство разыменовываться при присваивании,
а когда ты пишешь "float a", то ожидаешь, что "sizeof(a)" вернёт размер
числа, а не указателя.
>> Это не так даже в си, не говоря уж про человеческое понимание,
>> как оно должно быть.
> ну так в C тоже не так как в "человеческом понимании"
Обоснуй.
---
...Я работаю антинаучным аферистом...
Элементарная функциональность языка С позволяет выписывать многомерные массивы без заведения функцийтолько фиксированной размерности, только с определенным расположением элементов в памяти
> Он может быть или указателем на указатель или многомерным массивом,да, прикинь.
> что вопиюще различные и совершенно не взаимозаменяемые типы.
Ну да?
ботай матчасть
Если массив представлять указателем, то очень даже взаимозаменяемые."Если бы у бабушки был х**, она была бы дедушкой."
Согласно стандарту синтаксически не взаимозаменяемые, например если в функции int f(double** p) в качестве аргумента передать двумерный массив из double-ов, то компилятор скажет про "cannot convert types bla-bla-bla", и аналогично, если в int f(double a[4][4]) передать double** p.
На разных архитектурах многомерный массив может представляться поразному,Это не только не очевидно, но и абсолютно неверно.
это очевидно и не вызывает нареканий.
Стандарт однозначно определяет как многомерный массив представляется в памяти.
О той, что массив не есть указатель на элемент, хотя и может таковым являться.конечно
массив - это последовательность элементов, расположенных в памяти один за другим.
(n+1)-мерный массив - это массив n-мерных массивов, т.е. последовательность n-мерных массивов, расположенных в памяти один за другим.
Что ты называешь "реальными приложениями"?Используемые на практике приложения (желательно кем-либо кроме автора). В отличие от учебных приложений, proof_of_concept-приложений, и т.п.
> А вот если массив считать таким же типом как и все остальные,Вопрос был риторический и ответ известен и очевиден, но это конечно не упомянутое тобой соображение.
> то почему например нельзя присвоить один массив другому при помощи оператора "="?
Так устроен мир.
А на самом деле, есть ещё и соображение "чтобы не писали медленный код."
Потому что любая переменная --- это постоянный указатель,что за чушь
который имеет свойство разыменовываться при присваивании,
Как насчет переменных хранящихся в регистрах?
Переменная - это именованный типизированный блок информации определенного размера (определенного типом переменной конечно и sizeof разумеется возвращает размер этого блока информации.
> ну так в C тоже не так как в "человеческом понимании"sizeof("string") не равен количеству букавок в "string" очевидно.
Обоснуй.
sizeof("string") не равен количеству букавок в "string" очевидноsizeof("string") = 7
на единичку отличается всего
![](/images/graemlins/wink.gif)
не так уж и страшно
![](/images/graemlins/wink.gif)
>> выписывать многомерные массивы без заведения функций
> только фиксированной размерности,
> только с определенным расположением элементов в памяти
Это низкоуровневые ограничения.
Последнее, причём, сомнительно и требует проверки.
Это надо лезть в /tmp, файл создавать...
> Согласно стандарту синтаксически не взаимозаменяемые,
> например если в функции int f(double** p) в качестве аргумента
> передать двумерный массив из double-ов, то компилятор скажет
> про "cannot convert types bla-bla-bla", и аналогично,
> если в int f(double a[4][4]) передать double** p.
И правильно сделает.
Потому что преобразование привлекает сведения об архитектуре.
>> На разных архитектурах многомерный массив может представляться поразному,
>> это очевидно и не вызывает нареканий.
> Это не только не очевидно, но и абсолютно неверно.
> Стандарт однозначно определяет как многомерный массив представляется в памяти.
Это не только верно, но ещё и правильно.
Если стандарт ломает устоявшуюся практику, тем хуже для стандарта.
>> О той, что массив не есть указатель на элемент, хотя и может таковым являться.
> конечно
> массив - это последовательность элементов, расположенных в памяти один за другим.
Да ну?
Ты про выравнивание никогда ничего не слышал?
> (n+1)-мерный массив - это массив n-мерных массивов,
> т.е. последовательность n-мерных массивов,
> расположенных в памяти один за другим.
Это не так.
>> Что ты называешь "реальными приложениями"?
> Используемые на практике приложения (желательно кем-либо кроме автора).
> В отличие от учебных приложений, proof_of_concept-приложений, и т.п.
Ну так вот.
Компилятор си для Z80 размещает массивы совсем не так,
как ты думаешь, а более эффективно, потому что у Z80 нет
аппаратного умножения.
То же самое применимо для мотороллеров.
Даже для некоторых из семейства 68000.
У последних есть быстрая выборка из двумерного массива,
поэтому из массивы большей размерности имеет смысл выделять
два первых или последних измерения для отдельной выборки.
>> Потому что любая переменная --- это постоянный указатель,
>> который имеет свойство разыменовываться при присваивании,
> что за чушь
> Как насчет переменных хранящихся в регистрах?
Это ересь.
Это такое исключение, как и особо летучие переменные,
которые нельзя держать в регистрах.
Соответственно, они могут иметь особенности обработки.
> Переменная - это именованный типизированный блок информации
> определенного размера (определенного типом переменной конечно
> и sizeof разумеется возвращает размер этого блока информации.
Ты никогда не сталкивался с тем, что один и тот же компилятор,
в зависимости от того, что ему сказать, может выравнивать
или не выравнивать размеры до какой-нибудь границы?
Из-за этого, в частности, приходится извращаться с записями,
которые неожиданно вырастают с 78 октетов до 80.
>>> ну так в C тоже не так как в "человеческом понимании"
>> Обоснуй.
> sizeof("string") не равен количеству букавок в "string" очевидно.
Очевидно, что это является человеческим пониманием размера,
который выражается в единицах длины, а не в штуках.
Это ясно даже самым тупым программистам, которые знают,
что важно, у кого длиннее, а не у кого есть.
---
...Я работаю антинаучным аферистом...
> Согласно стандарту синтаксически не взаимозаменяемые,что и требовалось доказать
> например если в функции int f(double** p) в качестве аргумента
> передать двумерный массив из double-ов, то компилятор скажет
> про "cannot convert types bla-bla-bla", и аналогично,
> если в int f(double a[4][4]) передать double** p.
И правильно сделает.
Да ну?прикинь слышал
Ты про выравнивание никогда ничего не слышал?
и оно не отменяет того, что я сказал
Если стандарт ломает устоявшуюся практику, тем хуже для стандарта.скорее тем хуже для "устоявшейся практики"
стандарт обычно обобщает устоявшуюся практику,
и если некие особенности каких-то реализаций противоречат стандарту, подозреваю, что они не являются устоявшейся практикой.
Компилятор си для Z80 размещает массивы совсем не так,
как ты думаешь, а более эффективно, потому что у Z80 нет
аппаратного умножения.
То же самое применимо для мотороллеров.
Даже для некоторых из семейства 68000.
о каких именно компиляторах речь (с номерами версий)?
Очевидно, что это является человеческим пониманием размера,
который выражается в единицах длины, а не в штуках.
![](/images/graemlins/grin.gif)
а прикинь sizeof(char)==1 согласно стандарту, так что размер выражающийся в единицах длины равен количеству в штуках.
> Переменная - это именованный типизированный блок информациив зависимости от опций?
> определенного размера (определенного типом переменной конечно
> и sizeof разумеется возвращает размер этого блока информации.
Ты никогда не сталкивался с тем, что один и тот же компилятор,
в зависимости от того, что ему сказать, может выравнивать
или не выравнивать размеры до какой-нибудь границы?
Конечно. И что?
паддинг выравнивания - это тоже часть означенного типизированного блока информации.
А если компилятор в зависимости от опций по разному представляет структуру типов, то эти опции как бы переключают между разными реализациями языка C (что вообще-то идиотская практика).
> скорее тем хуже для "устоявшейся практики"
Из-за таких стандартов есть устоявшаяся практика плевать на стандарты и делать так, как надо.
> стандарт обычно обобщает устоявшуюся практику,
> и если некие особенности каких-то реализаций противоречат стандарту,
> подозреваю, что они не являются устоявшейся практикой.
"Обычно" не означает всегда.
Иногда стандарт нагло плюёт на целые области практической деятельности.
>> Компилятор си для Z80 размещает массивы совсем не так,
>> как ты думаешь, а более эффективно, потому что у Z80 нет
>> аппаратного умножения.
> о каких именно компиляторах речь (с номерами версий)?
Чтоб я помнил!
Тебе это так надо?
Хорошо, я запомню.
Когда найду или вспомню, напишу.
Я сам был удивлён, когда увидел такое, почему и запомнил.
> а прикинь sizeof(char)==1 согласно стандарту,
> так что размер выражающийся в единицах длины равен количеству в штуках.
Ну, у меня другой стандарт, и в нём "4 chars" может быть больше, чем 4.
У меня даже буквы длиннее.
---
...Я работаю антинаучным аферистом...
> то эти опции как бы переключают между разными реализациями языка C
> (что вообще-то идиотская практика).
То есть, ты считаешь нормальным писать программы на си в стиле "int *main = { 012, 023, 034 };"
или с использованием других архитектурнозависимых подробностей?
---
...Я работаю антинаучным аферистом...
Ну, у меня другой стандарт,собственного сочинения?
![](/images/graemlins/smile.gif)
---
...Я работаю антинаучным аферистом...
То есть, ты считаешь нормальным писать программы на си в стиле "int *main = { 012, 023, 034 };"
![](/images/graemlins/shocked.gif)
ужос нах
что за стиль такой?
Я считаю нормальным писать программы на C совместимые с его стандартом, читабельные и портируемые (в известных рамках конечно). Естественно по возможности не делающие ставку на особенности реализации.
ANSI X3.215--1994.сбрось на мыло, плиз
см. ПМ
То есть, ты считаешь нормальным писать программы на си в стиле "int *main = { 012, 023, 034 };"Какая прелесть
![](/images/graemlins/laugh.gif)
![](/images/graemlins/cool.gif)
![](/images/graemlins/smile.gif)
> что за стиль такой?
http://www.ioccc.org/years.html#1984_mullender
> Я считаю нормальным писать программы на C совместимые с его стандартом,
> читабельные и портируемые (в известных рамках конечно).
> Естественно по возможности не делающие ставку на особенности реализации.
Представление объекта в памяти --- это всегда особенность реализации,
если язык предназначен для работы на нескольких разных архитектурах.
---
...Я работаю антинаучным аферистом...
![](/images/graemlins/crazy.gif)
> Я считаю нормальным писать программы на C совместимые с его стандартом,к сожалению да, и это делает невозможным разработку портируемых бинарных структур, которые часто бывают необходимы, поэтому в некоторых случаях на особенности реализации (некоторые такие особенности присутствуют практически во всех реализациях) или языковые расширения приходится делать ставку.
> читабельные и портируемые (в известных рамках конечно).
> Естественно по возможности не делающие ставку на особенности реализации.
Представление объекта в памяти --- это всегда особенность реализации,
если язык предназначен для работы на нескольких разных архитектурах.
невозможность определить портируемую бинарную стуктуру я считаю одним из главных недостатков C, т.к. эта функциональность бывает необходима для многих приложений (поддержка сетевых протоколов, файловых систем, мультимедийных форматов, архивов и т.п.).
Где такое старье выкопал? И самое главное, зачем?
> Где такое старье выкопал?
А он самопродлевается, если не был заменён в течение четырёх, что ли, или пяти лет.
Если он жив уже третий срок, значит, не было нужды его менять.
Так что не надо говорить про старьё, а то я ANSI X3.159--1989 вырою.
> И самое главное, зачем?
А почему бы и нет?
У меня есть свежие RfD, так что от жизни я не отстаю.
Ты-то вообще грабли ловишь на хаскеле. Зачем?
---
...Я работаю антинаучным аферистом...
> это делает невозможным разработку портируемых бинарных структур
> невозможность определить портируемую бинарную структуру
> я считаю одним из главных недостатков C, т.к. эта функциональность
> бывает необходима для многих приложений (поддержка сетевых протоколов,
> файловых систем, мультимедийных форматов, архивов и т.п.).
Поэтому раньше заводили такой тип данных, как строка бит (PL/I и семейство
и ещё делали аппаратную поддержку поразрядного доступа.
---
...Я работаю антинаучным аферистом...
> Если он жив уже третий срок, значит, не было нужды его менять.
А как же C99?
И много ты знаешь соответствующих компиляторов?
А программ?
---
...Я работаю антинаучным аферистом...
Оставить комментарий
apl13
Имеется библиотека, в которой такое вот объявление:Попытки написать:
- приводят к еггогам и ворнингам.
Есть ли в стандартном Си штатный тип, к которому можно привести результат маллока, чтоб компилятор не привередничал?