CPP warum stürtzt das ab?
- dllfreak2001
- Beiträge: 2925
- Registriert: 07.09.2004 23:44
- Wohnort: Bayern
Also mal STOP hier. Ich wollte eine Info von euch,
warum dieser Kramm denn Abstürze verursacht und nicht eine
Haar-kleine Erläuterung welche Unterschiede es in C und C++
gibt. Ich nutze VC++6.0 von Microdoof dort ist ein C und ein C++-Compiler integriert. Das Programm lasse ich aber trotzdem vom C++-
Compiler compilieren. Da ich aber die stdio.h inkludiert habe kann ich auch die C-Befehle nutzen.
Zudem ich bin mir hundertprozentig sicher das C++ auf C aufbaut, von daher sind das nicht vollkommen unterschiedliche Programmiersprachen.

warum dieser Kramm denn Abstürze verursacht und nicht eine
Haar-kleine Erläuterung welche Unterschiede es in C und C++
gibt. Ich nutze VC++6.0 von Microdoof dort ist ein C und ein C++-Compiler integriert. Das Programm lasse ich aber trotzdem vom C++-
Compiler compilieren. Da ich aber die stdio.h inkludiert habe kann ich auch die C-Befehle nutzen.

Zudem ich bin mir hundertprozentig sicher das C++ auf C aufbaut, von daher sind das nicht vollkommen unterschiedliche Programmiersprachen.

I´a dllfreak2001
Und schon wieder raffe ich nix, aber auch gar nix...dllfreak2001 hat geschrieben:Ich wollte eine Info von euch,
warum dieser Kramm denn Abstürze verursacht [...]
traumatic hat geschrieben: Es ging doch einfach nur darum, dass im Original-Code versucht wurde, den
ermittelten Wert in "wert" abzulegen, anstatt in "&wert".
Das hätte in PureBasic auch nicht funktioniert.
traumatic hat geschrieben:Code: Alles auswählen
void main (void) { float wert = 0.0; scanf ("%f", &wert); printf ("%f", wert); }

Der Code funktioniert so 1000%ig und da crashed auch nichts.
Du hast jetzt aber das #include vergessen...traumatic hat geschrieben:Code: Alles auswählen
void main (void) { float wert = 0.0; scanf ("%f", &wert); printf ("%f", wert); }
Der Code funktioniert so 1000%ig und da crashed auch nichts.

cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
@dllfreak2001:
Vielleicht möchtest Du Dir auch mal diesen Beitrag durchlesen:
5. Formatierte Eingabe mit scanf()
und
5.1 Der Adressoperator "&"
Ist aus dem eBook C von A bis Z.
Da Du noch Einsteiger bist sollte Dir dieses Buch weiterhelfen...
Vielleicht möchtest Du Dir auch mal diesen Beitrag durchlesen:
5. Formatierte Eingabe mit scanf()
und
5.1 Der Adressoperator "&"
Ist aus dem eBook C von A bis Z.
Da Du noch Einsteiger bist sollte Dir dieses Buch weiterhelfen...
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Klar, das es einen Absturz verursacht.
scanf() erwartet eine Adresse einer Speicherstelle.
Es muss also ein Zeiger auf "wert" übergeben werden, und nicht die Variable "wert" selbst weil sie keine gültige (für dein Program) Speicher-Adresse beinhaltet.
Wenn du nur "wert" anstatt "&wert" übergibst müsstest du mindestens eine Warnung vom Compiler bekommen.
scanf() erwartet eine Adresse einer Speicherstelle.
Es muss also ein Zeiger auf "wert" übergeben werden, und nicht die Variable "wert" selbst weil sie keine gültige (für dein Program) Speicher-Adresse beinhaltet.
Wenn du nur "wert" anstatt "&wert" übergibst müsstest du mindestens eine Warnung vom Compiler bekommen.
Amilo 1667|Suse Linux 10.1_64bit/WinXP |PB 4.00/3.94
- dllfreak2001
- Beiträge: 2925
- Registriert: 07.09.2004 23:44
- Wohnort: Bayern
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++.
So jetzt aber, thx für die Info.
Ich programmiere nur in c/c++ weil ich das für mein Ingenieur-Studium brauche, aber sonst nutze ich viel lieber in PB. C/C++ ist mir einfach zu doof.
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++.
So jetzt aber, thx für die Info.
Ich programmiere nur in c/c++ weil ich das für mein Ingenieur-Studium brauche, aber sonst nutze ich viel lieber in PB. C/C++ ist mir einfach zu doof.
I´a dllfreak2001
Schaue Dir doch mal die Deklaration von scanf in VC++6 andllfreak2001 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++.
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:
Code: Alles auswählen
_CRTIMP int __cdecl scanf(const char *, ...);
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;
}
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;
}
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:
Code: Alles auswählen
wert.f = 123.456
x = PeekL(wert)
Debug x
der User eigentlich etwas anderes erreichen:
Code: Alles auswählen
wert.f = 123.456
x = PeekL(@wert)
Debug x
und funktioniert so auch richtig, da der Adressoperator nun vorhanden ist.
Kopf hoch, wird schon werden...

cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck