www.mikrocontroller.net

Forum: PC-Programmierung Funktion MinElem funktioniert nicht


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: Klemens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann dazu keiner was sagen?

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

Bewertung
0 lesenswert
nicht lesenswert
"Woran liegt das?"
Jedenfalls nicht an dem geposteten Code

Autor: René König (king)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, ein wirklich schreklicher Chat hier. Schon 40 Minuten vergangen, und
keiner kennt die Lösung.

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

Bewertung
0 lesenswert
nicht lesenswert
Selten so eine grausige Benutzung von nur globalen Variablen gesehen.
Das macht selbst das kleine Programm schon unleserlich. Programmier
ordentlicher, dann klappts auch fehlerfreier!

Autor: Klemens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich dreh noch durch. Ich verstehe einfach nicht warum ich nicht zwei min
Werte angezeigt bekomme.
Hier in diesem Forum sind doch zahlreiche Cracks oder?

Autor: Klemens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was heisst da nicht ordentlich programmiert.
Ja wie kann ich den die globalen Variablen verhindern. Die brauche ich
doch bei mir.
Hier in diesem Forum wird nur drum herum geredet.Ok es gibt bestimmt
noch 1000 elegantere Varianten. Aber ich habe nunmal ein Problem mit
meinem C-Code.Ich will nur wissen warum ich keine zwei min Werte
angezeigt bekomme?

Autor: René König (king)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Hier in diesem Forum wird nur drum herum geredet.

Selbstverständlich. Du glaubst doch wohl nicht, daß Du nach Deinem
Auftritt noch vernünftige Antworten bekommst. Meine konnte ich
jedenfalls noch rechtzeitig zurückziehen, da habe ich Glück gehabt. Und
damit ist hier für mich EOT.

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

Bewertung
0 lesenswert
nicht lesenswert
"Ja wie kann ich den die globalen Variablen verhindern. Die brauche ich
doch bei mir."

Ja ne, ist klar.
Ein Beispiel: Du verwendest die imerker nur in einer einzigen Routine.
Aber klar, das geht natürlich nicht mit lokalen Variablen, wie auch.
Wie schon gesagt, mach deinen Code leserlicher, dann schauen sich das
bestimmt auch mehr Leute an, denn so ist und bleibt es unleserlich

Autor: Klemens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So ich habe mal die Funktion MinElem folgendermasen angeändert:

void MinElem(int* ivector1,int* ivector2) //Funktion zum feststellen
der kleinsten Zahl
{
 int imerker_vector1=0, imerker_vector2=0;
 imerker_vector1= ivector1[0];
 imerker_vector2= ivector2[0];

  for(int i=0;i<iwerte;i++)
  {
   if (imerker_vector2>ivector2[i])
   {
    imerker_vector2=ivector2[i];
   }
 }
 printf("min.Element Vector1:%2d\n",imerker_vector2);
}

Wenn ich die Funktion so ausführe, dann bekomme ich auch immer den Wert
0 vom Vector 2 zurück.

Verändere ich diese Funktion so wie unten, dann bekomme ich einen Min.
Wert vom Vector 1 angezeigt.

void MinElem(int* ivector1,int* ivector2) //Funktion zum feststellen
der kleinsten Zahl
{
 int imerker_vector1=0, imerker_vector2=0;
 imerker_vector1= ivector1[0];
 imerker_vector2= ivector2[0];

  for(int i=0;i<iwerte;i++)
  {
   if (imerker_vector1>ivector1[i])
   {
    imerker_vector1=ivector1[i];
   }
 }
 printf("min.Element Vector1:%2d\n",imerker_vector1);
}

Wo kann denn da der Fehler sein?

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

Bewertung
0 lesenswert
nicht lesenswert
Dein Fehler liegt imo bei der variable i. Die setzt du nicht zurück..

Autor: Klemens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Tobi vielen Dank für den Tipp.

Ja wo genau müsste ich diese Variable i zurücksetzen?

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

Bewertung
0 lesenswert
nicht lesenswert
Nachdem du den ersten vektor gespeichert hast. Geb dir doch mal den
Inhalt von Vektor 1 und 2 nach dem einlesen aus, dann wirst du es
wahrscheinlich sehen

Autor: Klemens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja das mache ich doch schon.
Und zwar in Main nach den einlesen der Werte führe ich ja die Funktion
WriteVec() aus(siehe Quellcode im Anhang).
Ich kann da nix feststellen.

Autor: Klemens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich sehe da nichts auffälliges. Ich verzweifle noch.Ich finde den Fehler
nicht.

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

Bewertung
0 lesenswert
nicht lesenswert
doch, es ist genau der Fehler, den ich schon sagte, nur ist dein
WriteVec genauso verbuggt :)

Autor: Klemens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmmm...ok ich kann es jetzt verstehen.Wie könnte man die beiden
Funktionen verbessern?

Autor: Klemens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich bekomme es noch als nicht hin.
Bitte bitte helft mir. Ich muss bis morgen das Programm zum laufen
bringen.

Autor: Klemens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe diesen beiden Variablen von der Funktion MinElem() mal direkt
einen Wert vergeben:

imerker_vector1= 11;
imerker_vector2= 22;

Die For Schleife habe ich auskommentiert.
Die printf Funktion liefert mir dann auch die beiden Werte zurück.

Irgendwas stimmt mit den Vectoren nicht.

Autor: Klemens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
grrrrrrrrrrrrrrrrrrrrrr.....

Autor: Klemens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es muss doch hier einen Crack geben, der mir genau sagen kann wo und wie
ich das Programm abändern muss, damit es läuft.
Ich kann ich noch 100 Stunden sitzen. Leider muss ich ja noch was
anderes tun.

Autor: Klemens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich ivector1[0]=55; in der Funktion einfüge und teste, dann erhalte
ich auch den min.Wert von Vector1.
Das vestehe ich absolut nicht.

void MinElem(int* ivector1,int* ivector2) //Funktion zum feststellen
der kleinsten Zahl
{
 imerker_vector1= ivector1[0];
 ivector1[0]=55;   //zusätzlich eingefügt.
 imerker_vector2= ivector2[0];
 for(int m=0;m<iwerte;m++)
 {
  if (imerker_vector1>ivector1[m])
   {
    imerker_vector1=ivector1[m];
   }
  if (imerker_vector2>ivector2[m])
   {
    imerker_vector2=ivector2[m];
   }
 }
 printf("min.Element Vector1:%2d min.Element
 Vector2:%2d\n",imerker_vector1,imerker_vector2);
}

Autor: Klemens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In einem anderen Forum wurde mir das hier vorgeschlagen.

int MinElem(int *a,size_t n){
  int temp;
   for(temp =*a++;--n;++a)
    if(*a<temp)temp =*a;
return temp
}

Also das finde ich total unübersichtlich und vor allem verstehe ich das
nicht.

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

Bewertung
0 lesenswert
nicht lesenswert
Bringt auch nix, der Fehler ist immer noch beim einlesen
schreib deine ausgaberoutine noch mal neu und dann schau mal was
wirklich in den vektoren drin steht

Autor: Klemens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mein Programm liest die Werte schon korrekt in die Vectoren ein.
Hab ich ja auch getestet.

Jetzt noch mal:

void MinElem(int* ivector1,int* ivector2) //Funktion zum feststellen
der kleinsten Zahl
{
 ivector1[0]=99;   //zusätzlich eingefügt.
 ivector2[0]=99;   //zusätzlich eingefügt.
 imerker_vector1= ivector1[0];
 imerker_vector2= ivector2[0];
 for(int m=0;m<iwerte;m++)
 {
  if (imerker_vector1>ivector1[m])
   {
    imerker_vector1=ivector1[m];
   }
  if (imerker_vector2>ivector2[m])
   {
    imerker_vector2=ivector2[m];
   }$
 }
 printf("min.Element Vector1:%2d min.Element
 Vector2:%2d\n",imerker_vector1,imerker_vector2);
}

GENAU SO FUNKTIONIERT ES JA!!!!!!

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

Bewertung
0 lesenswert
nicht lesenswert
"Mein Programm liest die Werte schon korrekt in die Vectoren ein."
Falsch
du beschreibst vektor1 ab position 1, aber vector 2 aber der länge von
vektor1

Autor: Klemens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja und wie würdest du das machen bzw. programmieren? Ich stehe auf dem
Schlauch.

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

Bewertung
0 lesenswert
nicht lesenswert
wie ich schon sagte, einfach i zwischen den beiden einlese schritten
wieder auf 0...

Autor: Klemens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achso hier muss ich die Variable i auf NULL setzte!?

 printf("Vector1:\n");
 for(int x=1; x<=iwerte;x++)
 {
  scanf("%2d",&izahl);        //einlesen der Zahlen in einen Vector
  ReadVec(izahl,1);
 }
 i = 0;
 printf("Vector2:\n");
 for(int x=1; x<=iwerte;x++)
 {
  scanf("%2d",&izahl);        //einlesen der Zahlen in einen Vector
  ReadVec(izahl,2);
 }

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

Bewertung
0 lesenswert
nicht lesenswert
Sag du es mir. Funktioniert es? Die Ausgabe wird jetzt falsch sein aber
klappt das Min-Suchen

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.