1 名前:デフォルトの名無しさん [2008/03/30(日) 01:50:26 ] エスケープシーケンスやWin32APIなどの環境依存なものでもOK。 ただしその場合、質問者は必ず環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.50【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1204124447/ 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
720 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 22:13:39 ] C言語ならこんなもんか void f1() { int n, i; for(n = 1; n <= 10; n ++) { for(i = 0; i < n; i ++) putchar('*'); putchar('\n'); } } void f2() { int n; for(n = 1; n <= 10; n ++) puts("**********" + 10 - n); } void f3() { int n; for(n = 1; n <= 10; n ++) printf("%.*s\n", n, "**********"); }
721 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 00:27:56 ] printfの書式でもっと簡単にできなかったっけ? イメージ>>720 のf3()が近いんだけど・・・使う機会が少ないとすぐにわすれちゃうな・・・
722 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 00:38:10 ] >puts("**********" + 10 - n); このやり方はじめて見た。目から鱗やわ
723 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 00:42:59 ] >>722 その鱗はつけておいた方がいいw
724 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 02:36:32 ] 課題でc++のbasic_stringの様なstringクラスを作っています。 その中でstr >> coutはクラス内でoperator>>を用意することで 動くようになったのですが、cout << strは「二項演算子<<はクラス strをサポートしていません」と言われてしまいます。 これはどのようにしたらcout << strが出来るようになるのでしょうか? またお恥ずかしながら、str = "aaa"は作れたのですが、str ="aaa"+"bbb"は 作ることが出来ませんでした。これはどの様に作ったらいいのでしょうか? どうかよろしくお願いします。
725 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 02:46:22 ] なんか物凄く基本的なことのような気がしますが C言語で、unsigned char から signed char に代入、もしくはその逆を行った場合、ビットバターンは常に保存されますか?
726 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 02:55:53 ] >>725 いいえ。
727 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 03:01:40 ] >>724 上:strをサポートする二項演算子を書く。 basic_ostream<foobar> & operator <<(basic_ostream<foobar> & os, str & st); 下:無理。
728 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 03:02:50 ] >>726 ありがとうございます。そうなると char* を適宜 unsigned char* にキャストしたりしないとダメですね。 一部バイナリが混ざってるファイルを読む必要があったので助かりました。
729 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 03:58:13 ] >>728 K&R2 A6.1 (promotion) を参照してください。 char/unsigned char は先に int に変換される点、特に要注意です。
730 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 04:09:29 ] >>729 promotion は関係ないだろ。
731 名前:729 mailto:sage [2008/04/16(水) 04:57:02 ] >>730 char c = 0x81; if (c == 0x81) printf("=\n"); else printf("!=\n"); の結果って、あれ〜?!ってなりませんか?
732 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 11:52:33 ] >>731 char が符号付きで最大値が 127 の場合の話なら、 char c = 0x81 の時点で未定義動作。 問題は promotion じゃなくてオーバーフロー。
733 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 12:09:54 ] 0x81がunsigned charじゃないじゃん
734 名前:732 mailto:sage [2008/04/16(水) 12:20:21 ] > char c = 0x81 の時点で未定義動作。 ごめん。間違い。オーバーフローが問題なのは違いないけど、型変換での オーバーフローは未定義動作じゃなくて、値が処理系定義のものになるか、 処理系定義のシグナルが発生する、らしい。
735 名前:729 mailto:sage [2008/04/16(水) 20:42:23 ] >>732 >>734 了解いたしました。 char buffer[N]; ... while (fgets(buffer, N, fp) != NULL) { if (buffer[i] == ...) ... } などと安易に考えると、(たとえば漢字コードの判別など)わからなくなってしまった経験がありました。 unsigned char buffer[N]; とすれば、問題ないのではありますが。 ご指摘ありがとうございました。 またひとつ賢くなりました。
736 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 20:49:18 ] >>735 漢字コードをいろいろ扱うなら >>735 だと unicode の時に困るんじゃなかろうか? (文字列に \0 が含まれる可能性が高いから)
737 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 21:04:51 ] C++では以下のように大丈夫そうですけど。 signed char と unsigned char は同表現と書いている 読み間違い? A char, a signed char, and an unsigned char occupy the same amount of storage and have the same alignment requirements (3.9); that is, they have the same object representation. For character types, all bits of the object representation participate in the value representation. For unsigned character types, all possible bit patterns of the value representation represent numbers.
738 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 01:47:49 ] >>737 読みには自信ないのですが、 単に、 1) char/unsigned char/signed char のいずれも同じ量のメモリを占有する。 2) char/unsigned char/signed char のアラインメント(配置位置、偶数バイトを先頭にする、アドレスが4 の倍数のバイトを先頭にする、など)が同一である。 という意味でのみ same としているだけではないでしょうか。 char / unsigned char / signed char の表現がまったく同一であるというのは不可能と思われますのですが。 後続の文では、 char のすべてのビットが数をあらわしているわけではない(単に関係するといっているだけ、符号の場合もありますよ、ということでしょうか。) unsigned char はすべてのビットが数を構成する要素となる。 と読めます。
739 名前:デフォルトの名無しさん [2008/04/17(木) 07:16:24 ] template <class T> template <typename T> この2つはちがいがありますか?
740 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 07:21:28 ] 違いは無い
741 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 08:20:34 ] class じゃないのも使うよなーとか思っていつも typename にする俺
742 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 08:26:55 ] 俺もある時期から、typenameが手癖になってしまった。 別にこだわるわけじゃないから、もし仮にclassと書いてくれと職場で言われたら 二つ返事でclassにするけど。
743 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 08:30:00 ] なんとなく表明の意味で使い分けるかも。 その後しっかり中でstatic_assertするけどね。
744 名前:デフォルトの名無しさん [2008/04/17(木) 10:03:28 ] クラス配列をnewで生成する時に呼ばれるコンストラクタを指定できますか?
745 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 10:06:12 ] 残念ながらできない。
746 名前:デフォルトの名無しさん [2008/04/17(木) 11:04:06 ] strcatを使わずに char src[ ] = "seikima" char dest[4] = "tsu" という文字列を結合し、表示させることが出来ますか?
747 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 11:10:49 ] >>746 char result[11]; sprintf(result, "%s%s", src, dest); printf("%s\n", result);
748 名前:746 [2008/04/17(木) 11:14:54 ] 746です。言葉足らずでした。 sprintfも使わずにforを使って何とか表示させたいのですが いかがでしょうか?
749 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 11:25:24 ] >>747 じゃないがやっつけ仕事なんで間違ってたらごめん char ret[11]; for(int i =0 ; i < strlen(src) ; i++) { ret[i]= src[i]; } for(int i=0 ; i <strlen(dest) ; i++) { ret[i+strlen(src)}=dest[i]; } printf("%s\n",ret);
750 名前:746 [2008/04/17(木) 11:27:20 ] >>749 >>746 に書いたんですが、今回string.hに関するものは使っちゃいけないので strlenも使用出来ない感じです。
751 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 11:34:17 ] >>746 にそんなこと書いてNEEEEEEEwwwww strlen()をsizeof()-1に変えれば同じ動作だ
752 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 11:37:17 ] >>746 条件後だししすぎ char result[20], *p, *q; for(p=result,q=src;*p++=*q++;); for(p--,q=dest;*p++=*q++;);
753 名前:746 [2008/04/17(木) 11:46:22 ] 重ね重ね、申し訳ないです。 ポインタも使ってはいけないようです。
754 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 11:50:24 ] 宿題かよ。消えろ。
755 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 11:51:00 ] ついでに、その出題者はぶん殴っていい。
756 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 11:55:25 ] 宿題なら学習内容に沿ってるはずだから テキストでも目を通した方が早いんじゃないの? 何の項目についての課題か分からないんじゃ答えようがないわ
757 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 11:57:30 ] 入念な釣りだなあ。 次は「 [] 演算子も使えません 」とか?
758 名前:746 [2008/04/17(木) 11:59:26 ] 一旦、整理してみます。 課題:配列について 内容:char src[ ] = "seikima"; char dest[4] = "tsu"; と配列を用意し、destの中身をsrcに結合させる。 ただし、for文を使うこと・ポインタ、string.hは使ってはならない。
759 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 12:03:12 ] >>758 宿題は宿題スレへ。 C/C++の宿題を片付けます 105代目 pc11.2ch.net/test/read.cgi/tech/1208268461/
760 名前:746 [2008/04/17(木) 12:03:56 ] >>759 誘導ありがとうございます。ご迷惑をおかけしました。
761 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 12:06:07 ] 連結するための容量は確保しなくていいのか、とか dest を書き換えずに src に書き込むのか、とか、 宿題にしてもクソすぎるだろ。学校名晒してくんない?
762 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 12:12:22 ] 746の時点で明らかに宿題じゃないか。なにを今更
763 名前:デフォルトの名無しさん [2008/04/17(木) 12:21:40 ] printfの様な、引数の数が一定しない関数を作るにはどう定義し 中でどう読めば良いのでしょか。
764 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 12:25:31 ] Cで標準ライブラリが用意されてない環境なら、自動的に>>758 の条件に 近くなると思うけど、ポインタも駄目てのは解らん。
765 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 12:30:14 ] >>763 関数のオーバーロードとかでできんじゃね
766 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 12:30:41 ] 可変長引数でぐぐる
767 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 12:30:53 ] >>763 ttp://wisdom.sakura.ne.jp/programming/c/c62.html
768 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 12:31:06 ] >>763 可変長引数とかva_argsなんかでググるといいと思うよ。
769 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 12:31:25 ] >>763 可変引数または可変個引数でぐぐる
770 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 12:34:09 ] 重婚もいいところだな
771 名前:763 mailto:sage [2008/04/17(木) 12:37:07 ] 有り難うございます。 stdarg.hなんてヘッダ、目にした事すらありませんでした。
772 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 12:40:07 ] ところで可変長引数って設計的にどうなのかな? 個人的には設計に失敗してやむなく・・・ってイメージがあるのだが
773 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 12:45:05 ] ハックやチートの部類に入りそうなやり方してるよね。
774 名前:763 mailto:sage [2008/04/17(木) 12:46:42 ] >>772 **でも事足りるんですが、その場でわざわざポインタの配列を用意しないと いけない場合が出てくるだろうし、その場で列挙出来たら楽かなぁとか。
775 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 12:50:54 ] >>772 型安全性に問題があるから、特に C++ ではやむなくって意識でいいと思う。 C++ 的には iostream や boost::format みたいに演算子で繋ぐのが正解かな。
776 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 22:15:48 ] CかC++の組み込みの勉強したいんですがお勧めの本ありませんか? 組み込みの本って探してもどこにも無いし、ネットで買おうにも中身がどんな感じかも分からないんでどれを買えばいいのか分からないです あとできれば必要で組み込み初めてに適した機材とかも教えて欲しいです
777 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 23:24:03 ] ソフィアシステムズで評価ボードを買ってBSPをいじって動作確認すればいいお^^
778 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 00:41:53 ] 以下の2つは戻り値以外に何か違いがありますか? fwrite(buf, 1, 1024, fp); fwrite(buf, 1024, 1, fp);
779 名前:デフォルトの名無しさん [2008/04/18(金) 00:45:24 ] 沢山の実数(doubleとか)が生成されるときに、その分散を計算したいんですが、これってやはり一度生成される全部の実数を どこか配列とかに格納しないとだめでしょうか?
780 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 01:00:21 ] >>779 分散=(X^2 の平均) - (Xの平均)^2 を使用すれば、1pass で計算できますよ。
781 名前:デフォルトの名無しさん [2008/04/18(金) 01:04:09 ] 値が生成されるたびに、X^2とXの平均を計算しておくのですね。
782 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 01:07:17 ] 逐一平均を計算するんじゃなくて、合計値と要素数を記憶だな。 最後にまとめりゃOK
783 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 01:23:46 ] >>778 もしかしたら処理速度が変わるかも・・・ね?
784 名前:デフォルトの名無しさん [2008/04/18(金) 02:02:27 ] 色々ありがとうございました。クラスをつくってみました。 class stat { public: stat() : sum(0), sum_square(0), num(0) {} void push(double a) { sum += a; sum_square += a*a; ++num; } double mean() { return sum / num; } double variance() { return sum_square/num - (sum/num)*(sum/num); } private: double sum; double sum_square; int num; };
785 名前:デフォルトの名無しさん [2008/04/18(金) 07:50:12 ] 意図した通りに受け取れないのですが、なぜでしょうか。 「GCCではgetche」の行のprintf()をコメントアウトするとちゃんと取れるのですが #include <stdio.h> int main(void) { int for1inc = 0; char userinput = 0; for(for1inc=0; for1inc < 10; for1inc++) { printf("文字を入力 : \n (GCCではgetche()が使えず改行コードと共に入力されるので5回までしか入力不可) \n\n"); userinput = getchar(); printf("Your input is %c. ""%c"" ASCII code is %d. \n", userinput, userinput, userinput); for( ; userinput; userinput--) { printf("%c", '.'); } printf("\n"); } return 0; }
786 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 09:32:34 ] >>778 >783の戯言はさておき、途中でエラーが発生したときの扱いが違う。 前者は書き込みに成功したバイト数が得られるが、 後者は1024バイト全てが書き込めたかどうかしか判らない。
787 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 10:10:31 ] >>786 それが戻り値の違いなんでしょ。
788 名前:141 [2008/04/18(金) 10:29:25 ] すみません。以下のコード、BCCでは一応正常にファイルから 読み込んで画面に表示してくれますが、VC++では表示してくれ ません。プログラムで何か処理が抜けているんでしょうか? #include "stdafx.h" // VC++の場合 #include <iostream> #include <fstream> using namespace std; int main() { int i; double x,y; ifstream fin; fin.open("aaa.dat"); while(fin >> i>> x >> y) cout << i << ' ' << x <<' ' << y << endl; fin.close(); // cin>>i; // VC++の場合 return 0; } aaa.datの中身(テキスト) 1 10.0 12.3 2 20.0 20.5 3 30.0 30.8 4 40.0 50.6
789 名前:デフォルトの名無しさん [2008/04/18(金) 10:39:04 ] ↑名前の141、以前のもので意味はありません。
790 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 11:04:56 ] VC9で普通に動いてるけど。
791 名前:デフォルトの名無しさん [2008/04/18(金) 11:14:42 ] メイン文で使っている*argv[]をユーザ関数内で使いたいので ユーザ関数では仮引数をchar **a[]にしているのですが、実引数は何にすればいいのか分からないので教えて下さい
792 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 11:15:46 ] >>791 argv そのまま渡せるように引数も同じ型にしとけよ。
793 名前:デフォルトの名無しさん [2008/04/18(金) 11:27:51 ] >>792 argvをそのまま渡すようにするには、ユーザ関数の仮引数と呼び出す際の実引数は何にすればいいのでしょう?
794 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 11:30:16 ] >>793 仮引数は main にある argv と「同じ型」、実引数は argv 。これでいいか?
795 名前:デフォルトの名無しさん [2008/04/18(金) 11:48:44 ] >>794 分かりました、ありがとうございました。
796 名前:デフォルトの名無しさん [2008/04/18(金) 13:36:50 ] >>788 エラーとかじゃなくて単に何も表示されない?
797 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 13:39:11 ] ファイルの置き場所ミスってるだけじゃねーの?
798 名前:788 [2008/04/18(金) 15:50:11 ] VC++2008 Express Editionでdebugモードでコンパイルし、 データファイルaaa.datをdebugフォルダに入れて実行ファイル を実行すると正常に実行されます。ですが、統合環境では何も 表示されないです。 Projects\test\test (testは私がつけたプロジェクト 名のフォルダ) というフォルダにデータファイルを置 くと統合環境ではうまくいくようです。しかし、こん なこと最初はわかんないよ。
799 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 15:55:53 ] >>798 フルパスでファイルを扱うのでなければ、カレント ディレクトリをちゃんと意識するようにしないと。
800 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 16:00:30 ] is_openでちゃんと開けたか確認したほうがいいよ
801 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 16:29:49 ] open使わずに std::ifstream fin("..."); てやったほうがいいよ close後何も処理しないのならcloseも不要だよ
802 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 18:12:43 ] C++やろうと思うんですけど、オススメの教本教えてください Cとjavaは一応できます
803 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 18:15:06 ] boostのソースコード(無料)(偏差値70)
804 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 19:10:22 ] メモリは並列にアクセスできますか? 例えばHDDだと2台あればパフォーマンス落ちずに同時アクセスできますが
805 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 19:17:44 ] >>804 NUMAとかそーいうキーワードで調べてみるといいと思う。
806 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 19:38:09 ] >>777 ありがとう。評価ボード調べてみたらくそ高けぇw ごめんなさい勉強用程度なら1万程度もあれば揃うだろうとなめてました
807 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 19:42:52 ] >>806 こんなのから始めた方がいいよ。 ttp://hijiri3.s65.xrea.com/sorekore/develop/pic/00_start.htm
808 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 19:51:44 ] >>807 d これは面白そう もうちょっとググって組み込みのこと勉強してきます
809 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 20:07:21 ] >>805 トンクス!
810 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 20:32:22 ] >>785 提示されたコードをコンパイルしましたが、特に異状はないと思います。 環境とコンパイルオプションを教えてください。 当方が確認した環境は WindowsXP, コンパイラはgcc3.4.4(cygwin)です。 kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6272.txt
811 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 22:15:10 ] >>798 [プロジェクト]-[プロパティ]-[構成プロパティ]-[デバッグ]-[作業ディレクトリ]
812 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 22:41:28 ] #include <stdint.h> はどの環境でも使えますか? とブーストとかSTL portとか入れればどれでも使えますか? 32bit環境で、64bit整数のビット演算、掛け算の速度をかなり速いです 使い物になるので使いたいのですが互換性はなかなかあるんですか
813 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 22:42:11 ] 文書が色々とおかしいです エスパーでおねがいします
814 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 22:55:18 ] VC2008で対応していなかった為、stdint.h使うのをやめることにしました
815 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 22:56:44 ] わかりました がんばってください
816 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 22:58:30 ] >>812 > #include <stdint.h> はどの環境でも使えますか? いいえ。 > とブーストとかSTL portとか入れればどれでも使えますか? いいえ。 > 32bit環境で、64bit整数のビット演算、掛け算の速度をかなり速いです いいえ。 > 使い物になるので使いたいのですが互換性はなかなかあるんですか いいえ。
817 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 23:08:19 ] 日本語学びたての外国人か コンピューターにものすごい興味がある赤ん坊のどちらかだな。
818 名前:デフォルトの名無しさん [2008/04/18(金) 23:22:53 ] 外国人の人だと思うので、添削してみました。頑張ってね。 初心者なのですが、いくつか質問させてください。 #include <stdint.h>はどの環境でも使えますか? boostとかSTL portとかは、インストールすれば使えますか? 32bit環境で、64bit整数のビット演算、掛け算がかなり速くできて、 使い物になりそうなので使いたいのですが、互換性についてはどうでしょうか?
819 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 23:23:06 ] std::vector<std::string> vtSource; を UTF16 に変換して std::vector<std::wstring> vtDest; に保存したいと思っています. // string >> wstring 変換関数(中身はダミー) std::wstring A2WString(const std::string& strSource)) { return std::wstring(L"out"); } この変換関数での変換は以下のコードでできました. std::vector<std::string> vtSource; std::vector<std::wstring> vtDest; vtSource.push_back( "AbC" ); std::transform( vtSource.begin(), vtSource.end(), std::inserter( vtDest, vtDest.end() ), A2WString ); しかし,変換関数にデフォルト引数があるとコンパイルエラーになりました. std::wstring A2WString2(const std::string& strSource, int i=0)//デフォルト引数がある { return std::wstring(L"out"); } transform 第4引数で bind2nd や ptr_fun を使用すればいいような気がするんですが,どのように書けばいいんでしょうか? std::transform( vtSource.begin(), vtSource.end(), std::inserter( vtDest, vtDest.end() ), std::bind2nd( std::ptr_fun(A2WString2), 0) );//コンパイルエラー Window2000 Visual C++ 2005 express edition
820 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 23:26:01 ] >>812 C++なら、Boostを入れると<boost/cstdint.hpp>が使える。 名前空間boostに入っていること以外はだいたいC99の<stdint.h>と同じ。
821 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 23:27:47 ] >>819 いったん別の関数を挟めばいいはず。 inline std::wstring A2WStringHelper(const std::string& strSource) { return A2WString(strSource); } こういうものを作って、std::transformにはこれを渡す。
822 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 23:54:40 ] スタティックテキストのプロパティCaptionを変更するにはどうすればいいんですか? IDC_STATIC.Caption("aaa"); で動かないんですけど
823 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 00:01:09 ] IDC_STATIC.Caption = "aaa"; GetDlgItem(IDC_STATIC)->Caption = "aaa"; これでも動きません
824 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 00:09:19 ] >>822 IDC_STATICは言わばワイルドカードなので、 キャプションを変えたいスタティックテキストに個別のIDを割り当てる必要があります。
825 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 00:10:34 ] つーか、そもそも書き方も判ってなくてコンパイルも通らないならエラーメッセージを張れと。
826 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 00:22:56 ] ありがとうございます。名前を付けました GetDlgItem(IDC_STATICTIME)->Caption = "aaa" error C2039: 'Caption' : 'CWnd' のメンバではありません。 となります
827 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 00:27:11 ] IDC_STATICTIME->Caption = "aaa" これだと error C2227: '->Caption' : 左側がクラス、構造体、共用体、ジェネリック型へのポインタではありません。 こういうエラーになります。
828 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 00:27:43 ] Captionなんて無いよ・・・とエラーが教えてくれてるじゃん なんでそんなにCaption大好きなの? GetDlgItem(IDC_STATICIME)->SetWindowText("aaa");
829 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 00:30:40 ] ありがとうございます 別に好きなわけじゃないんです VBの時はこうやっていたので プロパティの項目で設定できないのならVC++で項目の意味はあるんですか? 全部のプロパティの設定方法を調べなきゃいけないんでしょうか?
830 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 00:35:46 ] プロパティ?ダイアログの? あんなのは飾りだ。
831 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 00:39:07 ] 意味があるとしたら、設計時に入れれば、コーディングしなくて良い事ぐらいかな? VCは他もみんなこんな感じだから、VBからだと慣れるしかないな。 プロパティのVisible項目→コーディング時はShowWindow();
832 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 00:44:01 ] OK覚悟はできたwwww
833 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 00:55:43 ] C#を一通りやった者ですが、CよりC++の方が始め易いでしょうか?
834 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 01:08:42 ] C# からなら C は不便に感じると思う。 C++ のがいいかと。
835 名前:819 mailto:sage [2008/04/19(土) 01:46:47 ] >>821 ありがとう.とりあえずそうやればできました. ただ,何でこれは通らないんでしょうか? std::transform( vtSource.begin(), vtSource.end(), std::inserter( vtDest, vtDest.end() ), std::bind2nd( std::ptr_fun(A2WString2), 0) ); A2WString2() の第一引数の参照型をやめたらこれでもコンパイルできましたが, もしよろしければどなたかご教示願います…. //引数の参照型をやめる std::wstring A2WString2(const std::string strSource, int i=0) { return std::wsting(L"out") }
836 名前:デフォルトの名無しさん [2008/04/19(土) 05:07:02 ] JavaとかC#から始めた人はCやC++の世界には入ってこないでください。
837 名前:デフォルトの名無しさん [2008/04/19(土) 07:57:16 ] >>836 どうして?
838 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 09:33:00 ] ガベージコレクタは便利かもしれないが、その便利さゆえに何か重要なことを失くしているような気がする。
839 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 09:33:54 ] 「JAVAスクールの危険」ってはなし?
840 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 09:48:02 ] Java はアレだが、C# はまだマシだと思うけどな。まあ。
841 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 10:27:27 ] >>835 それは有名な参照の参照問題 詳細はSTL バインダで検索して一番上あたりがそのものズバリだと思う 解決策だけ抜きだすとboostのfunctional.hppのboost::bind2ndを使う さらにptr_funを使わずにboost::bind2nd(A2WString2)と書けるところも利点だ
842 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 11:43:18 ] >>837 温室育ちが軍隊に入ったら周りが迷惑するだろ
843 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 11:48:42 ] 軍隊という表現は語弊があるな せめてど田舎とか電気が通ってないとかそういう表現にしないと
844 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 13:06:49 ] その表現もかなりニュアンス違うな。 まぁ、無理して比喩を使う必要はない場面だと思う。
845 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 14:05:31 ] 2chにゆとりが入って来たでおk
846 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 14:06:52 ] >>845 いまいちだな
847 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 14:58:24 ] オートマ車しか乗ったことが無い人が、 マニュアル車に乗る感じとか。 でもC/C++をちゃんと理解して使い始めるなら、良いと思う。 理解するフェーズで挫折する人は、諦めてもらって、 理解するフェーズを無視して使い始める人は氏ねば良いと思うよ。
848 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 15:10:55 ] 1速のままで法定速度維持してエンジン壊すってか。
849 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 15:20:18 ] 「郷に入っては郷に従え」でいいんじゃないかと
850 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 15:21:01 ] > 理解するフェーズを無視して使い始める人は氏ねば良いと思うよ。 多言語から移ってきた人の3割くらいはこれかな・・・?
851 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 15:27:51 ] 映画と小説の共存が可能なように美麗な3Dグラフィックゲームと想像力をかきたてる2Dのドット絵ゲームというのは共存が可能だと思うのだがいかがなものか
852 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 15:31:57 ] ドット絵すらないroguelikeもよろしく
853 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 15:55:49 ] 文字は高尚なドット絵だよ!
854 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 10:27:45 ] ぷァ
855 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 10:48:12 ] *nixのフレームバッファコンソール上でハードウェアアクセラレーションを使って描画とかしたい
856 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 11:39:26 ] すみません 圧縮・解凍DLLを利用して、どの形式のファイルを渡されても 同一の方法で展開することのできるライブラリってありませんか? ファイルをチェックして適切なDLLへ渡すやつです。
857 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 12:11:41 ] >ファイルをチェックして ファイル名で?ファイルの中身で?
858 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 12:12:58 ] ファイルの中身です EXEでも解凍できるやつもあります そういうのも展開したいです
859 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 12:20:41 ] とりあえずは 拡張子判別DLL(ググって) と 統合アーカイバ の組み合わせかな。 exeは知らない。アーカイブ本体をexe末端に付けてるか、 リソースとして持ってるか、とかの方式で変わってくるだろうし。
860 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 12:25:42 ] 対応形式が多いのはXacRett.dllかな
861 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 12:25:40 ] それらを自動でやってくれるのはないかと…
862 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 12:28:04 ] サンクス
863 名前:ミミ [2008/04/20(日) 13:10:19 ] Visual C++ でデバッグバージョンのバイナリを作るときって、 みなさんは名前を変えますか?どんな方法にしてますか? [方法1] Debug も Release も同じファイル名にして、ビルドすると上書きされるようにする。 [方法2] Debug バージョンには _d のようなサフィックスを付ける。 some_d.exe hoge_d.lib など。 [方法3] Debug と Release で出力フォルダを分ける。 bin/Debug/some.exe bin/Release/some.exe など。
864 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 13:23:48 ] デフォルトは方法3だよな。 単独で動かす時はそれで十分やね。 他のアプリから利用する必要がある場合は方法2じゃないと都合が悪い。 方法1は論外っすね。
865 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 14:40:32 ] >>858 そういうものがあるとしたら、そういうフリーのソフトが公開されている筈だよな。 そういう公開ソフトはないのだから、当然そういうDLLはない。 まぁ、>859にある「統合アーカイバ・プロジェクト」辺りを見てこいと。
866 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 15:20:46 ] XacRettで解決したんですけど…
867 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 17:28:14 ] 最近ゲームのプログラムいじってたらprint系で浮動小数が出力できなくなってしまったんだが、 同じようになったことある人いる?いたら解決策とか教えて欲しいです。 症状としては、%fを含むprint系の関数(wsprintfとかvfprintf)を実行すると 「問題が発生したため〜」っていうおなじみのダイアログが出てきて落ちちゃうんです。
868 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 17:30:03 ] 言語再インストール
869 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 18:34:25 ] ウィンドウを作成して、そこにビットマップを表示させたりするDLLを作ってるんだが、 外部からもらったバイナリBMPデータをどういじればいいのか分からん。。。 //--- PAINTSTRUCT psPaint; HDC hWndDC; HDC hMemDC; HBITMAP hBitmap; HGDIOBJ hGdiObj; hWndDC = BeginPaint(g_hWnd, &psPaint); hMemDC = CreateCompatibleDC(GetDC(g_hWnd)); hBitmap = CreateComptibleBitmap(hMemDC, 100, 100); hGdiObj = SelectObject(hMemDC, hBitmap); /* ここでバイナリをhBitmapに設定したい */ BitBlt(hWndDC, 0, 0, 100, 100, hMemDC, 0, 0, SRCCOPY); //--- ビットマップバイナリをどうにかしてhBitmapに突っ込んでやれば良いのかと思ってるんだけど、 方法がわからん… そもそも考え方が間違ってる?
870 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 18:45:57 ] >>869 SetDIBits
871 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 18:59:48 ] CreateDIBitmap
872 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 19:08:32 ] >>867 再現ソースとエラーを張れと何度いったことか
873 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 19:46:11 ] >>872 再現コードの作成はちょっと全体の量も多いし見当もつかないので難しいです・・・。 関係あるとしたらどんなことが考えられるでしょうか?ロケールとか?
874 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 20:00:57 ] >>873 スタックを壊したとか関数テーブルを壊したとか 多分バッファオーバーフローか未初期化ポインタを使って アクセスしてはいけないメモリを壊した可能性が高い
875 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 20:01:01 ] だからエラーメッセージ張れつ〜うの。テンプレに書いてあるでしょ 呼び出し規約とかランタイムとかリンクされるライブラリとか なんかプロジェクトの設定いじったでしょ。それを直せばいい
876 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 20:45:31 ] >>863 デバッグ版はインストール先のフォルダ。 リリース版はインストーラ作成のフォルダ。
877 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 21:22:45 ] >>874-875 レスありがとうございます。以前できていたところがいじってないのに 急になったので875さんの臭いかも知れないけど、気づいたらなってしまってました・・・ BCCでやっててエラーメッセージを取得できる部分が見当たりません・・・。 こういう時ってどうやってメッセージを受け取るんでしょう?すいませんアホで・・
878 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 21:58:31 ] 浮動小数とか言ってる時点でキミがアホなのはみんな分かってるよ
879 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 22:11:33 ] これでまったく関係ない場所でゼロ除算で落ちてたとかだとウケるな
880 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 22:24:46 ] あっwsprintfかw printf系じゃないから%fとか無理 sprintfつかえ
881 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 22:29:26 ] snprintfとかswprintfでもいいよ
882 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 01:09:03 ] >>870 >>871 さんくす。 CreateDIBitmap使ってやってみたらいけた。 表示用のビットマップはCreateCompatibleBitmapで作って、 外部からもらったバイナリを描画するビットマップをCreateDIBitmapで作成 BitBltで転送して実装できたよ ありがとう
883 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 20:49:40 ] >>879 確実にvsprintfで落ちてました。 >>880-881 ダメでした。あきらめます。 親切にレスしてくださった皆様、ありがとうございました
884 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 21:15:55 ] null = new int[10] で確保した領域はどこに存在するの? delete[]しなければ、この確保した領域はプログラムが終了してもずっとそこに存在したままになるの?
885 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 21:18:33 ] >>884 ヒープ領域のどこか 終了したらちゃんと解放される 一部されないOSもなくはない
886 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 21:38:02 ] コンパイル時にtype_infoみたいな感じで静的にクラス名の文字列を取得できる方法ってありますか? テンプレートクラスで例外を投げる時に使いたいんですが・・・
887 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 21:52:34 ] >>886 boostのこの辺のが役に立つかもしれない ttp://www.kmonos.net/alang/boost/classes/enable_if.html
888 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 22:10:44 ] boostって本当にすごいね・・・そんなのも判定できるとは でも型名の取得は厳しいのかな・・・
889 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 01:38:20 ] やっぱりboostでtypeofってのがあって、それで 型名は取得できるのだけど、staticな処理じゃないんだよね。 なのでその用途だとtypeid使うのとあまり変わりない。 ttp://www.kmonos.net/alang/boost/classes/typeof.html
890 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 03:19:09 ] STLをはじめ、テンプレートをよく使いなさい。 型の完全名がカオスになって諦めがつくから。
891 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 04:20:31 ] void CtimerDlg::OnBnClickedButton2() { // TODO: ここにコントロール通知ハンドラ コードを追加します。 msgdlg aaae = new msgdlg(); aaae.Create(IDD_DIALOG1, this); aaae.ShowWindow(SW_SHOW); } このボタンを押すとダイアログウィンドウが一瞬表示されたようにみえるのですが、表示されません。 SW_SHOWがいけないんでしょうか?
892 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 07:09:45 ] それコンパイル通るの?
893 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 07:55:39 ] コンパイルできないし、それが単なるtypoだったとしても資源の管理はどうなってるんでしょうね、と。
894 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 09:21:56 ] コンパイルはできますがやはりaaae.ShowWindow(SW_SHOW);で消滅します
895 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 09:25:14 ] あ、aaaeをポインタにしたら出来ました。
896 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 20:23:53 ] 単にスコープ抜けたから、msgdlgのインスタンスが死亡しただけだろう。
897 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 21:23:39 ] vsprintfについてなんですけど、下記のva_end(..)っているのですか? xx func(const char* format, ...) { char buf[256]; va_list args; va_start(args,format); vsprintf(buf, format, args); va_end(args); // <=== これ必要なんですか? ... }
898 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 21:30:35 ] 規格で、同じネストレベルでva_start,va_endの組で使うことになっている。
899 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 21:32:48 ] 実装によるかも知れんがメモリとかがぶっ壊れるんじゃまいか
900 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 21:49:24 ] すいませんちょっとお聞きしたいのですが、GCCで if(ret = 1){ int dt = 1; } みたいにしたら、 「真偽値として使われる代入のまわりでは、丸括弧の使用をお勧めします」 と言われたので、 if((ret = 1)){ int dt = 1; } みたいにしたら、許してもらえました。 なぜ ((ret = 1)) の方がよいのでしょうか??
901 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 21:52:09 ] >>900 ret==1って書いたらその警告消えてくれるよ。
902 名前:897 mailto:sage [2008/04/22(火) 21:54:54 ] >>898-899 どうも、 ここのサンプルではva_end使ってないんです msdn2.microsoft.com/ja-jp/library/28d5ce15 (VS.80).aspx そして、www.bohyoh.com/CandCPP/C/Library/vsprintf.html ここに、「本関数は、va_endマクロを呼び出さない」 と記述があるんです
903 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 22:00:56 ] >>900 ==の間違いだったりしませんよね?大丈夫?っていう警告だからそういうもんだと思え 別に前の書き方でも問題ない (())の方がよいというわけじゃない
904 名前:900 mailto:sage [2008/04/22(火) 22:05:44 ] >>901 さん >>903 さん なるほど!ありがとうございます!
905 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 22:28:34 ] >>902 VCに限っていえばva_endマクロは何もしないから呼ばなくても問題はない。 しかし、他の処理系で動くとは限らない。
906 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 23:00:01 ] >>902 書かなくてもいい環境が有るとはいえ、プログラムとしては書かないと駄目。 運悪く駄目なサンプルに当たったね。
907 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 23:05:39 ] >>896 なるほど! msgdlg aaae = new msgdlg(); をグローバル領域に持って行っても起動しました。 ポインタの理解が深まりました。ありがとう!
908 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 23:07:36 ] ちょっとぉぉぉぉぉ
909 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 23:13:26 ] これが 「何か適当にいじったら動いた」 という奴か
910 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 23:14:27 ] > グローバル領域 深まってない悪寒
911 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 23:15:55 ] さすがにこれをコンボでくらったら元のソースを自分で書いていたとしてもデバッグしたくなくなるな (だから、その変てこなのは後から馬鹿が弄ったんだってば ><)
912 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 23:18:30 ] >msgdlg aaae = new msgdlg(); このコード、何度見ても謎が残りすぎ。
913 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 23:29:02 ] >891の段階で既に釣りだったんじゃね?
914 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 23:30:42 ] >>907 C++の入門書か入門サイトをもう一度見て回った方が良いと思うぞ。 煽りとかじゃなくて本当に。基礎は大事だから。 とりあえず、理解する必要のあるキーワードとしては、 ポインタ、参照、自動変数、デストラクタ、delete、スコープ、スタック、ヒープ あたりかな。
915 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 23:32:33 ] 釣りなら、それはそれでおk。
916 名前:デフォルトの名無しさん [2008/04/23(水) 00:24:05 ] switchのcase文内で、auto変数を宣言しようとすると、{}をつかってブロックを 作らないとだめですか?
917 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 00:25:05 ] だめです
918 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 00:30:02 ] >>916 例えばこういうことならできる。 switch (value) { int someVar; case 0: someVar = 0; break; case 1: someVar = -1; default: someVar = value; break; }
919 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 00:35:00 ] >>914 レベルアップした気分ですごく満足なのですが もう一度新C++言語入門シニア編上下を読み直してみます・・・ が、ずばり一言でどこがおかしいですか?頭関係以外でおねがいします。
920 名前:デフォルトの名無しさん [2008/04/23(水) 00:35:09 ] >>917-918 ありがとうです。 918はやり方自体知らんかったス。
921 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 01:01:17 ] >>919 頭関係以外で一言にまとめるには、対象が「少数」の「具体的なディテール」である必要がある。 でも君の場合、「基本的な抽象概念」の理解が「幾つも」欠けているように見受けられるから、まとめようがない。 だから>>914 も困った挙げ句 > ポインタ、参照、自動変数、デストラクタ、delete、スコープ、スタック、ヒープあたり という言い方になってるんだよ(これでも親切に用語を絞って挙げてるほう)。
922 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 02:37:20 ] >>919 msgdlg aaae; //○msgdlg型の変数 msgdlg aaae = new msgdlg(); //×msgdlg型の変数にmsgdlg*型の値を代入 msgdlg *aaae = new msgdlg(); //○msgdlg*型の変数にmsgdlg*型の値を代入 一言でいうと,どこがイコールよ?
923 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 07:18:54 ] >>919 void CtimerDlg::OnBnClickedButton2() { // new msgdlg() → msgdlgのインスタンスをヒープに確保。 // // msgdlg aaae = ... → msgdlgのインスタンスをスタックに確保して、 // msgdlg(msgdlg* ptr)に適合するコンストラクタで初期化。(※1) msgdlg aaae = new msgdlg(); ... // 自動変数のaaaeがスコープから外れるのでデストラクタが呼ばれ、 // aaaaが保持していたウィンドウなどが削除される。 // // (※1)のポインタptrをdeleteしていなければメモリリーク。 } が理解出来ていないように見える。 作りたいのがモーダルダイアログなら、 { msgdlg aaae; aaae.Create(IDD_DIALOG1, this); aaaa.DoModal(); } 関数を抜けてもmsgdlgを保持するなら、 グローバルでなくCtimerDlgのメンバにする。
924 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 07:20:43 ] よく見たらeだった。 × aaaa ○ aaae
925 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 09:41:18 ] ビットフィールドは、 unsigned char x : 50; のように元の型を超えていても定義できますか?
926 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 09:43:54 ] unsigned char配列を、38 、 6 、 4 のように分けたいのですが、ビットフィールドで出来ますか? あと、38bitの部分は、=で比較できますか? 無理な場合、別の方法はないでしょうか
927 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 09:51:28 ] このようにしたら、確保する領域は、40bit + 8bitになりますよね? 33 + 7 ではないですよね? class A{ public: bitset<33> a; char b : 7; };
928 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 10:06:17 ] 自己解決しました これで長い列に変換出来ました bitset<40> *p; unsigned char s[5]={1,255,1,255,128}; p=(bitset<40>*)&s; cout<< *p;
929 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 10:53:08 ] そ れ は 偶 然 だ
930 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 11:16:25 ] >>922 >>923 ありがとうございます。すごくよくわかりました。 void CtimerDlg::OnBnClickedButton2() { // TODO: ここにコントロール通知ハンドラ コードを追加します。 int a =0; while(a < 100){ msgdlg *aaae = new msgdlg[100]; aaae[a]->Create(IDD_DIALOG1, this); // エラー aaae[a]->ShowWindow(SW_SHOW); aaae[a]->OnBnClickedOk(); delete aaae[a]; a++; } } error C2819: クラス 'msgdlg' にはオーバーロードされたメンバ 'operator ->' がありません。 これは何がいけないんでしょうか?
931 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 11:32:26 ] 下記のコードを実行したときに test::aaa で内部的に確保されたメモリ(?)が解放されず、 メモリリークが起きてしまっているようで解決方法が見つからず困っています。 STLなどの場合、確保したメモリを明示的に解放する関数などがあるのでしょうか? ( aaa.clear() や aaa.~vector() などは試してみたのですが駄目でした) それとも test::aaa 自体も new で確保して delete で解放したほうが良いのでしょうか? 環境はVC++2005です、よろしくお願いします。 class base { public: ~base(){ destory(); } virtual void destory(){}; }; class test : base { public: std::vector< int > aaa; void destory(){ aaa.clear(); } }; void main(){ void *p; { test *ptest; ptest = new test; ptest->aaa.resize(100); p = (void*)ptest; } //ここではポインタ p の基本クラスが base ということ以外はわからない delete (base*)p; }
932 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 11:39:01 ] デストラクタで仮想関数呼び出すとか馬鹿じゃねーの?
933 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 11:42:12 ] 古い形式のキャスト使ってるとか馬鹿じゃねーの? スマートポインタ使ってないとか馬鹿じゃねーの? いやいや、馬鹿じゃないって。 デストラクタの中から仮想関数呼び出すのはさすがにないけど。
934 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 11:44:25 ] >>930 これはひどい
935 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 11:57:28 ] … ~base() が呼び出されるときは 既に test::destory の実体はなくなっているからでしょうか? 馬鹿ですみません… こういう場合、クラスtestで確保したメモリは どう解放したら良いのでしょうか?
936 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 11:59:40 ] しかも書いてありました。 スマートポインタで調べてみます。
937 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 12:31:15 ] baseのデストラクタにvirtualをつけて上で testに自分のdestoryを呼ぶデストラクタを書けば baseのデストラクタの最初でtestのデストラクタが呼ばれて、testのdetoryが呼び出されるため この場合はmain内部の変更無しでメモリリークがなくなるけど、それじゃ駄目なの?
938 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 13:22:22 ] >>937 ありがとうございます、無事に解放されるようになりました。 いろいろと勉強不足でした。 仮想デストラクタにしないと派生クラスのデストラクタが呼び出されないのはもちろん メンバ変数のデストラクタも呼び出されないということ(?)なんですね。
939 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 13:39:34 ] >メンバ変数のデストラクタも呼び出されない 詳しくは覚えてないが、デストラクタが仮想関数(virtual)であれば、delete演算子が 渡されたポインタから仮想関数テーブルを辿って継承関係を把握できるとか だったと思う(逆に言えば仮想関数でないと把握できない)。 ちなみに勘違いしてそうなので書いておくけど、デストラクタとは ~クラス名();←引数無し のこと。destroyとか勝手に名前つけたらそれはただのメンバ関数だよ。 この場合正しくは virtual ~base();とかだ。
940 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 13:43:43 ] あ、そういえば~base()はちゃんと書いてあるのかw
941 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 14:11:20 ] なるほど…仮想関数テーブルですか、 virtual指定はなんだか漠然としていて理解しにくかったですが なんとなくはどう動作するかが理解できました。 ありがとうございます。
942 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 14:16:49 ] >>930 下のソースはコンパイル可能 行数減らしたから少し見辛いかも >>914 の言うようにポインタと参照について学んだ方がいい struct CTest{ void test(){} }; void f(){ CTest a; CTest* b = new CTest(); CTest* c = new CTest[1]; CTest d[1]; a.test(); (*&a).test(); (&a)->test(); (&a)[0].test(); (*b).test(); b->test(); b[0].test(); (*c).test(); c->test(); c[0].test(); (*d).test(); d->test(); d[0].test(); delete b; delete[] c; }
943 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 14:47:49 ] >>942 感動しました。こんなにわかりやすいの初めてみました。がんばります!
944 名前:デフォルトの名無しさん [2008/04/23(水) 15:37:22 ] 物凄い初歩的な質問なんですが 上手い方法を教えてもらいたくて質問します。 ある文字列があって 1文字ずつ処理していくんですが、 何か文字に変化があった時だけ処理を行いたいのです。 char str[]="ああいうええお";//何か文字列 int len=strlen(str); char current_c; current_c=str[0];//内容を覚える for(int i=0; i<len; i++){ if(current_c!=str[i]){//連続している文字が変われば //処理 } } こんなのを思いついたんですが これだと、1つ目の文字が当然処理されません。 current_c=str[0];//内容を覚える これを current_c=str[0]+1;//内容を覚える として、必ず1回目は処理が行われるようにするのも考えたんですが もっとちゃんとしたスマートな方法があると思うんですが・・・ こういう場合、どうやるのが一般的なのでしょうか?
945 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 15:46:25 ] str[0]+1なんて代入しなくても、0で初期化しておけばいいんじゃないの?
946 名前:デフォルトの名無しさん [2008/04/23(水) 15:48:09 ] >>944 charは1バイトだから平仮名みたいな多バイト文字はうまくゆかないよ。 分かっているならごめん。
947 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 16:11:33 ] >>945 0に相当する文字が来た時に駄目でしょ。
948 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 16:12:08 ] >>944 typedef char val_t; val_t str[]="aabbbcccddee"; typedef val_t* iter_t; for(iter_t begin=str,end=str+strlen(str),back,it=begin; it!=end; ++it){ if(it==begin || *back!=*it){ //処理 back=it; } } (・∀・)
949 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 16:13:42 ] >>947 それはひょっとしてギャグでいってるのか・・・・
950 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 16:19:37 ] >>944 最初に1文字目と異なる値 str[0]+1 で初期化しとけば良いんじゃね? ってのは結構頭の良い発想。凡百の徒には嫌われるけどね。 でもそういうときの current_c は普通 prev_c だな。
951 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 16:22:12 ] >>950 そうか?ムダじゃね?
952 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 16:33:50 ] 一つ目の文字が変わるっていう意味が分からんw
953 名前:948 mailto:sage [2008/04/23(水) 16:41:36 ] struct CTest{ bool operator!=(const CTest& o){ // ... return true; } }; template<typename iter_t> void unique_each(iter_t begin, iter_t end){ for(iter_t back,it=begin; it!=end; ++it){ if(it==begin || *back!=*it){ //処理 back=it; } } } void f(){ CTest v[10]; // v[0] ... unique_each(v,v+sizeof(v)/sizeof(*v)); } (∩゜д゜)アーアーきこえなーい
954 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 16:46:59 ] >>951 今回は文字だから 0 にしときゃ良いけど、 一般に先頭要素または直前のと異なる要素を 判定していくには良い方法だよ。
955 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 16:58:36 ] >>945 の前提条件 nul終端文字列 >>947 の前提条件 文字列 >>950 の前提条件 コピーコンストラクタ operator+ operator!= を持っている型 >>953 の前提条件 operator!= を持っている型
956 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 17:04:34 ] >>955 もう>>944 とは別世界に行ってるなw
957 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 17:31:55 ] PHPやperlでprint を使いながらデバッグするような方法をC++でもやりたいのですが、どうすればよいでしょうか?? そういうデバッグの仕方はC++では難しいのでしょうか。
958 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 17:32:34 ] >>944 ちょっとトリッキー、でもうまいやり方 >>945 一番シンプル >>946 一番重要なレスw >>953 汎用化し杉ワロタw
959 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 17:44:15 ] >>944 #include <algorithm> #include <string> #include <iostream> #include <functional> int main() { std::wstring src = L"ああいうええお"; src.push_back(0); ::setlocale(LC_ALL, "ja_JP.UTF-8"); for (std::wstring::iterator i = src.begin(); *i != 0; ++i) { i = std::adjacent_find(i, src.end(), std::not_equal_to<wchar_t>()); std::wcout << i-src.begin() << *i << std::endl;; } } 終端一つ加えて条件が逆のadjacent_find >>957 エスパーするとコードを読ませて実行時に一時的な値を見るとかならデバッガ gdbとVC付属のやつとか
960 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 17:44:31 ] >>944 は、charの取りうる最大値を指していた場合 +1すると、オーバーする。 >>945 は、処理内容次第では、\0がいきなり来た場合にヤバい。 が、あのプログラムの場合strlenの値がループの実行回数だからOK >953は、恐らく>>944 が本当に必要だったものではない可能性が高いw
961 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 17:47:00 ] >>959 さん なるほどデバッガで変数に格納されてる値を見ることが出来るんですね。 ありがとうございましたm(_ _)m
962 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 17:51:55 ] >>>944 は、charの取りうる最大値を指していた場合 >+1すると、オーバーする。 するってーと current_c=~str[0]; が適切?
963 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 17:53:43 ] オーバーフローしても大丈夫だろ。
964 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 17:55:39 ] あ、一文字目が処理されない
965 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 17:56:06 ] >>963 実動はともかく、規格的にはアウトだろ
966 名前:959 mailto:sage [2008/04/23(水) 18:12:21 ] リベンジ #include <algorithm> #include <string> #include <iostream> #include <functional> int main() { std::wstring src = L"ああいうええお"; ::setlocale(LC_ALL, "ja_JP.UTF-8"); std::wstring::iterator i = src.begin(); if (!src.empty()) { do { std::wcout << *i << std::distance(src.begin(), i) << std::endl; i = std::adjacent_find(i, src.end(), std::not_equal_to<wchar_t>()); } while(i++ != src.end()); } }
967 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 18:15:31 ] そして通告されるeucJP
968 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 19:01:21 ] vectorの配列を作ろうと思い vector<vector<string> > vecStrDim; vector<string> vecStr; string strTest = "test"; vecStr.push_back(strTest); vecStrDim[0].push_back(vecStr); とやってみました。コンパイルは通るのですが This application has requested the Runtime to terminate it in an unusual way. Please contact the application's support team for more information. とでて実行してもデバッグエラーになります vecStrDim[0].push_back(vecStr);が悪いのはわかるのですが、方法が思いつきません どうすればデバッグエラーを対処できるのでしょうか?
969 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 19:06:06 ] >>968 ×vecStrDim[0].push_back(vecStr); ○vecStrDim.push_back(vecStr);
970 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 19:10:40 ] >>969 あわわ……とんでもなく馬鹿なことしてすみません 解決しました
971 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 19:14:36 ] そのコードがコンパイルが通ることが不思議だ…
972 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 19:29:14 ] シングルバイト限定なら、current_cをintか何かにして、charで表現できないデカい値にしとけばいい。
973 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 20:44:51 ] class内で、static付けたものは、配列にしたときコピーは作られないんですよね? すべて同じ物を参照するんですよね
974 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 00:27:08 ] まあ配列にしなくても1つしか実体が存在しないようになるけどな
975 名前:デフォルトの名無しさん [2008/04/24(木) 00:49:34 ] #include <stdio.h> void main(void) { int a; pirntf("何か入力してください\n\n"); scanf("%d",&a); while(1){ printf("ぐははははははは!!\n\a"); } } この程度しか俺は中なので書けません。プログラマーさん お願いします。
976 名前:デフォルトの名無しさん [2008/04/24(木) 00:50:21 ] ↑MISSりました #include<stdio.h> void main(void) { int a,b,c; printf("数字を入力してください\n"); scanf("%d",&a); printf("数字をまた入力してください\n"); rewind(stdin); scanf("%d",&b); printf("数字をまたまた入力してください\n"); scanf("%d",&c); if(a == b == c) printf("等しいです,\n"); else printf("等しくないです,\n"); } これでa==b==cだったら"等しい"と表示させるように組んでるのに 1、1、1以外の数字は入力してもは全部"等しくないです"になるのは なんででしょうか?
977 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 00:52:43 ] >>976 a == b == c は、(a == b) == c と解釈される。つまり、使い方が間違っている。 その場合、恐らくa == b && b == c でいいだろう。
978 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 00:57:13 ] 980あたり、次スレたのむぜ
979 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 00:59:27 ] >>977 おおwなるほど! ありがとうございました^^
980 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 01:11:37 ] >>990 にパス
981 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 01:14:03 ] >>976 移動前のスレのコメントにもありましたが、 「君が参考にしてるものは信用しないほうがいい」 です。void main(...) はまずい。
982 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 01:17:45 ] void main は g++ でエラーになるしな。 gcc だと警告ですむけど。
983 名前:981 mailto:sage [2008/04/24(木) 01:34:22 ] rewind() も、あるのかわからない.....。stdin に対して rewind() ?
984 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 03:35:46 ] 1〜100までの数字でひとつだけない数字があるのでそれを探すという問題なのですが ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6318.cpp でひとつひとつ探す方法はあるのですが 他の方法で、まず 1〜50までの個数と51〜100までの個数を数えて 1〜50が49個 51〜100が50個で1〜50にあるとして 次は1〜25、26〜50とどんどん減らして 26〜38と39〜50の割り切れないときは13と12にしたりなどして 最後2つの数字にし 48が1個 49が0個で49がない数字とするプログラムを作りたいのですが どなたか例みたいなものを書いていただけないでしょうか?
985 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 03:41:23 ] 数えながら2つのファイル(小さい,大きい)に書き出していけばいいんじゃねの?
986 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 03:42:37 ] どこにあるのかわからないなら、ひとつひとつしらべるのが最善
987 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 03:48:07 ] 問題でこのような方法で作りなさいとあるので作りたいんですがダメでしょうか? #include<stdio.h> #define N 100 int main(void){ int min , max , mid; int count1, count2; int data, i; FILE *fp ここまでの指定はあるのですが、今自力でやってみてるんですが どう二つに分けそれ以降どのように区切っていけばいいのかよくわからないんです
988 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 04:42:58 ] 物凄い無駄な処理だなw 再帰呼び出しを使うのが良いよ
989 名前:988 mailto:sage [2008/04/24(木) 04:46:09 ] ああ、ごめん。数字は順番に並んでるわけじゃないのか
990 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 04:54:26 ] 諦めて全部足して5050から引け
991 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 05:18:22 ] #include <vector> //trueならmidより上、falseなら下 bool hilow(int min, int mid, int max, std::vector<int> src, std::vector<int> dst) { dst.clear(); std::vector<int> hi, low; //中間数超と以下でhi, lowに分ける for(size_t c=min; c <= max; c++) { if(src[c] <= mid) low.push_back(src[c]); else hi.push_back(src[c]); } //個数が規定値か調べて多い方を返す if(hi.size() == max - mid ) { dst.swap(hi); return ture; } dst.swap(low); return false; } 続く
992 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 05:33:54 ] 続き void main() { std::vector<int> num; //ファイルからnumに一度全部読み込む //ここは自分で書けるでしょ? int min, mid, max; min = 1; max = 100; do { (max - min + 1) % 2 ? mid = (max - min + 1) / 2 + 1 : mid = (max - min + 1) / 2; if( hilow(min, mid, max, num, num) ) min = mid + 1; else max = mid; } while(max - min > 2); //完了 }
993 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 05:36:05 ] あー色々間違ってたw bool hilow(int min, int mid, int max, std::vector<int>& src, std::vector<int>& dst) dst.clear(); は無し f(hi.size() == max - mid ) { dst.swap(low); return false; } dst.swap(hi); return true; }
994 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 05:37:10 ] 試してないけどこんな感じで良いと思うよ。 中間の出し方は微妙に間違ってるかもしれんので、自分で検証してね。
995 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 05:56:21 ] exeを逆アセンブルしてソースコードに組み込む定番のやり方教えて下さい
996 名前:デフォルトの名無しさん [2008/04/24(木) 06:00:08 ] ソースコードでよくみかける10Lや1Lってなんのことなんでしょうか? 「1Lとは」などで検索したのですが見つかりません。 環境はC++、BCCです。どなたか回答頂ければ幸いです。
997 名前:デフォルトの名無しさん [2008/04/24(木) 06:09:58 ] >>996 整数のあとにつくLはlong intであることを表す。 10はintの10。10Lはlong intの10。
998 名前:デフォルトの名無しさん [2008/04/24(木) 06:31:33 ] >>997 ありがとうございます! long intをキーワードに検索したら大体わかってきました。 long intを代入するときはLをつけるという解釈であってますか?
999 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 06:39:42 ] 違うよ。整数リテラルそのものにも型があるの。 1 は int型 '1' は char型 1.0 は double型 1L は long型
1000 名前:デフォルトの名無しさん [2008/04/24(木) 06:49:16 ] 重ねてありがとうございます! 詳しい説明でよくわかりました(多分)。 単なる1でも勝手にintにされてるんですね。
1001 名前:1001 [Over 1000 Thread] このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。