Egor
@antoshkka спасибо, то, что нужно =)
Berkus
вот Антон прямо за тебя написал всё
Egor
@berkus 👍, ага, понял, я просто разворачивал указатель, компилилось и вылетало
🐙 Antony
@antoshkka спасибо, то, что нужно =)
На здоровье. Только не пиши так в коде :)
Egor
дам лектору, пусть читает =)
Дмитрий
Всем привет.
Vovenzio
Вы код с телефона читаете?
Anatoly
Вы код с телефона читаете?
код до 1 млн строк мы читаем здесь, если больше, публикуй на гитхабе
Крылатый
1 млн строк это уже много для чата.
Egor
char x() { printf("x"); return 'a'; } int q() { return 222; } void* call(void* a) { printf("start\n"); // тут уже некий псевдокод, потому что не могу допереть как правильно сделать любой возращаемый тип void* a = (((void(*)())a)()); printf("end\n"); return a; } int main(int argc, char** argv) { void* c = call((void*)x); void* c2 = call((void*)q); char z = *((char*)c); int z2 = *((int*)c2); return 0; } как это профиксить, где строка с комментарием?
Anonymous
ты что-то мутное творишь
Anonymous
давай так, что изначально требуется реализовать?
Egor
ну я сам потыкаюсь, если не получится, попробую объяснить
Anonymous
я вот думаю, что возвращать void* — не лучшая идея
Anonymous
мб void* call(void* func, void* result) { }
Anonymous
и присваивать как-то
Egor
ну хорошо, а как мне тогда с вызова получить указатель к выходному рез-ту
Egor
ну хорошо, а как мне тогда с вызова получить указатель к выходному рез-ту
int xxx() { printf("lala"); return 77; } int main(int argc, char** argv) { void* res = (void*) (((void* (*)()) ((void*)xxx))()); // не арбайтен printf("%d", *((int *)res)); return 0; }
Anonymous
сегфолтится небось
Egor
только "lala" выводит
Egor
рез-т на выход не могу получить
Дмитрий
Народ, где можно найти хорошую реализацию паттернов?
Anonymous
уточни, о каких паттернах идёт речь, а что-то туплю)
Дмитрий
спасибо
Anonymous
int xxx() { printf("lala"); return 77; } int main(int argc, char** argv) { void* res = (void*) (((void* (*)()) ((void*)xxx))()); // не арбайтен printf("%d", *((int *)res)); return 0; }
test.c:8:16: runtime error: load of misaligned address 0x00000000004d for type 'int', which requires 4 byte alignment 0x00000000004d: note: pointer points here
Anonymous
ты там чтоле код обфусцируешь, чтобы преподу напакостить
Egor
ну нет, я просто еще хочу кое-что попробовать интересное сделать
Egor
на чистом си, ес-сно
Anonymous
0x4d это твой 77
Egor
ух еп)))
Anatoly
ну нет, я просто еще хочу кое-что попробовать интересное сделать
у тебя есть неплохие шансы, только вот что ты хочешь сделать?
Egor
@foxcpp ❤️
Matwey
По почте
Pavel
лучше бы на ассемблере писали, если такой специфичной магии хочется
Anonymous
да... generic programming на C — это сильно
Egor
да, именно, я уже разобрался
Egor
спасибо еще раз, а чем трейсишь?
Anonymous
clang -fsanitize=undefined
Egor
thx
Anton
@ZedDead Вот это уже почти silver bullet: https://gperftools.github.io/gperftools/heap_checker.html https://gperftools.github.io/gperftools/heapprofile.html
Billy
теоретически да, практически я бы больше доверял диагностике ASAN если память на боксе рано или поздно кончается при примерно постоянном количестве клиентов - значит течёт
Да, я склоняюсь к тому, что ты говоришь тоже. Вот копаемся. Нашел сука мапу куда пишутся строки скаждого клиента. Мапа не чистится. Зачем нужна хз. Удалил ее нахер. Ща проверям на проде
Berkus
~ $ ./test fish: “./test” terminated by signal SIGSEGV (Address boundary error)
ннну результат где-то в eax, ты считаешь его указателем, потом ломишься по адресу 77..
Pavel
сначала должен быть асм, и только потом уже (void*) (((void* (*)()) ((void*)xxx))())
Pavel
хотя я вообще не понимаю зачем (void*) (((void* (*)()) ((void*)xxx))()) писать. один раз пример почитал, понял как работает и держишься от всего этого подальше
Egor
да, про плюсы знаю
Egor
но я хочу в си приспособиться
Egor
уже все сделали =)
🐙 Antony
И как оно выглядит?
Egor
int q(int a, int b) { printf("lalal2\n"); return a + b; } void* call(void* a, void* v[]) { printf("start\n"); void* z = (void*) (((void* (*)(void* a, void* b, void* c)) ((void*)a))( v[0], v[1], v[2] )); printf("end\n"); return z; } int main(int argc, char** argv) { void* args[] = {(void*)10, (void*)15, (void*)3}; void* c = call((void*)q, args); printf("\n%d", ((int*)c)); return 0; }
Egor
черновой вариант
Matwey
Господа, я чо-то не понял. А давно к статическим членам разрешили через точки обращаться?
🐙 Antony
остановись
Matwey
Или так всегда было?
🐙 Antony
черновой вариант
ты делаешь чудовищные вещи
🐙 Antony
черновой вариант
скажу по другому: ТВОЙ КОД РАБОТАЕТ ПО ЧИСТОЙ СЛУЧАЙНОСТИ
Berkus
prog.cc:19:27: warning: format '%d' expects argument of type 'int', but argument 2 has type 'int*' [-Wformat=] printf("\n%d", ((int*)c));
Berkus
кастрировать, потом банить
wl#zk}s
Всем привет
Berkus
иначе sequencing нарушается
wl#zk}s
Чем отличается программист техник от программиста?
Крылатый
Что.
Dr. Friedrich
Что-то у вас под вечер какие-то нездоровые тут дискуссии начались, друзья.
Крылатый
БАН
Dr. Friedrich
Не надо никого банить, давайте спокойно общаться.
wl#zk}s
То есть это тот же программист?
wl#zk}s
Я в любом случае пойду на высшие потом
Dr. Friedrich
То есть это тот же программист?
Ну только один из них техник :)