2014-01-28 3 views
0

это моя программа, сообщения о компиляторе отсутствуют, но во время выполнения она выходит, может ли кто-нибудь мне помочь? Что кажется неправильным? Проблема началась после того, как я создал файл t, поэтому, возможно, там есть что-то, чего я не вижу. Заранее спасибо. Свернуть | Скопировать кодexitcode = 216 в моей программе без компиляции сообщений

program MyProgr; 

var 
    F: text; 
    t: Textfile; 
    a, count: array of Integer; 
    b: Integer; 
    i, int: Integer; 
    countnums: Integer; 
    n, m: String; 
    lin, nums: Integer; 
    Small, Big: Integer; 

procedure DoWhatEver(S: string); 
begin 
    val(S, int); 
    Write(S, '  '); 
    for i := Small to Big do 
    if (a[i] = int) then 
     count[i] := count[i] + 1; 
end; 

procedure FilltheArray; 
begin 
    for i := Small to Big do 
    a[i] := i + 1; 
end; 

procedure ProcessString; 
var 
    Strng, S: string; 
    Last, P: Integer; 
begin 
    readln(F, Strng); 
    Last := 0; 
    while Last < length(Strng) do 
    begin 
    P := Last + 1; 
    while (P <= length(Strng)) and (Strng[P] <> ' ') do 
     inc(P); 
    S := copy(Strng, Last + 1, (P - Last - 1)); 
    DoWhatEver(S); 
    Last := P; 
    end 
end; 

procedure ProcessStringA; 
var 
    Strng: string; 
    Last, P: Integer; 
begin 
    readln(F, Strng); 
    Last := 0; 
    while Last < length(Strng) do 
    begin 
    P := Last + 1; 
    while (P <= length(Strng)) and (Strng[P] <> ' ') do 
     inc(P); 
    n := copy(Strng, Last + 1, (P - Last - 1)); 
    val(n, nums); 
    Last := P; 
    end 
end; 

procedure ProcessStringB; 
var 
    Strng: string; 
    Last, P: Integer; 
begin 
    readln(F, Strng); 
    Last := 0; 
    while Last < length(Strng) do 
    begin 
    P := Last + 1; 
    while (P <= length(Strng)) and (Strng[P] <> ' ') do 
     inc(P); 
    m := copy(Strng, Last + 1, (P - Last - 1)); 
    val(m, lin); 
    Last := P; 
    end 
end; 

begin 
    assign(F, 'myfile.txt'); 
    reset(F); 
    ProcessStringA; 
    Writeln(nums); 
    ProcessStringB; 
    Writeln(lin); 
    setlength(a, nums); 
    Small := Low(a); 
    Big := High(a); 
    for i := Small to Big do 
    count[i] := 0; 
    FilltheArray; 
    while not eof(F) do 
    ProcessString; 

    for i := Small to Big do 
    begin 
    if count[i] = 2 then 
     countnums := countnums + 1; 
    end; 
    Close(F); 
    assign(t, 'fileout.txt'); 
    Rewrite(t); 
    Writeln(t, countnums); 
    Close(t); 

end. 
+0

Что вы изменили, чтобы «создать файл»? –

+0

Мне пришлось распечатать результаты, что означает число. из переменных, которые появляются меньше, чем один раз в тексте, который программа читает, в него, поэтому я не могу этого избежать. Не так ли? –

+1

Нам нужен [Минимальный, полный, компилируемый пример] (http://stackoverflow.com/help/mcve). Какие строки в вашем примере вы изменили, чтобы «создать файл»? –

ответ

1

Проблема заключается в том, что вы объявили две динамические массивы (count и a).

a, count: array of Integer; 

Ни один из них не имеет выделенной памяти в этой точке.

Вы затем выделить память для a, и получить низкие и высокие показатели для a:

setlength(a, nums); 
Small := Low(a); 
Big := High(a); 

Вы затем цикл через эти индексы в count массив, который не имеет выделенной памяти еще (вы назвали SetLength на a вместо этого):

for i := Small to Big do 
    count[i] := 0; 

доступ к памяти вы еще не выделено генерирует Runtime error 216, который является нарушение прав доступа (в Delphi, что приводит к возникновению EAccessViolation, если исключения включены) или общая ошибка защиты (в FreePascal).

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