float per void* an funktion uebergeben



  • warum darf man das hier nicht machen?

    void test(void *ptr)
    {
    	std::cout << (float)ptr << std::endl;
    }
    
    int main()
    {
    	float i = 3.4;
    	test(&i);
    }
    


  • sollte wohl so gehn:

    std::cout << *(Float32*)ptr << std::endl;
    

    wie mach ich da noch einen cast in int oder so?



  • Dieser Thread wurde von Moderator/in c.rackwitz aus dem Forum ANSI C in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • void Convert(void *pFrom, void *pTo)
    {
    	float *ptr = (float*)pFrom;
    	*(int*)pTo = (int)*ptr;
    }
    
    int main()
    {
        float i = 3.4;
    	int j = 0;
        Convert(&i, &j);
    	std::cout << j << std::endl;
    
    	return 0;
    }
    

    ich will 2 void pointer uebergeben und in der funktion zb von float in int casten...kann ich das vielleicht noch etwas schöner schreiben?



  • so gehts auch...kann man hier die klammern noch schöner setzen?

    void Convert(void *pFrom, void *pTo)
    {
    	*(int*)pTo = (int)*(float*)pFrom;
    }
    

    die funktion soll später verschiedene typen konvertieren....deshalb der void* es kommen noch 2 param dazu später....dataTypeFrom u dataTypeTo....

    cu



  • sowas in der art....ist c code!!

    enum MultiType
    {
    	Integer,
    	Float,
        Double,
        Character,
        Boolean
    };
    
    void Convert(MultiType tFrom, void *pFrom, MultiType tTo, void *pTo)
    {
    	switch(tFrom)
    	{
    		case Integer:
    			switch(tTo)
    			{
    				case Integer:
    					*(int*)pTo = *(int*)pFrom;
    					break;
    
    				case Double:
    					*(double*)pTo = (double)*(int*)pFrom;
    					break;
    
    				case Character:
    					*(char*)pTo = (char)*(int*)pFrom;
    					break;
    
    				case Boolean:
    					*(bool*)pTo = (bool)*(int*)pFrom;
    					break;
    			}
    
    		case Float:
    			switch(tTo)
    			{
    				case Integer:
    					*(int*)pTo = (int)*(float*)pFrom;
    					break;
    
    				case Double:
    					*(double*)pTo = (double)*(float*)pFrom;
    					break;
    
    				case Character:
    					*(char*)pTo = (char)*(float*)pFrom;
    					break;
    
    				case Boolean:
    					*(bool*)pTo = (bool)*(float*)pFrom;
    					break;
    			}
    
    		case Double:
    			switch(tTo)
    			{
    				case Integer:
    					*(int*)pTo = (int)*(double*)pFrom;
    					break;
    
    				case Double:
    					*(double*)pTo = (double)*(double*)pFrom;
    					break;
    
    				case Character:
    					*(char*)pTo = (char)*(double*)pFrom;
    					break;
    
    				case Boolean:
    					*(bool*)pTo = (bool)*(double*)pFrom;
    					break;
    			}
    
    		case Character:
    			switch(tTo)
    			{
    				case Integer:
    					*(int*)pTo = (int)*(char*)pFrom;
    					break;
    
    				case Double:
    					*(double*)pTo = (double)*(char*)pFrom;
    					break;
    
    				case Character:
    					*(char*)pTo = *(char*)pFrom;
    					break;
    
    				case Boolean:
    					*(bool*)pTo = (bool)*(char*)pFrom;
    					break;
    			}
    
    		case Boolean:
    			switch(tTo)
    			{
    				case Integer:
    					*(int*)pTo = (int)*(bool*)pFrom;
    					break;
    
    				case Double:
    					*(double*)pTo = (double)*(bool*)pFrom;
    					break;
    
    				case Character:
    					*(char*)pTo = (char)*(bool*)pFrom;
    					break;
    
    				case Boolean:
    					*(bool*)pTo = *(bool*)pFrom;
    					break;
    			}
    	}
    }
    
    int main()
    {
        float i = 3.4;
    	int j = 0;
    	Convert(MultiType::Float, &i, MultiType::Integer, &j);
    	std::cout << j << std::endl;
    
    	return 0;
    }
    


  • Darf man fragen was du machen willst? btw. benutz lieber c++ casts... da kann man sich etwas sicherer sein, was denn überhaupt gemacht wird 😉 Generell würd ich mir mal generische Programmierung/Metaprogrammierung bzw. Templates anschaun.


Anmelden zum Antworten