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


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



Потому что это просто ужасно. Руки бы поотрывал...
Может стоит забить на с/с++?
Забей
Не вижу ничего ужасного.
Да, все правильно, надо забить, а ещё снести Линукс, поставить Винду и прогать под дотНЕТ.
На выжатом барсике?
на си-диезе, конечно
Кстати мне весьма нравится C#. Вот mono подрастет, буду его использовать.
Мелкософт очень ругается на Моно.
Это не мои проблемы. Пусть Novell разбирается.

Я думаю что Microsoft ничего не сможет сделать. Иначе это получится монополия, а за бугром такого не любят.
Поживём-увидим. Даже интересно, что там дальше будет.
#include <stdio.h>
int main
{
char str[6] = "Anton";
printf( "%s\n", str );
}
а?
Нам ведь интересно.
Исходник a[0] = 'A', a[1] = 'B' и т.д. оттранслируется в довольно небольшой код вида mov [x], 'A', mov[x+1], 'B' и т.д.
А вот код вида a[6] = "ABCDE" приведет к гораздо более громоздкой конструкции, с созданием дополнительного сегмента в программе для инициализации начальных значний переменных, а так же дополнительного кода (весьма громоздкого и неспешного) для инициализации этих самых переменных.
Если только у вас не супермощный контроллер и не супербольшая (в масштабах контроллера) программа, то это просто пустой расход аппаратных ресурсов


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

PS: чего вы до меня докапались? Я этот пример сам придумал, основываясь именно на трактовке указателей! И когда я увидел что это действительно собралось и работает - я очень удивился.
Балин. Да не напрягало, а поразило! И ужаснуло!Очень печально. Об этом ведь еще Керниган и Ритчи писали.
я тоже удивился в свое время. =)
Маладец. Только в лужу сел ты. А каких умных авторов ты еще знаешь?
Если тебя такой код поражает, то тогда, пожалуй, посмотри код отсюда:
Блин, одно дело специально запутать код, а другое дело - это.
Блин, одно дело специально запутать код, а другое дело - это.Ты уже посмотрел код?
У меня сейчас нет инета. но я представляю что там может быть. Еще одно соревнование по написанию запутанного кода. поправь меня если я не прав.
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 что ли... а то каждый год находится кто-нибудь, кто узнает, что на С можно писать коряво, а потом удивляется.
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.
В общем укажи мне фразу в которой я сделал неверное утверждение, пожалуйста. Я же не говорил что этим исчерпываются все их задачи/цели. С моей точки зрения я все сказал верно. Если тебе это непонятно... Ну я даже не знаю.
Кстати, как ты там говорил,
История: у меня есть мной написанный трассировщик лучей.Держи пример из 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.
Ты опять все перепутал. Надо сравнивать с фразой "назначение головы - носить шапку". И это вполне верное урверждение. Слово "основное" все меняет, не так ли? За пример спасибо.
Скажи человеку, который не знает, что такое голова: "назначение головы - носить шапку", и этот человек будет считать, что основное назначение головы - носить шапку.

интереса в ваших замечательных спорах ни о чем остальным читателям раздела Programming никакого.
субъективно, конечно.
снести Линукс, поставить Винду и прогать под дотНЕТможно проще: заботать джаву и прогать

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


Ну, хотя бы на нем научись, а то за ВМК стыдно становится.
Так вот. Я бы порекомендовал Брейндеду заботать еще несколько разных языков (из них хотя бы один должен быть функциональным) - типа не чтобы на них прогать, а так, описание синтаксиса почитать и разнообразные хеллоуворлды. А потом еще синтаксический анализатор + интерпретатор/компилятор голого С написАть по бырому. Очень полезно для общего развития.
Я помню, читал как-то раз описание ПХП. Че-то собирался прогать на нем (порносайт какой-то, не помню но потом не сложилось. Так вот, в процессе я со всей ясностью понял, что язык можно разрабатывать по разному, и когда видишь этот самый ПХП, предназначенный для того чтобы как можно быстрее нарисовать голую бабу, соответственно каждая вторая синтаксическая конструкция является хаком для увеличения скорости набора проги, а полное описание _самого_ _языка_ (без стандартных библиотек) занимает страниц эдак сто (если не больше вот, а потом вспоминаешь синтаксис С и тоненькую книжечку в которой было ВСЁ, то понимаешь, как можно применять слово ОРТОГОНАЛЬНЫЙ к языку программирования, и что это слово означает.
С другой стороны, в процессе написАния собственного компилятора чего-нибудь осознаешь, что синтаксис - это страшно условная вещь, и что для добавления в С слова foreach понадобится добавить одну строчку в описание синтаксиса и сотню - в сам компилятор. А потом опять-таки понимаешь как тяжело добиться ортогональности синтаксиса.
И глядя на конструкцию 5[a] начинаешь испытывать чувство глубокого морального удовлетворения. Потому что ортогонально. И вместо &a[5] пишешь a + 5 и чувствуешь себя отлично!
ЗЫ: Ортогональность - это, например, когда каждой открывающейся фигурной скобочке соответствует закрывающаяся, а не пиздец как в паскале.
В целом согласен, но чем тебе паскал не угодил?
Ну типа там есть енды без бегинов и все такое.
Наверно, я отстал от жизни. Последний паскаль, с которым я работал активно, был 7.0.
1: writeln("1");
2: writeln("2");
end;
за точность не ручаюсь. И еще где-то похожая фигня была.
case ZZ of
1: writeln('1');
2: writeln('2');
end; {end-case}
Тебя смущает изпользование одних и тех же символов (например, end) в разных целях? Тогда и в Си, например, запятая может как отделлять элементы массива, так и служить оператором "запятая".
Асетушка, ты сам-то прогать умеешь хоть на чём-нибудь, раз такие слова говоришь?
hex_digit= ( (caps)? ("0123456789ABCDEF") : ("0123456789abcdef") ) [digit];
На самом деле - ничего примечательного...
pAnIdentifier = (CAnObject *) int)pAnIdentifier) * 0);
...
pAnIdentifier = (CAnObject *) int)pAnIdentifier) * 1);
На этот код обратили внимание еще те кодеры, которые работали над проектом до меня, и оставили с камментом "такой стеб нельзя тереть". Я, по традиции, тоже трогать его не стал. Если кто работал в СиБоссе над этим проектом после меняя - наверно, уже видели этот код и узнали его


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

*int*)0) = 0ead;
А в этом-то что такого парадоксального?

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

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

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

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




А я типа только вчера полностью осознал, что xxx и &xxx это одно и тоже, если xxx - функция.
я вот недавно узнал, что на некоторых архитектурах указатели на данные и на функцию имеют разный размер
? Это как? И можно пример?
Уж не в Гарварде ли?
Это там где код и данные располагаются в разных областях памяти?
А что даёт попытка приведения к void *?

то есть на вменяемых архитектурах размер одинаков. Хотя стандарт C таких гарантий не даёт.
Это я с "прямым углом спутал", то есть с function descriptors в ppc64 и ia64, о которых недавно слышал.
то есть на вменяемых архитектурах размер одинаков. Хотя стандарт 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). Даже в неймановской архитектуре.
Относиться к форуму серьёзно - очень большая ошибка. Не злись и не обижайся на форумные подколки. Виртуальное общение - слабая тень реального. То, что пишется с улыбкой на устах может быть прочитано как плевок в душу. Образ человека в форуме совсем не соответствует реальному.
Кроме того виртуальное общение без реального губительно для человеческой психики. Появляются люди, которые предпочитают компы людям. На самом деле они предпочитают общаться с людьми через комп, а не реально. Для борьбы с этим синдромом фидошники собираются на сходки, разработчики на конференции... И хотя на конференциях они в основном бухают, а не обсуждают насущные проблемы, но эти конференции дают толк - дальнейшее виртуальное общение облегчается, потому что люди знают друг друга и читая буквы на экране представляют как их сказал бы виртуальный собеседник если бы был реальным.
P.S. В какой раздел эту тему перенести?
это было круто! даже не знаю, что сказать!

Не знаешь что сказать - молчи. Внесите это в FAQ что ли...
Оставить комментарий
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 );
}
Забавно? Может стоит забить на с/с++?