2016-06-04 5 views
0

Следующий код использует игру, сохраненный в текстовом файле в виде 0/8B1/8B1/8B1/1P6B1/1P8/7S2/7S2/1AAAAA1S2/5DDD2Паскаль Линкоры Loadgame

(например) и помещает правильные детали в доске. Цифры представляют собой серию последовательных пробелов, а/- новую строку. Буквы представляют судно в этой ячейке платы (двухмерный массив).

Когда я запускаю его он пришел вир с ВНЕШНЕГО SIGSEGV и показывает мне код сборки говоря 00403D61 833a00 CmpL $ 0x0, (% EDX)

Кто-нибудь знает, что случилось с ним, и как это исправить?

Procedure LoadGame(FileName : String; Var Board : TBoard); 
Var 
    Line : String; 
    CurrentFile : Text; 
    Row , count : Integer; 
    column, counter: Integer; 
Begin 
    AssignFile(CurrentFile, FileName); 
    Reset(CurrentFile); 
    Readln(CurrentFile, Line); 
    for counter := 1 to length(line) do 
    begin 
    if (Line[counter] in ['A'..'Z','m','h']) then 
    begin 
     board[row,column]:=line[counter]; 
     column:=column+1; 
    end 
    else 
     if line[counter]='0' then 
     begin 
     for column := 0 to 9 do 
     begin 
      board[row,column]:='-'; 
     end; 
     end 
     else 
     If line[counter]='/' then 
     begin 
      row :=row+1; 
      column:=0; 
     end 
     else 
      for count := 0 to (strtoint(line[counter])-1) do 
      begin 
      Board[row,column+count] :='-'; 
      column:=column+1; 
      end; 
    end; 
    CloseFile(CurrentFile); 
End;       
+0

Вы должны быть более точными с переменными 'row' и' column', которые изменяются хаотичными способами (для первого взгляда) внутри основного цикла. – Abelisto

+2

Переполнение стека не является заменой для отладки –

+0

Но есть и другие форумы, которые могут помочь с отладкой на StackExchange. Я не уверен на 100%, но думаю, что http://codereview.stackexchange.com/ может быть правильным выбором. –

ответ

1

Вы не инициализируются переменные row и column, прежде чем использовать их. Вы должны это сделать, потому что поскольку они являются локальными переменными (в стеке), они будут содержать случайные значения при вызове LoadGame. См. Изменения/предложения ниже. Я не отлаживал ваш код, это для вас.

Procedure LoadGame(FileName : String; Var Board : TBoard); 
Var 
    Line : String; 
    CurrentFile : Text; 
    Row , count : Integer; 
    column, counter: Integer; 
Begin 
    // Ideally, you should initialise each cell of the board with some value not used in the following so you can easily verify the effect of the loading operation 

    AssignFile(CurrentFile, FileName); 
    Reset(CurrentFile); 
    Readln(CurrentFile, Line); 

    // initialise Row and Column 
    Row := 0;  // assuming the cells are zero-based 
    Column := 0; // ditto 

    for counter := 1 to length(line) do 
    begin 
     if (Line[counter] in ['A'..'Z','m','h']) then 
     begin 
     board[row,column]:=line[counter]; 
     column:=column+1; 
     end 
     else 
     if line[counter]='0' then 
     begin 
     for column := 0 to 9 do 
      begin 
      board[row,column]:='-'; 
      end; 
     end 
     else If line[counter]='/' then 
     begin 
     row :=row+1; 
     column:=0; 
     end 

     else for count := 0 to (strtoint(line[counter])-1) do 
     begin 
     Board[row,column+count] :='-'; 
     column:=column+1; 
     end; 
    end; 

    CloseFile(CurrentFile); 
End;