Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    [C++] Sprintf modifica il valore delle variabili

    Buongiorno a tutti,
    sto implementando un codice in C++ in cui ad un certo punto utilizzo la funzione sprintf() e, per un motivo che mi è completamente oscuro, una variabile che non dovrebbe c'entrare nulla con la funzione cambia il suo valore iniziale in un numero enorme; con questo codice:

    codice:
    [...]
    x[0]=xL;         // prima casella del vettore x ha il valore xL
    for(i=1;i<IMAX;i++)
    {
        x[i]=x[i-1]+dx;    
    }
    
    if(x[IMAX-1]>xR)    //se valore x[IMAX] supera il limite destro x[IMAX]=xR
    {x[IMAX-1]=xR;}
    
    hL=8.0;
    hR=0.8;
    uL=0.0;
    uR=0.0;
    
    pf1=fopen("dati_iniz_U.txt","w");
    
    for(i=0;i<IMAX;i++)  //inizializzo Q con le condizioni iniziali
    {
        if(x[i]<=0)
        {
            Q[i].h=hL;
            Q[i].u=uL;
        }
        else
        {
            Q[i].h=hR;
            Q[i].u=uR;
        }
        fprintf(pf1,"%d  %f\n", i, Q[i].h);
    }
    fclose(pf1);
    
    char nome[6];
    
    for(j=0;j<=NMAX;j++)
    {    
    
    if(j==0)
    {printf("%f\n", Q[0].h);}
    
    sprintf(nome,"[...]/dati_u%d.txt",j);
    pf1=fopen(nome,"w");     //apro file in scrittura
    
            if (pf1==NULL)
            { 
                printf("ERRORE creazione file");             
                system("PAUSE");  return 1;
            }
    [...]
    stampando a schermo la variabile Q[0].h ha valore 8.0 come è giusto che sia, se invece modifico il codice in questo modo,
    codice:
    for(j=0;j<=NMAX;j++)
    {    
    sprintf(nome,"[...]/dati_u%d.txt",j);
    
    if(j==0)
    {printf("%f\n", Q[0].h);}
    
    pf1=fopen(nome,"w");     //apro file in scrittura
    mettendo
    codice:
    if(j==0)
    {printf("%f\n", Q[0].h);}
    dopo la sprintf
    il valore della variabile stampato a schermo è un numero a 20 zeri...
    non capisco il motivo di questa cosa...
    vi sarei grato se mi seste una mano
    grazie

  2. #2
    Lasciate perdere, ho risolto il problema....dimensione della stringa "nome" troppo ridotta....

  3. #3
    In generale se ti vuoi risparmiare un po' di questi problemi ti conviene usare gli ostringstream C++, che provvedono per i fatti loro ad allocare quanta memoria serve via via che aggiungi roba alla stringa.
    Amaro C++, il gusto pieno dell'undefined behavior.

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 © 2024 vBulletin Solutions, Inc. All rights reserved.