Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 17
  1. #1

    Allocazione dinamica della memoria in C

    Non riesco a capire il motivo per cui nell'esecuzione mi dia un errore del tipo "realloc() invalid next size".
    É abbastanza urgente, grazie in anticipo

    codice:
    #include<stdio.h>
    #include<stdlib.h>
    int main(void){
      int i = 0, j;
      double *a, *b;
      a = (double *)malloc(1*sizeof(double));
      b = (double *)malloc(1*sizeof(double));
      FILE *fp;
      if ((fp=fopen("file.dat", "r"))==NULL){
        printf("Errore nell'apertura del file.\n");
        exit(EXIT_FAILURE);
      }
      while(!feof(fp)){
        fscanf(fp,"%lf %lf", (a+i), (b+i));
        i++;
        a = (double *)realloc(a, i*sizeof(double));
        b = (double *)realloc(b, i*sizeof(double));
      }
      for(j=0; j<i; j++){
        printf("%.8lf %.8lf\n",*(a+j), *(b+j));
      }
    }
    Ultima modifica di MItaly; 23-11-2015 a 14:24

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Quote Originariamente inviata da piergiuseppe24 Visualizza il messaggio
    É abbastanza urgente
    Questo è poco rilevante

    Comunque, fai attenzione nella realloc perché non tieni conto che i parte da zero ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Dunque mettendo:
    a = (double *).realloc(a, (i+1)*sizeof(double)); (lo stesso per b)
    si dovrebbe risolvere il problema.
    Però in questo modo non riempirei una cella dell'area in più? Il cui valore chiaramente é 0

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Sì, ma questa è la soluzione per il tuo codice.

    Se lo scrivi diversamente e allochi correttamente non sprechi spazio ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Quale sarebbe dunque la soluzione più "ecologica"?

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Quote Originariamente inviata da piergiuseppe24 Visualizza il messaggio
    Quale sarebbe dunque la soluzione più "ecologica"?
    Beh ... per un paio di double "ecoloagica" mi sembra esagerata ... comunque ... senza utilizzare malloc iniziali, dopo aver aperto il file, potrebbe essere

    codice:
        int i = 0, j, sz;
        double *a = NULL, *b = NULL;
        double t1, t2;
        while(fscanf(fp,"%lf %lf", &t1, &t2)==2)
        {
                sz = (i+1)*sizeof(double);
                a = (double *)realloc(a, sz);
                b = (double *)realloc(b, sz);
                a[i] = t1; 
                b[i] = t2; 
                i++;
        }
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Perdonami la domanda, non ho capito perché il while ogni volta valuti se:
    fscanf(fp,"%lf %lf",&t1,&t2)==2

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Si basa su come funziona la fscanf, nella documentazione

    http://www.cplusplus.com/reference/cstdio/fscanf/

    troverai

    Return Value

    On success, the function returns the number of items of the argument list successfully filled.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Ottimo! Come potrei invece, se avessi un file di n colonne, considerarne l'i-esima salvandola come in questo caso in un array?

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Quote Originariamente inviata da piergiuseppe24 Visualizza il messaggio
    Ottimo! Come potrei invece, se avessi un file di n colonne, considerarne l'i-esima salvandola come in questo caso in un array?
    Se n non è grande, esegui una fscanf con n variabili e memorizza nell'array la i-esima.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

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.