Newsgroup: it.comp.lang.c++
Titolo: dove è finito round() nell' iso-c++ ?!?

Salve a tutti, sono un neofita alle prese con la crazione di un programma in
c++ sotto Mandrake 9.1 basato sulle librerie QT della trolltech.
Mi sono accorto di un potenziale problema (visto che desiderei che il codice
che sto scrivendo sia il piů "portabile" possibile) quando ho deciso di
scaricare la vesione "evaluation" delle QT 3.2 per windows. Scarico,
installo, importo in visual c++ 6.0 il mio listato linux e (dita incrociate)
lancio la compilazione... come temevo un bordello di errori!
Vado a spulciare... sorpresona! nulla che riguardi le QT: non ho dovuto
modificare una virgola! (nemmeno nei nomi dei file a cui faccio riferimento
nel codice che sotto linux sono con "/" e sotto win con "\"... fantastiche!)
Il problema deriva dal fatto che Vc++ sostiene che la funzione "round()" che
uso spesso nel mio codice non č definita... (e se la tolgo tutto si compila
a dovere)
La cosa brutta č che scopro poi che nč nel sul c++ primer nč su
cplusplus.com
 si  parla di round()... non esiste piů? dove č finito?
Fatto sta che sotto mandrake con g++ 3.2.2 il seguente listato si compila
liscio come l'olio!
#include <iostream>
int main()
{
 float a=3.8;
 int b=static_cast<int>(a);
 int c=static_cast<int>(round(a));
 std::cout<<a<<" "<<b<<" "<<c<<"\n";
}
e fornisce in output (esattamente come previsto)
3.8   3   4
da notare che non ho usato "std::round" ma "round" da solo, come se fosse
una parola chiave del linguaggio o definita statica-globale in iostream!
Purtroppo non sembra che sia un problema del Vc++ perchč il mio schifo di
listato da esattamente gli stessi problemi se cerco di compilarlo sotto
RedHat 9 (sempre con g++).
Mal di testa!
Ovviamente ci sono circa 1.000.000 di casi in cui facendo certi conti DEVO
arrotondare e non posso permettermi di troncare...
In definitiva round fa parte o no delle funzioni standard-iso? Se cosě non
č, cosa posso usare in alternativa?
Se qualcuno sa darmi delucidazioni sarei molto grato... inoltre come faccio
a in generale a capire a che funzione sto facendo riferimento in un prg?
(tipo qui su mandrake sqrt č definita sia in math.h che in iostream... se
non specifico il namespace come posso sapere a posteriori se sto usando
l'una o l'altra?)
Grazie a qualunque anima pia abbia la pazienza di rispondermi (qui o via
e-mail), G.

 l'una o l'altra?)
per il round molto probabilmente non stai includendo la libreria che la
contiene ... prova sotto al compilatore che ti compila il programma comunque
ad usare le opzioni: "-W -Wall -pedantic", e vedi se si compila ancora o se
ti chiede di includere degli header ...
invece sulla domanda sqrt in un programma c++ (incluedendo tutti e 2 gli
header) in cui definisci using namespace std; e poi chiami sqrt(), il
compilatore ti dara' un errore di non possibilita' di risolvere il nome
quindi vedrai tu se includere mat sotto un particolare namespace per non
creare conflitti ... o se forzare la risoluzione solo per la libreria
standard usando std::sqrt(), cosi' non avresti piu' conflitti ...
ugualmente se negli include definisci:
namespace old_math {
#include <math.h>
}
allora potrai usare:
using namespace std;
using namespace old_math;
e poi chiamare le funzioni sqrt come:
old_math::sqrt(); o
std::sqrt();
l'unico modo per non far andare in palla la risoluzione dei nomi del
compilatore.
ciao


usare std::sqrt o old_math::sqrt rendono inutili le direttive di uso e
inoltre includendo quest'ultime si sta inquinando il namespace globale.
Quindi o si usa la forma namespace::oggetto o si ricorre alle dichiarazioni
di uso senza inquinare il namespace globale, es:
using std::string; //dichiarazione di uso più selettiva
string a; // sarà std::string della libreria C++ standard
sqrt(3); // richiama una funzione sqrt, ma non quella della libreria
standard del C++!!
--------------------------------
Inviato via 
http://usenet.libero.it

 di uso senza inquinare il namespace globale, es:
[cut]
ho capito che come ho fatto io avrei cmq inquinato il namespace, ma finche
non vengono chiamate funzioni che hanno doppioni il compilatore non mi da
nessun problema a farlo ... e se semmai mi serve una funzione particolare la
chiamo con il suo specificatore, e cosi' soprattutto e' il compilatore che
mi segnala errori di funzioni con doppie dichiarazioni.
ora cmq si puo' dire che e' meglio usarlo nel modo che hai detto tu.
ciao