Кусок кода который меня поразил

mirt1971

#include <stdio.h>
int main
{
char str[6];

0[str] = 'A';
1[str] = 'n';
2[str] = 't';
3[str] = 'o';
4[str] = 'n';
5[str] = '\0';

printf( "%s\n", str );
}
Забавно? Может стоит забить на с/с++?

anatol

Если тебя удивило выражение вида
2[str] = 't';
то имей в виду, что компилятор C приводит выражение x [ y ] к виду *(x + y)
Поэтому все равно как писать:
str[2] = 't';
или
2[str] = 't';
или
*(str + 2) = 't';
или
*(2 + str) = 't';

mirt1971

Блин. Я вообще говоря это понял. Я же не просил мне это объяснить Просто меня это восхитило и ужаснуло одновременно

Flack_bfsp

А как связан кусок кода, котрый тебя так восхилил и призыв
Может стоит забить на с/с++?

mirt1971

Потому что это просто ужасно. Руки бы поотрывал...

garikus

Может стоит забить на с/с++?

Забей

Flack_bfsp

Не вижу ничего ужасного.

bobby

Да, все правильно, надо забить, а ещё снести Линукс, поставить Винду и прогать под дотНЕТ.

Flack_bfsp

На выжатом барсике?

bobby

на си-диезе, конечно

mirt1971

Кстати мне весьма нравится C#. Вот mono подрастет, буду его использовать.

Flack_bfsp

Мелкософт очень ругается на Моно.

mirt1971

Это не мои проблемы. Пусть Novell разбирается.

Flack_bfsp

Я это к тому, что может и не успеть подрасти

mirt1971

Я думаю что Microsoft ничего не сможет сделать. Иначе это получится монополия, а за бугром такого не любят.

Flack_bfsp

Поживём-увидим. Даже интересно, что там дальше будет.

shlyumper

Привести тебе пример ситуации, в которой такое написание кода является на порядок более правильным, чем такое


#include <stdio.h>
int main
{
char str[6] = "Anton";
printf( "%s\n", str );
}


а?

Marinavo_0507

Конечно, привести.
Нам ведь интересно.

shlyumper

Легко: берем какую-нибудь машину с гарвардовской архитектурой (раздельная память кода и данных например, микроконтроллер с архитектурой AVR.
Исходник a[0] = 'A', a[1] = 'B' и т.д. оттранслируется в довольно небольшой код вида mov [x], 'A', mov[x+1], 'B' и т.д.
А вот код вида a[6] = "ABCDE" приведет к гораздо более громоздкой конструкции, с созданием дополнительного сегмента в программе для инициализации начальных значний переменных, а так же дополнительного кода (весьма громоздкого и неспешного) для инициализации этих самых переменных.
Если только у вас не супермощный контроллер и не супербольшая (в масштабах контроллера) программа, то это просто пустой расход аппаратных ресурсов

mirt1971

Ты хоть понял что меня поразило, умник?

shlyumper

Ты хоть понял что меня поразило, умник?
Недопонимание тобой стандарта ANSI C?

bobby

насколько я понял, он не совсем об этом говорил, а о том, что можно писать array[index], а можно index[array].
вот именно это его и напрягало.

mirt1971

Ага. Именно это меня и поразило. Точно. В яблочко. Угу. А как же!

mirt1971

Балин. Да не напрягало, а поразило! И ужаснуло!
PS: чего вы до меня докапались? Я этот пример сам придумал, основываясь именно на трактовке указателей! И когда я увидел что это действительно собралось и работает - я очень удивился.

shlyumper

Балин. Да не напрягало, а поразило! И ужаснуло!
Очень печально. Об этом ведь еще Керниган и Ритчи писали.

bobby

я тоже удивился в свое время. =)

mirt1971

Маладец. Только в лужу сел ты. А каких умных авторов ты еще знаешь?

shlyumper

Если тебя такой код поражает, то тогда, пожалуй, посмотри код отсюда:
www.ioccc.org
Эти экспонаты тебя, наверное, вообще доведут либо до обморока, либо до оргазма.

mirt1971

Блин, одно дело специально запутать код, а другое дело - это.

shlyumper

Блин, одно дело специально запутать код, а другое дело - это.
Ты уже посмотрел код?

mirt1971

У меня сейчас нет инета. но я представляю что там может быть. Еще одно соревнование по написанию запутанного кода. поправь меня если я не прав.

shlyumper

Ты неправ.
Goals of the Contest:
  • To write the most Obscure/Obfuscated C program under the rules below.
  • To show the importance of programming style, in an ironic way.
  • To stress C compilers with unusual code.
  • To illustrate some of the subtleties of the C language.
  • To provide a safe forum for poor C code. :-)

P.S. Глеб, вставь ссылку на www.ioccc.org в FAQ что ли... а то каждый год находится кто-нибудь, кто узнает, что на С можно писать коряво, а потом удивляется.

mirt1971

To write the most Obscure/Obfuscated C program under the rules below.

Ну? И в чем я не прав? Практически угадал.

shlyumper

Ну? И в чем я не прав? Практически угадал.
Ты не прав в том, что
  • To show the importance of programming style, in an ironic way.
  • To stress C compilers with unusual code.
  • To illustrate some of the subtleties of the C language.

mirt1971

В общем укажи мне фразу в которой я сделал неверное утверждение, пожалуйста. Я же не говорил что этим исчерпываются все их задачи/цели. С моей точки зрения я все сказал верно. Если тебе это непонятно... Ну я даже не знаю.

shlyumper

Это все равно, что заявить, что основное предназначение головы - носить шапку.
Кстати, как ты там говорил,
История: у меня есть мной написанный трассировщик лучей.
Держи пример из www.ioccc.org:


X=1024; Y=768; A=3;
J=0;K=-10;L=-7;M=1296;N=36;O=255;P=9;_=1<<15;E;S;C;D;F(b){E="1""111886:6:?AAF"
"FHHMM@>>>BBBGGIIKK"[b]-64;C="=::@==@=:=:=:C5""31/513/5131/"
"31/531/53"[b ]-64;S=b<22?9:0;D=2;}I(x,Y,X){Y?(X^=Y,X*X>x?(X^=Y):0, I (x,Y/2,X
:(E=X); }H(x){I(x, _,0);}p;q( c,x,y,z,k,l,m,a, b){F(c
);x-=E*M ;y-=S*M ;z-=C*M ;b=x* x/M+ y*y/M+z
*z/M-D*D *M;a=-x *k/M -y*l/M-z *m/M; pb=a*a/M-
b)>=0?(I (b*M,_ ,0b =E, a+(a>b ?-b:b: -1.0);}Z;W;o
(c,x,y, z,k,l, m,a){Z=! c? -1:Z;c <44?(q(c,x ,y,z,k,
l,m,0,0 p> 0&&c!= a&& (p<W ||Z<0) )?(W=
p,Z=c): 0,o(c+ 1, x,y,z, k,l, m,a:0 ;}Q;T;
U;u;v;w ;n(e,f,g, h,i,j,d,a, b,V){o(0 ,e,f,g,h,i,j,a);d>0
&&Z>=0? (e+=h*W/M,f+=i*W/M,g+=j*W/M,F(Zu=e-E*M,v=f-S*M,w=g-C*M,b=(-2*u-2*v+w)
/3,H(u*u+v*v+w*wb/=D,b*=b,b*=200,b/=(M*MV=Z,E!=0?(u=-u*M/E,v=-v*M/E,w=-w*M/
E):0,E=(h*u+i*v+j*w)/M,h-=u*E/(M/2i-=v*E/(M/2j-=w*E/(M/2n(e,f,g,h,i,j,d-1
,Z,0,0Q/=2,T/=2, U/=2,V=V<22?7: (V<30?1:(V<38?2:(V<44?4:(V==44?6:3
,Q+=V&1?b:0,T +=V&2?b :0,U+=V &4?b:0) :(d==P?(g+=2
,j=g>0?g/8:g/ 20):0,j >0?(U= j *j/M,Q =255- 250*U/M,T=255
-150*U/M,U=255 -100 *U/M):(U =j*j /M,U<M /5?(Q=255-210*U
/M,T=255-435*U /M,U=255 -720* U/M):(U -=M/5,Q=213-110*U
/M,T=168-113*U / M,U=111 -85*U/M) d!=P?(Q/=2,T/=2
,U/=2):0);Q=Q< 0?0: Q>O? O: Q;T=T<0? 0:T>O?O:T;U=U<0?0:
U>O?O:U;}R;G;B ;t(x,y ,a, b){n(M*J+M *40*(A*x +a)/X/A-M*20,M*K,M
*L-M*30*(A*y+b)/Y/A+M*15,0,M,0,P, -1,0,0);R+=Q ;G+=T;B +=U;++a<A?t(x,y,a,
b):(++b<A?t(x,y,0,b):0);}r(x,y){R=G=B=0;t(x,y,0,0);x<X?(printf("%c%c%c",R/A/A,G
/A/A,B/A/Ar(x+1,y:0;}s(y){r(0,--y?s(yy:y);}main{printf("P6\n%i %i\n255"
"\n",X,Y);s(Y);}


Скомпилировать gcc
На stdout записывает картинку в pbm.

mirt1971

Ты опять все перепутал. Надо сравнивать с фразой "назначение головы - носить шапку". И это вполне верное урверждение. Слово "основное" все меняет, не так ли? За пример спасибо.

shlyumper

Скажи человеку, который не знает, что такое голова: "назначение головы - носить шапку", и этот человек будет считать, что основное назначение головы - носить шапку.

mirt1971

Ты согласен что у головы довольно много назначений? Думать, есть в нее, ковырять у нее в носу , носить шапку... Одной фразой ты ее все равно не опишешь.

bobby

слушайте, может, кто-нибудь из вас остановится?
интереса в ваших замечательных спорах ни о чем остальным читателям раздела Programming никакого.
субъективно, конечно.

voronetskaya

снести Линукс, поставить Винду и прогать под дотНЕТ
можно проще: заботать джаву и прогать

rosali

Ты хоть понял что меня поразило, умник?

А ты хоть понял, что тебя поразило? Подумаешь, 5[str] В языках программирования важна выразительная мощность, на синтаксис абсолютно наплевать (лично мне, по крайней мере).

evgen5555

Ну, хотя бы на нем научись, а то за ВМК стыдно становится.

bleyman

Мне вообще как-то неудобно встревать в дискуссию, тут какие-то куски говна летают, ай-ай-ай...
Так вот. Я бы порекомендовал Брейндеду заботать еще несколько разных языков (из них хотя бы один должен быть функциональным) - типа не чтобы на них прогать, а так, описание синтаксиса почитать и разнообразные хеллоуворлды. А потом еще синтаксический анализатор + интерпретатор/компилятор голого С написАть по бырому. Очень полезно для общего развития.
Я помню, читал как-то раз описание ПХП. Че-то собирался прогать на нем (порносайт какой-то, не помню но потом не сложилось. Так вот, в процессе я со всей ясностью понял, что язык можно разрабатывать по разному, и когда видишь этот самый ПХП, предназначенный для того чтобы как можно быстрее нарисовать голую бабу, соответственно каждая вторая синтаксическая конструкция является хаком для увеличения скорости набора проги, а полное описание _самого_ _языка_ (без стандартных библиотек) занимает страниц эдак сто (если не больше вот, а потом вспоминаешь синтаксис С и тоненькую книжечку в которой было ВСЁ, то понимаешь, как можно применять слово ОРТОГОНАЛЬНЫЙ к языку программирования, и что это слово означает.
С другой стороны, в процессе написАния собственного компилятора чего-нибудь осознаешь, что синтаксис - это страшно условная вещь, и что для добавления в С слова foreach понадобится добавить одну строчку в описание синтаксиса и сотню - в сам компилятор. А потом опять-таки понимаешь как тяжело добиться ортогональности синтаксиса.
И глядя на конструкцию 5[a] начинаешь испытывать чувство глубокого морального удовлетворения. Потому что ортогонально. И вместо &a[5] пишешь a + 5 и чувствуешь себя отлично!
ЗЫ: Ортогональность - это, например, когда каждой открывающейся фигурной скобочке соответствует закрывающаяся, а не пиздец как в паскале.

maggi14

В целом согласен, но чем тебе паскал не угодил?

bleyman

Ну типа там есть енды без бегинов и все такое.

maggi14

?
Наверно, я отстал от жизни. Последний паскаль, с которым я работал активно, был 7.0.

bleyman

case ZZ
1: writeln("1");
2: writeln("2");
end;
за точность не ручаюсь. И еще где-то похожая фигня была.

maggi14

так это енд-кейз. Только не совсем так:


case ZZ of
1: writeln('1');
2: writeln('2');
end; {end-case}


Тебя смущает изпользование одних и тех же символов (например, end) в разных целях? Тогда и в Си, например, запятая может как отделлять элементы массива, так и служить оператором "запятая".

Flack_bfsp

Асетушка, ты сам-то прогать умеешь хоть на чём-нибудь, раз такие слова говоришь?

yolki

Меня однажды поразил такой код:


hex_digit= ( (caps)? ("0123456789ABCDEF") : ("0123456789abcdef") ) [digit];


На самом деле - ничего примечательного...

maggi14

А меня примерно такой:


pAnIdentifier = (CAnObject *) int)pAnIdentifier) * 0);
...
pAnIdentifier = (CAnObject *) int)pAnIdentifier) * 1);


На этот код обратили внимание еще те кодеры, которые работали над проектом до меня, и оставили с камментом "такой стеб нельзя тереть". Я, по традиции, тоже трогать его не стал. Если кто работал в СиБоссе над этим проектом после меняя - наверно, уже видели этот код и узнали его

VitMix

C# --- это "до диез"

bobby

зато это английская буква "Си".

myrka68

а я вот от такого прусь, вставляю везде, где только можно

*int*)0) = 0ead;

evgen5555

А в этом-то что такого парадоксального?

myrka68

а что пародоксального в остальных примерах?

evgen5555

С моей точки зрения, ничего странного ни в одном примере нет. А последний уж совсем банальный.

mirt1971

Я знаю с++, python, perl(не очень asm, pascal, немного - lisp, ruby, java, C#. И еще по мелочи читал(не использовал) описания таких языков как modula, haskell, smalltalk. В прошлом году написал интерпретатор языка, похожего на с. Что мне еще сделать?

foxie84

Осталось только основать небольшую корпорацию и стать самым богатым человеком на планете.

bobby

Handel-C ботай

sergey_m

Я знаю с++, python, perl(не очень asm, pascal, немного - lisp, ruby, java, C#. И еще по мелочи читал(не использовал) описания таких языков как modula, haskell, smalltalk. В прошлом году написал интерпретатор языка, похожего на с.
Еще ты собрал свой дистрибутив Linux. Кроме того, мы недавно узнали, что Антон Самохвалов - профессионал, в отличие от некоторых.
Что мне еще сделать?
Объяви себя богом.

mirt1971

Дружище, все что я сказал - правда. Ты можешь ерничать сколь угодно долго, ничего от этого не поменяется.
PS: Я люблю программировать. Мне это доставляет удовольствие. Когда я не сплю и не читаю, я программирую. И занимаюсь этим очень давно. Ты хоть можешь допустить что все это правда? Или это тебе кажется невозможным?

mirt1971

Вы знаете, может не стоит этого делать, но я это сделаю. Я открою вам свою душу. Я немного выпил, и мне это позволительно. В общем, программирование - это все что у меня есть. У меня нет девушки. У меня есть комп. Мне нравится это делать. Мне компы нравятся больше чем люди. Они надежнее чем люди. Комп никогда не предаст тебя. Понимаете, игнорирование предыдущего вопроса - это как удар в сердце для меня. Неужели сложно поверить что я сделал все это? Что я знаю все эти языки? Что я собрал свой дистр Линукса? Неужели сложно было ответить на этот вопрос? А? В общем я по большому счету ничего не умею кроме как программировать(мыслить подходящим образом). И я пытаюсь делать это очень хорошо. И надеюсь что я делаю это очень хорошо(профессионально). Я даже не боюсь выкладывать свой код на всеобщее обозрение. Для оценки. И почему я не могу получить вопрос на свой ответ?

Flack_bfsp

Мне компы нравятся больше чем люди.

Типичный некрофил.

evgen5555

Чуве, убирай, пожалуйста, порт 8080 из ссылок, которые ты изредка постишь, ладно?

Ivan8209

На самом деле, "знать" язык в том смысле, который вкладываешь,
скорее всего, в это слово ты, и знать язык, на уровне
"свободного владения," так, чтобы писать на нём сразу
красиво,--- это совершенно разные понятия.
Вот, например, люди из БСД, писавшие скрипты для loader(8
"знают" Форт. В этом легко убедиться, если взглянуть на то,
как пишет Чарльз Мур.
Не бояться выкладывать свои произведения на всеобщее обозрение ---
это хорошо. Но это одно не является признаком хорошего программиста.
По поводу надёжности.
Самое надёжное --- это камень.
---
"...И подымал он камни и разговаривал с ними..."

Lorin

Бывает же такое !
В общем, программирование - это все что у меня есть. У меня нет девушки. У меня есть комп. Мне нравится это делать. Мне компы нравятся больше чем люди. Они надежнее чем люди. Комп никогда не предаст тебя. Понимаете, игнорирование предыдущего вопроса - это как удар в сердце для меня. Неужели сложно поверить что я сделал все это? Что я знаю все эти языки? Что я собрал свой дистр Линукса?
жизнь одна - ещё не поздно одуматься
или это полная клиника

sergey_m

Дружище, все что я сказал - правда.
Даже если это так, то всё равно нужно быть более скромным и менее категоричным. (У меня у самого такая проблема.) Даже если ты знаешь очень много, то ты можешь найти для себя неожиданности в том, что ты знаешь досконально (во всяком случае так думаешь). Пример - первый пост этого треда.

sergey_m

Вы знаете, может не стоит этого делать, но я это сделаю. Я открою вам свою душу. Я немного выпил, и мне это позволительно. В общем, программирование - это все что у меня есть. У меня нет девушки. У меня есть комп. Мне нравится это делать. Мне компы нравятся больше чем люди. Они надежнее чем люди. Комп никогда не предаст тебя. Понимаете, игнорирование предыдущего вопроса - это как удар в сердце для меня. Неужели сложно поверить что я сделал все это? Что я знаю все эти языки? Что я собрал свой дистр Линукса? Неужели сложно было ответить на этот вопрос? А? В общем я по большому счету ничего не умею кроме как программировать(мыслить подходящим образом). И я пытаюсь делать это очень хорошо. И надеюсь что я делаю это очень хорошо(профессионально). Я даже не боюсь выкладывать свой код на всеобщее обозрение. Для оценки. И почему я не могу получить вопрос на свой ответ?
Относиться к форуму серьёзно - очень большая ошибка. Не злись и не обижайся на форумные подколки. Виртуальное общение - слабая тень реального. То, что пишется с улыбкой на устах может быть прочитано как плевок в душу. Образ человека в форуме совсем не соответствует реальному.
Кроме того виртуальное общение без реального губительно для человеческой психики. Появляются люди, которые предпочитают компы людям. На самом деле они предпочитают общаться с людьми через комп, а не реально. Для борьбы с этим синдромом фидошники собираются на сходки, разработчики на конференции... И хотя на конференциях они в основном бухают, а не обсуждают насущные проблемы, но эти конференции дают толк - дальнейшее виртуальное общение облегчается, потому что люди знают друг друга и читая буквы на экране представляют как их сказал бы виртуальный собеседник если бы был реальным.
P.S. В какой раздел эту тему перенести?

zontik

В Love&Sex

mirt1971

В мусор Я вчера был неадекватен

margadon

Зато от души. Это не сильно похоже на обычную форумную флудерастию

sergey_m

А я типа только вчера полностью осознал, что xxx и &xxx это одно и тоже, если xxx - функция.

Marinavo_0507

я вот недавно узнал, что на некоторых архитектурах указатели на данные и на функцию имеют разный размер

mirt1971

? Это как? И можно пример?

buka

Уж не в Гарварде ли?

sergey_m

> я вот недавно узнал, что на некоторых архитектурах указатели на данные и на функцию имеют разный размер
Это там где код и данные располагаются в разных областях памяти?
А что даёт попытка приведения к void *?

Marinavo_0507

а может я и наебался, не могу найти что-то источник, откуда я это взял

Marinavo_0507

Насколько я понял, всё же наебался в некотором роде: POSIX использует то, что указатели одинакового размера,
то есть на вменяемых архитектурах размер одинаков. Хотя стандарт C таких гарантий не даёт.
Это я с "прямым углом спутал", то есть с function descriptors в ppc64 и ia64, о которых недавно слышал.

shlyumper

то есть на вменяемых архитектурах размер одинаков. Хотя стандарт C таких гарантий не даёт.
Вот вот. На вменяемых архитектурах.
А на невменяемых, например на том же AVR, имеем


Keyword Storage Memory Range
__tiny 8 bits Data 0x0-0xFF
__near 16 bits Data 0x0-0xFFFF
__far 24 bits Data 0x0-0xFFFFFF (16-bit pointer arithmetics)
__huge 24 bits Data 0x0-0xFFFFFF
__tinyflash 8 bits Code 0x0-0xFF
__flash 16 bits Code 0x0-0xFFFF
__farflash 24 bits Code 0x0-0xFFFFFF (16-bit pointer arithmetics)
__hugeflash 24 bits Code 0x0-0xFFFFFF
__eeprom 8 or 16 bits EEPROM 0x0-0xFF or 0x0-0xFFFFFF
__generic 1+15 bits Data/Code The most significant bit (MSB) determines whether
1+23 bits __generic points to CODE (1) or DATA (0). The
small generic pointer is generated for the processor
options -v0 and -v1.


Приведение указателей на пямять одного типа к указателям на память другого типа принципиально возможно, но такое пиведение не имеет какого-либо смысла и является просто арифметическим действием. Код вида *a = 5 генерирует совершенно разные результаты на ассемблере в зависимости от класса памяти указателя а. И это все не отклоняясь от требований C, обратите внимание.
А еще, под DOS была такая вещь, как модели памяти. И там тоже можно было делать указатели на код и данные разного размера (например, указатели на код по умолчанию __near, а указатели на данные по умолчанию __far). Даже в неймановской архитектуре.

slonishka

Относиться к форуму серьёзно - очень большая ошибка. Не злись и не обижайся на форумные подколки. Виртуальное общение - слабая тень реального. То, что пишется с улыбкой на устах может быть прочитано как плевок в душу. Образ человека в форуме совсем не соответствует реальному.
Кроме того виртуальное общение без реального губительно для человеческой психики. Появляются люди, которые предпочитают компы людям. На самом деле они предпочитают общаться с людьми через комп, а не реально. Для борьбы с этим синдромом фидошники собираются на сходки, разработчики на конференции... И хотя на конференциях они в основном бухают, а не обсуждают насущные проблемы, но эти конференции дают толк - дальнейшее виртуальное общение облегчается, потому что люди знают друг друга и читая буквы на экране представляют как их сказал бы виртуальный собеседник если бы был реальным.
P.S. В какой раздел эту тему перенести?

это было круто! даже не знаю, что сказать!

shlyumper

Не знаешь что сказать - молчи. Внесите это в FAQ что ли...
Оставить комментарий
Имя или ник:
Комментарий: