1 名前:デフォルトの名無しさん mailto:sage [2016/11/06(日) 22:58:02.60 ID:dU5z27As.net] エスケープシーケンスやWin32APIなどの環境依存なものでもOK。 ただしその場合、質問者は必ず環境を書きましょう。 ◆ソースのインデントについて 半角空白やTABでのインデントはスレに貼ると無くなります。 そのため、アップローダーに上げるのも手ですが直接貼る場合は、 全角空白か に置換すると見栄えだけはよくなります。 【アップローダー】(質問が長い時はココ使うと便利) codepad.org/ (コンパイルもできるし出力結果も得られる[]privateをチェック) ideone.com/ (時間帯によってはcodepadが重い事があるのでここも利用) 前スレ 【初心者歓迎】C/C++室 Ver.99【環境依存OK】 echo.2ch.net/test/read.cgi/tech/1469177649/
2 名前:デフォルトの名無しさん mailto:sage [2016/11/06(日) 23:23:55.86 ID:AHO3vAwR.net] >>3-100 0は射精魔
3 名前:デフォルトの名無しさん [2016/11/07(月) 00:30:57.27 ID:pyn9XiBr.net] >>2 訂正しときます 次スレの>>3-100 0が射精魔
4 名前:デフォルトの名無しさん mailto:sage [2016/11/07(月) 09:27:53.95 ID:vooGYje+.net] 前スレ>>999 再掲 class A{ int a[2]; A(int b[]) :a(b) //error {} }; この:a(b)ってなにか書き方ありますか? 前スレ>>100 0 無理でした・・・
5 名前:デフォルトの名無しさん mailto:sage [2016/11/07(月) 09:34:35.19 ID:dSd+kVnH.net] 何がしたいのか
6 名前:わからないので回答しようがないな [] [ここ壊れてます]
7 名前:デフォルトの名無しさん mailto:sage [2016/11/07(月) 09:36:19.79 ID:dSd+kVnH.net] あ、初期化子か インデントがないから見間違えた
8 名前:デフォルトの名無しさん mailto:sage [2016/11/07(月) 09:38:54.66 ID:e8hpdnod.net] 引数の int b[] って int* b と同じやしなぁ
9 名前:デフォルトの名無しさん mailto:sage [2016/11/07(月) 09:47:42.61 ID:HQzTq5fm.net] std::array
10 名前:デフォルトの名無しさん mailto:sage [2016/11/07(月) 12:11:29.58 ID:56hqYy7l.net] C++11以降なら A(int (&b)[2]) : a{b[0], b[1]} {}
11 名前:デフォルトの名無しさん mailto:sage [2016/11/07(月) 14:52:37.34 ID:fwwW9lIx.net] だがint b[2][3]はポインタ引数は・・・
12 名前:デフォルトの名無しさん mailto:sage [2016/11/07(月) 14:56:04.42 ID:6MsAvbZq.net] ↑幻覚をみた糖質のつぶやき
13 名前:デフォルトの名無しさん [2016/11/07(月) 15:00:49.14 ID:3Xim9e5h.net] >>4 C++11以降ならstd::initializer_listが使える #include <iostream> #include <initializer_list> #include <algorithm> class A { int a[6]; public: A(std::initializer_list<int> b) { std::copy(std::begin(b), std::end(b), a); } void print() const { for (int i : a) std::cout << i << std::endl; } }; int main() { A a({10, 4, 2, 8, 5, 66}); a.print(); }
14 名前:デフォルトの名無しさん mailto:sage [2016/11/07(月) 18:18:06.75 ID:hOJqMng1.net] >>12 それinitializer_listに6っこ以上与えたら実行時のアクセス違反になる >>4 C++11以降ならstd::array使うべき そうすれば普通に書ける class A{ std::array<int,2> a; public: A(const std::array<int,2> &b):a(b) { } };
15 名前:13 mailto:sage [2016/11/07(月) 18:21:04.82 ID:hOJqMng1.net] 2行目「6個より多く」だったね
16 名前:デフォルトの名無しさん mailto:sage [2016/11/07(月) 18:44:55.40 ID:3Xim9e5h.net] >>13 いやいくらでも動的に増やせるんだけど初心者スレだから省略した ideone.com/ryEwkt
17 名前:デフォルトの名無しさん mailto:sage [2016/11/07(月) 19:07:23.45 ID:hOJqMng1.net] 要求は固定長の配列であって、動的に増やせるようにしろとは言ってないので それのコードは非効率にしかならないと思うよ
18 名前:デフォルトの名無しさん mailto:sage [2016/11/07(月) 19:25:01.70 ID:fwwW9lIx.net] >>11 ん? int b[2][3];をわたせんの? func(int a[][3]);以外で
19 名前:デフォルトの名無しさん mailto:sage [2016/11/07(月) 19:50:01.21 ID:Z2RT26Su.net] >>16 だからvector使ってないでしょう unique_ptrのパフォーマンス知らないの?
20 名前:デフォルトの名無しさん mailto:sage [2016/11/07(月) 20:07:47.59 ID:Z2RT26Su.net] ID:hOJqMng1 の主張の変遷 1.わざと大きい初期化子を与えると実行時にアクセス違反になると主張 →だから動的に対応できるようにした 2.すると今度は非効率的だからarrayを使えという →arrayが特に効率的なわけではないし、今度は「要求は固定長の配列だ」と言い出す どう考えても言ってることがコロコロ変わってるんだが
21 名前:デフォルトの名無しさん [2016/11/07(月) 21:12:34.93 ID:L762Pvtq.net] !!喧嘩の予感!!
22 名前:デフォルトの名無しさん mailto:sage [2016/11/07(月) 21:25:52.93 ID:nZ1H9hgf.net] A() : a{b[0], b[1]} {}がダメだった人にC++11を押しつけてどーすんだ >>12 に至ってはもとの質問と全然関係ねーし
23 名前:デフォルトの名無しさん mailto:sage [2016/11/07(月) 21:26:20.26 ID:Rr8tj+hR.net] VC++で、マウスオーバーで色が少し変わって、クリックしたら沈んだみたいになる画像ボタンを作るにはどうしたらいいですか?
24 名前:デフォルトの名無しさん mailto:sage [2016/11/07(月) 22:16:57.66 ID:hOJqMng1.net] >>19 まず効率は動的確保を行うnewとunique_ptrより確実にarrayのほうがいい そして>>4 の要求はコードから明らかに固定長でいいと言ってる これは私の勝手な主張ではなく元の要求がそうなってる 目的を達成するために非効率な動的確保は必要ない 私はアクセス違反になるといったが動的確保にしろとは言っておらず、動的確保にしたのはそっちが勝手にやったこと アクセス違反を回避するために動的確保にするのは全く割に合わない だったら長さチェックすればいいだけ
25 名前:デフォルトの名無しさん mailto:sage [2016/11/07(月) 22:20:22.76 ID:JXtVbtZ4.net] >>21 で結論でてるじゃねえか C+11を押し付けてる時点でおまえら全員ダメだ!
26 名前:デフォルトの名無しさん mailto:sage [2016/11/07(月) 23:34:44.46 ID:lMECrzfj.net] いいぞ、もっとやれ〜♪
27 名前:デフォルトの名無しさん mailto:sage [2016/11/08(火) 00:32:16.33 ID:t0HdCoBm.net] 沸点低すぎワロタw
28 名前:デフォルトの名無しさん mailto:sage [2016/11/08(火) 00:33:05.07 ID:2SYrs2Uf.net] >アクセス違反を回避するために動的確保にするのは全く割に合わない こう書かれるべきものが >>16 で >それのコードは非効率にしかならないと思うよ と書かれたため>>19 が射精した 特に「非効率にしかならない」の「にしか」という表現が前後の繋がりを考えると最悪だ
29 名前:デフォルトの名無しさん mailto:sage [2016/11/08(火) 15:38:54.44 ID:FW358liz.net] using std; int main() { int a; cout<< "数を入力してください" <<endl; cin>> a; cout<<a <<"ですね?" <<endl; } aを確実に入力させたくて困っています ご教授ねがいます
30 名前:デフォルトの名無しさん mailto:sage [2016/11/08(火) 16:03:34.41 ID:j/2yZvJO.net] まず確実ってなんやねん 数以外だったり未入力は弾くってか
31 名前:デフォルトの名無しさん mailto:sage [2016/11/08(火) 16:26:08.25 ID:FW358liz.net] そうです 未入力で無限ループみたいに表示されて困っています
32 名前:デフォルトの名無しさん mailto:sage [2016/11/08(火) 16:26:29.50 ID:Or+T0geg.net] 教示ならしてやっても良いが、教授はお断りだ
33 名前:デフォルトの名無しさん mailto:sage [2016/11/08(火) 16:58:49.59 ID:sBMnjDSh.net] >>28 ideone.com/dpolU5 一応単なる改行や数字で始まらない文字列は弾くようにした ただしコメントにも書いてあるけど 123def みたいな数字で始まる文字列を 入力したときは数字だけ返すんでそれが駄目なら自前で作るしかないね
34 名前:デフォルトの名無しさん mailto:sage [2016/11/08(火) 17:22:56.70 ID:FW358liz.net] >>32 getline知りませんでしたが何とかできそうです ありがとうございます
35 名前:デフォルトの名無しさん mailto:sage [2016/11/10(木) 10:52:07.29 ID:8ULjF/bN.net] 独習C第4版 P197ページの再帰のプログラムなのですが、 #include <stdio.h> void recurse(int i); int main(void) { recurse(0); return 0; } void recurse(int i) { if(i < 10) { recurse(i + 1); printf("%d " , i); } } 実行結果は 9 8 7 6 5 4 3 2 1 0 の動作がわかりません。10になるまでprintfが実行されずに+1され続けるのはいいのですが、 なぜ10になったらiが戻り始めるのでしょうか? あまりに初心者な質問ですみません。
36 名前:デフォルトの名無しさん mailto:sage [2016/11/10(木) 11:03:28.04 ID:6ImFpJhK.net] 引数だけ書くと 0+1 1+1 ・・・ 9+1 ここまではprintfまで来ないまま再帰 9+1でifに入らないからrecurseからリターン printfがiを表示(9)してリターン printfがiを表示(8)してリターン の繰り返し
37 名前:34 mailto:sage [2016/11/10(木) 11:07:42.28 ID:8ULjF/bN.net] >>35 早速のレスありがとうございます。 >9+1でifに入らないからrecurseからリターン ということはmain関数のreturn 0でプログラムは終了してしまうのではないですか? なぜprintfが呼ばれるのかわからんのですが。(iが減算される理由もわかりません)
38 名前:34 mailto:sage [2016/11/10(木) 11:12:33.48 ID:8ULjF/bN.net] if(i < 10) { recurse(i + 1); printf("%d " , i); } で recurseとprintfは同じifブロックに入っているので、ifが偽なら両方共スキップされると思うのですが、 なぜprintfだけ呼ばれるのでしょうか?
39 名前:デフォルトの名無しさん mailto:sage [2016/11/10(木) 11:20:27.66 ID:69ogPHI/.net] 丁度再帰打ち切り付近の挙動 i=8 で受けた recurse recurse(8+1) の呼び出し i=9 で受けた recurse recurse(9+1) の呼び出し i=10 で受けた recurse 条件合致せず戻る printf("%d", i) で 引数の 9 を書く i=9 で受けた recurse から戻る printf("%d", i) で 引数の 8 を書く i=8 で受けた recurse から戻る
40 名前:デフォルトの名無しさん mailto:sage [2016/11/10(木) 11:28:04.25 ID:6ImFpJhK.net] >>37 9+1で入って偽で抜けたら 8+1で入ってきたif内のrecurseから抜けて次のprintfが実行されて抜ける 8+1で抜けたら7+1で入ってきたif内のrecurseから抜けて次のprintfが実行される の繰り返し
41 名前:34 mailto:sage [2016/11/10(木) 11:40:24.95 ID:8ULjF/bN.net] >>35-39 さん どうも再帰関数とforループがごっちゃになっていたようです。 何となくわかりました。 後は自分で考えてみます。 どうもありがとうございました。
42 名前:デフォルトの名無しさん mailto:sage [2016/11/10(木) 12:42:30.91 ID:69ogPHI/.net] 再帰呼び出し後に書く recurse(i+1); printf("%d ", i); と 書いてから再帰呼び出し printf("%d ", i); recurse(i+1); の違いとか 呼び出しの出入りを整理する printf("in:%d\n", i); recurse(i+1); printf("out:%d\n", i); と見えてくると思うよ
43 名前:デフォルトの名無しさん mailto:sage [2016/11/10(木) 13:57:04.04 ID:gEXUDT4B.net] なんか遠回りな説明ばかりだな スタックフレームというキーワードを出してやれよ
44 名前:40 mailto:sage [2016/11/10(木) 14:01:09.75 ID:8ULjF/bN.net] >>41 >再帰呼び出し後に書く recurse(i+1); printf("%d ", i); >と >書いてから再帰呼び出し printf("%d ", i); recurse(i+1); >の違いとか これはこの本の次のページにも書いてありました。 書いてから再帰呼び出しの場合は昇順(1,2,3,4,5,6~)になりますね。 相変わらず曖昧な理解なんですが、 どのiの場合もi=10に達するまではrecurse(i+9)までしか実行されていなくて、 printfは実行されていない待機中の状態だと考えればいいのでしょうか? それでi=10でif条件文を抜けて、i=9からi=0まで数字が大きい方から順番にまだ実行していなかった printfを降順で実行していくのでしょうか? この本(独習C)には > 引数の値が10に達すると、recurse()の再帰呼び出しから戻りはじめます。関数は、呼び出し元に戻る >ものなので、recurse()は直前の呼び出し元に戻り、そこでprinf()を文を実行して「9」と表示し、 >さらに前の呼び出し元に戻ります。こうしてrecurse()は、今度は「8」と表示します。 その後も同じ>プロセスが繰り返され、すべての呼び出しから戻った段階でプログラムが終了します。 実行される順番が、最初のi=0からではなく、直近のi=9からなのはなぜなのでしょうか?
45 名前:デフォルトの名無しさん mailto:sage [2016/11/10(木) 14:02:24.39 ID:69ogPHI/.net] 再帰でどう動いてるか理解するのに スタックフレーム出されても困らないか? 値の保持の実装でそうなってるってだけだし
46 名前:デフォルトの名無しさん mailto:sage [2016/11/10(木) 14:09:10.79 ID:gEXUDT4B.net] この手の人は、具体的な実装例を見さえすれば、すぐさま疑問が解消されるんだよ >>43 でも「待機する」だとか なんで逆順になるのか分からないとか 言っているが スタックフレームさえ知れば全ての疑問は解決だし C/C++するのにスタックフレームさえ知らない状態だと このさき困難だろう
47 名前:デフォルトの名無しさん mailto:sage [2016/11/10(木) 14:10:50.73 ID:69ogPHI/.net] おっけー まかせた
48 名前:デフォルトの名無しさん mailto:sage [2016/11/10(木) 14:18:39.78 ID:gEXUDT4B.net] 待機する、って言い方を見るに、何かキューのような物を連想しているようだし 実際、なんで逆順になるか分からないと発言しているわけだが 答えは関数呼び出しはキューではなくスタックだから、と言う他ない キューやスタックという言葉の意味が分からなかったとしても どのみちこれらも覚える必要のある最も基本的な事の一つだから 合わせて覚えればよいだろう コンピュータの基本動作もよくわからないままプログラムを書くということは 多言語ではあり得るのかもしれんが、とりわけここはC/C++スレだからね
49 名前:デフォルトの名無しさん mailto:sage [2016/11/10(木) 14:26:03.17 ID:gEXUDT4B.net] いや、俺は別に何も説明するつもりはないよ ただ、スタックフレームというキーワードをだね そうすれば後は本人が検索するなりなんなり、勝手に調べるだろう キーワードが分からなきゃ検索も出来ないから、キーワードを出してやれという話 スタックを知らずして再起呼び出しの動作を理解するのは非常に困難というか 質問者は関数呼び出しがキューのようなものであると考えている可能性が高いようだけど 実際にはスタック動作だよ、と ここを勘違いしていたら、答えにたどりつかないかなぁと
50 名前:デフォルトの名無しさん mailto:sage [2016/11/10(木) 14:29:55.54 ID:6ImFpJhK.net] >>42 最短の説明で教えてあげてくれ任せた
51 名前:40 mailto:sage [2016/11/10(木) 14:33:22.38 ID:8ULjF/bN.net] スタックフレームで検索して見たところ、 ttp://brain.cc.kogakuin.ac.jp/~kanamaru/lecture/MP/final/part06/node9.html このページが一番わかりやすそうです。 LIFOなんで新しい関数と引数が上の方に積み上がっていくと考えれば良いのでしょうか? first outなんで実効は新しい順(つまり今回の例の場合はi=9)ということですね。 スタックフレームという言葉で検索したらおもしろそうなサイトがたくさん出てきました。 皆さん今回はありがとうございました。
52 名前:デフォルトの名無しさん mailto:sage [2016/11/10(木) 14:51:19.03 ID:IzCfpVGN.net] >>43 まず大前提としてプログラムの流れは1本道で別れたりしないし、待機みたいなことも普通しない そして再帰関数という特別な関数があるわけではない、recurseは普通の関数と何も変わらない void recurse(int i) { if(i < 10) { recurse(i + 1); printf("%d " , i); } } この4行目はrecurseという関数を呼び出している つまり自分自身を呼ぶのでこの4行目の呼び出し後、recurse関数の最初に戻る ただし引数iは1大きい値で呼ぶ これを入れ子のように10回繰り返すことになる
53 名前:43 mailto:sage [2016/11/10(木) 15:05:17.38 ID:8ULjF/bN.net] >>51 レスありがとうございます。 ttps://ipa-zone.info/page-2644/ このページに私が使っている独習Cの再帰の部分が丸ごと転載されているんですが(違法?)、 i=0~10と昇順で増加していく前半部分でも呼び出された関数(recurse(1)など)は終了した訳ではないですよね? 後半のi=10から降順で減少していくときにはじめてprintfが実行されて関数が終了すると思うんですが、 LIFOなんで最後に呼び出されたrecurse(9)からrecurese(0)まで降順で残ったprintfを実行していくということではないんですか?
54 名前:デフォルトの名無しさん mailto:sage [2016/11/10(木) 15:15:27.68 ID:gEXUDT4B.net] >実行は新しい順(つまり今回の例の場合はi=9)ということですね。 難しく考える必要は無い 関数を呼び出すとき、自分が今何をしていたかをそっくりそのまま保存した状態で 新たにスタックを確保して、呼び出した関数を実行する 関数の実行が終わると、使っていたスタックを開放して 呼び出される前に実行していた処理に復帰する ちょうど君が 1)ビデオを見ていた時に電話がかかってきたら、ビデオを一時停止して電話に出る 2)電話が終わると、ビデオを再生して続きを見る のと同じで、ビデオの一時停止機能がスタックに相当している で、君がこの日のことを日記を書くとき 1)のことを重視すれば、ビデオ→電話、って順になるし 2)のことを重視すれば、電話→ビデオ、って順になる 実際にはビデオ→電話→ビデオ、という順で物事は流れているんだが どこのタイミングを切り取ってくるかで順番が変わるのだ 下から順番に1,2,3,4,5と積み上げて、上から順番に5,4,3,2,1と取り出すとき 積み上げるとき(積み上げる前)に出力すると1,2,3,4,5だし 取り出すとき(取り出した後)に出力すると5,4,3,2,1になる 実際には1,2,3,4,5,4,3,2,1という順で処理は走っているが(積み上げる→取り出す) 前半に着目すれば1,2,3,4,5だし、後半に着目すれば5,4,3,2,1なのだ
55 名前:デフォルトの名無しさん mailto:sage [2016/11/10(木) 15:18:47.59 ID:17noS2hU.net] 長い。あとビデオ見ながら電話に出れるだろ
56 名前:デフォルトの名無しさん mailto:sage [2016/11/10(木) 15:21:50.96 ID:3AXwvnI0.net] ポインタを返すラムダをstd::functionで取り扱いたくて調べてるのだが どうしてどの参考例もintやvoidの例しか示していないのだろう 参考例を示すまでもなく誰でも簡単に記述出来ているのだろうか
57 名前:52 mailto:sage [2016/11/10(木) 15:39:54.19 ID:8ULjF/bN.net] >>53 レスありがとうございます。参考になりました。
58 名前:デフォルトの名無しさん mailto:sage [2016/11/10(木) 20:21:43.62 ID:CLfGjB35.net] >>55 特に難しくは無いと思う 例えばどんなことをしたいの?
59 名前:デフォルトの名無しさん mailto:sage [2016/11/10(木) 20:31:23.31 ID:AQTsjJgJ.net] 文盲はお帰りください
60 名前:デフォルトの名無しさん mailto:sage [2016/11/10(木) 21:49:48.84 ID:cv2N5dvt.net] std::function<int*(const int)> create_array = [](const int n)->int*{ return new int[n]); }; でいいんじゃないの 誰かdeleteすんだよと思うけど
61 名前:デフォルトの名無しさん mailto:sage [2016/11/10(木) 22:03:01.49 ID:AQTsjJgJ.net] >誰かdeleteすんだよと思うけど 自覚があるならそんな変な例を出さなければいいのに
62 名前:デフォルトの名無しさん [2016/11/10(木) 23:23:35.24 ID:wCaAZ9DK.net] >>60 じゃあお前が適切な答え書いてやれよ
63 名前:デフォルトの名無しさん mailto:sage [2016/11/10(木) 23:41:59.59 ID:AQTsjJgJ.net] >>55 の回答はこんな感じでいいだろう using ptr_type = void *; std::function<ptr_type ()> f1{ []{ return ptr_type{}; } }; std::function<void *()> f2{ []{ return static_cast<void *>(nullptr); } };
64 名前:デフォルトの名無しさん mailto:sage [2016/11/11(金) 01:01:22.47 ID:JQalwGbJ.net] >>62 散々煽ってたから聞くけど static_cast<void *>(nullptr) このキャスト無駄じゃない? これは変な例ではないの?
65 名前:デフォルトの名無しさん mailto:sage [2016/11/11(金) 01:15:39.30 ID:tUBqvL6G.net] う〜んどうだろうね よく見るとラムダの戻り値の型が省略されているし こういったことがどの段階のC++のバージョンで出来るようになったのか 俺は知らないが、実際の戻り値の型からラムダの型を推測してくれる便利機能 を使っていると思われる となれば、キャストなしのnullptrでは型がわからないから ラムダの戻り値の型の推測もできず、コンパイルエラーになるのではないだろうか
66 名前:デフォルトの名無しさん mailto:sage [2016/11/11(金) 01:36:59.83 ID:tUBqvL6G.net] もしくは、ひょっとしたらnullptrには何らかな特殊な型が与えられているのかもしれんが それはしらないが、ともかくvoid*型ではないのは確かなので その場合でもstd::function<void *()>への代入で問題を起こすんだろう nullptrに型が有るのか無いのか、俺は知らんし、興味もないんだけどね
67 名前:デフォルトの名無しさん mailto:sage [2016/11/11(金) 01:48:43.11 ID:v3r+B2af.net] >>57 >>59>>62 vsで試してて std::function<void *()> のような書き方をするとテンプレートがエラーを出していたので 関数ポインタのような特殊な記述が必要になるのかと思って調べていたのですが 原因が分かりました 仮で書いていたラムダ式の中の返り値を return NULL; にしていたのでこれがintなためエラーが出ていたようです テンプレートの奥のほうで型の不一致を出していたので <>内の記述ばかり疑っていました というかNULLって今まで(void *)0だと思ってました・・・ まさかただの0だとは 普段はコンパイラが暗黙に変換してるんだね・・・
68 名前:デフォルトの名無しさん mailto:sage [2016/11/11(金) 01:56:19.58 ID:v3r+B2af.net] 自宅のvs2015communityで実験したところ std::function<void *(void)> f0 = [](void) { return NULL; }; std::function<void *(void)> f1 = [](void) { return (void *)NULL; }; std::function<void *(void)> f2 = [](void)->void * { return NULL; }; std::function<void *(void)> f3 = [](void) { return nullptr; }; だとf0のみエラーです gccとかでも同様なんですかね
69 名前:デフォルトの名無しさん mailto:sage [2016/11/11(金) 02:04:25.89 ID:JQalwGbJ.net] >>65 nullptrの型はnullptr_tだよ だからラムダの戻り値の型はnullptr_tと推論される ただ問題はvoid *を戻り値としたfunctionに代入できるか ぶっちゃけ俺も書いてからやっちまったかと思って調べた 規格を調べたところやはり要らなかった 戻り値が暗黙変換できれば代入できると書いてある つまりラムダの戻り値intでfunctionはdoubleとかもあり そして当然nullptrはvoid *型に暗黙変換できる なので要らない https://ideone.com/EwRvlU >>67 の結果とも一致する
70 名前:デフォルトの名無しさん mailto:sage [2016/11/11(金) 07:16:38.23 ID:hk5EgzxW.net] >>63 コンパイルが通るかどうか以前に55は『ポインタを返すラムダを』と言っているのだから、 無いとお題改変になってしまうだろう >>67 当然 int f() {return NULL;} void *関数() { return f();//エラー } と同じことなので
71 名前:デフォルトの名無しさん mailto:sage [2016/11/11(金) 08:09:52.28 ID:JclCvFO1.net] ID:tUBqvL6Gは希にみる健常者
72 名前:デフォルトの名無しさん mailto:sage [2016/11/11(金) 08:32:07.55 ID:JclCvFO1.net] >nullptrに型が有るのか無いのか この手の文法で型が無い落とし穴は初期化の { } ぐらいか int a = {0}; // 「{0}」は式でなく型も無い
73 名前:デフォルトの名無しさん mailto:sage [2016/11/29(火) 23:30:19.59 ID:7z8mZ0fw.net] さすがにCは時代に取り残された感があるな 新規案件なら埋め込み系を除いて存在意義なし
74 名前:デフォルトの名無しさん mailto:sage [2016/11/30(水) 02:47:51.57 ID:Ir3oZvjK.net] 寂しいですなぁ
75 名前:デフォルトの名無しさん [2016/11/30(水) 02:56:49.99 ID:a9ciiDR7.net] う、埋め込み…
76 名前:デフォルトの名無しさん [2016/11/30(水) 04:02:07.30 ID:tfyAgmME.net] 組み込み系って英語ではembedded なんちゃら だし よくある間違いでしょ
77 名前:デフォルトの名無しさん [2016/11/30(水) 05:21:32.16 ID:sG3uRZRm.net] 韓国ではよくあるんだ。
78 名前:デフォルトの名無しさん mailto:sage [2016/11/30(水) 05:53:32.74 ID:/gnC384r.net] 埋めるのは中国の得意とする技術
79 名前:デフォルトの名無しさん mailto:sage [2016/11/30(水) 21:26:32.85 ID:ncjk4kan.net] linuxのカーネルモジュールてC++で書けるようになったんだっけ?
80 名前:デフォルトの名無しさん mailto:sage [2016/11/30(水) 22:16:09.74 ID:Yeu32peW.net] ドライバとかはサブシスは普通に書いてるぽい、コアな部分はメンテナがパニクルのでやっぱCかと
81 名前:デフォルトの名無しさん mailto:sage [2016/12/01(木) 11:40:38.39 ID:OWujHEiH.net] 実際ひと目でいいからソース見てみ 一生C++なんか使わねーという主張がにじみ出てるよ
82 名前:デフォルトの名無しさん mailto:sage [2016/12/01(木) 12:49:06.43 ID:yfw1GD74.net] C++使わなくていいならそれに越したことはないからね
83 名前:デフォルトの名無しさん mailto:sage [2016/12/01(木) 13:16:49.42 ID:VWu2OAFy.net] c++は個人差が大きすぎるようです。議論も出来ない。 方向がコンフリクトしたら大変なのは ここ見てればわかる。
84 名前:デフォルトの名無しさん mailto:sage [2016/12/03(土) 01:01:12.94 ID:62YFpmrs.net] C++はマングリングとかややこしいから
85 名前:デフォルトの名無しさん mailto:sage [2016/12/03(土) 20:56:34.75 ID:nmEGc+VH.net] マンコリング
86 名前:デフォルトの名無しさん mailto:sage [2016/12/11(日) 20:30:30.03 ID:CL+E9lTu.net] C++初学者です。 既存のCのライブラリに次のような関数が有るんだけど bool SendData(uint32_t * txData, uint32_t * rxData, uint16_t length); ラッパーで引数をuint16_tのポインタに変更したもを作りたいと考えています。 bool SendData(uint16_t * txData, uint16_t * rxData, uint_16_t length); 単にラッパーの中でバッファを持って変換してやれば良いとも思ったけど、 組み込み用途なんで速度や消費メモリ的にそれは避けたいです。 newやdeleteは無しでスタックのみを使用できれば、なお良いのですが、 良い方法が思いつきません。 何かスマートな方法は有りませんか?
87 名前:デフォルトの名無しさん mailto:sage [2016/12/11(日) 20:55:16.41 ID:Cd8ql2jy.net] 元関数の length が uint32_t 単位での個数という仮定 → uint32_t より小さい粒度は取り扱えない → uint16_t で取り扱える個数は偶数個に限定される → ポインタのキャストと length を /2 で渡すだけ
88 名前:デフォルトの名無しさん mailto:sage [2016/12/11(日) 21:42:00.21 ID:74mAoGAM.net] uint16_tの方がラッパーなの? どちらにしろ元の関数をそのまま使うなら変換は必要だね。 スタックが使われるかどうかはしらないけどClangコンパイラなら 可変長配列(VLA)っていうのがC++でも使えたはず。 サイズが大きすぎるとオーバーフローするけど。newと兼用してみるのも手。
89 名前:85 mailto:sage [2016/12/12(月) 22:47:53.10 ID:lLNqHCIY.net] >>86 なるほど、 渡すデータを1つ置きにすれば良いわけですね。 渡すデータを組み立てるときにそうすれば良いですし変換のコストは少なそうです。 多少汚いとこが関数外に出ちゃいますが今回のケースでは現実的な方法だと思います。 >>87 残念ながら使用しているコンパイラはclangではないですし、 VLAは今回の用途には重そうですね。 便利そうなので、PC用のプログラムを作るときに使えるかもしれません。 ひとまず>>86 さんの方向で考えてみます。 お二人ともありがとうございました。
90 名前:デフォルトの名無しさん mailto:sage [2016/12/13(火) 07:43:47.25 ID:vJwCdf+q.net] 組み込みでスタックに可変長のデータ領域確保するとか頭大丈夫?
91 名前:デフォルトの名無しさん mailto:sage [2016/12/13(火) 18:19:51.83 ID:692Oa1tt.net] >>89 組み込みのことは知らないんだけど、サイズチェックして分岐するのはどうなん? if (length * sizeof(uint32_t) < 32767) { uint32_t list[length]; Test(list, length); } else { uint32_t list = new uint32_t[length]; Test(list, length); }
92 名前:デフォルトの名無しさん mailto:sage [2016/12/13(火) 19:22:51.41 ID:vJwCdf+q.net] >>90 どうなのって言われても好きにしろよとしか言えないけど... 個人的には各々のテストも必要になるその手のコードは書かない
93 名前:デフォルトの名無しさん mailto:sage [2016/12/15(木) 21:00:06.98 ID:iypiqTM3.net] ガチの初心者でプログラミング勉強したいと思ってるんですが プログラミング勉強するとなるとどんなものから作り始めればいいですかね? ちなみにCの基本的なこと(if,for文やファイル入出力)くらいしか知りません
94 名前:デフォルトの名無しさん mailto:sage [2016/12/15(木) 22:16:52.10 ID:esEF0eVo.net] やっぱり画像が出たら楽しいから画像ビューアとかが良いんじゃないかな 画像が動いたらもっと楽しいって言うんならゲームもよいんじゃない? 音関係も楽しいんだが、サウンドプログラミングは結構専門知識がいるうえ デバッグが難しいから最初は手を出さないほうが良いよ ま、画像ビューアや動画プレイヤーが楽しいよ ちょっとした実用性もあるし
95 名前:デフォルトの名無しさん mailto:sage [2016/12/15(木) 22:22:14.89 ID:KqXo4C+P.net] Cであることに特に意味がないのなら別の言語の検討をすすめる
96 名前:デフォルトの名無しさん mailto:sage [2016/12/16(金) 06:44:53.82 ID:cbHo8vE5.net] javaも悪くないと思いますよ。
97 名前:デフォルトの名無しさん mailto:sage [2016/12/16(金) 08:53:37.09 ID:hCzygT3G.net] >>92 プログラミングを習得した延長線上に何を作りたいか決まってる?
98 名前:デフォルトの名無しさん mailto:sage [2016/12/16(金) 08:59:07.35 ID:2kpKp/Uz.net] >>92 作りたいプログラム(今ならアプリケーションというのかな)の イメージが先にないとアドバイスしにくい時代なのよ。 まずコンソールに hello, world を表示して、続いて標準入出力、 ソートやらリンクド・リストやらのアルゴリズムを習得して… という順序を踏んでも、「マウスをクリックすると何かしてくれる」ような 今様のプログラムには少しも近づかないんだな、これが。
99 名前:デフォルトの名無しさん mailto:sage [2016/12/16(金) 09:22:43.83 ID:R8KZSjOU.net] >>96 ゆくゆくはカメラを使って画像処理的なものをしてみたいと思ってます 具体的にはまだ決まってませんが…
100 名前:デフォルトの名無しさん mailto:sage [2016/12/16(金) 09:23:43.35 ID:R8KZSjOU.net] >>97 なるほど 将来的にやりたいことをしっかり考えたうえで何を学ぶべきか考えたほうがいいんですね!
101 名前:デフォルトの名無しさん mailto:sage [2016/12/16(金) 09:30:19.30 ID:R8KZSjOU.net] >>93 なるほど! 参考になりますm(__)m
102 名前:デフォルトの名無しさん mailto:sage [2016/12/16(金) 09:52:11.47 ID:hCzygT3G.net] >>98 じゃあとりあえずGUIが必要だから そこらへんからかな?
103 名前:デフォルトの名無しさん mailto:sage [2016/12/16(金) 11:19:48.12 ID:O1fw7E0o.net] >>101 わかりました! ありがとうございます!
104 名前:デフォルトの名無しさん mailto:sage [2016/12/18(日) 22:40:31.25 ID:rTzEq7cO.net] c++でGUIな何かを作るときどうやるのが普通?どうやるのがおすすめ? 趣味嗜好全開でいいから教えてくれ
105 名前:デフォルトの名無しさん mailto:sage [2016/12/18(日) 22:46:05.73 ID:eNcCSvTp.net] ビルド時間とバイナリサイズが気にならないならwxWidgets
106 名前:デフォルトの名無しさん mailto:sage [2016/12/18(日) 22:56:35.56 ID:TyHJy95g.net] 真面目にその条件なら.NETだけどそれなら言語はC#でやった方がよいと思う 自分は自分用のWIN32APIを使ったGUI用のライブラリ作ったけど完全に時代遅れだとは思ってる
107 名前:デフォルトの名無しさん mailto:sage [2016/12/18(日) 23:56:09.22 ID:psse/iGW.net] wxWidgetsよさそうやね クロスプラットフォームってのがいい
108 名前:デフォルトの名無しさん mailto:sage [2016/12/19(月) 08:41:19.51 ID:K+bb4qm0.net] vcを使うという事ですか
109 名前:デフォルトの名無しさん mailto:sage [2016/12/20(火) 08:43:24.96 ID:/4ZK922w.net] >>103 ターゲットのOSとかPC/ケータイとかライセンスとか軽さとか見比べて GUIフレームワークを選ぶ Qt は重いけどマルチプラットフォームかつ見た目がいいから人気 Windowsのみなら C# が迷わなくて済むけどね 時代遅れを気にしないなら VC+MFC の情報は多いw 他にもいろいろある
110 名前:デフォルトの名無しさん [2016/12/24(土) 19:03:48.07 ID:Xnn//JuE.net] FILE *fp;をグローバル変数にしてたら落ちまくって、ローカル変数にしたら落ちなくなった現象は何でですかね? グローバルかローカルか関係ない気がするんですけど。 Windows7、Visual Studio 2015
111 名前:デフォルトの名無しさん [2016/12/24(土) 19:04:08.51 ID:Xnn//JuE.net] これで4時間近くハマった。
112 名前:フォルトの名無しさん mailto:sage [2016/12/24(土) 19:11:41.00 ID:0UyY/BKM.net] グローバルな FILE *fp の近く(若いアドレス)に置かれた グローバルな配列の範囲オーバーじゃないかしら。
113 名前:デフォルトの名無しさん mailto:sage [2016/12/24(土) 20:06:31.12 ID:TihFoldF.net] >>109 ファイルの開くのから閉じるのまでが一関数に収まってて、他から呼び出してないなら関係ないと思うけど 閉じ忘れとか?
114 名前:デフォルトの名無しさん mailto:sage [2016/12/24(土) 20:27:17.35 ID:DNE92dFu.net] fileno とか ferror は確認した?
115 名前:デフォルトの名無しさん mailto:sage [2016/12/24(土) 20:34:23.48 ID:y7L7nGQ6.net] fp をグローバルにおいたソースで 別のローカル変数をグローバルに置いたら その変数で副作用起こすんじゃね? (>>111 と同じく範囲突破しての書き込みを疑ってる)
116 名前:デフォルトの名無しさん mailto:sage [2016/12/24(土) 21:00:46.23 ID:yr6q9nVG.net] fpがどんな値になろうと最悪でもエラー検出するだけだから 落ちるのはまともにエラー判定してないせい
117 名前:109 mailto:sage [2016/12/24(土) 21:14:49.73 ID:Xnn//JuE.net] >>111-115 ありがとうございます。 >>111 さんのおっしゃる通り、メモリの問題でした。 fopenからfreadの間で、 読み込みバッファをmallocで確保してmemsetでゼロクリアしている部分があり、 このクリアするサイズが確保したサイズを上回っていました。 なので、fopen直後のエラーチェックでも問題が起きてないのに落ちていたようです。 //私も一度はこれを疑って確認したんですけどね。 //レスもらってから改めて確認したらこのような状況になってました。 根本的な解決ができて良かったです。
118 名前:デフォルトの名無しさん mailto:sage [2016/12/25(日) 01:18:26.20 ID:vsDUBYtf.net] 気付くだけ立派だわなぁ
119 名前:デフォルトの名無しさん mailto:sage [2016/12/25(日) 07:00:04.87 ID:iLmpV78q.net] mallocで確保した領域の溢れがグローバルな変数を壊すってのは ちょいと解せない気もする。 DOSの頃なら互いに影響しあうことも普通だったろうけど、 最近のOSだと別に管理してそう。 内部の詳しいことは知らないけど。
120 名前:デフォルトの名無しさん mailto:sage [2016/12/25(日) 09:26:05.12 ID:SibbJTGE.net] >>118 お前はもう少し勉強してから書き込むべき
121 名前:デフォルトの名無しさん mailto:sage [2016/12/25(日) 09:43:40.82 ID:CGvp0k11.net] エミュとかアドレスを固定してるけどどうやってんの?
122 名前:デフォルトの名無しさん [2016/12/25(日) 16:56:04.10 ID:xlX3oF2t.net] 質問です エラーになってしまいます 教えて下さい C++11です int n=0; string hage="s"+n+".png";
123 名前:デフォルトの名無しさん mailto:sage [2016/12/25(日) 17:03:23.30 ID:YVZO5C9V.net] "s"と".png"はconst char*型なので+は無理
124 名前:デフォルトの名無しさん [2016/12/25(日) 17:09:24.52 ID:xlX3oF2t.net] そうなんですか… ありがとうございました
125 名前:デフォルトの名無しさん mailto:sage [2016/12/25(日) 22:48:16.54 ID:oxH1mE2q.net] >>120 最初に、すべてのアドレス分のメモリを確保すれば? その先頭アドレスを、エミュレータの先頭アドレス・0 にすればいい
126 名前:デフォルトの名無しさん mailto:sage [2016/12/26(月) 01:40:19.72 ID:Us2MOZON.net] >>121 標準で用意されているのはstringとstring/char/char*間のみ(operator+) なので+するのをintでなくstringにすればいける C++11ならto_stringがあるから次ので問題ない string hage = "s" + to_string(n) + ".png"; 細かい書式設定とかしたいならsstreamかsnprintfあたりで
127 名前:デフォルトの名無しさん mailto:sage [2016/12/26(月) 08:42:54.29 ID:w1n6Bp69.net] >>124 それじゃ起動毎に変わるんじゃね?
128 名前:デフォルトの名無しさん mailto:sage [2016/12/26(月) 09:21:17.58 ID:5lDUjv3x.net] 起動毎にホスト上でのメモリ配置が変わっても エミュレータの駆動機構で >>124 のように エミュレーションする対象の仮想コードのアドレッシング → ホスト環境の実メモリ の変換テーブル経由なら問題は発生しないべ
129 名前:デフォルトの名無しさん mailto:sage [2016/12/26(月) 12:36:41.62 ID:bq11e3Cp.net] >>125 ありがとうございます! あとでやってみます
130 名前:デフォルトの名無しさん mailto:sage [2016/12/26(月) 16:52:23.77 ID:vHVIx8+p.net] ASLRのことなら、無効にする事が出来る
131 名前:デフォルトの名無しさん [2016/12/27(火) 00:09:30.60 ID:hMHSnQwo.net] >>127 を分かりやすく言うと配列みたいなもんだ。 int foo[5]; と宣言すれば、起動毎に確保されるアドレスは違うが、 例えば3番目のアドレスには必ず&foo[3]でアクセスできる。 これと同じ。
132 名前:デフォルトの名無しさん [2016/12/28(水) 09:29:29.21 ID:
] [ここ壊れてます]
133 名前:jHXCJg+4.net mailto: OggVorbisの使い方を教えてください。 動的リンクライブラリとしてリンクして、 WAVEデータをリアルタイムでOggVorbis形式(CBR)に変換したいです。 VS2015です。 一応ググりましたがどこから手を付けてよいか分かりませんでした。 [] [ここ壊れてます]
134 名前:デフォルトの名無しさん mailto:sage [2016/12/28(水) 11:23:40.53 ID:BmYU7N0Q.net] ttps://xiph.org/doc/ ここから必要な文書を探して読んで理解するのが本筋
135 名前:デフォルトの名無しさん mailto:sage [2016/12/31(土) 16:11:48.53 ID:8v6iajLL.net] ある本の解答例ですが実行すると先頭文字が消えます。これではダメなんでしょうか? void str_toupper(char *str) { while (*str) *str++ = toupper(*str); }
136 名前:デフォルトの名無しさん mailto:sage [2016/12/31(土) 16:20:34.34 ID:ADMXNhyN.net] *str++ = toupper(*str); これ鼻から悪魔コード インクリメント演算子で操作された変数が副作用完了点までに複数回参照するのは動作未定義 *str = toupper(*str); str++; と分離しないとまずい
137 名前:デフォルトの名無しさん mailto:sage [2016/12/31(土) 17:17:13.63 ID:Z7Smo6OK.net] *str++ = toupper(*str); でダメなら *str = toupper(*str++); で動くんじゃない? ……って真に受けるなよ。別の悪魔が出てくるだけだからな。 たとえ期待通りの動作になったとしても、たまたまだからな。
138 名前:デフォルトの名無しさん mailto:sage [2016/12/31(土) 17:24:22.85 ID:xodGK7fu.net] ポインタを直接インクリメントするのはどうにも性に合わん
139 名前:デフォルトの名無しさん mailto:sage [2016/12/31(土) 17:38:17.18 ID:nERH8viD.net] 通る道なのでやさしくね
140 名前:デフォルトの名無しさん mailto:sage [2016/12/31(土) 18:30:26.25 ID:K1FrsN4c.net] >>133 その本がダメなコードの例としてそれを挙げてるならいいけど、正解としてそれを書いてるのなら、著者の能力とか校正の正確さとか不安になる。
141 名前:133 mailto:sage [2016/12/31(土) 19:18:21.55 ID:8v6iajLL.net] >>138 正解例です >>135 下でダメだったので正解を見たら上になってて、そうかとそうかと思ったのですが… >>134 ありがとうございます 初心者なので更に勉強してみます
142 名前:デフォルトの名無しさん mailto:sage [2016/12/31(土) 20:02:29.25 ID:RP5GqFRc.net] 本の題名晒してもいいと思う...
143 名前:デフォルトの名無しさん mailto:sage [2016/12/31(土) 20:11:53.63 ID:ADMXNhyN.net] 古かったとして、古い規格だとしても処理系依存 (こっちのコンパイラはこうなるけど、あっちのコンパイラでは別の結果になるよ) なので、 正解コードとするのはよろしくない
144 名前:デフォルトの名無しさん mailto:sage [2016/12/31(土) 20:17:55.00 ID:q3l2oU5w.net] なぜダメなのか何がダメなのか理解しとかないと
145 名前:デフォルトの名無しさん mailto:sage [2017/01/01(日) 01:32:25.83 ID:LgRst/uw.net] >>139 まじすか ちょっとひどいですね。 著者が知りたいです。
146 名前:デフォルトの名無しさん mailto:sage [2017/01/01(日) 12:42:18.55 ID:/LG195GI.net] str_toupperでググると正しいコードはあるけど >>133 は見つからないなあ。結局なんて本?
147 名前:133 mailto:sage [2017/01/01(日) 14:53:59.97 ID:OFpbxODd.net] 解きながら学ぶC言語(2006年第5刷)ですが、新版見てみたら >>134 のように修正されてました
148 名前:デフォルトの名無しさん mailto:sage [2017/01/01(日) 17:19:11.24 ID:LgRst/uw.net] 望洋先生すか あちゃー
149 名前:デフォルトの名無しさん mailto:sage [2017/01/04(水) 01:18:25.55 ID:frbRBuKj.net] 副作用完了点が2つ以上あると鼻から悪魔
150 名前:デフォルトの名無しさん mailto:sage [2017/01/04(水) 01:40:21.76 ID:8dyTsCQL.net] んなこたーない
151 名前:1/2 [2017/01/04(水) 02:39:58.96 ID:9INFfbdp.net] このサイトを参考にコードを書いているのですが、レスポンス中に無反応になります。 助けてください。 qiita.com/edo_m18/items/41770cba5c166f276a83 このコードとの差異は以下の通りです。 ---------------------------------------------------------- read_size = SSL_read(ssl, buf, buf_size);の前に memset( buf, 0, buf_size
152 名前: );を挿入 write(1, buf, read_size);を printf("%s",buf);に変更 close(sock);の後に printf("OK.\n");を挿入 拡張子をcppとし、C++としてコンパイル。 ---------------------------------------------------------- この変更したコードのprintf("%s",buf);で不具合が生じます。 不具合パターンは以下の2通りです。 ・ 恐らく受信したHTMLの最終部分と思われる</body></html>を出力後、2行ほどの空行、そして0という数字が出力された後、無反応になる。 ・ レスポンスヘッダやHTMLコードの途中で無反応になる。 無反応時にはEnterキーもCtrl+Cも効きません。 しばらくすると、効くようになります。 但し、printf("OK.\n");によるOKが出力されませんので、異常終了している可能性が高いです。 [] [ここ壊れてます]
153 名前:2/2 [2017/01/04(水) 02:40:11.64 ID:9INFfbdp.net] 環境は以下の通りです。 OS: CentOS 6.4 コンパイラ: GCC 4.4.7 接続先: https://www.youtube.com/ その他、無反応中にnetstat -tanpコマンドで確認すると、 このアプリケーションはESTABLISHEDとなっています。 また、自宅サーバーのHTTPSのサイトへアクセスした場合、HTMLの最後のほうの</body>が出力された後に数秒の間があり、 その後、</html>が出力されて正常に終了します。 この数秒の間も気になります。 よろしくお願いします。
154 名前:デフォルトの名無しさん mailto:sage [2017/01/04(水) 03:14:24.95 ID:sO2gccKh.net] >>149 > printf("%s",buf);に変更 %sは文字列のアドレスを引数として受けてそれを出力する C言語で文字列とはNUL終端されたバイト列だが SSL_readは文字列ではなく只のバイト列を扱うからNUL終端なんてしていない そのために受信した文字列以上のおそらくbufの領域を越えて偶然にゼロに 出くわすまでprintfが出力しているんだろう 付け加えると、サーバーから送られてくるバイト列中にゼロが含まれていると 文字列として扱おうとしたprintfはそこまでで終わりと見做してしまう 例えば2ちゃんはたまにそんなHTMLを返してくることがあっていい加減な作りの 自作アプリなんかが途中までしか表示しないとかいう不具合を出す
155 名前:149 mailto:sage [2017/01/04(水) 03:47:33.12 ID:9INFfbdp.net] >>151 ありがとうございます。 初歩的なミスでお恥ずかしい。 バイナリデータとしてファイルに出力したところ正常に動作しました。(ファイルの内容にも問題ありませんでした) 恐らくマルチバイト文字の途中か何かで切れていたのでしょう。
156 名前:デフォルトの名無しさん mailto:sage [2017/01/04(水) 08:50:07.15 ID:hKIlPOcN.net] マルチバイトなんか関係ない > write(1, buf, read_size);を > printf("%s",buf);に変更 すんなって事だよアホウ
157 名前:デフォルトの名無しさん mailto:sage [2017/01/04(水) 09:47:31.23 ID:87+T0pXS.net] もしくは1.1sだな
158 名前:デフォルトの名無しさん mailto:sage [2017/01/04(水) 09:53:13.47 ID:dvUWMEVx.net] printf("%.*s", read_size, buf); なら少しだけ それでも read_size に至る途中に \0 あったら駄目だし 標準出力に送りたいんなら fwrite(buf, read_size, 1, stdout); こうなるかな
159 名前:デフォルトの名無しさん mailto:sage [2017/01/04(水) 09:54:39.63 ID:dvUWMEVx.net] 元質問みてなかった わーすーれーてー
160 名前:デフォルトの名無しさん mailto:sage [2017/01/04(水) 12:32:23.72 ID:xue+qv3N.net] 「んなこたーない」 っていつも書き込みする人がいるけど もっと具体的な回答してほしい。 「んなこたーない」って答えるくらいだから何かしらの反論や回答持ってるんだろうけど もっと具体的に言ってくれなきゃ分からない。
161 名前:デフォルトの名無しさん mailto:sage [2017/01/04(水) 12:37:37.48 ID:FLMu+DIB.net] そういうのはとりあえず否定したいだけだからスルーでいいよ 回答なんか持って無いと思うし
162 名前:デフォルトの名無しさん mailto:sage [2017/01/04(水) 13:56:51.11 ID:x5I82FL9.net] 0x00がないと、どこまでもぉ って事だけで。
163 名前:デフォルトの名無しさん mailto:sage [2017/01/04(水) 15:05:14.50 ID:CkccjIZ7.net] 俺はとりあえずこんなのを提案する(
164 名前:) do { memset( buf, 0, buf_size ); read_size = SSL_read(ssl, buf, buf_size-1); printf("%s",buf); } while(read_size > 0); do { memset( buf, 0, buf_size ); read_size = SSL_read(ssl, buf, buf_size); for(int i=0; i < read_size; ++i){ printf("%c",buf[i]); } } while(read_size > 0); [] [ここ壊れてます]
165 名前:148 mailto:sage [2017/01/04(水) 15:11:07.58 ID:8dyTsCQL.net] >>157 さすがにこれは説明要らんだろうと思うよ・・・。 「副作用完了点が2つ以上」って、 str++; str++; こんなのでアウトってことだからね。
166 名前:デフォルトの名無しさん mailto:sage [2017/01/04(水) 17:51:37.32 ID:ku1IYB1y.net] んなこたーない
167 名前:デフォルトの名無しさん mailto:sage [2017/01/04(水) 18:08:39.09 ID:issqqmbF.net] do while()って嫌いだから使わん
168 名前:デフォルトの名無しさん mailto:sage [2017/01/04(水) 18:10:34.06 ID:dvUWMEVx.net] マクロのおまじないでも? #define FOO() do { あーだこーだ } while(0)
169 名前:デフォルトの名無しさん [2017/01/04(水) 18:15:56.08 ID:pxTed+R/.net] >>147 言いたいことはわかる気がするが、その文面は明らかに間違っているでしょ。 エスパーすると、 「副作用完了点と副作用完了点の間で、同一の変数を複数回変更する」 と、鼻から悪魔、かな?
170 名前:デフォルトの名無しさん [2017/01/04(水) 18:17:44.69 ID:pxTed+R/.net] まだ甘いか。 「ある副作用完了点と、次の副作用完了点の間で、同一の変数を複数回変更する」 かな?
171 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/01/04(水) 18:21:17.85 ID:83LRywdJ.net] gotoで地獄へ行くのをdo/break/whileに書き換えることができる。 ... goto hell; ... goto hell; ... hell: ... return 0; ↓↓↓ do { ... break; ... break; ... } while (0); ... return 0;
172 名前:デフォルトの名無しさん mailto:sage [2017/01/04(水) 19:49:00.69 ID:wOLmnoYC.net] >>157 人としての最低限の知能を持ち合わせて調べ直せば本人なら気付くレベルの時しか言っていないのでいつも本人からの訂正レスを待っているのだが、 何故か絶対に自分の発言を撤回したがらないようだ
173 名前:デフォルトの名無しさん mailto:sage [2017/01/04(水) 21:37:54.73 ID:lUhJzh+Z.net] 言われた方は言われた方で同じこと思ってるんだろ。だから具体的に指摘しなきゃ話が進まない。
174 名前:デフォルトの名無しさん mailto:sage [2017/01/04(水) 22:12:54.91 ID:zg5YylVI.net] ピンポイントで間違い指摘されてんだから自分こそ根拠を述べろよ。 「副作用完了点が2つ以上」なんてどこにもねーんだから。 わかないよ〜ホレホレって荒らしたいだけ?
175 名前:デフォルトの名無しさん mailto:sage [2017/01/04(水) 22:45:56.82 ID:by3GIgBn.net] >>157 さすがに >>147-148 だと >>147 の方に説明責任があると思う
176 名前:デフォルトの名無しさん mailto:sage [2017/01/04(水) 23:27:27.83 ID:6PKdRVzk.net] MISRA-C研究会が書いている、MISRA-C 2004(C90) の本をみっちり、勉強しろ! 研究会のメンバーでさえ、規格に詳しい人がいないのだから、 日本人では、規格に詳しい人はいない トヨタでも、MISRA-Cの遵守率が5%しかない。 こういう素人が作る、医療機関・産業機械は怖くて使えない。 アプリのバグで、すぐに人が死ぬ コンパイラを作る方も、あやふやな解釈をしているから、 紛らわしい書き方を避けて、かなり安全に、コーディングしないと危険 極端に言えば、1文1文、分離して書くこと。 バグが多く出る箇所は主に、マクロ・複合文・型違いの3つ
177 名前:デフォルトの名無しさん mailto:sage [2017/01/04(水) 23:45:39.23 ID:xue+qv3N.net] > 勘違いしてないか? とか > 日本語おかしくないか? とか言ってあげれば>>147 も自分の間違いに気づけたんじゃないかなって思う。
178 名前:デフォルトの名無しさん mailto:sage [2017/01/04(水) 23:48:11.13 ID:NgyPecWp.net] お前らちょっと温泉でも行ってこい
179 名前:デフォルトの名無しさん mailto:sage [2017/01/04(水) 23:48:33.21 ID:8dyTsCQL.net] >>173 ちっとも具体的じゃないが、それでいいの?正直なにが違うのかわからん。 (日本語としてはまったく問題ないしな。)
180 名前:デフォルトの名無しさん mailto:sage [2017/01/05(木) 00:16:26.21 ID:kU82p3Tw.net] > >>147 > 副作用完了点が二つ以上存在すること自体は問題ないだろ。 > 複数の副作用完了点で同じ変数を変更、参照するんのが問題なんだよ。 > 安易な気持ちで書き込みすんな。一生ROMってろ。 ネラーならこれくらい言えないとな。 >>175 「んなこたーない」だけだと単に否定したいだけの書き込みみたいで、荒らしなのか普通の指摘なのか曖昧。 >>158 みたいに受け取る人もいるし。 >>173 は具体的じゃないけどまだましなほうでしょ。
181 名前:デフォルトの名無しさん mailto:sage [2017/01/05(木) 07:15:07.48 ID:Tn1lGUp3.net] 副作用完了点が2つ以上あると鼻から悪魔 ↓ × んなこたーない ○ 勘違いしてないか? 理由:「んなこたーない」だけだと単に否定したいだけの書き込みみたいで、荒らしなのか普通の指摘なのか曖昧
182 名前:デフォルトの名無しさん mailto:sage [2017/01/05(木) 07:20:28.53 ID:IruuUmgl.net] 一応技術板なので「んなこたーない」って言われたら鼻から悪魔の例を出せばすむ話 まあ例を考えてる時に自分の間違いに気づくと思うが...
183 名前:デフォルトの名無しさん mailto:sage [2017/01/05(木) 07:35:58.65 ID:Tn1lGUp3.net] 嵐かどうかは別として間違いの指摘かどうか曖昧でわからない奴はヤバい
184 名前:デフォルトの名無しさん mailto:sage [2017/01/05(木) 09:10:38.60 ID:yWb7mDiI.net] if (*str++ && *str++ && *str++) && と if の条件式の終わりは副作用完了点だけど問題を起こすコードではない ※ 役にたつコードかはしらんw
185 名前:デフォルトの名無しさん mailto:sage [2017/01/05(木) 11:34:50.96 ID:nSwRuxqn.net] 大学の授業で、client.cというファイルとserver.cのファイルを渡されて このプログラムを解析して、何でも良いから通信するプログラムを作れと言われたんですが 何をやればいいのかさっぱりです。 サーバとクライアントでファイルが2つに分かれてるってことは プログラミングのテストをするにも2台PCを持ってないとできないってことでしょうか 何でもいいのでアドバイスください。。。
186 名前:デフォルトの名無しさん mailto:sage [2017/01/05(木) 11:37:47.99 ID:Xc98514b.net] >>181 PC 1台でも出来ます
187 名前:デフォルトの名無しさん mailto:sage [2017/01/05(木) 11:44:42.65 ID:yWb7mDiI.net] server のプログラムを実行しておいて 接続先を 127.0.0.1 (または localhost) にした client のプログラムを実行すれば桶 後は実行OSの事情次第(FWの警告をスルーする等)
188 名前:デフォルトの名無しさん mailto:sage [2017/01/05(木) 11:51:25.19 ID:33EuaIzL.net] >>181 client.exe server.exe生成 →server.exeを起動し通信待機 →client.exeを起動し通信開始 でいいよ
189 名前:デフォルトの名無しさん [2017/01/05(木) 11:55:16.72 ID:nSwRuxqn.net] >>182-184 親切にありがとうございます。 Linux環境でプログラムしているのですが server.cをコンパイル&実行すると待機中のせいか何なのかわからないのですが コンソール上で他のコマンドが打てなくなってしまうので2台PCが必要なのかと迷っていたのですが、1台でもできるのですね。 どうやったら待機中でもclientのコンパイル済みファイルを実行することができるのでしょうか。。
190 名前:デフォルトの名無しさん mailto:sage [2017/01/05(木) 12:00:04.09 ID:CkAWate/.net] んなこたーない って前々から他のC++スレでも使われていたけど、 自分からは何も根拠を示さず、ただ周りからの反論を煽りたいだけのレス みたいな受け取られ方が少なからずされていたように感じるんだけど。 コミュニケーションって難しいな。
191 名前:デフォルトの名無しさん mailto:sage [2017/01/05(木) 12:06:51.34 ID:yWb7mDiI.net] >>185 bash だったら 末尾に & つけて呼び出すとバックグランドで実行するみたいよー # server [enter] : 待機中でだんまりさんw # server & [enter] : すぐ次の入力待ちになる server は裏で実行中 #
192 名前:デフォルトの名無しさん mailto:sage [2017/01/05(木) 12:25:39.85 ID:nSwRuxqn.net] >>187 できました! ありがとうございます助かりました
193 名前:デフォルトの名無しさん mailto:sage [2017/01/05(木) 13:10:33.43 ID:Goea0txf.net] nohup をつけるともっと幸せになれるよ nohup server &
194 名前:デフォルトの名無しさん [2017/01/05(木) 13:26:13.09 ID:NumGywN/.net] 馬鹿がnohupなんか付けたらいつまでもプロセス残るだろ 不完全なサーバーアプリケーションのプロセスをいつまでも残すということは セキュリティ的に問題外
195 名前:デフォルトの名無しさん [2017/01/05(木) 14:20:26.50 ID:wksprrkU.net] 0xFFFFFFの変数がif(n > 0)で真になるんだがなんだコレ? クソムカツクな死ねよ
196 名前:デフォルトの名無しさん mailto:sage [2017/01/05(木) 14:25:53.51 ID:yWb7mDiI.net] 64bit (2の補数の)符号付で 00FF FFFF は正なんだけど 48bit の符号付整数での比較を望んでいるんだろうか?
197 名前:デフォルトの名無しさん mailto:sage [2017/01/05(木) 15:39:10.85 ID:60LIuvs1.net] 48bitでも32bitでも正ですが
198 名前:デフォルトの名無しさん mailto:sage [2017/01/05(木) 17:24:14.22 ID:5KDyH/yc.net] >>191 何だこれと言われても言語仕様としか言いようがない auto n = 0xFFFFFF; if (n>0)//必ず真
199 名前:デフォルトの名無しさん mailto:sage [2017/01/05(木) 18:52:01.04 ID:sOp8JEWl.net] 逆になぜ偽になると思ったのかが知りたいな。
200 名前:デフォルトの名無しさん mailto:sage [2017/01/05(木) 18:58:22.71 ID:25Qby3+x.net] auto n = 0xFFFFFF; *reinterpret_cast<int*>(&n) > 0
201 名前:デフォルトの名無しさん mailto:sage [2017/01/05(木) 19:26:42.79 ID:ivHnG5Le.net] int が 24bit ってダメなんだっけ?
202 名前:デフォルトの名無しさん mailto:sage [2017/01/05(木) 19:41:33.07 ID:/zQeSTVL.net] あー あほしたー bit数を数え間違ってるし
203 名前:デフォルトの名無しさん mailto:sage [2017/01/05(木) 21:38:57.59 ID:AK28m3f5.net] >>196 のオツムのレベルは>>191 と同等
204 名前:デフォルトの名無しさん mailto:sage [2017/01/05(木) 23:28:47.82 ID:sjDvcQUe.net] >>185 別の端末・別の仮想デスクトップなどを、起動すればいい
205 名前:デフォルトの名無しさん [2017/01/08(日) 01:15:08.36 ID:+QuxnNhY.net] ■ 質問概要 ファイルに書き込んでも反映されない。 ■ 環境 CentOS 6.4 GCC 4.4.7 ■ 質問詳細 fopenに"r+"を指定して開いたファイルに、fputsでテキストデータを書き込んでも反映されません。 fcloseしていないことが、恐らく原因だと思います。 このアプリケーションは起動時にfopenでファイルを開いて常駐し、 アプリケーション終了時にfcloseするように開発しており、fcloseすると反映されます。 常駐型のアプリケーションで逐次ログ出力するため、 書き込むたびにファイルを開いたり閉じたりしないようにしています。 fcloseしなくても読み取りだけはできるようにしたいのです。 Apacheの挙動を見ると、ログファイルがこうした動作になっているようです。 (Apacheのソースは読んでいません、ログファイルを操作しようとした際の挙動などからによる推測です) どうすればいいでしょうか。 調べたところ、fflushで希望の動作ができそうですが、 使い慣れてないものを使うのは副作用が怖く、 また、説明に「強制的」等の文言があるため、この文言があるだけでも非常に不安です。 こうした目的でfflushを利用しても問題ないのでしょうか。 そもそもfflushでいいのでしょうか。 https://linuxjm.osdn.jp/html/LDP_man-pages/man3/fflush.3.html
206 名前:デフォルトの名無しさん mailto:sage [2017/01/08(日) 01:21:15.59 ID:Zdr2NPEX.net] 大丈夫だから使え
207 名前:デフォルトの名無しさん mailto:sage [2017/01/08(日) 01:24:31.77 ID:T3Q1+h8z.net] flushは時間がかかるから頻度が高い場合は気をつけて。
208 名前:201 mailto:sage [2017/01/08(日) 01:54:37.47 ID:+QuxnNhY.net] >>202-203 ありがとうございます。 時間がかかるんですね。 では、頻度が高い場合はfputsの度ではなく、 一定時間おきにfflushするように実装したいと思います。
209 名前:デフォルトの名無しさん [2017/01/08(日) 03:35:33.42 ID:eh6WgorM.net] A = (framecount / 10) % 4 すみません、上記の式の意味を教えてください。 毎度、Aに入る値がしりたいです。
210 名前:デフォルトの名無しさん mailto:sage [2017/01/08(日) 03:39:14.61 ID:Nqw0FnK6.net] (framecount を 10 で割って) それの 4で割った余り 0〜3 の値になる framecount 0〜 9 → 0 10〜19 → 1 20〜29 → 2 30〜39 → 3 40〜49 → 0 50〜59 → 1 :
211 名前:デフォルトの名無しさん [2017/01/08(日) 03:43:39.84 ID:eh6WgorM.net] >>206 こんな深夜に即レス、感謝 ありがとうございます!
212 名前:デフォルトの名無しさん mailto:sage [2017/01/08(日) 04:24:28.51 ID:c5pY166L.net] >>201-204 普通は、ファイルを閉じる際、自動的にflushされる それに何もしなくても、OSのデフォルト設定で、 dirty Page Cache を、5秒ごとにflushして、メモリとディスクを同じ状態に保つ USB・SSDの書き込み回数を減らしたい人は、書き込み間隔を15〜30秒に設定している人もいる。 commit=15 Linux I/O のお話 write 編 d.hatena.ne.jp/naoya/20070523/1179938637
213 名前:デフォルトの名無しさん mailto:sage [2017/01/08(日) 11:20:03.87 ID:OpAcES4h.net] char buffer[256]; scanf(%s,buffer); printf(
214 名前:デフォルトの名無しさん mailto:sage [2017/01/08(日) 11:28:02.93 ID:OpAcES4h.net] すみません、誤送信してしまいました 質問させてください。 char buffer[256]; scanf(%s,buffer); printf("finish---_n"); という記述で、文字入力をした後、何回リターンキーを押しても finishが表示されない、つまりscanfが終了しないような状態になっているのですが 何か特別な条件でscanfが終了しないことってあるものなのでしょうか? ちなみに、コードのscanfの行だけコメントアウトすると普通にfinishが表示される状態です。 あと、新規で.cファイルを作って短いコードにしてコンパイルしても問題なく動いてくれています。
215 名前:デフォルトの名無しさん mailto:sage [2017/01/08(日) 11:43:58.41 ID:nyR751xv.net] >>210 問題が再現できる最少コード書いてみて コンパイル通るコード
216 名前:デフォルトの名無しさん mailto:sage [2017/01/08(日) 11:52:30.04 ID:OpAcES4h.net] >>211 先日も少し教えてもらったのでまた聞きに来てるのが恥ずかしいのあ ですが、サーバとクライアントでの通信のプログラムです。 server.c codepad.org/epmTQJ0 client.c codepad.org/uhR4zEL3 gcc -o s server.c gcc -o c client.c ./s& ./c で実行しています。 サーバ側のscanfで止まってしまうみたいなのですが サーバ側のscanfをコメントアウトすると通るみたいです。
217 名前:デフォルトの名無しさん mailto:sage [2017/01/08(日) 12:07:20.20 ID:nyR751xv.net] server側がnot foundだわ リンク確認してみて
218 名前:デフォルトの名無しさん mailto:sage [2017/01/08(日) 12:15:37.07 ID:9g4d0om9.net] >>213 アップし直しました codepad.org/ye5GDqp8 確認不足ですみません;;
219 名前:デフォルトの名無しさん mailto:sage [2017/01/08(日) 12:35:39.21 ID:nyR751xv.net] Wait for Connection...Connected. s1--------- C->S: %s Server: 実行結果はここで止まって s2--------- まで進まないって事?
220 名前:デフォルトの名無しさん mailto:sage [2017/01/08(日) 12:38:46.78 ID:Cjw+tP2S.net] >>215 そうですね Serverの後にscanfがあるので入力してみると Server: uuu aaaaa iiii uuu とかになって、Enterキーを打っても次に進んでくれません
221 名前:デフォルトの名無しさん mailto:sage [2017/01/08(日) 13:15:24.14 ID:nyR751xv.net] 送受信で変数を別々にしてみて scanf -> sendはbuffer1 recv -> printfはbuffer2 みたいに 38, 39 40行目にブレークポイント置いてやってみて
222 名前:デフォルトの名無しさん mailto:sage [2017/01/08(日) 13:46:50.50 ID:uGSXn6++.net] サーバをフォアグラウンドにしてから入力すればいいだけな気がする。 いったんCtrl-zでクライアントを停止して「bg」でバックグラウンドで再開、 「jobs」でサーバのジョブIDを調べて「fg %[ジョブID]」してから入力すれば、 反応するんじゃないかな。
223 名前:デフォルトの名無しさん mailto:sage [2017/01/08(日) 15:47:42.95 ID:/TmTqYIS.net] >>217 ありがとうございます やってみましたがどうもうまくいかなさそうです >>218 ありがとうございます。 いちおうやってみたのですが、ぼくがりしょしんしゃすぎてこうどなれすすぎてりかいできません(^q^) バックグラウンドとフォアグラウンドの使い分けが良く分からないです。 手順を整理すると、 1. サーバをバックグラウンドで開始 2.
224 名前: クライアントをフォアグラウンドで開始 3. クライアントを停止 4. クライントをバックグラウンドで再開 5. サーバをフォアグラウンドで開始 6. クライントをフォアグラウンドで開始 ということでしょうか???頭がパーン!! [] [ここ壊れてます]
225 名前:デフォルトの名無しさん mailto:sage [2017/01/08(日) 16:06:06.04 ID:nyR751xv.net] >>219 ブレークポイントが39で止まる →続行して入力しても40のブレークポイントに来ない こんな状況なの?
226 名前:デフォルトの名無しさん mailto:sage [2017/01/08(日) 16:09:35.63 ID:uGSXn6++.net] 難しいようなら、&で起動するのはやめて、ターミナルを二つ起動して 片方でサーバを、もう片方でクライアントを実行するほうが楽だと思う。
227 名前:デフォルトの名無しさん mailto:sage [2017/01/08(日) 16:24:16.26 ID:7aUjJ3jB.net] 同意
228 名前:デフォルトの名無しさん mailto:sage [2017/01/08(日) 17:02:49.06 ID:C9GVPqMv.net] >>208 それレイヤーが違う話だよ
229 名前:デフォルトの名無しさん mailto:sage [2017/01/08(日) 17:48:30.32 ID:bwuU6ymI.net] 質問者の提示したURLに書かれている注意事項すら読まない奴を相手にレスするとは
230 名前:デフォルトの名無しさん mailto:sage [2017/01/08(日) 19:21:35.50 ID:d7tAym4Y.net] >>220 そんな感じでした >>221-222 ターミナル2つ起動したら簡単にできました。。 ターミナルって2つ開いて操作したりするものだったんですね Linux初心者すぎて分かってませんでした 助かりましたありがとうございます
231 名前:デフォルトの名無しさん mailto:sage [2017/01/08(日) 22:54:37.49 ID:c5pY166L.net] 端末も複数、起動できる 仮想デスクトップを知っているか? デスクトップも、複数起動できる 普通、C/S通信プログラムでは、2つ端末を起動する >>209-210 2chのバグだろう 書き込み確認画面が出る際、" を使うと、そこで文字列の終了とみなされる。 " の代わりに、\" とエスケープすれば、どうだろう? それか、書き込み確認画面が出たら、1度キャンセルすれば、確認画面は出ないようになった
232 名前:デフォルトの名無しさん mailto:sage [2017/01/11(水) 13:06:08.85 ID:X1FDgEas.net] >>208 といい>>226 といい、わざと嘘を書いてるのか?
233 名前:デフォルトの名無しさん [2017/01/12(木) 04:36:13.74 ID:8CizHZGj.net] MSVCはいつまで__cplusplusの定義199711Lのままなんだ
234 名前:デフォルトの名無しさん mailto:sage [2017/01/12(木) 07:09:10.44 ID:edOk7o4H.net] 変えると暴動が起きるこら変えない とライブラリ開発者のSTL氏が言っていた
235 名前:デフォルトの名無しさん mailto:sage [2017/01/12(木) 12:09:34.61 ID:xegpw56Z.net] 1だと思ってた
236 名前:デフォルトの名無しさん mailto:sage [2017/01/15(日) 00:31:14.26 ID:7/DzGkQz.net] 別ファイルで作成した関数を使用するときは、そのヘッダーファイルの インクルードだけでなくプロトタイプ宣言も必要ですか? インクルードだけでもコンパイルは通るし実行も出来るのですが、 そういう警告が出てくるので気になりました
237 名前:デフォルトの名無しさん mailto:sage [2017/01/15(日) 00:34:44.37 ID:H7ag5TAh.net] 警告文をコピペしてくれると話が早いような
238 名前:デフォルトの名無しさん mailto:sage [2017/01/15(日) 00:51:14.06 ID:e3PYrJk6.net] そのヘッダーファイルの中でプロトタイプ宣言はされているんじゃないのか 警告の原因は別のことだろ
239 名前:デフォルトの名無しさん mailto:sage [2017/01/15(日) 01:02:35.94 ID:7/DzGkQz.net] インクルードするファイルを間違えてたみたいです お騒がせしました
240 名前:デフォルトの名無しさん mailto:sage [2017/01/19(木) 22:46:56.05 ID:knltoro2.net] 新しくクラスとそれに関連した処理などを実装するとき ヘッダー側でクラスの定義、ソースファイル側にクラス内のメンバ関数の実装部などを書きますよね その時メンバ関数はどんな場合でもヘッダー側に書かずにソース側に書くものですか? たとえば //ヘッダー側です class A{ private: int num; public: int ReturnNum(void){ return num; } }; 処理はたった一行ですけどこの場合もint ReturnNum()の実装部はソースファイル側にint A::ReturnNum()のように移すべきですか? ネット上のプログラムをいくつか見てみたらこのようにメンバ変数をただ返すだけの処理ならヘッダー側に書いてあるものも少なくなかったのでどっちが好ましいんだろうと気になりました
241 名前:デフォルトの名無しさん mailto:sage [2017/01/19(木) 23:08:04.39 ID:ipEwSksA.net] プログラムは普通すべて「ソースファイル」に書くものです 「ヘッダー」に書くのはコンパイラー開発者だけです
242 名前:デフォルトの名無しさん mailto:sage [2017/01/19(木) 23:11:24.96 ID:ydMYZ/gE.net] クラスもヘッダに書きますけどぉ
243 名前:デフォルトの名無しさん mailto:sage [2017/01/19(木) 23:55:32.15 ID:A0Yl7Ujc.net] > その時メンバ関数はどんな場合でもヘッダー側に書かずにソース側に書くものですか? 別にどんな場合でもソース側に書くというわけではない ヘッダに書くのもソースに書くのも一長一短はあり絶対的にどっちがいいというものではない 君が違いを理解し何を重視するかを意識すれば 君にとってどっちが好ましいかは自然とはっきりする
244 名前:デフォルトの名無しさん [2017/01/20(金) 00:23:32.93 ID:7sj2OAGi.net] なんか禅問答が始まったかと思ったわ
245 名前:デフォルトの名無しさん mailto:sage [2017/01/20(金) 01:12:20.36 ID:/ixeQkYS.net] 短いメソッドなら、ヘッダに、inline 指定して書くと、 関数化せずに、inline にしてくれる可能性が高い まあ、言語では保証していないけど。コンパイラ依存
246 名前:デフォルトの名無しさん [2017/01/20(金) 05:11:02.70 ID:vaOLIJJw.net] クラス定義で定義されたメンバ関数は暗黙にinlineになるね。 (『プログラミング言語C++第4版』p.464 16.2.8 クラス内関数定義) class SomeClass { public: int a() {return a_;} // 暗黙のinline指定 private: int a_; } …という話を書くために厚い本を調べてたら class SomeClass { public: int a(); private: int a_; } inline int SomeClass::a() // 明示的にinline指定 { return a_; } と書く方法も載ってた。 >>240 は後者の説明だったのね。
247 名前:デフォルトの名無しさん mailto:sage [2017/01/20(金) 07:10:06.09 ID:Nvso2zBq.net] >>235 本体側に書くのが原則 特にシステムが大きくなる場合 よほどの理由がある場合(インライン化して高速化するなど)はヘッダに書くこともある
248 名前:デフォルトの名無しさん mailto:sage [2017/01/20(金) 08:09:40.71 ID:B05iL6IP.net] 『〜のが原則』 『理由がある場合〜こともある』 俺の会社のルールは世界普遍的 思考
249 名前:デフォルトの名無しさん mailto:sage [2017/01/20(金) 16:53:52.68 ID:abKD9bRi.net] inlineにするのはほとんどその時の気分みたいな? なんかマクロみたいだな。inlineにすっかみたいな。
250 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/01/20(金) 17:10:04.08 ID:XdmbS/hB.net] >>244 関数呼び出しのオーバーヘッドの回避と、定数畳み込みなどの最適化が期待できる場合にインライン化する。
251 名前:デフォルトの名無しさん mailto:sage [2017/01/20(金) 17:38:00.40 ID:abKD9bRi.net] >>245 そんな感じ
252 名前:デフォルトの名無しさん mailto:sage [2017/01/20(金) 20:04:23.44 ID:1c/0Zcpc.net] >>245 インラインにしても劇的に速くなった経験が無いんですが、コツは有りますか?
253 名前:デフォルトの名無しさん mailto:sage [2017/01/20(金) 20:57:25.59 ID:pNkrp0ep.net] 効果が出るのは ・小さい かつ ・短時間に非常に多数呼び出される 関数だけだよ。 しかも、まず劇的ではない。
254 名前:デフォルトの名無しさん [2017/01/20(金) 21:15:10.32 ID:esT1VQmf.net] inlineキーワードはヘッダに実装書くときなどに使用するものでインライン展開を狙った最適化の為に書くものではない
255 名前:デフォルトの名無しさん mailto:sage [2017/01/20(金) 21:15:23.08 ID:abKD9bRi.net] もしかしてコンパイラの方で展開してるとか はないかなぁw
256 名前:デフォルトの名無しさん mailto:sage [2017/01/20(金) 21:57:28.38 ID:aetIobRP.net] >>249 インライン関数の話の途中でinlineキーワードの関数の話を始めて、いきなりどうした
257 名前:デフォルトの名無しさん mailto:sage [2017/01/20(金) 22:07:56.98 ID:CICAdfuU.net] >>249 上にもあるけどヘッダに実装書いたら暗黙でインライン指定されるから、そこにinlineキーワードを使用するのは無意味 やはりinlineは最適化のためでしょう
258 名前:デフォルトの名無しさん mailto:sage [2017/01/20(金) 23:11:34.78 ID:LsENUQp+.net] ベクトルとか行列のライブラリを使った時は全部インラインにしたな 1/60秒にかなりの回数呼ぶし ライブラリとかもインラインで書かれてる
259 名前:デフォルトの名無しさん mailto:sage [2017/01/20(金) 23:12:36.14 ID:LsENUQp+.net] ×使った ??作った
260 名前:デフォルトの名無しさん [2017/01/20(金) 23:27:28.97 ID:esT1VQmf.net] >>252 んなわけない
261 名前:デフォルトの名無しさん mailto:sage [2017/01/20(金) 23:34:20.48 ID:ITfb1kXg.net] >>255 んなこたーない
262 名前:デフォルトの名無しさん [2017/01/20(金) 23:36:05.42 ID:esT1VQmf.net] ヘッダに書いたら暗黙でinlineって #includeの機能しらんとしか思えないんだが
263 名前:デフォルトの名無しさん mailto:sage [2017/01/21(土) 00:40:48.27 ID:dThE4/1u.net] ちょと混じっちゃったね。 関数を定義されたヘッダーが複数のソースに呼ばれちゃったら、実体が いっぱい出来ちゃうもんね。
264 名前:デフォルトの名無しさん mailto:sage [2017/01/21(土) 01:48:12.93 ID:RmTA4cQd.net] 江添はなんて言ってる?
265 名前:デフォルトの名無しさん mailto:sage [2017/01/21(土) 07:06:45.50 ID:5NCJ8rOL.net] forceを信じるのだ
266 名前:デフォルトの名無しさん mailto:sage [2017/01/21(土) 08:35:23.75 ID:P1/rV56D.net] インライン関数はODR回避のためだと思っていた C++17(予定)のインライン変数もそんな感じ
267 名前:デフォルトの名無しさん mailto:sage [2017/01/21(土) 11:00:41.73 ID:wrzS/cSB.net] ODRって何?
268 名前:デフォルトの名無しさん mailto:sage [2017/01/21(土) 11:17:05.01 ID:J7ipYv9j.net] 単一定義則 One Definition Rule の略語
269 名前:263 mailto:sage [2017/01/21(土) 19:43:36.29 ID:J7ipYv9j.net] 「単一定義規則」の方が検索にかかりやすい言葉かも。
270 名前:デフォルトの名無しさん mailto:sage [2017/01/22(日) 08:28:10.05 ID:5o7PrILb.net] >>261 そうそう。最適化目的でinline付けても普通無視されるからね。
271 名前:デフォルトの名無しさん mailto:sage [2017/01/22(日) 14:37:23.33 ID:hBhrTyQG.net] https://chrome.google.com/webstore/detail/%E3%81%AF%E3%81%A6%E3%81%AAng/mbgdnfmdelffjdhkdggilmphfdihnmcj?hl=ja
272 名前:デフォルトの名無しさん [2017/01/24(火) 12:50:54.05 ID:ZplzBBh2.net] Windows上で、APIを使わずに、コマンドプロンプト上だけで結果が ほしいような、C言語のプログラムを作るのに便利な開発環境はありますか? VIsualStudioは重すぎてあまり使いたくありません。 どうぞよろしくお願いします。
273 名前:デフォルトの名無しさん mailto:sage [2017/01/24(火) 13:20:58.13 ID:qjTW56fl.net] msys2
274 名前:デフォルトの名無しさん [2017/01/24(火) 13:39:24.94 ID:ZplzBBh2.net] msysって、どういうものですか?
275 名前:デフォルトの名無しさん mailto:sage [2017/01/24(火) 13:58:35.63 ID:qjTW56fl.net] >>269 コンパイラツールチェインとターミナルとライブラリ管理のパッケージツールを纏めたものです エディタは無いし ビルドツールはautotoolsとかcmakeとかを使います ただ単体ファイルをコンパイルして実行するだけなら gccを叩くだけなので ご要望に沿うかと
276 名前:デフォルトの名無しさん mailto:sage [2017/01/24(火) 14:14:08.29 ID:tjYeiy24.net] 重いのがイヤなら code::blocks はどうかね demura.net/lecture/12713.html
277 名前:デフォルトの名無しさん mailto:sage [2017/01/24(火) 20:33:35.20 ID:bAAm8CCs.net] >>267 自分もvisual studio が重いのと好きなエディタ使いたいのと、 でもGUIでファイル管理とかコンパイルエラー行へのジャンプをしたかったの自分でそういうツールを作った。TTVC Developer っていうのだけど ネット上に公開してるけど反応無いので本当に良くできてるかどうかは わからんが、自分的には便利だとは思ってる
278 名前:デフォルトの名無しさん mailto:sage [2017/01/24(火) 20:39:04.14 ID:2gaKjsEX.net] 俺はqt creator使ってるな VSよりマシってくらいだが
279 名前:デフォルトの名無しさん mailto:sage [2017/01/24(火) 20:46:07.50 ID:HHZbO6eg.net] >>267 notepad.exe cl.exe link.exe
280 名前:デフォルトの名無しさん [2017/01/24(火) 21:22:57.39 ID:nvNd8iP1.net] Bash on Ubuntu on Windws
281 名前:デフォルトの名無しさん mailto:sage [2017/01/24(火) 21:41:00.44 ID:1ohBhH6C.net] あれβとれたっけ?
282 名前:デフォルトの名無しさん mailto:sage [2017/01/27(金) 01:10:08.67 ID:c6wkRwWW.net] *p++ って 参照してからインクリメントですよね。 某書に*(p++)と等価って書いてあったけど。 ん 同じか
283 名前:デフォルトの名無しさん mailto:sage [2017/01/27(金) 01:47:57.39 ID:JFq0FevS.net] 同じだよ その括弧かあってもなくても実際にインクリメントがされるタイミングには影響しない
284 名前:デフォルトの名無しさん mailto:sage [2017/01/27(金) 02:43:45.51 ID:c6wkRwWW.net] すまん 評価してからインクリメントは同じだもんね。
285 名前:デフォルトの名無しさん mailto:sage [2017/01/28(土) 22:24:20.92 ID:fbuNIeJW.net] >>279 いいってことよ 何気に愉快なIDだな
286 名前:デフォルトの名無しさん mailto:sage [2017/01/29(日) 14:28:58.62 ID:XKehhdE4.net] 質問です。 VisualStudio2015でReleaseビルドをしていたところ、生成されたEXEに気になる点がありました if(false){ printf("hogehoge"); } という処理を書いたところ、このprintfは到達不可能なのに、EXEの中に"hogehoge"という文字列が含まれていたのです。 ※再現コードなのでhogehoeをprintしてなんの意味があるのかというコードですが 到達不能なのが明らかな部分は最適化で削除されるものだと思っていたのですが、何かしらの私の不手際でしょうか? 最適化は /O2オプションです
287 名前:デフォルトの名無しさん mailto:sage [2017/01/29(日) 15:19:11.63 ID:DfD+S+Qh.net] >>281 /O4とかは?
288 名前:デフォルトの名無しさん mailto:sage [2017/01/29(日) 15:31:20.39 ID:2ZaFXkbr.net] オプションによる不確定なものをどうして不手際と思ったのか謎 /O2 /GF-なら残る可能性高いし
289 名前:デフォルトの名無しさん mailto:sage [2017/01/29(日) 17:04:30.90 ID:XKehhdE4.net] アドバイスありがとうございます >>282 VisualStudioには無いようです。GCCにはあるようですが、ぐぐった限りだと効果はないようなことが散見されました >>283 「不要なコードを削る」というのは、一番単純で効果が高そうなので、まっさきに確実に全除去してくれるだろうと思い込んでいたためです この手のコードが最適化で消えないと、ifdefだらけになりそうなのですが、何か対策はないものでしょうか?
290 名前:デフォルトの名無しさん mailto:sage [2017/01/29(日) 18:59:23.49 ID:K+/fnyLa.net] 何かの理由があって残してるという事はないのかな・・・
291 名前:デフォルトの名無しさん mailto:sage [2017/01/29(日) 19:49:35.57 ID:6wGEJq5M.net] >>281 普通に削除されて文字列もなくなるけど?
292 名前:デフォルトの名無しさん mailto:sage [2017/01/29(日) 23:12:58.08 ID:XKehhdE4.net] >>285-286 ご返答ありがとうございます。 どうも文字列をあれこれ変えて、消えたり消えなかったりとよくわからない状況になってきました。 とりあえず、VS2015での最小コードを作れましたので貼り付けます int main() { char text[] = "foofoo"; printf("hogehoge"); if (false) { printf(text); } return 0; } こうすると以下の挙動になります。 このまま: exeにhogehoge, foofooの両方が含まれているのを確認できる printf("hogehoge");を削除: hogehoge, foofooの両方がEXEから消える ※単に0を返すだけの結果固定関数になるため、変数の割り当てすらしなくなるから?
293 名前:デフォルトの名無しさん mailto:sage [2017/01/29(日) 23:42:21.35 ID:DuISdTe+.net] VS2015の環境を持っていないんで見当違いかも知れんが…。 #include <stdio.h> か #include <cstdio> を書いてみる。 char text[] = ... を const char text[] = ... にしてみる。 これらを(独立して)変えてみたら状態が変わらんかな? printf()による副作用の可能性を考慮してtextを消さないのかも知れん。 もちろんprintf("hogehoge")を呼び出しても 引数になってないtextが読み書きされるはずはないんだけど。
294 名前:デフォルトの名無しさん mailto:sage [2017/01/30(月) 00:05:47.51 ID:iVXSa+56.net] >>288 アドバイスありがとうございます すいません。最小コードといいつつincludeをきちんと書いておりませんでした #include <stdio.h>を最初に書いております cstdioに変えてみて、各種パターンやってみましたが、変化は見られませんでした 次に、以下です const char ではfoofooは消えませんでした const static char に変えたところ、消えました printfが、中でスタック消費量でも利用しているのかな…と馬鹿なことを考えて char text〜をグローバル空間に出してみましたが、foofooは消えずです
295 名前:デフォルトの名無しさん mailto:sage [2017/01/30(月) 13:26:01.87 ID:NFw8h2uH.net] >>289 グローバル変数にするのは最適化されにくくなるだけ。 とりあえずこれで #include <stdio.h> int main(){ printf("hogehoge"); if(false){ printf("foofoo"); } return 0; } データセグメントが消えるかどうかは最適化の 目的じゃないと思うが、"foofoo"が残るか見てみると VS2015 cl /Ox /Fa hoge.cpp きえない cl /O1 /Fa hoge.cpp きえた cl /O2 /Fa hoge.cpp きえた GCC-3.4.5 gcc -S hoge.cpp きえた まあ所詮VC
296 名前:デフォルトの名無しさん mailto:sage [2017/01/30(月) 17:50:38.46 ID:X+M9ocjS.net] つまり>>281 は嘘つきってこと?
297 名前:デフォルトの名無しさん mailto:sage [2017/01/30(月) 19:47:42.18 ID:p0U51Ig/.net] exeの中身まで気が回りませんわ
298 名前:デフォルトの名無しさん mailto:sage [2017/01/30(月) 22:08:56.31 ID:mpXbeHjF.net] exeにビルド時のフルパスが埋め込まれてるとイラっとする
299 名前:デフォルトの名無しさん [2017/01/30(月) 22:20:13.70 ID:XMGcU10o.net] デバッグビルドなら普通でしょ
300 名前:デフォルトの名無しさん mailto:sage [2017/01/31(火) 02:46:33.99 ID:SZ8YrWi+.net] リリースビルドにして、最適化オプションを指定すれば?
301 名前:デフォルトの名無しさん mailto:sage [2017/01/31(火) 09:17:11.64 ID:r8Cb1+5o.net] デバッグ情報を含めなければいいだけだしな
302 名前:デフォルトの名無しさん mailto:sage [2017/02/01(水) 01:15:31.17 ID:lC8eLy+G.net] あるクラスに引数で渡されるオブジェクトのconstではない参照を持ちたいんですけどどのようにやればいいでしょうか ポインタはなるべく使いたくないのですが class A { public: void setParam(Param&); private: Param& m_param; } 状況としては あるクラスBがクラスAみたいなParamの参照を持つクラスを複数持っていて クラスBがvector<Param>でParamの実体を持っているという感じです
303 名前:デフォルトの名無しさん mailto:sage [2017/02/01(水) 01:25:10.63 ID:V+KME3Sb.net] ライフタイムと循環参照のもたらす悪夢を 全部避けられるように熟考しながら shared_ptr / weak_ptr をどうぞ Welcome to C++ nightmare!!
304 名前:デフォルトの名無しさん [2017/02/01(水) 01:36:32.13 ID:nwC60mRJ.net] shared_ptrの何が難しいのか判らん。 shared_ptr程度で悪夢とか言ってたらswiftも使えなくない?
305 名前:デフォルトの名無しさん mailto:sage [2017/02/01(水) 02:15:37.65 ID:V+KME3Sb.net] まぁ良く調べて使ってねってのを脅し効かせた程度です 他の言語で参照カウント型のsmart_ptr解ってるなら 確かに大丈夫
306 名前:デフォルトの名無しさん mailto:sage [2017/02/01(水) 12:17:29.74 ID:RxSebrTI.net] Windows10でBluetoothを使ったCOM通信を行いたく、 プログラムのほうはCOMポート通信のつもりで書き、 OSの設定でBluetoothに仮想COMポートを追加しました。 Androidとは問題なく接続・通信できたのですが、 Windows10同士ではうまくいきませんでした。 これは仮想COMポート作成するときに、どちらのPCも「受信」(相手側が接続を開始する)にしていたからだと思い、 片方を「送信」に変更しようとしました。 しかし、この場合は接続先PCを指定しなくてはならないのですが 対象PCが選択リスト内に出てこなくて作成することができません。 ペアリングはできているにもかかわらずです。 どうすればWin10PC同士でBluetoothを介したCOMポート接続・通信ができるでしょうか?
307 名前:デフォルトの名無しさん mailto:sage [2017/02/01(水) 12:30:13.62 ID:HL/HxBhd.net] 直接の解はわからないけど、ぐぐって見つかったので確認 ポート開くとき "\\\\.\\COM○○" (○は数字 \はエスケープ込み) って開いてる? ポート番号が1桁の場合に限り "COM○"でも開けるらしいけど、 そのコードの延長で 2桁渡すとそれは開けないから
308 名前:301 mailto:sage [2017/02/01(水) 12:49:42.61 ID:RxSebrTI.net] >>302 あ、はい。それはやってます。 今、わかったのですが、 一旦ペアリングを解除して、改めて「送信」COMポートを追加しようとすると、 先程までペアリングしていた対象PCが選択できるようになりました。 しかし今度は「選択されたデバイスでシリアルポートサービスが実行されていません。」と出て作成されません。 相手側に「受信」のCOMポートは作成済みなのですが…。
309 名前:デフォルトの名無しさん mailto:sage [2017/02/01(水) 13:25:07.55 ID:HL/HxBhd.net] ttp://kokufu.blogspot.jp/2014/02/windows-bluetooth-spp-server.html これとかの雰囲気だと 「受信」で作った側のPCのソフトを先に立ち上げて接続待ちにして(SPPサーバー) 「送信」で作った側のPCを後追いで接続 かなぁ 力になれなくてすまん
310 名前:301 mailto:sage [2017/02/01(水) 14:06:25.03 ID:RxSebrTI.net] >>304 いえいえ! 色々と調べていただいて参考になりました。 どうもシリアル接続サービスをサポートしていないようです。 今回の条件ではあまり好ましくないのですが、 WiFiを使ったソケット通信で妥協することにします。 ありがとうございました。
311 名前:デフォルトの名無しさん mailto:sage [2017/02/01(水) 14:21:22.91 ID:+8V+I8xy.net] >>298-300 ありがとうございます 帰ったら勉強してみます
312 名前:デフォルトの名無しさん [2017/02/01(水) 20:39:39.90 ID:3j6uP7e4.net] >>297 参照をメンバで持ちたい時は、コンストラクタでの初期化以外は無理。 class A { public: A(Param& x):m_param(x){} private: Param& m_param; };
313 名前:デフォルトの名無しさん mailto:sage [2017/02/02(木) 01:04:42.40 ID:CAgg+EtY.net] shared_ptr,weak_ptrのことで質問なのですが 自クラス2つを引数に取る+演算子をオーバーロードしているクラスMatrixを使って func(std::weak_ptr<Matrix> m1, std::weak_ptr<Matrix> m2){ mat = m1 * m2; … } みたいにやりたいんですが、オペランドに一致する演算子がないと言われます shared_ptr,weak_ptrに入れた場合どのようにしてオーバーロードされた演算子を利用できますか?
314 名前:デフォルトの名無しさん mailto:sage [2017/02/02(木) 01:27:35.78 ID:FXYEZ0RW.net] >>308 weak_ptr から shared_ptr を作って、それを通して参照すればいい ・・・んだけど、それ weak_ptr::expired() な場合にどうするつもりなん?
315 名前:デフォルトの名無しさん mailto:sage [2017/02/02(木) 02:04:10.33 ID:CAgg+EtY.net] >>309 ありがとうございます weak_ptrを使っている理由は funcはあるクラスのメンバ関数で、引数で渡されたポインタの所有権をクラスが持たないこと示すためにweak_ptrを使っているのですが weak_ptr::expired()な場合は想定していません
316 名前:デフォルトの名無しさん [2017/02/02(木) 02:21:14.81 ID:ExAPXdhA.net] >>310 なんか根本的に勘違いしてる感が const referenceの関数見たら中でポインタ持ち続けちゃう心配とかしてんの?
317 名前:デフォルトの名無しさん mailto:sage [2017/02/02(木) 02:21:18.81 ID:EB2HJN86.net] スマートポインタはポインタのように振る舞うものだから *や->でポインタの指す値にしなければならないよ
318 名前:デフォルトの名無しさん mailto:sage [2017/02/02(木) 10:51:03.92 ID:335RX4F5.net] VS2015で.objを.libに変換してリンクできなくて悩んでいます そういうことはできないのでしょうか? 複数のC++ファイルをビルド→.objが複数できる 新しいEXEプロジェクト作る→main()を用意→そこの.vcxprojを編集して複数の.objをincludeする→ビルドで正常な.exeできる(exeサイズ10MB) include方法は<Object Include="abc1.obj" /> <Object Include="abc2.obj" />・・・ 新しいスタティックライブラリプロジェクト作る→そこの.vcxprojを編集して複数の.objをincludeする→ビルドで.libができる(libサイズ100MB) →新しいEXEプロジェクト作る→main()を用意→追加のライブラリで.libをリンクする→ビルドで動かない.exeできる(exeサイズ1MB) 動かない.exeのビルド時はリンカーエラーなど出ません exeサイズが期待しているよりも小さく、実行時に例外で強制終了します
319 名前:デフォルトの名無しさん mailto:sage [2017/02/02(木) 12:49:56.83 ID:cH1kwi7M.net] 例外を具体的に
320 名前:デフォルトの名無しさん mailto:sage [2017/02/02(木) 13:18:13.30 ID:Nq0thOwX.net] >>314 > ハンドルされない例外がスローされました:読み取りアクセス違反。 > xxxxx が nullptr でした。 xxxxxはポインタ変数 exeサイズが小さいからリンクできてるように見えてリンクできてないのかなとは思うけど libの追加方法を#pragma comment(lib,"")にしてもうまくいかずでどうしたらいいものか
321 名前:デフォルトの名無しさん mailto:sage [2017/02/02(木) 18:40:08.32 ID:qO0hDPsp.net] >>313 > vcxprojを編集して複数の.objをincludeする なんか色々勘違いしてないか?
322 名前:デフォルトの名無しさん [2017/02/02(木) 18:48:07.72 ID:S7kpFPUA.net] >>316 そういう実験してるんでしょ。 それを他人に聞いて何か返ってくると思ってるのが間違ってる感があるけど。
323 名前:デフォルトの名無しさん mailto:sage [2017/02/02(木) 19:11:39.98 ID:Eu4e1EaI.net] >>316 objからlibを作って動くならそれがいいのだけどその方法が分からない lib.exeでobjからlibを作って使っても同じ状況
324 名前:デフォルトの名無しさん mailto:sage [2017/02/02(木) 19:16:04.83 ID:WkIFQVuy.net] >>317 普通とは違うことをしているなと思ったが、実験しているのか vcxprojを編集してソースコードではなくobjを用いるVSプロジェクトを作りたいのかな
325 名前:デフォルトの名無しさん mailto:sage [2017/02/02(木) 19:18:03.73 ID:qhXDtbED.net] .c, .cpp から .lib 作るプロジェクト -(A) そいつをリンクしつつ、 .c, .cpp から実行ファイルを作るプロジェクト -(B) (参照設定とか依存関係とかで (A) を使うぜ俺 って指定する)
326 名前:デフォルトの名無しさん mailto:sage [2017/02/02(木) 19:38:57.55 ID:WkIFQVuy.net] こんな感じだろ ソースからobj生成: VSプロジェクトでなくていい VSプロジェクト 1. objからexe作るVSプロジェクト (結果OK) 2. objからlib作るVSプロジェクト (3.がNGで、本当にうまくlib作れたかわからず) 3. 上のlibからexe作るVSプロジェクト (exeが例外でNG)
327 名前:デフォルトの名無しさん mailto:sage [2017/02/02(木) 19:51:53.25 ID:Eu4e1EaI.net] >>321 まさにその状態 >>320 の(A)が作れればいいけど、objファイルは数百プロジェクトの600ファイルぐらいあるから試そうにも数日かかりそうで避けたい 今は全プロジェクトまとめたソリューションあるけどリビルドだけで1時間以上かかる。簡単にexe作れるようにしたいというのが原点
328 名前:デフォルトの名無しさん mailto:sage [2017/02/02(木) 20:22:53.95 ID:k638XiO/.net] そこまで行ったらDLLに分けるだろう
329 名前:313 mailto:sage [2017/02/03(金) 13:56:09.01 ID:3xPmzf3n.net] 4番をやってみましたが結果OKでした 1. objからexe作るVSプロジェクト (結果OK) 2. objからlib作るVSプロジェクト (3.がNGで、本当にうまくlib作れたかわからないが、4がOKで作れてる可能性高い) 3. 2のlibからexe作るVSプロジェクト (exeが例外でNG) 4. 2のlibからobjを抽出して、そのobjからexe作るVSプロジェクト (結果OK) 作業の前提条件として下の2つは意味が同じと思っているのですが、違いがあるのでしょうか? cppをコンパイルしてobjにし、objをリンクしてexeを作る cppをコンパイルしてobjにし、objをlibに変換してからリンクしてexeを作る
330 名前:デフォルトの名無しさん mailto:sage [2017/02/03(金) 13:56:30.01 ID:OeN1TpCU.net] Ubuntu16.04,gcc5.4.0で,書籍を参考に下記のプログラムを コンパイル(gcc program.c -lalut -s -o program)したところ, 「'nullptr' was not declared in this scope」というエラーになりました 何が間違っているのか教えてください ---program--- #include<AL/al.h> #include<AL/alc.h> int main() { //OpenAlの初期化 //デバイスを開く ALCdevice* device = alcOpenDevice(nullptr); //コンテキストを生成 ALCcontext* context = alcCreateContext(device, nullptr); //生成したコンテキストを操作対象にする alcMakeContextCurrent(context); //OpenALの後始末 //操作対象のコンテキストを解除 alcMakeContextCurrent(nullptr); //コンテキストを破棄 alcDestroyContext(context); //デバイスを閉じる alcCloseDevice(device); }
331 名前:デフォルトの名無しさん mailto:sage [2017/02/03(金) 14:06:26.05 ID:S9UE3yae.net] nullptrはC++11からの機能だからですね "gcc" -> "g++ --std=c++11"を使ってください 元のコンパイルは-lalutを指定していますが そのプログラムならOpenALだけで大丈夫なので 下記で通ります ライブラリをpkg-configに探させてるだけです g++ --std=c++11 program.c `pkg-config openal --libs` -o program
332 名前:デフォルトの名無しさん mailto:sage [2017/02/03(金) 14:55:43.86 ID:xVLuMTde.net] >>324 一般論で言えば同じはず。 ファイルサイズが小さいのなら正常にリンクできてない。 使ってない関数やクラスをリンクしてるわけじゃないよね
333 名前:デフォルトの名無しさん mailto:sage [2017/02/03(金) 15:42:48.87 ID:3xPmzf3n.net] >>327 使ってるのも使ってないのもある libの追加方法は二通り試したけどどちらもビルドエラーはでないけど実行時NG どちらもlibの追加を省略すると外部シンボルが見つからないエラーでビルドが通らない プロジェクトのプロパティの「追加の依存ファイル」から→実行時NG ソースファイル中に「#pragma comment(lib,"")」から→実行時NG
334 名前:デフォルトの名無しさん [2017/02/04(土) 00:14:20.36 ID:z/XsYQOx.net] 何もしていない普通の一般人の自宅に隠しカメラを取り付け それをネットでリアルタイム配信 仲間という人間に対する盗聴盗撮生ネット配信の会 しかけたカメラの映像 乗っ取っているPCの画像をリアルタイムで生配信中 集団で仲間の私生活を覗いて楽しんでいる そんなことが今この国では行われています
335 名前:デフォルトの名無しさん mailto:sage [2017/02/04(土) 05:54:43.47 ID:/r5Uxr2+.net] libでリンク解決してもダイナミックリンクにしてれば実行時にパス内に見つからずにエラー スタティ
336 名前:ックリンクにしないと [] [ここ壊れてます]
337 名前:デフォルトの名無しさん mailto:sage [2017/02/04(土) 09:51:58.52 ID:GdM1I4zb.net] 久々にプログラミングしようと思うんですけど USBカメラがあるからそれを使って監視カメラにしたいんだが ピクセルデータが取れればあとは簡単だと思うんだけど、その前に この適当に昔買ったバッファローのUSBからデータ取り出す事って可能なんですか?
338 名前:デフォルトの名無しさん mailto:sage [2017/02/04(土) 10:24:35.81 ID:94H9RTyk.net] >>330 lib作るときのプロジェクトタイプはスタティックライブラリにしているけど、それとは別に設定であるのでしょうか? >>331 「usbカメラ キャプチャ c++」で検索すると色々な方法が見つかるよ。よほど変なカメラ出ない限り仕様は同じだから使える
339 名前:デフォルトの名無しさん mailto:sage [2017/02/04(土) 10:55:19.44 ID:GdM1I4zb.net] >>332 ありがとうございますだ
340 名前:デフォルトの名無しさん mailto:sage [2017/02/04(土) 21:25:32.55 ID:uqEM2LY/.net] int a = 0; int *b = &(1+a); これが出来ないのはなぜですか? 1+aの計算結果というのはメモリ上のどこかにあると思うんですが
341 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/02/04(土) 21:28:28.23 ID:sK4bvJ1n.net] >>334 CPUのレジスタには物理アドレスが無い。
342 名前:デフォルトの名無しさん mailto:sage [2017/02/04(土) 21:31:18.24 ID:3pCbKNVT.net] &1 を許すとややこしいことになりそうだ
343 名前:デフォルトの名無しさん mailto:sage [2017/02/04(土) 21:38:25.89 ID:wIflvrKT.net] >>334 計算結果はレジスタに入っててメモリには入ってないんじゃない?
344 名前:デフォルトの名無しさん mailto:sage [2017/02/04(土) 21:52:37.41 ID:uqEM2LY/.net] >>335-337 なるほど、勘違いしてました ありがとうございます
345 名前:デフォルトの名無しさん mailto:sage [2017/02/05(日) 19:35:43.24 ID:ktep0Dpi.net] >>326 遅くなりすいません できました ありがとうございました
346 名前:デフォルトの名無しさん mailto:sage [2017/02/05(日) 22:43:20.73 ID:F2ePDpTS.net] >337 レジスタがメモリじゃないかのようなアホレスだな
347 名前:デフォルトの名無しさん mailto:sage [2017/02/05(日) 23:03:58.60 ID:wagcFIA6.net] レジスタのアドレスって・・・
348 名前:デフォルトの名無しさん mailto:sage [2017/02/06(月) 01:31:32.48 ID:DI3VdQ+9.net] アドレスのないレジスタはCでアクセスできないからな アセンブリでしてねになるからね
349 名前:デフォルトの名無しさん [2017/02/06(月) 03:41:00.32 ID:oG8S/cPb.net] って言うかレジスタ関係なくね? 右辺値に対してアドレス取ろうとしてるから駄目なわけで。
350 名前:デフォルトの名無しさん mailto:sage [2017/02/06(月) 05:58:55.21 ID:GvVdGH4O.net] >>334 の質問に対して「右辺値」を出すのは大げさじゃないかな。 もちろん正しいんだけど、詳細に踏み込みすぎというか、 その話はもっと理解が深まってから、というか。 「過去に自分がこの疑問を持ったときに、どんな説明をされたら すっきり腑に落ちて先に進めただろうか」と思い返しながら回答してるんだろう。
351 名前:デフォルトの名無しさん mailto:sage [2017/02/06(月) 08:21:18.53 ID:87jFG7WV.net] そもそも >>338 で本人納得してるのに > レジスタがメモリじゃないかのようなアホレスだな とか > 右辺値に対してアドレス取ろうとしてるから駄目なわけで。 とかは知ったか自慢にしか見えない
352 名前:デフォルトの名無しさん mailto:sage [2017/02/06(月) 08:58:46.99 ID:L0zP1ki7.net] 間違った説明で相手を納得させておいて開き直りとはこれいかに
353 名前:デフォルトの名無しさん mailto:sage [2017/02/06(月) 13:17:28.90 ID:WLH8uv6+.net] >>345 本人の納得は無関係 その二つどっちも誤り
354 名前:デフォルトの名無しさん mailto:sage [2017/02/06(月) 20:21:28.41 ID:VJg+IRhi.net] >>345 > その二つどっちも誤り でもどう誤ってるかは書けないんだよね w
355 名前:デフォルトの名無しさん mailto:sage [2017/02/06(月) 20:22:09.67 ID:VJg+IRhi.net] >>348 は >>347 宛だったわ
356 名前:デフォルトの名無しさん [2017/02/06(月) 20:58:58.36 ID:oG8S/cPb.net] >>344 でもさ、レジスタって言語と関係ないじゃん?
357 名前:デフォルトの名無しさん mailto:sage [2017/02/06(月) 21:52:01.05 ID:w07g0Jpo.net] registerは予約語なのに無関係は無いわ
358 名前:デフォルトの名無しさん mailto:sage [2017/02/06(月) 22:13:36.15 ID:rtwfNknd.net] >registerは予約語なのに無関係は無いわ 規格のどこを読んだら「register」キーワードと「レジスター」との関連が読みとれるんだか
359 名前:デフォルトの名無しさん mailto:sage [2017/02/06(月) 23:29:15.59 ID:w07g0Jpo.net] 規格厨には理解しろと言っても無理だ
360 名前:デフォルトの名無しさん mailto:sage [2017/02/06(月) 23:45:37.66 ID:+fmEnPzx.net] >int a = 0; >int *b = &(1+a); っていうのが今intになってるからレジスタがどうとか言えるけど intじゃなくて自分で定義したクラスとかだったらどうなんだって話だな レジスタだからアドレスが取れないっていう説明はアレすぎないかい? そもそもレジスタだけで済ませるかどうかはコンパイラの自由ってのもあるし
361 名前:デフォルトの名無しさん mailto:sage [2017/02/06(月) 23:48:30.59 ID:tIYhS76V.net] 一生懸命だなあw
362 名前:デフォルトの名無しさん mailto:sage [2017/02/07(火) 00:11:08.64 ID:STnejiJM.net] 俺が思うにさ 最適化でレジスタに配置されてメモリに実体が確保されない変数ってのは 普通にありふれているわけじゃないですか で、それらの変数のアドレスを取得するように コードを書き換えたら、コンパイルエラーになるんですか?ってね その場合ちゃんとコンパイラはメモリに実体を作るような動作になる だからレジスタ云々はオプティマイズの話であって本質的に全く関係ないだろうと レジスタに配置されているからアドレス取得できませんって意味不明で だったらメモリに実体を作ればいくらでもアドレス取得できるだろって話なんだよ どちらかというとこれは変数の寿命の関係でそうなっているんだよ
363 名前:デフォルトの名無しさん mailto:sage [2017/02/07(火) 00:12:13.25 ID:vsDAW+dO.net] 初心者向けの簡易な説明に外野がつまらない茶々入れて大騒ぎするなよ。
364 名前:デフォルトの名無しさん mailto:sage [2017/02/07(火) 00:25:30.14 ID:pfKer2X+.net] >最適化でレジスタに配置されてメモリに実体が確保されない変数ってのは >普通にありふれているわけじゃないですか 本当にありふれてるのか?
365 名前:デフォルトの名無しさん [2017/02/07(火) 00:48:05.62 ID:PI0qtNzz.net] winsock(UDP)を使ったプログラムを作っています。 ほぼできたのですが、数100回繰り返すと徐々に通信が 遅くなっていきます。 通信するたびに、オープンとクローズを繰り返しているのですが、 その辺に原因がありそうでしょうか・・・。
366 名前:デフォルトの名無しさん mailto:sage [2017/02/07(火) 02:25:04.93 ID:e2
] [ここ壊れてます]
367 名前:fTv1VF.net mailto: メモリを解放していないから、使用メモリがドンドン大きくなっていくとか? プロセスの使用メモリを、チェックすれば? [] [ここ壊れてます]
368 名前:デフォルトの名無しさん mailto:sage [2017/02/07(火) 07:22:03.04 ID:ff698yUf.net] >>354 > そもそもレジスタだけで済ませるかどうかはコンパイラの自由ってのもあるし その自由さのために言語仕様でできないようにしてるだけでしょ
369 名前:デフォルトの名無しさん mailto:sage [2017/02/07(火) 07:23:26.33 ID:ff698yUf.net] >>359 再現性あるならどこが遅くなってるかを調べたら?
370 名前:デフォルトの名無しさん mailto:sage [2017/02/07(火) 07:43:41.13 ID:AbeSLyAt.net] >その自由さのために言語仕様でできないようにしてるだけでしょ 根拠は俺の「こうだったらいいな」 この理屈で行くとアドレスをとれる変数は レジスタに乗せてはいけないことになるな
371 名前:デフォルトの名無しさん mailto:sage [2017/02/07(火) 11:15:58.10 ID:bjgueVwS.net] register云々してるやつはCかC++か区別して書け
372 名前:デフォルトの名無しさん mailto:sage [2017/02/07(火) 11:47:58.10 ID:+LdvU0fQ.net] class A { public: int xxx; void yyy(); }; class B : protected A ←protectedのままにしたい { public: void yyy() { __super::yyy(); } }; B bbb; bbb.xxx = 0; ←アクセスできない bbb.yyy(); ←使える xxxをclassBの内部を変えることでアクセスできるようにする方法ない?
373 名前:デフォルトの名無しさん mailto:sage [2017/02/07(火) 11:52:35.77 ID:Ex9Qk6T0.net] public: using A::xxx;
374 名前:デフォルトの名無しさん mailto:sage [2017/02/07(火) 11:57:42.37 ID:+LdvU0fQ.net] >>366 おお!yyy()もそれでいけるね。サンクス
375 名前:デフォルトの名無しさん mailto:sage [2017/02/07(火) 19:45:06.55 ID:R+lISOuU.net] >>364 register変数のアドレスを取る話をしてるわけじゃないのに いきなりどうした
376 名前:デフォルトの名無しさん mailto:sage [2017/02/08(水) 19:54:01.02 ID:zyGgo9zG.net] 俺,register使ったことないが register int a = 0; int *b = &a; とすると、b経由で割り当てられたCPUレジスタにアクセスできるのか?
377 名前:デフォルトの名無しさん mailto:sage [2017/02/08(水) 20:15:16.32 ID:x9WXoVQQ.net] cではregister指定された変数のアドレスは取れない c++では取ってもいいが、取ると普通はレジスタではなくメモリ割り当てになる そもそもregister指定しても必ずレジスタ割り当てになるわけではない 今のコンパイラの多くはregisterを無視してるらしい
378 名前:デフォルトの名無しさん mailto:sage [2017/02/08(水) 20:21:15.44 ID:6Dg3FALd.net] >>369 それ面白いけど実装がめちゃくちゃ大変だし、そもそもメリットないだろ
379 名前:デフォルトの名無しさん [2017/02/08(水) 20:38:12.66 ID:Z1e//95W.net] C++では次のC++17(今年出る予定)から機能削除、かつ将来のためにキーワードは予約だよ
380 名前:デフォルトの名無しさん mailto:sage [2017/02/08(水) 20:41:11.49 ID:039KZGQ+.net] register int a = 0; int *b = &a; これで b が a を格納してるCPUレジスタをポイントすると、 b++ とかした時に、どのレジスタを指すの? て話で困るんじゃないか。 int& b = a; という具合に参照で受ければ何とか…。
381 名前:デフォルトの名無しさん [2017/02/08(水) 20:43:52.35 ID:Z1e//95W.net] >>373 そんなの普通の変数だって未定義動作じゃん
382 名前:デフォルトの名無しさん mailto:sage [2017/02/08(水) 20:47:07.07 ID:6Dg3FALd.net] >>373 > b++ とかした時に、どのレジスタを指すの? て話で困るんじゃないか。 ax 指してたら bx を指すようになる dx 指してる時に b++ したらお約束の鼻から悪魔でいいだろ
383 名前:デフォルトの名無しさん mailto:sage [2017/02/08(水) 21:02:48.15 ID:x9WXoVQQ.net] なんでx86前提なんだよ 実際出来ないんだから議論の意味ないが、出来たとしても実装依存だろ
384 名前:デフォルトの名無しさん mailto:sage [2017/02/08(水) 22:06:39.93 ID:r8a3b7fC.net] >>374 おい馬鹿 int aho{}; int *p{&aho}; p++; これが未定義動作などと規格のどこに書いてある?
385 名前:デフォルトの名無しさん mailto:sage [2017/02/08(水) 22:23:33.67 ID:t4XC3Oio.net] p++ が動作未定儀か否かとは関係ない話だと思うが ポインタの指し先を求めず、ポインタの演算と差分 int a; int* p = &a; int* q = p + 1; q-p; で 実体の要素数+1 までは正しく差分が取れることを保障している ってどっかであった記憶
386 名前:デフォルトの名無しさん [2017/02/09(木) 02:31:40.69 ID:lnTHGhne.net] >>377 >>378 んなこた
387 名前:知っとるわ。どのレジスタを指すのかって言ってんだからポインタの先を参照する事前提だろ? そうじゃなきゃ単に無理やり割り当てたアドレスに+1にすればいいだけ。指し示す先に何があるかなんて関係ない。 [] [ここ壊れてます]
388 名前:デフォルトの名無しさん mailto:sage [2017/02/09(木) 03:48:37.73 ID:WRm++DjL.net] int i; int *ip=&i; ip+1はほんとにあるんかい? いやあるんだろうけどw
389 名前:デフォルトの名無しさん mailto:sage [2017/02/09(木) 06:05:01.98 ID:4sYnDBFk.net] 同等なレジスタを32個とか内蔵してて番号で区別する RISCチップだと不自然でもない気がしてきた。
390 名前:デフォルトの名無しさん mailto:sage [2017/02/09(木) 06:22:52.94 ID:ZHuRANtU.net] >>379 >>374 については? 普通の変数だって(指し先参照してないのに)未定儀動作とか言っちゃってるんですけど
391 名前:デフォルトの名無しさん mailto:sage [2017/02/09(木) 06:42:00.30 ID:RO+sEjyT.net] >>376 > なんでx86前提なんだよ お前の言うように実装依存なんだから例に決まってるだろ 68k なら d0, d1, ... ってもっと分かりやすいし他のプロセッサでも適当に決めりゃいいだけ てか、ネタに突っ込むならもっと面白い奴にしてくれ
392 名前:デフォルトの名無しさん mailto:sage [2017/02/09(木) 07:01:49.92 ID:RO+sEjyT.net] >>381 for(register int* r = &_r0; r < &_r32; r++){ *r = 0; } で、全レジスタがクリアできるとか便利かも で r が _r3 辺りに割り当てられててバグるところまでがセットだよな w
393 名前:デフォルトの名無しさん mailto:sage [2017/02/09(木) 12:57:20.22 ID:DuGTx+Z0.net] レジスタってそう多くないから別に… SPARCのレジスタウィンドウ合わせて128個とかならまあ
394 名前:デフォルトの名無しさん mailto:sage [2017/02/09(木) 14:24:27.76 ID:ZeoIDdik.net] つ ゼロページレジスタ
395 名前:デフォルトの名無しさん mailto:sage [2017/02/09(木) 16:59:44.90 ID:m9bylyVb.net] register int a = 0; int *b = &a; としたとき、Cではアドレスが取れないって話だったが、C++では取れる が、次期規格でregisterは無視されるようになる・・・って話だよね ま、仮にアドレスを取ったとしても何も問題ないように思うが というのも、CPUの演算は通常レジスタに対してしかできないし 一方でアドレスが取れるのはメモリにあるものだけなので 普通の変数もレジスタとメモリの間を最新の値が行ったり来たりしているのが通常で コンパイラは矛盾が起きないようなコードを吐き出すように出来ている だからregister指定要らないよねって話になってるだろう そもそも、可能な限りレジスタに配置する、というのがあいまいで レジスタは有限個なのでregister指定しても必ずしもレジスタのみに配置されるかどうか 分からないしCPUにもよる ここで、アドレスを取ったらレジスタのみに配置することが出来ないのだから register指定であっても、「可能な限りレジスタに配置する」が出来ないということで 普通の変数扱いということで問題ない
396 名前:デフォルトの名無しさん mailto:sage [2017/02/09(木) 17:03:46.90 ID:XjHAaCWU.net] >次期規格でregisterは無視されるようになる・・・って話だよね 文盲は去れ 長文で荒らすな
397 名前:デフォルトの名無しさん mailto:sage [2017/02/09(木) 17:18:48.08 ID:m9bylyVb.net] >372 名前:デフォルトの名無しさん[] 投稿日:2017/02/08(水) 20:38:12.66 ID:Z1e//95W [1/2] >C++では次のC++17(今年出る予定)から機能削除、かつ将来のためにキーワードは予約だよ は噓ということ?
398 名前:デフォルトの名無しさん mailto:sage [2017/02/09(木) 17:24:14.08 ID:WRm++DjL.net] registerってのを使わなきゃいんでないのw
399 名前:デフォルトの名無しさん mailto:sage [2017/02/09(木) 17:31:18.93 ID:aUQtcCRM.net] 規格なんて知らんがレスから想像するとこうじゃないのか? 今の規格は「可能ならレジスタに割り当てろ」で、実際のコンパイラは無視してるのが多い 事実上機能してないから次期規格では仕様変えてregister変数やめる
400 名前:デフォルトの名無しさん mailto:sage [2017/02/09(木) 17:50:34.94 ID:55oKC5Ju.net] C++ではすでにregisterは無視されてて、17からはエラーになるってことだろ
401 名前:デフォルトの名無しさん [2017/02/09(木) 18:47:17.89 ID:lnTHGhne.net] C++11の時点でdeprecatedになってて C++17で書いたらエラーになる キーワードはいつか規格で何かに再利用するかもしれないから予約したまま(ユーザーが関数名などに使用出来ないまま)。
402 名前:デフォルトの名無しさん [2017/02/09(木) 19:03:26.16 ID:QPpApk6a.net] https://www.youtube.com/watch?v=quIHgwuF6r4&sns=em
403 名前:デフォルトの名無しさん mailto:sage [2017/02/09(木) 20:05:28.75 ID:IuYXl6Zl.net] >>393 registerについては、再利用の可能性というより、混乱の元だから今後は誰も触れてくれるなってところかな。
404 名前:デフォルトの名無しさん mailto:sage [2017/02/09(木) 20:34:41.55 ID:wAatsUnZ.net] 今、キーワードとして問題ないからそのままにしておくってことだろ 一旦キーワードでなくしてしまうと将来また使いたくなった時に大混乱するから
405 名前:デフォルトの名無しさん mailto:sage [2017/02/09(木) 20:46:05.15 ID:WRm++DjL.net] C++17なんてもあるのか。 ついてけんわぁ
406 名前:デフォルトの名無しさん mailto:sage [2017/02/10(金) 12:36:17.18 ID:yPTk9ivW.net] register使うなら今のうち
407 名前:デフォルトの名無しさん mailto:sage [2017/02/10(金) 16:29:47.71 ID:gDFEqThI.net] C++17以降のregisterは、ガチャガチャチーン!とbeep音を鳴らします
408 名前:デフォルトの名無しさん mailto:sage [2017/02/11(土) 17:45:33.84 ID:B6KA1QDA.net] Mingwのgccでこんなのためしたら結構はやくなるのね。C++だと速度変わらんかったけど。 #include <windows.h> #include <stdio.h> int main(void) { register int i; DWORD t; t = GetTickCount(); for(i=0 ; i <100000000 ; i++); printf("%d\n",(int)(GetTickCount()-t)); return 0; }
409 名前:デフォルトの名無しさん mailto:sage [2017/02/11(土) 17:50:28.59 ID:o1zrWG0U.net] registerネタどんだけ続けるんだ
410 名前:デフォルトの名無しさん mailto:sage [2017/02/11(土) 18:02:59.72 ID:Ka66uAeU.net] >int main(void) { > register int i; 変数を先頭で宣言しないと精神の安定が保てない病気
411 名前:デフォルトの名無しさん mailto:sage [2017/02/11(土) 18:27:32.77 ID:2x1BPms4.net] っくっだらないとこでも叩いておかないと精神の安定が保てない病気
412 名前:デフォルトの名無しさん mailto:sage [2017/02/11(土) 18:51:03.55 ID:jl0P82O4.net] インデントや{}のスペース・改行でも自分のやり方と違うと喚きそうだなw
413 名前:デフォルトの名無しさん mailto:sage [2017/02/11(土) 19:53:33.79 ID:7HNC8OW9.net] >>404 違和感がでるよね。 会社でこれがうちのスタイルって強制され、それになじむと そうじゃないスタイルのものは気持ち悪いって感じるようになった >for(i=0 ; i <100000000 ; i++); 最近のコンパイラはまじめにやらないで、コンパイル時にiは使ってないあるね 処理省くニダってして実行コード生成してなさそうな気がするが。
414 名前:デフォルトの名無しさん mailto:sage [2017/02/11(土) 19:59:07.05 ID:nnf0vKBy.net] K&R2 あたりにあわせておけば問題ないのでは? というか,K&R2 から大幅に変えさせられるのは苦痛だな
415 名前:デフォルトの名無しさん mailto:sage [2017/02/11(土) 21:18:53.92 ID:vquAI+Jk.net] 21世紀にもなってK&Rとか何の冗談 変化が苦痛な老人はすっこんでて
416 名前:デフォルトの名無しさん mailto:sage [2017/02/11(土) 21:22:09.84 ID:e+WRwiZx.net] echo.2ch.net/test/read.cgi/tech/1193554741/
417 名前:デフォルトの名無しさん mailto:sage [2017/02/11(土) 21:51:35.00 ID:o1zrWG0U.net] 21世紀に相応しいスタイルを是非教えてくれ
418 名前:デフォルトの名無しさん mailto:sage [2017/02/11(土) 22:42:56.52 ID:2x1BPms4.net] 可能な限りC/C++使わない それが21世紀スタイル
419 名前:デフォルトの名無しさん mailto:sage [2017/02/11(土) 22:58:24.73 ID:nOWXV3w9.net] >>410 おいおい、でも、それが正しいな。
420 名前:デフォルトの名無しさん mailto:sage [2017/02/12(日) 02:53:21.48 ID:guRObziH.net] 正しいけど"可能な限り"の範囲がまだまだ足りない 組み込みの世界はC言語が強過ぎて未だにC++すら使えない環境がざらにあるしな
421 名前:デフォルトの名無しさん mailto:sage [2017/02/12(日) 08:33:11.98 ID:XNCDxJ48.net] >>407 C/C++ くらいなら,K&R2 に準拠にさせてよー C#, Java も,とはいわないからさー
422 名前:デフォルトの名無しさん [2017/02/12(日) 08:43:31.97 ID:MRPxQTsD.net] >>413 C++を入れるなよ
423 名前:デフォルトの名無しさん mailto:sage [2017/02/12(日) 10:10:03.29 ID:nF2JpTw9.net] 結局C言語で全て済んでしまうからね。他は趣味。はっきりわかんだね
424 名前:デフォルトの名無しさん mailto:sage [2017/02/12(日) 14:01:05.04 ID:XNCDxJ48.net] >>414 いっしょだよ,C++ も普通に K&R2 に似せて書くのが一番いい
425 名前:デフォルトの名無しさん mailto:sage [2017/02/12(日) 15:47:27.43 ID:CF268nsq.net] >>402 の「ブロック先頭で変数を定義するのは時代遅れ」ていう 指摘を受けての流れじゃないかな。 最初の使用の直前まで変数定義を遅らせることができる、 というC++での改良や、それを取り込んだC99以降で わざわざK&R2版の書き方に制限されるのは困るという話。 おそらく、K&R2に似たスタイルが良いという主張も 「新しく追加された便利機能は使った上でK&R風のスタイル」 という意図なんだと思う。
426 名前:デフォルトの名無しさん mailto:sage [2017/02/12(日) 15:59:10.19 ID:rZ/K+l3Q.net] >>400 はiの宣言を先に、tよりも先にすることで、何を試したのかってのをわかりやすくしてんだろ K&Rなんかにこだわるよりもこういうソースの方がいいわ
427 名前:デフォルトの名無しさん mailto:sage [2017/02/12(日) 17:25:00.92 ID:XNCDxJ48.net] >>417 当然だ
428 名前:デフォルトの名無しさん mailto:sage [2017/02/13(月) 00:11:12.09 ID:ebN6PGVD.net] 使う直前に変数を宣言してるとたまにgoto出来ないerrorが出るのが面倒くさい
429 名前:デフォルトの名無しさん mailto:sage [2017/02/13(月) 11:51:26.73 ID:M86uydzz.net] ブロックの違う同名変数の取り違えでトラブってるのを見てから 宣言位置が不揃いなのもよくないと思うようになった
430 名前:デフォルトの名無しさん mailto:sage [2017/02/14(火) 01:24:51.99 ID:xlM9Sf4d.net] それは宣言位置の問題じゃなくて、1ブロックが大き過ぎることが原因じゃないか?
431 名前:デフォルトの名無しさん mailto:sage [2017/02/14(火) 08:51:02.57 ID:SrPWZnE2.net] スコープ違う同名の変数を書いたら間違えた ↓ 宣言位置をスコープの先頭に揃えておけば俺はきっと気づけたんだ! これがバカの思考
432 名前:デフォルトの名無しさん [2017/02/14(火) 09:10:51.81 ID:MfKEp5BT.net] お前等が宣言位置を先頭に揃えておかなかったから俺が間違えたんだ とまでいかなければまだ許せる。
433 名前:デフォルトの名無しさん mailto:sage [2017/02/14(火) 09:11:22.01 ID:H0Zx0irg.net] スコープ違う同名の変数を書いたら間違えた ↓ 次から気をつけよう! ↓ またミス >>423 はこのタイプ
434 名前:デフォルトの名無しさん [2017/02/14(火) 09:16:00.91 ID:MfKEp5BT.net] 423じゃないが間違えたことないな どうやったら間違えるのか教えて欲しいくらい
435 名前:デフォルトの名無しさん mailto:sage [2017/02/14(火) 09:25:27.92 ID:he6YB8dM.net] 多分ブロックごとコピペしてたまたまエラーが出なかったんだろ
436 名前:デフォルトの名無しさん mailto:sage [2017/02/14(火) 09:37:58.47 ID:tRUBGDEd.net] 世の中には1関数が1000行を超える糞コードが存在するからな そんな糞コードに後から修正入れようとすると信じられないようなミスも起こる
437 名前:デフォルトの名無しさん mailto:sage [2017/02/14(火) 10:07:10.54 ID:H0Zx0irg.net] 関数の長さと糞さは別だな 無理に短くしてあちこち飛ぶコードの読みにくさったらありゃしない
438 名前:デフォルトの名無しさん [2017/02/14(火) 10:25:24.18 ID:ze+N1Rxh.net] 短いからといって読みやすいはとは限らないが、 長いと読みにくいのは確実なので無関係ではないな
439 名前:デフォルトの名無しさん mailto:sage [2017/02/14(火) 12:52:20.45 ID:8LvI494R.net] >>429 1行目と2行目で矛盾してるぞ
440 名前:デフォルトの名無しさん mailto:sage [2017/02/14(火) 15:01:49.07 ID:Y4N6R9g2.net] 短く を目標にはしないが、長いと どうしても何かの力を感じてw 短くしたくなるわなぁ
441 名前:デフォルトの名無しさん mailto:sage [2017/02/14(火) 15:19:01.37 ID:t9BEI7G/.net] 必死にprivate関数で小分けにしてた頃を思い出すわ 気にしなくなってprivate関数の存在価値がよく分からなくなった
442 名前:デフォルトの名無しさん mailto:sage [2017/02/14(火) 15:31:24.51 ID:Y4N6R9g2.net] privateとその長さは関係ないと思うが
443 名前:デフォルトの名無しさん mailto:sage [2017/02/14(火) 17:04:37.50 ID:lntB2yLX.net] 俺も429派かなぁ 特に再利用するようなものでもないのに関数に小分けにしてもあまり意味がないし 仮に1000行あったとしても、制御構造が単純で上から下へ逐次実行するだけだったり プログラムの読みにくさと関数の長さは根本的に関係ないと思う 関数の長さに関係なく単純に、 仕様が複雑で、ややこしいことしている箇所は、やはりややこしい 難しいアルゴリズムを使っている個所は、やはり難しい
444 名前:デフォルトの名無しさん mailto:sage [2017/02/14(火) 17:07:50.38 ID:lntB2yLX.net] そうはいっても100行を超える関数はさすがに書いたことないけどな クラスビューとかでジャンプできなくなるから作業性に問題が出る
445 名前:デフォルトの名無しさん mailto:sage [2017/02/14(火) 17:12:21.40 ID:lntB2yLX.net] 100行と書いたけど、それは1000行のまちがいだ 100行を超える関数は普通に書くことがあるな 新しいC++になってからラムダが関数内関数の代わりに使えるようになったから こういったものを駆使すると長い関数を書いても比較的に問題が出にくくなったってのはある メソッドにするとクラス空間が汚れるから関数内関数の方がよい場合も多々
446 名前:デフォルトの名無しさん mailto:sage [2017/02/14(火) 19:47:15.52 ID:vv2eSSm9.net] 100行超える関数はほとんど書かないけど、 100行超えるコメントはしょっちゅう書くな。
447 名前:デフォルトの名無しさん mailto:sage [2017/02/15(水) 01:17:06.93 ID:xbLGAB7Z.net] 名付けに困らないくらいの単位で処理を纏めて上にポイだな 無名ネームスペース大活躍 再利用しなくても処理を分けとくとバグを潰しやすいし
448 名前:デフォルトの名無しさん mailto:sage [2017/02/16(木) 04:06:20.95 ID:6VkTpxSR.net] ラムダ 入門 で検索しても簡単なサイトが見つかりません。 どこか良いサイトか書籍はありませんか。
449 名前:デフォルトの名無しさん mailto:sage [2017/02/16(木) 04:13:34.86 ID:0dItl/ZH.net] 入門しなきゃならん奴が使うもんじゃない
450 名前:デフォルトの名無しさん mailto:sage [2017/02/16(木) 04:38:21.71 ID:6VkTpxSR.net] https://cpplover.blogspot.jp/2009/11/lambda.html?m=1 ありました。 d.hatena.ne.jp/gintenlabo/touch/20130516/1368711542 ここ2つでまずは頑張ってみます。
451 名前:デフォルトの名無しさん mailto:sage [2017/02/16(木) 12:45:23.20 ID:SkhlZoRn.net] よくわからんもの ラムダ式、関数オブジェクト
452 名前:デフォルトの名無しさん mailto:sage [2017/02/17(金) 04:01:51.58 ID:/gNkD5d3.net] #include <iostream> using namespace std; int main() { unsigned char aa=0x31; cout << hex<<aa <<endl; return 0; } なんで 31 と表示されないのでしょう
453 名前:デフォルトの名無しさん mailto:sage [2017/02/17(金) 05:25:27.96 ID:Z2r3IJRX.net] たぶん 1 が表示されるでしょ。 aa が char だから出力ストリームでは文字が出る。 数値を出したければ aa を int で定義するか、 cout のところで int にキャストしてやらないと。
454 名前:デフォルトの名無しさん mailto:sage [2017/02/17(金) 07:07:08.11 ID:39ud/5Wb.net] >aa が char だから出力ストリームでは文字が出る 因果関係がよくからないのですがcharだとなぜ文字がでるの?
455 名前:デフォルトの名無しさん mailto:sage [2017/02/17(金) 07:22:25.14 ID:fOTzzkTG.net] >>446 渡した値の型によって、それをどう表示するかが異なるように作られているから。 printfという関数で出力する場合は、出力したい値のほかにそれをどういう形式で出力するかという情報を別に与えていたけど、iostreamでは、型で自動的に処理してくれる。
456 名前:デフォルトの名無しさん mailto:sage [2017/02/17(金) 07:52:16.70 ID:+UDZhFA4.net] uint8_tとか使ってるとき嵌るんだよなぁ。
457 名前:デフォルトの名無しさん mailto:sage [2017/02/17(金) 07:53:27.01 ID:Z2r3IJRX.net] 「C++では引数の型や個数が異なる同じ名前の関数をいくつも定義できて 引数の型や個数に応じた別々の動作にできる」 「関数引数の変数値が(Cとは異なり)自動的にはintに格上げされない」 くらいしか説明の文面を思いつかないけど、我ながら分かりにくいな。 coutに対する<<演算子(を実行する関数)が、 charの引数に対して
458 名前:ヘ文字を、intの引数に対しては数値を 出力するよう上手いこと作られている。 ってのは「昔からそう決まっとる」式の押し付けがましい感じだし。 [] [ここ壊れてます]
459 名前:デフォルトの名無しさん mailto:sage [2017/02/17(金) 15:18:41.50 ID:/gNkD5d3.net] >>445 ども 書いた後、すぐintでやったらわかった。 "<<" 系の入出力演算子とビットシフトの問題も同じ理由か。
460 名前:デフォルトの名無しさん mailto:sage [2017/02/17(金) 17:04:51.60 ID:xoJSqgdl.net] VC++の質問です。 フォームのコントロール(ボタンなど)をアンマネージクラスに保持する方法が知りたいです。 // コンストラクタの引数より、ラベルのコントロールをprivateに保存し、setLabelTextでラベルのテキストを変更するクラス class LineController { private: System::Windows::Forms::Label^* label_; public: LineControllerSystem::Windows::Forms::Label^% label); void setLabelText(System::String^ str); // label_のTextに引数strを設定。 }; 最初に表示されるフォームのコンストラクタにて上記のクラスをnewし、そのクラスインスタンスをアンマネージクラスのシングルトンに保存しています。 シングルトンに保存直後に、シングルトン経由でsetLabelTextメソッドを実行した場合は正常label_のTextを変更可能でした。 しかしボタンクリックイベント内にて、同様にシングルトン経由でsetLabelTextをコールするとlabel_へアクセスしたタイミングで「オブジェクト参照がオブジェクト インスタンスに設定されていません。」が発生してしまいます。 本エラーを回避するにはどのような手法をとればよいでしょうか? 追跡参照(%)などを調べているのですが現状解決の糸口が見えません。 シングルトン及び上記LineController自体はできればマネージにしたくないです。。。
461 名前:デフォルトの名無しさん mailto:sage [2017/02/19(日) 11:23:25.68 ID:2DCCXMeS.net] C++の話題そのものではないのですが バブルソートとか初歩的なアルゴリズム を優しく解説している書籍はありませんか。 Amazon見てるのですがもう少し情報がほしいです。
462 名前:デフォルトの名無しさん mailto:sage [2017/02/20(月) 01:05:36.35 ID:aWzwD2VT.net] >>452 ピタゴラスイッチでバブルソートやクイックソートの概念をグラフィカルに紹介してたよ。 それはさておき、本屋の店頭でアルゴリズムとかデータ構造とかがタイトルに含まれる本をパラパラめくって分かり易いのを探すといいかと思う。
463 名前:デフォルトの名無しさん mailto:sage [2017/02/21(火) 00:15:43.57 ID:OFTvUoLj.net] とあるOSSをとあるシステムに移植していて、 Intel(2013)やGNU(4.9系)ではコンパイルできるのに そのシステム専用コンパイラではコンパイルできずエラーになります。 ソースコードやヘッダファイルを修正すれば通るだろうというのは経験的にわかっているのですが どこを修正したらよいかというのを見つけ方がわからないのですが見つけ方のコツみたいなのはあるのでしょうか?
464 名前:デフォルトの名無しさん mailto:sage [2017/02/21(火) 00:32:08.81 ID:fcoMqi2n.net] エラーメッセージの意味を考えろ
465 名前:デフォルトの名無しさん mailto:sage [2017/02/21(火) 01:18:37.30 ID:9fQxfYbZ.net] >>454 エラーメッセージを見ないことには回答のしようがないと思うぞ まぁ、専用のコンパイラという言い回しから察するに、C++03程度しかサポートしていない古いコンパイラでも使ってるんじゃないか? エラーが出ている行の周辺でC++11以降の言語機能か、ライブラリでも使ってんじゃね?
466 名前:デフォルトの名無しさん mailto:sage [2017/02/21(火) 01:18:57.64 ID:bFUDo/lz.net] >>454 ともかく、 そのシステム専用コンパイラ提供しているところに、世界標準のIntel(2013)やGNU(4.9系)ではコンパイル 出来るのにお前のものではできないから出来るようにしたコンパイラをよこせと激しくクレーム
467 名前:デフォルトの名無しさん mailto:sage [2017/02/21(火) 01:32:37.44 ID:bFUDo/lz.net] >>456 C++11いっぱいのコードをC++03に修正するって大変そうだな
468 名前:デフォルトの名無しさん mailto:sage [2017/02/21(火) 06:31:57.51 ID:OFTvUoLj.net] >>456 >>457 メッセージは 「オーバーロードされた関数"HOGE"のインスタンスが引数リストと一致しません。」 みたいな感じです 一応C++11準拠でGNU4.9一部互換とされてるコンパイラですが。。。
469 名前:デフォルトの名無しさん mailto:sage [2017/02/21(火) 08:12:09.46 ID:9fQxfYbZ.net] >>459 HOGEが想定している引数型と実際に渡している引数の型を確認 違うやつが犯人 これ以上は情報少なすぎてわからん
470 名前:デフォルトの名無しさん mailto:sage [2017/02/21(火) 15:33:32.84 ID:rWOcc73c.net] 一般論としてどういうことに注意したらいいですかって質問じゃなくて、具体的に解決してもらいたいってことなのかよw
471 名前:デフォルトの名無しさん mailto:sage [2017/02/21(火) 22:19:07.17 ID:OFTvUoLj.net] >>460 intelコンパイラで作ったオブジェクトをnmコマンドで中見て こうあるべきという形がわかったんであとは頑張ってみる
472 名前:デフォルトの名無しさん mailto:sage [2017/02/21(火) 22:24:52.45 ID:qEEiXXQS.net] HOGEの中にHAGEが紛れ込んでるんだな
473 名前:デフォルトの名無しさん mailto:sage [2017/02/22(水) 07:28:41.35 ID:F7TE97aZ.net] >>453 有難うございます。 田舎ですので大きな書店には距離があります が、行ってみます。
474 名前:デフォルトの名無しさん mailto:sage [2017/02/22(水) 11:11:49.24 ID:T1tKwjPz.net] >>459 テンプレートが悪さしてるか const の取りこぼしかデフォルト引数のミスが起きているとエスパー
475 名前:デフォルトの名無しさん mailto:sega [2017/02/22(水) 19:03:10.40 ID:7bpb3LbA.net] printf("%s",buf); と fputs(buf,stdout); どっちが好き?
476 名前:デフォルトの名無しさん mailto:sage [2017/02/22(水) 19:20:15.64 ID:JmFr9wbV.net] 違う処理のコードを並べてどっちと言われても
477 名前:デフォルトの名無しさん mailto:sage [2017/02/22(水) 19:49:35.49 ID:OuXxGo6B.net] >>467 みたいな人が居るのでprintfかな
478 名前:デフォルトの名無しさん mailto:sage [2017/02/22(水) 20:00:39.94 ID:G8P7P0/x.net] どっちも最後に使ったの20年ほど前かな
479 名前:デフォルトの名無しさん mailto:sage [2017/02/22(水) 21:09:01.14 ID:T1tKwjPz.net] puts とか使ったことないわ
480 名前:デフォルトの名無しさん mailto:sage [2017/02/22(水) 21:30:22.88 ID:Z0Pf8P/J.net] >>469 ログ出力・エラー出力がメインでstdoutはあんまり使わないよな
481 名前:デフォルトの名無しさん mailto:sage [2017/02/22(水) 21:36:43.56 ID:3nEefUGO.net] putsは改行してくれるんで好きだな。fputsも。
482 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/02/22(水) 21:39:49.82 ID:mKcPOHkg.net] >>472 fputsは改行を追加しない
483 名前:デフォルトの名無しさん mailto:sage [2017/02/22(水) 21:51:09.45 ID:3nEefUGO.net] >>473 あ そうだった。 すまん
484 名前:デフォルトの名無しさん mailto:sage [2017/02/23(木) 00:12:45.93 ID:oHheANLP.net] 細かいのを大量に出したいときはprintfは遅い
485 名前:デフォルトの名無しさん [2017/02/23(木) 18:17:55.29 ID:2nyak89s.net] class CL{ CL(int _d, string _s) : d(_d), s(_s) { } public: int d; string s; }; int _tmain(int argc, _TCHAR* argv[]) { CL *cl = new CL(555, "a");←ここでエラー。なんで?
486 名前:デフォルトの名無しさん [2017/02/23(木) 18:23:14.57 ID:sZtROie8.net] >>476 こんすとらくたがprivateだから
487 名前:デフォルトの名無しさん [2017/02/23(木) 18:23:56.57 ID:2nyak89s.net] そういうことかあ あざす
488 名前:デフォルトの名無しさん mailto:sage [2017/02/23(木) 21:15:37.70 ID:JF3nU8GT.net] 生成出来ないクラスってやつね。
489 名前:デフォルトの名無しさん mailto:sage [2017/02/23(木) 21:50:10.15 ID:33+Wu0JT.net] >>479 friend なクラスからしか生成しないようにするとかはあるね
490 名前:デフォルトの名無しさん mailto:sage [2017/02/23(木) 21:52:15.77 ID:JF3nU8GT.net] はい そゆ事。
491 名前:デフォルトの名無しさん mailto:sage [2017/02/23(木) 21:53:15.53 ID:0FbQfq3V.net] staticメソッドで生成するって形の時に使うことが多い singletonとか
492 名前:デフォルトの名無しさん mailto:sage [2017/02/23(木) 22:20:39.38 ID:v0zRNZ3l.net] ctorはpri.でメンバーはpub.って どういうことなんだ?
493 名前:デフォルトの名無しさん mailto:sage [2017/02/23(木) 22:26:42.14 ID:I6Uc1mEc.net] 一つ前のレスも読めない文盲
494 名前:デフォルトの名無しさん mailto:sage [2017/02/23(木) 22:44:21.27 ID:SD8t1ALL.net] 質問 C/C++でランタイムで現在のメモリの状態 とくにプロセスが使える余っているメモリの量って調べ方はありますか?
495 名前:デフォルトの名無しさん mailto:sage [2017/02/24(金) 08:45:12.70 ID:SswDvM4l.net] 環境すら書かないと言うことは (実質)環境非依存での方法を聞いてるんだろうな?
496 名前:デフォルトの名無しさん [2017/02/24(金) 08:54:02.15 ID:See/JzpM.net] そんなもん無いけどな
497 名前:デフォルトの名無しさん mailto:sage [2017/02/24(金) 09:53:13.79 ID:0sr6h+Re.net] 失敗するまでmallocやnewを繰り返せばええんや
498 名前:デフォルトの名無しさん [2017/02/24(金) 10:43:32.63 ID:See/JzpM.net] >>488 Linuxじゃ失敗しないよ
499 名前:デフォルトの名無しさん [2017/02/24(金) 10:53:37.11 ID:See/JzpM.net] もたろん割り当てるアドレス空間自体が足りなくなったとか、予め上限を設定しておいたとかいうケースは覗いてな
500 名前:デフォルトの名無しさん mailto:sage [2017/02/24(金) 11:09:14.16 ID:9xRtAprE.net] 16byteのメモリを積んだコンピュータで32byteのメモリ確保したら失敗するよね。 それはわかる。 逆に16byteのメモリを積んだコンピュータで7byteのメモリを二回確保して最初の7byteを開放した後に8byteのメモリを確保したら失敗するの?
501 名前:デフォルトの名無しさん mailto:sage [2017/02/24(金) 11:41:21.86 ID:KhjrQy0g.net] 基本的にでっかくメモリ確保というプログラムは作った事がないな。 今はSTLでほげほげ追加してくイメージ。
502 名前:デフォルトの名無しさん [2017/02/24(金) 11:47:17.85 ID:See/JzpM.net] >>491 >16byteのメモリを積んだコンピュータで32byteのメモリ確保したら失敗するよね。 そうとは限らない。一般的なLnuxの環境依存ではmallocを搭載メモリ以上行っても失敗しない swap含めて1GBしか積んでいない環境で2GB分malloc可能。確保した領域に書き込んだタイミングで記憶する領域が足りなくなったら色々なプロセスが殺される。oom killerと言われてるもの。 > 逆に16byteのメモリを積んだコンピュータで7byteのメモリを二回確保して最初の7byteを開放した後に8byteのメモリを確保したら失敗するの? 実装による。現代的なコンピューターではページ単位(4KB)とかでカーネルからプロセスへすきなアドレスへメモリを割り当てられるから物理的なアドレスが連続している必要はない。 プロセス内に連続したアドレス空間が残っていない場合は失敗する
503 名前:デフォルトの名無しさん mailto:sage [2017/02/24(金) 11:52:16.13 ID:NAh96dM2.net] 仮想メモリというしくみで色々やってくれるようになって キャパの限界付近ではややこしくなった印象
504 名前:デフォルトの名無しさん mailto:sage [2017/02/24(金) 12:48:55.46 ID:KhjrQy0g.net] 家鯖は6G積んでるけどそれぐらいは行けるね。 てかkvmやってると、9Gコミットされてるもん。
505 名前:デフォルトの名無しさん mailto:sage [2017/02/24(金) 15:10:06.50 ID:CcmE3pWB.net] >>488 それスワップエリアのサイズ計ってるだけ
506 名前:デフォルトの名無しさん mailto:sage [2017/02/24(金) 15:25:25.94 ID:nwaeFCKh.net] winならGetProcessMemoryInfoなど
507 名前:デフォルトの名無しさん mailto:sage [2017/02/24(金) 17:26:32.84 ID:9xRtAprE.net] >>493 > 物理的なアドレスが連続している必要はない なるほど、長年の疑問が解消した。 493の読解力に感謝。
508 名前:デフォルトの名無しさん [2017/02/24(金) 18:02:34.91 ID:See/JzpM.net] >>498 望む答えだったみたいで良かったわ 熱があって若干朦朧とした頭で読み返さずに書き込んだから今読み返すと誤字とか予測変換で要らない単語入ってたり(一般的なLinux環境)とか、カッコの位置が違う(4KBとかの部分)とかあったけど。
509 名前:デフォルトの名無しさん mailto:sage [2017/02/24(金) 18:52:48.08 ID:dfRROZm/.net] 環境依存ならPostMessageのエラーコードかな 俺はあんま理解してないけど
510 名前:デフォルトの名無しさん mailto:sage [2017/02/24(金) 19:06:57.61 ID:+aOqx8nq.net] Win32なら信頼のPostMessageだな
511 名前: ◆QZaw55cn4c mailto:sage [2017/02/24(金) 22:16:12.34 ID:4ewDjGBZ.net] またその話題ですか‥
512 名前:デフォルトの名無しさん mailto:sage [2017/02/24(金) 23:03:49.77 ID:TLhS+9k8.net] はよ10年前のソース出せよ
513 名前:デフォルトの名無しさん mailto:sage [2017/02/24(金) 23:06:00.45 ID:nwaeFCKh.net] i.imgur.com/OwlfgGw.jpg
514 名前:デフォルトの名無しさん mailto:sage [2017/02/25(土) 07:21:27.70 ID:98TUEskp.net] なんで2分ちょいで出てくるかね。
515 名前:デフォルトの名無しさん mailto:sage [2017/02/25(土) 08:14:13.74 ID:QoR/O5Qa.net] 自演
516 名前:504 mailto:sage [2017/02/25(土) 08:21:08.89 ID:Jm21gNIW.net] >>503 ≠ >>504 だ。すまんなw
517 名前:デフォルトの名無しさん mailto:sage [2017/02/26(日) 18:42:59.30 ID:stmjd5mD.net] 味噌県のクセにコーミソース以外のソースを使う非国民は去れ
518 名前:デフォルトの名無しさん mailto:sage [2017/03/06(月) 07:57:48.79 ID:NqblWJNK.net] #define ChannelBlend_SoftLight(A,B) ((uint8)((B < 128)?(2*((A>>1 )+64))*((float)B/255):(255-(2*(255-((A>>1 )+64))*(float)(255-B)/255)))) このマクロの (2*((A>>1 )+64)) この部分なんですが なんで(A+128)じゃないんですかね?
519 名前:デフォルトの名無しさん mailto:sage [2017/03/06(月) 08:21:33.22 ID:1XvIZqGa.net] 最初の人がコピペで作ったんでしょ。+128に定義し直してるのもあるよ
520 名前:デフォルトの名無しさん mailto:sage [2017/03/06(月) 08:30:32.82 ID:cJfBjMIV.net] Aが奇数のときの動作が違うね
521 名前:デフォルトの名無しさん mailto:sage [2017/03/06(月) 10:33:08.69 ID:NqblWJNK.net] A、Bにはuint8を想定してますから、一瞬オーバーフローの関係かなとも思いましたが そんなことはなく、特に深い意味はなさそうですね ありがとうございます
522 名前:デフォルトの名無しさん mailto:sage [2017/03/13(月) 00:19:03.26 ID:ZWBqluXH.net] 仮想関数をオーバーライドするときはどう書くのがいい作法? void vf() virtual void vf() virtual void vf() override void vf() override
523 名前:デフォルトの名無しさん mailto:sage [2017/03/13(月) 06:06:33.92 ID:IkDDkkqX.net] ハゲ先生によると最後の void vf() override が良いみたい。 『プログラミング言語C++ 第4版』p.592 加えてoverride指定の不整合をチェックするコンパイラオプションだね。 GCCのVersion 5から使える -Wsuggest-override とか。 他のコンパイラについては知らん。
524 名前:デフォルトの名無しさん mailto:sage [2017/03/13(月) 10:43:38.74 ID:Kr7xjXLG.net] デストラクターに付けてる人はあんま見たこと無いな class Derived : Base { public: ~Derived() override {} };
525 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/03/13(月) 20:30:08.38 ID:VNPYsRzK.net] Bcc55でtypeofを実現するのは不可能なのかな?
526 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/03/13(月) 20:57:04.03 ID:VNPYsRzK.net] 古いコンパイラを使ってる人居る? コンパイラの名前教えて下さい。
527 名前:デフォルトの名無しさん mailto:sage [2017/03/14(火) 23:30:09.48 ID:wzywZVIy.net] 老人がカセットテープデッキ求めたり 熟女モノのエロ本()を求めるような感じ?
528 名前:デフォルトの名無しさん mailto:sage [2017/03/15(水) 01:04:07.22 ID:R2Ueow1p.net] 古いコンパイラと自覚しつつも使ってるような人はこのスレには来ないだろ 時代遅れの遺物の話じゃ通じないし
529 名前:デフォルトの名無しさん mailto:sage [2017/03/17(金) 11:46:00.03 ID:pwo5j4El.net] 何でA、Bを()しないんだ?
530 名前:デフォルトの名無しさん mailto:sage [2017/03/25(土) 21:37:15.77 ID:IRaGixDk.net] いまだに関数マクロ使ってるようでは ()したところで五十歩百歩
531 名前:デフォルトの名無しさん mailto:sage [2017/03/25(土) 22:37:56.47 ID:9zWIhzFx.net] >>460 >>465 宣言とかいろいろ確認してやっぱソースはおかしくないよねってことで サポートに調べてもらったら理由はわからないけど正しく動作する修正方法がわかったって連絡があって 最終的には詳細は書けないけどコンパイラのバグだった
532 名前:デフォルトの名無しさん mailto:sage [2017/03/26(日) 08:58:38.45 ID:4rESVRzB.net] ここはお前の日記を垂れる場所じゃない 「サポートによるとコンパイラのバグだった」で済むのに アレやってコレやってを書くな低能
533 名前:デフォルトの名無しさん mailto:sage [2017/03/27(月) 10:03:34.57 ID:wSWIgauQ.net] 事後報告あると参考になっていいんだけどな 今回は本人以外に状況がわからないから事後報告されてもw
534 名前:デフォルトの名無しさん mailto:sage [2017/03/30(木) 03:06:01.35 ID:6sTQLdA2.net] codepad.org/KMQH3TsZ ポインタをメンバに持たせた場合のget/setの書き方が分かりません getの方は、ポインタを返すときに返した先で値を変えられないようにconstを付けたのですが、 sizePlus10のような関数を呼びたい場合に、const_castを付けて呼ぶことになってしまいました 値の変更をするのでsetを通してやるのが良いと思うのですが、何か良い書き方ありますか? また、setの方は、一括で設定させることはできるのですが、 data->id、data->sizeの値を個別に設定したい場合、何か良い書き方はありますか? コメントの部分のようにsetメンバ関数を何個も書く方法しか思いつきません
535 名前:デフォルトの名無しさん mailto:sage [2017/03/30(木) 07:50:43.79 ID:GtG5BmiK.net] getDataの結果を修正したいのだから 杓子定規にgetDataの戻りにconst付けるのを止めればいいのではないか そう言えばC++17(ドラフト)もstring::dataの戻りが非constに修正されたような
536 名前:デフォルトの名無しさん mailto:sage [2017/03/30(木) 08:08:59.00 ID:KJlpKUaR.net] memcpy w
537 名前:デフォルトの名無しさん mailto:sage [2017/03/30(木) 10:48:22.67 ID:JHpE2Dpf.net] >>525 一般論として形でただ覚えるのではなくて意味を理解しよう 理解があやしいから設計の一貫性がなく混乱してるようにみえる ・Dataをポインタで所有するのはなぜ ・ゲッター/セッターを使ってアクセスするのはなぜ ・ゲッターで返す値にconstをつけるのはなぜ ・sizePlus10がData*を受けとるのはなぜ MyClassの設計方針にあわせるならsizePlus10をDataではなくMyClassを受けとるようにして void sizePlus10(MyClass & mc) { Data newdata = { mc.getData()->id, mc.getData()->size + 10 }; mc.setData(newdata); } あるいは別の関数を作って void MyClassSizePlus10(MyClass & mc) { Data newdata = *mc.getData(); sizePLus10(&newdata); mc.setData(newdata); } これが変だとか非効率だとか思うなら MyClassの設計が要求にあってないのでそっちを変更する
538 名前:デフォルトの名無しさん mailto:sage [2017/03/30(木) 20:11:34.52 ID:irpIFLVN.net] >>528 おまえは質問の意図を理解しよう >>525 そのsetgetでいいんじゃない?ただそのgetは俺だったらreferにするな ついでにsetget両方使えるようにdata* operator->()みたいなの実装かな。というかむしろそっちでアクセスする方向にするな あとはattachdetach作っておいてm_dataを置換できるにようにしちゃうな その手のスマートポインタは至るとこで使われてるからこんなとこで聞かずにどっかのライブラリの参考にしたら? メンバのコピーはpragma pack1でstructしておいてmemcpy
539 名前:デフォルトの名無しさん mailto:sage [2017/03/30(木) 23:27:09.74 ID:O3+3nsIM.net] >>529 >メンバのコピーはpragma pack1でstructしておいてmemcpy それをすると何がいいことあるのか?
540 名前:デフォルトの名無しさん [2017/03/30(木) 23:45:25.72 ID:s+CP+YQd.net] こういえクソみたいな方法を自慢気に語り出す奴が居るところかC++の最もクソな所だよね
541 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/03/30(木) 23:51:55.55 ID:2hi+y029.net] デフォルトコピーコンストラクターとか構造体代入とか知らないんだろう。
542 名前:デフォルトの名無しさん mailto:sage [2017/03/31(金) 00:14:17.76 ID:5j4NF4+Z.net] >>532 >構造体代入とか知らないんだろう ほうほう、それは何ですか?
543 名前:デフォルトの名無しさん mailto:sage [2017/03/31(金) 01:59:49.12 ID:OFYzpq31.net] やべえなおい糞コードの臭いがプンプンしやがるぜ
544 名前:デフォルトの名無しさん mailto:sage [2017/03/31(金) 02:09:29.70 ID:DQgqVTGo.net] >>526-529 ありがとうございます 今まではとりあえずget/setを書いてgetにはconstを付けとけば良いみたいな認識でしたが、 想定されるクラスの使われ方に合わせて適宜変更するべきでした MyClassのようなget/setの分け方をすると、 sizePlus10のような関数やsetで不便になってしまうので、 constを付けないget/set共用のものにしてそれを通してアクセスさせるのが適切でした ( getData()でアクセスする場合、Data * const getData() const { /**/ } みたいな ) とても参考になりました
545 名前:デフォルトの名無しさん mailto:sage [2017/03/31(金) 11:52:48.85 ID:xItn/dk+.net] >>531 くそじゃない方法をおしえて
546 名前:デフォルトの名無しさん mailto:sage [2017/03/31(金) 12:09:56.69 ID:c13jjk6+.net] C#じゃないからないでしょ
547 名前:デフォルトの名無しさん [2017/03/31(金) 13:26:56.75 ID:CbPadW0u.net] >>536 コピーは=使え というだけの話
548 名前:デフォルトの名無しさん mailto:sage [2017/03/31(金) 13:38:11.94 ID:2wgHKgmk.net] >>529 > メンバのコピーはpragma pack1でstructしておいてmemcpy これ俺も理由知りたい
549 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/03/31(金) 17:24:06.64 ID:tvggMnLQ.net] typedef struct MY_STRUCT { int ch; } MY_STRUCT; MY_STRUCT a,b; a.ch = 0; b = a; //代入できる
550 名前:デフォルトの名無しさん mailto:sage [2017/03/31(金) 19:17:35.19 ID:Xv9Etv1i.net] >>529 > おまえは質問の意図を理解しよう なんか無駄に上から目線だなぁ って思ったら > メンバのコピーはpragma pack1でstructしておいてmemcpy 単なる老害だったでござる
551 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/03/31(金) 19:19:25.80 ID:tvggMnLQ.net] 構造体の代入ができなかったのは大昔のことだ。
552 名前: ◆QZaw55cn4c mailto:sage [2017/03/31(金) 19:35:02.95 ID:BClOXWeK.net] >>540 それ,K&R1 から堕落したよね
553 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/03/31(金) 19:40:25.86 ID:tvggMnLQ.net] 構造体定義を#include <pshpack1.h>と#include <poppack.h>で囲むのは、スピードよりもメモリー効率を優先するときにする。
554 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/03/31(金) 19:44:56.93 ID:tvggMnLQ.net] あるいは構造体のレイアウトを分かりやすくするときにパッキングを指定する。
555 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/03/31(金) 19:46:22.60 ID:tvggMnLQ.net] >>543 堕落ではない。進歩だ。
556 名前:デフォルトの名無しさん mailto:sage [2017/03/31(金) 19:49:13.63 ID:RKtYGe+y.net] > スピードよりもメモリー効率を優先するときにする 20年くらい前まではそういう老人もいたね 今はメモリレイアウトを固定したい時にしか使わないけど
557 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/03/31(金) 19:58:28.84 ID:tvggMnLQ.net] #pragma 直接指定は礼儀が悪い、昔のやり方だ。
558 名前:デフォルトの名無しさん [2017/04/01(土) 02:25:44.35 ID:m99QLuku.net] メモリ効率だけの問題なら大抵の場合は順番入れ替えるだけで問題ないしな
559 名前: ◆QZaw55cn4c mailto:sage [2017/04/01(土) 07:47:47.79 ID:1ZzXEpHO.net] >>546 サイズが無限にのびるかもしれないものをコピーするなんてだめだよ 昔はね,構造体はポインタを介してしかつかえなかったんだよ
560 名前:デフォルトの名無しさん mailto:sage [2017/04/01(土) 08:31:33.23 ID:AOt54aKT.net] そうそう スタックに自動変数とかも言語道断 全部staticじゃなきゃね
561 名前: ◆QZaw55cn4c mailto:sage [2017/04/01(土) 13:26:49.84 ID:1ZzXEpHO.net] >>551 スタックに自動変数はあたりまえだよ‥static おじさん,じゃないつもりなんだが‥ 構造体はポインタで扱うべきもので,実体をコピーするのはなるたけ避けたいね C++ では void f(const C &arg) って,可能ならば const と参照の縛りをできるだけいれるよね,余計なコンストラクタを走らせないために K&R1 は教育的な配慮に優れた実装だと思うんだ‥
562 名前:デフォルトの名無しさん mailto:sage [2017/04/02(日) 14:13:23.32 ID:SQNmFUeK.net] SOCKADDRが一言
563 名前: ◆QZaw55cn4c mailto:sage [2017/04/02(日) 17:06:04.34 ID:XkKG9LQx.net] >>553 手元のソースをみると clientSocket = accept(serverSocket, (LPSOCKADDR)&clientSockAddr, &addrLen); とか if (connect(destSocket, (LPSOCKADDR)&destSockAddr, sizeof(destSockAddr)) == SOCKET_ERROR) { とか,構造体のポインタを渡しているね 由緒正しき Berkeley socket では,構造体をコピーするなんて教育的ではない書き方は許していないよ
564 名前:デフォルトの名無しさん mailto:sage [2017/04/02(日) 17:31:42.61 ID:QFdfGGyb.net] つまり>>553 はK&Rおじさんにも劣る存在
565 名前:デフォルトの名無しさん mailto:sage [2017/04/02(日) 18:21:59.15 ID:XkKG9LQx.net] K&R1 おじさん,と K&R2 おじさん は区別したまえ,若造
566 名前:デフォルトの名無しさん mailto:sage [2017/04/02(日) 19:26:19.28 ID:QFdfGGyb.net] どっちも時代遅れの老人でしょ K&Rなんて昔存在したという噂でしか知らない 万葉集とか古事記みたいなもの?
567 名前:デフォルトの名無しさん [2017/04/02(日) 20:22:15.39 ID:II71H9Zi.net] func1(a, b) int a; long b; { }
568 名前:デフォルトの名無しさん mailto:sage [2017/04/02(日) 22:22:37.63 ID:JMz4l+Qd.net] > &destSockAddr, > sizeof(destSockAddr) 由緒正しきBerkeley Socketも昔はこういう書き方したな コイツは進歩が20年前で止まってるのか 今この書き方する奴は死刑でいい
569 名前:デフォルトの名無しさん mailto:sage [2017/04/02(日) 23:11:21.74 ID:zmcqSa2a.net] 便乗で申し訳ないが、値渡し、参照渡し、ポインタ渡し、の話で ポインタ渡しといっても、C++の場合はナマポは嫌われて、スマポを使いましょう ってことになっていると思うんだけど、これはどう渡すのが普通? スマポを値渡しするのか、参照渡しするのか はたまたスマポを剥いで、ナマポで渡すのか 個人的に統一しきれないっつーか 所有権やら生存期間やらリソース管理やらが関係してくるなら スマポで渡すI/Fじゃないとまずいだろうし 逆にそういうのが関係ないなら、スタック上の自動変数を渡したいとかも考えると ナマポで渡すI/Fのほうが都合が良かったり、どーなんだろ 一度ナマポに戻すと二度とshared_ptrに変換できないって制限がね 言語側でなんとかせずに、ライブラリで解決しようとした弊害かな ちょうどよいバカよけなんかも知らんが
570 名前:デフォルトの名無しさん mailto:sage [2017/04/02(日) 23:13:25.39 ID:6tq4Ne3Z.net] 参照一択
571 名前:デフォルトの名無しさん mailto:sage [2017/04/02(日) 23:24:57.32 ID:xNqaI0VS.net] >スマポを値渡しするのか、参照渡しするのか >はたまたスマポを剥いで、ナマポで渡すのか スマポの値渡しと生保は使い分けが必要だが、スマポの参照渡しだけはアホの所業。 とスコットメイヤーが言っていたような
572 名前:デフォルトの名無しさん [2017/04/02(日) 23:43:46.05 ID:yhAnz0vw.net] >>560 shared_ptrはその名の通り所有権を共有する場合のみ使うもの で、そういう場合は値渡しでもいいよ。中でmoveすれば 所有権を共有しないなら、nullptrを許容するならナマポそうじゃないなら参照 あんまり無いけど所有権を渡した先に移動させるならunique_ptr
573 名前:デフォルトの名無しさん mailto:sage [2017/04/02(日) 23:58:32.77 ID:TsXu0WT4.net] 所有権渡したくないならunique_ptrで持っている呼び出し元がgetでナマポを渡すかdereferenceして参照渡すかだな
574 名前:デフォルトの名無しさん mailto:sage [2017/04/03(月) 00:00:55.90 ID:Jbp2gIKE.net] ナマポで渡してもshared_ptrを再取得する方法はあるだろ まあ前提がいるが
575 名前:デフォルトの名無しさん mailto:sage [2017/04/03(月) 00:34:15.74 ID:qQvnlfYK.net] うむむ、なるほど ポインタらしき物にこれだけ多くの種類があってI/Fで縛ってしまうのは 一見面倒そうで、最近の流行というか静的型言語的には 型安全と見るべきなんだろうかしら 安易なGC言語より良いかもしれん、単純に情報量は多い また一つC++が好きになった うっかり循環参照したら怖いとか コンパイラのバージョン違いでSTLやmallocの実装に 差異が有ることを前提に組まなきゃならないとか、玉にキズもあるけれど
576 名前: ◆QZaw55cn4c mailto:sage [2017/04/03(月) 06:55:53.48 ID:VwtRd/3a.net] >>559 C/C++ で生書きするなら今もおなじだよ
577 名前:デフォルトの名無しさん mailto:sage [2017/04/03(月) 07:40:50.83 ID:dyU+EMvQ.net] 型に対してじゃないのに括弧つけるの?
578 名前:デフォルトの名無しさん mailto:sage [2017/04/03(月) 08:48:24.23 ID:WaUkCV9r.net] そこはインデントや{}の位置が人によって違ったりするアレだろ
579 名前: ◆QZaw55cn4c mailto:sage [2017/04/03(月) 19:32:41.84 ID:VwtRd/3a.net] >>557 K&R2 は C89 準拠だよ‥C89 が時代遅れだというけれども,いろんなことは C89 のときからやってきていて,C99 で追認された,というだけだよ
580 名前:デフォルトの名無しさん mailto:sage [2017/04/03(月) 20:29:22.04 ID:5hra1L5C.net] >>570 あいわかった お前は今後「K&R1おじさん」(略して「K&Rおじさん」)な どうせ定数defineや関数マクロまみれなんでそ
581 名前: ◆QZaw55cn4c mailto:sage [2017/04/03(月) 21:53:46.44 ID:VwtRd/3a.net] >>571 略しないほうがいいよ‥ K&R2 おじさん=C89 はまっとうなCer, K&R1 おじさんは時代遅れ,この二つは全然違うよ
582 名前:571 mailto:sage [2017/04/03(月) 22:02:42.26 ID:ldINtwle.net] >>572 つまりお主(K&R1おじさん)は K&R2おじさんが自分と一緒くたにされることを 申し訳ないと感じてるのだな!? (>543) > それ,K&R1 から堕落したよね (>550) > サイズが無限にのびるかもしれないものをコピーするなんてだめだよ (>552) > K&R1 は教育的な配慮に優れた実装だと思うんだ‥
583 名前:デフォルトの名無しさん mailto:sage [2017/04/03(月) 22:14:40.64 ID:Vb9tETQW.net] voidを返す関数には感心したな 生成されるコードは大して変わらないかも知れんけど
584 名前:デフォルトの名無しさん mailto:sage [2017/04/04(火) 01:00:11.73 ID:jC2xfRDP.net] 関数プロトタイプを除けば、K&R1で十分かもしれないな voidを返す関数? int でいいんだよ
585 名前:デフォルトの名無しさん mailto:sage [2017/04/04(火) 15:11:19.04 ID:AeH3x9f/.net] 戻り値をどうするかはcallerの勝手だからな
586 名前: ◆QZaw55cn4c mailto:sage [2017/04/04(火) 19:47:09.26 ID:xNF4clmU.net] >>575 確かに関数プロトタイプは有用だね,これがないと結構ミスるかもしれないね void を返す関数?int でいいんだよ [] [ここ壊れてます]
588 名前:デフォルトの名無しさん mailto:sage [2017/04/04(火) 20:27:50.00 ID:/PIYb7TP.net] int funca01(...); int funca02(...); int funca03(...);
589 名前:デフォルトの名無しさん mailto:sage [2017/04/04(火) 23:08:17.42 ID:YUY8Mb54.net] 老人は意味とか概念を理解しようとしないから嫌 「bool? intでいいだろ」 「forループ?本質はgotoと同じ」 「enumなんてintでいいだろ」 ホントもう存在が害悪
590 名前:デフォルトの名無しさん mailto:sage [2017/04/05(水) 00:33:27.19 ID:DVg/5L4N.net] >>550 何が「昔はね」だよw Qちゃんその当事Cなんて触ってなかったろ? アンタ最近(たかだか数年?)プログラミングで遊び出しただけの人でしょ
591 名前:デフォルトの名無しさん mailto:sage [2017/04/05(水) 02:38:54.31 ID:ZJf7oEgw.net] >>579 「static const intなんてenumでいいだろ」 こうですね
592 名前:デフォルトの名無しさん mailto:sage [2017/04/05(水) 04:30:52.52 ID:ni2ET+sb.net] 奴らは#defineだ
593 名前:デフォルトの名無しさん mailto:sage [2017/04/05(水) 08:14:48.69 ID:Bh5NPBNH.net] マジックナンバー直書きでしょ
594 名前:デフォルトの名無しさん mailto:sage [2017/04/05(水) 08:19:06.54 ID:qVk1sCwA.net] K&Rだと〜 c89だと〜 過去の異物がまだ現役だと信じて話してけるのがうざい
595 名前:デフォルトの名無しさん mailto:sage [2017/04/05(水) 09:06:55.68 ID:ncDYJBnp.net] それ言うならC自体が。 いまさらC++と互換性のないCを選ぶ理由がない。
596 名前:デフォルトの名無しさん mailto:sage [2017/04/05(水) 10:35:04.67 ID:k0RY104y.net] >>585 C++と互換性のないCってどんなの?
597 名前:デフォルトの名無しさん mailto:sage [2017/04/05(水) 19:40:11.14 ID:IM5122PI.net] ベターC的な所全般だな 範囲forとか2進リテラルとかスレッドライブラリとか参照とか Cにはnullptrすら無いし細かいところでは条件演算子が右辺値とか ようするに別言語 オーバーロードに対するtgmathとかもう糞の臭いしかしない
598 名前: ◆QZaw55cn4c mailto:sage [2017/04/05(水) 19:44:22.68 ID:bDXscs5n.net] >>585 たしかに,C99 の数々の改悪は C++ との互換性を考慮していない悪手の連発,ほとほと困ってしまう >>584 C++ とほどほどの交換性のある C89 が最良だよ
599 名前: ◆QZaw55cn4c mailto:sage [2017/04/05(水) 19:46:32.21 ID:bDXscs5n.net] >>580 「K&R1 は構造体は基本的にポインタでしか扱えない」制限なんて,使ってもいなかったらわからないだろう?
600 名前:580 mailto:sage [2017/04/05(水) 20:02:06.85 ID:DVg/5L4N.net] え?Qちゃんてサンデープログラマじゃないの? 職業プログラマでもないし プログラミング暦せいぜい10年未満だと思ってた
601 名前: ◆QZaw55cn4c mailto:sage [2017/04/05(水) 20:07:28.87 ID:bDXscs5n.net] >>579 >「forループ?本質はgotoと同じ」 そんなことはいわないとおもうよ,K&R1 の時代から for はあるしね きがつくと for(;;) { } と break だけで書いてたりするのはあるかもね,while 使いにくいとか,do while なんかマクロの中でしかつかわない,とかさ enum? #define でいいとおもうよ‥
602 名前: ◆QZaw55cn4c mailto:sage [2017/04/05(水) 20:08:45.69 ID:bDXscs5n.net] >>590 サンデーだよ でも長いサンデーなんだ‥
603 名前:デフォルトの名無しさん mailto:sage [2017/04/05(水) 21:26:45.75 ID:Kw8eDt7v.net] ニートじゃ分からんことも多いのでは
604 名前: ◆QZaw55cn4c mailto:sage [2017/04/05(水) 22:05:58.72 ID:bDXscs5n.net] たしかにそのとおりだが,K&R2 = C89 こそ必要十分,ということはわかるよ
605 名前:デフォルトの名無しさん mailto:sage [2017/04/05(水) 22:10:26.67 ID:mGFW5fgT.net] そういうこと言ってるとそのうち技術についていけなくなるよ
606 名前:デフォルトの名無しさん mailto:sage [2017/04/05(水) 22:22:23.34 ID:ncDYJBnp.net] C99やC11って、新しい技術とかそういうんじゃないじゃん。
607 名前:デフォルトの名無しさん mailto:sage [2017/04/05(水) 22:40:44.77 ID:mGFW5fgT.net] 規格
608 名前:デフォルトの名無しさん mailto:sage [2017/04/06(木) 10:47:58.81 ID:jz0x7tjm.net] 企画ものは好きじゃないからな
609 名前:デフォルトの名無しさん mailto:sage [2017/04/06(木) 16:35:26.64 ID:w+UX2Wix.net] ころころ変わるんだから最新もクソも無いわけだが pakomamaはガチらしいな
610 名前: ◆QZaw55cn4c mailto:sage [2017/04/06(木) 20:02:44.92 ID:Uar4T1Gl.net] >>595 別についていけなくてもいいよ,その殆どは自分には要らないものだから それはそうと,これは!とおもう新しい技術って最近はどんなものがあるの?
611 名前:デフォルトの名無しさん mailto:sage [2017/04/06(木) 20:16:13.94 ID:kFToYptL.net] まず、C#のasyncだのawaitだのはC++にも欲しいところ というか、取り入れる方向で議論していたような どのみちQZには使いこなせない機能だから知らなくてもよいけど 知れば発狂することだろう
612 名前: ◆QZaw55cn4c mailto:sage [2017/04/06(木) 20:21:15.74 ID:Uar4T1Gl.net] まずC#をやらないとね‥でも Java に走ってしまった‥Java に同じようなのはないの?
613 名前:デフォルトの名無しさん [2017/04/06(木) 22:33:11.66 ID:Ao1zg6OQ.net] >>601 coroutineの事なら根本的な所が違うから勘違いしないようにな
614 名前:デフォルトの名無しさん mailto:sage [2017/04/07(金) 20:08:34.35 ID:cdWiLUH2.net] 馬鹿の特長:目的/機能の違いと実現するための実装の違いの区別がつかない
615 名前:デフォルトの名無しさん mailto:sage [2017/04/08(土) 12:56:12.29 ID:TFmwEDa6.net] C#のawaitはGUIのスレッドを意識出来るので有用だが C++のawaitはただ裏で走らせるだけの機能的には劣化版な気がしてならない
616 名前:デフォルトの名無しさん mailto:sage [2017/04/08(土) 13:14:20.88 ID:bfo0YVHI.net] >>605 c++で標準的なgui使うとすると何になるの?
617 名前:デフォルトの名無しさん mailto:sage [2017/04/08(土) 13:49:52.49 ID:xnWSKOe7.net] >>605 そりゃ C++ と C# のポリシーの違いだろ
618 名前:デフォルトの名無しさん mailto:sage [2017/04/09(日) 22:32:13.26 ID:nTEmq1X3.net] C使ってる人で変数宣言を途中に書く人いる? やめた方がいい?
619 名前:デフォルトの名無しさん mailto:sage [2017/04/09(日) 23:00:21.55 ID:gthRNL4S.net] むしろそうして欲しいかな 勿論ブロックスコープは意識してる前提で
620 名前:デフォルトの名無しさん mailto:sage [2017/04/14(金) 09:11:56.63 ID:ezi5K97R.net] 初期のCはブロック先頭しかコンパイルが通らない コンストラクタも型推論もないのに途中に置くメリットが少ない 初期化漏れというモンスターの隠れ家になりやすい
621 名前:デフォルトの名無しさん mailto:sage [2017/04/14(金) 10:33:55.73 ID:L6e5ZQwW.net] 一応Cで書くときは関数ブロック直後に書いてるけど、それはそれでforで使うiとかを使い回す事になるから、C++みたくプログラマの良識を信じて(ブロックを意識して変数宣言すると信じて)、好きな場所で宣言出来た方が正解なんだろうな。
622 名前:デフォルトの名無しさん mailto:sage [2017/04/14(金) 10:35:17.63 ID:L6e5ZQwW.net] 出来た方がと言うか、今は出来るんだから、した方が正解に訂正。
623 名前:デフォルトの名無しさん mailto:sage [2017/04/14(金) 12:59:25.70 ID:Hdztr2ik.net] 出来ることと乱用していいことはイコールでない 一瞬だけの一時変数を直前で宣言するのならありだけど 関数全体で使うなら頭で宣言すべきだし、そもそも中間で宣言するような長い関数は 短くなるよう見直すべき
624 名前:デフォルトの名無しさん mailto:sage [2017/04/14(金) 13:04:43.28 ID:xSRtCFhF.net] 魔法の言葉 ケースバイケース
625 名前:デフォルトの名無しさん mailto:sage [2017/04/14(金) 19:32:18.15 ID:UiWlchtO.net] スコープは可能な限り狭く おじいちゃんの遺言
626 名前:デフォルトの名無しさん mailto:sage [2017/04/14(金) 19:38:55.23 ID:PNQsiXg9.net] 初期化漏れはブロック先頭でしかかけない方が起こしやすいだろう 長い範囲で使う変数でも、変数ははじめて使うところで宣言した方が分かりやすいしバグも減る。
627 名前:デフォルトの名無しさん mailto:sage [2017/04/14(金) 20:04:35.98 ID:Z/bjVn5R.net] 初期化忘れ防止はどこで宣言したってあんま関係ないというか 大差ないだろうな実際 必要になった時点で宣言するってことでよいと思う さもないと上手くいかない場合もあるし いちいち使いもしない「ダミーの値」で初期化するのは馬鹿らしいし 余計にバグりそう
628 名前:デフォルトの名無しさん mailto:sage [2017/04/14(金) 20:13:31.25 ID:Z/bjVn5R.net] auto result = func(); まぁこういう風にしたいわな int result = 0; ・・・ result = func(); ↑その「0」って初期化値は何なんですか、何を意味した「0」なんですか では0の代わりに1で初期化したらどうなるんですか この初期化値の意味は一体何なんですか ってことになるしな 結局「0」とか「1」とかの初期化値はダミーでありプログラム上なんの意味もなかったりするし 逆に初期化値に意味がある場合もあるから余計にややこしくなる bool flag = false; if( func() ) { flag = true; } これらを区別したいから必要になった個所で宣言に一票
629 名前:デフォルトの名無しさん mailto:sage [2017/04/14(金) 21:45:43.28 ID:spQE74XB.net] 老人の「昔は良かった」を見て顔真っ赤にして論破しようとマジレス みっともない
630 名前:デフォルトの名無しさん mailto:sage [2017/04/14(金) 23:47:26.34 ID:9eRQSDOY.net] 必要なものを必要なときに宣言する それだけの話
631 名前:デフォルトの名無しさん mailto:sage [2017/04/15(土) 09:16:54.52 ID:RtikNDCG.net] >>618 >この初期化値の意味は一体何なんですかってことになるしな 勝手に無駄な初期化しておいてどれだけ頭が悪いんだぜ ぜんぜややこしくない お前が馬鹿なだけ
632 名前:デフォルトの名無しさん mailto:sage [2017/04/15(土) 09:26:22.77 ID:Af1/s0zG.net] もともとが 初期化忘れを防ぐためには関数の先頭で宣言〜 への反論だったからだぜ
633 名前:デフォルトの名無しさん mailto:sage [2017/04/15(土) 09:41:32.48 ID:RtikNDCG.net] >622 日本語もわからないチンパンは無理して コンピュータ使わなくても 祖国でオナニーしてればいいんだぜ
634 名前:デフォルトの名無しさん mailto:sage [2017/04/15(土) 09:50:31.14 ID:Af1/s0zG.net] 君の疑問がどこにあるのか本当にわからないからどうでもよい
635 名前:デフォルトの名無しさん mailto:sage [2017/04/15(土) 10:02:51.76 ID:Af1/s0zG.net] それでもヒントとして>>610 への反論だったということだけは言っておこうか 「途中で宣言すると初期化もれしやすい」という風なことが書いてあるが 逆に>>610 は何故、先頭で宣言したら初期化漏れしにくい、と考えたか どういったコードを想定しているかってことだな 要するに>>610 はブロックや関数の先頭だけ見れば初期化漏れしていることが直ぐわかると便利だね って言いたいんだろうけど、それはどういうコーディングルールの元に言えることか ということだな
636 名前: ◆QZaw55cn4c mailto:sage [2017/04/16(日) 17:51:30.33 ID:3PeEvH/A.net] for(int i = ...; ; ) が書けるようになったのは素直にありがたいな,と感じている
637 名前:デフォルトの名無しさん mailto:sage [2017/04/23(日) 23:52:45.18 ID:IUq/7GPJ.net] >>626 脳の進化が20年前で止まったチンパンはc89でも使ってろ
638 名前:デフォルトの名無しさん mailto:sage [2017/04/24(月) 20:45:20.10 ID:et30sNFg.net] うきー
639 名前: mailto:sage [2017/04/25(火) 04:20:41.84 ID:Vqnsayjn.net] >>627 C99 or later で便利になったことなんて,そんなにないんだよね‥
640 名前:デフォルトの名無しさん mailto:sage [2017/04/25(火) 06:08:12.88 ID:X14wy5zc.net] 数値計算とか特殊用途なライブラリ追加ってイメージ。 そりゃ、手間の割に汎用性がなかったら対応コンパイラも出てこないわ。
641 名前:デフォルトの名無しさん mailto:sage [2017/04/25(火) 22:55:58.60 ID:EbISA0IE.net] インライン関数も行コメントもboolもrestrict も無しで どうやってプログラム書いてんのか想像もつかない snprintf無しとか無理ゲーだろ
642 名前:デフォルトの名無しさん mailto:sage [2017/04/26(水) 02:18:40.34 ID:Kw1ZNGm3.net] restrict無しが想像つかないってどういうことだろ
643 名前:デフォルトの名無しさん mailto:sage [2017/04/26(水) 09:07:13.88 ID:bRGeq+mw.net] restrict使ったことないなあ 大きく最適化されるの?
644 名前:デフォルトの名無しさん mailto:sage [2017/04/26(水) 09:13:52.17 ID:rDz6/6sg.net] 最適化はあんま気にしてなくて意味的なものかな memcpyとmemmoveみたいな
645 名前:デフォルトの名無しさん mailto:sage [2017/04/26(水) 09:20:57.15 ID:A4NmaPdj.net] そう言う機能はメーカー独自実装でC99決まるずっと前からスタンダードだったから、C99って実感が無い。。。
646 名前:デフォルトの名無しさん mailto:sage [2017/04/26(水) 11:36:23.97 ID:O9yeoh6Z.net] >>631 いやいやそれはさすがに想像力足りなくね? snprintf無しは無理ゲーなのは同意するが
647 名前:デフォルトの名無しさん mailto:sage [2017/05/05(金) 00:51:04.53 ID:evlI6rq7.net] void func(hoge) int hoge; {} こんな書き方があったん?
648 名前:デフォルトの名無しさん mailto:sage [2017/05/05(金) 01:30:10.63 ID:PzvORh1V.net] >>637 詳しくは k&r style とかでググればいいけど今時知る必要はほぼないと思う
649 名前:デフォルトの名無しさん mailto:sage [2017/05/05(金) 15:05:47.25 ID:9iyukdGg.net] K&R1 だね、引数の型チェックができないから不便かつミスを誘発しやすい
650 名前:デフォルトの名無しさん mailto:sage [2017/05/07(日) 00:55:58.17 ID:uDdo3knt.net] 使われなくなった過去の異物に優劣語り出すとか 老人やべーな
651 名前:片山博文MZ mailto:sage [2017/05/07(日) 00:58:01.39 ID:gTai4K61.net] ×異物 ○遺物
652 名前:デフォルトの名無しさん mailto:sage [2017/05/07(日) 01:41:21.28 ID:zkvqzaCu.net] 誰も優を語ってない訳だが
653 名前:デフォルトの名無しさん mailto:sage [2017/05/07(日) 15:54:40.58 ID:s2OM55fz.net] ストラウストラップの本って読む価値ありますか?
654 名前:デフォルトの名無しさん mailto:sage [2017/05/07(日) 22:28:38.36 ID:fUCVOwEA.net] 著書全般の基本的な傾向としては万人向けの価値はない 物事の意味や本質を学び考え悩み理解しようとする人向けの本であって うわべだけの丸暗記やコピペで即結論や結果を求める人向けの本ではないから
655 名前:デフォルトの名無しさん mailto:sage [2017/05/07(日) 22:36:06.44 ID:f9jMnLHr.net] 読む価値はあるが嘘が多いので騙されない注意が必要
656 名前:デフォルトの名無しさん mailto:sage [2017/05/07(日) 23:30:36.93 ID:s2OM55fz.net] >>644 >>645 上級者向けの本みたいなので 買うのは先に延ばしたいと思います... 一冊高いのもありますが サンクスです
657 名前:デフォルトの名無しさん mailto:sage [2017/05/19(金) 15:26:03.09 ID:49hF9eg/.net] はぁ〜〜〜〜 安易にC++に手を出すんじゃなかった
658 名前:デフォルトの名無しさん mailto:sage [2017/05/20(土) 12:15:32.26 ID:Niypv3FQ.net] 変人や御用達の言語だからな 馬鹿のくせにプライド高い老害しか使ってないイメージ
659 名前:デフォルトの名無しさん mailto:sage [2017/05/20(土) 12:51:51.67 ID:Nls5mnQ9.net] >>648 その手の人らの声が大きいだけだよ。特にこんなところでは。
660 名前:デフォルトの名無しさん mailto:sage [2017/05/20(土) 18:23:23.08 ID:PYbACk+S.net] みんな黙ってC++だよ
661 名前:デフォルトの名無しさん mailto:sage [2017/05
] [ここ壊れてます]
662 名前:/23(火) 00:42:13.85 ID:9/IkIyOw.net mailto: ちょっとした確認なんだけどさ、 デストラクタが空っぽ (デフォルトデストラクタ) でもオブジェクトを後始末するための何らかの処理はするよね? よくあるスライシングの問題で、 ・クラス A をクラス B が継承している ・クラス A のデストラクタは virtual が付いていない ・クラス B のデストラクタはデフォルトデストラクタ ・クラス B はメンバ変数を持っていない ・B* を A* にキャストしたものを delete という状況だと見かけ上はクラス B のオブジェクトには後始末すべきものは何もないように見えるけど、 デストラクタが呼ばれないのはやっぱあかんよな? [] [ここ壊れてます]
663 名前:デフォルトの名無しさん mailto:sage [2017/05/23(火) 04:48:39.03 ID:pt6Ia/HA.net] うん
664 名前:デフォルトの名無しさん mailto:sage [2017/05/23(火) 09:20:18.86 ID:J4YcG+3k.net] >>651 はい 規格上もデストラクタがvirtualでないBのオブジェクトをA*に入れてdeleteした場合未定義動作だよ
665 名前:デフォルトの名無しさん mailto:sage [2017/05/23(火) 10:48:08.30 ID:Ip/q9ayQ.net] 未定義動作多すぎだなこの言語。 よくここまで生き残れたな。
666 名前:デフォルトの名無しさん mailto:sage [2017/05/23(火) 11:01:35.25 ID:3W0XlzKr.net] 未定義部分を各社が好きに定義してたからね。 VC++だとこう動くけど、g++だとこう動く、みたいな。
667 名前:デフォルトの名無しさん [2017/05/23(火) 12:45:18.14 ID:hcbwXZ+h.net] >>653 横からだけど、それまじ? 出来れば、規格で書かれてる場所教えて欲しい。 不安に思いながらも、一個作っちゃったんだよな… 動作確認済みだから、直ちに問題があるわけではないんだけど、未定義と聞くと将来的には修正しておきたい…
668 名前:デフォルトの名無しさん mailto:sage [2017/05/23(火) 13:25:39.67 ID:I6yYOIGb.net] >規格で書かれてる場所教えて欲しい delete式の説明の最初のページに書かれていることが探せないというのは 場所を教えられたところでそもそも規格を保有していないのではないか
669 名前:デフォルトの名無しさん mailto:sage [2017/05/23(火) 13:25:57.75 ID:YY4qnA2y.net] >>656 意図して作ったの?バグじゃなくて?
670 名前:デフォルトの名無しさん mailto:sage [2017/05/23(火) 15:16:19.75 ID:0tdmeFKn.net] htmlとその解釈に悩まされるよりはマシ
671 名前:653 mailto:sage [2017/05/23(火) 15:21:53.55 ID:Ek6JChT/.net] >>656 俺もworking draftしかないけどn3690の5.3.5の3段落目 In the first alternative (delete object), if the static type of the object to be deleted is different from its dynamic type, the static type shall be a base class of the dynamic type of the object to be deleted and the static type shall have a virtual destructor or the behavior is undefined.
672 名前:デフォルトの名無しさん mailto:sage [2017/05/23(火) 17:00:54.34 ID:EZJXMIkJ.net] C++があまりに不安な要素をたくさん抱えているお陰で未だに新生言語が多数出てくると 思えばいいじゃん?
673 名前:デフォルトの名無しさん mailto:sage [2017/05/23(火) 19:47:58.75 ID:rsJqfxq0.net] 継承すんなよ
674 名前:デフォルトの名無しさん [2017/05/24(水) 00:55:48.61 ID:WEdzXALv.net] >>658 意図して作った。 悪しき方法とは思いつつも、stringクラスにsprintf 的な機能のメンバ関数作ったった。 その時、stringクラスの全機能を実装するのがめんどくさかったんで public 継承で。 メモリレイアウトは一切変わらない事を見切った上でだが、未定義だとすると…ヤベ。
675 名前:デフォルトの名無しさん [2017/05/24(水) 00:56:49.58 ID:WEdzXALv.net] ん、まあ、deleteは使わないからセーフか?
676 名前:デフォルトの名無しさん [2017/05/24(水) 01:00:58.95 ID:WEdzXALv.net] >>657 ドラフトしか持ってない… delete 使う事は頭になかったから気付かなかった。 ありがとう。 >>660 おぉ、ピンポイント情報あざす。早速確認してみる。
677 名前:デフォルトの名無しさん mailto:sage [2017/05/24(水) 12:01:47.91 ID:/RGvDc8r.net] メモリレイアウトが変わらない範囲で既存のクラスを再オープンして機能を追加する方法の提案だけは出てたような気がする。
678 名前:デフォルトの名無しさん mailto:sage [2017/05/24(水) 12:06:31.74 ID:/RGvDc8r.net] >>663 例外関連のなんたらかんたらの処理 (stack unwinding) がかかわってくるんじゃなかったっけ。 正常系では普通に動いているように見えても何がどうなってるかわからんぞ
679 名前:デフォルトの名無しさん mailto:sage [2017/05/24(水) 13:51:37.65 ID:OqDgfclu.net] >>658 の話の場合、別に”string *のポインタで”継承したやつをdeleteしない限り大丈夫でしょ >>651 で言うところの ・B* を A* にキャストしたものを delete これが問題になるんであって B*からdeleteして中身もBなら問題にならないと思うけど
680 名前:デフォルトの名無しさん mailto:sage [2017/05/24(水) 14:15:44.36 ID:ttKQmf2U.net] >>668 std::vector<std::string>に入れたら死ぬってことだよね??
681 名前:デフォルトの名無しさん mailto:sage [2017/05/24(水) 14:47:39.17 ID:/RGvDc8r.net] >>669 ポインタを std::string* に入れてなおかつそれを std::string* のままで delete したらあかんという話。 値を std::string にキャストする分にはなにも問題はない。
682 名前:デフォルトの名無しさん mailto:sage [2017/05/24(水) 15:58:36.11 ID:ttKQmf2U.net] >>670 だからstd::vector<std::string>にいれらんないよね?
683 名前:デフォルトの名無しさん mailto:sage [2017/05/24(水) 17:02:32.05 ID:/RGvDc8r.net] >>671 何を言いたいのかよくわからんが……。 std::string を継承した型は、レイアウトが変わらないようにしたからと言って (キャストなしで) std::string には入らないよ。 言いたいことを具体的にコードで示してくれんか
684 名前:デフォルトの名無しさん mailto:sage [2017/06/03(土) 20:46:07.15 ID:/cDPk3Lb.net] >>672 ideone.com/akrJQA
685 名前:デフォルトの名無しさん [2017/06/04(日) 05:01:25.52 ID:a4MXR2y0.net] テンプレート構造体を作りその配列をクラスのメンバに含めたいのですが上手くいきません。 作りたいクラスはスタックとして使えるもので、 主な作りたいメンバは、二つの型のメンバ変数を持つ上記のテンプレート構造体の配列。 引数としてテンプレート構造体を持ち、上記の配列に順次プッシュしていく関数。 最後にプッシュされた構造体をポップする関数、という3つです。 どのようにすればテンプレート構造体をクラスのメンバにすることが出来るのでしょうか? もしくは、このような機能を持つクラスを実装するためにはどうすればいいのでしょうか? よろしくお願いします。
686 名前:デフォルトの名無しさん mailto:sage [2017/06/04(日) 08:23:07.29 ID:7To+hzFq.net] まず using テンプレート構造体の型 = 構造体テンプレート<型パラメーター>; をします
687 名前:デフォルトの名無しさん mailto:sage [2017/06/04(日) 11:02:02.70 ID:4s9JqZC9.net] >>674 ideon.com/EmULAG
688 名前:デフォルトの名無しさん mailto:sage [2017/06/04(日) 11:02:24.41 ID:4s9JqZC9.net] ideone.com/EmULAG
689 名前:デフォルトの名無しさん mailto:sage [2017/06/04(日) 21:12:43.78 ID:0J0aNZ4Z.net] 質問への回答はいいとして たった100行のコードによくもここまでUNKOを詰め込めるものだと感心
690 名前:デフォルトの名無しさん mailto:sage [2017/06/04(日) 21:24:21.29 ID:4s9JqZC9.net] >>678 どこ?教えて
691 名前:デフォルトの名無しさん mailto:sage [2017/06/04(日) 22:06:48.73 ID:0J0aNZ4Z.net] >>679 細かくは見てないがぱっと見て気になったのは、 殆どが「= default」で済むものを自前で定義する所とか K,Vの左辺値が渡せないunkoコンストラクターとか 左辺値が渡せないpush関数とか key_value_pair_stackの外で定義されたdefault_max_sizeとか 禁断の「value_type pop()」とか ムーブ代入だけ何故か無いとか 例外安全を考慮しないswapとか constexprの付いていない関数が多数とか constが付いていないsize関数とか 質問者が「テンプレート構造体」と「クラス」の言葉を使い分けているのにわざわざクラステンプレートにする所とか 「value_type::value_type」の二つのvalue_typeの意味が違うとか スワップする気皆無の「swap(key_value_pair&& other)」とか あと 何故付いているのかわからない「const auto」のconstとか キーバリューペアをシーケンシャルコンテナーに詰める例も地味にUNKO
692 名前:デフォルトの名無しさん mailto:sage [2017/06/04(日) 22:21:08.74 ID:4s9JqZC9.net] >>680 ありがとう 見直してみる
693 名前:デフォルトの名無しさん mailto:sage [2017/06/04(日) 23:59:40.42 ID:4s9JqZC9.net] >>680 の指摘を受けて修正したやつ https://ideone.com/4PDU5a
694 名前:デフォルトの名無しさん mailto:sage [2017/06/05(月) 07:13:59.57 ID:dSqD3vhj.net] >>682 20秒ほど眺めたがとりあえず3つほどなおした方がいい ・key_のメンバー宣言に{}が付いていないと、修正前と同じ動作にならない ・popの戻りはvoidにした方が無難 ・clear()しても要素のデストラクターが呼ばれないのでstatic_assert(std::is_trivial_destructible<element_type>::value,"未対応")しとくのが礼儀
695 名前:デフォルトの名無しさん mailto:sage [2017/06/05(月) 08:02:20.82 ID:SbeuyTlX.net] >>683 一つ目だけ意味がわからない…28行目のこと??なんで?
696 名前:デフォルトの名無しさん mailto:sage [2017/06/05(月) 08:16:13.98 ID:dSqD3vhj.net] >>684 その通り28行目 struct X { some_type m1 /* {} */; X() = default; }; ここでsome_typeの初期化{}が無いとm1は未初期化になるし、 some_typeにデフォルトコンストラクターが無ければX()の「=default」が「=delete」扱いになる
697 名前:デフォルトの名無しさん mailto:sage [2017/06/05(月) 08:25:22.25 ID:CMNJImQI.net] >>685 なるほど…これってデフォルトコンストラクタ自前で書いてメンバイニシャライザに書いても同じだよね? valueも同様にイニシャライズしなきゃだめだよね?
698 名前:デフォルトの名無しさん mailto:sage [2017/06/05(月) 12:04:31.71 ID:dSqD3vhj.net] >>686 1:Yes, 2:Yes struct X {string m; X()=default;}; struct X {int m{}; X()=default;}; struct X {int m; X() : m() {}}; はmが初期化される struct X {int m; X()=default;}; が初期化されない
699 名前:デフォルトの名無しさん mailto:sage [2017/06/05(月) 12:34:51.89 ID:CMNJImQI.net] >>687 ありがとう
700 名前:デフォルトの名無しさん mailto:sage [2017/06/05(月) 21:07:12.97 ID:YRHwBsQU.net] 空のvectorをpop_backした時の仕様がクソ過ぎるC++
701 名前:デフォルトの名無しさん mailto:sage [2017/06/05(月) 23:54:31.67 ID:vnQWBbWO.net] 亀レスで申し訳ありません、>>674 です とりあえずレベルが足りないことが分かったので、もう少し勉強してからいただいたコード解読してみます。 答えてくださった方ありがとうございました。
702 名前:デフォルトの名無しさん mailto:sage [2017/06/06(火) 07:02:51.57 ID:ueF+TYcD.net] 気にすんな 簡単なことすんのにもこの難易度な言語がおかしい
703 名前:デフォルトの名無しさん mailto:sage [2017/06/06(火) 17:35:50.84 ID:zF6NOqag.net] というかほとんどがムーブとかconst版とかconstexprとか、とことん丁寧にやろうとした場合の作法まで 含めた突っ込みだから、初心者が気にするような話ではないなw そもそも、最近右辺値参照使ったコードを「書かないといけない」と誤解してる人が多い気がするんだが あんなもん「ポインタのすげ替えで済む場合」にそれを出来るようにするための仕組みで、 まず左辺値版を書いた上で、右辺値版も書けば速くなるよ、ってだけだよね? 上記に該当しようがしまいがまず左辺値版は必須だし(左辺値を弾きたいならともかく) 該当する場合に高速化したければ右辺値版も書けばいいというだけで これまた初心者が気にするような話ではないw
704 名前:デフォルトの名無しさん mailto:sage [2017/06/06(火) 18:16:24.12 ID:uCSRK7Ay.net] >>692 >右辺値版も書けば速くなるよ、ってだけだよね? お前の中ではそうなんだろうな
705 名前:デフォルトの名無しさん mailto:sage [2017/06/06(火) 18:58:32.67 ID:zF6NOqag.net] 違うというなら例ぐらい挙げてくれよ
706 名前:デフォルトの名無しさん mailto:sage [2017/06/06(火) 19:28:29.10 ID:+mNKSnZM.net] そういうのはスルーでok
707 名前:デフォルトの名無しさん mailto:sage [2017/06/06(火) 22:23:00.44 ID:uCSRK7Ay.net] >>694 こういうのはワンポイントTipじゃなくて概念の理解だからね 『ムーブセマンティクスのため』と答えを言ったところで 君は理解できないんだろう?
708 名前:デフォルトの名無しさん mailto:sage [2017/06/06(火) 23:19:35.94 ID:zF6NOqag.net] >>696 ドヤ顔で用語を挙げろなどとは一言も言っていないのだがw
709 名前:デフォルトの名無しさん mailto:sage [2017/06/07(水) 00:10:56.23 ID:xZGjq0dG.net] >>697 『ムーブセマンティクス』が君の求めた 例そのものなんだよ でも君の頭脳では概念を理解できないから 説明する気もないし わからなくても心配しなくていいよ
710 名前:デフォルトの名無しさん mailto:sage [2017/06/07(水) 00:22:15.23 ID:2ipgwMGH.net] 教える側界隈の高度なやり取りだけで終始しないでほしいんですけど、、
711 名前:デフォルトの名無しさん mailto:sage [2017/06/07(水) 00:27:13.62 ID:gn2mDiBA.net] >>699 ヒント:unique_ptrのムーブは性能目的ではない
712 名前:デフォルトの名無しさん mailto:sage [2017/06/07(水) 00:54:38.14 ID:CXRZvrBM.net] >>698 こっちは疑問形で書いてんだから普通に指摘してくれりゃいいんじゃねーの? なんかコンプでも抱えてんのかね unique_ptrみたいな所有権の移動の実現(を楽に実装する)は確かに気付いてなかったが 初心者が気にするような話ではない&いつも書かなければならないものではない、に対する反論になってないよな ちょっとした指摘をそこまで煽って書ける神経が理解できん
713 名前:700 mailto:sage [2017/06/07(水) 06:42:56.76 ID:gn2mDiBA.net] ちなみに俺は>>698 ではない そうぞうで書いた
714 名前:デフォルトの名無しさん mailto:sage [2017/06/07(水) 08:16:07.46 ID:PxDlVTZD.net] >>701 君は概念を理解できないだろうけど コピーされては困るから「ムーブ」「セマンティクス」 なんだよ 性能に余裕があってもね 右辺値参照がなかったらスマポをvectorに入れることすらままならないよ
715 名前:デフォルトの名無しさん mailto:sage [2017/06/07(水) 18:47:00.97 ID:CXRZvrBM.net] >>702 いや自分も軽く調べてすぐ見つかった例がunique_ptrだったからそれだろうと思った >>703 偉そうに言う割に自分もいい加減なこと言ってるな C++03以前を知らない学生か何かだろうけど、お前みたいに偉そうにドヤ顔する癖のあるやつで 使い物になるコード書くやつを俺は見たことない 恥ずかしいからその辺にしとけ
716 名前:デフォルトの名無しさん mailto:sage [2017/06/10(土) 17:42:01.48 ID:SxYi4azU.net] >>683 >・popの戻りはvoidにした方が無難 なぜなんだ?pop の戻りがナルなら空であることを示せてべんりだろう?
717 名前:デフォルトの名無しさん mailto:sage [2017/06/10(土) 20:12:18.00 ID:JqmNS/A3.net] >>705 topとpop作れってことが言いたいんだろう多分
718 名前:デフォルトの名無しさん mailto:sage [2017/06/11(日) 22:14:52.88 ID:iu5DR0Hy.net] 「なぜなんだ?pop の戻りがナルなら空であることを示せてべんりだろう?」 ↓ 「topとpop作れ」 これがアスペというやつか
719 名前:デフォルトの名無しさん mailto:sage [2017/06/11(日) 22:35:45.30 ID:q49UmmFG.net] お前アスペ言いたいだけだろ w
720 名前:はつみつ餃子 ◆8X2XSCHEME mailto:sage [2017/06/12(月) 01:27:35.05 ID:M0cidITY.net] std::queue では pop と front に分けられてるからその習慣に合わせた方がいいってことじゃない? ただ、 queue のデザインが出来たときはムーブがなかったから先頭要素にアクセスするために (参照でなく) 値を返すと同時にコンテナから削除するのはコピーが発生して非効率ってこともあってこうなってると思う。 今ならもっと別の選択肢はあっていいと思う。 まあ、古いデザインを引き摺っている部分はあるとは言っても標準ライブラリはすごくよく考えられてるから、 どうしてそうなっているのかを考察したり真似したりするのは良いと思う。
721 名前:デフォルトの名無しさん mailto:sage [2017/06/12(月) 01:48:34.70 ID:E1Ahh3IF.net] はつみつ
722 名前:デフォルトの名無しさん mailto:sage [2017/06/12(月) 17:36:41.84 ID:t42bNJ0A.net] >>709 は健常者 ただ理由は性能でなくて例外安全だろう
723 名前:デフォルトの名無しさん mailto:sage [2017/06/17(土) 07:59:16.34 ID:bupTq8cx.net] クラスの演算子オバーロードの 書き方全種類教えてください。 operator (*)やoperator ""や operator ->()辺りが特に解説が少なくて 理解するのに困ってます。 よろしくお願いします。
724 名前:はちゃめちゃ餃子 ◆8X2XSCHEME mailto:sage [2017/06/17(土) 09:10:34.91 ID:a/4tSU3I.net] >>712 ユーザー定義リテラルについてはこのあたりが詳しいと思う。 https://ezoeryou.github.io/cpp-book/C++11-Syntax-and-Feature.xhtml#over.literal https://cpprefjp.github.io/lang/cpp11/user_defined_literals.html 名前空間名で修飾することができないので、 namespace 内で定義されたものについては using してからでないと使えないという規則が微妙に気持ち悪い。 あまりお勧めしない。 標準ライブラリが提供している complex 型のリテラルや時間のリテラルもそんなに頻繁には使わなさそうだし、 よく使うのは string 型のリテラルくらいかなぁ。
725 名前:デフォルトの名無しさん mailto:sage [2017/06/17(土) 11:23:50.84 ID:cPfPWWru.net] まずウェブブラウザーで www.open-std.org/JTC1/SC22/WG21/docs/papers/2017/ をアクセスします。 次に「N4660」のPDFをダウンロードします。 右下に336と書かれたページ(16.5 Overloaded operators)を開きます。 そこから5ページほどスクロールしながら、英文を見ずにコードだけ眺めます。
726 名前:デフォルトの名無しさん mailto:sage [2017/06/17(土) 11:24:51.65 ID:cPfPWWru.net] oops... × N4660 ○ N4659
727 名前: ◆QZaw55cn4c mailto:sage [2017/06/17(土) 12:02:12.82 ID:ir1eTLN6.net] >>712 ユーザー定義リテラルについては書かれていないが、それでも演算子オーバーロードについては stlalv.la.coocan.jp/ が詳しいのではないか?はちみつさんがこれに触れないのは不思議‥
728 名前:デフォルトの名無しさん mailto:sage [2017/06/17(土) 12:24:13.05 ID:qM
] [ここ壊れてます]
729 名前:kdrUOQ.net mailto: あ、うんでもなんか、 http://stlalv.la.coocan.jp/HungarianNotation.html ↑のページ読んだだけでもうダメなんじゃないかって 文章もなんか危ないというか危ういし とおもったらQZか な〜んだ納得 [] [ここ壊れてます]
730 名前:デフォルトの名無しさん mailto:sage [2017/06/17(土) 13:21:59.00 ID:ir1eTLN6.net] >>717 ハンガリアンは意見がわかれるからね‥ 私はハンガリアンはやらないよ
731 名前:はちみつ行者 ◆8X2XSCHEME mailto:sage [2017/06/17(土) 14:21:54.44 ID:a/4tSU3I.net] >>716 自分が見ないページだから意識の外だった。 そのページはわかりやすく説明できているとは思うけど、 基本的な書き方で今更調べることはあんまりないよ。
732 名前:デフォルトの名無しさん mailto:sage [2017/06/17(土) 14:31:32.36 ID:bupTq8cx.net] 712です。 短いコードを打ちこんで動作を確認しました。 皆さん有り難うございました。 (ちょっと気になったのは void operator [](std::initializer_list <int > list); これがvsc2015では動作しなかったことぐらいです。 )
733 名前:653 mailto:sage [2017/06/17(土) 16:42:18.70 ID:YXyzn6OG.net] それ戻り値がvoidだからじゃ vs2015で試したら添字演算子の結果を使わなければvoidのままでも動いたし 戻り値返すようにしたら普通の使い方もできたよ
734 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [2017/06/17(土) 18:56:32.74 ID:a/4tSU3I.net] 話がそれるけど operator[] に initializer_list を渡したいときってどんなとき? 次元が動的に決まるようなコンテナとか?
735 名前:デフォルトの名無しさん mailto:sage [2017/06/18(日) 00:16:25.00 ID:sDQUBcQX.net] xyの二つの値を渡したかったんだろ 言わせんな恥ずかしい
736 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [2017/06/18(日) 00:50:52.82 ID:fX2BYeVR.net] void って C++ の予約語の中ではカッコイイ言葉ナンバーワンだよな!
737 名前: ◆QZaw55cn4c mailto:sage [2017/06/18(日) 09:48:40.36 ID:BCfBDJC6.net] auto に席をゆずったらしい‥
738 名前:デフォルトの名無しさん mailto:sage [2017/06/19(月) 13:14:46.01 ID:dXkNDY8/.net] pascal とか fortran の方が良くね?
739 名前:デフォルトの名無しさん mailto:sage [2017/06/19(月) 13:45:34.22 ID:LlSBVcNV.net] 後藤
740 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [2017/06/19(月) 14:29:30.47 ID:MatPzd+v.net] >>726 良かろうが悪かろうがこのスレに来てるのはそれでも C/C++ を使うってやつらなんだからその問いかけは無意味
741 名前:デフォルトの名無しさん mailto:sage [2017/06/19(月) 15:29:57.68 ID:dXkNDY8/.net] 予約語として他言語から呼べる万能感があるのに :-P C89では削除されたのだっけ
742 名前: ◆QZaw55cn4c mailto:sage [2017/06/19(月) 19:14:53.97 ID:zNrORK8z.net] >>727 setjmp/longjmp のインパクト!を考えると、いまいちだと思いますぅ
743 名前:デフォルトの名無しさん mailto:sage [2017/06/20(火) 00:48:54.33 ID:tAZ0INkH.net] longjmpは無理やり過ぎだよな Cならではとも思うが
744 名前:デフォルトの名無しさん mailto:sage [2017/06/20(火) 00:52:30.35 ID:tAZ0INkH.net] リターンアドレスレジスタみたいなの持ってる石だと ちょいとだけ複雑になるのかすぃら?
745 名前:デフォルトの名無しさん mailto:sage [2017/06/20(火) 23:58:21.18 ID:f6m5FZzF.net] >>172 >MISRA-C研究会が書いている、MISRA-C 2004(C90) の本をみっちり、勉強しろ! >研究会のメンバーでさえ、規格に詳しい人がいないのだから 規格も理解できない奴らが集まって書いた27年前の規格の解説本って やばすぎだろ
746 名前:デフォルトの名無しさん mailto:sage [2017/06/21(水) 00:16:32.09 ID:vvvagSt1.net] 5ヶ月以上前のレスに反応するって やばすぎだろ
747 名前:デフォルトの名無しさん mailto:sage [2017/06/21(水) 04:19:48.48 ID:ZaPNA4YS.net] コンパイラやライブラリが腐っていることなんて 良くある事。利用者は配慮してくれないと (AA略)
748 名前:デフォルトの名無しさん mailto:sage [2017/06/21(水) 11:49:15.08 ID:x++JJuQ3.net] 最終的にできたものが使用通りならそれでいい 規格準拠度なんてどうでもいいな
749 名前:デフォルトの名無しさん mailto:sage [2017/06/21(水) 13:05:32.11 ID:sg+bsLqU.net] /* 仕様通り動いたコード */ int Z = 0; // これを消すと動かなくなる int Z2 = 0; // 2010.1.4. vcバグ回避の追加 char *s, *p; if (s==p) return 2; //これ必要?
750 名前:デフォルトの名無しさん mailto:sage [2017/06/23(金) 22:17:07.01 ID:U/0DguFU.net] A a = {}; これってコピーコンストラクタ呼ばれる可能性ある?
751 名前:デフォルトの名無しさん mailto:sage [2017/06/24(土) 00:27:16.63 ID:PfOqrM0w.net] ない
752 名前:デフォルトの名無しさん mailto:sage [2017/06/24(土) 00:27:41.83 ID:5MVxspQe.net] >>738 ない (もちろんaを構築するときに呼ばれるコンストラクタの話 Aのコンストラクタの中で起きることまでは知りようがない)
753 名前:デフォルトの名無しさん mailto:sage [2017/06/24(土) 09:24:07.49 ID:AroON3at.net] イコールあるけどコピーしないん? もう文法わけわからん
754 名前:デフォルトの名無しさん mailto:sage [2017/06/24(土) 13:28:24.19 ID:7MOF4v/u.net] 変数宣言のときの=はあくまで初期化であって、たまたま同じ記号を使ってるだけで代入とは違うと思ったほうがいい 同じと思うと他にもC++の参照とかで混乱する
755 名前:デフォルトの名無しさん [2017/06/24(土) 15:16:01.77 ID:qquEaJ2M.net] >>741 コピーしようがしまいが結果は一緒でしょ? 単に最適化の結果で余計な処理が動かないだけと考えればいい
756 名前:デフォルトの名無しさん mailto:sage [2017/06/24(土) 18:10:28.98 ID:Ipep7Yd5.net] >>743 一緒じゃねーよヴァカ乙 リソースはメモリだけと思ってんの?どんだけお花畑なの? mutex a = {};コピー無しの保証
757 名前:デフォルトの名無しさん [2017/06/26(月) 12:57:25.63 ID:dr/i6/ki.net] >>744 コピー出来るクラスを例に持って来いよ
758 名前:デフォルトの名無しさん mailto:sage [2017/06/28(水) 18:40:34.84 ID:lG20CtJa.net] コピー出来ないクラスではコンパイル結果が異なるという>>744 の指摘に対して 「コピー出来るクラスを例に持って来い」とはこれ如何に
759 名前:デフォルトの名無しさん [2017/06/28(水) 18:53:40.08 ID:fwJBxSlX.net] >>746 その元コメントはコピーしようがしまいがと言ってるのにそもそもコピー出来ないクラス持ってきて罵倒とはこれ如何に
760 名前:デフォルトの名無しさん mailto:sage [2017/06/28(水) 20:44:21.28 ID:VFMMUwAr.net] >>743 一緒じゃない 一緒になるようにクラスを設計すれば一緒というだけ
761 名前:デフォルトの名無しさん mailto:sage [2017/06/28(水) 20:47:16.20 ID:VFMMUwAr.net] デフォルトコンストラクタでカレーライスを製造 コピーコンストラクタでラーメンを製造 代入でうどんを製造 同じか?
762 名前:デフォルトの名無しさん mailto:sage [2017/06/28(水) 21:08:19.84 ID:lG20CtJa.net] >>743 が「コピーしようがしまいが」と言ったからこそ>>744 がコピーされてはは困る例を出したのだが 悲しきかな>>747 には理解ないのであった
763 名前:デフォルトの名無しさん mailto:sage [2017/06/28(水) 21:16:03.41 ID:VFMMUwAr.net] いや、ちょっとズレてると思うよ
764 名前:デフォルトの名無しさん mailto:sage [2017/06/28(水) 22:13:17.29 ID:xb2y2Mwj.net] 横から何だけど どうズレてるかの説明は無いの?
765 名前:デフォルトの名無しさん [2017/06/28(水) 22:25:47.08 ID:xMEBWJOX.net] コピーしない保証がC++17でさらに追加されたがそこで最適化でコピーしようが直接構築しようがどちらでもよかったC++14までの規格は彼の頭の中ではヴァカでお花畑らしい
766 名前:デフォルトの名無しさん mailto:sage [2017/06/28(水) 23:59:13.87 ID:lG20CtJa.net] なるほど>>738 を初期化でなくcopy/move elisionの話だと勘違いしたままだとこのようなとんちんかんなレスになるのだな 残念なのが>>739-742 を読んでも勘違いに気付かないことだ
767 名前:デフォルトの名無しさん [2017/06/29(木) 00:23:16.57 ID:0BA30UdR.net] >>754 とりあえずお前が一番元のレス読んでないと言うことは解ったよ。 読んでるというなら彼が何を疑問に思ってるか、そしてそれへの説明をしてみるといい
768 名前:デフォルトの名無しさん mailto:sage [2017/06/29(木) 08:20:56.52 ID:J9UCM8ul.net] >>752 恐らく>>751 は「コピーしようがしまいが」について、コンパイル可否(>>750 で書いたコピーされてはは困る例)ではなく 「デフォルトコンストラクターで構築したものとそれをコピーして構築したものを概念的に同一視することの是非」こそが論点と主張している その片鱗が>>749
769 名前:デフォルトの名無しさん mailto:sage [2017/06/30(金) 16:06:42.41 ID:YTlik2k9.net] printf("おちんぽじゅぽじゅぽ")
770 名前:デフォルトの名無しさん mailto:sage [2017/06/30(金) 23:27:57.21 ID:SxEaPPM4.net] catch のところで例外を再スローすると 再スローされた例外の型は、catchの所に書いたスーパークラスの型に 差し代わってしまうの?
771 名前:デフォルトの名無しさん mailto:sage [2017/06/30(金) 23:50:44.58 ID:wfcExao2.net] 式無しのthrow;なら元の型のまま
772 名前:デフォルトの名無しさん mailto:sage [2017/07/01(土) 17:28:15.16 ID:T5yR4ind.net] 「型に差し代わってしまうの?」 ↓ 「〜なら元の型のまま」 確かにその通りなのだが、「型」に着目するあたり、 どうも仕様を正しく理解していないのではという気がしてならない
773 名前:デフォルトの名無しさん mailto:sage [2017/07/01(土) 22:43:53.34 ID:mdEe7tMk.net] c++は難しい分ほかの言語より色々できると聞いたんですがどういうことができるのでしょうか?
774 名前:デフォルトの名無しさん mailto:sage [2017/07/01(土) 22:56:09.11 ID:qtP/3v2i.net] メモリアクセスができます
775 名前:デフォルトの名無しさん mailto:sage [2017/07/01(土) 23:22:20.76 ID:sgaEl9jo.net] 難しいからではなく低級言語なのでハードウェアを直接操作するようなプログラムも書ける
776 名前:デフォルトの名無しさん mailto:sage [2017/07/02(日) 00:10:04.15 ID:kxMmAO7v.net] >>762 >>763 ハードウェアに直接操作やメモリアクセスですか トンクスです
777 名前:デフォルトの名無しさん mailto:sage [2017/07/02(日) 10:29:07.80 ID:TVPISEnD.net] 質問です doubleの計算誤差ってちゃんと考慮必要でしょうか? 数桁の四則演算なら誤差なしと考えていいですか?
778 名前:デフォルトの名無しさん [2017/07/02(日) 12:30:57.68 ID:w2e8t6sv.net] 考慮が必要な時もあるし 不要な時もある
779 名前:765 mailto:sage [2017/07/02(日) 13:04:46.92 ID:hIH6r6Dk.net] >>766 考慮必要ですか、、 ありがとうございます
780 名前:デフォルトの名無しさん mailto:sage [2017/07/02(日) 14:24:20.03 ID:O/UEQvVu.net] 精度保証付きの演算ライブラリ使えば?
781 名前:デフォルトの名無しさん mailto:sage [2017/07/02(日) 15:42:45.32 ID:1Me6IR2g.net] 4倍精度でも8倍精度でも多倍長でも整数でも有理数でも、使い方を間違えば誤差が問題になる 安直な処理で一番問題が発生しやすいのが整数丸めと比較 ごくごく微妙な誤差は何時でも含んでいると思うと良い
782 名前:デフォルトの名無しさん mailto:sage [2017/07/02(日) 15:45:50.50 ID:1Me6IR2g.net] >>768 大抵の演算ライブラリや演算器は精度の保証がある
783 名前:デフォルトの名無しさん mailto:sage [2017/07/02(日) 16:02:14.06 ID:O/UEQvVu.net] >>770 いや、そうじゃなくて浮動小数点計算誤差由来の誤差を解決するための分野とライブラリがあるんだよ 解をレンジで持ち続けるみたいな感じ Accuracy guaranteed numerical calculation でググるとたくさん出てくるよ
784 名前:デフォルトの名無しさん mailto:sage [2017/07/02(日) 16:12:27.01 ID:1Me6IR2g.net] >>771 解をレンジで持ち続けて何か解決出来ると思うか? >>765 レベルの人が
785 名前:デフォルトの名無しさん [2017/07/02(日) 16:13:48.15 ID:9wrwY3nx.net] mpir、gmpだろ。これ使えば円周率1万でも1億でも正確に計算できるはず
786 名前:デフォルトの名無しさん mailto:sage [2017/07/02(日) 16:15:08.10 ID:1Me6IR2g.net] 有理数を有理数のまま保持している分には、四則演算では誤差が発生しない もちろんオーバーフローしない条件で
787 名前:デフォルトの名無しさん mailto:sage [2017/07/02(日) 16:16:17.16 ID:1Me6IR2g.net] >>773 前提条件は数桁の四則演算
788 名前:デフォルトの名無しさん mailto:sage [2017/07/02(日) 16:18:03.31 ID:1Me6IR2g.net] doubleで計算を前提とし、誤差が問題となりやすい場面だけ教えてあげれば十分
789 名前:デフォルトの名無しさん [2017/07/02(日) 16:22:01.48 ID:9wrwY3nx.net] 実際、浮動小数点型の誤差は無視できないぞ。 float型とか、容量が少ないほど。情報処理の入門書の最初から出てくる話題だろ。
790 名前:デフォルトの名無しさん [2017/07/02(日) 16:22:48.13 ID:jIucKliD.net] いい加減スレタイ変えろよ 【初心者姦ゲイ】C/C++室 Ver.100【姦狂依存OK】
791 名前:デフォルトの名無しさん mailto:sage [2017/07/02(日) 16:36:49.35 ID:1Me6IR2g.net] >>777 無視できる場合もあるし出来ない場合もある floatや半精度があるのはそれで十分な場合があるから
792 名前:デフォルトの名無しさん mailto:sage [2017/07/02(日) 16:37:57.96 ID:1Me6IR2g.net] doubleより前に、整数演算の誤差を学ばなければならないレベルかも
793 名前:デフォルトの名無しさん mailto:sage [2017/07/02(日) 16:42:50.35 ID:1Me6IR2g.net] >>765 >>768 >>777 まとめて
794 名前:デフォルトの名無しさん mailto:sage [2017/07/02(日) 17:12:26.96 ID:ZK/8Emjh.net] コーディング規約で float、doubleは使用禁止が正解
795 名前:デフォルトの名無しさん mailto:sage [2017/07/02(日) 18:20:54.13 ID:p749GQFM.net] 1/3の結果に3を掛けても1にならないとか、 0.1を10回足し合わせても1と一致しないとか、 その辺りは分かっているのかな?
796 名前:デフォルトの名無しさん mailto:sage [2017/07/02(日) 18:24:15.36 ID:p749GQFM.net] >>782 質問者は浮動小数点数の演算のどこに注意点があるか分かっていない状態で、 いいから浮動小数点数は使うな、 というのは回答として乱暴過ぎるだろう。
797 名前:デフォルトの名無しさん mailto:sage [2017/07/02(日) 18:38:08.40 ID:FdY2ZCkQ.net] ・同じ計算をするんでも なるべく精度の高いアルゴリズムを選ぶ ・0との比較では、絶対値と計算機epsilonの比較を用いる 他にある?
798 名前:デフォルトの名無しさん mailto:sage [2017/07/02(日) 18:50:30.43 ID:MoO3L/4V.net] >・0との比較では、絶対値と計算機epsilonの比較を用いる 何かとごっちゃになってる気がする。 計算の収束判定等で用いるのは機械イプシロンじゃない。
799 名前:デフォルトの名無しさん [2017/07/02(日) 19:09:48.56 ID:MlDTzv8m.net] >>785 0との比較に限らず、比較には絶対値の大きさに応じたεの考慮が必要。
800 名前:デフォルトの名無しさん mailto:sage [2017/07/02(日) 19:18:00.04 ID:ttjnRDkm.net] 機械イプシロンはあくまでも最大値だよね
801 名前:デフォルトの名無しさん mailto:sage [2017/07/02(日) 20:17:22.84 ID:+3axEb/N.net] 初めて知りました
802 名前:デフォルトの名無しさん mailto:sage [2017/07/02(日) 20:44:23.29 ID:+3axEb/N.net] 数桁のdouble計算で誤差が問題になる場面では「誤差が存在する」ことが問題であって、精度を上げることは(誤差の大小は)本質的な解決でないような (3.1 - 2.9 > 0.2) != (3.1 > 2.9 + 0.2)みたいな
803 名前:デフォルトの名無しさん [2017/07/02(日) 21:37:11.95 ID:9wrwY3nx.net] 計算順序で誤差が違ってくるのは教科書でよくかいてある
804 名前:デフォルトの名無しさん mailto:sage [2017/07/02(日) 22:54:19.38 ID:ynDhLM7Z.net] 情報処理資格に受かっていない人が、C/C++ をプログラミングするなど、10年早い C/C++ は、直接デバイスを扱うから、自作パソコンを作れるぐらいに、 かなりパソコン内部の装置の仕組みを、知っていないと無理 さらに組み込みなら、高度情報処理のエンベッド資格も必要
805 名前:デフォルトの名無しさん [2017/07/02(日) 22:59:43.93 ID:9wrwY3nx.net] そんなことはない
806 名前:デフォルトの名無しさん mailto:sage [2017/07/02(日) 22:59:50.00 ID:MoO3L/4V.net] お前は試験に受かってからプログラミング始めるのかw
807 名前:デフォルトの名無しさん mailto:sage [2017/07/02(日) 23:03:16.06 ID:UYpoTCPe.net] パソコンって、アドレスバスの、メモリ読み書きで、 デバイスを、直接操作するのか? それとも、アドレスA0000に文字を書き込むのか? その知識、30年くらい、遅くね?
808 名前:デフォルトの名無しさん mailto:sage [2017/07/02(日) 23:32:00.58 ID:1Me6IR2g.net] >>782 整数も除算に誤差があるから禁止
809 名前:デフォルトの名無しさん mailto:sage [2017/07/02(日) 23:32:37.56 ID:1Me6IR2g.net] >>783 整数でも1/3*3は1にならない
810 名前:デフォルトの名無しさん mailto:sage [2017/07/02(日) 23:35:11.82 ID:1Me6IR2g.net] >>785 コストも考えなさい epsilonは>>786 の通り 補足すると、 収束判定に限らず、普通はepsilonで判定しない
811 名前:デフォルトの名無しさん mailto:sage [2017/07/02(日) 23:36:02.92 ID:iWsKHD5Z.net] 0になるし誤差はないな
812 名前:デフォルトの名無しさん mailto:sage [2017/07/02(日) 23:36:20.12 ID:1Me6IR2g.net] >>792 情報処理資格www なんの役にもたたない
813 名前:デフォルトの名無しさん mailto:sage [2017/07/02(日) 23:36:31.36 ID:iWsKHD5Z.net] って触れちゃダメな奴だったかすまん
814 名前:デフォルトの名無しさん mailto:sage [2017/07/02(日) 23:38:56.12 ID:+3axEb/N.net] 前回、共用体の非アクティブメンバーアクセスが許されるcommon initial sequenceの条件である「型の互換性」に目を付けたレスを見た時は >>792 がもう少し見所の有る奴だと思っていた(過去形)
815 名前:デフォルトの名無しさん mailto:sage [2017/07/02(日) 23:51:33.15 ID:p749GQFM.net] >>797 すまん、1/3は1.0/3とか書くべきところだったな。 [] [ここ壊れてます]
817 名前:デフォルトの名無しさん mailto:sage [2017/07/02(日) 23:53:35.08 ID:1Me6IR2g.net] いやいやそこじゃなくて
818 名前:デフォルトの名無しさん mailto:sage [2017/07/02(日) 23:55:20.40 ID:1Me6IR2g.net] 1.0/3.0*3.0 が 1.0にならないことがある 1/3*3 が 1にならない 小数演算特有ではない
819 名前:デフォルトの名無しさん mailto:sage [2017/07/02(日) 23:59:40.73 ID:1Me6IR2g.net] 0.1を10回足しても1にならないことがあるって言うのも小数特有ではない 0.1は普通のfloatやdoubleでは表現できず、コンパイル時に近似値に変換する この意味では以下と本質的には同じ int a = 0.1; int b = a * 10;
820 名前:デフォルトの名無しさん [2017/07/03(月) 00:01:24.04 ID:UYk8Gv77.net] >>792 自作って高価なプラモデルだぞ。。。 夢見過ぎ。 直接ってもなぁ。。。 昔はx86限定で直接レジスタ弄れる命令あったんだが、その命令は今じゃ優先的にレジスタ使ってね☆って意味に変質してるもんなぁ。。。 今のCは思ってるより下級言語じゃ無いぞ。 普通の言語よりゃハードに近いけどさ。
821 名前:デフォルトの名無しさん mailto:sage [2017/07/03(月) 00:02:29.57 ID:Ds1QZZUB.net] doubleがintに比べて誤差が少ないため、誤差を気にせずに使ってしまいやすい だから注意の意味を含めて誤差が大袈裟に語られる傾向がある 当然整数の方が(普通は)はるかに誤差が大きい
822 名前:デフォルトの名無しさん mailto:sage [2017/07/03(月) 00:03:12.56 ID:NRAuceWo.net] >>805 それは知ってるけど元の質問者がdoubleの演算誤差について聞いているのだから、整数の除算の件は話が外れていると思う。 この手のスレに良くあることだけど、元の質問から勝手に話が発散して何を目的に議論しているのかが分からなくなるね。
823 名前:デフォルトの名無しさん mailto:sage [2017/07/03(月) 00:04:40.53 ID:Ds1QZZUB.net] いやだから、 気を付けるべき点は >>769 の後半にまとめたつもりだけど
824 名前:デフォルトの名無しさん mailto:sage [2017/07/03(月) 00:10:25.95 ID:Ds1QZZUB.net] よくやりがちな例は、 for (double a = 0; a <= 1 ; a += 0.1) みたいな比較と double a = sqrt(3); double b = a * a; int c = b; みたいな整数丸め
825 名前:デフォルトの名無しさん mailto:sage [2017/07/03(月) 00:12:35.84 ID:Ds1QZZUB.net] これは、 double に限らす10000桁精度の演算ライブラリでも全く同じ問題がほぼ同じ率で起こる
826 名前:デフォルトの名無しさん mailto:sage [2017/07/03(月) 00:14:47.47 ID:Ds1QZZUB.net] 前者はループが10回か11回かはバクチで、 後者はcが2になるか3になるかはバクチ
827 名前:デフォルトの名無しさん [2017/07/03(月) 00:19:44.20 ID:UYk8Gv77.net] なんかそんなの読んだことあるな。 計算結果は精度の範囲内だけど、計算途中で精度超えて結果に誤差が出る的な。 なんか対策あったぞ。
828 名前:デフォルトの名無しさん mailto:sage [2017/07/03(月) 04:06:04.60 ID:yzYakBEJ.net] >>798 普通は計算機epsilonで判定は しない、これはわかりました じゃあどんな値で判定するんですか?
829 名前:デフォルトの名無しさん mailto:sage [2017/07/03(月) 04:57:07.32 ID:BlNCaFmm.net] >>792 カーニハンもリッチーも受かっていないようだが?
830 名前:デフォルトの名無しさん mailto:sage [2017/07/03(月) 08:32:52.95 ID:rvaVDuHz.net] >>815 対象の値が含み得る誤差を用いる。 機械イプシロン(を指数によってスケールしたもの)は誤差の下限を示しているだけに過ぎない。
831 名前:デフォルトの名無しさん mailto:sage [2017/07/03(月) 11:17:36.99 ID:rWGDP/Vn.net] 下限ではない 下限はその半分
832 名前:デフォルトの名無しさん [2017/07/03(月) 19:44:02.70 ID:BsrmCust.net] VisualC++とそれ以外用とで別の関数を用意して、プリプロセッサを使用してコンパイル時に選択したいと思っています この場合、関数全体を#ifdef _MSC_VER〜#endifで囲うことになるのですか? もう少しきれいな書き方があれば教えてください よろしくお願いします
833 名前:デフォルトの名無しさん mailto:sage [2017/07/03(月) 20:12:56.57 ID:oiFj/hKr.net] >>819 機種依存部分をライブラリ化してリンク時に差し替えるとか
834 名前:デフォルトの名無しさん mailto:sage [2017/07/03(月) 20:21:04.11 ID:tl3oQzgh.net] 関数全体を切り替えたいなら関数全体を複数記述するしかあるまい 部分的に違うだけならその違う部分的だけ切り替えればいい 関数全体を複数記述する方法はいくつかある
835 名前:デフォルトの名無しさん mailto:sage [2017/07/04(火) 00:10:04.57 ID:2/r2iAfu.net] >>819 別にそれでいいじゃん。大量にあるならファイル分ければいいし
836 名前:デフォルトの名無しさん [2017/07/04(火) 09:38:28.01 ID:GKwjzP9N.net] class A {} int main{ A a; //c++ A a = new A(); //c# } このc++の「A a;」は、c#の「A a = new A();」と同じ意味ということでいいんですか?
837 名前:デフォルトの名無しさん mailto:sage [2017/07/04(火) 10:10:55.61 ID:A8K7ipT2.net] >>823 同じになるねぇ あえて違う点を挙げるとすればAが作成される領域がスタックかヒープか でも意識するほどのことじゃない
838 名前:デフォルトの名無しさん [2017/07/04(火) 10:53:00.81 ID:GKwjzP9N.net] >>824 スッキリしました。ありがとうございます。
839 名前:デフォルトの名無しさん mailto:sage [2017/07/04(火) 12:24:06.77 ID:rriFyG5E.net] いやC++やるならスタックかヒープかは意識しなきゃだめだろ deleteどうすんの
840 名前:デフォルトの名無しさん mailto:sage [2017/07/04(火) 12:53:41.35 ID:Tv7aUxog.net] >>824 > Aが作成される領域がスタックかヒープか いや、それは意識しろよ
841 名前:デフォルトの名無しさん mailto:sage [2017/07/04(火) 16:07:16.69 ID:BdJEhj1W.net] ヒープはC#の方だろ、とりあえず意識しないでも
842 名前:デフォルトの名無しさん mailto:sage [2017/07/04(火) 17:16:06.09 ID:RU97axJ4.net] C#はdelete書かないんだからC++なら deleteが不要な「A a;」を同等と捉えるのが筋 配置場所なんかどうでもええ
843 名前:デフォルトの名無しさん mailto:sage [2017/07/04(火) 18:37:27.41 ID:eP5xPbfu.net] newだとスコープ抜けても残るんじゃ?
844 名前:デフォルトの名無しさん mailto:sage [2017/07/04(火) 18:44:00.48 ID:xAcMjOR1.net] C#だとスマポみたいになるんかね
845 名前:デフォルトの名無しさん mailto:sage [2017/07/04(火) 19:56:18.89 ID:3bDdeHlE.net] c#はGC管理、classは参照型
846 名前:デフォルトの名無しさん mailto:sage [2017/07/04(火) 20:17:33.06 ID:olJiM2Cb.net] >>829 寿命が全然違うじゃないですかぁ
847 名前:デフォルトの名無しさん mailto:sage [2017/07/04(火) 20:31:05.28 ID:L7t36fm1.net] コストも
848 名前:デフォルトの名無しさん mailto:sage [2017/07/04(火) 21:02:27.05 ID:V6j6UQbw.net] で?
849 名前:デフォルトの名無しさん mailto:sage [2017/07/04(火) 21:52:57.05 ID:+pBAjacr.net] すげえ考え方の奴が出てきてワロッシュ
850 名前:デフォルトの名無しさん mailto:sage [2017/07/04(火) 22:13:30.60 ID:kiqPrlXB.net] 寿命だのコストだの言うけど そんな実相依存どうやって見積もるの? 無意味な揚げ足取りはやめたら?
851 名前:デフォルトの名無しさん mailto:sage [2017/07/04(火) 22:14:59.82 ID:VwPftttd.net] え?
852 名前:デフォルトの名無しさん mailto:sage [2017/07/04(火) 22:17:16.01 ID:TrkY+sIz.net] C++ 側は実装依存な部分あるっけ? C#側はよーわからんけど
853 名前:デフォルトの名無しさん mailto:sage [2017/07/04(火) 22:19:25.34 ID:dCdz+uzl.net] こっちはC++スレだぞ?C++でスタックとヒープのコストや寿命の違いを意識する必要がないってマジでいってるのかよ
854 名前:デフォルトの名無しさん mailto:sage [2017/07/04(火) 22:29:39.22 ID:kiqPrlXB.net] newの方はC#のって前置きがあるだろうが よく読め まあ元々の質問もあれだが
855 名前:デフォルトの名無しさん mailto:sage [2017/07/04(火) 22:42:25.19 ID:IS9gvNe4.net] コストは c++のnew>>(超えられない壁)>>c#のnew>スタック 全然違うというほどでもないし
856 名前:デフォルトの名無しさん mailto:sage [2017/07/04(火) 23:02:36.26 ID:olJiM2Cb.net] コストは置いておいたとしても寿命はどうするんだよ 平たく言うと 「マニュアル車の1速は、オートマ車のDと同じ意味ですか?」 って質問だぞ それに対して 「オートマ車はDで発進するからマニュアル車なら1速と同等ととらえるのが筋 速度が出た後のことなんかどうでもええ」 ってのはなんか違うだろ メモリ管理に関してはC++はマニュアルでC#はオートなんだから こういうたとえになるんだよ
857 名前:デフォルトの名無しさん mailto:sage [2017/07/04(火) 23:10:09.31 ID:VgVQ93XC.net] >>837 おまいさん資格持ちじゃないよな?な?な?
858 名前:デフォルトの名無しさん mailto:sage [2017/07/04(火) 23:15:08.21 ID:olJiM2Cb.net] あと、C#はJavaと違って構造体が使えてこれは値型になれるから スタックに確保できる なんで、C++の A a; はどちらかというと、そちらに該当するんだよ で、C#のA a = new A(); はというと delete が必要という一点を除けば C++ の A *a = new A();に相当するんだよ こんなこと当たり前だろ
859 名前:デフォルトの名無しさん mailto:sage [2017/07/04(火) 23:23:27.06 ID:9HpxJyun.net] >>845 実装と目的を一緒にすんなよタコ 単に「Aのインスタンス生成するコード書いてみ」 といわれたら>>823 になるだろjk 意味が同じってのはそういうこった
860 名前:デフォルトの名無しさん mailto:sage [2017/07/04(火) 23:33:11.25 ID:AVhuZxl1.net] >>842 えっ??? そんな馬鹿な
861 名前:デフォルトの名無しさん mailto:sage [2017/07/04(火) 23:38:27.02 ID:olJiM2Cb.net] >単に「Aのインスタンス生成するコード書いてみ」 ってのはお前が勝手に言ってることだろ 元は >このc++の「A a;」は、c#の「A a = new A();」と同じ意味ということでいいんですか? だ
862 名前:デフォルトの名無しさん mailto:sage [2017/07/04(火) 23:38:59.24 ID:AKPIjSm8.net] 超えられないかはともかく、newに限って言えばGC言語の方が低コストでもおかしくない。
863 名前:デフォルトの名無しさん mailto:sage [2017/07/04(火) 23:39:54.18 ID:kiqPrlXB.net] 厳密にどうかじゃないんだよ 初心者がこれから言語を勉強していくのに より得になる方はどっちだってことよ GCだからー、ヒープだからーって そんな答えおよびじゃないっつーの
864 名前:デフォルトの名無しさん mailto:sage [2017/07/04(火) 23:40:16.44 ID:AVhuZxl1.net] 実際に試してから言えよ
865 名前:デフォルトの名無しさん mailto:sage [2017/07/04(火) 23:40:38.87 ID:AVhuZxl1.net] >>842 >>849
866 名前:デフォルトの名無しさん mailto:sage [2017/07/04(火) 23:43:53.74 ID:olJiM2Cb.net] どの程度の初心者かわからないだろ C#と比べてるってことは既にC#をそこそこマスターしているかもしれないだろ その状態でC++に手を出そうとしていたとしたら、どうだ? C#とC++の違いなどを書いたほうが良いだろ
867 名前:デフォルトの名無しさん mailto:sage [2017/07/04(火) 23:46:31.14 ID:tvZqc0j8.net] >>850 初心者だからこそ、上っ面の文法の違いだけで捉えて、こうすればだいたい同じとか説明する前に、 前提としてメモリ管理の考え方が違うことを理解してもらうのは重要だろう。
868 名前:デフォルトの名無しさん mailto:sage [2017/07/04(火) 23:47:41.62 ID:AVhuZxl1.net] 違うものは違う
869 名前:デフォルトの名無しさん mailto:sage [2017/07/04(火) 23:48:12.47 ID:VwPftttd.net] もういいよ、まとめると C++ではインスタンス生成(アドレスの決定)は二種類のやり方がある A a; A* pa = new A(); 前者はスタックのアドレスが割り当てられ、後者は通常はヒープのアドレスが割り当てられる。 前者はスコープが寿命で、後者はdelete pa;されるまでが寿命。 C#ではインスタンス生成の方法は値型、参照型でそれぞれ一種類ずつしかなく、 A a; //struct A B b = new B(); //class B 前者はスタックのアドレスが割り当てられ、後者はヒープのアドレスが割り当てられる。 前者はスコープが寿命で、後者はdelete pa;されるまでが寿命。 どれとどれを同じと思うかは人それぞれ。 終了
870 名前:デフォルトの名無しさん mailto:sage [2017/07/04(火) 23:50:58.52 ID:TrkY+sIz.net] C# の後者の寿命は? delete pa は C++ だよね
871 名前:デフォルトの名無しさん mailto:sage [2017/07/04(火) 23:53:27.36 ID:VwPftttd.net] >>856 おっと、間違えた C#の後者の寿命はGCに回収されるまででした
872 名前:デフォルトの名無しさん mailto:sage [2017/07/05(水) 00:46:01.47 ID:EyHtcvE8.net] >>856 ご苦労さん 何故この話題がここまで伸びたんだろ
873 名前:デフォルトの名無しさん mailto:sage [2017/07/05(水) 22:56:44.72 ID:UhWlQCq1.net] 異なる考えの言語同士であるため対応が自明でないという事実を無視して 自分の考える「同じ意味」の解釈を押し付けるからに相違ない >C#ではインスタンス生成の方法は値型、参照型でそれぞれ一種類ずつしかなく、 >A a; //struct A なるほどこうやって言語仕様を確認せず想像をたれ流すので世の中が嘘だらけになるのだな
874 名前:デフォルトの名無しさん mailto:sage [2017/07/05(水) 23:29:36.43 ID:0KIeSgEp.net] >>860 ん、C#のほうはそれであってるだろ StringとかDateTimeみたいな一部の例外を除けば
875 名前:デフォルトの名無しさん mailto:sage [2017/07/06(木) 01:22:17.04 ID:AOJFjP+S.net] >異なる考えの言語同士であるため対応が自明でないという事実を無視して >自分の考える「同じ意味」の解釈を押し付けるからに相違ない ん?だからそれに基づいてほとんどの人は 「違う意味だよ〜」って言ってたんじゃなかったの? 一部の人が「同じような意味だよ〜」って言ってただけで それに反論する流れだったでしょ だから「同じ意味」の解釈の押し付け合いはしてなくて 同じ意味だよ vs 違う意味だよ だったと思うけど
876 名前:デフォルトの名無しさん mailto:sage [2017/07/06(木) 05:15:51.23 ID:5a/RGiY/.net] わざわざ堅苦しい言葉選んで俺偉いアピール
877 名前:デフォルトの名無しさん mailto:sage [2017/07/06(木) 05:29:37.28 ID:T7F4pxe5.net] 同じ様な意味と同じ意味は違う さらっと言葉をすり替えるなよ まったく卑怯な奴よの (つーか同じ様な意味とも言っていない)
878 名前:デフォルトの名無しさん mailto:sage [2017/07/06(木) 08:09:44.50 ID:TSgBvSRK.net] >>862 >だから「同じ意味」の解釈の押し付け合いはしてなく 「同じ意味」の基準について合意していないのに「ここが違うから別」とだけ言うのは「同じ意味」の解釈の押し付けに他ならないと思うのだが、 もう少し日本語の字面でなく意味を理解した方がよいのではないか >「違う意味だよ〜」って言ってたんじゃなかったの? →Yes >同じ意味だよ vs 違う意味だよだった →Yes
879 名前:デフォルトの名無しさん mailto:sage [2017/07/06(木) 08:11:58.37 ID:rcg+ZZ7N.net] 違うものは違う
880 名前:デフォルトの名無しさん mailto:sage [2017/07/06(木) 08:12:32.60 ID:TSgBvSRK.net] >>861 合っているかと訊かれれば合っていないので、言語仕様を読むか当該のスレッドで訊くのが良いのでは あとStringやDateTimeの例外というのが何なのかよくわからなかった
881 名前:デフォルトの名無しさん mailto:sage [2017/07/06(木) 08:18:45.02 ID:QfwLuwwY.net] >>867 合ってるから消えろ https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/new-operator
882 名前:デフォルトの名無しさん mailto:sage [2017/07/06(木) 14:54:52.15 ID:m/Ia1fy1.net] まだやってんのかよ おまいらのこだわりはスゲェな
883 名前:デフォルトの名無しさん mailto:sage [2017/07/06(木) 22:06:42.25 ID:TSgBvSRK.net] リンク先を見て思ったのだが こだわりじゃなくて罵られることに喜びを覚えるマゾなのではないかと言う気がした
884 名前:デフォルトの名無しさん mailto:sage [2017/07/06(木) 22:08:34.16 ID:JPWXM8i2.net] >>870 正しく指摘できないのならレスしないほうがいい あなたの思ういちばんすこいC#の仕様の世界で生き続けてくだはい アーメン
885 名前:デフォルトの名無しさん mailto:sage [2017/07/07(金) 11:58:06.67 ID:C1hAccX9.net] 俺は、プログラミングなんて存在しない世界で生きたい
886 名前:デフォルトの名無しさん mailto:sage [2017/07/07(金) 12:21:24.92 ID:2bQkb9bH.net] 生まれてくるのが100年くらい遅かったようだな
887 名前:デフォルトの名無しさん [2017/07/07(金) 12:21:27.14 ID:xvg52mfm.net] プログラマ辞めれば良いだけやん。
888 名前:デフォルトの名無しさん [2017/07/07(金) 13:29:12.14 ID:1UwaMcEr.net] c++ 英語を読める btcをトレードしたことがある 仮想通貨の開発に参加してみたい方 レスをお願いします
889 名前:デフォルトの名無しさん mailto:sage [2017/07/07(金) 15:01:32.91 ID:u5D8E4qs.net] >>875 ノ んで?どうすりゃええの
890 名前:デフォルトの名無しさん [2017/07/07(金) 16:03:32.34 ID:1UwaMcEr.net] >>876 お返事ありがとうございます 通貨名 raiblocks simple instant fees 0(送金手数料がかからない) web https://raiblockscommunity.net/ slack https://raiblocks.slack.com slackに参加 #developmentにて、開発に興味がある旨の書き込みをしてください(英語で)
891 名前:デフォルトの名無しさん mailto:sage [2017/07/08(土) 21:39:10.74 ID:dFvfrYOE.net] プログラミングなんて底辺ドカタの仕事 そのうちAIがやれるようになる
892 名前:デフォルトの名無しさん [2017/07/08(土) 22:33:35.86 ID:lbAgDi9M.net] アドバイスさんくす
893 名前:デフォルトの名無しさん [2017/07/09(日) 16:06:32.28 ID:EeQkMvgZ.net] ポインタそのものにオブジェクトってできるんでしょうか? 例えば、配列arrayのアドレスをポインタpで、ポインタpのアドレスをポインタpのポインタppで調べたんですが、 int array[3]; int *p = array; int **pp = &p; for(i = 0; i < 3; i++) { printf("&array[%d] : %d : %d\n", i, &array[i]); } &array[0] : 2293472 &array[1] : 2293476 &array[2] : 2293480 &p[0] : 2293472 &p[1] : 2293476 &p[2] : 2293480 &pp[0] : 2293468 &pp[1] : 2293472 &pp[2] : 2293476 ppが参照しているpのオブジェクトの位置が、arrayのオブジェクトのアドレスと全く同じ位置にあります。 1つのアドレスが2つのオブジェクトをもてるのか、ポインタ自体にオブジェクトは生成されないのか 他の要素でそうなってるのかわかりません。どなたか回答宜しくお願いいたします。
894 名前: ◆QZaw55cn4c mailto:sage [2017/07/09(日) 16:13:17.36 ID:VF1qtZ3L.net] >>880 その出力を一挙に得られるプログラムを示せ,アドレスはプログラムの実行ごとに変わる可能性がある
895 名前:デフォルトの名無しさん mailto:sage [2017/07/09(日) 16:20:52.70 ID:v/7piv3Y.net] >>880 pとarrayは異なるオブジェクトだから確認方法が間違ってる
896 名前:デフォルトの名無しさん mailto:sage [2017/07/09(日) 16:25:25.83 ID:3Luqddjj.net] 一つのポンタを複数のオブジェなんて当たり前 int z; int * p = &z; int * p2 = p; int * p3 = p2;
897 名前:デフォルトの名無しさん [2017/07/09(日) 16:43:15.93 ID:EeQkMvgZ.net] >>881 これでいいでしょうか? int i; int array[5]; int *p = array; int **pp = &p; printf("array : %d\n", array); for(i = 0; i < 5; i++) { printf("&array[%d] : %d\n", i, &array[i]); } printf("p : %d\n", p); for(i = 0; i < 5; i++) { printf("&p[%d] : %d\n", i, &p[i]); } printf("pp : %d\n", pp); for(i = 0; i < 5; i++) { printf("&pp[%d] : %d\n", i, &pp[i]); } >>882 &ppでpのオブジェクトのアドレスを取得できると思ってたんですが違ったんですか? >>883 すいませんまだそれを理解するのは難しいです。
898 名前:デフォルトの名無しさん mailto:sage [2017/07/09(日) 16:44:50.47 ID:3Luqddjj.net] 何がわからんのや。ようわかるやんけ アドレス : オブジェクト : 値 : オブジェクトの型 2293464 : pp : 2293468 : int**型 2293468 : p : 2293472 : int*型 2293472 : array[0] : ? : int型 2293476 : array[1] : ? : int型 2293480 : array[2] : ? : int型
899 名前:デフォルトの名無しさん [2017/07/09(日) 16:51:56.41 ID:EeQkMvgZ.net] >>885 つまりポインタpは配列を参照してもp自体は配列型ではなくて単体(?)のオブジェクトだということでしょうか?
900 名前:デフォルトの名無しさん mailto:sage [2017/07/09(日) 16:56:52.17 ID:3Luqddjj.net] >>886 もちろんや。 pはarrayとは別のアドレス2293468にある int*型の独立したオブジェやで
901 名前:デフォルトの名無しさん [2017/07/09(日) 17:01:52.64 ID:EeQkMvgZ.net] >>887 ありがとうございます!5時間以上つまってたのが一気にクリアになりました!
902 名前:デフォルトの名無しさん mailto:sage [2017/07/09(日) 17:16:44.02 ID:Uu/MlKNR.net] >>880 > &pp[0] : 2293468 これはpのアドレス > &pp[1] : 2293472 > &pp[2] : 2293476 pp[1], pp[2]は存在しないからアクセスしちゃダメ たぶん 2293464: pp 2293468: p 2293472: array[0] 2293476: array[1] 2293480: array[2] みたいなメモリ割り当てになってるんだろうな
903 名前:デフォルトの名無しさん mailto:sage [2017/07/09(日) 22:31:05.00 ID:WeAgIUgc.net] >>889 意味のある値が取れないだけで 別にアクセスしても問題ねーだろ
904 名前:デフォルトの名無しさん mailto:sage [2017/07/09(日) 23:28:17.80 ID:1po+7Ikw.net] >>890 正しく割り当てられたオブジェクトのアドレス以外を指しているのなら、アクセスしてはいけないだろう。 889の例ではたまたまpp[1]が表す位置がスタック上の有効なアドレスでアラインメントも問題無いだろうけど、 例えばppがスタックやヒープの末端のオブジェクトを指していたら、pp[1]にアクセスしたらNGということもある。
905 名前:デフォルトの名無しさん mailto:sage [2017/07/10(月) 06:50:03.40 ID:ZgtWUD/x.net] 中身にアクセスしてなくてただのアドレス計算だぞ C/C++言語的にはNGだけど、それで例外が発生するとはなかなか考えにくい もしかしたらビルド時に警告を出してくれるかも
906 名前:デフォルトの名無しさん mailto:sage [2017/07/10(月) 06:54:34.99 ID:t9ouoliu.net] アドレス計算自体はOKだと思うよ。
907 名前:名無しさん@そうだ選挙に行こう! Go to vote! mailto:sage [2017/07/10(月) 07:04:04.53 ID:Ols/UzwR.net] 配列ならば確保した数+1までのアドレス計算はやっても大丈夫&整合がとれる位置に配置されている
908 名前:名無しさん@そうだ選挙に行こう! Go to vote! mailto:sage [2017/07/10(月) 07:05:58.47 ID:ZgtWUD/x.net] 無効エリアのアドレス計算 値不定か動作不定かどっちだか忘れた これらをOKと呼ぶならOKなんでしょう
909 名前:名無しさん@そうだ選挙に行こう! Go to vote! mailto:sage [2017/07/10(月) 07:13:12.05 ID:ZgtWUD/x.net] >>894 -1も有効だとうれしい事があるけど、-1はダメなんだよね
910 名前:デフォルトの名無しさん mailto:sage [2017/07/10(月) 22:27:20.57 ID:WIOZS2V0.net] >>894 つまり式「&pp[1]」は大丈夫でないと?
911 名前:デフォルトの名無しさん mailto:sage [2017/07/11(火) 13:12:04.11 ID:eWIFW1BW.net] ppは配列じゃないだろ
912 名前:デフォルトの名無しさん mailto:sage [2017/07/11(火) 18:17:43.80 ID:L5b0rMHK.net] これがアスペいうやつだな 配列でないオブジェクトも要素数1の配列として考える仕様→よくご存知で pは配列じゃないからな→わかる ppは配列じゃないからな→頭悪いな ppは配列じゃないだろ→アスペ
913 名前:デフォルトの名無しさん mailto:sage [2017/07/11(火) 20:17:20.41 ID:gS+YojZ9.net] ん?まったくよくわからんのだが、だれか解説して >配列でないオブジェクトも要素数1の配列として考える仕様 ↑まずこれがよくわからない 配列じゃないオブジェクトといえば、例えばint i;などは配列としては扱えないよね で、下二行の意味も分からない
914 名前:デフォルトの名無しさん mailto:sage [2017/07/11(火) 22:08:22.53 ID:qjau/h5c.net] 配列かどうかは関係なく、オブジェクトの後ろのアドレスは計算も出来るし比較も出来る
915 名前:デフォルトの名無しさん mailto:sage [2017/07/11(火) 22:10:11.51 ID:qjau/h5c.net] >>894 は配列じゃない場合に関しては何も言ってないから間違いではないが わざわざ配列と書いてるので配列以外は違うと思ったかわからなかったか だろう
916 名前:デフォルトの名無しさん mailto:sage [2017/07/11(火) 22:14:58.67 ID:qjau/h5c.net] >>897 「つまり」が意味不明 >>894 は配列じゃない場合には何も言ってない 「大丈夫でない」は正しい >>898 配列じゃないから何? >>899 実際には配列ではない
917 名前:デフォルトの名無しさん mailto:sage [2017/07/11(火) 22:28:18.47 ID:gS+YojZ9.net] いや、それは俺も思ったんだが ppが配列じゃないのは当たり前なんだが(てかポインタだし) おそらくはそんなことは問うてないって言いたいんだと思う つまり、ppが指している先が何であるかが問題であるから 配列か配列じゃないかを問うべきはppではなくppの指している先である「p」であろうと 同じことをもう一度言うけど pp[1]としたとき問題になるのはppの指してる先がどうなっているかで 今回の場合はそれは「p」であるから 正しくは、「ppの指してる先のpは配列じゃないだろ」って言うべきっていう主張かと
918 名前:デフォルトの名無しさん mailto:sage [2017/07/11(火) 23:00:18.82 ID:634mVLA8.net] >>901 なら&pp[1]も大丈夫なんじゃね?
919 名前:デフォルトの名無しさん mailto:sage [2017/07/12(水) 07:01:19.46 ID:Mf+sZV2C.net] pp[1]の時点で動作不定 正しく動かない環境はもしかしたら存在しないかもしれないけど
920 名前: ◆QZaw55cn4c mailto:sage [2017/07/12(水) 07:26:19.94 ID:9q9UgJkW.net] >>880 ん、最初にもどってメッセージを書くとすれば、こうなるかな >ポインタそのものにオブジェクトってできるんでしょうか? 私が意味を取り違えているかもしれないが、「できない」 ポインタを取得したからといって、オブジェクトが生えてくることはない あくまで、先にオブジェクトを確保した上で、それに対してポインタを設定する手順をとる >例えば、配列arrayのアドレスをポインタpで、ポインタpのアドレスをポインタpのポインタppで調べたんですが、 array を確保しているので、p は array 確保分(p 〜 p + 3)だけプログラムとして意味がある。 pp は p 一個分だけ意味がある。すなわち *pp = p、でも pp[1]= *(pp + 1) は確保していない領域を指すのでこの表現は使ってはいけない &pp[1] と書くとなにがしかのアドレスを生成するが、それは使えない アドレスを生成できるからといって、その領域が意味のあるものとは限らない >>881 では意味のないことを求めてしまいごめんなさい
921 名前:デフォルトの名無しさん mailto:sage [2017/07/12(水) 08:20:30.93 ID:SNfdy8To.net] >>906 >pp[1]の時点で動作不定 ちなみにそれを規定する規格の記述はどこ? Cでは明確に禁止されているようだがC++では見つけられなかった
922 名前:デフォルトの名無しさん mailto:sage [2017/07/12(水) 09:01:11.94 ID:6a7v2dDL.net] https://www.google.com/search?q=%22behaves+the+same+as+a+pointer+to+the+first+element+of+an+array+of+length+one%22
923 名前:デフォルトの名無しさん mailto:sage [2017/07/12(水) 09:10:12.68 ID:6a7v2dDL.net] https://www.google.com/search?q=%22If+both+the+pointer+operand+and+the+result+point+to+elements+of+the+same+array+object%2C+or+one+past+the+last+element+of+the+array+object%22+%22otherwise%2C+the+behavior+is+undefined%22
924 名前:デフォルトの名無しさん mailto:sage [2017/07/12(水) 13:20:57.39 ID:ahqaJGrL.net] >>907 まとめとしてはそれでいいし否定するわけじゃないけど、若干気になるのは 1.ポインタ自身もポインタというオブジェクトじゃないのか? 2.末尾+1のアドレス(を指すポインタ)はデリファレンスできないけど、大小比較には使えるのでは
925 名前:デフォルトの名無しさん mailto:sage [2017/07/12(水) 13:41:52.51 ID:uqOuLEsE.net] そんで俺はちょっと思ったんだけど Cはポインタを配列のように扱えるのが便利だなぁと 逆に配列名を参照したらポインタ値になるし あと他、関数ポインタを普通の関数のように扱えたり 逆に関数名を参照したらポインタ値になったり 意味の上で別解釈しようがないからそれでいいだろ、的な 二つに共通しているのは (1)参照しても意味のある値が得られなそうなシンボルは自動的にポインタ値に成り下がってもらおう (2)その上でポインタに対していろいろな演算 ()[] が出来るようにしておこう というもので、これでシームレスになるしタイプも減るから便利だろう、と でもそういう方針なんだったら何故我々は「.」と「->」を 使い分けなきゃならないんだ?と思わんこともない 意味の上で別解釈できたり不明瞭だったりは無いのに ただ、Cの構造体は(1)を満たしていない もし(1)を満たすようにしてしまうと、構造体を参照するとポインタ相当に成り下がってしまうので 代入演算子で代入したり、関数に値渡ししたりが出来なくなる ただし、C言語がそのような仕様になっていた可能性は十分にあると思う というのも配列がまさにそうであって、代入でコピーできないし、関数に値渡し出来ないから アセンブリレベルでは配列も構造体もレジスタに入りきらないという意味では同じで 先頭アドレスからのオフセットでアクセスするのは同じであるから そういう着想に基づけば、構造体も配列と同じようにポインタに成り下がる仕様に なっていた可能性はあると思う 構造体は代入できないからmemcpyしろ、がCの常識だった可能性はある そんで、「.」演算子は構造体のポインタに対して有効、となって、「->」は無くなる で、そうはしなかった代わりに「->」演算子が有る、とも取れる
926 名前:デフォルトの名無しさん mailto:sage [2017/07/12(水) 13:42:12.78 ID:uqOuLEsE.net] 気まぐれか、意図的か、歴史的事情か、生い立ちに由来するものか、知らんが、そうなっている だが実際これが大当たりで、もしそうじゃなかったらC++が全く成り立ってこない C++のクラスはCの構造体を拡張したものだが、オブジェクトが勝手にポインタに成り下がる仕様だと 代入したり、関数のreturnで値として返したりができない となれば独自のクラスを定義して、まるで基本型のように振舞わせたり、メソッドチェーンをしたりが出来ない もしやるとしたらnewして返すしかないので、GCが無いとどうにもならなかっただろう (実際C++とCの配列は相性が悪く、std::vectorかstd::arrayを使わないと上手くいかない場合も多い ポインタ相当に勝手に成り下がってしまうので代入ができない) ただ、このことが本当に良かった事なのかどうなのかは分からない GCは有ったほうが良かったかもしれないし、C++の代入やコピーコンストラクタに関する話題は後を絶たない 他の言語のほとんどがオブジェクトを参照で扱うのを見てると Cの配列のように勝手にポインタに成り下がって代入できない考え方のほうがスタンダードなのかもしれない C++のクラスは、状況に合わせて、これを選べ
927 名前:驕Aという立場になってるが もしCの構造体が配列のような仕様だったなら、どうなっていたか分からなかった事を考えると感慨深い [] [ここ壊れてます]
928 名前:デフォルトの名無しさん mailto:sage [2017/07/12(水) 13:43:43.81 ID:uqOuLEsE.net] よくよく考えてみればなかなかに奇妙 まず常人が普通に考えたら、配列や関数名を参照したらポインタ値が得られることにしようっていう発想がない プログラマは基本的に几帳面で、整合性を気にする生き物だから ポインタ値は「&」を付けたら得られることにしよう、と決めたのだから &arrayとか&funcとか書かせたくなるのが普通だろう そして(*array_ptr)[1]とか(*func_ptr)()とか書かせたくなるものだろう ところがCは、レジスタに乗らないもの、演算できないもの、を 勝手にポインタと同等に格下げするというルールを設けたうえで そのポインタに対して各種演算子を定義することで整合性を保ちつつタイプ数を減らすという ウルトラCをやってのけた ここまででも俺ではちょっと思いつかないなーと感心するわけだが 逆にこんなすごいことを思いついたんなら、全部このルールで行きたくなってくるのが凡人 その方が整合性がありそうな気がするから なのに構造体はそうなっていなくて、代わりにアロー演算子が定義してある だから配列と違って構造体は代入ができるし関数に値渡ししたり、値で返したりが出来る それはそれで奇妙なことだと思ったりもするが、とにもかくにも この辺がC++の基本方針や特色にものすごく影響が出てる GCが無いのもそうだし、最近でも右辺値参照が追加されたりとか、結構尾を引いていて C++特有のややこしさの一端でもあり、他には代えがたいメリットでもある ある意味で、Cの配列の考え方のが、他言語のオブジェクトの考え方に近いというのが何とも そして構造体をベースとするC++とCの配列は相性が悪いという C言語の功罪は凄い
929 名前:デフォルトの名無しさん mailto:sage [2017/07/12(水) 13:48:37.49 ID:vq82ZnF5.net] 3行で(´・ω・`)
930 名前:デフォルトの名無しさん mailto:sage [2017/07/12(水) 17:58:12.38 ID:SNfdy8To.net] 駄レスの関係無いリンク先をまじまじと読んでしまった 日本語でレスが書かれていない時点で読む価値が無いと判断すべきだった
931 名前:デフォルトの名無しさん mailto:sage [2017/07/12(水) 18:07:40.57 ID:SNfdy8To.net] >>915 「初期のK&Rが至高と考えるボクは 構造体がコピーできる仕様にハンタイです」
932 名前:デフォルトの名無しさん [2017/07/12(水) 18:19:22.64 ID:Oma/x2r0.net] ユーザーヘッダーファイルを作って #include<stdio.h> #include<math.h> #define PI 3.14 double r; void nyuuryoku(void) { printf("半径を入力してください。\n"); scanf("%fl", &r); printf("%f\n", r); return; } double keisan(void) { printf("%f\n", r); return PI*pow(r, 2); } と書いてprintfでrを観察してみたんですがscanfでrに数値を入力しているはずなのにrに何も反映されていないことがわかりました。 rはグローバル変数として扱われていると思うのですがなんでrの値が変わらないんでしょうか?
933 名前:デフォルトの名無しさん mailto:sage [2017/07/12(水) 18:34:20.99 ID:+I30gFZ0.net] void nyuuryoku(void) { char buf[256]; printf("半径を入力してください。\n"); if(NULL==fgets(buf,sizeof(buf),stdin)){ printf("ちゃんと入力しろやボケ\n"); return; } sscanf(buf,"%fl", &r); printf("%f\n", r); return; }
934 名前:デフォルトの名無しさん mailto:sage [2017/07/12(水) 18:44:41.01 ID:FRCEttse.net] >>918 × scanf("%fl", &r); ○ scanf("%lf", &r);
935 名前:デフォルトの名無しさん mailto:sage [2017/07/12(水) 18:45:48.34 ID:+I30gFZ0.net] %lfちゃうか?
936 名前:デフォルトの名無しさん mailto:sage [2017/07/12(水) 18:46:07.89 ID:+I30gFZ0.net] 失礼しますた
937 名前:デフォルトの名無しさん [2017/07/12(水) 18:49:05.30 ID:Oma/x2r0.net] oh.... コンパイラも見逃してくれてたからそんなミスとは思いませんでした(´エ`;) ありがとうございました
938 名前:デフォルトの名無しさん mailto:sage [2017/07/12(水) 19:24:59.74 ID:iSKiMIM1.net] -Wallつけるか、clang使え
939 名前:デフォルトの名無しさん mailto:sage [2017/07/12(水) 21:38:59.46 ID:Q4X+sAyq.net] >>912-914 なんか色々勘違いしてるしどうでもいいから続きはチラウラで頼むわ
940 名前:デフォルトの名無しさん mailto:sage [2017/07/12(水) 23:05:57.46 ID:2e79StFo.net] 最近のチラシは両面印刷で困る
941 名前:デフォルトの名無しさん mailto:sage [2017/07/13(木) 00:31:49.82 ID:/oMuxl/G.net] >>907 >pp[1]= *(pp + 1) は確保していない領域を指すのでこの表現は使ってはいけない Cの規格をよく読み直したらそうでもなかった
942 名前:デフォルトの名無しさん mailto:sage [2017/07/13(木) 01:06:35.55 ID:+2MHjXyv.net] >>912-914 は基礎的なところで間違った理解をしていると そのうえに乗っかるすべてのものについて間違った理解をすることしかできなくなるという見本のようだ
943 名前: ◆QZaw55cn4c mailto:sage [2017/07/13(木) 06:27:44.49 ID:NDMOLt7F.net] >>927 >>880 int **pp = &p; でpp[1] は書いちゃだめだろう?
944 名前:デフォルトの名無しさん mailto:sage [2017/07/13(木) 07:12:43.09 ID:/oMuxl/G.net] >929 その書いちゃダメを規定する6.5.6p8には「that is evaluated」という条件がある evaluateはメモリアクセスの有無と関係無く基本的に全て行われるはずだが 6.5.3.2p3の例外既定により該当しないばかりか「&*」が省かれるとある
945 名前: ◆QZaw55cn4c mailto:sage [2017/07/13(木) 08:39:26.58 ID:045lcfaT.net] >>930 シンタックスではなくセマンティクスというわけですか‥ありがとう
946 名前:デフォルトの名無しさん [2017/07/13(木) 18:16:27.80 ID:PDgj9Ebq.net] #include<stdio.h> #include<string.h> #define NUM 10 int main(void) { int length; char name[NUM * 2 + 1]; char family_name[NUM + 1]; char first_name[NUM + 1]; printf("姓を入力してください\n"); scanf("%s", family_name); printf("名を入力してください\n"); scanf("%s", first_name); strcat(name, family_name); strcat(name, first_name); length = strlen(name); printf("名前:%s\n", name); printf("長さ:%d\n", length); return 0; } このプログラムで入力まではちゃんとできてるみたいなんですがstrcatのところでおかしくなって 結合結果がフフフフフフフってなります。どうしてでしょうか?
947 名前:デフォルトの名無しさん mailto:sage [2017/07/13(木) 18:29:33.51 ID:lX8cJUTX.net] 笑われてんじゃね?
948 名前:デフォルトの名無しさん mailto:sage [2017/07/13(木) 18:30:25.16 ID:lX8cJUTX.net] マヂレスすると、nameが不定
949 名前:デフォルトの名無しさん mailto:sage [2017/07/13(木) 18:34:34.28 ID:a0isPZOF.net] >>932 char name[NUM * 2 + 1] = {0};
950 名前:デフォルトの名無しさん [2017/07/13(木) 18:37:48.37 ID:PDgj9Ebq.net] ありがとうございました
951 名前:デフォルトの名無しさん mailto:sage [2017/07/13(木) 19:34:29.65 ID:b1PvI/zl.net] どうでもいいけど、 char name[NUM * 2 + 1] = ""; 普通こうじゃね? char name[NUM * 2 + 1] = {'0'}; これでも良い コンパイル結果はたぶん全部同じだけど
952 名前:デフォルトの名無しさん mailto:sage [2017/07/13(木) 20:27:20.55 ID:bV5zFMan.net] >>932 俺のところで試してみたらフフフノフフフになった
953 名前:デフォルトの名無しさん mailto:sage [2017/07/13(木) 20:43:44.17 ID:lX8cJUTX.net] Visual Studio のデバッグビルドだと、不定メモリをCCで埋める だからこれに対応する'フ'が表示される なぜ途中が'ノ'になるかはわからん strcatではCCの後の0を探してその後に文字列をコピーするから、0の位置によっては例外が発生したり動作がおかしくなったりするかも
954 名前:デフォルトの名無しさん mailto:sage [2017/07/13(木) 21:06:57.04 ID:a0isPZOF.net] >>937 = {'\0'};のタイプミスだよね?
955 名前:デフォルトの名無しさん mailto:sage [2017/07/13(木) 21:23:18.88 ID:lX8cJUTX.net] >>940 タイプミスじゃなくて文字化けした スマホから見ると、? が◆の中に書かれた文字になってる
956 名前:デフォルトの名無しさん mailto:sage [2017/07/13(木) 23:03:34.21 ID:xdHlDIka.net] プログラム終了にexit 0とreturn 0がどう違いますか?
957 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [2017/07/13(木) 23:59:30.53 ID:anRp6w5D.net] >>942 違わない。 main 内の return は exit と同じ。
958 名前:デフォルトの名無しさん mailto:sage [2017/07/14(金) 19:19:48.00 ID:TW7O0pB9.net] というタワゴトで他人を陥れるのであった
959 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/07/14(金) 19:26:30.76 ID:RoIBY40S.net] exitは死のトラクターが働かない
960 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/07/14(金) 19:32:27.26 ID:RoIBY40S.net] 異常終了以外でexitを使うヤツは素人
961 名前:デフォルトの名無しさん mailto:sage [2017/07/14(金) 20:20:31.05 ID:8ghhANnS.net] えっ mainのreturnでint値返すのはexitをその返り値で呼ぶのと全く等価でしょ? 少なくとも現行のC,C++規格では等価と書いてあるけど現実の実装ではそうなってないってこと?
962 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/07/14(金) 20:52:35.05 ID:RoIBY40S.net] #include <iostream> #include <cstdlib> struct A { ~A() { std::cout << "OK" << std::endl; } }; int main(void) { A a; std::exit(-1); }
963 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/07/14(金) 20:55:56.83 ID:RoIBY40S.net] >>947 どこに書いてあったか? 苦情入れるぞ。
964 名前:デフォルトの名無しさん mailto:sage [2017/07/14(金) 21:04:08.43 ID:TW7O0pB9.net] 今日の>>945 は健常者 後始末される例外ケースについて触れていたら完璧だった
965 名前:デフォルトの名無しさん mailto:sage [2017/07/14(金) 21:06:50.82 ID:VdC9hBdZ.net] atexit で後始末回収機構走らないの?
966 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/07/14(金) 21:39:46.62 ID:RoIBY40S.net] >>947 どこに書いてあった?
967 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/07/14(金) 21:46:17.67 ID:RoIBY40S.net] atexitはマニュアルに書いてある通りだから、ここでいちいち説明する必要はない。
968 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/07/14(金) 21:53:53.48 ID:RoIBY40S.net] マニュアルこそが聖書。マニュアルを読まない奴等はノンプレイヤー。
969 名前:デフォルトの名無しさん mailto:sage [2017/07/14(金) 22:54:13.51 ID:RlDfzlps.net] つまりexit()はバカ発見器ってこと?
970 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/07/14(金) 23:01:28.54 ID:RoIBY40S.net] C++でexit使うぐらいなら、代わりにC++例外を使った方がいいよ。デバッグしやすいし。
971 名前:デフォルトの名無しさん mailto:sage [2017/07/15(土) 05:41:00.21 ID:81gh4ly6.net] >>947 exit() 関数に入ってしまってはデストラクタが働かないのに,それでも return 文と一緒といいはるの? それ規格がまちがってるから,そのうち修正がはいるはず
972 名前:デフォルトの名無しさん mailto:sage [2017/07/15(土) 13:25:52.33 ID:d+yGYUAe.net] ポインタの作法に慣れないです 読めるけどかけないです
973 名前:デフォルトの名無しさん mailto:sage [2017/07/15(土) 16:38:44.94 ID:sZ4h7fLQ.net] ポインタは2段までしか使わないなあ 関数ポインタはstd::functionに入れる癖がついたし
974 名前:デフォルトの名無しさん mailto:sage [2017/07/15(土) 17:20:33.71 ID:d+yGYUAe.net] #include<stdio.h> int unko(int x); int aho(int *y); int main(void) { int a[5] = { 1,2,3,4,5 }; unko(a); aho(&a); printf("%x\n%x\n", a, &a); return 0; } int unko(int x) { printf("%x\n", x); return; } int aho(int*y) { printf("%d\n%d\n",*(y+1), y[2]); return; } このとき関数unkoで配列aの中身にアクセスする方法ってありませんか? アドレスがわかっているからできそうな気もするんですがよく解りません。
975 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/07/15(土) 17:27:13.54 ID:xLcEZRbh.net] aがint a[5]であるとき、aはint配列の先頭アドレスだ。unkoの引数をポインターにしろ。
976 名前:デフォルトの名無しさん mailto:sage [2017/07/15(土) 17:56:11.02 ID:d+yGYUAe.net] はい
977 名前:デフォルトの名無しさん mailto:sage [2017/07/15(土) 20:48:00.24 ID:iuayY/9E.net] そもそもこのソースコンパイルエラーになるんじゃね?
978 名前:デフォルトの名無しさん mailto:sage [2017/07/15(土) 21:29:06.16 ID:d+yGYUAe.net] >>963 VSだとコンパイラ通るんですが他のだと通りませんか? あと関数unkoをいろいろ弄ってたんですが #include<stdio.h> void unko(int x); void aho(int *y); int main(void) { int a[5] = { 1,2,3,4,5 }; unko(a); aho(a); printf("%x\n%x\n", a, &a); printf("%d\n",a[4]); return 0; } void unko(int x) { printf("%x\n", x); int *p = x; printf("%d\n%d\n", p[1],*(p+2)); p[4] = 10; return; } void aho(int*y) { printf("%d\n%d\n",*(y+1), y[2]); return; } こんな記述にすれば少なくともVSでは引数をポインタにしなくても配列aの要素を覗いたり操作したりできることがわかりました。
979 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/07/15(土) 21:31:54.33 ID:18nkvKxh.net] 型がめちゃくちゃだあああ!!! 型が形無し!
980 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/07/15(土) 21:36:49.71 ID:18nkvKxh.net] できることとやってもいいことは違うんだよ。
981 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/07/15(土) 21:39:23.41 ID:18nkvKxh.net] コンパイル時に出て来る度重なる警告を無視したらダメだよ。
982 名前:デフォルトの名無しさん mailto:sage [2017/07/15(土) 21:44:11.03 ID:d+yGYUAe.net] すみません
983 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/07/15(土) 21:46:08.79 ID:18nkvKxh.net] お使いの32ビット環境ではintとint*が同じサイズだから、キャストされれば代入できる。sizeof(int) == sizeof(int*)。 しかし、64ビット環境では動かなくなるかもしれない。ポインター型を無視した良くない書き方だ。
984 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/07/15(土) 21:54:52.27 ID:18nkvKxh.net] おそらく、君の環境では、 sizeof(int) == 4, sizeof(int*) == 4 のはずだ。 64bit環境では、多分 sizeof(int) == 4, sizeof(int*) == 8 になる。確認してみたまえ。
985 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/07/15(土) 21:57:34.94 ID:18nkvKxh.net] int*のサイズがintのサイズより大きいと、ポインター(アドレス)の値が正しく代入できない。これが64bitで失敗する理由だ。
986 名前:デフォルトの名無しさん mailto:sage [2017/07/15(土) 22:08:26.63 ID:qXQ9KlTo.net] こまけーことをゴチャゴチャと Cなんて大なり小なり環境依存な場面しか使わん 貴様はintに32767以下しか入れんのか?
987 名前:デフォルトの名無しさん mailto:sage [2017/07/15(土) 22:10:20.05 ID:d+yGYUAe.net] 確かめてみたら確かに自分の環境では両方4バイトでした 64bitのプログラムにしたらダメになるんですね・・・ 勉強になります。ありがとうございます。
988 名前:デフォルトの名無しさん mailto:sage [2017/07/15(土) 22:23:44.38 ID:vkKq60sj.net] 2レスで失礼します VC++9Eでruby-opencvのビルドを試みているのですが構文エラーが多発してビルドできません >C:\dev\ruby-opencv>nmake >〜 >cl -I. -I. -IC:/dev/ruby-1.8.7-p374/win32/bin/lib/ruby/1.8/i386-mswin32_90 -IC:/dev/ruby-opencv-master/ext/opencv -MD -O2b2xty- /EHsc -IC:/dev/ruby-opencv-master/ext/opencv/ext/opencv /EHsc -DHAVE_OPENCV2_CORE_CORE_C_H -DHAVE_OPENCV2_CORE_CORE_HPP -DHAVE_OPENCV2_IMGPROC_IMGPROC_C_H -DHAVE_OPENCV2_IMGPROC_IMGPROC_HPP -DHAVE_OPENCV2_VIDEO_TRACKING_HPP -DHAVE_OPENCV2_FEATURES2D_FEATURES2D_HPP -DHAVE_OPENCV2_FLANN_FLANN_HPP -DHAVE_OPENCV2_CALIB3D_CALIB3D_HPP -DHAVE_OPENCV2_OBJDETECT_OBJDETECT_HPP -DHAVE_OPENCV2_LEGACY_COMPAT_HPP -DHAVE_OPENCV2_LEGACY_LEGACY_HPP-DHAVE_OPENCV2_HIGHGUI_HIGHGUI_C_H -DHAVE_OPENCV2_HIGHGUI_HIGHGUI_HPP -DHAVE_OPENCV2_PHOTO_PHOTO_HPP -DHAVE_OPENCV2_NONFREE_NONFREE_HPP -DHAVE_STDARG_H -I/usr/include -IC:\dev\OpenCV2.4\install\include -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE -c -TpC:/dev/ruby-opencv-master/ext/opencv/algorithm.cpp >〜 >algorithm.cpp >C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\INCLUDE\istream(699) : warning C4003: マクロ 'read' に指定された実引数の数が少なすぎます。 >C:\〜\istream(699) : error C2059: 構文エラー : ')' >C:\〜\istream(846) : コンパイルされたクラスの テンプレート のインスタンス化 'std::basic_istream<_Elem,_Traits>' の参照を確認してください >C:\〜\istream(700) : error C2143: 構文エラー : ')' が '{' の前にありません。 >〜 >C:\〜\xxbind1(320) : warning C4003: マクロ 'bind' に指定された実引数の数が少なすぎます。 >C:\〜\xxbind1(320) : error C2988: 認識できないテンプレートの宣言または定義です。 >C:\〜\xxbind1(320) : error C2059: 構文エラー : ','
989 名前:デフォルトの名無しさん mailto:sage [2017/07/15(土) 22:24:14.08 ID:vkKq60sj.net] 何らかのファイルが足りないとかならまだ判るのですがこのファイルはVCに付属の物ですし構文エラーなどと言われても理解できません algorithm.cppは一番最初のファイルで全く進まない状態です ちなみにRubyとOpenCVのビルドは一応通っています(本当に問題ないかは未確認) C/C++は不慣れでVSの使用経験もあまりないため原因の見当も付かず手詰まり状態です。もし何か判る方がいたら教えてもらえると助かります
990 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/07/15(土) 22:27:42.35 ID:18nkvKxh.net] readというマクロが悪さをしているようだ。#include順を変えるか#undefしろ。
991 名前:デフォルトの名無しさん mailto:sage [2017/07/15(土) 22:35:18.82 ID:Z+b63Gri.net] >>958 使わずに済むのなら無理して使う必要は無いだろ? 正しく動けばそれでいい
992 名前:974 mailto:sage [2017/07/16(日) 12:18:52.82 ID:wcmK4agw.net] >>976 すみません。その場所の特定ってどのようにすればいいのでしょうか 比較的規模の大きいライブラリですし、インクルードしているファイルだけでもかなりの数になりそうです ファイルの検索とテキストエディタだけでは追えそうにありません 追跡を支援してくれるツールとかないんでしょうかね・・・
993 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/07/16(日) 12:28:40.60 ID:flrpsNzv.net] >>978 IDEのフォルダ内検索か、 grepツール
994 名前:デフォルトの名無しさん mailto:sage [2017/07/16(日) 15:16:03.75 ID:1O/pViqJ.net] マクロ展開したソース吐くオプションあったよな VCならd.hatena.ne.jp/nurs/20100516/1274020395 1.ソリューションエクスプローラ上で展開後の結果を見たいcppファイルを右クリック⇒ プロパティ⇒プリプロセッサ⇒前処理済みファイルの生成⇒行番号つきか行番号なしを選択 2.再びソリューションエクスプローラ上で展開後の結果を見たいcppファイルを右クリック⇒コンパイル これで、cpp が置かれているのと同じファイル階層に、cppと同じ名前だけど拡張子が.iになってる ファイルができてるからそれがそうだよ gccなら -E
995 名前:デフォルトの名無しさん [2017/07/16(日) 17:55:59.24 ID:i1aK64sE.net] class Kitty { public: char *str; Kitty() { str = "Kitty on your lap\n"; } Kitty(const Kitty &obj) { str = "Di Gi Gharat\n"; } } g_obj ; int main() { Kitty obj = g_obj; cout << g_obj.str; cout << obj.str; return 0; } Kittyクラス終わりのセミコロンの間に変数g_objがあるんですがこれはどういう意味なんですか?
996 名前:デフォルトの名無しさん mailto:sage [2017/07/16(日) 18:11:45.98 ID:0XlWr73/.net] 「int i; のセミコロンの前に変数g_objがあるんですがどういう意味ですか」 と訊いているに等しい
997 名前:デフォルトの名無しさん mailto:sage [2017/07/16(日) 18:13:11.34 ID:0XlWr73/.net] 訂正 誤 変数 g_obj 正 変数 i
998 名前:デフォルトの名無しさん mailto:sage [2017/07/16(日) 18:25:45.80 ID:dVrh8pbL.net] g_objはKittyのインスタンスだが あまりこういう書き方はしないかもね
999 名前:デフォルトの名無しさん mailto:sage [2017/07/16(日) 18:31:52.76 ID:ZbG5GhXO.net] >>981 Kitty と言うクラス定義とその型を持つ g_obj と言うグローバル変数を同時に定義している 要するに class Kitty { ... }; Kitty g_obj; を一つにまとめてるだけ
1000 名前:デフォルトの名無しさん [2017/07/16(日) 18:48:37.09 ID:i1aK64sE.net] >>982 >>984 レスありがとうございます >>985 わかりやすい解説ありがとうございました
1001 名前:デフォルトの名無しさん mailto:sage [2017/07/16(日) 22:25:00.23 ID:Z5uaiz2p.net] >>986 それはさておき >str = "Kitty on your lap\n" このウンコード、何かおかしいとは思わないのかね
1002 名前:デフォルトの名無しさん mailto:sage [2017/07/17(月) 00:15:32.26 ID:+UBTk6HR.net] >>987 ウンコードは食べるとニガいからな
1003 名前:デフォルトの名無しさん mailto:sage [2017/07/18(火) 05:08:40.08 ID:gGqeofJB.net] ほ
1004 名前:デフォルトの名無しさん mailto:sage [2017/07/18(火) 07:08:39.06 ID:vzMDiUgd.net] 次スレ立てたにゅ 【初心者歓迎】C/C++室 Ver.101【環境依存OK】 mevius.2ch.net/test/read.cgi/tech/1500329247/
1005 名前:デフォルトの名無しさん mailto:sage [2017/07/18(火) 19:37:15.43 ID:bPzCLpNs.net] おつ
1006 名前:デフォルトの名無しさん mailto:sage [2017/07/18(火) 22:55:46.66 ID:KX2fhuwb.net] ひょっとして2ちゃんのこのスレ 他のC/C++相談所よりハイレベル!?
1007 名前:デフォルトの名無しさん mailto:sage [2017/07/19(水) 07:02:25.97 ID:Jp1Fyagp.net] うめてんてー
1008 名前:デフォルトの名無しさん mailto:sage [2017/07/19(水) 07:03:18.13 ID:Cx7F+3jm.net] 梅
1009 名前:デフォルトの名無しさん mailto:sage [2017/07/19(水) 10:27:43.90 ID:MRnyPI+k.net] 他のC/C++相談所ってどこ?
1010 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [2017/07/19(水) 16:13:01.49 ID:AV+hYp2C.net] SNS の C++ コミュニティとかじゃね?
1011 名前:デフォルトの名無しさん mailto:sage [2017/07/19(水) 17:00:45.76 ID:Si/VL0fD.net] それトリ割れしてるよ #o%K%H:+O
1012 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [2017/07/19(水) 17:08:00.13 ID:AV+hYp2C.net] >>997 知ってるけど成りすましは一度しか出てきてないのでまあいいかなって。
1013 名前:デフォルトの名無しさん mailto:sage [2017/07/19(水) 17:33:56.27 ID:bGQD/KSW.net] このスレにはQさんがいるからな Qさんがいれば安心だ
1014 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [2017/07/19(水) 17:43:36.36 ID:AV+hYp2C.net] >>1000 を取れたら長門は俺の嫁
1015 名前:1001 [Over 1000 Thread.net] このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。 life time: 254日 18時間 45分 34秒
1016 名前:過去ログ ★ [[過去ログ]] ■ このスレッドは過去ログ倉庫に格納されています