Versehe Programiercode nicht



  • Also, ich glaube das Problem lag woanders: wenn du keinen Block (also {}) hast, dann beziehen sich die Schleifen (for, while, do) und das if immer auf den direkt danach stehenden Befehl.

    Hier also mi {}:

    for (int i = 1; i <= (*(PosZeiger)).Anzahl; i++){
         if ((*(PosZeiger + i)).Anzahl < min){
              min = (*(PosZeiger + i)).Anzahl; 
         }           
    }
                //Wert zwischen min  finden
    for (int i = 1; i <= (*(PosZeiger)).Anzahl; i++){
         if ((*(PosZeiger + i)).Anzahl == min){
              break;                        
         }
    }
    
    if (i > (*(PosZeiger)).Anzahl){
        i = (*(PosZeiger)).Anzahl;
    }
    

    So besser verstaendlich? Lag das Problem darin?



  • ,l



  • 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->Anzahl anstelle von "((PosZeiger)).Anzahl" bzw. PosZeiger[i].Anzahl anstelle 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.

    http://s6.bilder-hosting.de/img/3QSHM.png



  • Wie schaut 'min' aus?

    gruss
    v R



  • virtuell Realisticer schrieb:

    Wie schaut 'min' aus?

    gruss
    v R

    min 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;
    			}			
    		};
    

Anmelden zum Antworten