[C]Allocazione dinamica
  • In diretta da GamesVillage.it
    • News
    • -
    • In Evidenza
    • -
    • Recensioni
    • -
    • RetroGaming
    • -
    • Anteprime
    • -
    • Video
    • -
    • Cinema

Visualizzazione risultati da 1 a 7 di 7

Discussione: [C]Allocazione dinamica

Cambio titolo
  1. #1
    Utente L'avatar di Metal2001
    Registrato il
    10-02
    Messaggi
    8.720

    [C]Allocazione dinamica

    Codice:
    #include <stdio.h>
    #include <stdlib.h>
    typedef struct{
            char nome[10];
            long punti;
            } rank;
            
    void menu ();
    void inizializza(rank **V,int *pn);
    void leggi(rank **V,int *pn);
    void visualizza(rank *V,int n);
    void salva(rank *V,int n);
    
    main ()
    {
         rank *A;
         int i;
         int n=5;
         int load;
         int sel;
         printf("Se ci sono dati salvati premere 1");
         scanf("%d",&load);
         if (load==1) inizializza(&A,&n);
         else malloc(n*sizeof(rank));
         do{
             menu();
             scanf("%d",&sel);
             switch(sel){
                         case 1:leggi(&A,&n);
                         break;
                         case 2:visualizza(A,n);
                         break;
                         case 3:salva(A,n);
                         break;
                         default:;
                         }
                         }while(sel!=0);
                         }
    
    void menu ()
    {
         printf("---------------\n1-Inserisci record\n2-Visualizza\n3-Salva\n-------->");
         }
    void inizializza(rank **V,int *pn)
    {
         FILE *pf;
         pf=fopen("records.dat","r+");
    	long pos,dim;
    	fseek(pf,0,SEEK_END);
    	dim=ftell(pf);
    
    	int num=0;
    	
    	num=dim/sizeof(rank);
    	*V=malloc(num*sizeof(rank));
    		if (pf!=NULL)
    		{
      
    			fread(V,sizeof(rank),num,pf);
    			(*pn)=num;}
    		else pf=fopen("records.dat","w+");
    	
    	fclose(pf);
    }
    
    void leggi(rank **V,int *pn)
    {
      
         *V=realloc(*V,sizeof(rank)*((*pn)+1));
         printf("Nome:");
         scanf("%s",&(*V)[*pn].nome);
         printf("Punteggio:");
         scanf("%ld",&(*V)[*pn].punti);
         (*pn)++;
         }
    void visualizza(rank *V,int n)
    {
         int i;
         for(i=0;i<n;i++)
         {
                         printf("%s \t%ld\n",V[i].nome,V[i].punti);
                         }
                         }
    
         
    void salva(rank *V,int n)
    {
    	FILE *pf;
    	int i;
    
    	pf=fopen("records.dat","w");
    	
    			for(i=0;i<n;i++)
    				
    					fwrite(V,sizeof(rank),1,pf);
    
    	fclose(pf);
    }
    Ecco gli errori che da il compilatore:
    In function `void inizializza(rank**, int*)':
    65 invalid conversion from `void*' to `rank*'
    In function `void leggi(rank**, int*)':
    79 invalid conversion from `void*' to `rank*'


    Dov'è l'errore?
    Vi informo che di questo programma ho creato una versione con allocazione statica e poi l'ho modifica per provare l'allocazione dinamica
    Mi sono dimenticato di mettere il free ma non penso che sia quello il problema
    _

  2. #2
    Bannato L'avatar di hakkerz
    Registrato il
    12-05
    Messaggi
    315
    No? Io non conosco come funziona il meccanismo malloc() e free() del C, ma credo proprio sia quello.

  3. #3
    Utente L'avatar di AustinPowers
    Registrato il
    12-05
    Località
    New York
    Messaggi
    140
    Citazione hakkerz
    No? Io non conosco come funziona il meccanismo malloc() e free() del C, ma credo proprio sia quello.
    si, il malloc alloca una parte di memoria della heap specificata. puoi usarla ad esempio con
    int *t;
    t = malloc(sizeof(int));
    in modo simile a quello dell'operatore new del c++. in questo caso diamo a t una dimensione di 16 bit, ma per non avere problemi al posto di scrivere la misura per intero metteremo l'operatore sizeof che trova il valore di tipi di dato ( normali o complessi ) e variabili.

  4. #4
    Utente L'avatar di devilheart
    Registrato il
    01-03
    Messaggi
    28.310
    a me lo compila, però su
    Codice:
    scanf("%s",&(*V)[*pn].nome);
    mi dice format '%s' expects type 'char *', but argument 2 has type 'char (*)[9u]'
    comunque quella variabile i del main non è usata
    e la variabile pos in inizializza non è usata
    Ultima modifica di devilheart; 7-01-2006 alle 11:49:18

  5. #5
    Utente L'avatar di Metal2001
    Registrato il
    10-02
    Messaggi
    8.720
    oggi ho fatto un programma simile a quello postato e mi dava gli stessi errori col dev c++, mentre con l'lcc32 0 errori
    _

  6. #6
    Edmond Dantes L'avatar di Kane Connor
    Registrato il
    01-03
    Località
    Rizembul
    Messaggi
    31.022
    Citazione hakkerz
    No? Io non conosco come funziona il meccanismo malloc() e free() del C, ma credo proprio sia quello.
    Niente affatto, almeno per il primo errore; d'altra parte, il compilatore è abbastanza chiaro: conversione invalida, quindi lo spazio di memoria allocato non è della dimensione corretta per la tua struttura, ma "num" volte più grande. Fammi sapere se dopo funziona.

  7. #7
    Bannato L'avatar di hakkerz
    Registrato il
    12-05
    Messaggi
    315
    Citazione Kane Connor
    Niente affatto, almeno per il primo errore; d'altra parte, il compilatore è abbastanza chiaro: conversione invalida, quindi lo spazio di memoria allocato non è della dimensione corretta per la tua struttura, ma "num" volte più grande. Fammi sapere se dopo funziona.
    Beh, ho fatto un ipotesi
    E poi, mica io ho il problema, perchè rispondi a me?

Regole di Scrittura

  • Tu non puoi inviare nuove discussioni
  • Tu non puoi inviare risposte
  • Tu non puoi inviare allegati
  • Tu non puoi modificare i tuoi messaggi
  •