Ich möchte eine soweit wie möglich speicherschonende Möglichkeit überlappende Speicherbereiche zu verschieben. Dabei wird immer von hinten nach vorne verschoben, sprich: Speicherzelle: 0123456789... Wert: abcdefghij... nach Verschiebung Speicherzelle: 0123456789... Wert: efghijklmn... Wie mache ich das jetzt am besten? 1. eigene Kopierroutine schreiben, die das kann 2. verwenden von memcpy (weil nur von hinten nach vorne kopiert wird, würde das funktionieren?) 3. verwenden von memmove (benötigt memmove nicht zusätzlichen Speicher für eine Zwischenkopie und wäre somit speicherhungriger?) Ach ja, Controller ist ein AVR32 (32Bit) mit AVR32-Studio Schon mal Danke für die Hinweise, die da kommen mögen
William K. schrieb: > (benötigt memmove nicht zusätzlichen Speicher > für eine Zwischenkopie und wäre somit speicherhungriger?) Nein, memmove entscheidet anhand der Art der Überlappung die Richtung, in der kopiert wird.
Oder ein anderes Konzept. Irgend wie hört sich dein Thred so an, als ob Du einen Ringpuffer verwenden könntest. Volker
A. K. schrieb: > Nein, memmove entscheidet anhand der Art der Überlappung die Richtung, > in der kopiert wird. Das würde die Entscheidung erleichtern: memmove
Volker Zabe schrieb: > Irgend wie hört sich dein Thred so an, als ob Du einen Ringpuffer > verwenden könntest. Ne, kein Ringpuffer, es werden einfach nur Bereiche gelöscht und alles was dahinter liegt nach vorne verschoben
Also einen halben Ringpuffer (nur den Ausgang)? Es ist effektiver einen Pointer hoch zusetzen als Speicher zu verschieben.
1 | char buffer[200]; |
2 | .
|
3 | .
|
4 | memmove(buffer,buffer+5,100); // Verschieben A |
5 | .
|
6 | char *ptr=buffer; |
7 | ptr += 5; // "Verschieben" B |
8 | .
|
9 | .
|
10 | x = buffer[0]; // Zugriff A |
11 | x = ptr[0] // Zugriff B |
William K. schrieb: > Ne, kein Ringpuffer, es werden einfach nur Bereiche gelöscht und alles > was dahinter liegt nach vorne verschoben Genau das macht ein Ringpuffer auch. Nur ohne irgendwas verschieben zu müssen (Ausser den Zeiger auf den Anfang). Solange immer nur 'vorne' oder 'hinten' gelöscht wird kann das also eine sehr effektive Art der Speicherung sein. Ob Du jetzt ein lineares Array benutzt oder einen Ringpuffer hängt davon ab wie oft Du auf einen Wert der nicht am Anfang liegt zugreifst, und wie oft etwas gelöscht wird. Bei viel häufigeren Zugriffen auf Werte die nicht am Anfang oder Ende stehen, wird die Performance wegen der nötigen Adressberechnung mit Prüfung der hinteren Grenze langsamer.
Ein Ringpuffer hat den Nachteil, daß er mitten im Datenfeld überlaufen kann. Dann guckt z.B. ein strcmp ganz schön blöd aus der Wäsche. Oder man schreibt sich alle Parserfunktionen selber als Wrap-Around fest. Ein Verschieben des nächsten Records an den Anfang ist also ne clevere Idee. Peter
Peter Dannegger schrieb: > Ein Verschieben des nächsten Records an den Anfang ist also ne clevere > Idee. Halte ich in diesem Thred nicht für Richtig. William schrieb ja, das er nur Entleeren möchte. So kann erstmal kein Wrap-Around enstehen. Er hat auch nichts von Stringverarbeitung geschrieben,das ein Speicher ohne Wrap-Around erforderlich macht. Ok, sein Beispiel war mit Buchstaben. Wie meist fehlen noch wichtige Information, um diese Frage (Zeiger/Verschiebung?) eindeutig beantworten zu können.
Peter Dannegger schrieb: > Ein Ringpuffer hat den Nachteil, daß er mitten im Datenfeld überlaufen > kann. > Dann guckt z.B. ein strcmp ganz schön blöd aus der Wäsche. Hmm, Peter weisst Du etwas was ich nicht weiß :-) ich hatte geschrieben, daß es dann unvorteilhaft wird, wenn man öfter auf Daten zugreifen muß, die nicht am Anfang oder Ende stehen. Wenn Stringfunktionen im Puffer benutzt werden sollen gehts natürlich nicht wegen wrap around, dazu müsste man sich den String erst rauskopieren. Aber ich (und Volker wohl auch) hatten etwas die Vermutung, daß das eine Art FIFO werden soll, deshalb der Hinweis auf Ringpuffer.
Ein Ringpuffer nützt mir nichts, da nicht nur am Anfang gelöscht wird, sondern auch Teile mittendrin gelöscht bzw. "ausgeschnitten" werden. >Wie meist fehlen noch wichtige Information, um diese Frage >(Zeiger/Verschiebung?) eindeutig beantworten zu können. Siehe meine Eingangsfragen, da wusste ich noch nicht, dass jemand mein Konzept in Frage stellt. Fragt und ich antworte, genau so wie ihr antwortet, wenn ich frage. Achso es sind keine Strings
William K. schrieb: > Siehe meine Eingangsfragen, da wusste ich noch nicht, dass jemand mein > Konzept in Frage stellt. Es ist sehr oft der Fall, dass es 2 Möglichkeiten gibt * entweder man beantwortet eine Frage buchstabengemäss. Dann hat der Fragesteller seine Antwort * oder aber man überlegt sich, ob hinter der Frage nicht mehr stecken könnte. Ob zb die Frage nur dadurch entsteht, dass ein ungeschicktes Konzept angewendet wird. In dem Fall ist dem Fragesteller dann oft besser geholfen, wenn man ihm zeigt, wo sein Konzept fraglich ist und wie man das besser machen kann Als Analogie: Wenn die Frage lautet: An welchem Ende greife ich eine Schaufel an? Dann kann man natürlich sagen: Das Blech kommt nach unten und der Stil nach oben. Man kann natürlich auch (aus dem schmückenden Beiwerk der Frage) schliessen, dass er die Baugrube für ein Haus ausheben will. Dann ist ihm mit 'Bestell dir einen Bagger' besser geholfen. Nur weil er bisher nicht wusste, dass es so etwas wie einen Bagger gibt, muss man ihn ja nicht mit einer Schaufel wissentlich wochenlang im Erdreich wühlen lassen. Nun ist es so, dass man in der Informatik Daten nur ungerne im Speicher rumkopiert. Wenn irgendmöglich (und natürlich sinnvoll) vermeidet man das und sucht sich lieber Organisationsstrukturen bei denen das nicht notwendig ist. Von daher war es relativ naheliegend mal nachzufragen, was denn die Aufgabe von einer höheren Warte aus gesehen darstellt.
@Karl heinz Buchegger Ich versuch mal das Ziel zu umreissen: Es werden Daten seriell abgeholt und in einen Speicherbereich geschrieben. Der User modifiziert die Daten und schickt diese zurück. Modifizieren heißt hier unter anderem Löschen und Einfügen von Daten und das an beliebiger Stelle.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.