08/04/14 18:06:40
>>665
横からだけど
a : 10,20,30,40
b : 20,50
この場合多分望む結果は
a : 20
だろうけど、>>665だと間違った結果を返す。
667:デフォルトの名無しさん
08/04/14 18:37:09
vectorやらlistで
vector<int>の要素が
1 2 (空白) 3 4 (空白)
の様に途中に空白をいれることはできるのでしょうか?
668:デフォルトの名無しさん
08/04/14 18:46:45
VC++でPC情報を取得するPGを作成します。
プロジェクト作成は(Win32とか)どれを選ぶのが
適当でしょうか?
669:デフォルトの名無しさん
08/04/14 19:40:07
>>668
Linux+GCCがお勧め
670:デフォルトの名無しさん
08/04/14 19:42:55
.exe が出来るならどれでもいいと思う。
671:デフォルトの名無しさん
08/04/14 20:02:18
とあるクラスに関数を一個追加しようとしたところ
.hファイルに関数の本体を書き出すと正常にコンパイルが通るのに
.cppファイルに書き出すと
C2039 'foo' : 'hoge' のメンバではありません。
となってしまいます
これはどういう事でしょうか・・・
672:デフォルトの名無しさん
08/04/14 20:05:04
ソースを見せれ
673:デフォルトの名無しさん
08/04/14 20:10:42
f´'´ ノ ヽ l 、 \!
l / / // ,.ィ´ !', ト、 ヽ. ヽ
. レ′, / //_,..イ// ,| l |lλぃ い. ',
} / { ‐7Ζ_∠!イ 〃 /リ,}/┤!」l 小 !
ノ i| 八//'゛ -`l 〃 /ノ'´ j ! |l/| iイ/
ヽ|l//イ ャ''Tェ歹''`y゙/ 'ヾ歹¨リ`イ!ノ// まさか、ロリコンじゃないわね・・・
) 〃A ``''''"´ '^ r; `'''"´/クK/
Y/ !トヘ. //// //// /.ィi| ;|
|i( l|`Ti\,___ '⌒) ,∠lj_|iリ
{い ヾLr┤:.:.:.:.`:、__,,..イ;:.::.:./勹_」!
``ァ;=<´ ̄``ヽ:ヽ;‐-/;/``Tr-.、
674:デフォルトの名無しさん
08/04/14 20:13:11
>>671
>.cppファイルに
しか書いてなかったとかいうオチだったら、君が泣くまで殴るのをやめない。
675:デフォルトの名無しさん
08/04/14 20:14:56
>>672
仕事でのデータが含まれてるのでちょっとソースは公開できないですorz
>>674
インテリセンスで関数宣言を確認してから中身を書いてるのでそれはないと思います
676:デフォルトの名無しさん
08/04/14 20:25:23
問題が再現するコードを作ってそれを貼ればいいじゃん。
677:デフォルトの名無しさん
08/04/14 20:27:54
テンプレート関数だったらお前の殴る
678:デフォルトの名無しさん
08/04/14 20:39:03
hppで解決♪
679:デフォルトの名無しさん
08/04/14 20:58:05
リビルドし直したら通った・・・
これはどういう事??
680:デフォルトの名無しさん
08/04/14 21:22:35
VCではよくあること
681:デフォルトの名無しさん
08/04/14 21:53:28
そしてインテリセンスが延々と更新されないことも
682:デフォルトの名無しさん
08/04/14 21:58:23
インテリセンスが嘘つくのも。
683:デフォルトの名無しさん
08/04/14 21:58:43
>>667
vector<int>に整数以外のものは入れられません。
仮に、負値を例外として扱ってよいなら空白の代わりに-1を入れておくと言う手もなくはありませんが、
boost::optionalを使ってみてはどうでしょう。
684:デフォルトの名無しさん
08/04/14 22:18:55
メモリが断片化している場合、ポインタに+1した場合はきちんと断片先に飛んでくれるんですか?
それとも型サイズ分だけ強引にアドレスが+1されるんですか?
685:デフォルトの名無しさん
08/04/14 22:21:43
断片化?
どういう状況を言ってるんだ?
686:デフォルトの名無しさん
08/04/14 22:22:45
vectorではなくdequeの実装を言っているのかもw
687:デフォルトの名無しさん
08/04/14 22:25:23
deque のことなら、イテレータに +1 したら断片化先に飛ぶけどポインタは当然無理だな。
688:デフォルトの名無しさん
08/04/14 22:26:51
>>685
1つのデータがメモリに書き込まれる時は必ず連番のアドレスに配置されるんですか?
689:デフォルトの名無しさん
08/04/14 22:27:37
>>688
少なくとも仮想アドレスは連番だが。
物理アドレスは知らんがな。
690:デフォルトの名無しさん
08/04/14 22:28:51
STLとかboostみたいので
RECTとかSIZEを包んだクラスはありますか?
691:デフォルトの名無しさん
08/04/14 22:31:41
CRectならMFCにあるけどな…
692:デフォルトの名無しさん
08/04/14 22:31:51
WTLにも
693:デフォルトの名無しさん
08/04/14 22:32:58
>>689
つまり&で表示されるアドレスは仮想でWindowsが物理メモリの番地とリンクを取って隙間に埋め込んでるから考えなくていいってことですね
ありがとうございました。
694:デフォルトの名無しさん
08/04/14 22:38:39
>>693
それでいいのか?
本当にそれでいいのか?w
695:デフォルトの名無しさん
08/04/14 22:43:16
C++でプロパティー的なものを表現する場合
getとsetはつけたほうがいいの?それともOR?
696:デフォルトの名無しさん
08/04/14 23:04:14
漢は黙ってpublic:
697:デフォルトの名無しさん
08/04/14 23:06:53
それだとブレークポイントはれないじゃん・・・。
698:デフォルトの名無しさん
08/04/14 23:15:52
__declspec(property(get=getHoge, put=setHoge))
int Hoge;
699:デフォルトの名無しさん
08/04/14 23:43:26
winsockのsock関数の第一引数にAF_BTHを指定すると、AF_BTHが定義されていないとエラーがでます。
winsock2.hはインクルードしてるんですが、ほかになにかインクルードしなければいけないんでしょうか?
700:デフォルトの名無しさん
08/04/14 23:55:47
grepかけたらws2bth.hででてきたけど。
701:デフォルトの名無しさん
08/04/15 00:24:06
std::list<int> iListの参照を作りたいのですがこの場合
std::list<int>& refList = iList;
で良いのでしょうか?
702:デフォルトの名無しさん
08/04/15 00:31:23
アドレスを比べてみたらいいと思うよ
703:デフォルトの名無しさん
08/04/15 00:39:51
>>702
簡単に試してみたけど
大丈夫そうな気がしました
704:デフォルトの名無しさん
08/04/15 00:54:33
C言語での構造体の初期化について質問です。
typedef struct Foo_tag{
int a;
int b;
int c;
} Foo;
というような構造体があったときに、
Foo foo = {0};
という初期化を行っているコードをたまに見かけますが、これは何を行っているのでしょうか?
一応MinGW環境で同様のコードを書いてテストしてみましたが、{0} で初期化した構造体はゼロクリアされており、
初期化しなかった構造体にはゴミが入っていました。
ということは、上記のコードは構造体をゼロクリアするという認識でいいのでしょうか?
それと、標準Cの規格でこういう初期化は許されていますか?
構造体のゼロクリア処理は memset() などを利用して行っているコードが多いことを考えると、標準規格ではなさそうな
気がするんですが…。
705:デフォルトの名無しさん
08/04/15 01:00:36
メンバを途中まで初期化すると
残りは0で初期化されるってヤツだったと思う。
標準Cでどうなのかは知らん。
706:デフォルトの名無しさん
08/04/15 01:04:31
Foo foo = {1};でa=1,b=0,c=0になるのが保証されてる
707:デフォルトの名無しさん
08/04/15 01:12:58
>>705-706
ありがとうございます。途中まで初期化ということができるんですね。
それなら構造体をゼロクリアするときはこれを使うと楽かもしれないですね。
(先頭にネストした構造体があったりするとどうなるのかよくわからないので、汎用ではないのかもしれないですが)
708:デフォルトの名無しさん
08/04/15 01:13:32
>>704
初期化時のみOK
709:デフォルトの名無しさん
08/04/15 01:18:46
memsetだとパディングも初期化できるのが利点だったかな
普通の使い方で初期化する必要があるのかどうかは知らないが
710:デフォルトの名無しさん
08/04/15 01:36:11
>>709
ものすごく行儀の悪いコーディングだけど構造体同士を memcmp で比較できる
711:デフォルトの名無しさん
08/04/15 01:58:11
>>710
あくまで「普通の使い方」の話な
キャストしたりすればいろいろ問題も出てくるだろうよ
712:デフォルトの名無しさん
08/04/15 01:59:59
>>704
標準規格です。
713:デフォルトの名無しさん
08/04/15 02:01:05
>>704
昔のコンパイラだと 0 で初期化されません
714:デフォルトの名無しさん
08/04/15 03:28:46
>>660
template<typename Class>
void assign_intersection(std::set<Class>& a, std::set<Class> const& b)
{
std::set<Class> result;
std::set_intersection(a.begin(), a.end(), b.begin(), b.end()
, std::inserter(result, result.end()));
a.swap(result);
}
715:デフォルトの名無しさん
08/04/15 08:00:05
*
**
***
****
...
みたいな感じの出力を得たいのですが、***を出力する部分は、なにか特別な書き方とかないですか?
関数を作るしかないですか?
716:デフォルトの名無しさん
08/04/15 08:06:55
>>715
MFCならスタティックテキストの表示を*に変えるという機能(設定)があったり。
自前でもキー入力(KeyDownとか)→別の変数に格納→その文字数だけ*を表示で簡単に出来る。
717:デフォルトの名無しさん
08/04/15 10:30:07
// * を n 個出力する関数
void f(int n){
for(int i = 0; i < n; i++) std::cout << '*';
std::cout << std::endl;
}
void g(int n){
for(int i = 0; i < n; i++) f(i);
}
718:デフォルトの名無しさん
08/04/15 14:19:49
std::string s(length, '*');
std::cout << s << '\n';
719:デフォルトの名無しさん
08/04/15 20:41:31
#include <iostream>
#include <iomanip>
int main()
{
for (int i = 0; i < 10; ++i)
std::cout << std::setw(i) << std::setfill('*') << "" << std::endl;
}
ところでC++でいいんだよね?
720:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/04/16 00:27:56
printfの書式でもっと簡単にできなかったっけ?
イメージ>>720のf3()が近いんだけど・・・使う機会が少ないとすぐにわすれちゃうな・・・
722:デフォルトの名無しさん
08/04/16 00:38:10
>puts("**********" + 10 - n);
このやり方はじめて見た。目から鱗やわ
723:デフォルトの名無しさん
08/04/16 00:42:59
>>722
その鱗はつけておいた方がいいw
724:デフォルトの名無しさん
08/04/16 02:36:32
課題でc++のbasic_stringの様なstringクラスを作っています。
その中でstr >> coutはクラス内でoperator>>を用意することで
動くようになったのですが、cout << strは「二項演算子<<はクラス
strをサポートしていません」と言われてしまいます。
これはどのようにしたらcout << strが出来るようになるのでしょうか?
またお恥ずかしながら、str = "aaa"は作れたのですが、str ="aaa"+"bbb"は
作ることが出来ませんでした。これはどの様に作ったらいいのでしょうか?
どうかよろしくお願いします。
725:デフォルトの名無しさん
08/04/16 02:46:22
なんか物凄く基本的なことのような気がしますが
C言語で、unsigned char から signed char に代入、もしくはその逆を行った場合、ビットバターンは常に保存されますか?
726:デフォルトの名無しさん
08/04/16 02:55:53
>>725
いいえ。
727:デフォルトの名無しさん
08/04/16 03:01:40
>>724
上:strをサポートする二項演算子を書く。
basic_ostream<foobar> & operator <<(basic_ostream<foobar> & os, str & st);
下:無理。
728:デフォルトの名無しさん
08/04/16 03:02:50
>>726
ありがとうございます。そうなると char* を適宜 unsigned char* にキャストしたりしないとダメですね。
一部バイナリが混ざってるファイルを読む必要があったので助かりました。
729:デフォルトの名無しさん
08/04/16 03:58:13
>>728
K&R2 A6.1 (promotion) を参照してください。
char/unsigned char は先に int に変換される点、特に要注意です。
730:デフォルトの名無しさん
08/04/16 04:09:29
>>729 promotion は関係ないだろ。
731:729
08/04/16 04:57:02
>>730
char c = 0x81;
if (c == 0x81)
printf("=\n");
else
printf("!=\n");
の結果って、あれ~?!ってなりませんか?
732:デフォルトの名無しさん
08/04/16 11:52:33
>>731
char が符号付きで最大値が 127 の場合の話なら、
char c = 0x81 の時点で未定義動作。
問題は promotion じゃなくてオーバーフロー。
733:デフォルトの名無しさん
08/04/16 12:09:54
0x81がunsigned charじゃないじゃん
734:732
08/04/16 12:20:21
> char c = 0x81 の時点で未定義動作。
ごめん。間違い。オーバーフローが問題なのは違いないけど、型変換での
オーバーフローは未定義動作じゃなくて、値が処理系定義のものになるか、
処理系定義のシグナルが発生する、らしい。
735:729
08/04/16 20:42:23
>>732 >>734
了解いたしました。
char buffer[N];
...
while (fgets(buffer, N, fp) != NULL) {
if (buffer[i] == ...)
...
}
などと安易に考えると、(たとえば漢字コードの判別など)わからなくなってしまった経験がありました。
unsigned char buffer[N];
とすれば、問題ないのではありますが。
ご指摘ありがとうございました。 またひとつ賢くなりました。
736:デフォルトの名無しさん
08/04/16 20:49:18
>>735
漢字コードをいろいろ扱うなら >>735 だと unicode の時に困るんじゃなかろうか?
(文字列に \0 が含まれる可能性が高いから)
737:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/04/17 07:16:24
template <class T>
template <typename T>
この2つはちがいがありますか?
740:デフォルトの名無しさん
08/04/17 07:21:28
違いは無い
741:デフォルトの名無しさん
08/04/17 08:20:34
class じゃないのも使うよなーとか思っていつも typename にする俺
742:デフォルトの名無しさん
08/04/17 08:26:55
俺もある時期から、typenameが手癖になってしまった。
別にこだわるわけじゃないから、もし仮にclassと書いてくれと職場で言われたら
二つ返事でclassにするけど。
743:デフォルトの名無しさん
08/04/17 08:30:00
なんとなく表明の意味で使い分けるかも。
その後しっかり中でstatic_assertするけどね。
744:デフォルトの名無しさん
08/04/17 10:03:28
クラス配列をnewで生成する時に呼ばれるコンストラクタを指定できますか?
745:デフォルトの名無しさん
08/04/17 10:06:12
残念ながらできない。
746:デフォルトの名無しさん
08/04/17 11:04:06
strcatを使わずに
char src[ ] = "seikima"
char dest[4] = "tsu"
という文字列を結合し、表示させることが出来ますか?
747:デフォルトの名無しさん
08/04/17 11:10:49
>>746
char result[11];
sprintf(result, "%s%s", src, dest);
printf("%s\n", result);
748:746
08/04/17 11:14:54
746です。言葉足らずでした。
sprintfも使わずにforを使って何とか表示させたいのですが
いかがでしょうか?
749:デフォルトの名無しさん
08/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
08/04/17 11:27:20
>>749
>>746に書いたんですが、今回string.hに関するものは使っちゃいけないので
strlenも使用出来ない感じです。
751:デフォルトの名無しさん
08/04/17 11:34:17
>>746にそんなこと書いてNEEEEEEEwwwww
strlen()をsizeof()-1に変えれば同じ動作だ
752:デフォルトの名無しさん
08/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
08/04/17 11:46:22
重ね重ね、申し訳ないです。
ポインタも使ってはいけないようです。
754:デフォルトの名無しさん
08/04/17 11:50:24
宿題かよ。消えろ。
755:デフォルトの名無しさん
08/04/17 11:51:00
ついでに、その出題者はぶん殴っていい。
756:デフォルトの名無しさん
08/04/17 11:55:25
宿題なら学習内容に沿ってるはずだから
テキストでも目を通した方が早いんじゃないの?
何の項目についての課題か分からないんじゃ答えようがないわ
757:デフォルトの名無しさん
08/04/17 11:57:30
入念な釣りだなあ。
次は「 [] 演算子も使えません 」とか?
758:746
08/04/17 11:59:26
一旦、整理してみます。
課題:配列について
内容:char src[ ] = "seikima";
char dest[4] = "tsu";
と配列を用意し、destの中身をsrcに結合させる。
ただし、for文を使うこと・ポインタ、string.hは使ってはならない。
759:デフォルトの名無しさん
08/04/17 12:03:12
>>758
宿題は宿題スレへ。
C/C++の宿題を片付けます 105代目
スレリンク(tech板)
760:746
08/04/17 12:03:56
>>759
誘導ありがとうございます。ご迷惑をおかけしました。
761:デフォルトの名無しさん
08/04/17 12:06:07
連結するための容量は確保しなくていいのか、とか
dest を書き換えずに src に書き込むのか、とか、
宿題にしてもクソすぎるだろ。学校名晒してくんない?
762:デフォルトの名無しさん
08/04/17 12:12:22
746の時点で明らかに宿題じゃないか。なにを今更
763:デフォルトの名無しさん
08/04/17 12:21:40
printfの様な、引数の数が一定しない関数を作るにはどう定義し
中でどう読めば良いのでしょか。
764:デフォルトの名無しさん
08/04/17 12:25:31
Cで標準ライブラリが用意されてない環境なら、自動的に>>758の条件に
近くなると思うけど、ポインタも駄目てのは解らん。
765:デフォルトの名無しさん
08/04/17 12:30:14
>>763
関数のオーバーロードとかでできんじゃね
766:デフォルトの名無しさん
08/04/17 12:30:41
可変長引数でぐぐる
767:デフォルトの名無しさん
08/04/17 12:30:53
>>763
URLリンク(wisdom.sakura.ne.jp)
768:デフォルトの名無しさん
08/04/17 12:31:06
>>763
可変長引数とかva_argsなんかでググるといいと思うよ。
769:デフォルトの名無しさん
08/04/17 12:31:25
>>763
可変引数または可変個引数でぐぐる
770:デフォルトの名無しさん
08/04/17 12:34:09
重婚もいいところだな
771:763
08/04/17 12:37:07
有り難うございます。
stdarg.hなんてヘッダ、目にした事すらありませんでした。
772:デフォルトの名無しさん
08/04/17 12:40:07
ところで可変長引数って設計的にどうなのかな?
個人的には設計に失敗してやむなく・・・ってイメージがあるのだが
773:デフォルトの名無しさん
08/04/17 12:45:05
ハックやチートの部類に入りそうなやり方してるよね。
774:763
08/04/17 12:46:42
>>772
**でも事足りるんですが、その場でわざわざポインタの配列を用意しないと
いけない場合が出てくるだろうし、その場で列挙出来たら楽かなぁとか。
775:デフォルトの名無しさん
08/04/17 12:50:54
>>772
型安全性に問題があるから、特に C++ ではやむなくって意識でいいと思う。
C++ 的には iostream や boost::format みたいに演算子で繋ぐのが正解かな。
776:デフォルトの名無しさん
08/04/17 22:15:48
CかC++の組み込みの勉強したいんですがお勧めの本ありませんか?
組み込みの本って探してもどこにも無いし、ネットで買おうにも中身がどんな感じかも分からないんでどれを買えばいいのか分からないです
あとできれば必要で組み込み初めてに適した機材とかも教えて欲しいです
777:デフォルトの名無しさん
08/04/17 23:24:03
ソフィアシステムズで評価ボードを買ってBSPをいじって動作確認すればいいお^^
778:デフォルトの名無しさん
08/04/18 00:41:53
以下の2つは戻り値以外に何か違いがありますか?
fwrite(buf, 1, 1024, fp);
fwrite(buf, 1024, 1, fp);
779:デフォルトの名無しさん
08/04/18 00:45:24
沢山の実数(doubleとか)が生成されるときに、その分散を計算したいんですが、これってやはり一度生成される全部の実数を
どこか配列とかに格納しないとだめでしょうか?
780:デフォルトの名無しさん
08/04/18 01:00:21
>>779
分散=(X^2 の平均) - (Xの平均)^2
を使用すれば、1pass で計算できますよ。
781:デフォルトの名無しさん
08/04/18 01:04:09
値が生成されるたびに、X^2とXの平均を計算しておくのですね。
782:デフォルトの名無しさん
08/04/18 01:07:17
逐一平均を計算するんじゃなくて、合計値と要素数を記憶だな。
最後にまとめりゃOK
783:デフォルトの名無しさん
08/04/18 01:23:46
>>778
もしかしたら処理速度が変わるかも・・・ね?
784:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/04/18 09:32:34
>>778
>783の戯言はさておき、途中でエラーが発生したときの扱いが違う。
前者は書き込みに成功したバイト数が得られるが、
後者は1024バイト全てが書き込めたかどうかしか判らない。
787:デフォルトの名無しさん
08/04/18 10:10:31
>>786 それが戻り値の違いなんでしょ。
788:141
08/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:デフォルトの名無しさん
08/04/18 10:39:04
↑名前の141、以前のもので意味はありません。
790:デフォルトの名無しさん
08/04/18 11:04:56
VC9で普通に動いてるけど。
791:デフォルトの名無しさん
08/04/18 11:14:42
メイン文で使っている*argv[]をユーザ関数内で使いたいので
ユーザ関数では仮引数をchar **a[]にしているのですが、実引数は何にすればいいのか分からないので教えて下さい
792:デフォルトの名無しさん
08/04/18 11:15:46
>>791
argv そのまま渡せるように引数も同じ型にしとけよ。
793:デフォルトの名無しさん
08/04/18 11:27:51
>>792
argvをそのまま渡すようにするには、ユーザ関数の仮引数と呼び出す際の実引数は何にすればいいのでしょう?
794:デフォルトの名無しさん
08/04/18 11:30:16
>>793 仮引数は main にある argv と「同じ型」、実引数は argv 。これでいいか?
795:デフォルトの名無しさん
08/04/18 11:48:44
>>794
分かりました、ありがとうございました。
796:デフォルトの名無しさん
08/04/18 13:36:50
>>788
エラーとかじゃなくて単に何も表示されない?
797:デフォルトの名無しさん
08/04/18 13:39:11
ファイルの置き場所ミスってるだけじゃねーの?
798:788
08/04/18 15:50:11
VC++2008 Express Editionでdebugモードでコンパイルし、
データファイルaaa.datをdebugフォルダに入れて実行ファイル
を実行すると正常に実行されます。ですが、統合環境では何も
表示されないです。
Projects\test\test (testは私がつけたプロジェクト
名のフォルダ) というフォルダにデータファイルを置
くと統合環境ではうまくいくようです。しかし、こん
なこと最初はわかんないよ。
799:デフォルトの名無しさん
08/04/18 15:55:53
>>798
フルパスでファイルを扱うのでなければ、カレント
ディレクトリをちゃんと意識するようにしないと。
800:デフォルトの名無しさん
08/04/18 16:00:30
is_openでちゃんと開けたか確認したほうがいいよ
801:デフォルトの名無しさん
08/04/18 16:29:49
open使わずに
std::ifstream fin("...");
てやったほうがいいよ
close後何も処理しないのならcloseも不要だよ
802:デフォルトの名無しさん
08/04/18 18:12:43
C++やろうと思うんですけど、オススメの教本教えてください
Cとjavaは一応できます
803:デフォルトの名無しさん
08/04/18 18:15:06
boostのソースコード(無料)(偏差値70)
804:デフォルトの名無しさん
08/04/18 19:10:22
メモリは並列にアクセスできますか? 例えばHDDだと2台あればパフォーマンス落ちずに同時アクセスできますが
805:デフォルトの名無しさん
08/04/18 19:17:44
>>804
NUMAとかそーいうキーワードで調べてみるといいと思う。
806:デフォルトの名無しさん
08/04/18 19:38:09
>>777
ありがとう。評価ボード調べてみたらくそ高けぇw
ごめんなさい勉強用程度なら1万程度もあれば揃うだろうとなめてました
807:デフォルトの名無しさん
08/04/18 19:42:52
>>806
こんなのから始めた方がいいよ。
URLリンク(hijiri3.s65.xrea.com)
808:デフォルトの名無しさん
08/04/18 19:51:44
>>807
㌧ これは面白そう
もうちょっとググって組み込みのこと勉強してきます
809:デフォルトの名無しさん
08/04/18 20:07:21
>>805 トンクス!
810:デフォルトの名無しさん
08/04/18 20:32:22
>>785
提示されたコードをコンパイルしましたが、特に異状はないと思います。
環境とコンパイルオプションを教えてください。
当方が確認した環境は WindowsXP, コンパイラはgcc3.4.4(cygwin)です。
URLリンク(kansai2channeler.hp.infoseek.co.jp)
811:デフォルトの名無しさん
08/04/18 22:15:10
>>798
[プロジェクト]-[プロパティ]-[構成プロパティ]-[デバッグ]-[作業ディレクトリ]
812:デフォルトの名無しさん
08/04/18 22:41:28
#include <stdint.h> はどの環境でも使えますか?
とブーストとかSTL portとか入れればどれでも使えますか?
32bit環境で、64bit整数のビット演算、掛け算の速度をかなり速いです
使い物になるので使いたいのですが互換性はなかなかあるんですか
813:デフォルトの名無しさん
08/04/18 22:42:11
文書が色々とおかしいです
エスパーでおねがいします
814:デフォルトの名無しさん
08/04/18 22:55:18
VC2008で対応していなかった為、stdint.h使うのをやめることにしました
815:デフォルトの名無しさん
08/04/18 22:56:44
わかりました
がんばってください
816:デフォルトの名無しさん
08/04/18 22:58:30
>>812
> #include <stdint.h> はどの環境でも使えますか?
いいえ。
> とブーストとかSTL portとか入れればどれでも使えますか?
いいえ。
> 32bit環境で、64bit整数のビット演算、掛け算の速度をかなり速いです
いいえ。
> 使い物になるので使いたいのですが互換性はなかなかあるんですか
いいえ。
817:デフォルトの名無しさん
08/04/18 23:08:19
日本語学びたての外国人か
コンピューターにものすごい興味がある赤ん坊のどちらかだな。
818:デフォルトの名無しさん
08/04/18 23:22:53
外国人の人だと思うので、添削してみました。頑張ってね。
初心者なのですが、いくつか質問させてください。
#include <stdint.h>はどの環境でも使えますか?
boostとかSTL portとかは、インストールすれば使えますか?
32bit環境で、64bit整数のビット演算、掛け算がかなり速くできて、
使い物になりそうなので使いたいのですが、互換性についてはどうでしょうか?
819:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/04/18 23:26:01
>>812
C++なら、Boostを入れると<boost/cstdint.hpp>が使える。
名前空間boostに入っていること以外はだいたいC99の<stdint.h>と同じ。
821:デフォルトの名無しさん
08/04/18 23:27:47
>>819
いったん別の関数を挟めばいいはず。
inline std::wstring A2WStringHelper(const std::string& strSource)
{
return A2WString(strSource);
}
こういうものを作って、std::transformにはこれを渡す。
822:デフォルトの名無しさん
08/04/18 23:54:40
スタティックテキストのプロパティCaptionを変更するにはどうすればいいんですか?
IDC_STATIC.Caption("aaa");
で動かないんですけど
823:デフォルトの名無しさん
08/04/19 00:01:09
IDC_STATIC.Caption = "aaa";
GetDlgItem(IDC_STATIC)->Caption = "aaa";
これでも動きません
824:デフォルトの名無しさん
08/04/19 00:09:19
>>822
IDC_STATICは言わばワイルドカードなので、
キャプションを変えたいスタティックテキストに個別のIDを割り当てる必要があります。
825:デフォルトの名無しさん
08/04/19 00:10:34
つーか、そもそも書き方も判ってなくてコンパイルも通らないならエラーメッセージを張れと。
826:デフォルトの名無しさん
08/04/19 00:22:56
ありがとうございます。名前を付けました
GetDlgItem(IDC_STATICTIME)->Caption = "aaa"
error C2039: 'Caption' : 'CWnd' のメンバではありません。
となります
827:デフォルトの名無しさん
08/04/19 00:27:11
IDC_STATICTIME->Caption = "aaa"
これだと
error C2227: '->Caption' : 左側がクラス、構造体、共用体、ジェネリック型へのポインタではありません。
こういうエラーになります。
828:デフォルトの名無しさん
08/04/19 00:27:43
Captionなんて無いよ・・・とエラーが教えてくれてるじゃん
なんでそんなにCaption大好きなの?
GetDlgItem(IDC_STATICIME)->SetWindowText("aaa");
829:デフォルトの名無しさん
08/04/19 00:30:40
ありがとうございます
別に好きなわけじゃないんです
VBの時はこうやっていたので
プロパティの項目で設定できないのならVC++で項目の意味はあるんですか?
全部のプロパティの設定方法を調べなきゃいけないんでしょうか?
830:デフォルトの名無しさん
08/04/19 00:35:46
プロパティ?ダイアログの?
あんなのは飾りだ。
831:デフォルトの名無しさん
08/04/19 00:39:07
意味があるとしたら、設計時に入れれば、コーディングしなくて良い事ぐらいかな?
VCは他もみんなこんな感じだから、VBからだと慣れるしかないな。
プロパティのVisible項目→コーディング時はShowWindow();
832:デフォルトの名無しさん
08/04/19 00:44:01
OK覚悟はできたwwww
833:デフォルトの名無しさん
08/04/19 00:55:43
C#を一通りやった者ですが、CよりC++の方が始め易いでしょうか?
834:デフォルトの名無しさん
08/04/19 01:08:42
C# からなら C は不便に感じると思う。
C++ のがいいかと。
835:819
08/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:デフォルトの名無しさん
08/04/19 05:07:02
JavaとかC#から始めた人はCやC++の世界には入ってこないでください。
837:デフォルトの名無しさん
08/04/19 07:57:16
>>836
どうして?
838:デフォルトの名無しさん
08/04/19 09:33:00
ガベージコレクタは便利かもしれないが、その便利さゆえに何か重要なことを失くしているような気がする。
839:デフォルトの名無しさん
08/04/19 09:33:54
「JAVAスクールの危険」ってはなし?
840:デフォルトの名無しさん
08/04/19 09:48:02
Java はアレだが、C# はまだマシだと思うけどな。まあ。
841:デフォルトの名無しさん
08/04/19 10:27:27
>>835
それは有名な参照の参照問題
詳細はSTL バインダで検索して一番上あたりがそのものズバリだと思う
解決策だけ抜きだすとboostのfunctional.hppのboost::bind2ndを使う
さらにptr_funを使わずにboost::bind2nd(A2WString2)と書けるところも利点だ
842:デフォルトの名無しさん
08/04/19 11:43:18
>>837
温室育ちが軍隊に入ったら周りが迷惑するだろ
843:デフォルトの名無しさん
08/04/19 11:48:42
軍隊という表現は語弊があるな
せめてど田舎とか電気が通ってないとかそういう表現にしないと
844:デフォルトの名無しさん
08/04/19 13:06:49
その表現もかなりニュアンス違うな。
まぁ、無理して比喩を使う必要はない場面だと思う。
845:デフォルトの名無しさん
08/04/19 14:05:31
2chにゆとりが入って来たでおk
846:デフォルトの名無しさん
08/04/19 14:06:52
>>845
いまいちだな
847:デフォルトの名無しさん
08/04/19 14:58:24
オートマ車しか乗ったことが無い人が、
マニュアル車に乗る感じとか。
でもC/C++をちゃんと理解して使い始めるなら、良いと思う。
理解するフェーズで挫折する人は、諦めてもらって、
理解するフェーズを無視して使い始める人は氏ねば良いと思うよ。
848:デフォルトの名無しさん
08/04/19 15:10:55
1速のままで法定速度維持してエンジン壊すってか。
849:デフォルトの名無しさん
08/04/19 15:20:18
「郷に入っては郷に従え」でいいんじゃないかと
850:デフォルトの名無しさん
08/04/19 15:21:01
> 理解するフェーズを無視して使い始める人は氏ねば良いと思うよ。
多言語から移ってきた人の3割くらいはこれかな・・・?
851:デフォルトの名無しさん
08/04/19 15:27:51
映画と小説の共存が可能なように美麗な3Dグラフィックゲームと想像力をかきたてる2Dのドット絵ゲームというのは共存が可能だと思うのだがいかがなものか
852:デフォルトの名無しさん
08/04/19 15:31:57
ドット絵すらないroguelikeもよろしく
853:デフォルトの名無しさん
08/04/19 15:55:49
文字は高尚なドット絵だよ!
854:デフォルトの名無しさん
08/04/20 10:27:45
ぷァ
855:デフォルトの名無しさん
08/04/20 10:48:12
*nixのフレームバッファコンソール上でハードウェアアクセラレーションを使って描画とかしたい
856:デフォルトの名無しさん
08/04/20 11:39:26
すみません 圧縮・解凍DLLを利用して、どの形式のファイルを渡されても
同一の方法で展開することのできるライブラリってありませんか?
ファイルをチェックして適切なDLLへ渡すやつです。
857:デフォルトの名無しさん
08/04/20 12:11:41
>ファイルをチェックして
ファイル名で?ファイルの中身で?
858:デフォルトの名無しさん
08/04/20 12:12:58
ファイルの中身です EXEでも解凍できるやつもあります そういうのも展開したいです
859:デフォルトの名無しさん
08/04/20 12:20:41
とりあえずは 拡張子判別DLL(ググって) と 統合アーカイバ の組み合わせかな。
exeは知らない。アーカイブ本体をexe末端に付けてるか、
リソースとして持ってるか、とかの方式で変わってくるだろうし。
860:デフォルトの名無しさん
08/04/20 12:25:42
対応形式が多いのはXacRett.dllかな
861:デフォルトの名無しさん
08/04/20 12:25:40
それらを自動でやってくれるのはないかと…
862:デフォルトの名無しさん
08/04/20 12:28:04
サンクス
863:ミミ
08/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:デフォルトの名無しさん
08/04/20 13:23:48
デフォルトは方法3だよな。
単独で動かす時はそれで十分やね。
他のアプリから利用する必要がある場合は方法2じゃないと都合が悪い。
方法1は論外っすね。
865:デフォルトの名無しさん
08/04/20 14:40:32
>>858
そういうものがあるとしたら、そういうフリーのソフトが公開されている筈だよな。
そういう公開ソフトはないのだから、当然そういうDLLはない。
まぁ、>859にある「統合アーカイバ・プロジェクト」辺りを見てこいと。
866:デフォルトの名無しさん
08/04/20 15:20:46
XacRettで解決したんですけど…
867:デフォルトの名無しさん
08/04/20 17:28:14
最近ゲームのプログラムいじってたらprint系で浮動小数が出力できなくなってしまったんだが、
同じようになったことある人いる?いたら解決策とか教えて欲しいです。
症状としては、%fを含むprint系の関数(wsprintfとかvfprintf)を実行すると
「問題が発生したため~」っていうおなじみのダイアログが出てきて落ちちゃうんです。
868:デフォルトの名無しさん
08/04/20 17:30:03
言語再インストール
869:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/04/20 18:45:57
>>869
SetDIBits
871:デフォルトの名無しさん
08/04/20 18:59:48
CreateDIBitmap
872:デフォルトの名無しさん
08/04/20 19:08:32
>>867
再現ソースとエラーを張れと何度いったことか
873:デフォルトの名無しさん
08/04/20 19:46:11
>>872
再現コードの作成はちょっと全体の量も多いし見当もつかないので難しいです・・・。
関係あるとしたらどんなことが考えられるでしょうか?ロケールとか?
874:デフォルトの名無しさん
08/04/20 20:00:57
>>873
スタックを壊したとか関数テーブルを壊したとか
多分バッファオーバーフローか未初期化ポインタを使って
アクセスしてはいけないメモリを壊した可能性が高い
875:デフォルトの名無しさん
08/04/20 20:01:01
だからエラーメッセージ張れつ~うの。テンプレに書いてあるでしょ
呼び出し規約とかランタイムとかリンクされるライブラリとか
なんかプロジェクトの設定いじったでしょ。それを直せばいい
876:デフォルトの名無しさん
08/04/20 20:45:31
>>863
デバッグ版はインストール先のフォルダ。
リリース版はインストーラ作成のフォルダ。
877:デフォルトの名無しさん
08/04/20 21:22:45
>>874-875
レスありがとうございます。以前できていたところがいじってないのに
急になったので875さんの臭いかも知れないけど、気づいたらなってしまってました・・・
BCCでやっててエラーメッセージを取得できる部分が見当たりません・・・。
こういう時ってどうやってメッセージを受け取るんでしょう?すいませんアホで・・
878:デフォルトの名無しさん
08/04/20 21:58:31
浮動小数とか言ってる時点でキミがアホなのはみんな分かってるよ
879:デフォルトの名無しさん
08/04/20 22:11:33
これでまったく関係ない場所でゼロ除算で落ちてたとかだとウケるな
880:デフォルトの名無しさん
08/04/20 22:24:46
あっwsprintfかw
printf系じゃないから%fとか無理
sprintfつかえ
881:デフォルトの名無しさん
08/04/20 22:29:26
snprintfとかswprintfでもいいよ
882:デフォルトの名無しさん
08/04/21 01:09:03
>>870
>>871
さんくす。
CreateDIBitmap使ってやってみたらいけた。
表示用のビットマップはCreateCompatibleBitmapで作って、
外部からもらったバイナリを描画するビットマップをCreateDIBitmapで作成
BitBltで転送して実装できたよ
ありがとう
883:デフォルトの名無しさん
08/04/21 20:49:40
>>879確実にvsprintfで落ちてました。
>>880-881ダメでした。あきらめます。
親切にレスしてくださった皆様、ありがとうございました
884:デフォルトの名無しさん
08/04/21 21:15:55
null = new int[10]
で確保した領域はどこに存在するの?
delete[]しなければ、この確保した領域はプログラムが終了してもずっとそこに存在したままになるの?
885:デフォルトの名無しさん
08/04/21 21:18:33
>>884
ヒープ領域のどこか
終了したらちゃんと解放される
一部されないOSもなくはない
886:デフォルトの名無しさん
08/04/21 21:38:02
コンパイル時にtype_infoみたいな感じで静的にクラス名の文字列を取得できる方法ってありますか?
テンプレートクラスで例外を投げる時に使いたいんですが・・・
887:デフォルトの名無しさん
08/04/21 21:52:34
>>886
boostのこの辺のが役に立つかもしれない
URLリンク(www.kmonos.net)
888:デフォルトの名無しさん
08/04/21 22:10:44
boostって本当にすごいね・・・そんなのも判定できるとは
でも型名の取得は厳しいのかな・・・
889:デフォルトの名無しさん
08/04/22 01:38:20
やっぱりboostでtypeofってのがあって、それで
型名は取得できるのだけど、staticな処理じゃないんだよね。
なのでその用途だとtypeid使うのとあまり変わりない。
URLリンク(www.kmonos.net)
890:デフォルトの名無しさん
08/04/22 03:19:09
STLをはじめ、テンプレートをよく使いなさい。
型の完全名がカオスになって諦めがつくから。
891:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/04/22 07:09:45
それコンパイル通るの?
893:デフォルトの名無しさん
08/04/22 07:55:39
コンパイルできないし、それが単なるtypoだったとしても資源の管理はどうなってるんでしょうね、と。
894:デフォルトの名無しさん
08/04/22 09:21:56
コンパイルはできますがやはりaaae.ShowWindow(SW_SHOW);で消滅します
895:デフォルトの名無しさん
08/04/22 09:25:14
あ、aaaeをポインタにしたら出来ました。
896:デフォルトの名無しさん
08/04/22 20:23:53
単にスコープ抜けたから、msgdlgのインスタンスが死亡しただけだろう。
897:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/04/22 21:30:35
規格で、同じネストレベルでva_start,va_endの組で使うことになっている。
899:デフォルトの名無しさん
08/04/22 21:32:48
実装によるかも知れんがメモリとかがぶっ壊れるんじゃまいか
900:デフォルトの名無しさん
08/04/22 21:49:24
すいませんちょっとお聞きしたいのですが、GCCで
if(ret = 1){
int dt = 1;
}
みたいにしたら、
「真偽値として使われる代入のまわりでは、丸括弧の使用をお勧めします」
と言われたので、
if((ret = 1)){
int dt = 1;
}
みたいにしたら、許してもらえました。
なぜ ((ret = 1)) の方がよいのでしょうか??
901:デフォルトの名無しさん
08/04/22 21:52:09
>>900
ret==1って書いたらその警告消えてくれるよ。
902:897
08/04/22 21:54:54
>>898-899 どうも、
ここのサンプルではva_end使ってないんです
URLリンク(msdn2.microsoft.com)(VS.80).aspx
そして、URLリンク(www.bohyoh.com)
ここに、「本関数は、va_endマクロを呼び出さない」 と記述があるんです
903:デフォルトの名無しさん
08/04/22 22:00:56
>>900
==の間違いだったりしませんよね?大丈夫?っていう警告だからそういうもんだと思え
別に前の書き方でも問題ない
(())の方がよいというわけじゃない
904:900
08/04/22 22:05:44
>>901 さん
>>903 さん
なるほど!ありがとうございます!
905:デフォルトの名無しさん
08/04/22 22:28:34
>>902
VCに限っていえばva_endマクロは何もしないから呼ばなくても問題はない。
しかし、他の処理系で動くとは限らない。
906:デフォルトの名無しさん
08/04/22 23:00:01
>>902
書かなくてもいい環境が有るとはいえ、プログラムとしては書かないと駄目。
運悪く駄目なサンプルに当たったね。
907:デフォルトの名無しさん
08/04/22 23:05:39
>>896
なるほど!
msgdlg aaae = new msgdlg();
をグローバル領域に持って行っても起動しました。
ポインタの理解が深まりました。ありがとう!
908:デフォルトの名無しさん
08/04/22 23:07:36
ちょっとぉぉぉぉぉ
909:デフォルトの名無しさん
08/04/22 23:13:26
これが
「何か適当にいじったら動いた」
という奴か
910:デフォルトの名無しさん
08/04/22 23:14:27
> グローバル領域
深まってない悪寒
911:デフォルトの名無しさん
08/04/22 23:15:55
さすがにこれをコンボでくらったら元のソースを自分で書いていたとしてもデバッグしたくなくなるな
(だから、その変てこなのは後から馬鹿が弄ったんだってば ><)
912:デフォルトの名無しさん
08/04/22 23:18:30
>msgdlg aaae = new msgdlg();
このコード、何度見ても謎が残りすぎ。
913:デフォルトの名無しさん
08/04/22 23:29:02
>891の段階で既に釣りだったんじゃね?
914:デフォルトの名無しさん
08/04/22 23:30:42
>>907
C++の入門書か入門サイトをもう一度見て回った方が良いと思うぞ。
煽りとかじゃなくて本当に。基礎は大事だから。
とりあえず、理解する必要のあるキーワードとしては、
ポインタ、参照、自動変数、デストラクタ、delete、スコープ、スタック、ヒープ
あたりかな。
915:デフォルトの名無しさん
08/04/22 23:32:33
釣りなら、それはそれでおk。
916:デフォルトの名無しさん
08/04/23 00:24:05
switchのcase文内で、auto変数を宣言しようとすると、{}をつかってブロックを
作らないとだめですか?
917:デフォルトの名無しさん
08/04/23 00:25:05
だめです
918:デフォルトの名無しさん
08/04/23 00:30:02
>>916
例えばこういうことならできる。
switch (value) {
int someVar;
case 0:
someVar = 0;
break;
case 1:
someVar = -1;
default:
someVar = value;
break;
}
919:デフォルトの名無しさん
08/04/23 00:35:00
>>914
レベルアップした気分ですごく満足なのですが
もう一度新C++言語入門シニア編上下を読み直してみます・・・
が、ずばり一言でどこがおかしいですか?頭関係以外でおねがいします。
920:デフォルトの名無しさん
08/04/23 00:35:09
>>917-918
ありがとうです。
918はやり方自体知らんかったス。
921:デフォルトの名無しさん
08/04/23 01:01:17
>>919
頭関係以外で一言にまとめるには、対象が「少数」の「具体的なディテール」である必要がある。
でも君の場合、「基本的な抽象概念」の理解が「幾つも」欠けているように見受けられるから、まとめようがない。
だから>>914も困った挙げ句
> ポインタ、参照、自動変数、デストラクタ、delete、スコープ、スタック、ヒープあたり
という言い方になってるんだよ(これでも親切に用語を絞って挙げてるほう)。
922:デフォルトの名無しさん
08/04/23 02:37:20
>>919
msgdlg aaae; //○msgdlg型の変数
msgdlg aaae = new msgdlg(); //×msgdlg型の変数にmsgdlg*型の値を代入
msgdlg *aaae = new msgdlg(); //○msgdlg*型の変数にmsgdlg*型の値を代入
一言でいうと,どこがイコールよ?
923:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/04/23 07:20:43
よく見たらeだった。
× aaaa
○ aaae
925:デフォルトの名無しさん
08/04/23 09:41:18
ビットフィールドは、
unsigned char x : 50;
のように元の型を超えていても定義できますか?
926:デフォルトの名無しさん
08/04/23 09:43:54
unsigned char配列を、38 、 6 、 4 のように分けたいのですが、ビットフィールドで出来ますか?
あと、38bitの部分は、=で比較できますか? 無理な場合、別の方法はないでしょうか
927:デフォルトの名無しさん
08/04/23 09:51:28
このようにしたら、確保する領域は、40bit + 8bitになりますよね?
33 + 7 ではないですよね?
class A{
public:
bitset<33> a;
char b : 7;
};
928:デフォルトの名無しさん
08/04/23 10:06:17
自己解決しました
これで長い列に変換出来ました
bitset<40> *p;
unsigned char s[5]={1,255,1,255,128};
p=(bitset<40>*)&s;
cout<< *p;
929:デフォルトの名無しさん
08/04/23 10:53:08
そ れ は 偶 然 だ
930:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/04/23 11:39:01
デストラクタで仮想関数呼び出すとか馬鹿じゃねーの?
933:デフォルトの名無しさん
08/04/23 11:42:12
古い形式のキャスト使ってるとか馬鹿じゃねーの?
スマートポインタ使ってないとか馬鹿じゃねーの?
いやいや、馬鹿じゃないって。
デストラクタの中から仮想関数呼び出すのはさすがにないけど。
934:デフォルトの名無しさん
08/04/23 11:44:25
>>930
これはひどい
935:デフォルトの名無しさん
08/04/23 11:57:28
… ~base() が呼び出されるときは
既に test::destory の実体はなくなっているからでしょうか?
馬鹿ですみません…
こういう場合、クラスtestで確保したメモリは
どう解放したら良いのでしょうか?
936:デフォルトの名無しさん
08/04/23 11:59:40
しかも書いてありました。
スマートポインタで調べてみます。
937:デフォルトの名無しさん
08/04/23 12:31:15
baseのデストラクタにvirtualをつけて上で
testに自分のdestoryを呼ぶデストラクタを書けば
baseのデストラクタの最初でtestのデストラクタが呼ばれて、testのdetoryが呼び出されるため
この場合はmain内部の変更無しでメモリリークがなくなるけど、それじゃ駄目なの?
938:デフォルトの名無しさん
08/04/23 13:22:22
>>937
ありがとうございます、無事に解放されるようになりました。
いろいろと勉強不足でした。
仮想デストラクタにしないと派生クラスのデストラクタが呼び出されないのはもちろん
メンバ変数のデストラクタも呼び出されないということ(?)なんですね。
939:デフォルトの名無しさん
08/04/23 13:39:34
>メンバ変数のデストラクタも呼び出されない
詳しくは覚えてないが、デストラクタが仮想関数(virtual)であれば、delete演算子が
渡されたポインタから仮想関数テーブルを辿って継承関係を把握できるとか
だったと思う(逆に言えば仮想関数でないと把握できない)。
ちなみに勘違いしてそうなので書いておくけど、デストラクタとは
~クラス名();←引数無し
のこと。destroyとか勝手に名前つけたらそれはただのメンバ関数だよ。
この場合正しくは virtual ~base();とかだ。
940:デフォルトの名無しさん
08/04/23 13:43:43
あ、そういえば~base()はちゃんと書いてあるのかw
941:デフォルトの名無しさん
08/04/23 14:11:20
なるほど…仮想関数テーブルですか、
virtual指定はなんだか漠然としていて理解しにくかったですが
なんとなくはどう動作するかが理解できました。
ありがとうございます。
942:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/04/23 14:47:49
>>942
感動しました。こんなにわかりやすいの初めてみました。がんばります!
944:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/04/23 15:46:25
str[0]+1なんて代入しなくても、0で初期化しておけばいいんじゃないの?
946:デフォルトの名無しさん
08/04/23 15:48:09
>>944
charは1バイトだから平仮名みたいな多バイト文字はうまくゆかないよ。
分かっているならごめん。
947:デフォルトの名無しさん
08/04/23 16:11:33
>>945
0に相当する文字が来た時に駄目でしょ。
948:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/04/23 16:13:42
>>947
それはひょっとしてギャグでいってるのか・・・・
950:デフォルトの名無しさん
08/04/23 16:19:37
>>944
最初に1文字目と異なる値 str[0]+1 で初期化しとけば良いんじゃね?
ってのは結構頭の良い発想。凡百の徒には嫌われるけどね。
でもそういうときの current_c は普通 prev_c だな。
951:デフォルトの名無しさん
08/04/23 16:22:12
>>950
そうか?ムダじゃね?
952:デフォルトの名無しさん
08/04/23 16:33:50
一つ目の文字が変わるっていう意味が分からんw
953:948
08/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:デフォルトの名無しさん
08/04/23 16:46:59
>>951
今回は文字だから 0 にしときゃ良いけど、
一般に先頭要素または直前のと異なる要素を
判定していくには良い方法だよ。
955:デフォルトの名無しさん
08/04/23 16:58:36
>>945の前提条件
nul終端文字列
>>947の前提条件
文字列
>>950の前提条件
コピーコンストラクタ
operator+
operator!=
を持っている型
>>953の前提条件
operator!=
を持っている型
956:デフォルトの名無しさん
08/04/23 17:04:34
>>955
もう>>944とは別世界に行ってるなw
957:デフォルトの名無しさん
08/04/23 17:31:55
PHPやperlでprint を使いながらデバッグするような方法をC++でもやりたいのですが、どうすればよいでしょうか??
そういうデバッグの仕方はC++では難しいのでしょうか。
958:デフォルトの名無しさん
08/04/23 17:32:34
>>944 ちょっとトリッキー、でもうまいやり方
>>945 一番シンプル
>>946 一番重要なレスw
>>953 汎用化し杉ワロタw
959:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/04/23 17:44:31
>>944は、charの取りうる最大値を指していた場合
+1すると、オーバーする。
>>945は、処理内容次第では、\0がいきなり来た場合にヤバい。
が、あのプログラムの場合strlenの値がループの実行回数だからOK
>953は、恐らく>>944が本当に必要だったものではない可能性が高いw
961:デフォルトの名無しさん
08/04/23 17:47:00
>>959 さん
なるほどデバッガで変数に格納されてる値を見ることが出来るんですね。
ありがとうございましたm(_ _)m
962:デフォルトの名無しさん
08/04/23 17:51:55
>>>944は、charの取りうる最大値を指していた場合
>+1すると、オーバーする。
するってーと current_c=~str[0]; が適切?
963:デフォルトの名無しさん
08/04/23 17:53:43
オーバーフローしても大丈夫だろ。
964:デフォルトの名無しさん
08/04/23 17:55:39
あ、一文字目が処理されない
965:デフォルトの名無しさん
08/04/23 17:56:06
>>963
実動はともかく、規格的にはアウトだろ
966:959
08/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:デフォルトの名無しさん
08/04/23 18:15:31
そして通告されるeucJP
968:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/04/23 19:06:06
>>968
×vecStrDim[0].push_back(vecStr);
○vecStrDim.push_back(vecStr);
970:デフォルトの名無しさん
08/04/23 19:10:40
>>969
あわわ……とんでもなく馬鹿なことしてすみません
解決しました
971:デフォルトの名無しさん
08/04/23 19:14:36
そのコードがコンパイルが通ることが不思議だ…
972:デフォルトの名無しさん
08/04/23 19:29:14
シングルバイト限定なら、current_cをintか何かにして、charで表現できないデカい値にしとけばいい。
973:デフォルトの名無しさん
08/04/23 20:44:51
class内で、static付けたものは、配列にしたときコピーは作られないんですよね? すべて同じ物を参照するんですよね
974:デフォルトの名無しさん
08/04/24 00:27:08
まあ配列にしなくても1つしか実体が存在しないようになるけどな
975:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/04/24 00:52:43
>>976
a == b == c は、(a == b) == c と解釈される。つまり、使い方が間違っている。
その場合、恐らくa == b && b == c でいいだろう。
978:デフォルトの名無しさん
08/04/24 00:57:13
980あたり、次スレたのむぜ
979:デフォルトの名無しさん
08/04/24 00:59:27
>>977
おおwなるほど!
ありがとうございました^^
980:デフォルトの名無しさん
08/04/24 01:11:37
>>990にパス
981:デフォルトの名無しさん
08/04/24 01:14:03
>>976
移動前のスレのコメントにもありましたが、
「君が参考にしてるものは信用しないほうがいい」
です。void main(...) はまずい。
982:デフォルトの名無しさん
08/04/24 01:17:45
void main は g++ でエラーになるしな。
gcc だと警告ですむけど。
983:981
08/04/24 01:34:22
rewind() も、あるのかわからない.....。stdin に対して rewind() ?
984:デフォルトの名無しさん
08/04/24 03:35:46
1~100までの数字でひとつだけない数字があるのでそれを探すという問題なのですが
URLリンク(kansai2channeler.hp.infoseek.co.jp)
でひとつひとつ探す方法はあるのですが
他の方法で、まず
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:デフォルトの名無しさん
08/04/24 03:41:23
数えながら2つのファイル(小さい,大きい)に書き出していけばいいんじゃねの?
986:デフォルトの名無しさん
08/04/24 03:42:37
どこにあるのかわからないなら、ひとつひとつしらべるのが最善
987:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/04/24 04:42:58
物凄い無駄な処理だなw
再帰呼び出しを使うのが良いよ
989:988
08/04/24 04:46:09
ああ、ごめん。数字は順番に並んでるわけじゃないのか
990:デフォルトの名無しさん
08/04/24 04:54:26
諦めて全部足して5050から引け
991:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/04/24 05:37:10
試してないけどこんな感じで良いと思うよ。
中間の出し方は微妙に間違ってるかもしれんので、自分で検証してね。
995:デフォルトの名無しさん
08/04/24 05:56:21
exeを逆アセンブルしてソースコードに組み込む定番のやり方教えて下さい
996:デフォルトの名無しさん
08/04/24 06:00:08
ソースコードでよくみかける10Lや1Lってなんのことなんでしょうか?
「1Lとは」などで検索したのですが見つかりません。
環境はC++、BCCです。どなたか回答頂ければ幸いです。
997:デフォルトの名無しさん
08/04/24 06:09:58
>>996
整数のあとにつくLはlong intであることを表す。
10はintの10。10Lはlong intの10。
998:デフォルトの名無しさん
08/04/24 06:31:33
>>997
ありがとうございます!
long intをキーワードに検索したら大体わかってきました。
long intを代入するときはLをつけるという解釈であってますか?
999:デフォルトの名無しさん
08/04/24 06:39:42
違うよ。整数リテラルそのものにも型があるの。
1 は int型
'1' は char型
1.0 は double型
1L は long型
1000:デフォルトの名無しさん
08/04/24 06:49:16
重ねてありがとうございます!
詳しい説明でよくわかりました(多分)。
単なる1でも勝手にintにされてるんですね。
1001:1001
Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。