Użyj lambdas (nie można przenosić)
Zamiast
f(int*a,int*b){return*a>*b?1:-1;}
...
qsort(a,b,4,f);
lub (tylko gcc)
qsort(a,b,4,({int L(int*a,int*b){a=*a>*b?1:-1;}L;}));
lub (lvvm z obsługą bloków)
qsort_b(a,b,4,^(const void*a,const void*b){return*(int*)a>*(int*)b?1:-1;});
spróbuj czegoś takiego
qsort(a,b,4,"\x8b\7+\6\xc3");
... gdzie cytowany ciąg zawiera instrukcje języka maszynowego funkcji „lambda” (zgodne ze wszystkimi wymaganiami ABI platformy).
Działa to w środowiskach, w których stałe ciągów są oznaczone jako pliki wykonywalne. Domyślnie jest to prawdą w systemach Linux i OSX, ale nie w systemie Windows.
Jednym głupim sposobem nauczenia się pisania własnych funkcji „lambda” jest napisanie funkcji w C, skompilowanie jej, sprawdzenie za pomocą czegoś podobnego objdump -D
i skopiowanie odpowiedniego kodu szesnastkowego do łańcucha. Na przykład,
int f(int*a, int*b){return *a-*b;}
... po kompilacji gcc -Os -c
dla systemu Linux x86_64 cel generuje coś takiego
0: 8b 07 mov (%rdi),%eax
2: 2b 06 sub (%rsi),%eax
4: c3 retq
GNU CC goto
:
Możesz wywoływać te „funkcje lambda” bezpośrednio, ale jeśli wywoływany kod nie przyjmuje parametrów i nie zamierza zwrócić, możesz użyć goto
kilku bajtów. Więc zamiast
((int(*)())L"ﻫ")();
lub (jeśli twoje środowisko nie ma arabskich glifów)
((int(*)())L"\xfeeb")();
Próbować
goto*&L"ﻫ";
lub
goto*&L"\xfeeb";
W tym przykładzie eb fe
jest językiem maszynowym x86 dla czegoś podobnego for(;;);
i jest prostym przykładem czegoś, co nie przyjmuje parametrów i nie zamierza wrócić :-)
Okazuje się, że możesz goto
kodować, który zwraca do rodzica dzwoniącego.
#include<stdio.h>
int f(int a){
if(!a)return 1;
goto*&L"\xc3c031"; // return 0;
return 2; // never gets here
}
int main(){
printf("f(0)=%d f(1)=%d\n",f(0),f(1));
}
Powyższy przykład (może się kompilować i uruchamiać w systemie Linux z gcc -O
) jest wrażliwy na układ stosu.
EDYCJA: W zależności od zestawu narzędzi może być konieczne użycie -zexecstack
flagi kompilacji.
Jeśli nie jest to od razu widoczne, odpowiedź została napisana głównie dla lolów. Nie biorę odpowiedzialności za lepsze lub gorsze gry w golfa lub negatywne wyniki psychologiczne po przeczytaniu tego.