|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: May 2006
Messaggi: 110
|
[C] Conversione da float ad int
So perfettamente come si fa daltronde e' una cavolata colossale...
allora qualcuno mi aiuti a capire perchemmai in sto cavolo di programma non vuole convertirmelo!!! dandomi errore--->floating point: stack underflow il problema facendo il debug mi si presenta nelle due righe evidenziate nel main poco prima che inizi il ciclo Sono disperato devo farne una relazione per l'ultimo esame universitario!!!! (Per altro il resto del programma non funziona, ma vedremo dopo...) Codice:
#include<stdio.h> #include <stdlib.h> #include <string.h> typedef struct nomi_s { char nome [30]; float gradi; int giorno; struct nomi_s *next; }nomi; void inizialize(void); void muovi(int,int); void abbassa_penna(void); void alza_penna(void); void leggifile (nomi **); void ordinamento(nomi **); void main() { nomi *ptesta=NULL; nomi *corr,*pre,*succ; //dimenticato succ char car[30]; //avevo dimenticato il ";" int c=0; int dprima,ddopo,a; //dimenticati all'esame float gprima,gdopo; //dimenticati all'esame leggifile(&ptesta); ordinamento(&ptesta); inizialize(); corr=ptesta; gprima=(*corr).gradi; //queste sono le due maledette !!!! a=gprima; printf("Indicare il paziente desiderato(ctrl+z per terminare:\n"); scanf("%s",car); while (c!=-1) { while( corr!=NULL && strcmp((*corr).nome,car)!=0) { pre=corr; corr=(*corr).next; } if (corr!=NULL) { succ=(*corr).next; while (strcmp((*corr).nome,(*succ).nome)==0) { dprima=(*corr).giorno; gprima=(*corr).gradi; a=gprima; ddopo=(*succ).giorno; gdopo=(int)(*succ).gradi; if (ddopo==dprima+1) //ho corretto, avevo scritto il contrario " if (dprima==ddopo+1)" che non ha senso { muovi(gprima,dprima); abbassa_penna(); muovi(gdopo,ddopo); corr=(*corr).next; succ=(*corr).next; } else if (strcmp((*corr).nome,(*succ).nome)!=0) { if (c==0) { abbassa_penna(); //faccio un punto alza_penna(); } corr=(*corr).next; succ=(*corr).next; } c++; } inizialize(); gets(car); //avevo scritto car=getchar(); che e' per i caratteri c=0; corr=ptesta; } } } void leggifile(nomi **testa) { FILE *cf; char name[30]; int day; float grad; nomi *nuovo,*corr; if ((cf=fopen("CC.dat","r+"))==NULL) printf("Errore in apertura file\n"); else { while (!feof(cf)) { fscanf(cf,"%d%f%s",&day,&grad,name); nuovo=(nomi *)malloc(sizeof(nomi)); strcpy((*nuovo).nome,name); (*nuovo).giorno=day; (*nuovo).gradi=grad; (*nuovo).next=NULL; if(*testa==NULL) *testa=nuovo; else (*corr).next=nuovo; corr=nuovo; } } fclose(cf); } void ordinamento(nomi **testa) { nomi *ppre,*corr,*succ,*temptesta; nomi *temp; //di prova, poi toglilo ppre=*testa; corr=*testa; succ=(*corr).next; temptesta=*testa; while (temptesta!=NULL) { ppre=*testa; // nell'esame li ho scritti...ovviamente danno errore corr=*testa; succ=(*corr).next; while(succ!=NULL) { if(ppre==*testa && corr==*testa) { if(strcmp((*corr).nome,(*succ).nome)>0) { (*corr).next=(*succ).next; (*succ).next=corr; *testa=succ; ppre=*testa; corr=*testa; succ=(*corr).next; temptesta=*testa; } else { ppre=*testa; corr=(*ppre).next; succ=(*corr).next; } } else if(strcmp((*corr).nome,(*succ).nome)>0) { (*ppre).next=succ; (*corr).next=(*succ).next; (*succ).next=corr; corr=(*ppre).next; succ=(*corr).next; temptesta=*testa; } else { ppre=(*ppre).next; corr=(*corr).next; succ=(*succ).next; } temp=*testa; //per il debug poi togli if (temp==NULL) printf("la lista è vuota.\n"); else { printf("La lista è:\n"); while (temp!=NULL) { printf("%s\n",(*temp).nome); temp=(*temp).next; } printf("FINE.\n"); } } temptesta=(*temptesta).next; } } void inizialize () { printf("Posizione (0,0) penna su\n"); } void abbassa_penna() { printf("Penna giù\n"); } void alza_penna() { printf("Penna sù\n"); } void muovi (int grado,int giorno) { printf("Penna spostata in posizione (%d,%d)\n",grado,giorno); } Ultima modifica di federik1982 : 28-08-2007 alle 20:11. Motivo: aggiornamento |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Un prima soluzione senza leggere il codice: hai provato a sostituire float con double ?
|
![]() |
![]() |
![]() |
#3 |
Member
Iscritto dal: May 2006
Messaggi: 110
|
assolutamente no
purtroppo e' un tema d'esame, il docente impone l'uso di variabile float... il che e' un imposizione ridicola...ma che ci posso fare |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Hai provato a stampare (*corr).gradi prima di fare l'assegnazione ?
Hai provato ad esplicitare la conversione ? a=(int)gprima; Che compilatore usi ? |
![]() |
![]() |
![]() |
#5 |
Member
Iscritto dal: May 2006
Messaggi: 110
|
turbo c++ 4.5
lo uso dal 2002 circa a seconda delle versioni e mai dato problemi comunque si ho provato anche ad esplicitare e soprattutto ho provato naturalmente a convertire da float ad int in un programma a parte, facendo solo quello, e funziona, come e' giusto che sia e' solo in questo programma che non va...e non so spiegarmelo, ho provato anche a riscriverlo da capo ma non cambia, ci deve essere una qualche stupidaggine che mi frega... |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Davvero vi fanno fare esami con questo vetusto compilatore ?
E' chiaro che non vi fanno usare i double ![]() La stampa dei gradi prima dell'assegnazione l'hai provata ? Il float in Turbo C++ è a 16 bit se non sbaglio, probabilmente gradi è davvero troppo grande da essere contenuto nel float. |
![]() |
![]() |
![]() |
#7 |
Member
Iscritto dal: May 2006
Messaggi: 110
|
si la stampa l'ho provata
e poi i gradi sono ridicoli, e' un numero tipo 36.5 ... c'e' qualcosa di strano che non va nella funzione main perche' con lo stesso compilatore sul pc di un amico , con un main piu semplice settando appunto un float a =36.5 e poi un int b e facendo b=a ,funziona perfettamente e converte in int... |
![]() |
![]() |
![]() |
#8 |
Member
Iscritto dal: May 2006
Messaggi: 110
|
ecco, gia' che ci siamo
perchemmai non funziona gets(car) dove car e' definita come char car [30] non dovrebbe prendermi la stringa che scrivo da tastiera e immagazzinarla nella variabile car? un po come fa il getchar? |
![]() |
![]() |
![]() |
#9 |
Member
Iscritto dal: May 2006
Messaggi: 110
|
questo l'ho risolto da solo, anche se non comprendo
ho dovuto togliere un precedente scanf che effettuavo sulla stessa variabile ma io ero convinto che con il gets l'avrei semplicemente sovrascritta a piacere... sto impazzendo... ah, un altra cosa: il testo mi impone di far terminare il programma quando si digita ctrl+z, ...lo si usava nelle prime lezioni, manco mi ricordo piu come metterlo andrebbe bene qualcosa tipo : while (gets(car)!=EOF ) ? |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 10:04.