Page 5 of 6 FirstFirst 123456 LastLast
Results 61 to 75 of 88

Thread: Piccola mano con C

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

    Default

    Quote Originally Posted by Hardcore View Post
    si questo lo so, chiedevo a lui cosa gli viene fuori, perchè appunto mi sembra strana come cosa.
    cosa ti sembra strano?
    Realm Of Trollers
    while ( ! ( succeed = try() ) );
    Spoiler

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

    Default

    è come se non creasse davvero il vettore... cmq non viene fuori nulla, non riesco a capire perchè. Sto lottando contro visual c++, perchè non esiste il toggle"usa c e non rompere il cazzo con c++".
    La mia impressione è che i puntatori dentro la funzione puntino all'inizio del vettore, ma nel main si scollino e puntino al nulla. Devo fare il malloc anche dentro al main?
    Nel senso.
    void funz(int *v1,int *v2,int num)
    {
    int .... ;
    v1=(int*)malloc(numelem*sizeof(int));
    v2=(int*)malloc(numelem*sizeof(int));
    // eseguo tutti i calcoli e scrivo tutti gli elementi dei due vettori
    printf("elementi dei vettori")//li stampa, e li stampa giusti

    }
    mentre nel main ho fatto cosi
    main{
    int numero;
    int *v1,*v2;
    printf(inserisci il numero
    scanf("%d",&numero)
    funzione(v1,v2,numero);
    //se stampo qua il programma si blocca
    //se uso i risultati in altro modo il programma si blocca


    }
    " ...e mai un pensiero non al denaro, non all'amore né al cielo... " Fabrizio de Andrè

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

    Default

    allora per la cosa di visual studio come ti ho scritto prima basta che salvi il sorgente come .c (vedi http://support.microsoft.com/kb/829488) non c'è nulla di particolare da fare.

    per il resto pasandso i vettori come puntatori una volta allocati sono allocati e basti (di fatti ti devi ricordare di fare la free). Di solito è buona norma non permettere alle fuznioni di allocare memoria, ma i buffer si dovrebbero passar alle funzioni già allocati (a volte non è possibile per vari motivi, non è un problema)

    non è che nella funzione incrementi in qualche modo il valore dei puntatori ai vettori? in quel caso può succedere che v1 e v2 non puntino più al primo elemento dell'array, ma chissà dove :P
    Realm Of Trollers
    while ( ! ( succeed = try() ) );
    Spoiler

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

    Default

    Non posso allocare lo spazio nel main, perchè la grandezza del vettore non è nota a priori. CIoè in realtà lo sarebbe, ma cmq nella funzione devo fare due realloc(prima esco fuori di tot cifre che pero non mi servono in se ma mi servono per calcolare le cifre utili e poi rialloco per ebitare di occupare spazio inutile).
    Magari è la reallocazione che mi frega. Io ho fatto così:
    if("devo scrivere piu elementi dello spazio allocato") v1=realloc(v1,nuovoMax*sizeof(int))
    //finisco i calcoli, il realloc si esegue all'ultima iterazione
    v1=realloc(v1,vecchioMax*sizeof(int))
    Non è che devo prima ripulire lo spazio che poi dealloco? Magari con free, faccio puntare un nuovo puntatore alla fine del vettore "utile " e faccio free del resto...
    " ...e mai un pensiero non al denaro, non all'amore né al cielo... " Fabrizio de Andrè

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

    Default

    nu se riallochi non hai bisogno di liberare la memoria. non capisco però una cosa, riallochi ogni volta che ti serve del nuovo spazio? a volte conviene allocare più memoria di quanta ne userai (senza esagerare) e riallocare alla fine.
    Realm Of Trollers
    while ( ! ( succeed = try() ) );
    Spoiler

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

    Default

    No funziona così
    Ogni ciclo ci sono due possibilità: che aumenti il numero di elementi noti di uno o che raddoppi la quantità di elementi noti.
    Inizialmente alloco una quantità pari al numero di elementi che mi servono.
    Se ad esempio ho già calcolato i 3/4 di elementi e finisco nel caso due, allora rialloco abbastanza spazio per contenere tutti gli elementi(quindi 6/4 dello spazio iniziale), li calcolo e poi rialloco per eliminare quei 2/4 che contengono informazioni inutili.
    Dato che a priori non posso sapere se e quando succederà che raddoppio gli elementi, l'unica cosa che potrei fare è allocare una qauntità doppia di spazio. Ma così spreco sicuramente un sacco di spazio: con numeri dell'ordine di 10^9 occupo 2 gb di spazio di ram, non mi sembra il caso di tirarmi la zappa sui piedi e allocare a priori troppa memoria
    " ...e mai un pensiero non al denaro, non all'amore né al cielo... " Fabrizio de Andrè

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

    Default

    effettivamente se sei in quell'ordine di grandezze allora non ti conviene allocare il massimo subito. conoscessi meglio il dettaglio dell'algoritmo potrei vededre se si può fare qualche ottimizzazione in più
    Realm Of Trollers
    while ( ! ( succeed = try() ) );
    Spoiler

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

    Default

    CMq il punto è che poi mi vede solo un vettore di 0. Se provo a stampare v1 da un'altra funzione, in qualsiasi punto mi stampa 0.
    " ...e mai un pensiero non al denaro, non all'amore né al cielo... " Fabrizio de Andrè

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

    Default

    mmm vai in debug e dacci maggiori info, ho provato a fare un piccolo programma di test e non ho questo problema. dichiaro il vettore nel main lo spippolo in una funzione e poi lo stampo dal main. nessun problema.
    Realm Of Trollers
    while ( ! ( succeed = try() ) );
    Spoiler

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

    Default

    mi posti il tuo codice please? Non riesco a capire come far andare il debug
    " ...e mai un pensiero non al denaro, non all'amore né al cielo... " Fabrizio de Andrè

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

    Default

    Cmq per ora ho aggirato il problema mettendo la funzione di stampa all'interno della funzione che genera i vettori, e così funziona. Se ci metto pure quella di salvataggio poi nel main posso loadare i risultati easy easy. Ecco, ora mi manca solo il salvataggio e poi il tool base è pronto a tempo di record. Qualche idea su come si salvino due vettori?
    " ...e mai un pensiero non al denaro, non all'amore né al cielo... " Fabrizio de Andrè

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

    Default

    allora scusa ma prima sono statro impreciso:

    se vuoi allocare dentro una funzione l'array allora il prototipo diventa
    void Funzione(int **vettore);
    questo in modo da poterlo passare per "riferimento" (in rtealtà in c non esiste il pasaggio byref e quindi devi passare l'indirizzo del puntatore all'array...)
    nell'esempio mi funzionava perchè preallocavo l'array
    quindi poi devi fare attenzione all'utilizzo del puntatore all'array dentro ala funzione. faccio un esempio
    void main(int argc, char **argv)
    {
    int *vet = NULL;
    int i = 0;
    TestArray(&vet);
    for (i=0;i<10;i++) {printf("%d\n", vet[i]);}
    return;
    }

    void TestArray(int **vet)
    {
    int i = 0;
    *vet = (int *)malloc(10 * sizeof(int));
    for (i=0; i<10; i++) {*(*vet+i) = i;}
    return;
    }

    per salvare i vettori puoi scriverli su un file (in sequenza e separati da un separatore)

    per il debug invece non capisco dove sia il problema: metti i breakpoint dove vuoi e poi lanci il programma in debug e si fermerà dove hai messo i break
    }
    Realm Of Trollers
    while ( ! ( succeed = try() ) );
    Spoiler

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

    Default

    Ok sei stato preziosissimo, come immaginavo sbagliavo a lanciare la funzione del main e non passandola come puntatore ovviamente non permettevo al main di modificare quei valori. Ora provo a reimplementare con il puntatore al puntatore.
    Il senso se ho ben capito dovrebbe essere:
    voglio modificare un int presente nel main==> uso un puntatore funz(int*parametro)
    voglio creare un array di int nel main==> funz(int**parametro).
    Ora esco per una commissione e poi mi rimetto sotto thx ancora.
    " ...e mai un pensiero non al denaro, non all'amore né al cielo... " Fabrizio de Andrè

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

    Default

    Cosa c'è di sbagliato in questa funzione di salvataggio? r e q sn i due vettori

    #include <stdio.h>
    #include <stdlib.h>
    int salva(int *r,int*q,int lung,int num){
    FILE *fp;
    int i;
    int ris;
    char filename[20];
    printf("\n Inserire un nome per il file(max 20 caratteri):\n");
    scanf("%s",filename);
    fp=fopen(filename,"w");
    ris=fprintf(fp,"Numero:%d\Lunghezza:%d\nIt Q R",num,lung);
    for(i=1;i<=lung;i++)
    {ris=fprintf(fp,"%d %d %d",i,q[i],r[i]);}
    fclose(fp);
    return 1;
    }
    " ...e mai un pensiero non al denaro, non all'amore né al cielo... " Fabrizio de Andrè

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

    Default

    La funzione era giusta, sbagliavo io a chiamarla
    " ...e mai un pensiero non al denaro, non all'amore né al cielo... " Fabrizio de Andrè

Page 5 of 6 FirstFirst 123456 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: 102.69 Kb. compressed to 87.43 Kb. by saving 15.26 Kb. (14.86%)]