Newsgroup: it.comp.lang.c++
Titolo: [Problema] - Funzione che non funziona (ho fatto il gioco di parole)

il seguente programma:
// dichiarazione librerie
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// define e variabili globali
#define MAX_PREZZI 4
float prezzi [MAX_PREZZI];
// dichiarazione classe
#include "coda_paz.h"
// dichiarazione code
coda_pazienti coda_cassa, coda_eco, coda_radio;
// dichiarazione prototipi
void arrivo (); // non da esiti, poiche riceve solo i dati e li inserisce
in una variabile paziente
void radio (); // ritorna un esito se la coda e' piena
void eco (); // ritorna un esito se la coda e' piena
void inserimento_prezzi (); // inserimento prezzi
void main ()
{
 int scelta;
 do{
  printf ("\n        *** Programma Laboratorio Ecografie /
Radiografie ***\n\n\t1) Arrivo di un nuovo paziente\n\t2) Inserimento
nuovi prezzi\n\t3) Uscita da radiografia\n\t4) Uscita da ecografia\n\t5)
Uscita dal programma");
  printf ("\n\n\tSeleziona comando di menu'\t");
  scanf ("%d",&scelta);
  switch (scelta)
  {
  case 1:  // arrivo di un paziente //
   arrivo ();
   break;
  case 2: // inserimento prezzi //
   inserimento_prezzi ();
   break;
  case 3: // uscita da radiografia
   radio();
   break;
  case 4: // uscita da ecografia
   eco();
   break;
  case 5:
   printf ("\n\tIl programma e' terminato
!!!\n\tGrazie per averlo usato !!!\n\n\t");
   break;
  case 6: // inserimento prezzi //
   break;
  default:
   printf ("\n\tHai sbagliato, per favore
reinserisci\n");
   break;
  }
 }
 while (scelta!=5);
}
void arrivo ()
{
 int n_eco, n_radio, n;
 printf ("\n\tDammi il nome del paziente:\t");
 scanf ("%s",coda_cassa.nuovo.nome);
 printf ("\n\tDammi il cognome del paziente:\t");
 scanf ("%s",coda_cassa.nuovo.cognome);
 printf ("\n\tChe operazione/i deve fare ?\n\t(0 per radiografie,
1 ecografie, 2 entrambi):\t");
 scanf ("%d",&coda_cassa.nuovo.fare); // 0 per radiografie, 1
ecografie, 2 entrambi //
 if ( (coda_cassa.nuovo.fare) == 0) // se 0 lo mando alla coda
delle radiografie
 {
  coda_radio.nuovo=coda_cassa.nuovo;
  n_radio = coda_radio.inserimento ();
  if (n_radio==0)
   printf ("Il paziente %s %s e' stato inserito
nella coda delle radiografie",coda_radio.nuovo.nome,
coda_radio.nuovo.cognome);
 }
 else if ( (coda_cassa.nuovo.fare) == 1) // se 1 lo mando alla
coda delle ecografie
 {
  coda_eco.nuovo=coda_cassa.nuovo;
  n_eco = coda_eco.inserimento ();
  if (n_radio=0)
  printf ("Il paziente %s %s e' stato inserito nella coda
delle radiografie",coda_eco.nuovo.nome, coda_eco.nuovo.cognome);
 }
 else if ( (coda_cassa.nuovo.fare) == 2) // se 2 controllo quale
coda e' piu' libera e lo inserisco
 {
  n_eco = coda_eco.conteggio(); // controllo la coda delle
ecografie
  n_radio = coda_radio.conteggio(); // controllo la coda
delle rediografie
  srand( (unsigned)time( NULL ) ); // mi serve se le 2 code
contengono lo stesso numero di elementi
  n = rand () %2; // genero un numero, che puo essere 0 o
1, per mandarlo in una coda qualsiasi, nel caso le 2 code contengono lo
stesso numero di elementi
  if (n_eco>n_radio) // se la coda delle radiografie ha
meno elementi
  {
   coda_radio.nuovo=coda_cassa.nuovo;
   coda_radio.inserimento ();
   printf ("\n\tIl paziente %s %s e' stato inserito
nella coda delle radiografie \n\tpoiche' era quella piu'
vuota",coda_radio.nuovo.nome, coda_radio.nuovo.cognome);
  }
  else if (n_eco<n_radio)
  {
   coda_eco.nuovo=coda_cassa.nuovo;
   coda_eco.inserimento ();
   printf ("\n\tIl paziente %s %s e' stato inserito
nella coda delle ecografie \n\tpoiche' era quella piu'
vuota",coda_radio.nuovo.nome, coda_radio.nuovo.cognome);
  }
  else if (n_eco=n_radio)
  {
   if (n==0)
   {
    coda_radio.nuovo=coda_cassa.nuovo;
    coda_radio.inserimento();
    printf ("\n\tIl paziente %s %s e' stato
inserito nella coda delle radiografie",coda_radio.nuovo.nome,
coda_radio.nuovo.cognome);
   }
   else if (n!=0)
   {
    coda_eco.nuovo=coda_cassa.nuovo;
    coda_eco.inserimento ();
    printf ("\n\tIl paziente %s %s e' stato
inserito nella coda delle ecografie",coda_radio.nuovo.nome,
coda_radio.nuovo.cognome);
   }
  }
 }
}
void radio ()
{
 coda_radio.estrazione();
 printf ("[radio] Il paziente %s %s e' stato
estratto",coda_radio.nuovo.nome, coda_radio.nuovo.cognome);
}
void eco ()
{
 coda_eco.estrazione();
 printf ("[eco] Il paziente %s %s e' stato
estratto",coda_eco.nuovo.nome, coda_eco.nuovo.cognome);
}
void inserimento_prezzi ()
{
 int indice;
 indice=0;
 do{
  printf ("Dammi il prezzo:\t");
  scanf ("%f",&prezzi[indice]);
  indice++;
 }
 while (indice<MAX_PREZZI);
}
SE COMPILATO NON GENERA NESSUN ERRORE, MA IL PROBLEMA E' CHE L'OPZIONE DI 
MENU 2 (INSERIMENTO PREZZI) NON FUNZIONA A DOVERE... OVVERO NON PRELEVA I 
PREZZI DA OPERATORE... CHE QUALCUNO SVELI L'ARCANO, STO' DIVENTANDO MATTO 
!!! 

 !!!
Isolando il seguente codice non trovo errori:
#include <iostream>
#define MAX_PREZZI 4
float prezzi [MAX_PREZZI];
void inserimento_prezzi ()
{
 int indice;
 indice=0;
 do{
  printf ("Dammi il prezzo:\t");
  scanf ("%f",&prezzi[indice]);
  indice++;
 }
 while (indice<MAX_PREZZI);
}
int main() {
 inserimento_prezzi();
 for (int i = 0; i < MAX_PREZZI; i++)
  std::cout << prezzi[i] << std::endl;
 return 0;
}
Forse la causa e' un'altra e si ripercuote sulla funzione.
Ciao

> Forse la causa e' un'altra e si ripercuote sulla funzione.
non c'e' modo di scoprire la causa ? 

 non c'e' modo di scoprire la causa ?
Potresti darmi il codice di coda_paz.h?
Ciao

eccolo:
// NUOVO TIPO
class coda_pazienti
{
#define MAX_EL 100
private:
 struct paziente
 {
  char nome [30];
  char cognome [30];
  int pagamento;
  int fare;
  int fatto;
 }; // chiusura della struct
 paziente coda [30];
 int t, c; // testa e coda delle code
public:
 paziente nuovo;
 ///paziente estratto;
 // prototipi
 int inserimento (); // metodo inserimento
 int estrazione (); // metodo estrazione
 int conteggio (); // controlla quale coda e' + vuota
 // constructor
 coda_pazienti ()
 {
  c=t=0;
 }
}; // chiusura della classe
int coda_pazienti::inserimento ()
{
 if ( (c==t-1 ) || (t==0 ) && (c==MAX_EL-1)) return -1; // se la coda e' 
piena
 coda[c]=nuovo;
 c++;
 if ( (c>=MAX_EL) )
 {
  c=0;
 }
 return 0; // elemento inserito
}
int coda_pazienti::estrazione ()
{
 if (c==t)  return -1;
 nuovo=coda[t];
 t++;
 if ( (t>=MAX_EL) )
 {
  t=0;
  printf ("Elemento estratto");
 }
 return 0;
}
int coda_pazienti::conteggio ()
{
 int n;
 if (t<c) n = t+c;
 else if (t>c) n = ( MAX_EL - (t+c) );
 return n;
} 

 }
Il problema potrebbe essere dovuto al compilatore che non carica il modulo 
(in fase di linking) che supporta i float. Prova a fare questa operazione:
float prezzo;
scanf ("%f",&prezzo)
prezzi[indice] = prezzo;
l'ultima assegnazione dovrebbe caricate la libreria corretta a runtime.
Ciao
Andrea

Mi sembra un'ipotesi peregrina. Questo e' C++, non Excel.
Ciao,
Nicola

 Mi sembra un'ipotesi peregrina. Questo e' C++, non Excel.
Purtroppo invece è proprio così. Prova ad eliminare l'assegnazione al 
floating prezzi[indice] = ....
Facendoti stampare tutte le librerie (opzione /VERBOSE) caricate in fase di 
linking, ti rendereai conto che mancano le librerie
LIBCMTD.lib(fpinit.obj)
LIBCMTD.lib(fp8.obj)
che sono quelle per la manipolazione dei float, che non vengono caricate 
staticamente. Il motivo è dovuto al fatto che il compilatore minimizza le 
dimensioni dell'eseguibile per ottimizzarlo e non carica le librerie se non 
esplicitamente richiamate comprese quelle che supportano i floating point. 
Riaggiungendo l'assegnazione, le librerie vengono correttamente caricate in 
fase di linking.
Ciao
Andrea 

 !!!
Si, anche a me da qusto problema. Ho provato anche il suggerimento di Andrea
Cacciarru ma non va bene.
A questo punto ti suggerisco di non usare printf e scanf che sono del C ma
usa cout e cin che sono C++.
includi la libreria <iostream>
e sostituisci la riga
scanf ("%f",&prezzi[indice]);
con
std::cin >> prezzi[indice];
Le printf funzionano ma visto che e' C++ potresti usare cout come segue:
Un'istruzione come
printf ("Ciao\n");
diventa
std::cout << "Ciao\n";
Inoltre se vuoi stampare stringhe e numeri non devi metterti dietro alle
varie lettere con percentuale relative al tipo di dato, infatti puoi fare:
std::cout<< "Il numero che segue e' " << 8 << " mentre quest'altro e'" <<
2.5 << std::endl;
std::endl equilvale a "\n".
Ciao

std::cin >> prezzi[indice];
Credo che questo sia il suggerimento migliore! :o)
Bye
Andrea

 Cacciarru ma non va bene.
P.S. perchč non va bene? ok la scanf č piů C che C++, ma č solo per questo? 
:o)
Bye
Andrea

 :o)
No, mi riferivo al tuo discorso su caricamento del modulo etc...
Ho provato a far leggere l'input in una variabile e poi assegnare all'array
ma non funziona, non memorizza l'input giusto.
Ciao

 ma non funziona, non memorizza l'input giusto.
Molto strano... :o)
Bye
Andrea

da un problema di una funzione ne sono venuti fuori 200...
era meglio se non postavo :)
i misteri della programmazione...