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.
Taulukon reversointi Delphissä
9
324
Vastaukset
- 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
Hallitus pyrkii rajoittamaan kaupan omien halpamerkkien myyntiä
Helsingin Sanomien mukaan hallitus valmistelee lakihanketta, joka suitsii kaupan valtaa ja rajoittaa omien halpamerkkien2503801- 603681
Björn Wahlroos, maataloustuet lakkautettava
Sanoo pankkimies. Mitäs persut ja muut tukinulliem perskärpäset tähän? "Wahlroos listaa kansallisen maataloustuen. – I1093017Persut päättivät hiilivoiman kieltämisestä Suomessa
Moni on jo unohanut kuka hyväksyi hiilivoimaloiden kieltämisen Suomessa: persut Sukupuolineutraalit liikennemerkitk572728Työvoimatoimisto
Nyt kysyisin miksi pitää käydä työvoimatoimistossa paikanpäällä, kun he eivät muuta tee kuin laittavat koneelle uudet ve1252549Nalle Wahlroos ei ulise kuten Teemu Selänne sähkölaskuista
Nalle "hah hah" nauroi saamistaan sähkötuista, kun taas Teemu-poika itkeä tirautti kovasta sähkön hinnasta. Nalle nauro352122Muistattekos kuinka kokoomus ja persut vinkuivat sähkön hinnasta?
Oppositiossa vuonna 2022, kun sähkön hinta uhkasi nousta 20 senttiin kilowattitunnilta? Nyt ovat hiiren hiljaa, kun pitä1012051Vain persut vastustivat hiilivoimaloiden alasajoa
Persut vastusti jyrkästi hiilen kieltolakia ja on myöhemmin vaatinut hiilivoimaloiden pitämistä käytössä. He perusteliva441911Mikä aate kaiken pahan takana?
Se laiskistuttaa kansat, opettaa vaatimaan etuisuuksia, syleilee maailmoja eikä omaa kansaa.1231891Mietin sua liikaa
Mietin nytkin sitä, että millaista se olisi tulla kotiin, kun sinä olisit täällä vastassa. Tai niin päin, että sinä tuli711229