C言語なら俺に聞け 143
■ このスレッドは過去ログ倉庫に格納されています
>>682 個人的にはComputer=計算機ってのはかなり違和感があるんだよね。 プログラミングって、むしろシーケンサだろ。(処理手続きをひたすら記述する) 数学に似てるのは、結局、チューリングマシンからきてるのだと思う。 もちろん「このプログラミング言語はチューリング完全です」なんてやってるのは数学者であって。 これとは逆に、ニューラルネットワークなんて、正直、まともに証明すらされてないだろ。 なんだか分からないけどうまくいきます、程度であって、 ニューラルネットワークがチューリング完全なのかどうか、誰も証明して無いと思うし、(俺の知る限り) それ以前に、プログラミングなんて出来る状態じゃない。 今も機械学習で係数を探している程度、つまりトライアンドエラーしか出来ていないわけであってさ。 だから、将来的にニューラルネットワーク等、チューリングマシン以外をプログラミングできるようになれば、 数学じゃないプログラミング手法が見つかる可能性はあると思う。 実際、機械学習自体は物理/数学の教え方(理論を教えてそれを適用)ではなく、 語学の教え方(習うより慣れろで、ひたすら知識(結果)を積み上げる)に近いし。 ところで、人工知能のバグ取りってどうやんの? それともダメな子だから抹殺しちゃうの? 人格と知識は分離可能になるだろう。人格モジュールを切り替えたり、アップデートするんだろう。 自分自身が間違っていると判定されたら(サニティチェック)、「人格を初期化または取り換えて下さい」と表示される。 >>685 シーケンサってコンピュータの一種じゃ…? というか計算しないで手続きだけひたすら書くのって わりと特殊な方じゃないかな シーケンサー(通称PC)はアセンブラもあったりするけど 基本デノイマンだよ。 >>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等手抜き系スクリプト言語だったら割と普通だったりするはずだよ。 Cはクラスがないせいで戻り値が使い物にならん 中でMallocして返すとすぐメモリリークする 文字列や配列を扱う関数は 第一引数と第二引数に結果格納用の配列と最大長を渡すというまだるっこしい作業をせんといかん Cで言語を学ぶと悪いコーディングの癖がついてしまう オブジェクトへのポインタを1つ追加するだけでリエントラントな作りになるだろうに。 >>696 それがいい習慣というものです、配列(の先頭)と文字列長をセットで扱うのは基本中の基本です win32api をみればわかりますが、一度目には自分が用意しなければならない領域の大きさについてお伺いをたててから、 二度目にやっと目的の情報を手に入れる、これは C ではセットですね c++ で文字列型のような便利なアイテムを使っていたために、だんだん馬鹿になってきていたことに、最近ようやく気がつきました:−) バッファの大きさを受けて範囲内で書き込む sprintf じゃなくて sprintf のフォーマット処理した結果、こんだけの大きさが欲しいって答える関数はないのかな >>705 snprintf() は >>703 の希望をかなえてはくれないのでは? >>705 snprintf は 渡した大きさで打ち切ることはするけど、完全に必要なサイズを返すっけ? 書き込んだ文字数だから打ち切った場合たかだか渡した大きさ-1 だと思うけど >>707 自己レス C99 から戻り値が完全な長さを答えてくれるみたい なので len = snprintf(buf, 0, .... ); len+1 以上確保して snprintf(buf, len+1, .... ); これが出来るのか >>708 普通は、とりあえずやってみて戻り値判定したあと切り捨てられていたら大きめのバッファにreallocしてつかうんじゃないかな。 確保するメモリサイズは一定の方がいいと思うんだ。 まぁ、Cなら大抵の場合、サイズオーバーでエラー処理へとばす気もするけれど。。。。 asprintf() も良いよね。 GNUの拡張だけど。 >>694 頭悪そう 分割数に依存してO(n**2)で命名の手間が増える O(n**2)は行かないかもしれないがO(n)よりは大 >>708-709 manの「準拠」のところで、snprintf()の第2引数sizeに0を指定できる、 返り値を必要なバッファサイズを決めるのに使えると明記されてるね。 これは有難い。 >>712 エリートな人だなぁ。俺にはよく分からんけど… 男は度胸! 何でもためしてみる、か。 >>712 のやつは多分中々みつからないと思うぞ。>>712 のPCのディスクの中か心の中にしかないんじゃないか?w char aznable は、いつか、やるかも、しれない -able は「〜することができる」という意味を加える接尾語と解釈できるから azn と略せる何か動詞っぽい操作を思いつけば char aznable; を 「合法的に」使うことができるね。 単なるフラグなら int なり bool なりを使え、と言われると弱いけど。 >>713 横だが 関数名が事実上のドキュメントになるんだよ 15行の関数量産したらfunc1, func2, ...となるのが目に見えている 途中の欠番で変更履歴の推測も可能 素晴らしいドキュメントだな ファンクなあ。 アシッドテイストを入れてもう少しオサレな感じにすれば爆発的にヒットするだろうになあ。 関数名はプログラマがこう動いて欲しいという願望まで func なんて関数名見かけたら fack に置き換えるわ >>728 ドイツ語とか関数名変数名だけでコード9割埋まりそう そう考えると世のプログラミング言語のベースが中国語だったら表意文字だしだいぶ可読性高そう 日本語はむしろ同じ物を表す書き方が平仮名片仮名漢字と何通りもあるから面倒だろ。 表のように与えられた時各学年の人数と全校の人数をふ計算するプログラムを教えてください。 できれば今日中に。 1組 2組 3組 4組 5組 1年 33 35 34 32 36 2年 34 33 35 33 31 3年 31 32 36 30 35 >>734 は学校の宿題か課題の代行をタダでやってくれ、みたいに見えるなぁ。 親切心で教えることが質問者のためになるか疑問ってこと。 元のデータはどういう形で与えられるのかな。 質問の内容から見て、学年数もクラス数も一定で 配列としてソースファイルに埋め込みで良さそうだけど。 学年数やクラス数まで実行時の入力によって可変、となると かなり面倒な話になるね。 安心して翌朝覗いてみたら何も上がってないという寸法さ execve関数を使うためにclearenv()で環境変数を初期化すると手順にあるのだけど この関数の影響範囲をどう調べればわかるか調べ方もしくは影響範囲が知りたいです manページを見ても名前と値の組の環境変数を〜みたいな話しかなくて困ってます >>734 宿題用のスレなかったっけ? C言語のはなかった? >>740 影響範囲?そりゃ環境変数使うプログラム全てだろう。特にPATH使うようなやつ(外部コマンドをフルパス使わずに動かす可能性のあるプログラム)は影響受けるよね。 その他、動かすコマンドによって影響は違うと思う。これから動かそうとしているコマンドがどういう環境変数を使うかに掛かっている。だからこうだと固定的に言うことができない。 >>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 下記のように書いてあるけども むしろ影響範囲でか過ぎるんじゃねぇか?ってのが困ってるところ 確かに改竄とかの対策にはなるとは思うんだけど リセットしてしまったことによって使えなくなるものについてはどう担保するのかがわからない このクリアが呼び出した関数内だけなのか、呼び出したプロセスやスレッドだけなのか、呼び出したら再起動までずっとなのか、呼び出したら再起動しても以降ずっとなのかと (2) 環境変数のクリア 外部プログラムをコールする(exec(3))前に、環境変数をすべてクリアするとより安全になる。環境変数をクリアするには、clearenv(3) をコールすればよい。 clearenv(3) が無い環境では、以下のように extern char **environ 変数を直接クリアする。 environ = NULL; ※上記の方法で環境変数をクリアしても、system (3) による子プロセスの環境変数は、クリアされず再設定されたものになる。 >>745 一時的もなにもそれを実行したプロセスとそのプロセスからexecしたプロセスにしか影響しないよ。だからfork()後に子プロセスだけでやるなら親プロセスには影響しないしその他無関係なプロセスにも影響はない。 >>745 環境変数はシステム全体で一箇所に持っているものではなくプロセス単位で持ってるものだからね。そしてexecの時に引き継ぐ事もできるようになってるだけ。 >>748 >>749 イケメンな回答ありがとう それってどこを見たら分かるものなのだろうか 俺調べるのが苦手でどれがそのことを示してるのだろうか その的確な回答をしてくれてとても分かりやすくてとても助かってるが俺も自身でわかるようになりたい 初心者です 時間取得の関数で待ち時間を作るの方法は使わずに、 現在の処理の完了した後、次の処理に移らせるにはどのようにすればいいんですか? 現在の処理が始まった瞬間に次の処理に移ってしまいます 現在の処理とは、マウスポインタの操作です お願いします >>752 おそらくそれだけの説明では大半の人が答えられないと思う。(エスパーを除く) マウスイベントの取得はOSの仕事 OSのAPIドキュメント見れ >>751 中身見てみたけどプロセスごとに環境変数が割り振られてるってどれが意味してるのだろうか homeとかいろいろなものがあるのはわかったのだが.... >>755 「概要」の第3段落冒頭かな。 「環境変数は、各プロセスに付随するデータである」 この1文から「プロセスごとに環境変数は独立」を読み解くのは この手の文章に対する程度の慣れが要求されるかも。 最後の行は言うまでもなく「ある程度の慣れ」が正しい。 「ある」を打ち忘れたアル。 >>756 納得した 確かにそう読める waitpidで大気中に割り込みとか入ったらどうなるか教えてくれませんか manには記載がなかったです >>758 ハード的な割込みそのものはプロセスに影響しないよ。 そいつがシグナル出したらそれ次第だが。 >>760 そいつというと親プロセスでしょうか子プロセスでしょうか 知りたいこととしてはwaitpidを親プロセスが処理を抜けるタイミングについてです エラーを受けたら抜ける、正常に終了したら抜けるってのはわかったのですが、 これ以外にwaitを解くタイミングがないのかと >>761 waitpidの仕様を聞くんじゃなくて、何をしたいか書く方が早いよ ゲスパーするとタイムアウト付で waitpid のブロッキングから帰ってきて欲しいんでないの? ブロックしないオプション知らないのかな manまったく読めてねーな セール中 ハロー“Hello, World” OSと標準ライブラリのシゴトとしくみ http://www.amazon.co.jp/dp/B01GH9AM8C “Hello, Work”標準派遣のシゴトとしくみ サイバーセールは他に買いたいものがいろいろあるからなあ 乱数を使って異なる4つの数を作りたい 色々調べると a[10] = {0,1,2,〜,9}; を作って4つランダムに抜き出すとかも見つけたんだけどこれでも重複回避方法がわからん... >>768 重複しないってルールがある時点で 乱数ではない件について小一時間説教をしたい >>769 乱数を作りたいと言ってるわけじゃないわけでー n個の中から1つ選ぶ。 n-1個の中から1つ選ぶ。 n-2個の中から1つ選ぶ。 。。。 配列に連番で入れて 配列をシャッフルして 配列の先頭から4個抜きとる お手元のトランプで試してみろよ 絶対に重複しないから とりあえず異なる4つの数を作りたいって言ったけど最終目標がHit&Blowだからマクロについて学んでくる 配列をシャッフルするって方法は、カードゲームや麻雀の洗牌で使うよね。 文字通りシャッフル、一揃いの順番を混ぜ合わせる操作として。 連番で初期化した配列の、乱数で選んだ2つのインデクスの要素同士を入れ替え。 ある程度の回数ループさせると重複なく順番がバラバラになる。 他には、素朴な乱数ルーチンと組み合わせて乱数の質を改善する方法として 乱数プール(配列)の中から乱数で選んだ(インデクスの)値を出すってのを 見たことがある。 最近は高品質な生成アルゴリズムを使うのだろうけど。 「Fisher-Yates shuffle」で検索! >>連番で初期化した配列の、乱数で選んだ2つのインデクスの要素同士を入れ替え。 >>ある程度の回数ループさせると重複なく順番がバラバラになる。 それは初心者にありがちな悪手。回数を増やすと見た目はランダムっぽく なるけどあまりランダムにならない。 1枚目を全体からの一様乱数、2枚目を残りから一様乱数、・・・という具合に選ぶのがいい std::shuffle, 古いコンパイラならstd::random_shuffle ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.1 2024/04/28 Walang Kapalit ★ | Donguri System Team 5ちゃんねる