2015-11-28 5 views
0

У меня возникла проблема в моем проекте Lazarus: каждый раз, когда я хочу использовать функцию, она выдает указанную выше ошибку (External: SIGSEGV). Я не знаю, что это значит, но некоторые отладки показала мне, что это код, вызывает ошибку:Ошибка Lazarus "External: SIGSEGV" при переменном приращении?

class function TUtils.AsStringArray(const Strs:TStrings): TStringArray; 
var 
    s:string; 
    i:integer; 
begin 
    SetLength(Result, Strs.Count); 
    i := 1; 
    for s in Strs do 
    begin 
    Result[i] := s; 
    i := i + 1; 
    end; 
end; 

И определение

TStringArray = array of string; 

TUtils = class 
    public 
    [...] 
    class function AsStringArray(const Strs:TStrings): TStringArray; static; 
end; 

Исключение происходит после i := i + 1;. Я был бы очень благодарен, если бы вы могли мне помочь!

ответ

3

Динамические массивы, такие как TStringArray = array of string;, основаны на нуле; ваш код использует его как 1-based и повышает нарушение прав доступа.

Вы должны заменить i := 1; на i := 0;

+0

Он установил предыдущую ошибку, но он либо показал еще один или создал новый. Ассемблер показывает эту команду: '00407189 8b12 mov (% edx),% edx' –

0

Ко второй проблемы, это происходит потому, что вы экранные с индексом I, которым на старте это 1, поэтому у вас есть проблема, диапазон массива определяется длиной «1», поэтому, если ваша длина равна 1, то ваш диапазон равен 0. Поэтому, чтобы решить проблему в вашем цикле for, вы должны поставить Result[i-1] := s;, как это, вы получаете индекс, который вы действительно хотите.

Подробнее об этом на http://wiki.freepascal.org/Dynamic_array

 Смежные вопросы

  • Нет связанных вопросов^_^