全年12月23日の投稿[3件]
2022年 この範囲を時系列順で読む この範囲をファイルに出力する
もう数日頑張れば本業が落ち着きます。夏休み前の小学生みたいにワクワクした気持ちですが何をしましょう。
手つかずの課題は特盛です。自由に何でも出来そうな解放感はあっても時間も気力も体力も資金も有限です。
物理装置を作るのもいいのですが、暖かい部屋に籠ってヌクヌクと出来る課題がいい。
まずはArt-Netエンジンですかね。これが出来れば幾つかの課題をクリアするキーになります。
調光制御の底辺で必要になる計算ライブラリも重要でしょうか。レベル値にマスタ値を与えて出力値を得るとか、幾つかのレベル値をマージするライブラリです。調光卓的なシステムでは必須です。
さらにはANSIエスケープシーケンスを用いた画面表示ライブラリです。これはpythonが苦手なfor文を多用せずには書けないのでC言語で書くのが必須だからです。
明日は数か月ぶりの完全オフなのでゆっくり考えましょう。
追記
ゆっくり考えようと思ったのですが、アホみたいに疲れが出て何も出来ませんでした。
アドレナリンに頼って誤魔化すと反動が酷いお年頃。
#雑談
手つかずの課題は特盛です。自由に何でも出来そうな解放感はあっても時間も気力も体力も資金も有限です。
物理装置を作るのもいいのですが、暖かい部屋に籠ってヌクヌクと出来る課題がいい。
まずはArt-Netエンジンですかね。これが出来れば幾つかの課題をクリアするキーになります。
調光制御の底辺で必要になる計算ライブラリも重要でしょうか。レベル値にマスタ値を与えて出力値を得るとか、幾つかのレベル値をマージするライブラリです。調光卓的なシステムでは必須です。
さらにはANSIエスケープシーケンスを用いた画面表示ライブラリです。これはpythonが苦手なfor文を多用せずには書けないのでC言語で書くのが必須だからです。
明日は数か月ぶりの完全オフなのでゆっくり考えましょう。
追記
ゆっくり考えようと思ったのですが、アホみたいに疲れが出て何も出来ませんでした。
アドレナリンに頼って誤魔化すと反動が酷いお年頃。
#雑談
今扱っている課題ではハードウェアの処理能力を出来るだけ主題の処理に振り向けたいのです。
C/C++の使用やポインタの活用は大いに貢献しそうですが、プロセス間通信をポインタを介して行うことは今時のOSでは無理っぽい。プロセスの独立性をOSがガッチリ固めるからです。
プロセス間で通信するにはOSがマネージするpipeや共有メモリを用いないといけません。幸い、pythonで同様のことをするよりも処理速度が速いようなので現実的ではありますが、このレベルの情報になりますとその筋の上級者が書いているので前提が高度で完全理解には程遠いところです。もっと基礎を固めないといけません。
現時点では同プロセス内でのスレッド処理で構成するのが現実的かなと。
同プロセス内ならポインタを介してスレッド間で変数を共有できるそうです。
ただ、Art-Netエンジン(受信/パッチ/送信の一連処理)を独立したプロセスにしたいので、いずれはプロセス間通信を多用出来る技術も習得しないといけません。
理解には及んでいませんが、芸は無いけど速度が出せる共有メモリが一番良さそうです。
追記
プロセス間でのメモリ共有
説明は少ないですが、サンプルコードに余計な装飾がありませんし、ほぼANSI-Cで書かれているので理解しやすい。
共有メモリを宣言し、そのメモリのアドレスを数値としてポインタ変数に渡しているだけです。別プロセスへのアドレスの渡し方が地味ですが、動作を理解するにはこれでいいのです。単に値が渡ればいいのか、特別な手段で渡すのか、明確にわかります。
これを習得出来たら楽になりますね。
#C言語
C/C++の使用やポインタの活用は大いに貢献しそうですが、プロセス間通信をポインタを介して行うことは今時のOSでは無理っぽい。プロセスの独立性をOSがガッチリ固めるからです。
プロセス間で通信するにはOSがマネージするpipeや共有メモリを用いないといけません。幸い、pythonで同様のことをするよりも処理速度が速いようなので現実的ではありますが、このレベルの情報になりますとその筋の上級者が書いているので前提が高度で完全理解には程遠いところです。もっと基礎を固めないといけません。
現時点では同プロセス内でのスレッド処理で構成するのが現実的かなと。
同プロセス内ならポインタを介してスレッド間で変数を共有できるそうです。
ただ、Art-Netエンジン(受信/パッチ/送信の一連処理)を独立したプロセスにしたいので、いずれはプロセス間通信を多用出来る技術も習得しないといけません。
理解には及んでいませんが、芸は無いけど速度が出せる共有メモリが一番良さそうです。
追記
プロセス間でのメモリ共有
説明は少ないですが、サンプルコードに余計な装飾がありませんし、ほぼANSI-Cで書かれているので理解しやすい。
共有メモリを宣言し、そのメモリのアドレスを数値としてポインタ変数に渡しているだけです。別プロセスへのアドレスの渡し方が地味ですが、動作を理解するにはこれでいいのです。単に値が渡ればいいのか、特別な手段で渡すのか、明確にわかります。
これを習得出来たら楽になりますね。
#C言語
オレメモです。
● C言語のポインタ
私の理解ですが、ポインタとは変数の扱い方の一つで、定義した名称ではなくメモリ上のアドレスを指定して変数にアクセスする方法です。変数のアドレス得る方法と、アドレス指定で変数を読み書きする方法の二つを総称したものとなります。
OSやプログラム言語はハードウェアを直視せずに済ませるためにあるのですが、ポインタはその意図に反して原始的なアプローチでメモリに直接アクセスする方法だと言ってもよいようです。
様々な解説では変数のアドレス得る方法とアドレス指定で変数を読み書きする方法、さらにポインタの効能を混在させて説明するので分かりにくいのです。
先達の意図には反しますが、少しアプローチを変えて書いてみようと思います。
ただし、変数とは保存先を表す<アドレス>と保存されている<数値>で構成されているので、この辺りが頭にイメージ出来ないと以下は理解不能だと思います。
任意のアドレスをユーザが設定することも可能ですが、OSや言語が割り当てるアドレスを使うのが普通。いや、勝手に決めて正常に動くことはまず無いでしょう。
変数のアドレスを得る方法
変数を定義するなら、
int data;
などと書けばいい。この段階で保存先のアドレスは決定されています。というか、変数が持つ情報の実体は保存先を表すアドレスです。
この変数のアドレス値を得るなら、
&data
とすればいい。変数名の前に<&>(アンパサンドと読むらしい。アンドではないそうな)を付けて装飾すると変数のアドレスを表します。
単に変数名とすれば中身を読み書き出来、変数名の頭にアンパサンドを付ければ保存先アドレスを読み書き出来るのです。
例えば、変数の中身を表示するなら、
printf("変数の中身:%d\n", data);
アドレスを表示するなら、
printf("変数の格納先アドレス:%d\n", &data);
となります。
アドレス指定で変数を読み書きする方法
変数のアドレスを保存するための変数はポインタ変数と呼ばれる特殊なものです。
通常変数と違って
int *addr;
とか
char *str_addr;
などと定義します。変数の前に<*>(アスタリスク)を付けて装飾することでポインタ変数だと宣言します。
アドレスを格納するには<*>を付けず、
addr = &data;
とします。
アドレス指定(ポインタ)で変数を読み出すには、
num = *addr;
とします。上記に続くなら変数dataの内容が変数numに入ります。
書き込むなら、
*addr = 10;
となり、変数dataの内容も10になります。何故なら、dataも*addrも同じアドレス(実体)にアクセスするからです。
ポインタの活用方法、動的変数、静的変数なども理解しなければなりませんが、先達の情報以上のことは書けそうありません。
自分ナリの整理は付きましたし、数か月後の自分が再理解できると思うのでここまで。
#C言語
● C言語のポインタ
私の理解ですが、ポインタとは変数の扱い方の一つで、定義した名称ではなくメモリ上のアドレスを指定して変数にアクセスする方法です。変数のアドレス得る方法と、アドレス指定で変数を読み書きする方法の二つを総称したものとなります。
OSやプログラム言語はハードウェアを直視せずに済ませるためにあるのですが、ポインタはその意図に反して原始的なアプローチでメモリに直接アクセスする方法だと言ってもよいようです。
様々な解説では変数のアドレス得る方法とアドレス指定で変数を読み書きする方法、さらにポインタの効能を混在させて説明するので分かりにくいのです。
先達の意図には反しますが、少しアプローチを変えて書いてみようと思います。
ただし、変数とは保存先を表す<アドレス>と保存されている<数値>で構成されているので、この辺りが頭にイメージ出来ないと以下は理解不能だと思います。
任意のアドレスをユーザが設定することも可能ですが、OSや言語が割り当てるアドレスを使うのが普通。いや、勝手に決めて正常に動くことはまず無いでしょう。
変数のアドレスを得る方法
変数を定義するなら、
int data;
などと書けばいい。この段階で保存先のアドレスは決定されています。というか、変数が持つ情報の実体は保存先を表すアドレスです。
この変数のアドレス値を得るなら、
&data
とすればいい。変数名の前に<&>(アンパサンドと読むらしい。アンドではないそうな)を付けて装飾すると変数のアドレスを表します。
単に変数名とすれば中身を読み書き出来、変数名の頭にアンパサンドを付ければ保存先アドレスを読み書き出来るのです。
例えば、変数の中身を表示するなら、
printf("変数の中身:%d\n", data);
アドレスを表示するなら、
printf("変数の格納先アドレス:%d\n", &data);
となります。
アドレス指定で変数を読み書きする方法
変数のアドレスを保存するための変数はポインタ変数と呼ばれる特殊なものです。
通常変数と違って
int *addr;
とか
char *str_addr;
などと定義します。変数の前に<*>(アスタリスク)を付けて装飾することでポインタ変数だと宣言します。
アドレスを格納するには<*>を付けず、
addr = &data;
とします。
アドレス指定(ポインタ)で変数を読み出すには、
num = *addr;
とします。上記に続くなら変数dataの内容が変数numに入ります。
書き込むなら、
*addr = 10;
となり、変数dataの内容も10になります。何故なら、dataも*addrも同じアドレス(実体)にアクセスするからです。
ポインタの活用方法、動的変数、静的変数なども理解しなければなりませんが、先達の情報以上のことは書けそうありません。
自分ナリの整理は付きましたし、数か月後の自分が再理解できると思うのでここまで。
#C言語