Taulukon reversointi Delphissä

Anonyymi

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.

9

181

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • Anonyymi

      Tätäkö hait?

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

    • Anonyymi

      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...

      • Anonyymi

        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.


    • Anonyymi

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

    • Anonyymi

      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...?

      • Anonyymi

        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;


      • Anonyymi

        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.


      • Anonyymi
        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!


    • Anonyymi

      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!

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

    Luetuimmat keskustelut

    1. Kiitos nainen

      Kuitenkin. Olet sitten ajanmerkkinä. Tuskin enää sinua näen ja huomasitko, että olit siinä viimeisen kerran samassa paik
      Tunteet
      18
      5293
    2. MTV: Kirkossa saarnan pitänyt Jyrki 69 koki yllätyksen - Paljastaa: "Se mikä oli hyvin erikoista..."

      Jyrki Linnankivi alias Jyrki 69 on rokkari ja kirkonmies. Teologiaa opiskeleva Linnankivi piti elämänsä ensimmäisen saar
      Maailman menoa
      116
      2750
    3. Tykkään sinusta ikuisesti

      Olet niin mukava ja ihana ihminen rakas. ❤️
      Ikävä
      10
      2294
    4. Hyväksytkö sinä sen että päättäjämme ei rakenna rauhaa Venäjän kanssa?

      Vielä kun sota ehkäpä voitaisiin välttää rauhanponnisteluilla niin millä verukkeella voidaan sanoa että on hyvä asia kun
      Maailman menoa
      589
      2025
    5. Kirjoita yhdellä sanalla

      Joku meihin liittyvä asia, mitä muut ei tiedä. Sen jälkeen laitan sulle wappiviestin
      Ikävä
      123
      1746
    6. Olet hyvin erilainen

      Herkempi, ajattelevaisempi. Toisaalta taas hyvin varma siitä mitä haluat. Et anna yhtään periksi. Osaat myös ilkeillä ja
      Ikävä
      70
      1342
    7. Yksi syy nainen miksi sinusta pidän

      on se, että tykkään luomusta. Olet luonnollinen, ihana ja kaunis. Ja luonne, no, en ole tavannut vielä sellaista, joka s
      Ikävä
      41
      1319
    8. Paljastavat kuvat Selviytyjät Suomi kulisseista - 1 päivä vs 36 päivää viidakossa - Katso tästä!

      Ohhoh! Yli kuukausi viidakossa voi muuttaa ulkonäköä perusarkeen aika rajusti. Kuka mielestäsi muuttui eniten: Mia Mill
      Suomalaiset julkkikset
      3
      1088
    9. Veda uskonto vs. muut uskonnot

      Mitenkähän tuo Veda(Krisha)uskonto loppujen lopuksi eroaa muista niin sanotuista ilmoitus uskonnoista? Siinäkin vedotaan
      Ateismi
      390
      1054
    10. Hyvää Joulua mies!

      Toivottavasti kaikki on hyvin siellä. Anteeksi että olen hieman lisännyt taakkaasi ymmärtämättä kunnolla tilannettasi, o
      Ikävä
      64
      1047
    Aihe