problem mit numerical_limits<int>::max()



  • Hallo,

    es gibt sogar Compiler (Microsoft/g++), die die #pragmas push_macro/pop_macro kennen:

    http://msdn.microsoft.com/en-us/library/2bs04eza(VS.80).aspx

    MfG,

    Probe-Nutzer



  • das scheint ja genau das zu sein was ich suche, leider functioniert das pop_macro irgend wie nich:

    #ifdef min
    #  pragma push_macro("min")
    #  undef min
    #  define popmin
    #endif
    #ifdef max
    #  pragma push_macro("max")
    #  undef max
    #  define popmax
    #endif
    
      MyClass()
        :m_count(0)
        ,m_min(numeric_limits<T>::max())
        ,m_max(numeric_limits<T>::min())
        ,m_sum(0)            
      {};                    
    
      MyClass(T i)         
        :m_count(0)          
        ,m_min(numeric_limits<T>::max())
        ,m_max(numeric_limits<T>::min())
        ,m_sum(0)
      {
        operator=(i);
      };
    
    #ifdef popmax
    #  pragma pop_macro("max")
    #  undef popmax
    #endif
    #ifdef popmin
    #  pragma pop_macro("min")
    #  undef popmin
    #endif
    

  • Mod

    Probe-Nutzer schrieb:

    Hallo,

    es gibt sogar Compiler (Microsoft/g++), die die #pragmas push_macro/pop_macro kennen:

    http://msdn.microsoft.com/en-us/library/2bs04eza(VS.80).aspx

    MfG,

    Probe-Nutzer

    In der gcc-Dokumentation kann ich nichts dazu finden. Die MSDN-Beschreibung lässt darauf schließen, dass das Ganze nur für Objektmakros funktioniert.



  • Wenn man die Makros nicht einfach #undefen kann (ja das kommt vor), geht auch folgende Methode (auch wenns nicht mehr ganz so schön aussieht):

    #define NO_MACRO 
    
      MyClass()
        :m_count(0)
        ,m_min(numeric_limits<T>::max NO_MACRO ())
        ,m_max(numeric_limits<T>::min NO_MACRO ())
        ,m_sum(0)            
      {};                    
    
      MyClass(T i)        
        :m_count(0)          
        ,m_min(numeric_limits<T>::max NO_MACRO ())
        ,m_max(numeric_limits<T>::min NO_MACRO ())
        ,m_sum(0)
      {
        operator=(i);
      };
    


  • @derkuchen
    danke, es ist zwar wirklich nicht mehr so schön, aber das löst das Problem auf sicherste und unkomplizierteste weise.



  • camper schrieb:

    Probe-Nutzer schrieb:

    Hallo,

    es gibt sogar Compiler (Microsoft/g++), die die #pragmas push_macro/pop_macro kennen:

    http://msdn.microsoft.com/en-us/library/2bs04eza(VS.80).aspx

    MfG,

    Probe-Nutzer

    In der gcc-Dokumentation kann ich nichts dazu finden.

    Ich habe irgendwo für gcc geschriebenen Code gesehen, der das verwendet, und ich habe jetzt auch noch einmal gesucht, und das hier:

    http://gcc.gnu.org/onlinedocs/gcc/Push_002fPop-Macro-Pragmas.html

    gefunden.

    camper schrieb:

    Die MSDN-Beschreibung lässt darauf schließen, dass das Ganze nur für Objektmakros funktioniert.

    Siehe unten.

    vlad_tepesch schrieb:

    das scheint ja genau das zu sein was ich suche, leider functioniert das pop_macro irgend wie nich:

    #ifdef min
    #  pragma push_macro("min")
    #  undef min
    #  define popmin
    #endif
    #ifdef max
    #  pragma push_macro("max")
    #  undef max
    #  define popmax
    #endif
    
      MyClass()
        :m_count(0)
        ,m_min(numeric_limits<T>::max())
        ,m_max(numeric_limits<T>::min())
        ,m_sum(0)            
      {};                    
    
      MyClass(T i)         
        :m_count(0)          
        ,m_min(numeric_limits<T>::max())
        ,m_max(numeric_limits<T>::min())
        ,m_sum(0)
      {
        operator=(i);
      };
    
    #ifdef popmax
    #  pragma pop_macro("max")
    #  undef popmax
    #endif
    #ifdef popmin
    #  pragma pop_macro("min")
    #  undef popmin
    #endif
    

    Ich habe das, an dein Beispiel angelehnt, mit dem VS2005, Service Pack 1, versucht:

    #include <limits>
    #include <iostream>
    #include <windows.h>
    
    using namespace std;
    
    #ifdef min 
    #  pragma push_macro("min") 
    #  undef min 
    #  define popmin 
    #endif 
    #ifdef max 
    #  pragma push_macro("max") 
    #  undef max 
    #  define popmax 
    #endif
    
    template<class T> class MyClass
    {
    public:
      MyClass() 
        :m_count(0) 
        ,m_min(numeric_limits<T>::max()) 
        ,m_max(numeric_limits<T>::min()) 
        ,m_sum(0)             
      {};                     
    
      MyClass(T i)         
        :m_count(0)           
        ,m_min(numeric_limits<T>::max()) 
        ,m_max(numeric_limits<T>::min()) 
        ,m_sum(0) 
      { 
        operator=(i); 
      };
    
    private:
    	int m_sum;
    	int m_min;
    	int m_max;
    	int m_count;
    };
    
    #ifdef popmax 
    #  pragma pop_macro("max") 
    #  undef popmax 
    #endif 
    #ifdef popmin 
    #  pragma pop_macro("min") 
    #  undef popmin 
    #endif
    
    int main(int argc, char* argv[])
    {
    	int a = 6;
    	int b = 7;
    	MyClass<int> test;
        MyClass<int> test2;
    
    	cout << max(a, b) << endl;
    
    	return 0;
    }
    

    und es funktioniert.

    MfG,

    Probe-Nutzer



  • und es funktioniert.

    Der teil funktioniert ja auch, aber die makros min/max, werden nicht richtig redefiniert.

    (ich arbeite mit vc++ 8 SP1)



  • vlad_tepesch schrieb:

    und es funktioniert.

    Der teil funktioniert ja auch, aber die makros min/max, werden nicht richtig redefiniert.

    (ich arbeite mit vc++ 8 SP1)

    Ok, kann ich jetzt nichts weiter dazu sagen, mein Code liefert jedenfalls das Maximum wieder. Aber wir haben hier jetzt auch schon einige Lösungen gesehen, insofern betrachte man die pop_macro/push_macro-Idee nur als eine Anmerkung von mir.

    MfG,

    Probe-Nutzer


  • Mod

    Probe-Nutzer schrieb:

    Ich habe irgendwo für gcc geschriebenen Code gesehen, der das verwendet, und ich habe jetzt auch noch einmal gesucht, und das hier:

    http://gcc.gnu.org/onlinedocs/gcc/Push_002fPop-Macro-Pragmas.html

    gefunden.

    Bei der PDF-Version fehlen die Abschnitte 5.52.11 und 5.52.12 - das müsste man gewusst haben... 🙄


Anmelden zum Antworten