Seite 3 von 4

Verfasst: 20.05.2005 09:31
von MARTIN
>funzt weder mit dem.....
Das habe ich überlesen.
Was funktioniert an dem Code nicht ?
Es ist doch wirklich idiotensicher.

Verfasst: 20.05.2005 11:47
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:

Verfasst: 20.05.2005 11:51
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.

Verfasst: 20.05.2005 12:15
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... ;)

Verfasst: 20.05.2005 12:25
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...

Verfasst: 20.05.2005 12:57
von traumatic
Danilo hat geschrieben:Du hast jetzt aber das #include vergessen... ;)
lol :lol:

Verfasst: 20.05.2005 13:19
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

Verfasst: 20.05.2005 15:03
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.

Verfasst: 20.05.2005 20:49
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.

Verfasst: 21.05.2005 08:45
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: