"d*"はRuby内部でfloat
ではなくdouble
として変換しているので、xやyにdouble
を使えば同じ環境(OSやコンパイラが一緒)ならうまく取れるかも知れません。なお、取得するbufはdobule *buf = new dobule[2];
って感じにして、そのままxやyにぶち込みます。
さて、汎用的にしたい場合ですが、maisumakunさんが書いてあるとおり、実装依存があるためdouble
をそのまま渡すには無理があります。んじゃ文字列にするときはどうするの?便利なのがないのかということで探しました。Marshalを使えばそのままできそうな気がします。
Ruby 2.2.0 リファレンスマニュアル > Marshal フォーマット
Ruby側でMarshal.dumpを使って、C++側で上のフォーマットに基づき解釈すればいけるでしょう。
Ruby
1x = 1.33333
2y = 2.444
3socket.write(Marshal.dump(x) + Marshal.dump(y))
C++
1double x;
2double y;
3char version[2];
4char type;
5char size;
6char *buf;
7
8// xを取得
9recv(socket, version, sizeof(version), 0);
10if (version[0] != 4 || version[0] != 8) {/* エラー処理 */}
11recv(socket, &type, sizeof(char), 0);
12if (type != 'f') {/* エラー処理 */}
13recv(socket, &size, sizeof(char), 0);
14buf = new char[size + 1]; // nullターミナル分1文字多めに
15recv(socket, buf, sizeof(char) * size, 0);
16buf[size] = '\0'; // nullターミナルを忘れずに
17x = atof(buf);
18delete[] buf; // 解放を忘れずに
19// yを取得
20recv(socket, version, sizeof(version), 0);
21if (version[0] != 4 || version[0] != 8) {/* エラー処理 */}
22recv(socket, &type, sizeof(char), 0);
23if (type != 'f') {/* エラー処理 */}
24recv(socket, &size, sizeof(char), 0);
25buf = new char[size + 1]; // nullターミナル分1文字多めに
26recv(socket, buf, sizeof(char) * size, 0);
27buf[size] = '\0'; // nullターミナルを忘れずに
28y = atof(buf);
29delete[] buf; // 解放を忘れずに
手元では試してないので間違っているところがあるかもしれませんが、ご参考ください。infやnanもatofでは大文字小文字無視らしいので大丈夫だと思います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。