C言語なら俺に聞け 143
■ このスレッドは過去ログ倉庫に格納されています
>>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 昨日の768です
Fisher-Yates shuffle
が凄く役に立ちました。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void shuffle(int ary[], int size);
int main(void) {
int list[10] = { 0,1,2,3,4,5,6,7,8,9 };
shuffle(list, 10);
for (int i = 0; i < 10; i++) {
printf("%d,", list[i]);
}
return 0;
}
void shuffle(int ary[], int size) {
for (int i = 0; i < size; i++) {
int j = rand() % size;
int t = ary[i];
ary[i] = ary[j];
ary[j] = t;
}
} これだと10桁表示されてしまうので、4桁分表示するように変更
色々有り難うございました
HitとBlowの処理行ってきます 4桁なら乱数4つ求めた後で重複調べてあったらまた求めるっての繰り返しても良いんじゃないか? arySize = 10
range = 0...arySize # 未満
ary = range.to_a
def shuffle(ary, size, range)
for i in range
j = Random.rand(size)
puts "i=#{i} ← j=#{j} : value #{ary[i]} ← #{ary[j]}"
ary[i], ary[j] = ary[j], ary[i]
end
end
shuffle(ary, arySize, range)
p ary
i=0 ← j=8 : value 0 ← 8
i=1 ← j=9 : value 1 ← 9
i=2 ← j=2 : value 2 ← 2
i=3 ← j=9 : value 3 ← 1
i=4 ← j=7 : value 4 ← 7
i=5 ← j=5 : value 5 ← 5
i=6 ← j=4 : value 6 ← 7
i=7 ← j=8 : value 4 ← 0
i=8 ← j=7 : value 4 ← 0
i=9 ← j=9 : value 3 ← 3
[8, 9, 2, 1, 6, 5, 7, 4, 0, 3]
>j = Random.rand(size)
Ruby で書いたけど、これだと、0〜9 のまま一定だろ。
Fisher-Yates shuffle では、ループの度に、1ずつ減らさないといけないよな? >>779
Fisher-Yates shuffle で検索したら、関連情報として >>777 の方法が
良くないことと、その理由が説明されてるページが見つかった。
可能な並べ方の全パターンが等しい確率で出現するか否か、
というアルゴリズムの原理からの比較は分かりやすくて説得力があった。
個人のページみたいなのでリンクは張らないけど、
「Fisher-Yates shuffle ランダムシャッフル」で出るかと。 最初から全部の組み合わせの分のテーブル作っておいて、
そいつを乱数で選ばせりゃ一発で決まりだろ? いまどきハードディスクなんかテラバイト単位でデータ持てるじゃん。 ふつうに Fisher-Yates でいいと思うよ >>788
おお。斬新なアイデア。
4つしかなくて0〜9ならそれでも問題ないな。(メモリが全然ないような特殊な場合を除いて)。 それするなら、0〜9999の乱数を求めて各桁を使えばいい
配列を作る必要はない >>791
トランプゲーム作った時は真面目にカード配列ん中シャッフルしたわな。懐かしい、 >>793
各桁の検査の為に分解するんだからむしろ効率悪いんじゃね? /wiki/シャッフル (カード)
各シャッフル方法をプログラムで再現するには・・・ >>800
つうか、一回限りなら意味が無いかもな。
テーブルに出た回数も記録して同じ組み合わせは出ない様にも出来たり、テーブル自体も別系列の乱数でシャッフルするとか、
使い道は無限大さ。 なんとなくこねくり回しても数学的に無意味な感じがしてならない。 実務で使う関数とか数学的には何の意味も無いなんて、当たり前だろw C言語覚えたい頼む
このアホに教えこんで理解させるとしたらまずなんのテキスト使う?
教え上手のおまいらに最後の希望を託す
(ちな言われたことは必ずやります) >>805
http://codepad.org/
このコードパッドというサイトで、「ハローワールド」を表示するプログラムを実行できたら、ほめてやろう。
C言語でプログラムを実行するには「おまじない」が必要だ。 しかも、そのおまじないは半角文字と全角文字を区別する。
一文字でも間違えたら正しく動かない。 確実に正しくプログラムを入力したいなら、「コピペ」すればいい。 ■ このスレッドは過去ログ倉庫に格納されています