.dsy:it. Pages (28): « First ... « 6 7 8 9 [10] 11 12 13 14 » ... Last »
Show 150 posts per page

.dsy:it. (http://www.dsy.it/forum/)
- Algoritmi e strutture dati (http://www.dsy.it/forum/forumdisplay.php?forumid=207)
-- Progetto "FACCIALIBRO" (http://www.dsy.it/forum/showthread.php?threadid=37551)


Posted by darkshadow on 11-02-2009 12:41:

 
sul sito di aguzzoli c'è gcc per win. decomprimi la cartella e poi da riga di comando vai nella cartella e digiti gocs che ti setta le variabili d'ambiente e poi il resto è uguale a gcc in linux.

__________________
by Ð@rk§h@ÐØw


Posted by Joy88 on 11-02-2009 12:49:

Ti ringrazio Darkshadows!!!
Adesso ci provo..!!
Ti citerò nei ringraziamenti del progetto!!!
:cool:
ihihih!!!

__________________
"Amor, ch’a nullo amato amar perdona, mi prese del costui piacer sì forte che, come vedi, ancor non m’abbandona."

*Dante*


Posted by Benny on 11-02-2009 23:38:

iuz-lab ci ho capito poco di tutto quello che hai detto, anche perchè io prima usavo l'originale gets e il prof me lo aveva vietato, cosi sono passato alla scanf, e tutto andava bene ma siccome devo prendere un input con spazi bianchi e quindi ho usato strcat per aggiungerli, mi fa un casino non indifferente..in pratica credo che con la scanf il puntatore venga sovrascritto normalmente, ma nel caso io usi la strcat, sovrascriva solo l'ultimo puntatore, e presto si riempira del tutto lasciando il vecchio contenuto quasi intatto...continuo a provare a ripulire il puntatore, ma perdo tempo per sta cosa..
ti ringrazio per l'interesse, pero non posso copiare il tuo codice o il prof mi fa il culo quando lo vede

__________________
Se non credi in te stesso, chi ci crederà?


Posted by iuz-lab on 12-02-2009 02:15:

allora vedo di essere piu' chiaro..

l'obiettivo è dividere una stringa in modo particolare.. nello specifico (per nick n st):
<spazi bianchi> <nick> <spazi bianchi> <char 'n'> <spazi bianchi> <st>

per farlo il c ti mette a disposizione diverse funzioni utili.. gets e strtok sono quelle che ci interessano..

char *gets(char *s);
Reads next line from stdin into s. Replaces terminating newline with '\0'. Returns s, or NULL on end-of-file or error.
e qui ci troviamo di fronte al problema dell'overflow che puoi risolvere usando readstring (ammesso che io abbia capito quello che dovrebbe fare readstring.. magari mi sto' sbagliando) o la funzione che ho postato o una funzione equivalente..

char* strtok(char* s, const char* ct);
A sequence of calls to strtok returns tokens from s delimited by a character in ct. Non-NULL s indicates the first call in a sequence. ct may differ on each call. Returns NULL when no such token found.
questa funzione è una manna per leggere stringhe del tipo nick n st..
in pratica la prima volta che la chiamiamo gli passiamo come primo parametro il nome della stringa da esaminare e nelle successive chiamate gli passiamo NULL, mentre come secondo parametro gli indichiamo un set di caratteri che funzionano da delimitatori..

per esempio:

code:
char *string = "123 456 789"; char *part; part = strtok(string, " "); do { printf("-- %s --\n", part); } while (part = strtok(NULL, " ") != NULL);


stamperà:
code:
-- 123 -- -- 456 -- -- 789 --


questo pero' non è il comportamento che volevamo.. per noi dopo il secondo token "tutto fa brodo"..
ma strtok ci mette in condizione di cambiare i caratteri delimitatori del token ad ogni chiamata..
quindi possiamo scrivere un codice del tipo:
code:
char *string = "bob n i hate facebook"; char *nickname, *action, *status; nickname = strtok(string, " "); action = strtok(NULL, " "); status = strtok(string, ""); // NOTA CHE NON HO DATO ALCUN CARATTERE DELIMITATORE printf("--%s--", nickname); printf("--%s--", action); printf("--%s--]", status);


visto che nell'ultima chiamata a strtok non ho messo delimitatori strtok mi ritornerà il resto della stringa (che è il comportamento desiderato)..

quindi l'ouput sarà:
code:
--bob-- --n-- -- i hate facebook--


ora, come puoi vedere, siamo vicinissimi alla soluzione.. dico vicinissimi perchè cambiare il set di delimitatori nella terza strtok ci ha fatto prendere come stringa di status " i hate facebook" (nota lo spazio iniziale) invece di "i hate facebook"..

per risolvere puoi usare la funzione strspn..
size_t strspn(const char* cs, const char* ct);
Return length of prefix of cs consisting entirely of characters in ct.

questa funzione non te la spiego.. perchè iniziano a sanguinarmi gli occhi :-D ma la puoi sfruttare per scriverti una funzione ltrim in C..

ricapitolando:
code:
char *line; char *nick, *status, *action, *string1; while(line = gets() != NULL) { // qui usa una funzione sicura ma equivalente a gets string1 = strtok(line, " "); // questo è il primo token (non so come chiamarlo finche //non conosco l'azione da intraprendere.. //e questo lo posso capire solo esaminando il secondo token nello switch) action = strtok(NULL, " "); switch(action[0]) { // ... case 'n': nick = string1; // adesso che so che la funzione è 'n' ho capito che il // primo token rappresentava il nickname status = strtok(NULL, ""); // qui ci finirà "status" con eventuali spazi iniziali // elimino gli spazi iniziali (e magari anche finali) da status // faccio le mie sporche operazioni con nick e status break; // ... } }


spero di essere stato sufficientemente chiaro (dubito)..

ciao,
iuz


Posted by iuz-lab on 12-02-2009 02:20:

Originally posted by Benny io prima usavo l'originale gets e il prof me lo aveva vietato, cosi sono passato alla scanf [/B]


sia gets che scanf soffrono degli stessi problemi.. vanno evitate entrambe :-P

se le usi non sei in grado di rispettare il vincolo del progetto che dice "non devono esistere limiti alla lunghezza massima di una stringa" o qualcosa del genere (il succo comunque era quello)..

scriviti una funzione gets sicura e sei a posto..

ne trovi mille implementazioni gia' pronte in rete (probabilmente anche nei progetti passati) oltre quella che ho gia' lasciato nel post di ieri (era ieri?!?)..


Posted by xSharKMaNx on 12-02-2009 08:05:

Grande iuz-lab ... è esattamente ciò che ho fatto ;)
ma la fgets si potrà utilizzare ?

ieri sera leggendo tutti i i punti del progetto ho notato:


Per semplicità si suppone che l’input sia sempre conforme alle specifiche delle Tabelle 1,2,3 e 4, per cui
non è necessario controllare la correttezza dell’input. Per leggere l’input si usino le funzioni standard
ANSI C getchar() e/o scanf().

__________________
Perché, mentre il manganello può sostituire il dialogo, le parole non perderanno mai il loro potere; perché esse sono il mezzo per giungere al significato, e per coloro che vorranno ascoltare, all'affermazione della verità. E la verità è che c'è qualcosa di terribilmente marcio in questo paese. (V)

I popoli non dovrebbero aver paura dei propri governi, sono i governi che dovrebbero aver paura dei popoli. (T.J)


Posted by Joy88 on 12-02-2009 09:17:

Ragazzi io sto implementando tutto tramite liste..
Ma avete pensato a come fare per i gradi di separazione?? :?
Non so proprio dove sbatter la testa..

__________________
"Amor, ch’a nullo amato amar perdona, mi prese del costui piacer sì forte che, come vedi, ancor non m’abbandona."

*Dante*


Posted by Gehur on 12-02-2009 09:57:

be io conto tutti gli amici che ho, e ci levo 1..

quindi se ho 3 mici nella lista amici, il grado di separazione sarà 2, se ho solo 1 amico, sarà infinito..

il fatto è che non sono sicuro di aver capito la specifica :D

ma qualcuno è riuscito a finirlo il progetto??


Posted by Joy88 on 12-02-2009 10:03:

No aspetta x il grado di separazione io l'ho inteso così:
A amico di B amico di C amico di D
tra A e B il grado è 1
tra A e C il grado è 2
tra A e D il grado è 3

se avessi:
A amico di B amico di C amico di D e E amico di F
tra A e E il grado è infinito
tra A e F il grado è infinito
:shock:
..Ho capito male io??? :?

__________________
"Amor, ch’a nullo amato amar perdona, mi prese del costui piacer sì forte che, come vedi, ancor non m’abbandona."

*Dante*


Posted by Gehur on 12-02-2009 10:29:

quindi tu dici se non sono amici grado infinito,altrimenti se sono amici conta quante persone ci sono tra loro 2

e bo..io non ho capito molto bene il testo, dovrei rileggerlo ma adesso sono in sbatta per far funzionare il tutto correttamente, al max il grado di separazione lo ricalcolo, non mi sembra il problema più grosso..


Posted by Joy88 on 12-02-2009 10:35:

Originally posted by Joy88
No aspetta x il grado di separazione io l'ho inteso così:
A amico di B amico di C amico di D
tra A e B il grado è 1
tra A e C il grado è 2
tra A e D il grado è 3

se avessi:
A amico di B amico di C amico di D e E amico di F
tra A e E il grado è infinito
tra A e F il grado è infinito
:shock:
..Ho capito male io??? :?


Ma guarda che nel mio esempio A è amico di B ma NON di C e D..
Per quello mi sembra difficile.. tutti gli amici di A hanno grado 1 gli amici degli amici di A (che non sono miei amici) hanno grado 2, gli amici degli amici degli amici di A (non miei amici) hanno grado 3 ecc..
Ho paura di una funzione ricorsiva infinita!!!!
:twisted:

__________________
"Amor, ch’a nullo amato amar perdona, mi prese del costui piacer sì forte che, come vedi, ancor non m’abbandona."

*Dante*


Posted by Gehur on 12-02-2009 11:39:

io alla prima lettura l'avevo interpretata così:
system ! nick nick2
nick e nick 2 devono essere amici, se sono amici conta quante persone ci sono nella lista amici di nick, se è presente solo nick2 fai grado infinito..

ripeto dovrei rileggerla visto che ho dubbi su come l'ho compresa


Posted by iuz-lab on 12-02-2009 16:01:

Originally posted by xSharKMaNx
ma la fgets si potrà utilizzare ?


beh, se usata bene, fgets è sicura.. mentre scanf no..

visto che il docente aveva proibito l'uso di fgets (non è che la abbia proprio proibita.. ma tant'è) io ho (come vedi dai post precedenti) scritto una funzione safe_gets che lavora con stringhe di lunghezza arbitraria e funziona grazie alla funzione getchar (che, al contrario di fgets, il docente dice di usare)

comunque non credo sia un problema.. meglio una fgets di una scanf..


Posted by nas on 13-02-2009 08:27:

ragazza ma è sufficiente che il progetto compilato con
gcc -o faccialibro faccialibro.c
non dia nessun errorre o warning o bisogna compilarlo con le opzioni -ansi e -pedantic e quindi
gcc -o -ansi -pedantic faccialibro faccialibro.c

???????


Posted by nas on 13-02-2009 08:28:

Originally posted by nas
ragazza ma è sufficiente che il progetto compilato con
gcc -o faccialibro faccialibro.c
non dia nessun errorre o warning o bisogna compilarlo con le opzioni -ansi e -pedantic e quindi
gcc -o -ansi -pedantic faccialibro faccialibro.c

???????

uhm... volevo dire ragazzi!


All times are GMT. The time now is 09:02. Pages (28): « First ... « 6 7 8 9 [10] 11 12 13 14 » ... Last »
Show all 417 posts from this thread on one page

Powered by: vBulletin Version 2.3.1
Copyright © Jelsoft Enterprises Limited 2000 - 2002.