Профиль пользователя заблокирован сроком «навсегда» без указания причины
Ответы пользователя по тегу C
  • Едино разовое объявление структуры в проекте

    @MikhailEdoshin
    Вы переменную создаете, а не только структуру объявляете. test_blah — это переменная, тип данных struct blah. Задумывалось, наверное, так:

    /* blah.h */
    struct blah; /* урезанное описание */
    
    /* blah.c */
    #include "blah.h"
    struct blah { int a, b } /* описание */
    test_blah; /* и тут же объявление переменной этого типа */
    
    /* main.c */
    #include "blah.h"
    /* можно работать с указателями на struct blah */
    Ответ написан
    1 комментарий
  • Примитивный модуль на C для Python течёт по памяти?

    @MikhailEdoshin
    Со списком все в порядке, проблема во взаимодействии функций. Py_BuildValue возвращает new reference, то есть объект со счетчиком ссылок, установленным в единицу, которым теперь владеет ваш код. Функция же PyList_Append не забирает у вас этот объект, а тоже увеличивает счетчик ссылок еще на единицу. Теперь у полученной строки будет два владельца — список и ваш код. Когда вы удалите список, он честно отнимет свою единичку от счетчика ссылок, но ваша-то там останется, поэтому Питон будет думать, что кто-то где-то эту строку еще использует.

    Вам нужно или явно уменьшить счетчик:

    PyObject *list, *item; /* static, право, ни к чему */
    list = PyList_New(0);
    item = Py_BuildValue("s"; "test");
    PyList_Append(list, item);
    Py_DECREF(item);
    return list;
    

    или же использовать функцию, которая не увеличивает счетчик (steals reference):

    PyObject *list;
    list = PyList_New(1); /* оставляем место для элемента */
    PyList_SET_ITEM(list, Py_BuildValue("s"; "test"));
    return list;
    

    (В данном случае я использовал макрос PyList_SET_ITEM, который как раз подходит для заполнения новых списков.)
    Ответ написан
    4 комментария
  • inline function в С

    @MikhailEdoshin
    Вы пишете, что функция у вас определена в заголовочном файле — вы имеете в виду, что весь код функции там или только объявление (то есть она объявлена, а не определена)? Мне кажется, только объявлена, иначе у вас, скорее всего, были бы дублирующиеся символы при линковке.

    Вообще же extern inline функция (возможно) будет развернута в inline в той единице компиляции, где она определена, и из получившегося объекта будет торчать одноименный символ. Все остальные единицы компиляции будут использовать ее как обычную extern функцию. На SO есть небольшое обсуждение.

    Если вы хотите развернуть ее во всех единицах компиляции, то можно, по примеру С++, описать функцию полностью в заголовочном файле как static inline плюс добавить не-static обертку для экспорта. (Или перед компиляцией слить все файлы в один — наверное, так будет даже проще.)
    Ответ написан
    Комментировать
  • Выбор первой IDE для С/С++ в кружке программирования?

    @MikhailEdoshin
    Pelles C? С++ нет. Windows. Скриншоты.
    Ответ написан
    Комментировать
  • Библиотеки/средства, способные напечатать текст в изображение, пригодное для печати на принтере?

    @MikhailEdoshin
    Текст и картинка разные вещи. Текст печатается с разрешением принтера (например, 300 dpi — это достаточно низкое разрешение, недостатки будут заметны невооруженным глазом), а картинка — с линеатурой растра (например, 75 lpi — это, напротив, довольно высокая линеатура). Если печатать текст картинкой, он всегда будет дробиться растром, тут ничего не сделать. Копайте все-таки в сторону измерения длины строки как-то.
    Ответ написан
    4 комментария
  • Соглашение о работе с ядром в подпрограммах языка С++

    @MikhailEdoshin
    Вы имеете в виду calling conventions, т. е. stdcall, fastcall и т. п.? Собственно в этом и разница, одни очищают, другие нет. Если вы не пишете собственную libffi, то остается только следить за правильностью объявлений.
    Ответ написан
    Комментировать