Pagina 2 di 2 primaprima 1 2
Visualizzazione dei risultati da 11 a 15 su 15
  1. #11
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Sappi che questo è il modo meno efficiente in assoluto, ad ogni modo ecco il codice corretto e commentato
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    //non esiste malloc.h
    
    
    //quel void e' buona prassi, ma la questione e' complicata.
    int* leggi(void)
    {
        int *array, n, i;
    
    
    
    
        i=0;
        array = NULL;
        //array=(int*)malloc(sizeof(int)*i);
        //non e' necessario allocare spazio iniziale
        //in ogni caso non allocheresti nulla in quanto i=0;
        
        //i++;
        //non ci sono elementi, lascia i a 0
        
        //scanf("%d", array);
        //non ha minimamente senso, pensa a quello che fai!!!
    
    
        do{
            scanf("%d", &n);
            ++i; //ti serve un elemento
            //realloc prende come primo parametro l'oggetto da reallocare
            array = (int)realloc(array, sizeof(int)*i);
            //imposti l'ultimo elemento a quello letto
            //N.B. Puoi usare la sintassi degli array, documentati sul rapporto puntatori-array
            array[i-1] = n;        
        } while(n!=-99);
        
        //prima era totalmente scorretto.
        return array;
    }
    
    
    
    
    int main (int argc, char*argv[])
    {
        int *a;
        //devi salvare il valore da qualche parte
        a = leggi();
        
        //stampiamo giusto per conferma
        int i = 0;
        while(a[i] != -99) {
            printf("%d ", a[i]);
            ++i;
        }
        puts("");
    
    
        //devi liberare la memoria allocata dinamicamente
        free(a);
        return 0;
    }
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  2. #12
    Scusate l'intromissione ma ho una domanda molto simile e non vorrei aprire un nuovo post.
    Nel caso in cui abbia bisogno di leggere da file una stringa che porrò in un array? Ovviamente a priori non so quanto sarà lunga la stringa, dunque serve malloc perchè non so quanto sarà grande l'array.

    Il file ha una struttura del genere:

    -2.5 nome1 nome2
    -3 nome1 nome2
    1.3 nome1 nome2

    Se dichiaro un array statico il tutto è molto semplice:

    struct tipo_dato
    {
    float dati.temp;
    char dati.nome1[50];
    char dati.nome2[50];
    }
    struct tipo_dato dati[365];

    while (!(feof(f)))
    {
    fscanf(f, "%lf %s %s", &dati.temp, dati.nome1, dati.nome2);
    }

    Ma come faccio una corretta malloc su questa struttura? Non solo non conosco la lunghezza delle stringhe nome1 e nome2 ma non so quanti record di dati immagazzinerò...ho ipotizzato rispettivamente 50, 50 e 365 (essendo dati riferiti ai giorni dell'anno).

    Avete qualche suggerimento?

    Grazie

    Daniele
    Ultima modifica di rosencrruetz; 30-12-2014 a 18:03

  3. #13
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551
    @rosencrruetz , la memoria utilizzata è praticamente la stessa, sia se tu continui in questo thread "dove nessuno leggerà la tua richiesta", sia se apri correttamente un tuo thread, dove la gente leggendo il titolo conosce la tua domanda, quindi segui il regolamento e apri una tua discussione

    Posso anticiparti, che il tuo problema si risolve con uso di puntatori, puntatore *dati "puntatore a struct" , che aumenterai di dimensione ad ogni riga letta da file, e puntatori a char nome1 nome2, campi della struct dati , che allocherai dinamicamente in base alla lunghezza della stringa letta...
    Tecnologia

  4. #14
    Quote Originariamente inviata da torn24 Visualizza il messaggio
    @rosencrruetz , la memoria utilizzata è praticamente la stessa, sia se tu continui in questo thread "dove nessuno leggerà la tua richiesta", sia se apri correttamente un tuo thread, dove la gente leggendo il titolo conosce la tua domanda, quindi segui il regolamento e apri una tua discussione

    Posso anticiparti, che il tuo problema si risolve con uso di puntatori, puntatore *dati "puntatore a struct" , che aumenterai di dimensione ad ogni riga letta da file, e puntatori a char nome1 nome2, campi della struct dati , che allocherai dinamicamente in base alla lunghezza della stringa letta...
    Grazie torn24
    L'avevo fatto perchè in moltissimi forum, giustamente, i moderatori chiedono di evitare l'apertura di thread su problemi già trattati.
    In ogni caso, ne apro uno nuovo.

    Daniele

  5. #15
    Quote Originariamente inviata da Scara95 Visualizza il messaggio
    Sappi che questo è il modo meno efficiente in assoluto, ad ogni modo ecco il codice corretto e commentato
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    //non esiste malloc.h
    
    
    //quel void e' buona prassi, ma la questione e' complicata.
    int* leggi(void)
    {
        int *array, n, i;
    
    
    
    
        i=0;
        array = NULL;
        //array=(int*)malloc(sizeof(int)*i);
        //non e' necessario allocare spazio iniziale
        //in ogni caso non allocheresti nulla in quanto i=0;
        
        //i++;
        //non ci sono elementi, lascia i a 0
        
        //scanf("%d", array);
        //non ha minimamente senso, pensa a quello che fai!!!
    
    
        do{
            scanf("%d", &n);
            ++i; //ti serve un elemento
            //realloc prende come primo parametro l'oggetto da reallocare
            array = (int)realloc(array, sizeof(int)*i);
            //imposti l'ultimo elemento a quello letto
            //N.B. Puoi usare la sintassi degli array, documentati sul rapporto puntatori-array
            array[i-1] = n;        
        } while(n!=-99);
        
        //prima era totalmente scorretto.
        return array;
    }
    
    
    
    
    int main (int argc, char*argv[])
    {
        int *a;
        //devi salvare il valore da qualche parte
        a = leggi();
        
        //stampiamo giusto per conferma
        int i = 0;
        while(a[i] != -99) {
            printf("%d ", a[i]);
            ++i;
        }
        puts("");
    
    
        //devi liberare la memoria allocata dinamicamente
        free(a);
        return 0;
    }
    Grazie mille, so che è il metodo peggiore per risolvere l'esercizio, mi serviva proprio per capire bene malloc e realloc. Vedo adesso le risposte, grazie ancora

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.