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

359

    Vastaukset 9

    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. Ampuminen kylpylässä

      Onko vornasen timbe käynyt hiukan kylpemässä vai mikä tämä ampumatapaus on kylpylässä? Tuntuu aika villi meno olevan naa
      Naantali
      79
      1877
    2. Kemijärvellä vesionnettomuus

      Pitkänsillan ja taiteilijanniemen välillä nähty henkilön painuvan veden alle. Mitä on tapahtunut? Onko vesihiisi taas as
      Kemijärvi
      34
      1202
    3. Hei, voitko kuunnella

      Voisitko auttaa minua selvittämään asioita? En halua ajaa sinua hulluuteen kanssani, en sitoa sinua, en esittää vaatimu
      Ikävä
      134
      954
    4. Joku porukka lähtenyt täältä

      Ihmeen hiljainen on palsta nyt. Yleensä tänne tulvii aloituksia yms, mutta nyt on kyllä erikoisen hiljaista.
      Ikävä
      200
      879
    5. 85
      723
    6. Miten yrität

      Vielä saada kaivattusi?
      Ikävä
      65
      710
    7. Olipa yllätys

      Kuten hyvin moni tiesi/arvasi että valetta alusta loppuun toi *olemme ystäviä* satu. Instassaan käsi kädessä kuva kertoo
      Kotimaiset julkkisjuorut
      210
      674
    8. Tuletko tänään

      Jos soitan? Niin... tuletko?🖤
      Ikävä
      67
      637
    9. On todella ikävää

      Todella ikävää, että asiat ovat menneet tällaisiksi. Tämä ei ollut missään vaiheessa tarkoitukseni. Olen tehnyt virheit
      Ikävä
      79
      618
    10. Muutto auto hakee sut tänään!

      Tein sulle oman huoneen! mieheltä naiselle
      Ikävä
      64
      574
    11. Kiinni jäit

      Ei olisi uskonut sinusta
      Ikävä
      35
      571
    12. Se kun olit pitkästä aikaa silmieni edessä

      Oli kyllä sykähdyttävää. Tiedätkö, mikä laittaa minut ikävöimään sinua? Kun palautan mieleeni valtavan ihanan olemuksen,
      Ikävä
      32
      548
    13. Ottanet yhteyttä

      Facebookissa,jos on jotain asiaa.Miehelle! T.M-nainen.
      Ikävä
      55
      517
    14. 36
      514
    15. Oletteko koskaan torjuneet kaivattuanne?

      Minä olen, kun en silloin tajunnut vielä ihastuneeni. Yritin paikata tapahtunutta, mutta ei onnistunut enää.
      Ikävä
      25
      457
    16. Kai sä mies ymmärrät..

      ..ettet jättänyt vaihtoahtoa. Tottakai toivon vielä, että pystyisit toimimaan niin että asiat korjaantuisivat. Vahvast
      Ikävä
      28
      442
    17. En tiedä mitä sanoa

      Siksi en vastannut😔
      Ikävä
      33
      423
    18. Jos kaivattusi olisi

      Vieressäsi niin mitä tekisit?
      Ikävä
      40
      417
    19. Hämmentävä hetki: TTK:sta pudonnut Johanna Puhakka lataa pettyneenä: "Sitä ei voi kieltää"

      Johanna Puhakka ja Jurijs Jurza Trosenko tippuivat Tanssii Tähtien Kanssa -kisasta. Suositussa viihdeohjelmassa nähtiin
      Tanssii tähtien kanssa
      12
      408
    20. Päivän galluppi

      Minkälainen ehkäisy sinkkupalstalaisilla käytössä?
      Sinkut
      82
      408
    Aihe