Problem mit Array
-
Hallo zusammen,
so ich habe mich mal schlau gemacht, was die Pointer angehen, doch wäre es sehr schön, wenn ich diese Aufgabe mit meinem aktuellen Wissensstand lösen könnte. Ich arbeite stets mit meinen Büchern und möchte nicht plötzlich irgendwas anderes nutzen (es sei denn das es denn zwingend notwendig ist).Daher wollte ich nochmal fragen, ob man mein "Anfangsquelltext" nicht verbessern könnte, so dass es auch meinem Niveau entspricht (das soll keinerlei Kritik o.ä. sein - im Gegenteil). Wenn die "Pointerlösung" jedoch sehr viel besser ist, dann werde ich natürlich diese nehmen! (wobei ich dazu noch ein paar fragen habe).
Eigentlich geht es ja nur darum ein array zu übergeben, und zwar über den parameter von MinMax.
vielen dank und ich hoffe, dass ihr Verständnis habt (ich werde das hoffentlicha auch alles noch lernen)
lg, freakC++
-
Hallo zusammen,
ich glaube, dass ich mal ein bisschen mehr Quelltext zeigen sollte, damit ihr mir richtig helfen könnt. Ich habe eine Methode, die mittels einer Formel Werte berechnet. Es handelt sich dabei um eine Funktion, da ein Wert zurückgegeben wird. So sieht das aus:float __fastcall TCelirity::Vlight (int i, int RR) { V = (CGM * RR) / pow(pow(RR, 2) + pow(i, 2), 0.75); return V; }
Nun möchte ich durch eine kleine Änderung im Quelltext, dass ein Array erstellt wird, das alle errechneten Werte beinhaltet. Durch eine weitere Methode, die ich MinMax nenne, soll der kleinste Wert errechnet werden. imin ist der x-Wert und xmin ist der y-Wert (Beispiel: (4|12). Diese Methode funktioniert und ist ziemlich simpel. Ich habe das Beispielarray, das aus der vorigen Methode entstanden sein soll, V1 gennant. Dieses habe ich NUR hier global vereinbart. npts repräsentiert die Größe des Arrays (V[npts]).
float __fastcall TCelirity::MinMax (void) { int imin, xminx; xmin=V1[0]; imin=1; for (int i=0; i<npts; i++) { if (V1[i] < xmin) { xmin=V[i]; imin=i+1; } if (i==npts-1) return imin, xmin; } }
Nun muss das Array, das aus der ersten Methode entstanden ist, irgendwie an die Methode MinMax übergeben werden. Hier liegt mein Problem, denn ich weiß nicht wie ich das meistern soll. Mein erster Vorschlag war ja nicht der Brüller, wobei ich auch nicht weiß wie ich Linneas Vorschlag hier verwirklichen kann....
Ich hoffe, dass ihr ich versteht und mir helfen könnt
Vielen Dank dafür
lg, freakC++
-
Hallo zusammen,
so ich habe mich mal schlau gemacht, was die Pointer angehen, doch wäre es sehr schön, wenn ich diese Aufgabe mit meinem aktuellen Wissensstand lösen könnte. Ich arbeite stets mit meinen Büchern und möchte nicht plötzlich irgendwas anderes nutzen (es sei denn das es denn zwingend notwendig ist).Wenn dein aktueller Wissensstand nicht das Wissen über Pointer einschliesst, dann wird es schwierig, da du nur so deiner Funktion den Beginn des Array Feldes bekanntgeben kannst.
-
akari schrieb:
Hallo
Außerdem solltest du statt dem rohen manuell allokiertem C-Array besser einen std::vector benutzen. Siehe C++ Forum und Magazin-Artikel zum Thema STL-Container.
bis bald
akariSehe ich nicht so. Ich habe damals auch erst mit Ansi-C angefangen und habe daher nach und nach gelernt was Pointer sind, was sie bedeuten und was dahinter steckt.
std::vector ist meiner Meinung nach eigentlich ganz gut für Anfänger, weil man in der handhabung eigentlich kaum was versauen kann, aber wenn man nicht weiterforscht gewöhnt man sich an diese einfachen Dinge und lernt niemals was wirklich dahinter steckt.
Ich habe mit malloc, realloc und free angefangen und es hat mir nicht geschadet
-
Hallo,
wenn es zwingend notwendig ist, dann werde ich das sicherlich machen, doch bitte ich noch um ein bisschen Hilfe. Ihr wisst ja nun was ich genau machen möchte. Da würde mir noch ein bisschen Quelltext helfen (obwohl Linnea das schon getan hat)Vielen Dank dafür
lg, freakC++PS: Ich möchte in diesem Fall definitiv erstmal beim Array bleiben, da es ja wirklich nur ein winzig kleines Programm ist!
-
Hallo zusammen,
so ich habe es jetzt glaub ich (fast) geschafft. Jedoch hab ich noch ein Problem. Wenn ich das Array erstelle wird immer 0 ausgegeben. Hier mal der Quelltext:float __fastcall TCelirity::MinMax (float *Array) { int imin, xmin; xmin=Array[0]; imin=1; for (int i=0; i<22; i++) { if (Array[i] < xmin // In MinMax wird einfach der kleinste Wert des Arrays { // herausgesucht xmin=Array[i]; imin=i+1; } if (i==21) ShowMessage (xmin); } return imin,xmin; } //-------------------------------------------------------------------------- void __fastcall TCelirity::Table3 (TStringGrid *grid) { grid->Cells[0][0] = "--------------------"; grid->Cells[1][0] = "Wert Vrad"; float h = h__inkrement (15); int zelle=0; npts = 22; array = new float [npts]; // Array wird erstellt for (float i = 1; i < npts; i+=h) { VRadial (i); zelle++; grid->Cells[0][zelle] = "y = " + FloatToStrF (i, ffNumber, 8, 2); grid->Cells[1][zelle] = FloatToStrF (Vrad, ffNumber, 8, 2); array[zelle] = VRadial(i); // Array wird gefüllt } MinMax(array); // Array wird übergeben }
So, das isdt der Quelltext. Eigentlich sollte jetzt eine MEssage erscheinen mit dem kleinsten WErt des Arrays. Die Message erscheint auch, doch steht da einfach 0. Der Fehler muss beim Erstellen des Arrays liegen, da ich mal folgendes ausprobiert habe, was zeigt, dass MinMax funktioniert:
void __fastcall TCelirity::Table3 (TStringGrid *grid) { // so ich hab mal ein bisschen gekürzt float beispiel[6] = {19,34,56,23,45,32}; // erstelle einfach irgendein Array MinMax(beispiel); //Nun erscheint in der MEssage der richtige Wert }
Der Fehler muss also beim Erstellen des Array geschehen. Könnt ihr mir helfen?
Vielen Dank
lg, freakC++PS. array ist in hier global vereinbart! Nur hier!
-
freakC++ schrieb:
return imin,xmin;
Was willste denn nun übergeben? Den Offset auf das kleinste Element oder dessen Wert?
-
Ich möchte das array aus Table 3 übergeben. Das mit return in MinMax ist eigentlich noch nicht wichtig. Mit ShowMEssage wird ja auch das Ergebnis gezeigt.
MinMax rechnet dann mit dem array, das in Table3 erstellt wird.
Hoffe ihr versteht was ich meine!
Viele Dank
lg, freakC++
-
O.K., versuche mal das zu ändern:
- der return-Wert von MinMax ist etwas, was mit dem Aufzählungsoperator verkettet ist. Sinnlos, Du willst ein float übergeben. Also entweder imin oder xmin.
- Du deklarierst xmin, was den kleinsten Arraywert enthalten soll als int. Dann musst Du Dich nicht wundern, wenn er Nachkommastellen abschneidet.
- for (float i = 1; i < npts; i+=h) Ich wusste ehrlich nicht das der Compiler das schluckt. Die ICV muss eine abzählbaren Datentyp aufweisen, also for (int i ...
- der Aufruf vin MinMax(array); nützt Dir gar nichts da Du das Ergebnis nicht auswertest
-
- du füllst dein Array beginnend mit 1, das sollte aber eher bei 0.
-
Hallo,
so das Problem ist gelöst! Danke euch beiden!@Braunstein: Der Fehler lag daran. "Zelle" beginnt bei 1 und nicht bei 0....
@witte: Natürlich muss ich xmin... mit float vereinbaren...das ich das nicht gesehen habe. Danke! Das mit dem Inkrement: Warum sollte das nicht gehen. Wäre ja schlimm wenn man nur in einser oder zehner schritten auf-/abzählen kann. Hier wird halt mir krummen Zahlen aufgerechnet.Wegen dem return...was mache ich denn wenn ich zwei oder auch vier Werte zurückgeben möchte. Kann man das nicht so schreiben wie ich es getan habe? Kann man mit return auch immer nur einen Wert zurückgeben?
Vielen Dank
lg, freakC++
-
freakC++ schrieb:
Wegen dem return...was mache ich denn wenn ich zwei oder auch vier Werte zurückgeben möchte. Kann man das nicht so schreiben wie ich es getan habe? Kann man mit return auch immer nur einen Wert zurückgeben?
Ja, man kann immer nue einen Wert zurückgeben.
Was du machen kannst ist folgendes:
1. kapsele deine Rückgabewerte in einer struct oder std::pair o.ä. und gib das zurück
2. Übergib Referenzen auf deine gewünschten Rückgabewerte an deine Funktion. z.Bsp. sovoid funct(int& fa, int& fb) { // itgendwelche Berechnungen // dann Zuweisung an die Referenzen fa = ; fb = ; } int a,b; //gewünschte Rückgaben // Aufruf der Funktion funct(a,b); // a und b sind jetzt geändert