Versehe Programiercode nicht
-
Mein Problem ist das ich den Algorithmus der hinter den 2 For-Schleifen steckt nicht verstehe. Hoffe ich konnte mich besser ausdrücken
-
Wenn du das nicht verstehst, hast du aber massive Probleme - if() ist eine Abfrage: WENN i größer ist als die vorgegebene Anzahl DANN setze i = diese Anzahl.
(übrigens könntest du die Zugriffe etwas leserlicher gestalten:
PosZeiger->Anzahlanstelle von "((PosZeiger)).Anzahl" bzw.PosZeiger[i].Anzahlanstelle von "((posZeiger+i)).Anzahl" - vielleicht hilft das auch beim Verständnis ;))Edit: Sorry, hab' dich jetzt falsch verstanden

Die erste Schleife bestimmt den Wert des kleinsten Elements in deinem Array und speichert ihn in der Variablen 'min', die zweite Schleife durchläuft nochmal das Array und sucht den Index, an dem das kleinste Element steht. Aber eigentlich könnte man beides auch zu einer Schleife zusammenfassen:
int imin=0; for(int i=1;i<PosZeiger->Anzahl;++i) if(PosZeiger[i].Anzahl<PosZeiger[imin].Anzahl) imin=i;
-
Danke für eure Hilfe, aber ich habe immer novh Probleme den Algorithmus zu verstehen. Ich habe mal die Werte die der Debugger anzeigt aufgeschrieben (siehe Bild). Bis zu 16 Bausteinen werden die Werte in der roten Umrandung angezeigt. Beim 17. Baustein werden die Werte in grün angezeigt und die Bezeichnung wird wieder auf 1 gesetzt. Nur warum? Wie erkennt er das? Das ist der Knackpunkt, den ich bei seinen 2 Schleifen nicht erkenne.
-
Wie schaut 'min' aus?
gruss
v R
-
virtuell Realisticer schrieb:
Wie schaut 'min' aus?
gruss
v Rmin ist imer der zweite Wert in der Tabelle. Die erste Spalte ist i, dann kommt min, dann PosZeiger.Anzahl und dann PosZeiger[i].Anzahl. Die anzeige ist im Bild etwas verrutscht.

Hilft dir das weiter?
-
habe nochmal die Anlage erneut hochgeladen jetzt erkennt man die Variablen besser
http://img160.imagevenue.com/img.php?image=39796_frage2_122_222lo.JPG
-
Wenn du 17 Objekte hast, solltest du den Anzahl-Wert auch auf 17 setzen

-
wie kann ich sie denn zb dies realisieren?
-
Am besten indem du vor der Schleife den korrekten Wert in posZeiger->Anzahl einträgst.
-
CStoll schrieb:
Am besten indem du vor der Schleife den korrekten Wert in posZeiger->Anzahl einträgst.
Dieser Wert wird vorher schon eingetragen. Mann muss ganz am Anfang den SPS-Typ auswählen und danach wird der Wert eingetragen, in dem Beispiel hier 16. Nun dürfen ja nicht 17 Baustein drauf gezogen werden. Und das will ich verhindern. Dazu muss ich ja wissen wie er die Nummerierung ermittelt, damit ich bei Überschreiten der max. Anzahl abbrechen kann. Nur leider ist der Urheber nicht mehr auffindbar und so komme ich nicht weiter.

-
Das liegt wohl an dem <= in deiner for-schleife. Die zweite Schleife ist hier auch unnötig. Für mich sieht das so aus, dass du ein Array von EINGAENGE hast in dessen ersten Element die Größe des Arrays steht.
Dann müßte auch das hier reichen.EINGAENGE *PosZeiger = (EINGAENGE *) GlobalLock(Beschriftung.Eingaenge); // Minimum bestimmen int pos(0); for (int i = 1; i < PosZeiger[0].Anzahl; i++) { if (PosZeiger[i].Anzahl < min) { min = PosZeiger[i].Anzahl; pos = i; } }
-
ich danke allen habe endlich die Lösung gefunden wennes interesiert so habe ich es endlich gelöst.
bool SucheFreieBezeichnung(BlockSpeicherFeld *LokZeiger,PINS Beschriftung,ProgrammInformation *info) { int //i, max = 0,min = 100, temp = 0; bool freieStelle = false; char buffer[20]; switch ((*(LokZeiger)).Bausteintyp) { case Eingang : { EINGAENGE *PosZeiger; PosZeiger = (EINGAENGE *) GlobalLock(Beschriftung.Eingaenge); // finde freie Bausteinziffer for (int i = 1; i <= PosZeiger->Anzahl; i++) { // freieStelle = false; if (PosZeiger[i].Anzahl < min) min = PosZeiger[i].Anzahl; if ((i <= PosZeiger->Anzahl) && (0 == min)) { freieStelle = true; break; } } //finde das i wo PosZeiger[i].Anzahl 0 ist, denn dann ist das eine freie Nummer for ( i = 1; i <= PosZeiger->Anzahl; i++) { if (PosZeiger[i].Anzahl == min) { break; } } if (freieStelle) { // Beschriftung umkopieren strcpy((*(LokZeiger)).Pin,(*(PosZeiger + i)).Pin); strcpy((*(LokZeiger)).Bezeichnung,(*(PosZeiger + i)).Bezeichnung); (*(LokZeiger)).TextDarstellen = (*(PosZeiger + i)).TextDarstellen; (*(PosZeiger + i)).Anzahl += 1; GlobalUnlock(Beschriftung.Eingaenge); return TRUE; } else { GlobalUnlock(Beschriftung.Eingaenge); return false; } };