とある組み込み屋のブログ

駆け出しの組み込みソフトウェア屋が技術的なことから日常的なことまで、色々書きます。

ぽかみす

sizeof

C言語

 sizeof(型、変数、etc...);

という演算子がありますね
この演算子について恥ずかしながら色々勘違いしていました...
勉強しなおさないとですね。
少し極端な例ですが、例えばこんなプログラムがあったとして、

#include <stdio.h>

int example(int *p);
int main(){
    int array[3] = {1, 2, 3};
    int result;
    
    /* 直接sizeofで配列の要素数を求める */
    result = sizeof(array) / sizeof(int);
    printf("%d\n", result); // => 3

    /* 配列をポインタで渡して関数で大きさを求めたい */
    result = example(array);
    printf("%d\n", result); // => 3?

    return 0;
}

int example(int *p){
    return sizeof(p) / sizeof(int);
}

さて、コード上にも書いていますが、
関数にて求めた2個目のresultはどんな値を取ると思いますか?
結果から言うとこうなります。

3
1

なぜこうなるのでしょうか?
実は関数の

int example(int *p){
    return sizeof(p) / sizeof(int);
}

の部分、
sizeof()の引数にint*(intポインタ)を渡しています。
つまりこれはポインタのサイズを取得しているのです。
ポインタが確保しているメモリサイズを返しているんですね。
私のPCだと4バイト確保しているようで、これを実行すると4が出力されます。
sizeof(int)はintのバイトサイズなのでintは32ビットのため、4となります。
つまり4 / 4 = 1となり、出力のresultは1となっています。
memcpyを使う機会がありまして、その第3引数にsizeofを用いたのですが
そこにポインタを入れてしまい、いつまでも4つ分の配列の要素しかコピーできないという沼に陥っていました。。。
こういう演算子を使う時は定義を明確にして使用して濫用しないようにしたいですね。

余談

あと、マークダウン記法でソース書くときのシンタックスハイライトの言語指定ですが、
C言語ソースは小文字のcじゃないとダメなんですね。。大文字はダメらしい。。

Ruby

Ruby

最近Rubyも嗜んでおりまして、
これがまたとっつきがたく、、、
スクリプト言語なのでコンパイル不要の言語なので、
慣れてしまうと連続実行とかそういうのはお手の物の代物なのですが
やはりCとは勝手が違いますね笑
ただOpenSSLが標準のライブラリで入っているのは素晴らしいです。
DESとかAESとかそういう暗号化で遊ぶことができますし、面白いですよ。たとえば、2key TripleDESもこんな簡単に組めます。

require 'openssl'

msg = "\x00" *8
c1 = OpenSSL::Cipher.new("des-ede")
c1.key = "\x23" *16
msg = c1.encrypt.update(msg)
puts msg.unpack('H*')
puts __ENCODING__

edeって言うのはencrypt decrypt encryptのことで、
Triple DESとはその名の通りDESを3回暗号化、復号化、暗号化と繰り返し、
暗号化を行います。unpack('H*')というのは、暗号化されたものを16進数1バイトごとに配列にするようなものです。(適当、うろ覚え、、、)
3-key Triple DESというのと2-key Triple DESの違いは
ずばり鍵の長さですね。
2-keyは平文の2倍長、3-keyは3倍長。
2-keyは鍵を2分割して左側で暗号化、右側で復号化をかける。
3-keyは鍵を3分割して3つの鍵で暗号、復号、暗号のフローに割り当て。

上記のコードは平文8バイトで値はオール00(16進数)で、
鍵は23(16進数)が16回繰り返されている16バイトの鍵値の、
2-key Triple DESの単純なRubyプログラムです。
たった数行で組めてしまいます。
すごいですね。

休日でも

社会人になって感じていることですが、休日の時間管理も本当に大切ですよね。
事務的にやらなければいけないことも多く大変です。
今日はスマホのプラン変更に四苦八苦していました。
そして今日どうにかなる問題ではないことがわかり、明日またやることになりました。
スマホから少しずつ節約していくことができればと思っています。
お金に関しても考えていく必要がありますし。

結果

合格

基本情報技術者試験の合格証書が届きました。
合格発表の番号にはありましたが、いざこうして証書とか来るとようやく実感できますね。

組み込み

ところで組み込みの話をしてみようと思うのですが、(唐突)
組み込みだと俗にいうプログラミング言語はCが使われます。
C言語って「制作者の意図を妨げない」を売りにしている言語でして、
書いたことを素直にプログラムは実行してくれます。
つまり、意図しないで、裏で暗黙に何かプログラムが動いたり、作られたりすることは無いんですね。
あ、勿論オブジェクトファイルとかは作りますよ。ファイルを翻訳単位でリンクしないといけないので。
場合によってはバイナリファイルとかhexファイルとか作りますしね。
裏で暗黙に動いていたりするのは、JavaScriptとかそういう系ですね。裏でファイルの実体が作られる系の。
こういったものはwebで動かすんですね。
機器に組み込む際には裏でファイルが作られてしまうような言語は以ての外で、
プログラムのバイトサイズが明らかになるものでないといけません。
webのサーバーのように無限ではなく、メモリ容量は有限ですし、
そういった機器に組み込む際にプログラムを保管しておける部分も限られています。
なので、作ったファイルを素直に動かしてくれるCが未だに使われているんですね。
ここまでCについて色々語りましたが、腕が疲れたのでこのへんで。

コード

今日は結構忙しかったのでもう寝ようと思います。
ひたすらCのコーディングをしていました。
レビュー地獄、デバッグ地獄が来ないように、設計を努めましたが果たしてどうなることか・・・
明日も頑張りましょう。