C Merkwürdiger Fehler beim scanf - Visual Studios

Cinematic

Lt. Commander
Registriert
Dez. 2010
Beiträge
1.155
Habe hier nen üblen Fehler, der direkt erscheint wenn ich den ersten Wert für x_min eingebe.
Habe dort "5" und "8.82" etc. eingegeben, und diese Werte gehören definitv zu double, hier der Quelltext:

http://pastebin.com/DLuH0wjF

Und hier die Fehlermeldung:

Unbehandelte Ausnahme bei 0x5cf1f52c (msvcr100d.dll) in P6A2.exe: 0xC0000005: Zugriffsverletzung beim Schreiben an Position 0x00000000.

Ich glaube der Fehler entspringt nicht von einem Fehler im Quellcode, sondern weil ich irgendwas falsch gemacht hab in der Programmierumgebung Visual Studios.

Soweit ich weiß darf man ja nicht im Quellcode rumtippen während das Debugging noch läuft und falls man das doch mal getan hat und es zu Problemen kommt kann man irgendetwas tun, um diese zu beheben,
habe aber vergessen was ?
 
Du musst scanf einen Pointer übergeben, also z.B.: scanf("%f", &x_min);
 
Wow wie doof bin ich eigentlich... ich habe schon 200 mal scanf benutzt und jetzt auf einmal vergess ich das & ... :freak:

Problem gelöst, danke.
Ergänzung ()

Hmm, das Programm läuft zwar jetzt, aber bei der for-Schleife gibt er 10000 mal 0.00 aus.
Wie kann das sein ?
 
auf welchen Formeln basiert die Rechnung überhaupt?

Eventuell Punkt-Vor-Strich missachtet hier:
flaecheninhalt=x_max-x_true*y_min+y_true;
 
Bei der flaecheninhaltsformel hab ich nun schon Klammern gesetzt, hat aber nicht geholfen.

Was ist %lf ?

Ich muss grad eben nochmal alles selber überdenken, was ich da gestern zusammenprogrammiert habe (das Programm ist auch noch nicht fertig...)

Das hier ist die Aufgabe:


ibvg8UjtX9WejX.PNG
 
Du verwendest im scanf %f, das liest einen float, Du hast aber einen Pointer auf einen double.
Daher nehme ich an das in Deinen Variablen schonmal gar nicht steht was Du denkst...
mit %lf wird ein double gelesen.
 
Wäre auch schön, wenn du zeigst, was du in Klammern setzst ... ich hab keine Glaskugel da, und die anderen vermutlich auch nicht.

also bei der Formel müsste es sicher
flaecheninhalt=(x_max-x_true)*(y_min+y_true);
sein

anders ergibt es keinen Sinn.
 
Zuletzt bearbeitet:
Ich dachte %f wäre das Formatzeichen für float und double.

Double gehört doch quasi zu float ? Ich dachte das wäre der gleiche Datentyp, nur dass double einen größeren Wertebereich hat (ich glaube double 8-bit und float 4-bit).
Ergänzung ()

1668mib schrieb:
Wäre auch schön, wenn du zeigst, was du in Klammern setzst ... ich hab keine Glaskugel da, und die anderen vermutlich auch nicht.

also bei der Formel müsste es sicher
flaecheninhalt=(x_max-x_true)*(y_min+y_true);
sein

anders ergibt es keinen Sinn.

Ja, so hab ich das natürlich auch in Klammern gesetzt. Wie du selber schon sagst, alles andere würde keinen Sinn machen.
 
Ja natuerlich sind double und float aehnlich, aber float belegt normal 4 Byte im Speicher und double 8.
Da gibt es dann schon einen kleinen Unterschied wenn man mit einem Pointer drinne rumstochert...
 
Gib doch einfach die eingegeben Zahlen direkt nochmal aus... dann siehst du doch schon mal mehr...
 
Okay, mit %lf gibt er nun schonmal Werte aus. Ich überprüfe mal eben, ob das auch die richtigen Werte sind.
Ergänzung ()

Ok, müsste so stimmen. Soweit ich nun programmiert habe, habe ich ja nun eine Liste von 10000 Werten. Jetzt muss ich aus diesen 10000 Werten nun noch den größten herausfiltern.

Ich hab mir überlegt, dass am Anfang der for-Schleife die Werte ja immer größer werden bis zu einem Punkt, wo sie dann immer kleiner werden (Wendepunkt halt).

Nun könnte ich ja beim Durchlauf der for-Schleife ein if-Konstrukt einbauen, dass überprüft ob der Wert vom flaecheninhalt des aktuellen Schleifendurchlaufs kleiner ist, als der des vorherigen Schleifendurchlaufs.
Denn das trifft ja nach dem Wendepunkt immer zu und auf den ersten Wert auf den das zutrifft wäre dann ja das Maximum.

Nur ich weiß grad nicht recht, wie ich an den Wert des vorherigen Schleifendurchlaufs rankomme ?

Oder habt ihr ne bessere Lösung, um das Maximum herauszufiltern ?
 
Ich nehme mal an das du die Werte in einem Array Speicherst?

dann könntest du das so machen:

int i = 0;
int val = 0;

for (i = 0; i <= sizeof(array); i++)
{
if (val < array)
val = array;
}

Er läuft dir zwar jedes mal durch alle werte durch was also nicht die schnellste lösung ist aber du erwischt immer den höchsten wert.
(hoffe ich hab mich nirgendwo vertippt c ist schon wieder ne weile her)
 
@DeusExMachina: Nein, da wird nichts in einem Array abgelegt... ist ja auch nicht notwendig.

einfaches Prinzip:
höchsterWert = 0

schleifenbeginn
wenn aktuellerWert größer als höchsterWert, dann setze höchsterWert auf aktuellerWert...
schleifenende
 
Da die Strecke a immer feiner unterteilt wird kann der Wert nur ansteigen, tut er das nicht kann man die Schleife abbrechen.
Code:
double x_true_last = 0, y_true_last = 0, maxinhalt = 0;
for (int index = 1; index <= 10000; index++) {
  x_true = a / index;
  y_true = tan(alpha) * x_true;
  flaecheninhalt = (x_max - x_true) * (y_min + y_true);
  if (flaecheninhalt > maxinhalt) {
    maxinhalt = flaecheninhalt;
    x_true_last = x_true;
    y_true_last = y_true;
  }
  else
    break;
}
printf("%.2f m² (%.2f m x %.2f m)\n", flaecheninhalt, x_true_last, y_true_last);
Bin nicht sicher ob die printf das so ausgeben kann ..

Die maximalfläche ist dann meist schon bei index = 4 gefunden, kommt nur darauf an wieviel Nachkommastellen die Werte haben.
Ach ja, index sollte nicht bei 0 anfangen .. /0 = unendlich. :D
 
Zurück
Oben