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

Разработка программ на пес его знает на чем
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Аватара пользователя
RaFaeL
Ветеран
Сообщения: 711
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Контактная информация:

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

Сообщение RaFaeL » 16 Январь 2018, 12:30

Может кто-нибудь подскажет. В процессе работы с 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 это опытным путем вычисленные "сдвиги" с пустыми значениями чтобы следующие переменные "попадали" на свое место. с ними все работает как надо. Почему так? Есть ли всему этому объяснение?

Аватара пользователя
Дед Пахом
Старичок
Сообщения: 2039
Зарегистрирован: 07 Июль 2005, 15:51
Откуда: Москва, Россия

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

Сообщение Дед Пахом » 16 Январь 2018, 12:53

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

Аватара пользователя
RaFaeL
Ветеран
Сообщения: 711
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Контактная информация:

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

Сообщение RaFaeL » 16 Январь 2018, 13:24

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

Аватара пользователя
RaFaeL
Ветеран
Сообщения: 711
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Контактная информация:

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

Сообщение RaFaeL » 16 Январь 2018, 13:41

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

Аватара пользователя
RaFaeL
Ветеран
Сообщения: 711
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Контактная информация:

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

Сообщение RaFaeL » 19 Январь 2018, 11:18

А как передать вот такое

uint32_t breaks[]

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

Yufil
Ветеран движения
Сообщения: 1008
Зарегистрирован: 16 Май 2006, 13:34
Контактная информация:

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

Сообщение Yufil » 19 Январь 2018, 11:33

Описать в Кларионе поле как Long и передать в него адрес первого поля массива...

Аватара пользователя
RaFaeL
Ветеран
Сообщения: 711
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Контактная информация:

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

Сообщение RaFaeL » 19 Январь 2018, 11:49

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

Yufil
Ветеран движения
Сообщения: 1008
Зарегистрирован: 16 Май 2006, 13:34
Контактная информация:

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

Сообщение Yufil » 19 Январь 2018, 12:01

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

Аватара пользователя
RaFaeL
Ветеран
Сообщения: 711
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Контактная информация:

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

Сообщение RaFaeL » 19 Январь 2018, 12:22

Отбой! Это uint16_t т.е. short, с другой процедурой перепутал. Работает

Аватара пользователя
RaFaeL
Ветеран
Сообщения: 711
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Контактная информация:

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

Сообщение RaFaeL » 29 Январь 2018, 12:06

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

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

Аватара пользователя
Дед Пахом
Старичок
Сообщения: 2039
Зарегистрирован: 07 Июль 2005, 15:51
Откуда: Москва, Россия

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

Сообщение Дед Пахом » 29 Январь 2018, 12:36

Скорее всего оба LONG. А STAILQ_ENTRY какой-то макрос, надо искать в инклюдах.
С уважением, ДП

Аватара пользователя
RaFaeL
Ветеран
Сообщения: 711
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Контактная информация:

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

Сообщение RaFaeL » 29 Январь 2018, 17:04

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

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

Аватара пользователя
RaFaeL
Ветеран
Сообщения: 711
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Контактная информация:

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

Сообщение RaFaeL » 29 Январь 2018, 17:09

Насчитал с учетом паддинга всего 104, итого надо прибавить 80 байт к первым 4м полям...

Ответить