Tietääkö joku, eikö pascal-kielisessä ohjelmassa tosiaankaan CASEn arvo voi olla tekstiä? Siis näin:
CASE muuttuja OF
'teksti': toiminto;
'toinenteksti': toiminto2;
jne. kun muuttuja on esitelty string-tyyppiseksi.
Herjaa vaan, että ordinal expression expected.
Että tietäsköhän joku näin vanhanaikasia juttuja... :)
CASE muuttuja OF
'teksti': toiminto;
'toinenteksti': toiminto2;
jne. kun muuttuja on esitelty string-tyyppiseksi.
Herjaa vaan, että ordinal expression expected.
Että tietäsköhän joku näin vanhanaikasia juttuja... :)
Vastaukset 5
Vanhimmat
valitettavasti.
Eikä se ole vanhanaikaista :)
Kiitos tiedosta! Minä vaan luulin, ettei kukaan muu harrasta enää pascalia kuin minä... :)
Olen ohjelmoinut pascalilla ja object pascalilla työkseni ties kuinka kauan. Aloitin Turbo Pascal 4:llä vuonna 1989, mutta nykyään sen nimi vain on yleensä Delphi... ;) Delphillä on tehty YLLÄTTÄVÄN tunnettuja sovelluksia, mitä monikaan ei tiedä. Väitän, että se on edelleen kovin RAD-työkalu ja viiden parhaan välineen joukossa lähes projektiin kuin projektiin, RADia tai ei. On se niin uskomaton vehje. Sama värkki käy huippusimppeliin Visual Basic -tyyliseen sekoiluun kuin alusta asti koodaamiseenkin. Monet mukamas-jotain-tietävät kummastelevat, kun kuulevat, että sillä on jotain tekemistä pascal-kielen kanssa. Kun sitä käytettiin jo silloin-ja-silloin, ja oli kamalaa, kun joutui opettelemaan, ja se tekun opettajakin oli kamala, ja oli nälkävuodet ja syötiin pettuleipää, ja kouluun oli matkaa 20 kilometria ja piti hiihtää rikkinäisillä suksilla. LOL
Anyway, Case-lauseeseen "switcheiksi" ei käy merkkijonot, vaan avaimien pitää olla sellaista tietotyyppiä, jolla on joku tolkullinen arvoalue. Idea on, että kääntäjä voi tehdä case-lauseesta vaikka lookup-taulukon, jonka mukaan hypätään sopivaan käsittelijään. Merkkijonoilla tämä ei onnistu, koska merkkijonoja voi olla erilaisia (lähes) äärettömästi.
Jos haluat välttää kauheaa läjää peräkkäisiä if-then-else-if-then-else-if-then-else -käsittelyjä, voithan laittaa merkkijonot vaikka hash-tauluun, jolla kuvaat stringit vaikka kokonaisluvuiksi, joista taas saat tehtyä kivan case-lauseen. Tai sitten teet käsittelijöille funktiot ja tälläät hashiin funktionpointterit... ;) hah hah... no joo, todennäköisesti sulla on niitä stringejä kuitenkin vähemmän kuin tuhansia, eikä tämä ole sovelluksesi kriittisin kohta. :D
Käytännössä: if-lauseita vaan peräkkäin ja sillä siisti.
Testi
Suoraan ei voi, mutta...
(Ikävä kyllä Suomi24:n forumi muokkaa lähdekoodin typerän näköiseksi poistamalla välilyönneillä tehdyt sisennykset... koeta kestää!)
uses
Dialogs;
// ... muuta koodia ...
procedure Kokeilu;
const
EmptyChB = 0; // voit kokeilla myös 32, 127, tai 255...
EC = char(EmptyChB);
EmptyChars = EC EC EC EC;
_Mika = ord('M') ord('i') shl 8 ord('k') shl 16 ord('a') shl 24;
_Moi = ord('M') ord('o') shl 8 ord('i') shl 16 EmptyChB shl 24;
_Ok = ord('O') ord('k') shl 8 EmptyChB shl 16 EmptyChB shl 24;
type
Str4 = String[4];
TMultiSt = packed record
case byte of
0 : (
Filler1 : Array[0..2] of byte; // 3 bytes
S4 : Str4; // 1 4 = 5 bytes
);
1 : (
Filler2 : LongWord;
LW : LongWord;
);
end;
var
St1 : String;
MultiSt : TMultiSt;
begin
//
St1 := InputBox('Kokeilepa "Mika", "Ok" tai "Moi" (ilman lainausmerkkejä)', 'Syötä sana: ', '');
MultiSt.S4 := copy(St1 EmptyChars, 1, 4);
case MultiSt.LW of
_Mika : begin
ShowMessage('Mika');
end;
_Moi : begin
ShowMessage('Moi');
end;
_Ok : begin
ShowMessage('Ok');
end;
else begin
ShowMessage('Jotakin muuta!');
end;
end;
end;