- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
#include <stddef.h>
__attribute__((const)) int f(int a);
void conv(int *restrict in, int *restrict out, size_t sz)
{
for(size_t i = 0; i < sz-1; i++)
{
out[i] = f(in[i])+f(in[i+1]);
}
return;
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
Всего: 344
0
#include <stddef.h>
__attribute__((const)) int f(int a);
void conv(int *restrict in, int *restrict out, size_t sz)
{
for(size_t i = 0; i < sz-1; i++)
{
out[i] = f(in[i])+f(in[i+1]);
}
return;
}
Пример, на котором обделывается оптимизатор Clang но не обделывается оптимизатор GCC
https://godbolt.org/z/W9WshxsKG
+1
#include <stdio.h>
typedef struct true_t {
char _;
} true_t;
true_t TRUE;
typedef struct false_t {
char _;
} false_t;
false_t FALSE;
int f_true() {
return 1;
}
int f_false() {
return 0;
}
#define bool_v(B) _Generic((B *) (0), true_t *: TRUE, false_t *: FALSE)
#define bool_v_to_int(B) _Generic(B, true_t: 1, false_t: 0)
#define v_to_bool(V) typeof(V)
#define is_string_v(X) _Generic((X), \
char *: 1, \
default: 0)
#define is_string_t(X) typeof(_Generic((X), \
char *: TRUE, \
default: FALSE))
#define has_signature_v(X, R, ...) \
_Generic((X), \
SignatureM(R, __VA_ARGS__): 1, \
default: 0)
#define has_signature_t(X, R, ...) \
typeof(_Generic((X), \
SignatureM(R, __VA_ARGS__): TRUE, \
default: FALSE))
#define to_string(x) _Generic((x), \
true_t: "true", \
false_t: "false", \
char*: x, \
const char*: x)
#define has_same_type_v(X, Y) \
_Generic(has_same_type_t(X, Y), \
true_t: 1, \
false_t: 0)
#define has_same_type_t(X, Y) typeof(_Generic((X), \
typeof(Y): TRUE, \
default: FALSE))
#define SignatureM(R, ...) R (*)(__VA_ARGS__)
#define is_same_t(X, Y) \
typeof(_Generic(((X *) (0)), \
Y *: TRUE, \
default: FALSE))
#define and_t(X, Y) \
typeof(_Generic(bool_v(X), \
true_t: _Generic(bool_v(Y), true_t: TRUE, false_t: FALSE), \
false_t: _Generic(bool_v(Y), true_t: FALSE, false_t: FALSE)))
#define or_t(X, Y) \
typeof(_Generic(bool_v(X), \
true_t: _Generic(bool_v(Y), true_t: TRUE, false_t: TRUE), \
false_t: _Generic(bool_v(Y), true_t: TRUE, false_t: FALSE)))
#define not_t(X) \
typeof(_Generic(bool_v(X), \
true_t: FALSE, \
false_t: TRUE))
#define result_t(X, ...) typeof((X) (__VA_ARGS__))
#define id_sig(T) SignatureM(T, void)
#define true_sig id_sig(true_t)
#define false_sig id_sig(false_t)
#define _0 false_sig
#define _1 true_sig
#define bool_sig_v(S) _Generic((S) (0), true_sig: TRUE, false_sig: FALSE)
#define bool_sig_int(S) _Generic((S) (0), true_sig: 1, false_sig: 0)
#define bool_sig_t(S) typeof(bool_sig_v(S))
#define sig_apply_res_t(X) typeof(((X) (0))())
#define is_same_sig_t(SA, SB) typeof(_Generic((SA) (0), SB: TRUE, default: FALSE))
0
// Глобальные переменные
uint8_t *map = NULL;
int map_width = 0;
int map_height = 0;
bool load_level(const char *filename) {
FILE *file = fopen(filename, "r");
if (!file) {
printf("Ошибка: Не удалось открыть файл %s\n", filename);
return false;
}
char lines[512][512];
int h = 0;
char buffer[512];
while (fgets(buffer, sizeof(buffer), file)) {
buffer[strcspn(buffer, "\r\n")] = 0;
if (buffer[0] == '\0' || buffer[0] == ';') continue;
bool contains_map_char = false;
for(int i=0; buffer[i]; i++) {
if (strchr("#$@.*+ ", buffer[i])) {
contains_map_char = true;
break;
}
}
if (contains_map_char) {
strncpy(lines[h], buffer, 511);
h++;
if (h >= 512) break;
}
if (h > 0 && buffer[0] == '\0') break;
}
fclose(file);
if (h == 0) return false;
int w = 0;
for (int i = 0; i < h; i++) {
int len = strlen(lines[i]);
if (len > w) w = len;
}
map = malloc(w * h * sizeof(uint8_t));
map_width = w;
map_height = h;
memset(map, CELL_EMPTY, w * h);
for (int y = 0; y < h; y++) {
for (int x = 0; x < w; x++) {
char c = (x < (int)strlen(lines[y])) ? lines[y][x] : ' ';
if (c == '#') map[y * w + x] = CELL_WALL;
else if (c == '$') map[y * w + x] = CELL_CUBE;
else if (c == '.') map[y * w + x] = CELL_TARGET;
else if (c == '*') map[y * w + x] = CELL_CUBE_ON_TARGET;
else if (c == '@') { map[y * w + x] = CELL_EMPTY; playerX = x; playerY = y; }
else if (c == '+') { map[y * w + x] = CELL_TARGET; playerX = x; playerY = y; }
else map[y * w + x] = CELL_EMPTY;
}
}
return true;
}
Загружалка уровня сокобана, сгенерированная нейронкой
0
{-# LANGUAGE BangPatterns #-}
import Data.List (intercalate)
-- Тип для представления пары значений
data TwoVal = TwoVal !Int !Int
deriving (Show, Eq)
-- Тип для пары с флагом обмена
data TwoValAndStatus = TwoValAndStatus
{ isSwapped :: !Bool
, twoVal :: !TwoVal
} deriving (Show, Eq)
-- Тип для массива (используем список для идиоматичности Haskell)
type Array = [Int]
-- Тип для массива с состоянием сортировки
data ArrayAndStatus = ArrayAndStatus
{ hasSwap :: !Bool
, position :: !Int
, array :: !Array
} deriving (Show, Eq)
-- Сортировка двух элементов с возвратом статуса обмена
sort2 :: TwoVal -> TwoValAndStatus
sort2 (TwoVal a b)
| a > b = TwoValAndStatus True (TwoVal b a)
| otherwise = TwoValAndStatus False (TwoVal a b)
-- Чтение пары значений из массива по позиции
readTwoVal :: Array -> Int -> Maybe TwoVal
readTwoVal arr pos
| pos < length arr - 1 = Just $ TwoVal (arr !! pos) (arr !! (pos + 1))
| otherwise = Nothing
-- Сохранение значения в массив по индексу
storeVal :: Array -> Int -> Int -> Array
storeVal arr val pos =
take pos arr ++ [val] ++ drop (pos + 1) arr
-- Сохранение пары значений в массив
storeTwoVal :: Array -> TwoVal -> Int -> Array
storeTwoVal arr (TwoVal a b) pos =
storeVal (storeVal arr a pos) b (pos + 1)
-- Рекурсивная функция сортировки пузырьком
bubbleSortRec :: ArrayAndStatus -> ArrayAndStatus
bubbleSortRec state@(ArrayAndStatus swap pos arr)
| pos >= length arr - 1 =
if not swap
then state -- Сортировка завершена!
else bubbleSortRec $ ArrayAndStatus False 0 arr -- Новый проход
| otherwise =
case readTwoVal arr pos of
Nothing -> state
Just pair -> -- ← Переименовали переменную здесь
let sortResult = sort2 pair
newArr = storeTwoVal arr (twoVal sortResult) pos -- ← Используем селектор twoVal
newSwap = swap || isSwapped sortResult
in bubbleSortRec $ ArrayAndStatus newSwap (pos + 1) newArr
-- Основная функция сортировки
bubbleSort :: Array -> Array
bubbleSort arr = array $ bubbleSortRec $ ArrayAndStatus False 0 arr
-- Более идиоматичная версия для Haskell (альтернативная реализация)
bubbleSortIdiomatic :: Ord a => [a] -> [a]
bubbleSortIdiomatic = untilFixed bubblePass
where
bubblePass [] = []
bubblePass [x] = [x]
bubblePass (x:y:xs)
| x > y = y : bubblePass (x:xs)
| otherwise = x : bubblePass (y:xs)
untilFixed f x = let fx = f x
in if fx == x then x else untilFixed f fx
-- Функция для красивого вывода
showArray :: Show a => [a] -> String
showArray = intercalate ", " . map show
-- Главная функция
main :: IO ()
main = do
let initialArray = [8, 2, 4, 1, 3, 5, 7, 0, 6, 9]
let sortedArray = bubbleSort initialArray
putStrLn "input"
putStrLn $ showArray initialArray
putStrLn "\nsort:"
putStrLn $ showArray sortedArray
putStrLn "\nsort2:"
putStrLn $ showArray $ bubbleSortIdiomatic initialArray
Переписал через "ИИ" свою чисто-функциональную сортировку пузырьком на "Haskell". Оригинальный код на Си в https://govnokod.ru/27880#comment755323
0
// https://github.com/dotnet/runtime/issues/117233#issuecomment-3028066225
// Issue: Math.Pow relies directly on the OS pow implementation
// Location: [src/coreclr/classlibnative/float/floatdouble.cpp lines 232‑236] and [src/coreclr/classlibnative/float/floatsingle.cpp lines 207‑211]
// COMDouble::Pow and COMSingle::Pow simply call pow/powf from the C runtime. On Windows 11 Insider Preview (build 27881.1000),
// these functions can return incorrect results (e.g., Math.Pow(-1, 2) giving -1). The JIT also uses these functions for constant folding, causing
// wrong constants to be embedded at compile time.
// Suggested Fix: Introduce a managed fallback in COMDouble::Pow/COMSingle::Pow that handles negative bases with integral exponents, bypassing the faulty system call.
//A simple approach:
FCIMPL2_VV(double, COMDouble::Pow, double x, double y)
{
FCALL_CONTRACT;
if ((x < 0.0) && (y == floor(y)))
{
double absResult = pow(-x, y);
return fmod(fabs(y), 2.0) == 1.0 ? -absResult : absResult;
}
return pow(x, y);
}
// Suggested Implementation:
// Add the following code to src/coreclr/classlibnative/float/floatdouble.cpp below line 234 before the return pow:
if ((x < 0.0) && (y == floor(y)))
{
double result = pow(-x, y);
if (fmod(fabs(y), 2.0) != 0.0)
{
result = -result;
}
return result;
}
// Add the following code to src/coreclr/classlibnative/float/floatsingle.cpp below line 209 before the return powf:
if ((x < 0.0f) && (y == floorf(y)))
{
float result = powf(-x, y);
if (fmodf(fabsf(y), 2.0f) != 0.0f)
{
result = -result;
}
return result;
}
// Add the following code to src/libraries/System.Runtime/tests/System.Runtime.Extensions.Tests/System/Math.cs below line 1124:
[Fact]
public static void Pow_NegativeBaseEvenExponent_ReturnsPositive()
{
Assert.Equal(1.0, Math.Pow(-1, 2));
Assert.Equal(16.0, Math.Pow(-2, 4));
}
Вот к чему плавучий петух приводит!
0
#include <stdio.h>
struct{int a; float b;} test()
{
return (typeof(test())){1337, 666.666};
}
int main()
{
auto a = test();
printf("%d %f\n", a.a, a.b);
return 0;
}
В стандарт C23 добавили auto и теперь можно писать такую хуйню. В "Clang" работает: https://godbolt.org/z/GG3addqPb
0
// https://github.com/ggml-org/llama.cpp/blob/f4c3dd5daa3a79f713813cf1aabdc5886071061d/examples/simple/simple.cpp#L23
// parse command line arguments
{
int i = 1;
for (; i < argc; i++) {
if (strcmp(argv[i], "-m") == 0) {
if (i + 1 < argc) {
model_path = argv[++i];
} else {
print_usage(argc, argv);
return 1;
}
} else if (strcmp(argv[i], "-n") == 0) {
if (i + 1 < argc) {
try {
n_predict = std::stoi(argv[++i]);
} catch (...) {
print_usage(argc, argv);
return 1;
}
} else {
print_usage(argc, argv);
return 1;
}
} else if (strcmp(argv[i], "-ngl") == 0) {
if (i + 1 < argc) {
try {
ngl = std::stoi(argv[++i]);
} catch (...) {
print_usage(argc, argv);
return 1;
}
} else {
print_usage(argc, argv);
return 1;
}
} else {
// prompt starts here
break;
}
}
if (model_path.empty()) {
print_usage(argc, argv);
return 1;
}
if (i < argc) {
prompt = argv[i++];
for (; i < argc; i++) {
prompt += " ";
prompt += argv[i];
}
}
}
Парсинг аргументов командной строки
0
typedef struct ll_node
{
struct ll_node *prev;
struct ll_node *next;
int val;
} ll_node;
ll_node a;
ll_node b;
ll_node c = {&a, &b,3};
// не работает
a.next = &b;
a.prev = &c;
b.next = &c;
b.prev = &a;
/*
c.next = &a;
c.prev = &b;
*/
// зато так работает:
ll_node arr[3] = {
{&arr[2], &arr[1],1},
{&arr[0], &arr[2],2},
{&arr[1], &arr[0],3}
};
Кольцевой двусвязный список.
0
// https://godbolt.org/z/f4s13WEWM
#include <inttypes.h>
int test(uint32_t a, uint32_t b)
{
if (a > b)
return a+b;
return a*b;
}
int test2(uint32_t a, uint32_t b)
{
return (a+b)*(a > b) | (a*b)*!(a > b);
}
int test3(uint32_t a, uint32_t b)
{
return
((a+b) & (uint32_t)(!(a > b) - 1)) |
((a*b) & (uint32_t)((a > b) - 1));
}
int test4(uint32_t a, uint32_t b)
{
const uint32_t arr[2] = {a+b, a*b};
return arr[!(a > b)];
}
/* ASM output
test:
bltu a1, a0, .LBB0_2
mul a0, a1, a0
ret
.LBB0_2:
add a0, a0, a1
ret
test2:
bltu a1, a0, .LBB1_2
mul a0, a1, a0
ret
.LBB1_2:
add a0, a0, a1
ret
test3:
bltu a1, a0, .LBB2_2
mul a0, a1, a0
ret
.LBB2_2:
add a0, a0, a1
ret
test4:
addi sp, sp, -16
add a2, a1, a0
mul a3, a1, a0
sltu a0, a1, a0
sw a2, 8(sp)
sw a3, 12(sp)
xori a0, a0, 1
slli a0, a0, 2
addi a1, sp, 8
add a0, a0, a1
lw a0, 0(a0)
addi sp, sp, 16
ret
*/
Наглядная демонстрация того, что компилятор может насрать на ваши попытки заставить его сгенерить branchless машинный код. Получилось это только в "test4"
0
// https://github.com/AlexCeleste/C99-Lambda
// # C99-Lambda: nested functions, lambdas, and closures, in ISO C99
// https://github.com/AlexCeleste/C99-Lambda/blob/57583080392d5f3f626034bbb3292eb0070ba304/c_lambda.h#L110
// Internal lambda builder functions
#define FN_8CL_ARG_TYPE(T) , T
#define FN_8FEXP(call, p, f, R) { FN_8GETTYPE_8fn f = fn f; call(M_ID p M_IF(M_2ORMORE R, (_fun, M_REST_ R), (_fun))); }
#define FN_8CLEXP(call, p, c, R) { void * _fun = cl c; call(M_ID p M_IF(M_2ORMORE R, (_fun, M_REST_ R), (_fun))); }
#define FN_8EMIT_NS(N, H, B, Q) FN_8EMIT_NS_((FN_8GET_NL(N, B)), H, (M_ZIP_W2(FN_8EMIT_ELEM, B, M_ILIST)), Q)
#define FN_8EMIT_NS_(NL, H, BL, Q) (8ZIPNE,(NL, BL, Q), FN_8EMIT_BODY(NL, H, BL))
#define FN_8GET_NL(N, B) M_ZIP_W2(FN_8GET_NL_1, M_ENLIST(_8anon_##N##_, M_NARGS B), M_ILIST)
#define FN_8GET_NL_1(A, B) , M_CONC_(A, B)
#define FN_8EMIT_BODY(NL, H, BL) M_ID H M_ZIP_WITH(FN_8EMIT_BLOCK, BL, NL)
#define FN_8EMIT_ELEM(E, _) ,M_CONC_(FN_8EMIT_, E)
#define FN_8EMIT_8blk(...) (1, 0, __VA_ARGS__)
#define FN_8EMIT_8fn(...) (0, 0, __VA_ARGS__)
#define FN_8EMIT_8cl(...) (0, 1, __VA_ARGS__)
#define FN_8EMIT_BLOCK(P, N) M_IF(M_FIRST P, (M_REST2 P), (FN_8EMIT_NAME((M_REST P, r, a, o), N)))
#define FN_8EMIT_NAME(P, N) M_IF(M_FIRST P, (FN_8EMIT_CL(N, M_ID P)), (N))
#define FN_8EMIT_CL(...) FN_8EMIT_CL_(__VA_ARGS__)
#define FN_8EMIT_CL_(n, _, r, a, o, ...) (void*)&(struct n##_env_t){ \
n,sizeof(struct n##_env_t) M_FOR_EACH(FN_8CL_SND, M_ID o) }
#define FN_8CL_SND(P) , M_REST_ P
#define FN_8EMIT_ENV(E, Q) (8DO_Q, (Q), FN_8EMIT_ENV_(E))
#define FN_8EMIT_ENV_(n, rt, a, o) struct n##_env_t { \
FN_8CTYPE(rt, n, a, _fun); size_t _size; M_FOR_EACH(FN_8FLDS, M_ID o) };
#define FN_8FLDS(F) M_FIRST_ F M_REST_ F;
#define FN_8CL_DEC(rt, n, a) static rt n(void * _envV, M_ID a) { struct n##_env_t * _env = _envV;
#define FN_8FTYPE(rt, C, a, pn) rt(* C pn)a
#define FN_8CTYPE(rt, n, a, pn) rt(* pn)(void *, M_ID a)
#define FN_8FN_TYPE(F) M_CONC(FN_8GETTYPE_, M_FIRST(M_REST((F))))
#define FN_8GETTYPE_8fn(rt, a, ...) rt(* _fun)a
#define FN_8CLSZ(T, N) T M_CONC(_, N);
#define FN_8ZIPNE(NL, BL, Q) (8FLTNE, ((M_ZIP_W2(FN_8ZIPNE_, NL, BL)), Q))
#define FN_8ZIPNE_(N, B) ,(M_FIRST_ B, N, M_REST_ B)
#define FN_8FLTNE(EL, Q) (8POPEM, ((0 M_FOR_EACH(FN_8FLTNE_, M_ID EL)), Q))
#define FN_8FLTNE_(E) M_IF(M_FIRST_ E, (), (,(M_REST_ E)))
#define FN_8POPEM(FL, Q) M_IF(M_2ORMORE(M_ID FL), ((8F2NS, ((M_REST_ FL), Q))), ((8DO_Q, (Q))))
#define FN_8F2NS(FL, Q) (8DO_Q, ((M_FOR_E2(FN_8F2NS_1, M_ID FL), M_ID Q)))
#define FN_8F2NS_1(F) ,FN_8F2NS_2 F
#define FN_8F2NS_2(n, isC, rt, a, ...) M_IF(isC, \
((8EMIT_NS_NX, (n, (FN_8CL_DEC(rt, n, a)), M_REST(__VA_ARGS__))), (8EMIT_ENV,(n, rt, a, M_FIRST(__VA_ARGS__)))), \
((8EMIT_NS_NX, (n, (static rt n a), __VA_ARGS__))))
#define FN_8DO_Q(Q) (M_ID(M_FIRST_ M_FIRST_ Q),(M_ID M_REST_ M_FIRST_ Q, (M_REST_ Q)))
#define FN_8EMIT_NS_NX(...) (8EMIT_NS, (__VA_ARGS__))
Ммм, дерьмецо