2015-03-03 3 views
1

У меня в настоящее время несколько проблем с нарушениями доступа в программе, которую я создаю для своего курса программирования. Он строится на языке pascal (язык, используемый курсом) и использует Lazarus IDE (аналогично Delphi, но открыт).Как избежать ошибок SIGSEGV на компиляторе FPC?

Насколько я знаю, нарушения доступа или ошибки SIGSEGV возникают при попытке использовать или адресовать недопустимую ячейку памяти. Я пробовал многие из них, особенно когда я не объявлял длину динамических массивов.

Теперь кажется, что у меня эта проблема со струнами. (Или, может быть, я могу использовать многомерные массивы).

я вставить только процедуру, где SIGSEGV указывает, но контекст:

У меня есть массив целых чисел и многомерный массив, содержащий это силовой агрегат (subconjuntos), функция где ошибка тулбар (как описано ниже) используется для печати этой мощности установлен в TextBox (индексируется местного):

procedure writeSub(local: TEdit); 
var 
    i, j: integer; 
begin 
for i:= 0 to High(subconjuntos)+1 do 
    if Length(subconjuntos[i])>1 then 
    begin 
    local.Text:=local.Text+'['; 
    for j:=0 to High(subconjuntos[i])+1 do local.Text:=local.Text+'('+IntToStr(subconjuntos[i][j])+') '; 
    local.Text:=local.Text+'] '; 
    end 
    else local.Text:=local.Text+'['+IntToStr(subconjuntos[i][0])+'] '; {this is where I'm having the SIGSEG, the program wont compile if I don't reference it without the double brackets} 
end; 

Любые идеи, почему это бросает SIGSEGV-х?

+0

Я удалил тег Delphi, потому что этот вопрос не применим к Delphi. Delphi не бросает SIGSEGV, не использует FPC и поэтому не имеет никакого отношения к этой проблеме. Также не обязательно включать информацию о тегах в заголовок вопроса; система тегов работает здесь очень хорошо, чтобы классифицировать вопросы и получать их людям, знакомым с этими тегами. –

ответ

3

Динамические массивы имеют действительные индексы в диапазоне low(arr) до high(arr) включительно. И low(arr) всегда равен нулю для динамического массива. Вы пытаетесь получить доступ к элементу с индексом high(arr)+1. Это не конец массива и, безусловно, ошибка.

Где Вы писали

for i:= 0 to High(subconjuntos)+1 do 

должно быть

for i:= 0 to High(subconjuntos) do 

или

for i:= Low(subconjuntos) to High(subconjuntos) do 

и также для другого цикла.

Кроме того, subconjuntos[i][0] - это заграничный доступ, если Length(subconjuntos[i]) равен нулю.

Если вы включите проверку диапазона в параметрах компилятора, тогда компилятор испустит код для проверки правильности доступа к каждому массиву. Это приведет к более быстрым ошибкам.

+0

Спасибо за терпение Дэвида. Ты заставил меня многому научиться. Теперь он работает. Я использовал subconjuntos [i] [low (subconjuntos [i])], и он работал отлично. –

+0

Ну, если 'subconjuntos [i]' is 'nil', то у него нет элементов, и поэтому' subconjuntos [i] [...] 'будет ошибкой, что бы вы не указали внутри внутренних индексов массива. Поэтому вам нужно убедиться, что 'subconjuntos [i]' не 'nil'. Кроме того, короткой рукой является запись 'arr [i, j]' вместо 'arr [i] [j]'. –

+0

Не знал, что FPC имеет обозначение arr [i, j]. Спасибо за новую информацию. –

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