Gata tema0 la SO. Lessons: !!! Legea lui Murphy! -> Niciodata sa nu lasi ceva pe ultimul moment!
Am avut de implementat un Hashtable folosind Bucket-uri ( implementate ca liste inlantuite ).
Pentru compatibilitate buna intre compilatorele din windows si linux:
1) atunci cand declar un pointer catre urmatorul element din lista sa arate asa:
typedef struct Hash {
char *cuv;
struct Hash *next;
} Hashtable;
2) Variabile sa fie declarate exact la inceputul unei functii, alfel da eroare.
3) Probleme la parsarea fisierelor. Mereu sa ai grija sa nu apara caractere in plus si ca sirul sa fie initializat. Foloseste calloc in loc de malloc! Afiseaza cu printf(“[%s]“,sir) pentru a te asigura ca nu intra si un \n la sfarisit. De asemenea daca un fisier nu se termina bine se poate face in felul urmator:
f = fopen(name[i],”a+”);
fseek( f , 0 , SEEK_END);
fprintf(f,”\n”);
fseek( f , 0 , SEEK_SET );
Am avut mult timp probleme cu pointeri si adrese mai ales la proiecte mari si sunt sigur ca nu sunt singuru. E foarte bine sa stii exact ce face o anumita instructiune.
Vreau sa fie clar, pentru a modifica o variabila, aceasta trebuie data in felul urmator pentru a se modifica valoarea globala a ei:
My_Hash = parseaza(My_Hash, &SIZE);
iar in functie arata asa:
void parseaza(Hashtable** My_Hash, int *SIZE);
!ATENTIE! A doua oara cand se apeleaza(deci in functia parseaza) o ai deja ca pointer, deci se va apela print(My_Hash, SIZE); De asemenea valoarea lui SIZE, mai departe se va accesa cu *SIZE. !!!
Pentru a crea un vector de liste inlantuite se foloseste Hashtable** My_Hash;
Hashtable* este un pointer catre tipul Hashtable iar Hashtable** e un vector de pointeri catre tipul respectiv.