RingBuffer



  • Sorry meine Antworten haben sich auf die ursprüngliche Augfgabenstellung von NasenMann bezogen



  • jo kein problem, wobei ich ja nasenmanns problem nicht so richtig verstehe ;), weil wenn er schon einen FIFO will warum schreibt er dann keinen 😉

    bye

    tt



  • Hi,

    thx erst mal an alle, aber das problem hat sich gelöst. Dachte wir sollen das erst ohne dateien schreiben mit dem zwischenspeichern der werte, aber da wir jetzt mit Dateien arbeiten ist es doch schon um einiges einfacher. THX.

    mfg
    Latzi



  • Hi,

    habe den ringbuffer jetzt geschrieben allerdings habe ich folgende Irrsinnigen Fehler.

    Also bis zum einlesen der datei stimmen die Werte noch. Während des Push-Vorganges ändert sich aber erst nach dem 3-4 mal der org. Wert in 4. Bei der Variable Bart. Lass ich sie weg passiert das bei nout, welche ich ja benötige. Woran liegt das ?

    PS: Hauptprogramm ist einfach eine aufruf der Funktion mit übergabe der Runtime Argumente und den nötigen Includes ... Größe vom Ringbuffer = 10 Werte.

    mfg Latzi

    static int count = 0;
    
    typedef struct element
    {
       char nutzlast[20];
       int zelle;
       struct element * next;
    }Element;
    
    static Element * first;
    
    Element* createStructElement(char* nutzlast)
    {
       Element * neu;
       neu = (Element *) malloc (sizeof(Element));
    
       sprintf(neu->nutzlast,"%s", nutzlast);
       neu->zelle = count;
       neu->next = NULL;
    
       return (neu);
    }
    
    void push(char* Nutzlast)
    {
       static Element * tmp;
       static Element * prelast;
       int tmpcount, i;
    
       if (count == 0)
       {
          tmp = createStructElement(Nutzlast);
          first = tmp;
       }
       else if (count >= 10)
       {
          tmpcount = count - 10;
          tmp = first;
          for (i = 0; i < tmpcount; i++)
          {
             tmp = tmp->next;
          }
          sprintf(tmp->nutzlast,"%s", Nutzlast);
          if (count == 19) count = count - 10;
       }
       else
       {
          prelast = tmp;
          tmp = createStructElement(Nutzlast);
          prelast->next = tmp;
       }
       count++;
    }
    
    int info1h2 (int argc, char *argv[])
    {
       Element * prelast;
       Element * tmp;
       FILE *datei;
       int i = 0;
       int anfang = 0;
       int nout = atoi(argv[1]);
       int bart = nout; // Unnötige Variable, trotzdem wichtig
       char q[20];
       char *w = q;
    
       datei = fopen("info1h2.dat", "r");
    
       if (datei != NULL)
       {
          fscanf(datei,"%d %d\n", &i, &anfang);
          while ((fscanf(datei,"%s\n", q)) != EOF)
          {
             push(w);
          }
          fclose(datei);
          remove("info1h2.dat");
          count = i;
       }
       datei = fopen("info1h2.dat", "a+");
    
       for (i = 2; i < argc; i++)
       {
          push(argv[i]);
       }
    
       for (i = 0, tmp = first; i < anfang; i++) tmp = tmp->next;
    
       for (i = 0; i < nout; i++)
       {
          printf("%2d. Zelle: %s \n", tmp->zelle, tmp->nutzlast);
          if (tmp->next == NULL) tmp = first;
          else tmp = tmp->next;
       }
    
       fprintf(datei, "%d %d\n", count, tmp->zelle);
       tmp = first;
       while (tmp->next!=NULL)
       {
          fprintf(datei, "%s\n", tmp->nutzlast);
          tmp = tmp->next;
       }
       fprintf(datei, "%s\n", tmp->nutzlast);
       fclose(datei);
    
       tmp = first;
    
       while (tmp->next!=NULL)
       {
          prelast = tmp;
          tmp = prelast->next;
          free(prelast);
       }
       free(tmp);
    
       return 0;
    }
    


  • Könnte es sein das die Variable q falsch dimensioniert ist. in funktiononen werden daten typischer weise auf dem stack angelegt, in der Reihenfolge das die letzte deklaration ganz oben ist.
    Deine Schilderung erinnert mich ähnliche Probleme. Deshalb lese ich typischerweise die
    Daten mit fgets in einen großen stringbuffer. und verarbeite in dann mit sscanf

    bzw mit bei string mit strcpy. Da dein q auf 19 Zeichen plus schließnede 0 begrenzt ist
    würde ich vor dem kopieren die stringlänge im LeseBuffer feststellen und dann entweder eine Fehlermeldung bringen oder nur 19 Zeichen nach q kopieren.

    int bart = nout; // Unnötige Variable, trotzdem wichtig
       char q[20];
       char *w = q;
    

    Übrigens da *w auf q zeigt dürfen dort auch nur 19 Zeichen und schliesende 0 eingetragen werden.

    Da du sehr sparsam mit der länge deiner chr Buffer umgehst. Kann es sein das deine Daten 20 Zeichen lang sind und du vergessen hast die schließende Null zu berücksichtigen.

    Aus diesem Grund verfahre ich immer wie folgt.
    Stringlängen werden immer #defines deklariert wenn ich dann von 20 auf 21 charakters muss geschieht das durch das Ändern des #defines an allen Stellen.
    Desweiteren deklariere ich Stringbuffer nach der unten gezeigten Methode

    #define STRINGLEN 256
    char Buffer[STRINGLEN+1];// das +1 ist eine Marotte
                             // von mir um den üblichen Fehler zu vermeiden das für
                             // die schließende Null kein Platz mehr da ist.
    

    😃


Anmelden zum Antworten