dllfreak2001 hat geschrieben:Das passiert eben nicht,
wenn man den Kramm ohn &wert kompiliert(zumindest in VC++6.0)
bekommt man weder eine Fehlermeldung noch eine Warnung. Sogar
der VC++-eigene Debuger wird so instabil das er abschmiert.
Für mich ist sowas klar ein Fehler in VC++.
Schaue Dir doch mal die Deklaration von scanf in VC++6 an
bevor Du meinst es ist ein Fehler.
Bei sowas geht es nicht um Meinungen, sondern um Fakten.
Fakt ist das scanf im Header STDIO.h bei VC++6 folgendermassen
deklariert ist:
Die 3 Punkte '...' stehen hier für "alles", von dem Typ her und
von der Argumentenanzahl her.
Damit kann man der Funktion scanf alles übergeben, und
folgendes funktioniert dann auch:
Code: Alles auswählen
#include <stdio.h>
int main(void) {
float wert;
unsigned long p = (unsigned long)&wert;
scanf("%f", p);
printf("\n%f\n%f\n", wert, *(float*)p);
return 0;
}
Genauso geht es auch mit Pointern:
Code: Alles auswählen
#include <stdio.h>
int main(void) {
float wert;
float *p = &wert;
scanf("%f", p);
printf("\n%f\n%f\n", wert, *p);
return 0;
}
Da man scanf so alles mögliche übergeben kann, braucht es
auch keine Warnung zu geben, da durch das '...' alles richtig ist.
Wie Du siehst habe ich hier auch "int main()" verwendet.
Keine Ahnung warum das bei Dir nicht gehen soll...
Das Du den Adressoperator '&' vergessen hast ist kein Beinbruch,
schließlich bist Du noch am lernen!
Scheint ein beliebter und bekannter Anfängerfehler zu sein,
genauso wie auch "=" statt "==" für Vergleiche zu nehmen.
Aus Fehlern lernt man nunmal am besten...
Der gleiche Fehler könnte so ähnlich auch einem PB-Anfänger
passieren wenn er den Adressoperator '@' vergißt:
Dieser Code crasht bei PureBasic genauso. Dabei wollte
der User eigentlich etwas anderes erreichen:
Das ist dazu da um ein Float in einer Long-Variablen zu speichern
und funktioniert so auch richtig, da der Adressoperator nun vorhanden ist.
Kopf hoch, wird schon werden...
