X



C言語なら俺に聞け 158

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん (ブーイモ MMcf-4SjH)
垢版 |
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
0255はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 133e-mA98)
垢版 |
2022/02/24(木) 02:31:22.55ID:KIw+63Ii0
>>254
ループとしては無限ループにしておいて break で抜けるような構造は良くないといえばあんまり良くないんだけど、
そうは言っても存在する以上はその場合を明示的に表せるような構文があると便利ってのも確かで、
そのあたりは設計思想の違いとしか言いようがないよな……。
0256デフォルトの名無しさん (ワントンキン MMc7-8oZ9)
垢版 |
2022/02/24(木) 02:44:45.66ID:9O+r6lMKM
>>255
その構造が良くないというのは自分も昔はそうだったが単なる思い込みだと気付いたw
さらにwhileは先頭でif break、do whileは最後でif breakしているだけであるし
ある程度計算を進めてから途中でようやくif breakできないとwhileだと困ることもloop式で解決された
さらにループを抜けてbreakしたい時は値を返したい時が多いからloop文ではなくloop式が非常に便利
0257ハノン ◆QZaw55cn4c (NZ 0Hdf-864q)
垢版 |
2022/02/24(木) 05:13:17.42ID:SpBJKMB7H
>>251,249
K&R2 では if や for, switch の後にはスペースを入れますね
私は基本的に K&R2 に沿って書きますが、関数の始まりを示す { は例外的に宣言に続けて書きます

int main() {
return 0;
}
0262デフォルトの名無しさん (ワッチョイ 8310-iDSx)
垢版 |
2022/02/24(木) 11:30:55.34ID:XK2EQ9NF0
#define DEATH_MARCH for(;;)
0264デフォルトの名無しさん (ワッチョイ 83b1-hSEA)
垢版 |
2022/02/24(木) 17:23:09.91ID:bIfpVEhP0
>>261
正規表現ライブラリとか使って、複雑な制御を見えなくするのも一つの手かも?
自分のところのbreak continueは嫌がられるが、他所なら見えないので。

結局機械語になれば、中でGoto(jmp)しまくっているわけなので。
0275デフォルトの名無しさん (ワッチョイ cf95-kcXy)
垢版 |
2022/02/25(金) 13:00:32.72ID:2Pynziee0
構造化プログラミングを盲信する気は毛頭ないが
それは違うぞ

抜けだしであろうが飛び込みであろうが
ループの端に設定された条件に従わない分岐は
ダイクストラが問題視する対象だ
0276デフォルトの名無しさん (ワッチョイ cf2c-hSEA)
垢版 |
2022/02/25(金) 13:19:00.10ID:Eg3DloqN0
MISRA-C でも、制御パスを変える、
goto, 複数return, (多重脱出からの?)break/continue などは禁止。
だから、ループ内で、やたらとフラグを持ち回る

でも、Linux では、
早期return, goto でエラー処理をまとめたりするから、フラグを持ち回らない
0277デフォルトの名無しさん (ワントンキン MMc7-8oZ9)
垢版 |
2022/02/25(金) 13:35:54.50ID:aDhOSI3tM
>>275
そんな無意味な制約を課しているとダメなプログラマーになってしまうね

>>276
MISRA-Cは本末転倒としか言いようがないね
結局その無意味な制約によって目的としたメモリ安全性などの成果を得られなかった
その長年の未解決だった課題はRustが全く別方向からようやく解決した
0282デフォルトの名無しさん (ワッチョイ 03b1-65e0)
垢版 |
2022/03/03(木) 13:53:35.02ID:2Y1y5HDI0
グローバル変数禁止プロジェクトがあって、固定値が全てリテラルでばらまかれていたので、仕様変更でチーム員は苦労してた。
自分の担当箇所は謎関数を一つ作り、そこから値を得ていた。
0287デフォルトの名無しさん (ブーイモ MM86-S9sh)
垢版 |
2022/03/03(木) 15:48:11.59ID:NNobhPIrM
昔グローバル変数はなるべく使わないようにねってお願いしたら、グローバル変数が関数内のstatic変数になって返ってきて状況悪化させしまったことを思い出した…
依頼は正確でないとな
0291デフォルトの名無しさん (ワッチョイ 9e95-yS/3)
垢版 |
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;
}
0293はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 073e-8W3/)
垢版 |
2022/03/03(木) 16:09:12.32ID:7Ur+27OW0
やりたいことは分割統治なんだよね。 プログラムを機能単位ごとに分割して部品にしたいの。
部品を束ねた部品があって、それを束ねて大きな部品にして……という綺麗に階層的な依存関係にしたいの。
色んなところからアクセスされるものがあるのが目に付くと綺麗に分割できてねぇなあと感じるという話であって
言語機能としての「グローバル変数」を使わないようにすれば綺麗になるというわけではない。
0294デフォルトの名無しさん (テテンテンテン MM86-+tM1)
垢版 |
2022/03/03(木) 16:17:38.32ID:9ZWmTo8BM
グローバル変数一つ新規に作るのに何枚も書類を書かないといけないプロジェクトがあって、
その時は一つだけ管理テーブルという名称の構造体を作成登録した。
その後は必要に応じて構造体にメンバーを追加した。
追加の場合には許可がいらない。
0298デフォルトの名無しさん (ワッチョイ 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になるのでしょうか?
0299デフォルトの名無しさん (ワッチョイ 0f24-84yK)
垢版 |
2022/03/06(日) 14:24:03.50ID:RiucPZY70
A[i]の値がどんなふうに決まっているのか知りたいのですがよくわかりません
どなたか教えていただければ幸いです。
0300デフォルトの名無しさん (ワッチョイ 0f24-84yK)
垢版 |
2022/03/06(日) 14:42:22.06ID:RiucPZY70
すみません、解決しましたSet()とget()の動きをちゃんと理解していなかったことが
原因でした。
0302デフォルトの名無しさん (ワッチョイ 9fad-Djfv)
垢版 |
2022/03/07(月) 04:27:05.03ID:t70FSnsj0
ダイクストラって名前を聞くたびに大工が屋根の上で仕事をしている姿が浮かんでしまう
0313デフォルトの名無しさん (ワッチョイ efe9-6iqn)
垢版 |
2022/03/11(金) 14:14:05.09ID:Yxv/2BSs0
>>308,310
断片化は発生するだろうけど、そのせいでOSが落ちるなんてことは最近のOSではたぶん無い。
断片化によるメモリ確保失敗によってアプリが落ちることはあるかもしれない。
「正しく使っていれば」という条件で質問されても何をもって正しいと言うのか示してもらわないと答えようがない。
0316デフォルトの名無しさん (ワッチョイ 82a6-QV3l)
垢版 |
2022/03/12(土) 00:08:34.44ID:NOu0XfGq0
>>310
32bit環境なら大きい領域は早めに確保するか、
あるいはmallocじゃなくAPIで確保したい領域のアドレスを逆方向から取得
0317デフォルトの名無しさん (ワッチョイ 82ad-WCXV)
垢版 |
2022/03/12(土) 01:41:51.18ID:NpUzvYny0
>>308
普通のアプリ動かしているだけなのにOSが落ちるとすると、そのOSは何かおかしい。OSにバグがあるのではないか?
0324デフォルトの名無しさん (ワッチョイ 82ad-WCXV)
垢版 |
2022/03/12(土) 23:53:51.20ID:NpUzvYny0
>>318
それは今回の話には当てはまらない。普通のアプリを動かしていたらアプリが落ちた、だったら当てはまる。
今回の話を喩えるなら普通の車を運転していたら道路が陥没したみたいになる。OSの方が落ちたんだから。
0328デフォルトの名無しさん (ワッチョイ e5d7-JxOY)
垢版 |
2022/03/13(日) 06:05:08.20ID:g8VV1ENe0
常に自分を疑え、なんて根性論めいた主張には興味ないし
弁護士に譲歩的なことを言うなと指示されて本当に思っていることと違うことを陳述するのもこの議論とは関係ない
0330デフォルトの名無しさん (ワッチョイ b901-jCaJ)
垢版 |
2022/03/13(日) 11:39:10.82ID:HQz48e8Z0
>>308
malloc,freeを多用すると
解放し忘れが多くなり
メモリが断片化して
新規メモリが確保できなくなってエラー吐いてんのに
エラーチェックもせずにポインターにアクセス
そしてプログラムが落ちる
さらにOSを巻き込んでPCごと落ちる

でも今時のOSは生半可なことでは巻き込まれない
0331デフォルトの名無しさん (ワッチョイ 69d2-nn6q)
垢版 |
2022/03/13(日) 17:40:39.42ID:5qwn5s+60
解放し忘れ(メモリリーク)と断片化は別概念

16byteを4回確保した後に1回目と3回目で確保したメモリだけ解放すると、
合計32byte空いてるのに飛び地になってるから32byte領域として扱えない
0337デフォルトの名無しさん (ワッチョイ 82ad-6g0K)
垢版 |
2022/03/14(月) 17:46:29.09ID:OOlFm33n0
Windowsは昔から落ちやすい印象
なんというか、OS自体もなんか少しユルい上にみんなして色んなドライバ作って組み込むもんだから余計に落ち易くなってんじゃないかな。
0338デフォルトの名無しさん (ワッチョイ 6910-pPbi)
垢版 |
2022/03/14(月) 17:51:09.33ID:L/zgcwZ50
Win98で512バイトぐらいをいくつmalloc出来るかと試したことがあって、
10万回ちかくでNULL返した・・・いや、1万回だったかな?。
とりあえずOSもアプリも落ちなかった。
0339デフォルトの名無しさん (オイコラミネオ MM95-W3oF)
垢版 |
2022/03/15(火) 21:09:49.60ID:uaV7elHUM
>>249
教えられてないし誰も知らないしwhile(1)で事足りるから
::printfとかもな
わざわざ使ってるやつはアホだと思う
0341デフォルトの名無しさん (オイコラミネオ MM95-W3oF)
垢版 |
2022/03/15(火) 21:19:55.67ID:uaV7elHUM
一部のバカに対して言ってる
マジで::printfなんて使ってるやつなんて滅多にいない
0342デフォルトの名無しさん (オイコラミネオ MM95-W3oF)
垢版 |
2022/03/15(火) 21:22:08.63ID:uaV7elHUM
誰も使ってない表記法使うアホのせいで改めて調べないといけなくなる
使われてないから敢えて教科書に書かれてないし教科書に書かれてないんだから知らないやつが多数派ってことがわからんバカ
0346デフォルトの名無しさん (スプッッ Sd02-nn6q)
垢版 |
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 とかの話ではないが
0347デフォルトの名無しさん (オッペケ Sr91-9aVa)
垢版 |
2022/03/16(水) 14:57:34.41ID:IYkrMFX0r
ああ
それぞれで固有の識別子を記憶する空間があるから ぱっとみの文字が衝突しててもセーフ
という概念か

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

優先度の高い++をしてから代入するように感じるのですが
そうならない理由をご教示ください
0351デフォルトの名無しさん (ワッチョイ 7b7b-P46e)
垢版 |
2022/03/19(土) 12:40:35.63ID:fvSihUDg0
返信ありがとうございます
演算子の優先度を調べると++が=より優先度が高いはずです
式の処理は優先度の高い演算子から処理されると理解しています

そうすると、++が先に実行された後で=(代入)が実行されてもおかしくないと
考えたのですが、どこに誤りがあるのでしょうか?
■ このスレッドは過去ログ倉庫に格納されています

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