2017-09-14 6 views
0

J'essaye d'envoyer un double via un UDP winsock en utilisant la fonction Sendto mais d'abord j'ai besoin de le convertir en char []. Après avoir essayé plusieurs approches, la meilleure chose que je suis venu avec est la suivante:Convertir double en tableau de caractères sans remplissage en C++

// send 
    memset(buf, '\0', BUFLEN); 
    double a = position.y(); 
    char arr[sizeof(a)]; 
    cout << "double" << a << endl; 
    ToString(arr, sizeof(a), a); 

    sendto(s, arr, strlen(arr), 0, (struct sockaddr *) &si_other, slen); 
    cout << "Send" << arr << endl; 

Cela donne malheureusement un rembourrage de fuite bizarre qui ruine l'opération d'envoi. Des idées sur la façon de résoudre cela?

Ma fonction ToString est la suivante:

void ToString(char * outStr, int length, double val) 
{ 
    _snprintf(outStr, length, "%f", val); 
} 

La sortie ressemble à ceci:

double 0.003 
Send 0.003(a bunch of gibberish) 
+1

ma suggestion est que vous vérifiez simplement que sizeof double est de 8 à la réception et à l'envoi et que vous l'envoyez simplement en format binaire. – NoSenseEtAl

+0

N'utilisez pas de pointeurs de caractères ou de tableaux de caractères, utilisez std :: string et éventuellement std :: stringstream. –

+2

@NoSenseEtAl Les flottants de format binaire ne sont pas toujours portables. – Galik

Répondre

3

Vous présumez que le nombre d'octets que le double binaire occupe est la même longueur que la La chaîne convertie occupe mais c'est peu probable.

Si vous avez C++11 vous pouvez faire quelque chose comme ceci:

void send_double(int s, sockaddr* si_other, int slen, double d) 
{ 
    auto buf = std::to_string(d); 
    sendto(s, buf.data(), buf.size(), 0, si_other, slen); 
} 

Sinon, vous pouvez faire quelque chose comme ceci:

void send_double(int s, sockaddr* si_other, int slen, double d) 
{ 
    std::ostringstream oss; 
    oss << d; 
    std::string buf = oss.str(); 
    sendto(s, buf.data(), buf.size(), 0, si_other, slen); 
} 

Voir std::string, std::to_string et std::ostringstream