Deklaration Zeichenketten

  • Hallo zusammen,
    ich bin neu hier und muß sagen, dass das hier ein super Forum ist! :beerchug: :supi: :grinser043:


    nun zu meinem Problem!
    Ich hab in der Config.dat folgendes deklariert:



    das funktioniert genau bis Datensatz 199, danach bekomme ich eine Fehlermeldung, dass die Deklaration zu lang ist (Fehlernummer und genaue Beschreibung muß ich morgen nachreichen)!


    Ich möchte die Sache gerne auf 4096Datensätze erweitern, da es sich bei dieser Geschichte um ein Programm handelt welches, durch eine Programmvorwahlnummer zwischen 1 und 4096, verschiedene Positionen abfahren soll!
    Das funktioniert alles bis 199 aber leider nicht höher, da ich mit der Deklaration des TEST_SATZ'es nun mal nicht höher komme!


    Danke im vorraus und nochmal viele Grüße
    Handschuh #33

  • Schritt für Schritt zum Roboterprofi!
  • In der Doku steht nichts über eine Beschränkung der Grösse von Arrays. Meckert der tatsächlich schon bei 199 Einträgen?
    Dann wäre die Lösung ein Array mit mehr Dimensionen, zB 64*64, das hat ebenfalls 4096 Einträge, nur eben zweidimensional. Dann müsstest Du halt ein wenig seltsam zählen:


    Macht den Code zwar nicht gerade einfacher, aber das sollte dann ja gehen. Es sei denn, die maximale Gesamtzahl aller Einträge wäre 199...


    Zum abfragen wären das dann zwei Schleifen ineinander, die beide von i=1 to 64 bzw von j=1 to 64 zähelen. An der Stelle wärs dann nicht so schlimm.

    If you and DEAD people can read Hex, how many people can read Hex?

    Einmal editiert, zuletzt von kai_n ()

  • warum du die Fehlermeldung gerade bei 199 bekommst liegt wahrscheinlich an der Grösse der config.dat. Um das zu untersuchen musst Du sie mir schicken. Auf jeden Fall wirst Du nie 4096 Einträge machen können.
    Vorschlag: den String mit SWRITE im Programm zusammenbauen

    Wer nach allen Seiten offen ist kann nicht ganz dicht sein


  • warum du die Fehlermeldung gerade bei 199 bekommst liegt wahrscheinlich an der Grösse der config.dat. Um das zu untersuchen musst Du sie mir schicken. Auf jeden Fall wirst Du nie 4096 Einträge machen können.
    Vorschlag: den String mit SWRITE im Programm zusammenbauen


    ....und wie mach ich das? :huh:


    Ich bekomme eine externe Programmanwahl zwischen 1 und 4096 und dachte mir, da ich damit je nach Teil immer verschiede Positionen anfahren muß und keine Übereinstimmung in allen Positionen habe, mache ich es mir so einfach! :-|

  • Ich hab eben mal getestet, ich konnte nen Array von der Grösse 4096 deklarieren. So weit ich weiss wird dabei auch direkt der Speicherplatz reserviert. Versuch evtl mal den String weg zu lassen. Der enthält ja als einzige Information den Index ins array, welcher ja schon kurz davor steht.
    Ohne String sinds ja nur noch nen paar Byte pro Eintrag.

    If you and DEAD people can read Hex, how many people can read Hex?

  • Ich bekomme eine externe Programmanwahl zwischen 1 und 4096 und dachte mir, da ich damit je nach Teil immer verschiede Positionen anfahren muß und keine Übereinstimmung in allen Positionen habe, mache ich es mir so einfach! :-|


    Kann mir kaum vorstellen, daß es sich um 4096 verschiedene Teile handelt. Füg doch noch einen INT für Programmnummer hinzu. Sagen wir für 20 verschieden Produkte oder Teile:


    STRUC TESTTYP CHAR NAME[12],REAL ABNAHME_POS,H,ABGABE_POS,INT ProgNr




    ;===== TESTDATEN
    INT AKT_TEST=1
    INT AKT_TEST_NR=1
    INT NUMMER=1


    INT ANZ_DATEN=20
    DECL TESTTYP TEST_SATZ[20]



    TEST_SATZ[1]={NAME[] "Test 1",ABNAHME_POS 0.0,ABGABE_POS,H 130.0,Prognr 1}
    TEST_SATZ[2]={NAME[] "Test 2",ABNAHME_POS 0.0,ABGABE_POS,H 130.0,Prognr 64}
    TEST_SATZ[3]={NAME[] "Test 2",ABNAHME_POS 0.0,ABGABE_POS,H 130.0,Prognr 4}.
    .
    .
    TEST_SATZ[20]={NAME[] "Test 20",ABNAHME_POS 0.0,ABGABE_POS 130.0,Prognr 4096}



    Im Hauptprogramm schreibst du dann:


    INT i ;Schleifenzähler (Muß in den Deklarationsteil)


    AKT_TEST=0


    For i = 1 to ANZAHL_DATEN
    If TEST_SATZ[i].Prognr==SPSProgNr then ;SPSProgNr= Übergebene Programmnummer
    AKT_TEST=i
    Exit
    Endif
    endfor


    If AKT_TEST==0 then
    ;Keine passende Programmnummer Fehler
    HALT
    ;Mach irgendwas...
    Endif


    Dazu mußt du natürlich die verschiedenen Programmnummern kennen. Aber es spart 'ne Menge Datensätze und die Config.dat läßt sich auch schneller öffnen. ;)
    Das ganze ist auch übersichtlicher.

    Greetings, Irrer Polterer!

    Wie poste ich falsch? Nachdem ich die Suche und die FAQ erfolgreich ignoriert habe, erstelle ich das gleiche Thema in mehreren Unterforen, benutze einen sehr kreativen Titel wie "Hilfe", am Besten noch mit mehreren Ausrufezeichen, und veröffentliche einen so eindeutigen Text, dass sich jeder etwas Anderes darunter vorstellt.


    Life is a beta version. Full of bugs and no Manual.

  • Hallo, meinen Vorschlag mit dem SWRITE kannst Du in den Müll werfen - war da auf einem falschen Dampfer - habs aber jetzt kapiert.
    Das Problem ist, das eine Variable(struktur) nur 32 kB gross sein kann.
    Da muss eine andere Lösung her

    Wer nach allen Seiten offen ist kann nicht ganz dicht sein

  • @ IrrerPolterer


    Erst mal :danke: für diese Lösung!! Es sieht so aus, dass diese Lösung mich weit nach vorne bringt!
    Ich werde das mal so probieren, da ich tatsächlich auf max. ca. 100 gleichzeitig laufende verschiedene Teile kommen könnte!


    Ja du hast recht, es werden nicht 4096 verschiedene Teile nacheinander ankommen!
    Aber es gibt theoretisch 4096 Stück aktuell 1428 mit einer Nummer irgentwo zwischen 1 und 4096, die Teile können wiederkehren deswegen wollte ich mir die Datensätze so erhalten!
    Ich sehe ein, dass ich da so keine Chance habe, denn es hängt tatsächlich mit der Speicherplatzgröße zusammen, viele Variablen=199 Datensätze, das Ganze geschrumpft auf eine Variable=4032 Datensätze!

  • IrrerPolterer


    :danke: das funktioniert super, ich musste nur den Beginn der FOR-Schleife wie folgt ändern! :danke:
    Er hat zwar mit der Intergervariable nicht gemeckert, wollte aber nicht durchlaufen und den STEP musste ich noch angeben! ;)


  • Er hat zwar mit der Intergervariable nicht gemeckert, wollte aber nicht durchlaufen und den STEP musste ich noch angeben! ;)


    Hmmmm, ohne Angabe ist der STEP IMO immer 1. Also, bei mir geht's ohne STEP

    Greetings, Irrer Polterer!

    Wie poste ich falsch? Nachdem ich die Suche und die FAQ erfolgreich ignoriert habe, erstelle ich das gleiche Thema in mehreren Unterforen, benutze einen sehr kreativen Titel wie "Hilfe", am Besten noch mit mehreren Ausrufezeichen, und veröffentliche einen so eindeutigen Text, dass sich jeder etwas Anderes darunter vorstellt.


    Life is a beta version. Full of bugs and no Manual.

  • Hmmmm, ohne Angabe ist der STEP IMO immer 1. Also, bei mir geht's ohne STEP


    Naja , gebe zu, dass ich das STEP nicht wieder entfernt habe, nach dem ich drauf gekommen bin, dass es an der Variable ANZAHL_DATEN geklemmt hat und ich statt dessen direkt die 50 eingetragen habe! ;)
    Aber sooo wie es nun läuft, bin ich schwer zufrieden! :supi:

  • Schön, dass das so klappt,
    aber manchmal braucht man dann doch etwas grössere
    Arrays.


    Hatte da auch mal eine Aufgabe mit einem
    20000 Punkte Array gelöst.


    Dazu die Punkte in mehrere .DAT-Dateien aufgeteilt,
    in einem anderen dann importiert. Und zwei Routinen
    geschrieben, die dann jeweils den Index und den Namen
    des entsprechenden Arrays ermitteln und darauf zugreifen.


    Hier das etwas gekürze Beispiel.



    eine zweite enstsprechende bahnen2.dat


    Und im .SRC dazu:



    Und Tschüss.

Erstelle ein Benutzerkonto oder melde dich an um zu kommentieren

Du musst ein Benutzerkonto haben um einen Kommentar hinterlassen zu können

Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Geht einfach!
Neues Benutzerkonto erstellen
Anmelden
Du hast bereits ein Benutzerkonto? Melde dich hier an.
Jetzt anmelden