programm als PBM speichern



  • hey, ich soll das game of life nachbauen. Hat auch gut gekplappt, es läuft so wie es soll. Jedoch soll ich die einzelnen Ausgaben als PBM-Dateien speicher um anschließend ein gif daraus zu machen.

    ich habe es mit dieser Funktion versucht, jedoch kann die entstandene PBM-Datei nicht geöffnet werden, bzw. ist fehlerhaft:

    void save_in_file(int max, char array[max][max])
    {
        FILE *file;
        file = fopen("textfile.PBM","w");
        if(!file)
        {
            printf("can't open file");
        }else
        {
        for(int i = 0; i<max; i++)
        {
            for(int j = 0; j<max; j++)
            {
                fputc(array[i][j],file);
            }
            fputc('\n',file);
        }
    }
    fputc('\n',file);
    
    fclose(file);
    }
    

    (hab das ganze mit zweidimensionalen Arrays aufgebaut, also mein Spielfeld ist z.B.: field[MAX][MAX])

    hoffe mir kann jemand weiterhelfen


  • Mod

    cinder schrieb:

    ich habe es mit dieser Funktion versucht, jedoch kann die entstandene PBM-Datei nicht geöffnet werden, bzw. ist fehlerhaft:

    Und wie genau äußert sich dies?



  • Schon mal so probiert?

    void save_in_file(int max, char array[MAX][MAX])
    


  • Weiss nicht ob das eine Rolle spielt?
    PBM => Portable Bit Map
    Und du speichst das als textfile?
    Oder ist nur der Name nicht ganz optimal?

    MfG f.-th.



  • SeppJ schrieb:

    cinder schrieb:

    ich habe es mit dieser Funktion versucht, jedoch kann die entstandene PBM-Datei nicht geöffnet werden, bzw. ist fehlerhaft:

    Und wie genau äußert sich dies?

    unbekanntes Grafikformat

    Allgemeiner Fehler.
    Allgemeiner Ein-/Ausgabefehler

    hab versucht es mit Open Office zu öffnen(hab im internet gelesen, dass es mit dem funktioniert)

    Schon mal so probiert?

    Meine Funktion sieht doch so aus....was meinst du genau?



  • f.-th. schrieb:

    Weiss nicht ob das eine Rolle spielt?
    PBM => Portable Bit Map
    Und du speichst das als textfile?
    Oder ist nur der Name nicht ganz optimal?

    MfG f.-th.

    heißt bei mir nur Textfile, weil ichs davor als txt gespeichert habe, habs im eigentlichen Programm aber als .BPM gespeichert



  • Meinst du http://de.wikipedia.org/wiki/Portable_Bitmap?
    Wo sind denn dann dein Formatangaben?

    Übrigens wird in C Groß- und Kleinschreibung unterschieden. (Von wegen "Meine Funktion sieht doch so aus")



  • Also das Game of Life kann mal einmal im Textmodus laufen lassen und dann im Grafikmodus programmieren.

    Was hast du bei dir vorliegen?

    Wenn das im Grafikmodus hast, und das im Textfile speicherst verlierst du wahrscheinlich Infos.

    Da du das in PBM oder dann in GIF speichern sollst tippe ich auf Grafikmodus 😕

    OpenOffice braucht mehr als eine richtige Dateiendung. Bei dir passt zu 99% der Inhalt der Datei nicht. Mach doch eine Probe - erstelle mit Open-Office eine PBM-Datei und versuche die mit einem Hex-Editor und dann mit einem Normalen Editor zu lesen. Das Gleiche versuche mit deiner "textfile.pbm". Muss noch mal in Netz nachsehen wie das pbm-Format aussieht und dann vergleiche 👍

    MfG f.-th.



  • hier mal mein ganzer Code, (so in etwa soll er auch aussehen):

    #include <stdio.h>
    #include <stdlib.h>
    #define MAX 5
    #define DEAD '0'
    #define ALIVE '1'
    
    /*/////////
    PROTOTYPES
    /////////*/
    void init_field(char feld[MAX][MAX]);
    void print_field(char feld[MAX][MAX]);
    void game_rules(char feld[MAX][MAX]);
    void save_in_file(int max, char array[max][max]);
    void save_in_file2(int max, char array[max][max]);
    
    int main()
    {
    char gamefield[MAX][MAX];
    
        init_field(gamefield);
        print_field(gamefield);
        save_in_file(MAX, gamefield);
        printf("\n");
        for(int i = 0;i<1;i++)
        {
            game_rules(gamefield);
            print_field(gamefield);
            save_in_file2(MAX, gamefield);
            printf("\n");
        }
    
    return 0;
    }
    
    void print_field(char feld[MAX][MAX])
    {
        for(int i = 0; i< MAX; i++)
        {
            for(int j = 0; j< MAX; j++)
            {
                printf("%c",feld[i][j]);
            }
            printf("\n");
        }
    }
    void init_field(char feld[MAX][MAX])
    {
        for(int i = 0; i< MAX; i++)
        {
            for(int j = 0; j< MAX; j++)
            {
                feld[i][j] = DEAD;
            }
        }
    
        feld[2][1] = ALIVE;
        feld[2][2] = ALIVE;
        feld[2][3] = ALIVE;
    }
    
    void game_rules(char field[MAX][MAX])
    {
    char feld[MAX][MAX];
    
        for(int i = 0;i<MAX;i++)
        {
            for(int j = 0;j<MAX;j++)
            {
                feld[i][j] = field[i][j];
            }
        }
    
        for(int i = 0; i< MAX; i++)
        {
            for(int j = 0; j< MAX; j++)
            {
                int counterd = 0;
    
                if((i-1 >= 0)) {
                    if(j-1>=0)
                        if(feld[i-1][j-1] == ALIVE) counterd++;
                    if(feld[i-1][j] == ALIVE) counterd++;
                    if(j+1<MAX)
                        if(feld[i-1][j+1] == ALIVE) counterd++;
                }
    
                if(j-1 >= 0)
                    if(feld[i][j-1] == ALIVE) counterd++;
                if(j+1 < MAX)
                    if(feld[i][j+1]== ALIVE) counterd++;
    
                if((i+1 < MAX)) {
                    if(j-1>=0)
                        if(feld[i+1][j-1] == ALIVE) counterd++;
    
                    if(feld[i+1][j] == ALIVE) counterd++;
    
                    if(j+1 < MAX)
                        if(feld[i+1][j+1] == ALIVE) counterd++;
                }
    
                if(counterd == 3 && feld[i][j] == DEAD)
                    field[i][j]= ALIVE;
    
               if(counterd < 2 && feld[i][j] == ALIVE)
                {
                    field[i][j]=DEAD;
                }else if(((counterd == 2) || (counterd == 3))&&(feld[i][j] == ALIVE))
                {
                    field[i][j]=ALIVE;
                }else if(counterd > 3 && feld[i][j] == ALIVE)
                {
                    field[i][j]=DEAD;
                }
                }
            }
        }
    
        void save_in_file(int max, char array[max][max])
    {
        FILE *file;
        file = fopen("textfile.PBM","w");
        if(!file)
        {
            printf("can't open file");
        }else
        {
        for(int i = 0; i<max; i++)
        {
            for(int j = 0; j<max; j++)
            {
                fputc(array[i][j],file);
            }
            fputc('\n',file);
        }
    }
    fputc('\n',file);
    
    fclose(file);
    }
    
    void save_in_file2(int max, char array[max][max])
    {
        FILE *file;
        file = fopen("textfile2.PBM","w");
        if(!file)
        {
            printf("can't open file");
        }else
        {
        for(int i = 0; i<max; i++)
        {
            for(int j = 0; j<max; j++)
            {
                fputc(array[i][j],file);
            }
            fputc('\n',file);
        }
    }
    fputc('\n',file);
    
    fclose(file);
    }
    


  • Habs noch mal nachgesehen Open-Office kann das PBM-Format auch in der Textvariante lesen.

    Allerdings musst du den File-Header ergänzen.
    Vielleicht geht ja noch was einzustellen, sonst kann eine Lupe nix schaden, wenn man das in Open-Office-Draw erkennen will 😃

    MfG f.-th.



  • das hab ich jetzt nicht ganz verstanden, stimmt das also so wie ich mir das gedacht habe?



  • Die Daten schreibst du schon richtig in die PBM Dateien.

    Aber da müssen noch Infos davor, die zur Identifikation der PBM Dateien dienen.
    In Dirks Link steht doch das auch drin.
    Ob du deine Datei "hallo.pbm" nennst oder anders oder gar den Eintrag mit dem Dateinamen weg lässt bleibt dir überlassen 👍



  • danke hat geklappt, allerding ist es bei meinem Programm so, dass ich mit save_in_file und save_in_file2 nur 2 Durchläufe speichern kann. Wie kann ich das Anlegen von PBM dateien dynamisch gestalten? ich hätte mir das so gedacht:

    char adress[100] = "picture";
    for(int i = 0;adress[i] != '\0';i++)
    {
        strncat(adress,i,1);
    }
    

    und dann bei save_in_file als Speicheradresse adress einsetzen.

    kann das so funktionieren?



  • Was willst du denn erreichen?

    strcat hängt einen String an einen anderen dran.
    Dazu brauchst du das Ende nicht suchen, das macht strcat. Allerdings brauchst du dafür 2 Strings.

    strcat(adress,"1");
    

    Einfacher gehts mit sprintf():

    sprintf(adress, "picture_%3d", i);
    


  • Wow, danke für den Tip

    hab aber wieder ein Problem mit einem sehr ähnlichen Programm 😃

    ich hab ein Programm geschrieben, welches ein BPM erstellt. Hab das wieder mit einem zweidim. Array gemacht. bei array[700][700} funktioniert alles gut, wenn es jedoch größer sein soll stürzt das Programm ab. Ich denke, dass ich hierfür Speicher reservieren muss. Habe nun versucht das mit calloc zu realisieren, jedoch bewirkt dies nichts. Ich glaube, dass meine Reservierung noch nicht ausreicht,bzw dass in meinem Code noch etwas fehlt 😃 Hier der Code:

    int main(void)
    {
      int max = 1000;
      int pic_field[max][max];
      int *cache;
      cache = calloc(1000,sizeof(int**));
    
    init_array(max,pic_field);
    fill_array(max,pic_field);
    print_array(max,pic_field);
    save_file(max,pic_field);
    
    return EXIT_SUCCESS;
    }
    


  • int main()
    {
      int *pic_field=calloc(1000*1000,sizeof(int));
    
    init_array(max,pic_field);
    fill_array(max,pic_field);
    print_array(max,pic_field);
    save_file(max,pic_field);
    ...
    free(pic_field);
    return 0;
    }
    


  • ok, ist einleuchtend, das ich pic_field nehmen muss, aber wieso machst du da einen pointer draus? habs so versucht, funktioniert jedoch nicht



  • Deine Funktion sieht sowieso bloß einen Zeiger, ob du nun ein Array übergibst oder gleich einen Zeiger.
    Und "funktioniert nicht" ist subjektiv,

    void print_field(char (*feld)[MAX])
    

    z.B. funktioniert garantiert.


Anmelden zum Antworten