On Monday 14 May 2007, Frank Gerlach wrote:
Und: was ist an einem Aufruf wie
int x,y; m_window->getCoordinates(&x,&y);
schwierig ?
Nichts. Die Implementation von getCoordinates ist schwerer.
Wer natuerlich einen NULL pointer uebergibt wird ein SIGSEV ausloesen, was auch gut ist.
Das finde ich nicht dass das gut ist.
Stell Dir jetzt mal bitte ein richtig komplexes Programm vor, das auf X Plattformen laufen muss und morgen kriegst Du von einem Windowsluser angerufen: "das Programm geht nicht." - "Was geht nicht?" - "Stürzt ab." - "Was hast Du gemacht?" - "Nix!" ... etc.pp.
Und das alles nur, weil irgendwer nicht begriffen hatte, dass x und y keine optionalen Parameter sind und der selbe irgendwer keine Möglichkeit gefunden hat diesen Code gründlich zu testen.
Wenigstens irgendwo in einem Log muss bei sowas noch ein Kommentar stehen. "Segmentation fault." ermöglicht keine Diagnose.
Kurz: vertraue keinem Pointer - er wird Dich beissen.
Die korrekte Variante ist:
a) graceful ignorance: void MyWindow::getCoordinates(int*x,int*y) { if(x)*x=meinX(); if(y)*y=meinY(); }
oder wenn es eine kritische Funktion ist b) graceful failure: void MyWindow::repaintFromX(X11Connection*x11) { if(x11==0){ fprintf(stderr,"Fatal Error: it seems I lost the connection to X11. Halting application.\n"); exit(1); }else{ //... } }
Fast immer ist a) die richtige Variante. Das Programm einfach gegen die Speicherwand laufen zu lassen ist nie die richtige Variante.
Konrad