[C, Teoria] Free

Messaggioda Dr. Akim » 20/04/2017, 23:45

Ciao a tutti!
Ho risolto, potete chiudere. Lascio l'esercizio in caso qualcuno volesse cimentarsi nella risoluzione!

Testo nascosto, fai click qui per vederlo
Scrivere un programma che legga da tastiera due interi N e K e una sequenza di N stringhe e che stampi le K stringhe più frequenti in essa contenute, in ordine lessicografico. Si può assumere che:

    Non esistano due stringhe con la stessa frequenza;
    Il valore di K sia minore o uguale al numero di stringhe distinte;
    Le stringhe contengono soltanto caratteri alfanumerici (a - z minuscoli e maiuscoli o numeri, nessuno spazio o punteggiatura) e sono lunghe al più 100 caratteri ciascuna.
L'input è formattato nel seguente modo: la prima riga contiene il numero N di stringhe da leggere, mentre la seconda riga contiene l'intero K. Seguono N righe contenenti una stringa ciascuna. L'output deve contenere solo e soltanto le K stringhe più frequenti, ordinate lessicogra camente, stampate una per riga.
Ultima modifica di Dr. Akim il 21/04/2017, 12:17, modificato 1 volta in totale.
Alan Turing, Padre dell'Informatica, salvò 14 MILIONI di persone durante la Seconda Guerra Mondiale decrittando Enigma. Morì suicida a 41 anni, spinto dalla persecuzione delle autorità britanniche per via della sua omosessualità. E' nostro DOVERE tenerne vivo il ricordo di questo Eroe dimenticato.
Avatar utente
Dr. Akim
Starting Member
Starting Member
 
Messaggio: 20 di 42
Iscritto il: 14/04/2016, 16:22
Località: Toscana

Re: [C, Teoria] Free

Messaggioda apatriarca » 21/04/2017, 11:03

Ho dato una occhiata veloce al codice ma mi sembra più complicato di quanto sia necessario. In particolare, non è chiaro perché ti stia complicando la vita usando l'aritmetica dei puntatori. Per esempio:
Codice:
(*((*b) + i)).str
// È equivalente a
(*b)[i].str

Il primo problema con free è in effetti legato a questo tentativo di evitare di usare la notazione più semplice. Infatti abbiamo che
Codice:
((*b) + i)

è un puntatore a string per cui non puoi usare il punto per accedere ai suoi elementi. Avrei dovuto semplicemente scrivere:
Codice:
(*b)[i].str

Mi stupisce compili. In effetti io ottengo i seguenti errori in fase di compilazione:
Codice:
gcc main.c
main.c: In function 'print_n_free':
main.c:78: error: request for member 'str' in something not a structure or union
main.c:82: error: request for member 'str' in something not a structure or union
apatriarca
Moderatore
Moderatore
 
Messaggio: 4606 di 10436
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: [C, Teoria] Free

Messaggioda Dr. Akim » 21/04/2017, 12:16

Ciao!

Grazie per la risposta, potete chiudere ho risolto.
P.s. ho usato l'aritmetica dei puntatori perché non l'ho mai usata granchè, così mi sono potuto esercitare come si deve!

:smt023
Alan Turing, Padre dell'Informatica, salvò 14 MILIONI di persone durante la Seconda Guerra Mondiale decrittando Enigma. Morì suicida a 41 anni, spinto dalla persecuzione delle autorità britanniche per via della sua omosessualità. E' nostro DOVERE tenerne vivo il ricordo di questo Eroe dimenticato.
Avatar utente
Dr. Akim
Starting Member
Starting Member
 
Messaggio: 21 di 42
Iscritto il: 14/04/2016, 16:22
Località: Toscana

Re: [C, Teoria] Free

Messaggioda apatriarca » 21/04/2017, 12:22

Ci sono situazioni in cui l'aritmetica dei puntatori è utile, ma non credo lo sia in questo caso. Riduce solo la leggibilità del codice. Ti consiglio comunque di cercare di memorizzare il valore di espressioni che usi più volte in modo da avere un singolo punto da modificare nel caso in cui ci sia un errore. Avresti insomma potuto scrivere qualcosa come:
Codice:
stringa *current = (*b) + i;
free(current->str);
free(current);
apatriarca
Moderatore
Moderatore
 
Messaggio: 4607 di 10436
Iscritto il: 08/12/2008, 20:37
Località: Madrid


Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite