Forum: PC-Programmierung Funktion Vergleichen läuft nicht


von Johannes (Gast)


Lesenswert?

Hi

kann mir einer schreiben warum die Funktion nicht geht?

Die Funktion soll ein Array("ergebnis") vergleichen. Die niedrigste 
Adresse des arrays soll dann am Schluss in der Variablen k stehen. 
Verstehe einfach nicht warum da nichts rauskommt. i und k sind als 
Integer definiert. Auch die Werte im Array stimmen. Liegt nur an der 
Funktion.

for(i = 2; i <= 32; i++)
{
  if(ergebnis[i] < ergebnis[k])
  {
  k = i;
  }
}
Gruss
Johannes

von Werner A. (homebrew)


Lesenswert?

machst du auch ein return(k)?

von Johannes (Gast)


Lesenswert?

die Funktion steht in einem größeren Funktionsblock. Ich arbeite bzw. 
will gleich weiter arbeiten mit dem k in der gleichen Hauptfunktion. Das 
ganze Programm läuft aber nicht, weil die Funktion es nicht hinbekommt, 
den niedrigsten Wert daraus zu bekommen.

von ... (Gast)


Lesenswert?

Hi,

wie ist denn ergebnis definiert? Hast Du eventuell vergessen k zu 
initialisieren?

So sollte das eigentlich gehen:
1
char ergebnis[32];
2
int i, k;
3
4
k = 0;
5
for(i = 1; i < 32; i++) {
6
  if(ergebnis[i] < ergebnis[k]) {
7
    k = i;
8
  }
9
}

von Johannes (Gast)


Lesenswert?

hmm... läuft damit auch nicht, vielleicht habe ich ja auch einen 
denkfehler.

bsp.

ergebnis[0] = 34
ergebnis[1] = 45
ergebnis[2] = 0
ergebnis[3] = 5

so sieht mein Array beispielhaft aus. Ist in wirklichkeit wesentlich 
größer. Kapier nicht warum er das nicht erfassen kann.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Den kleinsten Wert eines Array kannst Du so bestimmen:
1
k = ergebnis[0]; 
2
3
for (i = 0; i < 32; i++)
4
  if (ergebnis[i] < k)
5
    k = ergebnis[i];

Und den Index dieses Elements bestimmst Du so:
1
k = ergebnis[0]; 
2
j = 0;
3
4
for (i = 0; i < 32; i++)
5
  if (ergebnis[i] < k)
6
    {
7
    k = ergebnis[i];
8
    j = i;
9
    }

Entscheidend ist, daß k (als kleinster Wert) und j (als Index des 
kleinsten Wertes) vor dem Durchsuchen des Arrays mit sinnvollen Werten 
initialisiert werden. Beim Index ist das einfach, 0 ist auf jeden Fall 
ein gültiger Arrayindex. Beim Vergleichswert kann der Wert eines 
beliebigen Elementes des Arrays verwendet werden - denn der liegt 
garantiert im Wertebereich aller Arrayelemente.

von ... (Gast)


Lesenswert?

@Rufus:
Du kannst den Startwert der for-Schleife in Deinen beiden Beispielen auf 
1 setzen, da die if-Bedingung für i==0 niemals wahr ist. Spart halt 
einen Schleifendurchlauf. Und im Endeffekt hast Du dann ziemlich genau 
den selben Code wie ich.

@Johannes:
Wenn ich mir Deinen Orginalcode anschaue, scheint mir Du hast ein 
Verständnisproblem wie der Wertebereich für Arrayidizes ist. Schau Dir 
die Beispiele von Rufus und mir nochmal genau an, insbesondere in meinen 
Beispiel die erste Zeile und in allen Beispielen die Abbruchbedingung 
der for-Schleife!

CU

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

... - Da hast Du natürlich recht.
Um den Algorithmus zu verstehen, halte ich es jedoch für sinnvoll, 
zunächst auf Optimierungen zu verzichten.
Die kann man sich dann immer noch einfallen lassen ...

von ... (Gast)


Lesenswert?

... - Da hast Du nun wieder recht :)

von Karl H. (kbuchegg)


Lesenswert?

Johannes wrote:
> so sieht mein Array beispielhaft aus. Ist in wirklichkeit wesentlich
> größer. Kapier nicht warum er das nicht erfassen kann.

DIe Antwort darauf ist ganz einfach:
Der Rechner macht, was du programmiert hast.
Wenn also das Ergebnis nicht dem entspricht, was du haben
möchtest, dann deshalb weil du einen Fehler im Programm hast.

Den wird dir aber niemand zeigen können, solange du nicht
etwas mehr von deinem Programm herzeigst..

> die Funktion steht in einem größeren Funktionsblock.

Das hört sich nicht besonders gut an. Das klingt eher wieder
nach einem Standardproblem: Zu grosse Funktionen, die keiner
mehr überblicken kann.

Und ... hat recht. Der Originalcode sieht wirklich so aus,
als ob du das Arrayhandling in C nicht wirklich verstanden
hast.

Bei der Deklaration eines Arrays gibt man die Anzahl der
Elemente im Array an

 int  a[6];

a hat 6 Elemente. Diese tragen die Indizes 0, 1, 2, 3, 4, 5
Zähl sie nach, es sind genau 6. Der höchste Arrayindex in einem
Array ist daher immer um 1 kleiner als die Anzahl der Elemente die
man bei der Variablendefinition angegeben hat. Ein Zugriff auf
a[6] wäre definitiv ein schwerer Fehler.

Konsequenterweise lautet eine Schleife, die alle Elemente von a
besucht, so:

  for( i = 0; i < 6; i++ )
    // mach was mit a[i]

Eine for-Schleife nach dem Muster

  for(i = 2; i <= 32; i++)

auf einem Array, deutet auf ein Nichtverständnis von Arraybehandlung
in C hin:
* Es ist ungewöhnlich, dass die Schleife mit 2 beginnt.
  Normalerweise beginnt die Schleife mit 0, weil 0 das erste
  Array Element ist. In deinem Fall kann die Schleife mit 1, also
  dem zweiten Array Element beginnen, weil ja das erste Element
  einfach mal als das temporär kleinste Element angenommen werden
  kann.
  Eine 2 als Anfangswert ist normalerweise ein Indiz für die
  'Array Indizes beginnen bei 1' Fraktion. Das wäre grober Unfug.
  Gewöhn dich daran, dass in C bei 0 zu zählen begonnen wird und
  du hast in Zukunft weniger Probleme
* das <=
  wenn eine for-Schleife zur Bearbeitung von Arrays nicht nach
  dem Muster

  for( i = 0; i < Anzahl_Array_Element; i++ )

  aussieht, dann sollten sofort alle Alarmglocken bimmeln. Denn
  meistens ist dann irgendwas faul. Der häufigste Fall ist das
  Nichtverstehen, dass aus der Tatsache das Array Inidzes bei 0
  beginnen folgt, das der höchste zulässige Index Wert immer um
  1 kleiner als die Anzahl der Elemente ist

  int b[6];

  for( i = 1; i <= 6; i++ )
    b[i] = 5;

  ist nun mal definitv falsch. Es gibt kein Element b[6]!


In seltenen Fällen kommt es tatsächlich vor, dass ein <= klarer
die Absicht hinter der Schleife ausdrückt. Aber selbst dann ist
es oft besser dies durch ein < auszudrücken und dafür den Vergleichswert
zu korrigieren. Und sei es nur deshalb, weil die Form der Schleife
so ist, wie man sich daran gewöhnt hat und schnell und ohne gross
Nachzudenken analysieren kann.
Die Standardform
   for( i = 0; i < 6; i++ )
liefert für i alle Zahlen von 0 bis 5. Also genau alle Zahlen
die als gültige Indizes für ein Array der Größe 6 gelten.
Und diese 6 findet sich in der for-Schleife wieder.

von Rolf Magnus (Gast)


Lesenswert?

> kann mir einer schreiben warum die Funktion nicht geht?

Definiere "nicht geht"? Was passiert?

> Verstehe einfach nicht warum da nichts rauskommt.

Wie "nichts"? Irgendetwas muß ja herauskommen. Zeige doch mal ein Array, 
mit dem du es getestet hast und den Wert, den k danach hat.

von Johannes (Gast)


Lesenswert?

Habe mittlerweile den Code von Rufus miteinfließen lassen und meine 
Abfrage ein bissel noch geändert. Läuft jetzt einwandfrei.
Danke euch allen.

von Wegstabenverbuchsler (Gast)


Lesenswert?

und was war dein Fehler?

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.