An invalid argument was encountered ?
-
Dazu zwei Fragen:
1. Wenn ein bool 1 oder 0 ist, ist mir das wurscht, das seh ich ja dann wenn es falsch ist aber warum kommt die Meldung in der Laufzeit, das es nicht initialisiert wurde? Ich mein, woher will er wissen, das der Speicherplatz nicht initialisiert ist ?
2. Warum nur bei manchen Rechnern
Gruß
thenoname
-
Typischerweise wird diese Exception geworfen wenn eine CRT Funktion mit den errno's EINVAL und ERANGE ausgeht.
-
Hi,
mal abgesehen von der Tatsache, das ich nicht weiss wie/woher du das erfahren hast:
Ein atoi(string) könnte z.B. ein ERANGE zurückwerfen.
Nur denke ich doch mal, das es von den Kompileroptionen abhängt, ob ich diese
Exception dann boxed anzeigen lasse.Kurz um: ich möchte wissen, wie ich die Debug Version so verstellen kann, damit ich auch dort solche Meldungen angezeigt bekomme.
Gruß
TheNoName
-
thenoname schrieb:
mal abgesehen von der Tatsache, das ich nicht weiss wie/woher du das erfahren hast:
Du hst den MFC Source Code! Also kanst Du doch nach sehen wo CInvalidArgException genutzt wird.
Dann wirst Du schnell merken, dass die MFC eine Funktion hat die AfxThrowInvalidArgException heißt.
Diese Funktion wird 1000nde Male benutzt.thenoname schrieb:
Ein atoi(string) könnte z.B. ein ERANGE zurückwerfen.
<Stöhn> Nein!
Die CRT Funktionen sind C! Die werfen nie eine Exception. Wenn aber eine MFC Funktion die CRT benutzt und etwas schief geht, und die ERANGE liefert, dann wird AfxThrowInvalidArgException aufgerufen.
(siehe z.b. AfxCrtErrorCheck)thenoname schrieb:
Nur denke ich doch mal, das es von den Kompileroptionen abhängt, ob ich diese
Exception dann boxed anzeigen lasse.Ganz und gar nicht. Das die Exception auftritt liegt (wie schon gesagt) evtl. an einr faslch initialisierten Variable, dann wird eben ein falsches Argeumen übergeben)
thenoname schrieb:
Kurz um: ich möchte wissen, wie ich die Debug Version so verstellen kann, damit ich auch dort solche Meldungen angezeigt bekomme.
Gar nicht! Du kanst aberbei der Release Option Debug Symbole erzeugen lassen und dann die Release Version debuggen!
-
Zusatz zum letzten Satz von Martin: du kannst auch in der Release Version zusätzlich die Optimierungen ausschalten, dann tut man sich viel viel leichter beim "durchsteppen".
Warum nur bei manchen Rechnern: weil der Speicher eben nicht initialisiert wurde. Das ist QUASI Zufall was da drinsteht. Es ist aber kein "echter" Zufall, und daher kann es passieren dass es auch einigen PCs immer zu funktionieren scheint.
Wenn ein bool 1 oder 0 ist, ist mir das wurscht, das seh ich ja dann wenn es falsch ist aber warum kommt die Meldung in der Laufzeit, das es nicht initialisiert wurde?
Vermutlich hast du nicht verstanden was ich geschrieben habe.
-
Also kanst Du doch nach sehen wo CInvalidArgException genutzt wird.
Dann wirst Du schnell merken, dass die MFC eine Funktion hat die AfxThrowInvalidArgException heißt.
Diese Funktion wird 1000nde Male benutzt.Ja, wenn man weiss, das es CInvalidArgException ist, nachdem man sucht.
Ihr wollt mir also erklären, das NUR MFC solchige MessageBoxen werfen kann, also
sozusagen alle Komponenten ala Slider oder STATIC. Alles was sonst in meinem Code
steht würde diese Meldung nicht verursachen.Gar nicht! Du kanst aberbei der Release Option Debug Symbole erzeugen lassen und dann die Release Version debuggen!
Naja das ist ja mein Problem. Ohne den Fehler brauch ich nicht debuggen. Wenn es so vom Speicherzustand abhängt müsste ja quasi der Rechner, auf dem es nicht funktioniert einen Hardwareunterschied (anderen Speichercontroller) haben.
Das Merkwürdige schreib ich hier gerne nochmal:
Mein Rechner sowie zig andere zeigen den Fehler nicht mal "zufällig" irgend wann.
Zwei andere Rechner hingegen zeigen das zuverlässig bei jedem Aufruf.Als Fazit werde ich jetzt mal alle MFC Aufrufe abklappern und schauen wo es evtl. nicht initialisiert wurde.
Gibt es einen Befehl, den man vor eine Variable setzen kann, die überprüft ob diese initialisiert wurde?Eigentlich dachte ich, das man die Debugversion im Kompiler schärfer einstellen kann, sodass alle nicht initialisierten Variablen sofort einen Break hervorrufen oder eine Warn-Meldung verursachen = Warnstufen. Damit könnte ich vorbeugen.
-
Eigentlich dachte ich, das man die Debugversion im Kompiler schärfer einstellen kann, sodass alle nicht initialisierten Variablen sofort einen Break hervorrufen oder eine Warn-Meldung verursachen = Warnstufen. Damit könnte ich vorbeugen.
Ja das wäre wirklich hilfreich. Du kannst für $$$ Tools wie BoundsChecker kaufen, BoundsChecker kann das IIRC.
Ansonsten kannst du in der Debugversion "manuell" nach bestimmten Patterns wie 0xDDDDDDDD, 0xFDFDFDFD oder 0xCDCDCDCD ausschau halten. Wenn du sowas in irgendeiner Variable findest ist es sehr wahrscheinlich dass sie nicht initialisiert wurde.
-
Ich hab mir das wesentlich primitiver vorgestellt:
Wenn irgendwo:
int myinteger;
steht sollte eine Compiler Warnung kommen:
Warning 0815: Du Depp schaffst eh keine richtige Initialisierung, also schreib gleich int myinteger=0;
Gruß
TheNoName
-
VC-2005 bzw. VC-2008 kann solch eine Warnung ausgeben...
int i,j,k; k = i*j;
Liefert bei mir
warning C4700: uninitialized local variable 'i' used
warning C4700: uninitialized local variable 'j' used
-
Wie ich es mir gedacht habe:
Einige schalten auf Warnstufe 4 /W4,
andere schalten alle Ausnahmen Erkennungen der Debug Version ein.Das hat dazu geführt, das ich viele nicht benutzte Variablen los bin
Und einige initialisiert habe.
Bei den Ausnahmen fand ich eine Stelle, wo "Throw_String" verwendet wurde.
Das ist also eine Art selbsterzeugte Meldung, nehme ich an.
Kann sowas in einer AFX Exception Meldung enden? Ich denke nicht.Naja, mal sehen ob das jetzt was gebracht hat ...
Fakt scheint zu sein, das es sich bei anderen um nicht initialisierte Variablen handelt.