🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: de.comp.lang.c++
6 messages
6 total messages Started by Frank Kulok Tue, 12 Sep 1995 11:16
MaxonC++light
#412
Author: Frank Kulok
Date: Tue, 12 Sep 1995 11:16
28 lines
1468 bytes
Hallo,
ich hab hier ein kleines Problem, solange ich die beiden
SCANF-Routinen nicht mit einbaue läuft das Programm
einwandfrei. Baue ich sie mit ein und lasse sie mit dem
MaxonC++light Compiler V3.00.00, 31.10.94 übersetzen
und starten, steigt der Rechner nach der Eingabe der
ersten scanf-funktion aus. Wo mache ich den Fehler?

#include <stdio.h>
#include <math.h>

void main()
{
        //Variablendeklaration
        float sz=600,tt=430,svm;

        // Eingabe
        printf ("Geben Sie den Wert für die Zugspannung in N/mm^2 ein: ");
        // scanf ("%f", &sz);
        printf ("und den Wert für die Verdrehspannung in N/mm^2:       ");
        // scanf("%f", &tt);
        
        // Verarbeitung
        svm=sqrt(pow(sz,2)+3*pow(tt,2));
        
        // Ausgabe
        printf("Die sich daraus ergebende Vergleichsspannung ist: %10.3f N/mm^2",svm);
}
Re: MaxonC++light
#421
Author: Ralf W. Stephan
Date: Mon, 18 Sep 1995 12:16
10 lines
682 bytes
Frank Kulok writes:
> Wo mache ich den Fehler?

Compilerbug (traue nie einer Version *0)?

Mit g++ funktioniert es jedenfalls.  Tip: Verwende statt scanf lieber
fscanf(stdio,...) oder, schließlich hast Du ja C++, Streams.


ralf
Re: MaxonC++light
#456
Author: Karl-Heinz Krause
Date: Thu, 21 Sep 1995 16:10
37 lines
1711 bytes
Frank@konnex.bergisch-land.sub.de (Frank Kulok) schrieb:

>Hallo,
>ich hab hier ein kleines Problem, solange ich die beiden
>SCANF-Routinen nicht mit einbaue läuft das Programm
>einwandfrei. Baue ich sie mit ein und lasse sie mit dem
>MaxonC++light Compiler V3.00.00, 31.10.94 übersetzen
>und starten, steigt der Rechner nach der Eingabe der
>ersten scanf-funktion aus. Wo mache ich den Fehler?

>#include <stdio.h>
>#include <math.h>

>void main()
>{
>        float sz, tt, svm;

>        printf ("Geben Sie den Wert für die Zugspannung in N/mm^2 ein: ");
>        scanf ("%f", &sz);

>        printf ("und den Wert für die Verdrehspannung in N/mm^2:       ");
>        scanf("%f", &tt);
>        
>        // usw.
>}

Es handelt sich nicht um einen Compiler-Bug, sondern um einen
Programmfehler. Bei einem Formatelement "%f" muß der entspechende
Parameter den Typ double haben (und nicht float). Es reicht also, die
erste Zeile von "main" zu ersetzen durch

    double sz, tt, sym;

Daß es bei GNU funktioniert, liegt daran, daß der GNU-Compiler die
Formatstrings überprüft, was aber nicht normal ist bei C++.

-- Karl-Heinz
Re: MaxonC++light
#467
Author: Arno Eigenwillig
Date: Sat, 23 Sep 1995 09:59
27 lines
1566 bytes
Hallo!

Frank@konnex.bergisch-land.sub.de (Frank Kulok) schrieb am 12.09.1995
in <wVZZZMD0aez2@holly.konnex.bergisch-land.sub.de>:

> ich hab hier ein kleines Problem, solange ich die beiden
> SCANF-Routinen nicht mit einbaue läuft das Programm
> einwandfrei. Baue ich sie mit ein

> steigt der Rechner nach der Eingabe der
> ersten scanf-funktion aus.

>         // scanf ("%f", &sz);
>         // scanf("%f", &tt);

Was genau heißt "steigt aus"? Mit SAS/C kompiliert und obigen scanf()s
drin läuft das Programm bei mir problemlos. Ein häufiges Problem mit
scanf() ist aber, daß es auf Fehleingaben etc. recht bockig reagiert.
Die Kombination fgets()/sscanf() ist in 99% aller Fälle vorzuziehen.

-- __
__/// Arno Eigenwillig //   <arno@yaps.rhein.de>   \\ PGP key available
\XX/   V+49-2225-5870 // <ARNO@BIGBEN.dssd.sub.org> \\  <Arnooo @ IRC>

Those who can, do.
Those who can't, teach.
Those who can't teach, teach gym.
Re: MaxonC++light
#470
Author: Karl-Heinz Krause
Date: Sun, 24 Sep 1995 08:52
57 lines
2388 bytes
Am 21. Sept. schrieb ich folgenden Unsinn:

>Frank@konnex.bergisch-land.sub.de (Frank Kulok) schrieb:
>
>>Hallo,
>>ich hab hier ein kleines Problem, solange ich die beiden
>>SCANF-Routinen nicht mit einbaue läuft das Programm
>>einwandfrei. Baue ich sie mit ein und lasse sie mit dem
>>MaxonC++light Compiler V3.00.00, 31.10.94 übersetzen
>>und starten, steigt der Rechner nach der Eingabe der
>>ersten scanf-funktion aus. Wo mache ich den Fehler?
>
>>#include <stdio.h>
>>#include <math.h>
>
>>void main()
>>{
>>        float sz, tt, svm;
>
>>        printf ("Geben Sie den Wert für die Zugspannung in N/mm^2 ein: ");
>>        scanf ("%f", &sz);
>
>>        printf ("und den Wert für die Verdrehspannung in N/mm^2:       ");
>>        scanf("%f", &tt);
>>        
>>        // usw.
>>}
>
>Es handelt sich nicht um einen Compiler-Bug, sondern um einen
>Programmfehler. Bei einem Formatelement "%f" muß der entspechende
>Parameter den Typ double haben (und nicht float). Es reicht also, die
>erste Zeile von "main" zu ersetzen durch
>
>    double sz, tt, sym;
>
>Daß es bei GNU funktioniert, liegt daran, daß der GNU-Compiler die
>Formatstrings überprüft, was aber nicht normal ist bei C++.
>

Ich entschuldige mich hiermit dafür. Selbstverständlich wird bei "%f" 
float und bei "%lf" double verwendet. Ich habe hier scanf mit printf 
verwechselt. Bei printf wird ein float-Argument automatisch zu double 
erweitert, so daß es egal ist, ob man "%f" oder "%lf" schreibt.

Falls es sich um einen DOS- (oder WIN16-)Compiler handelt, so könnte der 
Fehler daran liegen, daß die falsche Zeigergröße angenommen wird. 
Versuche einmal

    scanf("%f", (float near*)&sz);

oder

    scanf("%f", (float far*)&sz);

je nach Speichermodell.

mfg. Karl-Heinz
Re: MaxonC++light
#473
Author: Bernd Rothert
Date: Tue, 26 Sep 1995 11:25
34 lines
1735 bytes
>Programmfehler. Bei einem Formatelement "%f" muß der entspechende
>Parameter den Typ double haben (und nicht float). Es reicht also, die

"%f" ist fuer die scan- und print-Funktionen unterschiedlich definiert:
	scanf erwartet fuer "%f" einen Zeiger auf float
	printf erwartet fuer "%f" einen double-Wert

Der Unterschied erklaert sich aus der Behandlung der Ellipse, die zur 
Deklaration der variablen Parameter verwendet wird: Ist fuer einen
aktuellen Parameter kein formaler Parameter definiert (hier alle Parameter
hinter dem Formatstring), so werden implizite Typumwandlungen erzeugt, die
aus float double machen. 

Die print-Funktionen erhalten also nur double-Werte. Deshalb reicht "%f" fuer 
float und double.

Die scan-Funktionen erhalten Zeiger auf die zu fuellenden Puffer. Dabei muss 
zwischen "%f" (float) und "%lf" (double) unterschieden werden.

Das Programm ist also korrekt - der Compiler hat (mindestens) einen Bug.

Gruss,
Bernd
	

---------------------------------------------------------------------------
Bernd Rothert
Institute of Robotics Research
University of Dortmund
44221 Dortmund, Germany

e-mail:     rothert@damon.irf.uni-dortmund.de
---------------------------------------------------------------------------
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads