X



C言語なら俺に聞け 146
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん (ワッチョイ 839f-AnMQ)
垢版 |
2018/04/30(月) 04:47:37.50ID:XX4FB8lc0
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言語なら俺に聞け 144
https://mevius.5ch.net/test/read.cgi/tech/1514025223/

次スレを立てる時は本文の1行目に以下を追加して下さい
!extend:on:vvvvv:1000:512
-
※前スレ
C言語なら俺に聞け 145
http://mevius.5ch.net/test/read.cgi/tech/1519046038/
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
0334323 (ワッチョイ 87b3-KMj/)
垢版 |
2018/07/10(火) 17:13:29.68ID:PTerA0wX0
>>328
いやいや、私はヤバいウイルスとかを作る技量はないので…
知らぬ間に作るなんてことは…

>>331
プロンプトで実行すると、長いエラーメッセージが出ます。
その場合もマカフィーが反応します。

マカフィーのせいなんですかあああああ…?
マカフィーを止めるのはなんか面倒です。
0335デフォルトの名無しさん (アウアウカー Sa1b-tqMh)
垢版 |
2018/07/10(火) 17:23:53.95ID:c95ZcwpDa
そういやマカフィーの創業者のジョン・マカフィーは壮絶な人生歩んでるのな。
知りたい人はWikipediaでジョン・マカフィーで検索してみな。
0338デフォルトの名無しさん (アウアウカー Sa1b-tqMh)
垢版 |
2018/07/10(火) 20:29:17.07ID:csDUndKHa
このスレは超エスパーの常連が常駐していると聞いて
0341323 (ワッチョイ 87b3-KMj/)
垢版 |
2018/07/11(水) 12:17:16.91ID:Z7jbd2VW0
そんなことは普通にできますが,インターネット接続を切ったり入れたりもしなきゃいけないじゃないですか
それも簡単ですが,マカフィーのいたずらのせいでそんなことをいちいちやるのは…という意味です
0348デフォルトの名無しさん (ワッチョイ 5d8a-B+kh)
垢版 |
2018/07/12(木) 02:21:13.11ID:9sO/Jh060
>>341
別に一時的に無効化するだけならネットを切る必要は無い
セキュリティ的にどうしても不安があるっていうならLANケーブル抜けばいい
それすら面倒ならパソコンを窓から投げ捨てろ
0350デフォルトの名無しさん (ワッチョイ ead2-4lKT)
垢版 |
2018/07/15(日) 17:16:55.22ID:+OH6AID30
C言語で集合、和集合、積集合を実装したいのですが、正直アイデアが浮かびません。
どうすれば良いのでしょうか?
教えていただきたいです。
0354さまよえる蟻人間 ◆T6xkBnTXz7B0 (スフッ Sd0a-gHxb)
垢版 |
2018/07/15(日) 18:50:09.68ID:uEXuZg9md
集合は順序列の順序を無視したものと考えられる。
比較する場合は、ソート済みにしてから比較する必要がある。
多重集合ではない場合は変更の際に要素を単一化しないといけない。
0355デフォルトの名無しさん (ブーイモ MM8e-4qXr)
垢版 |
2018/07/15(日) 18:57:55.11ID:chucpUaPM
setは赤黒木だけど、実装したことある奴いるの?俺はaddだけ実装して満足して諦めたよ。

hashtableのほうが遥かに簡単だからオススメ。
整列済みの配列も簡単でいいと思うよ。

でも一番楽なのは、ライブラリを拾ってくること。
0357デフォルトの名無しさん (スップ Sd0a-Se03)
垢版 |
2018/07/15(日) 23:33:22.03ID:ugn7dRUid
>>350
積集合の方が比較的簡単
和集合は同一要素であるかをどうやって判別するか
要素を構造体で表した時に
異なる構造体でも同一要素である判別が出来なくてはならないので

単純な例だと
複素数型と実数型と有理数型とcharとintとfloatとdoubleとか
0361デフォルトの名無しさん (ワッチョイ 6680-2/B2)
垢版 |
2018/07/16(月) 00:41:17.49ID:JxE01Fj60
一般論で言えば、集合の実装はハッシュを実装することに限りなく等しい。

どんなオブジェクトであれ、シリアライズ(要は文字列化)できる。
そうすればハッシュで一意な比較的小さい非負整数の番号に写像できる。(←条件により、ここが難関になりうる。ハッシュを使わずに済む番号が用意されていればそれが最適)
逆写像も用意できる。
最大番号までの要素数を持つ整数配列で0/1で要素の有無を表現したものが一つの集合を表す。
2つの集合の和と積は0/1の|と&で表せる。
配列サイズと計算時間の節約にはビットマップ化すればok。
0363 ◆QZaw55cn4c (ワッチョイ 4a60-Y8gp)
垢版 |
2018/07/16(月) 13:40:42.48ID:PLRcL5uS0
>>361
>ハッシュで一意な比較的小さい非負整数の番号に写像できる。

ハッシュ関数は一般に衝突するもの、と考えるものですが、範囲を小さくすれば特に…
0365デフォルトの名無しさん (ワッチョイ 6680-2/B2)
垢版 |
2018/07/16(月) 15:04:36.42ID:JxE01Fj60
>>362
広い視野で具体的な提案をどうぞ。

>>363
要素が固定なら完全ハッシュ関数が構成可能。

>>364
和集合とか積集合とか求めてもそこから要素リストが作れなければ無意味というだけ。これは逆写像を作ってるのと同じ。
0366デフォルトの名無しさん (ワッチョイ 6d9f-kMqh)
垢版 |
2018/07/16(月) 16:32:35.47ID:ZuNymA1O0
>>350
ビット演算使えば良いのでは?
特に要素数が32とか64以下に収まるようなら今どきのPC用コンパイラならunsgnedのintやlongで行けるよ。
uint32tみたいなビット数保証するtypedefされた型使った方が良いけどね。
0369デフォルトの名無しさん (スッップ Sd0a-Se03)
垢版 |
2018/07/16(月) 17:09:01.83ID:fNWu8+xrd
全順序化が簡単か
効率的なハッシュが(簡単に)作れるか
想定する集合の大きさ
比較のコスト
ノードのデータサイズ

この辺が違うと適した実装が全く異なる
この辺をヒアリングするのが先と思う
0370デフォルトの名無しさん (ブーイモ MM0a-2/B2)
垢版 |
2018/07/16(月) 20:33:05.89ID:xLJ3m8O+M
>>368
「要素が固定なら」と条件付き。よく読んでね。
そうじゃない場合は難関になりうることも言及ずみ。よく読んでね。
衝突してもハッシュ表は実装できるわけで、全順序化が不可能なわけではない。
0372デフォルトの名無しさん (ワッチョイ 59bd-4qXr)
垢版 |
2018/07/16(月) 21:05:16.49ID:GVNh7z7o0
>>370
何に対して固定なのか、いつ固定されるのか、稚拙な日本語から読み取れと?
それに>>361にはそんな条件は書いてないぞ。にもかかわらず、ハッシュから写像ができると書いてある。意味不明すぎるわ。
0376デフォルトの名無しさん (ワッチョイ 753c-L1xz)
垢版 |
2018/07/16(月) 22:18:00.48ID:d44IRZCy0
C言語初心者です。

typedef struct{
int tate;
int yoko;
double *mat;
} Mat;

void read(int x,int y,Mat *a){
for(int i=0;i<x;i++){
for(int j=0;j<y;j++){
printf("[%d][%d]->",i+1,j+1);
scanf("%lf",&a->mat[i][j]);
}
printf("\n");
}
return;
}

プログラムの一部を抜粋したものなのですが、これでコンパイルすると
subscripted value is neither array nor pointer
というエラーが出てしまいます。
二次元配列はポインタで表せないものなのでしょうか?
0379デフォルトの名無しさん (ワッチョイ 59bd-4qXr)
垢版 |
2018/07/16(月) 23:01:36.27ID:GVNh7z7o0
>>376
matがdouble型へのポインタだからだよ。
結果mat[i]はdouble型になり、mat[i][j]はdouble型に[j]を付けたことになるので、配列でもポインタでもないのに[]つけるなって怒られてる。

きっとmatのメモリ確保は
mat = malloc(sizeof(double) * tate * yoko);
みたいにやってるだろうから、i列j行目にアクセスするときは
&a->mat[i + j * yoko]
みたいにしないといけない。

あと、上の例ならjを外側、iを内側のforにしたほうが最適化されやすいと思うよ
0381デフォルトの名無しさん (ワッチョイ 753c-L1xz)
垢版 |
2018/07/17(火) 00:50:16.45ID:j9lU977L0
>>376です
お二人とも丁寧に教えていただきありがとうございます。
>>378さんの方法で改良してみたのですが複数のMat構造体を作り,tateとyokoの値のそれぞれ別にしたときにプログラム実行中に入力が強制終了されてしまうのですが、配列の作り方に何か不都合があるのでしょうか
0383デフォルトの名無しさん (ワッチョイ 119e-dYrz)
垢版 |
2018/07/17(火) 03:42:30.44ID:ZJqMOJYT0
Ruby のハッシュでは、データ数と共に、バケット数を増やしていく。
バケット数は、2 の累乗の次に現れる素数。
2^n + a, 2 <= n <= 30

8 + 3 = 11
16 + 3 = 19
32 + 5 = 37
64 + 3 = 67
128 + 3 = 131
256 + 27 = 283
512 + 9 = 521

データ数が、バケット数の5倍を超えると、ハッシュが再構成される。
再構成時には、極端に遅くなる

11 * 5 = 55 だから、データ数が56 個になると、バケット数が19 になる。
19 * 5 = 95 だから、データ数が96 個になると、バケット数が37 になる
0384デフォルトの名無しさん (ワッチョイ 119e-dYrz)
垢版 |
2018/07/17(火) 04:09:19.94ID:ZJqMOJYT0
AVL では、左右部分木の高さの差を、1 以内にしなければならないから、
2 になると、木の回転・縮約など、再構成をしなければならない。
つまり、しょっちゅう再構成が起こるので、遅くなる

赤黒木では、左右部分木の高さの差を2 倍以内にしたから、再構成が起こりにくい。
左が10 なら、右は20 まで、再構成が起こらない

タスクスケジューラーに使われる

例えば、100個のスリープしているタスクがある所に、
木に実行するタスクを追加して、重みに従ってソートすると、
追加したタスクが選ばれて、木から削除される

つまり、ほとんどの葉の順位が変わらなくて、
追加した葉が、すぐに削除されるようなものに適している
0385デフォルトの名無しさん (ワッチョイ 753c-KCFg)
垢版 |
2018/07/17(火) 21:50:50.91ID:j9lU977L0
makefileってPowerShellで作れないとかないですか?
0386デフォルトの名無しさん (アウアウカー Sa55-jzog)
垢版 |
2018/07/18(水) 13:02:52.94ID:9IEVAZpRa
>>385
君が何を言わんとしているのかがよくわからない
0388デフォルトの名無しさん (アウアウカー Sa55-jzog)
垢版 |
2018/07/18(水) 13:27:22.37ID:9IEVAZpRa
>>387
あれで人に言葉が通じていると思い込んでる可能性があるから書くべきだろう
0390デフォルトの名無しさん (ワッチョイ 1793-pJKM)
垢版 |
2018/07/22(日) 17:00:55.76ID:QT86rkZL0
なんとなく、コマンド行をタブで始めてなくて(スペースで空白を作ってて)、
makeがエラー出してるような気がするなぁ。
エディタのTab→スペース自動変換が効いてるとか。

PowerShellとは直接関係なくて。
0393デフォルトの名無しさん (ワッチョイ 9fd2-pvuh)
垢版 |
2018/07/23(月) 18:37:31.75ID:4YnpLRT90
>>392
まずスレッド一覧を開いてCTRL+FでC++と入れて検索しました
一応それらしき所を見つけたんですが書き込んだ瞬間変なおっさんに噛みつかれたので
初心者スレじゃないのかな。。。と。
入門にあったスレはないでしょうか
0394デフォルトの名無しさん (ワッチョイ 979f-lcCj)
垢版 |
2018/07/24(火) 00:16:29.41ID:jxAZ77iY0
無ければ作ったら良い
0396デフォルトの名無しさん (スップ Sd3f-3g7x)
垢版 |
2018/07/24(火) 10:50:38.33ID:0p5SDr2Gd
回答者も甘えてる奴がほとんどだしな
0402デフォルトの名無しさん (アウアウカー Saab-GY9v)
垢版 |
2018/07/25(水) 15:50:06.17ID:rOB4O81ba
明解と
書いてる方が
不明解
0403デフォルトの名無しさん (ブーイモ MMbf-4pMd)
垢版 |
2018/07/25(水) 18:17:36.85ID:LRuCLCqQM
今からC言語覚えて何に使うの?
0408デフォルトの名無しさん (アウアウカー Saab-GY9v)
垢版 |
2018/07/25(水) 19:19:25.92ID:ekeRKo17a
>>405
環境は?
OSやコンパイラは?
0416デフォルトの名無しさん (ワッチョイ 77bb-H0hI)
垢版 |
2018/07/25(水) 21:13:14.68ID:E4aNPZoQ0
俺の言い方がまずかったようだ。
int* a = (int*)malloc(4);
これはわかる

int* a = (int*)malloc(5);
この場合でもコンパイルは通るし実行も出来る。

でも、やっていいことなんだろうかってね。
余った1バイトは気にしないでいいのだろうか?
0419デフォルトの名無しさん (ワッチョイ 77bb-H0hI)
垢版 |
2018/07/25(水) 21:24:03.17ID:E4aNPZoQ0
>>418
そう。これは分かる。インクリメントで確保した変数にアクセス出来るのも分かる。
>>416の下の例で、例えばa++した時、そしてそのアドレスの中身を変更すようとすると
何か途轍もなく悪いことが起きそうな気がするんだけど大丈夫なんだろうか?
0421デフォルトの名無しさん (ワッチョイ 77bb-H0hI)
垢版 |
2018/07/25(水) 21:32:51.80ID:E4aNPZoQ0
ああ、なるほど。そういう時はエラー出るのね。
今試しにインクリメントしたら確かにエラーになった。なるほど良く出来てる。
なんか試すのも怖かったんだわ。ありがとう!
0422デフォルトの名無しさん (JP 0H2b-GemW)
垢版 |
2018/07/25(水) 21:33:37.75ID:kwDgMq/WH
>>419
未定義だから鼻から悪魔が出てもおかしくないよ

冗談はおいといて、現実には5バイトじゃなく、64バイトとかのサイズをとったりするので、何事もなく動く。ただし、動くのはたまたま。
0424さまよえる蟻人間 ◆T6xkBnTXz7B0 (スフッ Sdbf-jdi9)
垢版 |
2018/07/25(水) 21:36:50.93ID:Gtkf0v1Td
ただし、アクセスにおいてエラーが出ない事もあり、この手のバクはやっかいで、下手をすると数億円が吹き飛ぶことがある。
だから、最近ではなるべく生ポインタを使わないでやるのがプロ。
0433デフォルトの名無しさん (アウアウカー Saef-2Ess)
垢版 |
2018/07/26(木) 12:52:49.36ID:EM3EzxKLa
ま、しかし、intが4バイトの保証はないし、malloc()で確保した範囲外がどうなってるかもライブラリ依存だし、変な事に挑戦しない方が良いと思うw
■ このスレッドは過去ログ倉庫に格納されています

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