Hallo,
Was wird hiermit zum Ausdruck gebracht
PlayFile->filename[ sizeof(PlayFile->filename) -6 ] = destime.minute/10
+ '0';
mir gehts speziell um PlayFile->filename.
Was wird hiermit gemacht ->
Vielleicht köönte mir das kurz jemand erklären.
mfg
PlayFile ist ein Handle auf eine Dateistruktur und 'filename' ist eine
der 'Properties' dieser Struktur.
Das '->' greift auf dieses Mitglied der Struktur zu.
ROLF schrieb:> Hallo,>> Was wird hiermit zum Ausdruck gebracht>> PlayFile->filename[ sizeof(PlayFile->filename) -6 ] = destime.minute/10> + '0';>> mir gehts speziell um PlayFile->filename.> Was wird hiermit gemacht ->
Welche Sprache? Haskell?
ROLF schrieb:> Was wird hiermit gemacht ->
Falls C: auf der linken Seite dieses Operators ist ein Pointer. Mit dem
-> Operator wird auf ein Element der Struktur zugegriffen, auf die der
Pointer zeigt.
Ich empfehle hier, ein x-beliebiges C-Buch durchzuarbeiten (also nicht
nur drin rumblättern...).
A. K. schrieb:> p->m ist in C nur eine vereinfachte Schreibweise von (*p).m
Vereinfacht... Harhar...
In jeder vernünftigen Programmiersprache schreibt man einfach "p.m",
weil der Compiler an dieser Stelle natürlich schon selber weiss, das er
den Zeiger dereferenzieren muss.
Nur dieser unsägliche Makroassembler namens "C" ist zu doof, das alleine
herauszufinden...
c-hater schrieb:> Nur dieser unsägliche Makroassembler namens "C" ist zu doof,
Lass doch einfach Dein dämliches Getrolle sein. Das ist überflüssig, und
Du stellst damit nur Deine gelegentlich beeindruckende Ahnungslosigkeit
zur Schau.
c-hater schrieb:> n jeder vernünftigen Programmiersprache schreibt man einfach "p.m", weil> der Compiler an dieser Stelle natürlich schon selber weiss, das er den> Zeiger dereferenzieren muss
Natürlich. Es ist aber dadurch lesbarer weil man sofort erkennt, dass es
sich um einen Zeiger handelt.
Nicht alles was ein Compiler einem abnehmen könnte ist gut.
Grüsse,
René
c-hater schrieb:> In jeder vernünftigen Programmiersprache schreibt man einfach "p.m",
Oha, welche Compiler Sprache unterscheidet denn noch Pointer auf
Strukturen/Klassen von "direkten" Werten, aber braucht keine explizite
Dereferenzierung? C++ und Pascal schon mal nicht.
Den Operator -> gibt es auch nur deshalb, weil die Dereferenzierung in C
leider ein Präfix-Operator ist, kein Suffix-Operator wie in Pascal. Was
ein paar hässlichen Folgeeffekte mit sich brachte, darunter auch die
umständliche Schreibweise (*p).m, aber auch die verwirrende
Deklarationsweise.
NB: Wer p-> nicht mag kann auf 0[p]. ausweichen. Ist C nicht schön? ;-)
Dr. Sommer schrieb:> c-hater schrieb:>> In jeder vernünftigen Programmiersprache schreibt man einfach "p.m",>> Oha, welche Compiler Sprache unterscheidet denn noch Pointer auf> Strukturen/Klassen von "direkten" Werten, aber braucht keine explizite> Dereferenzierung? C++ und Pascal schon mal nicht.
D. Was will man will mit p.m (p → Pointer) sonst erreichen?
Stefan E. schrieb:> Michael K. schrieb:>> Müsste das nicht p[0]. heißen?>> x[y] ist per Definition *(x+y). Und da das + kommutativ ist, sind 0[p]> und p[0] ein und dasselbe.
Macht Sinn. 0[p] liest sich imo ziemlich seltsam...
ROLF schrieb:> Was wird hiermit zum Ausdruck gebracht>> PlayFile->filename
Nun ja, in C ist gar manches nicht wirklich logisch gemacht, sondern
fast immer nach dem Motto "das ist hier eben so, basta!"
Also, wenn du in C eine Variable in einer Struktur ansprechen willst,
dann schreibst du
MeinStruct.MeinMember = irgendwas;
Wenn du aber einen Zeiger auf deine Struktur vorliegen hast, dann mußt
du
das so schreiben:
ZeigerAufMeinStruct->MeinMember = irgendwas;
Das mußt du dir einfach merken, da hilft nix.
Laß dich von dem C versus Pascal Gerede nicht durcheinander bringen. In
klassischem Pascal ist das alles wirklich systematischer, da würde man
schreiben
MeinStruct.MeinMember:= irgendwas;
ZeigerAufMeinStruct^.MeinMember:= irgendwas;
Mit dem neueren (alternativen) Objektmodell in Pascal, wie es bei Delphi
gebräuchlich ist, könnte man bei Objekten auch
MeinObjekt.MeinMember:= irgendwas;
schreiben, denn dabei erkennt der Compiler von selbst, daß MeinObjekt
ein Zeiger auf ne Referenz zu einem entsprechend instantiierten Objekt
ist, aber du hast ja explizit nach etwas aus der C-Ecke nachgefragt.
W.S.
A. K. schrieb:> NB: Wer p-> nicht mag kann auf 0[p]. ausweichen. Ist C nicht schön? ;-)
Jetzt wollte ich Dich gerade fragen, was Du denn geraucht hast?
Also nochmals überlegt, natürlich hast Du recht. Auf so eine schräge
Idee wäre ich nie gekommen.
Frisst das der Compiler?
Grüsse,
René
Rufus Τ. F. schrieb:> c-hater schrieb:>> Nur dieser unsägliche Makroassembler namens "C" ist zu doof,>> Lass doch einfach Dein dämliches Getrolle sein. Das ist überflüssig, und> Du stellst damit nur Deine gelegentlich beeindruckende Ahnungslosigkeit> zur Schau.
Trotzdem stimmt seine Bemerkung, zumindest was die Bemerkung von A.K.
betrifft:
A. K. schrieb:> p->m ist in C nur eine vereinfachte Schreibweise von (*p).m
p->m ist für mich in Ordnung, aber (*p).m bestimmt nicht und darauf
bezog sich seine Bemerkung.
A. K. schrieb:> René H. schrieb:>> Frisst das der Compiler?>> Natürlich.
Das geht dann unter, wie treibe ich meine Kollegen in den Wahnsinn :).
Grüsse,
René
Marc V. schrieb:> und darauf bezog sich seine Bemerkung.
Nein, das tat sie nicht. Er war in seiner trolligen Art der Ansicht, daß
doch bitte der Compiler erkennen möge, wenn links vom .-Operator ein
Pointer steht und er daraus automagisch eine Pointerdereferenzierung
anstellen solle, weil das "andere" (aber ungenannt gebliebene)
Programmiersprachen ja hinbekämen.
Lies Dir einfach den Trollbeitrag von heute, 11:00, nochmal durch.
Rufus Τ. F. schrieb:> Lies Dir einfach den Trollbeitrag von heute, 11:00, nochmal durch.
Habe ich, nochmal.
Was ich auch dazu sage, es artet wahrscheinlich in einen neuen Streit
über Sprachen.
Aber wenn ich schon eine Struktur deklariert habe, dann sollte doch
Struktur.Member reichen, oder ?
Bei Pointern auf Funktions oder bei cast mag das noch einen Sinn
ergeben, aber bei einfachen Strukturzugriffen ?
Warum sollte der Compiler das nicht automatisch dereferenzieren ?
Wobei ich Struktur->Member sogar besser finde als Struktur.Member,
vor allem da es klar ist, dass es sich um Pointer handelt.
(*(*(*P1).P2).P3).P4 ist doch dasselbe wie:
P1->P2->P3->P4
- welches ist aber verständlicher ?
Und warum dann nicht gleich P1.P2.P3.P4 ?
Einer schrieb:> D. Was will man will mit p.m (p → Pointer) sonst erreichen?
Ah, mit C kenn ich mich nicht aus. Na, ob c-hater D mit "vernünftige
Programmiersprache" meinte? Man weiß es nicht.
Marc V. schrieb:> Und warum dann nicht gleich P1.P2.P3.P4 ?
In C ist vieles hässlich/unnötig eingeschränkt. Der -> Operator ist da
noch das kleinste Problem. Zum Glück wird niemand gezwungen C zu
verwenden - das machen die meisten freiwillig weil alles andere böse
ist, oder so.
In C++ ist der -> Operator übrigens gar nicht so blöd, weil man den
überladen kann und damit z.B. Smart Pointer implementieren kann.
Marc V. schrieb:> Aber wenn ich schon eine Struktur deklariert habe, dann sollte doch> Struktur.Member reichen, oder ?
Genau so ist das. Hochsprachen sind ja schließlich dafür da, die Details
vor ihrem Benutzer möglichst weitgehend zu verbergen. Und wenn das
tatsächlich das Ziel ist, dann sollte an dieser Stelle der Punkt zur
Notation reichen.
> Wobei ich Struktur->Member sogar besser finde als Struktur.Member,> vor allem da es klar ist, dass es sich um Pointer handelt.
Das könnte man als zusätzliches Feature sicher auch implementieren.
Nämlich für den Fall, dass der Programmierer EINFLUSS auf die
Dereferenzierung bekommen können soll, wie z.B. in dem Beispiel von "Dr.
Sommer" hier im Thread (C++). Bei den "smart pointers" wird zwar nicht
die eigentliche Dereferenzierung angefasst, aber man kann immerhin auf
die Tatsache reagieren, dass auf den referenzierten Speicherblock
zugegriffen werden soll. Das ist immerhin etwas, was durchaus sehr
nützlich sein kann.
Nur leider: dieser unsägliche C-Dreck hat hier (im Gegensatz zu C++)
einen Operator, der dem Programmierer absolut keinen Nutzen bringt. Er
wird nur völlig sinnlos gezwungen, ihn und seine Bedeutung zu erlernen.
Genau deswegen existiert dieser Thread. Der TO war halt an dem Punkt, wo
er durch diesen C-Dreck gezwungen wurde, etwas zu lernen, was er niemals
zu seinem Vorteil verwenden können wird. Jedenfalls nicht, so lange er
bei C bleibt...
Rufus Τ. F. schrieb:> Vielen Dank für..
Ach, laß mal. Er hat gelegentlich eine etwas besondere Ausdrucksweise,
aber im Grunde kommt aus seinen Worten durchaus die notwendige Besorgnis
heraus, was die Sprache C und ihren Werdegang betrifft.
C ist zwar benutzbar, aber durchaus nicht schön und pädagogisch
fragwürdig, da in vielen Teilen zu unlogisch und recht unglücklich
konzipiert. Obendrein sieht man seit Jahren sehr deutlich die Mankos,
wenn man das Thema Objekte und grafische Oberflächen für Programme
betrachtet. C ist tatsächlich veraltet, man kann es eigentlich nur noch
für Kommandozeilenprogramme benutzen, ohne dabei allzu unproduktiv zu
werden. Klar, es geht ja im Prinzip, hab mich selber mit EVC jahrelang
herumgeplagt, aber das ist heutzutage alles viel niedriges Niveau -
jedenfalls auf dem PC. Auf dem µC sieht das ganz anders aus, da reicht C
wohl noch eine ganze Weile - jedenfalls für das Zeugs, was man auf
PIC's, AVR's und kleineren ARM's so zusammenprogrammiert.
Dennoch: im Grunde fühlt es wohl jeder schon seit Jahren, daß da
irgendwann mal was Neues kommen muß, auch auf dem µC. Dummerweise sind
all diejenigen, die zumeist nur in C programmieren, bereits so auf C
eingestellt, daß sie mental mit etwas anderem, das eben nicht wie C
aussieht, nicht mehr zurechtkommen. Deshalb sehen alle bisherigen
Neuentwürfe eben wie durchgeknetetes C aus und haben die Geburtsfehler
von C mehr oder weniger übernommen - auch die Abneigung gegen alles, was
wie Pascal aussieht. Ist schon komisch: Pascal in Form von aktuellem
Delphi hat sich weiterentwickelt, hat alte Beschränkungen beseitigt und
ist für aktuelles Programmieren auf dem PC topfit, aber sämtliche
Versuche, bei C etwas ähnliches hinzukriegen, sind an der
Starrköpfigkeit der Leute gescheitert. Im Rückblick kann man sich nur
wundern, daß damals das ANSI-C tatsächlich gegen den alten K&R
erfolgreich durchgepeitscht worden ist.
Jetzt sollte man nicht Java und C# zitieren, interpretiertes Zeugs ist
was Anderes - und man sieht ja, wohin das bei Android geführt hat: Für
alles, was man mit nativem Code erreichen kann, braucht man dort das
doppelte oder noch mehr - sowohl an RAM als auch an MHz als auch
dringend an fetten Grafikprozessoren.
W.S.
W.S. schrieb:> C ist zwar benutzbar, aber durchaus nicht schön und pädagogisch> fragwürdig, da in vielen Teilen zu unlogisch und recht unglücklich> konzipiert.
Wie jede andere Sprache auch, hat C durchaus Stärken und Schwächen. Das
ist eben so, eine wirkliche Alternative gibt es nicht. Das fängt bei den
vorhandenen Tools schon an. Gib mir mal eine andere Sprache (außer C++)
mit Toolchains vergleichbarer Qualität und Verbreitung.
W.S. schrieb:> Obendrein sieht man seit Jahren sehr deutlich die Mankos,> wenn man das Thema Objekte und grafische Oberflächen für Programme> betrachtet.
Funktionale oder sogar Logikprogrammierung gehen mit C auch nicht
besonders gut. Das kann man jetzt C ankreiden, oder einfach dem Fakt,
dass irgendjemand nicht gelernt hat, zwischen Schraubenzieher und Hammer
zu unterscheiden.
Grafische Programmierung in C ist durchaus möglich (zumindest empfand
ich GTK+ nicht als unangenehm). Objektorientierte Programmierung ist nur
in Ansätzen möglich, aber das ist ein Fall von "falsches Werkzeug",
nicht von "schlechte Sprache".
W.S. schrieb:> Ist schon komisch: Pascal in Form von aktuellem Delphi hat sich> weiterentwickelt, hat alte Beschränkungen beseitigt und ist für> aktuelles Programmieren auf dem PC topfit, aber sämtliche> Versuche, bei C etwas ähnliches hinzukriegen, sind an der> Starrköpfigkeit der Leute gescheitert.
Delphi durfte ich auch mal lernen und empfand es - verglichen mit VB6! -
als ziemlich nervig. Deren Einsatzzweck sehe ich heute hinreichend von
Python und anderen Scriptsprachen abgedeckt, nicht von C. Wieder eine
Frage des richtigen Werkzeugs.
Im Gegensatz zu Java, C#, Go, Delphi, Python usw. ist C eine sehr kleine
Sprache. Da kann man nicht so viel dran rumbauen, ohne die Kompatiblität
aufzugeben oder in Feature-Bloat erschlagen zu werden. Trotzdem
entwickelt es sich weiter - K&R ist nicht mehr Stand der Dinge.
S. R. schrieb:> Delphi durfte ich auch mal lernen und empfand es - verglichen mit VB6! -> als ziemlich nervig.
Delphi versus Basic? Uch..
Also, aus meiner Perspektive ist Delphi überhaupt nicht nervig, egal ob
als Embarcadero oder Lauzarus. Und es ist mächtig, mächtiger als Basic
und C++ zusammen. Kein Vergleich zu VB - egal welche Generation.
Aber ich verstehe das schon, daß Leute, die mental auf C ausgerichtet
sind, eine Aversion gegen Pascal entwickelt haben. Wieso auch immer.
Nach den Beweggründen zu fragen, hab ich mir abgewöhnt. Fragt man mal
dediziert nach, dann outen sich die Leute als horizontbeschränkt. Ist
eben so.
Aus deinen Worten schließe ich jedoch, daß du zwischen Pascal als einer
Programmiersprache und Delphi bzw. Lazarus als einem RAD-Tool nicht
unterscheiden kannst (oder willst).
Aber darum geht es hier ja garnicht. Hier haben wir wieder einmal ein
Verständnisproblem mit C. Verstehe das mal richtig: Die C-Anfänger
plagen sich herum mit den ganz niedrigen Sprachproblemen von C, anstatt
sich den wirklichen und höheren Dingen wie Algorithmen, Strategien,
Funktionalitäten widmen zu können. Ich frag mich so oft, wozu bloß
dieser doch erhebliche Lernaufwand für so wenig, was dabei an Nutzen
herauskommt. Ist es das allgemeine Brett vor'm Kopf zusammen mit dem
Lemming-Trieb oder was?
So, und jetzt noch was zur guten Nacht:
#define PDB0_MOD (*((__IO *) 0x40036004))
versus
var
PDB0_MOD : dword absolute $40036004;
träum was schönes..
W.S.
W.S. schrieb:> Und es ist mächtig, mächtiger als Basic> und C++ zusammen.
Ahaha... Es kann ja nichtmal templates. Witzig ist dieser Artikel:
https://edn.embarcadero.com/article/27603
Da werden templates mittels includes hingeschustert. Damit gehen weder
variadische Templates noch type traits oder viele andere Dinge die in
C++ gehen...
Move Semantics und constexpr kann es auch nicht, nach weiteren Dingen
hab ich jetzt nicht gesucht.
W.S. schrieb:> Und es [Delphi] ist mächtig, mächtiger als Basic und C++ zusammen.
Naja, das möchte ich bezweifeln. Nach Turing sind sie erstmal allesamt
gleich mächtig, und mit Lazarus eine C-Bibliothek langfristig kompatibel
anzusteuern, scheint hinreichend schwierig (ich hab das einmal mit
libavcodec durch - nie wieder).
W.S. schrieb:> Aber ich verstehe das schon, daß Leute, die mental auf C ausgerichtet> sind, eine Aversion gegen Pascal entwickelt haben.
Ich kann dir versichern, dass ich in meiner Object-Pascal/Delphi-Zeit
mental nicht auf C ausgerichtet war, da ich mit C erst mehrere Jahre
später in Berührung gekommen bin. Aber Vorurteile muss man ja pflegen,
ne?
Die letzten Jahre habe ich hauptsächlich mit C, Assembler und Perl
verbracht, und ein bisschen Python. Pascal empfand ich nie als angenehm.
W.S. schrieb:> Aus deinen Worten schließe ich jedoch, daß du zwischen Pascal als einer> Programmiersprache und Delphi bzw. Lazarus als einem RAD-Tool nicht> unterscheiden kannst (oder willst).
Der Unterschied ist mir durchaus klar. Sowohl Delphi als auch VB6 waren
annehmbare RAD-Tools. Aber Object Pascal machte mir damals weniger Spaß
als Visual Basic, und die Syntax empfinde ich nach wie vor als
"stellenweise furchtbar nervig". Das habe ich aber an anderer Stelle
schon ausgeführt.
Pascal außerhalb von Delphi/Lazarus habe ich bisher nicht nennenswert in
freier Wildbahn gesehen; die CP/M-und-DOS-Ära mit Turbo-Pascal lasse ich
mal außen vor, denn die war lange vor meiner Zeit.
W.S. schrieb:> C ist zwar benutzbar, aber durchaus nicht schön
Geschmackssache. Ich habe mit Pascal programmieren gelernt, das war zu
Zeiten von Turbo Pascal 3.0, ging dann weiter bis TP 5.0 (IIRC). Aber
den Umstieg auf C fand ich sehr befreiend und habe ihn nie bereut.
Jedenfalls kenne ich beides.
> und pädagogisch fragwürdig
Anders als Pascal ist C eben keine Lehrsprache, sondern eine
Praxissprache. Während Wirth einfach mal so Sprachen erfunden hat,
hatten K&R ein konkretes Projekt der Systemprogrammierung vor Augen.
Übrigens, das "Problem" aus dem OP hätte man mit Pascal ebenfalls, weil
es eben etwas Anderes ist, ob man ein Mitglied einer Struktur anspricht
oder einen Pointer dereferenziert. Das möchte ich auch im Quelltext
deutlich unterschieden sehen, weil es mir das lesende Verständnis einer
bestehenden Codebasis erleichtert.
Dein Beispiel mit dem IO ist in C auch deswegen etwas umständlicher,
weil man im Hintergrund des typedefs auch noch volatile hat, und das
wiederum will ich auch haben, weil der Compiler dann nämlich die
Zugriffe auf Variablen ohne volatile besser optimieren kann.
> wenn man das Thema Objekte und grafische Oberflächen für Programme> betrachtet.
OOP kann man in C in gewissem Maße auch haben. Grafische Oberflächen
sind aber tatsächlich kein Spaß in C - muß auch nicht, weil C als
Sprache zur Systemprogrammierung entworfen wurde. Sich beschweren, daß
man mit einem Traktor auf der Autobahn schlecht aussieht, ergibt keinen
Sinn.
Das ist mit Pascal aber genauso schlimm, und wenn man Object-Pascal
heranzieht, dann ist der richtige Vergleich nicht mehr C, sondern C++.
C++ kann man viel vorwerfen, aber mit Sicherheit keinen Mangel an
Objektorientierung oder Untauglichkeit zur GUI-Programmierung.
> Dennoch: im Grunde fühlt es wohl jeder schon seit Jahren, daß da> irgendwann mal was Neues kommen muß, auch auf dem µC.
Egal was, Hauptsache anders, neu und hipp, damit man durch Veränderung
wenigstens die Suggestion von Fortschritt hat. Wo liegt denn das
Problem, es kommt doch gefühlt im Wochentakt eine neue Hipstersprache
raus?
> Dummerweise sind> all diejenigen, die zumeist nur in C programmieren, bereits so auf C> eingestellt, daß sie mental mit etwas anderem, das eben nicht wie C> aussieht, nicht mehr zurechtkommen.
Es muß halt signifikant besser als C sein, sonst wird's abgelehnt, egal
wie neu es ist. Zumal es für C eben einen riesigen Fundus an Code gibt.
An beiden Aspekten scheitert Pascal.
Pascal ist seinerzeit geflopt, weil der Standard für realen Einsatz
vollkommen untauglich war. Deswegen gab es zig taugliche, zu nichts
kompatible Inseldialekte.
Einen gescheiten Standard gibt es bis heute nicht, und sich auf ein
einziges OSS-Frickelprojekt zu verlassen ist für Hobby völlig OK, für
mehr aber auch nicht. Der kommerzielle Zweig mit Embarcadero ist sogar
noch schlechter aufgestellt, wenn man sich deren wirtschaftliche Lage
vergegenwärtigt.