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

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

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

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

Q&A

2回答

1173閲覧

C++ 関数の動作について ご教授ください。

Mikan2

総合スコア8

C

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

0グッド

2クリップ

投稿2020/07/12 10:03

現状動作している以下のプログラムを用いて異なるハードで動作させようとしているのですが
以下の処理の動作が理解できず困っておりますのでお助けください。

不明点(以下ソースコードに番号を振ってあります。)
①について 
word_typeという構造体を wという名前で44個作るという意味であっていますでしょうか?
4*(10+1) はシンプルに4×11=44と考えてよろしかったでしょうか?

②について
dataには16個しかデータは入っていないのですがdata[4*i+3]この記述だとiが3の時
data[24]となり参照できないのではと考えているのですが合っていますでしょうか?

③について
①と同様に44回繰り返すと考えてよろしいでしょうか?

④について
tmp→tmpへの値の入れ替えをしているように見えますが
これには意味があるのでしょうか?この関数を通ってもtmpの値は変わらないのでは?

⑤について
「^」は何を意味しているのでしょうか?

無知で申し訳ありません。
分かるところだけでも教えていただければと思います。
よろしくお願いします。

以下ソースコード抜粋

C++

1 byte data[16] ={0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23}; 2 3struct word_type { 4 byte b[4]; 5} ; 6struct word_type w[4*(10+1)] ;//・・・・・① 7 8void Expansion(byte data[], struct word_type w[]) 9{ 10 struct word_type tmp; 11 byte i; 12 13 i = 0; 14 while (i < 4) 15 { 16 w[i].b[0] = data[4*i] ;//・・・・・・② 17 w[i].b[1] = data[4*i+1];//・・・・・② 18 w[i].b[2] = data[4*i+2];//・・・・・② 19 w[i].b[3] = data[4*i+3];//・・・・・② 20 i = i+1; 21 } 22 23 i = 4; 24 while (i < (4 * (10+1))) ・・・・③ 25 { 26 tmp.b[0] = w[i-1].b[0]; 27 tmp.b[1] = w[i-1].b[1]; 28 tmp.b[2] = w[i-1].b[2]; 29 tmp.b[3] = w[i-1].b[3]; 30 31 if (i % 4 == 0) { 32 RWord(tmp,tmp);//・・・・・④ 33 SWord(tmp,tmp); 34 XWord( tmp, Rcon[i/4], tmp); 35 } 36 XWord(w[i-4], tmp, w[i]); 37 i = i + 1; 38 } 39 40} 41 42 43void RWord(struct word_type w, struct word_type s) 44{ 45 struct word_type result; 46 result.b[0] = w.b[1] ; 47 result.b[1] = w.b[2] ; 48 result.b[2] = w.b[3] ; 49 result.b[3] = w.b[0] ; 50 51 s.b[0] = result.b[0] ; 52 s.b[1] = result.b[1] ; 53 s.b[2] = result.b[2] ; 54 s.b[3] = result.b[3] ; 55} 56 57void XWord( struct word_type w1, struct word_type w2, struct word_type s ) 58{ 59 struct word_type result; 60 result.b[0] = w1.b[0] ^ w2.b[0] ;//  ・・・・⑤ 61 result.b[1] = w1.b[1] ^ w2.b[1] ;//  ・・・・⑤ 62 result.b[2] = w1.b[2] ^ w2.b[2] ;//  ・・・・⑤ 63 result.b[3] = w1.b[3] ^ w2.b[3] ;//  ・・・・⑤ 64 65 s.b[0] = result.b[0] ; 66 s.b[1] = result.b[1] ; 67 s.b[2] = result.b[2] ; 68 s.b[3] = result.b[3] ; 69} 70 71 72 73byte SByte(byte b){ return Sbox[b]; } 74 75byte Sbox[256] = {ここにはバラバラの数字が25616進数で格納されています} 76 77void SWord(struct word_type w, struct word_type o ) 78{ 79 struct word_type result; 80 result.b[0] = SByte(w.b[0]) ; 81 result.b[1] = SByte(w.b[1]) ; 82 result.b[2] = SByte(w.b[2]) ; 83 result.b[3] = SByte(w.b[3]) ; 84 85 o.b[0] = result.b[0] ; 86 o.b[1] = result.b[1] ; 87 o.b[2] = result.b[2] ; 88 o.b[3] = result.b[3] ; 89} 90コード

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2020/07/12 10:22

そのコードはあなたが書いたものではないですよね? どこにあったコードなんでしょうか
Mikan2

2020/07/12 10:29

私が書いたものではありません。 知人から頂いたものです。 その知人も頂いたものらしくプログラムの意味までは理解していませんでしたので今回ご質問させて頂きました。わかりづらくて申し訳ありません。
guest

回答2

0

そもそもなんですけど、構造体は=でコピーできます。

もう一度いいますが、構造体は=でコピーできます。

c

1 2struct word_type { 3 byte b[4]; 4} ; 5 6 tmp.b[0] = w[i-1].b[0]; 7 tmp.b[1] = w[i-1].b[1]; 8 tmp.b[2] = w[i-1].b[2]; 9 tmp.b[3] = w[i-1].b[3];

というのは

c

1 2struct word_type { 3 byte b[4]; 4} ; 5 6 tmp = w;

で終わりです。

大体、例えばword_typeのメンバーのbの要素数が4じゃなくなったらどうやって修正するんですか、もっと楽をしましょう。

構造体配列のコピーはmemcpyするべきでしょう。

その他すでに指摘のあるとおりです。

元のコード書いた人に
Cプログラミング診断室
を読ませてあげたいですね。

投稿2020/07/12 12:31

yumetodo

総合スコア5850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

1.そんでいいです
2.あってます
3.iの初期値に4がはいってるので、繰り返しは40回のようです
4.そのとおり、なにもかわりません。
5.^はビットごとの排他的論理和(XOR)を表しています

投稿2020/07/12 10:47

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Mikan2

2020/07/12 10:53

いつもご回答頂きありがとうございます。 大変助かっております。 ②についてですが この記述でもコンパイルは通ってしまっているのですが data[24]となり参照できない場合 プログラムの動作としてはどうなるのでしょうか? 何度も申し訳ありませんがよろしくお願いします。
y_waiwai

2020/07/12 10:55

dataってのは関数の引数で、サイズ指定があってもなくても構いません。 しかし、サイズ指定があったところでこれでなにしてくれるわけでもないですね
SHOMI

2020/07/12 11:06

>この記述でもコンパイルは通ってしまっているのですが >data[24]となり参照できない場合 4*3+3は15ですよ?
KoichiSugiyama

2020/07/12 11:42

④についてRWordを実行しているのであれば、配列がローテーションしています。
Mikan2

2020/07/12 11:47

SHOMIさん お恥ずかしいです。 算数を間違えていました。 ありがとうございます。
SHOMI

2020/07/12 11:51 編集

>④についてRWordを実行しているのであれば、配列がローテーションしています。 値渡しなので呼び元のtmpの値は変わっていませんよ。 SWord,XWordも同様に…
Mikan2

2020/07/12 11:55

KoichiSugiyamaさん 回答ありがとございます。 配列がローテーションしています。 とはどういう意味でしょうか? RWord(tmp,tmp) この書き方だとtmpをtmpに入れ替える 意味の無い動作のように見えるのですが なにか役割があるのでしょうか? よろしくお願いします。
KoichiSugiyama

2020/07/12 12:03 編集

SHOMIさん、確かにそうですね。見落としていました。 Mikan2さん、ローテーションの意味ですが、resultとwの間で、result.b[0] = w.b[1];のように順番を一つずらすようなコピーをしていることを指しています。 元の配列を書き換えたかったら、引数をポインタにするか、参照渡しにする必要があります。
SHOMI

2020/07/12 12:01

>RWord(tmp,tmp) >この書き方だとtmpをtmpに入れ替える意味の無い動作のように見える RWord()の中ではtmpの1バイト目を4バイト目に、2バイト目を1バイト目に、3バイト目を2バイト目に、4バイト目を3バイト目に移し替えていますよ。 値渡しになっているので移し替えた結果はtmpに格納されていませんが、おそらく本来は参照渡しにしてtmpの内容を変更したかったのでしょう。
Mikan2

2020/07/12 15:21

KoichiSugiyamaさん ありがとうございます。ローテーションの意味理解しました! SHOMIさん 回答ありがとうございます。 ということは、RWord、SWord、XWordの関数、もっというとそれらを呼び出している Expansionの関数自体も値渡しなので関数の処理終了と同時に代入されたそれぞれの値は 消えてなくなるということでしょうか? よろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問