Hä?? Variable benutzt, ohne dass sie definiert wurde??
-
Hi Leute,
Habe hier ein mir unerklärliches Problem:Run-Time Check Failure #3 - The variable 'PlottedInfo' is being used without being defined.
Diese Meldung bekomme ich zur Laufzeit in ner Messagebox!
Der Code sieht so aus:
[cpp]struct SInfo
{
double dFx;
double dFy;
double dF;
double dVx;
double dVy;
double dV;
};void ThreadPlot(CDC *pDC, float fUb, float fB, float fU, float fAlpha, float fR, int nCount, int nDelay, CPhysikGLFDlg *pDlg)
{
SElectron e;
e.Pos.x=V_LENGTH;
e.Pos.y=DISTANCE/2;
e.Velocity.X=sqrt(2.0*edivm*(double)fUb)*sin(((fAlpha)*PI)/180.0);
e.Velocity.Y=sqrt(2.0*edivm*(double)fUb)*cos(((fAlpha)*PI)/180.0);
int i=0;
SPoint OldPos;
int nCounter = 0;
while(!g_bEndThread)
{
SInfo Info;
CalcNewElectronPosition(&e,fB,fU,fR,&Info);
if(i++==3000)
break;
CPoint Pos=e.Pos;
CPoint OldPosPoint = OldPos;
SInfo PlottedInfo; // Definition
if(Pos!=OldPosPoint)
{
i=0;
if(e.Pos.x<V_LENGTH||e.Pos.x>DISTANCE+V_LENGTH||e.Pos.y<0||e.Pos.y>DISTANCE)
break;
++nCounter;
OldPos=e.Pos;
if(nCounter == nCount)
{
if(g_bPause)
{
bool bPaintForceVectors = ((CButton*)pDlg->GetDlgItem(IDC_FORCE_VECTORS))->GetCheck()==BST_CHECKED;
bool bPaintSpeedVectors = ((CButton*)pDlg->GetDlgItem(IDC_SPEED_VECTORS))->GetCheck()==BST_CHECKED;
if(bPaintSpeedVectors)
{
pDC->MoveTo(e.Pos);
pDC->LineTo(int(e.Pos.y),int(e.Pos.x+((DISTANCE/2)*(PlottedInfo.dVx/sqrt(2.0*edivm*(double)MAX_Ub))))); // Hier kommt die Meldung
}
}
while(g_bPause) Sleep(100);
PlottedInfo=Info; //Hier kommt allerdings keine!
pDC->SetPixel(int(e.Pos.x-1),int(e.Pos.y-1),RGB(255,0,0));
pDC->SetPixel(int(e.Pos.x-1),int(e.Pos.y+1),RGB(255,0,0));
pDC->SetPixel(int(e.Pos.x+1),int(e.Pos.y-1),RGB(255,0,0));
pDC->SetPixel(int(e.Pos.x+1),int(e.Pos.y+1),RGB(255,0,0));
pDC->SetPixel(e.Pos,RGB(255,0,0));
pDlg->InvalidateRect(CRect(int(START_X-V_LENGTH),int(START_Y),int(START_X+DISTANCE+1+V_LENGTH),int(START_Y+DISTANCE+1)),FALSE);
nCounter=0;
for(int j=0;j<nDelay/1000;++j)
{
if(g_bEndThread)
break;
Sleep(1000);
}
if(g_bEndThread)
break;
Sleep(nDelay-j*1000);
}
}
}
}[/cpp]Ne Idee, was das sein könnte?? Wenn sie nicht deklariert wäre, würde ich doch nen Kompilerfehler bekommen
-
Wenn ich der Struktur nen CTor geb, der sie initialisiert, dann gehts...
-
Da mich interessieren würde, wieso es tut, wenn ich der Struktur nen CTor verpass, der alle Variablen mit 0 initialisiert, verschieb ich mich selbst mal in's C++-Forum
Ist das Standardkonform??
-
Dieser Thread wurde von Moderator/in dEUs aus dem Forum MFC mit dem Visual C++ in das Forum C++ verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
SInfo PlottedInfo = {0};
sollte reichen. Wie ich sehe, wird PlottedInfo bis LineTo auch nirgendwo gefüllt?
-
Hallo,
wollte gerade antworten, da hast du "es" gefunden
Ich habe auf mehreren Web-Sites gelesen, daß man diese Meldung bekommt, wenn eine Variable nicht initialisiert wurde, so daß die Meldung wohl besser
...without being initialized"
heißen müßte (das ist wohl ein Feature des .NET-C++-Compilers, den ich noch nicht benutze, aber die fehlende Initialisierung ist das einzige, was mir aufgefallen ist..., ja, ja, die neuen Runtime-Checks zeigen ihre (Aus-)Wirkungen
)
ist auch nicht wirklich gut, wenn du mit
PlottedInfo.dVx
eine struct-Komponente ansprichst, und es noch nicht initialisiert wurde (mit Null wird ja nichts automatisch initialisiert, auch keine struct, wenn kein Konstruktor dafür sorgt)
und dank dieser Runtime-Checks bekommt man hier sofort die Info, daß hier etwas Uninitialisiertes in einem Ausdruck erscheint.
Was meinst du mit "standardkonform"? Daß hier nicht mit Null initialisiert wird? Das ist allerdings korrekt so, daß das nicht ohne dein Zutun passiert.
MfG
-
Nette Funktion, die uninitialisierte Variablen abfängt
-
Jo, die Funktion wäre wirklich nett, wenn dranstehen würde "without being initialised". So verwirrt sie nur tierisch. Dass die Variable nicht initialisiert wurde wusste ich selbst und wollte es grad ändern, als die Meldung kam, die mich dann ne halbe Stunde gekostet hat, bis ich mir dachte: "Machste erst das andere, dann guckste nochmal" ...
Mit Standardkonform meinte ich, ob es der Standard vorsieht, dass ein Programm crasht, wenn man nicht-initialisierte Variablen verwendet ...
-
Ich würde behaupten, das es nichts mit den Standard zu tun hat, wenn ein Programm wegen einer uninitialisierten Variable ins Nirwana verschwindet.
Sieh mal folgender Code:
static const char* nColumn[] = { "Spalte1", "Spalte2", "Spalte3" }; const char* GetColumn(int i) { return nColumn[i]; } void PrintColumn() { int index; // uninitialisiert printf(GetColumn(index)); }
Oft ist es sehr schwierig solche Bugs in einem grossen Projekt zu finden
und solten deshalb vorher vermieden werden.Eine Lösung für dein Problem könnte folgendes sein:
struct SInfo { double dFx; double dFy; double dF; double dVx; double dVy; double dV; // Standardkonstruktor für Erstellung SInfo() { memset(this, 0, sizeof(*this)); }; };
Somit ist bei Erstellung einer Instanz der Struktur gewährleistet, das
die Member der Struktur mit 0 vorinitialisiert werden.
-
Jo, so habe ich es auch gelöst.
-
dEUs schrieb:
Mit Standardkonform meinte ich, ob es der Standard vorsieht, dass ein Programm crasht, wenn man nicht-initialisierte Variablen verwendet ...
Nicht ganz, das Verhalten ist undefiniert.