- 001
- 002
- 003
- 004
- 005
- 006
- 007
- 008
- 009
- 010
- 011
- 012
- 013
- 014
- 015
- 016
- 017
- 018
- 019
- 020
- 021
- 022
- 023
- 024
- 025
- 026
- 027
- 028
- 029
- 030
- 031
- 032
- 033
- 034
- 035
- 036
- 037
- 038
- 039
- 040
- 041
- 042
- 043
- 044
- 045
- 046
- 047
- 048
- 049
- 050
- 051
- 052
- 053
- 054
- 055
- 056
- 057
- 058
- 059
- 060
- 061
- 062
- 063
- 064
- 065
- 066
- 067
- 068
- 069
- 070
- 071
- 072
- 073
- 074
- 075
- 076
- 077
- 078
- 079
- 080
- 081
- 082
- 083
- 084
- 085
- 086
- 087
- 088
- 089
- 090
- 091
- 092
- 093
- 094
- 095
- 096
- 097
- 098
- 099
- 100
#include <stdio.h>
#include <stdlib.h>
/*
Declare array of functions that return array of functions with
one parameter - function accepting array of functions returning
a pointer to function void(void). No typedefs.
Decoded to the following:
1) An array of E.
2) E = a function that takes void and returns an array of D (returns an array taken to mean a pointer to D).
3) D = a function that takes C and returns void.
4) C = a function that takes an array of B and returns void.
5) B = a function that takes void and returns A.
6) A = a pointer to void(void).
*/
/* Using typedefs */
typedef void (*tA) (void);
typedef tA (*tB) (void);
typedef void (*tC) (tB b[]);
typedef void (*tD) (tC c);
typedef tD* (*tE) (void);
tE tArray[2];
/* Not using typedefs */
void (*_A) (void);
void (* (*_B) (void) ) (void);
void (*_C) ( void (* (*_B[]) (void) ) (void) );
void (*_D) ( void (*_C) ( void (* (*_B[]) (void) ) (void) ) );
void (** (*_E) (void) ) ( void (*_C) ( void (* (*_B[]) (void) ) (void) ) );
void (** (*_Array[2]) (void) ) ( void (*_C) ( void (* (*_B[]) (void) ) (void) ) );
/* Some concrete functions for testing */
void fA(void)
{
printf("fA\n");
}
tA fB(void)
{
printf("fB\n");
return &fA;
}
void fC(tB b[])
{
tA _a;
printf("fC\n");
_a = (*b[0])();
(*_a)();
}
void fD(tC c)
{
tB b[1];
printf("fD\n");
b[0] = &fB;
(*c)(b);
}
tD* fE(void)
{
tD *d;
printf("fE\n");
d = malloc(sizeof(tD));
d[0] = &fD;
return d;
}
int main()
{
tA _a;
tB _b;
tC _c;
tD _d;
tE _e;
tB b[1];
tD *d;
_a = &fA;
_A = &fA;
printf("_a\n");
(*_a)();
printf("_A\n");
(*_A)();
_b = &fB;
_B = &fB;
printf("_b\n");
_a = (*_b)();
(*_a)();
printf("_B\n");
_a = (*_B)();
(*_a)();
_c = &fC;
_C = &fC;
b[0] = _b;
LispGovno 08.02.2014 23:57 # +3
По реквесту к картинке от defecate-plusplus:
http://habrastorage.org/storage/habraeffect/7e/c6/7ec6526b2a6fa85a30736912c357c5b3.jpg
Специальная олимпиада на гейдеве.
defecate-plusplus 09.02.2014 00:00 # +4
LispGovno 09.02.2014 00:03 # +6
http://www.gamedev.ru/files/images/gnomeall2.jpg
А в мешочке очевидно настойка на грибках:
http://www.gamedev.ru/files/images/gnomeallgird.jpg
Stertor 09.02.2014 00:35 # 0
+1
Dummy00001 09.02.2014 01:11 # +4
LispGovno 09.02.2014 01:17 # +1
Я не шучу. Там есть извращенцы, что пишут в таком стиле.
Не спрашивай меня почему. Это научно не объяснимо.
crastinus 09.02.2014 18:56 # +3
bormand 09.02.2014 19:05 # +1
inkanus-gray 09.02.2014 19:09 # +1
crastinus 09.02.2014 19:12 # 0
inkanus-gray 09.02.2014 19:31 # 0
TarasB 09.02.2014 20:17 # +6
LispGovno 09.02.2014 20:21 # 0
TarasB 09.02.2014 20:26 # +5
bormand 09.02.2014 20:49 # +5
inkanus-gray 09.02.2014 20:28 # +2
В сишке можно, не напрягаясь, определить, какой из этих идентификаторов определяется, а какие считаются известными?
LispGovno 09.02.2014 20:39 # +1
bormand 09.02.2014 20:48 # +1
LispGovno 09.02.2014 21:10 # 0
TarasB 09.02.2014 21:31 # 0
LispGovno 10.02.2014 00:36 # −1
Ты просто не асилил тайпдефы
TarasB 10.02.2014 11:08 # +2
Я специально выделил жирным, чтобы ты, гумно, не подменяло слова, но ты всё равно подменило. Как это называется, а?
Abbath 10.02.2014 10:08 # +2
а где то в коде shittyshit
bormand 10.02.2014 10:22 # 0
- некомпозабельно, для описания функций возвращающих функции интуитивно не применишь (надо возвращающей функции передавать пустой х, и вкладывать ее аргумент y возвращаемой);
- работает только для функций с 0 и 1 аргументами.
Abbath 10.02.2014 19:36 # +1
inkanus-gray 09.02.2014 21:49 # +2
Soul_re@ver 09.02.2014 22:31 # +3
или http://dev.krzaq.cc/readable-function-pointers/ чтобы без оверхеда
LispGovno 10.02.2014 00:34 # +2
TarasB 10.02.2014 11:11 # +3
на самом деле я его завёл лишь потому, что отладчик гонит лажу при вызове по нулевому указателю, завёл я его ради ассерта в операторе ()
Soul_re@ver 10.02.2014 11:17 # +2
?
TarasB 10.02.2014 11:28 # +2
Пришлось писать свой класс:
TarasB 10.02.2014 11:29 # 0
TarasB 10.02.2014 11:29 # 0
bormand 10.02.2014 12:01 # +1
TarasB 10.02.2014 12:02 # 0
bormand 10.02.2014 13:40 # +1
Генерация шаблонов, подобных твоему, как бы не в самом первом примере к этой либе рассматривалась...
defecate-plusplus 10.02.2014 15:37 # +2
bormand 10.02.2014 15:46 # +4
С бустом он не сможет страдать херней, и ему придется писать игры?
defecate-plusplus 10.02.2014 16:16 # +2
печальный предсказуемый финал
3.14159265 10.02.2014 16:32 # 0
bormand 10.02.2014 16:36 # 0
В бустпрепроцессоре их точно нет. Там вообще нет кода на крестах как такового. Только макросы, только хардкор.
А в целом - буст же большой, состоит из кучи библиотек. В каких-то кидают исключения, в каких-то - нет.
LispGovno 10.02.2014 18:24 # 0
defecate-plusplus 10.02.2014 16:39 # 0
если тебя интересует недоподдержка исключений в андроиде, то насколько я помню, либо вообще все проблемы уже решены, либо не будут работать только несколько библиотек
но я не компилил под андроид, мопед не мой
bormand 10.02.2014 15:24 # 0
Заодно пофиксил несовместимость твоей либы с gcc: typedef R R не компилировалось.
TarasB 10.02.2014 15:48 # 0
bormand 10.02.2014 16:10 # +1
Хотя надо почитать стандарт - только он знает, кто из них не прав.
bormand 10.02.2014 16:21 # 0
typedef struct s { /* ... */ } s;
typedef int I;
typedef int I;
typedef I I;
—end example]
Все-таки gccпроблема?
bormand 10.02.2014 16:30 # +3
Ан нет! Вижуалкопохуизм!
A template-parameter shall not be redeclared within its scope (including nested scopes). Евангелие от Бьёрна, [temp.local/4]
inkanus-gray 10.02.2014 11:13 # +3