quatromen Temat założony przez niniejszego użytkownika |
[C] Odczytywanie danych za pomocą scanf / fscanf » 2013-12-19 00:04:32 Witam
MAm problem z odczytywaniem . Mianowicie kompiluje się ten kod ale jak wpisuje np: kubus.pgm to wyskakuje okno :
test.exe has stopped working
Close the program
a jak wpisze coś innego to nawet nie wyskakują mi komunikaty ze niewłaściwy plik czy nieprawidłowy uchwyt. Co jest zle ?? ?? ??
Proszę sprawdzenie kodu.
#include<stdio.h> #include<string.h> #include<stdlib.h>
#define MAX 400 #define DL_LINII 200
typedef struct { int wymx; int wymy; int szarosci; int * obraz_pgm[ MAX ][ MAX ]; } obraz;
int czytaj( FILE * p, obraz * wobr ) { char s[ DL_LINII ]; int znak, koniec = 0, i, j; if( p == NULL ) { fprintf( stderr, "Blad: Nie podano uchwytu do pliku\n" ); return( 0 ); } if( fgets( s, DL_LINII, p ) == NULL ) koniec = 1; if(( s[ 0 ] != 'P' ) ||( s[ 1 ] != '2' ) || koniec ) { fprintf( stderr, "Blad: To nie jest plik PGM\n" ); return( 0 ); } do { if(( znak = fgetc( p ) ) == '#' ) { if( fgets( s, DL_LINII, p ) == NULL ) koniec = 1; } else { ungetc( znak, p ); } } while( !koniec && znak == '#' ); 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 ); } for( i = 0; i < wobr->wymy; i++ ) { for( j = 0; j < wobr->wymx; j++ ) { if( fscanf( p, "%d", &( wobr->obraz_pgm[ i ][ j ] ) ) != 1 ) { fprintf( stderr, "Blad: Niewlasciwe wymiary obrazu\n" ); return( 0 ); } } } }
int main() { FILE * plik; char nazwa[ 100 ]; int odczytano = 1; obraz obr; printf( "Podaj nazwe pliku w formacie xxxxx.pgm:\n" ); scanf( "%s", nazwa ); plik = fopen( nazwa, "r" ); if( plik != NULL ) odczytano = czytaj( plik, & obr ); }
|
|
DejaVu |
» 2013-12-19 01:28:07 if( fscanf( p, "%d %d %d", wobr->wymx, wobr->wymy, wobr->szarosci ) != 3 ) {
zamień na: if( fscanf( p, "%d %d %d", & wobr->wymx, & wobr->wymy, & wobr->szarosci ) != 3 ) {
|
|
quatromen Temat założony przez niniejszego użytkownika |
» 2013-12-19 01:41:11 Wielkie dzięki DejVu :) |
|
quatromen Temat założony przez niniejszego użytkownika |
» 2013-12-19 01:57:36 Probowalem sam wywnioskwoac dlaczegosa stosowane te ampersantyale coś nie jestem w stanie, dlaczego one tam są ?? ?? ?? |
|
DejaVu |
» 2013-12-19 10:39:54 W języku C nie było czegoś takiego jak przekazywanie wartości zmiennych przez referencję - argument funkcji zawsze przekazywany był jako kopia zmiennej. W związku z powyższym, jedyną drogą modyfikacji danych przekazanych poprzez argument są wskaźniki, dzięki któremu znasz adres pamięci, który chcesz modyfikować. Właśnie dlatego do funkcji scanf przekazuje się wskaźniki na zmienne, które mają zostać zmodyfikowane. |
|
quatromen Temat założony przez niniejszego użytkownika |
» 2013-12-19 16:30:29 Chciałbym dodać tablice dynamiczną dwuwymiarową żeby wymiary same się dostosowywały do obrazu a nie żeby rezerwować już wymiar w pamięci Więc przerobiłem ten program w ten sposób: i problem polega na tym że jak dodaje funkcje negacji tonie działa :( Prosze o pomoc.
#include<stdio.h> #include<string.h> #include<stdlib.h>
#define MAX 400 #define DL_LINII 200
typedef struct { int wymx; int wymy; int szarosci; void * obraz_pgm; } obraz;
void negacja( obraz * wobr ) { int i, j; for( j = 0; j < wobr->wymx; j++ ) { for( i = 0; i < wobr->wymy; i++ ) { wobr->obraz_pgm[ i ][ j ] =( int * )( int ) wobr->szarosci -( int ) wobr->obraz_pgm[ i ][ j ]; } } }
int czytaj( FILE * p, obraz * wobr ) { char s[ DL_LINII ]; int znak, koniec = 0, i, j; if( p == NULL ) { fprintf( stderr, "Blad: Nie podano uchwytu do pliku\n" ); return( 0 ); } if( fgets( s, DL_LINII, p ) == NULL ) koniec = 1; if(( s[ 0 ] != 'P' ) ||( s[ 1 ] != '2' ) || koniec ) { fprintf( stderr, "Blad: To nie jest plik PGM\n" ); return( 0 ); } do { if(( znak = fgetc( p ) ) == '#' ) { if( fgets( s, DL_LINII, p ) == NULL ) koniec = 1; } else { ungetc( znak, p ); } } while( !koniec && znak == '#' ); 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 ); } int( * obraz_pgm )[ wobr->wymx ]; obraz_pgm =( int( * )[ wobr->wymx ] ) malloc( wobr->wymx * wobr->wymy * sizeof( int ) ); for( i = 0; i < wobr->wymy; i++ ) { for( j = 0; j < wobr->wymx; j++ ) { if( fscanf( p, "%d", &( wobr->obraz_pgm[ i ][ j ] ) ) != 1 ) { fprintf( stderr, "Blad: Niewlasciwe wymiary obrazu\n" ); return( 0 ); } } } }
int main() { FILE * plik; char nazwa[ 100 ]; int odczytano = 1; obraz obr; printf( "Podaj nazwe pliku w formacie xxxxx.pgm:\n" ); scanf( "%s", nazwa ); plik = fopen( nazwa, "r" ); if( plik != NULL ) odczytano = czytaj( plik, & obr ); negacja( & obr ); }
|
|
quatromen Temat założony przez niniejszego użytkownika |
» 2013-12-19 17:17:03 Tamto tworzenie dynamicznej tablicy dwuwymiarowej jes tchyba raczej zle wydaje mi sie ze to juz bedzie trafniejsze ??? ???: wobr->obraz_pgm = malloc( wobr->wymx * wobr->wymy * sizeof( int ) ); int( * obraz_pgm )[ wobr->wymx ]; obraz_pgm =( int( * )[ wobr->wymx ] );
|
|
DejaVu |
» 2013-12-19 20:43:04 Jeden temat = jeden problem. Zamykam. |
|
« 1 » |