ENGLISH VERSION |
|
Links | | | Forum | | | Kommentare | | | News melden |
Chat | | | Umfragen | | | Newsticker | | | Archiv |
amiga-news.de Forum > Programmierung > Nochmal Intuition Messages | [ - Suche - Neue Beiträge - Registrieren - Login - ] |
1 -2- | [ - Beitrag schreiben - ] |
22.08.2006, 09:26 Uhr Reth Posts: 1858 Nutzer |
Zitat: Ich will gar nichts damit machen, aber ich wusste nicht auswendig, ob Intuition vor dem Close erwartet, dass alle Messages irgendwie beantwortet werden. Das mit dem Abbruch der inneren Schleife hat übrigens funktioniert. Ciao [ - Antworten - Zitieren - Direktlink - ] |
22.08.2006, 11:44 Uhr DariusBrewka Posts: 899 [Benutzer gesperrt] |
if (!port) ist von der Funktion das selbe wie (port != NULL) aber !port ist IMHO für mich nicht wirklich schön, da port nunmal kein ja/nein Wert ist bzw. kein BOOLEAN, weil aber TRUE jeder Wert ungleich NULL ist nimmt es der Compiler so hin. Wenn du soetwas schreibst wie code:port = AllocMsgPort(); dann ist port danach initialisiert, aber so ganz verstehe ich Dich hier auch nicht Zitat: was meinst du nicht initialisiert? den port durch CreateMsgPort() oder port durch NULL?, der NULL Test ist überflüssig weil der Test davor das gleiche macht, du also soetwas hast wie code:if (a oder a) ob ein Compiler Pointer auf NULL initialisiert ist völlig irrelevant und i.A. nicht gegeben (Normalerweise mekkert ein C Compiler bei Konstrukten folgender Art: code:struct Test { int v; }; ... struct Test *t; int v; v = t->v; mit einem t ist nicht Initialisiert.) Du MUSST Pointer um irgendwas Sinnvolles damit machen zu können Initialisieren bzw. es macht keinen Sinn auf etwas zuzugreifen von dem du weißt das es nicht benutzt werden kann. NULL ist vom Wert her 0 was der Name auch andeutet was es auf anderen Systemen bedeuten könnte, ist auch völlig unwichtig denn du Willst ja auf dem Amiga Programmieren und weißt dass es 0 ist oder? if (!port) bedeutet Ausgeschrieben if (port != NULL), dass muß es auch damit 99% Aller Programme so funktionieren wie die es tun. [ - Antworten - Zitieren - Direktlink - ] |
22.08.2006, 12:29 Uhr gni Posts: 1106 Nutzer |
Zitat:Und was ist mit dem restlichen Prozent? ;-) [ - Antworten - Zitieren - Direktlink - ] |
22.08.2006, 12:52 Uhr Reth Posts: 1858 Nutzer |
Zitat: Und das (TRUE ist jeder Wert ungleich NULL) gilt für alle C/C++ Implementierungen auf allen Systemen (so muss ich Holger ja verstehen, wenn er von einem Programmiersprachenkonstrukt spricht)? Zitat: Das "initialisiert" steht hier in einem andere Zusammenhang, da muss weiter ausholen: Also der Port ist natürlich der eines Intuitionfensters. Die Fensterstruktur ist aber gekapselt in einer Window-Klasse (C++). Wenn ich mir nun von dieser Window-Klasse den Port geben lasse, wird NULL zurückgeliefert, wenn das Fenster z.B. noch nicht geöffnet wurde. Beim einer gültigen Fensterstruktur wird stattdessen der UserPort des Intuitionfensters zurückgegeben. Mit nicht initialisiert meinte ich hier nicht den Port, sondern dessen Fenster (konnte ja niemand wissen, war ja aber auch nicht Bestandteil des ursprünglichen Problems). Zitat: Daher initialisiere ich meine Pointer auf dem Amiga immer mit NULL, da ich davon ausgehe, dass der Compiler keinerlei Initialisierungen vornimmt! Zitat: Genau das ist die Antwort, die ich ja schon vermutet habe, aber gern auch viel weiter oben im Thread schon gehabt hätte! Eine Frage dazu aber noch ist das nun Amiga-spezifisch (Also: if (!port) bedeutet Ausgeschrieben if (port != NULL)), oder nicht? Danke. Ciao [ - Antworten - Zitieren - Direktlink - ] |
22.08.2006, 13:37 Uhr thomas Posts: 7717 Nutzer |
Zitat: Wie hast du eigentlich C++ programmieren gelernt ? Das Kapitel mit den Grundlagen hast du übersprungen, oder ? ! ist ein Operator, und zwar ein logisches "nicht". Logische Operatoren arbeiten mit boolschen Werten, die entweder "wahr" oder "falsch" sind. Normalerweise bedeuter 0 "falsch" und 1 "wahr", C/C++ nimmt aber auch bei allen anderen Werten ungleich 0 "wahr" an. (Anders als Rexx z.B., wo ein Wert ungleich 0 oder 1 in einem logischen Ausdruck zum Programmabbruch führt). Bei !port kommt noch hinzu, daß hier auch noch Pointer-Arithmetik angewendet wird. "port" ist ja ein Pointer, bei der logischen Operation wird aber dessen Zahlenwert zur Auswertung herangenommen. Gruß Thomas -- Email: thomas-rapp@web.de Home: thomas-rapp.homepage.t-online.de/ [ - Antworten - Zitieren - Direktlink - ] |
22.08.2006, 13:39 Uhr Holger Posts: 8116 Nutzer |
Zitat:NEIN! Zitat:Das hat niemand behauptet. Zitat:Dann hatte ich also Recht mit der Annahme, dass Du etwas grundlegendes nicht verstanden hast. Es gibt keinen Test, ob eine Variable in C oder C++ initialisiert wurde. Dein Test setzt bereits voraus, dass die Variable initialisiert wurde, ansonsten darfst Du nicht lesend darauf zugreifen, und ein Vergleich ist ein lesender Zugriff auf die Variable. Zitat:Blödsinn, NULL ist eine Definition, die im Standard verankert ist. Abgesehen davon ist es auch vollkommen irrelevant, ob da NULL, SPECIAL_AMIGA_VALUE oder FOO_BAR steht, das sind alles initialisierte Werte. Zitat:Es ist doch bereits oft genug gesagt worden, dass !port und port==NULL das gleiche bedeuten. Dass Du es sogar noch mit nicht initialisierten Variablen in einen Topf wirfst, konnte ja keiner ahnen. mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
22.08.2006, 13:52 Uhr Reth Posts: 1858 Nutzer |
Zitat: Mir bekannt (außer das mit Rexx). Zitat: Und was passiert dann wohl, wenn man sowas macht und der Compiler nicht auf eine fehlende Initialisierung hinweist: C++ code:struct MsgPort *port; ... if (!port) ... ? Dann zeigt port u.U. auf einen beliebigen Speicherbereich, ist also ungleich NULL (wenn nicht gerade 0 im Zeiger steht). Dann würde dieses if doch wohl nicht den gewünschten Effekt haben, oder? Noch besser, wenn man mit new, und delete arbeitet und nach nem delete (ohne den Zeigerwert auf NULL zu setzen) so ein if abfragt. Ich glaube kaum, dass ein delete den Zeiger auch gleich mit auf NULL setzt, oder? Ciao [ Dieser Beitrag wurde von Reth am 22.08.2006 um 13:53 Uhr geändert. ] [ - Antworten - Zitieren - Direktlink - ] |
22.08.2006, 13:52 Uhr Holger Posts: 8116 Nutzer |
Zitat:Vor dem Können kommt das Lernen, daran kann niemand etwas ändern. Zitat:I. Du hast keine Bibliothek verwendet, Du hast source code kopiert. Das liegen Welten dazwischen. Aber auch wenn Du eine Bibliothek verwendest, musst Du deren API verstehen lernen, bevor Du sie einsetzen kannst. II. Die Quelle war ein Beispielprogramm, deren Primärziel Verständnis ist. Beispielprogramme enthalten oftmals Vereinfachungen, die in einer realen Anwendung unzulässig sind. Damit muss man sich auseinandersetzen. Zitat:Nein, sie alle müssen nur irgendwann lernen. Und gute Entwickler hören damit nie auf... Zitat: Niemand hat verlangt, dass Du einen not-Operator programmierst. Du sollst nur begreifen, wozu er dient, bevor Du ihn in Deinen source code setzt. mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
22.08.2006, 13:57 Uhr Holger Posts: 8116 Nutzer |
Zitat:Deshalb sollte man immer alle Warnungen des compiler eingeschaltet lassen. Aber worauf willst Du hinaus? Der Not-Operator funktioniert genausowenig auf einer uninitialisierten Variable, wie der Vergleich mit NULL. Zitat:Genausowenig wie free(...) in C. Deshalb macht C/C++-Programmieren auch so viel Spaß. mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
22.08.2006, 14:01 Uhr Reth Posts: 1858 Nutzer |
Zitat: Und genau das will ich ja: Lernen. Wenn dann bei Problemen, die auftreten auch gleich noch andere Fehler/Unzulänglichkeiten mit geklärt werden, die sich bei mir angesammelt haben, umso besser! Zitat: Ich weiss das mit den Bibliotheken war etwas übertrieben. Zitat: Was ein NOT macht (Boolsches oder Logisches) weiss ich (auch bei nem if). Nur der Fakt, dass (!zeiger) das Gleiche ist wie (zeiger == NULL) war mir in der Form unbekannt. Aber nochmal die Frage (wenn sie shcon beantwortet wurde, hab ich die Antwort wohl übersehen): Gilt das nur beim Amiga oder immer bei Zeigern in C/C++? Ich bin immer davon ausgegangen, dass alle Zeiger immer initialisiert sind (entweder mit den Werten, die man ihnen selbst zuteilt, oder mit denen die sie vom Compiler willkürlich bekommen, s. Antwort auf Thomas Post). Wenn das so ist (also Zeiger, die man nicht selbst initialisiert vom Compiler willkürlich mit Werten belegt werden), dann funktioniert if (!zeiger) immer, wenn der Compiler nicht gerade 0 eingesetzt hat! Ciao [ Dieser Beitrag wurde von Reth am 22.08.2006 um 14:01 Uhr geändert. ] [ - Antworten - Zitieren - Direktlink - ] |
22.08.2006, 14:35 Uhr Holger Posts: 8116 Nutzer |
Zitat:Glaubst Du, der Amiga hat seinen eigenen C-Dialekt? Wir reden hier von nix Amiga-spezifischen. Wenn Du weißt, was ein logisches NOT macht, dann müsste Dir doch klar sein, was es bei einem pointer, der auch nichts anderes als eine integer-Zahl ist, macht. Zitat:Was verstehst Du unter "willkürlich bekommen"? Wenn eine Variable einen zugeordneten Speicherbereich besitzt, steht da auch "irgendetwas" drin. Initialisiert ist die Variable aber erst nach dem das erste Mal etwas hineingeschrieben wurde, also nicht mehr irgendetwas drinsteht. Dann sollte in einem Zeiger normalerweise entweder NULL oder eine gültige Adresse drinstehen. Aber C zwingt Dich nicht dazu. Du kannst auch 0xdeadbeaf reinschreiben, wenn Du willst. Dann ist der Pointer !=NULL, gültig wird die Adresse davon natürlich nicht... mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
22.08.2006, 15:40 Uhr gni Posts: 1106 Nutzer |
Zitat:Sicherlich kannst Du letzteres auch als "initialisiert" betrachten, aber mit einem zufälligen Wert kannst Du in einem Programm nichts anfangen. Zitat:Niemand hat behauptet das es nicht funktionieren würde. Es geht darum, das der Wert *undefiniert* ist, dh. Monte Carlo läßt grüssen. [ - Antworten - Zitieren - Direktlink - ] |
22.08.2006, 22:26 Uhr DariusBrewka Posts: 899 [Benutzer gesperrt] |
Zitat: die Restlichen 1% benutzen code:if (port != NULL) ich versuche das immer so zu machen, bzw. habe das früher so gemacht nur ist das viel zu umständlich :-( [ - Antworten - Zitieren - Direktlink - ] |
22.08.2006, 22:45 Uhr DariusBrewka Posts: 899 [Benutzer gesperrt] |
Zitat: den Port hast du doch nicht Initialisiert, also dann weißt du das du darauf nicht zugreifen kannst, worauf soll port denn zeigen wenn du nichts angibst? der Compiler mekkert hier i.A. auch. Woher soll der Compiler wissen was du mit port vorhast, vieleicht willst du ja dass er irgendwo hinzeigt und ob der Compiler port mit NULL initialisiert oder nicht ist wie schon erwähnt völlig Irrelevant, da das nicht nur vom Compiler sondern auch vom OS-Loader abhängen kann und die Erfahrung zeigt mir dass port nicht NULL ist. Wenn du willst dass NULL für Fehlschlag steht, dann mußt du auch dafür sorgen dass es mit NULL initialisiert ist. Zitat: wenn du delete(port) schreibst, dann zeigt port immer noch auf den alten Speicher der Struktur, diese gibt's dann zwar nicht mehr, aber wenn du nach einem delete() immer noch auf die gelöschte Struktur zugreifen willst dann hast du ein Problem, port wird von delete() sicherlich nicht auf NULL gesetzt, ich wüßte auch nicht warum es das sollte bzw. mir kam nie in den Sinn dieses zu Vermuten. Ansonsten müßte das Konstrunkt eher so lauten delete(&port) damit der Compiler auch weiß was er mit NULL initialisieren soll. [ Dieser Beitrag wurde von DariusBrewka am 22.08.2006 um 22:46 Uhr geändert. ] [ - Antworten - Zitieren - Direktlink - ] |
22.08.2006, 22:59 Uhr DariusBrewka Posts: 899 [Benutzer gesperrt] |
ähhhcode:if (!port) ist äquivalent zu if (port == NULL) und nicht wie ich Irrtümlicherweise schrieb code:if (!port) gleich if (port != NULL) ist. [ - Antworten - Zitieren - Direktlink - ] |
1 -2- | [ - Beitrag schreiben - ] |
amiga-news.de Forum > Programmierung > Nochmal Intuition Messages | [ - Suche - Neue Beiträge - Registrieren - Login - ] |
Impressum |
Datenschutzerklärung |
Netiquette |
Werbung |
Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten. |