PDA

View Full Version : un po' di problemini col C....


R1((ky
17-09-2002, 14:34
Dunque, per l'Uni devo fare un progetto in C che consiste nella gestione di un elenco di indirizzi e numeri telefonici.

Il programma funziona parzialmente, in pratica solo nella gestione del file con le informazioni delle persone.....usando gli stessi criteri nella gestione del file con i numeri di telefono, il programma non trova i record con i dati.


Altro problema: nell'inserimento dei numeri di telefono nel file, il programma non memorizza lo 0 iniziale del numero, perchè essendo visto come int, ovviamente lo 0 davanti non ha nessun senso...

allego il codice....



Per favore, aiutatemi...perchè per una serie di problemi che ho avuto.....se non porto questo programma entro il 30 settembre dovrò partire per il militare.....:eek:


grazie

lombardp
17-09-2002, 18:24
Poichè un "leading zero" non potrai mai averlo in un numero, ci sono due possibilità:

1) Metti regolarmente uno zero davanti al numero quando lo visualizzi.

2) Memorizza il numero di telefono come una stringa (un array di char), visto che in senso stretto il suo valore numerico non ti è di nessuna utilità.

recoil
17-09-2002, 22:36
ora non guardo il codice, cmq...
memorizzare un numero di telefono come intero a me sembra inutile e controproducente.
il numero di telefono è una stringa, poco importa se composta di soli numeri.
per memorizzare un numero di telefono, se corto, penso ti basti un intero da 32 bit che di sicuro ti fa risparmiare spazio rispetto ai caratteri che avresti bisogno...
ma ne vale la pena?
ti arriva un nr grande, vai in overflow...

secondo me, se non altro per una programmazione "ordinata", i dati numerici sui quali non hai bisogno di effettuare nessun tipo di operazione matematica è meglio salvarli come stringhe.

magari domani se ho tempo ti do una mano per il resto, cmq il mio è solo un consiglio

R1((ky
18-09-2002, 12:47
[b]magari domani se ho tempo ti do una mano per il resto, cmq il mio è solo un consiglio


grazie! :)

recoil
18-09-2002, 19:02
ho dato un'occhiata al codice, direi che di problemi ce ne sono e ben più gravi di quello 0 mancante.

la modifica è sbagliata.
hai memorizzato su ogni riga codice, cognome nome e indirizzo... ok.
ma se vuoi editare mettiamo la prima entry e gli metti un indirizzo più lungo sai che succede?
che invadi lo spazio della seconda entry, cancellandone una parte.
dovresti riscrivere il file da capo, ovvero copiare le entry precedenti a quella modificata, scrivere la stessa, ricopiare subito dopo le altre entry.
in alternativa, per una modifica più rapida, potresti stabilire dei limiti per nome cognome ecc. e salvare aggiungendo degli spazi vuoti in fondo, in modo che ogni tua entry occupi x caratteri e che la modifica sia immediata. questo però è uno spreco di spazio bello e buono, tienila come ultima alternativa.

non funziona nemmeno la stampa a video di tutte le entry. le stampa, ma poi dovrebbe ridare il menù, invece continua a scrivere 0 ogni volta che premi invio.

ancora la modifica, io ho inserito il codice 1, indirizzo nome tutte le storie... chiedo di modificare, mi domanda il codice, metto 1 e dice che non trova i dati. mah...
questa l'ho capita poi, tu usi un array chiamato P, ma se io apro il programma e il file rubrica esiste già devi caricarlo nel vettore, altrimenti che te ne fai dei file se poi usi una struttura volatile?
anzi, siamo più precisi, che te ne fai di un array quando hai il file?
togli quel P, leggi di volta in volta dal file...
non velocizzi le operazioni con l'array, sprechi solo memoria.

cmq io ti ho detto cosa non va secondo me, di lavoro da fare ne hai ma una mano te la diamo volentieri, cmq per prima cosa togli l'array P (anche il T...) e pensa a cosa vuoi fare per la modifica.

ciao

Stef3k
21-09-2002, 10:33
Ciao Recoil.Sono un amico di Ri((ky,in realta' il programma l'ho fatto io,lo dobbiamo presentare insieme....
Dunque,ho capito piu' o meno....
1)lasciamo stare il discorso spreco di memoria,nn ci interessa l'algoritmo migliore,basta che il prog funzioni!
2)e' importante invece l'ultima cosa che hai detto,l'array P e il resto.
Vedi,io ho organizzato ogni funzione come:
prima il caricamento di tutti i dati in Array,
poi la modifica dei suoi campi,
poi la sovrascrittura sul file del nuovo array.
Dove e' che e' sbagliato?Purtr come dici tu nn trova infatti i dati.
A questo punto,come faccio a leggere di volta in volta il file?
E poi,come mai per il primo file la funzione modifica funziona,e per il secondo no?E' strano....nn dovrebbe funzionare allora per tutti e due i file.....

recoil
22-09-2002, 17:09
sto dando un'occhiata...
ho capito perché la modifica non va, fate i confronti con l'array P ma quando inserite un elemento lo mettete in un buffer temporaneo, non nell'array!

quindi se volete insistere con l'idea di mettere tutto in un grande array in memoria (non credo che un docente sarebbe molto soddisfatto ma pazienza...) ricordatevi di aggiornarlo ad ogni operazione, inserimento compreso.

cmq, ecco qualche consiglio.
- il codice fatelo diventare una stringa, vale per esso lo stesso discorso fatto per i numeri di telefono.
- ho visto che quando cancellate una persona fate un ciclo che copia P[i + 1] in P[i].
ma che vuol dire?
funziona, ma è un'ulteriore spreco di tempo...
piuttosto mettete un campo intero che valga 0 o 1 e che dica se il tale elemento dell'array è o meno valido, oppure usate il campo codice come già fate
- tenete buona l'idea di leggere il file all'inizio e aggiornare l'array e fare il contrario quando uscite dal programma, probabilmente è la soluzione più semplice anche se non mi piace molto.

Stef3k
23-09-2002, 17:06
No aspetta.
-L'inserimento e' una soluzione trovata per immettere una nuova persona e un nuovo telefono.(funziona,ok)
-Le altre funzioni prima caricano in memoria i dati inseriti del file,immettendoli in un array.Nn e' sbagliato penso,perche' per le funzioni che riguardano P[](primo file) funzionano.(a parte la cancellaz)
-Il problema e' che stranamente per T[](secondo file)la Modifica e le altre funzioni nn trovano i campi,anche se le funzioni sono prat =a quelle di P[]se noti..
->a questo punto si tratta di tradurre in formule cio' che hai detto:
1)il codice come stringa nn e' un problema,lo faccio.
2)la Cancellazione nn ha effetto:(il ciclo copia i dati su un altro vettore per poi invalidare l'ultimo dato).Come interverresti sulla mia funzione?
3)la Modifica:v su.Riesci a intervenire dirett su quello che ho scritto io nel prog?
4)leggere il file all'inizio e aggiornare l'array nn va bene,perche' per es devo eseguire piu' funzioni prima di chiudere il prog,e dovrei chiudere e riaprire se faccio come dici tu...
Ti ringrazio del tempo che perdi,se ce la fai,abbiamo finito e ci salvi!

Stef3k
25-09-2002, 16:37
Ciao REcoil,sei riuscito a fare qc?Grazie ciao!!!!!!!!

recoil
25-09-2002, 22:38
se posso faccio qualcosina domani, dovrei avere tanto tempo libero in teoria :-)

recoil
26-09-2002, 12:01
allora ragazzi, ho riguardato brevemente il codice
ci sono un po' di cose che non sono ancora chiare...

1) il fatto di scrivere su file a cosa serve?
quando riavviate il programma c'è bisogno di tenere conto dei file oppure è come se la rubrica fosse vuota?

2) quando inserite una persona lo fate scrivendo su file, senza aggiornare l'array (parlo di inserimento_persona).
ok sarebbe giusto, ma se non aggiornate P è un po' difficile che poi funzionino cancellazione e modifica no?

nella cancellazione ho capito che fate, prima sovrascrivete le posizioni dell'array a partire da quella cancellata spostandole tutte indietro di 1, poi riscrivete il file tenendo conto del contenuto di P... bene allora fate la stessa cosa nella procedura modifica, alla fine riscrivete tutto il file e non solo i campi modificati.

il problema nel vostro progetto mi sembra proprio questo: la mancanza di coerenza delle scelte progettuali. se avete un file sarebbe meglio usarlo sempre, se avete un array idem.
i problemi credo proprio che si risolveranno così.
riguardo alla parte sul telefono vale lo stesso principio, ho dato un'occhiata rapida e ho notato che inserendo i numeri non aggiornate l'array e nella cancellazione non aggiornate il file, fate esattamente le stesse operazioni sia con il telefono che con il resto dei dati insomma.

ciao

cavay
26-09-2002, 20:23
Ragazzi vi voglio aiutare ma.......ancora devo capire una cosa:

1) a cosa servono questi array???
se state facendo una sorta di rubrica, quindi dove mem dati "persistenti" in un file, perchè caricare una mattone in memoria per gestire il tutto??

...se fa parte dell'eserc utilizzare gli array....allora è un discorso; altrimenti....nn utilizzateli e risolvete tutti questi probl inutili sulla gestione degli array!

consiglio:
1) le strutture e le funz inseritele in un file .h per magg legg
2) guardatevi anche le primitiva read e write


***
Buon lavoro

Stef3k
26-09-2002, 20:44
Dunque:
--nell'inserimento_ scrivo nel file in posizioni una dopo l'altra le persone e i telefoni,tanto le posizioni nn mi servono (nel file Notepad i campi ci sono tutti.....)
--in tutte le altre ho bisogno degli array perche' per ricercare,modificare,cancellare, devo caricare i dati del file in un array,senno' come faccio a trovare un determinato campo del file???
--fatto questo,le operazioni vengono fatte sempre sull'array,e poi scrivo l'array nuovo nel file,in modo che venga modificato.
Chiaro?
Dove sta l'errore?io aggiorno il file dopo le operazioni sull'array se vedete....cavolo,ma modifica e cancellazione nn vanno........

mjordan
27-09-2002, 02:15
Originariamente inviato da recoil
[B]se posso faccio qualcosina domani, dovrei avere tanto tempo libero in teoria :-)

Hey Recoil, hai cambiato avatar? Non riesco a capire cos'è, vedo solo un grosso sigarone nero nel centro :D :D :D :D

recoil
27-09-2002, 11:13
ok piccolo OT :-)
non è un sigaro, ma un proiettile.

http://www.recoil.co.uk/media/design/liquid3.htm

qui vedi la foto più in grande e vedrai che ti farai un'idea. a me le foto di quel sito piacciono un casino, penso che la terrò perché tanto la faccia di prima era troppo piccola, invece questo avatar ha dei colori che mi esaltano di più :)

mjordan
27-09-2002, 20:06
Originariamente inviato da recoil
[B]ok piccolo OT :-)
non è un sigaro, ma un proiettile.

http://www.recoil.co.uk/media/design/liquid3.htm

qui vedi la foto più in grande e vedrai che ti farai un'idea. a me le foto di quel sito piacciono un casino, penso che la terrò perché tanto la faccia di prima era troppo piccola, invece questo avatar ha dei colori che mi esaltano di più :)

Ok grazie per la spiegazione :D

Stef3k
28-09-2002, 09:49
nessuno ha qc idea di risoluzione?

cavay
28-09-2002, 19:00
Originariamente inviato da Stef3k
[B]Dunque:
--nell'inserimento_ scrivo nel file in posizioni una dopo l'altra le persone e i telefoni,tanto le posizioni nn mi servono (nel file Notepad i campi ci sono tutti.....)
--in tutte le altre ho bisogno degli array perche' per ricercare,modificare,cancellare, devo caricare i dati del file in un array,senno' come faccio a trovare un determinato campo del file???


Se invece di utilizzare un array utilizzi solo una var di tipo struttura potresti fare una cosa del genere:

while(test)
{
//leggi una riga del file e l'assegni alla variabile
if(CampoStruttura==ValoreDesiderato)
test=false;
}
a questo punto vella variab struttura hai quello che cercavi!


--fatto questo,le operazioni vengono fatte sempre sull'array,e poi scrivo l'array nuovo nel file,in modo che venga modificato.
Chiaro?
Dove sta l'errore?io aggiorno il file dopo le operazioni sull'array se vedete....cavolo,ma modifica e cancellazione nn vanno........


Il ragg file e...cmq dovrebbe funzionare... nn ho visto il codice bene ma...ti consiglio di scegliere questa strada!

una volta trovato "il record" ke ti interessa , conosci anche la posizione della testina....quindi utilizzando read write seek etc etc...fai tutto quello che vuoi!!

(un altra soluzione sarebbe quella di uilizzare un file d'appog...tipo coome utilizzi ti un array........perchè nn l'array? immagina che il file diventi di dimensioni enormi....l'applicazione nn potresti + farla girare.....insomma dipenderebbe troppo dalla disp di memoria che si ha su di una macchina)

Cmq se...preferisci fare in questo modo....ok! appena ho un pochettino di tempo guardo il codice e...ti faccio sapere!

cavay
28-09-2002, 23:15
cmq.....ho dato uno sguardo veloce al codice....nn l'ho provato...pero' se mi dici che tutto funz a parte...etc etc allora credo di aver capito il problema:

ti confronti 2 stringhe (ovviamente parlo di stringhe c e nn quelle c++.....insomma di array di caratteri)come se confrontassi due variabili semplici.......mi spiego:

int a,b;

allora puoi fare sia un assegnazione del tipo a=b; che un confronto tipo if(a==b)......se invece stai parlado di char* devi utilizzare
strcpy //per assegnazione
strcmp //per confronto......restituisce 0 se le due stringhe sono uguali!

***
anche se nn ho compilato...credo che sia questo proprio il problema, cmq.....fammi sapere se funz o no, in caso negativo significa che compilo un po' l'adazza e...vedo meglio

N.B.
continuo a scons sta soluzione....se poi vuoi proprio....aggiustalo un po', rendilo un attimino + legg e....se proprio vuoi usare le stringhe .... almeno allocale dinamicamente!!

Stef3k
29-09-2002, 12:20
Aspetta aspetta,siamo all'univ primo anno,le allocazioni dinamiche nn le abbiamo ancora fatte,neanche read write seek....:)rimango con gli array....
Il discorso delle stringhe ahhhhhhhhhhhhhh.......
penso tu abbia proprio colto la sottigliezza....:)
allora: 1)sulla ricerca telefoni (che contiene la procedura che valuta insieme al 2 file anche il primo) ora va,cioe' i campi del secondo file ora li trova,perche' appunto avevo scritto male il confronto stringhe...
->la stranezza del fatto che nn trovava i campi e' risolta
->questo vuol dire che ho la conferma che la procedura che lega 1file-2file va.

2)adesso rimane soltanto la Modifica e Cancellazione (per tutti e due)
--la Cancellazione nn ha effetto
--la Modifica:io ricerco/trovo/copio nell'array alla posizione i-esima i campi che scrivo a video/scrivo nel FILE i campi nuovi ALLA POSIZIONE I-ESIMA, ma nn fa altro che aggiungermi ALLA FINE del file la nuova struttura,senza modificare la precedente. Perche'??

Se nn e' troppo disturbo,ti consiglierei di o compilare e vedere le 2 funz,o leggere attentamente solo quelle 2 li (basta che lo fai per il primo file,tanto poi modifico io di conseguenza per l'altro)
Grazie ancora

Stef3k
29-09-2002, 12:21
ecco il nuovo file modificato

cavay
29-09-2002, 19:35
siete all'univ??.....mi sembra strano che vi facciano stud il ling c invede del c++;
cmq......

il fatto che la mod o la canc nn vada a buon fine....nn mi sembra poi una cosa tanto strana.....se lanci l'applicazione e decidi di voler modificare un certo contatto......come dovrebbe funzionare??

non inizializ il vettore quindi...nn trova niente, invece dovrebbe funz se...dopo aver lanciato l'applic, fai prima un inserimento e come seconda operaz...senzachiudere l'applic ...fai una modif o cancellaz.......

Non ho provato cio' ke dico ma.....credo ke sia questo il problema!!
insomma....appena si avvia l'applicaz devi caricare il vettore altrimenti non puoi fare le operazioni su di esso....

**
Buon lavoro

Stef3k
30-09-2002, 15:09
ma guarda che all'interno delle due funzioni Mod e Canc,io il vettore gli dico di caricarlo in memoria....e poi faccio le operazioni,e' quello che ti dicevo all'inizio...
deve essere un errore di valutazione suo o di logica,proprio nn mi smuovo da questo problema....

Stef3k
02-10-2002, 16:43
Ho capito sai quale e' il problema...
Allora prendendo la Modifica ad esempio:
--bufferizzo i dati del file in un vettore (come faccio x tutte le funzioni)
--metto i dati nuovi in quel vettore,modificandolo
--scrivo nel file quel vettore modificato.

RISULTATO Logico: mi scrive nel file dopo il primo vettore anche quello modificato,uno di seguito all'altro.

->DOMANDONE FINALE : gestendo i vettori,nn c'e' un modo per intervenire sul vero vettore del file dopo aver modificato quello immagine in memoria?? Se si,come si fa?
Fatto questo,il problema e' risolto..