C言語なら俺に聞け 155

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ 76ba-P5bm)
垢版 |
2020/05/10(日) 23:20:27.99ID:Z3WQBr9X0
!extend:checked:vvvvv:1000:512
(新スレ立ての際上記コマンドを2行書き込んでください)
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/

※前スレ
C言語なら俺に聞け 154
https://mevius.5ch.net/test/read.cgi/tech/1578997950/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2020/05/29(金) 19:15:47.50ID:6E0tm9y70
>>114 本当に単純なサブルーチン呼び出し風なら
サブルーチンに相当するターゲットを順番に依存対象にしてこんな感じ。

.PHONY: main sub1 sub2

main: sub1 sub2
 @echo "and now, going main"

sub1:
 @echo "this is sub1"

sub2:
 @echo "I'm sub2"
2020/05/29(金) 19:52:57.95ID:RYBayMc0H
>>115
それ需要がありそうですね…
2020/05/30(土) 01:03:07.50ID:fWBi0L4D0
>>116
おお、なるほど
こんなんでいいのか
助かったよサンクス
119デフォルトの名無しさん (ラクッペペ MM4b-eKGp)
垢版 |
2020/06/01(月) 09:59:41.94ID:ruvyvZ5aM
てす
2020/06/01(月) 23:23:12.08ID:GR8q4A/e0
グローバル変数で、
char A[4], B[4];
と宣言したら、メモリ中でAのすぐ隣にBが来ることは保証されているんですか?
例えば、Aはインデックスが0から3までですが、この範囲を超えてA[4]に
アクセスしたら、それはB[0]にアクセスしたことになるんですか?
2020/06/01(月) 23:30:59.93ID:K8qQM5W10
環境依存でどっちに配置されるかの保証はなかったような
2020/06/01(月) 23:46:04.68ID:idPskxLG0
>>120
範囲を超えたアクセスは未定義動作。順序どころか隣接する保証もないよ。
2020/06/02(火) 00:09:21.50ID:xK3L40dza
自分で保証するしかないよ
2020/06/02(火) 07:03:39.55ID:0laQbiBy0
>>120
順序や隣接を保証したいなら struct を使うとか
2020/06/02(火) 09:08:00.49ID:6Rv/5LNl0
その場合もパディングについては知っておかないと。
2020/06/02(火) 09:46:07.68ID:t1gowtwYd
荒井さんがケツに詰め物してくるねんで
127デフォルトの名無しさん (ブーイモ MMab-S7K8)
垢版 |
2020/06/02(火) 10:04:47.98ID:OudFIOlRM
char A[8];
char *const B=&A[4];
でいいじゃんなにが問題なの?
2020/06/02(火) 10:15:18.47ID:6Rv/5LNl0
>>127
質問者のやりたいことはおそらくそれで事足りるとは思う。
問題があるとすればsizeof(A), sizeof(B)の値が当初の書き方と異なるとかかな。
2020/06/02(火) 12:31:18.57ID:9wo5PvtnM
質問者は隣接して欲しくないのだろう。
130デフォルトの名無しさん (ワイーワ2 FFa3-1zQY)
垢版 |
2020/06/02(火) 13:00:39.48ID:nij7NU0AF
ゴールポストが動き始めましたω
2020/06/02(火) 13:13:15.29ID:LaW3uxXL0
× 隣接する前提で突破させてアクセスしたい
△ どうも B[0] の値がいつのまにか変わっちゃってるんだけど A[]で突破して書き込んだ可能性をチェックしたほうがいい?
132デフォルトの名無しさん (ワッチョイ 9302-YHRm)
垢版 |
2020/06/02(火) 13:23:37.03ID:iAkpbabl0
配列操作の関数とかで
void func(int data[], int size){
for(int i = 0; i < size; i++)data[i] = 111;
}
みたいな関数って
void func(int *data, int size){
for(int i = 0; i < size; i++)data[i] = 111;
}
って書いても動くけど、何が違うのですか?
書き方違うだけでまったく同じ?
2020/06/02(火) 13:27:57.83ID:LaW3uxXL0
文法上は違いがなく同じ どっちで書いてもいい
* ではなく [ ] をあえて使って配列ですよと強調することはある
134デフォルトの名無しさん (ワッチョイ 9302-YHRm)
垢版 |
2020/06/02(火) 13:28:49.67ID:iAkpbabl0
ありがとう
135デフォルトの名無しさん (JP 0Ha3-7GQX)
垢版 |
2020/06/02(火) 14:06:09.30ID:G0GLY7QlH
IT掲示板群 ttp://x0000.net/forum.aspx?id=15

学術の巨大掲示板群 - アルファ・ラボ ttp://x0000.net
数学 物理学 化学 生物学 天文学 地理地学
IT 電子 工学 言語学 国語 方言 など

simulationライブラリで純粋な関数式プログラミングをする
ttp://x0000.net/topic.aspx?id=3631-0
UIライブラリ (C#, 2D) を作ったよ
ttp://x0000.net/topic.aspx?id=3688-0
連続と離散を統一した!
ttp://x0000.net/topic.aspx?id=3709-0
4Dエンジン(画像有り)
ttp://x0000.net/topic.aspx?id=3677-0
matrixのライブラリ
ttp://x0000.net/topic.aspx?id=3711-0
ある強力なFor関数
ttp://x0000.net/topic.aspx?id=3630-0
SQLライブラリ
ttp://x0000.net/topic.aspx?id=3675-0

PS malloc / free を実装してみた (C#)
ttp://up.x0000.net/files/TMallocTest.zip
2020/06/02(火) 18:13:46.15ID:eZHppilZ0
どう間違ってもsizeof data == sizeof(int *)にしかならんものなのに
白々しくモロバレな嘘を書くことはあるね、確かに
2020/06/02(火) 18:57:14.62ID:lElu+09V0
>>127
うまいですねー
138デフォルトの名無しさん (エムゾネ FFea-hy1p)
垢版 |
2020/06/03(水) 09:03:39.06ID:wbZbutmLF
まじめにやると
union{
char A[8];
struct{
char A[4];
char B[4];
}S;
}U;
139デフォルトの名無しさん (エムゾネ FFea-hy1p)
垢版 |
2020/06/03(水) 09:11:25.16ID:wbZbutmLF
蛇足でついでにテスト
http://codepad.org/TOo6U3jn
2020/06/03(水) 10:41:18.77ID:OT4MJN130
#pragma packや__attribute__((packed))は使わなくてよいの?
2020/06/03(水) 15:06:51.95ID:sI0nXA5M0
パディングのせいで上手くいくとは限らない(というが大抵の場合うまくいかない)
ってのは>>125が指摘してるのな
142デフォルトの名無しさん (ワッチョイ 99ad-8EEL)
垢版 |
2020/06/03(水) 23:54:54.10ID:s2kYPv500
C言語は得意だぞ笑
何でも聞いてくれ!
2020/06/04(木) 00:21:55.42ID:0jbM0LQ+0
スリーサイズを
2020/06/04(木) 04:52:41.39ID:+EhwVkpj0
char、short、long
145デフォルトの名無しさん (ワッチョイ caad-DtfW)
垢版 |
2020/06/04(木) 08:57:07.42ID:Cmh9rlbL0
>>138
それって言語仕様としてはうまくいくと保障できる?
2020/06/04(木) 10:08:24.56ID:85VTz4/e0
構造体はメンバの配置順を保証し、共用体は同一アドレスから開始を保証する
charなので境界調整要求が1でパディングに邪魔されることもない
2020/06/04(木) 10:45:21.20ID:TPmiBK6gM
charだからといってバイト境界が1になるという保証は無い
2020/06/04(木) 10:53:00.07ID:Rfl/DppQM
隣接するcharの間にパディングされるとしたらどんな場合なの?
149デフォルトの名無しさん (ワッチョイ 99ad-s6un)
垢版 |
2020/06/04(木) 11:06:13.36ID:fpPgT8jn0
俺ってC言語得意だからいっぱい質問してくれると嬉しいな
150デフォルトの名無しさん (ワッチョイ 2501-B5RW)
垢版 |
2020/06/04(木) 11:20:23.30ID:KwTRcPMk0
頼もしいなヲイ。
2020/06/04(木) 11:21:45.55ID:0jbM0LQ+0
「愛してる」ってC言語で言ってみて
152デフォルトの名無しさん (ワッチョイ 2501-B5RW)
垢版 |
2020/06/04(木) 11:41:06.99ID:KwTRcPMk0
++i;
2020/06/04(木) 12:13:43.20ID:KnAJsCkid
>>147
ハード全然わからんやつだろ
154デフォルトの名無しさん (ワッチョイ 99ad-s6un)
垢版 |
2020/06/04(木) 12:23:12.56ID:fpPgT8jn0
charは絶対1バイトになるよな
それともOSのページングの話
2020/06/04(木) 12:25:55.50ID:c/bZjxGo0
charでダメならint8_tとかじゃダメなの?
156デフォルトの名無しさん (ワッチョイ 99ad-s6un)
垢版 |
2020/06/04(木) 12:27:08.24ID:fpPgT8jn0
普通にPCで応用ソフト作ってるときにアライメントとか意識したことないわ
157デフォルトの名無しさん (ワッチョイ 99ad-s6un)
垢版 |
2020/06/04(木) 12:28:04.94ID:fpPgT8jn0
ここのスレってもしかして組み込み連中が多いのか!?
158デフォルトの名無しさん (ワッチョイ 99ad-s6un)
垢版 |
2020/06/04(木) 12:35:48.21ID:fpPgT8jn0
PCは4バイトでやりとりするからint型が一番速いというのは聞いたことがあるが、ソースコードの可読性を落としてまでintで宣言しないだろ
優先順位:可読性>>>>型による実行速度の改善
2020/06/04(木) 14:14:51.58ID:3M18ri9Na
>>148
4バイト、8バイト、16バイト境界などで配置する処理系があるかもしれない
160デフォルトの名無しさん (ワッチョイ 3e8c-tVk4)
垢版 |
2020/06/04(木) 14:19:05.16ID:86obmMrj0
Cは白飯
2020/06/04(木) 14:21:50.06ID:cftkhVEH0
なんか関わっちゃいけないやつが湧いてるな…。
2020/06/04(木) 14:34:04.88ID:797dYlrL0
>>158
32ビットCPUなら4バイト、64ビットCPUなら8バイトずつ読む
のがCPUさんにだいたい優しいんよ

ていうかワード境界またぐと例外ぶっこくCPUとかあるし
でもって例外処理で残りを読むとかで超遅くなるとかさー
2020/06/04(木) 14:42:43.40ID:xW4yRJob0
struct は アライメント1/4/8 で半端な部分はパディングする
アライメント4 で宣言順に配置する処理系
struct A1 {
char a[3];
char b[6];
int c;
};

 a 3バイトの後 1バイトパディングを挟んで
b 6バイト 2バイトパディングを挟んで
c sizeof(int) バイト
こうなる

union の中の struct だけは アライメント1 というのもない
union {
char x[100];
struct A1 a;
} foo;

struct A1 b;

foo.a と b が異なるメモリアクセスになっちまうもの
2020/06/04(木) 14:49:40.87ID:xW4yRJob0
× struct は アライメント1/4/8 で半端な部分はパディングする
 アライメント4 で宣言順に配置する処理系
○ struct は アライメント1/4/8 で半端な部分はパディングするという処理系で
 アライメント4 配置する場合

言語仕様上
構造体のメンバ間は連続したメモリ空間上にあることは保障してるけど
スキマなく詰めるとかのメンバの詰め方に関する規定は無いんでなかった?
2020/06/04(木) 18:39:41.01ID:Lshf4FuN0
昔コンシューマのセーブデータ解析してたら3バイトづつのデータが並んでて構造体定義に悩んだことあった。
166デフォルトの名無しさん (ワッチョイ 99ad-s6un)
垢版 |
2020/06/04(木) 21:07:13.12ID:fpPgT8jn0
Cユーザーってやっぱ変わった奴多いなー
ガチムチの土方って感じがするわ
2020/06/04(木) 22:35:24.51ID:0jbM0LQ+0
そうか?以前の職場は若い女性が多かったけどな
2020/06/04(木) 23:08:18.32ID:5j21ZXn/0
ボイン多(ポインタ)

なんちゃってガハハハハハハ!
2020/06/05(金) 05:07:50.58ID:EL/RRtNB0
>>165
おそらくセーブするときにバイト単位でギチギチに詰め込んでたんだろな。
容量の節約か解析避けの一環か。
ロードしたデータは扱いやすい大きさごとに並べ直して使う。
2020/06/05(金) 07:22:42.00ID:Ic9kRMZ70
FAT12 みたいな変態パッキングもあるから、24bit のフィールドなんてマシな方。
2020/06/05(金) 12:15:43.11ID:U7lTPDC9d
8bitCPUなら24bitはごく普通
ファミコンのデータ解析したこと無い?
2020/06/05(金) 12:17:01.16ID:QzIlaRt/0
何言ってんだこのバカ
2020/06/05(金) 12:17:22.45ID:U7lTPDC9d
24bit WAVファイルも3バイトずつ
フルカラーBMPも3バイトずつ
2020/06/05(金) 13:24:39.84ID:BHpegeI70
>>171
言うほど普通ではないよね
むしろ6bitを無理やり並べるとか もっとケチってたよね
2020/06/05(金) 18:15:42.07ID:J4O8wyAo0
Base64エンコードとかbit合成するですね
2020/06/05(金) 23:17:25.55ID:HYnTNcDC0
>>154
> charは絶対1バイトになるよな
うん、8bitと限らんけどな
2020/06/05(金) 23:18:44.38ID:nyToGy4H0
1バイトの定義次第
178デフォルトの名無しさん (ワッチョイ caad-DtfW)
垢版 |
2020/06/06(土) 01:05:56.74ID:WvOhFHQn0
確か1オクテットといったら8ビットだが1バイトは8ビットとは限らないんだよな。
179デフォルトの名無しさん (ワッチョイ 99ad-tS+g)
垢版 |
2020/06/06(土) 01:11:50.49ID:P2ph+/530
おまいらほんとガチムチだな
その才能をもっと色んなジャンルに活かせよ
ゲーム解析するぐらいならCで書かれたPrologのインタプリタのソース読む方が社会的に有意義だし、カッコいいぞ
いいぞPrologは。アルゴリズム特化型言語だ
2020/06/06(土) 01:13:17.96ID:gRHlLLnD0
漢なら、マシン語
2020/06/06(土) 01:21:43.95ID:Lxl6lnvAa
8進数は、1バイトが6ビットだったことがあってこそなんだろうね
2020/06/06(土) 01:24:08.28ID:Lxl6lnvAa
おいちゃんの K&Rの表紙は、6ビットの紙テープで描かれた Cという文字だな
2020/06/06(土) 03:35:05.84ID:xnAk4BrC0
今の本?(写真3つ目)は鑽孔テープじゃないのか。
dictionarymay.cocolog-nifty.com/blog/2012/08/c-f754.html
184デフォルトの名無しさん (ワッチョイ caad-DtfW)
垢版 |
2020/06/06(土) 06:53:02.07ID:WvOhFHQn0
英語では数は3桁区切りだったもんだからつい2進数も3桁毎に区切って考えてしまったのではないかな?
2020/06/06(土) 08:12:55.01ID:EzIfGGLg0
流石にそれは無理があるw
>>181が言うように1バイトと言うか1文字が6bitで良かったから3bit x 2で管理するのが都合が良かった
なので当時のコンピュータには18bitとか36bitマシンとかもあった
その流れで16bitマシンでもパネルとかは3bit区切りになってたりする
https://www.hpmuseum.net/images/2108A-37.jpg
2020/06/06(土) 08:18:49.66ID:/D6kD8C1M
ABCDEFを数字として扱うには時代が早すぎたんだよ
2020/06/06(土) 08:31:19.90ID:maGrK2WM0
コンピュータの黎明期は、時間や角度の単位のようにいろんな約数がある方が
応用が効くと思われていたらしい。
188デフォルトの名無しさん (ワッチョイ 3e8c-tVk4)
垢版 |
2020/06/06(土) 08:56:36.69ID:sv96bxFv0
にしん御殿を建てた漁師もいた。
2020/06/06(土) 09:02:46.57ID:AQK/o2mm0
>>181
N進数自体は論理的にはNがどんな正の正数でも可能だけど、C言語的に文法上8進数が記述できるのはUNIX系のファイルシステムのパーミッションとかで使いやすいからとかでないかな。
2020/06/06(土) 09:03:53.79ID:HDxtjsAHM
C言語の整数リテラル0は8進数
2020/06/06(土) 09:54:16.10ID:URn6wcZIM
c言語で9ビットのコンピュータ使ったことあるが、頭が狂いそうになったよ
2020/06/06(土) 10:14:23.16ID:df/Ddbgs0
これまで常識だと思っていたことをあっさり否定されてしまうから?
2020/06/06(土) 11:47:23.01ID:7ywXVWZR0
>>191
そういう特殊な環境だとむしろアセンブラを使いたいな。
Cじゃ活用できないアーキテクチャになってそう。
2020/06/06(土) 12:02:30.70ID:iC9mu8GeM
組み込みだと4bitマイコンあたりはまだ現役で使われてそうだな
C言語処理系があるかどうかは知らんけど
2020/06/06(土) 12:06:28.77ID:iC9mu8GeM
ちょっとググったら何か見つかったw
https://www.renesas.com/jp/ja/products/microcontrollers-microprocessors/720.html
2020/06/06(土) 14:08:17.65ID:7ywXVWZR0
>>194
Cがあったとしても char の最少サイズは 8bit が保証されてるから、Cを使うとかえって面倒そう。
2020/06/06(土) 14:13:59.16ID:URn6wcZIM
>>192
0xffが255、0x1ffが-1になる
これだけで充分パニック
2020/06/06(土) 14:32:33.46ID:3ChBl+cga
0377=255、0777=-1 じゃない?
2020/06/06(土) 14:38:42.25ID:df/Ddbgs0
DEC PDP-7は18bitマシンだったから
2020/06/06(土) 16:36:30.29ID:75+7y3pj0
アセンブラで別のCPU勉強し直すと変に前のCPUの知識が足引っ張って戸惑う。

Z80 → x86
セグメント?概念は理解できた。記述方法よくわからん。
repって何?
byte prt ? word ptr? あ、データサイズ指定必要なんだ。

→とあるスパコンCPU
え?オペランド3つ? 
あ、0レジスタは聞いたことある。 
スタックレジタ無し?汎用レジスタで代用?
201デフォルトの名無しさん (ワッチョイ caad-wk5h)
垢版 |
2020/06/06(土) 17:08:16.80ID:WvOhFHQn0
こんなまとめ記事のようなものを発見した。

1バイトが8bitに定まったのは2008年 - Qiita
https://qiita.com/yaju/items/c5da6df2221d5c3611e0
2020/06/06(土) 20:08:01.18ID:xUUhYAg30
ソフト的に1バイトは8ビットかも知れないが、回路的には奇数アドレスは存在しないから、1バイトは16ビットなり32ビットで扱われているんだよな
2020/06/06(土) 20:16:06.02ID:M07jk5SE0
>>189
ダウト
2020/06/06(土) 20:21:12.72ID:M07jk5SE0
>>200
MIPSか?
2020/06/06(土) 20:23:53.57ID:c5HWAPmOM
> 回路的には奇数アドレスは存在しない

そんなものはマイコンのアドレスバスの接続方法による
小容量の内蔵RAMしか利用できないマイコンだと16bit単位とか効率悪すぎるだろ
2020/06/06(土) 21:05:24.00ID:xUUhYAg30
>>205
データバスが16ビットのデバイスはA0が存在しないから、奇数アドレスがないんだよ
ハードウェア的には8ビットは扱えない
上位はコンパイラーが無視してるんだろ
昔の6800系のgccは奇数アドレスが使えなかった
2020/06/06(土) 22:04:47.08ID:gPrzX488M
8ビットバスとかダイナミックバスサイジングとか無視して何言ってんの。
2020/06/07(日) 04:50:34.91ID:OwGdNnMk0
8ビットが扱えるやつのint型もエンディアンがビックかリトルかで、ややこしくなる場合がある
2020/06/07(日) 09:49:33.48ID:8XBNAcXF0
カメラ屋がどうした
2020/06/07(日) 10:16:23.75ID:H9nBLvae0
>>189
> N進数自体は論理的にはNがどんな正の正数でも可能だけど
N = 1 でやってみ
2020/06/07(日) 10:27:42.17ID:uZfe/Sta0
10進の1が00になって2が000とかかな。
2020/06/07(日) 10:50:04.35ID:u8uKtPqt0
ON/OFFはどう区別するんだ?
2020/06/07(日) 10:51:10.58ID:SnZB8S+e0
インド人もびっくり
2020/06/07(日) 11:32:40.14ID:Mh1dmxtn0
e進数
2020/06/07(日) 12:36:00.73ID:sH3MBrgqM
1進法
https://ja.m.wikipedia.org/wiki/%E4%B8%80%E9%80%B2%E6%B3%95
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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