realloc : Verständnis / Rechenproblem



  • Jetzt noch 2 Zustatzfragen :

    1.) Wie "oft" bzw. wie lange kann ich das Spiel mit dem Speicherplatz erhöhen treiben? Also wann geht mir der Speicherplatz aus?

    2.) Wenn ich mit fopen eine *.jpg Datei mit "rb" aufmache (Ist nur ein Versuchsprogramm), wie lese ich die am Sinnvollsten ein?
    Habe ein paar Zeilen geschrieben um eine Bilddatei zu kopieren. Ich lese jetzt "%c" ein, schreibs in nen Puffer und kopiere dann in einen mit "wb" geöffnete neue Datei.
    Funktioniert, aber ich schätze "%c" ist nicht unbedingt sinnvoll bei Binary Open?


  • Mod

    beginner_offl schrieb:

    Jetzt noch 2 Zustatzfragen :

    1.) Wie "oft" bzw. wie lange kann ich das Spiel mit dem Speicherplatz erhöhen treiben? Also wann geht mir der Speicherplatz aus?

    Na dann, wenn dein Prozess keinen zusätzlichen Speicher mehr bekommt (d.h. in der Regel, dass dem ganzen System der Speicher ausgeht).

    2.) Wenn ich mit fopen eine *.jpg Datei mit "rb" aufmache (Ist nur ein Versuchsprogramm), wie lese ich die am Sinnvollsten ein?
    Habe ein paar Zeilen geschrieben um eine Bilddatei zu kopieren. Ich lese jetzt "%c" ein, schreibs in nen Puffer und kopiere dann in einen mit "wb" geöffnete neue Datei.
    Funktioniert, aber ich schätze "%c" ist nicht unbedingt sinnvoll bei Binary Open?

    %c und binary haben nichts miteinander zu tun. Binary macht bloß, dass unter Windows Zeilenumbrüche nicht durch \n\r ersetzt werden (bzw. umgekehrt). Was sehr sinnvoll ist bei Daten, bei denen der Wert jedes einzelnen Zeichens wichtig ist, wie hier.
    Einzelne Zeichen mit scanf (oder in geringerem Maße auch getc) einzulesen ist oft sehr ineffizient. Wenn du ohnehin viele Zeichen auf einmal ohne besondere Formatierung in einen Puffer einlesen willst, dann nimm fread.



  • Ok, danke.
    Ich hatte fgetc() benutzt. Die größe für fread kann ich ja dann mit Zeiger an ende der Datei positionieren, ftell usw. ermitteln. ?


  • Mod

    beginner_offl schrieb:

    Die größe für fread kann ich ja dann mit Zeiger an ende der Datei positionieren, ftell usw. ermitteln. ?

    Ja. Erinnere dich:

    SeppJ schrieb:

    beginner88888 schrieb:

    DAS... wäre die "supreme" Lösung, nur leider hab ich nicht den blassesten Schimmer wie ich das machen soll. 😕 😕

    Entweder mit plattformspezifischer Funktion stat (ist aber auf so gut wie allen Plattformen vorhanden); oder ans Ende springen, Position bestimmen, wieder an den Anfang springen. Guck mal in eine Referenz des stdio.h-Headers, da findest du entsprechende Funktionen.



  • ABER : Bei meinem vorherigen Codes

    C:

    int *iptr;

    iptr=malloc(sizeof(int)*2)); // Speicher für 2 INT

    *iptr=5;
    iptr++;
    *iptr=10; // würde irgendwohin schreiben??

    , würde das ptr++ den Zeiger zwar auch erhöhen , da es aber kein "richtiges" Array ist( Er zeigt nur auf einen mit malloc vergrößterten Speicherbreich), würde er hald irgendwohin zeigen, aber nicht mehr im "Bereich" liegen?!?, *(ptr+X)=Y weist aber dem Xten Element des "Arrays" das mit Malloc oder Realloc erzeugt wurde den Wert Y zu.
    Richtig soweit?

    also => iptr++ geht nicht. Hab´s mal eben probiert, hatte am Samstag kein PC, war alles theoretisch.

    Das hier als "Versuchscode" :

    char *buffer=NULL;
    
    if (open) {
              puts("f open");
              fseek(open, 0, SEEK_END);
              l1=ftell(open);
              fseek(open, 0, SEEK_SET);
    
              }
    
    buffer=malloc(l1);  
    
    while (i <l1){
           *buffer=fgetc(open);
           printf("%c",*buffer);
    
           i++;
           buffer++   //kannst vergessen, hatte ich doch recht, geht nicht??
    
           }
    


  • Statt deiner while (i <l1){-Schleife tut es auch ein fread Aufruf.

    Und statt printf("%c", nimm das putchar( (fällt bei fread aber eh weg.

    beginner schrieb:

    buffer++ //kannst vergessen, hatte ich doch recht, geht nicht??

    Gehen tut das schon, aber:
    Du musst dir die Adresse merken, die du von malloc bekommen hast, sonst geht das free und realloc nicht.



  • Habs mittlerweile mit fread usw . relativ elegant gelöst, das einzeln einlesen ist ja auch Mist, war eher Theoretischer Natur:

    Hatte am Samstag keine PC, war auf einer Geb-Party( Ja, die war toll, so spannend das ich die Zeit im Forum verbracht habe :-)) ).

    Mir ging das
    ptr++ nicht ein , weil

    while (i <l1){
           *buffer=fgetc(open);
           printf("%c",*buffer);
    
           i++;
           buffer++   // Stimmt, das geht noch
    
           }
    
    //die AUsgabe war falsch, ich benutze: 
    
    for (dummy=0; dummy <l1; dummy++){
         printf("%c", buffer[dummy]);   //Enthielt nur Müll... Klar, Buffer wurde incrementiert,  ich hätte davor  buffer=ZeigervonMalloc  machen müssen, bzw. den "Start" Zeiger wegspeichern.
    

    Jetzt wirklich alles klar.



  • beginner schrieb:

    buffer++ //kannst vergessen, hatte ich doch recht, geht nicht??

    Gehen tut das schon, aber:
    Du musst dir die Adresse merken, die du von malloc bekommen hast, sonst geht das free und realloc nicht.

    Hab noch mal experimentiert... In einer Schleife bekomm ichs nicht hin, als den "Arbeits"pointer mit pointer++ zu erhöhen, da das realloc auch in der Schleife steht.
    Ich müsste ja dann meinen Arbeitspointer auf den neuen Speicherbereich den ich von Realloc bekomme legen, damit ist das ++ aber hinfällig, weil er ja wieder auf den Anfang zeigt. (Wegspeichern ist auch nicht)

    Sollte jmd. wissen wie das geht, wäre ich für ein Beispiel dankbar



  • beginner_001 schrieb:

    ....

    😕
    Zeig deinen Code. Es weiß niemand was du gerade probierst.



  • Sorry 😉

    Hab den Code schon gelöscht, versuchs aus dem Gedächtniss: (Ist wie gesagt nur experimentell, habs ja schon mit fread usw. passend gelöst)

    char *ch_ar, *save;
    int dummy, i=2;
    
    FILE *open
    
    open=fopen("test.txt", "rb");
    ch_ar=malloc(sizeof(char)*i)   //Array mit "2" Plätzen
    save=ch_ar     // Adresse sichern, bring aber nix siehe unten
    while (dummy !=EOF){
    
            dummy=fgetc(open);
            *save=dummy  // geht, klar
            save++    // geht auch noch da ich 2 Plätze habe 
            i++;
            ch_ar=realloc(ch_ar, sizeof(char)*i)  // Stellt 3 "plätze" bereit.....  aber beim nächsten Schleifendurchlauf "passt" save nicht mehr. 
    }
    
    //////////////  so gehts hald: 
    int j =0; 
    i=0;
    while (dummy !=EOF) {
              dummy=fgetc(open);
              *(ch_ar+j)=dummy;         //oder hald ch_ar[j]
              j++;   
              i++;
              ch_ar=realloc(ch_ar, sizeof(char)*i);
    } 
    
    // Also ich weiß nicht wie man es mit  ptr++ hinbekommen könnte.
    

    Also alles jetzt ohne Prüfung ob Malloc oder Realloc geklappt hat, save ist nur "Arbeitspointer", weil ich ja für Realloc den "Original" Zeiger brauche.



  • Entweder ich übersehe was entscheidendes, oder meine "Theorie", das nach dem Realloc der Pointer "Save" nicht mehr passt (Da der Speicherbereich jetzt wo anders liegt, sprich save auf ganz was anderes Zeigt) ist gar nicht sooo falsch?


Anmelden zum Antworten