- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
#define N2(n) #n"0",#n"1",#n"2",#n"3",#n"4",#n"5",#n"6",#n"7",#n"8",#n"9"
#define N30(n) #n N2(),#n N2(1),#n N2(2),#n N2(3),#n N2(4),#n N2(5),#n N2(6),#n N2(7),#n N2(8),#n N2(9)
#define N3(n,k) #n#k"0",#n#k"1",#n#k"2",#n#k"3",#n#k"4",#n#k"5",#n#k"6",#n#k"7",#n#k"8",#n#k"9"
#define N4(k) N3(k,0),N3(k,1),N3(k,2),N3(k,3),N3(k,4),N3(k,5),N3(k,6),N3(k,7),N3(k,8),N3(k,9)
#define N5 N30(),N4(1),N4(2),N4(3),N4(4),N4(5),N4(6),N4(7),N4(8),N4(9)
const char s[][4]={N5};
const int s_size = sizeof(s)/sizeof(s[0]);
void print_number(int n) {
if (n<s_size) {
printf("!%s\n",s[n]);
}
else {
printf("?%d\n",n);
}
}
TarasB 19.02.2011 16:16 # −5
Ахахаха, вам пришлось лепить уродливый макрос N30, из-за того, что этот мудак Ритчи сделал числа на 0 восьмеричными!!!!
guest 19.02.2011 16:42 # 0
TarasB 19.02.2011 17:09 # −3
"000", "001", "002", ..., "099", "100", ..., "999", можно составить намного более простой макрос. Но лидирующий ноль в СИ меняет смысл числа, такой вот уродливый костыль
Lure Of Chaos 19.02.2011 17:26 # 0
кстати, не только в Си
guest 19.02.2011 18:33 # −1
Это в любом случае говнокод, которого можно было избежать.
absolut 19.02.2011 20:32 # 0
Во-вторых: даже если нужно преобразовать строку в число, всегда есть возможность указать формат %d, %o, %x и т.д.
bugmenot 19.02.2011 16:46 # +1
случайно ли это?
inkanus-gray 21.02.2011 00:16 # 0
bugmenot 21.02.2011 00:25 # +2
absolut 21.02.2011 00:50 # +3
absolut 19.02.2011 16:41 # 0
pushkoff 19.02.2011 19:23 # 0
Dummy00001 19.02.2011 22:44 # +5
5-ти строчная маструбация макросов само собой разумеется большее ГК.
100+ строк констант генерятся тривиальной программой - сырец которую можно включить внутри комментария к файлу. (для юнихов: "геренерятся одной строкой в шелле".)
а вот те 5 строк..... я думаю их написать и протестировать понадобилось на порядок больше времени.
xredor 19.02.2011 23:09 # 0
Есть еще вариант проинициализировать массив при запуске программы, но мороз по коже пробегает от мысли о микроватт-секундах, которые будут на это тратится при каждом запуске. Кроме того, на Си статическую инициализацию красиво сделать не получится.
Dummy00001 19.02.2011 23:27 # 0
пусть тебя утешает то что на С++ это все еще хуже ;)
в С++ не только время на старте -для инициализации статических объектов- тратится, но так же еще и время при завершении программы - на вызовы всех деструкторов.
gegMOPO4 19.02.2011 23:49 # −1
xredor 19.02.2011 23:58 # 0
Dummy00001 20.02.2011 00:14 # 0
1. если Винды или Жаба. программы перезапускаются редко - т.к. традиционно создание нового процесса относительно медленно - используй программную инициализацию: цикл где в начале встраиваешь (например в красивый объект завернутый) и забывашь про него.
2. если Линухи/Юнихи. не еби людям мозги. естче наши духовные лидеры товарищи Денис/Ритчи завещали, что надо учится не просто писать программы, а писать программы которые будут писать программы для нас. и мля сгенерировать такой файл можно либо внешним скриптом либо прямо в Makefile'е. пять минут и готово.
guest 20.02.2011 00:53 # 0
Dummy00001 20.02.2011 02:15 # +2
guest 20.02.2011 13:25 # 0