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

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

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

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

解決済

C++ sizeof(int)とは何なのでしょうか。

yamatail
yamatail

総合スコア63

C++

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

1回答

0評価

0クリップ

282閲覧

投稿2022/01/07 02:28

今考えているのは、

① 別PCからソケットでコマンドを送信
変数 : Length, command

② 本サーバーが
変数 : Length, command
を受けて、以下のC++を実行

③ C++は、制御機器にソケットでコマンドを送信して、データを受信する。
ソースは、下に載せます。

いま問題になっているのが③の制御機器にコマンドを送信する部分です。
main()command(length, com) // 一番下の行
の部分で、返りの長さが決まっているコマンドに関しては、
変数 : 7(=Length), -get version(=command)を受信して
command(7, "-get version")
とすれば問題なく帰ってくるのですが、
lengthのところにsizeof(int)が入っているコマンド(実際に動くサンプルが手元にありそれを元に作りかえております)があり、
これの理解が出来ていなくて困っております。

sizeof(int)が、int型のメモリサイズを返すものというのは調べれば出てくるのですが、
わたしのプログラムの場合、どういう事になっているのかが分かりません。
例)command(sizeof(int), "-reset")

コマンドごとに決まっているので、
変数 : -1(=Length), -reset(=command)
if (Length = -1) length = sizeof(int);
を付け足して、場合分けをすれば上手くいくのかなとも思うのですが
私の知識不足でどういう意味か分からず完成させるのもと思い
詳しい方がいらっしゃいましたらお教えいただきたいと思い、質問させていただきました。

必要な情報のご指摘があれば、更新させていただきます。
どうぞよろしくお願いいたします。

C++

// グローバル変数 const int socketBufferSize = 6*1280*sizeof(int); char socketBuffer[socketBufferSize]; // コマンド送信 bool send(const char *message, va_list args) { memset(socketBuffer, 0, socketBufferSize); // バッファのクリア vsprintf(socketBuffer, message, args); // コマンドをバッファに出力 int n; if (!tcp) n = sendto(sockfd, socketBuffer, strlen(socketBuffer), 0, (struct sockaddr*) &serverName, sizeof (serverName)); else n = send(sockfd, socketBuffer, strlen(socketBuffer), 0); if (debug) printf("%i bytes sent: %s\n", n, socketBuffer); if (n < 0) { printf("Error: Could not send command\n"); return false; } return true; } // 応答を受信してバッファに保存 bool receive(int length) { if (length > socketBufferSize) { printf("Error: Socket buffer too small\n"); return false; } struct sockaddr_in addrRemote; unsigned int cbAddr = sizeof(addrRemote); memset(socketBuffer, 0, socketBufferSize); // バッファのクリア int responseLength = 0, n, readMax; while (true) // 読み取り(応答の長さが読み取られるまで)、応答が複数のパケットに分けられる可能性あり { readMax = length - responseLength; // 読み取る残りのサイズ if (!tcp) n = recvfrom(sockfd, socketBuffer + responseLength, readMax, 0, (struct sockaddr *) &addrRemote, &cbAddr); else n = recv(sockfd, socketBuffer + responseLength, readMax, 0); if (n <= 0) { printf("Error: Could not receive response\n"); return false; } responseLength += n; if (responseLength == 4 /*Server returned error code*/ || responseLength == length) break; } if (responseLength == 4 && getInteger(0) < 0) { printf(">>>> Error: Received error code %i\n", getInteger(0)); return false; } if (debug) printf("%i bytes received\n", responseLength); return true; } bool command(int recvLength, const char *command, ...) // recvLength: 応答のサイズ { bool result; va_list args; va_start(args, command); result = send(command, args); if (result) result = receive(recvLength); va_end(args); return result; } int main(int argc, char** argv) { for (int i = 0; i < argc; i++) { if (!strcmp(argv[i], "-debug")) debug = true; if (!strcmp(argv[i], "-host")) sprintf(host, argv[++i]); if (!strcmp(argv[i], "-port")) port = atoi(argv[++i]); if (!strcmp(argv[i], "-udp")) tcp = false; } // socket通信の設定 if (!init()) return -1; // 機器にコマンド送信 length = argv[1]; com = argv[2]; command(length, com);  printf("version %s\n", socketBuffer); }

良い質問の評価を上げる

以下のような質問は評価を上げましょう

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

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

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

fana

2022/01/07 02:37

> sizeof(int)が、int型のメモリサイズを返すものというのは調べれば出てくるのですが、 > わたしのプログラムの場合、どういう事になっているのかが分かりません。 何がわからない事柄なのでしょうか? 「sizeof(int)とは何か?」に関しては調べて出てきたということなら現在の疑問点は一体何になるのでしょう?
itagagaki

2022/01/07 02:45

サーバーが返すデータ長(つまり受け取るべきデータ長)を指定するのに、受け取る側のマシンに依存するsizeof(int)を指定するのはおかしいのではないか?と私は思いましたが、質問はそういうことですか?
ozwk

2022/01/07 02:55

状況がよくわかりません コマンド表みたいなドキュメントがあって、その中にsizeof(int)と書かれているんでしょうかね?
fana

2022/01/07 03:03

ああ, 「ある条件下でしかまともに動かないような記述がわざわざされているんだけどコレ何なの? コマンド仕様で定められている値をそのまま書かないことに何か理由があるの?」 っていうような話か. であれば,コマンド仕様で定められている値をそのまま書く形にしちゃえば良いのでは.
yamatail

2022/01/07 03:20

皆様、分かりにくい書き方で大変申し訳ありません。。。 この機器のコマンドリストは存在します。そして、その表に[Return Type, Return Size]が記述されてあります。例に挙げました"-reset"の場合は、返り値の欄は空白で、"-get version"の場合は、[char, 7]です。返り値の期待できない(reset やsetコマンドなど)コマンドの場合にreceive関数の引数が"sizeof(int)"になっているようです。このsizeof(int)をreceiveの長さに指定することはよくあることなのでしょうか。
itagagaki

2022/01/07 03:32

「返り値の期待できない(reset やsetコマンドなど)コマンド」ではサーバーは何もデータを送って来ないということですか? それなら、その場合はreceiveを呼んではいけないのでは。 result = send(command, args); if (result) result = receive(recvLength); となっているので、その場合は result が false になるのでしょうか? それなら recvLength 自体使われることがないので、値は何だっていいのでは。 何だっていいからと言って sizeof(int) にしておく合理的な理由は無いと思いますが。 その場合サーバーがintの値を返すのなら…という回答がありますが、sizeof(int) はマシンに依存するもので、サーバーの返すデータ長と一致するとは限らないので、それはおかしいと思います。
fana

2022/01/07 03:50

そのコマンドリストにおいて > 返り値の欄は空白 の場合には,実際どういう仕様となっているのか?…なんてことは,誰にとっても謎だから,問うてても仕方ないような. その仕様を知る者(そのコードの出所とか使ってた人とか)に問うしかないだろうし,それが不可能なら実動作から確認していくしかないんじゃない?
yamatail

2022/01/07 03:58 編集

"-reset"コマンドですが、コマンドリストでは、空白ですが、debugモードで if (debug) printf("%i bytes received\n", responseLength); を確認したところ "4 bytes received"との出力がされました。 ただしエラーなどは、なさそうです。
fana

2022/01/07 04:08 編集

じゃあ,よくわからんけども,「何かしら4byteの応答が来る」っていう仕様なんじゃない? 仮にそういう仕様なのであって, 且つ,そのコードを実際に使っていた(使っている)環境では sizeof(int) の値が 4 なのであれば,辻褄が合っている. それだけのこと. 例えば【sizeof(int)が4となるその環境でしかそもそも使わないプログラムだという想定】があった上で実装された(その場限りのプログラムとか)ならば,(「intのサイズ」という意味合いで)"4" を "sizeof(int)" って書くことは間違いというわけではない…と思う. (あえてそう書く必要とか正当な理由があるのか? っていうと「ないな」と思うけども.「意味的にintな応答のサイズ」みたいな定数なりdefineなりを使えばいいのに.)
yamatail

2022/01/07 04:33

コメントありがとうございます。 動作をさせながら、確認してみます。 皆様のご意見大変参考になりました。m(_ _)m

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

C++

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