Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C]error: ‘obraz’ has no member named ‘obraz_pgm’

Ostatnio zmodyfikowano 2013-12-27 11:41
Autor Wiadomość
quatromen
Temat założony przez niniejszego użytkownika
[C]error: ‘obraz’ has no member named ‘obraz_pgm’
» 2013-12-27 11:12:54
Mam problem z programem otóż jak chcem zwolnic pamiec to wykakuje mi błąd podczas kompilacji:



Testfree.c: In function ‘zapisz’:
Testfree.c:37:11: error: ‘obraz’ has no member named ‘obraz_pgm’


Kod:

C/C++
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#define DL_LINII 200

/* Deklaracja struktury ZROBIONE*/
typedef struct {
    int wymx;
    int wymy;
    int szarosci;
    void * obraz_p;
} obraz;



/* Zapisanie obrazu */
void zapisz( FILE * zapis, obraz * wobr )
{
    int i, j;
   
    int( * obraz_pgm )[ wobr->wymx ];
    obraz_pgm =( int( * )[ wobr->wymx ] ) wobr->obraz_p;
   
    fprintf( zapis, "P2 \n %d %d \n %d", wobr->wymx, wobr->wymy, wobr->szarosci );
    for( i = 0; i < wobr->wymy; i++ )
    {
        fprintf( zapis, "\n" );
        for( j = 0; j < wobr->wymx; j++ )
        {
            fprintf( zapis, "%d  ", obraz_pgm[ i ][ j ] );
        }
    }
    free( wobr->obraz_pgm );
}


/* Wczytywanie obrazu ZROBIONE */
int czytaj( FILE * p, obraz * wobr )
{
    char s[ DL_LINII ];
    int znak, koniec = 0, i, j;
   
    /*sprawdzenie czy podano prawid³owy uchwyt pliku */
    if( p == NULL ) {
        fprintf( stderr, "Blad: Nie podano uchwytu do pliku\n" );
        return( 0 );
    }
    if( fgets( s, DL_LINII, p ) == NULL ) koniec = 1;
    /* Sprawdzenie "numeru magicznego - powinien byæ P2 */
    if(( s[ 0 ] != 'P' ) ||( s[ 1 ] != '2' ) || koniec ) {
        fprintf( stderr, "Blad: To nie jest plik PGM\n" );
        return( 0 );
    }
    /* Pominiecie komentarzy */
    do {
        if(( znak = fgetc( p ) ) == '#' ) {
            if( fgets( s, DL_LINII, p ) == NULL ) koniec = 1;
           
        } else {
            ungetc( znak, p );
        }
    } while( !koniec && znak == '#' );
   
    /* Pobranie wymiarow obrazu i liczby odcieni szarosci */
    if( fscanf( p, "%d %d %d", & wobr->wymx, & wobr->wymy, & wobr->szarosci ) != 3 ) {
        fprintf( stderr, "Blad: Brak wymiarow obrazu lub liczby stopni szarosci\n" );
        return( 0 );
    }
   
    /* Tworzymy dynamiczna tablice dwuwymiarowa */
    wobr->obraz_p = malloc( wobr->wymx * wobr->wymy * sizeof( int ) );
    int( * obraz_pgm )[ wobr->wymx ];
    obraz_pgm =( int( * )[ wobr->wymx ] ) wobr->obraz_p;
   
    /* Pobranie obrazu i zapisanie w tablicy obraz_pgm*/
    for( i = 0; i < wobr->wymy; i++ )
    {
        for( j = 0; j < wobr->wymx; j++ )
        {
            if( fscanf( p, "%d", &( obraz_pgm[ i ][ j ] ) ) != 1 ) {
                fprintf( stderr, "Blad: Niewlasciwe wymiary obrazu\n" );
                return( 0 );
            }
        }
    }
   
    return( 0 );
}

void wyswietl( char * n_pliku )
{
    /* Wyswietlenie obrazu o zadanej nazwie
         za pomoca programu "display"   */
    char polecenie[ 1024 ];
    strcpy( polecenie, "display " );
    strcat( polecenie, n_pliku );
    strcat( polecenie, " &" );
    printf( "%s\n", polecenie );
    system( polecenie );
}


int main()
{
    obraz obr;
    int odczytano = 0;
    FILE * plik;
    FILE * zapis;
    char nazwa[ 100 ];
    char nazwazapis[ 100 ];
   
   
    printf( "Podaj nazwe pliku:\n" );
    scanf( "%s", nazwa );
    plik = fopen( nazwa, "r" );
   
    if( plik != NULL ) /* co spowoduje zakomentowanie tego warunku */
         odczytano = czytaj( plik, & obr );
   
   
   
   
    printf( " podaj nazwe pliku do zapisania : \n " );
    scanf( "%s", nazwazapis );
    zapis = fopen( nazwazapis, "w" );
    zapisz( zapis, & obr );
    return odczytano;
}

Prosze o pomoc
z góry dzieki :)
P-100277
pekfos
» 2013-12-27 11:18:45
Co w tym dziwnego? Na prawdę nie masz, w strukturze obraz, składowej obraz_pgm.
P-100280
quatromen
Temat założony przez niniejszego użytkownika
» 2013-12-27 11:22:17
Aj z tego wszystkiego za dużo napisałem i dlatego był błąd podczas kompilacji :) , zamiast :

C/C++
free( wobr->obraz_pgm );

powinno być :

C/C++
free( obraz_pgm );

Ale czy to będzie poprawnie zwalniać cala pamięć ?? ?? ??
P-100281
pekfos
» 2013-12-27 11:36:33
Same zwalnianie jest tu poprawne. Problem został rozwiązany, temat powinien być zamknięty.
P-100284
quatromen
Temat założony przez niniejszego użytkownika
» 2013-12-27 11:41:11
dzieks :)
więc zamykam :)
P-100285
« 1 »
  Strona 1 z 1