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);
}
ho provato anche a definire un float prova=2.3 e poi mettendolo in un int, ma il risultato e' lo stesso, in qualunque punto del main, mentre con mia somma sorpresa se faccio una simile operazione dentro una di quelle funzioni, ehm funziona.