SIGSEGV и совместимость.

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

SIGSEGV и совместимость.

Сообщение mutombe64 » 08.04.2010 13:02:11

Доброго времени суток! :)
Начал разработку класса для работы с pnglib. Сначала весь код был создан в Delphi но с испозьзованием только winAPI и апи самой библиотеки. Готовый код работал так как и задумывалось. Создал аналогичный Win32 проект в лазарусе. Сам код откомпилировался без ошибок в режиме {$mode delphi}. Только вот прога начала получать External: SIGSEGV. Опытным путем установил что источником служил код:
Код: Выделить всё
  type barc = array[0..0] of byte;
       pbarc = ^barc;
       parc = array[0..0] of ^byte;
       pparc = ^parc;
var
row_pointers: png_bytepp;
data: pbarc;

Код: Выделить всё
           
            GetMem(row_pointers,height);
            GetMem(data,row_bytes*height);
            for x:= 0 to height-1 do
            pparc(row_pointers)^[x]:= pointer(DWORD(data)+x*row_bytes);

пробовал заменять и алгоритм заполнения и выделение памяти на GlobalAlloc. результат тот же. Переустановка IDE не помогла.
Возможно ктонибудь подскажет метод разрешения :?:
mutombe64
незнакомец
 
Сообщения: 2
Зарегистрирован: 08.04.2010 12:29:19

Re: SIGSEGV и совместимость.

Сообщение alaken » 08.04.2010 15:40:38

не могу повторить ваш код
дайте описание типа png_bytepp, и определение row_bytes, height и их значения.
и я не уверен что диапазон массива корректный (array[0..0] of byte).
alaken
постоялец
 
Сообщения: 221
Зарегистрирован: 18.02.2010 09:02:13

Re: SIGSEGV и совместимость.

Сообщение mutombe64 » 08.04.2010 17:02:21

height, width, bit_depth - это данные исходного битамапа, источника пикселов для сохранения.
Например:
row_bytes:= 1269;
width:= 423;
height:= 700;
bit_depth:= 8;
Код: Выделить всё
type
    bytep = ^byte;
    bytepp = ^bytep;
    png_bytepp = bytepp;
var
    row_pointers: png_bytepp;

Этот код является стандартным для libpng.
Код: Выделить всё
...
png_set_IHDR(png_ptr,info_ptr,width,height,8,
      PNG_COLOR_TYPE_RGB,PNG_INTERLACE_NONE,PNG_COMPRESSION_TYPE_DEFAULT,0);
...
    row_bytes:= png_get_rowbytes(png_ptr,info_ptr);
    GetMem(row_pointers,height);
    GetMem(data,row_bytes*height);
    for x:= 0 to height-1 do
    pparc(row_pointers)^[x]:= pointer(DWORD(data)+x*row_bytes);

При этом, ошибка появляется только в созданной в Lazarus программе.
mutombe64
незнакомец
 
Сообщения: 2
Зарегистрирован: 08.04.2010 12:29:19


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 44

Рейтинг@Mail.ru