Ende eines Arrays mit Pointer prüfen?



  • Hallo,

    ich habe ein festes Array mit 10 double-werten das als Ringpuffer dient mit jeweils einem lese- und schreibpointer auf das Array.
    wenn ich also den 10ten wert geschrieben habe soll der schreibpointer mir wieder auf den ersten wert zeigen.

    habe zwar eine funktion geschrieben um das ende zu prüfen aber er schreibt weiter und springt nicht zurück.

    vllt könnt ihr mir helfen

    aso, nicht wundern das ich ptr auf ptr auf ptr auf ptr habe 🙂 wusste nicht wie ich es anders realisieren konnte das mein *ptr in der main genutzt wird.
    so sieht mein aufbau aus aber das nur zur info. hat ja nichts mit der problematik an sich zu tun.
    main() -> write() -> input() -> limit()

    //andere funktion in der die prüffunktion aufgerufen wird
        if (limitw(&ppwrite,rpuffer)){ 
            **ppwrite = rpuffer; 
        }
    
    int limitw (double ****ppwrite, double rpuffer[MAXVALUE]){ 
    
        int check=0; 
        if ( ***ppwrite >= rpuffer+((MAXVALUE*8)-1) ) 
            check=1; 
    
        else if ( ***ppwrite <= rpuffer+(((MAXVALUE-1)*8)-1) ) 
            check=0; 
    
        return check; 
    }
    

    MAXVALUE = 10

    und ich sage: wenn ptr >= 10*8(8bytes für double-wert) -1 da, der letzte wert ja zwischen 72-79 steht(stehen sollte), dann setze mir den zeiger auf das erste feld des arrays aber das klappt nicht.
    bastel da schon seit tagen dran rum aber funkt einfach nicht..

    vielen dank schon im voraus



  • Pointer-Arithmetik berücksichtigt schon die Größe der unterliegenden Datentypen - d.h. du kannst dort das "*8" weglassen. Aktuell überprüfst du nämlich, ob der Pointer weiter als 80 double-Werte vom Beginn des Puffers weg ist.



  • hallo,

    wieso?

    mit

    if ( ***ppwrite >= rpuffer+((MAXVALUE*8)-1) )

    prüfe ich doch die adressen sprich ob er 79 bytes von der startadresse weg ist, ich sagen ja nicht rpuffer[] für den inhalt oder sehe ich das falsch?



  • Nein "p+x" liefert nicht die Adresse "x Byte hinter p", sondern "x Objekte hinter p" (was für Objekte das sind, hängt vom Typ von p ab - in deinem Fall wäre p ein double* (bzw. double[], aber das ist hierfür äquivalent), also arbeitet die Pointer-Arithmetik auf doubles).



  • omg es funktioniert 👍 👍

    vielen dank. hätte ich mir zahlreiche stunden sparen können 🙂

    danke



  • hallo,

    hab da noch eine frage.

    gleiches programm, sprich einen ringpuffer mit 10 elementen in einem array, auf dessen 1. element ein lese -und schreibpointer zeigen. und durch jeden lese -und schreibvorgang soll der zeiger zum nächsten feld zeigen und nach dem 10ten wieder auf das erste.

    so beim schreiben kein problem.
    beim lesen realisiere ich es so, dass ich den lesepointer erst initialisiere(auf das erste element zeige) wenn ich den ersten wert schreibe.

    aber wie prüfe ich im nächsten feld ob dort ein wert geschrieben wurde bzw. ob es leer ist???
    das array stellt automatisch werte da rein die so aussehen 9255931349317831000000000000000000000000.000 ( sind noch ein paar nullen mehr 🙂 )

    weiß nicht mit welcher bedingung oder welchem ausdruck ich das prüfen kann...

    gruß



  • if(lesepointer==schreibpointer) printf("Puffer ist leer");
    


  • ja hab ich mir auch zunächst gedacht aber wenn der schreibpointer alle 10 elemente geschrieben hat und schon wieder das 1. element überschriebt zeigt er mir z.b. auf das 2. element.

    somit würde der leseptr nur das erste feld auslesen obwohl die anderen auch schon beschrieben wurden.



  • Wenn beide Zeiger auf das selbe Element verweisen, ist dein Puffer entweder voll (dann hat der Schreibzeiger den Lesezeiger "überrundet") oder leer (dann hat der Lesezeiger den Schreibzeiger eingeholt). Den Unterschied mußt du noch manuell erkennen, indem du die vollen Runden mitzählst.


Anmelden zum Antworten