Page 1 of 6 12345 ... LastLast
Results 1 to 15 of 88

Thread: Piccola mano con C

  1. #1
    Lieutenant Brcondor's Avatar
    Join Date
    Mar 2005
    Posts
    4.610

    Default Piccola mano con C

    Ciao a tutti. per un Progetto dell'uni mi sn trovato costretto a riprendere in mano c e ampliare ciò che conoscevo.
    Solo che abituato a matlab, ci sto abbastanza impazzendo(sn 4 anni che non apro devcpp).
    Quello che vorrei fare è questo:
    una funzione che, dato un numero, esegua una serie di calcoli e restituisca due vettori contenenti il risultato di questi calcoli.
    Da quel che ho capito, ovviamento le array non posso passarle quindi devo passare due puntatori.
    La dichiarazione potrebbe essere del tipo
    void nome_funzione(int num,lis*il propvect1,lis*pvect2)?
    Dentro al corpo mi creo i due vettori e poi alla fine faccio si che i due puntatori puntino al primo elemento? Io da num, so quanti elementi devo avere, il problema che mi imdedisce un allocamento statico della memoria è che calcolo ogni volta una potenza di due di valori, quindi se ho bisogno di 1000 valori devo arrivare a 1024 e poi cancellare 24 valori.
    Per invece la lista dinamica di per se, dovrei definire una cosa del tipo
    struct lis{
    int valore1
    struct lis *next}
    Dato che lo scopo di fondo è fare un programma il piu veloce possibile, vorrei cercare di ottimizzare tutto, senza stare a occupare piu memoria del necessario...
    " ...e mai un pensiero non al denaro, non all'amore né al cielo... " Fabrizio de Andrè

  2. #2
    Lieutenant Junior Grade Eltarion's Avatar
    Join Date
    Dec 2004
    Location
    Venaria
    Posts
    4.085

    Default

    ma senza stare li ad usare liste...se ti passano l'array non allocaco (int * array) puoi fare una malloc del numero massimo di numeri che ti servono
    array = (int*)malloc(max, sizeof(int))
    e poi per ridemensionarlo al numero corretto fai una realloc alla fine
    array = (int*)realloc(array, newsize)
    Realm Of Trollers
    while ( ! ( succeed = try() ) );
    Spoiler

  3. #3
    Lieutenant Brcondor's Avatar
    Join Date
    Mar 2005
    Posts
    4.610

    Default

    Non sapevo delr realloc, mi sembra una buona soluzione.
    Il mio problema è duplice: creo un array di numeri, poi faccio una ricerca e copio il numero che trovo e i 4 numeri dopo. Se arrivo a fine array voglio che mi copi i numeri rimanenti dall'inizio: questo non dovrebbe essere un problema, faccio un if e se arrivo alla fine al posto di spostarmi di 1 sul vettore metto i=0;
    Il vero problema di fondo è che vorrei lavorare con numeri molto grandi, nell'ordine di 10^20 10^30: non cambia nulla se uso liste dinamiche o array nello spazio occupato nella memoria? Poi un'ultima cosa: se è veloce da fare, come faccio ad aprire un file di testo composto da soli numeri separati da spazi e dirgli di trasformarlo in un vettore di numeri?
    " ...e mai un pensiero non al denaro, non all'amore né al cielo... " Fabrizio de Andrè

  4. #4
    Lieutenant Junior Grade Eltarion's Avatar
    Join Date
    Dec 2004
    Location
    Venaria
    Posts
    4.085

    Default

    la lista dipende come la implementi, comunque è sicuramnte più grossa come struttura rispetto ad ubn array di int. Tra l'altro non trovo nessuna buona ragione per utilizzare una lista.
    Per il resto vedi http://www.cplusplus.com/doc/tutorial/files/ li trovi tutto se lavori in c++
    Realm Of Trollers
    while ( ! ( succeed = try() ) );
    Spoiler

  5. #5
    Lieutenant Brcondor's Avatar
    Join Date
    Mar 2005
    Posts
    4.610

    Default

    No volevo cercare di fare tutto in c per varie ragioni(in primis, per quanto me ne ricordi poco, lo conosco meglio del c++).
    " ...e mai un pensiero non al denaro, non all'amore né al cielo... " Fabrizio de Andrè

  6. #6
    Lieutenant Commander San Vegeta's Avatar
    Join Date
    Oct 2003
    Location
    Bologna
    Posts
    12.153

    Default

    non programmo in C da anni, quindi partiamo più o meno dallo stesso livello
    procediamo per step:
    funzione che prende in input 1 array di char e la sua equivalente con puntatore (sono la stessa cosa)
    Code:
    // function 1
    void dosomething(char cline[]) 	{
    ...
    }
    // function 2
    void dosomething(char *cline) 	{
    ...
    }
    e si usano così
    Code:
    char line[100];
    // function 1
    dosomething(line);
    // function 2
    dosomething(&line[0])
    Devi restituire due vettori: dato che non si possono restituire due variabili, o dichiari una struct che contiene due vettori (non è male come idea, ma è poco C-style) oppure passi come parametri i vettori in cui vuoi i risultati. Scegliamo la seconda opzione, più che altro perchè non ricordo come si lavora sulle struct lol
    Code:
    // function 2
    void doCalc(int myNumber, int *firstVector, int *secondVector) 	{
    ...
    }
    e si userebbe così

    Code:
    int* result1, int* result2;
    int myNumber = 71; // 69 + 2 dita nel culo
    
    doCalc(myNumber, result1, result2);
    Cosa fa la tua funzione non lo so, però so come salvare i risultati

    Code:
    // function 2
    void doCalc(int myNumber, int *firstVector, int *secondVector)	{
    	int firstVectorSize = 10;
    	int secondVectorSize = 23;
    
    	firstVector = (int *)malloc(sizeof(int) * firstVectorSize );
    	secondVector = (int *)malloc(sizeof(int) * secondVectorSize );
    	
    	// fai i calcoli
    	// salva i risultati negli array, ad esempio così
    	// firstVector[0] = 0;
    	// firstVector[1] = 1;
    	// ...
    	// firstVector[firstVectorSize - 1] = firstVectorSize - 1;
    
    	return;
    }
    arrivato qui, non ho ben capito cosa devi fare, perchè al momento hai tutto quello che ti serve per fare le tue cose... se mi spieghi bene cosa deve fare la funzione, vediamo di continuare
    Last edited by San Vegeta; 11th December 2011 at 20:14.
    I rubinetti a casa di Chuck Norris non perdono, vincono.

    In the beginning there was nothing...then Chuck Norris Roundhouse kicked that nothing in the face and said "Get a job". That is the story of the universe.

    Quote Originally Posted by Wolfo View Post
    Concordo e propongo ban temporanei per chi critica la topa , la topa non si critica , dal trombabile in su non si commenta in modo sgradevole.
    la tua ignoranza in materia e' raccapricciante
    -cit. Estrema, 2022

  7. #7
    Lieutenant Brcondor's Avatar
    Join Date
    Mar 2005
    Posts
    4.610

    Default

    thx mille, ora mi studio tutto quel che hai scritto e domani ti dico come è andata
    " ...e mai un pensiero non al denaro, non all'amore né al cielo... " Fabrizio de Andrè

  8. #8
    Lieutenant Brcondor's Avatar
    Join Date
    Mar 2005
    Posts
    4.610

    Default

    Ok, ho letto tutto a fondo. Molti spunti interessanti(tipo modificare la size come scrivevi te). Sul passare i puntatori come risultato di una funzione ok:
    dovrei fare una cosa del genere.
    int *v1,*v2;
    v1=(int*)malloc(num_elem*size(elem)) ;//la size la conosco prima di fare l'operazione,perche nell'operazione calcolo un numero di elementi a mia scelta
    v2=(int*)malloc(num_elem*size(elem)) ;
    la_mia_funzione_(v1,v2,parametri_vari);
    A questo punto avrei indietro i due vettori già scritti: quel che hai scritto era proprio quello che volevo, stavo facendo un po' di try per far funzionare la funzione come fosse un main(è abbastanza complicata) e aspettavo ad inserirla nel vero main.
    Sul salvare e caricare, intendo farlo da file: come carico una matrice di float dentro c? Ovviamente sapendo la sua posizione e nome(o chiedendo all'utente posizione e nome)
    E invece, come faccio a salvare in un file una struct composta da determinati valori(i due vettori calcolati, alcuni interi di identificazione, un'altra matrice)?
    Cioè quello che voglio fare io è:
    algoritmo 1:CREAZIONE FILE. ho unamatrice esterna==> load dentro c==>operazioni varie sulla matrice per ottenere alcuni parametri==> calcolo i vettori==> modifico la matrice==> salvo in un file i due vettori,i parametri calcolati e la nuova matrice
    algoritmo 2:VISUALIZZAZIONE FILE. ho un file salvato con vettori e matrice==> load dentro c
    Sicuramente si può fare, ora me la smazzo un pochino, se qualcuno ha voglia ancora di darmi una piccola mano quando diventerò milionario(cosa che succederà presto) lo sotterrerò di $$ :P
    " ...e mai un pensiero non al denaro, non all'amore né al cielo... " Fabrizio de Andrè

  9. #9
    Lieutenant Junior Grade Eltarion's Avatar
    Join Date
    Dec 2004
    Location
    Venaria
    Posts
    4.085

    Default

    letture e scritture su file ci sono nmila esempi su google. lo devi fare su linux o su windows? si usano api diverse (per win OpenFile e WriteFile, su linux hai le fopen e fread etc.)
    Realm Of Trollers
    while ( ! ( succeed = try() ) );
    Spoiler

  10. #10
    Lieutenant Brcondor's Avatar
    Join Date
    Mar 2005
    Posts
    4.610

    Default

    COs'è meglio? Volendo ho una live ubuntu e potrei lavorare su quella. Se è uguale, win mi è piu comodo
    " ...e mai un pensiero non al denaro, non all'amore né al cielo... " Fabrizio de Andrè

  11. #11
    Lieutenant Commander Axet's Avatar
    Join Date
    Sep 2003
    Location
    Ginevra
    Posts
    33.807

    Default

    Quote Originally Posted by Eltarion View Post
    letture e scritture su file ci sono nmila esempi su google. lo devi fare su linux o su windows? si usano api diverse (per win OpenFile e WriteFile, su linux hai le fopen e fread etc.)
    Sicuro? Magari dico una cazzata che C l'ho usato l'ultima volta tipo 8 anni fa, ma mi pare di aver sempre usato fopen & co su sistemi windows

    I'm no hero. Never was. Never will be.
    -----
    Soul of the mind, key to life's ether
    Soul of the lost, withdrawn from its vessel
    May strength be granted so the world might be mended...
    So the world might be mended...

  12. #12
    Lieutenant Brcondor's Avatar
    Join Date
    Mar 2005
    Posts
    4.610

    Default

    Domanda al volo slegata da tutto, con devcpp mi sn creato il mio ble project. Posso addare source file e usarli come funzioni esterne da chiamare nel main? Giusto per avere tutto ordinato e poter debuggare un pezzo di codice alla volta senza salvare nmila main che poi me li perdo in giro...
    " ...e mai un pensiero non al denaro, non all'amore né al cielo... " Fabrizio de Andrè

  13. #13
    Lieutenant Junior Grade Eltarion's Avatar
    Join Date
    Dec 2004
    Location
    Venaria
    Posts
    4.085

    Default

    Quote Originally Posted by Axet View Post
    Sicuro? Magari dico una cazzata che C l'ho usato l'ultima volta tipo 8 anni fa, ma mi pare di aver sempre usato fopen & co su sistemi windows
    yes you can ma solo ocn c++ se non erro. in c usi direttamente le api di winzozz

    @brcondor fallo su quello che ti è più comodo
    Realm Of Trollers
    while ( ! ( succeed = try() ) );
    Spoiler

  14. #14
    Lieutenant Junior Grade Eltarion's Avatar
    Join Date
    Dec 2004
    Location
    Venaria
    Posts
    4.085

    Default

    Quote Originally Posted by Brcondor View Post
    Domanda al volo slegata da tutto, con devcpp mi sn creato il mio ble project. Posso addare source file e usarli come funzioni esterne da chiamare nel main? Giusto per avere tutto ordinato e poter debuggare un pezzo di codice alla volta senza salvare nmila main che poi me li perdo in giro...
    certo che puoi, basta che le dichiari
    Realm Of Trollers
    while ( ! ( succeed = try() ) );
    Spoiler

  15. #15
    Lieutenant Brcondor's Avatar
    Join Date
    Mar 2005
    Posts
    4.610

    Default

    Quote Originally Posted by Eltarion View Post
    yes you can ma solo ocn c++ se non erro. in c usi direttamente le api di winzozz

    @brcondor fallo su quello che ti è più comodo
    Si ma il senso di quello che sto facendo è non nullo se e solo se creo la migliore ottimizzazione possibile di tutto, se no è un fail(o uno stronzo puo venire dopo di me e riciclare la mia idea).
    A naso direi che linux ottimizza meglio le risorse di windows, ma magari è una cazzata.
    Quote Originally Posted by Eltarion View Post
    certo che puoi, basta che le dichiari
    come le dichiaro? Come una funzione normale? E la chiamata nella main è uguale?
    " ...e mai un pensiero non al denaro, non all'amore né al cielo... " Fabrizio de Andrè

Page 1 of 6 12345 ... LastLast

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  
[Output: 106.09 Kb. compressed to 90.59 Kb. by saving 15.50 Kb. (14.61%)]