2016-03-11 8 views
0

Я работаю над приложением пользовательского интерфейса Question/Answer в Паскале/Лазаресе. Моя проблема заключается в том, что при вызове ниже кода с помощью нажатия кнопки программа вылетает с ошибкой Segmentation Fault.Pascal Segmentation Fault parsing Текстовый файл

// more declarations... (UI Form, Buttons, ...) 

type 
    TQuestion = class(TObject) 
    title: string; 
    answers: array of string; 
    correct: integer; 
    end; 

var 
    questions: array of TQuestion; 

procedure TForm1.BStartClick(Sender: TObject); 
var 
    i: integer; 
    j: integer; 
    line: string; 
    arrayLength: integer; 
    question: TQuestion; 
    stringList: TStringList; 
begin 
    stringList := TStringList.create; 
    stringList.LoadFromFile('questions.txt'); 

    for i := 0 to stringList.Count - 1 do ; 
    begin 
    line := stringList[i]; 
    if (length(line) >= 2) then 
     if (line[2] = ' ') and ((line[1] = '-') or (line[1] = '+')) then 
     begin 
     arrayLength := length(question.answers); 
     SetLength(question.answers, arrayLength + 1); 
     question.answers[arrayLength] := 
      Copy(line, 2, Length(line) - 1); 

     if zeile[1] = '+' then 
      question.correct := arrayLength; 
     end 
     else 
     begin 
     question := TQuestion.Create; 
     question.title := line; 

     arrayLength := length(questions); 
     setLength(questions, arrayLength + 1); 
     questions[arrayLength] := question; 
     end; 
    end; 
    BStart.Visible := False; 
end; 
+0

Я вижу, что на это был дан ответ, но в следующий раз проверьте, что произойдет, если вы включите всю проверку диапазона и переполнения. –

+0

@MarcovandeVoort попробует это в следующий раз. Я не привык к такому древнему языку программирования, который даже не может предупредить меня о дополнительной точке с запятой. – Clashsoft

+0

Логические ошибки никогда не будут найдены. И последний FPC с этого года. –

ответ

1

Ну, мое знание Паскаля идет от 10 до 15 лет назад. Тем не менее, я вижу, что у вас есть дополнительная точка с запятой в конце этой строки:

for i := 0 to stringList.Count - 1 do ; 
+0

Я понял это после того, как я разместил вопрос ... спасибо в любом случае. Я думаю, segfault происходит от доступа к неинициализированной переменной 'i'. – Clashsoft

+0

Нет, это связано с доступом к строчному списку с 'i', который находится за пределами границ. –

+0

Итак, проверьте приведенную ниже ссылку: http://lazarus-ccr.sourceforge.net/docs/rtl/classes/tstrings.html Он показывает суперкласс строкового списка. Есть много общественных вещей, которые вы можете применить. – Ehsan

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

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