◎正当な理由による書き込みの削除について: 生島英之 とみられる方へ:【初心者歓迎】C/C++室 Ver.105【環境依存OK】 ->画像>4枚
動画、画像抽出 ||
この掲示板へ
類似スレ
掲示板一覧 人気スレ 動画人気順
このスレへの固定リンク: http://5chb.net/r/tech/1556142878/ ヒント: 5chスレのurlに http ://xxxx.5chb .net/xxxx のようにb を入れるだけでここでスレ保存、閲覧できます。
エスケープシーケンスやWin32APIなどの環境依存なものもOK
そのような質問は必ず環境を書きましょう
半角空白やタブでのインデントはスレに貼ると無くなります
コードを貼れる所
http://codepad.org/ https://ideone.com/ 前スレ
【初心者歓迎】C/C++室 Ver.104【環境依存OK】
http://2chb.net/r/tech/1545944692/ チンポ体操 チンポを手に持ち しごく運動から 1 2 シコシコ 2 2 シコシコ チンポを振り回す運動 1 2 ブルンブルン 2 2 ブルンブルン
Cを2年間やって最近大学の講義でC++をやりはじめたのですが C++だけでなくCの勉強も継続したほうがいいのでしょうか?
>>3 C89=K&R2 をマスターできたら、C99 など目もくれずC++に進むのがいいでしょう、私はそうしましたし C99 なんかどうでもいいと思っています
>>4 レスありがとうございます
競技プログラミングで言うと、C言語はatcoderでA問題とB問題はすぐに書くことが出来てC問題は解けたり解けなかったりというレベルです。構造体とポインタも基本的(C言語ポインタ完全制覇という書籍にあるような難しいことは知りませんが…)な扱いならばできます。
就職のことも視野に入れて考えたいのですが、C++が出来るならばCの知識が問われる機会というのは少ないのでしょうか?
>>5 就職の話はよくわかりません
ただ、C89=K&R2 → C99 の改定内容は、C89 の時代に試みられていた拡大解釈を規格に取り込んだ、という部類が多いと私は思いました
それに C99 は、「C++ を見た後で決めたんかい?」という謎な部分が多くいけ好かないのも事実です、あんなものは知らないほうがいい部類でしょう
それよりも日々進化し続ける C++ をフォローするほうが、いろいろな面でお得です、私も p-thread 系マルチコアなプログラムを記述するために C++11 or lator に進み、とても満足しています
>>5 C++のクラスとかテンプレートとかSTLとかをとりあえず無視して
Cと共通してる基礎的なとこから学べば、わざわざCを個別に学ぶ必要はないとおも
仕事の場合は純粋にCだけ長年使ってるような特殊な職場でなければ問題ない
お二人方ありがとうございます CからC++の勉強に専念する決心が半分くらいつきました Cのscanf()の仕様(バッファオーバーフローやバッファオーバーランの危険性を回避するいくつかの方法について等)、まだはっきりと把握していないのですが、それでも、C++の勉強に専念してしまっても問題ありませんでしょうか?
C問題は使う言語の問題じゃないな もちろんc++やJavaの方がC言語よりもスムーズに書けるがC問題はアルゴリズムを知らないと出来ない それと現代ではC言語のscanfに習熟する意味は無い それは後回しにした方がいい
>>3 C を続ける必要性がゼロなら C++ に専念した方が良いかと
必要性は個々人による
大学の同級生なり、研究室等の先輩なりに相談・確認するのも良いかも知れない
_s 系関数でも未定義な挙動を示すコードはいくらでも書けるのでキリがないんじゃね 詳細な資料はあるけれども、入門者が読むもんじゃなし fgets + sscanf で安全になるわけでもなし
>>8 まあ他の人の意見も聴いておいたほうがいいでしょうね
個人的には何をやっても C で書けると「思える」感触ができるまで C で書きまくる経験は有用だろうと思います、時間はかかりますけれども何でも自分で実装する、という縛りを課してみる
データ構造(線形リスト、スタックやキュー、二分木やバランス木・K-dimensionなどのデータ構造)
アルゴリズム(ヒープ/クィック/シェル各種ソート、縦横探索やダイクストラ法と枝刈り・バックトラッキング、ナップサック、シンプレックス法、シャノンファノやハフマン)
いやもう、C なら何をやってもいい経験になりますね…
関数の引数の書き方について質問があります。 任意のオブジェクトを複数参照する関数f(A& a, B& b, ......) において、引数の a,b,...を左辺値と右辺値の任意の組み合わせで 使用する場合、関数定義をf(const A& ac, const B& bc, ......){ A &a=const_cast<A&>(ac); B &b=const_cast<B&>(bc); : } とする方法がベストでしょうか?
15です。 追記します。 開発系のIDEでオブジェクトのメンバー変数を表示させながら プログラム作成をしたいので、テンプレート関数化による ユニバーサル参照の記述は使いたくありません。
>>15 控えめに言ってクソ。 本当に const なオブジェクトが渡されたときにエラーにならない。
const なオブジェクトに const でない操作をするのは未定義だぞ。
(const ではないオブジェクトなら途中で const を経由しても書き換えて良いらしい。)
言語の作法の範囲内でなら IDE に対する配慮は工夫として評価されるかもしれないけど、
型システムによる保護を台無しにしてまでやるのはオススメできない。
少なくともこのスレでそういう工夫を是とする人はあんまりいないと思うぞ。
Arduinoなんだけど多分C一般の話だと思うんでここで byte counter = 0; while (true) { if (Shori(counter)) { break; } // Shoriの結果によってwhileから脱出 if (counter < 4) { counter++; } else { counter = 0; } } または for (byte counter = 0; counter <= 4; counter++) { if (Shori(counter)) { break; } // Shoriの結果によってforから脱出 if (counter == 4) { counter = 255; } } または for (byte counter = 0; true; counter++) { if (Shori(counter % 5)) { break; } // Shoriの結果によってforから脱出 // これだとcounterが255から0になるときcounter % 5が2回連続して0になるため // 0~5を繰り返し引数にしてShoriしていることにならない } または while (true) { for (byte counter = 0; counter <= 4; counter++) { if (Shori(counter)) { goto dasshutu; } // Shoriの結果によってforとwhileから脱出 } } dasshutu: みたいに一定の範囲を繰り返すカウンタを持つ無限ループってどう書くのがシンプルで一般的なんだろう? 無限ループとはいっても256回も回らずに終わる見込みだから3つ目の書き方でいい(仮にそれを越えても処理内容的に致命的な問題はない)とか、念のためwordにしとけば65536回まではいけるとか考えてもいいのかな
for (byte counter = 0; ; counter = (counter + 1) % 5) { if (Shori(counter)) { break; } } とか?
おおそんな書き方が。ありがたい。 しかも脱出に関して言えば、forの中でifで判定してbreakするのではなく forの条件式に書いてしまうこともできるな…
オブジェクト指向でなぜつくるのか って書籍が今Kindleセールで半額だけど良さそうだな 読んだことある人どんな感想ですか?
>>22 じゃんけんゲームを2人(自分対PC)用から(PCを)何人でも増やせる設計に変える例で
構造化プログラミングだとちょっと書き換え多そう。。。オブジェクト指向プログラミングなら~って感じ。
(そこしか覚えてないとも言う)
第2版は最終章でオブジェクト指向プログラミングの次世代は関数型プログラミングだとか言ってHaskellの紹介が追加された。
皆さんが一番勉強になった本を教えてほしいです。 これならわかるC++と、C言語ポインタ完全制覇は持ってるので、基本的なことはわかります。 これ読んで実力がバズった!というのがあればぜひとも。
>>24 C++ ならハーバート・シルトの独習C++ ですね
その真ん中くらいにある「std::string を自分で実装する」というお題が非常によく、OO の教科書でそういうお題を配置しているのも本質を明示している意味でよく、この本より優れている初級C++教科書がみあたりません
>>25-26 ありがとうございます。参考にします。
>>24 私が学んだのは「詳説 C++ 第2版」だな。
https://www.amazon.co.jp/dp/479732743X この本の内容は C++03 の時代のものなので C++11 以降のトピックはウェブで学んだ。
Twitter で C++ に強い人が独習C++の間違いを強く批判しているのを見ることがちょいちょいあるので、
自分では読んだことが無いけど独習C++には良い印象がない。
まあ不正確でもわかりやすいことは有りうるのでとりあえずおおざっぱな概略を把握する分には
どれでも割となんとかなる気がしている。
>>28 >独習C++の間違いを強く批判している
話を簡単にするために、一時的に紛らわしいことを言っている=どこを切っていも正しいというわけではない=文脈依存なところがある、という批判はアマゾンレビューにありましたね
しかし強く批判されるほどの欠点があるかどうかは、私にはよくわかりません
よろしければポインタをください
>>29 良い評価も悪い評価もあるので単純には言えないけど、批判している代表的な意見としてはこれかな。
https://twitter.com/yumetodo/status/1020966071702966273 ただ、全体として入門書として本当に妥当な本があまりないので、どれが比較的マシなのかというレベルの話だと思う。
私が読んだことがない中で評判を評価するとたぶん江添氏の出している本が (少なくとも日本語の本の中では)
だいぶん良さそうでは有る。
速度のある分野では、単純に古いものはそれだけで価値が低いので、
逆に言えば最新に追い付こうとしているものは高く評価できる。
https://twitter.com/5chan_nel (5ch newer account)
俺「競プロ飽きたしC++の勉強でもするか」 isocpp.org「まずはTourofC++で概要をつかむといいよ~」 ビャーネ「Tourはプログラミングに習熟した人を想定している」 俺「短くて面白いけど難しいな。プログラミング初心者向けのはないかな?」 isocpp「じゃあこれ つ原則と実践(1248ページ)」 俺「ファッ!?」 isocpp「あと勉強するときは少なくとも3冊持っといたほうがいいよ~」 俺「ウーン…」
>>30 毒臭を有害ゴミと判断した理由が知りたいですね…
個人的には、C++ の中の Java に似た部分を抽出して、初心者(最近は C++ に直接参入する人が多いとか…なんか時代を感じます)にやさしい、できれば分厚くない本がいいなあ
以前は accelerated C++ を薦めたりしたのですが、最近 accelerated c++ の決定的に駄目なところを見つけてしまったので、もう私が薦める本は独習しかないのでした
>>32 有害ゴミなどど、相手が使ってない言葉に勝手に置き換えて、さも相手が感情的で非論理的な
途中だった。 有害ゴミなどど、相手が使ってない言葉に勝手に置き換えて、さも相手が感情的で非論理的な発言をしてきたかのような印象操作は卑怯だとは思わないか?
>>36 twitterの方は見てなかった。失礼した。
プログラミングの最初の一歩すらわからない状態から始めるのか Pythonやjsやphpなんかである程度書ける状態から始めるのかで話が変わると思う 後者ならググりながら適当になんか書いてみればいいと思う
>>38 >ググりながら適当になんか書いてみれば
それは C/C++ に関していえば、ちょっと危険な気が… 逆に Python や ruby をやるのなら、それでもいいと思いますが…
>>39 それに強く同意。
C++ には未定義の挙動が多すぎるので、
表層的な理解で使うのは大変に危険である。
C++に関してググって出てくる情報って適当なの多いよなw Qなんとかとか特にw
どうも最近は最新のC++の機能を使うべきだとしつつ 自分なりにとりあえず適当に書くのは危険とか言う意見が多いけど 人間もあくまで動物なので手を動かして書かなきゃ覚えないしCの時代から続く古臭い書き方は長年の積み重ねでセオリー確立してんだから そういう学習方法を否定するのは違うと思うよ クラス、ひいては最新の機能を正しく使う、なんて初心者がいきなり目指すようなことじゃない
>>42 手を動かして覚えることは誰も否定していないし、むしろそれは強く推奨したい。ただ、C/C++の場合は表面的な理解だけで動いたから良しとして進むのは危険で、基本的な部分は正しく理解しておくことは必要だと思う。
ある程度の基礎がある状態なら、新しい機能やライブラリの関数もググって得られる情報から正しい仕様を理解して習得できるが、基礎ができていない状態でそれは難しい。
初心者がとりあえず適当に切り貼りして動かそうというやり方をするなら、他の言語から入った方がいいと思う。ググって調べた断片的な情報だけでなく入門書等で基礎を押さえつつ、実際に書いて愚直に挙動を確認しながら理解をしていくのが良いと思う。
>>42 >人間もあくまで動物なので手を動かして書かなきゃ覚えないし
プログラミングは特に、自分で書いて書いて書きまくって読んでというところは同意
となれば、ちょっと書く気になろうという心の動きを、分厚い教科書で潰したくない、という趣旨は理解
さて、困ったものです、そういうときに使える教科書があればいいのですが、C/C++ の教科書って高くて分厚いですからね…私もメイヤーズはまだ積読だし、いつ読む気になるかな?
まぁ確かにサンプルコードの切り貼りとかは危ないだろうしネットの情報だけってのはね でも独習みたいな古臭い(03以前)入門書なんて初心者にうってつけだと思うんだけど ・・・って、twitterでこき下ろしてる奴のアカウント名に見覚えあるわw そいつ勘違いの激しい学生ちゃんだから言ってること真に受けない方がいい
isocppで推薦されてる原則と実践の前の版がたまたま 近くの図書館にあったから読んでみたけど、意外と面白いな。
>>46 見つけられなかったので比較的に新しいやつの中から探して一例として出したけど、
そやつひとりだけが言ってるわけじゃないよ。 良いと評価している人も当然いるんだけど、
あくまで私の観測範囲で私が総合的に感じた漠然敵な印象の話なんで。
今の時点でそれなりに C/C++ をわかるようになっている人の思う「良い本」というのは 「昔に学んだ」という体験だからさ、今から学ぶという人の事情とはやっぱり時代が違うと思う。 自分が読んだ本を言えても、それを強く勧めるほどの自信はないな。 例えば私が最初に買った C++ 本は ARM なんで、これにはいわゆる STL さえ載ってないんだけど、 当時としては妥当な選択肢だったし、十分にわかりやすかった。 でももちろん、今の時代に ARM を勧めるなんて馬鹿馬鹿しくてあり得ないでしょ。 昔の C++ を身に着けてから徐々に知識を更新してきていると昔の C++ と今の C++ が 滑らかに繋がっているように錯覚してしまうけど、昔の C++ を学んでから今の C++ というのは 結構な飛躍があると思うんだよ。 今から学ぶなら C++11 程度は想定している本の方がいいんじゃないかな、と個人的には思う。
>>49 > C++11 程度は想定している本の方がいいんじゃないかな
しかし、C++03 までのからくりをしらずして、C++11 のあれこれを理解できるかな?とも思うのです、ranged for の for(auto &item; vec) の & の意味とか…これはあんがい簡単にクリアできるのやもしれませんけど
テンプレート特殊化を前方宣言したいんだけど、 コンパイルエラーが出て詰んでるんですけど、 どうやればいいですか? 例えば以下のようなことがしたいんですが。 template<class T> struct A {}; template<> struct A<int>; template<> struct A<float> { A<int> f() { //エラー : 認識できない型A<int>が使われいます。 return A<int>{}; } }; template<> struct A<int> { int value; };
A<float>::fを定義するにはA<int>の定義(classのサイズ)が必要
fの定義をA<int>のあとにすればできる
https://ideone.com/Vv0Psu 入門書の入力された文字列が同じかどうかを判断するコードなのですが
https://ideone.com/vaASOS 14行目のif(str1[i]!=str2[i])break;がどういう意味なのかさっぱり理解できません
文字コードが同じじゃなければbreakッて意味ですか?
len+1してるのも意味がわからないです・・・
説明よろしくお願い致しますm(_ _)m
文字コードが同じじゃなければbreakということでいいんじゃない? len+1しているのはヌル文字があるから
まず配列について勉強だね デバッガのステップ実行で追っていくといいよ
文字列が同じ = 1文字1文字全部同じ = 1文字でも違えば違う strlenは文字数を返すけど最後の\0を含まない 最後の\0まで比較しないと入力した文字列と先頭部分が一致したら一致してしまうのでlen+1
文字列長の短いほうを len としないと突破したところを参照してまうぞ str1 = asd\0 str2 = asdf\0 で str2 の len+1 まで str1 を参照すると嘔吐
まぁ 文字列長がちがったら いきなり不一致って脱出してもいいんだけどね
https://ideone.com/JUWWBr 分かり易くなったゾ
変数を減らせばラク
lenで判定してるイマイチな書き方を排除すればもっとラク
要するに分かりにくく書いてるから分かりにくいだけだよ
ループを再帰に直せば終了条件がもっと分かり易くなるゾ 再帰にして時系列の1段階ずつ見せればその1段階ごとにどういう判断してるか分かり易いでしょ bool scr(char* p, char* q){//string compare recursive if( *p == '\0' || *q == '\0' ){ if( *p == *q ){ return true; } return false; } if( *p != *q ){ return false; } return scr(p+1, q+1); } 元のヤツは文字コードと文字列の長さがこんがらがってぐちゃぐちゃになってるから分かりにくいんだなコレ 同じ文字列かどうかを、「文字コードが同じか」と「文字列の長さはどうか」、この二つで判断してるでしょ 判定するのに全く別の二つのものを取り扱ってるから分かりにくいんだよ forのカウンタのiの取り扱いも分かりにくい 文字列長さの境界の+1の有無も分かりにくい 文字コードが同じじゃなければbreakしてlenで判定、すんごく分かりにくいでしょ 何せ「文字コードが同じじゃなければbreak」、その通りなんだけど「意味が理解できない」と来てる、意味が分かってるのに「分からん」と言ってるワケだ 結局はbreakしてるはiのカウントを止めるためと、lenと比較するためにforのスコープ超えた場所でiの値を参照するため これ入門書の前段階までにfor文の外側でiの値を参照してる例がないと詰まる箇所だよ for文の外側でiの値を使う、この意味が分からんと「文字コードが同じじゃなければbreak」まで分かってても全体が分からないようになってる
ポインタを知らないであろう初学者にポインタ演算を使って分かりやすいとする鬼畜の所業
>>57 ~63回答ありがとうございます
説明下手でスイマセン。このコードが書いてある前のページに文字列の比較は出来ないため
str1==str2と書いて判定は出来ないと書いてあったのに
14行目でstr1[i]!=str2[2]で判定してるのがよくわからないです
strlenは\0返さないのですね。そこはスッキリしました。ありがとうございます
>>65 str1==str2はポインタ(それぞれの文字列が格納されている先頭アドレスの値)を比較してるだけ。
str1[i]!=str2[i]は、str1とstr2のi番目の文字を比較している。
>>66 文字列の中身を比較してるんじゃなくて先頭のアドレスを比較していて
str1[i]!=str2[i]は文字列の中身を比較してるってことなんですね
もやもやが解けました。ありがとうざいます
int a = b - 1; if (a < 0){ a = 0; } これのスマートな書き方を教えてください。
ここで聞いていいのかわからないけど 組み込み系で上位割り込みでライト、下位割り込みでリードする場合割り込み禁止する必要ありますか?
>>70 それ以上にスマートな書き方なんてない
素直が一番
>>72 atomicにアクセスできないなら必要
readの途中でwriteが発生したらダメだし、
writeの途中でreadが発生してもダメなんだから、上位/下位は関係無い
>>70 bの型が不明な場合はスマートな書き方は特に無い
>>70 int a = b < 1 ? 0 : b - 1;
>>72 何故ダメなのかが理解できてません。
書き忘れてましたが割り込みはタイマで周期的に発生させてます。
リード中にライトが発生しても下位割り込みは一周期遅れて上位割り込みのライト結果をリードするだけではないのですか?
>>75 writeの割り込みが発生するまではreadは進行するんじゃないの?
だから「readの途中で」なんだけど
「2つの割り込みは完全制御下にあり、read中にwriteは発生しない」なら大丈夫だよ、当然
>>75 >リード中にライトが発生しても下位割り込みは一周期遅れて
ここがちょっと勘違いを感じる
割り込み処理が終わったら、割り込まれた処理の続きをするのよ
低レベルにDBのrollbackみたいな複雑な仕組みはないのよ
char型の動作がどうもわからない。 例えば char str[] = "abc"; として cout << &str[0]; ----> abc になるのはなんで? index 0番だから a がでると思ったんだけど... 初心者ですまん
>>78 &str[0]に付いてる&はアドレスを取得する演算子だから、strの最初の文字「a」のアドレスを取得するという意味になり、
結果的には cout << str; と同じことになる。
>>78 cout << &str[0] << '\n';
cout << str[0] << '\n';
この2行でソースと実行結果を見比べれば腑に落ちるんじゃないかな。
>>76 >>77 下位割り込みのリードが一命令で完了するなら「リードの途中でライト」が発生しないので割り込み禁止しなくていいということですか?
例えばリードライトの対象が配列なら割り込み禁止要、変数単体なら不要
>>81 アセンブラ確認してほんとに一命令なら良いけどそうじゃないなら結局危険じゃない?
Cで1行だからアセンブラでも一命令とはかぎらんよ
たとえ1命令でも安全かどうかはcpuによる あいまいな質問にはあいまいな回答しか返らない マニュアル読むのが正解
>>82 なるほど。極端な例ですがcでword変数への代入処理一行だったとしてもアセンブラでは上位バイト、下位バイトを分けて代入してるかもしれませんもんね。
>>83 そうです。
>>84 アセンブラで一命令でもまずい場合ありますか?例えでもよいのでご教授頂けたら助かります。
vector<std::vector<char> > vec; の二次元配列で、一行を削除するのはどうしたらよいのでしょうか。 int row = 1; vec.erase(vec.begin() + row ); ではだめなんでしょうか。
すみません。これでちゃんと動きました。 お騒がせしました。
>>70 int a = max(b - 1, 0); というような書き方を見たことが有る。 >>85 だから一般論で答えられないって言ってんの
使ってるcpuのマニュアル読め
書いてあるから
>>79 >>80 回答ありがとう。
そもそもaddress-of演算子でIndex 0番を指定してるのに アドレス値じゃなくて 文字が出てくることが混乱の元だった。
char型については>> 演算子がオーバーロードされててc-stringとして解釈される。
実際のアドレスを出力したい時は
cout << (void *)&str[1]; とする
って感じでいいのかな?
学校の課題でバブルソートアルゴリズムを使った画像処理の課題で、VSの警告にfor-loopの定義が無効です:最初の条件はテストを満たしていません。ループボディは実行されませんと出てきます。これはどういった原因で出てくる警告なのか教えほしいです
単純化すればこういうこと for (int i = 0; i < 0; i++)
最近BS/CSが映らなくなった人はここを見ると良い
【B-CAS改造】Bカスカード2038化書き換えツール配布所 205
http://2chb.net/r/avi/1560914909/1-100 FILE* file; file=fopen("test.txt","w"); fclose(file); これでソリューションのフォルダ内にtest.txtファイルが作られると読んでる入門書には書いてあるのですが VisualStudioのフォルダ内、何処を探しても生成されてません;何処に有るのでしょうか?
ドキュメントにプロジェクトを作らなかったか? その中かと
>>96 「ソリューションのフォルダ内」であって「VisualStudioのフォルダ内」じゃないぞ
>>96 取りあえずコマンドプロンプト開いて
dir /s /b ¥test.txt
ってやってみ
STLコンテナ「set」の特定要素を削除したいとき set<int> s = {1,2,3}; for (auto itr = s.begin(); itr != s.end(); ++itr) { cout << *itr << endl; if (*itr == 2) s.erase(itr); } これの実行結果が 1 2 1 3 となるのですが、erase後に最初に戻っているように見えるのは偶然、つまり不定の動作ですか? なお、正しいイタレータの使い方は以下のようになるのは承知してます for (auto itr = s.begin(); itr != s.end(); ) { cout << *itr << endl; if (*itr == 2) itr = s.erase(itr); else ++itr; }
>>100 erase で無効になったイテレータの使用により動作は未定義となります。
そのコードの場合は erase 直後にくるループ条件にある比較時点で。
未定義動作を起こしてるんで プログラムがたまたまクラッシュもせずに最後まで動いたというレベルからの偶然
constを外すのに使う const_cast<T&>(t) ですが、Tをいちいち書くのが面倒なので そうだdecltypeを使えば楽できると思ったものの、remove_constも併用しないといけないみたいですね 参照だったらさらにremove_referenceも必要で、これじゃTがくっそ長くない限り有り難みが薄いですね なんかもっといいやり方ないですかね? const int i = 0; const_cast<remove_const<decltype(i)>::type&>(i) = 1 const int& j = i; const_cast<remove_const<remove_reference<decltype(j)>::type>::type&>(j) = 2;
const_cast<decay_t<decltype(i)>&>(i) で大体事足りる まあ大抵は using U=decay_t<...>; とかしておくが
>>108 有り難うございます。decayなんてあるんですね
ここ見るといろいろ機能あるようで
https://ja.cppreference.com/w/cpp/types/decay type_traitsってあんまり詳しくないですけど、よくこんなの考えたなぁと感心します
仕組みを知らないと魔法使ってるみたいに見えますね
作りたいものにC++が必要なので1から学んでるプログラミング初心者です biginteger という型の使い方・使い道がよくわからず悩んでいます。
C/C++の標準にそんな型ないよ C#にBigIntegerあるみたいだね 使い方は普通の整数型と同じ 使い道は、大きな整数を扱いたい時 使い道がわからないものを無理に使う必要ないんじゃね?
多倍長整数ならboostには入ってるからそのうち標準にも来るかもね
標準の型じゃなくて読み込んでるライブラリ?のクラスだったみたいです そっちのマニュアルを見て見たら詳しく書いてありました… いろいろ教えていただきありがとうございました。
オブジェクト指向を使ってないアプリを c++ (コンパイラはg++6)で作るのは良でしょうか?それとも推奨されないでしょうか? 当方、意図せずにそうなってしまいました。 Cで書いてるつもりだったのですが、Cでは認められないと知らずにブロック頭以外の所での変数の宣言などを使っていて、 エラーにならなかったのは、Makefile が c++ 用の流用で、ソースの拡張子が.cc だったからでした。 こんな c++ コンパイラの使い方は、許される事なのか、良くある事なのか気になりました。
Cで書いてるつもりがC++になってた、は良くはないけど別に気にすることじゃないかと Cであることが要件ならCに直せばいいし、C++でもokならそれでもいいし 要件満たすものが出来てんならひとまずokじゃない?
ブロック頭以外の所での変数の宣言はC言語で認められてるでしょ
>>116 どうもです。
ひとまず動いてるのですが、気になりました。
例えば、「完全にcで書いていてcでコンパイル出来るものでも、c++ 必要なものでも、どちらにも拡張子は .cc に統一して、どちらにも常にコンパイラは c++ を使う」と言う態度ってどうでしょう?
c++ が c の上位互換ならこれで良いように思えます。
>>117 そうなのですか?
私の見た情報が古かったのですかね。
>>118 いや、プログラムってそもそも道具なんだから何で書かれてるかとかどうでもいいかと
複数人で開発していて他人もコードを見ることがある、技術情報として発信する、要件として言語の指定がある
とかいう縛りがあるならその縛りに応じるようにコードを書き直せば良い
個人的にはCでなければ困るというのでなければC++にするし、多少の困りくらいなら回避してC++にする
基本的にC++はCの上位互換
私が知りたかったのは、ソースを書くのに何言語を選ぶべきか、でははないです。 知りたかったのは、例えば、 「ソースが c -> gcc 。ソースが c++ -> g++」 をしないで 「一切合切どちらも常に g++ 」でも良いのか?でした。
>>121 ダメです。兄弟はもう袂を分かちました。
30年前の仕様しか使わないと心に決めているならお好きに…
>>122 >
>>121 >ダメです。兄弟はもう袂を分かちました。
>30年前の仕様しか使わないと心に決めているならお好きに…
どうもです。そうなのですね。
「一切合切 gcc 」はダメでも「一切合切 g++ 」なら大丈夫かと思ってしまいました。
なにぶん始めたばかりでして、この辺りの常識がないのです。
良い悪いじゃないけど 実質的にCのプログラムでしかないなら純粋なCのプログラムとして書き直して Cコンパイラとの組み合わせで使っていた方が幸せだと思うよ
その方がサイズも小さく速度も速いですかね。 トライしてみます。
>>125 ブロック変数宣言の位置だけがブロックの冒頭ではないというだけなら、通常、
速度低下は全く無く、それをブロックの冒頭に書き直しても速くなることは
有りません。
また、コンストラクタ、デストラクタ、仮想関数、STL、コンテナなどを使わない限り
通常、C++がCより遅くなるということは有りません。
これからC++勉強しようと思うのですが、 開発環境は何を入れるのがおすすめですか? Visual Studio Communityが無料で良いのでしょうか 他におすすめあれば御紹介願います あと、C++勉強に当たっておすすめ定番の本あれば ご教示ください
今時ならUbuntu入れてatomなりvs codeなり入れりゃいいんじゃないかな 純粋にc++の勉強したいなら VCは独自仕様が酷すぎるから言語学習には不向き
VCの独自仕様が気に入らんのならVS2019で対応したLLVMツールセットを使えばいい 初心者にIDEなしはモチベ維持が困難
独自仕様ならGCC、未実装ならVCってかんじだがどちらも独自仕様はオプションで制御できる まあWindows環境でやるならVisualStudio使わないのはマゾ おすすめできる定番の本についてはどれも一長一短だし テンプレートの利用くらいまで扱ってればとりあえずなんでもいいと思う
vcのは独自と言っても、なぜかコンパイルが通らない なぜかコンパイルが通る なぜかリンクエラーが起こる みたいなあまり明文化されていないのだから面倒 structとclassがリンカで別物ってのは酷すぎる
>>132 その最後の行の話、はじめて聞いたけど参考になるサイトとかあったら教えて。
コマンドライン引数ってのが何を出来るものなのか全く分からないのですが、何が出来るものなんでしょうか? 書き方はまー分かったんですけど、空のメモ帳をドラッグ&ドロップすると意味あるみたいなこと書いてあるけど何も起こりません… 使用環境Visualstudio2019 で見ているサイトhttp:ああwisdom.sakura.ne.jpあprogramming/c/c32.htmlです
std::optionalが内部に値を保持する仕組みについてお聞きしたいことがあります 現在いくつかのサイトを巡り、値を保持するためにstd::aligned_storageで確保した領域に配置構文newで値を書き込んでいることがわかりました このaligned_storageを使った場合に、std::vectorなどのサイズが可変な値が格納されるとどういった挙動になるのでしょうか vectorの要素数が増えてサイズが大きくなると、alinged_storageで確保したサイズを超えてしまったりしないのでしょうか
根本的な部分の理解が足りていない気がするが直接の答えとしてはvectorのサイズは増えないので問題ない。 vectorが管理しているバッファのサイズは増える。 vectorはポインタを持っているだけ。
>>137 なるほど、的確な解答ありがとうございます
VS2019でchar* name="ABC"みたいにやると
cont char*値を使用してchar*のエンティティを初期化することはできません。とエラーが出るんですけど
どうしたら実行できます?
ググったらcharの前にconst付けると直るみたいですけどこの例だと治りませんでした
http://ideone.com/YyFypJ const char* name; ってしてもダメなの?
>>140 それはやったんですけど出来ませんでした
paizaとかはconstとか付けなくても付けても出来ましたけどVSでは出来ないのでしょうか?
あるいはそれを許可するコンパイルオプション付けるか
>>141 それをやってダメだったときのエラーメッセージを張ろう
>>139 C/C++の言語仕様的には const char *name="ABC"; で行ける可能性は高いんですが、分かりやすさのためには、 static const char szName[] ="ABC"; // szName[4] という配列を "ABC",0 で初期化。 const char *name =&szName[0]; とするものお勧めです。 少なくとも
>>139 のリンクにあるコードはchar*にリテラルを入れようとしてるのでNG
constをつけても駄目なのは生成後に代入しようとしてるから
てか意味もなくグローバルスコープの構造体とかやめろ
あと特に理由がないなら文字列はstd::stringを使うべき C言語じゃないんだから
>>147 構造体メンバに
const char *name;
と書いていて、構造体を生成後に後から name メンバに
Cの文字列リテラルの先頭アドレスを代入することは、
C/C++の言語仕様的にはいけるはずです。
なぜなら、xxx.name のように書いた場合、コンパイラの内部的には
const char* 型の左辺値(代入先)が有るのと同じように扱われるので、
ローカル変数に const char *aaa; aaa = "xxx"; と書いた場合と変わらなく
なるはずですから、C/C++ の言語仕様的には。
独自のクラスに比較演算子==を実装する時、クラス内に定義するのとグローバルで定義するのとでは、実装の仕方以外に違いがあるのでしょうか? また、例えば独自クラスとintの比較演算子==を実装する場合は、左辺にintがある場合と右辺にintがある場合の二つを用意する必要があるのでしょうか ちなみに使用しているのはC++11です
それくらいすぐ作れるんだからやってみればいいのでは
>>152 これって自分でやったところで解決できる質問なのでしょうか?
もちろん既に自分で実装していますが、自分で使ってみた感じではクラスでもグローバルでも一切の違いがないと「思います」
左辺と右辺のintについても、わざわざ2つの演算子を定義するしか方法がないと「思います」
クラス内に定義するのとグローバルで定義するのとってどういう意味でだ? クラスのメンバ関数と普通の関数として定義するのとってこと? あるいはクラスのstaticメンバ関数と普通の関数? そういうのとは違ってクラス定義の中にメンバ関数の定義も書くのと クラス定義の中では宣言だけで外に定義を書くのとってこと?
>>151 クラス内に定義すると当然メンバー関数扱いなるのでprivateメンバーにアクセスできるが、左辺を自クラス、右辺をintにoperatorしか定義できない。
クラス外に定義すると、そのままではprivateメンバーにアクセス出来ないが、左辺、右辺どっちでも自由に定義できる。
>>151 相手がintの場合はわざわざoperator==を定義しなくても、intへの型変換operatorを定義すれば勝手に変換してくれるので、そっちの方が楽だと思う。
>>151 どっちでもいいに一票
どっちが自然か&楽かで決めればいいとおも
>>155 大きな違いとして出てくるのは実装面の都合になってくるわけですね
>>157 の方の言う通り楽な方で実装しようと思います
>>156 型変換のオペレータを実装するのは思いつきませんでした
確かにそれが一番手っ取り早いですね
教えていただきありがとうございます
質問ですがリフレクションってのは何ナノですか? これがないのがC++の欠点って言われてるそうですが
ググって何がわからなかったのか書けよ そういう気配り謙虚さがないからお前は伸びないんだよ
かっこいい
>>151 それよりもその定義をどのファイルに置いとくかっていうディレクトリ構成のが重要。
T[]は配列、Tなものが並んだもの T*はポインタ、Tなものを指すもの Tは、Tそのものとしか 配列は随所でポインタに変換されるから混同するのもわからんでもないが
じゃあ配列を関数の実引数で与えるときに[]…って書かないで*ってするのはなんで??
配列を関数の実引数で与えるときに*なんてしない int arr[NUM] = 0; func(arr, NUM); 普通こう書く cでは、配列は構造体とは違い「満足なオブジェクト」ではないんだ 関数に配列そのものを渡すには構造体で包むなりしないとならない 面倒なんで普通はそんなことはしなくて、先頭要素へのポインタとサイズを渡す 上記func(arr, NUM);も、本当は配列そのものを渡したいんだけどできないから そういう意味だと解釈される
つまり、めんどくせぇし表現乱立するくらいならvectorなりarray使えってことだな
mallocした配列なら* 二次元配列なら** 三次元なら*** すんごく分かり易いじゃん
>>167 >cでは、配列は構造体とは違い「満足なオブジェクト」ではないんだ
私にいわせると、C の配列の扱い方こそ正義であり、まるまま渡せるという構造体の方が正義に反するやりかただと考えています
構造体の扱いに関しては、K&R1 のままの方が良く K&R2 は改悪だったと思っています
>>168 乱立とかちょっと何言ってるかわかんない
Cだけだといろいろ物足りないから C++ をちょっと便利な C として 手を付けるのは あり?
Better Cっていう用語があるくらい一般的な使い方です
>>173 みんなそうやって C から C++ に移ってきたのだと、私は思います
>>175 お前はC++の機能はまともに使えてないけどな
>>176 どんなところが「まともに使えていない」と感じられるものだったのでしょうか?
いや、もうc言語とかいいじゃん、 c++使おうよ 配列で悩むのめんどくさくね? 配列のサイズ渡せないとか欠陥だからマジで
>>176 どうせメタプログラミングもまともに出来ない雑魚だろ?
>>178 vectorやarrayじゃないと渡せないと思ってる?
>>179 じゃあ、共通的なやり方で動的配列のサイズ渡してくださいよ
どうやるんですか?
メタプロなんてできない方がかえって生産性あがるわ。 カスが使うと無駄にモジュラリティーの低いもの作るだけ。
>>182 貴重なお言葉恐悦至極に存じます、メタプロとかは私は一生理解できないと思っていますが、それでもいい、というお言葉ですよね…
>>182 > 「カスが使うと」無駄にモジュラリティーの低いもの作るだけ。
よくわかってるじゃないかw
つまりksかどうかを判定するにはメタプロさせてみればいい、ってこと?
>>177 何か指摘するとまたイチャモンつけて否定するだけだろ
俺がまともに使えてないと感じた
理由は自分で考えな
>>187 >何か指摘するとまたイチャモンつけて否定するだけだろ
そうでもないと思いますよ…実感では 3% くらいしか使っていないかと
>>183 理解の問題じゃなくてセンスの問題だつってんだよバカ。
>>189 そうですか、でも、それはそれで興味深いですね
センスの問題、ということは非言語領域的テーマだろうか、と推察しますが、
コンピューター言語という極めて形式的=言語的な領域の話にて非言語的概念が語られる、いや、それが最重要であるというところに奥の知れない「恐ろしさ」を予想します
(どうもコンパイル時最適化が効くからテンプレートメタプログラミングするって人がいないように思う)
コンパイル時最適化て、C++の最適化は普通コンパイル時とリンク時だけやろ
>>192 リンク時に最適化するのですか?単にリンカがリンクするだけだと思っていましたが
メジャーなコンパイラにはある機能だよ リンク時最適化でggr
テンプレートのコンパイル時最適化なんてのはマクロ展開的な最適化をしてるだけ。 そんな最適化が必要な部分はもっと慎重に関数化するわ。 ただドヤリたいだけのバカがありがたがってるってのがよくわかる。
これまで何も考えずにC++で配列を使ってたんですけど もしかしてC++で配列を使うのってナメられますか? arrayやvectorなどでないとやはりコードのクオリティが下がることになってしまうのでしょうか?
newからdeleteまでの間の例外処理に不備がないと自信があるなら生配列で構わん
>>197 静的配列なら生配列もありかと思う
静的配列でもarrayのメソッド使いたいとか引数で他の関数等に渡すとかあるならarray
動的配列なら他に理由がない限りvector一択
>>197 生配列とarrayやvectorのメリットデメリットや使い分けを理解せずに何も考えずにarrayやvectorにする方がいいらしいなんて理解の仕方ならクオリティは低いままだよ。
>>195 その表現もおかしいけどな
テンプレートによってマクロ展開的に生成されたコードにも等しく最適化がかかるだけであって
>>197 コードのクオリティとか良いコードとかより、最終的にどちらがユーザーの利益になるかどうかを考える方が健全だと思うけど
>>201 マクロ展開で実行評価される必要のない部分が削られるって話なんだが
あんまり理解してないでしょ?
まあ別に理解してないならしてないでほとんどの場面で使わなくていいものではあるが。
>あんまり理解してないでしょ? こっちの台詞だよ 必要とされたときに初めて実体化されるの 必要ないのに全ての型全ての組み合わせ用意してから削ってると思ってたのか
>>203 やっぱ変数評価の問題とマクロの関係を全く理解してないんだな。
>>196 そういう型マッチングシステムに依存しまくったものの危険性を全く理解してないのが
問題なんだよ。
SFINEとか型マッチングシステムのデバッグしずらいものに頼る問題を
全く意識していない輩が多すぎる。
変数(というよりテンプレート実引数)を特殊化なりオーバーロードなりで評価した結果コードが生成されない(テンプレートが実体化されない)のは最適化でも何でもない
ただし、よくわかりもせずにテンプレートを持て囃したりC++歴数年でテンプレートに首突っ込む(しかも生産性ガン無視で)初心者が増えたのは俺も問題だと思う
>>205 君の用語の使い方が独特で、君の思ってることを読み取れるエスパーは少ないって話だと思うよ。
マクロ展開の「実行評価」って何なの?
具体的な問題を挙げずに危険とかいうのは単なるFUDってやつじゃないの?
理解させるために言葉を工夫するつもりが無いなら黙ってくれていい。
>>209 理解してないならそういえばいい。
とりあえずcommon-lispでも勉強することをオススメする。
少しは見識が広がると思うよ。
>>210 common lispで実行評価って、evaluationのことを言いたいのだろうか?それなら「評価」と訳されると思うけど、実行評価はググっても見当たらない。PDCAの用語と混同してるのではないかと思えてしまう。
lispがでてくるならこれはもう defmacro しかないんじゃないか?
そやっ common lisp言うたら相手びびるはずやっ
まずはダイナミックとスタティックの違いがある 静的なものは未来永劫不動なので、一度作ったら未来でも一切変わらない 動的なものは「未来は不定である」「未来は誰にも分からない」という哲学あるいは神学から作られたので、未来に挙動が変わる 決定論的な未来の世界観では一度作ったらそれきり、静的なものが出来上がる ここでいう決定は本当に神学で、全知全能の神を指している 未来の事柄があらかじめ全部分かっていれば、ダイナミックなことはしなくて良くなる、というのが、彼ら西洋人の究極の理想論 今分かることは動かす前に全部決め打ちすりゃーいい、ってのが静的だ
>>215 >未来の事柄があらかじめ全部分かっていれば、ダイナミックなことはしなくて良くなる、というのが、彼ら西洋人の究極の理想論
ラプラスの悪魔、という語句をご存知ですか?西洋人ですら「未来の事柄をあらかじめ」予測することはできない、と観念しているようですよ…
色んなサイトを見てC言語の文法を学習中なのですが構造体の自己参照のやり方がどうも分かりません。 かんたんな短いサンプルコードを使って教えてほしいです よろしくお願い致します😪
構造体Aが内部に構造体Aを持つとすると、Aは無限の構造的ループを持つことになる。これはあり得ない。 自己参照するなら、Aのポインタを使わないといけない。 typedef struct A { struct A *next; int value; } A; こんな感じになる。ポインタが分かっているなら、 A *a = (A *)calloc(1, sizeof(A)); a->next = NULL; a->value = 666; ... この変数aにさらに追加するなら、 A *b = (A *)calloc(1, sizeof(A)); a->next = b; ... 問題は破棄だが、自己参照をたどっていってすべてのAの実体に対して、 freeを呼ばないといけない。
ただし、同じ実体に対して2回free関数を呼ぶことはできない。 また、解放した実体のメンバーは参照することができない。 参照すると、不正読み込みでプログラムが異常終了するかもしれない。 ということでパズルのように解放方法のアルゴリズムを考案しないといけない。 C言語というのは、そういうややこしさをはらんでいる。
1個追加したいときに、このようなコードをいちいち書くのは大変なので、 普通は「1個追加する」という動作を行う関数を用意する。 void add(A *a, int value) { A *b = (A *)calloc(1, sizeof(A)); b->next = NULL; b->value = value; a->next = b; }
テンプレートの話題でlispの話題ならマクロの話ってピンとくるもんだと思ったが 結構バカが多いんだな。
>>218 かなりコンパクトに纏めていただきありがとうございます
ただまだcallocとポインタ型のキャストがいまいち分からなくて😪
すいません
calloc(1, sizeof(A))は、1*sizeof(A)バイトのメモリーブロックを確保し、ブロックをゼロでクリアする。そして先頭アドレスとしてvoid*型を返す。リファレンスをちゃんと読もう。全部書いてある。
c++でanimal, dog, catなどのクラスを作ってオブジェクト指向の勉強してます. dogとcatはanimalを継承するよくある例です. 適当にa[]という配列を切って,a[0]はdogのクラスでa[1]はcatのクラスで… というようにしたいのですが,この配列a[]の型やaのクラスを指定するやり方が 分かりません. 最終的にはa[i].barkというようなことをやりたいです. よくある質問だと思うのですが,適切な検索ワードが分からず困っています. どうやったら良いかor適切なキーワードを教えてください.
animalの配列にdog, catをアップキャストしてぶち込む animal, dog, catのunionを作り、そのunionの配列を作る
>>226 さっぱり分かりませんがありがとうございます.これでgoogle先生に質問できます.
>>229 こんな感じですか?
push_backでエラーが出てコンパイル出来ませんが…
std::vector<std::unique_ptr<Animal>> a;
a.reserve(2);
a.push_back(std::make_unique<Dog>());
a.push_back(std::make_unique<Cat>());
基底クラスの実体配列じゃ多分無理で 基底クラスのポインタ配列しかないと思うわー
ポインタの配列を作ったつもりだったんですが違うんですね.... 誰か簡単なコード書いてくれませんか?
c++17ならstd::variantが使えそうだけどね。
>>232 std::unique_ptrだからうまくいかない
生ポインタにするだけで通る
>>230 VS2019だと問題なくコンパイルできるけど。
Animalをpublic継承していないとかだったりして。
>>230 > push_backでエラーが出てコンパイル出来ませんが…
なぜエラーメッセージを貼らないの?
つか、エラー貼るまでもないだろ std::unique_ptr コイツはmovしかできないから、コンテナに格納できる条件に合わない。 スマートポインタをコンテナに入れたかったらsharedポインタを使う 常識じゃなかったのか
unique_ptrはコンテナに格納可能という俺の常識とは違うようだな
>>239 >>235-237 でエラーなくコンパイルできるのに何を言ってるんだよw
>>239 std::unique_ptrはコンテナに入れられるぞ
std:auto_ptrをコンテナに入れた場合に起きるCOAPという問題は起きないんだぜ
質問者です。すいません。 コンストラクタのエラーでした。 無事コンパイルできました。 ありがとうございました。
人の書いたプログラム読んでるですが,#includeとclassの定義の間に入ってるclassの意味が分かりません. 下の例で言うとHogeのところです. これは何ですか? #include <string> class Hoge; class Foo : public Bar { protected: ...
class TA{ static public int a; } があって、 int b = TA::a ; のようにするのと、 TA A; int b = A.a; のようにするのは、bに読み込む速度は違うんですかね。
>>247 後者はAの実体を作るから遅いかも。まあ多分、最適化で変わらないと思う。
wavファイルなどの外部の別ファイルを読み込んで使いたいのですが、どのようにやればいいのでしょうか…? バイナリデータにして読み込む、みたいな方法を見かけたのですがファイルのサイズが大きすぎるとヒープの領域を使い果たしました的なエラーが出てしまって行き詰まっています
mallocを使う まずは音ではなく画像、bmp読み込みから練習する 数百MBの音声ファイルよか数MBのbmp画像読み込みの方が気がラク
>>249 一度に全データを読み込むのでなく、固定サイズのバッファに、必要な分だけ少しずつ読み込めばいい。
読み込み済みデータを再生するスレッドとは別に、もう一つのスレッドで再生にあわせてデータを先読みで読み込んでいけばいい。途切れなく再生するにはリングバッファとかを使う。
malloc・リングバッファ、詳しく調べて挑戦してみようと思います! あとスレッドの概念もちゃんと理解できてない気がするのでそこも勉強しようと思います。 ありがとうございます!
>ファイルのサイズが大きすぎると 積んでるメモリぐらいでかいファイルなのかな? どういった読み込みで失敗してるんだろう?
> ヒープの領域を使い果たしました的なエラー これからまず連想したのは、VCで巨大ファイルをリソース化しようとしたときに出るコンパイルエラーだな どのタイミングで出たエラーか書いてないからわからんけど
実行ファイル中にリソースとして埋め込み リソースからバイナリ列を引き出して(読み出して) 再生コードに渡す 音声を実行ファイルに埋め込みたかったのかな?
もう少し詳しく書くと、とあるプラグインを作りたくて、それ用のプロジェクトファイルのジェネレーターとVisual studio 2019 を使っています。 そのジェネレーターを通してwavファイルをバイナリデータ化しているのですが、wavファイルのサイズが一定以上になると「error C1060 ヒープの領域を使い果たしました」っていうエラーが出てビルドが通らない状態です。 10MBぐらいのwavファイルだと普通に通って、18MBぐらいになるとエラーが出ます。
プラグイン本体にバイナリデータ埋めまず、エンドユーザーにはプラグインと音声ファイルを配布 音声ファイルのパスだけうまく帳尻あわせてファイル開いて、メモリ確保して、ファイル読んで、etc って設計するかな
>>256 そのジェネレータとやらがエラー吐いたという話ならスレ違いだろう。
スレチのような気もするんですが,ここが一番適切な回答がありそうなんで,質問させて下さい. iPadでc++のコード(複数のファイルでつくられている)を読みたいんですが便利なビューワーありますか? 関数名やクラス名クリックしたら定義してるところまでジャンプしてくれるようなやつを探してます. emacsで言うetagsみたいな機能のことです.
「ipad emacs」 でぐぐったら iPad用の emacs そのものがあるようだけど
>>264 後出しですいません.キーボードは使わないのでemacsはないです.あと,iPadのemacsはけっこうがっかりだった記憶が….
タッチでジャンプできると嬉しいのですが….
便利そうなエディタは何個かあるみたいなんですが,ジャンプ機能がないんですよね.
以前
>>225 で質問させてもらったものです。
>>230 で書いたようなプログラムを作ってるんですが、
DogやCatだけでループを回したいんですがどうしたら良いですか?
Dogだけの配列とCatだけの配列作ってから、Animalのポインタでそれらの配列を
参照すれば出来るのかなと思ってるんですが、考え方はあってますか?
>>266 ポリモーフィズムがうまくできていればAnimalのポインタの配列にDogやCatのポインタを突っ込めるはず。
>>268 んでサウンドは使えるようになったか?w
>>268 ポインタ突っ込む方法を具体的に教えてくれませんか?
ポインタがよく分からないです…。
Animal *array[10] = {NULL}; array[0] = new Cat(2, 3); array[0]->walk(); delete array[0];
>>270 一旦オブジェクト指向のことは忘れてポインタを先にしっかり学んできた方が近道かもよ。ここで小さなサンプル教えてもらって真似しても近い将来嵌まって行き詰まりそう。
オブジェクト指向の勉強が目的なら他の言語で始めた方が余計なところで躓かないと思う。
>>272 MZうyちゃーーーん♪はBASICで充分w
DogやCatのインスタンスも複数あって、 Dog だけでループとかCatだけでループとかしたいんです。 animalだけでループするなら書いていただいたので良さそうなんですが。
DogやCatに自身のタイプを返す機能をつけるか、typeidを使ってループをフィルタすればいい
dynamic_castでダウンキャスト失敗すればNULLが買える。一個800円。
>>278 何言ってるか不明ですがキーワードありがとうございます。
とりあえずググります。
for(auto a : animals){ if(typeid(a) == typeid(Dog*){ } }
dynamic_cast<Cat>(array[0]) == NULLだったらarray[0]はネコではない
|| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|| ||. =ねらー三原則= || || 1.助けない || || 2.教えない 。 ∧_∧ いいですね。 || 3.関わらない\ (゚Д゚,,) ||________⊂⊂ | ∧ ∧ ∧ ∧ ∧ ∧ | ̄ ̄ ̄ ̄| ( ∧ ∧ ( ∧ ∧ ( ∧ ∧ | | ~(_( ∧ ∧ __( ∧ ∧__( ∧ ∧ ̄ ̄ ̄ ~(_( ∧ ∧_( ∧ ∧_( ∧ ∧ は~い、先生。 ~(_( ,,)~(_( ,,)~(_( ,,) ~(___ノ ~(___ノ ~(___ノ
dynamic_cast<Cat*>(array[0]) == NULLだったらarray[0]はネコではない
>>284 理解しました。
そのif文つかうとOpenMP使うときにロードが均等に分散されないので、
dogだけの配列欲しいですね。
>>289 それなら条件に該当するエントリのポインタを抜き出した配列を作ってループすればいいんじゃないか?
ループ内の処理が並列化する価値があるくらいコストかかるなら、ポインタを抽出してコピーするコストは無視できるかと思われる。
>>290 ありがとうございます。
それやってみます。
> Animal *array[10] = {NULL}; 20年以上前に配列要素を一つ以上書かないといけない処理系があったな タイムスリップでもしてきたか
Animal *array[10] = {p0, p1, p2}; だとすると array[0] ~ array[2] は p0~p2 になるが array[3] 以降は全部 NULL で FA?
char *array[10] = {p0, p1, p2}; だとすると array[0] ~ array[2] は p0~p2 になるが array[3] 以降は全部 NULL で FA?
>>294 Cだと今でもダメだから、それ見たんじゃないの?
Windows の普通のソフトのインストーラは Program Files 以下に適当なフォルダを作ってそこにファイルをまとめて入れるけど、 コマンドラインアプリの場合ってどうしてる? GUI アプリと同じようにフォルダに突っ込んで環境変数 PATH を設定するってのが標準的なやり方だと思うけど、 そういうのが増えてくると PATH が長大になって嫌な感じなので、なんかうまい方法ってないもんかな? C/C++ とは直接の関係がなくてスマソ。 どのスレがベストかわからんかったもんで。
環境変数なんて入れずに叩くときにフルパス入れりゃいいだけでは?
>>302 フルパスを前提にすると連携しづらい場合が出てくるんよ。
「このバッチファイルを実行するにはこのソフトとこのソフトを入れてね!」
みたいなことをやろうとすると、想定してたのと違うフォルダにインストールしてるだけで破綻してしまう。
32bit のアプリケーションって 32bit 版の Windows だと Program Files に入るけど
64bit 版の Windows だと Program Files (x86) 入るようにするのが基本的な作法じゃん?
それだけでも違ってしまうけど
システムドライブとは違うドライブにアプリケーションをインストールしたりする運用をやってる人は意外にいるので、
インストール先を選択させずに固定するってのも縛りが強いかなぁと思うし。
どこにインストールしてでも同じように使えるようにするには PATH くらいしか選択肢がなくなる。
でも嫌。 っていう話。
20年以上前からある問題だな Windowsではその辺は未だにグダグダだと認識している
>>303 設定でその外部アプリへのパス指定できるようにすれば?
インストール先固定、環境変数追加、レジストリ追加よりユーザーに指定させるほうが個人的には好き
というかこの三種のような方法をとるアプリはそもそもインストールを躊躇する
コマンドラインアプリでコンソールから起動 バッチファイルから呼び出し etc 実行ファイルの検索順位に依存しまくるからにゃぁ
app paths をコマンドラインでも適用してくれよって思ってる。
> 32bit のアプリケーションって 32bit 版の Windows だと Program Files に入るけど > 64bit 版の Windows だと Program Files (x86) 入るようにするのが基本的な作法じゃん? > それだけでも違ってしまうけど 違わない 32bitアプリケーションからは Program Filesしか見えない 実際はProgram Files (x86)をアクセスしてる訳だが そんなことは32bitアプリケーション側は知らなくて良いし知らない方が良い
class A{ public: B b } class B{ … } の時、Aのコンストラクタなどで b = new B; とすると、 このbはAのクラス内で使えますが、Aのデストラクタが走る時に、 bも一緒に消えるのでしょうか。 それとも別途に delete b が必要なのでしょうか。
一緒に消えないのですか。どうもありがとうございました。
>>310-312 A のコンストラクタ内で例外が送出されると delete b が実行されない可能性があるのでなるべくならスマートポインタを使うのが望ましいし楽。
B b; と定義したなら、b = new B;が不要で、Aのデストラクタ実行時にbも一緒に消える。
B* b; と定義したなら
>>311 だが、わざわざポインタで定義するのは
コピーコンストラクタ等々自前で定義しなきゃならんのでお勧めしない。
スマポならAのデストラクタ実行時にbも一緒に消えるけど、
shared_ptrはコピー時に共有されてしまうし、unique_ptrはコピーできなくなる。
なるほど。B* bで書いたつもりが間違ってました。 しかしA内でbを使い回すなら、B b の方が良さそうですね。 どうもありがとうございました。
多分スレチな話題だけど 高速化目的で固定小数点数クラス作って満足してた所に、コンパイラの設定で浮動小数点モデルをfastにしたら何倍も速度差つけられたんだが どういう原理でそうなるのかわからない 調べても中々資料出てこないし 誰か教えて下しい
>>317 現代では浮動小数点はハードウェア (CPU) のサポートがあるので丸め方の一貫性とか捨ててめいっぱいに CPU の機能を利用したら速いよ。
昔、インテルの一部のCPUにfloating pointの処理に不具合があって、それで高い精度が求められるプログラムでは、ソフトで対応できるようなコンパイラが作られたらしい(要出展?)。
SSDは早い。400MB/sec近い。 HDDは遅い。100MB/secくらい。 音声に加えて画像も出力することを考慮すると、音声出力の実際の性能は50MB/sec以下だろう。 音声を最高の品質にすると、10msecごとに音声データがおよそ3900バイトあるようだ。1秒では390000バイト、390KB/secになる。余裕のよっちゃんだ。
記憶媒体やOSはときどきフリーズすることがある。0.5秒フリーズしても耐えられるようにするには、390KB*0.5==195KB。 少なくともこれだけのバッファが必要になる。余裕を持って事前にリングバッファ400KBを用意することにする。
一度にファイルに書き込むデータは100KBにする。このデータ量は小さすぎても性能が下がるし、大きすぎると流れが止まってしまう。
アプリ起動時に音声消費スレッドを起動する。イベントハンドルで音声データが車で待つ。イベントが来たら、音声データを少しずつファイルに吐き出して、消費する。全部消費したら再びイベントを待つ。これの繰り返し。
長く録画してると、画像と音声のタイミングがずれる。 WM_TIMERのせいか?
WM_TIMERの精度が低いから音ずれが起きている。 QPCと別スレッドで書き直し。
何のタイミングを作ろうとしてる? リアルタイムに録画したデータをストレージに保存するんだよね?
どうもタイミングの累積誤差があって、ゲームのWinDepthで試すと動画では音が遅れるみたいなんだ。
録画した後、それを再生するとずれていくといこと? それとも狙った時間でスクショをキャプチャできないという意味?
>>336 WindowsMediaPlayer起動しながらやってみたらどうなる?
Visual Studio 2017だと音ズレはなくなった。 MSYS2のデバッグバージョンでは少しずつ音がずれる。 WinDepth のSTAGE 2にいくと0.5秒ほどずれる。
MSYS2のリリースバージョンでも音ズレなくなった。
ありがとうございます。
https://github.com/katahiromz/YappyCam/blob/master/YappyCam.cpp#L75 これがPictureConsumerThreadProc (映像消費スレッド)。
https://github.com/katahiromz/YappyCam/blob/master/YappyCam.cpp#L158 これがPictureProducerThreadProc (映像生成スレッド)。
次はパフォーマンスを出来る限り高めないといけない。
CreateThreadはCRTと一緒に使っちゃいけないらしいから、_beginthreadexで書き直しだ。
PT_SCREENCAPにBITMAPチェックを入れたら直った。 画面にごみが残るのはどうにかならないかなあ?
フレーム落ちはしてないから、性能の問題ではない。たぶんフレームと音声のタイミングの違いだろう。音声の方が長い場合は音声を削ることも検討する。
>>346 なんか意味あるの?
当たり前だが、フレームレートに枚数をかけ算すると、動画の時間が求まる。これを音声の長さと比較して音声が長ければ音声の先頭を削除。これでいってみるか。
あらかじめMediaPlayerを起動しておくと あら不思議なぜか動作が軽い っていうのは昔から有名な検証方法の一つ
>>347 Windowsのタイマーはmsecのオーダーは出ない(Linuxもだ)
それしかビデオのタイミング作る手段がないならタイムスタンプ管理すべきだ
またPCではそもそもハードウェア的にビデオとオーディオは同期してる保証がない
その前提を踏まえてつくる必要がある
オーディオもビデオもキャプチャしたタイミングでタイムスタンプを取得して同様にファイルに保存する
再生するときにそのタイムスタンプを比較してビデオが±0.5フレームずれてきたら
フレームをスキップかリピートして調整する
オーディオを基準に考えるのがポイントだ
最後にWindows10では画面録画は標準機能だ
>>351 核心情報キタ―――(゚∀゚)―――― !!
ありがとうございます。
YappyCam 0.9をリリースしました。
https://katahiromz.web.fc2.com/yappycam/ja - パフォーマンスの改善。
- 音ズレを修正。
これで終わり、、、じゃないよ。 プラグインで時刻表示と猫耳ができるまで終わらないぞ。
プラグインを実装するには自作のPluginFrameworkを参考にする。
これもC++/Win32で書かれている。
PluginFramework
https://github.com/katahiromz/PluginFramework 拡張子は.yapでいいだろう。拡張子こそ違うが、プラグインファイルの中身はDLLファイルと同じ。LoadLibraryで読み込めるはずだ。
クラスの中の処理を別のプロセスのプログラムに行わせたいんですけどどのような方法があるでしょうか 64bit環境のプログラムにインターフェースのみを提供するクラスがあって、中の処理を32bitのプログラムに行わせたいです クラスは状態を保持する必要があるので呼び出す度にプログラムを実行することはできません
>>363 呼び出される側のプログラムはどのように待機するべきですか?
コマンドライン引数経由でファイルマッピングハンドルの値を受け取る、もしくはPostMessageでハンドルの値を受け取る。 クリップボードを使ってもいいし、ファイルを経由してもいい。
自由に変更できるならsocket使ってTCP(UDP)portで待機
>>370 古くて枯れた技術を触っているから、マイナーな言語は使ってない。
最近はRustとElixirがブームらしいが、私は相変わらずC++。
カメラアプリのプラグインを設計しないといけない。要件定義から。 OpenCVのcv::Matを受け取り、何らかの画像処理をする。今考えているのはフィルタープラグインと監視役プラグイン。 時刻表示フィルターと猫耳フィルターは必ず実装する。監視役は、何かが発生したら、管理者権限で保護されたコマンド列(Command*.bat)を実行する。 フィルターは処理の順序が大事だから、プラグインを順序付けしないといけない。 プラグインは自作のPluginFrameworkをチューニングして使用する。
読み込んだプラグインは有効か無効かを選べる。プラグインの順序も変えられる。そこでプラグインを管理するダイアログが必要だ。 そのダイアログはメインメニューからアクセスできる。ダイアログからプラグインの名前やバージョン情報にアクセスできるようにリストビューを使用する。 読み込んだ全てのプラグインが有効であるとは限らない。有効なプラグインは、プラグインを表す文字列のリストで記録する。高速にアクセスするためにさらにプラグインのインデックスのリストを使用する。
順序の変更には上・下ボタンを使用する。 有効・無効の切り替えはリストビューのチェックボックスを使用する。 時刻表示にはcv::putTextを使用する。 拡張子は.yapで決まり。exeと同じ場所に置く。
完全初心者です 苦しんで覚えるC言語という初心者サイトを終わらせたら 次になにかおすすめサイトor本をやるべきなどありますか? とりあえず義務教育に組み込まれるということで 何か作れるという体験をしてみたいのですが
Rust, Elixir は、小さめのサイズの本が出たから、簡単に読める。 その代わり、情報は少ない Rustプログラミング入門、酒井 和哉、2019/10/13 小さめのサイズの本で、初心者向け。 簡単すぎるから、たぶん、かなり情報が少なそうw プログラミングElixir、2016 著者は「プログラミングRuby」のDave Thomas Elixir = Ruby + Rails + Erlang VM Elixir は関数型言語で、状態を持たず、並行処理が得意 Elixir で並列に動く、小プロセスはデータを共有しない。 10万の小プロセスを、0.6秒で起動できて、すべてのCPUコアを使いつくす これで、スレッドと状態を持つ地獄から、おさらば!
>並行処理が得意 そんなもん今どきの言語なら皆そうなんだが? いい加減スレ違いの書き込みはやめろ ここはC/C++スレだ
義務教育を受けてる若者なのか、教える立場の教師なのか、 はたまた我が子の勉強を心配する教育ママか。 とりあえず義務教育でCは使わないと思うよ。 しかし、このスレッドも意外に見てる人がいるのね。
義務教育課程のプログラミング教育はフローチャート書いて終わりだよ
それでいいよ 問題を分解して論理立てて解決する力 が必要なのであって構文とかどうでもいい だから擬似言語でも良いし図だけでもいい
パヨチン教師に論理的思考ωを教えさせるのは無理やろ
>>377 完全初心者で作ってみるのがまず目標ならscratch辺りが無難じゃないかな?取っつきやすくプログラミングの基本に触れられると思うよ。
初心者がCから始めても作る喜びを見つける前に細かなところで躓きを繰り返して挫折する率が高いと思う。
入門書一冊読んだ時点でその知識を組み合わせてなんか試してみようと自発的に思い付くとか、文字だけの画面で入力した数字を並び替えただけで喜びを感じられるとかなら、向いているとは思うけど。
>知識を組み合わせてなんか試してみようと自発的に思い付く コピペしか出来ないkidsには無理
初心者にマウントとるしか出来ない無自覚kidsには無理
本格的にやる気はないやつにも最低限の知恵を与える (義務教育) ってのと 学ぶ意欲があって学ぶってのは別物だよ。
これからc++に手を出そうという人間に、江添氏の入門サイトもしくはその書籍化本は向いてますか? いきなりヘッダファイルまとめて、コンパイルオプションに設定してて、たしかに記述減るけどありなのかがよくわかりません
>>396 ありがとうございます
楽なのは事実だし、そこよりもまずは中身がまともに使えなきゃ無意味でしたね
>>395 意味がわかってるならやりたいようにやっていいよ。
「プラグラマがやりたいことをさまたげない」という意味のことは D&E に書いてある。
言語仕様としてはさまたげないという意味なのでやった結果がクソになっても自己責任だけど。
そのあたりは言語仕様がどうこうよりも設計の話になるんじゃないかなぁ。
まあまずは言語を理解しないことにはどうにもならんので、
いい感じの作法は後回しでもいいでしょ。
(そういってずっと後回しにし続けるのはよくある話なのでちゃんと計画を立てて学習しような!)
>>400 俺は
>>399 で江添氏による C++ 入門書については何も言ってないよ。
「作法は後回しにして言語 (C++) の入門書を読め」ってだけ。
言語の入門書っていうのは特に限定しないけど、江添氏のでも別にいいんじゃね。
俺は読んだことないから知らんけど。
>>401 正にその入門の本探しで迷宮入りしてるところに、江添氏の本を見たので、そういうのもありなのかと思っての質問でした
作法にこだわって肝心な部分を落としてたら意味がない(作法を無視して良いというわけではなく)のは確かなので、本読み手を動かしていきます
アドバイスありがとうございます
別にそこまで言語文法と作法がバッティングするわけでもないし、両方やったらいいとしか言いようがない。 何を心配してるんだか。
カネの心配だろ どの本がいいか=どれを買えばいいか だ
だいたいの作法にはそれなりの理由があるけど、 言語を理解せずに作法を学んでもただそうするということだけが頭に残って教条的になりやすい気がするんだよね。 完璧に言語を理解する必要はないけどほどほどには理解してから作法に入った方が良くない?
質問者は江添の示す作法に疑問を持ってんだからその理屈はおかしい
とりあえずこうする!じゃなくて 自分が納得して辿りついた方法はこれ の方がいいよね
禿添を擁護する気は無いが そもそも他の入門書だって #include はおまじないとか言って お茶を濁してるレベルなのを考えれば (見た目のインパクトは知ってる人が見てそう思うだけで) 初心者には大した違いは無い
gotoが悪とか言ってるやつの脳は 武器があるから戦争がおこるんだ! っていうパヨク脳と同じ構造
>>413 スパゲッティは困るのが本人限定でない限りは非でいいだろう。問題はgotoのどんな使い方までがスパゲッティにならないかだけど合意を得られる共通認識はないから、組織のルールに合わせるくらいしかないかも。
深いところからの抜け出しはわかる 飛び込みは……ヤバイ
switchとgoto組み合わせてステートマシン作るのよくやってる。
何重にもネストしたforの真っ只中にぶっこんでくgotoとかじゃない限り そこまで可読性が悪くなるってことはないかな。
gotoネタまだやってんのか 初心者に使い方を教えれば終わりだよ
所詮 goto は関数内でジャンプするだけだから、たいしたスパゲッティにはならないのでは? むしろ setjmp()/longjmp() 大好き人間のほうが怖い…
setjmp/longjmpって具体的に使われてるプロジェクト今ある?
bool readShaderSource(const char *name,std::vector<GLchar> &buffer){ //ファイルなし if(name == NULL) return false; //ソースファイルを開く std::ifstream file(name,std::ios::binary); if(file.fail()){ //開けなかった場合 std::cerr << "Error: Can't open source file: " << name << std::endl; return false; } // 以下読み込み部分の為省略 } Macでこんな感じのコードを書いてるのですが、実行ファイルをターミナルから 相対パスで実行すると成功し、Finderからダブルクリックすると別ウィンドウのターミナルが出て Last login: ~~ $[実行ファイルの絶対パス] ; exit; "Can't open Source File [ファイル名]"と出てしまいます。 絶対パスと相対パスでファイル読み込みの挙動が変わるのでしょうか? 調べてもそれっぽい情報が出てこず……もし思い当たる方がいたらお願いします。 ちなみに読み込みファイルはOpenGLのShaderです。
まず、端末とFinder は、異なる! Windows のExplorer で言えば、拡張子に対して、開くアプリが関連付けられている。 漏れの場合、.txt なら、TeraPad で開く 関連付けられていないと、どのアプリで開きますか? と聞いてくる
>>427 すみません、言われたことをよく考えたら重要な説明抜けてました
mainの中で先ほどの関数が使われるのは、
const GLuint program(loadProgram("point.vert","point.frag"));
という部分であり、ここで読み込まれている
GLuint loadProgram(const char *vert,const char *frag))
の内部に先ほどのコードがあります。
上の"point.vert"と"point.frag"を"./point.vert"、"./point.frag"に変えたりしましたがダメでした。
/User/~~~ による絶対指定なら動いたのですが、それだと別ファイルに移動した時使えなくなるので
ファイルの階層などを変えても動くようにしたいです。
>>428 とりあえずfileコマンドの結果は
Cのソースファイル(main.cpp): c program text, UTF-8 Unicode text
同ファイル内から読み込んでいるヘッダ(Matrix.hなど): C++ source text, UTF-8 Unicode text
読み込んでいるシェーダーファイル(上記の返答レスの二つ): c program text, ASCII text
実行ファイル: Mach-O 64-bit executable x86_64
dSYMファイル(実行と同時に生成された): directory(IOSの情報ファイル)
という感じです。
実行ファイルなので開くアプリはデフォでterminal、他はバイナリエディタで開けます。
>>429 カレントディレクトリの概念は分かったの?
プログラムを何らかの方法で起動したときに、そのプログラムはどこかのディレクトリを「現在位置」として処理を行う。
だからプログラム中でファイルを指定するときに絶対パスではない書き方、つまり相対パス(point.vertや./point.vertという書き方)で指定すると、それは現在位置から見てその名前の場所にあるファイルを指す。
macの環境は詳しくないけど、terminalから実行したならカレントディレクトリはterminal上のカレントディレクトリだろうし、finderから実行したらプログラムの実行ファイルがある場所だろう。
そこと、開きたいファイルの位置関係を確認して、適切な相対パスを指定してみて。
>>429 loadProgram と言う名前から想像すると、
特定のディレクトリだけから、ファイルを探すとか?
カレントディレクトリ内からは、探さないとか?
絶対パスなら読めるのなら、絶対パスへ変換すれば?
例えば、ruby -e 'puts $:'
と、Ruby でライブラリの探索パス・ロードパスを表示すると、
その中に、カレントディレクトリは入っていない
他には、エラーの前後で、カレントディレクトリがどこにあるか、確認すれば?
まず相対パスを絶対パスに変換してどうなるか確認したらいいんでないの
>>430 質問者はC++のifstreamで目的のファイルを開くと言ってるだろ。
的外れなことを言って混乱させるのはやめれ。
iOSのシミュレータで実行するアプリ??(IOSとか書いてるから それだったらfstreamには絶対パスを渡すしかなかったはず あんま自信ないので違ってたらすまん
Ruby なら簡単! これだけでカレントディレクトリが分かるw p Dir.pwd
>>430 カレントディレクトリは多分terminal上での起動でもfinderでも同じです。
426が分かりづらい文章で申し訳ないのですが、なぜかクリックした時
新規にterminalのウィンドウが出て実行ファイルまでの絶対パスまで出てきたので。
terminal上での起動方法はカレントディレクトリに移動してからの"$ ./実行ファイル"です
>>432 一応./とか../とか新規ディレクトリ作ってその中にぶち込むとかはやったんですが、それでも
結果は変わりませんでした。改めて自分で見ても分かりづらいのですが、429の9行目の/User/~~
というのが読み込み部分を絶対パスにしたやつで、その場合はFinderからでも読み込めました。
>>435 OpenGLで簡単な描画をするやつです。
ビルドが
c++ main.cpp -g -Wall -std=c++11 -I/usr/local/include -L/usr/local/lib -lglfw3 \
-lGLEW -framework OpenGL -framework CoreVideo -framework IOKit -framework Cocoa
とかそんな感じでIOKitが入ってるので多分そうかもしれません、入門書
(
http://marina.sys.wakayama-u.ac.jp/~tokoi/GLFWdraft.pdf )のコピペです。
もしかしてMacでOpenGLを動かす場合って全てiOS対応しなきゃいけないんでしょうか…?
後遅いかもしれませんが長文&多レスと先ほどのお礼を言い忘れててすみません。
非常に稚拙な文章ですが、質問に答えてくださってありがとうございます。
すまんそれならiOS関係無いな カレントディレクトリがどうなってるか、MacOSのAPIで取って それを表示してみてターミナルとFinderでどう違うか確認した方がいいかと
MacってBSDらしいじゃん 多分じゃなくて、getcwd()すればいいんじゃ >カレントディレクトリに移動して どこにいても、今いるところがcurrentなのだが
ファイル読み込みをそのまま生成に変更してみ カレントディレクトリちゃんと考慮してないよ相対パスと絶対パスでファイル生成される場所かわるよ
>>438 Finder上でダブルクリックで起動する場合はカレントディレクトリはホームディレクトリだったように思うよ。
ダブルクリックで起動したいなら、
#!/bin/sh
cd "$(dirname "$0")"
./program
と書いたprogram.commandをprogramと同じ場所に作ってchmod +xし、それから起動するとよい。
program.commandのあるディレクトリに移動してからプログラムを移動するシェルスクリプトだから、確実に
カレントディレクトリをprogramのあるディレクトリに変更できる。
Ruby なら、File.expand_path で、相対パスを絶対パスへ変換できる 相対パスでエラーになるなら、それを絶対パスへ変換すれば?
>>439 >>440 とりあえず実行ファイルの入ってるディレクトリ名はsampleで、
カレントディレクトリに移動して~というのはterminalでそこまで移動した
という意味です、念の為付け加えたのですが説明がヘタクソ故分かりづらくてすみません。
そして言われた通り
getcwd(pathname, PATHNAME_SIZE);
fprintf(stdout,"現在のファイルパス:%s\n", pathname);
をmainの最初にぶち込んだところ。
ターミナルでの実行では
現在のファイルパス: /Users/username/program/GLFW_tutorial/sample/sample
finderでの実行では
finderからsample内の実行ファイルをダブルクリックするとterminalのウィンドウが出て
Last login: [前回のログイン情報]
username:~ usename$ /Users/username/中略/実行ファイル ; exit;
現在のファイルパス:/Users/username
Error: Can't open source file: point.vert
Error: Can't open source file: point.frag
とterminal上に表示されました。
finderの最初の方で実行ファイルまでの絶対パスが出てたので、多分同じところ開いてると
思い込んでましたがなぜか /User/username になってたみたいです
素人の先入観で余計な一手間を掛けさせてしまって申し訳ありません orz
Ruby なら、あちこちに、p Dir.pwd って書けば、その時点のカレントディレクトリがどこか、すぐわかる それに、File.expand_path で、相対パスを絶対パスへ変換できるし 何でも、p を付けるだけで、分かるから! エラーを解決する速さが、桁違い! C/C++ とかは、ポインターもあるし、1週間ぐらい解決できないのも、ザラ。 効率が悪い
>>445 finderから起動したときのカレントディレクトリについて誤った情報を書いてすまんかった。正しくは
>>442 が書いた通り(=445で自分で確認した通り)だね。
ついでに、知ってるかもしれないけど補足情報。
「Rubyでは~」といってる奴はこの板の有名な荒しなのでスルー推奨。どこかで聞き齧った上辺だけの知識と構ってちゃん精神によって、的外れな情報や誤った情報を垂れ流す困り者。いくら周りが指摘しても改まる気配がない。
書き方が特徴的だからすぐに分かると思う。
>>438 ,445
解決したみたいだけど一応補足
>>432 > まず相対パスを絶対パスに変換して
これはハードコードで絶対パスを指定するって意味ではなく
指定している相対パスそのものを関数を使って絶対パスに変換してみれば?って意味ね
CどころかOSすらまともに使えないような香具師は まずpythonで練習汁 話はそれからだ
>>442 ,448,449
(安価打ちすぎると書き込めないらしいのでひとまとめになります)
ありがとうございました、書き忘れてましたが無事解決しました!
とりあえず442さんのやり方と449さんのやり方両方で成功しました、
430さんのレスがきっかけでカレントディレクトリについて考えることになったのでありがとうございます!
長文&稚拙な説明で長い間付き合わせてしまいましたが、
懇切丁寧に解説してくださった皆様方にはただただ感謝の極みですm(_ _)m
コンセプト使おうと思ってgccビルドしたけど、ビルド成功に満足して結局何もしてない
> ビルド成功に満足して結局何もしてない あるあるやな
gccは真っ先に規格に対応するけど、 コード品質が糞すぎて結局商用には使えない
ubuntuでapt install clangをさっきインストールしてみた。 gccで正常に動くプログラムが動作しないんで調べてみると #pragma omp parallel で使ってるomp_get_thread_num()がスレッドidを0しか返してない。 スレッドそのものは指定した数だけ、立ち上がってるのにどのスレッドも0しか返してないんだけどなんで?
OpenMP知らないのに関数名だけ見てレスしただろ
#pragma omp parallel num_threads(16) { #pragma omp critical { cerr << "thnum = "<< omp_get_thread_num()<"\n"; } } 単にこれだけ。 gccは問題ないのに clangが 0 しか返さない。 clangのエラーメッセージがよさげなんで乗り換えたいんだけど
スレッド出来てるならコンパイルオプションじゃないよなあ
omp_get_thread_num always returns 0 で調べてみて
Win10上のVS2019でもParallel Studio2020でも、 ubuntuのgccでもコンパイル&実行できる、コンソールプログラムを書きました。 標準で勝手にリンクされるライブラリ以外にライブラリの指定などは一切行っていないのですが、 Parallel Studioでコンパイルしたものだけ、実行直後すぐに終了されてしまうので、 デバッガで実行させると、 序数270がダイナミック ライブラリから見つかりませんでした と表示されます。 どなたかこの件で情報お持ちじゃないですか? ちなみにVSでもネイティブ/WSL ubuntuのgccでは正しく実行できています
>>469 Intellのなんかをインストすればok
>>470 今コンパイルして動かないので、dllのチェックはしてるんだろうと思いましたが、
void
main(){
cout << "Hello World\n";
}
はインテルでも何の問題もなく動いたのでdllが足りないんだと思います
いまさらながら、std::vector::swap がC++14までnoexceptじゃなかったことに気付いた。 今までvectorをメンバに持つクラスのmoveコンストラクタ/代入の中でswapを使って しれっとnoexceptを付けてたけど、C++11では本来どうすべきだったんだろう。
>>474 実際に例外が発生する処理系はまずないんだろうけど、規格の上ではnoexceptがついていない以上
それに備えなければならないわけで。
noexcepつける理由ってほぼ自己満足だよな unwindの最適化気にするぐらいなら例外禁止にするわ
>>476 つまり、
>>473 のようなケースではそのままnoexceptを付けないmoveコンストラクタにするということかな。
例外禁止というのがどこのことを言っているのかよくわからないが。
C++17 からは noexcept 指定は型の一部ってことに変更されてる。 (noexcept から非 noexcept への型変換は有りだが逆は駄目。 まあ無理にキャストすればできなくはないだろうけど……。) 型が合わなきゃコンパイルエラーだ。 各種ライブラリとの組み合わせの関係で否応なく気にしなきゃならんってこともあるんじゃないの?
Intel Compiler 19.1の序数270エラー解決しません Help me
>>479 だから、intelのmathmaticsライブラリをインストしろ
mkl2019というか インテルコンパイラツール 2019なんかをインストールすると Visual Studio16.4環境を破壊するよ 単にコンパイラ環境だけでなくプルダウンメニューの内容とかも破壊してしまう。 VS 16.4以降はParallel Studio 2020以降じゃないと対応しない
>>480 知りもしないでいい加減なレスすんなアホ
>>485 え?私はそれで解決したんだけど
知りもしないで碌ないちゃもんつけんな
>>486 parallel Studio 2020えコンパイルに必要なライブラリ一式がすべてそろってるのに
わざわざ別途mklなんか必要あるかよ。わかってんのか馬鹿たれ。
しかも今,mkl2019しか入手できない中、
最新VSにインストしたら不具合起こすことわかってる2019ツールのインストすすめてどうすんだアホ
死ね情弱ゴミ
夢でも見てんのか?
テンプレートテンプレートパラメタに関する質問です。 こういうのはどう書けばいいのでしょうか? 以下はコンパイラできないんですが、 意図としては テンプレート引数の型を関数引数として使いたい。 そして、テンプレートテンプレート引数の型Xを返したい Xの型としてはデフォルトで'+'が定義されているdouble とか intが入ります template < template<typename X> class L, template<typename X> class R> X & Func(const L<X> & l, const R<X> & r) { return l + r; }
コンパイラできないじゃなく コンパイルできない です L<X>の部分をどう書けばいいのかわからないんです。 ところで、 clangってデフォルトテンプレート引数を正しく処理できないんですね template< typename T = int> class C{ }; ・・・・ C x; がエラーになってしまう。 C<> x; と書けばokです gccは<>がなくてもokです
Xが何者か書いてない Xが型ならtypename Xを<>の中に付け足すべし
template<template<typename X> L> はtemplate<template<typename> L>と同じでXはなんの意味も持たない
>Xが型ならtypename Xを<>の中に付け足すべし Func(const L<teypename X> & l, const R<teypename X> & r) ってこと??? テンプレート引数の X の型を返すのはどうすればいいんですかね?
template<typename X, template<typename> class L, template<typename> class R> X Func(const L<X>& l,const R<X>& r)
>>492 >Xが型ならtypename Xを<>の中に付け足すべし
Func(const L<double> & l, const R<double> & r)
と具体的にXを書く必要があるってことでしょーか?
Funcが2項演算 X operator+ (const L<X> &l, const L<X> &r) だと template < typename X, template<typename> typename L, template<typename> typename R> は,clangで invalid operands to binary expressionになりますね。
https://faithandbrave.hateblo.jp/entry/20081003/1223026720 ここにある
floatを例えばdoubleとかintとか汎用性を持たせたい
Vector<double> x;
Vector<double> y;
Vector<double> z;
Vector<double> t;
で
t= x+y+z;
という計算ができるようにしたい。
このとき
template <typename T>
class Vector{
ここに式テンプレート一切合切をメンバに持たせる
};
と定義して、式テンプレートの一切合切をVectorクラスのメンバとしてしまえば、うまくいくことがわかりましたが、
式テンプレートを独立させると、2項演算の型情報"float" をどう渡せばいいのか困っています。
2項演算の一番最初に呼ばれる
template <class L, class R>
Expression<L, Plus, R> operator+(const L& lhs, const R& rhs)
ここにfloatやdoubleの型情報を埋め込むにはどうすればいいのか?
ってことになると思うんですが。
C++に108ある苦行の一つ、テンプレートの明示的特殊化
Vector内にtype持たせるなりget_type構造体作って特殊化で取るなりして合わないものをenable_ifで弾くなり operator +の特殊化を書くなりいくらでもやり方はある
>>500 そのサイトをちょっと読んでみたんだけど、LとRがすでにfloatやdoubleの型情報を持っているように思うのですが。
>>506 完成形はサイトの一番最後にある
Expression , Plus , operator+
で、operator+ -> Expression -> Plusの順で呼ばれる、
operator+ に演算型(floatやdouble)がないので、ExpressionとPlusのfloatが自動的に選択されてしまう。
一番はじめのoperator+にデータ型を識別する仕組みを入れてそれを引き継いでいくか、
ExpressionとPlus内部でデータ型を認識することが必要だと思うんだけど?
2項演算でなければ3つの型を並べれば済むのにと思ってました。
>>507 using valu_type か
めっちゃ参考になります。
てかこれでほぼ解決です。
聞いて良かった。ありがとうございました
>>510-512 自分もちょっと偉そうだな、と思ったけどな
>>506 に対するレスとかね
答え教えてもらってて経験不足で理解できてないのに言い返してる
読んでてわからんなら同レベルってことだろ
もしかすると文字でのコミュニケーションが下手なだけかも。直接対話しているならイントネーションやニュアンスで伝わるものが文字では伝わらない、誤解され得る、ということが分かってないとか。 「~思うのですが。」ではなく「~思うのですが、どうでしょうか?」と書けば言い返しているのではなく疑問点を質問していると明確になるのにね。
int main() { while(1) { if (kbhit()) return -1; } }
環境はMac Mojave10.14.6、VScodeは1.14.1 clang,gccはApple LLVM version 10.0.1 (clang-1001.0.46.4)です。 他VScodeの設定で"clang.cxxflags": [ "-std=c++17" ] としています。 VScodeを使っていて、/Users/[USERNAME]/PATH/にある c.cppというファイルを右上の矢印でコンパイルしてたら急に cd "/Users/[USERNAME]/[PATH]/" && runFiles=`ls *.cpp` && g++ -std=c++17 `echo ${runFiles}` -o c && "/Users/[USERNAME]/[PATH]/"c duplicate symbol _main in: /var/folders/fy/0rw1xdjd3csf2v8nzp2wb4vc0000gn/T/c-216688.o /var/folders/fy/0rw1xdjd3csf2v8nzp2wb4vc0000gn/T/d-c0a03b.o ld: 1 duplicate symbol for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation) というエラーが出てきました。 対応するにもこの/var/folders/fy/以下にあるファイル群がなんなのか分かりません、 どうすれば良いのでしょうか。
>>517 シンボルが重複している。
たぶんinline指定を忘れてるか、変数の定義が重複している。
>>513 オマエ何様のつもりだ。
匿名掲示板でいったいどんな言葉使いを期待してるんだアホww
だいたい
>>507 のレスにしても大概だろ
using valu_type= T
とかww
こんな回答もらってよろこんでるほうもアレだが、
auto
operator[](std::size_t i) const{
return Op::Apply(l_[i], r_[i]);
}
ですむ話
レベルの低い奴に相応の応対したんだろww
>>513 >答え教えてもらってて経験不足で理解できてないのに言い返してる
その答えのレベルのわからんおまえも同レベルって乞田ww
>>519 質問者が聞いてるのは内部で使ってる型に応じて実装を変えたいって話なんだが
お前何もわかってないアホだろ、autoにしても何も変わらねーんだよ
あと
>>517-518 _mainてあるから多分エントリポイントが重複してるのでは?
>>522 やっぱりな
auto一発ですむ話に
>>503 >Vector内にtype持たせるなりget_type構造体作って特殊化で取るなりして合わないものをenable_ifで弾くなり
>operator +の特殊化を書くなりいくらでもやり方はある
こういう寝言ほざいてたんだな。
質問者は
>>500 >Vector<double> x;
>Vector<double> y;
>Vector<double> z;
>Vector<double> t;
>t= x+y+z;
>という計算ができるようにしたい。
>式テンプレートの一切合切をVectorクラスのメンバとしてしまえば、うまくいくことがわかりましたが、
>式テンプレートを独立させると、2項演算の型情報"float" をどう渡せばいいのか困っています。
>>522 つづき
内部に
type持たせるも何も
auto
operator[](std::size_t i) const{
return Op::Apply(l_[i], r_[i]);
}
として、
struct Plus{
struct Plus
{
template <typename T>
とするだけで、
>>522 お前は
Op::Apply(l_[i], r_[i]); の型がvalu_typeの型そのものってことがわかってない
アホは死にな。
質問者は型情報を渡したいと言ってるだろうが お前のやり方だと要素ごとのbitwise orとか実装するときに困るんだよアホ(多分他にも困る場面あるはず 整数だろうが浮動少数点数だろうが表記が同じ演算ならお前の言うそれでいいけどな
あと >オマエ何様のつもりだ。 >匿名掲示板でいったいどんな言葉使いを期待してるんだアホww そっくりそのまま返すわキチガイが
>>522 言ってることがわからなければ
>>507 のコードで
typename L::value_type →auto に置換
using value_type = T; → 削除
Vector<int> →Vector<double>に置換
とでもして実行してみろ低脳
>Op::Apply(l_[i], r_[i]); の型がvalu_typeの型そのものってことがわかってない
お前の言ってるそれは
>>506 そのもの
そういや俺operator +の特殊化とか書いてたけど
Applyの方だな
あとオーバーロードが抜けてた
>>527 はぁ?文盲か低脳
>>500 ex template をVector内部に持たせるんじゃなく、独立させて、
t= x+y+z;
演算型をfloat double int に汎用性を持たせたいといってるんだろうが。
だれが"要素ごとのbitwise orの実装"の話なんかしてるんだ。お前の勝手な妄想だろが馬鹿たれ
>多分他にも困る場面あるはず
を、妄想の自己弁護か?www
夢でも見て寝ぼけてんのかアホ
テメエみたいな低脳ごときが俺様に対して言葉の使い方気をつけろ
>>530 はぁ?
Op::Apply(l_[i], r_[i]); が型情報もってるのにわざわざクラス内部に不要なtype実装させてどーするつもりだと言ってるんだよ低脳
日本語わからんのかアホ
お前は日本語の勉強からやり直せ
アホさらしあげ
>>522 >autoにしても何も変わらねーんだよ
>autoにしても何も変わらねーんだよ
>autoにしても何も変わらねーんだよ
>autoにしても何も変わらねーんだよ
>autoにしても何も変わらねーんだよ
>autoにしても何も変わらねーんだよ
>autoにしても何も変わらねーんだよ
変わるんだようすらバカ
autoにするだけで質問者の解決だ。ばかたれ
まじめんどくせぇこいつ
俺はtypeだのvalue_typeだの余計な要件増やすことを良い実装だとは思ってないぞ
>>506 を挙げてそれに言い返してるのを批判的に言ったのはそれが理由
お前がドヤ顔でautoとか言い出す前からな
>>525 >template <typename T>
>とするだけで、
それ
>>507 の時点ですでにそうなってるんだが
で、ID:vo+Ub67N は逃げたの? いつものイチャモンつけるしか能が無いクズだろうけど そんな暇があったら最初からちゃんと答えてやれよゴミが
>>518 ご返信ありがとうございます、とりあえず言われたことに関係ありそうなことを
調べたのですが、自分のファイルにそういった感じの文法ミスがあるのかは
分かりませんでした。一応短いのでエラー吐いたソースコード貼っておきます。
#include <algorithm>
#include <iostream>
using namespace std;
int main() {
int N;
cin >> N;
int a[N];
for (int i = 0; i < N; i++) cin >> a[i];
long long ans = 0;
for (int i = 1; i <= 3000; i++) {
long long sum = 0;
for (int j = 0; j < N; j++) sum += a[j] % i;
ans = max(ans, sum);
}
cout << ans << endl;
return 0;
}
後、以前コンパイルできていたプログラムで同様の手順を試しにやってみたら、
同様の症状が起こって実行ファイルが消えました。
>>523 申し訳ありません、無知だったので色々調べたのですがエントリポイントという物が
よく分かりませんでした。気がつかないうちに何かまずいところ弄って他のプログラムと
開始アドレスが被ったとかそんな感じでしょうか?
*.cppにより、エントリポイントのmain関数を2つコンパイルしたんではないか?
1つのフォルダには1つのプロジェクトにした方がいいのかも。
>>538 エントリポイントっていうのはそこでいうmain関数のことね
それが複数作られてるとエラーになる
そのソースコードをヘッダファイルに書いててそれを複数のファイルでインクルードしてるとか
あるいは他にもmain関数を定義してる余計なソースコードがあるとかそういうのが原因だとおも
>>539 、
>>541 とりあえずファイル内にmain関数を持つc.cppとd.cppがある状態だったので、
試しに適当なディレクトリを作ってそこにc.cppを移してみたらコンパイル成功しました!
ずっと詰まっていたので感謝します、お二方とも本当にありがとうございます!!
恐らく原因である runFiles=`ls *.cpp` の部分が以前どうなっていたか
覚えていないのですが、前は同ディレクトリにmain文複数あっても成功しているんですよね…
VScodeの自動更新等でビルドの設定が変わったとかでしょうか…?
申し訳ありません、今VScodeのsetting.jsonを確認したらいつの間にか "code-runner.executorMap": { "cpp": "cd $dir && runFiles=`ls *.cpp` && g++ -std=c++17 `echo ${runFiles}` -o $fileNameWithoutExt && $dir$fileNameWithoutExt", }, が書かれてました。恐らくですが、最近別の機会でc++17のオプションを使う時にそのまま他の方の 設定を写していたのと最近一つのファイル内に複数のフォルダ作ることが無かったからだと思います。 昼から何度も長文でお騒がせして申し訳ありませんでしたorz エントリポイントに関しては大変参考になりました。
>>522 戻り値の型をテンプレートにするのってどうするの
Tかautoでいんじゃね あるいはdecltype
あ、戻り値だけ指定させる関数テンプレートならオーバーロードしなくても その関数テンプレート一つでいける ただし推論できないので呼び出すときにテンプレート引数の指定は必須
autoと型指定で同じコードに落ちるとは限らないというか、おそらく同じコードにならないので、よく考える必要があると思います。
decltype(auto) とも使い分けが必要なの本当にアレだよな……
ずっと脳内でピトラって読んでたがポインタか ありがとう
int_ptr INT_PTR *int 全部違う型?
>>557 INT_PTR は Windows SDK で定義されてるやつのことだと思うけど、
標準で言うところの intptr_t に相当するやつ。
int のポインタじゃなくて、ポインタを格納できる (のに充分な幅がある) int っていう意味。
>>507 これって2項間はいけるけど
v=l+z+w;
とか3項間以上の場合
typename L::value_type
operator[](std::size_t i) const{
・・・
}
ここで、コンパイル通らないんじゃないの?
+wの部分で(l+z)::valu_typeを参照し、
class Expressionで宣言されてないvalu_typeを参照することになってエラーになるはず。
auto
operator[](std::size_t i) const{
・・・
}
では何の問題もない。
>>507 のコードはおよそ使えない間違いコードといいっていい。
一応
gcc 9.1で確認してみた
error: no type named ‘value_type’ in ‘class Expression<Vector<int>, Plus, Vector<int>
>’
11 | typename L::value_type operator[](std::size_t i) const
だな。
>>507 のコードはコンパイルすら通らない間違いコードだ。
コンパイル通らないってのは
以下を追加したときの話ね
Vector<int> w{ 5, 4, 3 };
v = l + r +w;
2項間では通るが3項間以上の式では通らない。
ex-templateを使うメリットが全くないコードが
>>507 auto operator[](std::size_t i) const{ とせず、value_type直接指定でいくためには class expressionの中で もう一度 using value_type = typename L:value_type; を宣言して、 value_type operator[](size_t i) const{ ・・・ } で多項間でも問題なくいけるはず。
>>563 3項以上でなければメリット無くなるわけではないぞ
というかまぁ今どきはETより先にSIMD使えって話だけど
>>565 2項迄の演算では式テンプレートに何のメリットもない。
デバッグを困難にするだけの糞コーディングだ
バグに気づくことも出来なかった一知半解の口だけウスノロはすっこんでな
そもそも、質問者は
>>500 >t= x+y+z;
>という計算ができるようにしたい。
と希望を述べているのに
>>507 のコードは要求仕様を満足できてないゴミコードということだ。
>>565 >というかまぁ今どきはETより先にSIMD使えって話だけど
能力不足をHWに補ってもらわないとなww
その分電力無駄に食ってることは覚えとけ
え? SIMDで並列化できたら電力あたりのパフォーマンスはあがるぞ ETと比べるものとは思わないが
>>566 お前大して攻撃的でもない書き込みにすぐ喧嘩売ってイキるの辞めたほうがいいよ
俺はETとSIMD両方使って自作の線形代数ライブラリ(4行4列まで限定だが)作った上で言ってる
恥書く前に謝っとけよ
>能力不足をHWに補ってもらわないとな
アホだろお前、ETがSIMD以上に速度上がると思ってんの?
>ETと比べるものとは思わないが
確かに速度が目当てと勝手に限定してたね
最近のコンパイラならETできれいに展開しておけば 勝手にはSIMD化してくれんじゃない?
Intelのは使ったことないんで知らんけど、VCだと基本そういうのは期待できないよ (最適化かけたEigenのコードの逆アセでも見てみればわかる) 単一の要素の計算にxmmレジスタ使ってはくれるけど並列にやってくれることは無い SIMDに収まる範囲のベクトルなら、手動できっちりSIMD使いつつ インターフェースを使いやすくするのは普通に出来るから先にそうした方がいい
>>569 言うだけ無駄
意図的に絡んでるのが大半だから
自然体だったら残念な性格としか
ソースは無い
g++やclangで-std=c++17オプションをterminal、VScode共に一括で デフォルトにしたいのですが何か良い方法ってありませんか? 環境はMac OS Mojaveです
>>569 それがどうした?
4x4?それが自慢か雑魚野郎
こっちは自由にサイズ変更可能な行列演算ライブラリを20年以上前から仕事で使ってる。
そして一定サイズ以上の行列乗算では式テンプレートではまったくパフォーマンス向上できないこともわかってる。
土下座すんのはテメエなんだよ一知半解の低脳野郎
ちなみに
>>500 のサイトにあるBlitzの有名なコードだが、operator=内部で =r(i.j)などとして、行列乗算(each productではなく)に拡張した場合、
式テンプレートを使用しない方式と比べて100x100行列なら1000倍以上の速度低下を引き起こす
>アホだろお前、ETがSIMD以上に速度上がると思ってんの?
はぁ? 異なるHW条件持ち出してきて速度向上ほざいてアホの極みか低脳
>>569 あぁ
言い忘れてたわ式テンプレートは一時領域コピー時間の削減と言う意味で3項以上と書いてるわけだが、
一時領域の必要ない2項でメリットがあるというなら挙げてミロよ低脳www
寝ぼけんな雑魚野郎
>>479 #pragma omp critical
使ってるコードで同じエラー出たわ
criticalセクションが無ければこのエラーは出ない
無くしたら動かんけどww
19.1のバグやね
まだ、気づいてない人多いんだろな検索してもヒットしない
>>581 ずいぶん反論に時間がかかったなw
>20年以上前から仕事で”使ってる”
作った側ではないなら実装時の問題とかには疎いんじゃねーの?
>Blitzの有名なコード
Blitzのコードとかどっかに書いてたか?
Blitzのソース読んだことないんで具体的にどのヘッダか示してくれるか
というかあんなクソ単純な説明のためのサンプルと同等のコードとは考えにくいが
>100x100行列なら1000倍以上の速度低下を引き起こす
へー。で??
俺別にETを絶賛などしてないんだが
質問者の話もそういう可変要素のやつじゃなかったよね
>異なるHW条件持ち出してきて
お前が
>能力不足をHWに補ってもらわないとなww
とかアホなこと抜かしたからだろ
>>582 >一時領域の必要ない2項でメリットがあるというなら挙げてミロよ低脳www
2項で一時領域が必要ないのはRVO前提にしてんだろうけど
お前コンストラクタしか頭に無いだろ
あと、よっぽど自信がおありのようだから質問してやるが
上に挙がってたコード例のようなやり方でバカ正直に行列の乗算のような計算を
仮に3項以上でやると重大な問題が起きるわけだが、それが何か即答できるよな?
最適化、高速化は具体的な用途とセットじゃないと語っても意味がない 要素ごとに演算すれば良い巨大ベクタと 1個の結果を得るのに広範囲にアクセスしなきゃならない巨大行列の乗算 全然違う話
大きな行列の場合、高速化手法なんて他にいくつもあるからね(詳しくはないが それ以前になぜ遅くなるのかも分かってない&ET以前にSIMDと言われて 「能力不足をHWに補ってもらわないとなww」とか(ライブラリ実装したことある立場ではないにもかかわらず) 平気で言える時点で、20年仕事でってのは嘘だろう C++かじっただけのどこかの暇な学生だろ
HWを使わない最適化(高速化)なんてあり得ないからね SIMD、スレッド、キャッシュ、(GPU、FPGA、...) これらを有効に使うのが最適化
高速化はどうでも良くて単に楽に書きたいだけならC/C++は向いてない
>>589 アルゴリズムはハード非依存と言っていいでしょ
「ソフトウェアに対して本当に真剣な人は、独自のハードウェアを作るべきだ。」 アラン・ケイ
>>593 具体的にどの段階?
ハードウェアに依存したアルゴリズムの最適化って何?
例えばロックフリーでCASが前提とかはあるけどあれも具体的なハードではないだろ
除算回数を減らすチューニングなんかはHW依存と言えるんじゃない?
極端なこというと、量子コンピュータ向けアルゴリズムはHWが量子コンピュータであることが前提 HWとSW合わせて1つの装置だから
>>595 それはアルゴリズムとは言わないでしよ
計算のオーダー変わるわけじゃないし
>>598 いや、計算量も変わるしアルゴリズムでもあるけど?
>>599 計算量でなく計算オーダー
知らずにしゃしゃり出てくるとか
ビッグオーが変わるようなのはアルゴリズムの違いだろうけど ビッグオーがそのままで計算量だけが変わるのはどっちとも言いがたい
>>600 より除算回数の少ないアルゴリズムを選択することは現状のCPUは除算が遅いことに対応するわけだからHW依存と言えなくもない
この主張に対してそういった選択はアルゴリズムでもなければオーダーもかわらないと反論しているのですか?
計算量のオーダーが変わらないアルゴリズム的最適化なんていくらでもあるよ
有限の並列度の並列化ってオーダー変わらないけどワザワザ並列化可能なアルゴリズム使うよね
どうせO(n)だから配列丸コピしても問題なしっていう馬鹿を思い出したわ。
と言うか最適なオーダーのアルゴリズムなんて殆んど既知だから、オーダー変わるような最適化ってあんまりないよね
車輪の再発明は良く批判されるけど 素数を列挙するプログラムなんて 既に判ってる素数はテーブル参照するのが最適なのに なんで毎回計算して地球環境破壊に貢献してる訳?
「ROM容量にはテーブル化は最適ではない」 典型的な論点ずらし
>>608 素数の話はどっから出てきた?
アルゴリズムの例として挙げたのかも知れんが、
別のスレッドで最近見た気のする話題なので投稿する場を間違えたのかと。
実用プログラムでは「車輪の再発明」は上手いやり方じゃないけど、
低レベルの部分から組み上げたほうが理解が深まるって面はあるでしょ。
>>611 >>608 が最適と豪語したから反例挙げてるだけだろ
お前のほうが論点ずらしだよw
バイナリデータを、文字列に変換して保持しようとした場合、素直に16進数表記にするのがよい? データ量倍になるけど
>>620 あーそんなのありましたな
ちょっとググったらライブラリも出てきたしよさそう
ありがとうございます
それでいいなら%Xで出力するのでも良い気がするね base64にすると単純な16進表記よりデータ量増えるし、%Xなら余分なライブラリもいらないし まぁどっちでもいいんだろうけど
嘘言ったわ、base64は6ビットごとに1文字だからデータはこっちのほうが小さいか
8bit→HEX2桁→2倍 8bit→Base64→4/3倍 やろ 一定数以上桁が必要なのでpaddingとかあるし100%ではないが
base64なんかビットシフトとテーブルだけで簡単に実装できるし依存ライブラリ増やす必要もないのでは
データ量にもよるけど "\x00\x00\x00\x00..." が一番楽じゃね
何のためにテキストに変換したいのかがわからんとなんとも言えんな 目的によって使える文字種も違うからな
Base64 は、HTML でもよく使う Base64の文字列で、PNG/JPEG画像を、HTMLファイルに直接埋め込める <img src="data:image/png;base64,xxxxx..." />
base64って7bit通信路通すためのもんでしょ? textにするならヒューマンリーダブルにするのが無難だと思うけど そうじゃなけりゃバイナリでいいじゃん と思った まぁ好きにしなよ
ish みたいなやつで UTF-8 を利用したのをどっかで見たことある
>>634 ishなつい
パソコン通信の時代に使ってたけどもう30年近く前なんだな
テキストファイルを結合してishでデコードしてえっちなMAGファイルを見てた人は手をあげなさい
boost::serializationがお手軽にシリアライズできて便利だなと使いまくってたら、 map系コンテナがあると一気に性能落ちるっぽいんですが、これって当たり前ですかね? protocol buffersなどの他のシリアライザに替えて解決するものでもなさそうだし、どうしたもんかな…
圧縮してからBase64すればbitチェックも出来てサイズも減って一石二鳥
>>642 やればいいんじゃね?
やれない理由があるならそれ書かないとわからんし
今の組み込みは環境整いすぎてハード触ってる感ないよね
制御的な知識は多少あるから今更Lチカやってもなぁって感じだ
>>642 SPRESENSE、Arduinoよりスペックが高いからあまり制約を考えずに触れるからいいよ
組み込みって難しそうなのに年収は総じて低めだよね オラオラ系Webプログラマとかのほうがマシだったりするし なんか世知辛い
組み込みで出来る人は多分大企業メーカーのR&Dに転職してっちゃうんじゃないかな。 なんとなくのイメージだけど、組み込みプログラミングが必要な製品の品質管理を考えると、 請負組み込みの会社に開発を頼める範囲ってごく簡単な部分に限られそうだから、 単価が低い仕事が多くなっちゃうのかも。
まあコスト削減のために低スペックハード使うわけだしな。
オラオラ系というよりウェーイ系というほうが表現が適切だろう ホームページ見ただけでウェーイって叫びながら意識高い開発してる姿が容易に想像できる
そもそもここで質問するのが適切か分からないのですが とりあえずC++っぽいので分かる方がいたら教えてください。 とあるライブラリのビルドスクリプトを叩いたところ以下のようなエラーが出ました。 ``` 略/filesystem.hpp:784:13: error: no member named 'make_absolute' in 'std::__1::__fs::filesystem::path' 略 ``` ファイル名からC++のコンパイルに失敗しているようなのでした。 普段は別の言語を触っておりC++は触ったことがありません。 調べた限り、ヘッダの二重読み込みでエラーになっているとのことでしたが 該当の `filesystem.hpp` には #pragma once が宣言されています。 環境はMacOS 10.15.3で、とりあえず途中でgccを入れ直したりしましたがやはり同じところでコケます。 Mac上で #pragma once が機能するように環境を設定するにはどうしたら良いでしょうか。 よろしくお願い致します。
貼り付けるエラー文言間違い得ました。 ``` 略/filesystem.hpp:52:9: error: redefinition of 'path' 略 ``` です。
>>661-662 とあるライブラリとか言わずにそのライブラリを示して。
初心者はどんな情報が必要か判断する能力がないので、情報を選別してはいかん。
情報を小出しにされるとイライラゲージが上昇しやすいから、
状況を再現可能な情報を提示することを心掛けて。
>> 663 すみません、おっしゃる通りですね。 このライブラリのインストールになります。 github.com/WonderMediaProductions/Maya2glTF
見ないで答えるけど include path の順番がまずいんじゃね
-----sample.h (classAは変更不可) class A { private: virtual void funcX(void) = 0; public: void funcY(void); public: void funcZ(void); }; class B : private A {・・・}; ----- このような関係性で classBでfuncXとfuncY(内部でfuncXを使用)が不要、funcZが必要な場合 funcXをclassBに追加せずに済む方法があればいいのですが funcXもclassBに追加するしかないですか?
>>668 ありがとうございます
>>669 純粋仮想関数が含まれているので継承しないと使用できません
Icon とか継承したクラス造ろうとしたら protected 観たいなエラー出るのですが 無理やり継承する方法はありますか?
Ruby では、Forwardable モジュールで、 継承ではなく、包含を使って、インスタンス変数に委譲できる 使えるメソッドも、限定できる。 配列のメソッド中、指定した2つのメソッドだけが使える @ary = [ ] def_delegators( :@ary, :push, :pop )
組み込みプログラマになりたいんだけどオススメの本とかあったら教えてください
組み込みって言っちゃうと範囲が相当広いと思うんだけど具体的に何か目指してるのとかあるの?
機械メーカーで製造やってるんどけどいつか組み込みシステムの部署に行きたいのです
C言語は学生の頃少しやった程度ですが、苦Cや新明解C言語などの本で勉強し直しているところ
組み込みは、C 情報処理資格・エンベデッドの教科書を読めば?
>>675 先に異動してしまってそこで学ぶ方がいいのでは?
若いなら可能だよ
おっさんならそもそも実務経験なしのスキルは評価されないと思う
>>680 転職で考えればまだポテンシャルで採ってもらえる年齢
まぁ30前半までだと思うけど
企業文化にもよるけど可能性はあるんじゃない?
だめもとでいってみて、ダメでもそれが将来のコネになるかもしれないのだから
情熱あるなら動いてみるのが正解だと思うよ
>>681 ありがとう。
上司にはいつかは異動したいとは言ってる。後は組み込みやってるところにアピールする必要もあると思うんだ。
だから基礎でもいいから勉強しときたい。
異動先の想定があるなら異動先の人間に聞くのが一番良いんじゃないかな? 話できる機会を作ってもらえるならポテンシャルやモチベーションを見せるチャンスにもなるし 組み込みって業種や企業で文化がだいぶ違うイメージだから自社内異動想定なら自社に目標合わせるのが一番だと思う
>>683 聞いたことあるんだけど、プログラミングできなくても設計書読めたらなんとかなりますよーって言われたなぁ。
>>680 29ならもうおっさん
その歳で経験無いなら組み込み系は絶望的
>>684 個人的にはプログラミング的なことなんざ実務やってりゃ嫌でも身につくんでそんな気にしない
素養とか基礎知識はあったほうがそりゃいいけどね
どれくらい部署間の関係性が強いかわからんが他部署出身者はその部門のことをケアした提案とかができるからむしろ重宝するくらい
やる気ある人間にやらせたほうが結果的に効率上がるからそういうのは積極的に対応する
まぁとは言っても企業文化次第ではあるけどねー
>>682 勉強するのはもちろん構わない
でもしっかり勉強してから異動とか思ってたら機を逃すから注意ね
上でも言ってるとおり組み込みといっても千差万別で幅広い
組み込みlinuxかRTOSかぐらいは絞らないと
float型からdouble型にキャストした際に値が変わってしまうのですが、一般にどうやって対処するのでしょうか。 float f4_sample_t =0.0002; double f8_sample_t = (double)f4_sample_t; とすると、0.0002を期待するのですが0.000199****となります。 ↓のように、してみましたが0.00199**となってしまいました。 f8_sample_t=(double)((uint)(f4_sample_t*10000))/10000;
>>689 簡単に言うと浮動小数の中身は2進数の小数
なのでもともと0.0002を正確に表せない
表示する際に人にわかりやすくするために10進数の小数に変換するが
そのとき何桁まで計算するかで変わってるように見える
0.0002 は循環小数だなぁ。
十進数ではキリのよい小数でも二進数では正確に表せないのはよくあること。
誤差はあるものだという考えで扱わないといけない。
一般には double の仮数部は 52bit の精度だから、この精度の範囲を超えるような (浮動小数点の) 計算は諦めるしかない。
https://ja.wikipedia.org/wiki/%E5%80%8D%E7%B2%BE%E5%BA%A6%E6%B5%AE%E5%8B%95%E5%B0%8F%E6%95%B0%E7%82%B9%E6%95%B0 そんでもって計算の内容次第では精度が失われることがあるから、そこらへんも注意が必要。
https://ja.wikipedia.org/wiki/%E8%AA%A4%E5%B7%AE#%E8%A8%88%E7%AE%97%E8%AA%A4%E5%B7%AE%E3%81%AE%E7%A8%AE%E9%A1%9E どうやれば出来るという簡単なものではないのでちゃんとした専門書で学ばないといけないと思う。
浮動小数点で計算するのは諦めて速度も諦めるなら
十進小数ライブラリを作るか導入してもいいだろうし、
計算の内容によっては有理数型を導入するとか
まあ出来ることは色々とあるよ。
floatからdoubleへの変換では値は変わらない
>>690-693 ありがとうございます。
現時点では理解できてないのですが、厳密に表現出来ない値があるという認識で良いでしょうか。
宣言時にdoubleで0.0002とする場合はその後の積和演算の誤差が問題にならないのですが、こちらの制約上でfloat入力しかできないのでキャストしています。
厳密に表現出来ない値があるのは当たり前 floatやdoubleで表現出来る値は有限通りなんだから
floatの中身が元々10進数で簡単に表せる数という事がわかってるなら doubleにするときに単純なキャストではなく そういう補正を加えれば良い 10進7桁までならdouble精度に復元出来る
>>693 >>689 のは既にfloatの時点で0.0002じゃないんだよなω
>>694 許容できる誤差の閾値がどうやって決まってんのか謎だけど
0.0002を救いたいなら例えば入力は10000倍しておくという運用にして
doubleにするときに10000で割るとかね
浮動小数点は、非連続・飛び飛び。 数値の間が、ものすごく小さいこともあるし、大きい事もある よく起こるバグは、ソフト・サーバーなどは、連続して3日しか動かないというもの float に、1ずつ足していくと、3日後には数値間が、1以上になって足せなくなる。 組み込みプログラマーは、こういう基礎的なことを、知らない香具師が多いw しかも発見するのに、3日も掛かるから、テストで発見できないので、こういう製品が多いw
>>699 えーと、組み込みの人なら、そもそも float/double は昔は劇的に遅かったという名残があって最初から float/double を使わないんじゃないかな?
最近はそうじゃないのですか?
>>701 ジジイ、ジジイか…
それじゃお前はなんだ、この餓鬼が
おれはお前さんがこの世に落っこって来る前からバグつくってんだ
1ずつ足していく単純なカウンターにfloatを選ぶヤツがいるとも思えんが 組み込みだと特に
>>704 >>699 は例のRubyバカだろうから、まともに考えるだけ無駄だと思うよ。
初心者スレで嘘や意味不明なことを垂れ流して周りに迷惑かけるのやめて欲しい。
>>705 決心しました
私も ruby で逆襲粉砕してやろうじゃありませんか
ruby のいい教科書を教えてください…
706
https://www. 尼損.co.jp/dp/B00QR4JST2
たのしいRuby 第6版 Ruby 2.6 対応で、ベストセラー本
マスゴミもトイペ買えずに困ってる一般庶民(それもあやしいが)の家訪問して もうこの一本しかないの?今日一日持たない!とか取材してる暇あったら 本社ビルの在庫数本でも持って行って渡してやればいいんだよ 災害報道のときもいつも思うわ マスゴミが本気で心配するなら新聞紙で尻ふけばいいとか本当の事言えば良いのにな
こんだけ災害の多い日本で備蓄なしのやつって頭悪すぎでしょ
自作クラスのインスタンスを大量に作成したのち破棄したのですが、Linuxのtopコマンドで見ると メモリを掴んだままでどれだけ待っても解放してくれません。これはいわゆるメモリリークでしょうか? 作成したインスタンスのデストラクタが全て走っていることはプリント文をかまして確認してますが、 「デストラクタが走ったからそのインスタンスのメモリは解放される」と思うのは間違いでしょうか?
>>713 そのプログラムは動きつづけてるのかな。
プロセスが生きてるなら、そのプロセス自身で再利用できるように
OSに返さないで、と言うかOSが取り戻さないで残してることはあるでしょ。
いよいよ他のプロセスで使うメモリが減ってきたところで
「あのプロセスから返却されたメモリがあったはず」と
OSが本当に取り立てる、と。
変な擬人化をした、厳密とは言い難い説明だけど。
>>714 プログラムは全インスタンス解放後にstd::chrono::secondsでスリープかけていて
2GBほど掴んだメモリが半日経ってもそのままでした
こういうのもシステム起因の挙動なのでしょうか?
>>716 心配なら Valgrind とかで調べてみれば?
Linux はなるべくメモリを使い切る方針だったはず (※) なので、
>>714 のようなことは普通にあると思う。
※ 空いているメモリがある状態というのは要するにメモリを無駄にしている状態ってこと
>>716 まず質問者の心がけとして
言葉だけでなく実際のコードと計測結果をそのまま書け
713=716ですが、malloc_trim関数を呼んだらメモリが空きました
>>714 さんの仰るようにOSに返していないのが原因のようです
>>719 すみません、自社内のかなり複雑で汚いコードなので晒せませんでした
厄介なことにスクラッチから同じ程度のメモリを使うテストコードを書いたら現象は再現しませんでした
OSからのリクエストと返却はコスト高だから ランタイムのアロケーターが握ったままでOSには返さない OSへ返すタイミングはプロセスが終わるとき、という実装は割りとありえそう
お礼を言うのを忘れてました 回答くれた方ありがとうございました
>>722 malloc_trim使えるなら
malloc_statsも見てみたらいい
たぶんmmapで確保した分は返却されない
CとC++ってなんで一緒にされていることが多いの?
他の言語同士に比べて類似してる部分が多いだけに、 Cでの動作はこう、しかしC++では違う、みたいな情報の有用性が高いから、かも。 少なくとも、こういう質問と回答のようなスレッドでは。
c++の方ではcとの互換性を大きな要素として挙げてるからな。 元々cの前処理での言語拡張が始まりだし。 cの方はもう切り離して一緒にされたくないだろうが。
C が C++ との非互換を最小限にするってのは大きな方針になってるよ。
少なくとも C99 の時点では。
http://www.open-std.org/jtc1/sc22/wg14/www/C99RationaleV5.10.pdf#page=11 ただし「C を C++ にしたいわけではない」みたいな文言もある。
C2X のドラフトを見る限りでも C++ に追従すると取れる変更は結構ある。
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n2478.pdf C++ を使う上で改めて C を学ぶ必要はないが、
仕様としてはつかず離れずを維持し続けるのは C の側も是としている。
いや、コンストラクタやデストラクタが暗黙で動く時点で全然違う言語でしょ。。 解釈を 2、3層入れてやっと表面上は同じように動くみたいな状況なわけでさ。 その辺誤魔化すからロクでもないことが起きるんだよ。
>>731 いや、もちろん違う言語だよ。
>>729 の
> cの方はもう切り離して一緒にされたくないだろうが。
に対して、仕様の策定では連携していく方針があるってことを言ってるだけ。
>>728 Cを使える人は(C++知らない状態からでも)C++もそこそこすぐ馴染む
C++を使ってる人(C知らない人)はCだと使えないことが多いと思う
C++2017の電子本が無料らしい Embarcaderoからメール来た
Cから始めてC++に移行した時は クラス・継承(仮想関数)・例外・new,deleteをもっと早く知りたかったわ
組み込みシステム部に転属したくてC言語の勉強してたんだけど、使ってる言語はC++とJAVAって聞いて萎えてる。
C言語が出来るってのが最低条件なんだろう ついでにその部署には「この門をくぐる者は一切の希望を捨てよ」とか書いてないか?
>>738 無駄ではないが遠回りしたような…
>>739 その部署の新人教育見てたらJAVAとC++しかやってなかった。
まあ確かに、例えば変数の宣言がいちいちスコープの最初とか今更考えられんな
JAVAとC++ならどっちからやるべきなのだろうか
一か月でJavaをやりその次の一か月はC++をやる さらに5月からはもう一度Javaをやって六月からはC++をやる そして7月にはC言語をやる
>>742 どういう組み込み機器なんだ?
javaならjavaでsmartcard制御するのか、gui作るのかでかなり違う
>>742 両方書いている者としては、java は virtual 付きで、C++ なら p = new XXX, p->property, p->method() と書く気持ちと思想で p.property, p.method() と書いておれば間違いないです
それと、コンストラクタの書き方、基底クラスの呼びかたは毎回お手本をみています
両方同時にやって混乱するようではセンスを疑います
C++対応してるプロゲートみたいなサイトってないの?
俺、変数宣言は関数の頭じゃないとコンパイル通らない環境なんだがw GUIつうかOSからして無いんだがw 組み込みってひとまとめに言っても範囲広すぎるからもう少し具体的な情報無いとアドバイスしづらいよね
>>747 C99 に対応してないコンパイラってことか。
理屈の上では実際のメモリの確保は関数の頭にまとめてしまえばいいから
実行時のリソースが限られていても関係なく出来るはずなんだが、
マイナーな環境だとコンパイラもまともなものがなかったりするんだよな……。
>>743 おれとしてはc++から始めることをおすすめするな
javaから入るとc++でもjavaの作り方をずっと引きずる
そういう人数多く見てる
それだと組み込みでつらい場合が考えられる
ただしc++極めるのはまず無理なので
適当なところで打ち切る必要はある
>>751 かつては、旧版独習C++ でstd::string を再実装する練習問題に出会うまで黙々と読んでいくことを薦めていましたが、確かに今となっては旧版独習はC++が古過ぎるでしょうね
江添さんは、私も今読んでいる最中です、もう少ししたらお勧めできるかどうかわかるかと思います
>>749 コストのためにハードが固定化され、ハードが決まってるからCPUも固定でコンパイラもそれに依存
ハードの更新なんて5年に1回あるかどうかだし、更新されてもROM容量が16MBに増えました!程度とかだしねぇ
ツール類はPC上で動けばいいからそっち方面触ってないと技術的に取り残される
つっても未だにMFCで新規ツール作るような人もいるけどねw
まぁ業界によってはこんな組み込みだって居るんだよって程度で
>>751 新しい仕様も考慮しているまともな C++ 入門書は少ないのでその中では十分に良いと思う。
紙でなくてよければ無料で読めるし、とりあえずこれで始めても損にはならんのじゃないかな。
https://ezoeryou.github.io/cpp-intro/ >>751 江添亮の本は、勉強用じゃないw
プロが見て、あれこれ議論する土台になる本
10年以上やっていないと、まず読めないw
どの言語でも、勉強用は「Effective 何々」
>>757 それはひょっとして「江添亮の詳説C++17」と混同してない?
「江添亮のC++入門」は初心者が基本的なツール (make やコマンドライン) の使い方さえわかってないからってんで、
そのあたりから記述している上にクラスの継承を説明しないという思い切った簡略化をしてる本だぞ。
C++11/14 コア言語、江添 亮、2015 この神の書と勘違いしたw 江添は、素人向けの本も、出しているのか
hageで安全靴履いてリュック背負ってると職務質問される的なスキルが身に着く
江添のあれ、糞本だろ。。 初心者はそんなとこでつまづかねーよってところにばかり無駄な記述を付け加えてるっていう。。 センスねーわ。
炎上商法に釣られてると売り上げが伸びちゃいますよ?
江添は職務質問で、大勢のポリ公に囲まれて、その場で監禁されたとかで、 今、警察を訴えているのだろ 警察はボーナスが欲しいから、誰でも犯人に仕立て上げるから、危険! 漏れも昔やられた。 パトカーに止められて、アルコール検知器に息を吐いても、ランプが点かなかったのに、 ポリ公がクルッと後ろを向くと、ランプが点いた! 何のことは無い。 そのポリ公が酔っ払いで、息を吹きかけていたw 後輩の若いポリ公も、グルだった
ビットマップ画像のファイルパスを入力したらそれにブラー処理を施して出力するコンソールアプリ
C++使いのみなさんはC++以外だったら何の言語が好きなんですか もしくは次何覚えたいですか
>>767 GUIはC++でやるのつらいからC#をよく使う
>>765 競技プログラムのクソコードのリファクタリング。
競技プログラミング界隈だと #include<bits/stdc++.h> とか using namespace std; が普通になってるのが本当に嫌なんだよな。 AtCoder がそれを推奨しているのは「そこでつっかえて先に進まないよりは良い (競技の上では問題ないことが多いし)」みたいな ニュアンスだし、ちゃんと理解してちゃんと書くならそれに越したことはないはずなんだよ。
>>767 ワイは Scheme が好きで日常的には C++ より使うなぁ。
興味があるのは Rust。 入門書を読みながら色々といじって遊んでる。
二重言語であり真顔で「わたくしはC言語を極めました」と言えるのが第一関門
>>771 Rustの入門書はどれがお勧めですか。
Box<T>や、Option<Box<T>> の代入や参照について詳しいものがあれば幸いです。
>>765 そういう視点より自分が何を造りたいかを考えろ
>>767 >C++使いのみなさんはC++以外だったら何の言語が好きなんですか
C です
>もしくは次何覚えたいですか
classpath を C++ に移植したいです
>>778 Javaのclasspath相当の機能をC++に移植したいということかね。
>>768 ,771,777,778
どうも
色々ご意見ありがとうございます。みな人それぞれですね
>>773 さすがねねっち
C/C++ で OpenGL とか Tck/Tk とかやるとオブジェクト指向ωの有難さωωが判るωωω
>>781 OpenGLが使いにくいという意味で言ってるなら、使いにくくなったのは OpenGL 2.0
以後に入った部分のみだ。
OpenGL 1.0 は非常に美しく人気が有った。
ところが、Direct3Dに対抗するためか、高速化やShaderの導入のために
2.0では非常に使いにくい方式を追加してしまった。
ややこしいのは、WebGL や OpenGL ES は、その 2.0 の部分だけをベースにしてしまったため、
美しい OpenGL 1.0 とは互換性が全く無い。
だから、WebGL や OpenGL ES から入った人は、OpenGLといえば、その使いにくい関数セット
の方しか知らないから、OpenGLは使いにくいと思ってしまっている。
>>783 逆、昔のが使い易いから人気が出て標準の座を勝ち取った。
当時、OpenGL は、3Dを凄くよく理解している人が設計したといわれていた。
ところが、OpenGL 2.0 は高速だが使いにくくされた。
ハードウェアの種類が減ったんだよね。 その分だけ低レイヤまで踏み込ませても互換性が維持できる…… かと思いきや割とそうでもないな? みたいな闇が出来てしまった。 元から低レイヤを触る人にとってはハードウェアに近いところまで触れる方が使いやすいってのは 普通にあることなので、 API が綺麗なのが使いやすいというのは思い込み。 その人の経歴による。
例のRuby君のことだから、自分で理解的ないものは難しい、使いにくい、汚いと非難の対象にしているか、もしくはどこかで聞き齧った意見をそのまま受け売りで垂れ流すだけ。 いずれにせよ聞くに値しない。
機械工学部なんですが、授業で扱うレベルが初歩の初歩のみで 独学するにもどういうところから勉強すればいいのかわからず困っています 将来的にロボットを動かしたりするための知識を学ぶおすすめの教材とかありますか?
>>786 そうじゃない。
俺は3Dを専門にやってきた。
>>785 いや、書き方に夜がOpenGL 2.0以後は初期設定だけで200行を超えるくらいある。
それに比べて、OpenGL 1.0は、最初、お決まりの数行の初期化のあとは、
glBegin();
glVertex3f(x1,y1,z1);
glVertex3f(x2,y2,z2);
glVertex3f(x3,y3,z3);
glEnd();
glFlush();
程度でポリゴンが1枚書ける。
このコードを見ればマニュアルを見なくてもなんとなくやってることが分かるだろう。
それと、行列計算がとても判りやすくできるようになっている。
hello world的なプログラムなら1.0が楽だが、まともなアプリやゲーム作ろうとしたら、一々頂点定義していくのは面倒なだけ しかも性能落ちる
一見簡単に見えるだけ 問題だらけのAPIデザインだよ とにかくそんな遠い過去の技術どうでもいいから
>>793 2.0 は初期化時の
glBindBuffer(), glBufferData(), gl.bufferSubData()
が特に難しい。
STATIC_DRAW, DYNAMIC_DRAW
の違いや、glBufferData(), bufferSubData() の違いとか。
>>792 お前は俺の言うことがわからないということがわかった。
htmlも昔の方が良かったって人なんだろうね cssとか理解できないんだろう
使い物になるだけD3Dの方がまし OpenGLは初期のAPIデザインひきずって最後までマルチスレッド対応できなかった 拡張性が高いとか言われてるけど ベンダ依存多くて互換性なんかほとんど期待できない 初心者が一ヶ月学んで卒業するための 教育用の価値しかない こんなのにしがみついてどうする
>>792 glBegin/glEndがdeprecatedになって、VBOを使うようになってわかりにくい、という主張はわかるけど、
2.0だと初期設定だけで200行必要というのと1.0は初期化の後はglBegin/glEndでポリゴンが書けるというのは、
対応してないところを比較している気がしてしまう。
それに、GLFWなんかを使わずに素のOpenGL APIを使って初期化するなんてこと今どきある?
2.0になってややこしくなったのは、世界が複雑になったのだから仕方のないことだと思うんだけど。
OpenGLの一番良くないところは、ハンドラが引数になくて、操作されるコンテキストがどれかということが
見えない状態になってしまっていることじゃない?
シェーダーとかなしで グラフを書くだけの用途だから OpenGL1.0でごりおしだな ※ glBegin の対の glEnd を忘れて頂点バッファ漏らすのを ラッパークラスで回避する程度
GLFWなんて使うのは試作や使い捨てツールとかくらいだと思ってた。
つーか昔はフレームバッファに書きこんだところにドットが表示されてすっきりしてわかりやすかった 今は全部GPUにふくざつなめいれいを送らないとドットひとつ打つのも大変だから昔のほうが良い みたいな議論
できることが増えただけで今でも昔のやり方をしたいなら(それで事足りるなら)、昔ながらのやり方をすればいいだけだと思う
imx6でframebuffer上にcv::Mat作って直接弄ったら表示されたときはなんかすごく懐かしかったよ
>>801 >OpenGLの一番良くないところは、ハンドラが引数になくて、操作されるコンテキストがどれかということが
>見えない状態になってしまっていることじゃない?
ほんそれ
python の matplotlib にも同じ違和感を感じる(重箱)
>>804 オレオレルール上は glut までですね判ります
>>808 さすがにそういう30年ぐらい前のAPIデザインはいけてないってことで
direct state accessが導入されたんだけど、中途半端でぐだぐだ
教えてください。 三項演算子 auto a=1;//なんでもいい a?return 0:return -1; なんでコンパイルエラー?
>>811 return は文であって式ではない。
あっ被った なので解決策書いとく return a ? 0 : -1;
ありがとうございました。
式と文がまだわかっていませんでした。
>>814 なーるです。
windows環境でC++のスタティックライブラリを作りたいんだけど、公開するシンボルを選択することって出来ます?
無名の namespace でくるめば内部リンケージにはなるけど
なるほど 確かに消えるけどextern "C"付けると残りますね
公開する気が無いものまでexternしたらだめだぞ
VC++からXboxゲームバーを起動するサンプルどこかにありませんか?
pow関数が遅いというのは今もそうで今後も変わらなさそうで できるだけ使うべきではないですかね?
>>823 何も前提条件を定めず「遅い」とか「使うべきか」とか議論しても無意味だよ。
例えば他の関数と比べて100倍遅い関数があったとして、それを使ったプログラムの実行が1msで終わるものなら、通常は別に問題ないだろう。
その遅い関数がどのくらいの回数呼ばれるのか(数回、数万回、数億回)、許容される時間はどれだけなのかによって異なってくる。
とりあえず使っとけ、問題が起こりうるケースならそのとき考える。
そもそもpow関数が必要ならそれを使うしかないんでないの? それに変わる同等な処理を自前で実装できるとは思えないから、powの頻度を減らした別のアルゴリズムを考えるか、同じ計算が繰り返し行われるなら覚えておくかするしかないと思う。
元の式で数学的に最適化してしまえるケースは多い 何も考えずにコーディングだけしてると無駄な計算量が増える
ホワイトボードで式の変形を何種類かやってテストくらいはしないとな
整数回のべき乗なら最適化も可能だしこだわるならやってみればええ でも数値演算ライブラリはFPU使って並列処理させてるだろ わざわざCPU資源使って計算させるほどでもない 無駄なことして他の処理が遅くなることもあり得るからの
>>823 pow(a,b)
aが同じ値でbのみ変わる事が多いなら
log(a) をとっておいて exp(log(a)*b) とする
取りうる値がわかっていて多くないなら
log(a)をテーブルにしておく
bが整数なら乗算や除算を組み合わせる
bが整数+0.5ならsqrtを組み合わせる
大量にpowを計算する必要があるなら
SIMDやGPUを使う
なと色々と工夫の余地はある
色々ありがとうございます 遅いので工夫しろというのが常識らしいですね
いや、必要なら工夫しろ、必要なければ余計なことはするな、だろう。
速い遅いは実際に書いてるコードの中での相対的なものによるから自分のコードで観測しろ ってことだ
すみません 他スレでJavaでdirectXやるにはCをやれといわれてココに来ました CでdirectX出来るそうなので始めたいんですが 何をインストールすれば良いのですか? Windows10Pro64bitですよろしくお願いします
ウソってことはないはずだけど、よう分からん。
DirectX のスレッドなら確実じゃないかな。
【C++】 DirectX初心者質問スレ Part41 【C】
http://2chb.net/r/tech/1521786252/ ってのが見つかった。たらい回しにするみたいで気が引けるが。
なお、そちらのスレッドは見てないので紹介が適切かも分からない。
>>835 すみません
マルチプラットフォームで3Dやる言語には
JavaでCを呼び出してdirectXをいじるのではなく
UnityでJavaScript言語という結論にいたりました。
ありがとうございました。
jsはもうサポート終了宣言してるからc#にしとこうな
よくわからないですけど Unityの内部で使う動作スクリプトがC♯記述一択で ゲームパッド入力はDirectXのC++で AndroidスマホのタッチイベントはJavaだし 書き出すときはWebGLだからJavaScriptに変換されるという事かな~意味不明だ
>>828 exp って pow よりどの程度速いの?
powは内部的にはexp(log(a)*b)
当然環境次第だけど
おおよそ半分くらいかな
もちろんlog(a)のテーブル検索に時間がかかるようだと
素直にpowを使う
>>828 は
powがパフォーマンスに影響を与えているという前提のチューニングの話で
ほとんどの場合はそんな事はないので
ほとんどの場合はそのままpowを使うべき
y = a * pow(x, 3.0) + b * pow(x, 2.0) + c * x + d; って糞コードを見たことがある
速度、精度、見やすさ、コードサイズ、ライブラリ使用 全ての面で糞コード pow(x,y)が電源ボタンxをy回押す という別の関数だということは無いとして
こうか? y = ((a * x + b) * x + c) * x + d;
元の数学的な式を素直にコードに落とし込んだ感じはあるけどな。 「xの3乗」を「pow(x, 3.0)」と「x * x * x」との どちらで書くのを自然に感じるかという話だが。
クリティカルでないものならどう表記しようが別にどうでもいいがな 1億回計算したところで時間差は感じないだろうよ んなことよりべき乗扱う上で大事なのは桁あふれと有効桁数の処理 必要精度のはっきり定義された科学計算用のライブラリ使ったほうがマシ
精度的には加減乗算の方がはっきりしてる 普通は無限精度で求めた後に丸めたのと同じ値になる つまり誤差最小
>>849 たとえばJIS規格に則った計算方法てのもある
測定値を足し合わせるだけでも±有効桁/2を混ぜ込まなきゃならなかったり計算ごとに有効桁に丸めこまなきゃならなかったり
乗算の場合は有効桁を減らしたりとかまあいろいろ
無限精度で計算して最後に丸め込んだら×もらう仕組みになってたりする
精度的にpowを使うことで解決することなど無いと思うが
>>841 y = ((a * x + b) * x + c) * x + d;
いわゆるスパコンなんかだと式の変形してがんばらずとも pow そのままで速かったりするのかな?
c++使う理由ってなんですか? 2dゲームにおいてもc++が必要でしょうか?
ゲームと言うよりゲームエンジンでした すみません テクスチャの描写にすらC++は必要なのかなと ポリゴンならもちろnC++一択でしょうけど
必要=必ず要る という意味なら答えは分かってそうな気がするが 別の意味ならもっと日本語をうまく使った方が良い
基幹部分の話ならC++使わずにCで書くって方向性もあるかも。
可能かどうかで言えばテクスチャの描写はすべての言語でできると思います ただRPGメーカーやウルフエディタはC++です ここに理由はあるのかなと疑問に感じました 2dでもopenglなどを使うのですか?
奥の方では2dでも使ってるよ 今どきのコンピュータならインタプリタでも速度は足りるけどc++を使うのはまあそれが一般的で資産があるからだと思うよ
GUIのOS画面「🐴🦌🦋」 CUIのOS画面「AAA」
ライフゲーム「•|•/•-•\•|•/•-•\」 7行テトリス 7行オセロ 10行ぷよぷよ はじめてのゲームプログラム「荷物君」
>>864 RPGメーカーもウルフエディタもさわったこと無いけど、RPGツクールみたいなものでしゅ。つまりただの2Dゲームではなく、ユーザが作成した(場合によっては膨大な大きさの)データを編集するツールと、そのデータを読み込んで処理しながら2D RPGとして動かすプレイヤ(仮想ゲーム機)のセットみたいなもの。
ただの2Dの描画ならマシン性能は大して求められないけど、膨大なデータを効率的に保持して動的な変更に耐えうるような仕組みを作るなら、処理速度が速くメモリ効率も良いC++を使うメリットはあると思う。特にスイッチや変数、イベントなどをユーザが定義して処理するなら、処理速度が遅いとかなり厳しいと思う。
で、結論を言えば、マップエディタが作りたいだけならわざわざ学習コストの高いC++に手を出して挫折する可能性を高める必要はない。他の使いやすい言語やフレームワークを使っとけ。
>>869 >>859 > 2dゲームにおいてもc++が必要でしょうか?
C++をディスってるのが分からな🐗?
>>872 おお、またやってしまった。
以前会社の上司にも似たような誤字を送ったことがある。いまだにスマホのフリック入力は慣れない...
Unityスレにもいた人だけどなんでこんな少ない情報で最適な言語を求めるんだろうか? 別にC++でもC#でもjsでも実現可能だし、大差ないと思うけど COBOLとかならやめとけって言えるけど
答えというか、一般論を知りたいです 例えばエレクトロンでピクセルの操作は出来ますか?
一般論なら、Unity 他には、Electron, React Native サーバー側が、Ruby なら、Rails もある。 ただし、GUI は、HTML, CSS/SASS, JavaScript になる
ゲームではなく、タイルエディタでもunityという選択なんですか?
一般論なら使い慣れた言語でいいんじゃね?程度だと思うよ 実現したい機能の実装が不可能で無い限り関係ない 利用者の多い言語のほうがフレームワークやライブラリの面で開発は楽になるかもしれない electronは言語ではなくフレームワークだけどなんで言語と比較してるの? electronの質問は該当スレへ 今の質問もスレからずれてると思うけど
すみません。 既存のエディタがなぜc++なのか知りたかったのです。
いや、unityスレでも言われてたけど作った人に聞け以外に答えは無いよ ウルフエディタを触ったことは無いがやってることはC++でもC#でもjavaでもできるはず 他言語は俺じゃわからんが画像を任意座標へ表示するようなことができる仕組みさえあれば大抵のことはできるだろう
初学者なら兎も角、熟練者が少人数で使う分には言語による開発効率の差なんて大差ない 手足となるライブラリが一通り揃って使い方知っていれば、c++だろうがサクッと作れる
ごめんなさい じゃあpyqtでやります 比較的pythonに慣れているので
そもそも、Tiled Map Editor を使うから、作るのは無駄だと思うが
>>882 >任意座標へ表示
ここでポインターが便利ってことになるんだよな
線引いたり塗りつぶしたりといったプリミティブなことを自分でやるならポインター使えなきゃやってられない
ここまでくるとアセンブラの威力まざまざと見せつけられるわけだけども次点でC/C++
競技プログラミング始めたいんだけど、どうやってcpp勉強すれば良い? Cはある程度わかるからcpp特有の文法を勉強したい 変数みたいなのに>>みたいなのいっぱいついてて何がなんだかわからん
とりあえず解いて他人の回答をみる 知らない内容があればググる これの繰り返し
>>887 普通に本屋で入門書買ってきてやればいいだろう。
それとC++をcppと呼ぶのはやめれ。
>>887 細部を観る前にまずオブジェクト指向を理解するべき
競技プログラムでまずオブジェクト指向? 順番が違う気がする
あくまで競技プログラミングありきで C++ を導入したいってことならオブジェクト指向の考え方はそれほどいらんわな。 ただ、競技プログラミングで書かれてる C++ のコードってかなり汚いのばかりなので、 そこに特化しちゃうのはあまりオススメしないよ。 頻繁というほどではないが using int = long long; くらいのクソはちょいちょい見かける。 まともな書き方をわかった上で割り切り方を考えるとか、言語のトリッキーな部分に踏み込んでみるとか、 逆に言語はどうでもよくてアルゴリズムだけが大事とか考えてるなら競技プログラミングでスタートするのもありかもしれんが、 ちょっと C に毛の生えたくらいの C++ で競技プログラミングを始めると変なクセが付いちゃう。
おっと using int = long long; は出来ないな。 #define int long long の間違い。
競技プログラムに特化 いいじゃない 何からはじめても どうせ将来業務や集団でコーディングすることになったら 文法以外に色々と勉強しなきゃならん
どうせ勉強するならへんな癖ついて手遅れになる前に 初めてやるときからオブジェクト指向やっとけって話だろ 急がば回れ
クローズドな場所でレースがしたいって人に まず道路交通法を学べっていう感じ トンチンカン
いや道路交通法っていうよりサイドブレーキの使い方とか駐車の仕方って感じじゃね
>>900 誰の言葉なんでしょうか?大概は誰(チャーチルとかルーズベルトとか)という情報とセットで引用されるものなんですが、この言葉はそういうのがあまりないのはどうしてなんでしょうか?
>>904 普通にググって出て来るけど?ほんまかどうかは知らん
https:/www.firstlogic.co.jp/blog/lab/aizawa/6243
>
「愚者は経験に学び、賢者は歴史に学ぶ」
鉄血宰相と呼ばれたオットー・フォン・ビスマルク(1815年-1898年)の言葉です。
ちょいちょいC++関連スレで見かけるけど、実際に書いたり経験したりもしてない聞きかじりの知識で マウント取りたいだけ、ってのを正当化するために使われてる気がする
まあITなんて歴史が浅いものは他人の経験が歴史みたいなもんやし
そもそも
>>900 が間違ってる
賢者は色々な事から学ぶ
歴史から学ぶとは要するにパクり これだけで新技術なんか生まれない
つーかこの手の格言て日本語の意訳が過ぎるせいで
元の意味が失なわれてる事がちょいちょいあるけど
この「愚者は経験に・・」もそれで元のビスマルクの文言の意味はまんま
>>907 の意味で
要するに「自分の経験のみで考えずに常に他者の経験を見聞きしてそこから学べ」という
意味だった
この他者の経験の集合の事を「歴史」なんつーて壮大な単語に集約しちゃったせいで
なんか「経験論で判断したらあかん、歴史書にあるような高尚な理論を学べ」
みたいな話になっちゃってるっていう
ああやっぱり そんなことだろうと思った ムーアの法則もそんな感じ 違う意味で使われてしまった例
賢者が歴史「だけ」から学ぶと思ってる
>>908-910 ってw
>>900 は
愚者は経験を含めた色々な事から学ぶ
なんて文ではないだろ
>>900 を見て違和感が無いなら
プログラミングに向いてない
経験が無い言い訳をするために 偉い人の言葉を変造して使う 経験の無い文系にありがちなこと
>>913 意訳が悪いというより、金言を字面通りにしか解釈できない奴が増えた(もしくは元から多い)ということが問題なんでないの?
例えば
>>917 みたいに。
>>900 の意味を考えたら、愚者は「自分自身の」経験だけから学ぶのに対し、賢者は歴史というこれまでの多数の人間による経験の積み重ねからも学ぶという対比であることは分かりそうなものなのに、字面通りにしか受け取らない。
だから
>>910 みたいな頓珍漢なことも言い出す。
新たな技術を産み出すのは過去の積み重ねの上に、それをさらに発展させたり新たな発想などが必要になるだろうけど、この金言は別に学ぶことだけしていろと言う話をしているわけではない。ただ学ぶ対象は広い方が良いという話をしているだけなのに、何でわざわざ
>>910 のようなことを言い出すのだろう。
#include <stdio.history> const 自動運転車 = require('運転経験'); import 数学史
>>920 誰が読んでもわかる文章にするべきだろう
小説じゃないんだから
>>922 クエっクエっクエっチョコボー~ル~
921>gcc a.c
stdio.history: No such file or directory
名言・格言・故事成語は枝葉や細部を切り捨てた理想的な空間だろ その場その場に合わせたすっからカンのいいくるめだ だから欧州も誰が言ったかに矢鱈と拘る こういうのはマジで作り話で都合のいいことしか書いてない 虚偽のお話を信じさせられてるんだから虚構と現実のズレが生じる
>>923 バカ向けに要約するね。
ID:TsX0h7IG は低能
>>921 むしろ
----vc2019.h----
#include <vc2017.h>
----
----vc2017.h----
#include <vc2015.h>
----
----vc2015.h----
#include <vc2013.h>
----
----vc2013.h----
#include <vc2010.h>
----
みたいなものを想像した
表紙に一休さんみたいな男が写った専門書を見つけたのだけど、買うのためらった
UNIX公案なるものが存在するのでプログラミングを理解するには禅をやるのが早い GEBでも公案の論理分解が行われてるくらいに当時のアメリカ西海岸では大麻と禅とLSDが流行った
>>929 江添亮のC-入門?
これで安全靴でミリタリー服でうろついてたら職務質問される罠
>>934 私は好きです!
while (), do while (), for () をやる前に goto を導入し、「if () と goto があれば何でも出来る!」という潔さ!
include をおまじないと称してすっとばす解説は大抵糞
そういう解説で勉強したやつは100%コピペマンになり業務では使えない
俺はアセンブリから入ったタイプだからよりプリミティブな機能の 組み合わせとして理解するという方法論は結局のところわかりやすいというのはわかる。 でも展開形を意識してしまうようになると抽象化の感覚が育たないような気もしていて、 あらゆる意味で万能ってことはないので色んな本があることが大事なんだと思う。 江添亮のC++入門は継承すら取り扱わないレベルの入門という位置づけなので、 不足する分はより本格的な本を読む前提だろうし、まあこんなもんじゃないの。
>>943 一本道で過不足なく必要な物を順序通りに学べるような都合のいい方法なんてないから、ある程度は分からないものを保留して先に進んでから後戻りして理解したり、逆に順調に進んでると思ったら壁に突き当たって後戻りして不足部分を地固めし直してからまた先に進むなんてこともある。
それが当たり前だと思って最初は苦労するしかないと思うよ。ある程度なれてくれば、経験と勘で補いながら効率が上がっていくはず。
二章からポインタの説明が始める入門書で勉強した。今思えば酷いサディスティック教本だったと思う。 タイトルが思い出せない…
>>943 独習C++レベル、accelerated C++ レベル → C++98 STL本 レベル → 結城さんのデザパタを C++ に書き直す訓練 →C++11レイターを本格的に → テンプレートマジック本(今ここ) →積読している effective C++ とその兄弟たちはいつか読みたいものだ
do{...}while(0); ってどんな気持ちで使うんでしたっけ?
#define HOGE(FUGA) do{...FUGA...}while(0) だからdefineが重要なのかしら
goto否定原理主義者がbreakをgotoの代わりに使う
アナルに挿入しながら「まだ・・まだ本体には挿入していないっ! だからこれはセックスではない!」とか言うのと似てるなそれ
>>945 C/C++ でポインタを避けて説明する (理解を試みる) 方がつらくない?
>>949-950 「大丈夫、パイプカットしてるから」みたいな感じかも。
break や continue を「去勢されたgoto」って喩えるじゃない。
if のネストが深くなるのは嫌だし、
関数からの早期returnも(デバッガで追うのが面倒になるので)ダメ、
goto なんかもっての外、という時に do {} while(0); でゴニョゴニョと。
で、コンパイラさんに「常に偽となる条件式です」とか警告されるの。
>>951 はい、もちろん。
でもそれが2章でなくてもいいのかな、と。
出鼻くじく気満々やん、みたいな
>>953 選択肢があることが大事なんだって。
C の理屈だとビットパターンが並んだメモリ空間が広がっていてそこにオブジェクトを配置していくというモデルだから
ポインタを通してそこらを理解させるというのもひとつのやり方としてアリでしょ。
きちんとした理屈を後出しされると「先に言えや!」って気持ちになる人は少なくないと思う。
ポインターの何がそんなに難しいと感じるのかわからん コンピューターの処理なんてアドレス操作ばっかりじゃん コンピューターの仕組みがわかってないからなのかな? ならば言語学ぶ前にコンピューターの仕組みを学ぶのが先じゃね?
テスト問題にはポインタパズルとでもいうべきゴミみたいな問題が多いからね わざわざ難しくして間違えるように幾重にも罠を張ったヤツ そういうのでポインタ嫌いが増える
サイズ100を100個用意するより サイズ10000を1個用意してアドレス割り振るとか好き ポインタ変数分サイズ増えるのは目をつむる確保速度重視
>>945 私は ** を使うくらいなら *& の方がマシだと思っているのですが、 *& で書いた本はまったくないですね…
>>958 何をいいたいのかわかんないのでもうちょっとくやしく
あんだけクズをバカにしてたのに、同じエディタを使ってたなんて!
>>962 そういうデザインのプログラムがあっても不自然だとは思わないが、
初心者向けでポインタの説明をする段階という前提を置くと参照と混ぜて示すのは混乱の元ちゃう?
& という記号の多義性がアレなのが根本原因ではあるんだが……。
>>963 >初心者向けでポインタの説明をする段階という前提を置くと参照と混ぜて示すのは混乱の元
そうかもしれませんね
>& という記号の多義性がアレなのが根本原因
まあ、そうですよね…
>>947-948 同じ人からの連続投稿、ひとつの質問だと気づかなかった。
マクロの実体を do {...} while (0) で囲む定型については
「#define do whole false」でネット検索すると色々出てくる。
この場で説明するには少々分量が多いのだ。
そのうち #define HOGE(FUGA) do{...FUGA...}while(0); と描いてしまって失敗する
あ、もちろん whole は誤り while で検索してくれ。 × 「#define do whole false」 ○ 「#define do while false」
テキストファイルに文字列を書き込みしたいのですが ofstream ofs("test.txt",ios::ate | ios::in); ofs << "hoge" << endl; これだと動いているんですが 最後のendlを無くして"hoge"のみを書き込もうとすると動作しません どういった理由なんでしょうか?
読み書きは時間がかかる処理だから、読み書きの前に、小さなデータは一時的にバッファという記憶域にまとめて 貯めておき(まあ、キャッシュと似たようなものだ)、改行などがあれば、押し流す(flush)という処理をする。 この場合はendlがflushの役割をする。
>>969 >>970 理解できましたありがとうございます!
ポインタを初心者に完璧に理解させる方法分かったわ。 ポインタ=ショートカットアイコンと教えればいいんだ。 メモ帳に文字書いて保存して、ショートカットアイコン作って「これがポインタだよ」って言えばいい。 メモ帳の容量見てごらん?100kbでしょ?ショートカットアイコンの容量見てごらん?1kbしかないね。 ショートカット開いて。文章変えて。ほら1kbのデータで本体が変わった。これがポインタの仕組みだよ。 完璧
その程度の抽象化ならポインタのこと直接説明すればいいと思う
アセンブラから入ると Cのポインタは色々と意味不明
嬉々として大量に出題されるポインタパズルが難易度を無駄に押し上げてる この時のアドレスは何か、変数は何かと、無駄に凝った問題を作り易いのがポインタの難点 テストのための問題を作る必要があって、そこではふるい落とす必要がある 全員100点じゃマズいと思ってる教師がいるからね でも教育が成功したと言われる全員100点だとダメ ここに現行教育の限界点がある すると、問題難易度は加速しつつ急上昇する しかも大して面白くもなんともない問題が製造される 穴埋めよりも酷いのが
自称「教科書」が間違ってたりするからな そういうミスリードが初心者をさらに混乱させてる
高校生の教科書に ニュートン力学は間違ってるとか 幾何光学は間違ってるとか この世はユークリッド空間ではない とか書いても混乱するだけ
>>981 百歩譲って厳密じゃないのを許すとしても
明らかな間違いは遺憾
& * の多義性 複合型の記述方法 メモリ確保解放 ポインタの型と演算の結果の違い const, volatile
わかってさえしまえば簡単至極なのに、これほど初心者に教えるのが難しいこともそうはないなw 配列や関数の戦闘アドレスの渡し方をわかりやすく出来てれば難しいと思えることもなかったかもしれない。
戦闘アドレスと防御アドレスを使いこなして達人を目指せ!
チートコードはベースアドレスからの距離 ベースアドレスが変わってもチートコードは変わらない ゲーム好きにはこんな感じか
pythonのctypes使うときに役に立ってる ctypes.POINTERとか謎仕様過ぎた
C++って団塊ジュニアまでの言語って感じがする これから爆発的に需要が伸びていく可能性なんてないよね?
伸びるとかよくわからんが 今時のウェーイってしている言語にしたって、大抵コア部分のライブラリやらランタイムやらはcやc++で書かれているのだから その言語のお客様で済む用途を越えて何かしようとしたら、出来ないと困るだろ
>>994 世に存在する計算機言語の半分以上は C/C++ で記述されていたりするのです
陣取り合戦をしているわけでもなし、 需要が伸びればいいってもんでもない。 重要なのは居場所を見つけるかどうかって話だと思う。 C++ が適切とは言えないけど C++ が比較的マシという理由で C++ が使われている というのはよくあることで、新しい言語が出現してそういう分野を奪っていくこともある。 もともと C++ がイマイチだったところが消えるだけで、 どんどん衰退して消える運命ってほどのもんではない。
そろそろ次のスレッド…このスレッドが終わる前に告知を…。 俺は…ダメだ(がっくし)。
このスレッドは1000を超えました。 新しいスレッドを立ててください。 life time: 445日 0時間 59分 3秒
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/ ▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
read.cgi ver 07.7.24 2025/07/17 Walang Kapalit ★ | Donguri System Team 5ちゃんねる
lud20250720220942caID:goJw/KBcのレス一覧: class TA{ static public int a; } があって、 int b = TA::a ; のようにするのと、 TA A; int b = A.a; のようにするのは、bに読み込む速度は違うんですかね。
>>247 後者はAの実体を作るから遅いかも。まあ多分、最適化で変わらないと思う。
wavファイルなどの外部の別ファイルを読み込んで使いたいのですが、どのようにやればいいのでしょうか…? バイナリデータにして読み込む、みたいな方法を見かけたのですがファイルのサイズが大きすぎるとヒープの領域を使い果たしました的なエラーが出てしまって行き詰まっています
mallocを使う まずは音ではなく画像、bmp読み込みから練習する 数百MBの音声ファイルよか数MBのbmp画像読み込みの方が気がラク
>>249 一度に全データを読み込むのでなく、固定サイズのバッファに、必要な分だけ少しずつ読み込めばいい。
読み込み済みデータを再生するスレッドとは別に、もう一つのスレッドで再生にあわせてデータを先読みで読み込んでいけばいい。途切れなく再生するにはリングバッファとかを使う。
malloc・リングバッファ、詳しく調べて挑戦してみようと思います! あとスレッドの概念もちゃんと理解できてない気がするのでそこも勉強しようと思います。 ありがとうございます!
>ファイルのサイズが大きすぎると 積んでるメモリぐらいでかいファイルなのかな? どういった読み込みで失敗してるんだろう?
> ヒープの領域を使い果たしました的なエラー これからまず連想したのは、VCで巨大ファイルをリソース化しようとしたときに出るコンパイルエラーだな どのタイミングで出たエラーか書いてないからわからんけど
実行ファイル中にリソースとして埋め込み リソースからバイナリ列を引き出して(読み出して) 再生コードに渡す 音声を実行ファイルに埋め込みたかったのかな?
もう少し詳しく書くと、とあるプラグインを作りたくて、それ用のプロジェクトファイルのジェネレーターとVisual studio 2019 を使っています。 そのジェネレーターを通してwavファイルをバイナリデータ化しているのですが、wavファイルのサイズが一定以上になると「error C1060 ヒープの領域を使い果たしました」っていうエラーが出てビルドが通らない状態です。 10MBぐらいのwavファイルだと普通に通って、18MBぐらいになるとエラーが出ます。
プラグイン本体にバイナリデータ埋めまず、エンドユーザーにはプラグインと音声ファイルを配布 音声ファイルのパスだけうまく帳尻あわせてファイル開いて、メモリ確保して、ファイル読んで、etc って設計するかな
>>256 そのジェネレータとやらがエラー吐いたという話ならスレ違いだろう。
スレチのような気もするんですが,ここが一番適切な回答がありそうなんで,質問させて下さい. iPadでc++のコード(複数のファイルでつくられている)を読みたいんですが便利なビューワーありますか? 関数名やクラス名クリックしたら定義してるところまでジャンプしてくれるようなやつを探してます. emacsで言うetagsみたいな機能のことです.
「ipad emacs」 でぐぐったら iPad用の emacs そのものがあるようだけど
>>264 後出しですいません.キーボードは使わないのでemacsはないです.あと,iPadのemacsはけっこうがっかりだった記憶が….
タッチでジャンプできると嬉しいのですが….
便利そうなエディタは何個かあるみたいなんですが,ジャンプ機能がないんですよね.
以前
>>225 で質問させてもらったものです。
>>230 で書いたようなプログラムを作ってるんですが、
DogやCatだけでループを回したいんですがどうしたら良いですか?
Dogだけの配列とCatだけの配列作ってから、Animalのポインタでそれらの配列を
参照すれば出来るのかなと思ってるんですが、考え方はあってますか?
>>266 ポリモーフィズムがうまくできていればAnimalのポインタの配列にDogやCatのポインタを突っ込めるはず。
>>268 んでサウンドは使えるようになったか?w
>>268 ポインタ突っ込む方法を具体的に教えてくれませんか?
ポインタがよく分からないです…。
Animal *array[10] = {NULL}; array[0] = new Cat(2, 3); array[0]->walk(); delete array[0];
>>270 一旦オブジェクト指向のことは忘れてポインタを先にしっかり学んできた方が近道かもよ。ここで小さなサンプル教えてもらって真似しても近い将来嵌まって行き詰まりそう。
オブジェクト指向の勉強が目的なら他の言語で始めた方が余計なところで躓かないと思う。
>>272 MZうyちゃーーーん♪はBASICで充分w
DogやCatのインスタンスも複数あって、 Dog だけでループとかCatだけでループとかしたいんです。 animalだけでループするなら書いていただいたので良さそうなんですが。
DogやCatに自身のタイプを返す機能をつけるか、typeidを使ってループをフィルタすればいい
dynamic_castでダウンキャスト失敗すればNULLが買える。一個800円。
>>278 何言ってるか不明ですがキーワードありがとうございます。
とりあえずググります。
for(auto a : animals){ if(typeid(a) == typeid(Dog*){ } }
dynamic_cast<Cat>(array[0]) == NULLだったらarray[0]はネコではない
|| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|| ||. =ねらー三原則= || || 1.助けない || || 2.教えない 。 ∧_∧ いいですね。 || 3.関わらない\ (゚Д゚,,) ||________⊂⊂ | ∧ ∧ ∧ ∧ ∧ ∧ | ̄ ̄ ̄ ̄| ( ∧ ∧ ( ∧ ∧ ( ∧ ∧ | | ~(_( ∧ ∧ __( ∧ ∧__( ∧ ∧ ̄ ̄ ̄ ~(_( ∧ ∧_( ∧ ∧_( ∧ ∧ は~い、先生。 ~(_( ,,)~(_( ,,)~(_( ,,) ~(___ノ ~(___ノ ~(___ノ
レス:1-200 201-400 401-600 601-800 801-1000 ALL
このスレへの固定リンク: http://5chb.net/r/tech/1556142878/ ヒント: 5chスレのurlに http ://xxxx.5chb .net/xxxx のようにb を入れるだけでここでスレ保存、閲覧できます。 TOPへ TOPへ
全掲示板一覧 この掲示板へ 人気スレ |
Youtube 動画
>50
>100
>200
>300
>500
>1000枚
新着画像 ↓「【初心者歓迎】C/C++室 Ver.105【環境依存OK】 ->画像>4枚 」 を見た人も見ています:・【月刊少女野崎くん】椿いづみ総合 95【俺様ティーチャー】 ・【月刊少女野崎くん】椿いづみ総合 34【俺様ティーチャー】 ・【月刊少女野崎くん】椿いづみ総合 106【俺様ティーチャー】 ・【月刊少女野崎くん】椿いづみ総合 50【俺様ティーチャー】 ・【月刊少女野崎くん】椿いづみ総合 64【俺様ティーチャー】 ・【月刊少女野崎くん】椿いづみ総合 73【俺様ティーチャー】 ・【漫画】 「月刊少女野崎くん」アイドルユニット結成!センター総選挙開催、今秋カフェも ・【9月3日】若、誕生日おめでとう! #若松博隆生誕祭2016 #nozakikun #月刊少女野崎くん ・月刊少女野崎くん、完全に消える ・【月刊少女野崎くん】椿いづみ総合 113【俺様ティーチャー】 ・【月刊少女野崎くん】椿いづみ総合 66【俺様ティーチャー】 ・【月刊少女野崎くん】椿いづみ総合 32【俺様ティーチャー】 ・平松タクヤ総合アンチスレ2 ©2ch.net ・17歳少女殺害事件の容疑者の家から窒息AVなど420点を押収 ©2ch.net ・【PSゲーム総合】ソードアートオンラインpart220 ©2ch.net ・リングドリーム総合 462試合©2ch.net ・ex.BELLRING少女ハート/ベルハー ©3ch.net ・【池袋】キャンレボ常設スレ【美少女リフレ】 ©3ch.net ・BABYMETAL総合 ☆706【ベビーメタル】 c2ch.net ・【PSP/VITA】ダンガンロンパ総合part411 ©2ch.net ・編隊少女(フォーメーションガールズ)part53 ©2ch.net ・【3月27日】佐倉千代ちゃん、誕生日おめでとう! #佐倉千代生誕祭2016 #月刊少女野崎くん #さくらの日 ・DCMホーマックを語るスレ Part3©2ch.net ・編隊少女(フォーメーションガールズ)part59 ©2ch.net ・西成 釜ケ崎 あいりん地区part 91 ©2ch.net ・【マギレコ】マギアレコード 魔法少女まどか☆マギカ外伝 268周目 ©3ch.net ・3DCG屋による雑談スレ Part14 ©2ch.net ・10代の少女、刺されて重傷 顔見知りの少年逃走 東京・小岩の路上 [無断転載禁止]©2ch.net ・税理士試験 簿記論 Part.166 ©2ch.net ・編隊少女(フォーメーションガールズ)part60 ©2ch.net ・ポケモン交換スレ part130 ©2ch.net ・編隊少女(フォーメーションガールズ)part60 ©2ch.net ・【MHX】モンスターハンタークロス総合【モンハン】 ©3ch.net ・少女とドラゴン ~幻獣契約クリプトラクトpart42 ©2ch.net ・【日本版】 戦艦少女R Part99 [無断転載禁止]©2ch.net [無断転載禁止] ・艦これ愚痴スレ Part638 ©2ch.net ・CandyDoll Part9 ©2ch.net ・【マギレコ】マギアレコード 魔法少女まどか☆マギカ外伝 86周目 ©5ch.net ©3ch.net ・編隊少女(フォーメーションガールズ) part32©2ch.net ・【DMM一般】ガールズシンフォニー ~少女交響詩~ part5 ©2ch.net ・【月刊少女野崎くん】椿いづみ総合 59【俺様ティーチャー】 ・【月刊少女野崎くん】椿いづみ総合 56【俺様ティーチャー】 ・月刊少女野崎くん 第25号 ・【月刊少女野崎くん】椿いづみ総合 48【俺様ティーチャー】 ・【月刊少女野崎くん】椿いづみ総合 33【俺様ティーチャー】 ・【月刊少女野崎くん】椿いづみ総合 53【俺様ティーチャー】 ・【月刊少女野崎くん】椿いづみ総合 107【俺様ティーチャー】 ・よしッ!] 犬神家の一族6[わかったッ!] ©2ch.net ・戦国乙女~天下無敵の乙女バトル~ 22 ©3ch.net ・◆トラウト◆埼玉の管釣り・4 [無断転載禁止]©2ch.net ・メロンソーダってうまいの? [無断転載禁止]©2ch.net ・【PS4】DIABLO3 ディアブロ3 Part99 ©2ch.net ・【雷句誠】VECTORBALL ベクターボール part10 ©2ch.net ・仮面ライダードライブ No.023【ロリ少女】 �2ch.net ・バンドじゃないもん!☆12 ©3ch.net ・銀河英雄伝説 タクティクス page41©2ch.net ・属魂少女~ソウルガール~ Part12 (c)2ch.net ・5時に夢中!2006©3ch.net ・5時に夢中!2025©3ch.net ・デスノートに書きたい名前 Part.7 ©2ch.net ・放置少女 Lv.4 c2ch.net ・バスケ板を荒らしていた末尾r、完全に特定される ©2ch.net・ ・筋肉少女帯 part.124 ©2ch.net ・【ブログ閲覧は】長谷川豊ヲチスレ★11【魚拓で!】 ©2ch.net ・イカロスオンライン パルナ鯖 晒しスレ Part14 ©2ch.net
21:21:01 up 111 days, 22:19, 0 users, load average: 22.14, 37.16, 38.72
in 0.12041115760803 sec
@0.12041115760803@0b7 on 080710