C言語なら俺に聞け 149

■ このスレッドは過去ログ倉庫に格納されています
2018/10/28(日) 22:01:44.38ID:D9Gt7gmT0
!extend:checked:vvvvv:1000:512

次スレを作る時は上記1行をコピーして2行に増やして必ず1行目に入るようにしてください。

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言語なら俺に聞け 148
https://mevius.5ch.net/test/read.cgi/tech/1537347410/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
2018/12/14(金) 06:30:05.99ID:lAbDnTGa0
最適化をいれるとaが定数だとaが消されるからaを別の関数の引数にすることで
消されないようにできる。
volatileで消さないようにするとなぜか比較が最適されない。
2018/12/14(金) 06:46:52.77ID:gWmPrUHE0
>>480-481
それはvolatileの間違った使い方だから止めとけ。
最近そういう投稿も多いが。
2018/12/14(金) 06:52:31.89ID:TYVfP/dyM
最適化は処理の最中に使う変数が外部(別スレッドや割り込みハンドラ)から変更されないということを前提としてるから、volatileつけるとaの比較途中でaそのものが変更されるかもしれないので逐一比較になる。
まぁスタック上のローカル変数aが外部から変更されるってのは通常は単なるスタック破壊のバグだけどね。
2018/12/14(金) 06:53:45.77ID:8u55nHdC0
>>468
おまえ4.3BSDのccとかまだ使ってるのか?
2018/12/14(金) 07:50:49.15ID:FIv/Q2MJ0
>>479-480
素直なコードで出るはずだけどなぁ。

サンプル abcdef.c
第1引数の最初の文字が [a-f] なら yes, それ以外なら no と表示
(引数が与えられなかった場合は no を表示)

$ cat abcdef.c
#include <stdio.h>

int main(int argc, char *argv[]) {
  int a;

  a = (argc>1) ? argv[1][0] : 'z';

  if (a=='a'||a=='b'||a=='c'||a=='d'||a=='e'||a=='f') printf("yes\n");
  else printf("no\n");

  return 0;
}

$ gcc -S abcdef.c
最適化なし 比較6回

$ gcc -O -S abcdef.c
最適化 97引いて5と比較
2018/12/14(金) 09:57:08.83ID:v3sklYn80
volatileは磁気コアメモリ時代の命令じゃねえのか
2018/12/14(金) 10:14:56.92ID:lAbDnTGa0
>>485
mainで未定の値を作るのがむずかしいんだよ
aを初期化しなければ未定の値になると普通おもうんだけど
何故か何かの値に決められて最適化でaが消えちゃうのよね
2018/12/14(金) 10:15:15.85ID:QZB89f550
現在でも組み込み開発でSFRを弄るにはvolatile宣言は必須
2018/12/14(金) 10:28:42.01ID:lAbDnTGa0
結論を言うとvolatile で最適化を調べるために最適化を抑制したのが間違いの原因だっと
ということだな。
2018/12/14(金) 12:14:57.88ID:E1rpoA/W0
volatileは変数がI/Oポートにマッピングされてることを想定した仕様
コンパイラによる省略とかを許さず書いてある通りにアクセスする
2018/12/14(金) 12:47:24.45ID:TZB/LQMkx
>>490
I/Oだけじゃないよ。
別スレッドなど異なる実行コンテキスト間で共有する領域へのアクセスはvolatileをつけないといけない。
SFRへのアクセスもソフトとハードという実行コンテキストが異なる。
2018/12/14(金) 14:14:04.61ID:7OLXAkOEa
静的変数は全部つけないといかんのだろうね。
利用の趣旨としては。
2018/12/14(金) 15:46:34.42ID:FWw1nr6R0
ID:y280e6J90はvoid君だろ
494デフォルトの名無しさん (アウアウウー Sa4f-mTCp)
垢版 |
2018/12/14(金) 16:07:06.94ID:cCP3RgWTa
volatile の使い所

1. マルチスレッドで他スレッドと共有される変数(ただし、別途ロックも掛けた方が良い)。

2. シグナルハンドラとその他の処理で共有する変数。

3. longjmp() 使う時。
495デフォルトの名無しさん (アウアウウー Sa4f-mTCp)
垢版 |
2018/12/14(金) 16:08:45.11ID:cCP3RgWTa
これ書き忘れてた。

4. 指している先の内容が本当に揮発性の場合(I/Oポート等)
2018/12/14(金) 16:22:16.94ID:lsnrrwE80
記述された手続き以外の要素によって変数値が変わるなら
2018/12/14(金) 19:01:54.99ID:RfUJ40dd0
>>494
volatile変数をマルチスレッドに使うとかいう誤った知識を流布しないでくれ
volatileに指定してもマルチスレッド共有変数に求められる

* メモリフェンス
* 演算の原子性

は確保できない

ttps://stackoverflow.com/questions/4557979/when-to-use-volatile-with-multi-threading
2018/12/14(金) 19:20:00.03ID:td3PjTJAa
原子性って全然直交した概念ちゃうか。
確保できるとかできないとかいう話になるのがおかしい。
2018/12/14(金) 19:41:07.95ID:gWmPrUHE0
>>494-495
×××○
知らない人が見たらマジ議論と勘違いするのも無理はないが、
2chでのlongjmpなんてネタだから無視でいい。

>>497
全くだ。


というかマジな話、何をどこに使うべきかイマイチ分かってないのなら、
とりあえずいわゆる「正しいプログラミング」を目指した方がいい。
ここでの与太話は、ネタをネタと(ry、でしかない。
2018/12/14(金) 20:47:21.99ID:8u55nHdC0
>>494
マルチスレッドは断じて関係ない

アフォwヴァカwww
2018/12/14(金) 21:07:51.74ID:+oZBuxlP0
volatile なんか忘れて素直に pthread とか C++11 とか使っていればいいと思うのです…
2018/12/14(金) 21:15:41.90ID:6hfmhPbO0
>>498
そのはずなのに使えるなんて言う妄言痴言が飛び交っていたんだから重症だよ

>>499
シグナルハンドラに関してはvolatileが必要じゃない?もちろんその変数に対するatomicityも要求されるけど
2018/12/14(金) 22:13:48.43ID:gWmPrUHE0
>>502
知らんよ、俺はLinuxのsignalなんて使って無いし。
そのページには必要だと書いてあるし、そうなんだろうさ。

が、そもそも、俺に言わせれば
・volataileで実装出来る=ポーリングループ&せいぜいハンドシェーク=糞
・プロセス間通信する意味がない
スレッド間通信でsleep/wakeupで何も問題ないし、その方が自然だ。
この場合に自前でvolatileなんて書くことはない。
ハードウェアを直接叩かないのにvolatileとか、設計を見直した方がいいと思うぜ。
504デフォルトの名無しさん (ワッチョイ 8abd-yieq)
垢版 |
2018/12/15(土) 00:19:10.79ID:MJLVMCBK0
>>429
Cのコンパイラは環境依存になるため、コンパイラの出来、不出来がある。
2018/12/15(土) 01:44:33.10ID:USiGJg2x0
必要条件と十分条件の違いが分かってないやつがいるな。
2018/12/15(土) 09:51:27.56ID:hAY8T09E0
>>503
フェンスがないのにハンドシェークとは、これいかに
2018/12/15(土) 11:50:06.13ID:nIs3KSLY0
>>506
> 標準シグナルの場合、そのシグナルがブロックされている間に 同じシグナルの複数のインスタンスが配送されても、 1 つだけがキューに入れられる。
> https://linuxjm.osdn.jp/html/LDP_man-pages/man7/signal.7.html
しかし実際ハンドシェークだと思うぜこれは。

意識高い系()ゆとり()がCをやるとfenceという『CPU命令』が必要だと思っちゃうのか?
まあ無理も無いとも思えるが。
2018/12/15(土) 11:53:03.04ID:qrRqm5Rq0
それはC言語の話なのか、OSの話なのか、CPUの話なのか
2018/12/15(土) 12:22:47.52ID:nIs3KSLY0
フェンスが必要になったのはコンパイラ側の都合だから、C言語の話だね。
これが理解出来ないのはお前がゆとりの馬鹿だからだ。

マジな話、馬鹿の癖に煽るゆとりは死んで欲しいね。
お互いに何も得る物がない。
2018/12/15(土) 16:08:16.17ID:uiukVmhyM
>>509
2018/12/15(土) 16:24:43.93ID:tkQQweukM
フェンスが必要なのはCPUとコンパイラ双方のためだ。やっぱvoid君は馬鹿だね。
2018/12/15(土) 17:21:35.13ID:hAY8T09E0
>>507
ほうほう、fenceはCPU命令ではないんだな
それでそれで? volatileとどういう関係があるんだw
2018/12/15(土) 18:37:35.51ID:nIs3KSLY0
>>510-512
ゆとりは死ななきゃ直らないと再認識した。
ゆとりが馬鹿であり続ける権利を尊重し、教えてやらないことにする。


つっても、ググればいくらでも出てくるし、ゆとり以外には実害はないはず。
マジな話、上達したい奴は、ググっても疑問が解消しないときのみ、掲示板等に頼るようにした方がいい。
自力で勝手に進んでいけるか、いちいち構ってちゃん状態になるかでは、上達速度に雲泥の差が出る。
こんなところで下らない煽り合いに興じてるから、ゆとりはゆとりのままなのだと思うし。

StackOverflow(英語版)はかなりオススメだ。迷ったらそこを頼れ。
2018/12/15(土) 19:04:30.55ID:/O2tQ50qM
void君は謎の捨て台詞好きだよね。かっこ悪いよ。
2018/12/15(土) 19:15:51.64ID:qrRqm5Rq0
ここにはお前に用がある人はいないそうだ
2018/12/15(土) 19:17:41.02ID:CVS0UY4MM
霊界は存在するよね。ググればいくらでも出てくるしww
2018/12/15(土) 19:40:59.06ID:nIs3KSLY0
以下、C言語について詳しいつもりの、格好いいつもりの粘着君が教えてくれます。ご安心を。
(レベルはあのコードを糞コードと認識出来ないようなので推して知るべし)


マジな話、volatileをスレッド同期に使え、なんてのは世界中の誰も言ってないだろ。
勿論longjmpもgotoもその類だ。
ここはそれを分かってるロートル連中が与太話をするところであって、
マジの初心者が来るのは危険だと思うがな。ネタをネタと(ry
初心者なら、まずは正しいプログラミングを目指すべきだと思うぜ。
本来はリアルで先輩/上司/先生に教えを請えるのが一番いいが、
駄目ならStackOverflow(英語版)を俺はオススメするが。

最近は知恵遅れも知恵袋と化してきていて、例えば以下(PHPのスレより、ただし削除済み)
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10199147355
そこで焼け出された知恵遅れゆとりがこちらに押し寄せてきているのだと推測しているが、
お互いにとって不幸なことになってる。
ただし知恵袋が機能するなら、本来はIDがある分向こうの方がましだから、向こうを使った方がいいと思うが。

知恵遅れゆとりがスクラム組んで押し寄せることに対して、2chは防御手段がない。
実際、こいつらが役に立つことを一回も言ったことがないのも事実でさ。
こいつらは死ぬまでイナゴし続けるんだろうな、って思う。
2018/12/15(土) 21:18:31.36ID:hAY8T09E0
ニヤニヤ
519デフォルトの名無しさん (アウアウウー Sa4f-mTCp)
垢版 |
2018/12/15(土) 21:37:43.77ID:VC87camXa
C言語について詳しいつもりの、格好いいつもりの粘着君ってこんな名言残した人の事ですか?

>なんだこれ?引数 void って初めて見たぞ。文法的にありなのかこれ?
2018/12/15(土) 22:00:05.11ID:nIs3KSLY0
>>519
お前らがその30年前に解決した話に異常に固執するのも意味不明だがな。
それはお前らのレベルではそれが全てだ、と言っているに等しいわけだが、それについては恥ずかしくないのか?
2018/12/15(土) 22:03:06.74ID:hAY8T09E0
ぐうの音も出ねえって
こいつのためにあるような言葉だなw
2018/12/15(土) 22:33:19.53ID:3LFJSGA60
void君て、半角カナ君とかなり似た匂いがするけど、亜種か別設定キャラだったりするのだろうか?
523デフォルトの名無しさん (ワッチョイ 8abd-yieq)
垢版 |
2018/12/15(土) 22:35:12.80ID:MJLVMCBK0
C言語はあとから標準化されたのと、コンパイラの実装はUNIXを想定しているため、OSが異なるとコードの意味まで変わる。
524デフォルトの名無しさん (ワッチョイ 1e80-2dqZ)
垢版 |
2018/12/15(土) 22:44:04.38ID:8aRCy95z0
オレは要点を簡潔明瞭にレスしてるからな
あったま悪い低学歴底辺のキミラの生きうつしになるvoid君と一緒にされたら困るワケ

キミラにとってvoid君はただの同族嫌悪
2018/12/15(土) 23:22:08.85ID:BLCVn7NJ0
初心者です。

ソートとコンパイラの最適化について教えて頂きたいのですが、
挿入ソートを書いてその実行時間を計測しました。
動的に確保した10000の要素数を持つ配列に、rand()関数でランダムな値を入れて、
clock()関数でソート時間を計測しています。

コンパイラはMinGWから入れたGCC6.3.0で、-O1と-O無しで実行時間にかなりの差が出ます。
バブルソートや選択ソートでは極端に大きな差が出ないのですが、挿入ソートだけはかなり差が出ます。
-O無しだと7秒前後、-O1だと1.7秒ほどで完了します。

自分が書いた挿入ソートが正しい内容になっているかと、
このプログラムでの最適化でどのようなことが行われているのかおおまかに教えて頂きたいです。

挿入ソートは以下の様に書きました。
void insersion_sort(unsigned array[], unsigned length)
{
 register unsigned *start = &array[0];
 register unsigned *sorted = start;
 register unsigned *end = &array[length - 1];

 while (sorted < end) {
  register unsigned *crnt = sorted + 1;
  while (crnt > start && *crnt < *(crnt - 1)) {
   swap(crnt, crnt - 1);
   crnt--;
  }
  sorted++;
 }
}
2018/12/15(土) 23:41:43.90ID:nIs3KSLY0
>>525
> コンパイラはMinGWから入れたGCC6.3.0で
そのレベルならVS使えってマジで。
GUIでグレークポイント貼って追跡出来るだけで全然違うから。

> 自分が書いた挿入ソートが正しい内容になっているかと、
自分でデバッグしろドアホ。
自前でチェックすれば済むんだから、簡単に出来るだろ。
for (int i=0;i<10000-1;i++) if (array[i]>array[i+1]) printf("BUG: %d, %d, %d, %d\n",i,i+1,array[i],array[i+1]);
とか。

> register
使うな。
ってかおまえ、何を参考にして学んでる?

> void insersion_sort(unsigned array[], unsigned length)
> unsigned array[]
これもあんまりやらないと思うけど。

> 最適化でどのようなことが行われているのかおおまかに教えて頂きたい
それをマジで聞きたいならオブジェクトコード(逆アセンブルコード)を貼る必要があるわけだが。
2018/12/15(土) 23:50:10.65ID:BLCVn7NJ0
>>526
レスありがとうございます。

VSなら使っています。VSCodeですがw
ちなみにGUIでデバッグも出来ますね。
バグは出ていないのにデバッグする意味ってあるんですか?
質問の意図としては、「ちゃんと正しいアルゴリズムで実装できているか」という質問をしているのです。
「動かないからおかしいところ教えてください」という意味ではありません。

register指定子を付けるだけで、付けていないときに比べて2倍ほど変わるのですが、
付けないほうが良い理由を教えて頂けますでしょうか。

unsignedもあまりやらない意味を教えてください。
今はrand()から帰ってくる値が入っているだけですので意味ないのは確かですが。
2018/12/15(土) 23:53:27.39ID:BLCVn7NJ0
× 2倍ほど変わる
〇 ソート時間が2倍ほど変わる
連レス失礼
2018/12/16(日) 00:07:00.48ID:w2yggEy4a
引数voidにすると魔除けになるかもな
2018/12/16(日) 00:10:07.53ID:GOuL0+IB0
度々ごめんなさい。配列の桁数を間違えていました。
×10000
〇100000
です。
531デフォルトの名無しさん (ワッチョイ 8abd-yieq)
垢版 |
2018/12/16(日) 00:11:33.51ID:nrAiyUBx0
>>527
C言語に詳しくない俺でもわかるが、CPUは正と負の数を扱っているから、正の数と指定されると余計な処理が挟まる。
2018/12/16(日) 00:13:46.60ID:+TcxNu6P0
>>527
> ちなみにGUIでデバッグも出来ますね。
それならいい。

> ちゃんと正しいアルゴリズムで実装できているか
ならwikiでもどうぞ。いちいち聞くんじゃなくてさ。
https://ja.wikipedia.org/wiki/%E6%8C%BF%E5%85%A5%E3%82%BD%E3%83%BC%E3%83%88

> register指定子を付けるだけで、付けていないときに比べて2倍ほど変わるのですが、
マジで?

> 付けないほうが良い理由を教えて頂けますでしょうか。
https://cpprefjp.github.io/lang/cpp11/deprecation_of_the_register_keyword.html
つかマジで、お前が参考にしている本なりサイトはかなりヤバいと思うぜ。
(Cでも同じはずだが、実際効いているのであれば違うのか?)

> unsignedもあまりやらない意味を教えてください。
いや、書き方が曖昧だったが、[]をやらない。大概は、 unsigned *array だと思う。


つか、全般的にコードが妙な書き方になってるから、直した方がいい。
初心者なら、単に教科書かその類に問題があるだけだと思うし。


>>528
この文脈でそこを誤解することはあり得ないから大丈夫。
(なのはリアルだけで、2chでは信じられないレベルのコミュ障がいるのもまた事実だが)
2018/12/16(日) 00:15:38.43ID:GOuL0+IB0
>>531
なるほど、ありがとうございます。

書き始めたときは何も考えていなくて、とりあえず大きい値が入れられるようにunsignedにしていましたw
今後正負で大きい値も扱える型の配列に直そうと思います。
2018/12/16(日) 00:24:06.30ID:GOuL0+IB0
>>532
レスありがとうございます。

ちなみにそのwikiの説明文を見て挿入ソートを書いています。
ソースの部分は読んでいませんが。

GCCは最適化を有効にしなければregisterが効くなんてのは結構有名だと思っていたんですがそうでもないんですかね。

配列引数に[]を書かないというのは、別に個人の趣味みたいなもんだと思うので良いんじゃないでしょうか。
他の人とコーディングするなら規約などに従いますが、今は自分一人で書いているだけなので。
[]が書いてあれば配列を渡すというのが一目瞭然であるから付けているだけです。(arrayという名前や、lengthが必要な時点で分かりますが)
*start = &array[0];としているのも同じ理由です。
*start = arrayと書くより分かりやすいと思うからそうしているだけです。

別にコーディング規約の話をしているわけではないのでこの辺でよろしいでしょうか?
2018/12/16(日) 00:25:21.59ID:+TcxNu6P0
>>531
まあそれはあるが、細かすぎるからいいかな、って思ってた。

>>533
あとな、多分、 unsigned ではなくて、 unsigned int の方が主流のような気がするが。
まあそれ以前に531の指摘通り、intでやれ、ということではあるが。
2018/12/16(日) 00:28:37.95ID:GOuL0+IB0
あとちなみに、registerが非推奨になっているのはC++の話ではないんですかね?
その辺も詳しい方いましたら教えてください。
2018/12/16(日) 00:29:37.27ID:GOuL0+IB0
>>535
unsigned intの省略型がunsignedだと思っていたのですが違うのでしょうか?
2018/12/16(日) 00:33:29.78ID:+TcxNu6P0
>>534
> GCCは最適化を有効にしなければregisterが効くなんてのは結構有名だと思っていたんですが
知らん。
というかそのそも最適化無効で使うことがほぼあり得ない。
さらに言えば、-O1ってのも奇妙で、普通は-O2か最近は-O3。

マジで君、全般的に色々おかしいんだよ。

> 別にコーディング規約の話をしているわけではないのでこの辺でよろしいでしょうか?
好きなように書けばいいんだが、上達速度を上げたいなら、『他人と同じコーディングルール』で書いとけ。
それで損はしない。
慣れてる書き方の方が速く読めるから、
他人のコードを読むときに同じ時間でより沢山のコードを読めるようになり、上達しやすくなる。
2018/12/16(日) 00:40:59.45ID:GOuL0+IB0
>>538
ちなみにO2とO3も試しましたが、O1と変わらないですね。
-O無しだとこの速度で、一体どこから速くなるんだろうと-O1を試したら速くなっていた、というだけの話です。
最適化無効で使うことがあり得ない、というのも今初めて知りました。ありがとうございます。

私から逆に言わせてもらうと、あなたも全般的におかしいと思います。
まず、質問に対する回答に全くなっていないという点。
あと、「上達速度を上げたい」などと一言も書いていないのですが、
一体どこからそう読み取って、「他人と同じコーディングルールで書け」などと余計なお世話を押し付けてきているのでしょうか。
先にも書きましたが、「今は自分一人で書いているだけ」なので勝手にさせていただきます。

あと万人に共通しうる「他人と同じコーディングルール」とやらのご教授もできたらお願いします。
できたらで結構ですが。
2018/12/16(日) 00:41:28.75ID:+TcxNu6P0
>>537
> 通常は、unsignedの後にintやlongなどと記述して用いるが、これを省略しunsignedとだけ記述した場合はunsigned intであるとして処理される。
> https://www.wdic.org/w/TECH/unsigned
そのようだが、ほぼ見ないと思うぞ。
まあ俺は仕様に詳しいわけではないし、俺の揚げ足取りをしたがっている粘着君に期待しよう。
彼は喜々としてヒャッハーしてくれるだろうし。


ただ何度も言ってるが、全般的に色々標準的ではないので、教科書なり参考サイトを見直した方がいい。
そこで意固地になられる理由も俺には分からないが。
541デフォルトの名無しさん (ワッチョイ 1e80-2dqZ)
垢版 |
2018/12/16(日) 00:46:03.68ID:Q57qqdXG0
> 自分が書いた挿入ソートが正しい内容になっているかと、

じゃあまずチェックプログラムを作りなさい

 @入力の列の値がすべて出力の列の値に含まれているかチェックする関数
 A出力の列の大小関係が適切になっているかチェックする関数

@、Aが面倒だったら、同じ入力の列の値を使って
qsort()の結果と出力の列の結果が同一になっているかチェックする関数
いろんな大量の乱数列使って問題がおきなかったらとりあえず誤りは検出されなかったことにすればいい

で、その前に
こういった試験するためのテストドライバをまず作ってみなさい
試験するためにはこういった機能があるテストドライバ用の関数が必要になると考えられるからな

 @擬似乱数を生成する
 An個の乱数列を生成する
 Bn個の列を複製する
 Cn個の列をダンプする

というわけで作業に戻りなさい
2018/12/16(日) 00:46:05.25ID:+TcxNu6P0
>>539
前後したが>>540がそのまま当てはまる。

とはいえ、まあ分かった、俺は君には今後回答しないことにする。
それがお互いの為のようだし。
543デフォルトの名無しさん (ワッチョイ 1e80-2dqZ)
垢版 |
2018/12/16(日) 00:47:26.92ID:Q57qqdXG0
低学歴底辺ドカタのアドバイスなんか
聞く必要ないからな
2018/12/16(日) 00:50:09.46ID:JR5j914d0
半角まで出てきたwww
545デフォルトの名無しさん (ワッチョイ 1e80-2dqZ)
垢版 |
2018/12/16(日) 00:50:43.18ID:Q57qqdXG0
低学歴底辺ドカタ内部のオキテの話なんか
どうでもいいワケ
どうみても質問ではそんなどうでもいい話なんか書かれてないからな
2018/12/16(日) 00:54:38.84ID:GOuL0+IB0
>>540
「unsigned int」と書くか「unsigned」と書くか、や、
「あなたがどう書いているかを見かけるか」なんて正直、本当にどうでも良い話です。本当にありがとうございました。
「あなたが思う『標準的』」とかも本当にどうでも良い話です。

揚げ足取りを従っている粘着君に期待するのは勝手なんですが、私を出しに使うのはご遠慮願いたいです。
もっというと他所でやってほしいです。どうでも良いので。
2018/12/16(日) 01:00:00.06ID:GOuL0+IB0
>>541
レスありがとうございます。

@入力の列の値がすべて出力の列の値に含まれているかチェックする関数
少ない要素数の配列では目でチェックしましたが、
100000の要素数の場合、これは行っていないので作ってみようと思います。
2018/12/16(日) 01:12:48.33ID:+TcxNu6P0
>>546
なるほど君も別の方向にコミュ障だから、>>528な訳か。
俺は別に君をダシにしたわけではなくて、
君の質問の>>536-537に関しては粘着君が喜々として答えてくれ、それが君の為にもなるだろう、と言っているだけ。

ちなみに君が欲しがっている回答は、現時点では情報不足で誰も正確には答えられないんだよ。
それも最初に言ったろ。

なんつーか、ゆとりはマジでこのパターン多過ぎ。
表面だけ丁寧で、中身がものすごく無礼、というか。
お前はお姫様/王子様ではないんだぜ。


逆に半角君も俺にはよく分からんが。
表面だけやたら人を罵倒しているが、実際はいちいちシコシコ回答してるから、手間はかかっている。
コンプレックスの固まりで他人を馬鹿にしたいだけなら粘着君みたいになるはずだし、
(馬鹿にするだけで一切自分の意見を言わない
=意見を言うとそこに反論される可能性が発生するから怖くて出来ない)
何がどうなると半角君になるのかよく分からん。
2018/12/16(日) 01:20:36.44ID:GOuL0+IB0
>>548
>>542

あとあなたも大概「無礼」ですよ。人を侮辱する前にご自身の発言を読み直したらいかがですか?
いきなり「ドアホ」言う人は中々私の周りにはいないです。
きっと「コミュ障」だからかもしれませんねw
2018/12/16(日) 01:26:00.46ID:+TcxNu6P0
>>549
そのレス自体が俺の方が数段上手なことを示しているわけだが、それも理解出来ないのだろ?
だから君はコミュ障なんだよ。まあいいが。

ま、きみは2chには向いて無いと思うぜ。
2018/12/16(日) 01:32:48.16ID:GOuL0+IB0
>>550
>>542

「どちらが上手か」や「コミュ障かどうか」や「2chに向いているか」を議論するスレでは無いのは理解できておられますか?
なんにせよ私にとってあなたは、全く理解の足しにならない人間だということは、低能コミュ障な私にもよく理解できましたので、更に数段上を目指してご邁進くださいませ。
かしこ。
552デフォルトの名無しさん (ワッチョイ 8abd-yieq)
垢版 |
2018/12/16(日) 01:35:58.25ID:nrAiyUBx0
>>534
C言語というよりコンピュータの基本を勉強した方がいい。CPUのレジストリは限られているから、本当にレジストリを使うマシン語がはかれたらOS、他のソフトウェアを阻害しかねない。

マルチプロセスではない昔のコンピュータならまだわかるが、CPUを占拠するようなコードを書くのは尋常ではない。
553デフォルトの名無しさん (ワッチョイ 8abd-yieq)
垢版 |
2018/12/16(日) 01:37:47.75ID:nrAiyUBx0
>>537
省略してはならない。これ基本。
可読性も落ちる。

ふざけているのか?
554デフォルトの名無しさん (ワッチョイ 8abd-yieq)
垢版 |
2018/12/16(日) 01:44:53.73ID:nrAiyUBx0
>>551
ネット上に転がっているサンプルはデタラメ、悪い例のオンパレードだったりする。

ちゃんと信用できるところを見ろ。

だいたいint型が何バイトで、CPUのレジスタ長が何ビットかわかってる?
555デフォルトの名無しさん (ワッチョイ 8abd-yieq)
垢版 |
2018/12/16(日) 01:53:47.94ID:nrAiyUBx0
コーディングスタイルは個人の好みで、できればよい、動けばよいなどと言う人間がこのようなソート処理を作るはずがない。

速い遅いのこだわりもどこから出てくるのかわからない。
2018/12/16(日) 01:57:29.82ID:GOuL0+IB0
>>552
メモリ周りの理解が深まると思い、C言語を学習してます。
レジストリ、というのはレジスタのことでしょうか?
register指定子ついてですが、
それをそのまま適用するどうかはコンパイラ依存だと認識しているのですが違うのでしょうか。
これら以外にレジスタを必要とする値や演算があったならば、それを采配するのはこのソートを行うプログラムではなくてOSではないでしょうか。
そもそも、たった3個のポインタ変数がCPUのレジスタを占拠してしまうほどのサイズを持っている変数とは思えません。

>>553
ふざけていませんし、そもそもここで質問する前提にコーディングしていませんでしたので、
「自分の分かりやすいように」記述していました。
つまり「可読性」は「自分にとって可読」であるものです。読みにくければ申し訳ないですね。
まぁこの数行程度のソースで読みにくいと騒ぐ上級者様がいるとは思えませんが。

あとさっきも書きましたが「コーディング規約」について質問しているのではありません。
この数行が読みにくくてしょうがない!というのであれば読んでいただかなくて結構です。
読んでくださる方に聞いているので。

確かに省略しすぎるのは自分もどうかと思っていますよ。
初めて「printf」なんて見たときは「なんのfやねん」って思いましたから。
2018/12/16(日) 02:02:53.44ID:zisHaYIc0
voidはまた質問者の気分を害して悦に浸ってるのか。こいつマジでスレの害悪だわ。
2018/12/16(日) 02:04:29.37ID:GOuL0+IB0
>>554
良いも悪いも、そもそもサンプルなんて読んでいませんし、挿入ソートがどういうモノか、というのだけを読んで書いていますので。
そもそも、ここもそのネット上なわけで。私が書いている関数の内容が正しく動くかや、あなたが今書いていることも信用していいんですかね?
疑い始めたらきりがありませんよ。
くだらない議論なので無価値ですね。

>>555
作るはずがない、と言われても作りました。何の根拠が?w
速い遅いのこだわり、とか書いていますが、そもそもこだわっていません。
「なんで自分の書いた挿入ソートのコンパイルが、最適化の有無でこんなに速度が変わるんだろう」というふとした疑問を書いているだけです。
私が、「速い挿入ソートが書きたい」なんて一言でも書いたでしょうか?
2018/12/16(日) 02:11:16.40ID:JR5j914d0
レジストリwwwww
2018/12/16(日) 02:14:08.51ID:GOuL0+IB0
さて、夜はふけてきましたが、
一部やかましいだけで有用な情報も得られなさそうなので、そろそろ休みます。
私が原因でスレをお騒がせしてしまって申し訳ございませんでした。

もし、挿入ソートが速くなる理由等分かるかたいましたら、また別の日にご教授頂けると嬉しいです。
ひとまずはテスト用のドライバ関数を作ってみたいと思います。
>>541さんありがとうございました。

みなさまおやすみなさい。
2018/12/16(日) 02:26:17.39ID:cTh7msTfM
自演お疲れさまでした
2018/12/16(日) 02:31:39.01ID:GdI2y+/Wa
おやすみなさい
2018/12/16(日) 02:44:07.72ID:GdI2y+/Wa
経験としては、O3にするとバクが顕在化するんであんまり使わないですね。
自分だけなら対応できるけど100人で作ってるプログラムはなかなか難しい。
2018/12/16(日) 04:45:04.91ID:lv3vm4Nk0
逆だろ
バグを顕在化させやすい条件を故意に作るんだよ
ストレステストとかそういうのだし
2018/12/16(日) 08:41:25.08ID:+JTyra3G0
>>525
一般に最適化は、常に同じ結果を出力する最短の計算に変換される。
ソートと書いてあるが、コードに特に比較条件がないので、これは単に
例えば(1 2 3 4 5)->(5 4 3 2 1)と入れ替えている。
元のコードは4+3+2+1=10の入れ替えが発生するが、単に入れ替えるだけなら、
5を1と4を2と、・・・と入れ替えればいい。計算数は2となる。
大小関係の確認を正しく入れれば、他のソートと同様なるかもしれない。
と、以上のように、俺が思っているだけなので、確認した方がいい。
2018/12/16(日) 09:54:31.21ID:+TcxNu6P0
おーい粘着!生きてるか!

折角俺様が「registerなんて見ねえ!」なノリなんだから、
一生懸命仕様を調べて突っ込みに来いよ!
お前の存在価値なんてそれくらいしかないんだし。


>>557
ゆとりなお前らはそれが駄目なんだよ。話が全く進まないだろ。
俺が間違っていることを言っていると思うのなら、ズバッと突っ込みに来るべきなのさ。
お前らはそれをする度胸もないまま、文句しか言えないわけでさ。
ゆとりが何万人いても何も作れなかったのはそれが根本的原因だよ。

少なくとも半角君は前に進むレスをしてるだろ。
彼が10人いれば確実に事態は進展する。
纏まることはないと思うが、それでも烏合の衆でしかないお前らより数段マシだ。

その言い方だと、お前も>>525のコードのやばさが分かってないだろ。
その他ゆとりも大概そんな感じだが。
それで粘着するのはお前らが全員馬鹿だと自身で証明しているようなものなのだが、
それも理解出来ないのだろ?

導くつもりなら、本当に見てやらないといけないのは「根本的に方向性を間違ってないか」であって、
完全にずれていると分かっている初心者の質問にも優しく答えてあげることではないんだよ。
それは逆に迷惑だと俺は思うがな。本人の為にならない。

とはいえ、どういうレスをするかは本人の自由だし、お前らなりのポリシーがあればやればいい。
それで「ゆとり専用:ぼくにやさしいすれ」が成立するのならそれもありだろう。
問題は、お前らゆとりは何もしない/出来ない癖に文句ばかり言ってるわけでさ。
それが本当にいけない。
2018/12/16(日) 10:01:21.28ID:aG56rBWDa
>>565
シェルソートとかコムソートじゃねえかなそれは
2018/12/16(日) 10:11:10.20ID:lv3vm4Nk0
>>566
525のコードのやばさが一番わかってないのはおまえだ
registerだあ? 全然関係ねえよ、おまえ上っ面しか見てねえ証拠だ
2018/12/16(日) 10:18:48.77ID:+TcxNu6P0
>>568
それで、お前は525のコードに

・問題がない、のか、
・俺が指摘してないもっと大きな問題がある、のか

を言えない/意図的に言ってないだろ。
それがお前らの最悪なところだよ。
突っ込まれるのが怖くて言えないのだとは思うが、
だからゆとりは死ななければ直らない、と言ってるわけでさ。

で?どっちなんだ?
後者なら堂々とマウント取りに来いよ。
2018/12/16(日) 11:10:40.38ID:lv3vm4Nk0
>>569
ほらな、何がやばいのか他人に聞かなきゃわからないだろ
煽れば教えて貰えると思っている甘ったれ野郎
571デフォルトの名無しさん (ワッチョイ 1e80-2dqZ)
垢版 |
2018/12/16(日) 11:39:09.26ID:Q57qqdXG0
というワケで評価用のテストドライバをテキトーにさくっとオレが書いてやったぞ

 https://ideone.com/FwRQ0E

あとはテキトーにやりなさい
オレのエレガントなテストドライバ関数群を使えば
いろんな整列アルゴリズムをバカでもチョンでも簡単に評価できる

 @乱数列生成 :aho_malloc_random_data()
 A列複製   :aho_malloc_clone_data()
 B大小関係チェック:aho_check_seq1()
 C要素存在チェック:aho_check_seq2()

リファレンス評価用に標準ライブラリqsort()もあわせて評価した
100,000件辺りの秒数で件数増加に伴うゴミっぷりの程度も評価している

このスレの低学歴知恵遅れたちが騒いでるようなコードについての問題は一切ない
vs2017でも適切に期待通りに動作することは確認した

評価する前から予見できてたことだが
挿入ソートがゴミすぎて困ることだけは改めて分かる

それ以外一切問題ない

低学歴知恵遅れが騒ぐコトはいつも的外れなワケ
2018/12/16(日) 11:49:03.98ID:+TcxNu6P0
>>570
それはお前のことだよゆとり。
そしてだからこそお前らは全く進歩せず、今でも池沼ゆとりのままな訳だ。

お前らは本当にワンパターンで、コミュ障も酷い。
それをパターン暗記で誤魔化そうとしているわけだが、そりゃ無理だ。
実際、それはお前にとって何ももたらさないし、その積み重ねが今な訳でさ。

少なくとも俺は何ヶ所も訂正すべき点を具体的に指摘している。
それに対してマウントを取るつもりなら、もっと重大なことを具体的に指摘せねばならない。
それをお前は出来ないから、どこかで見たフレーズで誤魔化そうとしているわけでさ。

ゆとりはマジでこれが酷い。
非ゆとりは、基本的には、自分で調べて理論武装し、挑んでくる。
この過程で成長する。だから、その後で紛糾しても、少なくとも当人には利益があるし、
当然勘違いしてたらぶっ叩かれるので修正もされる。つまり確実に本人は前進する。
お前らはこの過程をやろうとしないから、全く成長しないし、実際、してない。
だから今のお前が具体的に何も言えないわけでさ。
それを認めるのならまだしも、それをコピペフレーズで誤魔化そうとしているのだから重傷だよ。

聞くは一時の恥、聞かぬは一生の恥、って奴だよ。

リアルやID制のサイトならまだしも、
匿名掲示板ですら『恥』と思って聞けないその虚栄心では、リアルでは全く聞けてないだろ。
だからお前らは相変わらず池沼な訳でさ。
573デフォルトの名無しさん (ワッチョイ 1e80-2dqZ)
垢版 |
2018/12/16(日) 11:54:04.82ID:Q57qqdXG0
コレで挿入ソートがゴミ同然なのが
一目瞭然で分かる


 sort(>>525のコード)
 https://i.imgur.com/I3aSs5K.png

 qsort
 https://i.imgur.com/gdiXaoz.png

つまりもともとこんなゴミみたいなシロモノを
時間かけて最適化するのはムダ
2018/12/16(日) 11:54:37.67ID:W0MJyJGm0
>>571
お前、口が悪くて思い込みは激しいがここまでちゃんとフォローしてやるってのは偉いな。
下手に外野から評論ばっかりしてる奴らよりよほどこのスレでは役に立ってるわ。
2018/12/16(日) 12:07:06.08ID:fTV/MXSFa
ソートの性能は机上でわかるから、最適化について教えてくれや。
あとスーパースカラーの効き方とか絡めて語ってくれると助かるわ。
2018/12/16(日) 12:24:14.24ID:+TcxNu6P0
>>575
× 教えてくれや
× 助かるわ
お前らゆとりが駄目なのはそこなんだよ。他力本願過ぎ。
そして指摘しても糞女と同様開き直るし、救いようがない。

お前がどういう風に分かってないかなんて誰も知らないのだから、
お前自身がいろいろ調べて、

○ 俺的にはこう思うんだが、どうかな?

とやらないと駄目なんだよ。
具体的に上手くやったのは497で、497-499-502-503とならざるを得ない。
そのサイトには「シグナルでは使う」と書いていたから、それを否定する俺の見解を質してきたわけだ。
このやりとりは少なくとも彼には利益があっただろう。
そしてこの積み重ねが差になっていく。

お前も含めて、粘着共は何一つ意見を言えない。言う知能すらないからだ。
その差がどうして生じたのか、いちいち教えてやってんだからよく考えろよマジで。
2018/12/16(日) 12:25:29.13ID:XNrlNwMM0
>>525
挿入ソートの場合は、挿入すべき場所に直接挿入すればよいので、
swapで何度も入れ替えないようにして、必要なところに直接挿入するのがいいかもしれません。
一瞬バブルソートのように見えて、挿入ソートってこんなのだっけ?と思いました。

最適化についてはこのコードだけではなんともいえませんが、
大まかでよいのであれば、全体をclock関数で時間計測したように
この関数の中で経過時間を計測してみるのもよいと思います。
効果のある場所が限定できると推測もしやすくなりますので。
2018/12/16(日) 12:47:37.29ID:GOuL0+IB0
>>571
おおお、私の挿入ソートの為にありがとうござます。お手数おかけしました。
ちゃんと内容を読めていないので、時間を取ってテストドライバのソースを読んでみたいと思います。

一旦ひとまとめすると、
一応私の書いたソートは動いていて、ちゃんと「挿入ソート」になっているという感じでしょうか。
やはり、>>575さんもおっしゃる通り、なぜ-O無しと-O1の最適化の有無で、ソート時間が大幅に変わるのかが気になります。
コンパイラって不思議ですね。

>>577さん、ありがとうございます。
挿入ソート内での時間計測もやってみたいと思います。
この挿入ソートを作る前にバブルソートも作ったのですが、
以下の様に書きました。
void bubble_sort(unsigned array[], unsigned length)
{
 register unsigned *l = &array[0];
 register unsigned *r = &array[length - 1];

 while (r > l) {
  while (l < r) {
   if (*l > *r) {
    swap(l, r);
   }
   l++;
  }
  l = &array[0];
  r--;
 }
}

これに関しては、最適化の有無で極端にソート時間が変わる、というのはありませんでした。
と言っても最適化有効の方が速くはなっていましたが。
2018/12/16(日) 13:49:55.21ID:1E8BbQgX0
乱数で特定のデータを作って、それがソートされてるっぽいから
アルゴリズムは正しい・・・って正しいのか?
2018/12/16(日) 14:02:59.03ID:YrIrW4/W0
ほぼ整列済みのにデータに対してだけ速い挿入ソートがランダムなデータにはクッソ弱いのなんて当たり前じゃん
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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