C言語なら俺に聞け 151
■ このスレッドは過去ログ倉庫に格納されています
前スレ
C言語なら俺に聞け 150
https://mevius.5ch.net/test/read.cgi/tech/1549427943/
!extend:checked:vvvvv:1000:512
!extend:checked:vvvvv:1000:512
↑
次スレを作る時は上記1行を「1行目に」コピーして2行に増やして必ず1行目に入るようにしてください。
…あってる…? これで良い…のかな
!extend:checked:vvvvv:1000:512
↑
次スレを作る時は >>1 の上記1行を「1行目に」コピーして2行に増やして必ず1行目に入るようにしてください。 前スレ977のリンクが404ぽいので
魚拓から復元してみた
https://ideone.com/IhBGrr
977 名前:デフォルトの名無しさん (アウアウエー Sa3f-XwTE)[] 投稿日:2019/04/01(月) 21:33:02.04 ID:v6mAk26Pa [1/3]
「要素型がint型で要素数がnの配列を受け取って、
全要素に添字と同じ値を代入する関数set_idx」を作成しました。
http://codepad.org/krsZoljq
配列aの要素数はマクロ定義で#define NUMBER 10とし、
問題なく動作しました。
ところが、この要素数10を60に書き換えてみたところ、
コンパイルされたexeファイルを実行しても動作しません。
コンパイラはMinGW(gcc)です。
思い当たる原因を教えていただけないでしょうか。 >>4
codepadが消えてしまっていたのですね、
復元ありがとうございます。
当初は16行目を
int a[] = {0};
と書いていたため上手く動作せず質問した次第です。
前スレで色々とレス頂きありがとうございました。
プログラムを書く際にバッファオーバーランの危険性を考慮する必要があることすら知らないレベルなので、
メモリの使い方を念頭において学習していきます。
C言語は諦めた方がよいというレスもありましたが、
センスがないのは重々承知の上で、腹を括って勉強していくつもりです。 >>5
いえ
すみません
「呼び出し元で配列長を管理出来ている。問題はない」と言いうるようです /* むしろ free し忘れる方が問題か */
誤解・不適切な部分があったこと、申し訳なく存じます
色々大変かも知れませんが、頑張ってください >>5
cは非生産的で大したアプリは最初のうちは作れない
しかし覚えれば言語やOSや組み込みなどに手が出せるようになる
独学はイバラの道だが頑張ってね >「c言語 おすすめしない理由」でググると
>https://www.sejuku.net/blog/3619
sejukuはねーよ
C言語のウソ記事まき散らしたとこじゃねえか 全く以てくだらんな
何言語だろうが関係ねえ話で
習得できなかったやつの言い訳を集めただけの駄文だ
もし「初心者」がここを見ているなら一言いいたい
【 あ ん な の 忘 れ ろ 】
プログラム言語に限らず人生すべてに影響する有害な集団催眠だ 既存のソフト(dll)を引き継いだのですが、そのdll内でバイナリファイルをリードしています。
_open(xxx, _O_BINARY, _S_IREAD) しているのですが、複数のプロセスが同じタイミングでアクセスしても排他処理されないですよね?
どうもうまく読めてないのが原因かもしれない障害が発生して困っています。
どうすれば排他処理できるでしょうか。 レスありがとございます。
後だしですが、書き込みはされないです。そこまでかんがえてなかったですが。
リードだけなら大丈夫そうですね。だったら他のとこに問題があるのかな・・・ ファイル書いてる最中に読まないようにそのライブラリを使う側と書き込みする側のプログラムでロック掛けるようにするぐらいしか方法ないのでは?
ライブラリのソースもあって自分でも直せるというのなら自分でその辺改造しちゃえば良いんだろうけど。それだったらわざわざここに質問書かんよな? そもそも1プロセスでもそのファイルをオープンできているのだろうか? どこまで説明したら適切なアドバイスもらえるかって実務にも重要な要素だよな。これも練習ですな。 https://wandbox.org/
codepad死んだっぽいので次スレから代わりに↑をテンプレに入れよう ここどう?
https://www.jdoodle.com/
色んな言語使えるようだ。もちろんCもある。 fprintf_s みたいな
foo_s 系の関数実装って増えてるん?
「Visual C++ でガッコウのコードがコンパイルできない」みたいな話をたまに見かけるけど… セキュリティの為にfoo_sが推奨されてるんだから、ガッコウのコードの方を変えるべきでは?
何年経ったと思ってるんだ。 >>22
その s 系とかいうやつは、いまいち気に要らない仕様でいちいち頭に来るので私は使わないです >>23
_s 系の関数って言語仕様上はオプショナルでしょ。
安全でない関数の中で明確に仕様から削除されたのは
gets だけのはずだし、もちろん、安全性を意識させるのは
望ましいけど、どこでも _s 系の関数を使えるわけじゃない。
あくまでもオプショナルだから >>22 は「実装って」という聞き方をしているのだと思うぞ。 >>25
Microsoft のコンパイラ以外では使えない、と聞いているのも納得がいかないのです、本当によいものなら、なぜ _s 系が移植されないのでしょうか… >>26
そんなことを >>22 は聞いていない。
誤読。 >>27
失礼。>>26 は >>22 への直接または間接の回答を意図しておりません
とある「有用な」実装が広く使われるべき、という意見に対して、microsoft のコンパイラ環境でしか使えない実装を教育目的で強要してもいいのか、というか、そもそもそんなに「有用」な実装なのですか?本当ですか?
という視点で >>22 を強く批判する内容です >>28
_s 系の関数はオプショナルとは言えども規格にある存在なので、
Visual C++ は例のひとつとして挙がっているにすぎません。
間違いなくありがちな問題を軽減しますので、
使える処理系ならば使うように誘導するのは合理的です。 >>29
お手数をおかけし恐縮ですが
「規格にある存在」というその規格をご教示願えますか?
手元にある ISO/IEC 9899:1999 には見えないようですが… visual studioで新しいプロジェクトを作成して始めてビルドする度に
/D _CRT_SECURE_NO_WARNINGS
に誘導されてます…… localtime_s 使ったら内部でmutex使ってて無茶苦茶遅いのはむかついた >>30
なぜそんな古いものを…
引数にvoid入れるとびっくりするタイプ? localtimeについては批判できねぇ。
マルチスレッドでlocaltime呼び出してたせいで正体不明のバグに数日間悩まされたからな。。。 >>30
C99 には無い。 C11 に入った。
Annex K (normative) Bounds-checking interfaces
って項目ね。
Wipkipedia でも言及がある。
https://ja.wikipedia.org/wiki/C11_(C%E8%A8%80%E8%AA%9E)#.E3.82.AA.E3.83.97.E3.82.B7.E3.83.A7.E3.83.B3.E6.A9.9F.E8.83.BD >>22
> fprintf_s みたいな
> foo_s 系の関数実装って増えてるん?
「いや増えてない」←わかる
「俺は foo_s みたいな関数が嫌い」←わかる
「俺は foo_s みたいな関数が嫌いだから >>22 を強く批判する」←全く分からない
誰か解説してくれるのだろうか
私は「ガッコウのセンセイ」でもないし「ガッコウの教材」の著者でもないから何とも
新学期だから知恵袋とかに質問増えそうじゃん? >>22 を批判してるんじゃなくて>>22 にかかれてるような状況を批判してるんじゃないの? >という視点で >>22 を強く批判する内容です
そう解釈してやっても良いが、この日本語はおかしい 真の漢なら
#ifdef _win32
localtime_s()
#else
localtime_r()
#endif >>42
__STDC_LIB_EXT1__ を使った方がポータブルじゃない? >>43
ググってヒットした件数的にこんなん使えませんわ。 >>47
件数じゃなくて、用途に対する妥当性で考えてよ 質問スレっぽいスレタイなのにそこまで考えさせられるのかよw
あんまり使われてないっぽいものは使わないってスタンスは崩さないよ、俺は。 使われてないものは使わない
つまりC言語自体・・・(ボソッ >>35
ほえ〜
Annex K は確かにみじんも記憶に残っていません…でした
ご教示いただき感謝いたします >>33
実は K&R2 のみが正義、K&R2 こそ必要にしてかつ十分、という立場なので、そんな私が C99 を推挙した時点で、すでにして大幅に compromise しているつもりなのでした… K&R2って妥協の産物だろ
K&R1こそ原理主義者の拠り所だ でもまあ JIS の最新は C99 相当だしな。
英語を読むのはしんどいし、
日本語の資料があるなら日本語の方がいいわ。 >>54
>K&R2って妥協の産物
それも理解できます
K&R2 の最大の改悪部分は「構造体の実体渡しができること」
配列の実体を丸まま関数に渡せないくせに、構造体では出来るって意味わかんない
もしかして
struct S {
int a[65536];
};
とかいう構造体があったら、それを全部スタックに載せるつもりなのか?そういうことをする奴が現れる可能性を考えたのか?と小一時間問い詰めたい気分になりました… struct S {
long long ago0[1048576*1048576];
long long ago1[1048576*1048576];
long long ago2[1048576*1048576];
long long ago3[1048576*1048576];
}; >>56
それは、配列の方が悪いんでしょうに
構造体はコピーを渡すのが全然正しいじゃないの in a galaxy far,
far away... /* not reach here outside the universe */ >>58
構造体といえどもアドレスを渡すのが真に正しく、配列なら言語仕様でそれを強要される、なぜ構造体には甘い顔を見せる必要があるのか? >>56
極端なことが「できてしまう」のが問題ということですか? そもそも C なんてそんなものでしょう。
状況を見て適当に使い分けるべきで、駄目な使い方をしたら何だって駄目ですよ。 >>63
ド素人の勝手な推測だけれども
「配列だとマジでサイズどんだけか分かったもんじゃないじゃん」
「構造体のメンバ」に配列が来る場合はあるけど、そのサイズは多寡が知れてるじゃん」
という考えかもアリかもしんない むしろ勝手にアドレス渡しになる配列が甘やかされすぎ
文字列がcharの配列だからしょうがないけど 配列の実引数をポインタ仮引数で受けれるという仕様上、配列のサイズ情報が失われコンパイラは何バイトコピーすれば良いか分からないから致し方ない。 >>56
昔々初心者の頃にやっちゃって物凄く遅くなって気づいた事があったw 構造体も const で渡されたらこっそりポインタ使って読むだけのアクセスするコード作っちゃっても良いのにな。
マルチスレッドで動くプログラムの時に死ぬかも知れんが。 そもそも[]が無ければ誤解も減ったと思うよ
いい年した大人が、引数で渡ってきた配列の sizeof 取ろうとするの良く見るぜ 現代教えられてる言語で60年代中期の古さを引きずってる言語だからだ
配列に対してsize適用すれば長さを取れるのは現代じゃあ普通で、
取れないC言語のほうがおかしい、
これ、誤解でも何でもないからな >>58
事実上、構造体はほとんどの場合ポインタで渡すよな
実体で渡すという特殊なケースがデフォになってて
ポインタで渡すという主要な使い方でアドレス演算子が必須って
おかしくね? >>70
だよな
[]こそ諸悪の根元
自動変数と仮引数と外部宣言でみんな意味違うとか
気が狂ってるとしか思えない そして「C言語はおかしい」と満場一致で結論が出て、また新たな言語が作られるのであった。
完 >>73
たまから、構造体はint, doubleとかの変数と同じく値渡しで一貫してる
配列がおかしいだけ 不定と未定義がある限り、C言語はおかしくあり続けるのだ。 >>77
const使わんの? ・・・て、先に誰か言ってるな >>78
intが値渡しと決められた理由は理解してるか?
配列みたいに暗黙のアドレス演算子にもやればできた話で
そのほうがおまえさんの主張する一貫性にも叶うわけだが >>80
そりゃ、付けられるときは基本いつでもconstですよ
だからなに >>84
77で「安全のために」って言っているのを
誤って変更してしまうのを防ぐためと読んでいたが
これがそもそも違うのか? >>86
変更しようがしまいが、意図があろうがなかろうが、コンテクストを分けるためですよ。 >>87
へー、じゃあ関数を呼び出すたびごとにプロセス生成とかすんの? >>88
なんで?
チミは頻繁にグローバル変数を使うってこと?やめたほうがええよ >>89
なんでグローバル変数を使っちゃいかんのだ?
スタックにしまえば安全だと思っているならおめでたいやつよ >>90
グローバル変数だめでしょ。
スタックってなんのこと?まさか関数呼び出しとスタックがセットだと思ってる? ■ このスレッドは過去ログ倉庫に格納されています