質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.02%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

UDP

UDP(User Datagram Protocol)とは、トランスポート層のプロトコルであり、コネクション型のデータサービスです。IPネットワーク上の別のホストにコンピュータのアプリケーションがメッセージを送ることができ、転送チャンネルやデータ経路を設定する必要はありません。TCPに比べて高速であるが、信頼性が薄いという特徴があります。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

C#のコードをC/C++に書き換えたい

tshu_m421
tshu_m421

総合スコア4

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

UDP

UDP(User Datagram Protocol)とは、トランスポート層のプロトコルであり、コネクション型のデータサービスです。IPネットワーク上の別のホストにコンピュータのアプリケーションがメッセージを送ることができ、転送チャンネルやデータ経路を設定する必要はありません。TCPに比べて高速であるが、信頼性が薄いという特徴があります。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

4回答

0グッド

0クリップ

2113閲覧

投稿2021/06/18 04:37

編集2021/06/18 11:01

前提・実現したいこと

初めての質問ですので、不備があるかもしれませんが、よろしくお願いいたします。
また、C#,C/C++どちらも初心者です。

現在、ある計測装置からUDPで送られるバイト型のデータをdouble型のデータに変換したいと思っています。

###質問の内容
特にC#のBitConverter.ToDouble メソッドを用いたコードをC/C++でも実現したいです。

発生している問題・エラーメッセージ

計測装置側のソフトウェアで表示される値とこちらのプログラム側で出力される値が異ってしまいます。
問題となっている値は2つで、それぞれx,yとすると以下のような感じの出力になります。

例:
計測装置側
x = 0.22315
y = -0.56878

プログラム側
x = 0.00000
y = 65464562132132165498.00000

これらの値以外にもバイト型のデータを整数型に変換した値もありますが、こちらの方は計測装置側とプログラム側の出力値が一致したので、恐らくUDP通信に問題はないと思われます。
また、下に示すC#のコードは自分が実装したものではありませんが、実装した人曰くx、yの値は計測装置側とプログラム側で一致するらしいので、恐らくバイト型配列の取得位置も問題ないと思います。
従って、C#のBitConverter.ToDouble メソッドを用いたコードに対応するであろうc/c++でのバイト型配列のdouble型変換にエラーがあると思われます。
2つの値x,yはどちらも同じ処理を行います。

該当のソースコード

C#

1 2byte[] data = udp.Receive(ref remoteEP); 3byte[] fuga1 = { data[7], data[6], data[5], data[4], data[3], data[2], data[1], data[0] }; 4byte[] fuga2 = { data[15], data[14], data[13], data[12], data[11], data[10], data[9], data[8] }; 5double x = BitConverter.ToDouble(fuga1, 0); 6double y = BitConverter.ToDouble(fuga2, 0);

C

1byte data[20]; 2NetWorkRecvUDP(NetUDPHandle, NULL, NULL, Data, sizeof(Data), FALSE); #dxライブラリ関数使用 3byte fuga1[] = { data[7], data[6], data[5], data[4], data[3], data[2], data[1], data[0] }; 4byte fuga2[] = { data[15], data[14], data[13], data[12], data[11], data[10], data[9], data[8] }; 5 6/// 7memcpy(&x, fuga1, sizeof(fuga1)); 8memcpy(&y, fuga2, sizeof(fuga2)); 9/// 10 11/// 12double x = *(double*)&fuga1; 13double y = *(double*)&fuga2; 14///

試したこと

いくつかのサイトを参考にして記述した、C/C++の///ソースコード///で示したのを両方試しましたが、ダメでした。。。

補足情報(FW/ツールのバージョンなど)

開発環境 VisualStudio2019
言語   C/C++

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答4

1

byte[] fuga1 = { data[7], data[6], data[5], data[4], data[3], data[2], data[1], data[0] };

C言語の文法になってませんね

投稿2021/06/18 04:50

y_waiwai

総合スコア86064

BeatStar👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

2021/06/18 07:30

こちらの回答が他のユーザーから「過去の低評価」という指摘を受けました。

回答へのコメント

tshu_m421

2021/06/18 05:54

すみません。 指摘されるまで気づきませんでした。。。 C#のコードを間違ってそのままCの方にも載せていました。 実際のプログラムでは、Cの記法になっています。 また、質問の方も修正しました。
y_waiwai

2021/06/18 10:30

いまだCにはなってません。 エラーが出ると思うけど。
tshu_m421

2021/06/18 11:02

恐縮ですが、Cになっていない部分がわかりません。。。
pepperleaf

2021/06/18 11:44

昔のCだとダメっぽいけど、Visual Studio 2019 だと エラーならない。 他はちょっと不明。
Bull

2021/06/18 13:06

DXライブラリを使用しているようなので、おそらく C ではなく C++ でしょうか。
tshu_m421

2021/06/19 13:04

すみません。 DXライブラリを使用しているので、C++ですね。 細かい分別をつけずに書いていました。

0

自己解決

回答してくださった方、ありがとうございました。
色々試行錯誤してみましたが、結局、バイト型配列の中身が違っていたことが原因でした。
また、BitConverter.ToDoubleメソッドに対応するコードも、記載した方法で大丈夫でした。

また、初めての質問ということもあり、質問に不備が多くありました。
すみませんでした。
反省します。。。。

改めて、ありがとうございました。

投稿2021/06/19 13:07

tshu_m421

総合スコア4

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

0

C# で

C#

1 double x = 0.22315; 2 double y = -0.56878; 3 4 byte[] byteX = BitConverter.GetBytes(x); 5 byte[] byteY = BitConverter.GetBytes(y); 6 7 Console.WriteLine($"x = {x}, {BitConverter.ToString(byteX)}"); 8 Console.WriteLine($"y = {y}, {BitConverter.ToString(byteY)}");

として得られた値を Cで入力

C

1#define byte unsigned char // 追記 忘れてた。 2 3 byte fuga1[] = { 0x71, 0x1B, 0x0D, 0xE0, 0x2D, 0x90, 0xCC, 0x3F}; 4 byte fuga2[] = { 0xDD, 0xCD, 0x53, 0x1D, 0x72, 0x33, 0xE2, 0xBF}; 5 /// 6 double x = *(double*)&fuga1; 7 double y = *(double*)&fuga2; 8 /// 9 printf("x = %lf\n", x); 10 printf("y = %lf\n", y);
x = 0.223150 y = -0.568780

一致するようです。

別の問題では?

投稿2021/06/18 12:17

編集2021/06/19 00:41
pepperleaf

総合スコア6379

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

0

計測装置側からどんな値が送られたのかがわかるのであれば,

それを受信したときの data[] の中身をチェックするところから初めてみてはどうでしょう.
そのときの中身と,

C++

1//比較用テスト 2double X = 計測装置から送られたはずの値; 3byte Array[ sizeof(double) ]; 4memcpy( Array, &X, sizeof(double) ); 5 6//これはXと一致するよね,きっと 7double Y = *(double*)Array;

としたときの Array[] の中身が一致しているのか? という.

投稿2021/06/18 05:05

編集2021/06/18 05:08
fana

総合スコア10672

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

tshu_m421

2021/06/18 06:22

こちらの方も、確認してやってみたいと思います

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.02%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

UDP

UDP(User Datagram Protocol)とは、トランスポート層のプロトコルであり、コネクション型のデータサービスです。IPネットワーク上の別のホストにコンピュータのアプリケーションがメッセージを送ることができ、転送チャンネルやデータ経路を設定する必要はありません。TCPに比べて高速であるが、信頼性が薄いという特徴があります。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。