C++ / Delphi
-
Stimmt doch!
-
In meinem persöhnlichem Vergleich von Delphi (bzw. Objekt Pascal) mti C++
bin ich zu folgendem Fazit gelangt:
Delphi ist zum schnellen und einfachem erstellen von Windowsoberflächen
deutlich besser geeignet als (Visual) C++. Die VCL, die Delphi zugrunde
liegt, bietet einem alle wichtigen Komponenten an, um hübsche, bunte
Benutzeroberflächen zu erstellen.
Dagegn ist die Speicherverwaltung von Delphi müll. Man kann sich nie ganz
sicher sein, welchen Speicher Delphi wieder von selbst frei gibt, und ob
der Speicher, den man per Hand wieder freigibt, auch wirklichen frei geworden
ist. Delphi wirft einem schnell Knüppel zwischen die Beine, wenn es um das
etwas gewöhnungsbedürftige Pointerhndling geht. Delphi macht viele Dinge, die
aus dem eingegebenen Code nicht sofort ersichtlich sind.
Bsp.:var a1,a2 :array of integer; setlength(a1,2); a1[0] := 2; a2 := a1; a2[0] := 3; setlength(a2,5); a2[0] := 4;
Ergebnis: a1[0] = 3 und a2[0] = 4
Ok, wer einen Moment darüber nachdenkt, versteht warum. Aus dem Code
ist aber nicht ersichtlich, das a1 und a2 eigentlich Pointer sind. In
Delphi werden die eigentlich mit einem ^ gekennzeichnet.
Delphi macht viele solcher und anderer Dinge, die einen die eine oder
andere Stunde Wahnsinn bereitet.
Dafür ist Delphi viel bequemer als C++, und solange man keine Programme
entwickelt, in denen es um Performance geht (Graphik, auch 2D),
kann man was mit Delphi anfangen.
Vom Prinzip funktioniert es wie jede andere OO-Sprache auch, der Syntax
ist einfacher als der von C++ (weniger Sonderzeichen) und sollte für einen
halbwegs erfahrenen Programmierer keine größere Hürde darstellen.Ich find C++ trotzdem hübscher, besonders den Syntax, in Delphi fehlen mir
immer die hübschen, geschweiften Klammern
-
Toller Text Taurin. Kann man einfach nichts mehr hinzufügen.
Dagegen ist mein Link totaler Müll, oder?
mfg tHe pHreak
-
Original erstellt von Taurin:
Ich find C++ trotzdem hübscher, besonders den Syntax, in Delphi fehlen mir
immer die hübschen, geschweiften KlammernDafür gibt's ja den C++ Builder, der hat all die Vorteile von Delphi und geschweifte Klammern!
-
@Taurin: Ich weiß nicht, eas du hast. Was sollte den deiner meinung nach sonst rauskommen? Du weißt zum Schluß dem ersten Element von von a2 5 zu. Was soll also rauskommen, als a[0] := 5; ?
Und ich weiß, dass Arrays Pointer sind. :p
Und wenn ich mit Delphi Onjekte freigebe, kann ich acuh sicher sein, dass sie freigegeben werden. Warum sollte Delphi auch meinen Code ignorieren.
Und das Delphi langsamer ist wie C/C++ bezweifele ich. Das ist ja nicht sprachabhängig, sondern Compiler / Linker abhängig.
-
Ich muss zZ. auch mit Object Pascal arbeiten. Also wenn du C++ programmieren kannst, ist es leicht mit Object Pascal zu arbeiten, du musst dir nur mal die Hilfe angucken, da steht alles drin was du brauchst (wenn du vorher schon mit dem BCBuilder gerabeitet hast, sollte es wohl noch leichter sein, denke ich). Du musst dich nur öfter mal mit den unzulänglichkeiten von Delphi rumprügeln, die IMHO Delphi für größere Projekte ungeeignet erscheinen lassen bzw. ganz andere Konzeptionierung verlangen, aber für ein "mal eben ne GUI für mein schickes C++ BackEnd", finde ich es ganz praktisch.
(einige Dinge die mich stören:
-Variablen müssen zu Begin einer Funktions/Procedut Definition deklariert werden (man kann wohl auch keine neuen Scopes eröffnen, wie es ADA anbietet )
-IDE Dominanz (alles muss man über die IDE machen, für die OP Klassen gibt es sogar ein "Zugriffsregulator" um damit die IDE zu steuern )
-Durch die fehlenden geschweiften klammern geht die Übersicht IMHO schnell verloren
-Man kann den Iterator in for Schleifen nicht manipulieren
-Die Semikolons werden nicht konsequent durchgesetztif bla=blub then tue //kein ; ! else mache;
-Bei Funktionsaufrufen ohne Argument muss man keine leeren () setzen, was es IMHO wieder unübersichtlicher macht
-Zuweisungsoperator ist := und nicht =, dabei werden Zuweisungen viel heufiger benutzt als Vergleiche!
-Es gibt keinen speziellen Operator für inkrementieren und dekrementieren (ich hasse es wenn man folgendes schreiben muss variable := variable + 1;)
-Mit Klassen habe ich noch nicht gearbeitet, aber man muss AFAIK den Konstruktor und den Destruktor explizit aufrufen!
...)
-
Original erstellt von Luckie:
**@Taurin: Ich weiß nicht, eas du hast. Was sollte den deiner meinung nach sonst rauskommen? Du weißt zum Schluß dem ersten Element von von a2 5 zu. Was soll also rauskommen, als a[0] := 5; ?
**Das ist so auch richtig. Ich weise bloß an einer Stelle a2[0] den Wert 3 zu,
und siehe da, a1[0] bekommt diesen Wert auch....kingruedi:
Es gibt keinen speziellen Operator für inkrementieren und dekrementieren (ich hasse es wenn man folgendes schreiben muss variable := variable + 1]Wie wärs mit inc(Value) und dec(Value) bzw. inc(Value,n) und inc(Value,n) ?
Das entspricht Value++, Value--, Value += n, Value -= n. Auch wenn ich die
C++ Variante ein wenig hübscher finde, ist doch immer noch besser als Value := Value + n, oder?Der := Operator ist übrigens aus der Mathematik geklaut, wo er eben für Zuweisungen gebraucht wird.
Ansonsten beschreibst du ziemlich genau meine Vorbehalte gegen Delphi. Vor allem
die "Oberflächlichkeit" der IDE. Alles geht von der Form aus, der Code rückt
stellenweise in den Hintergrund.Wie wärs mit dem Beitrag für die FAQ, viel kann man zum Thema "Delphiübersicht für C++'ler" nicht mehr sagen, oder?
-
ich hab mich mal auf ne diskussion mit ein par pascal fans über objpascal vs c++ eingelassen, es kam ungefähr das raus (ich war in unterzahl ):
Original erstellt von kingruedi:
**
-Variablen müssen zu Begin einer Funktions/Procedut Definition deklariert werden (man kann wohl auch keine neuen Scopes eröffnen, wie es ADA anbietet )
**das machte laut denen den code wartbarer weil man genau weiss wo man was nachschauen muss.
[/QB][/QUOTE]**
-IDE Dominanz (alles muss man über die IDE machen, für die OP Klassen gibt es sogar ein "Zugriffsregulator" um damit die IDE zu steuern )
-Durch die fehlenden geschweiften klammern geht die Übersicht IMHO schnell verloren
**durch die vielen sonderzeichen is c++ angeblich unlesbar. begin... end erkennt man viel besser
zitat von keine ahnung wem:"c+ programmierer können ihre programme nur verstehen Pascal programmierer können sie lesen."**
-Man kann den Iterator in for Schleifen nicht manipulieren
**die haben mir unbedingt weismachen sollen das das fehlen dieser geschlossenen iteration ein grosser nachteil von c++ ist. hä?
**
-Die Semikolons werden nicht konsequent durchgesetztif bla=blub then tue //kein ; ! else mache;
-Bei Funktionsaufrufen ohne Argument muss man keine leeren () setzen, was es IMHO wieder unübersichtlicher macht
**das spart aber tipparbeit...
**
-Zuweisungsoperator ist := und nicht =, dabei werden Zuweisungen viel heufiger benutzt als Vergleiche!
**das ist mathematisch irgendwie korrekter und liegt wohl dran das der pascal erfinder mathe professor war (oder?)
**
-Es gibt keinen speziellen Operator für inkrementieren und dekrementieren (ich hasse es wenn man folgendes schreiben muss variable := variable + 1;)
**hmmm also in turbopascal gabs inc() und dec() die genau das gemacht haben aber das is auch zu viel zu schreiben find ich. aber angeblich sind es gerade die vielen operatoren und sonderzeichen die c++ so unlesbar machen...
**
-Mit Klassen habe ich noch nicht gearbeitet, aber man muss AFAIK den Konstruktor und den Destruktor explizit aufrufen!
...)**edit: n par fehlerkorrigiert....
[ Dieser Beitrag wurde am 05.01.2003 um 15:55 Uhr von japro editiert. ]
-
-Variablen müssen zu Begin einer Funktions/Procedut Definition deklariert werden (man kann wohl auch keine neuen Scopes eröffnen, wie es ADA anbietet )
Das kann so wohl ein Nachteil, als auch ein Vorteil sein. Das mit den neuen Scopes ist natürlich nicht möglich. Aber wie übersichtlich wird eine Funktion, wenn ich innerhalb derselben zwei Variablen deklariere mit gleichen Namen, die sich nur in der Sichtbarkeit unterscheiden?
Desweiteren finde ich es übersichtlicher, wenn die Variablendeklarationen nicht in der ganzen Funktion verstreut sind, aber das ist ansichts Sache.-Durch die fehlenden geschweiften klammern geht die Übersicht IMHO schnell verloren
Ein fettes begin und end sehe ich aber besser, als so eine mickrige geschweifte Klammer.
-Die Semikolons werden nicht konsequent durchgesetzt
Das stimmt allerdings. Aber Die Entwickler werden eventuell ihre Gründe gehabt haben.
-Bei Funktionsaufrufen ohne Argument muss man keine leeren () setzen, was es IMHO wieder unübersichtlicher macht
Dann mach doch welche. Es hindert dich keiner dran. :p
-Zuweisungsoperator ist := und nicht =, dabei werden Zuweisungen viel heufiger benutzt als Vergleiche!
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.
-Mit Klassen habe ich noch nicht gearbeitet, aber man muss AFAIK den Konstruktor und den Destruktor explizit aufrufen!
...)Was spricht da gegen? Im wirklichen Leben entsteht auch nichts aus dem nichts. Bevor ich mit dem Bleistift schreiben kann, muß der auch erstmal hergestellt / erschaffen werden.
-Man kann den Iterator in for Schleifen nicht manipulieren
Womit bei einer for-Schleife eine Gefahrenquelle ausgeschaltet wäre und wenn ich ihn verändern muß, nehme ich eine while-Schleife, wozu sie auch da ist.
[ Dieser Beitrag wurde am 05.01.2003 um 21:11 Uhr von Luckie editiert. ]
-
Hier ist ein Vergleich von C++ und Delphi:
[url] http://ourworld.compuserve.com/homepages/praxisservice/kapit0.htm[/url]
-
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 istwie 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. ]