Tekstiä pascalin casessa

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... :)
5204
Äänestä

Muut lukivat myös

Vastaukset 5

Vanhimmat

valitettavasti.
Eikä se ole vanhanaikaista :)

Äänestä
  • Kiitos tiedosta! Minä vaan luulin, ettei kukaan muu harrasta enää pascalia kuin minä... :)

    Äänestä

  • ihmettelijä kirjoitti:

    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.

    Äänestä

  • erkkimerkki kirjoitti:

    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

    Äänestä

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;

Äänestä

Kommentoi aloitusta


ihmettelijä kirjoitti:

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

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu