Torna indietro   Hardware Upgrade Forum > Software > Programmazione

HONOR Pad X9 Max recensione, schermo ultra large a meno di 400 euro
HONOR Pad X9 Max recensione, schermo ultra large a meno di 400 euro
HONOR Pad X9 Max mette un pannello IPS da 13 pollici con risoluzione 2,5K e refresh a 120 Hz davanti a una batteria da 10.100 mAh e a quattro altoparlanti. Il listino parte da 399,90 euro, per un progetto molto chiaro e ambizioso: schermo ampio, buon audio e giornate lontano dalla presa, a un prezzo che non pesa sul portafoglio
Lenovo ThinkPad X1 Carbon Gen 14: il business ultraleggero si rinnova dall’interno
Lenovo ThinkPad X1 Carbon Gen 14: il business ultraleggero si rinnova dall’interno
Con la quattordicesima generazione Lenovo ridisegna il suo ThinkPad più iconico attorno al nuovo Space Frame e ai processori Intel Core Ultra Series 3. Resta sotto 1Kg, è molto più semplice da riparare e si rivolge al professionista che lavora in mobilità, con un prezzo da prodotto di vertice.
Jabra Evolve3 85: le cuffie sia per l'intrattenimento che per il lavoro
Jabra Evolve3 85: le cuffie sia per l'intrattenimento che per il lavoro
Le Jabra Evolve3 85 non sono semplicemente cuffie Bluetooth con cancellazione del rumore. Sono un dispositivo professionale pensato per chi trascorre gran parte della giornata in riunione, al telefono o davanti a un assistente basato sull'intelligenza artificiale
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 02-03-2007, 00:28   #1
Veon
Member
 
Iscritto dal: Apr 2006
Messaggi: 74
[C] errore incomprensibile sull'acquisizione dati

Ciao a tutti
Allora devo fare un programma che acquisisce due valori (tempo e lunghezza) alla volta.
Questi due valori devono essere ordinati (rispetto al tempo) con gli altri già acquisiti.

Ogni tot valori (es. 10) deve stampare tutti i valori nella lista.

Il programma termina con i valori 0 e 0 (tempo e lunghezza).

Io ho fatto questo:

Codice:
#include <stdio.h>
#include <stdlib.h>

#define NUM 10

typedef struct dati * Dati;
void stampa(Dati head);

struct dati{
       double time;
       double length;
       Dati next;
};

Dati nuovodati (Dati al, double time, double length)
{
     al = malloc(sizeof(Dati));
     al->time = time;
     al->length = length;
     al->next = NULL;
return al;
}

Dati inserimento (Dati radice, double time, double length)
{
     
     Dati temp;
     Dati prev;
     Dati ausiliario;

     temp = radice;
     
     if ( radice == NULL )
     {
     radice = nuovodati(radice, time, length);
     }
     
     else if (radice != NULL)
     {     
     while ( temp!=NULL && time>(temp->time) )
     {
           prev = temp;
           temp = temp->next;
           
     }
     
     ausiliario = nuovodati(ausiliario, time, length);     
     
     if ( prev == NULL ) radice = ausiliario;
     else{
     ausiliario = temp;
     temp = ausiliario;
     }
     }
     
return radice;
};


void stampa(Dati head)
{
     Dati temp;
     temp = head;
            
            while ( temp != NULL )
            {
                  printf("%f %f", temp->time, temp->length);
                  temp = temp->next;
            }
}
            
int main()
{
    int i;
    double time, length;
    Dati radice;
    radice = NULL;
    
    for (;;)
    {
        i = 0;
        for (; i < NUM; i++)
        {
            scanf("%f %f", &time, &length);
            if ( time != 0 )
            {                
                radice = inserimento(radice, time, length);               
            }
            else if (time == 0) break;
        }
        stampa(radice);
    }


stampa(radice);
system("pause");
exit(0);
}
Ma alla terza coppia il programma termina senza nè stampare nè fare altro...

Non ne capisco il motivo, poteste illuminarmi voi?
Veon è offline   Rispondi citando il messaggio o parte di esso
Old 02-03-2007, 08:48   #2
trallallero
Senior Member
 
L'Avatar di trallallero
 
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
errore:
Codice:
al = malloc(sizeof(Dati));
corretto:
Codice:
al = malloc(sizeof(struct dati));
la prima ti ritorna la sizeof del puntatore che molto probabilmente é 4 mentre la seconda ti ritorna la dimensione della struttura che é ben piú grande di 4
Per il resto non so se ci sono altrei errori.
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve
trallallero è offline   Rispondi citando il messaggio o parte di esso
Old 02-03-2007, 09:18   #3
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Quote:
Originariamente inviato da Veon Guarda i messaggi
Codice:
Dati nuovodati (Dati al, double time, double length)
{
     al = malloc(sizeof(Dati));
     al->time = time;
     al->length = length;
     al->next = NULL;
return al;
}
Il parametro 'al' è inutile, bastava semplicemente dichiarare la variabile dentro la funzione.
__________________
Andrea, Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 02-03-2007, 09:57   #4
trallallero
Senior Member
 
L'Avatar di trallallero
 
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
e 2

nuovodati =
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve
trallallero è offline   Rispondi citando il messaggio o parte di esso
Old 02-03-2007, 11:13   #5
Veon
Member
 
Iscritto dal: Apr 2006
Messaggi: 74
Quote:
Originariamente inviato da trallallero Guarda i messaggi
e 2

nuovodati =
Scusa?
Veon è offline   Rispondi citando il messaggio o parte di esso
Old 02-03-2007, 11:22   #6
Veon
Member
 
Iscritto dal: Apr 2006
Messaggi: 74
Adesso quel problema sembra risolto, solo che:
1-non termina col valore zero
2-stampa due valori nulli

aiutatemi..
Veon è offline   Rispondi citando il messaggio o parte di esso
Old 02-03-2007, 11:33   #7
trallallero
Senior Member
 
L'Avatar di trallallero
 
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
Quote:
Originariamente inviato da Veon Guarda i messaggi
Scusa?
bannata la funzione
5 righe 2 errori

io ho da lavorare adesso, mi spiace
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve
trallallero è offline   Rispondi citando il messaggio o parte di esso
Old 02-03-2007, 11:48   #8
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Quote:
Originariamente inviato da Veon Guarda i messaggi
Adesso quel problema sembra risolto, solo che:
1-non termina col valore zero
2-stampa due valori nulli

aiutatemi..
Non l'ho notato prima ma hai usato %f nella scanf. Se devi prendere in input dei double, devi usare %lf.

Dopo che hai fatto questa correzione, inserendo 0 per time dovrebbe certamente uscire ma devi comunque inserire anche il secondo valore. Inoltre il test nel else if (time == 0) è inutile.
__________________
Andrea, Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 02-03-2007, 12:04   #9
Veon
Member
 
Iscritto dal: Apr 2006
Messaggi: 74
ora sembra andare meglio...

se non fosso che in stampa stampa solo il primo "Dati"
Veon è offline   Rispondi citando il messaggio o parte di esso
Old 02-03-2007, 14:13   #10
Veon
Member
 
Iscritto dal: Apr 2006
Messaggi: 74
finalmente ce l'ho fatta!!!!!

Grazie mille a tutti
Veon è offline   Rispondi citando il messaggio o parte di esso
Old 02-03-2007, 14:29   #11
trallallero
Senior Member
 
L'Avatar di trallallero
 
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
Quote:
Originariamente inviato da Veon Guarda i messaggi
finalmente ce l'ho fatta!!!!!

Grazie mille a tutti
di solito si spiega la soluzione del problema
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve
trallallero è offline   Rispondi citando il messaggio o parte di esso
Old 02-03-2007, 15:28   #12
Veon
Member
 
Iscritto dal: Apr 2006
Messaggi: 74
Quote:
Originariamente inviato da trallallero Guarda i messaggi
di solito si spiega la soluzione del problema
sè vero, solo che era un lavoro che dovevo consegnare e ho fatto tutti di fretta

Cmq ho corretto l'inserimento e l'acquisizione...
ecco:
Codice:
/** 
 *  Programma che acquisisce due dati dallo standard input, uno
 *  rappresentate il tempo e l'altro la lunghezza.
 *  Li inserisce poi in una serie concatenata contenente tutti i valori
 *  che vengono inseriti, ordinandoli in base al tempo.
 *  Infine li stampa tutti, con somma e media 
 *  dei valori della lunghezza.
 */

#include <stdio.h>
#include <stdlib.h>

/* Numero di coppie di dati dopo di che compie un giro di stampa. */
#define NUM 10 


/**
 * Struttura utilizzata nel programma per i dati in ingresso. 
 * "Dati" è definito come puntatore a struttura dati.
 */
typedef struct dati * Dati;
struct dati{
       double time;
       double length;
       Dati next;
};

/**
 * Prototipi delle funzioni che verranno utilizzate, 
 * il loro funzionamento è spiegato in seguito. 
 */
Dati inserimento (Dati radice, double time, double length);
Dati nuovodati (double time, double length);
void stampa(Dati head);


int main()
{
    int i=0;     /* Indice che conta le coppie in ingresso. */
    double time, length;
    Dati radice; /* Puntatore alla prima struttura. */
    
    radice = NULL;
    
    while ( time != 0  )
    {
        scanf("%lf %lf", &time, &length);
        if ( time != 0 )
        {
             radice = inserimento(radice, time, length);  
             i++;
             if ( i >= NUM )
             {
                  stampa(radice); /* Stampa parziale. */
                  i = 0;
             }             
        }            
    }
    stampa(radice); /* Stampa finale. */

exit(0);
}

/**
 * Funzione che si occupa di inserire le coppie di dati
 * e ordinarle in base al valore del tempo.
 */
Dati inserimento (Dati radice, double time, double length)
{
     Dati temp;                /*                        */
     Dati prev;                /* Puntatori di supporto. */
     Dati ausiliario;          /*                        */

     temp = radice;
     
     if ( radice == NULL )     /* Crea la prima struttura. */
     {
          radice = nuovodati(time,length);
     }
     
     else if ( radice != NULL )
     {
          while ( temp!=NULL && time>(temp->time) )
          {
                prev = temp;
                temp = temp->next;
          }
          
          ausiliario = nuovodati(time,length);
          
          if ( temp == radice )   /* Se temp coincide con la radice. */
          {
               ausiliario->next=radice;
               radice=ausiliario;
          }
          else
          {
              ausiliario->next=prev->next;
              prev->next=ausiliario;
          }
     }
     
return radice;
}

/*
 * Funzione che crea una nuova struttura per i nuovi dati.
 */
Dati nuovodati (double time, double length)
{
     Dati temp;
     temp = malloc(sizeof(struct dati));
     temp->time = time;
     temp->length = length;
     temp->next = NULL;
return temp;
}

/**
 * Funzione di stampa che si occupa anche di fare la somma
 * e la media dei valori.
 */
void stampa(Dati radice)
{    
     Dati temp;
     temp = radice;
     
     int i = 0;
     double somma = 0;
     double media = 0;
     
     printf("------------------------------------------\n");       
     while ( temp != NULL )
     {
           printf("Tempo: %.2lf \t", temp->time);
           printf("Lunghezza: %.2lf\n", temp->length);
           somma = somma + (temp->length);
           i++;
           temp = temp->next;
     }
     media = (somma/i);
     printf("\nSomma: %.2lf \tMedia: %.2lf\n", somma, media);
     printf("------------------------------------------\n");
}
Veon è offline   Rispondi citando il messaggio o parte di esso
Old 02-03-2007, 16:18   #13
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Quote:
Originariamente inviato da Veon Guarda i messaggi
Cmq ho corretto l'inserimento e l'acquisizione...
Ok, però adesso ti dirò una cosa che sicuramente ti sconvolgerà.

Innanzitutto non hai fatto alcun test sulla allocazione di memoria. Se la malloc fallisce, la funzione nuovodati() dovrebbe ritornare immediatamente NULL. Ma anche la funzione inserimento() a questo punto dovrebbe testare il risultato di nuovodati. La soluzione migliore sarebbe stata quella di fare in modo che la funzione inserimento() prenda come parametro un puntatore a Dati (quindi Dati *pradice) e restituisca un int con valore 1 o 0 a seconda del successo o meno.

Ma non è finita!! Passando a inserimento() un puntatore a Dati, si poteva ragionare in termini di puntatore a puntatore e la funzione si potrebbe quindi benissimo scrivere così:
Codice:
int inserimento (Dati *pradice, double time, double length)
{
    Dati datinew;

    if (pradice == NULL || (datinew = nuovodati(time,length)) == NULL)
        return 0;

    while (*pradice != NULL && time > (*pradice)->time)
        pradice = &(*pradice)->next;

    datinew->next = *pradice;
    *pradice = datinew;
    return 1;
}
Cioè con appena 8 righe di codice (tolte le righe vuote)

Poi si poteva usare così:
Codice:
if (inserimento (&radice, time, length)) {
    ....
}
__________________
Andrea, Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 02-03-2007, 17:01   #14
trallallero
Senior Member
 
L'Avatar di trallallero
 
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
Quote:
Originariamente inviato da andbin
Innanzitutto non hai fatto alcun test sulla allocazione di memoria. Se la malloc fallisce, la funzione nuovodati() dovrebbe ritornare immediatamente NULL.
mi fai tornare in mente quando ho fatto notare la stessa cosa (sia malloc che fopen incotrollate) alla soc. esterna che aveva fatto la gestione di una parte del progetto per UNA BANCA! la loro risposta:
"bisogna fidarsi del S.O."
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve
trallallero è offline   Rispondi citando il messaggio o parte di esso
Old 02-03-2007, 17:38   #15
Veon
Member
 
Iscritto dal: Apr 2006
Messaggi: 74
va bè ormai è fatto così...

Era un compito che verrà valutato e poi cancellato per sempre...

Spero che vada bene così
Veon è offline   Rispondi citando il messaggio o parte di esso
Old 02-03-2007, 20:30   #16
trallallero
Senior Member
 
L'Avatar di trallallero
 
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
Quote:
Originariamente inviato da Veon Guarda i messaggi
va bè ormai è fatto così...

Era un compito che verrà valutato e poi cancellato per sempre...

Spero che vada bene così
da quanto programmi in C ?
comunque apprezzo il tuo modo di intentare, penso che sia, visto il diffondersi dell'open source, la cosa più importante. Beh forse non quella più importante ma fra le più importanti

E non ti far impressionare dal codice di andbin lui ne sa una più del diavolo
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve
trallallero è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


HONOR Pad X9 Max recensione, schermo ultra large a meno di 400 euro HONOR Pad X9 Max recensione, schermo ultra large...
Lenovo ThinkPad X1 Carbon Gen 14: il business ultraleggero si rinnova dall’interno Lenovo ThinkPad X1 Carbon Gen 14: il business ul...
Jabra Evolve3 85: le cuffie sia per l'intrattenimento che per il lavoro Jabra Evolve3 85: le cuffie sia per l'intratteni...
MSI PRO MAX EDGE AI+, Ryzen AI Max+ 395 e 128 GB per far girare in locale anche i modelli più grandi MSI PRO MAX EDGE AI+, Ryzen AI Max+ 395 e 128 GB...
Recensione vivo X500 Pro Max: la fotografia mobile ha un nuovo protagonista Recensione vivo X500 Pro Max: la fotografia mobi...
Huang è solo l'ultimo di una lung...
Elon Musk conferma la fine del Cybertruc...
CrowdStrike acquisisce Fiddler: nasce Fa...
QNAP ES2486AFdc, storage all-flash e sup...
GTA 6, il preload svela i dettagli tecni...
OPPO non si ferma: ufficializzato l'arri...
No, questo non è il nuovo Registro di si...
Ritardi nell'Entry/Exit System europeo, ...
CMF Speaker S: piccolo, originale e con ...
Red Hat mette gli agenti IA al lavoro su...
Claude può sognare: l’IA di Anthropic ri...
Xiaomi Pad 7 12GB/256GB a 324,96€ su Ali...
Fox chiude l'acquisizione di Roku da 22 ...
Recensione vivo X Fold6: quando smartpho...
Xiaomi attacca l'Europa: proseguono i pr...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 06:09.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v