C言語なら俺に聞け 153

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ 5fba-LL4R)
垢版 |
2019/08/17(土) 23:02:42.00ID:tN5mSQYg0
C言語の話題のみ取り扱います C++の話題はC++スレへ
質問には最低限の情報(ソース/コンパイラ/OS)を付ける
数行で収まらないソースは以下を適当に使ってURLを晒す
https://paiza.io/
https://ideone.com/
http://codepad.org/

C11
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf

C99
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf
http://kikakurui.com/x3/X3010-2003-01.html

C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/

JPCERT C コーディングスタンダード
https://www.jpcert.or.jp/sc-rules/
-
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
※前スレ
C言語なら俺に聞け 152
https://mevius.5ch.net/test/read.cgi/tech/1560763630/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2019/11/17(日) 16:08:09.90ID:Mp5WsRX6d
>>240
一行目は特権命令の話
二行目はスタートアップの話
に見える
2019/11/17(日) 16:20:24.24ID:cZKVuoHK0
>>251
違う
スタートアップの話なんざしてねえよ
おまえベアメタルの経験ゼロだな
2019/11/17(日) 16:31:19.54ID:Mp5WsRX6d
いや、
どっちかっていうと趣味みたいなもんで
いろんなCPUでやってるけど

ただ単に
Cプログラムが動き出せる最低限の条件
と書いてあるんだからOS起動ではないでしょ
2019/11/17(日) 16:47:01.78ID:cZKVuoHK0
話の発端からずっとOSの話で
シッタカを指摘されて悔しくて悔しくて仕方なくて
スタートアップの話に逸らそうとしているのが約1名いるが
2019/11/17(日) 16:58:35.66ID:Mp5WsRX6d
Cプログラムと書いてあるんだからCプログラムだろ
OSが起動出来る十分条件ではなく、必要条件の1個
特権命令もその一つ
もっとも特権命令が存在しないCPUや使わなくてもOSがつくれるCPUがあるので
必要条件ではないけど
2019/11/17(日) 17:01:55.70ID:Mp5WsRX6d
OS起動ならOS起動と書くだろう
2019/11/17(日) 17:02:57.82ID:0F7CIe0FM
ベアメタルであれば尚更main関数を呼び出す前に割込みベクターやスタックポインタの初期化などいろいろ準備が必要だろ
OSに頼れないので自分で準備しないとC
のプログラムは動き出せない
258デフォルトの名無しさん (アウアウウー Sa45-nhir)
垢版 |
2019/11/17(日) 17:04:33.98ID:8gWobnsKa
さて、次にどんな燃料を投下すれば炎上するか・・・
259デフォルトの名無しさん (アウアウウー Sa45-nhir)
垢版 |
2019/11/17(日) 17:06:07.28ID:8gWobnsKa
とりあえずCでOSでスレが活性化することはわかった。機会があったら他の掲示板でもやってみよう。
2019/11/17(日) 18:37:16.77ID:SNu9npot0
>>250
レギュレーション違反ですw

>>236
> バイナリコード直接記述?
> それはC言語で記述とは言わないような
2019/11/17(日) 18:42:52.80ID:SNu9npot0
>>257
最近のプロセッサはスタックポインタの初期値はリセット時に決められた番地から読み出すことが多いと思う
割り込みベクタはメモリーに書けばいいだけじゃね?
2019/11/17(日) 18:50:25.01ID:kPaO6TXK0
>>261
>スタックポインタの初期値はリセット時に決められた番地から読み出す
プログラムカウンタの方じゃないですか?
2019/11/17(日) 18:53:56.89ID:q2lewe9O0
そのメモリ、いやもっと言えばバスの初期化はいつ誰がやるのかと。
2019/11/18(月) 00:18:37.90ID:FmL1TMPdd
>>257
それってすなわちスタートアップコードですよね?
何度も書くけどスタートアップコードを全てCで書けるマイコンは今時珍しくないんですよ
2019/11/18(月) 00:21:29.64ID:FmL1TMPdd
>>263
>>264
2019/11/18(月) 03:24:34.33ID:7xBgQ7dd0
>>264
>>236の内容に加えてpragma疑似命令もC言語で記述とは言わないと思う
C言語の構文だけではスタートアップの記述は無理だろう
2019/11/18(月) 05:02:13.80ID:lwVIqPwD0
>>262
68KとかARM Cortex M
0x00000000~3 ⇒ SP
0x00000004~7 ⇒ PC
2019/11/18(月) 07:58:00.65ID:skAn5Z6md
Cだけで起動できるCPUって、まさかとは思うがPICじゃねえだろうなwww
2019/11/18(月) 08:51:34.79ID:G/ZMLQZPx
ROM/RAM内蔵のMCUとROM/RAM外付けのMPUのでは前提が違うので議論が噛み合わない。
>>257>>263は後者の話をしている。
2019/11/18(月) 08:57:47.13ID:skAn5Z6md
メモリの接続方法なんか全然関係ない
おまえアホか
2019/11/18(月) 09:02:39.86ID:skAn5Z6md
PICと言った意味も通じてねえな、こりゃw
まさかの更に下をくぐりやがった
2019/11/18(月) 09:05:45.96ID:tFTaAL8Z0
OSの無い組み込み環境なんて山ほど存在してて、その環境の中で全部Cのもで書いてるとこも存在してる
そもそもOS入れられるような環境とは言えないけど、こういうとこでCで書いてるものにOS的な動作をさせればそれはCのみで作ったOSと言えるのか?
おそらくどこからどこまでがOSの領域か?がずれてるから延々と罵り合いになるのでは?
2019/11/18(月) 09:24:05.89ID:skAn5Z6md
ほらな、やっぱりPICと言った意味が通じてないw
274デフォルトの名無しさん (ワッチョイ e9aa-coos)
垢版 |
2019/11/18(月) 09:59:14.55ID:FeTeb+YA0
私のために争わないで!
2019/11/18(月) 10:07:53.61ID:sZ0WVu3/d
最近PICを覚えたの?
2019/11/18(月) 10:13:12.39ID:sZ0WVu3/d
ARMとかRXとかSHとか...
スタートアップ含めCだけで書ける
(全ての環境でとは言わないけど)
2019/11/18(月) 10:27:02.98ID:7xBgQ7dd0
組み込み用の処理系についてはメーカ独自拡張の独壇場

コンパイラ本体は
__section
__bank
__interrupt
など独自拡張多し

プリプロセッサも
#pragma
で設定弄らないといけないので注意
2019/11/18(月) 10:37:04.01ID:7xBgQ7dd0
スタートアップファイルはC言語のような殆ど何か別言語に近い感覚
2019/11/18(月) 11:31:43.74ID:skAn5Z6md
>>276
そのスタートアップはどうやって起動するんだよ
280デフォルトの名無しさん (アウアウウー Sa45-nhir)
垢版 |
2019/11/18(月) 12:06:28.17ID:vV3s+CrDa
ピクピク
2019/11/18(月) 12:28:42.25ID:S9/8fJfLM
>>273
PIC8からPIC32まであるのにPICだけで話が通じると思ってるのはちょっと世間知らずすぎる
2019/11/18(月) 12:29:47.29ID:S9/8fJfLM
>>276
具体的な環境書いてみ
configでスタートアップルーチンを生成してるとかのオチじゃないよね?
2019/11/18(月) 12:31:32.89ID:fft3f69BM
いまなら、C言語だけで書いたOSをUEFI でロードして起動するとかできるだろ?
C言語で書けない操作は UEFI 側で設定したものをそのまま使う
2019/11/18(月) 12:39:27.00ID:1LpBylKv0
PC-88/98のFDブートはFDの最初のセクタから256バイト読み込んで実行するんだっけ?
そのプログラム書くのに適したCコンパイラってあるの?
285デフォルトの名無しさん (アウウィフ FF45-/Df3)
垢版 |
2019/11/18(月) 12:59:12.61ID:ahZzeXy3F
CP/MにはBDSCが定番だった
2019/11/18(月) 13:14:35.59ID:IDpLc7eed
>>279
人に聞かないで自分で調べて
2019/11/18(月) 13:15:54.90ID:skAn5Z6md
>>282
俺もそんなことだろうと見ているw
2019/11/18(月) 13:23:20.40ID:IDpLc7eed
本気で知りたいならそれ相応の態度で
289デフォルトの名無しさん (ワッチョイ d11d-7HT4)
垢版 |
2019/11/18(月) 14:18:07.35ID:+ljooU2/0
ビジネスで優秀な人材育成する上司は何を教えているのか?
https://www.youtube.com/watch?v=apxtSqxjw08&;t=13s
マクドナルド伝説の店長が教える、最強店長になるために必要なこと
https://www.youtube.com/watch?v=0wMbR7JIeeQ&;t=3154s
「最強の働き方」長時間労働やノウハウよりも大切なこと
https://www.youtube.com/watch?v=JnMHbI1-e3E&;t=3606s
美容師の楽しさ再発見!やる気スイッチが入る働き方セミナー
https://www.youtube.com/watch?v=DGzXQT799oY
視覚障がいを乗り越えた活法家
https://www.youtube.com/watch?v=6IuY_K3uFdo&;t=805s
2019/11/18(月) 20:40:54.63ID:oSLwFt1+0
ヒヨッ子が物を知らねえのは別にいいんだよ、当たり前
シッタカこくのと指摘されてからの逆ギレが攻撃対象になるんだ
2019/11/18(月) 20:50:41.53ID:Zo9NWI12M
>>283
gccの場合は自動的にcrt0-efi-x86_64.Sをリンクするようだが
292デフォルトの名無しさん (アウアウウー Sa45-coos)
垢版 |
2019/11/18(月) 20:54:33.04ID:Ufz4tuHsa
ものづくりC言語熟ってサイトいいじゃん!
2019/11/18(月) 21:03:14.01ID:UWPzTs1l0
ものづくりC言語熟おいしい!一番好きなバーガーです!! って言ってほしいのか?
294デフォルトの名無しさん (アウアウウー Sa45-coos)
垢版 |
2019/11/18(月) 21:06:39.12ID:Ufz4tuHsa
>>293
もしかしてキ○ガイ?
295デフォルトの名無しさん (ワッチョイ 1102-coos)
垢版 |
2019/11/18(月) 21:29:13.55ID:9xSA7Xxe0
ものづくりC言語塾のポインタの説明わけわからん
296デフォルトの名無しさん (ワッチョイ 2905-n3bN)
垢版 |
2019/11/18(月) 22:06:08.02ID:WvhlQmiy0
C言語のポインタはCPU機械語における間接アドレシングの抽象化だろ?
それ以上でも以下でも無い
2019/11/18(月) 22:11:27.28ID:Vzii0sJA0
>>284
ないです。
余りにもバイト数が少なすぎるので手書きです。
手書きでもバイト数に気をつけて書く必要があります。
2019/11/19(火) 00:13:05.05ID:SDEP65Ha0
それ以上もそれ以下もそれを含む
299デフォルトの名無しさん (ワイーワ2 FFca-/nAh)
垢版 |
2019/11/19(火) 12:48:33.17ID:8naC8O/UF
>>296
インクリメントは良く出来てるな

あとポインタのポインタと配列へのポインタの文法を混乱して覚えてる人が居て
そいつらのせいで劣化コピーが出回ってるのがさらなる混乱の原因

正しく理解して正しく使えばCのポインタは何も難しくない
2019/11/19(火) 13:21:56.35ID:lt+0x6jod
>>299
劣化コピーの具体例をよろしく
この文章だけだと何が問題なのかさっぱりわからん
2019/11/19(火) 13:26:52.18ID:O502C4IMd
二次元配列は二重ポインタで扱うという自分の勘違いを正当化したくて
mallocでポインタの配列を作るやり方を唯一正統と強弁するアホが
fjで暴れてたな、そういえば
2019/11/19(火) 13:59:41.39ID:9idMfLVKM
ポインタのポインタ **p
配列へのポインタ (*p)[]
ポインタの配列 *p[]
303デフォルトの名無しさん (ワイーワ2 FFca-/nAh)
垢版 |
2019/11/19(火) 14:08:13.34ID:8naC8O/UF
>>300 みたいなのを炙り出せたのであれば
レスに意味があったと言えよう
2019/11/19(火) 19:58:13.32ID:r9zE5eVQM
>>301
めんどいだけでポインタのポインタでも2次元配列かけるでしょ?
勘違いってどういうとこ?
2019/11/19(火) 20:13:13.80ID:O502C4IMd
>>304
本人か?
char a[2][2],**b=a;
これが勘違いでないとまだぬかすか?
頭がバカなのか、それともトンマなのか、どっちだ?
2019/11/19(火) 20:14:48.63ID:r9zE5eVQM
>>305
そんなん知らんわ
予想の斜め上だ
307デフォルトの名無しさん (アウアウウー Sa45-nhir)
垢版 |
2019/11/19(火) 20:16:56.03ID:c65LTQ+sa
>>299
アセンブラやったことのない人は中々正しく理解できないようで、それでポインタの事だけ書いてある本が沢山出ちゃうんだろうな。
308デフォルトの名無しさん (アークセー Sx11-9KXC)
垢版 |
2019/11/19(火) 21:33:52.66ID:pHwegslWx
何年も書かないと忘れるな〜

ポインタのポインタは、ポインタの値を参照渡しするときくらいしか思いつかん

char *p;
foo(&p);

void foo(char **p) {…}

みたいな、
305のような書き方はピンとこないわ
2019/11/19(火) 21:36:01.90ID:+Tz70BZqM
>>304
書けるかどうかじゃなくて
> 唯一正統と強弁するアホが
いたって話でしょ
2019/11/19(火) 21:49:57.72ID:3qWxJKAv0
int a=0;
int *pa=&a;
int **ppa =&pa;
int ***pppa = &ppa;
2019/11/19(火) 22:00:51.47ID:JHNr41O80
でもこういう関数だとポインタだけでやりたくなる

mul(double** x, double** y, int n, int m){

mul(double x[][20], double y[][20], int n, int m){
2019/11/19(火) 22:37:16.16ID:SDEP65Ha0
const 付けない系?
2019/11/19(火) 22:47:26.54ID:8ta2T3rG0
また関係ないことを・・・
2019/11/20(水) 05:59:16.05ID:6t1gUx2GM
関数の引数に限って言えば
func(**p)
func(*p[])
func(p[][])
func(p[][10])
どれでも同じ
引数として配列を引き渡す方法はない
どれも先頭要素へのポインタが値渡しされる
関数側で引数がポインタへのポインタ(いわゆる二重ポインタ)なのか、ポインタの配列なのか、配列の配列(いわゆる二次元配列) なのか区別する手段はない
引数に配列として要素数を渡してもエラーにはならないだけで無視される
2019/11/20(水) 06:42:28.35ID:06vL+ArYd
どこから突っ込んでいいやら・・・
出鱈目にも程があるぜ
2019/11/20(水) 07:18:49.43ID:CxWhIUNe0
関数の宣言文で説明だけなので変数型を省略してるだけだろ
配列の変数名がpならば呼び出しは
func(p)
でもいける
結局は先頭アドレスさえ渡せれば何でもいい
2019/11/20(水) 07:45:40.36ID:uVU8YbeSF
[][]なんて構文あるかヴォケ
318デフォルトの名無しさん (アウアウウー Sa45-nhir)
垢版 |
2019/11/20(水) 09:49:56.67ID:gQNT2Wxfa
>>314
プロトタイプ宣言しておけばC言語としては違う状態になるよ。
2019/11/20(水) 10:34:34.94ID:CxWhIUNe0
プロトタイプ宣言では状態を区別はしない

プロトタイプ宣言
void func(char *p[]);

関数定義
void func(char **p) {}


https://i.imgur.com/mMQGNga.png
320デフォルトの名無しさん (ワイーワ2 FFca-/nAh)
垢版 |
2019/11/20(水) 12:01:08.83ID:grCkJCm3F
>>308
あほか
>>305 は間違いの例だから
ピンと来なくて当然
321デフォルトの名無しさん (ワイーワ2 FFca-/nAh)
垢版 |
2019/11/20(水) 12:06:59.82ID:grCkJCm3F
>>311
何を目的に書いてるのか知らんが

A: mul(double** x, double** y, int n, int m){

B: mul(double x[][20], double y[][20], int n, int m){

C: mul(double (*x)[20], double (*y)[20], int n, int m){

AとBは等価じゃないぞ
2019/11/20(水) 13:41:25.47ID:CxWhIUNe0
変数としてのxは
A:double型のポインタを指すポインタ
B:double型の配列を要素とする配列の先頭要素を指すポインタ
C:double型の配列を指すポインタ

関数の引数としてのxは
A,B,Cすべてdouble型の参照オブジェクト(何でもいい)を指すポインタ
2019/11/20(水) 15:18:17.42ID:7Jz+3SpEa
>>322
>>321のxのことを言ってるのなら、基礎からやり直せ。
2019/11/20(水) 15:27:36.91ID:CxWhIUNe0
まあ実際C:のような例は見たことはないけど、少なくともA:とB:は関数の引数としては同じと解釈される
中身は受け取った関数側でプログラマが処理する事案であってdouble型の何かを指すポインタという以上の意味はない
2019/11/20(水) 15:59:50.97ID:jGIPXiJ00
分かりきった固定要素数の配列を渡すのはいっかい struct で包んじゃうわ

struct foo {
double array[20];
};

mul(struct foo* x, struct foo* y, ...)
326デフォルトの名無しさん (アウウィフ FF45-/Df3)
垢版 |
2019/11/20(水) 16:26:53.96ID:ACUpjjQJF
>>311 しね
>>324 お前は黙ってろ
2019/11/20(水) 16:40:06.35ID:6t1gUx2GM
>>323,326
ただの罵倒ではなくてもう少し有益なレスしろよ
2019/11/20(水) 16:50:21.31ID:VaHfdLQca
>>324
A,Bそれぞれのsizeof(x)やx+1について、値や型を比較してみろよ。意味が違うことがわかるから。
329デフォルトの名無しさん (アウウィフ FF45-/Df3)
垢版 |
2019/11/20(水) 16:54:14.17ID:ACUpjjQJF
>>327
>>314 func(p[][])
似たようなもんだな
2019/11/20(水) 17:02:30.65ID:CxWhIUNe0
>>328
一応言っておくけど>>322の通り変数のxは意味が違う
関数の引数の場合だけ状況が変わる
*p[]と*ppが同義なのは引数の場合だけ
>>319の通りプロトタイプ宣言と関数定義の両方で混在しても問題ない
2019/11/20(水) 17:03:37.18ID:CxWhIUNe0
訂正
**p ← *pp
332デフォルトの名無しさん (アウアウウー Sa45-nhir)
垢版 |
2019/11/20(水) 17:18:03.94ID:gQNT2Wxfa
>>324
いや。AとBは違う。
333デフォルトの名無しさん (アウウィフ FF45-/Df3)
垢版 |
2019/11/20(水) 17:19:03.29ID:ACUpjjQJF
>>330
>>319 の言ってるのは >>322 のとは違うだろ

これは正しい
>プロトタイプ宣言 void func(char *p[]);
>関数定義 void func(char **p) {}

これは間違い
>プロトタイプ宣言 void func(char p[][20]);
>関数定義 void func(char **p) {}
334デフォルトの名無しさん (アウアウウー Sa45-nhir)
垢版 |
2019/11/20(水) 17:36:55.77ID:gQNT2Wxfa
その通り
2019/11/20(水) 17:38:35.24ID:CxWhIUNe0
納得
そりゃそーだ
すまんかった
336デフォルトの名無しさん (アウアウクー MMd1-+hLn)
垢版 |
2019/11/20(水) 18:37:56.75ID:lnMf/X4/M
初めて書き込む初心者ですが
配列存在そのものがポインタと違う
という話と
ポインタとして渡して同じように扱える
という話の食い違いをしてるのですか?
337デフォルトの名無しさん (アウウィフ FF45-/Df3)
垢版 |
2019/11/20(水) 19:19:34.26ID:ACUpjjQJF
ポインタの配列はポインタのポインタとして扱えるが
配列へのポインタはポインタのポインタとして扱ってはいけないって話
そりゃ無理に使おうとすれば使えない訳じゃないが止めた方が良い
2019/11/20(水) 19:45:26.72ID:/a5mIgHWd
char a[2][2];
これは a[0][0], a[0][1], a[1][0], a[1][1] の順にcharが4個ならんだデータ

char *b[2] = {a[0], a[1]};
という配列をaとは別に作ってはじめて
char **として扱える
2019/11/20(水) 19:47:17.62ID:/a5mIgHWd
aは(中身は)4このデータの先頭アドレスで
bはアドレスの配列の先頭アドレス

データが異なるので無理やりキャストしてもダメ
340デフォルトの名無しさん (アウアウウー Sa45-nhir)
垢版 |
2019/11/20(水) 20:34:14.51ID:gQNT2Wxfa
そしてまたポインタ解説本が一冊増えるのであった
2019/11/20(水) 21:23:45.88ID:QqNmmDM2x
>>320
何だそうか、親切にありがとう!
2019/11/25(月) 13:03:01.01ID:pSQ/T/wR0
私はC言語の神だ
何か私に聞きたいことはあるか?
343デフォルトの名無しさん (ワイーワ2 FF63-KqLj)
垢版 |
2019/11/25(月) 13:13:12.61ID:pjJuONFZF
余命何年かな
2019/11/25(月) 13:18:38.97ID:pSQ/T/wR0
余命は3152578641だ
2019/11/25(月) 13:20:19.58ID:FcoOoav6d
なんで & より == の方が強い?
なんで func と &func 両方とも関数へのポインタ
なんで char の符号有無を規定しなかった?
2019/11/25(月) 13:22:22.93ID:pSQ/T/wR0
プログラマーは万能である
で、あれば、それらは些細なことだ
2019/11/25(月) 14:10:49.09ID:ZBE9lLbs0
>>345
===は比較演算子で、&はビット演算子(扱いは算術演算子と大差ない)だから。
funcと&funcが同じなのは単なるシンタックスシュガー。 配列のそれと変わらん。
charは符号もへったくれも無かったため。 最上位がパリティなことも多かったし。
348デフォルトの名無しさん (ワイーワ2 FF63-KqLj)
垢版 |
2019/11/25(月) 14:13:37.69ID:pjJuONFZF
char hoge[10][10];
があったとして
hoge と &hoge[0][0] が一緒なのは判るが
&hoge とか hoge[0][0] は一緒じゃない
2019/11/25(月) 14:40:15.02ID:xlCLCIdV0
算術演算子と大差無いと言うならなおさら優先順位が逆転するのは不思議
つうか神様への質問なんだからなんでそういう仕様になったかを答えてほしんでしょ
2019/11/25(月) 15:00:15.21ID:Nb9YSlRod
>>347
===って、Bにあったやつか?
等値比較代入
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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