Array of Strukt durchsuchen nach der ersten freien Stelle

Begonnen von Frischling, 20. August 2010, 09:20:50

Vorheriges Thema - Nächstes Thema

0 Mitglieder und 1 Gast betrachten dieses Thema.

Frischling

Guten Morgen habe wieder einmal ein Problem bei dem ich Hilfe brauchen kann!

habe ein Array in dem ich eine Struktur aufrufe mit 4 Strings diese werden beschrieben und danach soll die Position der nächsten Struktur die keine Werte enthält mir Angezeigt werden.
Funktioniert mit normalen Strukturen nur damit wie ich Sie abfrage nicht!

Hat jemand eine Idee oder Lösung?

FUNCTION ST_0_TO_INT : INT
(*Die Funktion durchläuft die angeschlossene Struktur und gibt die erste Stelle
aus an der eine Variable den Wert 0 besitzt (Alle Typen auch BOOL) *)
VAR_INPUT
ADR_ST: POINTER TO BYTE; (* Bekommt mit dem ADR Operator die Adresse von der 2. Struktur*)
SIZE_ST: UINT;            (* Bekommt die mit SIZEOF ermittelte Größe einer der beiden Strukturen*)
END_VAR
VAR
i: INT;(*Zählwert*)
END_VAR

ST_0_TO_INT:=0; (*zurücksetzen*)

(*überprüfen an welcher Position in der Struktur leer bzw. Null enthalten ist*)
FOR i:=1 TO SIZE_ST DO
IF ADR_ST^=0 THEN
ST_0_TO_INT:=i; (*zuordnen der Position*)
EXIT;
END_IF
ADR_ST:=ADR_ST+1;(*Zähler erhöhen*)
END_FOR

peewit

ich verstehe dein problem noch nicht so ganz

gib uns mal mehr details

wie sieht deine strukutr in der deklaration aus
du hast eine struktur mit 4 strings, woher kommt die "nächste struktur" ????
warum arbeitest du mit pointer, das macht es sehr kompliziert

Frischling

Hallo Peewit,

mein Array sieht wie folgt aus

arrProtokoll: ARRAY [1..30] OF TYP_TK_Protokoll;   

TYPE Typ_TK_Protokoll :
STRUCT
   strgPeople   : STRING;   (*Wer hat Trockenzeit geändert*)
   strgDate      : STRING;   (*An welchem Tag wurde Trockenzeit geändert*)
   strgTime      : STRING;   (*Zu welcher Zeit wurde Trockenzeit geändert*)
   strgTK_Time   : STRING;   (*geänderte Trockenzeit *)
END_STRUCT
END_TYPE

habe eine Lösung gefunden, ist vieleicht die Holzhacker Methode aber es funktioniert

habe ein weiteres Array gleicher Größe angelegt in dem nur Bool enthalten sind und immer wenn ich die Struktur beschreibe setze ich im zweiten Array ein Bool somit funktioniert meine Funktion.

wenn du eine elegantere Lösung hast würde ich mich sehr freuen...

peewit

ich verstehe ja immer noch nicht was du mit deinen pointer und strukurübergabe machen willst
du kannst doch mittels index ganz sauber auf alles elemente der datenstruktur zugreifen ohne zauberei

1. warum hast du extra noch ein array mit bool angelegt ?
   was hindert dich dran das du diese info in der gleichen struktur ablegst

TYPE Typ_TK_Protokoll :
STRUCT
   data_exist   : bool   (* Daten sind eingetragen *)
   strgPeople   : STRING;   (*Wer hat Trockenzeit geändert*)
   strgDate      : STRING;   (*An welchem Tag wurde Trockenzeit geändert*)
   strgTime      : STRING;   (*Zu welcher Zeit wurde Trockenzeit geändert*)
   strgTK_Time   : STRING;   (*geänderte Trockenzeit *)
END_STRUCT
END_TYPE

2. du kannst ja mit LEN(string) herausfinden ob ein string leer ist oder nicht

3. ich gehe davon aus das du die struktur von 1 bis 30 nacheinander beschreibst
   dann brauchst du doch nur einen schreibindex
   du beginnst mit 1 und schreibst du daten hinein und erhöhst den index um 1
   und so weiter
   ich weiss nur nicht was du machst wenn du beim 30. angelangt bist
   fängst du wieder bei eins und überschreibst alles ?


Frischling

Guten Morgen Peewit,

als Antwort auf deine Frage ja nach dem 30 mal schreibe ich eine XML Datei und das Array wird gelöcht bzw. mit Null beschrieben, danach fange ich von vorne an. Hatte mit meinem vorhandenen Baustein, versucht die Funktion zu lösen ohne an was neues Zudenken sicherlich konnte man es anders lösen aber zu dem Zeitpunkt fehlte mich jegliche Idee deswegen hab ich mich ja Vertrauensvoll an euch gewendet.  du meins ich sollte meine Struktur mit dem BOOL erweitern und mit einer for schleife immer das erste bit der Struktur im Array abfragen. Das wäre die besser alternative... Du hast recht werd es probieren...

Danke für deine Idee... :)

peewit

habe mal etwas heruntergetippt (ohne es zu testen !)
ich hoffe ich habe deinen wunsch verstanden



[gelöscht durch Administrator]

Frischling

Hallo Peewit,

Danke für deine Hilfe!
deine Version bietet ja gleich beide Funktionen in einem (super) habe nach deinem Tip kontrolle der Struktur so aufgebaut funktioniert auch super nur habe ich es in Zwei FB's unterteilt.

Dankeschön für deine Hilfe...
ist immer toll wenn man andere Herangehens weisen bzw. andere Gedanken zum Problem kennenlernen darf :)

peewit

hatte noch was vergessen

beim reset gehört das noch hinzu

full := false;