mikrocontroller.net

Forum: PC-Programmierung Problem mit C Code


Autor: Klemens (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;
}
*********************************

Autor: Klemens (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;
}
*********************************

Autor: Martin #### (martin-)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich vervende diese Routine um kleinsten Wert in einem Array zu
ermitteln:
/*Minimalwert  ermitteln*/
int minval(int *buffer,int len,int max)
{
  int count,min=max;

  for(count=0;count<len;count++)
  {
    if(min>buffer[count])
    {
      min=buffer[count];
    }
  }
  return min;
}

Autor: Torsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Martin #### (martin-)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Den Parameter "max" kann man sich sparen:
int minval(int* buffer, int len)
{
  int i;
  int wert;

  wert = buffer[0];

  for (i = 1; i < len; i++)
    wert = min(wert, buffer[i]);

  return (wert);
}

min() ist ein Standardmacro aus stdlib.h oder auch minmax.h und sollte
so zu jedem Compiler dazugehören.
Falls doch nicht:
#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 ...

Autor: Klemens (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: marcel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klemens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hei super. Es funktioniert jetzt. Vielen Dank.

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Torsten (Gast)
Datum:

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

Gruss
Torsten

Autor: Klemens (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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);
}

Autor: marcel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tobi H. (tobi-) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.