Hi, ich habe in C eine Funktion geschrieben mit der ich den Minimalwert festellen will. Wenn ich die Funktion in Main ausführe bekomme ich immer eine 0 zusehen. ****************************** int ivector[20]; int MinElem(int vector[20]) { imerker= ivector[0]; for(int i=0;i<iwerte;i++) { if (ivector[i]<imerker) { imerker=ivector[i]; } } return imerker; } *********************************
So den Code habe ich nochmals richtig hier reingestellt. ****************************** int ivector[20]; int MinElem(int ivector[20]) { imerker= ivector[0]; for(int i=0;i<iwerte;i++) { if (ivector[i]<imerker) { imerker=ivector[i]; } } return imerker; } *********************************
Ich vervende diese Routine um kleinsten Wert in einem Array zu ermitteln:
1 | /*Minimalwert ermitteln*/
|
2 | int minval(int *buffer,int len,int max) |
3 | {
|
4 | int count,min=max; |
5 | |
6 | for(count=0;count<len;count++) |
7 | {
|
8 | if(min>buffer[count]) |
9 | {
|
10 | min=buffer[count]; |
11 | }
|
12 | }
|
13 | return min; |
14 | }
|
Martins Variante ist auf jeden Fall besser. Man übergibt prinzipiell nicht das ganze Array im Funktionsaufruf. Ein Zeiger auf das erste Element reicht völlig. Damit wird es gehen. Gruss Torsten
Diese Routine ist allerdings nicht sonderlich schnell. Vieleich liese sich die for-Schleife und if-Abfrage durch eine einzige while-Schleife ersetzen. Der zweite Parameter (int len) ist die Grösse des Arrays, der durchsucht werden soll. Der dritte (int max) Parameter soll ein Wert sein, der grösser ist als der grösste Wert, der im Array zu erwarten ist.
Den Parameter "max" kann man sich sparen:
1 | int minval(int* buffer, int len) |
2 | {
|
3 | int i; |
4 | int wert; |
5 | |
6 | wert = buffer[0]; |
7 | |
8 | for (i = 1; i < len; i++) |
9 | wert = min(wert, buffer[i]); |
10 | |
11 | return (wert); |
12 | }
|
min() ist ein Standardmacro aus stdlib.h oder auch minmax.h und sollte so zu jedem Compiler dazugehören. Falls doch nicht:
1 | #define min(a,b) (((a) < (b)) ? (a) : (b))
|
Sicherheitshalber sollte man in der Funktion auch noch die übergebenen Argumente prüfen, ob 'buffer' auf irgendwas sinnvolles zeigt und 'len' größer ist als 0 ...
Vielen Dank für die schnelle Hilfe. Leider habe ich es bei mir noch als nicht hinbekommen. Das C Programm liefert mir immer den Wert 0. Im Anhang befindet sich mein kompletter Quellcode.
hallo klemens, das erste element eines arrays wird mit 0 indiziert. deine ReadVec(...) funktion schreibt den ersten eingelesenen wert allerdings nach ivector[1] anstatt nach ivector[0]... ivector[0] wird also nirgendwo im programm ein wert zugewießen und ist somit undefiniert (0 in deinem fall). da deine MinElem(...) funktion mit ivector[0] beginnt findet 0 als minimum... so sollte es besser funktionieren: void ReadVec(int izahl) { ivector[i] = izahl; i = i + 1; } deine WriteVec(...) funktion beginnt ebenfalls bei ivector[1]... du musst diese also auch anpassen (for(y=0;.....) gruß marcel
@Torsten: In diesem Punkt sind beide Varianten gleich. In C wird ein Array immer als Zeiger auf das erste Element übergeben, egal ob man den Parameter als Zeiger dekariert (Martin) oder als Array (Klemens).
Hi, stimmt, habe es gerade mal ausprobiert. Aber mir gefällt die '*' Variante besser ;-) Gruss Torsten
Mit dieser Funktion habe ich noch Probleme. Und zwar habe ich hier diesmal zwei Arrays die ich dieser Funktion übergebe. Der Min Wert vom Vector1 wird immer ausgegeben. Der min Wert von Vector2 ist bei mir immer 0. Woran liegt das? void MinElem(int* ivector1,int* ivector2) //Funktion zum feststellen der kleinsten Zahl { imerker_vector1= ivector1[0]; imerker_vector2= ivector2[0]; for(int i=0;i<iwerte;i++) { if (imerker_vector1>ivector1[i]) { imerker_vector1=ivector1[i]; } if (imerker_vector2>ivector2[i]) { imerker_vector2=ivector2[i]; } } printf("min.Element Vector1:%2d min.Element Vector2:%2d\n",imerker_vector1,imerker_vector2); }
moin :) du musst i wieder auf 0 setzen bevor du deinen zweiten vector einliest oder du verwendest für beide vectoren jeweils eine eigene index-variable gruß marcel
Das weiss er alles schon http://www.mikrocontroller.net/forum/read-8-244100.html#new Leider fehlen ihm wohl die c Grundlagen ein wenig
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.