|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jan 2000
Messaggi: 551
|
C++ STL Help: Risultati sbagliati con accumulate algorithm
Questo è l'esempio che ho fatto
Codice:
// 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();
}
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 |
|
|
|
|
|
#2 |
|
Bannato
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
|
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. |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Jan 2000
Messaggi: 551
|
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 Forse ti riferisci al Function Object plus<double>() per specificare il modo di "accumulare" ? |
|
|
|
|
|
#4 |
|
Bannato
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
|
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:
Codice:
typedef vector<double>::iterator It; // giusto per semplificare la linea sottostante double SumvStuff=accumulate<It,double>(vStuff.begin(),vStuff.end(),0); |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Jan 2000
Messaggi: 551
|
Grazie mille Ciao
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 23:20.



















