Delphi



  • Hallo Leute
    Ich bin ein grosser C++ Anhänger und muss nun mit Wiederwillen Delphi lernen!
    Ich bin allerdings auf zwei sehr interessannte Sprachkonstrukte gestossen:

    1. Stellt euch vor, ihr wollt wissen, ob der Inhalt eines einzelnen Chars ein Vokal ist oder nicht.

    In C++ kann man dies soviel ich weiss, ohne Funktion nur so machen:
    isVocal = c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u';

    In Delphi hat man sogenannte Mengen:
    isVocal := c in ['a','e','i','o','u'];

    Oder wer kennt nicht das Problem, dass man wissen muss, ob ein Wert zwischen zwei anderen Werten liegt:
    bResult = nbr > 0 && nbr < 100;

    Delphi:
    bResult := nbr in [0..100];

    2. Wer kennt denn nicht dieses Problem:
    D3DPRESENT_PARAMETERS d3dpp;
    d3dpp.BackBufferCount = 1;
    d3dpp.BackBufferWidth = 640;
    d3dpp.BackBufferHeight = 480;

    Delphi:
    d3dpp: D3DPRESENT_PARAMETERS;

    with d3dpp do begin
    BackBufferCount = 1;
    BackBufferWidth = 640;
    BackBufferHeight = 480;
    end;

    das könnte doch irgendwie so im neuen C++ Standard implementiert werden:
    with d3dpp{
    BackBufferCount = 1;
    BackBufferWidth = 640;
    BackBufferHeight = 480;
    }

    Was meint ihr dazu ?
    Gruss Ishildur



  • Ich glaub sowas ähnliches wie ganz unten hab ich mal in c++ gesehen, dort gab es aber kein with. Mir fällt aber nicht mehr ein wie des geht leider, denn ich wollte es vor kruzem auch wieder benutzen. Aber ich kann mich daran erinnern dass ich sowas gesehn habe.



  • Geht in C++ auch.

    Beim C++-Builder gibt es die Klasse "Set".
    Set<type,min,max>

    Beispiel:

    Set<int,0,17> A; // noch is nix drin
    
    A << 1 << 4 << 5 << 7; // A = { 1, 4, 5, 7}
    
    // mit Contains kann man, wie in Delphi mit in, prüfen ob ein Wert in dieser Menge
    // enthalten ist
    
    for(int i=0; i<=255; i++)
      if(A.Contains(i))
        ShowMessage("enthalten");
    

    Ich meine nicht, daß es das in dieser Form in Standard-C++ gibt.
    Hier kann man aber die Containerklassen "set" und "multiset" benutzen.
    Mit den Elementfunktionen insert, erase und find dann dementsprechend einfügen, löschen, suchen....



  • Original erstellt von aheim:
    **Geht in C++ auch.

    Beim C++-Builder gibt es die Klasse "Set".
    Set<type,min,max>

    Beispiel:

    Set<int,0,17> A; // noch is nix drin
    
    A << 1 << 4 << 5 << 7; // A = { 1, 4, 5, 7}
    
    // mit Contains kann man, wie in Delphi mit in, prüfen ob ein Wert in dieser Menge
    // enthalten ist
    
    for(int i=0; i<=255; i++)
      if(A.Contains(i))
        ShowMessage("enthalten");
    

    Ich meine nicht, daß es das in dieser Form in Standard-C++ gibt.
    Hier kann man aber die Containerklassen "set" und "multiset" benutzen.
    Mit den Elementfunktionen insert, erase und find dann dementsprechend einfügen, löschen, suchen....**

    das ist doch ein wenig wasserkopf lastig in vergleich zu

    isVocal := c in ['a','e','i','o','u'];
    

    das könnte doch irgendwie so im neuen C++ Standard implementiert werden:
    with d3dpp{
    BackBufferCount = 1;
    BackBufferWidth = 640;
    BackBufferHeight = 480;
    }

    http://www.cuj.com/reference/articles/2001/0104/0104d/0104d.htm?topic=reference



  • Set<char, 'a', 'z'> s;
    s << 'a' << 'e' << 'i' << 'o' << 'u';
    bool isVocal = s.Contains(c);
    

    oder auch gleich

    bool isVocal =(Set<char, 'a', 'u'>() << 'a' << 'e' << 'i' << 'u').Contains(c);
    

    Ist sie nicht schön, die VCL? 😉



  • @Dimah:

    // Example 1
    #include <stdio.h>
    

    Das ist aber nicht so schön. 😉



  • Hast du nicht gemerkt das Beispiel 1 ein reines C Programm ist?



  • Wohl hab ich das gemerkt, aber mir hat mal jemand (hier im Forum) erzählt, auch in C soll man das .h weglassen und ein c vorneweg schreiben, also

    #include <cstdio>
    


  • Wer hat dir das erzählt? Das ist falsch! Nur in C++.



  • Original erstellt von WebFritzi:
    **```cpp
    Set<char, 'a', 'z'> s;
    s << 'a' << 'e' << 'i' << 'o' << 'u';
    bool isVocal = s.Contains(c);

    
      
    oder auch gleich  
    
    ```cpp
    bool isVocal =(Set<char, 'a', 'u'>() << 'a' << 'e' << 'i' << 'u').Contains(c);
    

    Ist sie nicht schön, die VCL? ;)**

    aber überlege mal was im hintergrund abgeht und lesbar ist es nicht wirklich,

    die laufzeit kosten könnte man zwar durch etwas template zauber killen aber naja



  • isVocal=(strchr("aeiou",c)!=0);
    keine hexerei



  • Trotzdem ist [Menge] in Pascal bzw. Object Pascal eine eingebaute Funktion, d.h. in Abhängigkeit der Menge ist eine Optimierung zur Compilezeit möglich. Beim Aufruf von strchar ist keine entsprechende Optimierung (in Abhängigkeit von der Menge) möglich. Klarer Punkt für Pascal hier.



  • Original erstellt von Marc++us:
    Trotzdem ist [Menge] in Pascal bzw. Object Pascal eine eingebaute Funktion, d.h. in Abhängigkeit der Menge ist eine Optimierung zur Compilezeit möglich. Beim Aufruf von strchar ist keine entsprechende Optimierung (in Abhängigkeit von der Menge) möglich. Klarer Punkt für Pascal hier.

    sofern c erst zur laufzeit feststeht, wovon ich ausgehe (denn sonst wüsste ich ja obs n vokal ist oder nicht, dann sehe ich keine optimierungsmöglichkeiten. dann muss auch Pascal alle elemente auf gleichheit testen.


Anmelden zum Antworten