C言語なら俺に聞け 153
■ このスレッドは過去ログ倉庫に格納されています
>>215
関数に値を渡すのはわかるよね?
printfって関数に出力して欲しい数値や文字を渡してる
この渡すときにCPUの動き的には複製されたものが渡される
数値なら複製しても対して問題ないけど文字列の場合なんかだと複製することで消費されるメモリが増えてしまう
だから文字列全部を複製なんかせずに文字列の先頭の場所だけ渡す
受け取ったprintf側ではその場所を元に文字列にアクセスする
この場所を指し示す仕組みがポインタと呼ばれるもの
10文字でも1000文字でも先頭の場所、つまりアドレスは4byteとかで表せるので情報の受け渡し効率が良い
正確には間違ってる部分もあるかもしれんがだいたいこんなイメージ >>217
そもそもvsprintfのある環境ならprintfあるでしょ。
組み込みとかなら低レベルの1文字出力は作らないといけないけど。 >>220
そんな感じですです あと暗に頭にタイムスタンプ付加したりとか
VZエディタのASMソース見たときは、整数onlyでも結構複雑だった ポインタを使わないならCを使わない方がいいという程度にはポインタはCの肝
ポインタを使わないなら素直に安全で高級な言語を使った方がいい エントリ関数を int main(int argc, char *argv[]) と書いた時点で
ポインタを使ってる、とも言えるんだよな。
int main(void) で始めてるかもしれんけど。 int main()しか使ってないわ。どういう時に使うんだっけそれ >>224
C言語を使う用途の多くは
組み込み、OS、ドライバ
だろ
簡単に言語を変えるとかいうなよ コマンドラインから情報を受け取って処理したいときに使う
関数の引数と同じ ポインタの使い方を覚えるって言ってるんだから
それでいいじゃん C言語でOS作ってみたいんだけどなぁ。入門レベルじゃきびしいな >>231
簡単なRTOSでもまともに作るならCだけで書くのは不可能。 >>234
ほんの少しインチキをするだけで、全てC言語で書ける バイナリコード直接記述?
それはC言語で記述とは言わないような
インラインアセンブラも同じ >>234
大半はCで行けそうな感じはするけどな。実際にUNIXやLinuxはそうだし。
厳密に完全に100%Cにするとなると最初からそれを考慮してCPU作らないとできないとは思うが、かといってその必要性はないな。研究目的ならわかるが。 >>237
こういう知ったかして無知晒すバカはどうにかならんのかいな 痛いのが好きなんでしょう
鞭も旨い
おそまつさまでした >>237
100%Cでどうやって特権命令出すの?
Cプログラムが動き出せる最低限の準備は何だか知ってる? 動き出すだけなら100%C言語って今時珍しくも無い スタートアップルーチンに頼らずにmain関数が自立起動するのか >>241
「すべてC言語で書ける」に突っ込み入れられてるだけだろ
>>242
OSの話だよ? > startup.s/head.s
明日から仕事来なくていいから。 >>243
スタートアップをC言語で書くって話でしょ
まあ気合いでなんとかなるさ >>241
大半を100%とは言わないし、
100%CのUNIXやLinuxが大半でもない
話を逸らすな スタートアップコードなら100%Cで書けるマイコンは珍しくない
OS 100%は無理
>>240が話題を追加したの 231 CでOS作ってみたい
233 RTOSでさえ無理
234 Cだけで?そりゃ無理
237 100%Cは最初からそれを考慮したCPUならできる ←キ
238 237はシッタカ
240 特権命令は?Cプログラムが動き出せる準備は?
241 大半は100% ←キ
243 スタートアップ不要のmainとは?
244 OSの話だよ?
247 話を逸らすな
248 スタートアップだOSじゃない ←キ >>248
>OS 100%は無理
そこも気合いでなんとかなりますぜ!
※気合いとは、次みたいなコードもCとみなしてしまう心意気を指す
int main=195; >>240の
一行目は特権命令の話
二行目はスタートアップの話
に見える >>251
違う
スタートアップの話なんざしてねえよ
おまえベアメタルの経験ゼロだな いや、
どっちかっていうと趣味みたいなもんで
いろんなCPUでやってるけど
ただ単に
Cプログラムが動き出せる最低限の条件
と書いてあるんだからOS起動ではないでしょ 話の発端からずっとOSの話で
シッタカを指摘されて悔しくて悔しくて仕方なくて
スタートアップの話に逸らそうとしているのが約1名いるが Cプログラムと書いてあるんだからCプログラムだろ
OSが起動出来る十分条件ではなく、必要条件の1個
特権命令もその一つ
もっとも特権命令が存在しないCPUや使わなくてもOSがつくれるCPUがあるので
必要条件ではないけど ベアメタルであれば尚更main関数を呼び出す前に割込みベクターやスタックポインタの初期化などいろいろ準備が必要だろ
OSに頼れないので自分で準備しないとC
のプログラムは動き出せない とりあえずCでOSでスレが活性化することはわかった。機会があったら他の掲示板でもやってみよう。 >>250
レギュレーション違反ですw
>>236
> バイナリコード直接記述?
> それはC言語で記述とは言わないような >>257
最近のプロセッサはスタックポインタの初期値はリセット時に決められた番地から読み出すことが多いと思う
割り込みベクタはメモリーに書けばいいだけじゃね? >>261
>スタックポインタの初期値はリセット時に決められた番地から読み出す
プログラムカウンタの方じゃないですか? そのメモリ、いやもっと言えばバスの初期化はいつ誰がやるのかと。 >>257
それってすなわちスタートアップコードですよね?
何度も書くけどスタートアップコードを全てCで書けるマイコンは今時珍しくないんですよ >>264
>>236の内容に加えてpragma疑似命令もC言語で記述とは言わないと思う
C言語の構文だけではスタートアップの記述は無理だろう >>262
68KとかARM Cortex M
0x00000000~3 ⇒ SP
0x00000004~7 ⇒ PC Cだけで起動できるCPUって、まさかとは思うがPICじゃねえだろうなwww ROM/RAM内蔵のMCUとROM/RAM外付けのMPUのでは前提が違うので議論が噛み合わない。
>>257や>>263は後者の話をしている。 PICと言った意味も通じてねえな、こりゃw
まさかの更に下をくぐりやがった OSの無い組み込み環境なんて山ほど存在してて、その環境の中で全部Cのもで書いてるとこも存在してる
そもそもOS入れられるような環境とは言えないけど、こういうとこでCで書いてるものにOS的な動作をさせればそれはCのみで作ったOSと言えるのか?
おそらくどこからどこまでがOSの領域か?がずれてるから延々と罵り合いになるのでは? ARMとかRXとかSHとか...
スタートアップ含めCだけで書ける
(全ての環境でとは言わないけど) 組み込み用の処理系についてはメーカ独自拡張の独壇場
コンパイラ本体は
__section
__bank
__interrupt
など独自拡張多し
プリプロセッサも
#pragma
で設定弄らないといけないので注意 スタートアップファイルはC言語のような殆ど何か別言語に近い感覚 >>276
そのスタートアップはどうやって起動するんだよ >>273
PIC8からPIC32まであるのにPICだけで話が通じると思ってるのはちょっと世間知らずすぎる >>276
具体的な環境書いてみ
configでスタートアップルーチンを生成してるとかのオチじゃないよね? いまなら、C言語だけで書いたOSをUEFI でロードして起動するとかできるだろ?
C言語で書けない操作は UEFI 側で設定したものをそのまま使う PC-88/98のFDブートはFDの最初のセクタから256バイト読み込んで実行するんだっけ?
そのプログラム書くのに適したCコンパイラってあるの? ヒヨッ子が物を知らねえのは別にいいんだよ、当たり前
シッタカこくのと指摘されてからの逆ギレが攻撃対象になるんだ >>283
gccの場合は自動的にcrt0-efi-x86_64.Sをリンクするようだが ものづくりC言語熟おいしい!一番好きなバーガーです!! って言ってほしいのか? C言語のポインタはCPU機械語における間接アドレシングの抽象化だろ?
それ以上でも以下でも無い >>284
ないです。
余りにもバイト数が少なすぎるので手書きです。
手書きでもバイト数に気をつけて書く必要があります。 >>296
インクリメントは良く出来てるな
あとポインタのポインタと配列へのポインタの文法を混乱して覚えてる人が居て
そいつらのせいで劣化コピーが出回ってるのがさらなる混乱の原因
正しく理解して正しく使えばCのポインタは何も難しくない >>299
劣化コピーの具体例をよろしく
この文章だけだと何が問題なのかさっぱりわからん 二次元配列は二重ポインタで扱うという自分の勘違いを正当化したくて
mallocでポインタの配列を作るやり方を唯一正統と強弁するアホが
fjで暴れてたな、そういえば ポインタのポインタ **p
配列へのポインタ (*p)[]
ポインタの配列 *p[] >>300 みたいなのを炙り出せたのであれば
レスに意味があったと言えよう >>301
めんどいだけでポインタのポインタでも2次元配列かけるでしょ?
勘違いってどういうとこ? >>304
本人か?
char a[2][2],**b=a;
これが勘違いでないとまだぬかすか?
頭がバカなのか、それともトンマなのか、どっちだ? >>299
アセンブラやったことのない人は中々正しく理解できないようで、それでポインタの事だけ書いてある本が沢山出ちゃうんだろうな。 何年も書かないと忘れるな〜
ポインタのポインタは、ポインタの値を参照渡しするときくらいしか思いつかん
char *p;
foo(&p);
void foo(char **p) {…}
みたいな、
305のような書き方はピンとこないわ >>304
書けるかどうかじゃなくて
> 唯一正統と強弁するアホが
いたって話でしょ int a=0;
int *pa=&a;
int **ppa =&pa;
int ***pppa = &ppa; でもこういう関数だとポインタだけでやりたくなる
mul(double** x, double** y, int n, int m){
mul(double x[][20], double y[][20], int n, int m){ 関数の引数に限って言えば
func(**p)
func(*p[])
func(p[][])
func(p[][10])
どれでも同じ
引数として配列を引き渡す方法はない
どれも先頭要素へのポインタが値渡しされる
関数側で引数がポインタへのポインタ(いわゆる二重ポインタ)なのか、ポインタの配列なのか、配列の配列(いわゆる二次元配列) なのか区別する手段はない
引数に配列として要素数を渡してもエラーにはならないだけで無視される どこから突っ込んでいいやら・・・
出鱈目にも程があるぜ 関数の宣言文で説明だけなので変数型を省略してるだけだろ
配列の変数名がpならば呼び出しは
func(p)
でもいける
結局は先頭アドレスさえ渡せれば何でもいい ■ このスレッドは過去ログ倉庫に格納されています