amiga-news 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: 1812
Nutzer
Zitat:
Original von DariusBrewka:
Zitat:
Original von Reth:
Wenn ichs recht weiss hat Thomas (glaub) dazu in nem anderen Thread mal gesagt, dass das gefahrlos möglich sei (also die innere Schleife abbrechen), wenn man dann das Fenster usw. schliesst wird alles von Intiution aufgeräumt.


Das ist so Richtig, bei einem CloseWindow() entfernt Intuition Alle zum Fenster gehörenden Messages. Ist ja auch irgendwie logisch, was willst du z.B. nach einem IDCMP_CloseWindow machen? wenn dann ein MouseMove auftritt den Wunsch des Users das Programm zu beenden ignorieren?


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:
Wie ich schon geschrieben habe! Der NULL-Test kommt dazu, weil ich in der Methode, die mir den Port übergibt (nicht im hier geposteten Code enthalten!) NULL zurückgebe, wenn noch nicht initialisiert wurde!

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:
DariusBrewka:
if (!port) bedeutet Ausgeschrieben if (port != NULL), dass muß es auch damit 99% Aller Programme so funktionieren wie die es tun.

Und was ist mit dem restlichen Prozent? ;-)

[ - Antworten - Zitieren - Direktlink - ]

22.08.2006, 12:52 Uhr

Reth
Posts: 1812
Nutzer
Zitat:
Original von DariusBrewka:
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.


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:
Wenn du soetwas schreibst wie

code:
port = AllocMsgPort();


dann ist port danach initialisiert, aber so ganz verstehe ich Dich hier auch nicht

Zitat:
Wie ich schon geschrieben habe! Der NULL-Test kommt dazu, weil ich in der Methode, die mir den Port übergibt (nicht im hier geposteten Code enthalten!) NULL zurückgebe, wenn noch nicht initialisiert wurde!

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


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:
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.

Daher initialisiere ich meine Pointer auf dem Amiga immer mit NULL, da ich davon ausgehe, dass der Compiler keinerlei Initialisierungen vornimmt!

Zitat:
if (!port) bedeutet Ausgeschrieben if (port != NULL), dass muß es auch damit 99% Aller Programme so funktionieren wie die es tun.

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: 7675
Nutzer
Zitat:
Eine Frage dazu aber noch ist das nun Amiga-spezifisch (Also: if (!port) bedeutet Ausgeschrieben if (port != NULL)), oder nicht?

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: 8090
Nutzer
Zitat:
Original von Reth:
Dann erklär doch mal! Wie ist das in C++ definiert? Werden dort alle Zeiger immer automatisch auf NULL initialisiert?

NEIN!
Zitat:
Das bedeutet, dass in C++ immer und auf jedem System und bei jedem Compiler:
C++ code:
int *i;


genau so angelegt wird:
C++ code:
int *i = NULL;


Das hat niemand behauptet.
Zitat:
(nur dann ist für mich !port und port!=NULL dasselbe!)
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:
Kann ich mir irgendwie nicht vorstellen, da NULL eine Typdefinition in den Amiga-Headern ist. Die kann auf anderen Systemen ganz anders ausfallen.
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:
Was bedeutet denn (!port) komplett ausgeschrieben in C++ bzw. bei der Programmierung auf dem Amiga?
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: 1812
Nutzer
Zitat:
Original von thomas:
Zitat:
Eine Frage dazu aber noch ist das nun Amiga-spezifisch (Also: if (!port) bedeutet Ausgeschrieben if (port != NULL)), oder nicht?

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).


Mir bekannt (außer das mit Rexx).

Zitat:
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.

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: 8090
Nutzer
Zitat:
Original von Reth:
Für Dich scheint es relativ schwer zu sein andere Einstellungen als Deine zumindest zu akzeptieren (auch wenn man sie nicht gut findet).

Vor dem Können kommt das Lernen, daran kann niemand etwas ändern.
Zitat:
Wenn ich zu jeder Bibliothek, die ich z.T. täglich verwende erst deren Source analysieren und verstehen wollte, dann könnte ich nie irgendetwas anfangen zu programmieren!
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:
Nach Deinem Verständnis müssten dann (fast) alle Softwareentwickler weltweit Fingerfarbenmaler werden und dürften nie wieder programmieren!
Nein, sie alle müssen nur irgendwann lernen. Und gute Entwickler hören damit nie auf...
Zitat:
Oder programmierst Du Dir Dein if selbst, statt das entsprechende Konstrukt der Programmiersprache zu nehmen)?

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: 8090
Nutzer
Zitat:
Original von Reth:
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?

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:
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?
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: 1812
Nutzer
Zitat:
Original von Holger:
Vor dem Können kommt das Lernen, daran kann niemand etwas ändern.


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:
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.

Ich weiss das mit den Bibliotheken war etwas übertrieben.

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.

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: 8090
Nutzer
Zitat:
Original von Reth:
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++?

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:
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).
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:
Reth:
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.

Sicherlich kannst Du letzteres auch als "initialisiert" betrachten, aber mit einem zufälligen Wert kannst Du in einem Programm nichts anfangen.
Zitat:
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!

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:
Original von gni:
Zitat:
DariusBrewka:
if (!port) bedeutet Ausgeschrieben if (port != NULL), dass muß es auch damit 99% Aller Programme so funktionieren wie die es tun.

Und was ist mit dem restlichen Prozent? ;-)

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:
Original von Reth:
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?


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:
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?

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]
ähhh

code:
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-2022 by amiga-news.de - alle Rechte vorbehalten.
.