X



C言語なら俺に聞け 143
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん (ワッチョイ b375-rVGZ)
垢版 |
2017/10/27(金) 21:28:08.20ID:pAogLeJi0
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言語なら俺に聞け 142
http://mevius.2ch.net/test/read.cgi/tech/1502364083/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
0685デフォルトの名無しさん (ワッチョイ 3d9f-JjO2)
垢版 |
2017/12/03(日) 19:37:50.46ID:iOWX59aS0
>>682
個人的にはComputer=計算機ってのはかなり違和感があるんだよね。
プログラミングって、むしろシーケンサだろ。(処理手続きをひたすら記述する)

数学に似てるのは、結局、チューリングマシンからきてるのだと思う。
もちろん「このプログラミング言語はチューリング完全です」なんてやってるのは数学者であって。

これとは逆に、ニューラルネットワークなんて、正直、まともに証明すらされてないだろ。
なんだか分からないけどうまくいきます、程度であって、
ニューラルネットワークがチューリング完全なのかどうか、誰も証明して無いと思うし、(俺の知る限り)
それ以前に、プログラミングなんて出来る状態じゃない。
今も機械学習で係数を探している程度、つまりトライアンドエラーしか出来ていないわけであってさ。

だから、将来的にニューラルネットワーク等、チューリングマシン以外をプログラミングできるようになれば、
数学じゃないプログラミング手法が見つかる可能性はあると思う。
実際、機械学習自体は物理/数学の教え方(理論を教えてそれを適用)ではなく、
語学の教え方(習うより慣れろで、ひたすら知識(結果)を積み上げる)に近いし。
0690デフォルトの名無しさん (アウアウカー Sa55-iHXH)
垢版 |
2017/12/03(日) 19:59:37.86ID:Gq7SJlPXa
>>683
あー。楽譜ね。そうだね。
0694デフォルトの名無しさん (ワッチョイ 3d9f-JjO2)
垢版 |
2017/12/04(月) 01:19:52.82ID:WOZLf3PZ0
>>692
それはCに階層記述能力が欠けているからだ。

例えばNode(JavaScript)のコーディングルールでは、関数は15行以下にしろとなっている。
> Write small functions
> Keep your functions short. A good function fits on a slide that the people in the last row of a big room can comfortably read.
> So don't count on them having perfect vision and limit yourself to ~15 lines of code per function.
> https://github.com/felixge/node-style-guide#functions-1
やれば分かるが、15行で書く為には、中位記述と下位記述を明確に分け、下位記述は全て関数で括り出すことになる。
このとき、中位記述の関数はベタに手続きだけひたすら書くことになる。
俺も最初は戸惑ったが、実際、この方が読みやすいし、自己ドキュメント化する。

ただしCだとこれはちと辛い。
JavaScriptだとそもそも下位記述がほぼ無く、大体何かしらのメソッドを呼んで終わるし、
階層を自由に作成できるし、プロトタイプ宣言も必要ないし、デフォでクロージャだから外変数を自由に掴める。(引数にする必要がない)
Cだと関数内関数が出来ないし、プロトタイプ宣言も必要だし、全部引数で渡さないといけないし、
GCも無いから宣言スタイルでも書きにくい。また、関数呼び出しも無駄ならケチる文化もある。

最大15行なら、実際は5-10行の関数が氾濫することになるのだが、Cでこれをやるとよけいに読みにくくなる。
だから、Cでは珍しいだろうけど、JavaScript等手抜き系スクリプト言語だったら割と普通だったりするはずだよ。
0695デフォルトの名無しさん (ワッチョイ a66e-hJGX)
垢版 |
2017/12/04(月) 05:34:47.44ID:k2OIwnad0
ただ単にCが嫌いなだけだね
0696デフォルトの名無しさん (ワッチョイ 6d81-JjO2)
垢版 |
2017/12/04(月) 06:16:54.02ID:+uAdunIC0
Cはクラスがないせいで戻り値が使い物にならん
中でMallocして返すとすぐメモリリークする

文字列や配列を扱う関数は
第一引数と第二引数に結果格納用の配列と最大長を渡すというまだるっこしい作業をせんといかん
Cで言語を学ぶと悪いコーディングの癖がついてしまう
0699デフォルトの名無しさん (アウアウカー Sa55-iHXH)
垢版 |
2017/12/04(月) 19:55:28.93ID:vegQ3dVaa
馬鹿っぽさ満載
0701デフォルトの名無しさん (アウアウカー Sa55-iHXH)
垢版 |
2017/12/04(月) 20:15:20.01ID:vegQ3dVaa
構造体へのポインタでも使ってくれ
0702 ◆QZaw55cn4c (ワッチョイ 4a60-L6cJ)
垢版 |
2017/12/04(月) 20:20:54.93ID:ESsPBxjD0
>>696
それがいい習慣というものです、配列(の先頭)と文字列長をセットで扱うのは基本中の基本です
win32api をみればわかりますが、一度目には自分が用意しなければならない領域の大きさについてお伺いをたててから、
二度目にやっと目的の情報を手に入れる、これは C ではセットですね

c++ で文字列型のような便利なアイテムを使っていたために、だんだん馬鹿になってきていたことに、最近ようやく気がつきました:−)
0705デフォルトの名無しさん (アウアウカー Sa55-iHXH)
垢版 |
2017/12/04(月) 20:43:45.92ID:vegQ3dVaa
>>703
snprintf
0710デフォルトの名無しさん (ワッチョイ 967f-HOnN)
垢版 |
2017/12/04(月) 22:32:25.86ID:TOOi+5oW0
>>708
普通は、とりあえずやってみて戻り値判定したあと切り捨てられていたら大きめのバッファにreallocしてつかうんじゃないかな。
確保するメモリサイズは一定の方がいいと思うんだ。

まぁ、Cなら大抵の場合、サイズオーバーでエラー処理へとばす気もするけれど。。。。
0711デフォルトの名無しさん (ワッチョイ 6d9f-HgL3)
垢版 |
2017/12/04(月) 22:35:03.23ID:iGjrIGoV0
asprintf() も良いよね。
GNUの拡張だけど。
0712デフォルトの名無しさん (ブーイモ MM8e-cp23)
垢版 |
2017/12/05(火) 00:24:41.12ID:64NxbaBtM
a55h01e()もいいぞ
拡張するとアレだけど
0713デフォルトの名無しさん (ワッチョイ 1e8a-mhkU)
垢版 |
2017/12/05(火) 01:57:36.13ID:hFLcfi/C0
>>694
頭悪そう
分割数に依存してO(n**2)で命名の手間が増える
O(n**2)は行かないかもしれないがO(n)よりは大
0714デフォルトの名無しさん (ワッチョイ 3d93-kA4S)
垢版 |
2017/12/05(火) 06:27:11.01ID:h9iE2Dgl0
>>708-709
manの「準拠」のところで、snprintf()の第2引数sizeに0を指定できる、
返り値を必要なバッファサイズを決めるのに使えると明記されてるね。
これは有難い。

>>712
エリートな人だなぁ。俺にはよく分からんけど…
男は度胸! 何でもためしてみる、か。
0715デフォルトの名無しさん (アウアウカー Sa55-iHXH)
垢版 |
2017/12/05(火) 09:17:09.05ID:lXQHSkZJa
>>712のやつは多分中々みつからないと思うぞ。>>712のPCのディスクの中か心の中にしかないんじゃないか?w
0716デフォルトの名無しさん (ワッチョイ a66e-hJGX)
垢版 |
2017/12/05(火) 10:03:46.62ID:5svgdXUG0
asshole
0719デフォルトの名無しさん (ワッチョイ 3d93-kA4S)
垢版 |
2017/12/05(火) 19:06:50.63ID:h9iE2Dgl0
-able は「〜することができる」という意味を加える接尾語と解釈できるから
azn と略せる何か動詞っぽい操作を思いつけば char aznable; を
「合法的に」使うことができるね。

単なるフラグなら int なり bool なりを使え、と言われると弱いけど。
0721デフォルトの名無しさん (ワッチョイ 1e8a-mhkU)
垢版 |
2017/12/05(火) 22:18:54.85ID:hFLcfi/C0
15行の関数量産したらfunc1, func2, ...となるのが目に見えている

途中の欠番で変更履歴の推測も可能
素晴らしいドキュメントだな
0723デフォルトの名無しさん (ワッチョイ b5b3-9GJZ)
垢版 |
2017/12/05(火) 22:46:50.50ID:oTa/T8dQ0
ファンクなあ。
アシッドテイストを入れてもう少しオサレな感じにすれば爆発的にヒットするだろうになあ。
0734デフォルトの名無しさん (アウアウカー Sa55-m9bV)
垢版 |
2017/12/06(水) 14:11:49.30ID:UBdFOzE6a
表のように与えられた時各学年の人数と全校の人数をふ計算するプログラムを教えてください。
できれば今日中に。


1組 2組 3組 4組 5組
1年 33 35 34 32 36
2年 34 33 35 33 31
3年 31 32 36 30 35
0738デフォルトの名無しさん (ワッチョイ 3d93-kA4S)
垢版 |
2017/12/06(水) 17:36:10.79ID:mUQybk730
>>734 は学校の宿題か課題の代行をタダでやってくれ、みたいに見えるなぁ。
親切心で教えることが質問者のためになるか疑問ってこと。

元のデータはどういう形で与えられるのかな。
質問の内容から見て、学年数もクラス数も一定で
配列としてソースファイルに埋め込みで良さそうだけど。

学年数やクラス数まで実行時の入力によって可変、となると
かなり面倒な話になるね。
0740デフォルトの名無しさん (スプッッ Sd0a-hmNI)
垢版 |
2017/12/06(水) 18:30:27.51ID:YX7yBjoZd
execve関数を使うためにclearenv()で環境変数を初期化すると手順にあるのだけど
この関数の影響範囲をどう調べればわかるか調べ方もしくは影響範囲が知りたいです
manページを見ても名前と値の組の環境変数を〜みたいな話しかなくて困ってます
0742デフォルトの名無しさん (アウアウカー Sa55-iHXH)
垢版 |
2017/12/06(水) 20:41:52.15ID:5GqDQnIfa
>>734
宿題用のスレなかったっけ?
C言語のはなかった?
0743デフォルトの名無しさん (アウアウカー Sa55-iHXH)
垢版 |
2017/12/06(水) 20:42:56.94ID:5GqDQnIfa
>>735
君のやりたいことがよくわからない。
0744デフォルトの名無しさん (アウアウカー Sa55-iHXH)
垢版 |
2017/12/06(水) 20:50:51.97ID:5GqDQnIfa
>>740
影響範囲?そりゃ環境変数使うプログラム全てだろう。特にPATH使うようなやつ(外部コマンドをフルパス使わずに動かす可能性のあるプログラム)は影響受けるよね。
その他、動かすコマンドによって影響は違うと思う。これから動かそうとしているコマンドがどういう環境変数を使うかに掛かっている。だからこうだと固定的に言うことができない。
0745デフォルトの名無しさん (スプッッ Sd6d-hmNI)
垢版 |
2017/12/06(水) 21:47:43.97ID:9SICms2Nd
>>744
無知ですまんが
環境変数をクリアするってことは要はLD_LIBRARY_PATHに登録されてるものをすべて無にするってことなのだろうか
これは一時的なもの?それとも永続的なもの?

ここらを参考にsystem関数ではなくexecveを使う方針になったのだけど
むしろ改悪になってるんじゃないかとなってきている
https://www.jpcert.or.jp/sc-rules/c-env33-c.html
http://www.jpcert.or.jp/m/sc-rules/c-env03-c.html

下を読んでなんとなく何がリセットされるのかはわかってきたけども
それがどう影響を与えるのだろうかと
https://www.ipa.go.jp/security/awareness/vendor/programmingv2/contents/c703.html
0746デフォルトの名無しさん (スプッッ Sd6d-hmNI)
垢版 |
2017/12/06(水) 21:52:07.31ID:9SICms2Nd
下記のように書いてあるけども
むしろ影響範囲でか過ぎるんじゃねぇか?ってのが困ってるところ
確かに改竄とかの対策にはなるとは思うんだけど
リセットしてしまったことによって使えなくなるものについてはどう担保するのかがわからない

このクリアが呼び出した関数内だけなのか、呼び出したプロセスやスレッドだけなのか、呼び出したら再起動までずっとなのか、呼び出したら再起動しても以降ずっとなのかと


(2) 環境変数のクリア
外部プログラムをコールする(exec(3))前に、環境変数をすべてクリアするとより安全になる。環境変数をクリアするには、clearenv(3) をコールすればよい。

clearenv(3) が無い環境では、以下のように extern char **environ 変数を直接クリアする。
environ = NULL;
※上記の方法で環境変数をクリアしても、system (3) による子プロセスの環境変数は、クリアされず再設定されたものになる。
0748デフォルトの名無しさん (ワッチョイ 6d9f-nek4)
垢版 |
2017/12/06(水) 22:02:54.34ID:u7C0REjG0
>>745
一時的もなにもそれを実行したプロセスとそのプロセスからexecしたプロセスにしか影響しないよ。だからfork()後に子プロセスだけでやるなら親プロセスには影響しないしその他無関係なプロセスにも影響はない。
0749デフォルトの名無しさん (ワッチョイ 6d9f-nek4)
垢版 |
2017/12/06(水) 22:05:07.83ID:u7C0REjG0
>>745
環境変数はシステム全体で一箇所に持っているものではなくプロセス単位で持ってるものだからね。そしてexecの時に引き継ぐ事もできるようになってるだけ。
0750デフォルトの名無しさん (スプッッ Sd6d-hmNI)
垢版 |
2017/12/06(水) 22:31:14.96ID:9SICms2Nd
>>748
>>749
イケメンな回答ありがとう
それってどこを見たら分かるものなのだろうか
俺調べるのが苦手でどれがそのことを示してるのだろうか
その的確な回答をしてくれてとても分かりやすくてとても助かってるが俺も自身でわかるようになりたい
0752デフォルトの名無しさん (ワッチョイ 17d3-vw7f)
垢版 |
2017/12/07(木) 00:29:29.78ID:X12IxieF0
初心者です
時間取得の関数で待ち時間を作るの方法は使わずに、
現在の処理の完了した後、次の処理に移らせるにはどのようにすればいいんですか?

現在の処理が始まった瞬間に次の処理に移ってしまいます


現在の処理とは、マウスポインタの操作です

お願いします
0753デフォルトの名無しさん (ワッチョイ d79f-qmOZ)
垢版 |
2017/12/07(木) 00:53:41.38ID:9lSPChPb0
>>752
おそらくそれだけの説明では大半の人が答えられないと思う。(エスパーを除く)
0756デフォルトの名無しさん (ワッチョイ 5793-3gxb)
垢版 |
2017/12/07(木) 08:07:08.94ID:W1nCZ1Cb0
>>755
「概要」の第3段落冒頭かな。
「環境変数は、各プロセスに付随するデータである」

この1文から「プロセスごとに環境変数は独立」を読み解くのは
この手の文章に対する程度の慣れが要求されるかも。
0757756 (ワッチョイ 5793-3gxb)
垢版 |
2017/12/07(木) 08:28:21.42ID:W1nCZ1Cb0
最後の行は言うまでもなく「ある程度の慣れ」が正しい。
「ある」を打ち忘れたアル。
0761デフォルトの名無しさん (スップ Sd3f-KxrP)
垢版 |
2017/12/07(木) 12:10:49.09ID:6ZyfpAbkd
>>760
そいつというと親プロセスでしょうか子プロセスでしょうか
知りたいこととしてはwaitpidを親プロセスが処理を抜けるタイミングについてです
エラーを受けたら抜ける、正常に終了したら抜けるってのはわかったのですが、
これ以外にwaitを解くタイミングがないのかと
0768デフォルトの名無しさん (ワッチョイ 17b3-LVSJ)
垢版 |
2017/12/09(土) 19:00:18.23ID:wLDySn0e0
乱数を使って異なる4つの数を作りたい
色々調べると a[10] = {0,1,2,〜,9};
を作って4つランダムに抜き出すとかも見つけたんだけどこれでも重複回避方法がわからん...
0770デフォルトの名無しさん (ワッチョイ bfb6-QZHg)
垢版 |
2017/12/09(土) 19:28:52.45ID:oe+MwYG+0
>>769
乱数を作りたいと言ってるわけじゃないわけでー
0774デフォルトの名無しさん (ワッチョイ 17b3-0+aW)
垢版 |
2017/12/09(土) 19:38:14.85ID:f1LM7KYB0
とりあえず異なる4つの数を作りたいって言ったけど最終目標がHit&Blowだからマクロについて学んでくる
0775デフォルトの名無しさん (ワッチョイ 17b3-0+aW)
垢版 |
2017/12/09(土) 19:39:02.99ID:f1LM7KYB0
あっスマホとPCでID変わるんだった
0776デフォルトの名無しさん (ワッチョイ 17b3-0+aW)
垢版 |
2017/12/09(土) 19:40:07.11ID:f1LM7KYB0
配列をシャッフルか...なるほど...
0777デフォルトの名無しさん (ワッチョイ 5793-3gxb)
垢版 |
2017/12/09(土) 19:59:49.27ID:0DJ42hmW0
配列をシャッフルするって方法は、カードゲームや麻雀の洗牌で使うよね。
文字通りシャッフル、一揃いの順番を混ぜ合わせる操作として。
連番で初期化した配列の、乱数で選んだ2つのインデクスの要素同士を入れ替え。
ある程度の回数ループさせると重複なく順番がバラバラになる。

他には、素朴な乱数ルーチンと組み合わせて乱数の質を改善する方法として
乱数プール(配列)の中から乱数で選んだ(インデクスの)値を出すってのを
見たことがある。
最近は高品質な生成アルゴリズムを使うのだろうけど。
0779デフォルトの名無しさん (ワッチョイ 578c-FlEo)
垢版 |
2017/12/09(土) 20:41:26.15ID:gdFl+nNB0
>>連番で初期化した配列の、乱数で選んだ2つのインデクスの要素同士を入れ替え。
>>ある程度の回数ループさせると重複なく順番がバラバラになる。

それは初心者にありがちな悪手。回数を増やすと見た目はランダムっぽく
なるけどあまりランダムにならない。
1枚目を全体からの一様乱数、2枚目を残りから一様乱数、・・・という具合に選ぶのがいい
0781デフォルトの名無しさん (ワッチョイ d79f-qmOZ)
垢版 |
2017/12/10(日) 06:04:19.96ID:J0bkBqjd0
それはC言語ではなかろう
■ このスレッドは過去ログ倉庫に格納されています

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