Problem mit C Code

Gast #250712
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;
}
*********************************
Gast #250713
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;
}
*********************************
#250714
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
}
Gast #250715
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
#250716
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.
Persönliche Seite #250717
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 ...
Gast #250719
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
Gast #250721
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).
Gast #250723
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);
}
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren