Operacje na tablicach dynamicznych - błąd "ExitCode 201"

0

Witam.Wyskakuje mi błąd SIGSEGV i nie wiem jak się go pozbyć czy mógłby mi ktoś z tym pomóc.Z góry dziękuje za wszelką pomoc:

Program Z1;
Uses crt;
Type
  vec=array of char;
Var
  A,B:vec;
  i,n,e,j,l,m:byte;
  temp:char;
  x:string;

Procedure Wczytaj(AA:vec;xx:string;nn,ee:byte);
Begin
   Repeat
    Writeln('Podaj ile liter ma wczytac:');
    Readln(xx);
    val(xx,nn,ee);
   Until(ee=0);
   SetLength(AA,nn);
   Clrscr;
   Writeln('Elementy nieposortowane');
    For i:=0 to nn-1 do
     Begin
       AA[i]:=(Chr(Random(26)+97));
       Write(AA[i],' ');
     End;
End;

Procedure Sortowanie(var AA:vec;nn,jj,ll,mm:byte;temp1:char);
 Begin
 ll:=nn-1;
 mm:=ll-1;
 For i:=0 to m do
  For jj:=i+1 to l do
   If AA[j]<AA[i] then
   Begin
    temp:=AA[i];
    AA[i]:=AA[jj];
    AA[jj]:=temp;
   End;
 End;

Procedure Wyswietl(AA:vec;nn:byte);
Begin
Writeln;
Writeln('Elementy posortowane');
For i:=0 to nn-1 do
Write(AA[i],' ');{w tym miejscu wyskakuje błąd}
End;

BEGIN
Wczytaj(A,x,n,e);
Sortowanie(A,n,j,l,m,temp);
Wyswietl(A,n);
Readln;
END.

dodanie znacznika <code class="delphi"> - fp

1

Lekcja na dziś: uczymy się deklarować tablice w pascalu. To:

vec=array of char;

Nie jest wcale magiczna tablica która ma nieograniczoną liczbę elementów. To jest tablica która ma ich całe 0. Próba pisania do tej tablicy skończy się segfaultem.

0

Ale przecież tworze tablicę dynamiczną,którą potem przypisuje do zmiennych A,B. I w prcedurze wczytaj podaje długość tablicy i potem losuje jej elementy i to wszystko działa czyli tablica też działa,potem jest procedura sortowania i wyświetlania i ta ostatnia mi nie działa.Program się uruchomi wyświetla instrukcje i elementy nieposortowane i wyświetla też nagłówek elementy posortowane ale już ich samch nie właśnie wtedy wyskakuje błąd.

0

W funkcji Wczytaj przekazujesz argument AA przez wartość, a nie tak jak w pozostałych przez referencję, więc ustalenie jej romiaru odbywa się na kopii tej tablicy i nie jest widoczne poza ciałem tej funkcji; Musisz dodać magiczne słówko Var przed parametrem AA, a wszystkie zmiany będą widoczne w pozostałej części programu;

Masz testowy kod:

program Project1;

{$mode objfpc}{$H+}

type
  TVec = array of Char;

  procedure Init(AVec: TVec; ASize: UInt32);
  begin
    SetLength(AVec, ASize);
    FillChar(AVec[0], ASize, 65);
  end;

var
  vecFoo: TVec;
begin
  Init(vecFoo, 5);
  Write(Length(vecFoo));
  ReadLn;
end.

Wynik - 0! A przy kompilacji wyskakuje komunikat:

project1.lpr(17,14) Warning: Variable "vecFoo" does not seem to be initialized
który mówi wszystko za siebie - zmienna vecFoo nie została zainicjowana (czyli wszelkie modyfikacje w procedurze Init dokonane zostały lokalnie); Jeśli przekaże się argument AVec przez referencję:

procedure Init(var AVec: TVec; ASize: UInt32);

wynikiem działania programu będzie wyświetlenie na ekranie cyfry 5.

0

Dziękuje.Teraz powinnienem już sobie poradzić.

1 użytkowników online, w tym zalogowanych: 0, gości: 1