Помощь с Exception SIGSEGV
Добавлено: 19.08.2016 14:09:09
Добрый день!
Помогите разобраться с причиной возникновения ошибки Exception SIGSEGV при исполнении программы.
Задача простая: считать из файлов таблицу х, y, z для дальнейших действий. х, y, z хранятся в двух файлах каждый: в бинарном *.img и метафайле *.hdr. Метафайл хранит размерность массива, тип данных и др.
Написаны 2 функции:
1) function ReadHDR(AName: string; var Ahdr: THDR): boolean; - считывает hdr-файл AName и записывает его данные в структуру Ahdr.
2) function ReadIMG(AName: string; Ahdr: THDR; var AValue: TTwoDimArofReal): boolean; - считывает двумерный массив AValue из img-файла AName по структуре Ahdr.
Эта пара функций последовательно вызывается для считывания z. Пользователь указывает в диалоге имя файла, где хранится z.
Для теста даны 6 файлов (longitude.hdr, longitude.img), (latitude.hdr, latitude.img), (Rrs_443.hdr, Rrs_443.img).
Вводится любой из img-файлов, функции и программа работают нормально, данные считываются правильно.
Теперь ВНИМАНИЕ! Чтобы сформировать таблицу х, y, z, в программа 3 раза обращается к описанным функциям. Вначале для считывания z (в тесте Rrs_443.img), который указывает пользователь, а потом - для считывания x и y (уже без участия пользователя). И здесь происходит ошибка. Т.е. получается, что по отдельности х, y, z считываются, а вместе уже нет.
Пошаговая отладка не помогает. Ошибка вылезает в бессмысленном месте str1:=StringReplace(AStr,#32,'',[rfReplaceAll]); - на строке, в которой происходит удаление из переменной типа string пробелов. Вообще, пробуя разные варианты ввода обнаружил, что ошибка вылезает в разных местах кода. Такое у меня раньше случалось при ошибке в использовании динамических массивов в Delphi. Выходило, что компилятор выполнял ошибочное действие, а ошибку выдавал в совершенно другом месте.
В Lazarus всплывает окно Ассемблера с указанием адреса памяти, по которому произошла ошибка. Но Ассемблером пользоваться я не умею. Уже крыша едет, нужна помощь в отыскании ошибки. Код программы прилагаю - https://yadi.sk/d/U1HJzhzfuL9Ek
Lazarus 1.6/ Linux Mint Rosa. При компиляции в Windows7 происходит та же история.
Помогите разобраться с причиной возникновения ошибки Exception SIGSEGV при исполнении программы.
Задача простая: считать из файлов таблицу х, y, z для дальнейших действий. х, y, z хранятся в двух файлах каждый: в бинарном *.img и метафайле *.hdr. Метафайл хранит размерность массива, тип данных и др.
Написаны 2 функции:
1) function ReadHDR(AName: string; var Ahdr: THDR): boolean; - считывает hdr-файл AName и записывает его данные в структуру Ahdr.
2) function ReadIMG(AName: string; Ahdr: THDR; var AValue: TTwoDimArofReal): boolean; - считывает двумерный массив AValue из img-файла AName по структуре Ahdr.
Эта пара функций последовательно вызывается для считывания z. Пользователь указывает в диалоге имя файла, где хранится z.
Для теста даны 6 файлов (longitude.hdr, longitude.img), (latitude.hdr, latitude.img), (Rrs_443.hdr, Rrs_443.img).
Вводится любой из img-файлов, функции и программа работают нормально, данные считываются правильно.
Теперь ВНИМАНИЕ! Чтобы сформировать таблицу х, y, z, в программа 3 раза обращается к описанным функциям. Вначале для считывания z (в тесте Rrs_443.img), который указывает пользователь, а потом - для считывания x и y (уже без участия пользователя). И здесь происходит ошибка. Т.е. получается, что по отдельности х, y, z считываются, а вместе уже нет.
Пошаговая отладка не помогает. Ошибка вылезает в бессмысленном месте str1:=StringReplace(AStr,#32,'',[rfReplaceAll]); - на строке, в которой происходит удаление из переменной типа string пробелов. Вообще, пробуя разные варианты ввода обнаружил, что ошибка вылезает в разных местах кода. Такое у меня раньше случалось при ошибке в использовании динамических массивов в Delphi. Выходило, что компилятор выполнял ошибочное действие, а ошибку выдавал в совершенно другом месте.
В Lazarus всплывает окно Ассемблера с указанием адреса памяти, по которому произошла ошибка. Но Ассемблером пользоваться я не умею. Уже крыша едет, нужна помощь в отыскании ошибки. Код программы прилагаю - https://yadi.sk/d/U1HJzhzfuL9Ek
Lazarus 1.6/ Linux Mint Rosa. При компиляции в Windows7 происходит та же история.