C言語なら俺に聞け 156

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ 9bb7-/QqT)
垢版 |
2020/09/28(月) 14:41:30.00ID:QxfbhGyV0
!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言語なら俺に聞け 155
https://mevius.5ch.net/test/read.cgi/tech/1589120427/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2020/11/24(火) 11:48:49.75ID:8CcwCAVK0
デバッガーでトレースするとか
printf()出力で確認するとかしないのかな?


8bit CPUのアセンブラ時代なんてバグでハングして(ry
2020/11/24(火) 12:19:31.97ID:TYQ0nicua
実装がそうなっているだけか規格で保証されているかは全く別問題だから, 「やってみたらそうなった」に加えて規格を確認するのは重要
2020/11/24(火) 12:22:00.11ID:vTVthpTQd
>>301
そう思ってると痛い目にあう
2020/11/24(火) 13:36:23.71ID:CAtJf7/qH
>>304
だから、たいがいっつってるだろ
phpとかのろくにcsを学ばずに作った一部のアホ言語まで面倒見きれん

ともかくC言語ならではなどではない
2020/11/24(火) 13:53:18.36ID:g7Dt5dEuM
要するに短絡評価と非短絡評価
https://ja.wikipedia.org/wiki/%E7%9F%AD%E7%B5%A1%E8%A9%95%E4%BE%A1
2020/11/24(火) 17:29:31.98ID:stGCUtDe0
そこまで掘り下げなくても、単に if else 使う時の順序と関数呼出の有無
2020/11/24(火) 17:57:03.44ID:ufG8nYHfa
みなさん色々ありがとうございます

>>294
この場合はもちろん、a()が0を返した場合のことについてです

>>295
そうですよね
そうじゃないと色々困りすぎますよね

冷静になってみればアホな質問でしたすみませんでした
2020/11/25(水) 17:50:07.30ID:h9isg/D4d
>>305
C言語スレで今時の言語を語る
C言語時代の言語はたいがいの言語でCとは違うルール
2020/11/25(水) 17:58:01.33ID:rJINVE9t0
if else 辺りは、そんなに違いは無いと思うが
2020/11/25(水) 19:36:32.00ID:DcZYUINF0
if else 辺りは、PascalとCの違いが分かるところの一つなのな
2020/11/25(水) 21:51:34.65ID:vhvyuere0
> C言語時代の言語はたいがいの言語でCとは違うルール

日本語でおk
313デフォルトの名無しさん (ブーイモ MMdb-WfaT)
垢版 |
2020/11/26(木) 01:30:04.21ID:R1TSJRT3M
入れ子になって構文解析に保証回数の記述が必要なC
たぶん大抵は数珠繋ぎになって解析器はお気楽ご気楽シゴトなelseif装備言語
2020/11/26(木) 08:07:50.73ID:EOjdKX+aM
1passでコードが吐けるんじゃない限り
どこかに構文木を蓄積する必要があるんだから
何らかの上限は必ず存在する。
315デフォルトの名無しさん (ワッチョイ 6710-VxgE)
垢版 |
2020/12/09(水) 14:46:15.05ID:lKZrYGPu0
ある構造体があるメンバーを持ってるか持ってないかで場合わけってできるの?
2020/12/09(水) 15:20:51.88ID:dBVX1XEl0
C言語の話で良いのか?
マクロレベルならできるだろうが
実行時は無理だろうな
2020/12/09(水) 16:23:12.63ID:W1Z3cSFoM
>>315
C++のtemplateなら……
2020/12/09(水) 23:18:41.68ID:X6ku5mk00
テンプレートを使わないマクロで実現する方法思いつかなかったから調べてみたけど, BOOST_DECLARE_HAS_MEMBERもSFINAEで実装されてた
標準Cの規格の範囲でポータブルな実装は無理そうに思えてきた
319デフォルトの名無しさん (ワッチョイ 6710-VxgE)
垢版 |
2020/12/10(木) 08:18:36.14ID:yWf2E74j0
C言語にテンプレート機能だけつける方法ないの?
2020/12/10(木) 08:33:48.40ID:1ebLrqpT0
#include <tgmath.h>みたいの?
2020/12/10(木) 11:36:21.24ID:p57PMoZs0
>>320
学術的な分類はよく知らないけどそれはアドホック多相に分類されるものじゃないの?
テンプレートはパラメトリック多相的なものなので多相を実現するものという意味では近いけど、
使い勝手としてはそんなに近くない。

>>319
「だけ」っていっても C++ のテンプレートは C++ の型システムやなんやかんやと一体のものなので、
テンプレートだけ抜き出して C に入れるみたいなことは出来ないでしょ。
C 独自のテンプレートみたいなのを考えるくらいなら C++ を使えやって話になるだろうし。

>>315
マクロ展開は文法の解釈に先立って実行されるので、
マクロ展開時にプログラムの内容を見て分岐することは出来ない。

構造体を元にして真偽値を生成するような「展開形」を思いつけば実行時に分岐することは
出来るのかもしれないけど思いつかないなぁ。
2020/12/10(木) 13:40:39.75ID:Rt1ylxrY0
開発環境の都合で Cしかないので困ってるとすれば
C++ 食って C 吐き出す中間のコンパイラがあればいい ってことに
2020/12/10(木) 15:08:30.04ID:cFFVV66u0
>>315
構造体に手を入れられるなら、ユニークなIDを割り当てて
そのID見て、処理を切り替えて行く
2020/12/10(木) 20:09:21.68ID:CcbWokCZ0
>>317
あれ、C++も結局メンバーがなければコンパイル時に死亡するだけじゃ?
ランタイムでどうこうするわけにはいかないんじゃ...
2020/12/10(木) 21:28:27.30ID:hyB2wVsLM
>>324
sfinaeがあるので死ぬ代わりにfalseを返す関数みたいなのが作れる
ランタイムでどうこうしたければtype_info -> boolな関数を作ればいいが、型を追加するたびに変更が入ることになってtemplateほどの便利さはない
2020/12/11(金) 04:23:01.20ID:p1x0IGcK0
C++をベターCとして使う、でいいんでねい?
2020/12/11(金) 11:11:25.01ID:NpU6prgS0
>>324
(たぶん公式な用語ではないけど) ハードエラーとソフトエラーという区分がある。
テンプレートの展開に失敗してコンパイルの失敗になってしまうハードエラーと、
テンプレートの次の候補を試すソフトエラー。
で、そのソフトエラーを上手いこと利用して分岐するのが SFINAE ってわけ。

C++20 からはコンセプトが入ったのでそれもかなり楽に出来るようになった。
2020/12/11(金) 13:56:53.94ID:VMKMxeJn0
ここはC言語スレではなくC++勧誘スレになったのか
2020/12/11(金) 14:34:30.55ID:NpU6prgS0
無理やりでも C で出来るならいいんだけど、出来ないんだもの……。 しゃーない。
2020/12/11(金) 14:45:28.79ID:VMKMxeJn0
〜ならこうやれるって
一種の荒らしだからね
2020/12/11(金) 16:54:58.94ID:p1x0IGcK0
void func();
void func(int);
void func(double);
void func(void*);
auto func(int) -> enable_if_t<false, int>;
みたいな多重定義があるときに
func(1);
と呼び出されたときに、候補1つずつ
呼び出すとしたら何が起きるのかをリストアップして
void func(); //error
void func(int); //exact
void func(double);//conversion
void func(void*);//error
auto func(int) -> enable_if_t<false, void>; //error
そこからerrorになったのを外すってだけだかんな
2020/12/11(金) 17:55:15.27ID:o4C6fSAI0
C言語でどうやって多重定義を実装するのかな?
可変長引数をこねくり回せば出来るかもしれないが
2020/12/11(金) 18:02:13.48ID:NpU6prgS0
>>332
C11 から _Generic という機能で型によって自動で呼び分けることは出来る。
2020/12/11(金) 18:20:43.38ID:o4C6fSAI0
新しい機能を使うのではなく、もうちょっと工夫してみて
2020/12/11(金) 18:44:44.22ID:7UnfkYH50
何その上から目線
2020/12/11(金) 18:47:44.91ID:o4C6fSAI0
それがC言語の醍醐味
2020/12/11(金) 18:56:25.10ID:o4C6fSAI0
サバイバルナイフ一本でジャングルで暮らしていく位の気概がないとC言語は使えない
2020/12/11(金) 18:56:28.63ID:NpU6prgS0
>>334
新しいって言ってもなぁ。
今年は 2020 年なんだぞ。
2020/12/11(金) 18:57:16.38ID:o4C6fSAI0
C11スレでも立ててそこでやったら?
340デフォルトの名無しさん (ワッチョイ bf8c-9ESD)
垢版 |
2020/12/11(金) 19:36:39.77ID:Z3aKNSgT0
Cならポインタを積極的に使う。
2020/12/11(金) 19:42:20.97ID:s+Xx8Zn+0
C11の話題でわざわざ新スレとかこいつ頭おかしいの?w
2020/12/11(金) 19:48:16.88ID:o4C6fSAI0
ならば、このスレの話題は、汎用的なC言語で良いでしょう
新しい規格を話題にしたいなら、それ用のスレを立ててすれば良い
2020/12/11(金) 19:53:34.25ID:nEgtG7R60
>>342
むしろ古い規格のみを話題にしたいお前が他所に行けば円満解決だろう
2020/12/11(金) 20:09:21.63ID:o4C6fSAI0
ここは初代のC言語スレ
2020/12/11(金) 20:10:26.40ID:o4C6fSAI0
新しい規格は新しい器でどうぞ
2020/12/11(金) 21:31:36.15ID:7UnfkYH50
>>343
賛成
2020/12/11(金) 23:01:06.49ID:u7x51CWk0
>>344
アホ、>>1を見てこい

> C11
> http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf
2020/12/12(土) 09:10:37.90ID:UUApGKPR0
C21 は 2021 年に予定されてるけど、正式発効はいつものように遅くなるかなぁ。
次スレには間に合わなさそう。

細かいところで C++ に追従しているのがありがたい。
2020/12/12(土) 20:24:51.48ID:+E0Q9Nw10
テンプレ直さなきゃな
現行規格はC11ではなくC18だ
350デフォルトの名無しさん (ワッチョイ a701-RxlK)
垢版 |
2020/12/13(日) 02:41:25.02ID:3BYpAKtx0
1スレの1だけど、みんな元気だなw
2020/12/13(日) 02:52:26.43ID:dBxf4Vg90
わー、凄いですねー(棒
2020/12/17(木) 09:46:05.20ID:4VSV+Zch0
https://text.baldanders.info/remark/2016/06/code-by-hardware-engineer/
ニヤニヤ笑ってしまった
2020/12/17(木) 13:31:23.27ID:AFn1O2bR0
おれのハード屋の父親もre2cが吐いたようなコードを書いてた記憶がある
354デフォルトの名無しさん (ワッチョイ c38c-Kyli)
垢版 |
2020/12/25(金) 09:10:24.53ID:9Fso0P460
int a[6];

int *a = malloc(6 * sizeof(int));
の違いは何ですか?
2020/12/25(金) 11:15:33.22ID:4TR/yfFq0
>>354
記憶域期間 storage duration が違う
void func()
{
int a[6];
} //ここで自動開放 automatic storage duration
int a[6]; //最後まで解放されない static storage duration

mallocは当たり前だがfreeで手動開放
C++にはdynamic storage durationというのがあるが
Cでは言語自体にそのような概念はなく
malloc/freeというアプリが提供する機能ということになっている
2020/12/25(金) 11:18:10.08ID:My/Ukrd40
>>354
違うものを持ち出して何が違うかと問われても困るんやが……。
背景を全部説明するとだいぶん長くなるので。

とりあえず結果的に出来る配列オブジェクトを比較するならオブジェクトの生存期間 (lifetime) が違う。
前者は自動記憶域期間、後者は割り付け記憶域期間という分類になる。

変数 a の違いという意味では前者の型は int[6] で後者は int* ということになる。
ただし配列は暗黙の型変換でそれの先頭要素を指すポインタになるので、
かなり共通した記法で扱える。
2020/12/25(金) 11:29:13.76ID:4TR/yfFq0
字が違うことくらい言わんでも解っとるやろ

int a[6]; は sizeof a / sizeof a[0] でサイズを取得できるが
mallocで割り付けたメモリはサイズを聞けず自分で管理せねばならない
2020/12/25(金) 12:31:04.53ID:0FtKncKUM
目から鱗どころか、天が落ちるぐらい面白い説明ができないのか。
無芸な奴らだ。
2020/12/25(金) 12:39:14.80ID:3NwCUk3p0
ポインタ int *p; はインクリメント可能で p++ は合法
配列 int a[6]; はインクリメント不可能で a++ はエラーになる
2020/12/25(金) 12:51:59.76ID:D8aGfpPud
>>358に期待
361デフォルトの名無しさん (ワッチョイ c38c-Kyli)
垢版 |
2020/12/25(金) 13:23:43.17ID:9Fso0P460
>>354
メモリ配置の連続性はどちらも保障されていることで良いですか?
2020/12/25(金) 14:43:22.97ID:3NwCUk3p0
配列は先頭から確保された領域の次のところを指せるまでは連続性が保障されてるんじゃなかったかな
規格あたるのはまかせた

(malloc の戻りは… 配列に準じるように実装されてそうではある)
2020/12/25(金) 14:54:43.85ID:qJluI3Ne0
>>361
プログラムからの見た目はどちらも連続。
物理的に連続させたいならdma メモリ 確保とかでググる
2020/12/25(金) 15:09:30.51ID:2V7uRClp0
int a[6];はローカル変数ならスタック領域に確保、グローバル変数や
int *a = malloc(6 * sizeof(int));はヒープ領域に確保
でいい?
2020/12/25(金) 15:19:15.56ID:qJluI3Ne0
ダメ
グローバル変数はデータ領域とかbss領域とかいろいろ
2020/12/25(金) 18:54:05.01ID:Tea3EQhG0
アドレス見ない, かつ定数だと何処にも領域取らない可能性まである
2020/12/25(金) 20:30:05.07ID:EiswCiht0
そんなこと言い出したら
ローカル変数だってスタックじゃないかもしれない
2020/12/25(金) 20:39:01.52ID:MidTJiO80
どこにあるかよりどれだけ生きているかの生命期間が大事ね
2020/12/25(金) 21:22:39.71ID:EiswCiht0
速度も
2020/12/25(金) 21:23:50.85ID:EiswCiht0
生命期間も実際はC言語の文法通りじゃない
2020/12/26(土) 05:33:54.37ID:ekLZAtHZ0
>>361
> 7.20.3.3 malloc 関数
> 機能 malloc 関数は,大きさがsize であるオブジェクトの領域を割り付ける。

領域とは連続した区間をいう
2020/12/26(土) 07:58:20.12ID:J4yOWW3+0
メモリ(DRAM)上は連続してるとは限らない
C言語上連続として扱えるというだけ
2020/12/26(土) 08:19:43.84ID:ekLZAtHZ0
それを言うなら仮想記憶だろ
ページ境界をまたぐ場合実記憶が連続しているとは限らない

その昔、ビット幅1bitのDRAMを8個パラってるのがあったけど
だから何って話
それ言い出したらメモリセルのキャパシタは隣接してるのか
2020/12/26(土) 08:29:01.69ID:hSiLuJt/d
スレタイの俺って誰ですか?
2020/12/26(土) 09:41:05.55ID:Mx49Y/J60
>>373
> それ言い出したらメモリセルのキャパシタは隣接してるのか
してないよ、アドレス線が入れ替わってる
なのでメモリーテスターはアドレス線を入れ替える機能がついてたりする
2020/12/26(土) 10:40:07.64ID:IfMxsBFTd
>>366を言い出したからまねして見ただけ
2020/12/26(土) 12:41:26.45ID:0+ArpHnq0
実記憶も連続していない
時々意識不明になってるはず
ただ、その時の記憶がないだけ
2020/12/28(月) 07:49:35.18ID:LdveQEJ20
面倒くさい、特異な、一般人には無縁の仕様を考慮するのが当たり前って感じに持ち出して否定するから初心者が逃げていく・・・。
2020/12/28(月) 08:44:26.16ID:G7B9oAoL0
Cでプログラミングする時に領域の連続性を気にするのは果たして初心者なのだろうか(´・ω・`)
2020/12/28(月) 09:28:54.37ID:Q5Pp+CI0a
Cでどのくらいできれば
実際役に立つレベルでしょうか?
2020/12/28(月) 09:45:26.51ID:ErVwTltE0
>>380
Cは言語仕様は小さいし重要なのはC自体が使えることではなくCを使ってその先で何をするかだから、C言語自体の基本的な仕様は完全にマスタしてるくらいでないとわざわざCを使う意味はないかなと思う
382デフォルトの名無しさん (ワッチョイ c38c-fXGD)
垢版 |
2020/12/29(火) 06:32:49.03ID:NanqjdNB0
iZ-Cのサンプルプログラム書き始めたので見てね。
https://sunasunax.hatenablog.com
2020/12/29(火) 08:44:05.91ID:gCTQzk+K0
>>379
デバイスドライバのぉ バッファをぉ 確保するときとかぁ
ドキドキしちゃうぅ 初心者ですっ❤
2020/12/31(木) 07:46:12.94ID:mJm7tBE2d
>>361
mallocはNULLを返すこともあるので
その場合は当然連続性は保証されない
そのエラー処理も書いておかないといけない
2020/12/31(木) 07:51:45.82ID:/Sdg/sCQ0
mallocがNULLを返した場合は
割り付けが行われていないので
連続でも不連続でもない
2020/12/31(木) 07:55:07.88ID:/Sdg/sCQ0
配列は連続領域が前提だから
E1[E2]が*(E1+E2)と等価となる

構造体も連続領域が前提だからこそ
配列にすることができる

不連続領域はリストや二分木などで
むろん言語自体が提供するのではなく
言語を使ってプログラマが構築するものだ
2020/12/31(木) 12:57:09.96ID:mJm7tBE2d
>>354
さらに言うなら
グローバル配列はコンパイル時に総数を決定しなければならないが
ローカル配列とmallocを使った場合は
最初に人数を入力し、それに合わせた数の名前配列を確保するような作り方ができる
ただしあまりにも大きいとローカルはスタックが溢れるしmallocはNULLを返す
2020/12/31(木) 18:54:42.23ID:/Sdg/sCQ0
mallocがNULLを返すのを実際に目撃したやついる?
malloc(2147483647)みたいなわざとらしい実験じゃなく実用で
2020/12/31(木) 19:17:26.57ID:lvvsunYH0
いますよ。
2020/12/31(木) 19:34:52.29ID:1/HNqY6i0
目撃とかはよーわからんけど実用プログラムだとアロケーション失敗でログ採ったりしてるからそういうログは見たことあるよ
2020/12/31(木) 20:41:44.50ID:+fx38Mty0
仮想記憶とか無いOSだとあっさり NULL 返してたな
2020/12/31(木) 23:27:44.16ID:xpX6Z+OE0
その質問を見てふと思ったことがあるんで便乗質問。
純粋にメモリが足りない (断片化で連続領域がないという場合を含む) という以外で malloc がエラーを返すことってある?

バッファオーバーランとかでめちゃくちゃに書き換えて管理の整合性が壊れたとかいうのは無視して
あくまでアプリケーションとしては C の仕様に則っているという前提で。
2021/01/01(金) 00:09:31.83ID:E41TLeHr0
組み込みのちっちゃなマイコンなら普通
2021/01/01(金) 00:12:43.64ID:mwYi2zym0
マルチスレッドでヒープ領域が排他制御で使えないってのはありうる?
2021/01/01(金) 00:20:48.66ID:E41TLeHr0
さあ
2021/01/01(金) 00:21:33.85ID:FRLcRufg0
吸い込んでくれ
2021/01/01(金) 00:34:01.79ID:ufA+vsC20
>>392 メモリクォータ違反とか?
2021/01/01(金) 00:36:53.19ID:cLHhn9Dx0
>>394
「malloc マルチスレッド」で検索すれば?
知らんけど。
2021/01/01(金) 01:47:49.68ID:gWHeIT9l0
>388
Win98か2000の頃にあったわ。
1kバイトぐらいのを数万回(ファイル数)mallocやろうとしたらNULL返した。
XPで試したらエラー出なかったけど。
2021/01/01(金) 05:55:11.31ID:ihSnxU6O0
逆にメモリ不足以外でNULL返すことってあるのか?
2021/01/01(金) 06:25:04.97ID:DIBn3EXs0
malloc(0)とか
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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