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
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言語ではなかろう
0783デフォルトの名無しさん (ワッチョイ 17b3-LVSJ)
垢版 |
2017/12/10(日) 11:45:02.06ID:jSvVl/bp0
昨日の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;
}
}
0785デフォルトの名無しさん (アウアウカー Saeb-I8sf)
垢版 |
2017/12/10(日) 18:48:03.62ID:xLxKGjo5a
4桁なら乱数4つ求めた後で重複調べてあったらまた求めるっての繰り返しても良いんじゃないか?
0786デフォルトの名無しさん (ワッチョイ ff80-8EI8)
垢版 |
2017/12/11(月) 06:21:58.84ID:4q7JrCp00
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ずつ減らさないといけないよな?
0787デフォルトの名無しさん (ワッチョイ 5793-3gxb)
垢版 |
2017/12/11(月) 06:51:09.15ID:IqtrAjQN0
>>779
Fisher-Yates shuffle で検索したら、関連情報として >>777 の方法が
良くないことと、その理由が説明されてるページが見つかった。

可能な並べ方の全パターンが等しい確率で出現するか否か、
というアルゴリズムの原理からの比較は分かりやすくて説得力があった。

個人のページみたいなのでリンクは張らないけど、
「Fisher-Yates shuffle ランダムシャッフル」で出るかと。
0792デフォルトの名無しさん (アウアウカー Saeb-I8sf)
垢版 |
2017/12/11(月) 12:51:29.67ID:h/GY+Pada
>>788
おお。斬新なアイデア。
4つしかなくて0〜9ならそれでも問題ないな。(メモリが全然ないような特殊な場合を除いて)。
0801デフォルトの名無しさん (ササクッテロル Sp8b-lv8k)
垢版 |
2017/12/13(水) 17:02:05.03ID:1L+KQhUep
>>800
つうか、一回限りなら意味が無いかもな。
テーブルに出た回数も記録して同じ組み合わせは出ない様にも出来たり、テーブル自体も別系列の乱数でシャッフルするとか、
使い道は無限大さ。
0805デフォルトの名無しさん (アウアウウー Sa1b-GIjF)
垢版 |
2017/12/13(水) 23:51:42.07ID:ScBZYS+4a
C言語覚えたい頼む
このアホに教えこんで理解させるとしたらまずなんのテキスト使う?
教え上手のおまいらに最後の希望を託す
(ちな言われたことは必ずやります)
0811デフォルトの名無しさん (アウアウウー Sac3-qGtq)
垢版 |
2017/12/14(木) 11:15:27.13ID:lae2KYT0a
>>806
片山さんチーッス!
後ほど報告しますね

>>809
FE試験でCASLを福島本で少々もちろん落ちました春再戦はCで挑みたく…
ほかPython本チラ見と開発環境整え中に他の試験のため頓挫

覚えたいが独学でグイグイいけるモチベもなく(あればここで泣きついてないw)誰かにゆるい階段のお膳立てをしてもらい登ってみようかと。これでだめならセンス無しでITから撤退しますw
0817デフォルトの名無しさん (エーイモ SE52-x5Rz)
垢版 |
2017/12/14(木) 13:39:55.18ID:viw49ZxRE
C99とかC14とかCにもいろいろ種類があるそうですが
特定の種類で書かれたソースコードであるかチェックしたいのでsouiu
lint toolってありませんか?
0819デフォルトの名無しさん (ワッチョイ 926e-zS+j)
垢版 |
2017/12/14(木) 16:12:02.98ID:fPDEs5uN0
C14はC++14を勘違いしたんだろうね
Cの種類は、K&R, C90(C89), C99, C11の4つが主要バージョン
主要でないバージョンというと、primeval CとかC84などがある
C90をC89と言ったりするのは、ISO/IEC9899:1990がANSI X3.159-1989を追認する内容だからだ
日本語版のJIS X3010:2003はC99の直訳
0820デフォルトの名無しさん (アウアウカー Sa6f-kaKc)
垢版 |
2017/12/14(木) 16:29:20.24ID:8Y/Mk4+4a
>>803
いやほら乱数ってハードウェア利用せずに計算だけでやる場合は処理を複雑にしても無意味なことあるじゃない。
0821デフォルトの名無しさん (アウアウカー Sa6f-kaKc)
垢版 |
2017/12/14(木) 16:31:27.48ID:8Y/Mk4+4a
>>810
懐かしいのがあるなあ。

でもアセンブラできるなら覚えるの早いかも。
0827デフォルトの名無しさん (ワッチョイ 926e-zS+j)
垢版 |
2017/12/14(木) 17:06:32.65ID:fPDEs5uN0
putsの使いにくさときたらアンタ・・
■ このスレッドは過去ログ倉庫に格納されています

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