C++ / Delphi



  • Im Übrigen bin ich ganz der Ansicht, dass der Delphi-Zuweisungsoperator := sinnvoller ist als das = heitszeichen. Und das = heitszeichen in Delphi ist mathematisch exakter als das doppelte == in C++.

    Eine Frage: Kennt Delphi Container, wie etwa den <vector>? Wenn nein, wie wird dort dynamisch Speicher alloziert? Mit new?



  • Delphi unterstützt dynamische Arrays:

    var a :array of integer;
    
    setlength(a,length(a)+1);
    

    Diese dyn. Arrays verfügen aber nicht über die breite Auswahl an
    Hilfsfunktionen wie ein std::vector (Einfügen und Löschen von Elementen,
    Iteratorn).
    In Delphi gibt es auch keine (mitgelieferte) map-Klasse. Es ist auch nur
    sehr schwer, sich eine eigene zu schreiben, da Delphi keine Templates unterstützt.



  • ein riesen prob ist es -> also bei pascal ist das so bei delphi sicherlich! auch
    [code]
    if a=1 then b:=2; c:=4; <- geht nich...

    nur so:

    if a=1 then begin b:=2; c:=4; end; <-*igitt*



  • @<frager> ist doch gut das es form freie sprache ist



  • Original erstellt von Dimah:
    @<frager> ist doch gut das es form freie sprache ist

    wie bitte 😕

    kann das mal einer auf dumm'sch sprache übersetzten ich kapiers nich 😮 🙄



  • Original erstellt von <frager>:
    **ein riesen prob ist es -> also bei pascal ist das so bei delphi sicherlich! auch
    [code]
    if a=1 then b:=2; c:=4; <- geht nich...

    nur so:

    if a=1 then begin b:=2; c:=4; end; <-*igitt***

    lol das geht genauso wenig in c, da müsstest du halt
    [cpp]
    if (a==1)
    {
    b=2;
    c=4;
    }[/code]

    schreiben...ausser du machst es halt mit dem sequenz operator, aber das hast du oben sicher nicht gemeint

    aber ich finde unter begin/end leidet die übersichtlichkeit schon stark bei richtig verschachtelten ausdrücken



  • ich meinte das man bei mehreren anweisungen hinter "then" immer ein begin..end machen muss.

    hab aber ausversehn (jetzt erst gemerkt) gesehn das ich die {} klammern beim ersten vergessen habe

    ist aber auch egal da das ja schon jemand gesagt hatte 🙄



  • das musst du doch bei c genauso wenn du mehre anweisungen in deinem "then-zweig" hast, nur anstatt begin/end eben {}



  • aber einmal das then ist nicht da und das begin weil das ist sooo groß! und das stört einfach...

    BTW: ich sagte doch ich hab die {} vergessen (beim ersten..)



  • Hallo,

    als Delphianer muss ich mich jetzt mal einmischen

    [quote=japro]
    die haben mir unbedingt weismachen sollen das das fehlen dieser geschlossenen iteration ein grosser nachteil von c++ ist. hä?[/quote]

    Du wirst mir doch wohl hoffentlich zustimmen, dass es in einer Programmiersprache verschiedene Schleifentypen gibt.

    Diese kann man in zwei untergliedern. Nämlich:

    • Schleifen mit bekannter Iterationsanzahl (for - schleifen)
    • Schleifen mit unbekannter Iterationsanzahl (while - schleifen)

    Es dürfte doch wohl einleuchtend sein, dass man bei Schleifen des ersten Typs nicht innherhalb des Anweisungsblocks die vorher bekannte Iterationsanzahl verändern darf. Aber genau dies ist in C++ möglich. Somit existieren in C++ nur Schleifen des zweiten Typs und Schleifen des ersten Typs lassen sich nur emulieren.

    Folgendes kannst du nicht 1:1 in C++ übersetzen

    var
      I: Integer;
    begin
      I := 5;
      for I := 0 to I do
      begin
        // Do Something;
      end;
    end;
    

    [quote=Luckie]
    Und ich weiß, dass Arrays Pointer sind
    [/quote]

    Arrays ist ein Felder von Variablen...

    [quote=C++arsten]Eine Frage: Kennt Delphi Container, wie etwa den <vector>? Wenn nein, wie wird dort dynamisch Speicher alloziert? Mit new? [/quote]

    Natürlich kennt Delphi Container wie z.b. TList, TObjectList, TStringList.

    Dynamischer Speicher reserviert man in ObjectPascal (oder neu: Delphi - Language) mit Dynamischen Arrays (bereits erwähnt), GetMem oder mit New:

    var
      P: Pointer;
      IntPtr: ^Integer;
    begin
      GetMem(P, 20); // Reserveriert 20 Bytes; 
    
      New(IntPtr); // Reserviert eine IntegerVariable 4 Bytes
    
      Dispose(IntPtr); // Gibt InegerVariable Frei;
    
      FreeMem(P); // Gibt dynamischen SpeicherBlock frei
    
      // Bei dynamischen Arrays muss keine Freigabe erfolgen, da ein Interner
      // Reference Counter mitgeführt wird
    

    [quote=Taurin]Diese dyn. Arrays verfügen aber nicht über die breite Auswahl an
    Hilfsfunktionen wie ein std::vector (Einfügen und Löschen von Elementen,
    Iteratorn).[/quote]

    Dazu fällt mir nur ein: Keine Ahnung haben und trotzdem mitreden wollen.

    [quote=frager]ein riesen prob ist es -> also bei pascal ist das so bei delphi sicherlich! auch

    if a=1 then b:=2; c:=4; <- geht nich...
    nur so:
    
    if a=1 then begin b:=2; c:=4; end; <-*igitt*
    

    [/quote]

    Dir ist schon der Unterschied zwischen einer Anweisung und einem Anweisungsblock bekannt?

    mfg
    Th3Law

    [ Dieser Beitrag wurde am 06.01.2003 um 01:58 Uhr von Th3Law editiert. ]

    [ Dieser Beitrag wurde am 06.01.2003 um 02:00 Uhr von Th3Law editiert. ]



  • So. Jetzt muss ich mich hier auch mal einmischen. Scheinbar bist du dir nicht ganz im Klaren, was du da schreibst, Th3Law. Das meiste ist Humbuk.

    var
    I: Integer;
    begin
    I := 5;
    for I := 0 to I do
    begin
    // Do Something;
    end;
    end;

    Was ist das denn?! Wenn da I von 0 bis 5 iteriert wird, dann ist das mehr als unlogisch. Da ziehe ich doch

    int i;
    for(i = 0; i<=5; ++i)
       // Do Something
    

    doch um einiges vor. Und das Ergebnis ist das gleiche. Kommentare werden in Pascal übrigens per {} gemacht!

    [quote=Luckie]
    Und ich weiß, dass Arrays Pointer sind

    Arrays ist ein Felder von Variablen...
    [/quote]
    Guter deutsch. Egal. Du hast recht und Luckie hat recht. Aber was ist denn ein Feld? Wie sieht denn sowas im Speicher aus? Kannst du mir das verraten? Wahrscheinlich nicht, denn wenn du das wüsstest, dann wüsstest du auch, dass ein Array nichts anderes als ein Pointer ist. Auch in Pascal!

    [quote=C++arsten]Eine Frage: Kennt Delphi Container, wie etwa den <vector>? Wenn nein, wie wird dort dynamisch Speicher alloziert? Mit new?

    Natürlich kennt Delphi Container wie z.b. TList, TObjectList, TStringList.
    [/quote]
    Das sind nichts anderes als Listen. Schonmal was von Templates gehört?

    [quote=Taurin]Diese dyn. Arrays verfügen aber nicht über die breite Auswahl an
    Hilfsfunktionen wie ein std::vector (Einfügen und Löschen von Elementen,
    Iteratorn).

    Dazu fällt mir nur ein: Keine Ahnung haben und trotzdem mitreden wollen.
    [/quote]
    Gleichfalls! Wobei das auch auf Taurin zutrifft, denn TList verfügt schon über solche Methoden (Add, Delete, ...).

    [quote=frager]ein riesen prob ist es -> also bei pascal ist das so bei delphi sicherlich! auch

    if a=1 then b:=2; c:=4; <- geht nich...
    nur so:

    if a=1 then begin b:=2; c:=4; end; <-*igitt*

    Dir ist schon der Unterschied zwischen einer Anweisung und einem Anweisungsblock bekannt?
    [/quote]
    Ja, genau darum ging es <frager>!



  • Ich bin sogar der Ansicht, dass ein begin und end deutlicher sein kann als die geliebten Klammern, von denen hier gesprochen wird.

    for (int i=0; i<5; i++)
        {
            //tu was
        }
    

    ist doch nicht unbedingt übersichtlicher als (tun wir mal so, als gäb es das)

    for (int i=0; i<5; i++)
        begin
            //tu was
        end
    

    Da begin und end bei Delphi etwa fett gedruckt sind, wird die Syntax sogar noch hervorgehoben.



  • Desweiteren finde ich es übersichtlicher, wenn die Variablendeklarationen nicht in der ganzen Funktion verstreut sind, aber das ist ansichts Sache.

    😕 ich finde es sehr übersichtlich, wenn ich nicht ständig an den Anfang einer Funktion scrollen musss um zu wissen was für Variablen das sind (kommt mir jetzt nicht mit ungarischer Notation! Da Scroll ich lieber als mir so etwas an zu tun!), vorallem ist es performanter, wenn man nicht 1000 Objekte konstruiert, die man gar nicht braucht im Nachhinein.

    Ein fettes begin und end sehe ich aber besser, als so eine mickrige geschweifte Klammer.

    Wofür kann man seine Programme einrücken? (BTW. stört mich das die Delphi/Kylix IDE das nicht automatisch macht, ich hab keine Lust die hälfte meiner Arbeit damit zu verbringen die Aufgabe zu erledigen, die eigentlich meine IDE/Editor machen sollte 🤡

    Dann mach doch welche. Es hindert dich keiner dran. :p

    Wenn man pech hat, muss man mal den Code von anderen Leuten lesen und wenn man noch mehr pech hat, wurden die irgend wie dran gehindert diese Klammern zu machen 😉

    Was mathematisch auch korrekt ist. Oder könntest du das so stehen lassen:

    i = i+1

    Das ist schlicht und ergreifent mathematisch falsch, da kannst du mir erzählen was du willst. Desweiteren, wenn man ":=" für eine Zuwseiung nimmt hat man "=" frei für den Vergleich und so wird es auch in der Mathematik verwendet.

    Mathematisch wär auch das korrekter 1 : 2 aber da bin ich bei noch einem Punkt der mich an (O)Pascal stört, die Operatoren sind teilweise unterschiedlich, Fließkommazahlen dividier ich mit / und Integers mit div 😕 und Mod gibt es nicht für Reals 😕 dafür wandelt man mit StrToFloat von String nach Real die Zahlen um (noch mehr 😕 )

    Was spricht da gegen? confused Im wirklichen Leben entsteht auch nichts aus dem nichts. Bevor ich mit dem Bleistift schreiben kann, muß der auch erstmal hergestellt / erschaffen werden.

    ich lass mir die Bleistifte immer Herstellen Aber mal im Ernst, angenommen du verlässt den Scope eines Objektes und du musst immer drauf achten den Destruktor explizit aufzurufen und angenommen du weisst nicht genau ob ein Objekt initalisiert wurde (Weil der Bezeichner existiert ja immer, dank der voraus deklaration).



  • Original erstellt von Th3Law:
    **
    [quote=C++arsten]Eine Frage: Kennt Delphi Container, wie etwa den <vector>? Wenn nein, wie wird dort dynamisch Speicher alloziert? Mit new?**

    **

    Natürlich kennt Delphi Container wie z.b. TList, TObjectList, TStringList.

    Dynamischer Speicher reserviert man in ObjectPascal (oder neu: Delphi - Language) mit Dynamischen Arrays (bereits erwähnt), GetMem oder mit New:

    var
      P: Pointer;
      IntPtr: ^Integer;
    begin
      GetMem(P, 20); // Reserveriert 20 Bytes; 
    
      New(IntPtr); // Reserviert eine IntegerVariable 4 Bytes
    
      Dispose(IntPtr); // Gibt InegerVariable Frei;
    
      FreeMem(P); // Gibt dynamischen SpeicherBlock frei
    
      // Bei dynamischen Arrays muss keine Freigabe erfolgen, da ein Interner
      // Reference Counter mitgeführt wird
    

    [quote=Taurin]Diese dyn. Arrays verfügen aber nicht über die breite Auswahl an
    Hilfsfunktionen wie ein std::vector (Einfügen und Löschen von Elementen,
    Iteratorn).[/quote]

    Dazu fällt mir nur ein: Keine Ahnung haben und trotzdem mitreden wollen.
    **[/QUOTE]

    Und wie willst du in eine TList Integer speichern? Oder Reals? Oder Chars?
    Geht nicht. Dafür brauchst du plötzlich dyn. Arrays, die besagte Operationen
    nicht direkt unterstützen. Du kannst natürlich Pointer auf Integer in der TList
    unterbringen, dann hast du aber wieder ein Stück Speicherverwaltung mehr am
    Hals.

    Dynamische Arrays sind Pointer. Schaut euch noch mal das Beispiel von mir
    ganz oben im Threat an.

    Th3Law, hättest du das gelesen und dir die Mühe gamacht, dies zu verstehen,
    wär dir das wohl aufgefallen.
    Ausserdem würde dir ein etwas höflicherer Ton auch nicht schaden.

    Zum Thema Variablendeklaration:
    Die Bequemlichkeit mag hier eine Rolle spielen. In Delphi hab ich alle
    Deklarationen auf einem Haufen und kann sie mir auf einmal anschauen,
    dafür kommt ein Stück Scrollarbeit auf mich zu.
    Das ist aber zweitrangig. In C++ wird der Speicher für Variablen erst dann
    reserviert, wenn sie gebraucht werden. Nämlich in dem Block, in dem sie
    deklariert werden. In Delphi muss zwangsweise bei einem Procedure-Aufrufe
    der Speicher für alle Variablen der Procedure belegt werden, auch wenn einige
    davon nicht gebraucht werden.

    [ Dieser Beitrag wurde am 06.01.2003 um 13:02 Uhr von Taurin editiert. ]



  • Hallo,

    Was ist das denn?! Wenn da I von 0 bis 5 iteriert wird, dann ist das mehr als unlogisch

    Nein es ist vollkommen logisch. Jeder der auch nur das geringste Ahnung von Informatik hat wird mir hier zustimmen.

    Allerdings würde ich folgende Variante vorziehen

    for I := 0 to 5 do
    begin
      // ...
    end;
    

    Kommentare werden in Pascal übrigens per {} gemacht!

    Für die, die es noch nicht mitbekommen haben: Wir führen hier keine C / Pascal weder noch eine C++ / Pascal sondern eine C++ / ObjectPascal Diskussion.

    Ich frage mich, wie jemand, der nur sehr geringfügige Sprachkenntnisse hat einem, der offensichtlich um einiges mehr an Sprachkenntniss besitzt darauf hinzuweisen, obwohl er nicht die geringste Ahnung davon hat, dass es ein Sprachkonstrukt, was in jedem Quelltext vorkommt, in einer Sprache nicht exisitert, die überhaupt nicht zur Diskussion steht.

    Aber was ist denn ein Feld?

    Ein Speicherblock bestimmter Größe.

    Wie sieht denn sowas im Speicher aus?

    Es ist eine kompakte zusammenhängende Datenstruktur (im Gegensatz zu Bäumen oder verketteten Listen)

    Das sind nichts anderes als Listen.

    std::vector ist doch auch nicht sehr viel anderes als eine Liste.

    Schonmal was von Templates gehört?

    Ja.

    ich finde es sehr übersichtlich, wenn ich nicht ständig an den Anfang einer Funktion scrollen musss um zu wissen was für Variablen

    Darüber kann man sich streiten, ich denke beides ist nur reine Gewohnheitssache.

    vorallem ist es performanter, wenn man nicht 1000 Objekte konstruiert, die man gar nicht braucht im Nachhinein

    Objekte werden in Delphi, eh dynamisch erstellt.

    Und wie willst du in eine TList Integer speichern? Oder Reals? Oder Chars?

    < 10 Minuten Zeit zum umschreiben benutzen.

    Dafür ist im Gegensatz zu Templates höhere Typensichereit gewährleistet.

    Geht nicht

    *lach*

    Dafür brauchst du plötzlich dyn. Arrays

    *lach*

    Du kannst natürlich Pointer auf Integer in der TList

    Was meinst du mit Pointer auf Integer ??

    Dynamische Arrays sind Pointer

    Arrays sind und bleiben Felder von Variablen.

    Nur wurde hier mithilfe eines Pointers, dynamischer speicher reserviert und verändert.

    mfg
    Th3Law



  • @Th3Law: Du findest dass FOR I = 0 .. I logischerweise von 0 bis zum Anfangswert von I ausgwewertet wird, 0 .. I also EINMAL ausgewertet wird. Dann schau dir mal den C(++)-Code an:

    int i = 5;
    for (i = 0; i <= i; i++)
        bla;
    

    Die korrekte Übersetzung wäre:

    int i = 5;
    int max = i;
    for (i = 0; i <= max; i++)
        bla;
    

    Es ist doch irgendwo scheißegal als was etwas abstrakterweise von irgendeinem Informatik-Prof definiert wurde. Viel wichtiger ist für den Programmierer was es tatsächlich auf seinem PC ist.

    Templates und keine Typ-Sicherheit? HAHAHAHAHA. Templates machen das Ganze erst typsicher.



  • < 10 Minuten Zeit zum umschreiben benutzen.

    Ja, aber jedesmal, in jedem Programm wieder und wieder und wieder.

    Dafür ist im Gegensatz zu Templates höhere Typensichereit gewährleistet.

    Eine TList speichert untypisierte Pointer, was ist daran Typsicher?
    Templates sind gerade dazu gedacht, um ein hohes Maß an Flexibilität
    mit Typsicherheit zu kombinieren.

    Was meinst du mit Pointer auf Integer ??

    Weißt du überhaupt, was Pointer so an und für sich sind???

    int* PointerAufInteger;
    
    var PointerAufInteger :^integer;
    

    Nebenbei möcht ich dir ein kleines Geheimnis verraten:
    Alle Objekte werden in Delphi über Pointer verwaltet.

    Arrays sind und bleiben Felder von Variablen.

    var a,b :array of integer;
    

    Auch wenn du es nicht glaubst, a und b sind hier Pointer auf ein Feld von
    Variablen, insofern sind beide Aussagen in gewisserweise richtig und zugleich
    falsch. Mein Problem dabei ist nur, dass der Syntax von Delphi dies verschweigt.

    Wo ich dabei bin, noch ein Punkt gegen Delphi (auch wenn es so schön bunt ist):
    Alle Klassen, egal welcher Art, sind (direkt oder indirekt) abgeleitet
    von TObject. Warum? Warum muss ein Button mit einer StringList verwandt sein?
    Ist einer von euch Theoretiker genug, um mir das zu erklären?



  • Ein Speicherblock bestimmter Größe.

    das stimmt basta! nur die variable enthält einen pointer auf das erste element dieses speicherblocks und wird einfach automatisch dereferenziert

    std::vector ist doch auch nicht sehr viel anderes als eine Liste.

    < 10 Minuten Zeit zum umschreiben benutzen.

    andere haben vielleicht die zeit sowas unmzuschreiben aber ich mach in der zeit lieber was neues.
    std::vector und alle darauf anwendbaren algorithmen haben mehrere tausend zeilen code und die alle anzupassen... ausserdem isses doch irgendwie käse in einem projekt immer den selben code mit kleinen unterschieden zu haben.

    ausserdem finde ich es irrelevant zu sagen der vorteil von templates ist nicht so gross wie alle immer denken weil man das auch anders machen kann...
    "jo klar wer braucht schon klassen? ich meine das kann ich ja auch mit structs und so nachbilden..." is ungefähr eine gleich starke argumentation.

    und zu dem mit dem for.... wenn ich gewusst hätte was ich damit auslöse 🙂

    ich hab mich ja auch nur beschwert das man mir unbedingt beibringen wollte das das ein nachteil ist... warum denn es macht vom generierten code her keinen unterschied und nur weil ich in c++ die möglichkeit hab die variable zu verändern muss ich das ja nicht tun...

    [ Dieser Beitrag wurde am 06.01.2003 um 16:35 Uhr von japro editiert. ]



  • [quote von mir]
    Kommentare werden in Pascal übrigens per {} gemacht!
    [end quote]

    Für die, die es noch nicht mitbekommen haben: Wir führen hier keine C / Pascal weder noch eine C++ / Pascal sondern eine C++ / ObjectPascal Diskussion.

    Ich frage mich, wie jemand, der nur sehr geringfügige Sprachkenntnisse hat einem, der offensichtlich um einiges mehr an Sprachkenntniss besitzt darauf hinzuweisen, obwohl er nicht die geringste Ahnung davon hat, dass es ein Sprachkonstrukt, was in jedem Quelltext vorkommt, in einer Sprache nicht exisitert, die überhaupt nicht zur Diskussion steht.

    So, mein Kleiner, jetzt reicht's aber! Hast du schonmal nen Delphi-Quellcode gesehen? Ja? Dann müsste dir klar sein, dass dort Kommentare in geschweifte Klammern gesetzt werden. Und nochmal für dich: Delphi ist Object Pascal. Und was die Arrays angeht: mit deinen Kommentaren ist wohl klar, dass DU hier derjenige bist, der absolut keine Ahnung hat von dem, was im Speicher so abgeht. Ich glaube, es wird besser für dich sein, wenn du hier deinen Mund hältst, denn wie du siehst, wissen alle hier besser bescheid als du.



  • Hallo,

    So, mein Kleiner, jetzt reicht's aber! Hast du schonmal nen Delphi-Quellcode gesehen? Ja?

    Im Gengensatz zu Dir schon!

    Dann müsste dir klar sein, dass dort Kommentare in geschweifte Klammern gesetzt werden

    *LACH*

    Und nochmal für dich: Delphi ist Object Pascal

    Genauso bescheuert währe: MSVC ist C++

    Und was die Arrays angeht: mit deinen Kommentaren ist wohl klar, dass DU hier derjenige bist, der absolut keine Ahnung hat von dem, was im Speicher so abgeht

    Was sind Arrays denn deiner Meinung nach ?

    Ich glaube, es wird besser für dich sein, wenn du hier deinen Mund hältst

    DITO

    denn wie du siehst, wissen alle hier besser bescheid als du.

    Du bist der einzige in dieser Diskussionsrunde, der überhaupt kein Ahnung von ObjectPascal hat. Du versuchst mit deinem geringfügigem Wissen über diese Sprache herzufallen. Leider bist du anscheinend nicht dazu imstande zu merken, dass das ziemlich in die Hose geht.

    mfg
    Th3Law

    [ Dieser Beitrag wurde am 06.01.2003 um 17:06 Uhr von Th3Law editiert. ]


Anmelden zum Antworten