PDA

View Full Version : C++ STL Help: Risultati sbagliati con accumulate algorithm


verloc
02-03-2003, 15:00
Questo è l'esempio che ho fatto


// file: es_accum.cpp

#include <stdio.h>
#include <iostream.h>
#include <vector>
#include <algorithm>
#include <numeric> //for accumulate
#include <functional> // for greater<>

main()
{
double stuff[]={3.23,4.23,5.23};
vector<double> vStuff(stuff,stuff+3);

cout<<"Vector vStuff= [ ";
copy(vStuff.begin(),vStuff.end(),ostream_iterator<double>(cout, " ")); //'\n'
cout<<" ]"<<endl;

cout<<"Accumulate sample:sum vStuff elements"<<endl;
double SumvStuff=accumulate(vStuff.begin(),vStuff.end(),0);
cout<<"Sum="<<SumvStuff<<endl;

getchar();
}


//Output12
bcc 5.5 log:

Borland C++ 5.5 for Win32 Copyright (c) 1993, 2000 Borland
es_accum.cpp:
Warning W8008 C:\Programmi\Borland\CBuilder5\Include\vector.h 213: Condition is always false in function __init_aux<double *>(double *,double *,_RW_is_not_integer)
Warning W8066 C:\Programmi\Borland\CBuilder5\Include\vector.h 214: Unreachable code in function __init_aux<double *>(double *,double *,_RW_is_not_integer)
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland

Capisco che il problema è in _RW_is_not_integer
Ma come risolverlo?
nota .Presumo che RW stia per Rogue Wave cioè la company che ha implementato la libreria

/\/\@®¢Ø
02-03-2003, 15:54
Visto che non specifichi i parametri del template, il compilatore li
deduce dai parametri che passi alla funzione. Ma 0 e' un intero, non un float e quindi cerca di generare il codice sbagliato. Usando 0.0 dovresti risolvere tutto.

verloc
03-03-2003, 08:53
Non hai idea Marco di quanto mi hai aiutato,penso che ci avrei messo non meno di una settimana
a capire dove era il problema.

Il fatto è che di accumulate ne devo fare molto uso e gia bestemmiavo all'idea
di scrivere ogni volta uno schifoso loop.

Grazie per la spiegazione sulle differenti rappresentazioni dello zero.Chissà quanti altri errori
avrei commesso...

Un'ultima cosa:puoi farmi vedere come avrei dovuto fare specificando i parametri del template?
Forse ti riferisci al Function Object plus<double>() per specificare il modo di "accumulare" ?

/\/\@®¢Ø
03-03-2003, 09:08
Dovresti specificare i parametri della funzione stessa ( se non vuoi dover usare necessariamente lo 0.0 ). Visto che prevede due parametri (il primo l'iteratore, il second il tipo di ritorno) e' sufficiente che scrivi una cosa del genere:

typedef vector<double>::iterator It; // giusto per semplificare la linea sottostante
double SumvStuff=accumulate<It,double>(vStuff.begin(),vStuff.end(),0);


Ciao

verloc
03-03-2003, 09:29
Grazie mille Ciao :)