Problem z tablico struktur
Ostatnio zmodyfikowano 2014-11-14 13:11
urbanek126 Temat założony przez niniejszego użytkownika |
Problem z tablico struktur » 2014-11-14 13:11:39 Problem polega glownie z struktura linie i w tym zapisie, dzieki z gory za pomoc Działanie programu polega na wyszukiwaniu slow w pliku i wypisywanie w ktorych liniach wystapila dane slowo np ./a.out dane.txt co tam slowo co wystapila w 6,14,15 slowo tam wystapila 10 90 ,102:
program4.c: In function ‘main’: program4.c:42:13: error: variable-sized object may not be initialized program4.c:42:21: warning: unused variable ‘wektory’ [-Wunused-variable] program4.c:60:4: error: incompatible type for argument 1 of ‘dodaj’ program4.c:20:6: note: expected ‘struct linie *’ but argument is of type ‘struct linie’ program4.c: In function ‘wypisz_skorowidz’: program4.c:112:19: error: invalid type argument of ‘->’ (have ‘struct linie’) program4.c:114:32: error: invalid type argument of ‘->’ (have ‘struct linie’) program4.c:115:25: error: invalid type argument of ‘->’ (have ‘struct linie’) #include <stdio.h> #include <stdlib.h> #include <string.h>
#define BUFSIZE 8192
struct linie { int * elementy; int size; int licznik; };
typedef struct { int ile_slow; char ** slowa; } skorowidz_t;
struct linie * zainicjuj_wektor( void );
void dodaj( struct linie * wektor, int linia );
struct linie * powiekszam( struct linie * wektor );
void zainicjuj_skorowidz( int argc, char ** argv, skorowidz_t * s );
void wypisz_skorowidz( skorowidz_t * s, struct linie * wektory ); int main( int argc, char ** argv ) { int i; int ile_linii; char buf[ BUFSIZE ]; FILE * in = argc > 1 ? fopen( argv[ 1 ], "r" ) : stdin; skorowidz_t skorowidz; zainicjuj_skorowidz( argc, argv, & skorowidz ); struct linie wektory[ skorowidz.ile_slow ]; for( i = 0; i < skorowidz.ile_slow; i++ ) { struct linie * wektory[ i ] = zainicjuj_wektor(); } if( skorowidz.ile_slow == 0 ) { fprintf( stderr, "%s: błąd: proszę podać słowa do wyszukiwania\n", argv[ 0 ] ); return EXIT_FAILURE; } if( in == NULL ) { fprintf( stderr, "%s: błąd: nie mogę czytać pliku %s\n", argv[ 0 ], argv[ 1 ] ); return EXIT_FAILURE; } ile_linii = 0; while( fgets( buf, BUFSIZE, in ) != NULL ) { ile_linii++; for( i = 0; i < skorowidz.ile_slow; i++ ) if( strstr( buf, skorowidz.slowa[ i ] ) != NULL ) { dodaj( wektory[ i ], ile_linii ); } } wypisz_skorowidz( & skorowidz, wektory ); return EXIT_SUCCESS; }
void zainicjuj_skorowidz( int argc, char ** argv, skorowidz_t * skorowidz ) { int i; skorowidz->ile_slow = argc - 2; skorowidz->slowa = malloc( skorowidz->ile_slow * sizeof * skorowidz->slowa ); for( i = 2; i < argc; i++ ) { skorowidz->slowa[ i - 2 ] = argv[ i ]; } } struct linie * zainicjuj_wektor( void ) { struct linie * wektor = malloc( sizeof * wektor ); if( wektor == NULL ) return NULL; wektor->elementy = malloc( 1 * sizeof * wektor->elementy ); if( wektor->elementy == NULL ) { free( wektor ); return NULL; } wektor->size = 1; wektor->licznik = 0; return wektor; } struct linie * powiekszam( struct linie * wektor ) { int * wektornowy = realloc( wektor->elementy, 2 * wektor->size * sizeof * wektor->elementy ); if( wektornowy == NULL ) return NULL; wektor->size *= 2; wektor->elementy = wektornowy; return wektor; } void dodaj( struct linie * wektor, int linia ) { if( wektor->size <= wektor->licznik ) if( powiekszam( wektor ) == NULL ) return; wektor->elementy[ wektor->licznik ] = linia; wektor->licznik++; return; } void wypisz_skorowidz( skorowidz_t * skorowidz, struct linie * wektory ) { int i, j; for( i = 0; i < skorowidz->ile_slow; i++ ) { if( wektory[ i ]->licznik > 0 ) { printf( "słowo \"%s\" wystąpiło w liniach:", skorowidz->slowa[ i ] ); for( j = 0; j < wektory[ i ]->licznik; j++ ) printf( "%d", wektory[ i ]->elementy[ j ] ); printf( "\n" ); } else { printf( "nie napotkano słowa \"%s\"\n", skorowidz->slowa[ i ] ); } } }
[/i] |
|
« 1 » |