Страница 1 из 1

Передача групп в С библиотеки

Добавлено: 16 Январь 2018, 12:30
RaFaeL
Может кто-нибудь подскажет. В процессе работы с libxlsxwriter столкнулся с непонятным. В качестве параметров надо передавать в функции структуры, они известны, но возникли нюансы. Например структуру

Код: Выделить всё

typedef struct lxw_chart_line {
    lxw_color_t color;
    uint8_t none;
    float width;
    uint8_t dash_type;
    uint8_t transparency;
} lxw_chart_line; 
удалось передать как

Код: Выделить всё

chart_line GROUP,TYPE
color       LONG
none        BYTE
indent      STRING(3)
width       SREAL
dash_type   BYTE
transparency BYTE
 END
а

Код: Выделить всё

typedef struct lxw_chart_font {
    char *name;
    double size;
    uint8_t bold;
    uint8_t italic;
    uint8_t underline;
    int32_t rotation;
    lxw_color_t color;
} lxw_chart_font; 
это

Код: Выделить всё

chart_font    GROUP,TYPE
name           LONG
indent1        LONG
size           REAL
bold           BYTE
italic         BYTE
underline      BYTE
indent2        BYTE
rotation       LONG
color          LONG
 END
где различные indent это опытным путем вычисленные "сдвиги" с пустыми значениями чтобы следующие переменные "попадали" на свое место. с ними все работает как надо. Почему так? Есть ли всему этому объяснение?

Передача групп в С библиотеки

Добавлено: 16 Январь 2018, 12:53
Дед Пахом
В опциях компилятора C++ есть значение выравнивания (по байту/слову/двойному слову). Вот первая ссылка из поисковика c++ выравнивание структур

Передача групп в С библиотеки

Добавлено: 16 Январь 2018, 13:24
RaFaeL
Спасибо. Но если с float, допустим, понятно, то зачем нужен сдвиг например перед int32_t rotation и почему перед таким же typedef int32_t lxw_color_t он не нужен все равно не совсем понятно... Потому что надо 4 байта? А с double который size что не так? В других структурах идет как REAL без всяких сдвигов а перед им и так указатель, как я понимаю, той же 4 байтовой длины...

Передача групп в С библиотеки

Добавлено: 16 Январь 2018, 13:41
RaFaeL
Так, вроде нашел, размер структуры должен быть кратен самому большому полю в структуре, если это int32 то 4, если double то 8, соответственно сдвиг то нужен, то нет, и его размер тоже может быть каким угодно. Спасибо )

Передача групп в С библиотеки

Добавлено: 19 Январь 2018, 11:18
RaFaeL
А как передать вот такое

uint32_t breaks[]

Кларионовский вариант с *LONG[] не работает. Я правильно понимаю, что передавать надо напрямую значения а не указатель как в Кларионе? Какие есть варианты?

Передача групп в С библиотеки

Добавлено: 19 Январь 2018, 11:33
Yufil
Описать в Кларионе поле как Long и передать в него адрес первого поля массива...

Передача групп в С библиотеки

Добавлено: 19 Январь 2018, 11:49
RaFaeL
Стало лучше, но только первый элемент массива и принимает. Может через CSTRING как-то группами по 4 байта?

Передача групп в С библиотеки

Добавлено: 19 Январь 2018, 12:01
Yufil
Вот тут непонятно. Программа на Сях не знает размерности передаваемого массива, каковая должна быть фиксирована или передана через другой параметр или, наконец, массив должен быть ограничен некоторым концевым значением. Смотреть дооку надо...

Передача групп в С библиотеки

Добавлено: 19 Январь 2018, 12:22
RaFaeL
Отбой! Это uint16_t т.е. short, с другой процедурой перепутал. Работает

Передача групп в С библиотеки

Добавлено: 29 Январь 2018, 12:06
RaFaeL

Код: Выделить всё

typedef struct lxw_image_options {

    /** Offset from the left of the cell in pixels. */
    int32_t x_offset;

    /** Offset from the top of the cell in pixels. */
    int32_t y_offset;

    /** X scale of the image as a decimal. */
    double x_scale;

    /** Y scale of the image as a decimal. */
    double y_scale;

    lxw_row_t row;
    lxw_col_t col;
    char *filename;
    char *url;
    char *tip;
    uint8_t anchor;

    /* Internal metadata. */
    FILE *stream;
    uint8_t image_type;
    double width;
    double height;
    char *short_name;
    char *extension;
    double x_dpi;
    double y_dpi;
    lxw_chart *chart;

    STAILQ_ENTRY (lxw_image_options) list_pointers;

} lxw_image_options;
 
В данном случае мне нужно передать так, чтобы все параметры ниже 4го были очищены. Вопрос собственно в том, какого размера FILE (просто long как указатель? ) и особенно что такое и какого размера нижний пункт STAILQ_ENTRY

Передача групп в С библиотеки

Добавлено: 29 Январь 2018, 12:36
Дед Пахом
Скорее всего оба LONG. А STAILQ_ENTRY какой-то макрос, надо искать в инклюдах.

Передача групп в С библиотеки

Добавлено: 29 Январь 2018, 17:04
RaFaeL

Код: Выделить всё

#define	STAILQ_ENTRY(type)						\
struct {								\
	struct type *stqe_next;	/* next element */			\
} 

Передача групп в С библиотеки

Добавлено: 29 Январь 2018, 17:09
RaFaeL
Насчитал с учетом паддинга всего 104, итого надо прибавить 80 байт к первым 4м полям...