puffergroesse anpassen



  • hallo.

    ich will aus einer datei mit der groesse ttl lesen und das gelesene verschicken. die daten werden in ein puffer mit der laenge bffrsze gelesen und daraus verschickt. die anzahl der daten, die bereits gelesen wurden, wird in der variable cnt festgehalten. der folgende code legt fest, wieviel bytes in das puffer gelesen werden sollen und speichert die anzahl in rdin.

    rdin = (bffrsze % (ttl - cnt));
    

    der obice code lauft auch, aber nur solange (ttl-cnt) nicht ein vielfaches von bffrrsze ist, da das modulo ja entsprechend null ist. gibt es eine moeglichkeit rdin festzulegen ohne eine extra if sequenz einzufuegen, die testet ob (ttl-cnt) zufaellig ein teiler von bffrsze ist?

    Gruss
    caspar



  • bffrsze prim wählen?

    Ich verstehe allerdings nicht, was Du da machst. Aber wieso machst Du den Puffer nicht einfach jedes mal voll udn sammelst nur am Schluß die Reste ein?



  • wieso denn eine primzahl? dann kann doch (ttl-cnt) immer noch gleich bffrsze sein und rdin ist 0. wenn ich erst zum schluss den rest einsammeln wuerde, muesste ich die anzahl der noch verbleibenden bytes, also (ttl-cnt), immer pruefen - das wollte ich mir sparen.



  • Caspar schrieb:

    wieso denn eine primzahl? dann kann doch (ttl-cnt) immer noch gleich bffrsze sein und rdin ist 0.

    Die meisten Primzahlen haben bedeutend weniger Teiler als eine beliebige Zahlen. Wenn Du weiterhin mit Modulo arbeiten willst, wird Dir nichts anderes übrigen bleiben.

    wenn ich erst zum schluss den rest einsammeln wuerde, muesste ich die anzahl der noch verbleibenden bytes, also (ttl-cnt), immer pruefen - das wollte ich mir sparen.

    Verstehe ich nicht. Kommst Du derzeit ohne Schleife aus?

    Ich stelle mir das etwa vor (ausführlich):

    size_t gesamtgroesse = ...; /* ttl? */
    size_t bisher_hab_ich = 0;
    void *datenkram = ...;
    size_t grenze = (gesamtgroesse/BUFSIZE)*BUFSIZE;
    
    while (bisher_hab_ich < grenze) {
        machweissnichwat(BUFSIZE, datenkram, bisher_hab_ich);
        bisher_hab_ich += BUFSIZE;
    }
    
    machweissnichwat(gesamtgroesse - grenze, datenkram, bisher_hab_ich);
    


  • eine schleife habe ich schon... hier ist sie:

    char bffr[buffrsize];       //das puffer ;)
    unsigned int rd, rdin; 
    int cnt;                          //enthaelt anzahl der abzuarbeitenden bits
    
    while (cnt < ttl) {
    
                    rdin = (buffrsize % (ttl - cnt));  //wenn ttl-cnt == buffersize gibts eine endlos....
                    rd = bla(bffr, rdin);                    //rd und rdin sind immer gleich
    
                    machweissnichwat(bffr, rdin)
                    cnt += rdin;                     //cnt += rd ginge eben auch
    }
    

    dein beispiel war also ziemlich treffend. letzen endes werde ich es wie du machen: nach der schleife einen weiteren machweissnichwat()-aufruf. danke 😃


Anmelden zum Antworten