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

189

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

      En vaan osaa kohdata sinua ja olla normaali. En tiedä mikä vaivaa. Samaan aikaan tekee mieli tulla lähelle ja kuitenkin
      Ikävä
      57
      8847
    2. Mietin aina vain

      Minä niin haluaisin nähdä sinut. Ei tuo yhden ainoan kuvan katsominen paljon helpota... Miksi sinä et voisi olla se roh
      Tunteet
      12
      3479
    3. Hetken jo luulin, että en ikävöi sinua koko aikaa

      Mutta nyt on sitten taas ihan hirveä ikävä jotenkin. Tiedätköhän sinä edes, kuinka peruuttamattomasti minä olen sinuun r
      Ikävä
      26
      2690
    4. Kysely lieksan miehille

      Olemme tässä pohtineet tällaista asiaa, että miten on. Tästä nyt on paljon ollut juttua julkisuudessakin aina sanomaleht
      Lieksa
      80
      2070
    5. Palstan henkisesti sairaat ja lihavat

      Täällä on sairaita, työttömiä ihmisiä kirjoittelemassa joilla ei ole tarkoituksena kuin satuttaa ihmisiä. Jos eksyt pals
      Ikävä
      114
      2040
    6. Outoa että Trump ekana sanoutui irti ilmastosopimuksesta

      kun Kaliforniaa riepottelee siitä johtuvat tuhoisat maastopalot. Hirmumyrskytkin ovat USA:ssa olleet tuhoisia.
      Maailman menoa
      357
      1757
    7. Saan kengurakkaan kotiin viikon päästä

      Mitä tapahtui? Martina hehkutti tätä stoorissaan reilu viikko sitten, mutta eipä aussimiestä Suomessa näkynyt, vaan tapa
      Kotimaiset julkkisjuorut
      241
      1442
    8. FinFamin ryhmät

      Älkää hyvät ihmiset luottako tähän tahoon. Ryhmiä on, mutta eivät ne toimi. Ihmisiä savustetaan ulos, vaikka näissä piir
      Salo
      0
      1221
    9. Olen vähän

      Hysteerinen se on totta. Etkai ymmärrä miten syvästi tunnen sinua kohtaan. Ja olet aina lähelläni. Olet osa jo jotain. I
      Ikävä
      10
      1095
    10. Osmo Peltola voitti ansaitusti Kultaisen Venlan - Kirvoitti yleisöltä mahtavan reaktion!

      JEE, onnea Osmo! Osmo Peltola voitti Vuoden esiintyjän Kultainen Venla -palkinnon. Isä-Peltsin ja Osmon luontoseikkailu
      Suomalaiset julkkikset
      68
      1060
    Aihe