float Funktion an char array übergen



  • Hi Leute,
    ich hab ein Problem. Und zwar hab ich eine float Funktion. Diese Funktion ermittelt mir die Frequenz der CPU. Damit ich die per TextOut ausgeben kann, muss ich die Funktion erst in ein char array umwandeln. Und hier liegt mein Problem! Ich weiss einfach nicht wie ich das machen soll. Wie also "converte" ich eine Funktion in ein char array?



  • _gcvt(double, int, char*), das ist aber abhängig von der libc, die du benutzt.

    Einfacher ist es die geschichte manuell zu machen:
    also den wert so oft durch 10 teilen/malnehmen, bis er kleiner al 0,00001/o.ä. ist, und jeweils den wert ausgeben

    Das ding hat nur ein problem mit der genauigkeit wg. dem float->double zeug
    (das ließe sich sicher besser machen)

    int convert(float val, int digits, char* arr, int arrlen)
    {
        double dbl;
        int digC;
    
        if(arrlen < 1)
            return EINVAL;
        if(val == 0) {
            strcpy(arr, "0");
            return 0;
        }
        if(val < 0) {
            arr[0] = '-';
            val = -val;
            arr++; arrlen--;
        }
        // böser trick(1234,56 -> 1,23456) , (digC -> 3)
        for(dbl = val, digC = 0; dbl >= 10; dbl /= 10, digC++);
        while(dbl != 0 && arrlen) {
            int digit = (int)dbl; // 0-9
            dbl = (dbl - digit) * 10;
            (arr++)[0] = '0' + digit;
            arrlen--;
            if(!digC) {
                (arr++)[0] = ',';
                arrlen--;
                digC = -1;
            } else if(digC == -1) {
                if(!(--digits))
                    break;
            } else
                digC--;
        }
        if(arrlen > 0)
            arr[0] = 0; // null-termination
        return 0;
    }
    


  • das mit dem 0 am ende ist aber auch ein wnig ein problem man könnte aber folgendes machen:

    z5: arrlen--;
    - z34



  • oder man benutzt sprintf(arr, "%f", 1.234f);



  • WiredCoder schrieb:

    Wie also "converte" ich eine Funktion in ein char array?

    wie meinst du das, eine funktion?



  • Mhm damit ist mir aber nicht geholfen. WIll alles nicht funzen. Ich weiss niht wo das Problem liegt. Ich will die Funktion einfach über Textout ausgeben:

    TextOut(hDC, 50, 50, GetCPUSpeed(),  - 1);
    

    und hier meine GetCPUSpeed()-Funktion:

    float GetCPUSpeed()
    {
        LARGE_INTEGER liFreq, liTicks, liValue;
        UINT64        iTimestamp;
        float         fSpeed;    
        HANDLE        hThread;
        int           iPriority;
    
        hThread  = GetCurrentThread();
        iPriority = GetThreadPriority(hThread);
    
        QueryPerformanceFrequency(&liFreq);
    
        QueryPerformanceCounter(&liTicks);
        liValue.QuadPart = liTicks.QuadPart + liFreq.QuadPart;
    
        SetThreadPriority(hThread, THREAD_PRIORITY_HIGHEST);
    
        iTimestamp = rdtsc();
    
        do 
        {
          QueryPerformanceCounter(&liTicks);
        } while (liTicks.QuadPart <= liValue.QuadPart);
    
        fSpeed = (float)(int)(rdtsc() - iTimestamp)/ 1000000;
        SetThreadPriority(hThread, iPriority);
    
        return fSpeed;
    }
    


  • ich verstehe das problem nicht. was ist an

    char[100] buf;
    float d;
    
    d = GetCPUSpeed();
    sprintf(buf, "%.5f", d);
    TextOut(hDC, 50, 50, buf,  - 1);
    

    denn so problematisch? :S



  • Nö funzt ja nicht. Im Fenster kommt jetzt garkein Text mehr -.-



  • dann ist irgendetwas anderes b0rken 🙂



  • Bau die funktion bei dir ein dann müsste es klappen wichtig nur das dein char array lang genug.

    template <class T1,class T2>
    void convert(const T1& input, T2& output)
    {
    	stringstream ss;
    	ss << input;
    	ss >> output;
    	if(!ss.eof())
    	{
    		cout<<" KONVERTIREUNG FEHLGESCHLAGEN";
    	}
    
    }
    

Anmelden zum Antworten