Taulukon reversointi Delphissä

Hei!
Osaako kukaan neuvoa, miksi alla oleva proceduuri ei palauta oikein reversoitua taulukkoa seuraavassa koodin pätkässä? Proceduuri reversoi ok, mutta tulos ei välity proceduurin ulkopuolelle. Missä vika..?


//Delphi-Koodi alkaa:

var

Form1: TForm1;
procedure reversoi(strtaulu : array of string; max : integer);

implementation

{$R *.dfm}

procedure reversoi(strtaulu : array of string; max : integer);
var valitaulu : array of string;
var n, laskuri : integer;

begin
setlength(valitaulu, max);
laskuri := 0;

for n := max-1 downto 0 do
begin
valitaulu[laskuri] := strtaulu[n];
laskuri := laskuri 1;
end;

for n := 0 to max-1 do

begin
strtaulu[n] := valitaulu[n];
end;

end;



procedure TForm1.Button1Click(Sender: TObject);
var strtaulu : array of string;
var n, max : integer;

begin
max := 4;
setlength(strtaulu, max);

for n := 0 to max-1 do
begin
strtaulu[n] := inttostr(n);
Memo1.seltext := strtaulu[n] #13 #10;
end;

Memo1.seltext := #13 #10;

//-------------------------
reversoi(strtaulu, max);
//-------------------------
//Järjestys ei muuttunutkaan, missä vika?

for n := 0 to max-1 do
begin
Memo1.seltext := strtaulu[n] #13 #10;
end;

Memo1.seltext := #13 #10;

end;

end.

//Koodi päättyy.
9362
Äänestä

Muut lukivat myös

Vastaukset 9

Vanhimmat

Tätäkö hait?

for n := max-1 downto 0 do
begin
   Memo1.seltext := strtaulu[n] #13 #10;
end;

Äänestä

Nuo Memo-tulostukset oli havainnollistamisen vuoksi. Täsmälleen sama tulostus pitäisi tuottaa reversointi -Proceduren ajon jälkeen päinvastainen eli reversoitu järjestys. Procedure kyllä tekee hommansa, mutta taulukon muutos ei välity proceduurin ulkopuolelle takasin. Kutsussa välitetyn taulukon järjestyksen pitäisi muuttua päinvastaiseksi aliohjelman ajon jälkeen. Mutta ei muutu...

Äänestä
  • Joo, nyt tajusin, tätä sinä halusit:

    var
    Form1: TForm1;
    taulu: array [0..3] of string = ('1','2','3','4');

    implementation

    {$R *.lfm}

    procedure reversoi;
    var max, n: integer; temp: string;
    begin
    max := length(taulu) - 1;
    for n := 0 to max div 2 do
    begin
    temp := taulu[n];
    taulu[n] := taulu[max - n];
    taulu[max - n] := temp;
    end;
    end;

    { TForm1 }

    procedure TForm1.Button1Click(Sender: TObject);
    var n, max : integer;
    begin
    Memo1.Clear;
    reversoi;
    max := length(taulu) - 1;
    for n := 0 to max do Memo1.seltext := taulu[n] #13 #10;
    end;
    end.

    Äänestä

Onko sinulla jotain helppoa valmista ohjelmaa esitellä, tarvittaisiin ideoita.

Äänestä

Kiitos vaivannäöstä, mutta oikeasti tarkoitus on siis luoda dynaaminen taulukko, jonka sisältöä muokataan, aliohjelmalla. Ongelma on tässä siis, että aliohjelmasta ei saa palautettua muutettua taulukkoa. En ymmärrä, mikä tässä mättää, aikaisemmin tämä on onnistunut (Delphi 10.3), onko 10.4-versioon tullut muutoksia vai olenko vain missannut jotain. Tätä ei voine hoitaa funktiona, koska funktio ei voi palauttaa taulukkoa...?

Äänestä
  • Tässä luodaan taulukko (Array) mikäli elementtien määrä sitä edellyttää, muussa tapauksessa taulukon sisältöä käännellään edestakasin.

    type
    TStringArray = array of string;

    var
    Form1: TForm1;
    MyArray: TStringArray;

    implementation

    {$R *.lfm}

    function reversoi(taulu:TStringArray): TStringArray;
    var max, n: integer; temp: string;
    begin
    max:=length(taulu) - 1;
    for n:=0 to max div 2 do
    begin
    temp:=taulu[n]; taulu[n]:=taulu[max-n]; taulu[max-n]:=temp;
    end;
    result:=taulu;
    end;

    { TForm1 }

    procedure TForm1.Button1Click(Sender: TObject);
    var n, Count : integer;
    begin
    Memo1.Clear; Count := 6;
    if length(MyArray)<1 then
    BEGIN
    setLength(MyArray, Count);
    for n:=0 to Count-1 do MyArray[n]:=IntToStr(n);
    END;

    MyArray:=reversoi(MyArray); Memo1.seltext:=#13 #10;
    for n:=0 to length(MyArray)-1 do Memo1.seltext:=MyArray[n] #13 #10;
    end;

    Äänestä

  • Tässä on täysin sama esimerkki kuin yläpuolella, mutta tästä on otettu kaikki löysät pois, ja samalla meni luettavuuskin, mutta toimii yhtä hienosti.

    type TStringArray=array of string;var Form1:TForm1;
    MyArray: TStringArray; implementation {$R *.lfm}
    function reversoi(taulu:TStringArray): TStringArray;
    var max, n: integer; temp: string; begin max:=length(taulu) - 1;
    for n:=0 to max div 2 do begin temp:=taulu[n]; taulu[n]:=taulu[max-n];
    taulu[max-n]:=temp;end;result:=taulu;end;{ TForm1 }
    procedure TForm1.Button1Click(Sender: TObject);var n,Count:integer;begin
    Memo1.Clear; Count:=6; if length(MyArray)<1 then BEGIN
    setLength(MyArray,Count);for n:=0 to Count-1 do MyArray[n]:=IntToStr(n);
    END;MyArray:=reversoi(MyArray);Memo1.seltext:=#13 #10;
    for n:=0 to length(MyArray)-1 do Memo1.seltext:=MyArray[n] #13 #10;end;end.

    Äänestä

  • Anonyymi kirjoitti:

    Tässä on täysin sama esimerkki kuin yläpuolella, mutta tästä on otettu kaikki löysät pois, ja samalla meni luettavuuskin, mutta toimii yhtä hienosti.

    type TStringArray=array of string;var Form1:TForm1;
    MyArray: TStringArray; implementation {$R *.lfm}
    function reversoi(taulu:TStringArray): TStringArray;
    var max, n: integer; temp: string; begin max:=length(taulu) - 1;
    for n:=0 to max div 2 do begin temp:=taulu[n]; taulu[n]:=taulu[max-n];
    taulu[max-n]:=temp;end;result:=taulu;end;{ TForm1 }
    procedure TForm1.Button1Click(Sender: TObject);var n,Count:integer;begin
    Memo1.Clear; Count:=6; if length(MyArray)<1 then BEGIN
    setLength(MyArray,Count);for n:=0 to Count-1 do MyArray[n]:=IntToStr(n);
    END;MyArray:=reversoi(MyArray);Memo1.seltext:=#13 #10;
    for n:=0 to length(MyArray)-1 do Memo1.seltext:=MyArray[n] #13 #10;end;end.

    Toimii! Eli ratkaisu oli siis tuon TStringArray:n käyttö, jolloin funktiosta saattoi palauttaa muokatun taulukon. Kiitos!

    Äänestä

procedure reversoi(strtaulu : array of string; max : integer);

tyypillinen aloittelijan virhe.

JOS muutosten halutaan näkyvän tuon "procedure reversoi":n ulkopuolelle, oikein olisi:

procedure reversoi(var strtaulu : array of string; max : integer);

ilman tuota var -määritettä tuo "procedure reversoi" muokkaa srttaulu:n paikallista kopiota, joka lakkaa olemasta, kun procedure reversoi palaa kutsujalleen!

Äänestä

Ketjusta on poistettu 2 sääntöjenvastaista viestiä.

Kommentoi aloitusta


Anonyymi kirjoitti:

Hei!
Osaako kukaan neuvoa, miksi alla oleva proceduuri ei palauta oikein reversoitua taulukkoa seuraavassa koodin pätkässä? Proceduuri reversoi ok, mutta tulos ei välity proceduurin ulkopuolelle. Missä vika..?


//Delphi-Koodi alkaa:

var

Form1: TForm1;
procedure reversoi(strtaulu : array of string; max : integer);

implementation

{$R *.dfm}

procedure reversoi(strtaulu : array of string; max : integer);
var valitaulu : array of string;
var n, laskuri : integer;

begin
setlength(valitaulu, max);
laskuri := 0;

for n := max-1 downto 0 do
begin
valitaulu[laskuri] := strtaulu[n];
laskuri := laskuri 1;
end;

for n := 0 to max-1 do

begin
strtaulu[n] := valitaulu[n];
end;

end;



procedure TForm1.Button1Click(Sender: TObject);
var strtaulu : array of string;
var n, max : integer;

begin
max := 4;
setlength(strtaulu, max);

for n := 0 to max-1 do
begin
strtaulu[n] := inttostr(n);
Memo1.seltext := strtaulu[n] #13 #10;
end;

Memo1.seltext := #13 #10;

//-------------------------
reversoi(strtaulu, max);
//-------------------------
//Järjestys ei muuttunutkaan, missä vika?

for n := 0 to max-1 do
begin
Memo1.seltext := strtaulu[n] #13 #10;
end;

Memo1.seltext := #13 #10;

end;

end.

//Koodi päättyy.

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu