Computer Hardware Forum - TweakPC

Computer Hardware Forum - TweakPC (https://www.tweakpc.de/forum/)
-   Programmiersprachen (https://www.tweakpc.de/forum/programmiersprachen/)
-   -   [C] Problem mit einem Array (https://www.tweakpc.de/forum/programmiersprachen/66332-c-problem-mit-einem-array.html)

mat1 20.12.2008 19:52

[C] Problem mit einem Array
 
Einen wunderschönen guten Abend TweakPC-Gemeinde,
ich bin gerade dabei C zu lernen. Dazu habe ich mir zu Beginn die Aufgabe gestellt, ein Programm zu schreiben, welches (kommandozeilenbeschränkt) die Lösung einer quadratischen Gleichung errechnen kann.

Hier der Code:
[code]
// Titel: Quad
// Beschreibung: Programm zum Loesen von quadratischen Gleichungen (im Breich der reelen Zahlen)
// Autor: ***

// Einbinden der benoetigten Bibliotheken
#include "stdafx.h"
#include "math.h"


// Prototypen
struct array { double wert[2]; };
struct array quad(double, double, double);


/*
/ Funktionsname: main
/
/ Autor: ***
/ Datum: 20. Dezember 08
/
*/

int main()
{
double a, b, c; // Koeffizienten der quad Gleichung
int i;
struct array lsg;

// Willkommen
printf("Willkommen bei quad. \n");
printf("Mit diesem Programm koennen Sie unkompliziert quadratische Gleichungen loesen. \n");

//Eingabe quad Gleichung
printf("Bitte geben Sie die quadratische Gleichung in der Form ax^2+bx+c ein. \n");
printf("a: ");
scanf_s("%f", &a);
printf("b: ");
scanf_s("%f", &b);
printf("c: ");
scanf_s("%f", &c);
system("PAUSE");

// Aufruf Fkt. quad()
lsg = quad(a, b, c);

printf("Die Loesung lautet: \n");

// Ausgabe der einzelnen Werte des Arrays 'Lsg' aus der Fkt. quad()
for(i=1; i <= sizeof(lsg); i++)
{
printf("\t x%i = \t %d \n",i,lsg.wert[i]);
}
system("PAUSE");
}


/*
/ Funktionsname: quad
/
/ erwartete Parameter:
/ a, b, c double
/ Beschreibung:
/ Funktion zur Berechnung der Loesungen einer quadratischen Gleichung im Bereich der reelen Zahlen
/
/ Autor: ***
/ Datum: 20. Dezember 08
/
*/

struct array quad(a, b, c)
{
double dis; // Diskrimminante
struct array lsg; // Lsg-Array

dis = pow((b/a)/2,2) - (c/a);

if(dis > 0)
{
lsg.wert[0] = (-(b/a)/2) + sqrt(dis);
lsg.wert[1] = (-(b/a)/2) - sqrt(dis);
return lsg;
} else {
printf("Die Loesung der quadratischen Gleichung liegt nicht im Bereich der reelen Zahlen vor. \n");
system("PAUSE");
}
}[/code]
Ich arbeite mit dem Visual Studio 08. Kompiliert man den Code besteht zunächst kein Problem.
Versucht man aber beispielweise die Lösung des Polynoms 2x^2+5x+3 zu errechnen (dessen Lösung x1= -1 und x2=-1,5 wäre), kommt man aus den Fehlern nicht mehr hinaus :?

Nach der Eingabe der Koeffizienten (2, 5, 3) und deren Bestätigung erscheint folgende Meldung:
[quote]Unbehandelte Ausnahme bei 0x002639a0 in quad.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000000.[/quote]Visual Studio zeigt außerdem in seinem Debuggin Fenster folgende Werte für a, b und c an: -9.2559604377396321e+061
Und das obwohl man 2, 5 und 3 eingegeben hat...

lsg.wert[0] = -9.2559631349317831e+061
lsg.wert[1] = -9.2559631349317831e+061

Also eigentlich alles falsch?! :iosys:


Wo liegt mein Fehler? Ich spiele hier schon die ganze Zeit herum, komme aber zu keinem logischem Ergebnis.


Vielen Dank schon im Voraus.

Gruß mat1

redfalcon 20.12.2008 21:05

AW: [C] Problem mit einem Array
 
Mit C würde [U]ich[/U] nicht mit dem Visual Studio anfangen, ist für den Anfang Overkill. Ich würde lieber devcpp oder so nehmen.
Außerdem finde ich das mit dem struct etwas strange. Gehst du nach einem Tutorial oder so vor? Deine pq-Formel find ich auch etwas komisch: -((b/a)/2), hä?

Hab dein Programm mal etwas umgeschrieben und mMn vereinfacht:

[url=http://nopaste.ch/846651334384428.html]846651334384428 - NoPaste - Paste it here[/url]

mat1 21.12.2008 09:54

AW: [C] Problem mit einem Array
 
Hi,
danke schonmal für deine Antwort.
Ich habe mit devcpp angefangen, muss aber sagen, dass dieses Programm nicht wirklich hilfreich ist, denn Fehlermeldungen wie "[Error 1]" sagen mir nicht wirklich etwas und eine Hilfedatei gibt es nicht. Daher Visual Studio - damit komme ich bestens zurecht :).

Ich habe kein Tutorial als Vorlage - ich mache das extra so, weil ich etwas lernen will.

Zu meiner Formel: Die allseits bekannte Lösungsformel für quadratische Gleichungen (x1/2 = -p/2 +- sqrt((p/2)^2-q) )funktioniert nur wenn die Funktion in Normalform (ax^2+bx+c -> a=1 => x^2+px+q) vorliegt. Um diese Normalform zu erreichen dividiere ich die einzelnen Koeffizienten durch a.

Du hast es dir natürlich einfach gemacht indem du die zweite Funktion "quad" entfernt und deren Anweisungen in die Main-Funktion gepackt hast :-P.
Ich aber will genau eine zweite Funktion (einfach weil ich es so will :lol:) - ich möchte es halt ausprobieren.
Du berechnest übrigens deine Diskriminante und deine Lösungen falsch (siehe Lösungsformel oben)

Vielen Dank schonmal :).

Leider weis ich jetzt immer noch nicht wieso meine Werte für a, b und c immer "-9.2559604425286806e+061" sind. :?:


Weis jemand Rat?
Danke schon im Voraus.

Gruß
mat1

redfalcon 21.12.2008 10:18

AW: [C] Problem mit einem Array
 
[quote=mat1;594444]
Leider weis ich jetzt immer noch nicht wieso meine Werte für a, b und c immer \\\\\\"-9.2559604425286806e+061\\\\\\" sind. :?:
[/quote]

Weil du floats einscannen willst, die Werte aber double sind. Probier mal

[php]scanf_s(\\\"%lf\\\", &a);[/php] (die Backslashs wegmachen)

mat1 21.12.2008 10:28

AW: [C] Problem mit einem Array
 
Aber f ist doch das Formatzeichen für double und lf wäre ja long double, oder irre ich mich?!
Nichtsdestotrotz habe ich mal lf bei scanf eingetragen. Nun wird nicht mehr "-9.2559604425286806e+061" für a, b und c angegeben sondern:
a = 0
b = 1073741824
c = 0
lsg.wert[0] = -9.2559631349317831e+061
lsg.wert[1] = -9.2559631349317831e+061

hmm ^^
Ehrlich gesagt verstehe ich nicht, welches Problem der Compiler mit meiner scanf Anweisung hat!?


Gruß
Mat1

redfalcon 21.12.2008 11:21

AW: [C] Problem mit einem Array
 
Mich wundert es überhaupt, dass dein Code compiliert, VS08 schmeisst bei mir schonmal 8 Fehler. Das Problem ist wohl das return von lsg, da werden die Werte nicht mitübergeben. Ich verstehe auch nicht, warum du statt eines struct nicht einfach ein double Array verwendest. Folgender Code compiliert jedenfalls und gibt die richtige Lösung aus, aber wie man das lsg korrekt zurück an die main() übergibt, keine Ahnung.

[url=http://nopaste.ch/86e9d4fafafe9ed.html]86e9d4fafafe9ed - NoPaste - Paste it here[/url]

Außerdem ist dein Code kein Standard-C, weil da einige Visual Studio-only Sachen drin sind (stdafx.h, scanf_s usw), deswegen werden andere Compiler das auch nicht kompilieren.

Edit:
Das printf("%f",dis); in Zeile 74 war nur drin, um zu checken ob die Diskriminante richtig berechnet wird.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:21 Uhr.

Powered by vBulletin® Version 3.8.10 (Deutsch)
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
SEO by vBSEO 3.5.2 ©2010, Crawlability, Inc.