Forum: PC-Programmierung Problem mit C Code


von Klemens (Gast)


Lesenswert?

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;
}
*********************************

von Klemens (Gast)


Lesenswert?

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;
}
*********************************

von Martin #. (martin-)


Lesenswert?

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
}

von Torsten (Gast)


Lesenswert?

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

von Martin #. (martin-)


Lesenswert?

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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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 ...

von Klemens (Gast)


Angehängte Dateien:

Lesenswert?

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.

von marcel (Gast)


Lesenswert?

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

von Klemens (Gast)


Lesenswert?

Hei super. Es funktioniert jetzt. Vielen Dank.

von A.K. (Gast)


Lesenswert?

@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).

von Torsten (Gast)


Lesenswert?

Hi,
stimmt, habe es gerade mal ausprobiert. Aber mir gefällt die '*'
Variante besser ;-)

Gruss
Torsten

von Klemens (Gast)


Angehängte Dateien:

Lesenswert?

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);
}

von marcel (Gast)


Lesenswert?

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

von Tobi H. (tobi-) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.