0xbaadf00d
-
ich will einen Zeiger auf unitialisierten Speicher prüfen, dazu mach ich momentan:
!= (irgendwas*)0xbaadf00ddas gefällt mir nicht so ganz, gibt es eine bessere Variante? Oder kann man ruhig davon ausgehen, dass unitialisierter speicher immer 0xbaadf00d ist?
-
Geht nicht.
-
du kannst nur in einer debug umgebung davon ausgehen, dass der zeiger an genau diese addresse zeigt, und auch dann nicht immer. uninitialisiert bedeuted halt unter anderem auch: zufällig.
-
shit, werd mir jetzt wohl ein 2-seiten langes workaround machen müssen xD.. oder beim erstellen auf null setzen.. geht nur nicht so ganz einfach ^^". egal, danke trotzdem
-
Azrael, il Meraz schrieb:
shit, werd mir jetzt wohl ein 2-seiten langes workaround machen müssen xD.. oder beim erstellen auf null setzen.. geht nur nicht so ganz einfach ^^". egal, danke trotzdem
gibt es nen grund, wieso du zeiger brauchst, die nirgendwohin zeigen sollen?
-
nö. Nur wird der speicher nicht sofort initialisiert, mach eigentlich was mit WinAPI, hier- WndProc meines Pseudo-progrämmchens, ich bin zu faul zum erklären xDD, hab mir ja nen workaround gebaut^^->
LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { static int cmmm = NULL, cmmv = NULL; static MMMUSIC **mmm = NULL/*(MMMUSIC**)malloc(sizeof(MMMUSIC**))*/; static MMVIDEO **mmv = NULL/*(MMVIDEO**)malloc(sizeof(MMVIDEO**))*/; static int Volume = 0, ecode; static double Speed = 1.0f; if(mmm) { if(mmm[0]/* && (mmm[0] != (MMMUSIC*) 0xbaadf00d)*/) { if(mmm[0]->Initialized()) { mmm[0]->Event(ecode); if(ecode == MMM_STOP) mmm[0]->stop(); } } } if(mmv) { if(mmv[0]/* && (mmv[0] != (MMVIDEO*) 0xbaadf00d)*/) { if(mmv[0]->Initialized()) { mmv[0]->Event(ecode); if(ecode == MMM_STOP) mmv[0]->stop(); } } } switch(msg) { case WM_MMCR: if(!(wParam & 0x1)) { if(!mmm) mmm = (MMMUSIC**)malloc(sizeof(MMMUSIC**)); cmmm++; mmm = (MMMUSIC**) realloc(mmm, (size_t) sizeof(MMMUSIC**)*cmmm); mmm[cmmm-1] = (MMMUSIC*) lParam; mmm[cmmm-1]->Initialize(); } else if(wParam & 0x1) { if(!mmv) mmv = (MMVIDEO**)malloc(sizeof(MMVIDEO**)); cmmv++; mmv = (MMVIDEO**) realloc(mmv, (size_t) sizeof(MMVIDEO**)*cmmm); mmv[cmmv-1] = (MMVIDEO*) lParam; mmv[cmmv-1]->Initialize((HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE)); } break; case WM_CREATE: break; case WM_CHAR: switch(wParam) { case 'f': Speed += 0.05; mmm[0]->SetPlaybackSpeed(Speed); break; case 'r': Speed -= 0.05; mmm[0]->SetPlaybackSpeed(Speed); break; case 'l': mmm[0]->LoadFile(TEXT("amr.mp3")); break; case 'p': mmm[0]->play(); break; case 'P': mmm[0]->pause(); break; case 's': mmm[0]->stop(); break; case '+': if(Volume < 0) Volume+= 100; mmm[0]->SetVolume(Volume); break; case '-': if(Volume > -10000) Volume-= 100; mmm[0]->SetVolume(Volume); break; default: break; } break; case WM_LBUTTONDOWN: SendMessage (hWnd,WM_SYSCOMMAND,SC_MOVE + HTCAPTION,0); break; case WM_DESTROY: for(int i = 0; i<cmmm; i++) { mmm[i]->stop(); mmm[i]->release(); } for(int i = 0; i<cmmv; i++) { mmv[i]->stop(); mmv[i]->release(); } free(mmm); mmm = NULL; free(mmv); mmv = NULL; PostQuitMessage(0); break; default: break; } return DefWindowProc(hWnd, msg, wParam, lParam); }
-
Hallo
Normalerweise wird für "unbelegte" Pointer der Wert 0 zugewiesen. Willst du also ein ganzes Array mit unbelegten Pointern solltest du einfach alles Elemente erstmal mit 0 belegen. Dann reicht die einfache Abfrage
if(mmv[0])ohne extra unnötige Schnörkel.
Natürlich könnte man auch hier wieder darauf hinweisen das ein std::vector nur mit gültigen Instanzen (sprich : am Anfang hat der vector 0 Elemente) wesentlich eleganter und sicherer ist.bis bald
akari
-
ne - hatte das ja schon anfang - da wurde der zeiger mit schlechtem essen besetzt^^.
naja.ich weiß zwar überhaupt keinen grund warum, aber ich verwende die std nicht soooooo gerne...
-
Azrael, il Meraz schrieb:
naja.ich weiß zwar überhaupt keinen grund warum, aber ich verwende die std nicht soooooo gerne...
Ja ne, ist ja auch viel einfacher das selbe Problem 3x neu zu loesen und dabei 5 neue Fehler einzubauen, anstatt was vernuenftiges zu machen... Hmm, ich glaub du solltest die Bretter vor deinem Kopf mal neu lackieren, der Lack blaettert so langsam ab.
-
Azrael, il Meraz schrieb:
ne - hatte das ja schon anfang - da wurde der zeiger mit schlechtem essen besetzt^^.
naja.ich weiß zwar überhaupt keinen grund warum, aber ich verwende die std nicht soooooo gerne...
sag doch gleich, dass dies ein C problem sein soll. dann schiebt man dich auch gerne dahin.