Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

Wichtig: Bevor Du wegen einem Problem mit der CC2 postest, stelle sicher, daß Du
die neueste OS-Version, die neuseste Compiler-DLL und die neuesten Modulversionen benutzt!
Beachte, daß sich auf der CD zur CC2-Unit/Station auch jetzt noch die ältesten Dateien befinden!
Es gelten folgende Anleitung und Regeln: Regeln CC2Net.de-Forum
Zurück zum Artikel  (Blaue Felder sind Pflichtfelder)


Name:   UserID: 
 E-Mail:
Kategorie
Betreff
Homepage:
Link-Titel:
Link-URL:
Cookie für Name, UserID, E-Mail, Homepage-URL setzen
(Erspart die Neueingabe bei Beiträgen und Antworten)
(Zum Löschen des Cookies hier klicken)
Ich nutze:
C-Control II Unit
C164CI-Controllerboard
C-Control II Station
CCRP5 mit CC2-Unit (Conrad Roboter)
CC2-Application-Board
CC2-StarterBoard
CC2-ReglerBoard
eigenes Board
original OS     OSOPT_V2     OSOPT V3.0 OSOPT V3.1

Kommentar:
Einfügen von HTML im Kommentar:

Link einfügen: <a href="LINKURL" target="_blank">LINKTITEL</a>
Bild einfügen: <img src="BILDURL">
Text formatieren: <b>fetter Text</b>  <i>kursiver Text</i> <u>unterstrichener Text</u>
Kombinationen sind auch möglich z.B.: <b><i>fetter & kursiver Text</i></b>
C2 Quellcode formatieren: <code>Quellcode</code>
ASM Quellcode formatieren: <asm>Quellcode</asm>
(Innerhalb eines Quellcodeabschnitts ist kein html möglich.)
Wichtig: Bitte mache Zeilenumbrüche, bevor Du am rechten Rand des Eingabefeldes ankommst !  

> Hallo André > > ich habe nun meine Datenbankfunktion mit Index und Array fertiggestellt. > Dpos ist die aktuelle, Dfirst die erste und Dlast die letzte Position im Index. > > Folgende Frage hätte ich da aber noch. Wenn ich die richtige Schreibposition gefunden habe, muss > ich ja alle Datensätze darunter um 1 Pos nach unten verschieben oder alle Datensätze darüber um > 1 Pos nach oben. Das sind dann iterativ ziemlich viele 1Byte Kopiervorgänge. > Kann man das auch irgendwie eleganter machen, bsbw. 4 oder 8 Byte mit einem Befehl um 1Byte > verschieben? Dein "CopyDatensatz" Vorschlag müsste das ja auch schon leisten können, oder? > > Beste Gruesse, > > Detlef > > <code> > int Dpos, Dfirst, Dlast; > > int idxDS[MaxHist+1]; // Index auf DS sortiert nach time > > type schedule // Datensatz für Überwachung > { long time; > int aktor; > int modi; > int wert; > } > > schedule DS[MaxHist]; // Tabelle DS mit [MaxHist] Einträgen > > /*****************************************************************************/ > /* Rahmenbedingungen für Optimierung: */ > /* - gelesen und gelöscht wird nur vorn. */ > /* - Eingetragen wird nach größter Wahrscheinlichkeit: */ > /* - Zuerst hinten, dann an vorheriger Position, danach vorn */ > /* - danach in der Tabelle korrekte Position suchen */ > /* - getestet, fehlerfrei! Version 1.0 */ > /* jue, 06.11.2020 */ > /*****************************************************************************/ > function DS_write(long timer, int aktor, int wert, int modi) > { > int pos,posx,posy,new; > > // Die Schreibposition nach Wahrscheinlichkeit suchen. Zuerst hinten, > // dann an vorheriger Position, dann vorn ansonsten innerhalb der Tabelle > if DS[idxDS[Dlast]].time < timer Dpos=Dlast+1; > else if DS[idxDS[Dpos]].time < timer and DS[idxDS[Dpos+1]].time > timer Dpos=Dpos+1; > else if DS[idxDS[Dfirst]].time > timer Dpos=Dfirst-1; > else > { > posx=Dfirst; posy=Dlast; > do // mittig unterhalb oder oberhalb aktueller Pos. suchen > { > if timer < DS[idxDS[Dpos]].time {posy=Dpos; Dpos=(posx+Dpos)/2;} > else {posx=Dpos; Dpos=((posy+Dpos)/2);} > } > while timer < DS[idxDS[Dpos]].time or timer > DS[idxDS[Dpos+1]].time; > } > // nachdem Schreibposition gefunden, nun den neuen DS eintragen > if (Dpos-Dfirst) <= (Dlast-Dpos) // nach vorn umsortieren > { > if Dfirst > 0 {new=idxDS[Dfirst-1]; pos=Dfirst;} > else {new=idxDS[Dfirst]; pos=Dfirst+1;} > while pos <= Dpos {idxDS[pos-1]=idxDS[pos]; pos=pos+1;} > Dfirst=Dfirst-1; // Index nach vorn erweitern > idxDS[pos-1]=new; > } > else // nach hinten umsortieren > { > if Dlast < MaxHist {new=idxDS[Dlast+1]; pos=Dlast;} > else {new=idxDS[Dlast]; pos=Dlast-1;} > while pos > Dpos {idxDS[pos+1]=idxDS[pos]; pos=pos-1;} > Dlast=Dlast+1; // Index nach hinten verlängern > idxDS[pos+1]=new; > } > DS[new].time =timer; // Datensatz schreiben > DS[new].aktor=aktor; > DS[new].wert =wert; > DS[new].modi = modi; > } > </code> > > > > Hallo Detlef, > > > > wenn nicht unbedingt erforderlich, sollte man nicht ständig umkopieren, > > sondern eher ein Index-Array erstellen in denen nur die Indizies sortiert werden. > > > > Aber nun erstmal Punkt für Punkt: > > Die Definition des eigenen Datentyps. > > Du hast einen Datentyp Datensatz definiert, der vier Arrays mit jeweils > > 50 Elementen hat. Ich denke, daß Du das so nicht definieren wolltest, > > sondern ein Datensatz je ein Feld time, aktor, modi und wert haben soll. > > Dvon dann 50 Datensätze. > > Die Definition muß dann folgendermaßen aussehen: > > <code> > > type Datensatz > > { long time; > > int aktor; > > int modi; > > int wert; > > } > > > > Datensatz test[50]; > > </code> > > > > Der nächste Punkt ist das Kopieren von eigenen Datentypen. > > Das geht leider nicht mit einfacher Zuweisung. > > Für das OS sind eigene Datentypen einfach nur Arrays. > > Zum Kopieren muß man die Funktion copypos des Moduls mem.c2 > > etwas mißbrauchen, indem man eine eigene Funktion zusammenstellt. > > Das würde dann so aussehen: > > <code> > > inline function copyDatensatz ( Datensatz dest[], int destpos, Datensatz src[], int srcpos, int len ) > > { > > inline vmcodes.VM_INLINE_SYSCALL+mem.Segment; > > inline mem._COPY; > > } > > </code> > > > > Beim Aufruf muß man aber etwas rechnen oder eine Hilfsfunktoin verwenden. > > Ein Datensatz besteht hier aus 10 Byte. (long(4) + 3x int(2)) > > Will man nun test[25] auf test[20] kopieren, schaut das so aus: > > <code> > > copyDatensatz(Datensatz, 20*10, Datensatz, 25*10, 10); > > </code> > > Wichtig dabei ist immer, daß hier in Byte gerechnet werden muß. > > Als Anmerkung: Bei zusammengesetzten Datentypen - besonders bei > > mehr Mehrdimensionalen - immer auf die Größe achten. > > "Datensatz" ist eindimensional und hat hier 500 Byte, also kein Problem. > > > > > > Statt nun im Array selbst umzukopieren kann man sich auch ein Index-Array anlegen, > > welches man zum Sortieren nutzt. > > Der Vorteil ist, wenn man verschiedene Sortierungen benötigt, muß man nicht immer > > am Datensatz umkopieren, sondern man kann verschiende Index-Arrays nutzen. > > > > <code> > > Datensatz test[50]; // 50 Datensätze > > byte Index[50]; //Arrays mit Index-Positionen, je nach Sortierung > > </code> > > Wir brauchen hier zwar 50 Byte mehr RAM, sind aber flexibler in der Nutzung. > > > > Unsortiert weisen wir Index[] die Werte 0 bis 49 als Initialisieung zu: > > <code> for i = 0 ... 49 Index[i]=i;</code> > > Der Zugriff auf Datensatz erfolgt immer so: > > <code>Datensatz[Index[Position]]</code> > > > > Wenn nun Position 25 mit 20 getauscht werden soll, braucht man die Werte > > nur Index zuweisen: > > <code>Index[20]=25; > > Index[25]=20;</code> > > Und schon sind die Positionen bei Zugriff über <code>Datensatz[Index[Position]]</code> getauscht. > > > > > > > > MfG André H. > > > > > > > Guten Morgen! > > > > > > Ich habe mal Zeit für eine Optimierung der Haussteuerung und bräuchte etwas Unterstützung. > > > > > > Ich möchte "datenbankähnlich" Einträge in einem Array sortieren/indizieren. > > > > > > Dazu habe ich zwei Fragen: > > > > > > 1. Hat sich jemand damit schonmal befasst? > > > > > > 2. Folgende Detailfunktion würde mich schon weiterbringen: > > > > > > <code> > > > Type Datensatz > > > { long time[50]; > > > int aktor[50]; > > > int modi [50]; > > > int wert [50]; > > > } > > > > > > Datensatz test; > > > > > > function copy() > > > { > > > test[20] = test[25]; // ich möchte also einen DS im Array "test" an eine andere Position kopieren > > > > > > } > > > > > > > > > </code> > > > > > > Für konstruktive Hilfe wäre ich sehr dankbar. > > > > > > Beste Grüße > > > > > > Detlef > > > > > > > > > > > > > > > > > >
Dateianhang: (.gif, .png., .jpg, .zip, .rar)
max. 256kB
max. 256kB