gcc und keyman Compilieren



  • Hi jungs, ...

    ich hwollte mri für Linux ein Programm neu Kompilieren, da es nicht als Paket für Fedora Core 5 gedacht ist. Nun ich musste in dem Programm shcone iniges abändern, da die gcc 4.1.0 includes wohl etwas von den vorherigen abweichen, doch bin ich leider an einem Punkt gekommen den ich nicht lösen kann.

    In der KeyRange.h meiner Datei die ich kompilieren möchte findet sich folgender Code:

    #ifndef KEYRANGE_H
    #define KEYRANGE_H
    
    struct KeyRange {
    	int owner;
    	int start;
    	int end;
    };
    
    class KeyRangeList : public std::list<struct KeyRange> {
    
    	public:
    		void AddKey(int owner, int keycode)
    		{
    			if (IsInList(keycode))
    				return;
    			iterator i = FindRange(owner, keycode - 1);
    			iterator j = FindRange(owner, keycode + 1);
    			if ((i != NULL) && (j != NULL))
    			{
    				/* merge both items */
    				erase(j);
    				i->end = j->end;
    			}
    			else
    			{
    				if (i != NULL)
    				{
    					i->end = keycode;
    				}
    				else if (j != NULL)
    				{
    					j->start = keycode;
    				}
    				else
    				{
    					struct KeyRange k;
    					k.owner = owner;
    					k.start = keycode;
    					k.end = keycode;
    					push_back(k);
    				}
    			}
    		}
    
    		void RemoveKey(int owner, int keycode)
    		{
    			iterator i = FindRange(owner, keycode);
    			if (i == NULL)
    				return;
    			if (i->start == i->end)
    				erase(i);
    			else
    			{
    				if (keycode == i->start)
    					i->start = keycode+1;
    				else if (keycode == i->end)
    					i->end = keycode-1;
    				else
    				{
    					/* split range */
    					struct KeyRange k;
    					k.owner = owner;
    					k.start = i->start;
    					k.end = keycode-1;
    					i->start = keycode+1;
    					push_back(k);
    				}
    			}
    		}
    
    		void RemoveKeys(int owner)
    		{
    			iterator i = begin();
    			while (i != end())
    			{
    				if (i->owner == owner)
    				{
    					iterator j = i;
    					i++;
    					erase(j);
    				}
    				else
    					i++;
    			}
    		}
    
    		bool IsInList(int keycode)
    		{
    			return FindRange(-1, keycode) != NULL;
    		}
    	private:
    		iterator FindRange(int owner, int keycode)
    		{
    			for (iterator i = begin(); i != end(); i++)
    			{
    				if ((keycode >= i->start) && (keycode <= i->end))
    				{
    					if ((i->owner == owner) || (owner == -1))
    						return i;
    				}
    			}
    			return NULL;
    		}
    };
    
    #endif
    

    Beim kompilieren bekomme ich nun die Fehlermeldung ...

    KeyRange.h: In member function »void KeyRangeList::AddKey(int, int)«:
    KeyRange.h:19: Fehler: no match für »operator!=« in »i != 0«
    /usr/lib/gcc/i386-redhat-linux/4.1.0/../../../../include/c++/4.1.0/bits/stl_list.h:173: Anmerkung: Kandidaten sind: bool std::_List_iterator<_Tp>::operator!=(const std::_List_iterator<_Tp>&) const [with _Tp = KeyRange]
    KeyRange.h:19: Fehler: no match für »operator!=« in »j != 0«
    /usr/lib/gcc/i386-redhat-linux/4.1.0/../../../../include/c++/4.1.0/bits/stl_list.h:173: Anmerkung: Kandidaten sind: bool std::_List_iterator<_Tp>::operator!=(const std::_List_iterator<_Tp>&) const [with _Tp = KeyRange]
    KeyRange.h:27: Fehler: no match für »operator!=« in »i != 0«
    /usr/lib/gcc/i386-redhat-linux/4.1.0/../../../../include/c++/4.1.0/bits/stl_list.h:173: Anmerkung: Kandidaten sind: bool std::_List_iterator<_Tp>::operator!=(const std::_List_iterator<_Tp>&) const [with _Tp = KeyRange]
    KeyRange.h:31: Fehler: no match für »operator!=« in »j != 0«
    /usr/lib/gcc/i386-redhat-linux/4.1.0/../../../../include/c++/4.1.0/bits/stl_list.h:173: Anmerkung: Kandidaten sind: bool std::_List_iterator<_Tp>::operator!=(const std::_List_iterator<_Tp>&) const [with _Tp = KeyRange]
    KeyRange.h: In member function »void KeyRangeList::RemoveKey(int, int)«:
    KeyRange.h:49: Fehler: no match für »operator==« in »i == 0«
    /usr/lib/gcc/i386-redhat-linux/4.1.0/../../../../include/c++/4.1.0/bits/stl_list.h:169: Anmerkung: Kandidaten sind: bool std::_List_iterator<_Tp>::operator==(const std::_List_iterator<_Tp>&) const [with _Tp = KeyRange]
    KeyRange.h: In member function »bool KeyRangeList::IsInList(int)«:
    KeyRange.h:90: Fehler: no match für »operator!=« in »KeyRangeList::FindRange(-0x000000001, keycode) != 0«
    /usr/lib/gcc/i386-redhat-linux/4.1.0/../../../../include/c++/4.1.0/bits/stl_list.h:173: Anmerkung: Kandidaten sind: bool std::_List_iterator<_Tp>::operator!=(const std::_List_iterator<_Tp>&) const [with _Tp = KeyRange]
    KeyRange.h: In member function »std::_List_iterator<KeyRange> KeyRangeList::FindRange(int, int)«:
    KeyRange.h:103: Fehler: Umwandlung von »int« in nicht-skalaren Typen »std::_List_iterator<KeyRange>« angefordert
    

    Ich weiß also das das Problem mit der stl_list.h zusammenhängt, ich glaube auch zu wissen das der vergleich von NuLL mit einem Operator der bool zurück gibt die Probleme macht, aber ich kann auch mit einem boolschen false oder true nichts bewirken, ich stehe also im dunkeln dieses Problem zu lösen.

    Über Hilfen würde ich mich natürlich sehr freuen.

    Greeeeez Jenna



  • da das ganze C++ ist wuerd ichs mitm g++ anstatt dem gcc versuchen ...

    blub



  • Auf die Idee bin ich auch schon gekommen, allerdings mit dem selben Erfolg. Außerdem werden dann trotzdem die gleichen libs benutzt.

    Grez Jenna



  • Seit wann konnte unter nem alten GCC ein Objekt (Referenz) NULL sein?

    Du musst überall wo Du NULL als Iterator nutzt (also in allen Zeilen die angemeckert werden :D) NULL durch end() ersetzen.



  • Danke schön, aber ich habe das Problem schon gelöst, indem ich in der header Datei eine Deklarierung das explicit weg gesetzt habe, das auch eine Erneuerung war, jetzt habe ich aber wieder andere Probleme die nicht hierhin gehören *SMILE

    Trotzdem vielen dank byby

    P.S.: Mit dem gcc lassen sich damit auch aleln anschein nach NuLL auf Objecte anwenden.


Anmelden zum Antworten