wie kann man zwei buffer speichersparend zusammenfügen?



  • Ich muss umkopieren weil der ganze Buffer (buf1+buf2) an eine Funktion übergeben werden, die prüft ob genug ram übrig ist um den buffer weiter zu verarbeiten.
    Wenn ich aber zuerst buffer1 und dann erst buffer2 übergeben dann kommt natürlich ein blödsinn raus, weil es passieren kann das genug platz für buffer1 ist, aber nicht mehr für buffer2.
    Die beiden gehören aber zusammen, da der kleine buffer die informationen enthält wie der 2te buffer interpretiert werden muss.

    LG



  • boah, sorry für das Deutsch. So schlimm wars auch schon lange nicht mehr -.-



  • du kannst dir auch virtuelle strings anlegen, als bsp.

    typedef struct _myStr{
      char *data;
      struct _myStr *next;
    }myStr;
    
    void printString(myStr *s){
      do{
        printf("%s",s->data);
        s = s->next;
      }while(s);
    }
    
    int main(void){
      myStr a;
      myStr b;
      a.data = "hello"; 
      b.data = " world";
      a.next = &b;
      b.next = 0;
      printString(&a);
      return 0;
    }
    

    so in der richtung 🙂



  • Das Problem dabei ist, dass nicht ich die Funktion geschrieben habe (und diese verlangt eben const char *msg ).

    LG



  • earli schrieb:

    for (int i = 0; i < SIZE1+SIZE2; i++) {
        do_stuff(i < SIZE1 ? buf1[i] : buf2[i-SIZE1]);
    }
    

    wenn du weißt wie es geht, dann post doch bitte nicht sowas! 🙄



  • Fragesteller0815 schrieb:

    Ich muss umkopieren weil der ganze Buffer (buf1+buf2) an eine Funktion übergeben werden, die prüft ob genug ram übrig ist um den buffer weiter zu verarbeiten.
    Wenn ich aber zuerst buffer1 und dann erst buffer2 übergeben dann kommt natürlich ein blödsinn raus, weil es passieren kann das genug platz für buffer1 ist, aber nicht mehr für buffer2.

    Was kannst Du denn Deiner Pufferüberprüfungsfunktion übergeben und was liefert die zurück?



  • Die Funktion sieht so aus: bool sendMsg(const char *toSend, const int len) und die liefert eben false zurück wenn nicht genug speicher da is.



  • Konntest du das Problem inzwischen lösen?



  • Fragesteller0815 schrieb:

    Ich bin im moment vor einem Problem.
    Ich habe zwei Buffer char buf1[100] und char buf2[ca. 921600] , und möchte diese so zusammenfügen, dass am Ende von buf1 buf2 steht. Ich könnte zwar eine temporäres Array mit den addierten größen erstellen, allerdings kommt mir das weder schnell noch platzsparend vor.
    Gibt es eine Möglichkeit das elegant zu lösen?

    Ja, Du benutzt einfach von vorn herein nur einen Puffer und machst es so:

    char gesamt[100+921600];
    char *buff1 = gesamt;
    char *buff2 = gesamt + 100;
    

    Damit liegen beide Speicherbereiche direkt hintereinander. Du brauchst nichts zu kopieren und verschwendest keinen Speicher.
    Überall wo Du bisher buff1 und buff2 benutzt hast, nimmst Du nun die Pointer.



  • Das ist etwas off-topic, aber eigentlich ist dein Projekt schon irgendwie verkorkst, dass es überhaupt 1-Mio-elementige Arrays gibt. Ihr solltet euch vielleicht eine andere Repräsentation der Daten überlegen.



  • earli schrieb:

    Das ist etwas off-topic, aber eigentlich ist dein Projekt schon irgendwie verkorkst, dass es überhaupt 1-Mio-elementige Arrays gibt. Ihr solltet euch vielleicht eine andere Repräsentation der Daten überlegen.

    das ist nicht nur off-topic, sondern auch eine haltlose vermutung, woher willst du wissen mit was für daten die jonglieren müssen?

    auch hier im forum gilt der grundsatz „in dubio pro reo“
    😃

    lg lolo



  • noobLolo schrieb:

    earli schrieb:

    Das ist etwas off-topic, aber eigentlich ist dein Projekt schon irgendwie verkorkst, dass es überhaupt 1-Mio-elementige Arrays gibt. Ihr solltet euch vielleicht eine andere Repräsentation der Daten überlegen.

    das ist nicht nur off-topic, sondern auch eine haltlose vermutung, woher willst du wissen mit was für daten die jonglieren müssen?

    auch hier im forum gilt der grundsatz „in dubio pro reo“
    😃

    lg lolo

    Ich hab zwar nicht explizit gefragt, aber eigentlich ging es um "Erfahren und Helfen".

    Auf jeden Fall gibt es in dem Beispiel char-Arrays mit 100+921600 Elementen.



  • sind das schon GB oder noch MB 😃



  • Ich hab das Problem mehr oder weniger gelöst.

    Ich konnte den großen Buffer verkleinern (jpeg-Kompression (640*480*3=921600)) auf ca 25000. das kopieren in einen 3ten buffer (größe von 1+2) blieb mir aber dennoch nicht erspart.

    LG



  • JPEG kann doch nur mehr Aufwand kosten als reines kopieren.



  • Das schon, aber letzten Endes verringert sich der Aufwand, da die Daten übers Netzwerk versendet werden.

    Aber der Zweck meiner Frage war ja nur ob es eine Möglichkeit der schnellen und speichersparenden Zusammenfügung von Buffern gibt - und das wurde beantwortet.



  • pointercrash() schrieb:

    kimmi schrieb:

    Meines Wissens nach kann realloc Speicherbereiche nicht direkt vergrößern. Intern legt auch er einen größeren Buffer an und kopiert den alten Inhalt in den neuen Buffer.

    Darauf läuft's zwar meistens hinaus, heißt aber nicht, daß realloc das nicht kann. realloc() prüft meist, ob der direkt angrenzende Heapblock ausreichend für die anstehende Vergrößerung ist und verzichtet im Positiv- Fall auf das Umkopieren. Wer gesicherte Timings braucht, sollte aber auf realloc verzichten, weil's mal so, mal so kommt.

    Wieder was gelernt, das war mir noch nicht bewußt.

    Gruß Kimmi


Anmelden zum Antworten