CPP warum stürtzt das ab?

Fragen zu allen anderen Programmiersprachen.
MARTIN
Beiträge: 454
Registriert: 08.09.2004 14:03
Wohnort: Kiel

Beitrag von MARTIN »

>funzt weder mit dem.....
Das habe ich überlesen.
Was funktioniert an dem Code nicht ?
Es ist doch wirklich idiotensicher.
Amilo 1667|Suse Linux 10.1_64bit/WinXP |PB 4.00/3.94
Benutzeravatar
dllfreak2001
Beiträge: 2925
Registriert: 07.09.2004 23:44
Wohnort: Bayern

Beitrag von dllfreak2001 »

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.
:shock:
I´a dllfreak2001
traumatic
Beiträge: 478
Registriert: 27.11.2004 15:42

Beitrag von traumatic »

dllfreak2001 hat geschrieben:Ich wollte eine Info von euch,
warum dieser Kramm denn Abstürze verursacht [...]
Und schon wieder raffe ich nix, aber auch gar nix...
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.
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Beitrag von Danilo »

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... ;)
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Beitrag von Danilo »

@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...
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
traumatic
Beiträge: 478
Registriert: 27.11.2004 15:42

Beitrag von traumatic »

Danilo hat geschrieben:Du hast jetzt aber das #include vergessen... ;)
lol :lol:
Benutzeravatar
Rubiko
Beiträge: 943
Registriert: 25.02.2005 19:43
Computerausstattung: Intel i7 2600k
8GB Ram
GeForce GTX 560 Ti
Wohnort: Schwabach

Beitrag von Rubiko »

moment... nach der eingabe "stürzt es ab"?
hält der MF compiler die konsole vom schließen auf oder nicht? (ich weiß nimmer... ^^)
versuch mal getchar(); am ende falls sich die konsole zu schnell schließt
Ich wollte die Welt verändern, doch Gott gab mir nicht den Quelltext.
MARTIN
Beiträge: 454
Registriert: 08.09.2004 14:03
Wohnort: Kiel

Beitrag von MARTIN »

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.
Amilo 1667|Suse Linux 10.1_64bit/WinXP |PB 4.00/3.94
Benutzeravatar
dllfreak2001
Beiträge: 2925
Registriert: 07.09.2004 23:44
Wohnort: Bayern

Beitrag von dllfreak2001 »

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.
I´a dllfreak2001
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Beitrag von Danilo »

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:

Code: Alles auswählen

_CRTIMP int __cdecl scanf(const char *, ...);
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:

Code: Alles auswählen

wert.f = 123.456
x = PeekL(wert)
Debug x
Dieser Code crasht bei PureBasic genauso. Dabei wollte
der User eigentlich etwas anderes erreichen:

Code: Alles auswählen

wert.f = 123.456
x = PeekL(@wert)
Debug x
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... :allright:
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Antworten