Newsgroup: it.comp.lang.c++
Titolo: C++

Sono un nuovo utente di C++ e ho il seguente problema:
io ho array[1]=0 ; array[2]=. ; array[3]=1  ...
come faccio ad ottenere il numero 0.1 ? ... ed assegnarlo eventualmente ad
una costante?
grazie a tutti quelli che mi possono aiutare

...




// copyright 2000 Bill Gates & co. microbrain
// Da controllare eventuali svarioni, non l´ho compilato...
#include <iostream.h>
float array_to_float(char *pc, int n)
{
    int i, denflag = 0, dendec = 10.0;
    float res = 0.0;
    for (i = 0; i < n; i++, pc++)
        if ((*pc != ´. ´) && (denflag == 0))
            // qui calcoliamo il numeratore
            res = *pc + res * (i == 0 ? 1.0 : 10.0);
        else
        if (denflag == 0)
        // da qua comincia il denominatore
            denflag = 1;
        else
        {
            res += *pc / dendec;
            dendec *= 10.0;
        }
    return res;
}
int main(void)
{
    char array[3] = {´0´, ´.´, ´1´ };
    float vf;
    // passiamo il pnt all´array e il numero di elementi
    vf = array_to_float(array, 3);
    cout << "Il mio array vale " << vf << endl;
    return 0;
}

ooooppsssssssss....
mannaggia ai char!
eccoti la versione beta:
// copyright 2000 Bill Gates & co. microbrain
// Da controllare eventuali svarioni, non l´ho compilato...
#include <iostream.h>
float array_to_float(char *pc, int n)
{
    int i, denflag = 0, dendec = 10.0;
    float res = 0.0;
    for (i = 0; i < n; i++, pc++)
        if ((*pc != ´. ´) && (denflag == 0))
            // qui calcoliamo il numeratore
            res = *pc - ´0´ + res * (i == 0 ? 1.0 : 10.0);
        else
        if (denflag == 0)
        // da qua comincia il denominatore
            denflag = 1;
        else
        {
            res += (*pc- ´0´) / dendec;


una costante?
const double ValoreCostante = 0.1;
Ma se sei a questo livello, probabilmente sei agli inizi
anche con la programmazione e onestamente ti consiglio
di cambiare linguaggio. 
Paolo

 ha scritto nel messaggio
news:pjeehsooc2nuaj2gn...@4ax.com...

hai perso tutte le mail precedenti, quindi prima di dare certi giudizi
pensaci un pò su.

pensaci un pņ su.
Sorry... non pensavo di essere stato "offensivo" (e in tal caso mi 
scuso), ma la domanda mi sembrava piuttosto indipendente da
ogni linguaggio e alquanto "sospetta" (se mi fai passare il termine).
Come ho sempre sostenuto, la mia risposta era mirata a sconsigliare
un eventuale primo assoluto  approccio alla programmazione
attraverso il C++ per motivi ampiamente sostenuti in passato e
chiaramente indicati anche sulle faq!
Paolo

/* scusa ma nella versione precedente mancava un cast */
#include <iostream.h>
double array_to_double(char *pc, int n)
{
    int i, denflag = 0, dendec = 10.0;
    double res = 0.0;
    for (i = 0; i < n; i++, pc++)
        if ((*pc != '.') && (denflag == 0))
            // qui calcoliamo il numeratore
            res = *pc - '0' + res * (i == 0 ? 1.0 : 10.0);
        else
        if (denflag == 0)
        // da qua comincia il denominatore
            denflag = 1;
        else
        {
            /* qui ho inserito il cast (double) che serviva */
            res += (*pc - '0') / (double)dendec;
            dendec *= 10.0;
        }
    return res;
}
int main(void)
{
    char array[] = {'1', '2', '3', '.', '4', '5', '6'};
    double vd;
    // passiamo il pnt all徨rray e il numero di elementi
    vd = array_to_double(array, sizeof(array));
    cout << "Il mio array vale " << vd << endl;
    return 0;
}

 writes:

L'header file e' <iostream> e non <iostream.h>, manca un "using
namespace std;", il "return 0;" e' ridondante, i cast in C++ non si
fanno in quel modo, manca qualsiasi preoccupazione per la const-ness
dei parametri delle procedure, "n" sarebbe meglio dichiarato come
size_t che come int, non c'e'alcuna garanzia che "*pc-'0'" funzioni
perche' fa una ipotesi gratuita sul character set (benche' vera sia
per ASCII che per EBCDIC), manca comunque il controllo sui valori in
ingresso nel range 0..9 .
Che mi dici di "int dencec = 10.0" e di "dendec *= 10.0" se dendec e'
un intero?
Numeri negativi?  Niente?
A prova di bomba?  Hmmm...  E poi puzza di C.  Che ne diresti di uno
string stream?
-- 
Maurizio Loreti                         
http://www.pd.infn.it/~loreti/mlo.html
Univ. of Padova, Dept. of Physics - Padova, Italy            
lor...@pd.infn.it

Va bene ...lo ammetto, il mio precedente subject era volutamente immodesto
per avere un reply come il tuo che mi giudicasse i miei errori marchiani,
che commetto appunto perche´ puzzo di C.
Vediamo se mi puoi aiutare a risolverne qualcuno:
-L'header file e' <iostream> e non <iostream.h>, manca un "using
namespace std"
Nel C++ non si deve mettere #include header.h ma #include header ?
Senza using namespace std mi funziona lo stesso ma non e´ standard giusto?
-il "return 0;" e' ridondante
Essendo int main() cosa diamine posso ritornare se non return qualchecosa?
-, i cast in C++ non si fanno in quel modo
al posto di (double) dendec cosa devo mettere? (in sostanza come devo fare
un cast di quel genere?)
- manca qualsiasi preoccupazione per la const-ness
dei parametri delle procedure
non c'e'alcuna garanzia che "*pc-'0'" funzioni
perche' fa una ipotesi gratuita sul character set (benche' vera sia
per ASCII che per EBCDIC), manca comunque il controllo sui valori in
ingresso nel range 0..9 .
Dovrei fare un ciclo nella funzione che mi controlli che i caratteri
dell´array siano tutti nel range '0'..'9' ? O c´e´ un modo piu´ veloce per
farlo?
-Che mi dici di "int dencec = 10.0" e di "dendec *= 10.0" se dendec e' un
intero?
Hai ragione devo dichiarare double dendec cosi´ mi risparmio pure quel cast
inutile con double.
-Numeri negativi?  Niente?
Dovrei controllare il primo elemento dell´array se contiene il carattere '-'
ma la mia versione a prova di bomba non lo ha fatto!
-A prova di bomba?  Hmmm...
Non esistono programmi a prova di bomba e se anche esistessero sono bestie
rare ma mi piace provocare per avere critiche costruttive.
 -E poi puzza di C.
Mi sto attrezzando per un buon deodorante C++ ma ci vuole tempo e pazienza
- Che ne diresti di uno string stream?
Al posto dell´array? Mi fai un esempio per favore?
Comunque grazie per le eventuali risposte, sono un novellino del C++ e
vorrei migliorare.

 A prova di bomba?  Hmmm...  E poi puzza di C.
Non e' buona educazione postare followups ai propri messaggi, ma mi
sono reso conto che la critica negativa non e' costruttiva.  Ecco un
esempio di quello che intendevo:
MLO@axcdf4 11 $ cat foo.cxx # Source
#include <iostream>
#include <strstream>
int main() {
  const char array[] = {'-', '1', '2', '.', '3', 'e', '-', '1'};
  const size_t length = sizeof(array);
  std::istrstream s(array, length);
  double d;
  s >> d;
  std::cout << "Value : " << d << std::endl;
}
MLO@axcdf4 12 $ KCC -o foo foo.cxx # Compilazione
MLO@axcdf4 13 $ ./foo # Esecuzione (no magic here)
Value : -1.23
MLO@axcdf4 14 $


un cast di quel genere?)
static_cast<double>(dendec)
Paolo