Methode multipliziern
-
Hallo zusammen,
ich möchte im Moment eine einfache Rechnung darstellen. Dabei handelt es sich um eine Multiplikation. Die einzelne Faktoren sollen aber nicht nur Zahlen, sondern auch Funktionen sein, die ich in einer Methode beschrieben habe.Beispiel:
void __fastcall TClass::Funktion (int A, int B) { A*B; } //----------------------------------------------- void __fastcall TClass::Rechne (void) { Funktion(10,100) * 50; }
Leider ist das wohl nicht zuläsig, da folgende Fehlermeldung kommt:
[C++ Fehler] Unit1.cpp(70): E2109 Kein zulässiger TypWie schreibt man soetwas im Quelltext?
Vielen Dank für die Hilfe
lg, freakC++PS. Sorry für den blöden Titel
-
Hallo
Deine "Funktion" braucht noch den Rückgabetyp (auch in der Deklaration im Header ändern)
int __fastcall TClass::Funktion (int A, int B) { return A*B; } //----------------------------------------------- void __fastcall TClass::Rechne (void) { Funktion(10,100) * 50; }
bis bald
akari
-
Vielen Dank akari für deine schnelle Antwort.
Für Verständlichkeit (ok, es wird eigentlich nich verständlicher) habe ich mal die Funktion aufgedöselt und die Variabeln gleich so hingeschrieben. Ich sage schonmal im Voraus "Sorry für die Lange Formel":
void __fastcall TCelirity::VRadial (int i) { int R = 4; Ry = pow (R,2) + pow(i,2); Vrad = CGM / pow(12,0.5) * (Ry / i) - CGM / pow(i,0.5) * (R/i); } //--------------------------------------------------------------------------- void __fastcall TCelirity::Table3 (TStringGrid *grid) { for (int i = 1; i < 15; i++) { VRadial (i); grid->Cells[0][0] = "--------------------"; grid->Cells[1][0] = "Wert für Vrad"; grid->Cells[0][i] = "y = " + FloatToStr (i); grid->Cells[1][i] = FloatToStrF (Z[i], ffNumber, 8, 2); } }
Leider wird das StringGrid nur mit Nullen gefüllt. Es muss also ein Faktor 0 sein oder irgendetwas anderes falsch sein, jedoch sehe ich keinen Fehler
.
Könnt ihr mir helfen!
Vielen Dank für eure Hilfe, auch wenn es sehr müsahm ist, sich durch die Formel zu arbeiten!!!
lg, freakC++
-
Hallo,
freakC++ schrieb:
Vielen Dank für eure Hilfe, auch wenn es sehr müsahm ist, sich durch die Formel zu arbeiten!!!
das ist nichtmal so schwer - die Rechnerei muss man garnicht verstehen. Du hast akari's Vorschlag noch nicht umgesetzt, da deine Methode "VRadial" immernoch kein Berechnungsergebnis an die aufrufende Methode "Table3" zurückgibt (zumindest nicht im von Dir zuletzt geposteten Codebeispiel). Stichwort: Rückgabewert einer Methode bzw. Funktion. Schau' dir akari's Beispiel nochmal an... Wenn du Fragen dazu hast, stell' sie!
Kleiner Tip: das Schlüsselwort return ist entscheidend!
MfG
-
doch, doch
das hab ich schon gemacht, aber in meinem neu geposteten Beispiel ist dies nicht mehr zu sehen, da ich ja jetzt die Funtktion "ausgeschrieben" habe. Das mit return etc. hab ich verstanden.Hat jemand eine Idee, warum überall 0 herauskommt?
Vielen Dank
lg, freakC++
-
Hallo
Uns hier ist nicht ersichtlich wie durch den Aufruf von VRadial das Ergebnis in Z[i] kommen soll.
Ich hoffe du siehst nun ein das es meistens eine schlechte Idee ist globale Variablen zu verwenden, und das es stattdessen besser ist mit Rückgaben zu arbeiten. Und da hat Kolumbus schon recht, das hast du in dem Code nicht geändert.bis bald
akari
-
akari schrieb:
Uns hier ist nicht ersichtlich wie durch den Aufruf von VRadial das Ergebnis in Z[i] kommen soll. ...
Oder anders: In "VRadial" berechnest du ein Ergebnis, welches dort in der (globalen?) Variable Vrad gespeichert wird:
void __fastcall TCelirity::VRadial (int i) { int R = 4; Ry = pow (R,2) + pow(i,2); Vrad = CGM / pow(12,0.5) * (Ry / i) - CGM / pow(i,0.5) * (R/i); // <= hier wird das Ergebnis in Vrad gespeichert }
In "Table3" gibst du jedoch einen Wert Z[i] an, der in die Tabelle geschrieben werden soll:
void __fastcall TCelirity::Table3 (TStringGrid *grid) { for (int i = 1; i < 15; i++) { VRadial (i); grid->Cells[0][0] = "--------------------"; grid->Cells[1][0] = "Wert für Vrad"; grid->Cells[0][i] = "y = " + FloatToStr (i); grid->Cells[1][i] = FloatToStrF (Z[i], ffNumber, 8, 2); // <= hier wird Z[i] in die Tabelle eingetragen } }
Merkste was?
Tip nebenbei: Den Tabellenkopf brauchst du doch nicht bei jedem Durchlauf der for-Schleife neu erstellen, deshalb mach' es doch ausserhalb der Schleife (vorher):
void __fastcall TCelirity::Table3 (TStringGrid *grid) { grid->Cells[0][0] = "--------------------"; grid->Cells[1][0] = "Wert für Vrad"; for (int i = 1; i < 15; i++) { VRadial(i); grid->Cells[0][i] = "y = " + FloatToStr (i); grid->Cells[1][i] = FloatToStrF (Z[i], ffNumber, 8, 2); // <= hier wird Z[i] in die Tabelle eingetragen } }
So, und zu guter Letzt ein Beispiel, in dem akari's Vorschlag umgesetzt wird:
float __fastcall TCelirity::VRadial(int i) { int R = 4; Ry = pow (R,2) + pow(i,2); float Vrad = CGM / pow(12,0.5) * (Ry / i) - CGM / pow(i,0.5) * (R/i); return Vrad; } //--------------------------------------------------------------------------- void __fastcall TCelirity::Table3 (TStringGrid *grid) { grid->Cells[0][0] = "--------------------"; grid->Cells[1][0] = "Wert für Vrad:"; for (int i = 1; i < 15; i++) { grid->Cells[0][i] = "y = " + FloatToStr(i); grid->Cells[1][i] = FloatToStrF(VRadial(i), ffNumber, 8, 2); } }
Damit kannst du die globale Variable Vrad einsparen - sie wird ja nur in VRadial benötigt... Wenn du das so machst, vergiss nicht den Methoden-Prototypen von VRadial im Header anzupassen.
MfG