1 名前:デフォルトの名無しさん [2017/11/04(土) 16:33:35.07 ID:NYxCuvMY.net] エスケープシーケンスやWin32APIなどの環境依存なものもOK そのような質問は必ず環境を書きましょう 半角空白やタブでのインデントはスレに貼ると無くなります コードを貼れる所 codepad.org/ https://ideone.com/ 前スレ 【初心者歓迎】C/C++室 Ver.101【環境依存OK】 https://mevius.5ch.net/test/read.cgi/tech/1500329247/
902 名前:デフォルトの名無しさん mailto:sage [2018/06/16(土) 06:42:53.11 ID:PCTFj+qN.net] >>883 そのコードでconnection->Dispose();を消すだけだとDisposeは呼ばれない。 C++/CLIでDisposeを呼びたい場合「delete connection;」と書く。 C#のusing相当のことをしたい場合は>>885 詳細は↓を参照。 https://loafer.jp/mixi/diary/class.xsp?2007-09-07-23-55
903 名前:デフォルトの名無しさん mailto:sage [2018/06/18(月) 12:02:02.44 ID:P1toAgew.net] Dispose の件で質問してた者です。 自作のIDisposableを継承したクラスを作って確認したところ delete で Disposeが通る事を確認できました。 不慣れで詰まらない質問してしまってすみませんでした。
904 名前:865 [2018/06/20(水) 12:43:56.50 ID:XX+H87IB.net] みなさん、いろいろありがとうございました。 参考にさせていただきます。 ところで、 Cとアセンブリ言語で学ぶ計算機プログラミングの基礎概念 - プログラムはプロセッサ上でどのように実行されるのか 角川 裕次 https://www.amazon.co.jp/dp/4627848315/ この本を読んだ人はいますか? かなり自分にとって理想的な本のようですので、買ってみようと思います。 こういう本を読めば、少しは言語の設計者の気持ちが分かるようになるのではないかと期待します。
905 名前:デフォルトの名無しさん mailto:sage [2018/06/22(金) 23:22:38.51 ID:pTq2TJuj.net] あちらこちらでC++はひどい言語だって叩かれてるけどその割に広く使われている つまりこれはC++を頑張って覚えればその分見返りも大きいということではなかろうか。なにしろ人の嫌がること高いスキルが必要なことはそれだけ報酬も高いはずで
906 名前: mailto:sage [2018/06/23(土) 00:11:02.67 ID:OlLfOCSW.net] C++ はひどい言語だ。これは、多くの平均以下のプログラマーが使ってるために さらに輪をかけてゲロゲロになっていて、どうしようもないゴミが 簡単に生産されるようになってる。正直いって、C を選ぶ理由が C++ プログラマーを 追っぱらうため *だけ* だったとしても、それ自体、C を使う強力
907 名前:ネ理由になりうる。 C++ はトンでもなく悪い設計の元になりうる。どうせこの言語ではいつも STL やら Boost やら、その他ゲロゲロベロベロの「素敵な」ライブラリの機能を使って、 それがあんたのプログラムに「役立つ」んだろうが、以下のことが起きる: - うまく動かないときにもたらされる際限のない苦痛 (あと STL とか、特に Boost が 安定してるとか移植性があるとかいう奴は、どいつもこいつも大ウソつきで、 もはや笑えるレベルを超えている) - 非効率な抽象プログラミングモデルで、2年たった後にこれらが実はそんなに 効率的じゃなかったことに気づくケース。でもそのときにはすでに全部の コードがその素晴らしいオブジェクトモデルに依存していて、直すためには アプリ全体を書き直さなきゃなんない。 言いかえれば、唯一まともで、効率がよくて、システムレベルで使えて、移植性がある C++ ってのは、基本的に C で使える機能だけに限ったときなんだ。そして C だけに 限定するってことは、他の人がそれをめちゃくちゃにしないってことで、 ついでに沢山のプログラマが実際に低水準の問題を理解することができて、アホらしい 「オブジェクト・モデル」のたわごとを持ちこまないってことだ。 [] [ここ壊れてます]
908 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 10:31:52.34 ID:UiVIxiJp.net] 抽象化とコード(バイナリ)の質は相反するものだから
909 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 11:45:24.39 ID:NcXYPjUn.net] alignas(32)とかalignas(64)とかつけなくても大体アライメント揃ってる気がするんですけどつけた方がいいんですか?
910 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 12:58:59.14 ID:g5s8p4AT.net] リーナスのそれがいっちばん有名なC++批判よね
911 名前: mailto:sage [2018/06/23(土) 13:53:36.35 ID:OlLfOCSW.net] >>893 linus は昔から C++ を批判していたが、git 開発に関する 2009 年のこれが、最も効果的な批判になっていますね これを読むと C++er は一瞬自分がわからなくなりゲシュタルト崩壊に陥りますね、もう c++11 over を追いかける気力も失せてしまいました…
912 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 14:43:13.01 ID:DOoRmJ6H.net] 抽象的な思考ができる人とそうでない人が居るというだけだな >>890 もSTLやboostの使い方が理解できない、良い抽象モデルが作れない人が愚痴ってるだけにしか読めんが
913 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 14:54:08.05 ID:UiVIxiJp.net] 抽象化が目的になって パフォーマンスとか使用リソースとか工数を軽視する人が実務経験の浅い人に多い ってのが問題であって 言語自体には罪はない
914 名前: mailto:sage [2018/06/23(土) 15:32:24.63 ID:OlLfOCSW.net] >>895 >良い抽象モデル が役に立つとは限らないのでは? 抽象化を目的とするあまりに YAGNI を忘れてしまうのでは、これは重大な思考的欠陥なのでは? あれほどもてはやされていた GoF は、すくなくとも C++界では、もうみるかげもなく凋落の一途をたどっているのは、どうみるのでしょうか?
915 名前:デフォルトの名無しさん [2018/06/23(土) 16:46:26.83 ID:8e5n022B.net] デザインパターンって廃れたんですか? だとすると、なぜ、デザインパターンは流行り、そして廃れたのでしょうか? 一度は流行ったということは確かに役に立つものだったのではないでしょうか? 一度は役に立つと認められたものがなぜ、否定されたのでしょうか?
916 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 16:51:17.93 ID:7hlQnbj9.net] 日本人は基本すっ飛ばして銀の弾丸欲しがるからな
917 名前:はちみつ餃子 mailto:sage [2018/06/23(土) 17:00:49.94 ID:/E9OfcV+.net] >>898 デザインパターンってのは典型的なパターン (に名前を付けたもの) ってだけだよ。 基礎として押さえておくと便利だし、価値が失われたわけではないけど、 何もかもが既存のパターンに当てはまるわけではないという当たり前の話。
918 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 17:15:09.64 ID:DOoRmJ6H.net] >>897 抽象化とYAGNIは関係ありません こういう意見が出てくるあたりが良いモデリングを理解してない証拠ですね
919 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 17:29:02.45 ID:ul2D0Jgq.net] >>898 別に廃れたわけではなく、使われるものは当たり前に使われてて取り立てて言われなくなっただけ。
920 名前: mailto:sage [2018/06/23(土) 17:30:40.89 ID:OlLfOCSW.net] >>901 たとえば、iostream をどう思う?これは良い抽象化の例ですか?
921 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 17:31:54.13 ID:wjw7dXXk.net] Visual C++6.0です。 Windows7でやってます。 ツールバーを作ると、ボタンを押すとペコってへこんで、また押すとまた戻りますが、見づらいので 押したときと戻ったときとで色を付けたいのですが、どこかにサンプルはないでしょうか また、私は未だに6.0でやっていてこれで十分にプログラムできるので特にこれで不満はないのですが もしバージョンを上げれば出来るのであればバージョンアップも考えたいと思っています 最新のバージョンで出来るのなら、そのサンプルも教えて頂けるとありがたいです
922 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 17:40:24.88 ID:LiutUffZ.net] >>904 OwnerDraw
923 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 17:59:38.49 ID:wjw7dXXk.net] >>905 CToolbarには、DrawItemがないようなのですが ステータスバーにはあります
924 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 18:04:15.08 ID:LiutUffZ.net] ナンシークラッツ本を探した方が良いかな
925 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 18:14:04.63 ID:wjw7dXXk.net] ツールバーに色を付けることもできないとか。ちょっと貧弱ですよね 最新のバージョンのVC+でも出来ないのかな。結構そういう要望はあると思うけど
926 名前:デフォルトの名無しさん [2018/06/23(土) 19:24:24.28 ID:8e5n022B.net] 2分探索木を実装したC++プログラムを読んでいますが、分からないところに出くわしました。 ノードは以下のクラスです: template <typename T> class BinNode { private: T data; BinNode<T> *left, *right; BinNode(T d, BinNode<T> *l = NULL, BinNode<T> *r = NULL); friend class BinarySearchTree; }; 2分探索木のクラス BinarySearchTree 内のメンバ関数 insert の引数としてノードを渡すのですが、 なぜ、 BinNode<int>* tree ではなく BinNode<int>*& tree となっているのかが分かりません。本の説明によると、木構造の変形を可能にするためにそうしているとのことです。 bool BinarySearchTree::insert(int data, BinNode<int>*& tree) { … }
927 名前:デフォルトの名無しさん [2018/06/23(土) 19:25:19.09 ID:8e5n022B.net] >>899 >>900 >>902 ありがとうございました。 一時は、もてはやされすぎたということですね。
928 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 19:28:47.13 ID:8e5n022B.net] insert 内に、 if (tree == NULL) {
929 名前:デフォルトの名無しさん [2018/06/23(土) 19:29:33.57 ID:8e5n022B.net] insert 内に、 if (tree == NULL) { tree = new BinNode<int>(data); … } というコードがありましたが、これのことでしょうか?
930 名前:デフォルトの名無しさん [2018/06/23(土) 19:30:15.04 ID:8e5n022B.net] >>912 あ、そのようですね。
931 名前:放置された蟻人間 mailto:sage [2018/06/23(土) 19:30:26.05 ID:QXtVRpnb.net] >>909 void f(int *a) { static int s_i = 0; a = &s_i; } int main(void) { int i = 3; int *p = &i; f(p); printf("%d\n", *p); return 0; }
932 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 19:45:59.33 ID:8e5n022B.net] >>914 ありがとうございました。 3のままですね。
933 名前: mailto:sage [2018/06/23(土) 19:54:24.54 ID:OlLfOCSW.net] >>909 これは C の課題ですね。 適当な二分木ないし二分探索木に対して、ノード(節)を追加したり削除したりする関数を書く場合、 C ならば add_node(node **root, ...) と書きます。@ これを C++ ならば add_node(node *&root, ...) と書くこともあります。node *&root は「ポインタ変数の参照」です。A @とAとではプログラムの表現もかわります。 これは一度、白紙の状態から自分の手で書くのが、理解するのに一番です。お試しあれ。
934 名前:デフォルトの名無しさん [2018/06/23(土) 21:09:04.41 ID:nmsTY6vF.net] 0,115200 1,38400 2,19200 3,9600 こういう関係がある時に配列を作れば1から38400はダイレクトに求められるが 検索を使わずに38400からダイレクトに1を求める方法はないだろうか?
935 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 21:22:36.64 ID:b0QIE6qX.net] 115200個の配列
936 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 21:26:12.81 ID:EyvIrgyz.net] A/9600 を添え字にして13個の配列で逆引き作る?
937 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 21:29:09.89 ID:b0QIE6qX.net] 9600の倍数であることがわかってるなら割ればテーブルは減る でも4個なら素直に検索した方が速い
938 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 21:41:29.91 ID:EyvIrgyz.net] 検索については同意 元質問は検索使うなって条件なので、まぁ 数値からRS232Cのボーレート設定を想定しちゃうけど、 それなら検索を嫌うようなもんでもないし… な…
939 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 22:02:58.56 ID:ZZklpiyn.net] a1 : b1 a2 : b2 a から、b への辞書と、 b から、a への辞書の、両方を作る
940 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 22:07:27.68 ID:V32XRqjB.net] >>920 は>>919 を見る前に書いた たまたま同じ発想になっただけ 浮動小数数に直すってのもある LSB側から数えて1になるビット位置を返す命令があるのでそれとシフトを使う 115200は(900, 7) 38400は(300, 7) 19200は(300, 6) 9600は(300, 5) RS-232Cだと300x2^nと900x2^nしか普通は使わないから オーディオのサンプリング周波数にも同じような方法が使える
941 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 22:09:33.77 ID:5Wb6fwhK.net] n = (x/9600 > 4) ? 0 : 3 - log2f(x/9600); 入力を検証する手間を考えたらテーブル逆引きと大差ないけど
942 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 22:19:10.79 ID:V32XRqjB.net] >>924 メモリアクセス速度を考えても>>918 の方が速くて簡単 >>923 なんかおかしかった 115200は(225, 9) 38400は(75, 9) 19200は(75, 8) 9600は(75, 7) ビットスキャン命令とシフトとテーブル 変換しなきゃならないデータが多量にあって パフォーマンスが非常に重要ならこれを使うかな
943 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 22:21:03.20 ID:V32XRqjB.net] 普通はこんなものはリニア検索でいい
944 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 23:23:08.99 ID:ZZklpiyn.net] 普通、最適化でも、8個までは線形(全)探索・if 文 それ以上で、ジャンプテーブル・switch-case
945 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 23:47:49.24 ID:UiVIxiJp.net] >>927 ただのテーブル逆変換だぞ なんでジャンプテーブル? なんでswitch case? リニア検索で問題なら2分検索 それでも遅ければハッシュその他のテーブル 簡単な演算を併用出来るものはする じゃないか普通
946 名前:927 mailto:sage [2018/06/24(日) 00:50:44.41 ID:chBT6m1a.net] コンパイラの最適化について書いた if 文を8個以上書くと、ジャンプテーブルに変換されるってこと
947 名前:デフォルトの名無しさん [2018/06/24(日) 08:15:02.59 ID:cbD8du/l.net] >>916 ありがとうございました。
948 名前:デフォルトの名無しさん [2018/06/24(日) 10:44:32.50 ID:8StK2ZXu.net] class clsAにconst member 変数を登録したいのだけどうまくいかない。 クラスコンストラクタでconst char *mes[] を{"abc","def"}のように 初期化するにはどうやるの?
949 名前:デフォルトの名無しさん [2018/06/24(日) 10:57:11.49 ID:8StK2ZXu.net] //そもそもC++は文字列の配列を扱うことができるのか? constexpr auto str1 = {"abc", "def"}; これがエラーするんだがなんでなの?
950 名前:デフォルトの名無しさん [2018/06/24(日) 11:00:18.70 ID:8StK2ZXu.net] constexpr string[] str1 = {"abc", "def"}; コンパイルエラー constexpr string str1[] = {"abc", "def"}; コンパイルエラー クッ、、、どうしてもうごかない。
951 名前:デフォルトの名無しさん [2018/06/24(日) 11:15:54.16 ID:8StK2ZXu.net] string str1 = "abc"; //OK vector<int> dat(100,3); //ok vector<string> str2("aaa",4); //error こういうのもうごかない。
952 名前:デフォルトの名無しさん [2018/06/24(日) 11:23:27.77 ID:8StK2ZXu.net] 自分としてはストリングを多用するのでストリング配列が使えないと厳しい。 検索をしても例がなかなか出てこないので、Effectiv Modern C++という本 をamazonで買ってみたんだが、届いたので今見ているところだが、ここでも string配列の記述を巧みに避けている。皆目出てこない。 string配列の扱い方ってどうやるの?
953 名前:デフォルトの名無しさん mailto:sage [2018/06/24(日) 11:52:20.14 ID:/GbiIoLW.net] 文字配列って良く分からないけど、Javaみたいに一文字だったりして? {"a","b","c","d","e","f","g"}みたいな?
954 名前:はちみつ餃子 mailto:sage [2018/06/24(日) 12:32:00.67 ID:StWe8jKY.net] >>932 定数式じゃないから。 >>933 string は constexpr に非対応のはず。 現時点では。 new が constexpr 的に扱いが難しいので、 内部的にヒープを使うようなクラスはほとんど constexpr 非対応だと思う。 ただ、制限を緩和する提案は出ているので将来的にはなんとかなるかもしれない。 >>934 string に一文字づつ入れたいってこと? std::vector<std::string> str2 = {"a", "a", "a"}; でいけるよ。
955 名前:デフォルトの名無しさん mailto:sage [2018/06/24(日) 12:35:35.92 ID:QFRKHUIu.net] ["abc","def"];
956 名前:デフォルトの名無しさん mailto:sage [2018/06/24(日) 12:36:44.62 ID:p8F2e5jx.net] >>934 >vector<string> str2("aaa",4); //error 「vector<string> str2(4,"aaa");」の誤りじゃね?
957 名前:デフォルトの名無しさん [2018/06/24(日) 13:13:44.88 ID:8StK2ZXu.net] string str1 = "abc"; //OK vector<int> dat(100,3); //ok //vector<string> str2("aaa",4); //error // string str1[] = {"abc", "def"}; //error // const std::vector<std::string> str3 = {"abc", "def"}; //error // constexpr char *mes1 = "abc"; //error const char *mes1 = "abc"; //ok // vector<char *> ch(10,mes1);//error vector<string> ch(10,str1);//ok ここまで確認できた。ただしコンパイルが通っただけだから、動くかどうかは不明。
958 名前:デフォルトの名無しさん [2018/06/24(日) 13:37:02.58 ID:8StK2ZXu.net] //C++はchar *[]のコンストラクタでの初期化はできるのか? class clsA { private: const char *m_name[]; } //clsA::clsA(char *name[]) : m_name(["mike","tetu"]){};//だめ //clsA::clsA(char *name[]) : m_name("mike","tetu"){};//これもだめ //clsA::clsA(char *name[]) : m_name({"mike","tetu"}){};//これもだめ
959 名前:デフォルトの名無しさん mailto:sage [2018/06/24(日) 13:38:12.37 ID:zWtoG2OO.net] サイズ不明だし無理だろ
960 名前:デフォルトの名無しさん [2018/06/24(日) 13:41:38.91 ID:8StK2ZXu.net] >内部的にヒープを使うようなクラスはほとんど constexpr 非対応だと思う。 constexpr char *mes1 = "abc"; //error これもだめですね。ヒープは必要ないとおもいますが、、、
961 名前:デフォルトの名無しさん [2018/06/24(日) 13:42:37.94 ID:8StK2ZXu.net] >>サイズ不明だし無理だろ コンストラクトする時点でサイズは確定していますが、、、
962 名前:デフォルトの名無しさん mailto:sage [2018/06/24(日) 13:45:06.66 ID:p8F2e5jx.net] お前はまずエラーメッセージをちゃんと読め。
963 名前:デフォルトの名無しさん [2018/06/24(日) 14:12:06.73 ID:8StK2ZXu.net] //C++はchar *[]のコンストラクタでの初期化はできるのか? class clsA { private: const char *m_name[]; clsA(char *name[]); }; //clsA::clsA(char *name[]) : m_name(["Bike","tetu"]){}; /*だめだが可能性がありそう。 Invalidはでていない。 --error message-- #29 expected an expression */ //clsA::clsA(char *name[]) : m_name("mike","tetu"){};//これもだめ invalid /* Multiple markers at this line - #2125 invalid initializer for array member "clsA::m_name" - #18 expected a ")" */ //clsA::clsA(char *name[]) : m_name({"mike","tetu"}){};//これもだめ /* * Multiple markers at this line 以下省略 */
964 名前:デフォルトの名無しさん mailto:sage [2018/06/24(日) 14:20:47.48 ID:p8F2e5jx.net] すまん、そっちはエラーメッセージじゃ分からん。 string str1[] = {"abc", "def"}; //error とか constexpr char *mes1 = "abc"; //error とかの話。
965 名前:デフォルトの名無しさん mailto:sage [2018/06/24(日) 14:38:12.08 ID:iIKq/Q4Y.net] string関数の第二引数には何の意味がありますか? 試しに文字列を2つ引数に入れても、第一引数しか出力しないみたいですが ↓です string readFile(const char *filename) { ifstream ifs(filename); return string(istreambuf_iterator<char>(ifs), istreambuf_iterator<char>()); } https://www.miraclelinux.com/tech-blog/1n4hgx
966 名前:デフォルトの名無しさん [2018/06/24(日) 14:46:22.41 ID:iIKq/Q4Y.net] すみません自己解決しました>>948
967 名前:デフォルトの名無しさん [2018/06/24(日) 14:58:47.68 ID:8StK2ZXu.net] >>947 string str2[] = {"abc", "def"}; //okでした。 constexpr 文字列は諦めました。多分相当難しい。 でおもうのだが、結局は普通の人は誰もconst char *配列の初期化について解らない。 というか、ファーム開発にC++を使う場合には文字列の配列はかなり重要でしかも Ramが少ないのでこれをRom配置できないと致命的だ。ということでファーム開発 ではconst char *mes[] = {"zzz","aaa"}; こういう処理が必要になる。 しかしファーム開発をやらない人にとってはconstである理由はないので、この重要さ には無関心なのだろう。 もちろん分かる人もいるが教えるのは恐ろしくめんどくさいか、非常に苦労して マスターしたので簡単には教えたくない。 それほどC++において const char *配列 のクラスでの初期化は難しいのだろうと思う。 いやそもそもできないのかもしれないが、、、(そんなはずはないだろう)。しかし できないとすると、クラス内で初期化するのは諦めてCで初期化してるのだろうか? 多くのファーム開発者は諦めてCで初期化してるのだろうな。
968 名前:デフォルトの名無しさん [2018/06/24(日) 15:43:14.02 ID:zWtoG2OO.net] 配列の初期化の時には()いらないぞ{}だけ >>941 の最後の行の()はずせば通るけどたぶん環境依存じゃないかな 意図してる動作がname使ってm_nameの初期化ならめんどくさそう
969 名前:デフォルトの名無しさん [2018/06/24(日) 16:11:08.57 ID:zWtoG2OO.net] あれコンパイル通るけど未指定だと動的確保してplacement newでもしないとだめか
970 名前:なこれ [] [ここ壊れてます]
971 名前:デフォルトの名無しさん [2018/06/24(日) 16:11:30.09 ID:8StK2ZXu.net] class clsA { private: const char *m_name; clsA(); }; clsA::clsA() : m_name("Bike"){}; これはOK、しかし配列はできない。
972 名前:sage [2018/06/24(日) 16:24:15.11 ID:zWtoG2OO.net] class a { public: const char* name[]; ここで非標準だなんだの警告でる a():name{ "aaa","bbb" } { } }; vsだとこれでコンパイルは通るしぱっと見正常だけどそのまま使うとたぶんどっかでメモリ壊すんじゃないかな 配列の数指定しといたほうが無難な気がするけど
973 名前:デフォルトの名無しさん mailto:sage [2018/06/24(日) 16:39:11.76 ID:Q9QWMZ9P.net] C++にはサイズ不定の配列は無いからサイズ指定しないと無理だよ コンストラクト時にわかってるじゃないか、って話もあったけど 中身の配列数が変わったらそれは違う型になる つまりテンプレートが必要になる 配列の要素数を推定させるのは、C++17で入ったクラステンプレートの引数推定を使えば一応出来るけど
974 名前:デフォルトの名無しさん [2018/06/24(日) 17:24:18.36 ID:8StK2ZXu.net] //C++はchar *[]のコンストラクタでの初期化はできるのか? class clsA { private: const char *m_name[2]; clsA():m_name{"aaa","bbbb"}{} }; これでもエラーします。
975 名前:デフォルトの名無しさん mailto:sage [2018/06/24(日) 17:42:22.01 ID:zWtoG2OO.net] なんてエラーでてるの
976 名前:デフォルトの名無しさん [2018/06/24(日) 17:54:03.23 ID:8StK2ZXu.net] //C++はchar *[]のコンストラクタでの初期化はできるのか? class clsA { private: char *m_name[10]; clsA(); void init(); }; clsA::clsA() : m_name{"Bike","bbb"}{}; //エラーする。 /* Multiple markers at this line - #66 expected a ";" - #171 expected a declaration - #126 expected a "(" - #176-D expression has no effect */
977 名前:デフォルトの名無しさん [2018/06/24(日) 18:01:33.16 ID:8StK2ZXu.net] それconst つけるの忘れてたが、つけた場合もエラー表示は同じだね。
978 名前:デフォルトの名無しさん mailto:sage [2018/06/24(日) 18:04:27.08 ID:p8F2e5jx.net] あなたの使っているコンパイラは、おそらくC++11未対応です。 constexprはC++11の機能なので、そのコンバイラでは使えないか、 使えたとしても標準とは異なる動作をする可能性があります。
979 名前:デフォルトの名無しさん [2018/06/24(日) 18:18:27.13 ID:8StK2ZXu.net] >>960 あっ、そうなの? ごめん、それはうっかりしていた。今年の2月にインストール した最近のコンパイラなので当然C++11以上だとおもっていた。 一寸調べてみる。
980 名前:はちみつ餃子 mailto:sage [2018/06/24(日) 18:23:43.69 ID:StWe8jKY.net] >>961 対応していてもデフォルトでは C++11 の挙動にならない (オプション指定すると対応する) ようなものも有りうる。
981 名前:デフォルトの名無しさん [2018/06/24(日) 18:36:49.63 ID:8StK2ZXu.net] >>962 おお、ありがとう。全然気が付かなかった。これは一つ前のバージョンでプロパティを みてもC11++がない。 最新のバージョンはC++14をサポートしてるみたいなのでUPDATEしてみる。
982 名前:デフォルトの名無しさん mailto:sage [2018/06/24(日) 19:43:42.27 ID:G0tizpK6.net] 勘違いしてたらすまないけど↓みたいな事がしたいの? https://ideone.com/Zm8LO5
983 名前:デフォルトの名無しさん [2018/06/24(日) 22:24:29.32 ID:8StK2ZXu.net] >>964 凄い!!。まさにそれです。こちらでもコンパイル通りました。 難しいなー。 もうコンストラクタでの初期化はすっかり諦めて代替案を作っていたところだけ ど、それを丁重に拝借いたします。ありがとう。
984 名前:デフォルトの名無しさん mailto:sage [2018/06/24(日) 22:30:41.96 ID:EmcxYm71.net] 借りるってことは返すんだよね
985 名前:デフォルトの名無しさん [2018/06/24(日) 23:08:30.10 ID:8StK2ZXu.net] >>966 もらい受けたいところだけども、意味が理解できるかどうか? あなたは意味が わかりますか? clsA() : clsA((const char* const []){"mike","tetu",nullptr}) {}; (const char* const []){"mike","tetu",nullptr} これは何を意味してるの?
986 名前:デフォルトの名無しさん mailto:sage [2018/06/24(日) 23:09:16.86 ID:chBT6m1a.net] 「c++ constexpr 文字列」で検索すれば?
987 名前:デフォルトの名無しさん mailto:sage [2018/06/25(月) 00:15:08.68 ID:RQXh1ivn.net] void func1(int a) { printf("%d\n", a); } void func2(int a, int b) { printf("%d,%d\n", a, b);} template<?????> class Test { public: void method(void) { (templateの引数で func1(int a) か func2(int a, in b)を呼ぶ) } private: int a; in b; }; のような事をしたいのですが、引数が1つか2つの関数をそれぞれ名前でtemplate引数にして 記述したいのですが、うまくいきません。どうすれば良いでしょうか? 例えば template < void F(int)> とすると Test<func1>() でいけるのですが、func2の場合が 表現出来ません。
988 名前:デフォルトの名無しさん [2018/06/25(月) 01:49:02.18 ID:Gwlgg6/B.net] class class1 { private: int m_a; public: class1(int a) : m_a(a) {} class1(class1 const& rhs) { m_a = rhs.m_a; } void method(void) { printf("%d\n", m_a); } }; class class2 { private: int m_a; int m_b; public: class2(int a, int b) : m_a(a), m_b(b) {} class2(class2 const& rhs) { m_a = rhs.m_a; m_b = rhs.m_b; } void method(void) { printf("%d,%d\n", m_a, m_b); } }; template<class _Myclass> class Test { private: _Myclass m_myClass; public: Test(_Myclass myClass) : m_myClass(myClass) {} void method(void) { m_myClass.method(); } }; int main() { Test<class1> x(class1(1)); Test<class2> y(class2(2, 3)); x.method(); y.method(); } 意味があるのか分からないがとりあえずコレで もしくはTest::methodを可変引数にしてprintfにその可変引数を渡すしかない まずなにがやりたいのか分からないからテキトーに書いてやったぞ
989 名前:デフォルトの名無しさん [2018/06/25(月) 03:37:15.06 ID:3f3crQyZ.net] const char *[]の初期化だけれども clsA(const char* const name[]) : m_name(name) {}; これはまあ何となく意味が解る。m_name <−−nameってことだよね。 clsA() : clsA((const char* const []){"mike","tetu",nullptr}) {}; しかしこれはどういう意味だろうか? clsA <−− (const char* const []){"mike","tetu",nullptr} ラムダ関数?かとおもったが、前半はcastだろうか? m_name <−−name clsA <−− {"mike","tetu",nullptr} この二つがセットで意味を持つんだろうな。 const char *[] の初期化が3つくらいあったらどうするんだろうね。 まるでクイズを解いてるみたいだよ。 いくらなんでも言語仕様としてやはり不味いよね。
990 名前:デフォルトの名無しさん [2018/06/25(月) 04:00:03.54 ID:3f3crQyZ.net] わかった。コンストラクタに引数がないディフォールトでは clsA <−− {"mike","tetu",nullptr} そしてm_nameは一つしかないから、m_name= {"mike","tetu",nullptr}となる。 引数を持つ場合は clsA(const char* const name[]) : m_name(name) {}; m_name <-- name; になる。 じゃあconstのメンバ変数が二つある場合はどうするんだろうか? clsA:clsA( {"xxx"}),clsA({"yyy"}) {} とは書けない。変数を明示しないといけないから、、、 clsA:m_name1( {"xxx","abc"}), m_name2({"yyy","def"}){} 必然的にとなる。 じゃあ最初から clsA:m_name1( {"xxx","abc"}){} こう書いていた方が分かりやすいし、これが成り立たないと論理破綻する。
991 名前:デフォルトの名無しさん [2018/06/25(月) 04:04:26.64 ID:3f3crQyZ.net] class clsA{ private: const char* const* m_name1; const char* const* m_name2; public: clsA() : m_name1((const char* const []){"mike","tetu",nullptr}), m_name2((const char* const []){"mike2","tetu2",nullptr}) {}; clsA(const char* const name[]) : m_name1(name) {}; void put(){ for(const char* const * p=m_name1; *p!=nullptr ;++p ) { printf(*p); } }; virtual ~clsA() {}; }; 実験したみたが、コンパイルは通った。
992 名前:デフォルトの名無しさん mailto:sage [2018/06/25(月) 05:56:57.36 ID:MAmRCfEQ.net] >>964 のソースをclangでビルドしたら最初の結果が文字化けする。 環境依存で動作が変わるようなソースコードを参考にしてはいけない。
993 名前:デフォルトの名無しさん [2018/06/26(火) 09:01:37.25 ID:6tjGTw22.net] >>969 template<class ... args> class clsTest { public: void func1(int dt) {} void func1(int dt1, int dt2) {} void func2(args...) { } }; int main() { clsTest<int, int, int> a; clsTest<int, int, char *> b; a.func2(2, 3, 4); b.func2(5, 6, (char *)"test"); a.func1(2); a.func1(2, 3); return 0; }
994 名前:デフォルトの名無しさん mailto:sage [2018/06/28(木) 10:37:33.14 ID:dRU/pr3A.net] c++です LNK2005 DllMain は既に vstplugmain.obj で定義されています 1>vstplugmain.obj : error LNK2005: DllMain は既に vstplugmain.obj で定義されています。 左と右が違うファイルだったら順序を入れ替えるだけでよかったのですが 両方vstplugmain.objで困ってます どのようにすれば解決できるでしょうか?
995 名前:デフォルトの名無しさん mailto:sage [2018/06/28(木) 11:09:44.92 ID:9ql/FcZD.net] 自動でリンクしてるライブラリと明示的にリンカに渡
996 名前:してるパス違いの同じライブラリで衝突してんんじゃないの? 知らんけど [] [ここ壊れてます]
997 名前:デフォルトの名無しさん mailto:sage [2018/06/28(木) 11:44:03.03 ID:dRU/pr3A.net] 検索してみたのですが vstplugmain.objは一つしか無いようです
998 名前:デフォルトの名無しさん mailto:sage [2018/06/28(木) 12:06:53.39 ID:dRU/pr3A.net] もしかしたら関係あるのかもしれないので参考までに記述します 以下のようなエラーも同時に発生しています vstplugmain.obj : error LNK2001: 外部シンボル ""class AudioEffect * __cdecl createEffectInstance(__int64 (__cdecl*)(struct AEffect *,int,int,__int64,void *,float))" (?createEffectInstance@@YAPEAVAudioEffect@@P6A_JPEAUAEffect@@HH_JPEAXM@Z@Z)" は未解決です。 LNK2001 外部シンボル ""class AudioEffect * __cdecl createEffectInstance(__int64 (__cdecl*)(struct AEffect *,int,int,__int64,void *,float))" (?createEffectInstance@@YAPEAVAudioEffect@@P6A_JPEAUAEffect@@HH_JPEAXM@Z@Z)" は未解決です。 Dll6 source\repos\Dll6\Dll6\vstplugmain.obj 1 よろしくおねがいします
999 名前:デフォルトの名無しさん mailto:sage [2018/06/28(木) 17:14:50.29 ID:hh115pnF.net] エラーログの上から順番に解決するようにしたらいい
1000 名前:デフォルトの名無しさん mailto:sage [2018/06/29(金) 09:50:56.72 ID:8ZX2E7EU.net] 無事解決しました ありがとうございました
1001 名前:デフォルトの名無しさん mailto:sage [2018/06/29(金) 10:22:32.55 ID:h8zo0ENm.net] >>981 そういう場合は、経緯を説明するのが、考えようとしてくれた人への礼儀。
1002 名前:デフォルトの名無しさん [2018/06/29(金) 10:53:16.69 ID:OiiVA+37.net] ロベールのC++の本の typedef の説明ですが、よく分かりません。 typedef int* IntPtr; int n = 0; const IntPtr p = &n; IntPtr const q = &n; はどちらも、 int* const p; int* const q; の意味になるそうです。 分からないのは、ロベールさんの解釈の部分です。 const int* p; → 「const の右側にあるものが const になる」 int* const q; → 「const の右側にあるものが const になる」 と解釈すればよいと説明してます。 この解釈が const IntPtr IntPtr const の場合にも通用するというのです。
1003 名前:デフォルトの名無しさん [2018/06/29(金) 10:53:56.86 ID:OiiVA+37.net] const IntPtr = const int* IntPtr const = int* const ではないのでしょうか?
1004 名前:デフォルトの名無しさん [2018/06/29(金) 10:55:12.72 ID:OiiVA+37.net] const IntPtr p = &n; IntPtr const q = &n; ↑「const の右にあるのは p や q なので、 p や q が const になるのです。」 と説明していますが、これが意味不明です。
1005 名前:デフォルトの名無しさん [2018/06/29(金) 10:56:58.22 ID:OiiVA+37.net] >>985 の論法を↓に適用すれば、 const の右にあるのは p や q なので、 p や q が const になるのです。 となってしまいますが、 p は const ではないですよね。 q は const ですが。 const int* p; int* const q;
1006 名前:デフォルトの名無しさん mailto:sage [2018/06/29(金) 11:34:56.01 ID:rwm1MJ+D.net] >>983 マクロで IntPtr を int * と定義した場合は >>984 のように展開されるけど typedef はマクロじゃないので int * 型のシノニムとして IntPtr 型を作る const int と int const もどちらも const の int であるのと同じように int を IntPtr 型に置き換えて考えれば どちらも int * const と同じ意味になると思うよ
1007 名前:デフォルトの名無しさん mailto:sage [2018/06/29(金) 12:00:29.81 ID:nFp4wdEK.net] i.csvには1行に名前と整数値で点数3つ書かれているのが10行あり、読み込んで点数の和を加えて表示しようとしましたが和が出てきません。また¥nを打っているのに改行されないです。理由を教えてください。配列にしたのはこの後にも操作をするためです。 #include <stdio.h> #include <stdlib.h> int main(void) { const char ifname[] ="i.csv"; int a,b,c; char name[30][100]; int sum[30]; int i; FILE *ifp; ifp=fopen(ifname,"r"); /*読み込み込みモードでopen*/ if(ifp==NULL){ printf("ファイルが開けない"); exit(1); } for(i=0;i<=29;i++){ if(fscanf(ifp,"%s%d%d%d",name[i],&a,&b,&c)==EOF) break; else sum[i]=a+b+c; printf("%s %d %d %d %d\n",name[i],a,b,c,sum[i]); } fclose(ifp); }
1008 名前:デフォルトの名無しさん mailto:sage [2018/06/29(金) 12:06:09.83 ID:nFp4wdEK.net] 10行ではなく30行でした、すみません
1009 名前:デフォルトの名無しさん [2018/06/29(金) 12:10:17.92 ID:OiiVA+37.net] >>987 ありがとうございました。
1010 名前:デフォルトの名無しさん mailto:sage [2018/06/29(金) 12:40:26.79 ID:nFp4wdEK.net] 988ですが自力で解決出来たので大丈夫です
1011 名前:デフォルトの名無しさん [2018/06/29(金) 14:45:38.42 ID:+YHimQiw.net] Windows10で、デスクトップのアイコンと壁紙の間のレイヤーに描画したいです。 どのように設定すればいいでしょうか? VisualStudio2017/C++
1012 名前:デフォルトの名無しさん mailto:sage [2018/06/29(金) 14:50:24.25 ID:+YHimQiw.net] 何がしたいかというと、カレンダーを表示させたいです。
1013 名前:デフォルトの名無しさん mailto:sage [2018/06/29(金) 14:52:35.06 ID:+YHimQiw.net] 小出しですみません。カレンダー機能はMFCで作成済みです。
1014 名前:デフォルトの名無しさん [2018/06/29(金) 22:49:34.96 ID:DjTQOr6S.net] 無理でしょうか?
1015 名前:デフォルトの名無しさん mailto:sage [2018/06/29(金) 23:03:37.60 ID:DjTQOr6S.net] C#ですが、方法が見つかったので自力でやってみます。 https://www.codeproject.com/Articles/856020/Draw-Behind-Desktop-Icons-in-Windows-plus
1016 名前:デフォルトの名無しさん mailto:sage [2018/07/01(日) 01:14:10.80 ID:UA/DrxK6.net] t
1017 名前:デフォルトの名無しさん mailto:sage [2018/07/01(日) 01:14:30.62 ID:UA/DrxK6.net] v
1018 名前:デフォルトの名無しさん mailto:sage [2018/07/01(日) 01:14:47.85 ID:UA/DrxK6.net] g
1019 名前:小倉優子 mailto:sage [2018/07/01(日) 01:15:06.26 ID:UA/DrxK6.net] ∧,,,∧ ( ・∀・) 1000ならジュースでも飲むか ( ) し─J
1020 名前:1001 [Over 1000 Thread.net] このスレッドは1000を超えました。 新しいスレッドを立ててください。 life time: 238日 8時間 41分 31秒
1021 名前:過去ログ ★ [[過去ログ]] ■ このスレッドは過去ログ倉庫に格納されています