Тег c

hirthwork

Допустим есть функция bool f(void** p), которая меняет где-то внутре делает *p = new_p;
Допустим есть конструкция:
if (f(&p) && f(&p)) {...}
Правильно ли я помню, что стандарт не гарантирует, в каком порядке будут вычислены оба &p и может оказаться так, что порядок вычислений может быть как &p f(..) &p f(..) так и &p &p f(..) f(..)?

bitfield
    unsigned long  f_bsize;    /* file system block size */
    unsigned long  f_frsize;   /* fragment size */
    fsblkcnt_t     f_blocks;   /* size of fs in f_frsize units */

Линус, ты пьян, иди домой.

hirthwork
$ cat main.c
#include <stdio.h>

inline void f() {
        puts("hello, world");
}

int main() {
        f();
}

$ gcc main.c
/tmp/ccBmwK0W.o: In function `main':
main.c:(.text+0xa): undefined reference to `f'
collect2: error: ld returned 1 exit status

Живите теперь с этим.

RA

Нужна помощь знающих людей по си. Есть php расширение
https://github.com/Rabotyah.../php7/array_to_dom.c
оно преобразует массив в dom-документ. Но иногда вылетает "recursion detected", см строку 196. И я не знаю почему это могло бы происходить.
Тут может ещё скил в php расширениях нужен.

MadOkamullator
TValue*rb=((((((int)(((i)>>(((0+6)+8)+9))&((~((~(Instruction)0)<<9))<<0)))))&(1<<(9-1)))?k+((int)((((int)(((i)>>(((0+6)+8)+9))&((~((~(Instruction)0)<<9))<<0)))))&~(1<<(9-1))):base+(((int)(((i)>>(((0+6)+8)+9))&((~((~(Instruction)0)<<9))<<0)))));
TValue*rc=((((((int)(((i)>>((0+6)+8))&((~((~(Instruction)0)<<9))<<0)))))&(1<<(9-1)))?k+((int)((((int)(((i)>>((0+6)+8))&((~((~(Instruction)0)<<9))<<0)))))&~(1<<(9-1))):base+(((int)(((i)>>((0+6)+8))&((~((~(Instruction)0)<<9))<<0)))));
{L->savedpc=pc;{if((((rb)->tt)==((rc)->tt)&&luaV_equalval(L,rb,rc))==(((int)(((i)>>(0+6))&((~((~(Instruction)0)<<8))<<0))))) {(pc)+=(((((int)(((*pc)>>((0+6)+8))&((~((~(Instruction)0)<<(9+9)))<<0))))-(((1<<(9+9))-1)>>1)));};;};base=L->base;}

но хаскель трудночитаемый и сложный

hirthwork

осознал, что ни разу в жизни не писал АВЛ-дерево. пишу сюда, потому что здесь тупняк в моде

bitfield

Нашли прекрасную багу у сотрудника, который в отпуске.

В заголовочном файле есть константа

#define BUFSIZE 8128

Приходит пакет размером 3 КБ и ... обрабатывается неверно.
Читаем код функции: буфер размером BUFSIZ, в который копируется пакет.
Стоп! Что такое BUFSIZ? Откуда оно берется?
F12 (Go to Definition) и попадаем в stdio.h:

#define BUFSIZ 512

PS. Осталось еще узнать, почему 8128, а не 8*1024=8192.

Tishka17

Вижуал студия 2015 не полностью поддерживает C99. Да они охренели!

bitfield

мимими 1:

The "best" example of this maintainability problem could be found in the old implementation of the printf family of functions. The CRT provides 142 different variations of printf, but most of the behavior is the same for all of the functions, so there are a set of common implementation functions that do the bulk of the work. These common implementation functions were all defined in output.c in the CRT sources(1). This 2,696 line file had 223 conditionally compiled regions of code (#ifdef, #else, etc.), over half of which were in a single 1,400 line function. This file was compiled 12 different ways to generate all of the common implementation functions.

мимими 2:

We have converted most of the CRT sources to compile as C++, enabling us to replace many ugly C idioms with simpler and more advanced C++ constructs. The publicly callable functions are still declared as C functions, of course (extern "C" in C++), so they can still be called from C. But internally we now take full advantage of the C++ language and its many useful features.

мимими 3:

Before this refactoring, the sprintf functions, which write formatted data to a character buffer, were implemented by wrapping the result buffer in a temporary FILE object and then deferring to the equivalent fprintf function.

MadOkamullator

C/invoke Даже удобнее чем libffi. Няшная штука.

RA

Вот расширение и готово. https://github.com/Rabotyahoff/array_to_dom Сделано на основе вот этого https://github.com/DmitryKoterov/dom_varimport
Нужно оно для того чтобы перегонять массив в domDocument. Но в оригинальном расширении структура входящего массива совсем не та, которую использую я.
Раньше эта задача выполнялась средствами php, но было медленным #aaet.

Теперь мой тест выглядит так
arrayToXML
0.2050
0.2020
0.2027

arrayToDOM
0.0619
0.0656
0.0659

array_to_dom
0.0095
0.0124
0.0134

Последний тест говорит, что преобразование через расширение чуть ли не в 20 раз быстрее преобразования в текстовый xml и в 6 раз быстрее преобразования в domDocument средствами php.

PS Расширение работает несмотря на скепсис #acip/37

RA

Подскажите нубу как узнать код написан на c или на c++?

hirthwork

У POSIX и Linux в частности есть проблема. Когда ты вызываешь dlsym(), то ты
можешь задать только имя функции, которую надо загрузить, ничего больше.
Затем уже элементарно можно ошибиться с параметрами и получить увлекательный
дебаг. Ошибиться с параметрами можно не только из-за криворукости, а ещё и
из-за того, что при увеличении мажорной версии автор либы чуть изменил API

Казалось бы, C++ и манглинг спасают ситуацию. Можно сразу в dlsym() передать
трудночитаемую строку, которая говорит, что загружаемая функция принимает в
себя struct stat по значению. И опять получить увлекательный дебаг, потому что
с годами размер struct stat тоже растёт. Можно передавать все аргументы по
указателю/ссылке, но это не cache friendly.

Получается, что система загрузки символов должна включать указание abi, которое
будет описывать layout аргументов и возвращаемого значения, например,
указывать, что функция возвращает восьмибайтный дабл и принимает структуру,
состоящую из поля вмещающего в себя size_t и указателя, а вторым параметром
идёт массив из десяти восьмибитных элементов.
При этом набор типов такого метаязыка описания abi можно свести к intN_t,
floatN_t, size_t и void*, всё остальное можно описать комбинируя эти типы в
структуры и массивы.
Вот только вряд ли общественность примет динамическую загрузку символов со
стогой типизацией

hirthwork

хороший, годный аллокатор, готовый исполнить все самые сокровенные мечты задротов от программирования: ftp://gee.cs.oswego.edu/pub/misc/malloc.c особенно радует отсутствие фрагментации памяти

hirthwork

это чувство, когда думаешь что понял memory_order в сишечкк

hirthwork

Как в C++ унаследовать класс Circle от класса Point
и в compile-time запретить изменять координаты Point после инициализации, так
что остальные члены Circle можно было изменять? Да никак.
Как в C сделать то же самое?

struct Point {int x,y;};
struct Circle {const struct Point p; int r, color;};

#define RED (0xff0000)
#define BLAKC (0x000000)

int main() {
    int x = 1;
    int y = 2;
    struct Circle c = {.p = {.x = x, .y = y}, .r = 5, .color = RED};
    (void) c; // get rid of 'set but unused' warning
    c.color = BLAKC;
    // c.p.x = 5; // <- uncomment to get error
    return 0;
}

Видите? В отличие от плюсцов, C — объектно-ориентированный язык.
Всем проникшимся, а так же ебанутым и им сочувствующим, рекомендую к прочтению
книгу "Object-oriented programming with ANSI C" by AT Schreiner.
У меня, конечно не ANSI, а, минимум, C99, но сути это не меняет.

hirthwork

За окном шёл 2013 год, Сергей Брин засунул компьютер в оправу очков, на соседней планете катался любопытных марсоход, hirthwork угорел по Джаве, а стандарт языка Си до сих пор не говорил, как узнать почему fopen вернул NULL.

hirthwork

все знают, что volatile говно и нихуя не синхронизируется. однако выяснилось, что на моём слабом ноутбуке, в схеме один писатель-много читателей, обновление значение глобальной volatile переменной, читатель способны заметить порядка пятнадцати тысяч раз в секунду. при этом максимальный интервал между «замечаниями» составил меньше пяти миллисекунд. это я к чему? да к тому, что если у вас только один писатель, то volatile отлично подходит для передачи данных между потоками

Добавить пост

Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
Для форматирования текста используется Markdown.