Vektor Max und Adresseangabe
-
sizeof(array)/sizeof(array[0]) berechnet die Länge des Arrays zum Zeitpunkt des Erstellen der Exe. mit sizeof(array) bekommst du die Länge * Größe Datentyp, weshalb dieser wieder durch die Größe des Datentyps mit array[0] geteilt wird.
-
joe1234 schrieb:
Kann ich die Funktion so schreiben?
Wieso hat denn maxWert einen anderen Typ (double) als die Elemente deines Arrays (int)? Der sollte schon übereinstimmen.
EDIT: Ach ja, das Bestimmen der Elemente per sizeof wird in der Funktion nicht mehr klappen. Du hast dann nur einen Zeiger auf dein Array, und sizeof wird immer die Größe des Zeigers liefern, bei int wahrscheinlich 4. In solchen Fällen musst du die Länge des Arrays mit an die Funktion übergeben.
-
Du hast
void f1(int *vektor[],double *maxWert,int *index) {
Bei vektor brauchst du entweder int vektor[] oder *int vektor
int *vektor[] ist ein Feld von Pointern auf int.
-
Ok, fassen wir mal alle Kritikpunkte zusammen und schauen uns an, wie der Funktionskopf aussehen könnte:
void f1(int vektor[],int size,int *maxWert,int *index) { //size ist die Anzahl der Elemente des Arrays, die du übergeben musst
Einen sinnvollen, sprechenden Funktionsnamen solltest du auch noch vergeben. f1 ist nicht so toll. Nun schau mal, ob du die Funktion ans Laufen kriegst.
-
Der maximale Wert sollte nicht mit 0 initialisiert werden. Zumindest nicht bei einer Funktion für vorzeichenbehaftete Integer. Es bietet sich an, den maximalen Wert mit dem ersten Element des Vektors zu initialisieren. Bei Fließkommazahlen sollte man sich Gedanken machen wie man NaN behandelt.
-
Auch bei Fließkommazahlen kann man das erste Element nehmen. Dann sollte man aber nicht vergessen, index auch auf 0 zu setzen.
-
Danke nochmals für die vielen Vorschläge/Anregungen!
Nochmal zu meinem Problem:
Also es geht darum, aus einem Vektor (heißt: VZ), den ich erzeugt habe, das Maximum und den Index dazu zu bestimmen. Dabei besteht mein Vektor VZ nur aus Integern. Außerdem wollte ich das ganze mit Pointern machen, damit ich Platz sparen und um es auch zu lernen, Pointer zu verwenden. Folgendes habe ich nun erstellt.int VZ={1,2,5,3}; int maxWert=0; int index=0; void f1(int *vektor,int *size,int *maxWert,int *index) { for(int i=0;i<size;++i) { if(VZ[i]>maxWert) { maxWert = VZ[i]; index = i; } } }
-> Kopfzeile korrigiert, Vektor VZ
Könntet ihr vor allem die Pointer durchschauen, da ich mir bei diesen nicht sicher bin, ob diese richtig gesetzt sind.
Ist das so korrekt?
Gruß Joe
-
Danke nochmals für die vielen Vorschläge/Anregungen!
Nochmal zu meinem Problem:
Also es geht darum, aus einem Vektor (heißt: VZ), den ich erzeugt habe, das Maximum und den Index dazu zu bestimmen. Dabei besteht mein Vektor VZ nur aus Integern. Außerdem wollte ich das ganze mit Pointern machen, damit ich Platz sparen und um es auch zu lernen, Pointer zu verwenden. Folgendes habe ich nun erstellt.int VZ={1,2,5,3}; int maxWert=0; int index=0; void f1(int *vektor,int *size,int *maxWert,int *index) { for(int i=0;i<size;++i) { if(vektor[i]>maxWert) { maxWert = vektor[i]; index = i; } } }
-> Kopfzeile korrigiert, Vektor VZ
Könntet ihr vor allem die Pointer durchschauen, da ich mir bei diesen nicht sicher bin, ob diese richtig gesetzt sind.
Ist das so korrekt?
Gruß Joe
-
size muss kein Pointer sein. Du kannst wie schon erwähnt maxWert und index vor dem Schleifenaufruf auf das erste Element setzen und dann in der Schleife mit dem zweiten fortfahren. Wichtig wird dann eine größenüberprüfung, aber deine Funktion tut schon was sie soll. Wenn du die zeiger dereferenzierst.
-
int VZ={1,2,5,3}; int maxWert=0; int index=0; void f1(int *vektor,int size,int *maxWert,int *index) { // size braucht kein Pointer sein *maxWert = vektor[0]; *index = 0; for(int i=0;i<size;++i) { // Achtung size ist kein Pointer if(vektor[i]>*maxWert) { // * nicht vergessen *maxWert = vektor[i]; // * nicht vergessen *index = i; // * nicht vergessen } } }
Du schreibst ja *int maxWert. Mit dem * ist maxwert ein int ohne ist es der Pointer.
-
- size sollte kein Pointer sein, einfach int. Denn du willst nichts zurückschreiben, du willst nur die Elemente-Anzahl an die Funktion übergeben. Hierfür reicht eine Übergabe by-value.
- maxWert wird in der Funktion gar nicht initialisiert! Das ist böse. Es steht dann irgendwas an der Stelle im Speicher, und dein Ergebnis geht u.U. böse schief. Initialisiere maxWert doch mit dem ersten Array-Element, wie schon vorgeschlagen wurde.
- Wenn du mit dem Wert vergleichen willst, auf den der Zeiger maxWert zeigt, musst du auch entsprechend notieren. Also so:
if(vektor[i]>*maxWert) { //das Sternchen dereferenziert den Zeiger, somit wird vektor[i] mit dem verglichen, auf das maxWert zeigt
- Dasselbe gilt für die nächste Zeile. Wenn du der Variablen, auf die der Zeiger maxWert zeigt, einen Wert zuweisen willst, musst du wieder so notieren:
*maxWert = vektor[i];
- Bei der nächsten Zeile ist es wieder dasselbe für den Zeiger index.
-
Ach so!
Ich dachte, wenn ich maxWert ausserhalb der Funktion declariere, dann reicht es aus.
Damit ich nicht durcheinanderkomme, habe ich die Namen etwas verändert.
Nun nochmal das ganze!int VZ={1,2,5,3}; int maxWert1=0; int index1=0; int size1=20; //Nun will ich die oben declarierten Werte als Poniter übergeben, und zwar alle. void f1(int *vektor,*size,*maxWert,*index) { //*maxWert = vektor[0]; //wird nicht mehr benötigt, da maxWert als Pointer übergeben //*index = 0; //wird nicht mehr benötigt, da index als Pointer übergeben for(int i=0;i<size;++i) { // Achtung size ist kein Pointer if(vektor[i]>*maxWert) { // * nicht vergessen *maxWert = vektor[i]; // * nicht vergessen *index = i; // * nicht vergessen } } }
Wieso muss ich in der Kopfzeile bei Vektor "int" davorschreiben, bei den einzelnen Variablen jedoch nicht? Von der Syntax ist mir das nicht ganz klar.
Ist meine Funktion nun in Ordnung?Gruß Joe
-
Meine Güte! DirkB`s Code war vollkommen korrekt. Warum kommentierst du die zuweisung aus? Warum ist size immernoch ein Pointer? Warum verwendest du nun void*?
-
joe1234 schrieb:
Ach so!
Ich dachte, wenn ich maxWert ausserhalb der Funktion declariere, dann reicht es aus.Damit würdest du die Funktion davon abhängig machen, dass der Aufrufer auch bloß alle Variablen initialisiert, die er übergibt. Und davon kann man nicht ausgehen, wenn es sich um By-Reference-Variablen handelt - also Variablen, die als Rückgabe gedacht sind und in der Funktion gesetzt werden. Nein, nein, so machen wir das nicht!
Außerdem wurde ja schon gesagt, warum es viel besser ist, maxWert nicht mit 0, sondern mit dem Wert des ersten Array-Elements zu versehen (wenn im Array nur negative Werte sind, bekommst du sonst das Ergebnis, dass 0 der höchste Wert im Array ist). Wenn man dir schon zeigt, wie es total absolut super-richtig ist, solltest du das auch übernehmen und nicht auskommentieren.
joe1234 schrieb:
Wieso muss ich in der Kopfzeile bei Vektor "int" davorschreiben, bei den einzelnen Variablen jedoch nicht? Von der Syntax ist mir das nicht ganz klar.
Ist meine Funktion nun in Ordnung?Nö, geht überhaupt nicht. Wie kommst du denn darauf, dass das geht??
Hier stimmt etwas noch nicht:
joe1234 schrieb:
void f1(int *vektor,int *size,int *maxWert,int *index) {
Siehst du es? size sollte kein Pointer sein! Hatten wir auch schon gesagt. Also weg mit dem Sternchen. Dann sollte es passen. Wie rufst du die Funktion nun auf? Zeig den Code doch bitte mal.
-
Wenn die Werte falsch initialisert werden kann alles mögliche berechnet werden.
Das Zitat dazu wäre:garbage in > garbage out
Solch Unaufmerksamkeiten sind mit der Grund für so viele Sicherheitsupdates.
Oder drastischer
Eine beschi.... Annahme ist der Beginn einer jeden Katastrophe.
-
Danke nochmals für eure Hilfe! Das hat mich, als Neuling, aufjedenfall weitergebracht, vor allem die Sache mit den Pointern!
Den gesamten Code würde ich hier lieber nicht posten, der ist sehr lang.
Es geht eigentlich darum, dass ich mit dem XPLAIN-Board von Atmel erst eine Messung durchführe und dann eine Berechnung.
Das tut aber hier nichts zur Sache, den die Überschrift lautet ja ganz anders.
Wer dennoch den kompletten Code haben will, einfach schreiben. Ich stelle diesen gerne auf rapidshare.com, oder so, zur Verfügung.DANKE SCHÖN AN ALLE!
Gruß Joe