X



トップページ電気・電子
721コメント267KB
マイコンソフト 悩み事相談室 4
0001774ワット発電中さん
垢版 |
2020/09/11(金) 09:38:11.57ID:cJDnlvMz
.
  ∧ ∧    
  ( ´・ω・) < コンフィグって何? 昆布なら知ってる。  ボラチルって何? ボラは魚だよ。
  ( ∪ ∪   ,.-、     ,.-、   ,.-、     ,.-、
  と__)__)  (,,■)   (,,■)  (,,■)   (,,■)
         PIC    AVR  H8    ARM

  学校でC言語を習ったことがあるので「楽勝でしょ」って、マイコンを始めたけど、
  わからないことだらけ。誰か教えて!

  PCとは別世界の、マイコンのソフト。難しいよね。

  ツールの使い方、ツールの設定、マイコン特有のC言語の書き方、
  「デバッグモードにプログラミングモード。何?」 Eclips, Emacs って何?
  VBAしか知らないよぉ、という人まで、
  各社マイコンに関するマイコンソフト相談室です。

  質問者は、「初心者質問スレ」の>>1を見て、分かり易く質問を書いてね。
  回答者は、威張らない、バカにしない、言葉使い注意で、親切に教えてあげてね。

  あっ、そうそう。 
  ハードウェアに関する質問は、それぞれのマイコンのスレに、達人がいるから。

  過去スレ
    1 2014/09/11〜
    2 2016/07/31〜 http://rio2016.2ch.net/test/read.cgi/denki/1469905691/l50
    3 2017/06/19〜 https://rio2016.5ch.net/test/read.cgi/denki/1497806664/

  では、質問、ドゾ〜
0671774ワット発電中さん
垢版 |
2023/09/22(金) 18:31:18.35ID:OaN/xYuF
カード型データベースみたいな感じ。構造体
0672774ワット発電中さん
垢版 |
2023/09/23(土) 11:43:49.56ID:CBAAPjIw
>>670
FILE構造体の話はC言語の話だよ。ファイルの考え方が異なるものを並べてはいけない。
0674774ワット発電中さん
垢版 |
2023/09/23(土) 18:58:42.64ID:87dPlImm
ポインタ型の変数宣言がわかりません。

bit幅は何bitなのでしょうか?
その変数に代入すると、常にアドレス番地として認識されて、数字ではないのでしょうか?
そもそもポインタの嬉しさがわからないです。
配列a[100]で良いと思うし。
0676774ワット発電中さん
垢版 |
2023/09/23(土) 21:11:13.60ID:CBAAPjIw
C言語そのままのポインタではないけれど、JavaでもC#でもクラスのインスタンスは「ポインタみたいなもの」だしね。

>>674
ポインタ変数そのものはC言語ではアドレスを格納していて、ビット幅はアドレスぶん。

ポインタはいくつかのメリットがあるけれど、そのうちのひとつ。「配列a[100]で良い」という話があったので、
C言語だと構造体(C++ならクラスも)の配列は、次の2種類の管理ができる。
(1)構造体の実体の配列を作る。
(2)構造体の実体はどこかに確保して、その実体の場所を示すポインタの配列を作る。

この2種類のうち、JavaやC#は基本的には
・クラスの配列だと(2)の方法を採る。
・intやfloatだと(1)の方法を採る。
変数のタイプによって変わってくるので、わかっていないとかえって難しくなる。
C/C++なら、書き方で変わるので、そのあたりはかえってシンプルだと思う。

(2)はメモリを余計につかうから無駄なような気がするけど、
任意の条件で、配列内を並べ替えするようなとき、
(1)だと構造体まるごと移動が必要になる。構造体のサイズが大きいほど、入れ替えに時間がかかる。
(2)だと配列で管理しているのはアドレスだけなので、入れ替えがすばやくできる。

嬉しさがわからないのは、ポインタの方が有利になる課題にぶちあたっていないせいだと思う。
JavaかC#でクラスを自分で作るようなプログラムを組んでいたら、C/C++のポインタの雰囲気がわかる
ようになるかもしれない。
0677774ワット発電中さん
垢版 |
2023/09/23(土) 22:02:13.93ID:n/7/fapL
ポインタがない言語はたくさんあります。
むしろほとんどの言語にはありません、
C言語にポインタがあるのは高級アセンブラだからです。
0678774ワット発電中さん
垢版 |
2023/09/23(土) 22:20:18.71ID:87dPlImm
>>676
ありがとうございます。
>ポインタ変数そのものはC言語ではアドレスを格納していて、ビット幅はアドレスぶん。
ということは、16bitマイコンの場合
unsigned char a; aの記憶場所のbit幅は8bit、アドレスのことは知らない。
char *b; (アドレス専門の)bのbit幅は16bit、bで示される記憶場所のbit幅は8bit
ということで良いでしょうか?

C++とかC#はわからないですが
PICマイコンのXC16(16bit用コンパイラ)の場合でも同じでしょうか。
0679774ワット発電中さん
垢版 |
2023/09/23(土) 22:46:26.72ID:CBAAPjIw
>ということは、16bitマイコンの場合
>unsigned char a; aの記憶場所のbit幅は8bit、アドレスのことは知らない。
>char *b; (アドレス専門の)bのbit幅は16bit、bで示される記憶場所のbit幅は8bit

「16bitマイコンの場合は」とパターン化して覚えるのは間違っています。
傾向はつかめても傾向で語るのは多数の例外の前にむしろ害になるでしょう。

もしそのコンパイラのunsigned char が8bitなら、そのコンパイラのunsigned charは8bitと認識すればいいし、
アドレスのbit幅が16bitなら16bitであることが多い。
パターンにもとづく記憶に依存せずに、都度都度、調べればいいです。

一つのマイコンの一つのプログラムの中でも、アドレスのビット幅が一定とは限らんし。

ということで↓は自分で調べるようにしてほしいです。
>PICマイコンのXC16(16bit用コンパイラ)の場合でも同じでしょうか。
0680774ワット発電中さん
垢版 |
2023/09/23(土) 22:48:44.27ID:87dPlImm
ネットから拾ってきた例ソースに、自分で説明を付けてみた。
途中がわからないです。

#include <stdio.h>

typedef struct {    // 以下の構造を持つ変数型を宣言する
int num;      // 構成員1 numという数値変数
char *str;     // 構成員2 その次にstrという名前のポインタ用変数
} strct;        // 上記の構造を持つ「型」を strct という名前で呼ぶことにする。
            // numは数値用で16bit幅、置かれるアドレスはコンパイラに任せる。
            // strは、ポインタ(アドレス用の入れ物)で、そのbit幅は
            // 我々が気にする必要はない。コンパイラが決めてくれる。

int main(void) {
strct entity;    // strct型の変数を1組用意する。名前はentity
strct *p;      // strct型の変数を1組用意する。名前はpでアドレスしか入らない(?)
p = &entity;     // pにentityの先頭アドレスを代入する。

p->num = 0;     // アドレスしか入れられない*pのnum(?)に0を入れる
p->str = "Hello";  // アドレスしか入れられない*pのstr(?)に"Hello"を入れる(?)

printf("num:%d\n", entity.num);  // 「strct型のentity」の構成員のnumの中身を10進数で表示
printf("str:%s\n", entity.str);  // 「strct型のentity」の構成員のstrの中身を文字列で表示

return 0;     // 戻る
}
0681774ワット発電中さん
垢版 |
2023/09/23(土) 23:09:31.79ID:CBAAPjIw
> アドレスしか入れられない*pのnum(?)に0を入れる
「ポインタ変数そのものにアドレスしか入れられない」ということと
「ポインタ変数が指す領域に値を入れる」行為をごっちゃにしてませんか?

「ポインタにはアドレスしか入れられない」とどこかで読んだり習ったのかもしれないです。
「ポインタにはアドレスしか入れられない」こと自体に間違いはありませんが、
あなたはそれをもって、「ポインタ変数に値を入れているのはなぜだ」ってぐちゃぐちゃにしています。
ポインタにはアドレスしか入れませんが、ポインタが指す領域にはその変数の値が入ります。

教えてもらったり読んだ文言を、自分で解釈する表面的な意味に拘ってはいけません。
同様に「16ビットマイコンでは、ポインタのサイズは…」みたいなおぼえ方は、とりわけあなたのように、
「ルールや決まりでものごとを整理してそれに適合しないものに混乱するタイプ」の人は避けるべきだと思います。

自分で決めたルールに反したものを見つけたときにルールのアップデートをしたり、例外を躊躇なく受け入れられる人なら
ルール化して覚えるのはいいかもしれないですが。

int *p;
があるとして、p はポインタ変数そのものなのでアドレスが入りますが、
*p は、ポインタ変数pが指し示す領域なので、その領域が確保されているなら intの値を入れることができます。
0682774ワット発電中さん
垢版 |
2023/09/24(日) 04:28:20.13ID:Ku0AL+tT
ポインターは難しい。
誰でもつまづくんだな。
言葉の意味が分かりにくいから。
0685774ワット発電中さん
垢版 |
2023/09/24(日) 10:18:05.83ID:3fdSyMx4
>言葉の意味が分かりにくいから。
そうなんかなあ。point(指し示す)+er で、「(場所を)指し示すもの」ってそこそこそのまんまだと思うんだが。

>そもそも16bitマイコンって、何が16bit?
そうそう。
主たるアキュムレータのビット数が、という言い方もあるけれど、明確な定義を試みることの意味は薄いと思う。
マイコン分類学みたいな人はやってくれたらいいけどな。

ポインタのサイズでいえば、ハードウェアのアドレスのビット幅が20ビットでも、ポインタ変数のサイズが16ビット
だったり、32ビットだったりいろいろになることがあるし、必要な場合はちゃんと調べて使わないとまずい。

とくに今までポインタについて調べたことがないマイコンで、ポインタのサイズを知る必要が発生したなら、
自分によるルール化、類型化での判断ではなく、マニュアルを見ないと。

>ヌルポ インタに意味持たせちゃったのもマズイよね。
そうなんかなあ。
C++はともかく、C言語なら「ポインター値 0 は未初期化の印」としておくのは悪くはないと思う。
そのせいで、アドレスゼロが、ポインタで指し示せないという問題はあるとしても
0686774ワット発電中さん
垢版 |
2023/09/24(日) 10:20:29.07ID:R9qz7oH6
>>676
全然違う

そんなことより「ポインタが無い」Javaなのに
NullPointerExceptionが多発することが問題
0687774ワット発電中さん
垢版 |
2023/09/24(日) 10:40:00.91ID:3fdSyMx4
>>686
何が全然違うのか書かないと、コミュニケーションも成立しない。

>そんなことより「ポインタが無い」Javaなのに
>NullPointerExceptionが多発することが問題
たしかにこの2行は、矛盾の指摘に見えるけれど、矛盾になるためには1行目も2行目も正しいことが必要です。
Javaにポインタがない、という認識を疑うのはいかがでしょうか。もしその認識を修正すれば、

「Javaにはポインタのようなものがあり、誤った使い方をすればNullPointerExceptionが発生する」
となり、きれいに矛盾も消えると思います。

javaにはポインターがないのですか
↑そのままをキーワードにしてぐぐって。
多様な解釈がでてきますので、どれかを自分のものにするのではなくて対立するものもふくめてなんとなく
受け入れたらいいと思います。
0688774ワット発電中さん
垢版 |
2023/09/24(日) 14:06:36.17ID:R9qz7oH6
Javaにはポインタが無いとは描いていない
「ポインタが無い」Javaと描いている
0689774ワット発電中さん
垢版 |
2023/09/24(日) 14:19:32.44ID:3fdSyMx4
「Javaにはポインタが無い」と「ポインタが無い」Java に、

この件において

どんな意味の違いがあるの?
0690774ワット発電中さん
垢版 |
2023/09/24(日) 14:31:30.15ID:OMO90ysE
・ポインタとはアドレスベースでデータを参照する機能である
・ポインタは今どきの処理系には大抵存在する
・C/C++などの一部の処理系を除き境界チェックされる
0691774ワット発電中さん
垢版 |
2023/09/24(日) 14:36:16.29ID:R9qz7oH6
>>689
君國語の成績悪かっただろ?
0692774ワット発電中さん
垢版 |
2023/09/24(日) 14:39:08.04ID:3fdSyMx4
>>691
>>686において「全然違う」とだけ非難して、何が違うのかの説明はまだだね。

>>688において「Javaにはポインタが無い」ではなく「ポインタが無い」Java だと言いつつ、この件においてのその違いの説明のしないつもりかな。

ふたつとも待ってるよ。
0693774ワット発電中さん
垢版 |
2023/09/24(日) 14:57:04.17ID:3fdSyMx4
>>681
> p->num = 0;     // アドレスしか入れられない*pのnum(?)に0を入れる
の方は説明したけど、
↓の方はこれはこれで別のひっかかりっぽい?
> p->str = "Hello";  // アドレスしか入れられない*pのstr(?)に"Hello"を入れる(?)

この人は「p->str」がポインタであることは認識している。

この文は "Hello"を入れているんじゃないです。
"Hello"という文字列を格納しているアドレスを、p->str に入れています。
p->str = "Hello"; がコンパイルされたら、多くの場合メモリのどこかの領域に Hello\0 の6バイトが確保されます。
p->str に その領域の先頭アドレスが入ります。
0695774ワット発電中さん
垢版 |
2023/09/24(日) 21:42:20.54ID:3fdSyMx4
>>694
>>681で返答している質問の>>680は見たのかな?

> typedef struct {    // 以下の構造を持つ変数型を宣言する
> int num;      // 構成員1 numという数値変数
> char *str;     // 構成員2 その次にstrという名前のポインタ用変数
> } strct;        // 上記の構造を持つ「型」を strct という名前で呼ぶこと

見ての通り、strメンバーは、charのポインタだよ。

なぜ違うと思ったのか説明して。
0698774ワット発電中さん
垢版 |
2023/11/27(月) 23:20:18.84ID:LpF7eOHE
“組み込み用”のファイルシステムやライブラリってないのかな?
・コントローラ付きフラッシュメディア用(データのアラインが出来る)
・読み出し専用
・非同期アクセス可能(FIFO、バックグラウンド読み出し)
・高速エントリ探索
自分で作ってもいいけどすでにあるのならそっち使った方がよさそうだし・・・
0699774ワット発電中さん
垢版 |
2024/01/18(木) 21:05:24.13ID:N2qj1hNp
自分で作れるなら作ったほうが、後々楽よ
0701774ワット発電中さん
垢版 |
2024/02/21(水) 02:38:40.05ID:PoiUZRbV
ちっとも動かずに、半日悩んでしまいました。
同じ変数名をグローバルと関数内で宣言してしまった場合、
関数内の変数の方が優先なんだね。
0702774ワット発電中さん
垢版 |
2024/02/21(水) 12:20:18.74ID:tJ+ZT3Bx
>>1
本当に楽勝でやる人には、本当はそんなやり方じゃダメだとか、俺はもっと良い方法を知っているとか言うのでは?
気にするだけ無駄だと思います。
0703774ワット発電中さん
垢版 |
2024/02/21(水) 13:57:16.12ID:IVX0JOfo
>>701
python使えば良い
0704774ワット発電中さん
垢版 |
2024/02/21(水) 15:11:30.65ID:t3hedltn
Pythonだとグローバル変数が優先されるのか、勉強になるなぁ。
0706774ワット発電中さん
垢版 |
2024/02/21(水) 19:41:33.97ID:ueIcNcGI
グローバル変数は意識して使わないといけないから、なのかな。

でも、関数内でうっかり同名の変数に代入して、同じ関数内の別のところで、
同名のグローバル変数だと信じて参照するケースもあると思う。
>>701さんのだって、
関数内でうっかり同名変数を宣言して、同じ関数内の別のところで、
同名のグローバル変数だと信じて参照してたのかもしれないし。

それ以前にPythonが使えるマイコン環境はむしろ少なそう。
0707774ワット発電中さん
垢版 |
2024/02/21(水) 20:25:44.10ID:ZxC9UuKG
変態命名則 exDwHoge
名前空間に押し込む myglb::hoge
グローバルオブジェクトに持たせる glb.hoge
グローバル変数絶対つかわないマン #define HOGE
0708774ワット発電中さん
垢版 |
2024/02/21(水) 22:27:14.65ID:sMnq/5eu
でも、使いたいグローバル変数が分かってるのにそれと同じ名前の変数を作っちゃうというのも随分なうっかりさんだよね。
あるいはグローバル変数の方を後で追加したんかな?
0709774ワット発電中さん
垢版 |
2024/02/22(木) 01:12:31.52ID:gKe8zB+g
>>708
最初は関数内だけでstaticで使っていたんだけど、
その変数値を関数外でも参照したなり、グローバルに出したのです。
が、関数内の変数宣言を // するのを忘れました。
関数内では正しく処理されているのに、mainで if( hoge==1 ){とやっても
全然1にならない。
0711774ワット発電中さん
垢版 |
2024/02/23(金) 00:51:42.49ID:SqM8iMFD
Rustが使えるマイコンって 何がありますか?
0714774ワット発電中さん
垢版 |
2024/02/23(金) 12:12:19.81ID:XxMmkSd6
Rustマジ面倒臭いわ
0715774ワット発電中さん
垢版 |
2024/03/03(日) 12:23:41.10ID:+3niRoTA
自前のメモリアロケーション管理はイヤ、
ガベコも嫌い、例外もイヤみたいな
欲張りセットがターゲットだしな

クミコではガベコ=害悪、絶対にスコープ縛りみたいな
メモリをドバドバ使った動的管理がクリティカルなケースが限られる

メモリ管理のちょっとしたミスで数百万円のサーバを食い散らかす
サーバサイドアプリの記述なんかは強力なんだろうけど
0717774ワット発電中さん
垢版 |
2024/05/12(日) 10:03:17.39ID:RNJVf2b5
読んだ事ないけど読んでみたくなった
はじめて見たわ
0718774ワット発電中さん
垢版 |
2024/05/12(日) 10:09:45.30ID:nA24haYJ
糖が尿から出てきて何なんだ大木のじじいの話か
0719774ワット発電中さん
垢版 |
2024/05/12(日) 10:24:51.90ID:NJ1tdi90
騙されて見てて嫌がる人が作った奴が隠蔽したからシギーは直に逮捕されるだろうってさ
0720774ワット発電中さん
垢版 |
2024/05/12(日) 12:08:01.04ID:WLMdcnxg
結局メダル取ったらなれるわけないんだな
0721774ワット発電中さん
垢版 |
2024/05/12(日) 13:16:25.67ID:2iYTBJ6P
ねけひけひはひむめもせをさちほたたゆけといちをぬあおききのりまなみとくま
レスを投稿する


ニューススポーツなんでも実況