speicher blockweise allokieren



  • hallo!

    ich komm leider bei einer übung für die n uni nicht weiter. und zwar soll ein text eingelesen werden und der speicher dafür blockweise allokiert werden (ohne verwendung von string.h) und wenn der speicher voll ist soll -2 als returnwert zurück gegeben werden.

    hier wäre der code:

    char *read_in()
    {
      char* input = NULL;
      int len, ch;
      int count = 0;
    
      if(input = malloc(64 * sizeof (char)))
      {
        for(len = 0; (ch = getchar()) != '\n'; len++)
    	 {
            input[len] = ch;
    
            if(len == (64 + count*64))
    		  {
    		    if(input = realloc(input, (len + 64) * sizeof(char)))
    		    {
    		      count++;
    		    }
    		    else
    		    {
    			   printf("Out of Memory.\n" );
    			   exit (-2);
    	        }   
    
    		  }
         }
    
    	  input[len] = '\0';
      }
    
    	else
      	{
         printf("Out of Memory.\n" );
         exit (-2);
       }  
    
      return input;
    
    }
    

    kann das so stimmen? denn wenn ich realloc weglasse bekomm ich beim testen nie die fehlermeldung zusammen.

    vielen dank!



  • Darf man fragen, was für Texte du einliest, damit du eine "out of memory"-Meldung bekommst?
    Ob du realloc oder malloc nutzt ist egal, realloc verschiebt nur für dich noch zusätzlich den alten Speicher (ist ganz praktisch, wenn du die Größe vergessen hast 😃 ) und gibt den alten Speicherbereich wieder frei.



  • kurze texte. also wenn ich händisch ein paar zeichen eingeb sollt er mir doch out of memory anzeigen!? also wenn ich realloc weglasse und malloc auf 1* sizeof(char) verkleiner!?



  • Also so wie dein Quelltext jetzt aussieht, bekommst du nur eine "out of memory"-Meldung, wenn das Allokieren fehl schlägt. Das sollte aber eigentlich nie passieren. Und wenn du sowieso keinen neuen Speicher anforderst, kein realloc machst, wie willst du da eine Fehlermeldung erhalten? Was du wahrscheinlich meinst ist, dass auch ohne realloc der else-Zweig angesprungen wird? Dann müsstest du die Bedingung von if immer auf unwahr setzen.

    if(input = realloc(input, (len + 64) * sizeof(char)))
    // wird zu
    if(0 /*input = realloc(input, (len + 64) * sizeof(char))*/)
    


  • char *read_in()
    {
      char* input;
      int len=64, ch;
      int count = 0;
    
      if(input = malloc(len))
      {
        while( (ch=getchar())!=EOF && ch!='\n' )
        {
          if( count==len-1 )
          {
            input=realloc(input,len+=64);
            if( !input ) exit -2;
          }
          input[count++]=ch;
          input[count]=0;
        }
      }
      else
      {
         printf("Out of Memory.\n" );
         exit (-2);
      }  
    
      return input;
    }
    


  • vielen dank!

    habs jetzt mal mit meiner main funktion verknüpft. ich hab nur noch ein kleines problem, und zwar soll ich einen beliebig langen text einlesen und ein histogramm mit den buchstaben erstellen. wenn ich jetzt

    while( (ch=getchar())!=EOF && ch!='\n' )
    

    verwende, hört er schon nach einem newline auf, obwohl die bedingung and ist.



  • Die Abbruchbedingung ist derzeit EOF oder \n, d.h. eine Anpassung an deine Anforderungen solltest du auch allein hinbekommen.



  • stimmt. der fehler war auch wo anders.

    aber ich hab noch immer ein speicher problem. und zwar dürft das mit dem realloc nicht klappen. muss ich das realloc auch in der main funktion machen, oder soll ich überhaupt alles bei read_in allokieren?

    #define BLOCK_SIZE 16
    
    int main()
    { 
      char *input = NULL;
      if(input = malloc(BLOCK_SIZE))
      { 
        int text_length = read_in(input);
        output(input, text_length);
      }
      else  
      {
        printf("Out of Memory.");
        return (-2);
      } 
    
      free (input);
    }
    
    int read_in(char *input)
    {
      int len=BLOCK_SIZE, ch;
      int count = 0;
    
        while( ((ch=getchar())!=EOF) && (ch!='\n') )
        {
          if( count==len-1 )
          {
            input=realloc(input,len+=BLOCK_SIZE);
            if( !input ) exit -2;
          }
          input[count++]=ch;
          input[count]=0;
        }
      return (count);
    }
    


  • Dein Umbau klappt so nicht; wenn du die Zeichenanzahl brauchst, nimm die Originalversion der Funktion und strlen. free natürlich dann auch noch abschließend.



  • Wutz schrieb:

    char *read_in()
    {
      char* input;
      int len=64, ch;
      int count = 0;
     
      if(input = malloc(len))
      {
        while( (ch=getchar())!=EOF && ch!='\n' )
        {
          if( count==len-1 )
          {
            input=realloc(input,len+=64);
            if( !input ) exit -2;
          }
          input[count++]=ch;
          input[count]=0;
        }
      }
      else
      {
         printf("Out of Memory.\n" );
         exit (-2);
      }  
    
      return input;
    }
    

    also ich hab das nochmal eingebaut. aber sagt mir als warning "statement with no effect" bei "exit (-2) und "suggest parentheses around assignment used as truth value" bei der if bedingung. kann man das trotzdem so machen?



  • günthergü schrieb:

    "statement with no effect" bei "exit (-2)

    Zeile 14? Du hast die Klammern für den Aufruf vergessen. Was jetzt da steht ist: "Adresse von der Funktion exit" Leerzeichen 2

    günthergü schrieb:

    "suggest parentheses around assignment used as truth value" bei der if bedingung. kann man das trotzdem so machen?

    Dann folge doch einfach dem Vorschlag. Der Ausdruck ist trotzdem gültig. Er will dich nur darauf hinweise, dass du evtl. statt einem Vergleich eine Zuweisung geschrieben hast.



  • so. jetzt hab ich noch eine frage. warum kommt "input[count]=0;" in der schleife vor? sollte er nicht außerhalb der schleife eine \0 anhängen?



  • Damit wird nur der Text terminiert, falls keine weitere Eingabe kommt. Die Null wird vom nächsten Zeichen überschrieben.
    Postinkrement kennst du?

    Um die Unterschiede zu verdeutlichen, eine Folge von Anweisungen. Dahinter sind die Werte der Variablen nach der Ausführung.

    i = 0;
    x = i++;  // x == 0, i == 1
    x = ++i;  // x == 2, i == 2
    x = i--;  // x == 2, i == 1
    x = --i;  // x == 0, i == 0
    

Anmelden zum Antworten