C言語なら俺に聞け 158

■ このスレッドは過去ログ倉庫に格納されています
2021/12/25(土) 12:11:46.61ID:xxeaCAplM
!extend:checked:vvvvv:1000:512
(新スレ立ての際上記コマンドを2行書き込んでください)
C言語の話題のみ取り扱います C++の話題はC++スレへ
質問には最低限の情報(ソース/コンパイラ/OS)を付ける
数行で収まらないソースは以下を適当に使ってURLを晒す
https://paiza.io/
https://ideone.com/
http://codepad.org/

C17
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4713.pdf

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言語なら俺に聞け 157
https://mevius.5ch.net/test/read.cgi/tech/1624846971/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2022/03/03(木) 14:05:48.79ID:o7MH0vY5M
グローバル変数禁止なのになんで定数まで禁止なんだ
2022/03/03(木) 14:16:38.79ID:bgg8zGG60
>>282
グローバル「変数」と「固定」値がリテラルでばら撒かれてるのは全然違う話だが?
苦労してるのはお前さんの能力に問題があるんじゃ…
2022/03/03(木) 14:18:42.95ID:iO+E/Lewd
マクロは使わんのか?
ただの素人のスパゲッティだな
2022/03/03(木) 15:16:49.50ID:dDnSjvDO0
センス悪いやつがいるせいで
必要なものまで制限されるんだよな

ロクに精査もせずに横暴な制限を作るやつらも
センス悪いやつの一員
2022/03/03(木) 15:48:11.59ID:NNobhPIrM
昔グローバル変数はなるべく使わないようにねってお願いしたら、グローバル変数が関数内のstatic変数になって返ってきて状況悪化させしまったことを思い出した…
依頼は正確でないとな
2022/03/03(木) 15:52:02.14ID:nN/xu0Sn0
>>287
望んだ改善ではないにしてもグローバル変数よりは関数内static変数のほうがマシで、悪化はしてないのでは?
2022/03/03(木) 15:55:02.85ID:7Ur+27OW0
必要なものが制限されるのは腹立たしいだろうけど、
現実にセンスないやつが今、現場にいる状況で比較的マシにしようと思ったら制限も已むなし。
2022/03/03(木) 15:55:56.96ID:9ZWmTo8BM
君は関数内static変数の破壊力を知らない
2022/03/03(木) 16:02:36.91ID:dDnSjvDO0
int *just_function(void)
{
static int not_global_variable;
return &not_global_variable;
}

struct common_variables
{
int fool;
int jerk;
int idiot;
};

struct common_variables *a_function(void)
{
struct common_variables cv;
return &cv;
}
2022/03/03(木) 16:03:41.51ID:dDnSjvDO0
static struct common_variables cv;
だった

笑い処でミスってどうするw
2022/03/03(木) 16:09:12.32ID:7Ur+27OW0
やりたいことは分割統治なんだよね。 プログラムを機能単位ごとに分割して部品にしたいの。
部品を束ねた部品があって、それを束ねて大きな部品にして……という綺麗に階層的な依存関係にしたいの。
色んなところからアクセスされるものがあるのが目に付くと綺麗に分割できてねぇなあと感じるという話であって
言語機能としての「グローバル変数」を使わないようにすれば綺麗になるというわけではない。
2022/03/03(木) 16:17:38.32ID:9ZWmTo8BM
グローバル変数一つ新規に作るのに何枚も書類を書かないといけないプロジェクトがあって、
その時は一つだけ管理テーブルという名称の構造体を作成登録した。
その後は必要に応じて構造体にメンバーを追加した。
追加の場合には許可がいらない。
2022/03/03(木) 16:23:37.12ID:dDnSjvDO0
俺のジョークそのまんまかw
2022/03/03(木) 16:28:52.42ID:rhQumEoNd
int型のグローバル変数が2つあればvoid*アドレスを分割して突っ込める

291みたいなstructへのポインタ突っ込んどきゃやりたい放題だよやったね!
2022/03/04(金) 08:30:10.22ID:kn6yruMU0
C++ の singleton クラスと
関数内static から戻ってくるのも 似たようなものになる?のか?
298デフォルトの名無しさん (ワッチョイ 0f24-84yK)
垢版 |
2022/03/06(日) 14:20:18.71ID:RiucPZY70
ref class SampleCls
{
internal:
property int A[int]
{
int get(int n)
{
int value = n * 100;
return value;
}
void set(int index,int n)
{

}
}
};
SampleCls objを実体化させた後に
s = s + "n= " + obj.A[i]+ "\n";
を5回繰り返したら0,100,200,300,400になったのですが
0に100をかけると100になるのでしょうか?
299デフォルトの名無しさん (ワッチョイ 0f24-84yK)
垢版 |
2022/03/06(日) 14:24:03.50ID:RiucPZY70
A[i]の値がどんなふうに決まっているのか知りたいのですがよくわかりません
どなたか教えていただければ幸いです。
300デフォルトの名無しさん (ワッチョイ 0f24-84yK)
垢版 |
2022/03/06(日) 14:42:22.06ID:RiucPZY70
すみません、解決しましたSet()とget()の動きをちゃんと理解していなかったことが
原因でした。
2022/03/06(日) 16:10:19.16ID:g5zD4gJoM
まず、自分が何の言語で書いてるか理解したらもっと早く答えが手に入ると思うよ…
302デフォルトの名無しさん (ワッチョイ 9fad-Djfv)
垢版 |
2022/03/07(月) 04:27:05.03ID:t70FSnsj0
ダイクストラって名前を聞くたびに大工が屋根の上で仕事をしている姿が浮かんでしまう
2022/03/07(月) 06:18:54.97ID:RhJCMKRm0
キャスバルレム大工ん
2022/03/08(火) 12:29:53.09ID:Ki3D6geg0
アルゴリズム系でかっこいい名前はダイクストラとラグランジュ
2022/03/08(火) 14:05:47.68ID:0fUGXJlMd
構造化プログラミングはアルゴリズムじゃない
2022/03/08(火) 20:30:43.45ID:Ki3D6geg0
ダイクストラ法な
2022/03/09(水) 01:38:28.31ID:D4BPG9+J0
大屑虎
2022/03/10(木) 20:38:39.30ID:kXeE1dtK0
malloc,freeを多用すると断片化でいずれOSが落ちるってのは
Windows11やLinuxでも起きる問題ですか?
2022/03/10(木) 20:42:14.86ID:4CPsM6xv0
使い方間違えていればOS問わず不味いだろ
2022/03/10(木) 21:22:58.66ID:kXeE1dtK0
正しく使っていれば問題ないということでOK?
なんか、正しく使っていても断片化が発生するみたいなのを聞いたもので
2022/03/10(木) 21:47:12.08ID:0nt+oQbsF
昔のCPUならともかく
MMUを使ってるOSなら断片化しないだろ
2022/03/10(木) 22:40:12.59ID:iIk3GhqfM
MMUのページサイズとmalloc/freeの管理サイズは全然違うぞ
2022/03/11(金) 14:14:05.09ID:Yxv/2BSs0
>>308,310
断片化は発生するだろうけど、そのせいでOSが落ちるなんてことは最近のOSではたぶん無い。
断片化によるメモリ確保失敗によってアプリが落ちることはあるかもしれない。
「正しく使っていれば」という条件で質問されても何をもって正しいと言うのか示してもらわないと答えようがない。
2022/03/11(金) 21:28:24.41ID:FGXUCKCr0
1MiB以上と未満で挙動を分けているmallocはよく見かけるね
2022/03/11(金) 21:50:14.89ID:o502mXGNM
>>308
実装を知っていれば意図的にフラグメントは起こせる、という程度で気にしなければ普通起きない
316デフォルトの名無しさん (ワッチョイ 82a6-QV3l)
垢版 |
2022/03/12(土) 00:08:34.44ID:NOu0XfGq0
>>310
32bit環境なら大きい領域は早めに確保するか、
あるいはmallocじゃなくAPIで確保したい領域のアドレスを逆方向から取得
317デフォルトの名無しさん (ワッチョイ 82ad-WCXV)
垢版 |
2022/03/12(土) 01:41:51.18ID:NpUzvYny0
>>308
普通のアプリ動かしているだけなのにOSが落ちるとすると、そのOSは何かおかしい。OSにバグがあるのではないか?
2022/03/12(土) 13:07:51.07ID:aRaeBtiY0
普通に車を運転してたら事故った
車に欠陥があるはず
2022/03/12(土) 15:32:14.60ID:XvQpUkSW0
九州のタクシー暴走事故はプリウスのせいだと思っている。
2022/03/12(土) 16:34:06.63ID:aRaeBtiY0
プリウスの制御プログラムを書いた人、ここにいませんか?
2022/03/12(土) 18:00:40.48ID:WugjRoTQM
仮にいたとしても名乗り出ないだろw
2022/03/12(土) 18:10:20.20ID:kaM/Ypx70
>>318
当然、疑うことだね
2022/03/12(土) 18:29:57.19ID:0pfFD5zX0
ドライバーの単体テストは実施してたんですか?
324デフォルトの名無しさん (ワッチョイ 82ad-WCXV)
垢版 |
2022/03/12(土) 23:53:51.20ID:NpUzvYny0
>>318
それは今回の話には当てはまらない。普通のアプリを動かしていたらアプリが落ちた、だったら当てはまる。
今回の話を喩えるなら普通の車を運転していたら道路が陥没したみたいになる。OSの方が落ちたんだから。
2022/03/12(土) 23:56:33.44ID:aRaeBtiY0
そうか?
池袋事故では最後まで車の欠陥を主張してたぞ
普通にって表現は、あくまでも本人の主観だからな
2022/03/13(日) 00:27:55.58ID:8TmiOcWs0
上級国民は医師に運転を止められていた欠陥アプリなので、譬喩に用いるには特殊すぐる。
2022/03/13(日) 00:30:40.49ID:giayljWn0
事故起こした奴って自分が原因だと思ってないだろう
2022/03/13(日) 06:05:08.20ID:g8VV1ENe0
常に自分を疑え、なんて根性論めいた主張には興味ないし
弁護士に譲歩的なことを言うなと指示されて本当に思っていることと違うことを陳述するのもこの議論とは関係ない
2022/03/13(日) 06:10:49.96ID:kdm08K3Td
>>308
多用、ってのがおかしいな
一ヶ月も動かし続けてたらどうしても多用になる
それで落ちるようなことはWin95とかの時代の話だろ
2022/03/13(日) 11:39:10.82ID:HQz48e8Z0
>>308
malloc,freeを多用すると
解放し忘れが多くなり
メモリが断片化して
新規メモリが確保できなくなってエラー吐いてんのに
エラーチェックもせずにポインターにアクセス
そしてプログラムが落ちる
さらにOSを巻き込んでPCごと落ちる

でも今時のOSは生半可なことでは巻き込まれない
2022/03/13(日) 17:40:39.42ID:5qwn5s+60
解放し忘れ(メモリリーク)と断片化は別概念

16byteを4回確保した後に1回目と3回目で確保したメモリだけ解放すると、
合計32byte空いてるのに飛び地になってるから32byte領域として扱えない
2022/03/13(日) 22:53:37.11ID:A2eUK16/a
malloc/freeを多用すると解放忘れが多くなるものなのか?
2022/03/14(月) 01:27:18.72ID:OOlFm33n0
そりゃプログラムがおかしいだけ
2022/03/14(月) 10:46:27.63ID:z8DyGqYY0
C言語ではなくスクリプトだが、
無限にSubdirを掘り続ける奴書いて動かしたら、OS落ちたな
XPだったが
2022/03/14(月) 11:00:21.69ID:GQP59fXj0
fork爆弾みたいな実験か
2022/03/14(月) 16:40:21.91ID:LP3GQSIPd
OS名はあえて書かないが
Visual C++のmallocで1GBを256回確保しただけで落ちたな
337デフォルトの名無しさん (ワッチョイ 82ad-6g0K)
垢版 |
2022/03/14(月) 17:46:29.09ID:OOlFm33n0
Windowsは昔から落ちやすい印象
なんというか、OS自体もなんか少しユルい上にみんなして色んなドライバ作って組み込むもんだから余計に落ち易くなってんじゃないかな。
2022/03/14(月) 17:51:09.33ID:L/zgcwZ50
Win98で512バイトぐらいをいくつmalloc出来るかと試したことがあって、
10万回ちかくでNULL返した・・・いや、1万回だったかな?。
とりあえずOSもアプリも落ちなかった。
339デフォルトの名無しさん (オイコラミネオ MM95-W3oF)
垢版 |
2022/03/15(火) 21:09:49.60ID:uaV7elHUM
>>249
教えられてないし誰も知らないしwhile(1)で事足りるから
::printfとかもな
わざわざ使ってるやつはアホだと思う
2022/03/15(火) 21:12:16.49ID:oV08M4Ak0
あなたの基準では世界中アホだらけやな
341デフォルトの名無しさん (オイコラミネオ MM95-W3oF)
垢版 |
2022/03/15(火) 21:19:55.67ID:uaV7elHUM
一部のバカに対して言ってる
マジで::printfなんて使ってるやつなんて滅多にいない
342デフォルトの名無しさん (オイコラミネオ MM95-W3oF)
垢版 |
2022/03/15(火) 21:22:08.63ID:uaV7elHUM
誰も使ってない表記法使うアホのせいで改めて調べないといけなくなる
使われてないから敢えて教科書に書かれてないし教科書に書かれてないんだから知らないやつが多数派ってことがわからんバカ
2022/03/16(水) 00:50:46.44ID:HRRT9pv8r
知らなくて馬鹿にされたのかな?辛かったね、大変だったね。カワイソウニ(´;ω;`)ウッ…
2022/03/16(水) 05:23:40.43ID:sZ1wd+Ly0
有効範囲解決演算子はスレ違いだぞ
2022/03/16(水) 13:21:40.48ID:IYkrMFX0r
Cに namespace の概念ってある?
2022/03/16(水) 13:45:31.87ID:EozDCnXud
gotoラベル
構造体のtag名
構造体のメンバ名
それ以外

という概念のnamespaceならある

typedef struct A{int A;} A;
int main(){ A: return 0;}

で4種類のAを区別できるというだけで、ns::A とかの話ではないが
2022/03/16(水) 14:57:34.41ID:IYkrMFX0r
ああ
それぞれで固有の識別子を記憶する空間があるから ぱっとみの文字が衝突しててもセーフ
という概念か

コンパイラ記述するときにめんどくさそうね
文意からこっちのテーブルを参照すべきとか
2022/03/19(土) 11:24:46.11ID:fvSihUDg0
初歩的な質問ですが、
b = a++;
という式はbにaの値を代入してからaをプラス1しますが、
演算子の優先度を考えると、++が優先度高く、=は右優先です

優先度の高い++をしてから代入するように感じるのですが
そうならない理由をご教示ください
2022/03/19(土) 11:57:41.89ID:VgIBj69P0
a++が返す値は、aをインクリメントする前の値だからだよ
2022/03/19(土) 12:07:43.36ID:X795CU5ld
b=a++;
のインクリメントが実行されるのは式を評価した後
2022/03/19(土) 12:40:35.63ID:fvSihUDg0
返信ありがとうございます
演算子の優先度を調べると++が=より優先度が高いはずです
式の処理は優先度の高い演算子から処理されると理解しています

そうすると、++が先に実行された後で=(代入)が実行されてもおかしくないと
考えたのですが、どこに誤りがあるのでしょうか?
2022/03/19(土) 12:53:26.53ID:UXt2lmR80
そういう時のために
++i
i++
ちゃんと2種類の書き方が用意されてるんだよ
2022/03/19(土) 12:55:08.49ID:d0FibUHe0
>>351
> 式の処理は優先度の高い演算子から処理されると理解しています
これが間違い。演算子の結合優先度と式の評価順は別。
2022/03/19(土) 12:56:54.66ID:X795CU5ld
演算子の結合順位と副作用完了点の概念は別

というか b=a;a=a+1; を1文で書くためにa++ 周りのの仕様を特別扱いして実現してる
2022/03/19(土) 13:30:03.55ID:fvSihUDg0
返信ありがとうございます
++、--の場合は、前置、後置で
式の評価順が通常と異なると覚えました

式の評価順を理論から理解していないので
忘れてしまって失敗するかもしれませんが、
そのうち定着すると思っています
356デフォルトの名無しさん (ワッチョイ 13ad-bSSa)
垢版 |
2022/03/19(土) 15:38:29.74ID:CZI3HevE0
よくわからない場合や使うと分かり辛くなる場合は使わないで冗長な書き方した方が良いかも知れない。
使わなくても最近のコンパイラは最適化掛ければ適当にうまいことやって最終的に作られるコードは同じになる可能性が高いと思う。
357デフォルトの名無しさん (アウアウウー Sa5d-oCcm)
垢版 |
2022/03/19(土) 17:00:25.72ID:mw5TX/57a
b = a++;

の右辺を評価した結果は aの元の値で、副作用として aのアドレスにあるオブジェクトをインクリメントしているのでは
代入されるのは aの内容でなく、アドレスを持たない値で
358デフォルトの名無しさん (アウアウウー Sa5d-oCcm)
垢版 |
2022/03/19(土) 17:03:51.29ID:mw5TX/57a
a++ は右辺値で、 ++a は左辺値
2022/03/19(土) 17:12:51.80ID:X795CU5ld
どっちも右辺値としないとまずい
int main(){
int a=0;
int* p;
p=&(++a); // コンパイルエラー
p=&(a++); // こっちも
}
360デフォルトの名無しさん (アウアウウー Sa5d-oCcm)
垢版 |
2022/03/19(土) 17:42:57.61ID:mw5TX/57a
そうだね、失礼しました
2022/03/19(土) 17:50:05.80ID:nPptgbtB0
: BassClass(
std::format (IdPrefix, index, numBank)),(
std::format (NamePrefix, ++index, numBank))
ちょうどこんな感じのコンストラクタでラッパーするコード書いてたんだけど
インクリメントしてない方までつられて増えちゃうんだよね
C++のコード片でスマソン
2022/03/19(土) 18:11:19.38ID:8Fsv/onud
d = ++a + b-- + --c + a++;
この結果は

++a;
--c;
d = a + b + c + a;
b--;
a++;
だよね
実際はこんな書き方しないほうがいいがw
2022/03/19(土) 18:25:12.86ID:d0FibUHe0
>>362
> d = ++a + b-- + --c + a++;
> この結果は
++a と a++ とが順序付けされないので未定義動作。
2022/03/19(土) 18:39:08.49ID:Uza1/JxDM
両方未定義じゃね?
>>361 の方はちょっと自信ないが >>362 の ++a + a++ はダメだったような気がする
2022/03/19(土) 19:05:15.57ID:9SMEw2CG0
以下のような関数がインラインで実行されてるだけで、評価自体は++が先に行われてるんでないの?知らんけど
int inc(int* a) {
int ret = *a;
*a = *a + 1;
return ret;
}
2022/03/19(土) 19:10:54.79ID:fJWxsuK3a
引数の評価順なんてCPUでも変わるだろ。
2022/03/19(土) 20:25:22.26ID:hj0ig94x0
未定義動作警察だ!

未定義動作の動作は定義されていないのでコンパイラは何をしてもいい

> d = ++a + b-- + --c + a++;
このコードの場合、
++a;--c;d=...; b--;a++;相当のコードを吐いてもいいし、
tmp=a;a=tmp+1;--c;d=...; b--;a=tmp+1; 相当のコードを吐いてもいい。
大抵は未定義動作がないことを前提に最適化をかけるが。

極端なことを言えば、d=42としてもいい。
この文の見た目の動作は定義されていないから
2022/03/20(日) 00:26:15.18ID:dAApHicf0
fgetsのファイル終了・エラー時の戻り値がNULLなのはなぜですか?
他の入出力関係の関数の戻り値はEOFになっています
いま入出力の勉強をしてるんですが、関数の引数や戻り値が少しずつ違うので覚えるのが難しいです
使っていくうちに覚えていくものでしょうか?
2022/03/20(日) 00:53:13.92ID:tmhbCmKs0
細かな仕様はよく使うもの以外は毎度調べるよ
まあCの関数は数が少ないから全部覚えてるって人も少なくないかも
2022/03/20(日) 00:57:50.69ID:rKPZjyik0
よく使う関数の戻り値調べると面白いぞ
printfが何を返しているかとか、それは何故なのかとか
戻り値を使っている人を見たことがないけれど
2022/03/20(日) 01:37:41.92ID:u4Grkyrm0
>>361
こういう場合については未定義ではないが未規定の動作が含まれる。
副作用完了点の間で同一のオブジェクトに複数回の書き換えが生じた場合には未定義の動作となるが、
書き換えが一度の場合はその書き換えがどのタイミングで起こるかわからないというだけで、
未定義の挙動にはならない。
2022/03/20(日) 08:21:37.14ID:e7HuEm7id
>>368
fgetsの戻り値は文字列へのポインタであり
いっぽうEOFは文字(じゃなくてintだけど気分的には)なのだ
2022/03/20(日) 10:46:46.29ID:+oGVYZOT0
組み込みのソフトしていると
使わない関数が多くて忘れていきます
2022/03/20(日) 11:48:15.83ID:w4XPcyomd
<stdio.h>は使えないとして組み込み系って使える標準ライブラリあるの?
2022/03/20(日) 12:55:28.41ID:DiBIkIVz0
windows.h
2022/03/20(日) 13:05:34.82ID:w4XPcyomd
使える標準ライブラリを聞いたつもりなんだが
あと<Windows.h>はOS依存のライブラリな
2022/03/20(日) 13:25:28.64ID:y5NxTTYed
標準っていっても何の標準かわからん。
ANSI CとかC89とかあるだろ。
2022/03/20(日) 13:41:32.19ID:w4XPcyomd
ANSI C, C89〜C17 の規格で存在を要求されてるライブラリ

組み込みコンパイラだとそもそもC89かC99しかサポートしてないだろうし、
fileIOとかは欠けてるだろうから何なら使えるか聞きたい

組み込みの環境も多数あるだろうから >>373 みたいな人が普段どういう関数使ってるか気になった
2022/03/20(日) 13:42:12.13ID:e7HuEm7id
それぞれ組み込むシステムに付属してるだろ
一元的な名前はない
ひょっとしたらstdio.hという名前かもしれない
380デフォルトの名無しさん (ワッチョイ 13ad-bSSa)
垢版 |
2022/03/20(日) 14:14:31.30ID:4KnLtgrc0
組み込みって言っても小さくても Linux 動いちゃうようなのもあるし、何とも言えんな。
2022/03/20(日) 14:19:28.79ID:BOo0cJz/a
string.h は普通に使えた
2022/03/20(日) 17:31:23.40ID:u4Grkyrm0
C の規格は「規格合致ホスト処理系」「規格合致フリースタンディング処理系」を規定していて、
フリースタンディング処理系はライブラリとして float.h iso646.h limits.h stdarg.h stdbool.h stddef.h stdint.h の内容に限定している。
この範囲なら実行環境に左右されずに用意できるはずという判断なんだろう。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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