speicher blockweise allokieren



  • 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