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

Problem z strukturami i wskaźnikami do elemntow struktury

Ostatnio zmodyfikowano 2014-11-14 17:21
Autor Wiadomość
urbanek126
Temat założony przez niniejszego użytkownika
Problem z strukturami i wskaźnikami do elemntow struktury
» 2014-11-13 22:42:30
Witam , mam problem z strukturami/wskaźnikami do elementów struktury ,siedze juz 3-dzień nad tym i nie moge zrobić tak aby działało ,Dzieki z gory za wszystkie rady
-----------------------------------------
C/C++
#include"bibl.h"
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<string.h>
#define BUFSIZE 8000
void dodaj_wektor( skorowidz_t * skorowidz, int i, int ile_linii );


void zaincjuj_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 ];
    }
}

void zaincjuj_linie( skorowidz_t * skorowidz, liniee * linie ) {
    int i;
   
    for( i = 0; i < skorowidz->ile_slow; i++ ) {
        linie[ i ].licznik = 2;
        linie[ i ].size = 0;
        linie[ i ].elementy = malloc( 1 * sizeof * linie[ i ].elementy );
    }
}
void wyszukiwanie( FILE * in, skorowidz_t * skorowidz, liniee * linie ) {
    int i;
    int ile_linii;
    char buf[ BUFSIZE ];
    char * wsk;
    for( i = 0; i < skorowidz->ile_slow; i++ ) {
       
        ile_linii = 0;
        rewind( in );
        while( fgets( buf, BUFSIZE, in ) != NULL ) {
            ile_linii++;
            if(( wsk =( strstr( buf, skorowidz->slowa[ i ] ) ) ) != NULL ) {
                char * wk = wsk + strlen( skorowidz->slowa[ i ] );
                char * wp = buf == wsk ? wk: wsk - 1;
                if(( isblank( * wk ) ) &&( isblank( * wp ) ) ) {
                   
                    linie[ i ].licznik++;
                    *( linie[ i ].elementy ) = ile_linii;
                    linie[ i ].elementy++;
                    linie[ i ].elementy = realloc( linie[ i ].elementy, linie[ i ].licznik * sizeof( char ) );
                   
                   
                }
            }
        }
    }
   
}
void wypisz_skorowidz( skorowidz_t * skorowidz, liniee * linie ) {
    int i, j;
   
    for( i = 0; i < skorowidz->ile_slow; i++ )
    if(( linie[ i ].licznik ) > 0 ) {
        printf( "slowo %s wystapila w liniach", skorowidz->slowa[ i ] );
        for( j = 0; j < linie[ i ].licznik; j++ ) {
            printf( "%d", *( linie[ i ].elementy ) );
        }
        printf( "\n" );
    }
    else {
        printf( "nie napotkano slowa %s \n", skorowidz->slowa[ i ] );
    }
}
----------------------------------
C/C++
#include<stdio.h>

#ifndef _BIBL_H
#define _BIBL_H
typedef struct {
    int ile_slow;
    char ** slowa;
} skorowidz_t;

typedef struct {
    int * elementy;
    int licznik;
    int size;
} liniee;

void zainicjuj_skorowidz( int argc, char ** argv, skorowidz_t * s );

void zaincjuj_linie( skorowidz_t * s, liniee * t );

void wypisz_skorowidz( skorowidz_t * s, liniee * t );

void wyszukiwanie( FILE * in, skorowidz_t * skorowidz, liniee * t );

void dodaj_wektor( skorowidz_t * skorowidz, int i, int ile_linii );

#endif
~
------------------------------------------------
C/C++
#include <stdio.h>
#include <stdlib.h>
#include "bibl.h"

#define BUFSIZE 8192

int main( int argc, char ** argv ) {
   
    FILE * in = argc > 1 ? fopen( argv[ 1 ], "r" )
        : stdin;
   
    skorowidz_t skorowidz;
    zainicjuj_skorowidz( argc, argv, & skorowidz );
   
    liniee linie[ skorowidz.ile_slow ];
    zaincjuj_linie( & skorowidz, & linie );
   
    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;
    }
   
    wyszukiwanie( in, & skorowidz, & linie );
   
    wypisz_skorowidz( & skorowidz, & linie );
   
    return EXIT_SUCCESS;
}
P-120555
Tomek_z_W11
» 2014-11-13 23:40:50
Mógłbyś trochę rozjaśnić w czym tkwi problem? Jaki problem ze wskaźnikami? Kod się nie kompiluje? Nie działa jak powinien? Jeżeli tak, to która funkcja nie działa? A może coś ze zmiennymi? Która zmienna?

Jakbyś jeszcze kod okomentował, to w ogóle byłoby super :)
P-120562
urbanek126
Temat założony przez niniejszego użytkownika
» 2014-11-14 07:42:19
Nie wytrzymałem i zacząłem pisać program on nowa ,i znowu mam problemy... , problem polega na tworzeniu tablic struktur linie i poruszania sie po niej ,
program4.c:8:2: error: two or more data types in declaration specifiers
program4.c:11:1: error: expected identifier or ‘(’ before ‘}’ token
program4.c: In function ‘main’:
program4.c:40:16: error: array type has incomplete element type
program4.c:40:16: warning: unused variable ‘wektory’ [-Wunused-variable]
program4.c: In function ‘zainicjuj_wektor’:
program4.c:80:39: error: dereferencing pointer to incomplete type
program4.c:83:8: error: dereferencing pointer to incomplete type
program4.c:83:42: error: dereferencing pointer to incomplete type
program4.c:84:11: error: dereferencing pointer to incomplete type
program4.c:88:8: error: dereferencing pointer to incomplete type
program4.c:89:8: error: dereferencing pointer to incomplete type
program4.c: In function ‘powiekszam’:
program4.c:93:32: error: dereferencing pointer to incomplete type
program4.c:93:51: error: dereferencing pointer to incomplete type
program4.c:93:72: error: dereferencing pointer to incomplete type
program4.c:96:8: error: dereferencing pointer to incomplete type
program4.c:97:8: error: dereferencing pointer to incomplete type
program4.c: In function ‘dodaj’:
program4.c:101:11: error: dereferencing pointer to incomplete type
program4.c:101:25: error: dereferencing pointer to incomplete type
program4.c:104:8: error: dereferencing pointer to incomplete type
program4.c:104:25: error: dereferencing pointer to incomplete type
program4.c:105:8: error: dereferencing pointer to incomplete type
program4.c: In function ‘wypisz_skorowidz’:
program4.c:112:5: error: invalid use of undefined type ‘struct linie’
program4.c:112:16: error: dereferencing pointer to incomplete type
program4.c:114:12: error: invalid use of undefined type ‘struct linie’
program4.c:114:29: error: dereferencing pointer to incomplete type
program4.c:115:3: error: invalid use of undefined type ‘struct linie’
program4.c:115:22: error: dereferencing pointer to incomplete type
 
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:

C/C++
#include <stdio.h>  // wiadomo po co#include <stdio.h>  // wiadomo po co
#include <stdlib.h>
#include <string.h> // strstr

#define BUFSIZE 8192   // zakĹ‚adamy, ĹĽe linie bÄ™dÄ… krĂłtsze niĹĽ 8kB

struct linie
int * elementy; // ma przechowywac numery linii
int size; // rozmiar tablicy
int licznik; // ilosc elementow w tablicy
};

typedef struct {
int ile_slow;
char ** slowa;
} skorowidz_t;

struct linie * zainicjuj_wektor( void ); //tworzy tablice dynamiczna

void dodaj( struct linie * wektor, int linia ); //dodaje linie do tablic dynamicznych

struct linie * powiekszam( struct linie * wektor ); // powieksza miesjce w tablichac dynamicznych

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; // nummery 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++ ) { // chce tworzyc kilka struktur linie ,dla kazdego slowa inna struktura 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 ) { // pobiera linie z pliku
    ile_linii++; // ktora linia jest brana teraz pod uwage
    for( i = 0; i < skorowidz.ile_slow; i++ )
    if( strstr( buf, skorowidz.slowa[ i ] ) != NULL ) { // szuka slowa  w danej linii
        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 ] );
    }
}
}
P-120566
Tomek_z_W11
» 2014-11-14 16:34:39
W funkcji wypisz skorowidz traktujesz wektor[ i ] jako wskaźnik, a to jest obiekt, tzn. wskaznikiem jest 'wektor', ale 'wektor[ i ]' jest już obiektem. Powinieneś pisać jakoś tak:
wektor[ i ].costam

Oprócz tego, sizeof przyjmuje argumenty, np sizeof(int) zwraca 4, sizeof(char) zwróci 1, ogólnie zwraca ilość bajtów potrzebnych do przechowywania jakiś tam typów zmiennych, nie możesz pisać sizeof * int.

Dalej. W momencie alokacji pamięci, tzn tam gdzie masz malloc(...), to przed mallociem napisz (char **), jeżeli alokujesz dla char **, (int) jeżeli dla inta, itd.

Coś takiego:
skorowidz->slowa = (char**)malloc(sizeof(char *) * skorowidz->ile_slow);


Ogólnie to popraw kod pod względem co przyjmują jakie funkcje.
void dodaj( struct linie * wektor, int linia ); //dodaje linie do tablic dynamicznych

te funkcje wywołaj w ten sposób:
dodaj( wektory, ile_linii );
a nie, jak było wcześniej,
dodaj( wektory[ i ], ile_linii );

'wektory' - wskaźnik, 'wektory[ i ]' obiekt
wektory->cośtam, wektory[ i ].cośtam

jeżeli funkcja przyjmuje wskaźnik, to wywołujesz ją
funkcja(wektory),
jeżeli obiekty,
to funkcja(wektory[ i ])

i t d...
P-120579
urbanek126
Temat założony przez niniejszego użytkownika
» 2014-11-14 17:12:07
-------------------------------------------------
Ogólnie to popraw kod pod względem co przyjmują jakie funkcje.
void dodaj( struct linie * wektor, int linia ); //dodaje linie do tablic dynamicznych

te funkcje wywołaj w ten sposób:
dodaj( wektory, ile_linii );
a nie, jak było wcześniej,
dodaj( wektory[ i ], ile_linii );
----------------------------------------
Ale jak zmienie dodaj( wektory[ i ], ile_linii ); na dodaj( wektory, ile_linii ); , to nie bedzie wiadmo do którego wektora ma dodać to linie tylko bedziesz zawsze dodawac do wektor[0] chyba
P-120588
Tomek_z_W11
» 2014-11-14 17:21:10
To może funkcje dodaj() przerób, żeby pasiło?
P-120591
« 1 »
  Strona 1 z 1