トップページ⇒tech
1001コメント306KB

【初心者歓迎】C/C++室 Ver.8【環境依存OK】

レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさんNGNG
エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。

【初心者歓迎】C/C++室【環境依存OK】
http://pc5.2ch.net/tech/kako/1059/10590/1059041347.html
【初心者歓迎】C/C++室 Ver.2【環境依存OK】
http://pc5.2ch.net/tech/kako/1067/10671/1067189450.html
【初心者歓迎】C/C++室 Ver.3【環境依存OK】
http://pc2.2ch.net/test/read.cgi/tech/1069719929/ (消滅?)
【初心者歓迎】C/C++室 Ver.4【環境依存OK】
http://pc2.2ch.net/test/read.cgi/tech/1073473867/ (消滅?)
【初心者歓迎】C/C++室 Ver.5【環境依存OK】
http://pc5.2ch.net/test/read.cgi/tech/1077102238/ (html化待ち)
【初心者歓迎】C/C++室 Ver.6【環境依存OK】
http://pc5.2ch.net/test/read.cgi/tech/1082182233/l50
【初心者歓迎】C/C++室 Ver.7【環境依存OK】
http://pc5.2ch.net/test/read.cgi/tech/1086373839/l50

【ラウンジ】質問が長い時はココを使うと便利
http://do.sakura.ne.jp/%7Ejunkroom/cgi-bin/megabbs/lounge/index.html
0002デフォルトの名無しさんNGNG
【関連スレ(処理系別)】
★初心者にVisual C++を教えるスレ★ Part13
http://pc5.2ch.net/test/read.cgi/tech/1089011118/l50
C++Builder相談室 Part10
http://pc5.2ch.net/test/read.cgi/tech/1089299158/l50
GCCについて part4
http://pc5.2ch.net/test/read.cgi/tech/1090062751/l50
Turbo C++ 5.0 プログラミング
http://pc5.2ch.net/test/read.cgi/tech/1030878794/l50
タダで使えるBorland C++ Part4
http://pc5.2ch.net/test/read.cgi/tech/1091066805/l50
タダで使えるVisual C++ $2
http://pc5.2ch.net/test/read.cgi/tech/1086287039/l50
Borland C++ BuilderX
http://pc5.2ch.net/test/read.cgi/tech/1065260556/l50
■MFC相談室 mfc11.dll■
http://pc5.2ch.net/test/read.cgi/tech/1088084875/l50
0003デフォルトの名無しさんNGNG
【関連スレ(その他)】
C言語なら俺に聞け! Part 87
http://pc5.2ch.net/test/read.cgi/tech/1090654469/l50
C++相談室 part33
http://pc5.2ch.net/test/read.cgi/tech/1090180012/l50
C/C++の宿題は拙者が斬る! 29代目
http://pc5.2ch.net/test/read.cgi/tech/1090765027/l50
【C++】template 統合スレ -- Part4
http://pc5.2ch.net/test/read.cgi/tech/1083550483/l50
プリプロセッサについて熱く語るスレ。
http://pc5.2ch.net/test/read.cgi/tech/1058203590/l50
フリーコンパイラー使えよ。
http://pc5.2ch.net/test/read.cgi/tech/1061384369/l50
C統合・質問スレッド
http://pc5.2ch.net/test/read.cgi/tech/1068359871/l50
くだらない質問でもべっちょ偉そうに聞いていいスレ
http://pc5.2ch.net/test/read.cgi/tech/1069530956/l50
0004デフォルトの名無しさんNGNG
C++BuilderXでGUIアプリを作成する場合には
MFCは使えるのでしょうか?
0005デフォルトの名無しさんNGNG
>>4
こっち。
Borland C++ BuilderX
ttp://pc5.2ch.net/test/read.cgi/tech/1065260556/l50
0006デフォルトの名無しさんNGNG
BCC5.5.1 で DirectDraw を使っています。
以下のコードを含むプログラムを1000回ほど繰り返すのですが、
このコードの違いだけで 40FPS もの差がでており、?な状況です。

//遅いコード
tmp = func();
*p = tmp;

//速いコード
*p = func();
tmp = *p;


p はサーフェス上のピクセルデータを指す WORD 型へのポインタです。
このような差が出てしまう原因として、どういったことが考えられるのでしょうか?
よろしくお願いします。
0007デフォルトの名無しさんNGNG
書き忘れていました。
tmp の型と、func() の戻り値の型は DWORD です。
0008デフォルトの名無しさんNGNG
前者と後者、全く意味の異なる記述なんだけど。
それだけじゃわからねーから、ソース上げろ
0009デフォルトの名無しさんNGNG
ごちゃごちゃしてますがこんな感じになっています。
else if (pixelinfo.bpp_ == 16) {
  LONG srcpitch = srcddsd.lPitch / 2, dstpitch = dstddsd.lPitch / 2;
  WORD* const srcptr = static_cast<WORD*>(srcddsd.lpSurface);
  WORD* const dstptr = static_cast<WORD*>(dstddsd.lpSurface);
  DWORD srcclr0=0, dstclr0=0, newclr0=(*blendfunc)(dstclr0, srcclr0, alpha);

  for (int sy = srcrect2.top; sy < srcrect2.bottom; ++sy) {
    for (int sx = srcrect2.left; sx < srcrect2.right; ++sx) {
      DWORD srcclr = srcptr[srcpitch * sy + sx];

      if (!trans || srcclr != clrkey) {
        int dx = dstx + (sx - srcrect->left);
        int dy = dsty + (sy - srcrect->top);
        WORD* dp = dstptr + dstpitch * dy + dx;
        DWORD dstclr = *dp;

        if (srcclr == srcclr0 && dstclr == dstclr0) {
          *dp = newclr0;
        }
        else {
          *dp = (*blendfunc)(dstclr, srcclr, alpha); //(1)
          srcclr0 = srcclr;
          dstclr0 = dstclr;
          newclr0 = *dp;     //(2)
        }
            :
(1)の部分を newclr0 = (*blendfunc)(dstclr, srcclr, alpha);
(2)の部分を *dp = newclr0;
と変えてコンパイルしているだけなのですが、
何かお分かりになりましたらよろしくお願いします。
0010デフォルトの名無しさんNGNG
>>9
サーフェスをVRAMに置いてないか?
0011デフォルトの名無しさんNGNG
>>10
俺もVRAM通してるから、と一瞬思ったが、それだと下のは逆の結果にならないか?

>//遅いコード
>tmp = func();
>*p = tmp;

>//速いコード
>*p = func();
>tmp = *p;
00126NGNG
転送元サーフェスも転送先サーフェスもシステムメモリ上に
作成しました。何でなんですかね…。
0013デフォルトの名無しさんNGNG
DWORD newclr0; と WORD* dp; では宣言している場所が違うから。
見た感じだけど、その程度のプログラム量なら
マシン語になった際 newclr0 はスタック上に存在するが、
dp はレジスタを使っている気がする。
0014デフォルトの名無しさんNGNG
めんどくさいからアセンブリリストか実行可能な最小のコード上げた方がいいと思うよ。
0015デフォルトの名無しさんNGNG
          *dp = (*blendfunc)(dstclr, srcclr, alpha); //(1)
          newclr0 = *dp;     //(2)
          srcclr0 = srcclr;
          dstclr0 = dstclr;


          newclr0 = (*blendfunc)(dstclr, srcclr, alpha); //(1')
          *dp = newclr0;     //(2')
          srcclr0 = srcclr;
          dstclr0 = dstclr;

こうなってても変わらん?
0016デフォルトの名無しさんNGNG
あの、シフト演算子をオーバーロードする際に、次の引数へ移行するにはどうすればよいのでしょうか。お願いします。
0017デフォルトの名無しさんNGNG
>>16
次の引数も何も、オーバーロードはそれだけで完結するんだが。

std::cout << a << b << c;

とかやりたいの?

(((std::cout << a) << b) << c);
001816NGNG
>>17
ああいやoperator<<()で独自の機能を持たせようとしてるんですけど、独自の機能もたせるとシフトしてくれないんですよ。何かいい方法あるでしょうか。
0019デフォルトの名無しさんNGNG
シフトを独自の機能で置き換えてるんだからあたりまえじゃないの?
あと、>>16をどう読んでも>>18にはならない。もっと日本語がんばれ。
0020デフォルトの名無しさんNGNG
>>18
operator<<()の中にシフトのコードもインラインアセンブリなんかで書く。
0021デフォルトの名無しさんNGNG
>>1
おつ
0022デフォルトの名無しさんNGNG
this-><< 使え
0023デフォルトの名無しさんNGNG
入力ファイルの一行目にファイル名が書いてあります。
そのファイル名を出力するファイル名にしたいのですが
実行すると「出力先ファイルを開けませんでした。」と出ます。
なぜなんでしょうか?
入力ファイル名をきちんとgetできているか
putsで確認したところちゃんとgetできていました。

printf("入力ファイル名を入力してください。 :");
gets(infile);
if((fin=fopen(infile, "r")) == NULL){
    printf(".cume ファイルを開けませんでした。\n");
    exit(1);
}

fgets(outfile, 256, fin);putchar('\n');
puts(outfile);
if((fout=fopen(outfile, "w")) == NULL){
    printf("出力先ファイルを開けませんでした。\n");
    exit(1);
}
0024デフォルトの名無しさんNGNG
>>23
fgetsは改行文字を保存するから。
0025デフォルトの名無しさんNGNG
>>23
fgetsは改行文字も読み込むから、まずそれを捨てろ。
0026デフォルトの名無しさんNGNG
改行文字 fgets()
でググって色々調べたところ

len = strlen(outfile);
outfile[len - 1] = '\0';

↑の二行を追加することで問題が解決しました。
ありがとうございました。

0027デフォルトの名無しさんNGNG
前スレで嘘を教えたらいかんとか言われたんだけどさ。
きちんと本を読んで書いたし、
違う場所があるなら違う場所を言えばいいのになぁ・・・
自分にも相手にも、質問者にも為にならないし
0028デフォルトの名無しさんNGNG
>>27
俺は指摘した本人ではないが、

>2.
>外部変数(グローバル変数)になった時だけ、両方の意味が同じになります。
同じではない。
グローバル変数にstaticをつけると、関数につけるのと同じで、
他のファイル(翻訳単位)から参照できなくする。

>少しの違いといえばintなら0で初期化されるかされないかの違いぐらいで、
どちらも0で初期化される。

>staticを使ったからといって通用範囲が狭くなるわけでもありません。
狭くなる(上述)。
0029デフォルトの名無しさんNGNG
>>28
autoだって元々参照できないでしょうに。
他のファイルから参照って言うのはつまりincludeした場合ですか?

グローバル変数は全部初期化されるんですね。
俺が勉強した時(2、3年前)にautoは初期化されないと読んだような気がしたので。
0030デフォルトの名無しさんNGNG
>>29
>autoだって元々参照できないでしょうに
autoはローカル変数だけだぞ?
void func(void) {auto int a;} /* ok, 単にint a;と書いても同じ。初期化されない。 */
auto int b = 4; /* error */

>他のファイルから参照って言うのはつまりincludeした場合ですか?
/** a.c **/
int g;
/** b.c **/
extern int g;
/* ここでgを使う */
0031デフォルトの名無しさんNGNG
スコープと記憶クラスを混同しまくってる悪寒。
0032デフォルトの名無しさんNGNG
>>30
未熟さ故の過ちなので許してください。

>autoはローカル変数だけだぞ?
初めて知りました。
有難うございます。

>>他のファイルから参照って言うのはつまりincludeした場合ですか?
>/** a.c **/
>int g;
>/** b.c **/
>extern int g;
>/* ここでgを使う */
autoがローカル変数のみという事が解ったので
こちらも自然と解りました

有がとうございます
0033デフォルトの名無しさんNGNG
前スレ 984
http://pc5.2ch.net/test/read.cgi/tech/1086373839/984
>1.
>ソースファイル一つを関数一つと考えるとその通りです。
>ただ関数内のグローバル変数という時点でグローバルでは無いわけですが
>”変数の範囲”としてはそう考えていいでしょう。

ここも嘘
0034デフォルトの名無しさんNGNG
>>33は
>>27を読もう
0035デフォルトの名無しさんNGNG
>>27
その書き込みのときに読んだ本の名前、晒しといたほうがいいんじゃないか?
0036デフォルトの名無しさんNGNG
参考書籍の間違いくらい自分で見つけられないと後で苦労すると思うけどなあ。
うのみにする方が問題。
0037デフォルトの名無しさんNGNG
std::vector<unsigned char> array(...);
std::string<char> s(array.begin(), array.end());

ってできないんですか?
0038デフォルトの名無しさんNGNG
なんで片方だけunsignedなんですか?
0039デフォルトの名無しさんNGNG
>>37
string<char> → basic_string<char>

・・・なんかgccだとstring<char>が通った。ナンダコレ
0040デフォルトの名無しさんNGNG
>>39
#include <iostream>
using namespace std;
template <typename T> class A {};
typedef A <char> Achar;
int main () {
cout << typeid (A <char>).name () << endl;
cout << typeid (Achar <char>).name () << endl;
return 0;
}
これでもエラー出ませんね.実行すると
1AIcE
1AIcE
と出力します.因みに当方は3.3.4です.
0041デフォルトの名無しさんNGNG
gccショボイな。
-Wall -ansi付けても警告も出ないのか?
0042デフォルトの名無しさんNGNG
-pedanticも付けてね
0043デフォルトの名無しさんNGNG
>>41
でないです.
0044デフォルトの名無しさんNGNG
>>42
-Wall -ansi -pedantic
で何事もなかったようにコンパイルします.
0045デフォルトの名無しさんNGNG
ガーソ
0046デフォルトの名無しさんNGNG
vector<string> get();

なんてメソッドを作ったらアホって言われた。
速度なんてどうでもいいクラスだからこうしてるつもりだったけど
やっぱり

void get(vector<string>&)

って書くべきですか?
0047デフォルトの名無しさんNGNG
別に前者でいいんじゃないか?どうせvoid get(...)の中で
コピーするわけだろう?
0048デフォルトの名無しさんNGNG
え〜?
vector<string> get()は2回コピーするから2倍遅いよ。
0049デフォルトの名無しさんNGNG
クラス名やメンバ変数に名前をつけるときに何か気をつけることある?
0050デフォルトの名無しさんNGNG
>>49
ttp://pc5.2ch.net/test/read.cgi/tech/1087209526/
ttp://pc5.2ch.net/test/read.cgi/tech/1014486422/
0051デフォルトの名無しさんNGNG
int count[0x100 * 0x100];

の「0x100」部分が何をやってるのかわかりません。 ごめんなさいごめんなさい 助けてください。
0052デフォルトの名無しさんNGNG
>>51
16進数で100ってことだが…
0053デフォルトの名無しさんNGNG
0を最初につけると8進数
0xを最初につけると16進数
1〜9が最初ならば10進数
005451NGNG
>>52 >>53  ありがとうです;;  
ココを16進表記するのはどんな時ですか? 数字以外を入れたいとき? 
0055デフォルトの名無しさんNGNG
>>54
気分次第。 256 より 0x100 の方が見た目キリがいい(かどうかは書いた本人次第だが)でしょ?
0056デフォルトの名無しさんNGNG
134217728
よりも
0x8000000
のが見やすいからです
0057デフォルトの名無しさんNGNG
0x5f5e100
100000000
0058デフォルトの名無しさんNGNG
>>57
そういう場合は下を使うだろう
ってか態々100000とか見やすいのを醜くする方が頭可笑しいよな
005951NGNG
うう・・・ 皆ありがとうでした。 がんがります。
0060デフォルトの名無しさんNGNG
キリがいいかキリが悪いかはあまり関係ない。
16進で書くべきものはキリが悪かろうと16進で書く。
これが >>57 アドレスを指すなら多くの人は16進を選択するだろう。
0061デフォルトの名無しさんNGNG
#include <iostream>
using namespace std;
class A {
protected:
int a;
public:
A(int v) { a = v; }
};
class B : public A {
protected:
int b;
public:
B(int v) { b = v; }
int get() { return a; }
};
int main() {
B bb(10);
cout << bb.get() << endl;
return 0;
}
test.cpp: In constructor `B::B(int)':
test.cpp:18: no matching function for call to `A::A()'
test.cpp:5: candidates are: A::A(const A&)
test.cpp:9: A::A(int)
このエラーはどうしたらいいのでしょうか?
0062デフォルトの名無しさんNGNG
B(int v) : A(v) { b = v; } じゃない?
0063デフォルトの名無しさんNGNG
>62
ありがとう御座います。
表示されました。
0064デフォルトの名無しさんNGNG
ごめん、あげちゃった
0065デフォルトの名無しさんNGNG
std::listってどんなときに使うの?
std::dequeでよくね?
つーか、ぶっちゃけいらないんだけど・・・
0066デフォルトの名無しさんNGNG
コピーコンストラクタが重いとき
0067デフォルトの名無しさんNGNG
要素へのイテレーターや参照が無効になるのが嫌なとき。
0068デフォルトの名無しさんNGNG
x = (50, 2);

これはどういう理屈で2を返すんでげすか?
0069デフォルトの名無しさんNGNG
カンマ演算子の働き
0070デフォルトの名無しさんNGNG
初心者歓迎ということで教えてください。
C言語(コンパイラはVC++)でSQL Serverにアクセルする場合は
一般的にはどのような方法で行うのがよいでしょうか?
現在考えているのは
http://homepage1.nifty.com/kojama/works/rdbms/conn/vc.html#apisel
のODBC(API)で SELECT(CSV形式で標準出力に表示) の
やり方です。
もっと簡単で標準的な方法があればおしえてください。
0071デフォルトの名無しさんNGNG
アクセルしたらブレーキして下さい
0072デフォルトの名無しさんNGNG
もちろんしますよ
0073デフォルトの名無しさんNGNG
クラッチしたらシフトチェンジして下さい
0074デフォルトの名無しさんNGNG
51です。 しつこくアホですみません;;

data[0]="a";
data[1]="b";

count[(data[0]<<8)+data[1]]++;

こういう書き方ってできるんでしょうか?
やってることは、分布数えソートで文字列「ab」の分布を数えてるのですが・・・・・
何で配列の添字に数字以外が入ってるのかわからない;; 

0075デフォルトの名無しさんNGNG
二重引用符(文字列定数)ではなく引用符(文字定数)じゃないのか。
data[0]='a'; data[1]='b';

char型変数二文字分をまとめて2バイトの数値にして、
テーブルのインデックスに使ってるんでしょ。

具体的には、ASCIIコードな環境では'a'は0x61、'b'が0x62なので、
count[0x6162]の値をインクリメントしてる。
0076デフォルトの名無しさんNGNG
俺だったらマクロ噛ましてcount[MAKEWORD(data[0]<<8, data[1])]++;
0077デフォルトの名無しさんNGNG
MAKEWORD(data[0], data[1])の方が良くないか?
0078デフォルトの名無しさんNGNG
つか、論点ズレすぎ
0079デフォルトの名無しさんNGNG
>>74
漏れの予想だが、そのソフトは想定した動きをしない。

http://do.sakura.ne.jp/%7Ejunkroom/cgi-bin/megabbs/lounge/index.html
ここの問題スレに問題のソースを張ってみ?
0080デフォルトの名無しさんNGNG
ありがとうございました。 勘所がわかって感涙しております。 精進しまつ。

>>79  見てるのは他人のソースなので、完成したら貼らしてもらいます。。
0081デフォルトの名無しさんNGNG
初心者歓迎なのは、初心者をいじめたいからなの?
0082デフォルトの名無しさんNGNG
当たり前だ。
0083デフォルトの名無しさんNGNG
夏満開
0084デフォルトの名無しさんNGNG
んー、教えてクンはどこのスレにいっても歓迎されん罠。
「初心者歓迎」のタイトルを見て教えてクンが集まってくるから、
叩かれる事も多い。
それで剣呑に見えんじゃないの、このスレ。
自分的には、まともな質問者にはそれなりにきちんと回答してるつもりだけど。
0085デフォルトの名無しさんNGNG
初心者をいじめてるのも初心者
0086デフォルトの名無しさんNGNG
protected:があるのに、private:ってつかうのか?
0087デフォルトの名無しさんNGNG
それはpublicがあるのにprotectedって使うのか?という質問に似ている。
0088デフォルトの名無しさんNGNG
派生のprotectedならいらんけど
0089GROAD ◆4C1MajRa36 NGNG
すみません
質問させていただきます
環境はWin32APIです
今回、初めてブラウザ補助ツールを組むことになったのです
(ダウンロード補助)
小ウィンドウにアドレスを入力させ親ウィンドウに情報を受け渡してから接続させたいのですが肝心のアドレス(URL)の認識とアクセスのさせかたがわかりません
とりあえず調べてみたのですが書いてあるサイトは見つけられませんでした。
どの関数を使えばいいのでしょうか?
ヒントだけでもいいので御教授頂けると幸いです
0090デフォルトの名無しさんNGNG
「アドレスの認識」なる特殊用語の詳細を求む。
0091デフォルトの名無しさんNGNG
コンストラクタって、なんか、難しいな。
0092デフォルトの名無しさんNGNG
C++をやってみたいのですが、初心者が読んでも理解できる本はありますか?
他のプログラムはBASICしかしりません。
0093GROAD ◆4C1MajRa36 NGNG
>>90説明が下手で申し訳ありません
URLのことです
0094デフォルトの名無しさんNGNG
>>89
winsock
0095デフォルトの名無しさんNGNG
>>92
お前には無理。
0096デフォルトの名無しさんNGNG
>95
無理な根拠を上げよ。
0097デフォルトの名無しさんNGNG
>96
無理では無い根拠を挙げよ。
つか、ぐだぐだ言ってないで本屋なり図書館なり行けっての。
検索したり推薦図書などのスレもあるのに。
0098デフォルトの名無しさんNGNG
>>92
推薦図書/必読書のためのスレッド PART 19
http://pc5.2ch.net/test/read.cgi/tech/1089492835/
0099GROAD ◆4C1MajRa36 NGNG
>>94本当にありがとうございます
これで何とか作れそうです。
お礼に土産話を一つ
http://www.babu.com/~wristcut/i/ii/k/732.htm
0100デフォルトの名無しさんNGNG
>>99
もう一度いうがwinsockで間違ってない
期待してたのはプロセス間通信か?
回答を理解できない程度で気分悪いことするなよ
0101デフォルトの名無しさんNGNG
>>100
馬鹿を相手にしてはいけません。
0102GROAD ◆4C1MajRa36 NGNG
はい。
データさえ落とせればいいのですからプロセスで大丈夫です
(リンクを確率させる必要はありません)
0103デフォルトの名無しさんNGNG
 ┌─────────┐
 │ 基地外警報!!!  |
 │   基地外警報!! |
 └―――──――――┘
      ヽ(´ー`)ノ
         (  へ)
          く
0104デフォルトの名無しさんNGNG
なんで自分に知識もなく、それを説明する能力もないのに作りたがるのかな。
そんなに自分のアイディアに自信でもあるんだろうか。
0105デフォルトの名無しさんNGNG
馬鹿と天才は紙一重と言うからな。
0106デフォルトの名無しさんNGNG
& や | といったビット演算で得られるビットパターンというのは、
その数値の内部表現を表しているのでしょうか?

NULLポインタに限らず整数の0でも、内部表現が0とは限らないというのを
どこかで聞いたんですが、たとえば整数0の内部表現に1のビットが含まれて
いるとき、ビット演算で1を取り出すことが出来るのでしょうか。
0107デフォルトの名無しさんNGNG
>>106
unionを使えば簡単だでや?

union {
void *pvValue;
double dValue;
long lValue;
};
pvValue = (void *)&lValue;
printf("%08X\n", lValue);
dValue = 0.01;
printf("%08X\n", lValue);
return 0;
0108デフォルトの名無しさんNGNG
メンバ関数ポインタについて質問があります。

class A{};
class B :public A
{
 void Func(){}
};
↑のようにclass Aから派生したclass Bがあったとき

B b;
A *a=&b;
void (A::*pFunc)()=(void (A::*)())b.Func;
(a->*pFunc)();
↑こんな感じで、
基本クラスのメンバ関数ポインタpFuncに
class Bの関数を(void (A::*)())にキャストして代入し、
呼び出し時も(a->*pFunc)()で呼び出しても
見た目は動いているように見えます。

このように書いても問題はないのでしょうか。
危険な部分がありましたら教えてください。
0109デフォルトの名無しさんNGNG
>>108
キャストが危険。あたりまえ。
0110デフォルトの名無しさんNGNG
virtual
0111デフォルトの名無しさんNGNG
>>108
危険すぎます。
実行したらペンタゴンにpingを打ちまくっていますw
0112108NGNG
>>109>>111
レスありがとうございます。
やはり危険ですか。
キャストについて理解してないのでこんな質問を
してしまったわけですね…
0113デフォルトの名無しさんNGNG
というかそんな変な書き方が横行しているわけもなく
0114デフォルトの名無しさんNGNG
メンバ関数ポインタの型が完全に一致していれば、問題ないんでは。
もっとも、そんな奇天烈なコードが本当に必要なのか見直すのが先だけど。
0115108NGNG
>>114
実装したかった内容は、
配列、リスト等に様々なクラスのメンバ関数をポインタとして持ち
逐次実行できるような構造です。
仮想関数だと似たようなことはできますが、
実行できる関数がvirtualのついている1関数に限定されてしまうので
悩んでいます。
0116デフォルトの名無しさんNGNG
単に呼び出す可能性がある物は仮想関数にしとけば良いんでは。
キャストするにしても呼び出す関数はコード内で指定しているわけだから
仮想関数だと限定云々は良くわからん。
0117デフォルトの名無しさんNGNG
>様々なクラス
これを一緒くたにすること自体が問題
「できること」と「するべきこと」は違うのよ

>そんな奇天烈なコードが本当に必要なのか
これを深くかみしめたまい
0118デフォルトの名無しさんNGNG
1.リストに格納する予定のオブジェクトに必要な機能を洗い出す
2.必要な機能を実現する為の関数をもった抽象クラス=インターフェースを作る。
3.各クラスでそのインターフェースを継承して関数を実装する

1の手順を踏まずにコードを書き出して混乱してるんじゃないのか。
0119106NGNG
>>107
ありがとうございます。せっかく書いていただいたのですが
よく分かりません^^; つまり、どういうことなのでしょうか
0120デフォルトの名無しさんNGNG
>>115
LokiのFunctor(boostにもある?)を使えば以下のようなことができるけど,
こんなことじゃなくて?
#include <iostream>
#include <loki/Functor.h>
#include <functional>
#include <list>
using namespace std;
struct A {
void show () const {cout << "A" << endl;}
};
struct B {
void show () const {cout << "B" << endl;}
};
typedef Loki::Functor <void> Functor;
typedef list <Functor> Functor_Container;
int main () {
A a0; B b0;
Functor_Container fc; fc.push_back (Functor (&a0, &A::show)); fc.push_back (Functor (&b0, &B::show));
for_each (fc.begin (), fc.end (), mem_fun_ref_t <void, Functor> (&Functor::operator ()));
return 0;
}
出力:
A
B
0121108NGNG
>>116>>117>>118
私も構造自体だめなんだと薄々感じています。
見直した方がよいのかもしれないですが、
他人に見せることのないオナニーコードなので
突き進もうと思います。

キャストが怖いとのことでしたので、
temlateを使って妥協することにしました。
struct A
{
 virtual void Call(){}
 virtual ~A(){}
};

template <class T>
struct B : public A
{
 T* pThis;
 void (T::*pFunc)();
 B(T* tThis,void (T::*tFunc)()){pThis=tThis;pFunc=tFunc;}
 virtual void Call()
 {
  if(pThis)
   (pThis->*pFunc)();
 }
};

↑こんな感じにしておいて配列、リストにでも入れようと思います。
std::list<A*> a;
0122デフォルトの名無しさんNGNG
岩盤の中を爪楊枝で削りながら突き進んでる姿が浮かびました
0123デフォルトの名無しさんNGNG
>>119
昔GCCスレに書いたもの(何だか今見れないので)を差し上げましょう.
これでビットパターンを見れるので,いろいろ観察して遊んでみて下さい.
#include <iostream>
#include <bitset>
template <class T> std::ostream & output_as_bits (std::ostream &p_os, const T &p, bool ascending_order = true) {
std::bitset <sizeof (T) * 8> p_bit; const char *pp (reinterpret_cast <const char *> (&p)); char byte_digit (1);
for (size_t i (0); i < p_bit.size (); ++ i) {
p_bit.set (i, static_cast <bool> (*pp & byte_digit));
if ((i + 1) % 8) byte_digit <<= 1;
else {byte_digit = 1; ++ pp;}
}
if (ascending_order) {
p_os << "L"; size_t i (0);
while (i != p_bit.size ()) {p_os << p_bit.test (i); ++ i;} p_os << "H";
} else {
p_os << "H"; size_t i (p_bit.size ());
do {-- i; p_os << p_bit.test (i);} while (i != 0); p_os << "L";
}
return p_os;
}
int main () {
int i0 (10); float f0 (10);
output_as_bits (std::cout, i0) << std::endl;
output_as_bits (std::cout, f0) << std::endl;
return 0;
}
0124108NGNG
>>120
うわー、そのものずばりな機能です^^;
今検索させてもらいましたが、
すごい機能ですね…。
0125デフォルトの名無しさんNGNG
>>124
mem_fun_ref_tがちょっとかっこ悪いんですけどね.
0126デフォルトの名無しさんNGNG
>>123
へぇ〜、カッコイイコード書くじゃん

>>122みたいな馬鹿ばっかかと思ってたけど、骨のある奴いるんだね
0127122NGNG
バカは認めるけど どうしてそのタイミングで引き合いに出すのか
せっかくならもっと笑いになるよう努力してください
0128108NGNG
>>125
いやまあ、そういったかっこ悪いとかはまあ…

でも、解決しましたです。
教えていただきありがとうございました。
0129106NGNG
>>123
おお、、ソースまでありがとうございます。
弄りながら、これから色々試してみることにします。
0130120NGNG
Lokiやめてboostにしてみました.
こちらはmem_fun_ref_tでテンプレートパラメータを渡す必要がないですね.
#include <iostream>
#include <functional>
#include <list>
#include <boost/function.hpp>
#include <boost/bind.hpp>
using namespace std;
struct A {
void show () const {cout << "A" << endl;}
};
struct B {
void show () const {cout << "B" << endl;}
};
typedef boost::function <void ()> Functor;
typedef list <Functor> Functor_Container;
int main () {
A a0; B b0;
Functor_Container fc; fc.push_back (boost::bind (&A::show, a0)); fc.push_back (boost::bind (&B::show, b0));
for_each (fc.begin (), fc.end (), mem_fun_ref (&Functor::operator ()));
return 0;
}
0131120NGNG
>>130
訂正.
- Functor_Container fc; fc.push_back (boost::bind (&A::show, a0)); fc.push_back (boost::bind (&B::show, b0));
+ Functor_Container fc; fc.push_back (boost::bind (&A::show, &a0)); fc.push_back (boost::bind (&B::show, &b0));

アドレスを渡さないとコピーしちゃうみたいですね.
0132デフォルトの名無しさんNGNG
確かに便利だが、実現ツールが準備されていて「設計見直せ」というレスが薄ら寒く見えるのが悲しい…
0133デフォルトの名無しさんNGNG
選択肢は多い方が良いんじゃないか?
それに本当に設計を見直した方が良いのかは質問者が決める事で、
質問スレの意義は選択肢を提示するところにあるんじゃないだろうか。
0134デフォルトの名無しさんNGNG
文脈がよくわかりませんがもっともですね
0135デフォルトの名無しさんNGNG
WindowsAPIのデバイスコンテキストについてなんですが
デバイスコンテキストを使ってLineToやTextOutを使って描画した線や文字というのは
一体どこに保存されているのでしょうか?
デバイスコンテキストなのか、それともビットマップなのか・・・
是非ともご教授下さい。
お願いします。
0136デフォルトの名無しさんNGNG
デバイスコンテキストに選択されているビットマップ
0137デフォルトの名無しさんNGNG
保存なんてされませんぜ、あにき
0138デフォルトの名無しさんNGNG
保存はされないな。強いて言えばビデオメモリか
0139デフォルトの名無しさんNGNG
>>135
保存されない。試しに描いたWindowの上に他のWindowを重ねてみれば、
描いたはずの絵が消える。もし保存したければ、ビットマップに一度描いて
それをWindowに描画する処理が必要。
0140デフォルトの名無しさんNGNG
配列って{}で囲むんですよね?
あるソース見て
char[][5] =
{
  0x01, 0x02, 0x03, 0x04, 0x05,
  0x06, 0x07, 0x08, 0x09, 0x10
}
ってのがあったのだが、これってOKなの?
0141デフォルトの名無しさんNGNG
>>140
printfしたら

↑こんなのがいっぱい出てきました。
2ちゃんで表示できているか心配です。

0142デフォルトの名無しさんNGNG
やはり表示できませんでした。ごめんなさい。さようなら・・
0143デフォルトの名無しさんNGNG
>>140
OKだよ。
だけど古いコンパイラではエラーになるかもしれない。
0144デフォルトの名無しさんNGNG
>>141
制御文字に当たるから書き込んでもうまく表示されるわけないだろう。
0145デフォルトの名無しさんNGNG
>>144
君はよく天然といわれるだろう?
0146デフォルトの名無しさんNGNG
そうだ、'\0'が抜けてた。
0147デフォルトの名無しさんNGNG
C++の文法は覚えたけど、オブジェクト指向がよく分からない。
0148デフォルトの名無しさんNGNG
シナリヲと配役が決まったらあとは演技させるだけ、だが?
0149デフォルトの名無しさんNGNG
糞レスはいらん。
0150デフォルトの名無しさんNGNG
AGE

0151135NGNG
レスどうもです
うーむ・・・保存されないんですか
てっきり、画像データみたいな感じでメモリかどっかに保存
されてると思ってたんですが見当違いみたいですね
それじゃあ、プログラム内でウィンドウそのものを画像データ化
(キャプチャーソフトの様な感じで)というのは出来ないのでしょうか?
こんなことを聞いているのは何故かと言いますと、ネットワークを介
したお絵かきソフトを作りたいなと思いサーバ・クライアント間で
画像データを共有出来る方法を探ってるわけです
ちなみに、ネットワーク部分はほぼ完成しているので、後は画像データさえ
作れれば何とかなると思うのですが・・・これが良くわからないのです
是非、何かアドバイスをお願いします
後、長文失礼しました
0152デフォルトの名無しさんNGNG
>>151
サーバに画像用のメモリ確保してクライアントはそっちに書き、各クライアントに配信するか
サーバにクライアントのマウス情報を送り、サーバはそのマウス情報を(ry
してクライアントはそのマウス情報にそって(ry
画像キャプチャしながら送りあっていたら28.8kの通信速度じゃ無理だ。
0153デフォルトの名無しさんNGNG
>>151
描画コマンドはメタファイルとして保存できる
描画結果だけならDIBセクションとか使ってDIBにBltすればいい。
0154151NGNG
>>152
実は、リアルタイム通信じゃ無かったりします
クライアント1が描いてる間、他のクライアントは絵の内容を見れません
イメージとしては
C1が絵を描く→描き終わったらSへ画像データを送信→C2が画像を見る
※C・・クライアント S・・サーバ
なので、絵を見たり描いたり出来るのは同時に1人だけです

>>153
メタファイルというのは初耳です
DIBセクションというのは、BitBltみたいな感じなんでしょうか
ちょっと調べて見ます

どうもありがとうございました
0155151NGNG
うぅ・・サゲ忘れてた・・
0156151NGNG
連続ですみません
どーしてもわからないので、ちょっと現在のソースをUpしてみます
ttp://gamdev.org/up/img/980.zip

結局どこに画像のデータが入ってるのかわからずじまいです・・・
何かアドバイスをお願いします
0157デフォルトの名無しさんNGNG
>>156
lpBMP
0158デフォルトの名無しさんNGNG
環境依存だということなので、こちらで質問させていただきます。

空のフォルダを削除するにはどうしたらいいのでしょうか?
googleで検索してもなかなか見つからず、
やっとサンプルコードが見つかったと思ったら、ないヘッダがインクルードしてあって
結局分かりませんでした。

0159デフォルトの名無しさんNGNG
>>158
ないヘッダって何?
0160デフォルトの名無しさんNGNG
>>158
環境書けやコラ
0161デフォルトの名無しさんNGNG
c++には、javaの親クラスを指す
superのようなのはないんですか?
0162デフォルトの名無しさんNGNG
>>158
C++なら,
#include <cstdio>
int main () {
std::remove("hoge");
return 0;
}
Cなら,
#include <stdio.h>
int main () {
remove("hoge");
return 0;
}
とか.hogeはパスです.
0163151NGNG
>>157
言われた通りにデータ構造体に void* lpBMPを追加して
直接RGBの値(輝度?)を設定して画面全体が水色になったサーバ上の絵を
クライアントに送りました
[クライアントのデータ受信](データ受信時に画像作成)
hBitmap = CreateDIBSection(NULL, &bmi, DIB_RGB_COLORS, &g_RcvPictureData.lpBMP, NULL, 0);
こんな感じにしてみたんですが、残念なことにクライアントでは画面真っ黒な状態です・・・
サーバでは水色になってるんですが
lpBMPだけじゃダメなんでしょうか・・・
うーむ・・デバイス独立ビットマップっていうぐらいだから、DCに依存しないと思うんですが
謎です・・・困った
0164デフォルトの名無しさんNGNG
>>162
158ではないが、今のremoveはフォルダ/ディレクトリを消せるのか。知らなかったよ。
0165デフォルトの名無しさんNGNG
>>163
ポインタじゃなくて中身をコピーしろよ
0166151NGNG
>>165
中身・・・ですか
サーバ側では送信データのlpBMPに対して
((char*)g_SndPictureData.lpBMP)[offset+2] = 127;
このように直接値を入れて、これをそのままクライアントに送ってるのですが
これだと中身は送られてないんでしょうか・・・
0167162NGNG
>>164
Linuxのmanによると,
>remove deletes a name from the filesystem. It calls unlink for files,
>and rmdir for directories.
と書かれています.
標準ライブラリなのでたぶん158の環境でも大丈夫だと思うんですけどね.
0168デフォルトの名無しさんNGNG
ディレクトリの削除が可能かどうかは実装依存
0169デフォルトの名無しさんNGNG
>>167
removeは標準ライブラリじゃねーよ
0170デフォルトの名無しさんNGNG
>>169
http://66.102.7.104/search?q=cache:EXoeqkMCCkcJ:docs.hp.com/ja/B2355-60104-07/remove.3C.html+remove+ANSI+C&hl=ja&lr=lang_ja&inlang=ja
0171デフォルトの名無しさんNGNG
ここの方が標準ライブラリと明記されてるからいいよ
http://66.102.7.104/search?q=cache:aK3AwFixgYsJ:www.st.rim.or.jp/~phinloda/cqa/cqa13.html+remove+ANSI+C&hl=ja&lr=lang_ja&inlang=ja
0172デフォルトの名無しさんNGNG
本日のバカ
----------------------------------------------------------

169 名前:デフォルトの名無しさん[sage] 投稿日:04/08/06 03:58
>>167
removeは標準ライブラリじゃねーよ

----------------------------------------------------------
0173デフォルトの名無しさんNGNG
removeがディレクトリを消せるかどうかは環境依存だな
少なくともLSI-Cや古いMS-Cでは消せなかった
0174162NGNG
>>168
じゃ,その可能性も考慮してboostで.
#include <boost/filesystem/path.hpp>
#include <boost/filesystem/operations.hpp>
int main () {
boost::filesystem::path dir ("hoge");
boost::filesystem::remove (dir);
return 0;
}
0175デフォルトの名無しさんNGNG
>>158
Windowsならwinodws.hのRemoveDirectory
0176デフォルトの名無しさんNGNG
unixなら、remove()内部で対象がファイルならunlink()、
対象がディレクトリならrmdir()を呼ぶように実装するのが当たり前だろ?
0177デフォルトの名無しさんNGNG
>>158のバカが環境を書いてないからなあ。
0178デフォルトの名無しさんNGNG
>>177
BCCらしい。けどここはBCCスレでもないしWin32APIスレでもないが。
http://pc5.2ch.net/test/read.cgi/tech/1090180012/872-875n
0179デフォルトの名無しさんNGNG
>>177
ばかはおまいだろ、屁理屈野郎
空のフォルダを削除するプログラムを書くのは
環境に依存しないよ
0180デフォルトの名無しさんNGNG
173
0181デフォルトの名無しさんNGNG
>>179
バカ晒しage
0182デフォルトの名無しさんNGNG
>>179
libc5 removeで検索しれ池沼
0183デフォルトの名無しさんNGNG
>>158
環境依存だと判ってるなら環境が何か書けよ。
0184デフォルトの名無しさんNGNG
すいません、教えてください。

#include <stdio.h>

main(void)
{
int i;
char math;


printf("計算したい加算乗除を選択してください。\n足し算:A\n引き算:B\n掛け算:C\n割り算:D\n");
gets(math);
if (math = "a"){
printf("足し算をします。\n");
}
else {
printf("その他の計算を行います。\n");
}


return 0;
}


今はif文のテストとしてメッセージだけを表示されるように組んでます。
何故だか分からないんですけどエラーが出るんです。
どうすればいいのか、どなたか教えていただけませんか?
0185デフォルトの名無しさんNGNG
>エラーが出る
コンパイルが出来ないのか、実行時エラーなのか、エラーメッセージ書け、ヴォケ

>char math;
>gets(math);
getsの引数はchar *型を指定する。gets(&math)にすればコンパイルは通る、が実行時にアボン

>if (math = "a"){
文字列定数"a"はchar *型、char型のmathとは比較できない。
Cで文字列を比較するならstrcmpを使う。

char math[BUFF_SIZE];
とかにすれば、BUFF_SIZE-1文字までの入力なら動く。

どうでもいいが、入力を促すメッセージでは大文字の"A"なのに、
小文字の"a"との比較で良いのか?
0186デフォルトの名無しさんNGNG
>>151
裏画面つくってそこに描画してる…?
つくってるだけで終わってませんよね。

//裏画面Bitmap作製
DWORD *lpBMP;//画素データへのアドレス
HDC hBackDC=CreateCompatibleDC(NULL);
char bmbuf[sizeof(BITMAPINFOHEADER)];
BITMAPINFO &bi=*(BITMAPINFO*)&bmbuf;
BITMAPINFOHEADER &bih=bi.bmiHeader;
ZeroMemory(&bi.bmiHeader,sizeof(BITMAPINFOHEADER));
bih.biSize=sizeof(BITMAPINFOHEADER);
bih.biWidth=width;//ウィンドウ幅
bih.biHeight=-height;//ウィンドウ高さ
bih.biPlanes=1;
bih.biBitCount=32;
HBITMAP hBitmap=CreateDIBSection(NULL,(BITMAPINFO*)&bih,DIB_RGB_COLORS,(void**)&lpBMP,0,0);
ZeroMemory(lpBMP,sizeof(DWORD)*width*height);
SelectObject(hBackDC,hBitmap);

//描画は全部裏画面へ
TextOut(hBackDC,x,y,str,lstrlen(str));

//WM_PAINT等の最後では裏画面を表に転送
//hDCは表画面のデバイスコンテキスト
BitBlt(hDC,0,0,width,height,hBackDC,0,0,SRCCOPY);//裏画面→表画面にコピー

転送するのは裏画面ビットマップ全体。
画素データだけならlpBMP〜lpBMP*(DWORD)*width*heightに全部入っている。
0187デフォルトの名無しさんNGNG
>>184
if (math = "a"){
→if (math == "a"){
ってオチですか…?

比較は「==」ね。
0188デフォルトの名無しさんNGNG
ああすまん。リロードしてなかった。
185が大量に突っ込んでました…。
0189デフォルトの名無しさんNGNG
>>185
レスありがとうございます。
エラーは
「error C2664: 'gets' : 1 番目の引数を 'char' から 'char *' に変換できません。 (新しい機能 ; ヘルプを参照)
整数型からポインタ型への変換には reinterpret_cast、C スタイル キャストまたは関数スタイル キャストが必要です。」
と
「error C2440: '=' : 'char [2]' から 'char' に変換することはできません。(新しい動作 ; ヘルプを参照)
この変換には reinterpret_cast, C スタイル キャストまたは関数スタイルのキャストが必要です。」
です。
ちょっと分からないんですけどchar *型って何ですか?

大文字のAと小文字のaは普通に間違えてました。指摘どうも。

>>187
比較ってしたとすると具体的にどんな事をするんですか?
0190デフォルトの名無しさんNGNG
あ、==でなく=は素で見落としてた。

>ちょっと分からないんですけどchar *型って何ですか?
いくら初心者歓迎とはいえ…

char型へのポインタを格納する型。
Cには「文字列型」はないので、charに文字を格納し、
charの配列で文字列を扱う。
0191デフォルトの名無しさんNGNG
>>184
#include <stdio.h>
#include <conio.h>
main(void)
{
int i;
char math;
printf("計算したい加算乗除を選択してください。\n足し算:A\n引き算:B\n掛け算:C\n割り算:D\n");
do {
math = getch();
switch (math) {
case 'A' :
printf("足し算をします。\n");
break;
case 'B' :
printf("引き算をします。\n");
break;
case 'C' :
printf("掛け算をします。\n");
break;
case 'D' :
printf("割り算をします。\n");
break;
}
} while (math != 'A' && math != 'B' && math != 'C' && math != 'D');
return 0;
}
0192デフォルトの名無しさんNGNG
何かハードル高そうですね・・・・
勉強不足だったようです。
出直してきます。
ご迷惑おかけしました。
0193デフォルトの名無しさんNGNG
>>191
作り直していただき、ありがとうございます。
でも、192で書いたとおりです。
すいませんでした。
0194デフォルトの名無しさんNGNG
>加算乗除
引き算の立場は?
0195デフォルトの名無しさんNGNG
>>194
加算で負数を指定させることで対応。
0196デフォルトの名無しさんNGNG
剰余は?
0197151NGNG
>>186
サーバでもクライアントでも、裏から表へBitBltしてます
サーバから送るのは、(void**)&lpBMP 画素データと
HBITMAP hBitmap これでしょうか
↑これが裏画面ビットマップ?
0198デフォルトの名無しさんNGNG
>>197
アドレス渡しても意味無いんだよ、Cからやり直して来い。
送るべきデータは
lpBMP〜(lpBMP+((width+3)&~3)*height)
0199デフォルトの名無しさんNGNG
>>198
-1
0200デフォルトの名無しさんNGNG
C言語勉強してWin32APIつかって簡単なソフト5つほど作ったレベルなんですが、
C++にさっさと移行したほうがいいんでしょうか?Cの一通りの知識は頭に入ってるとは
思います。テクニックはほとんどないですが。
できればCからのC++への移行に最適な参考書を紹介していただければ幸いです。
0201デフォルトの名無しさんNGNG
>>200
とりあえず猫でも読んどけ。
0202デフォルトの名無しさんNGNG
もうしばらくC使ってた方がいいぞ
0203158NGNG
すいません。

<環境>
WindowsXP
BCC5.5
です。

>>159
標準でついてきてないヘッダで、
DLしたサンプルにもついてないヘッダです。

>>178
BCCスレに行こうかと思ったところ、このスレの【環境依存OK】が目に入ったもので。

>>162,>>174,>>175
ありがとうございます。
試してみます。
0204デフォルトの名無しさんNGNG

プログラムをコンパイルしようとしたら、
「インクルードファイルxxx.hをオープンできない」というエラーが発生しました。


A. コマンドラインコンパイラのパスが設定した後、
インクルードファイルやライブラリファイルの場所を指定したBCC32.CFGを作成しなければなりません。
これは、List 4のようなファイルです。

List 4 BCC32の設定(BCC32.CFG)


-IC:\Borland\Bcc55\Include
-LC:\Borland\Bcc55\Lib

コマンドラインコンパイラは、コンパイルが成功すると自動的にリンカ(ILINK32)を呼び出します。
場合によっては、リンカを明示的に呼び出すことがあります。
この場合は、同様にILINK32.CFGファイルを設定してください。
また、BCC32.CFGやILINK32.CFGには、これ以外にもコンパイラやリンカに設定するオプションをあらかじめ指定できます。

このファイルはbinのディレクトリの中に作ればいいんですよね。
普通にテキストファイルじゃダメっすか?
0205デフォルトの名無しさんNGNG
テキストファイルだけど拡張子はcfg
0206デフォルトの名無しさんNGNG
ちゃんとcfgになってますね。

以前にc言語をダウンロードした時にもpathを通すために
path=%path%;c:\progra~1\networ~1\mcafee~1c:\lsic86\binのパスや
ジャバのパス
path=c:\windows;c:windows\command;c:\j2sdk_nb\bin
などをms-dosに書き込んであるのですがそれが影響を及ぼしたりしますかね?
0207デフォルトの名無しさんNGNG
試してから聞け
0208デフォルトの名無しさんNGNG
初心者質問ですまん。
C言語環境で貴様の使っている、リストとかハッシュテーブルとかのライブラリを教えてくれ。
やっぱ、俺様ライブラリなん?
0209デフォルトの名無しさんNGNG
std::list, std::hash_set
0210デフォルトの名無しさんNGNG
>>209
それのどこがCなんだよ
0211デフォルトの名無しさんNGNG
boost
0212デフォルトの名無しさんNGNG
>>211
それのどこがCなんだよ
0213デフォルトの名無しさんNGNG
ABDEFGHIJKLMNOPQRSTUVWXYZ
0214デフォルトの名無しさんNGNG
>>213
Cがない。だからなんだ。
0215デフォルトの名無しさんNGNG
>206
BCC32.CFG.txtだったら殴るぞ。
0216デフォルトの名無しさんNGNG
208-214
なんか和んだ・・・
0217デフォルトの名無しさんNGNG
virtualをつけなくても関数の再定義が出来るのに、どうしてvirtualをつけるんですか?
0218デフォルトの名無しさんNGNG
全部作れ!って事をあらわすためだ
0219デフォルトの名無しさんNGNG
仮想関数にするためです
0220デフォルトの名無しさんNGNG
list<CHoge*> hoge;
list<CHoge*>::iterator p;
って、どういう意味なの?
0221デフォルトの名無しさんNGNG
>>220
list<CHoge*>型のhogeを定義。
list<CHoge*>::iterator型のpを定義。
0222デフォルトの名無しさんNGNG
ごめん、質問の仕方が悪かったです。
CHoge*って、ポインタを使ってるけど、なにか意味あるの?
0223デフォルトの名無しさんNGNG
>>222
色々有るんじゃない?
0224デフォルトの名無しさんNGNG
定数とグローバル変数について教えてください。

C言語でグローバルな定数を書く場合、ヘッダファイルに#defineや
enumで定義するのが普通かと思います。
これと同じことをconstを使ってやりたいのですが、単純に#defineのように
書くとリンクエラーになります。
こういった場合、どのようにするのが定石でしょうか?

お願いします。
0225224NGNG
すいません、解決しました。
もうちょっと調べてから書き込むべきでした。
お騒がせしてすいません。(でもまだ誰もみてないよな・・・)
0226デフォルトの名無しさんNGNG
見てないよ。
0227デフォルトの名無しさんNGNG
>>217
ポリモフィズムを実現するため。
関数オーバーロードでは出来ない。
0228デフォルトの名無しさんNGNG
ライドだろ
0229デフォルトの名無しさんNGNG
まぁ、「オーバーロードでは出来ない」だけ抜き出せば確かにそうかもしれん。
レスとしては不適切だが、角度とか。
0230デフォルトの名無しさんNGNG
おれの読んだ本にはメンバ関数にはすべて virtual をつけろと書いてあったので、
その通りにほとんど全メンバ関数につけている。
0231デフォルトの名無しさんNGNG
http://ray.sakura.ne.jp/tips/virtual.html
少なくともprivateメンバにはvirtualは要らない。
0232デフォルトの名無しさんNGNG
>231
俺、わりとfriend classとコンボでprivate virtual使うなぁ。
こいつの為のインターフェイスですよ。って明示的な感じだし。
0233デフォルトの名無しさんNGNG
>>231
理由が
>virtual 宣言した時と比べて 4 byte 節約・・・
かよ。virtualで宣言しているメリットと比較するとあまりに弱いな。
組み込み型でメモリとぼしいなら最初からC使っとけって気もするし。
なんだかねぇ。
0234デフォルトの名無しさんNGNG
>233
あくまで一例だろ。
non virtualの利点が思いつかないなら、C++なんぞやらずにJavaつかっとけ。
0235デフォルトの名無しさんNGNG
>>234
ちょっと読んでみたけど
> virtual キーワードがあるのは、このようにコストを減らせるようにするためです。
> int 型のデータメンバを1つしかもたないようなクラスでは、virtual にした場合、virtual
> にしないのと比べてコストが2倍になります。これはかなり大きな違いです。
アホかと思った。これ読んだ時点でその後読む気なくすなぁ・・
0236デフォルトの名無しさんNGNG
JavaあがりのC++プログラマいわく
なんにも考えないですべてバーチャルにしとけばいいじゃん
0237デフォルトの名無しさんNGNG
すべて Virtual で正解
0238デフォルトの名無しさんNGNG
コンストラクタもかよ
0239デフォルトの名無しさんNGNG
>>236
ぶっちゃけ Palm で開発してたときはそうしたけど
さすがに人に勧めるようなことは言いたくない
0240デフォルトの名無しさんNGNG
SDLのようにマルチプラットフォーム対応のプログラムを
自作するにはどうすればいんですか?
0241デフォルトの名無しさんNGNG
>>240
対応するプラットフォームについて熟知すべし
0242デフォルトの名無しさんNGNG
c++初心者なんですが、
char *operator<<(bookmark obj1){
return obj1.title;
}
呼び出し時に cout << obj; (上のクラスオブジェクト)
という風に使います。

警告:関数の戻り値が自動変数のポインタ/参照となっています。
(return obj1.title;)
エラー:不当なオペランドです。
(cout << obj;)
って、出ます。お教えお願いします。
0243デフォルトの名無しさんNGNG
(std::ostream& os, bookmark obj1) {
return os << obj1.title;
}
じゃないのか
0244デフォルトの名無しさんNGNG
std::ostream &operator<<(std::ostream &os, bookmark obj1) {
return os << obj1.title;
}
0245デフォルトの名無しさんNGNG
virtualって、奥が深いんだな
0246デフォルトの名無しさんNGNG
>>243 >>244
勘違いしてました。stdクラスではない方のクラス内で定義しよう
としてた。おかげで、思うように動きました。
ありがとうございました。

メンバtitleはプライベートなので
そのままでは使えないのでメソッドでchar*を返すようにして
使ったんですけど、なんか回りくどいような気がするんですが、
どうなんでしょう。
これしか方法無いなら、無視して下さい。m(_ _)m
0247デフォルトの名無しさんNGNG
bookmark側をprivateにしたければこうするしかない。
char* bookmark::get_title(){return this->title;}
std::ostream& operator<<(std::ostream &os, bookmark& obj1){return os << obj1.get_title();}
0248デフォルトの名無しさんNGNG
friend関数にすればいいじゃん
0249デフォルトの名無しさんNGNG
なるほど。。。friend関数ですか。
C++って奥が深いんですね。(泣)
ていうか、全然分かって無い事が発覚。一からやります。
レスありがとう。
0250デフォルトの名無しさんNGNG
friendみたいに中を荒らされるのはやだな〜
0251デフォルトの名無しさんNGNG
>>250
自称友達ほど性質の悪いものはないよな。
0252デフォルトの名無しさんNGNG
>>250
メンバ関数という形をとっていないだけで、クラスbookmarkのインターフェースの一部なのだから、
privateなメンバにアクセスできても不自然ではない。

>>251
自分が相手をfriendと認めるだけであって、自称友達という表現は当てはまらない。
0253デフォルトの名無しさんNGNG
確かに自分が認めちゃったんだから荒らされても文句いえないやね。
0254デフォルトの名無しさんNGNG
>>252
そりゃそうなんだけどさ。ただ全体的にfriendはできるだけ
増やしたくないよな、ヒッキーみたいなこと言ってるけど。
0255デフォルトの名無しさんNGNG
クラスじゃないし、その場で実装が完結するから問題ないじゃないか。
オペレータはfriend関数で書くというのは一種の定石のひとつだし。
0256デフォルトの名無しさんNGNG
friend関数って、使うこと無いんだが。
俺はひょっとしておかしいのか?
0257デフォルトの名無しさんNGNG
>>252
自称友達だからfriendと認めるわけだから、当てはまらないわけではない。
0258デフォルトの名無しさんNGNG
>>256
二項演算子を作るときは使わないとしょうがない。
0259デフォルトの名無しさんNGNG
>>257
あにいってんだおめ?
0260デフォルトの名無しさんNGNG
>>258
+= で + 作ったりできるから、それでも必要になる場面は少ない。
0261デフォルトの名無しさんNGNG
class Hoge
{
public:
 Hoge& operator+=(const Hoge&);
 Hoge(const Hoge&);
};

inline Hoge operator+(const Hoge& h1, const Hoge& h2)
{
 return Hoge(h1) += h2;
}
0262デフォルトの名無しさんNGNG
+をメンバ関数として実装して良いのは
 他の型を引数に取らない
 対称性を失ってもよい
のどちらかになると思うんだが。
complex a = 1;
a = 2 + a;
string s = "abc"
s = "123" + s;
0263デフォルトの名無しさんNGNG
あ、出来るのか。
ごめん、寝ぼけてた。
0264デフォルトの名無しさんNGNG
人が書いたソースを読むのってかなり勉強になるな。
0265デフォルトの名無しさんNGNG
has-a関係って、
class CHoge{};
class CBar {
CHoge hoge;
};
のことで、いいんだよね?
0266デフォルトの名無しさんNGNG
class hoge
{
public:
hoge& operator +=( const hoge& );
hoge operator +( const hoge& r ) const
{ return hoge(*this) += r; }
};

とか書いてたけど、ひょっとしてだめ?
0267デフォルトの名無しさんNGNG
VisualStudio.NET2003にて

#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
char** p = (char**)new char[10][10];

p[0][0] = 1;

return 0;
}
なんでp[0][0] = 1;のところで落ちるんですか?
0268デフォルトの名無しさんNGNG
メモリが確保されてないから。
0269デフォルトの名無しさんNGNG
正しくはこう
char (*p)[10] = new char[10][10];
p[0][0] = 1;
0270267NGNG
>>269
サンクス。うまくいった。

>>268
ドンマイ
0271デフォルトの名無しさんNGNG
引数付きのコンストラクタを持つオブジェクトの配列を動的に確保する方法ってありますか?
0272デフォルトの名無しさんNGNG
>>271
std::vector
0273271NGNG
STLでいけるんですね。
でも、それを使うと実行ファイルが大きくなるっていう弊害が…
別に方法はないんですか…?そうですか…
0274デフォルトの名無しさんNGNG
STLつかうと一気に実行ファイルサイズが10倍に?!
0275デフォルトの名無しさんNGNG
>>274
環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。
0276デフォルトの名無しさんNGNG
>>275
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
0277デフォルトの名無しさんNGNG
const int N = 10;
Object *p=::operator new(sizeof(Object)*N);
for(int i=0; i<N; ++i){
new(&p[i]) Object(好きな引数);
}
0278デフォルトの名無しさんNGNG
>>277
uninitialized_fill使えよ
0279デフォルトの名無しさんNGNG
それぞれ違う値で初期化したかったら困るジャン
0280デフォルトの名無しさんNGNG
>>274-276
_| ̄|●

>>277
試してみたんですけど、二つエラーが出ます。理解が浅くて申し訳ないですけど、どこがいけないのででしょうか?
処理系はBCCです。
#include <iostream>
class test{
  int a;
public:
  test(int n){ a = n;}
  int get_a(){ return a;}
};
int main()
{
  const int N = 10;
  test *p=::operator new (sizeof(test)*N); ←void *型はtest *型に変換できない
  for(int i=0; i<N; ++i){
    new (&p[i]) test(8);
  }
  for(int i=0; i<N; ++i){
    cout << p[i] << "\n"; ←<< 演算子が使われたがクラス ostreamではtest型のための定義が存在しない
  }
  return 0;
}

>>277
uninitialized_fillを使うとどうなるんですか?よければ教えて貰えるとありがたいです


279さんが言うように違う値で初期化したい場合、方法ってあるんですか?
質問が多くてごめんなさい
0281デフォルトの名無しさんNGNG
訂正です。
コードの下のほう

  for(int i=0; i<N; ++i){
    cout << p[i].get_a() << "\n";
  }
の間違いでした。これでエラーは一つ消えました。
0282デフォルトの名無しさんNGNG
>>281
>void *型はtest *型に変換できない
キャストしろ
0283デフォルトの名無しさんNGNG
うわっ、さらにdeleteもし忘れてる… もうだめかもorz
0284271NGNG
キャストしたら上手くいきました。ありがとうございます
0285デフォルトの名無しさんNGNG
#include <iostream>
#include <memory>

class test {
int a;
public:
test(int n) : a(n) {}
int get_a() const { return a; }
};

main()
{
const int N = 10;
test* p = static_cast<test*>(::operator new(sizeof(test)*N));

std::uninitialized_fill_n(p, N, 8);

for (int i=0; i<N; ++i) {
std::cout << p[i].get_a() << std::endl;
}
for (int i=0; i<N; ++i) {
p[i].~test();
}
::operator delete(p);
}

>>280
こうなる
0286271NGNG
>>285
とりあえず、コンパイラ通してみました。
いくつか理解できない表現がありますけど、勉強して一つ一つわかっていけるようにがんまります。
0287デフォルトの名無しさんNGNG
>>286
placement new(これ>new (&p[i]) test(8);)使うと
デストラクタは自分で呼ばないといけないから、注意
0288271NGNG
>>286
ありがとうございます、気をつけます。
0289デフォルトの名無しさんNGNG
>>266
もし std::string の operator+ がメンバ関数で定義されていたら、
 ○ std::string("xxx") + "yyy"
 × "xxx" + std::string("yyy")
というような非対称性が生じる。

型変換用のコンストラクタがなければ実害はないかもしれない。
0290デフォルトの名無しさんNGNG
>>280
> 279さんが言うように違う値で初期化したい場合、方法ってあるんですか?

uninitialized_fill() のかわりに uninitialized_copy() を使う。
引数は単純な配列でいいだろう。

しかし、 std::vector 使っとけ。
0291ディフォルトの名無しさんNGNG
VC6.0で2つのダイアログ(1つはメニュー画面表示用+1つは実処理部)のような
構成で作成しようと思っています。
メインのダイアログで、1つはcreateでもう1つはDoModalで2枚のフォームを
描画させているのですが、そうするとタスクバーのアイコンが2つ表示されて
しまいます。
なんとかして1つのみの表示にすることはできないでしょうか?
0292デフォルトの名無しさんNGNG
ヒープメモリ上にクラスのインスタンスを作成する場合、
newを使えばクラスのコンストラクタが自動的に呼ばれるんですが、
mallocでメモリを確保してコンストラクタを呼ぶということは出来ないんでしょうか。
0293デフォルトの名無しさんNGNG
>>292
配置new
0294デフォルトの名無しさんNGNG
>>293
配置newってなんでしょうか?
0295デフォルトの名無しさんNGNG
>>294
検索しやがれ
0296デフォルトの名無しさんNGNG
placement new
0297デフォルトの名無しさんNGNG
cでenumは使えまつか?
0298デフォルトの名無しさんNGNG
>>297
使える

>>294
http://www.fides.dti.ne.jp/~oka-t/cpplab-placement-new.html
0299デフォルトの名無しさんNGNG
>294
写真をとるときの掛け声
0300デフォルトの名無しさんNGNG
はい、ちーにゅう
0301デフォルトの名無しさんNGNG
微妙に中国語っぽいな
0302デフォルトの名無しさんNGNG
私への充て付けか?<ちい(さい)にゅう
0303デフォルトの名無しさんNGNG
>>302
女はいたのかよ……。
0304デフォルトの名無しさんNGNG
はい、貧乳
0305デフォルトの名無しさんNGNG
長所新車です。
Cは数値計算とかくらいしかやったことないんだけど、簡単な反復マクロを書きたいんだけど、
sendkey
sleep
の使い方を教えて下さい。
0306デフォルトの名無しさんNGNG
>sendkey
>sleep

Cの話と違うし
0307デフォルトの名無しさんNGNG
>>306
そのメッセージがわかんないのですよ。
enterを送るときとか nを送るときにどうしたらいいかってことが。
0308デフォルトの名無しさんNGNG
>>307
まずOSは何?
0309デフォルトの名無しさんNGNG
winです。
0310デフォルトの名無しさんNGNG
わざとやってるのか?
0311デフォルトの名無しさんNGNG
素です。
0312デフォルトの名無しさんNGNG
例えば


nを押す
0.2秒
nを離す

ってのはCではどう書けばいいのかってことですたい。
0313デフォルトの名無しさんNGNG
>>312
パチスロにでも利用するんですか?
0314デフォルトの名無しさんNGNG
>>312の通りだとこうなるけどsendkeyなんてものはない、VBAのSendKeysのことか。
keybd_event(N, 0, 0, 0);
Sleep(200);
keybd_event(N, 0, KEYEVENTF_KEYUP, 0);
0315デフォルトの名無しさんNGNG
>>313
暇つぶしです。
できれば数値計算の結果をテキストにためて行くような形にしようかと思ってます。
パチスロ何かにも応用できるんですかね?
0316デフォルトの名無しさんNGNG
>>314
ありがとうです。
sendkeyってのは言い方を思いつかなかったので使いました。
0317ディフォルトの名無しさんNGNG
VC6.0で2つのダイアログ(1つはメニュー画面表示用+1つは実処理部)のような
構成で作成しようと思っています。
メインのダイアログで、1つはcreateでもう1つはDoModalで2枚のフォームを
描画させています。
モードレス側のダイアログを
ModifyStyleEx(WS_EX_APPWINDOW, 0);
にて、アイコンを消すことが出来たのですが、ダイアログが背面に移動した
際、もう片方のダイアログを前面に持ってきた際に移動することが出来ず、
背面に残ったままになってしまいます、
現在表示されている1つのアイコンで2つのダイアログの表示位置を平行に
(同じ階層)に表示することは出来ないでしょうか?
0318デフォルトの名無しさんNGNG
>>316
お前定義の適当な単語出して教えてください、って頭腐ってるな。
0319デフォルトの名無しさんNGNG
>>318
こんなとこで叩いてるお前が腐ってる

確かにちょっとアホっぽいけど、ニュアンス的にわからんでもないし、初心者歓迎スレで初心者叩くな
0320デフォルトの名無しさんNGNG
学校の宿題をやっているのでが、分からない所があるので質問します。

1!+2!+3!+・・・+n!和が7777より小さい場合における最大のnと、
その時の和を求めるプログラムをfor文を用いて作成せよ。

という問題なのですが、とりあえず

int wa=0;
for(int n=1;wa<7777;n++){
int m=1;
for(int i=n;i>=1;i--){
m=m*i;
}
cout << "階乗は" << m << "\n";
wa=wa+m;
cout << "和は" << wa << "\n";
}
cout << "最大のnは" << n-1 << "\n";
cout << "その時の和は" << wa-m << "\n";

と記述して実行しようとしたら「cout << "その時の和は" << wa-m << "\n";」の部分で
「mが未定義です」とエラーが表示されてしまいました。for文内で定義した関数は
for文外では使用できないのでしょうか?
また、その部分を無視して実行した時、なぜか最大のnの値が9と表示されてしまいます。。
試しにfor文内にcout文を入れて実行してみたら正しくnの値は8と表示されるのですが。。
なぜこの違いが発生するのでしょうか・・・。
長くなりましたがどなたか教えてください。。
0321デフォルトの名無しさんNGNG
>>319
こんタコが、初心者と雑草は叩かれて踏まれて強くなんだよ
0322デフォルトの名無しさんNGNG
>>320
変数は宣言したブロックの中だけで有効。
つまりこの場合外側のforの中だけ。
それとint m=1はforのループのたびに実行される。
0323デフォルトの名無しさんNGNG
>>320
>for文内で定義した関数は
変数だろ。

>for文外では使用できないのでしょうか?
出来ない。

>なぜか最大のnの値が9と表示されてしまいます。。
>for(int n=1;wa<7777;n++){
このfor文を出る前にn++されるから。
0324デフォルトの名無しさんNGNG
>>322,323
ありがとうございます。
勉強になりました。
0325デフォルトの名無しさんNGNG
cout << "最大のnは" << n-1 << "\n";

(n-1)になってるからいいんじゃないの?


cout << "その時の和は" << wa-m << "\n";

なんでmを引くの?
0326デフォルトの名無しさんNGNG
そもそもnも変数の使用できる範囲超えて使われてる
0327デフォルトの名無しさんNGNG
>>321
TPOも無視してただただ踏んで回るしか能の無い「自称回答者」は
臭いから来なくていいです ;-)
0328デフォルトの名無しさんNGNG
>>327
お前も十分臭いよ 腐臭をあちこちのスレに撒き散らすなボケ ;-)
0329デフォルトの名無しさんNGNG
>>328
意味不明ですね。
「あちこちのスレ」など関係無く、このスレの話なわけです。
致命的な点を指摘されて悔しいのはわかりましたが、それならなおのこと
ちゃんとした理屈をこさえてから書き込まなくてはいけないと思いますよ。
馬鹿にしか見えませんから ;-)
0330デフォルトの名無しさんNGNG
;-) ウンコマンが大好きな顔文字。臭いからこないでねw
0331デフォルトの名無しさんNGNG































0332デフォルトの名無しさんNGNG
2chの定理:最後にレスしたほうが負け
0333デフォルトの名無しさんNGNG
テンプレートクラスで自分のクラスを引数に取る場合
例えばコピーコンストラクタで

template<class T> class A
{
public:
A(const A&) {}
// A(const A<T>&) {}
};

この2つは等価なのでしょうか?
試したところ同じようですが、何か違いがあったりするんでしょうか?
0334デフォルトの名無しさんNGNG
>>333
サイズが増える
0335333NGNG
>>334
VC++6.0SP6のデバッグビルドで出来たコードを比較してみましたが
違いは見られませんでした。
サイズが増える要因はなんでしょうか?
0336デフォルトの名無しさんNGNG
もしかすると>334は、
(ソースコードの)サイズが増える
と言いたかったのではないであろうか?
0337デフォルトの名無しさんNGNG
>>333
同じ。
クラステンプレートの名前と同じ名前を、名前空間の修辞をつけず、後ろに "<" を続けなければ、
A<T>のようなテンプレート引数リストをつけた型名と同じになる。
0338333NGNG
>>337
なるほど。ありがとうございました。
0339デフォルトの名無しさんNGNG
LSI-C使ってます。
”#include <curses.h>”という記述を含むものをコンパイルしようとすると、
”インクルードファイル 'curses.h' をオープンできない”と表示されます。
ライブラリにcurses.hが存在しないみたいなんですが、どういった対処法がありますか?
0340デフォルトの名無しさんNGNG
>>339
curses.hの入ったライブラリをインストールするとか.
0341デフォルトの名無しさんNGNG
>>339
LSI-Cを捨てる。

冗談は兎も角、16ビットコンパイラでしかないLSI-Cから安定して使える
cursesライブラリを探すくらいなら32ビットコンパイラに移行した方がいい。
例えばcygwinなら環境ごと丸々揃えられるだろ。
0342デフォルトの名無しさんNGNG
ツールバーを表示したいのですが、サンプルソース通りにやっても正常に動作しません。
どうしてでしょうか。

【状況】
コンパイルは通るが、できた実行ファイルを実行すると、
ウィンドウも表示されぬままに強制終了してしまう。
サンプルのコピペも試してみたけれど、同様の状況。

【参考にしたサンプル】
猫でもわかるのステータスバーの項1

【環境】
WindowsXP
BCC5.5
0343342NGNG
先ほどはCreateToolbarExでやっていたのですが、
今度はCreateWindowExでやってみました。
これもまた上手くいきませんでした。
なぜでしょうか?

【状況】
コンパイルは通る。
できた実行ファイルを実行すると、ウィンドウは表示されるが
ツールバーは下地(?)だけしか表示されない。
そこをクリックしても反応がなく、
ダブルクリックすると見たことのないダイアログがほんの一瞬表示されて消える。

【参考にしたサンプル】
猫でもわかるのステータスバーの項3

【環境】
WindowsXP
BCC5.5
0344デフォルトの名無しさんNGNG
http://o2on.s69.xrea.com/index.php?plugin=attach&pcmd=open&file=xtlutil.h&refer=The%20O2ON
こういうクラスを作ってみました。
Tokenize()が返す値は0から始まったほうがいいですか?
1から始まったほうがいいですか?
つまらないことですが、昨日からずっと悩んでます。
よろしくお願いします。
0345デフォルトの名無しさんNGNG
>>344
0から始まった方(0オフセット)がCでは美しいし,普通でしょうね.
あと,テンプレートのTはきっとcharに限らないのだろうから
int Tokenize(T* buf, const T &code, int limit)
の方が良いのでは?
0346デフォルトの名無しさんNGNG
>>345
なるほど。
オブジェクトのコピーが負荷になる場合を考えてって理解でいいですか?
どうもありがとうございます。
考えすぎて眠れませんでした。
0347345NGNG
>>344
こんな感じでいいんじゃないでしょうか?
bufも中は触らないのでconst付けました.
template <class T>
int Tokenize(const T* buf, const T &code, int limit) {
for (int iCurPos (0); iCurPos < limit; ++ iCurPos)
if(buf [iCurPos] == code) return iCurPos;
return -1;
};
0348デフォルトの名無しさんNGNG
>>347
どうもありがとうございます。
0349342NGNG
だめだ…分からない…
今日は丸一日使ったが分からない。

分かったことと言えば…

【分かったこと】
※CreateToolbarExを使った場合。
 リソースファイルをリンク(?)しない状態ではツールバーが表示される(画像なし・ボタンだけ)動作は正常。
 リソースファイルをリンク(?)すると、起動した瞬間にウィンドウも開かず強制終了する。

誰か分かる方よろしくお願い致します。
0350デフォルトの名無しさんNGNG
>>349
ソースも上げないでその字面だけで判断するのは不可能だ
猫はビュー数を見れば分かるとおり、多数の人が利用しているわけで
起動しないほどの重大なバグがある可能性はきわめて低い
猫の所為にしないで自分に原因があると考えるのが自然だ。

で、どうしても写し間違いが無いと言い張るのなら
一つ一つのAPIの戻り値をチェックしてエラーが出ている個所を突き止めろ。
0351342NGNG
>>350
ありがとうございます。
APIの戻り値チェックというのをやってみます。


/*
写し間違いはないと思います。
最初は全部手で打ち込んでいたのですが、
この不具合の原因に見当が付かないのでコピペでも試してみました。
結果は同じでした。
*/
0352デフォルトの名無しさんNGNG
質問です。
ファイルから、一行の文字列を読み込んでbuf[1024]の配列に、
a bc d efg\n\0
が入っているとすると、そのスペースを区切りにして、
新たなa[32][128]の配列に、
a[0]→a\0
a[1]→bc\0
a[2]→d\0
a[3]→efg\0
と入れたいのですが、どうしたらできますか?
0353352NGNG
>>352
はC言語です。
0354デフォルトの名無しさんNGNG
char *t=strtok(buf, " \n");
char (*p)[128]=a;
while (p) {
 strncpy(a++, t, 128);
 t=(0," \n");
}
0355デフォルトの名無しさんNGNG
while (t) {
 strncpy(p++, t, 128);
 t=(0," \n");
}
0356352NGNG
どうもでした。
strtokや、strncpyを調べてみます。
0357352NGNG
ありがとうございます。なんとかできました。
0358デフォルトの名無しさんNGNG
ええっと最近VC++をはじめたのですが、

void CMyDlg::OnBnClickedSerch()
{
    MessageBox("やぁ");
}

こうかくとMFCのMessageBox関数が呼ばれるのですが、
APIのMessageBox関数を呼ぶにはどうすればいいのですか?
0359デフォルトの名無しさんNGNG
::
0360342NGNG
APIチェックの戻り値を調べるのがよく分からなかったので、
さらにツールバーのサンプルを探してみたのですが、
BMP画像に問題があるようです。

【状況】
サンプルのツールバーのBMP画像を、
自作したもの(大きさ・数は同じ)に差し替えただけで、
ウィンドウも開かずに強制終了する。
>>342と同じ状況。
サンプルと同じ色数、それ以下の色数でも試したが結果は同じ。
CPP、Hファイルを全く変更せずに試したので、写し間違い等のミスは皆無です。
付属していた画像をそのまま使った場合は期待通りの結果が得られる。
ツールバー用のBMP画像を作るに当たって何らかの決まりがあるのかと思って検索してみましたが、
その事について特に言及してあるサイトは見つかりませんでした。
原因が分かる方よろしくお願いします。

【参考にしたサンプル】
ttp://www.geocities.jp/kissy2005jp/documents/win32api-sample.html
の『ツールバーを作る』のサンプルソース。

【環境】
WindowsXP
BCC5.5
Pixia(ツールバーのBMP画像を作るのに使用したペイントソフト)
0361デフォルトの名無しさんNGNG
自作したBMPとやらの仕様、
もしくはエラーが帰ってきたときのエラーコードくらい書けよ
具体的なことは何一つ言ってないじゃないか。
0362342NGNG
>>361
BMPは普通のBMPです。
エラーは帰ってこずに強制終了します。
0363デフォルトの名無しさんNGNG
普通って?
ヘッダの形式は?色数は?RLEかかってる?
トップダウンとボトムアップどっち?
0364342NGNG
>>363
すいません、分かりません。
調べてきます。
0365デフォルトの名無しさんNGNG
奇妙な現象が、、、
以下のコードが実行できます。
int main()
{
  int sum=0;
  for(int i=0;i<5;i++)
    sum += i;

    sum=0;
  for(int i=0;i<5;i++)
    sum += i*i;
}
これはint iを2回宣言していることにならないのでしょうか?
環境はVC++.NETです
0366デフォルトの名無しさんNGNG
世の中には標準では無い仕様を
標準だと思いこんで使ってきてしまった人もいるのですね。
0367デフォルトの名無しさんNGNG
>>362
エラーはページ違反とかのダイアログの話ではなく、APIの戻り値を見るんだよ。
調査して説明しろといっても無理な相談だろうから、
どこかへのリンクではなく、実際に使っているソース一式と
正常な結果を得られるbmp、異常終了するbmpをまとめてあぷろだにあげとけ
0368デフォルトの名無しさんNGNG
いるのですyp!
0369デフォルトの名無しさんNGNG
>>365
オプションでエラー吐かせる事もできる
0370デフォルトの名無しさんNGNG
365です。
C#からは変数のスコープが変更になり、
for(int i=0;;)
ではiはfor内でのみ有効になったはずです。
でもC++はiはforの外でも有効だったはずです。
0371デフォルトの名無しさんNGNG
釣りだったか。気づくのが遅かった…
0372デフォルトの名無しさんNGNG
>>370
味噌汁で顔を洗ってこいや
0373デフォルトの名無しさんNGNG
>>365
あのな・・・・実行できることじゃなくてコンパイルできることに疑問を持てよ。
0374デフォルトの名無しさんNGNG
浸透圧の高い液体で顔を洗うと痛いよ。
0375デフォルトの名無しさんNGNG
365です。
だからコンパイルできることがおかしいと言っています!!!
しかも実行もできます。

仕様が変更になったはずはないので、、、
>オプションでエラー吐かせる事もできる
これはどうすればいいのでしょうか?
>>369
、
0376デフォルトの名無しさんNGNG
マジレスするとコンパイルできない方がおかしい。
昔のVC++はおかしな糞コンパイラだった。
以上。
0377デフォルトの名無しさんNGNG
C++の仕様ではコンパイルできないはずです。
{
for(int i;;)
}
とすればiのスコープはfor内だけですが、、
0378デフォルトの名無しさんNGNG
int main()
{
  int sum=0;
  for(int i=0;i<5;i++)
    sum += i;

    sum=0;
  for(int i=0;i<5;i++)
    sum += i*i;
}
forの外でi使ってるようには見えないが。
0379デフォルトの名無しさんNGNG
>>376
今のC++の仕様が策定される前のコンパイラを責めるなよ。
0380デフォルトの名無しさんNGNG
多機能(各々に任す)計算機のプログラムを作成せよ。ソースの説明をせよ。
という問題の答えを教えていただきたいです。
0381デフォルトの名無しさんNGNG
宿題は宿題スレへ
0382デフォルトの名無しさんNGNG
365です。
以前は、
for(int i=0;i<10;i++){
  sum += i;
  if(i>3) break;
}

for(int j=i;j<10;j++)
  sum += j*j;

といった高度な書き方ができたはずです!!
少なくともVC6.0では
0383デフォルトの名無しさんNGNG
>>382
安心しろ。あなたが高度じゃないだけだから。
0384デフォルトの名無しさんNGNG
int i;
for(i=0;i<10;i++){
にすればいいだけだろ。アホか。
0385デフォルトの名無しさんNGNG
全部自作自演とか
0386デフォルトの名無しさんNGNG
365です。
まあ、仕様の不完全なC++ではなく、C#を使うのでまったく問題ありませんが、、、
0387デフォルトの名無しさんNGNG
{int i;
for(i=0;i<10;i++){
0388デフォルトの名無しさんNGNG
>>386
何を指して不完全と言っているんだ?
0389デフォルトの名無しさんNGNG
君の脳はさぞかし不完全なんだろうな
0390デフォルトの名無しさんNGNG
for(int i=0;;){
}
for(int i=0;;){
}
がコンパイルできたり、できなかったりするところが不完全ですが何か?

ちなみにVS.NET Proを使ってますが何か?
0391デフォルトの名無しさんNGNG
>>390
馬鹿だろ。お前。
0392デフォルトの名無しさんNGNG
>>390
それは、「不完全なコンパイラが存在する」と言っているだけ。
0393デフォルトの名無しさんNGNG

 ┌─────────┐
 │ 基地外警報!!!  |
 │   基地外警報!! |
 └―――──――――┘
      ヽ(´ー`)ノ
         (  へ)
          く

0394デフォルトの名無しさんNGNG
>>390
コンパイルできたり、できなかったりするのは天候の所為ですよ。
0395デフォルトの名無しさんNGNG
引田天功
0396デフォルトの名無しさんNGNG
>コンパイルできたり、できなかったりするのは天候の所為ですよ。
須らくデウスの行いだと?

>>390
君は丁度、C++の変遷を目の当たりにできる僥倖に遭遇できたのだよ。
0397デフォルトの名無しさんNGNG
>>359
ぉぉ、できました。どもありがとうです。
あともうひとつ、

int len;
char A[100] = "abcde";
len = strlen(A);

こうすると"size_tをintに変換しました。"という警告がでます。
警告が出ないようにするにはどうすればいいんですか?
0398デフォルトの名無しさんNGNG
>>397
size_t len;
char A[100] = "abcde";
len = strlen(A);
0399デフォルトの名無しさんNGNG
マニュアルくらい読んでから質問しろ
0400342NGNG
>>364
強制終了しないようになりました!!!!!
BMP画像を調べてみたところ、
サンプルに付いていたBMPはビットの深さが4bitだったのに対し、
自分で用意したBMPはビットの深さが24bitだったので、
自分の用意したBMPのビットの深さを4bitにしたところ強制終了しなくなりました。

しかし今度は、ツールバーに表示されている画像の色がおかしくなっています。
 ・元の画像→ttp://ccfa.info/cgi-bin/up/src/up4614.bmp
 ・表示されたときの様子→ttp://ccfa.info/cgi-bin/up/src/up4612.jpg

>>367
ソース一式はアップしたんですけれど、
転載禁止と書いてあって、そのソースを全くと言っていいほど改変していないので、
アップしていなんです。
0401デフォルトの名無しさんNGNG
システムカラーで書けばええやん
0402342NGNG
>>401
ありがとうございます。
システムカラーというのを調べてみます。
0403デフォルトの名無しさんNGNG
コンソールプログラムで、キー入力があったときに
ループから抜けるようにしたいのですが、どうやったら可能でしょうか?
gcc-cygwin環境です、よろしくお願いします。

>#include <stdio.h>
>int main()
>{
> int c;
> c = getchar();
> while(c == EOF){
>  function1();
>  c = getchar();
> }
> function2();
> return 0;
>}
0404デフォルトの名無しさんNGNG
>>403
cursesライブラリ。
0405デフォルトの名無しさんNGNG
kbhit
0406デフォルトの名無しさんNGNG
>>403
select
0407デフォルトの名無しさんNGNG
selectじゃあ・・・
0408デフォルトの名無しさんNGNG
>>407
なに?
0409デフォルトの名無しさんNGNG
C言語を練習するとき、どんなプログラムを作ると良いですか?
今使えるのがprintf、scanf、while、for、switch、ファイルの入出力くらいなんですけど
0410デフォルトの名無しさんNGNG
住所録
0411デフォルトの名無しさんNGNG
DWORD型(unsigned long)の変数をlong型に変換する方法ってあります?
0412デフォルトの名無しさんNGNG
>>411
ありますよ?
0413403NGNG
ありがとうございます。
ncurses-5.4をインストールしまして、
#include <ncurses.h>を加えて
gcc には -lncursesオプションを渡しましたが
undefined reference to `_kbhit'  と怒られました。
行き詰まりましたのでまた後で挑戦します...
0414デフォルトの名無しさんNGNG
conio
0415デフォルトの名無しさん NGNG
VisualCでSTLのStringを使いたいんですが、
文字列に改行を入れたい場合どうすればいいんでしょうか。

string str("abcd");
str=str+'\n'+"ABCD";
SetWindowText(GetDlgItem(hDlg,IDC_EDIT),str.c_str());

という感じで標準コントロールのエディットボックスに
文字を表示させてみてるんですが「abcdABCD」となり改行してくれません。
どなたか教えてください。お願いします。
0416デフォルトの名無しさんNGNG
>>415
'\n' → "\r\n"
0417415NGNG
即レスありがとうございます。助かりました。
0418デフォルトの名無しさんNGNG
std::fstreamで開いてるファイルのサイズを、
現状より短くしたい(後ろを切り捨てたい)んだけど、
なんかいい方法ある?
0419デフォルトの名無しさんNGNG
>>418
UNIXならtruncateとかftruncateがあるな。
0420デフォルトの名無しさんNGNG
'\r' == 0x0D
'\n' == 0x0A
っていう理解でよろしいでしょうか?
0421デフォルトの名無しさんNGNG
>>420
No
0422デフォルトの名無しさんNGNG
>>396
すべからく=すべきの意ですよ
0423デフォルトの名無しさんNGNG
>>419
それだとfstreamで開いてるファイル
いったん閉じた方がよさげだよね

くっ、やはりそういう環境依存な方法しかないのか
0424デフォルトの名無しさんNGNG
>>423
小さいファイルなら内容を全部覚えておいて、
新たにファイル作成するって方法もある。
でも、そんなことするぐらいなら環境依存な
方法を使った方がいい罠。
0425デフォルトの名無しさんNGNG
さっきまでバグはありつつもコンパイルはエラー無しで通っていて
いろいろ弄りながら試行錯誤でバグ潰ししてたんですが、
なにをやってしまったのか急にリンクエラーが出ました。

error LNK2001: 外部シンボル 〜 は未解決です
fatal error LNK1120: 外部参照 1 が未解決です。

みたいな感じです。
Libのリンク設定忘れみたいな環境的なこと意外で
こういうエラーって出るもんですか?
0426デフォルトの名無しさんNGNG
どっかの変数にstatic付けてしまったとか?
0427デフォルトの名無しさんNGNG
>>425
グローバル変数、関数の定義し忘れ。
0428425NGNG
引数書くの忘れてる関数定義がありました…
お恥ずかしい。
なんかライブラリのファイル壊れたかなぁとか思って
再インスコしそうなところでした。助かりました。
ありがとうございました。
0429デフォルトの名無しさんNGNG
>>428
まず自分を疑うのが鉄則
0430409NGNG
住所録が完成しました
次は何を作るのが良いですか?
0431デフォルトの名無しさんNGNG
>>430
目標。
0432デフォルトの名無しさんNGNG
ホヤの養殖
0433教えてくださいNGNG
ttp://www.nhk.or.tv/kow/program/index.php

コマンドプロンプト上で動くテトリス、
つくってみますたが
0434403 ForbiddenNGNG
遅くなってすみません。
MinGWでは可能なのですが、Cygwinではconio.h(のkbhit)が使えなかったようです。
ずいぶん長いこと混乱していましたが、ncurses.hのgetch()を使ってようやく解決しました。
select()は難しそうなので結局断念しました。
どうもありがとうございます。
0435デフォルトの名無しさんNGNG
猫でもわかるで復習しています。
C言語編の第1部の26章でつまづきました。
エスケープシーケンスで、色を変えるプログラムが出てくるのですが、
エスケープシーケンスが普通に文字列として解釈されてしまいます。
これは、なぜなのでしょうか。
0436デフォルトの名無しさんNGNG
NT系のOSでは無理です
0437435NGNG
レスありがとうございます。
そうなのですか。
NT系だとなぜ使えないのでしょうか?
0438デフォルトの名無しさんNGNG
無理じゃねえよ。
16bitコンパイラとansi.sys組み込み。
0439デフォルトの名無しさんNGNG
cygwinを使うとか。
0440435NGNG
16bitコードを吐くコンパイラがないとだめなんですね。
簡単に実現する方法としては、cygwinでエミュレートするということですね。
どちらかの方法で実現してみます。
ありがとうございました。
0441デフォルトの名無しさんNGNG
std::stringメンバの入った構造体をmemsetするとアドレス違反になります。
構造体にstringは駄目で塚?
0442デフォルトの名無しさんNGNG
>>441
一般にオブジェクトの内部に直接触れるべきではない。コンストラクタを使って適切
に初期化する必要がある。

メンバ変数をprivateとして宣言するのは何のためか考えてみるといい。
0443デフォルトの名無しさんNGNG
>442
何か斜め上行ってますね。
0444マイク ◆yrBrqfF1Ew NGNG
>>441
そういえばvtbl overwriteというsecurity-holeがあった気がするな。
0445デフォルトの名無しさんNGNG
すごいアホな質問なんですが外部クラスを利用するときはヘッダとcppに分けて書くのが一般的だと思うのですが
ヘッダにクラスの実装を直接書くこともできるのはわかるんですが、これは分けて書く場合と比べてどのように違うのでしょうか。
0446デフォルトの名無しさんNGNG
>>445
中間ファイルとかLib作るのにヘッダにガリガリ書かないな
0447デフォルトの名無しさんNGNG
GNU G++ の STL とかはヘッダにガリガリ書いてるね
0448デフォルトの名無しさんNGNG
テンプレートクラスはインクルードファイルに書くしかないしな。
0449デフォルトの名無しさんNGNG
>>446-447
ありがとうございます。
>>448
ありがとうございます。
実はその点についても聞こうとしていたのですが、テンプレートクラスはヘッダとcppに分けたとき、外部参照が未解決のようなエラーが出て、
ヘッダにまとめて書いたら正しく動作した覚えがあります。
このことからテンプレートクラスの場合はヘッダにまとめて書くのが一般的なのかと思ったのですがどうなんでしょうか。
0450デフォルトの名無しさん NGNG
他人のソース見てるんですが、
ヘッダに書かれているDECLAREってなんですか?
例えば
DECLARE( int A, ;);
って感じで書かれてます。
どういうときに、どんな意味で使うものなんでしょうか?
0451デフォルトの名無しさんNGNG
>>450
ヘッダすべてをDECLAREで検索してみ
0452450NGNG
>>451
すいません、ちょっと意味が、、、
どのヘッダもあんな感じに書かれてますが、
本とかでも見たことないし、よく分からないであります。
0453デフォルトの名無しさんNGNG
>>452
どっかで DECLARE が定義されてるはずだからそれを探せ、
という意味だと思う

#define DECLARE(...) ....

みたいなのがどっかにあるはず(インクルードファイルも遡って探してね)
0454450NGNG
発見しました。
なんかグローバル変数の宣言用にdefineしてあったみたいですが、
何の意味があるのか訳わかんないです。
気持ち悪いですがしばらく放っておくことにします。。。
ありがとうございました。
0455デフォルトの名無しさんNGNG
return rush;
0456デフォルトの名無しさんNGNG
>>455
おもしろい!!
0457デフォルトの名無しさんNGNG
return ace;
0458デフォルトの名無しさんNGNG
質問です。
言語はC++です。
int型の数値をchar型の文字列に変換したいときは
どのような関数を作ればよいですか?
同じように、
double→char
など。
初心者の質問で申し訳ないですが
宜しくお願いします。
0459デフォルトの名無しさんNGNG
>>458
sprintf()
0460デフォルトの名無しさんNGNG
C++ならstringstream
0461デフォルトの名無しさんNGNG
itoa()
itof()
0462デフォルトの名無しさんNGNG
itof()ってあるの?
0463デフォルトの名無しさんNGNG
いらねーだろ。
0464デフォルトの名無しさんNGNG
パパー2匹釣れたよ!
0465イワナNGNG
渓流行って足滑らせて死ね!
0466デフォルトの名無しさんNGNG
>>464
もしかして、スレのテンプレ入りを狙ってるのか?
0467デフォルトの名無しさんNGNG
class A
{
public:
void Func(){}
} aa;

struct B
{
int b;
} bb;

float cc() { return 1.0f; }

// アドレステーブル
void *Adr[] = {
(void*)&aa,
(void*)&bb.b,
(void*)&cc,
};

というような、なんでもありの配列 Adr の初期値に、
aa.Func() のアドレスを入れたいのですが、うまくいきません。

// アドレステーブル
void *Adr[] = {
(void*)&aa.Func, // error
(void*)&bb.b,
(void*)&cc,
};
とすると、void を void* にキャストできないとエラーが出ます。
どのようにすればよいのか、アドバイスをお願いします。
0468デフォルトの名無しさんNGNG
&aa::Func
じゃない?
0469デフォルトの名無しさんNGNG
それ以前に「なんでもありの配列」を作ること自体どうかしている。
0470デフォルトの名無しさんNGNG
インスタンスメソッドを、インスタンスの指定無しで呼び出せるわけ無いだろハゲ
0471デフォルトの名無しさんNGNG
>>470
aaってインスタンスなのでは?
0472デフォルトの名無しさんNGNG
>>467
C++ では「メンバ関数のポインタ」は取れても、特定インスタンスに
結び付けられたメンバ関数ポインタ(いわゆるクロージャ)は取れん。
やりたければ boost::function と boost::bind 使え。

あとメンバ関数ポインタのサイズは一般に sizeof(void*) よりでかい
から、そのキャストは規格上許可されてない。
0473467NGNG
皆さん色々ありがとうございました。
このやり方では無理なのですね…。

”静的なインスタンスのメンバ関数”の「先頭アドレス」を
コンパイルの時点で知ることができれば、
どのようなやり方でも構わないんですが、
何か良い方法はないでしょうか…。
0474デフォルトの名無しさんNGNG
>>473
なんか勘違いしてないか?
メンバ関数はインスタンスごとに生成されるわけじゃなく、
共通の関数にインスタンスの参照が渡される。
特定のインスタンスの特定のメンバ関数を呼びたいなら、
インスタンスの参照とメンバ関数のアドレス(メンバ関数ポインタ)の両方が必要。
これをまとめて使いやすくしたのがboost::functionやboost::bind
0475デフォルトの名無しさんNGNG
>>473
468
0476デフォルトの名無しさんNGNG
MAPファイルの生成ではダメなの?
0477デフォルトの名無しさんNGNG
インスタンスのメンバ関数をコールバック関数として登録したいんじゃない?
0478デフォルトの名無しさんNGNG
SigC++だな
0479デフォルトの名無しさんNGNG
>>467で言うような事が実現出来たとしても、キャストする前の型が判らなければ、
void*型のポインタだけがあってもどうしようもないと思う。具体的にどういう使い
方をするのか判らないので憶測でしかないけどね。

ということで、boost::function辺りを使うのが吉かと。
0480デフォルトの名無しさんNGNG
VC++6で
while(!fin.eof()){
fin >> str1;
tp = strtok(str1,"<>");//<>で区切った文字列
cout << tp;
while(tp != NULL){
tp = strtok(NULL,"<>");
if(tp != NULL){
cout << tp;
}
}

}
と書いたら実行はされるが、Windowsエラーが出てしまう。
while(!fin.eof()){
fin >> str1;
cout << str1;
}
だと出ない。なんで?
0481デフォルトの名無しさんNGNG
tp = strtok(str1,"<>");//<>で区切った文字列
if(tp != NULL){
cout << tp;
0482デフォルトの名無しさんNGNG
#ifnde __HOGE_H__
#define __HOGE_H__

って、書くのが面倒なんだけど、ほかに方法ない?
VC2003つかってます。
0483デフォルトの名無しさんNGNG
>>482
二連アンスコやめとけ。
アンスコはじまりやめとけ。
#pragma once 使え。
0484デフォルトの名無しさんNGNG
たかが三行(#endifを含めて)書くのがそんなに面倒なのか
0485デフォルトの名無しさんNGNG
doui
0486デフォルトの名無しさんNGNG
#pragma once
って、MS限定?
0487デフォルトの名無しさんNGNG
>>486
そんなことないけど対応してるものは少ない
0488デフォルトの名無しさんNGNG
デジタルカメラからの動画像をリアルタイムで
取り込み、表示させる方法を知っている人いません?

OpenCVやARToolKit等のライブラリを使わないで
1からCでプログラミングするのって難しいのでしょうか??
0489デフォルトの名無しさんNGNG
mage
0490デフォルトの名無しさんNGNG
>>488
君がやりたければやればいい。
難しいと思うのならやめとけ。
0491デフォルトの名無しさんNGNG
猫でC++でも勉強しようとしてたところオーバーライドのところで
class Moto{
public:
virtual int kaso();};

class Saki : public Moto{
public:
int kaso();};

int Moto::kaso(void){
cout << "継承元です" << endl;
return 0;}

int Saki::kaso(void){
cout << "オーバーライドしました" << endl;
return 0;}
とあったところ、virtual int kaso()をint kaso()に変えてみると
コンパイル時にエラーがでるか、オーバーライドされないと思ってたのですが
普通にオーバーライドされてました。オーバーライドはvirtualつけなくても出来るのでしょうか?
0492デフォルトの名無しさんNGNG
>>491
できるよ。普通に。
0493デフォルトの名無しさんNGNG
>>492
そうなんですか。そうなるとvirtualの意味って何なんでしょうか・・・
0494デフォルトの名無しさんNGNG
"virtual"を付けなくても自動的に(必ず)仮想関数になるってこと。
引数その他が違ったら別だけどね。
0495デフォルトの名無しさんNGNG
C++は猫で勉強しないほうがいいよ。
0496デフォルトの名無しさんNGNG
コンストラクタにvirtualをつける意味は?
0497デフォルトの名無しさんNGNG
オーバーライドとオーバーロードの区別は出来てる?
0498デフォルトの名無しさんNGNG
>>494
嘘を教えちゃいかん
0499デフォルトの名無しさんNGNG
CreateWindowExで作ったメッセージボックスのみを半透明にする方法はないでしょうか?
SetLayeredWindowAttributesではできないみたいなんです(ウィンドウ全体なら可能)
0500デフォルトの名無しさんNGNG
>>498
嘘ではなかろう。言葉足らずだが

基本クラスでの宣言でvirtual宣言されてるから
派生クラスのは明示的にvirtualしなくても勝手にそうなるってだけ。
0501デフォルトの名無しさんNGNG
>>500

>>491は、その基底クラスでのvirtualを取ったんだよ。
だから、>>494は勘違いか、本気で言ってるなら…、だよ。
0502494NGNG
おう、まさしく勘違い。
>>500のことを言いたかった。
0503499NGNG
やっぱり半透明化以外にも、

エディットコントロールの…
フォントのサイズ変更、
フォントの種類変更、
フォントの色変更、
背景色変更、
の仕方が分かりません。

リッチエディットまではいかなくてもWindows付属のメモ帳くらい変更したいのですが。
0504499NGNG
リッチエディットを勉強したほうが早いですか?
0505デフォルトの名無しさんNGNG
>>504
取り敢えずこっちで聞いた方が早い。
>Win32API質問箱 Build22
>ttp://pc5.2ch.net/test/read.cgi/tech/1092524669/l50
0506デフォルトの名無しさんNGNG
http://pc5.2ch.net/test/read.cgi/tech/1092524669/
0507499NGNG
>>505,>>506
ありがとうございます。
そちらで聞いてみます。

以降
>>499,>>503はスルーお願いします。
0508デフォルトの名無しさんNGNG
/bin/hosh
0509デフォルトの名無しさんNGNG
質問です。

以下の式を実行させると、

for(double a=-0.3; a<0.8; a+=0.1){
cout << a << endl;
}

以下のようになるのですが...

-0.3
-0.2
-0.1
2.77556e-017 <= 0にならない
0.1
0.2
(省略)
0.7
0.8 <= ここまで繰り返される

ようするに、2.775563-017を0に、
繰り返しも11回に留めたいのですが、
どうすればよろしいですか?

環境は
Windows ME
Visual C++ 6.0
です。

よろしくお願いします。
0510デフォルトの名無しさんNGNG
>>509
for(int a=-3;a<8;a++){
 cout << a/10. << endl;
}
0511509NGNG
>>510
レスありがとうございます。
その式だと、うまくいきました。

ですが、
for(double a=-0.3; a<0.8; a+=0.1){
cout << a << endl;
}
この式の何がいけないのか、よくわからないのですが
0512デフォルトの名無しさんNGNG
>>509
それは10進数表記の0.1が2進数表記では近似値的表記になる
ことに起因するもので、つまり0.1を3回足すのと0.3を足した結果
とは同値でない可能性があるということです。よって不可能です。
もしどうしてもそうしたければ、固定小数点数を使うことをお勧め
します(自分でエミュレートすることになります)。
0513デフォルトの名無しさんNGNG
>>511
浮動小数でググってみそ
0514デフォルトの名無しさんNGNG
>>513
浮動小数点数
0515デフォルトの名無しさんNGNG
IMEだと不動小数点数
0516デフォルトの名無しさんNGNG
>>511
0.1は2進数では正確に表せない。(現行の浮動小数点では)

#include <stdio.h>
void main(void){
 printf("%64.62lf\n",0.1");
}
とかやってみ。
0517デフォルトの名無しさんNGNG
>>513
なぜYAHOOじゃだめなの?
0518デフォルトの名無しさんNGNG
(゚Д゚)ハァ?
0519デフォルトの名無しさんNGNG
>>517
だめとはいっとらんがな
0520デフォルトの名無しさんNGNG
>>513
なにが浮動なのか分かっていないな
0521509, 511NGNG
>>510, 512, 513, 514, 515, 516
ググってみました。よくわかりました。
ありがとうございました。


0522デフォルトの名無しさんNGNG
>>521
なぜYAHOOにしなかったの?
0523デフォルトの名無しさんNGNG
Yahoo!のページ検索はGoogleと結果は同じだけど、結果のリンクを新しいウィンドウで表示するようにできないからまだいや。
0524デフォルトの名無しさんNGNG
初心者です。ええとこのページhttp://www.med.osaka-u.ac.jp/pub/cl-comp/saito/cppintro/cppintro8.html
にvirtualをつけない(仮想関数でない場合)
>ポインタ変数p がクラスX へのポインタ変数と して定義されており、p の>指す実体がクラスX から派生したクラスY のオブジ ェクトである場合、

># 普通のメンバ関数 f()
>p->f()で、X::f()が呼び出される。クラスXでf()が定義されてないな ら、X >から親の方への検索で最初に見つかるf()の定義が用いられる。

との事ですがこのプログラム http://www.med.osaka-u.ac.jp/pub/cl-comp/saito/cppintro/example3.cpp
をコンパイルして実行した結果
私は「a型」オブジェクトです。
私は「B型」オブジェクトです。
私は「C型」オブジェクトです。
私は「a型」オブジェクトです。
私は「b型」オブジェクトです。
私は「c型」オブジェクトです。
私は「a型」オブジェクトです。
私は「b型」オブジェクトです。
私は「c型」オブジェクトです。
私は秘密のアッコちゃんです。
私は人に言えない秘密を持っています。
私は人に言えない秘密を持っています

となります。ええと説明文とおりだと
私は「a型」オブジェクトです。
私は「a型」オブジェクトです。
私は「a型」オブジェクトです。
私は秘密のアッコちゃんです。
私は人に言えない秘密を持っています。
私は人に言えない秘密を持っています
となるはずだと思うんですが。。違うんでしょうか?
0525524NGNG
あ、環境はRed Hat Linux 7.2 2.96-112.7.2 gcc version 2.96
です。そこのページで聞けよと言われればそれまでなんですがここの方が
早いかなと。しーましぇん。。
0526デフォルトの名無しさんNGNG
>>525
pa0->speak();
pa1->speak();
pa2->speak();
ここの部分でA::speakが呼ばれるってのはOKですか?
0527524NGNG
>>526
はい。それは分かるんですがそうすると実行結果が下のほうにかいた様に
なると思うんですが。。
0528デフォルトの名無しさんNGNG
A,B,Cそれぞれの型、およびそのインスタンスa,b,cについて
idというメンバに何が入っているか理解してますか?
0529デフォルトの名無しさんNGNG
>>527
A::speakでprintfに渡されてる引数は何ですか?
0530524NGNG
あ、分かりました。コンストラクタで初期化とか全然考えてなかったです
いやはずかしいです。。(;´∀`)
ありがとうございました。
0531524NGNG
>>529
すいません。ここでコンストラクタで初期値を与えられたidを
出力してるんですね(ですよね(;´∀`)?)
0532デフォルトの名無しさんNGNG
>>523
同じエンジン使ってるからね。
0533半分冗談だが、半分マジだ。NGNG
>>517
既に「ググル」と言う言葉は、「インターネット検索サイトで検索する」と言う意味の一般動詞になってる。

>>532
はぁ ?
0534デフォルトの名無しさんNGNG
Windows環境 C++
C++のクラス内にWin32APIと同名の関数をつくりその同名の関数からWin32APIを呼び出すとC++のクラス内のほうを呼び出そうとするのですがどうすれば回避できますか?
0535デフォルトの名無しさんNGNG
>>534
::
0536デフォルトの名無しさんNGNG
aをbで割って余りを切り捨てた値を求めるのはどうやりますか?
0537534NGNG
>535
解決できました。
ありがとうございました。
0538デフォルトの名無しさんNGNG
>>536
int answer = static_cast<int>(a) / static_cast<int>(b);
0539509, 511NGNG
以下のような処理をしたいのですが、どうしたらいいでしょうか?

string a;
strcpy(a, "hoge");

a = "hoge"でもいいのですが、
引数にchar* を取る場合の
string型との互換の方法が知りたいので

よろしくお願いします。
0540デフォルトの名無しさんNGNG
>>539
"hoge"をstringにしてから連結したほうが手っ取り早くないか?
0541デフォルトの名無しさんNGNG
>>539
a.resize(256);
strcpy(&a[0], "hoge");

規格的にいいのかは知らん
0542デフォルトの名無しさんNGNG
>>539
a.operator=("hoge");
a.assign("hoge");

>>541
文字列の長さ256になるけど。
0543デフォルトの名無しさんNGNG
>>542
じゃあ>>541の後に

a.resize(std::string::traits_type::length(a.c_str()));
0544デフォルトの名無しさんNGNG
>>543 それはひどい。
0545デフォルトの名無しさんNGNG
> 引数にchar* を取る場合の
> string型との互換の方法が知りたいので

ここに突っ込みがないのは何故?
意味わかるの?
0546デフォルトの名無しさんNGNG
俺はわからん
0547デフォルトの名無しさんNGNG
>>545
CStringのGetBufferのようなもの、と解釈してみたがどうか?
0548デフォルトの名無しさんNGNG
文脈からして、char*を引数にとる関数でchar*の部分にstringを使いたいってことじゃないかな?
そういう要望は多いと思うよ。
operator用意してる文字列クラスも多いことだし。
0549デフォルトの名無しさんNGNG
>>547
たぶん、GetBuffer()というよりは、operator LPCSTRみたいなことを希望してるんじゃないかな?
0550デフォルトの名無しさんNGNG
>>548
fgetsみたいに関数内で配列の中身を書き換えるもののこと?
0551デフォルトの名無しさんNGNG
>>550
あぁ、俺よく読んでなかった。
確かにどうとでも取れるね・・・
0552539NGNG
>>548
> 文脈からして、char*を引数にとる関数でchar*の部分にstringを使いたいってことじゃないかな?

すいません、そういう意味です。
0553デフォルトの名無しさんNGNG
>>536
整数なら単に割ればいい。
浮動小数点数なら割った答えにmodfを使って整数の部分を取り出す。
0554デフォルトの名無しさんNGNG
>>552
char配列に取って=でコピー。
0555デフォルトの名無しさんNGNG
>>552
char const* なら std::string::c_str() だが、 char* なら無理。
std::string使うことに決めたなら、おとなしく適切なメンバ関数(および演算子)使え。
0556デフォルトの名無しさんNGNG
c_str() は駄目なんか。書き換えはいかんけど。
書き換えられる場合は string の operator=()、
operator+()でまかなえることがほとんどだと思うんだがなあ。
0557556NGNG
すまん著しくかぶった…
0558デフォルトの名無しさんNGNG
>>552
std::string に直接書き込むことはできない。一般に std::string は同一の記憶域を
複数の変数で使いまわす可能性がある(そうやってコピーが手軽にできるように
細工してる)から、勝手に書き換えるとほかにも影響が及ぶので。

std::string から char const* に変換したいなら std::string のメンバ関数 c_str() を
使えば良い、そうではなく書き込みたいなら >>554 の言うように一旦 char 配列に
書き込んで operator=() なり assign() なりでコピーする。

あとコピーや読み出しよりも書き込みが頻繁に発生するなら、std::string やめて
std::vector<char> 使うって手もある。
0559558NGNG
>>557
同じく…
0560デフォルトの名無しさんNGNG
ところで、自分でoperator造って使ってる人ってどれくらいいる?
いちいちc_strしてる?
自分、標準C++ライブラリ使わないのでちょっと疑問に思ったんだけど。
0561デフォルトの名無しさんNGNG
>>560
どんな operator のこと?
0562デフォルトの名無しさんNGNG
>>561
話の流れからして operator char const*() じゃないかと。
0563デフォルトの名無しさんNGNG
>>560
c_str()があるのに、いちいち自分でoperator造って使ってる人なんていないだろうな。
0564デフォルトの名無しさんNGNG
>563
暗黙の変換の怖さを知らない初心者が、
覚えたての機能で記述の楽をしようとか考えてるんじゃないの?
0565デフォルトの名無しさんNGNG
>>564
MFC の CString などには C 言語文字列型への暗黙の型変換があるので、
欲しいって気持ちも分かるけどな。
0566デフォルトの名無しさんNGNG
お世話になります。長くなりますがご容赦ください。

【目標】
各派生クラスについて、明示的に作成されたインスタンス
の数を共通のインターフェースで求めたい。
ex)
CBase *pBase;
CDerivedA a1, a2;
CDerivedB b1, b2, b3;
pBase = &a1;
cout << pBase->get_count() << endl; // 結果: 2
pBase = &b1;
cout << pBase->get_count() << endl; // 結果: 3

【追加条件】
上記を実現するに当たって、基底クラスは複雑になっても
構わないので、派生クラスに記述すべき定義をできるだけ
減らしたい。

以下にこれまでの試行錯誤を載せます。
0567デフォルトの名無しさんNGNG
試行錯誤まだ〜?
0568デフォルトの名無しさんNGNG
【試行錯誤 1: private static 変数に格納】
// ここから
class CBase {
public: virtual int get_count()=0;
};
class CDerivedA: public CBase {
 static int countA;
public:
 void add_count() { countA++; }
 virtual int get_count() { return countA; }
 virtual ~CDerivedA() { countA--; }
};
class CDerivedB: public CDerivedA {
 static int countB;
public:
 void add_count() { countB++; }
 virtual int get_count() { return countB; }
 virtual ~CDerivedB() { countB--; }
};
// ----
int CDerivedA::countA;
int CDerivedB::countB;
int main() {
 CBase *pBase;
 CDerivedA a1, a2; a1.add_count(); a2.add_count();
 CDerivedB b1, b2, b3; b1.add_count(); b2.add_count(); b3.add_count();
 ...
}
// ここまで
0569デフォルトの名無しさんNGNG
誰でも最初に思いつきそうな教科書的手法です。
一応目標は達成していますが、派生クラスに要求される
記述量が多く、先に示した追加条件を満足しません。
# コンストラクタ内でカウントするのが自然ですが、
# そうすると上の例では CDerivedB のコンストラクタが
# CDerivedA のコンストラクタを呼び出し、意図しない
# カウントをしてしまいます。

【試行錯誤2: クラス名をキーとするmapに格納】
// ここから
class CBase {
 static std::map<std::string, int> count_map;
public:
 CBase() {}
 virtual void add_count() {
  count_map[typeid(*this).name()]++;
 }
 virtual void sub_count() {
  count_map[typeid(*this).name()]++;
 }
 virtual int get_count() {
  return count_map[typeid(*this).name()];
 }
 virtual ~CBase() {
  this->sub_count();
 }
};
class CDerivedA: public CBase {};
class CDerivedB: public CBase {};
0570デフォルトの名無しさんNGNG
// ----
map<string, int> CBase::count_map;
int main() {
 CBase *pBase;
 CDerivedA a1, a2;
 a1.add_count(); a2.add_count();
 CDerivedB b1, b2, b3;
 b1.add_count(); b2.add_count(); b3.add_count();
 ...
}
// ここまで
この手法で目標を達成でき、また追加条件も満足して
いますが、いくつか不満が残ります。たとえば、typeinfo
ライブラリに頼っている点。コンパイラ依存でやや気持ち
悪いです。他に、map の要素へのアクセス効率も気に
なります。hash_map を使えば良いのでしょうけれど、
できるだけ標準ライブラリだけで済ませたいのです。
# add_count() もできれば削りたいです。。。

【まとめ】
以上で挙げた手法以外に、よりエレガントな方法があれば
是非ご教示ください。宜しくお願い致します。
連投、長レス、スマソ。
0571570NGNG
あぁぁ……!!!
よく見たら先の試行錯誤、どちらもカウントを減らす処理が滅茶苦茶でしたorz
全然目標達成していません。

その辺りも含めて良い方法を、ヒントだけでも下されば幸いです。
教えて君でホントスマソ。
0572デフォルトの名無しさんNGNG
BをAから継承しない。
0573570NGNG
>>1 を読んだら、「質問が長いときは」なんてあるし……。
次からソース貼るときはラウンジ利用しますです。。。

試行錯誤の2つ目ですが、sub_count() でデクリメントすべきところを
誤ってインクリメントしていました。そこを直せば期待通りです。

試行錯誤1つ目はコンストラクタと同じ理由で、デストラクタでカウント
するとまずいので、新たに関数 sub_count() を用意して、スコープから
抜ける直前に呼ぶようにしたら直りました。init() と last() みたいで、
ちょっと情けない対処法です。お暇な方はご意見や改善策などについて
お返事くださいませ。
0574570NGNG
餅つけ漏れ。試行錯誤2もやはりデストラクタでカウントしようとすると
失敗してしまいます。結局 init(), last() 作戦に頼らざるを得ないようです。

>>572
お返事有り難うございます。継承を一度しか許さない、というのは
あらゆることが驚くほど簡単になるので、魅力的な選択肢ではあるのですが……。
もう少し粘ってみたい気持ちと半々です。
0575デフォルトの名無しさんNGNG
>>574
DerivedBは論理的にDerivedAでもあるのだから、
DerivedBのインスタンスが生成されたときにDerivedAのカウントが増えるのは自然。
>>572が言っているのは継承を一度しか許さぬ云々ではなくそのことだと思う。
template <typename Derived>
struct countable {
protected:
    countable(bool b) : top(b) {if(b) ++count;}
    int get_count() {return count;}
    ~countable() {if(top) --count;}
private:
    bool top;
    static int count;
};
template <typename Derived>
int countable<Derived>::count;
class CBase {
    virtual int get_count() = 0;
};
class CDerivedA: public CBase, private countable<CDerivedA> {
    typedef countable<CDerivedA> countable_type;
public:
    CDerivedA(bool top = true) : countable_type(top) {}
    virtual int get_count() { return countable_type::get_count();}
};
class CDerivedB: public CDerivedA, private countable<CDerivedB> {
    typedef countable<CDerivedB> countable_type;
public:
    CDerivedB(bool top = true) : CDerivedA(false) , countable_type(top) {}
    virtual int get_count() { return countable_type::get_count(); }
};
0576デフォルトの名無しさんNGNG
class CBase {
 unsigned& (*Counter)();
public:
 CBase(unsigned& (*CountFunc)()) : Counter(CountFunc) {Counter()++;}
 ~CBase() {Counter()--;}
 unsigned get_count() {return Counter();}
};

template<typename T> class CMiddle : public CBase {
 static unsigned Count;
 static unsigned& Counter() {return Count;}
public:
 CMiddle(unsigned& (*CountFunc)() = Counter) : CBase(CountFunc) {}
};
class CDerivedA: public CMiddle<CDerivedA> {};
class CDerivedB: public CMiddle<CDerivedB> {};

//-------
template<typename T> unsigned CMiddle<T>::Count;

int main()
{
 CBase *pBase;
 CDerivedA a1, a2;
 CDerivedB b1, b2, b3;
 pBase = &a1;
 cout << pBase->get_count() << endl; // 結果: 2
 pBase = &b1;
 cout << pBase->get_count() << endl; // 結果: 3
}

こういうのはだめか?>>570
0577572NGNG
俺が思いついた不自然な振る舞い方
class CBase {
protected:
CBase(int &instance_counter):InstanceCounter(instance_counter)
{InstanceCounter++;}
int &InstanceCounter;
public:
int get_count() {InstanceCounter;}
virtual ~CBase(){InstanceCounter--;}
};
class CDerivedA: public CBase {
 static int countA;
public:
CDerivedA() : CBase(countA) {}
protected:
CDerivedA(int &count) : CBase(count) {}
};
class CDerivedB: public CDerivedA {
 static int countB;
public:
CDerivedB() : CDerivedA(countB) {}
};
0578570NGNG
>>575
丁寧なお返事有り難うございます。
ふむふむ……。なるほど、B is A だから、そもそも B のインスタンスを
数えることは A のインスタンスを含めて数えることが自然なわけですね。
で、そこら辺をすっきりさせるために、テンプレートを使って各クラスごとに
カウンタ構造体を用意してやっているといったところでしょうか。
未だソースを読むのが遅いので、もう少し理解する時間をください。

>>576
代替案をありがとうございます。こちらもテンプレートを使って、
中間クラスを作ってそこで管理…。と、これまた理解が遅くて申し訳
ないのですが、パッと見たところ A や B からさらに派生した場合の
カウントが結局同じように失敗しそうな。うぅ、ちょっとテストしてみます
です。。。
0579570NGNG
>>577 >>572
続けてお返事ありがとうございます。
こ、これは……。こんなやり方もあるんですね。参考になります。
「不自然な期待」通りの結果になることを確認しましたが……、
他の御二方同様、もう少しソースを読む時間を下さいませ。
早くこれくらいのソースをパパッと読み書きできるようになりたいです。。。

それにしても、このスレの住人は良い人ばっかりだぁ(ノд;)
0580570NGNG
少し読めてきました。勘違いなどありましたら御暇なときにご指摘ください。

>>576 さんと >>572 さんはアプローチが似ていて、末端クラスにのみカウンタの実体
を静的に置いて、基底または中間クラスに実体への参照や関数ポインタを非静的メンバ
に持っていますね。この構造は、なるほどごく自然で、目からうろこでした。
Base1 -(参照)-┬-> DerivedA (or Middle<DerivedA>) のカウンタ実体
Base2 -(参照)-┤
Base3 -(参照)-┘
Base4 -(参照)-─-> DerivedB (or Middle<DerivedB>) のカウンタ実体
特に >>576 さんの方法は初めに示した「派生クラスの記述量を少なく」という
条件にも対応してくださっていて、ふむふむ、と、しかし相変わらず派生クラスを
もう一度派生する方法がわからず、色々試しています。

>>575 さんのアプローチは、中間クラスも末端クラスも、カウンタの実体を
バシバシ作っておいて、カウントする際に末端クラスへの派生か否かを
フラグに取っておいてあるようです。親クラスを分離する手法は参考になります。

御三方とも、回答有り難うございました。なんとか解決しそうです。
また機会がありましたら宜しくお願い致します。
0581デフォルトの名無しさんNGNG
>>569
569をちょっと変えてLoki::TypeInfoを使うってのは?
Loki::TypeInfoはstd::type_infoをコンテナに格納できるようにするラッパです.
#include <loki/LokiTypeInfo.h>
using namespace std;
class CBase {
static map<Loki::TypeInfo, int> count_map;
public:
virtual void add_count() {count_map[Loki::TypeInfo (typeid(*this))]++;}
virtual void sub_count() {count_map[Loki::TypeInfo (typeid(*this))]++;}
virtual int get_count() {return count_map[Loki::TypeInfo (typeid(*this))];}
virtual ~CBase() {this->sub_count();}
};
class CDerivedA: public CBase {};
class CDerivedB: public CBase {};
map<Loki::TypeInfo, int> CBase::count_map;
0582デフォルトの名無しさんNGNG
どうして例外処理というのは重宝されるのですか?
ifでいいじゃないですか。
0583570NGNG
>>581
typeinfo構造体を丸ごとmapのkeyに持って来るようなものでしょうか?
それともhash関数に内部名を通すのかしら。 Loki や Boost について知識が
乏しいので改めて調べてみようと思います。>>569 は設計からして救いようが
ありませんが、Loki は色々使いようがありそうですので、有り難く引き出しに
しまっておくことにします。貴重な情報を有り難うございました。

>>582
例外処理、というとC++では try/catch ブロックのことでしょうが、
if 文でのエラー処理と (機能面で) 決定的に違うのは、try で関数を
呼び出して、関数内で throw した例外が関数を「抜けた後」で catch
ブロックに届くという点だと理解しています。それこそ、何重にも渡って
深く関数を呼び出しても例外が届くのです。set_xxx 系関数は戻り値が
成功フラグだったりしますが、get_xxx 系関数はそういうわけに行かず、
重宝するのではないでしょうか。
ロベールのC++教室、第二部第46章あたりに説明されています。
ttp://www1.kcn.ne.jp/~robe/cpphtml/index.html
他に、if 形式と try/catch 形式とでエラーの意味的な分類をしている
ということをどこかで見た記憶がありますが、ちょっと思い出せません。
0584582NGNG
>>583
わざわざ丁寧なご説明をありがとうございました。
0585デフォルトの名無しさんNGNG
>>583
Loki::TypeInfoの中で保持しているのはtypeinfoのポインタみたいです.
コンテナに格納できるように
std::typeinfoにはないコピーコンストラクタ,代入演算子を実装して
operator==はstd::type_infoのoperator==を
operator<はstd::type_infoのbeforeを使っているようです.
0586570NGNG
>>585
おお。私もつい先ほど Loki::TypeInfo のヘッダファイルを確認してみました。
てっきり std::type_info を直接比較するのは効率が悪かろうと思っていたのですが、
そもそも std::type_info::operator==() が定義されていたのですね!
std::type_info は構造体ではなくクラスだったのですね!!衝撃です。
符号化規則と照合順はコンパイラ依存とのことですが、結果は保証されて
いそうですし、今まで必死こいて string で比較していた私はなんと愚か
だったことか。Loki を使うにせよ使わないにせよ、大変勉強になりました。
有り難うございました。
0587デフォルトの名無しさんNGNG
そのためのtype_infoなのに……
0588デフォルトの名無しさんNGNG
C言語初心者ですが、javaのeclipseみたいなc言語用の開発ツールは
どういうものがあり、一番使いやすいものはどれになりますでしょうか?

freeソフトでも有料ソフトでもよいので教えてください。よろしくお願いします
0589デフォルトの名無しさんNGNG
ものすご素人質問で申し訳ないのですがshowbaseというのはいったいどういうものなのでしょう。
cout << showbase << hex << &n2 << endl; という形で説明もナシで本で使われていて何のことなのかさっぱりわかりません・・

0590デフォルトの名無しさんNGNG
コードの貼り付け失敗。。
int n2 = 12345;
int* pn = &n2;
cout << showbase << dec << &n2 << endl;
int n3 = reinterpret_cast<int>(pn);
cout << n3 << endl;
0591デフォルトの名無しさんNGNG
http://www.cplusplus.com/ref/iostream/ios_base/_showbase.html
0592デフォルトの名無しさんNGNG
>>588
eclipseってC++にも対応してなかったんでしたっけ?
CDTとかって検索で引っかかりますけど.
0593デフォルトの名無しさんNGNG
>>588
C/C++の宿題を片づけ作戦指令 30代目
http://pc5.2ch.net/test/read.cgi/tech/1091954342/441
0594588NGNG
お願いします。頼むから教えてください
0595デフォルトの名無しさんNGNG
>>594
あちこちで聞きまくってるようだな、氏ねよ
0596デフォルトの名無しさんNGNG
>>595
おめーが氏ねよ
0597デフォルトの名無しさんNGNG
char* buffer = new char [10];
で10byteのバッファを確保した場合

delete [] buffer;

delete buffer [];
どちらもコンパイル通るんですが、
どっちが正しいの???
0598デフォルトの名無しさんNGNG
>>597
下はふつう通りません。
使ってるコンパイラ何?
0599デフォルトの名無しさんNGNG
BCB5です
0600デフォルトの名無しさんNGNG
Algorithm Collectionはどこにいったんですかぁ(T_T)
いいサイトだったのに…
http://alfin.mine.utsunomiya-u.ac.jp/~niy/algo/
0601デフォルトの名無しさんNGNG
>>599
嘘をつくな
0602デフォルトの名無しさんNGNG
>>601
ネタにマジレスカコワルイ
0603デフォルトの名無しさんNGNG
VC6です
0604デフォルトの名無しさんNGNG
質問です。
本を見ながら勉強しています。
本に紹介があった「LSI C-86 Ver 3.30c 試食版」というのを使ってます。
でも、これだと上手くいかなくてイライラしたので、vectorで「LightC体験版」というのも使ってみました。
どちらもMS-DOS上で動くコンパイラです。 
 
で、あるソースコードを書いてコンパイルしてみたのですが、本がすすめるコンパイラ(上)ではコンパイルできず、
下のコンパイラではコンパイルできました。実行すると上手くいきます。
何がまずいんでしょうか?
ソースコードを書きます。。 
#include <stdio.h>
int main()
{
int youso[] = {2,-1,3,2,4,5,-2,0};
printf("行列を指定\n",);
printf("%d %d  %d %d\n",youso[0],youso[1],youso[4],youso[5]);
printf("%d %d  %d %d\n",youso[2],youso[3],youso[6],youso[7]);
printf("行列を掛け算\n",);
int kake[4];
kake[0] = (youso[0])*(youso[4])+(youso[1]*youso[6]);
kake[1] = (youso[0])*(youso[5])+(youso[1]*youso[7]);
kake[2] = (youso[2])*(youso[4])+(youso[3]*youso[6]);
kake[3] = (youso[2])*(youso[5])+(youso[3]*youso[7]);
printf("%d %d\n",kake[0],kake[1]);
printf("%d %d\n",kake[2],kake[3]);
return 0;
}
 
上のコンパイラでやると6行目にsyntax error near ")"、あとkakeを変数として認識してくれないとか色々エラーが出て話にならないんですが…
0605デフォルトの名無しさんNGNG
>>604
古いCの規格(といっても今は主流)では、変数宣言は関数の先頭にまとめなければならない。
0606デフォルトの名無しさんNGNG
>>604
int kake[4];の行をint youso[] = {2,-1,3,2,4,5,-2,0}; の上か下へ移す。
(C99より古い規格のCで変数宣言ができるのはブロックの始めだけ)

"行列を指定\n"と"行列を掛け算\n"の後ろについているコンマが余計なので外す。
0607デフォルトの名無しさんNGNG
http://www.vector.co.jp/soft/win95/prog/se122244.html
> プログラムの途中や for 文の中で変数を宣言できるなど、C++ と同じ便利な機能が取り込まれています。
Light Cの独自拡張ですね。
0608デフォルトの名無しさんNGNG
>>605-607
丁寧なレスありがとうございます。
うまく訂正できました。
拡張機能使ってるのなら他のCコンパイラでエラーが出ても仕方ないですね。
もう一度よく勉強します。
0609デフォルトの名無しさんNGNG
>>607
見方によってはC99の部分サポートとも言えるな。
0610デフォルトの名無しさんNGNG
#include <iostream>
#include <string>
using namespace std;

int i,k;
int main()
{
string str[4][2]= {{"就職","活動"},
{"会社","訪問"},
{"集団","面接"},
{"学校","推薦"}
};

for(i=0;i<4;i++){
for(k=0;k<2;k++){

cout << str[i][k] << endl;

}

cout << "\n";
}

}

これってどうよ?
0611デフォルトの名無しさんNGNG
>>610
毎回endlを呼ぶのは無駄。
0612デフォルトの名無しさんNGNG
>>610
寧ろ最後こそendlにしろ。
0613デフォルトの名無しさんNGNG
>>610
main()の戻り値がない。
0614デフォルトの名無しさんNGNG
>>610
グローバル変数使うな。
0615デフォルトの名無しさんNGNG
>>610
定期的にこの書き込み見るんだけど何?
0616デフォルトの名無しさんNGNG
>>615
あなたのような暇人を見つけるためでしょうね
0617デフォルトの名無しさんNGNG
>>610
2バイト文字をコードに埋め込むなよ・・・。
0618デフォルトの名無しさんNGNG
>>610
非組み込み型の配列は初期化できない。
0619デフォルトの名無しさんNGNG
↓ここでツッコミ
0620デフォルトの名無しさんNGNG
文字化けしてます?
0621ド素人NGNG
質問です。
主に,行列計算を行う複雑なプログラムを作ろうと思っています。

基本的にc++でコーディングした方が,javaよりもcよりもメモリ消費が
少なくてすむし,スピードも両者より2倍近く早いというのは正しいでしょうか?
0622デフォルトの名無しさんNGNG
行列計算用のライブラリを使うのが一番早い
0623ド素人NGNG
>>622
言語はどれがよいでしょうか?
0624デフォルトの名無しさんNGNG
好きなの選べ
0625デフォルトの名無しさんNGNG
コンストラクタで自分自身へのthisポインタは有効なのでしょうか?
class AA
{
public:
BB b;
};

class BB
{
public:
AA a;
BB(){
a->b=this;
}
};
0626デフォルトの名無しさんNGNG
>>625
もちろん
0627デフォルトの名無しさんNGNG
>>625
初期化が完了していないことに注意が必要。
0628デフォルトの名無しさんNGNG
public:
double GetCircle()const{return circle;}
のように最後にconstがくるとその関数では数値の変更ができなくなるという意味があると思うのですが
const int showdata(){return a;}のように最初にconstがくる場合はどういう意味があるのでしょうか。
そして最後につけているものとドウ違うのでしょうか、よろしければご指導お願いします。
0629デフォルトの名無しさんNGNG
const int型を返すからshowdata()=1;とかできない。
あんまり意味はないわな。
0630デフォルトの名無しさんNGNG
>>628
最後につくのはメンバ関数のconst。
最初につくのは戻り値のconst。
0631デフォルトの名無しさんNGNG
今日初めて本を見ながらvisual c++をはじめてるのですが、
いきなり5ページ目でつまづきました。

SDIアプリケーションから初めてすぐにビルドしたら
C:\Program Files\Microsoft Visual Studio\MyProjects\test2\test2.rc(360) : fatal error RC1015: cannot open include file 'l.jpn\\afxres.rc'.
というエラーがでてビルドできません。(test2というのはワークスペースの名前です。)

どこをどうすれば解決するのか教えていただけないでしょうか?

0632デフォルトの名無しさんNGNG
>>629-630
ありがとございました。
0633デフォルトの名無しさんNGNG
const char * を返したり
const int& を返したりするのは全然別の話で
ちゃんと意味があるから
勘違いしないようにね。
0634デフォルトの名無しさんNGNG
const int&を返すと言うか!
関数内部のstatic変数以外返してはならんぞ!
0635デフォルトの名無しさんNGNG
intじゃなくてクラスなら*thisも問題ないけどな。
0636デフォルトの名無しさんNGNG
static変数返すより、メンバ変数の参照返すのが多くないか。
0637デフォルトの名無しさんNGNG
const char *は さしているアドレスは変えられるけど指している文字列の変更ができないポインタでしたっけ、、?
const int&は 指しているint変数は変えられてもその内容は変えられないのかな。。?
最近そこのあたりをやったばかりでなかなかむずかし・・

>>関数内部のstatic変数以外返してはならんぞ!
staticでないと関数の処理が終了したときにその関数内部のローカル変数は消えるから実態のない参照なりポインタなりがかえるとまずいからですよね。。?

なんだかまた質問になってスイマセン・・・
0638デフォルトの名無しさんNGNG
char*
const char*
char* const
const char* const
0639デフォルトの名無しさんNGNG
>>637
>const char *は さしているアドレスは変えられるけど指している文字列の変更ができないポインタでしたっけ、、?
yes.

>const int&は 指しているint変数は変えられてもその内容は変えられないのかな。。?
違う。参照はポインタと違って指す対象を変えられない。
const int *constに対応すると言ってもいい。
0640633NGNG
悪い、俺が混乱させたかな。
const char * や、
const std::string& を返す
とでも考えてくれ。
0641637NGNG
>>639-640
そういえば参照は初期化のみ可能で後から代入ができませんでしたね。。基礎的なことを忘れておりました。
丁寧な解説ありがとうございました。
0642デフォルトの名無しさんNGNG
char buf[256];
strcpy( buf, "初心者歓迎" );

//こういう入力と出力が同じような使い方はありなんでしょうか?
sprintf( buf, "%s C/C++室", buf );
0643デフォルトの名無しさんNGNG
>>642
駄目
0644デフォルトの名無しさんNGNG
>>642
その場合ならとりあえずstrcatが使える。
strcat(buf, "C/C++室");
0645デフォルトの名無しさんNGNG
>>643-644
動くのでつい使ってしまってました。
strcatか、無理なら別バッファ用意します。レスサンクスです。
0646デフォルトの名無しさんNGNG
環境依存OKって考えであれば、>642は事実上問題がないような。
0647デフォルトの名無しさんNGNG
知ってる方教えてほしいことがあります。

win32のコンソールアプリでCtrl+Sを無効化をしたいのですが、
どのような方法がありますか?

Ctrl+Cはsignal関数でなんとか無効化は出来るのですが・・・。

よろしくお願いします。
0648デフォルトの名無しさんNGNG
#include <iostream>
#include <string>
using namespace std;
class Myclass{
private:
static string class_string;
public:
static string show(){return class_string;}
};
string Myclass::class_string = "mystring";
int main()
{
cout << Myclass::show() << endl;

return 0;
}

このコードが実行できることはいいのですが、static string show()const{return class_string;}とすると、
静的メンバ関数が、メモリ モデル修飾子をともなって宣言されました。となりエラーなのですが、特に処理の中でメンバやオブジェクトに変更を加えているわけではないのでなぜエラーなのかわからないです。。
よろしければご指導お願いします。
0649648NGNG
また、元のコードのstring Myclass::class_string = "mystring";をmainのなかに移すとエラーとなってしまうのですがこれについてもよろしければお願いします。
何度もすみません。
0650デフォルトの名無しさんNGNG
>>648
staticメンバ関数からは非staticメンバにはアクセスできないから、
メンバ関数のconstしていによる「非staticメンバを変更しない」という指定は意味が無い。
そして「staticメンバを変更しない」というconst指定はできない。
0651デフォルトの名無しさんNGNG
>>649
staticデータメンバの定義はnamespaceスコープに現れなければならない。
元のコードはグローバルnamespaceでの定義。
mainに移すと関数スコープなのでダメ。
0652デフォルトの名無しさんNGNG
Win環境に依存した質問です。

他人の作ったアプリ用のDLLを作成しています。

マルチスレッド対応が必要なので、DLL_THREAD_ATTACHで
スレッドローカル記憶域を確保しているのですが上手く動きま
せん。

どうやらアプリが複数のスレッドを作成後にこのDLLをロード
して、ロードしたスレッド以外からもコールしているようです。

このような場合は自分でスレッドIDを元に記憶域確保したり
しなければならないのでしょうか?
(元のアプリに手を加える事は出来ないのです_| ̄|○)
0653648NGNG
>>650-651
わかりやすい解説ありがとうございました。
0654デフォルトの名無しさんNGNG
>>652
DLLの関数の中でTlsGetValueしてるんだと思うけど、
結果がエラーだったらそこでTlsSetValueすればいいのでは?

Win32API質問箱 Build22
http://pc5.2ch.net/test/read.cgi/tech/1092524669/
こっちで聞いたほうがいいかも。
0655652NGNG
>>654
動きました!

しかもPROCESS_DETACHは呼ばれるようで
メモリーリークも発生しません。

これで徹夜しないで済みます。
MY神様と呼ばせて下さい。

ありがとうございました。
0656652NGNG
>>655

誤 PROCESS_DETACH
正 THREAD_DETACH
です。
0657デフォルトの名無しさんNGNG
幾つものオーバーロードされたコンストラクタがあり、それも
ある処理をしたい場合、
privateなinitメソッドをつくり、全てのコンストラクタないで
init()するしかありませんか?
0658デフォルトの名無しさんNGNG
>>657
いいえ、たぶん他に方法があります。
ですが、もう少し具体的に伝わるように状況を説明したほうがいいでしょう。
0659657NGNG
たとえば
class CHoge
{
int hoge;
public:
CHoge():hoge(0){}
CHoge(char* p):hoge(atoi(p)){}
CHoge(std::string):hoge(1){}
};
なるクラスだと
hoge(atoi(p))とhoge(0)とhoge(1)
を3つのコンストラクタに書くのが面倒なんですが・・・
0660デフォルトの名無しさんNGNG
>>659
初期化している値がコンストラクタの引数によってそれぞれ違うなら、
その例に書いてあることはすべて必要な記述です。
3つのコンストラクタに init(0) init(atoi(p)) init(1) と書いてもただの無駄でしょう。
0661デフォルトの名無しさんNGNG
std::multimapに含まれているキーのリストを得るスマートな方法ないですか?
key : value = A : 1
key : value = A : 12
key : value = A : 123

key : value = B : 1
key : value = C : 12
key : value = C : 123

といったpairがstd::multimapに格納されてるとして
A,B,Cといったリストが欲しいのですが、begin()からend()まで地道に調べていけば
いいのですが、coolな方法があるなら教えてください
0662デフォルトの名無しさんNGNG
math.hをインクルードしたにも関わらず、
sinやcos、tan関数で返って来る値がおかしいんですけど、
原因はなんなんでしょうか?
0663デフォルトの名無しさんNGNG
>>661
std::unique
0664デフォルトの名無しさんNGNG
>>662
まさか角度を度で入力してるとかじゃあるまいな?
0665デフォルトの名無しさんNGNG
>>661
std::multimap::equal_range, std::copy, std::back_insert_iteratorでどうにかできない?
0666662NGNG
>>664
調べてみたら引数にラジアン値を指定するようでした……。
ありがとうございました。
0667デフォルトの名無しさんNGNG
>>666
(;´,_ゝ`)
0668デフォルトの名無しさんNGNG
クラススコープの定数を使いたいんだけども
例えばクラス名がAだとして
A::LENGTH なり、A::B::LENGTH なり。

class A
{
public:
static const int LENGTH;
char c[LENGTH];
};
とやると、char c[LENGTH] で定数式が必要といわれる

どうすればスマートですか?
enumだと値の重複があってイヤです
0669デフォルトの名無しさんNGNG
>>668
その場で初期化しろ。
0670デフォルトの名無しさんNGNG
>>669
その場で初期化ってどうやればいいの?
static const int LENGTH=100;
とかやると純仮想関数とみなされたりでコンパイル通らない
0671デフォルトの名無しさんNGNG
>>670
VC6とかの古いコンパイラ使ってながら何いってるんだ?
enumにするかあきらめろ
0672デフォルトの名無しさんNGNG
>>668
enumでいいじゃん。classん中で定義すりゃ
0673デフォルトの名無しさんNGNG
>>671-672
VC6じゃ出来ないんですね。ありがとう
NAMESPACEにでもします
0674デフォルトの名無しさんNGNG
gettimeofday()関数を使って時間の測定を行いたいのですが、
sys/time.hがないようでうまくいきません。
何か他の手段でマイクロ秒単位で測定が行えないでしょうか?

言語はCで、使用しているコンパイラはボーランドです。
0675デフォルトの名無しさんNGNG
あれはUNIXのシステムコールだ。
0676デフォルトの名無しさんNGNG
お邪魔します。spy++のようなイメージのものを作りたく思っています。
マウスドラッグが終わったところから、そのウィンドウのハンドルを取得するつもりで、
サイトを見ながら以下のようなプログラムを書きましたが、うまくいきません。。
理由とできれば解決策をお願いします・・・m(_ _)m

//キャプチャ中のとき
pts = MAKEPOINTS(LParam);
pt.x = pts.x;
pt.y = pts.y;
hWndTo = WindowFromPoint(pt);
0677デフォルトの名無しさんNGNG
>>675
げげ、そうなのですか。ありがとうございます。
0678デフォルトの名無しさんNGNG
>>674
timeGetTime
GetTickCount

ms単位まで。前者奨める。
ちなみに、あまり高精度で測定しても意味はありません。
なぜなら、時間の取得にかかる時間が誤差になるからです。
0679デフォルトの名無しさんNGNG
>>674
窓なら
QueryPerformanceCounter()
を使えばμ秒の精度(予定)
CPUがINTEL系なら インラインアセンブラでRDTSC
でも良いかと
0680デフォルトの名無しさんNGNG
#include<iostream.h>
double* keisan(double c);
main(){
double *B;
B=keisan(2.0);
cout << "B[0] = "<< B[0] << endl;
cout << "B[1] = "<< B[1] << endl;
cout << "B[2] = "<< B[2] << endl;
cout << "B[3] = "<< B[3] << endl;
cout << "B[4] = "<< B[4] << endl;
}
double* keisan(double a){
double *A=new double[5] ;
A[0]=0.0;
A[1]=1.0;
A[2]=4.0;
A[3]=3.0;
A[4]=2.0;
cout << "A[0] = "<< A[0] << endl;
cout << "A[1] = "<< A[1] << endl;
cout << "A[2] = "<< A[2] << endl;
cout << "A[3] = "<< A[3] << endl;
cout << "A[4] = "<< A[4] << endl;
return A;
すみません。上のプログラムでAはまともに出力されるのですが、BはB[1]から
変な数値になってしまいます。この理由がわかりません。
B[0]=0;B[1]=1;B[2]=4;B[3]=3;B[4]=2;と出力するにはどうプログラムを
書き換えればよいのでしょうか?
0681デフォルトの名無しさんNGNG
>>678
時間取得にmsオーダーものオーバーヘッドは発生しないって
0682デフォルトの名無しさんNGNG
>>679
ノートのような動的にクロックが変わるものだと…?
0683デフォルトの名無しさんNGNG
>>678,679
ありがとうございます。
QueryPerformanceCounter()を使って、測定する事が出来ました。
0684デフォルトの名無しさんNGNG
>>676
確認してないけど座標系が違うんじゃないかな。
lParamのほうがクライアント座標で、
WindowFromPointはスクリーン座標だったかと。
MapWindowPointsを使って座標を変換できる。
0685デフォルトの名無しさんNGNG
すいません質問なんですが
他人が作ったライブラリファイルで、そのソースがないんですけど
ライブラリファイルだけでその内容を見ることは出来るのでしょうか?
0686デフォルトの名無しさんNGNG
>>685
何の内容だ?
0687デフォルトの名無しさんNGNG
>>686
ソースコードです
0688685NGNG
>>686
申し訳ないです。ライブラリについてはよく分かってないものですから・・・
Cで書かれたライブラリってのは、Cのプログラムから作ってるんですよね
逆に、ライブラリファイルからソースを抽出できるのかな?ということなんです
0689デフォルトの名無しさんNGNG
>>688
卵焼きってのは生卵から作ってるんですよね
逆に、卵焼きから生卵を抽出できるのかな?ということなんです
0690685NGNG
>>689
回答ありがとうございます
勉強しなおしてきます
0691デフォルトの名無しさんNGNG
微妙に変な比喩だけどな。
0692デフォルトの名無しさんNGNG
>>690
こっちの方が比喩としてはいいのではないだろうか。

英文の和訳ってのは英文から作ってるんですよね?
逆に、英文の和訳から英文を抽出できるのかな?ということなんです

ある意味、できる。逆アセンブルして読んで解釈すれば。
0693デフォルトの名無しさんNGNG
あるいは、ブロックが色分けされていない仕様のテトリスにおいて、
積み重なったブロック群を元のブロックに戻すようなもんか。
0694デフォルトの名無しさんNGNG
I'm a kitchen drink.
0695デフォルトの名無しさんNGNG
2次元配列と引数にとって、2次元配列を返す関数を作りたいのですが、
どうしてもうまくいきません。いろいろ調べても多次元配列を引数にとる
方法は書いていても、多次元配列を返す方法が書いていません。

AとBを受け取ってCを返す関数を作りたいとき

double (*C)[2](double (*A)[2],double (*B)[2])という風に宣言したら
エラーになってしまいます。
どう宣言すればよいのでしょうか?

誰か教えてください。
0696デフォルトの名無しさんNGNG
>>695
double (*C)(double (*A)[2],double (*B)[2])[2];
0697デフォルトの名無しさんNGNG
>>695
typedef double (*HOGE)[2];
HOGE C(HOGE A, HOGE B)
0698デフォルトの名無しさんNGNG
>>696
以下のコードで関数は配列を返せませんというエラーが出てしまいます。
どこが間違っているのでしょうか?

#include<iostream.h>
double (*tasizan)(double (*A)[2],double (*B)[2])[2];
main(){
double A[2][2];
A[0][0]=1.0; A[0][1]=0.0;A[1][0]=0.0;A[1][1]=1.0;

double B[2][2];
B[0][0]=1.0;B[0][1]=2.0;B[1][0]=1.0;B[1][1]=2.0;
double (*C)[2];
C=tasizan(A,B);
}

double (*tasizan)(double (*A)[2],double (*B)[2])[2]{
double (*C)[2];

C[0][0]=A[0][0]+B[0][0];
C[0][1]=A[0][1]+B[0][1];
C[1][0]=A[1][0]+B[1][0];
C[1][1]=A[1][1]+B[1][1];

return C;
}
0699696NGNG
>>698
ごめん。正しくは
double (*C(double (*A)[2],double (*B)[2]))[2];

ところで、そのコードは意図したように動かないと思うぞ。
初期化していないポインタを使ってはいけない。
0700デフォルトの名無しさんNGNG
>>699
>>697
どうもありがとう。初期化すればうまくいきました。
0701676ですNGNG
>>684 さん、MapWindowPointsの使い方がわからなかったのですが、
それでくぐってClientToScreenにたどり着きました。どうもありがとうございました
0702デフォルトの名無しさんNGNG
WndClass.lpfnWndProcにC++ class内の関数をどうやれば登録できますか?
0703デフォルトの名無しさんNGNG
間に一個はさむとか
0704デフォルトの名無しさんNGNG
>>702
関数にstaticを付ける。
0705702NGNG
>>704
ありがとうございます
できればstaticにしたときの注意点や、参考になるWeb pageなども教えてください。
0706デフォルトの名無しさんNGNG
残念な質問で恐縮ですが。

構造体などのメンバにアクセスする際(.を打ち)、たま〜にメンバが出てくれないことがあります。
変数名が違う時やその他エラーが存在する時に出ないという事は承知している
のですが、なんの問題もなく、ただ唐突にでなくなる症状があります。
こんな症状ありませんか?

MicrosoftVisualC++ 6.0
0707デフォルトの名無しさんNGNG
>>705
staticを付けると静的関数になるのでthisポインタはない。
そこで下のようにするとメンバ関数RealWindowProcがthis付きで呼ばれる。
ただしCreateWindow(Ex)の最後のパラメータにHogeへのポインタを渡す必要があるから、
クラスのメンバにCreateWindow(Ex)を行う関数が絶対必要。
class Hoge {
 static WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
 virtual RealWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
};

LRESULT CALLBACK Hoge::WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
 Hoge *pWnd = reinterpret_cast<Hoge *>(GetWindowLongPtr(hwnd, GWLP_USERDATA));
 if (uMsg == WM_NCCREATE)
 {
  pWnd = static_cast<Hoge*>(static_cast<LPCREATESTRUCT>(lParam)->lpCreateParams);
  SetWindowLongPtr(hwnd, GWLP_USERDATA, reinterpret_cast<LONG_PTR>(pWnd));
 }
 if (pWnd)
  pWnd->RealWindowProc(hwnd, uMsg, wParam, lParam);
}
0708デフォルトの名無しさんNGNG
>>706
http://live.under.jp/todashou/tips/VC++/intellisense.html
0709706NGNG
>>708
なるほど・・・。ありがとうございます。
微妙に解決しませんでしたが、ちょっとここからはDirectXの構造体の話になってしまいスレ違いということで自粛します。

とは言えこれで通常時この問題にぶち当たった時に対処できます。
ありがとうございました。
0710デフォルトの名無しさんNGNG
c++で作ったメソッドをjavaで使おうと思ってるのですが、
その方法を詳しく書いててお薦めのページがあれば教えて頂けないでしょうか?
0711705NGNG
>>707
ソースを見ながら少しずつやっていきます
ありがとうございました
0712デフォルトの名無しさんNGNG
>>710
http://pc5.2ch.net/test/read.cgi/tech/1033795664/
0713デフォルトの名無しさんNGNG
c++の最適化について書いてる本ないですかね?

javaでいうjavaの鉄則みたいなやつ
0714デフォルトの名無しさんNGNG
Efficient C++
0715684NGNG
>>701
そうだった。
ClientToScreenのほうが引数少なくて楽だね。ごめん。

>>707
USERDATAは誰かが別の目的で使ってたらと思うと
怖くて使えないのは俺だけ?
自分でテーブルつくって管理すればいいんだろうけど
面倒なので、たいていはSetProp/GetPropを使ってる。
もちろん速度的には不利だろうけど。
0716デフォルトの名無しさんNGNG
>>715
サンク使うのがいいかも。
ATLからソースをパクっt(ry
0717デフォルトの名無しさんNGNG
>>715
VCLの手法パクっt(ry
0718デフォルトの名無しさんNGNG
VCLは糞以下
なぜ、あんなライブラリを商用として提供できるの? > Borland殿
0719デフォルトの名無しさんNGNG
買うやつがいるからな
0720デフォルトの名無しさんNGNG
>>718
禿げあがってしまうほど、同意
ぜってー、VC++の方が使いやすくね?
0721デフォルトの名無しさんNGNG
質問です。
�@visual c++.netを使っています。
 あるプロジェクトの中にtest1.cppとtest2.sppというものがあり、
 test1の中で
#include <iostream>
main(){}
 class test11{
public:
static void A1(){}
};
という形で書かれているとします。main関数とclass test11の順番を逆にしたら
コンパイルできるのですが、上の時にmainの前にstatic void test11::A1();
と宣言しても「test11の識別子がクラス名でも名前空間名でもありません」
というエラーが出てしまいます。正しい書き方があれば教えていただけないでしょうか?

�Aあと、上の例でコンパイルの順番がtest1.cpp→test2.cppでtest1の一番最初にmain関数が
来ている場合、test2の中の関数を使うことは可能でしょうか?
test2.cppのなかのclass test22の中のメソッドB()を使いたい場合はどういうコードを書けばよいので
しょうか?

よろしくお願いします。

0722デフォルトの名無しさんNGNG
>>721
(1)
class test11 {
public:
static void A1();
};
main() { ... }
void test11::A1() { ... }

ただし、普通はヘッダファイルを使う。
(2)の質問の答えも同様。
0723デフォルトの名無しさんNGNG
別スレで質問したら、相手にされなかったのでここで質問させて頂きます。

行列計算用のライブラリで計算速度が速く使いやすいおすすめのものがあれば
紹介していただけないでしょうか?
0724デフォルトの名無しさんNGNG
>>723
自作すれば一番満足できるだろ
0725デフォルトの名無しさんNGNG
#include<stdio.h>
#include<stdlib.h>

int main(void){
FILE *fp;
if((fp=fopen("sintai.dat","w"))==NULL){
printf("File not open\n");
exit(1);
}

int i;
struct sintai {
char *name;
int height,weight;
};
static struct sintai a[]={
{"nagata" ,180, 85},
{"nisimura" ,185, 95},
{"nakanisi" ,175, 80},
{NULL,0,0}
};
for (i=0 ; a[i].name != NULL; i++){
printf("%s\t%d\t%d\n",a[i].name,a[i].height,a[i].weight);
fprintf(fp,"%s\t%d\t%d\n",a[i].name,a[i].height,a[i].weight);
}
return 0 ;
}

これはstruct sintai a[]を初期化してsintai.datへ書き出すプログラムですが

これの逆をする場合、つまりsintai.datが 先に与えられている条件でsintai.datを読み込んで
struct sintai a[]へ代入する場合はどうすればいいでしょうか
0726デフォルトの名無しさんNGNG
>>723
C++相談室で上がってるもの以外だとoctaveのライブラリなんかどうでしょう?
0727デフォルトの名無しさん NGNG
文字列の先頭に文字を挿入するにはどうすればいいですか?
0728デフォルトの名無しさんNGNG
>>727
std::stringならinsert()
0729デフォルトの名無しさんNGNG
すいません、stringはつかわないで、普通にCharで文字列操作をする場合に
どうやったら簡単にできるでしょうか。
0730デフォルトの名無しさんNGNG
sprintf
0731デフォルトの名無しさん NGNG
LinuxでCをやっているのですが、16進数を文字に変換することはできるのでしょうか?
0732デフォルトの名無しさんNGNG
>>731
16進数をどうやって扱ってる?
0733727、729NGNG
>>728>>730
どうもです。
sprintf(str,"a%s",str)
みたいに、自分の先頭に足して自分に代入するのはできないですよね。
どうにか新しく余計な文字列を作らないで完結できないものでしょうか。。。
0734デフォルトの名無しさんNGNG
void test( void ) {
int num = 0xFFFF;
char str[5];
sprintf( str, "%x", num);
printf( "%s\n", str );
}
0735デフォルトの名無しさんNGNG
>>733

(1)
char str[6] = "1234";
char tmp[6];
strcpy(tmp, str);
strcpy(str, "0");
strcat(str, tmp);

(2)
char str[6] = "1234";
for(int i = 5; i > 0; i--){ str[i] = str[i - 1]; }
str[0] = '0';
0736デフォルトの名無しさんNGNG
731です。

「cgi」で日本語入力ホームを作って入力すると%23%4d%43・・・のように出ます。
%以降のは16進数らしいんです。これを日本語にするにはどうしたらいいのでしょうか?
0737デフォルトの名無しさんNGNG
>>736
sscanfかstrtol
0738デフォルトの名無しさんNGNG
vector<int> v = { 0, 2, 4, 8, 16, 32 };
こんな感じで初期化出来ませんか?
0739デフォルトの名無しさんNGNG
>>738
そのままでは無理。
const int init[] = { 0, 2, 4, 8, 16, 32 };
vector<int> v(init, init + sizeof init / sizeof *init);
operator,の定義でごまかす方法もある。
0740デフォルトの名無しさんNGNG
>>739
なるほど。どうもありがとうございました。
0741デフォルトの名無しさんNGNG
737さん
どうもありがとうございます。さっそく試してみたいと思います。
0742デフォルトの名無しさんNGNG
#include<stdio.h>
#include<iostream.h>
#include<stdlib.h>
double** AA(int n) {
double** A;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
A[i][j]=1;
}
}
return A;
}
main(){

double** B= AA(3);
cout << B[0][0] << endl;
}

引数nをとって,n×nの2次元配列を返すメソッドを作りたいのですが、
上のプログラムだとコンパイルは出来ますが、実行するとフリーズしてしまいます。
おそらく、ポインタの初期化が出来ていないからだと思うのですが
なかなかコードが書けません。


誰か教えてくれないでしょうか?
0743デフォルトの名無しさんNGNG
#include<stdio.h>
#include<iostream>/* iostream.hは時代遅れ */
#include<stdlib.h>

double *AA(int n) {
double *A = new int[n*n]; /* C++では要素数が不明の配列の配列を作れない。*/
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
A[i * n + j] = 1; /* 添え字を工夫 */
return A;
}

int main() { /* intは必須 */
double *B = AA(3);
std::cout << B[0 * 3 + 0] << std::endl;
delete B; /* newの後始末 */
}
0744デフォルトの名無しさんNGNG
#include<iostream>

using namespace std;

double** AA( int n ) {
double** A = new double*[n];
for (int i = 0; i < n; i++)
A[i] = new double[n];

for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
A[i][j]=1;
}
}

return A;
}

int main(){
double** B = AA(3);

cout << B[0][0] << endl;

for (int i = 0; i < 3; i++)
delete [] B[i];
delete [] B;

return 0;
}
0745デフォルトの名無しさんNGNG
>>743
>引数nをとって,n×nの2次元配列を返すメソッド
0746デフォルトの名無しさんNGNG
>>743も二次元配列ではないぞ。
0747746NGNG
>>744ね
0748デフォルトの名無しさんNGNG
>>746
742が求めているのは>>744の方じゃない?
0749デフォルトの名無しさんNGNG
>>748
確かにそうだ。
0750デフォルトの名無しさんNGNG
>>742
皆さん,おあつい議論のところ横から申し訳ないですけど,
742さんは(もし意図的に避けてるのでなければ)STLを使った方がいいですよ.たぶん....
#include <iostream>
#include <vector>
using namespace std;
typedef vector <double> Row;
typedef vector <Row> Matrix;
Matrix AA(int n) {
return Matrix (n, Row (n, 1));
}
int main()
{
Matrix B = AA (3);
cout << B[0][0] << endl;
}
0751750NGNG
>>750
ちょっと訂正.
-Matrix AA(int n) {
+Matrix AA(size_t n) {
0752744NGNG
>>750
うん、大抵はそっちの方がいいかも
0753デフォルトの名無しさんNGNG
vector<vector<int>> v;
多次元配列は↑みたいにSTLのvectorを入れ子にして使った方が楽だよ。
同様に入れ子して行けば何次元でもいける。
0754デフォルトの名無しさんNGNG
>>753
ス、スペース!
0755753NGNG
ごめん… すでに>>750が使ってたのね…
0756753NGNG
vector< vector<int> > v;
逝ってくる…
0757742NGNG
みなさんどうもありがとうございます。

ところでSTLを使うことのデメリットはありますでしょうか?
使わないより計算速度がやや遅くなるとか‥‥?
0758デフォルトの名無しさんNGNG
>>757
「計算速度が遅くなるのに気づきにくい」が正確かな。
たとえば>>750はvectorを値で返しているのでコピーが発生する。
>>750なら4要素だから大したことはないが、巨大なvectorをコピーすると、
コードは単なるreturn分なのにも関わらず実行時コストが大きくなる。
0759デフォルトの名無しさんNGNG
速度が本当に気になる場合は実測した方がいいです.
うちでは圧倒的に750が速いです.
758さんの指摘はもっともなんですが,コピーは戻り値最適化で消えることがありますし,
それ以外のファクタが律速段階になっている可能性が多いにありえます.

以下測定コード.(見にくくて申し訳ありません.)
BUNDLE_SIZE10000に注意して見て下さい.
0760デフォルトの名無しさんNGNG
#include<iostream>
#include <vector>
#include <boost/timer.hpp>
using namespace std;
double *AA743(int n) {
double *A = new double[n*n];
for(int i = 0; i < n; i++) for(int j = 0; j < n; j++) A[i * n + j] = 1;
return A;}
double** AA744( int n ) {
double** A = new double*[n];
for (int i = 0; i < n; i++) A[i] = new double[n];
for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) A[i][j]=1;
return A;}
typedef vector <double> Row; typedef vector <Row> Matrix;
Matrix AA750(size_t n) {return Matrix (n, Row (n, 1));}
const size_t MATRIX_SIZE (1000); const size_t BUNDLE_SIZE (100);
const size_t BUNDLE_SIZE10000 (BUNDLE_SIZE * 10000);
0761デフォルトの名無しさんNGNG
int main(){
cout << flush; sleep (1); boost::timer t743;
for (size_t k (0); k < BUNDLE_SIZE; ++ k) {
double *B = AA743(MATRIX_SIZE); delete B;}
cout << t743.elapsed () << endl;
cout << flush; sleep (1); boost::timer t744;
for (size_t k (0); k < BUNDLE_SIZE; ++ k) {
double** B = AA744(MATRIX_SIZE);
for (size_t i = 0; i < MATRIX_SIZE; i++) delete [] B[i];
delete [] B;}
cout << t744.elapsed () << endl;
cout << flush; sleep (1); boost::timer t750;
for (size_t k (0); k < BUNDLE_SIZE10000; ++ k)
Matrix B = AA750 (3);
cout << t750.elapsed () << endl;
return 0;}
0762デフォルトの名無しさんNGNG
割り込みの術
0763デフォルトの名無しさんNGNG
>>762
なんぬぅ!

環境
model name: Pentium III (Coppermine)
cpu MHz: 853.221
cache size: 256 KB
MemTotal: 515256 kB
g++ 3.3.4 on Linux 2.4.26
コンパイルフラグ -O3 -march=pentium3 -msse -mfpmath=sse -fforce-addr -fomit-frame-pointer
結果
5.71
7.5
3.47 <-10000倍回してるのに
0764デフォルトの名無しさんNGNG
それでは>>742はクラス内部での処理を3番目の方法で実装して、
getメソッドをポインタのポインタで返せばいいんだね
0765デフォルトの名無しさんNGNG
ヤバい!!!!
Matrix B = AA750 (3);
逝って来ます
0766759NGNG
>>765
750の測定回数を743,744と揃えるために
-for (size_t k (0); k < BUNDLE_SIZE10000; ++ k)
- Matrix B = AA750 (3);
+for (size_t k (0); k < BUNDLE_SIZE; ++ k)
+ Matrix B = AA750 (MATRIX_SIZE);
のように修正し測定し直しました.
結果
5.67
7.4
5.23
0767デフォルトの名無しさんNGNG
>>759

>>744のコードって遅いですかね?
0768759NGNG
>>767
766の結果は
1000x1000の行列を100回生成したときの実行に要した時間(秒)で,
上から743,744,750の場合なのですが,
うちの環境だと御覧の通り744は他の2つに比べ若干遅いみたいです.
(他の環境だとどんな感じなんでしょ? >>all)

ただ,システムをトータルで見たときに律速段階になってないようであれば,
気にするのはあんまり意味のないことだと思いますよ.
0769デフォルトの名無しさんNGNG
ボールの衝突シミュレーションのようなものを作っています。
しかし、ボールの当たり判定はできているのですが稀にボール同士がめり込んでしまってこまっています。

以下にソースとバイナリ置いておきます

http://homepage3.nifty.com/selten/list.cpp

http://homepage3.nifty.com/selten/num7.exe

よろしければ見てやってください。
よろしくお願いします。m(_ _)m
0770デフォルトの名無しさんNGNG
そりゃ当然かもね
だってnewの回数もdeleteの回数も一番多いんだから。
そうしないとdouble**が作れないわけでもあるが…
0771デフォルトの名無しさんNGNG
map<string, int> m;
mに("0",100)から("9",100)までのペアを挿入したいんですが、
for分でまわして、'0'+i とかを使おうとしても、stringにキャストできないから困っています。
どうしたら良いですか?
0772デフォルトの名無しさんNGNG
char buff[]="0";
buff[0]+i;
とか
0773デフォルトの名無しさんNGNG
0から9の10個くらいコピペでいいと思うんだけど
0774デフォルトの名無しさんNGNG
>>773
実際に使うときには動的だったり、1-99コくらい会ったりするので・・・
123.ToString()みたいな関数は用意されていないんですか?
0775デフォルトの名無しさんNGNG
>>774
sprintf
0776デフォルトの名無しさんNGNG
>>774
boost::lexical_cast
0777デフォルトの名無しさんNGNG
重い処理(forループをぶん回す)を行う関数を実行中に、進捗状況を表示したり、
ユーザーからの要求で処理を中断したりしたいのですがどうしたらいいでしょうか?

windowsのコールバック関数とかが検索で引っかかるのですが、環境非依存にしたいのです。
0778デフォルトの名無しさんNGNG
>環境非依存

無理
0779デフォルトの名無しさんNGNG
無理ですか。この場合、処理を行う関数だけ書き換えなくて済めばそれでいいんですが。
0780デフォルトの名無しさんNGNG
書き換えろよ
0781デフォルトの名無しさんNGNG
>777
独自のコールバック関数を定義して、
その関数ポインタを受け取るようにすれ。

コールバッククラスでもいいけど。
0782デフォルトの名無しさんNGNG
たとえば、途中で中断したい関数hogeの引数に関数ポインタを追加して、
中断チェックをする関数を渡してあげればよいちうことでしょうか

int hoge( int (*mycallback)() )
{
int id;
for (){
 //処理
 ……
 id = (*mycallback)();
 if (id==1) return 1; //ループを途中で抜ける
}
return 0; //正常終了
}

int chk_abort()
{
 if(abortボタンが押されたら)
  return 1;
 else
  return 0;
}


で、呼び出すときは
 //処理
 hoge(chk_abort);
 //処理

みたいな?
0783デフォルトの名無しさんNGNG
あ、777=779=782です
0784デフォルトの名無しさんNGNG
>782
ものすごくてきとーな説明だったのによく解ったな。そんな感じ。
0785777NGNG
781でキーワード追加できたので、検索結果を絞り込めたので。

これでint chk_abort();を処理系ごとに用意すれば、int hoge( int (*mycallback)() );
に関しては手をつける必要がなくせますね。早速試してみます。ありがとうございました。
0786デフォルトの名無しさんNGNG
#include<stdio.h>
int main(){
double pi=0;
int l,h;
char tmp[10];

printf("第何項まで? \n");
fgets(tmp,sizeof(tmp),stdin);
sscanf(tmp,"%d",&l);

for(h=1; h <= l ; h += 2){
if( h % 4 == 1){
pi=1.0/h + pi;
}
if( h % 4 == 3){
pi= - 1.0/h + pi;
}
printf("%d乗の項まで pi = %1.80lf\n",h,4*pi);
}
}

興味本意でこのようなプログラムを作ってみました。
piを求めると言うより,arctan1のテイラーの収束の遅さを知るためのものです。
これをコンパイルして実行すると,48桁までしか正しい数字が出て来なく,
以下は0が並んでしまいます。
手元の資料にdoubleの上限値が1.7E+308,精度が15桁とあるのですが,
なぜ,48桁程度までしか正しく計算できないのでしょうか?
0787786NGNG
書き忘れました。FreeBSD4.8Rでcc 2.95.4を使ってコンパイルしました。
0788デフォルトの名無しさんNGNG
クラスの勉強をしていて代入演算子の定義というものをやったのですが、
Myclass &Myclass::operator=(Myclass& original)
{
cout << "My operator" << endl;
if(this==&original)
{
return *this;
}
name = original.name;
return *this;
}
という感じで、if文で自分自身にオブジェクトの代入を行わないようにするとあるのですが
if文でtrueでもfalseでも*thisを返しているのだからobj1 = obj1 や obj1 = obj2というようなコードを書いても
どちらも呼び出したオブジェクトobj1が返ってくることにならないですか?
0789デフォルトの名無しさんNGNG
書き忘れました。
呼び出したオブジェクト自身が返ってくるということは自分自身にオブジェクトの代入を行わないようにする意味がないのではと思ったのです。
if文のところを消してobj1 = obj1としてもとくにエラーが出たりするわけでもなかったのでなぜこのようにするかがわかりません。
どうかご指導お願いいたします。
0790デフォルトの名無しさんNGNG
>786
よく判らんけど、1.0/hがpiに比べて小さすぎる値になってしまい、
(1.0/h + pi) == pi になってしまってるんじゃないの?

>788
obj1 = obj2 は
obj1.operator=(obj2) という関数に置き換わり、
その関数の返値がobj1(の参照)になるということ。って違うのか。

メンバにポインタを持っていて、newとdeleteが絡んだときに問題が発生する。
0791デフォルトの名無しさんNGNG
>>786
いやだから、精度が15桁しかないんだからそれ以上の桁に意味なんてないんだってば。
0792デフォルトの名無しさんNGNG
>>790
その場合の返り値はどこへいくのでしょうか。。
上のobj1.operator=(obj2)という文に置き換わることはわかるのですが、これはobj1.関数名(引数)という感じの関数ですよね。
と、するとその戻り値を格納する場所がないのでいったいどこへ行ってしまうんだろうと。。。
返り値を入れる変数など = 関数名(引数)という形のように 返り値を入れる変数など = obj1.operator=(obj2)という感じでないといけない気がして。。
0793デフォルトの名無しさんNGNG
>>788
自分自身への代入のときに、nameメンバをコピーしないことに意味があるんだろ。
nameメンバがポインタで、コンストラクタでnewしていれば当然の要請だね。
で、代入結果は obj1 = obj2では単純に捨てられる。
戻り値に*thisが必要な理由は、obj3 = obj1 = obj2のような場合に備えて。
0794デフォルトの名無しさんNGNG
>>786
>790、>791の指摘している通り、実際100000000までと1000000000までとでは値が変わらなくなってくる。
試してみたが、この時点で、累積誤差の所為で12桁程度の精度しかなくなってしまっている。
#真面目に誤差を計算しなくてもこんなもの。昔はこんな計算一々試せなかったなぁ。
0795デフォルトの名無しさんNGNG
>>793
ということはこのようなポインタを使用しない場合は特にif文を使用する必要はなく、
仮にobj3 = obj1 = obj2というようなイコールを続けて使うことをしない場合は*thisを返す必要はないのでしょうか?
0796786NGNG
>>790-792
御解答ありがとうございます。
doubleの精度が15桁とはいえ、48桁程度までは数字が出てきているため、
意味があるのだろうかと思っていたのですが、信用できない数字なのですね。
0797デフォルトの名無しさんNGNG
>>793
もひとつ質問で、obj1 = obj1のような同じオブジェクトを代入した場合はどのようなことが起こるのでしょうか?
予想ではif(this==&original){return *this;}でreturn *thisをするが同じように格納する場所がないから捨てられる・・・と思うのですが。。
0798デフォルトの名無しさんNGNG
>>797
マンドクセからEffectiveC++でも買ってこい。
0799デフォルトの名無しさんNGNG
結構高いのにたいした事ない
絶対熊田曜子の写真集のほうがヌケルぞ
0800デフォルトの名無しさんNGNG
>>799
別にヌキたいわけではない
0801デフォルトの名無しさんNGNG
たいしたことないのはMoreがつく奴
0802デフォルトの名無しさんNGNG
boostのuBLASで行列の乗算A*Bを行うプログラムを
VC++でコンパイル実行すると、結果はちゃんとでるんですが、
エディタ画面に戻って「prod」と入力するとエディタが
ハングアップ状態になってしまいます。
こんな現象にであった人いませんか?

環境 Windows XP Home Edition, VC++ NET 2003 Standard, boost_1_31_0
0803デフォルトの名無しさんNGNG
intが32bitの環境で
int*int=int64で結果を受け取りたいのですが、
何か良い方法無いでしょうか?
0804デフォルトの名無しさんNGNG
>>803
intじゃ無理
キャストするなどしてint64にしないと無理。
0805デフォルトの名無しさんNGNG
>>803
VCなら専用の関数があるけどな。
0806デフォルトの名無しさんNGNG
.netのVCでダイアログを作成するとなぜかCDHtmlDialogの派生で勝手に作られてしまいます。
以前はCDialogの派生だったと思いますが、これからはこっちの方が正しいのでしょうか?

あと、作るたびにCDialogの派生に変更するのが面倒なのですが、デフォルトで
CDialogの派生で作るようにすることはできないでしょうか?

.netが以前のVisualStudioに比べてあまりに変わりすぎてるのでどうもわかりません。
教えてください。
0807デフォルトの名無しさんNGNG
>>806
自己解決です。作るときにたまたまリストのトップであるCDHtmlDialogが選ばれてただけでした。
0808デフォルトの名無しさんNGNG
>>795
> ということはこのようなポインタを使用しない場合は特にif文を使用する必要はなく、
メンバにポインタが無くても,他にユーザ定義のクラス(Aとしましょう.)がメンバにあって,
Aが同じ問題を抱えていた場合に問題になります.
Aを変更できるならAを修正するだけですが,
Aが変更できない場合はAを保持してるクラスで対処する必要があります.

> 仮にobj3 = obj1 = obj2というようなイコールを続けて使うことをしない場合は*thisを返す必要はないのでしょうか?
OKです.その場合宣言では返値の型にvoidを指定しましょう.
ただ組み込み型と互換がなくなるのでお薦めしません.

それと,代入演算子の引数(コピーコンストラクタもですが)はconstを付けましょう.788の例だと
Myclass &Myclass::operator=(const Myclass& original) {...}
こんな感じ.
0809デフォルトの名無しさんNGNG
質問があります。

class Vector {
double* data; int n;
public:
Vector(int n0) {
data = new double[n0];
for (int i=0;i<n0;i++){
data[i]=0;
}
n = n0;
}
void put(int i, double d) {
data[i] = d;
}
};
class anime{
public:
static Vector tt(3); //static double m;
};
main(){
anime::tt.put(0,4); //m=10;
}
上記のように、class animeの中でVector classのインスタンスttを、staticにして、それを
別のところで操作しようとしたら、「構文エラー:定数」というエラーがでてしまいます。
double だとエラーがでないのに、上記Vectorでエラーがでる理由とエラーの意味がわかりません。
javaではこういうことはできてて良くやっていたのですが、c++だとできないのでしょうか?

0810デフォルトの名無しさんNGNG
>>809
class anime {
public:
static Vector tt;
anime() : tt(3) {}
};
それよりVectorはoperatorを使えよ。
0811デフォルトの名無しさんNGNG
>>810
それだとC2438
「静的なクラスデータを初期化するのに、コンストラクタが使われています。」
になったぞ。

class anime{
public:
static Vector *tt;
};

Vector *anime:ptt = new Vector(3);

int main()
{
anime::tt->put(0,4);
return 0;
}

俺にはこれしか思いつかない…
0812811NGNG
誤記訂正
Vector *anime:tt = new Vector(3);
0813デフォルトの名無しさんNGNG
>>809
-class anime{
-public:
-static Vector tt(3); //static double m;
-};
+class anime{
+public:
+ static Vector tt;
+};
+Vector anime::tt(3); //static double m;
0814811NGNG
それで良かったのか…。
ありがとう、勉強になりました。
0815デフォルトの名無しさんNGNG
>>808
ありがとうございます
0816デフォルトの名無しさんNGNG
Exeファイルを作成できる、コンパイラってありますか?
0817デフォルトの名無しさんNGNG
>>816
あるよ
0818デフォルトの名無しさんNGNG
デフォルトでLinux用のExeファイルを作成するコンパイラってありますか?
0819デフォルトの名無しさんNGNG
>>818
リンカならあるけど。
0820デフォルトの名無しさんNGNG
vctkで
do {
 int a = ...;
} while(a);
が通るんだけど、これっておかしくない?
0821デフォルトの名無しさんNGNG
べつに。
おかしくない書き方をこちらがやればいいだけだ。
0822デフォルトの名無しさんNGNG
そりゃーおかしいなw
0823デフォルトの名無しさんNGNG
int a = 0;
do {
int a = 1;
} while (a);
0824デフォルトの名無しさんNGNG
テキストデータをリソースに追加してそこから文字を読み込みたいのですがやりかたがわからないです
0825デフォルトの名無しさんNGNG
C/C++にはリソースなんて概念はありません
0826デフォルトの名無しさんNGNG
>>824
おとなしく.txtよみこんでろlwkじぇっあwks
0827デフォルトの名無しさんNGNG
LoadString
0828デフォルトの名無しさんNGNG
>>825
FILE*とかメモリとか、リソースじゃないんですか?
0829デフォルトの名無しさんNGNG
FILE*とかメモリにテキストデータを追加するのか?
0830デフォルトの名無しさんNGNG
ぬるぽの出番ですか?
0831デフォルトの名無しさんNGNG
いえ
0832デフォルトの名無しさんNGNG
  ___   ガッ
/___|ミ      ガッ
   .||  ヾ ミ 、      ガッ
   ∩_∧/ヾヽ
   | ,| ゚∀゚). .|  |;,      ガッ
  / ⌒二⊃=|  |∵.
 .O   ノ %`ー‐'⊂⌒ヽ  ガッ
   ) ) ) )~ ̄ ̄()__   )  ←>>830
  ヽ,lヽ) (;;;;;;;;;;;;;;;;;)(_(
0833デフォルトの名無しさんNGNG
class A{
:public
static double* a;
};
double* A::a=new double[3];
a[0]=1;

上のコードのように、静的なメンバ定数であるaという配列を初期化する際に
そのaの成分a[0]をある値に初期化したいのですが、a[0]=1の部分でエラーになります
どうしても上のクラスの中でa[0]の成分を設定したいのですが、無理でしょうか?
0834デフォルトの名無しさんNGNG
>>833
class A{
public:
static double* a;
};
double* a_init (){
double* result=new double[3];
result[0]=1;
return result;
}
double* A::a=a_init ();
0835デフォルトの名無しさんNGNG
腐れ先輩のコードを保守しなければならないのが会社だが、
class SputterProcess
{
...
public:
virtual SputterProcess operator=(const SputterProcess&);
};
ってのがある。
virtualなoperator=()ってなに?
0836デフォルトの名無しさんNGNG
まちがえた
× virtual SputterProcess operator=(const SputterProcess&);
○ virtual SputterProcess& operator=(const SputterProcess&);
0837デフォルトの名無しさんNGNG
>>836
そういう方には
「この腐ったイカめ。私の床に落ちた精液でも舐めてなさいよ」
と、いってやればいい。
0838デフォルトの名無しさんNGNG
ヤラナイカって言ってやれば??
0839デフォルトの名無しさんNGNG
>>835
ひょっとして派生側で挙動を変えてるとか
0840デフォルトの名無しさんNGNG
>>839
C++の入門書を読み直しましょう
0841デフォルトの名無しさんNGNG
The AMANOJA9さんサイコーです。
0842デフォルトの名無しさんNGNG
>>840
なんで?
0843デフォルトの名無しさんNGNG
virtuaなメンバ関数はポインタを通して呼び出されて
はじめて意味があるんだよ
0844デフォルトの名無しさんNGNG
>>843
>virtuaなメンバ関数はポインタを通して呼び出されて
>はじめて意味があるんだよ
?????????
0845デフォルトの名無しさんNGNG
#include <iostream>
using namespace std;
struct A {virtual A &operator = (const A &p) {cout << "A" << endl; return *this;}};
struct B: A {A &operator = (const A &p) {cout << "B" << endl; return *this;}};
int main () {
A *p0 (new B ());
A *p1 (new B ());
*p0 = *p1;
return 0;
}
0846デフォルトの名無しさんNGNG
//9次元座標の2点間の距離の算出

#include <stdio.h>
#include <math.h>

double kyori(double a[9],double b[9])

{

int i;
double k,k2=0;
for(i=0;i<9;i++)
{
k2+=pow(a[i]-b[i],2);
}
k=sqrt(k2);
return(k);

}


void main(void)
{
double x[]={1,2,3,4,5,6,7,8,9},y[]={9,8,7,6,5,4,3,2,1};

printf("%f\n",kyori(x,y));

}

これを一般化してN次元での2点間の距離を算出するのはどうすればいいですか
0847デフォルトの名無しさん NGNG
文字列の中の一文字を表示したいんですが、
どうしたらいいでしょうか?

char str[256];
sprintf(str,"%s","aaaaa");
TextOut(hdc,0,20,str[1],1);
0848デフォルトの名無しさんNGNG
if文などの判断で普通はif(n == 0)のような形をとっていると思うのですが、
入門書を読んでいてif(pstr)のような変数名だけしかない条件判断が出てきて、いったいどういう意味なのかわからず困っています。
どういうときにtrueやfalsになるのかよろしければ下のソースを見てやってください。


http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/lounge/file/1074774948_30/const.txt
0849デフォルトの名無しさんNGNG
>>848
if(pstr!=0)と同じ。
0850デフォルトの名無しさんNGNG
>>846
君、Cスレにいなかった?
template<std::size_t N>
double kyori(double (&a)[N],double (&b)[N])
{
 int i;
 double k,k2=0;
 for(i=0;i<N;i++)
 {
  k2+=pow(a[i]-b[i],2);
 }
 k=sqrt(k2);
 return(k);
}
0851デフォルトの名無しさんNGNG
>>850
そこまで判ってて何故C++?
0852デフォルトの名無しさんNGNG
>>850
N次元空間の場合はどうなるのでしょうか
0853デフォルトの名無しさんNGNG
>>847
TextOut(hdc,0,20,&str[1],1);これでいいはず。

>>852
もしかして一般化の答えは下記のようなのをお求めですか。
#include <stdio.h>
#include <math.h>
#define DIMENSION 9 /* N次元 */

double kyori(double a[],double b[])
{

int i;
double k,k2=0;
for(i=0;i<DIMENSION;i++)
{
k2+=pow(a[i]-b[i],2);
}
k=sqrt(k2);
return(k);

}
void main(void)
{
double x[]={1,2,3,4,5,6,7,8,9},y[]={9,8,7,6,5,4,3,2,1};
printf("%f\n",kyori(x,y));
}
0854デフォルトの名無しさんNGNG
>>849
どうもです
0855847NGNG
>>853
ありがとうございます。更に質問なんですが…
↓のように文字列を返したいんですが、
コンパイルエラーは出ないもののうまくいってないようです。
どうしたらいいでしょうか。

class foo
{
private:
char str[256];
public:
char* Getstr();
};

char* foo::GetStr()
{
strcat(str,"aaaaa");
strcat(str,"\r\n");
return str;
}

///////////////////////
foo myfoo;

main()
{
char Buf[256];
sprintf(Buf,myfoo.GetStr);
TextOut(hdc,0,20,Buf,strlen(Buf));
}
0856デフォルトの名無しさんNGNG
↑
なにがしたいのこのばか?
小学生?
0857 NGNG
なんだこのstrcatのひどい使い方わ(;´Д`)
sprintfにしてもstrcpyだろよ。
0858デフォルトの名無しさんNGNG
>>855
コンストラクタでstrの内容の初期化はしてるのか
0859847NGNG
>>857
strcatの使い方にひどいとかうまいとかあるんですか?
今後恥をかかないように良かったらどう酷いのか教えてください。
sprintfのところは
sprintf(Buf,"%s",myfoo.GetStr);
の間違いでした。
こうするのとstrcpy(Buf,myff.GetStr);
とするのでは違いがあるんでしょうか。

>>858
一応、str[256]="";
とかしてありますが、これで初期化はできてないんでしょうか…
0860デフォルトの名無しさんNGNG
GetStr()を繰り返し使うといいことが起きるな。
0861デフォルトの名無しさんNGNG
>>859
> 一応、str[256]="";
コンパイルできないだろ。テキトーなこといってんじゃねーよ。
0862デフォルトの名無しさんNGNG
str[0]='\0';としてからstrcat
0863デフォルトの名無しさんNGNG
ここで、単語を打つ事を勧める
tp://cgi.www5f.biglobe.ne.jp/~fortune7/ccnp/daken/type.cgi
0864847NGNG
>>861
szLog[0]='\0'でした。
他の部分でchar text[256]="";とか
してあったんでそれと間違えました。
ここに書き込むために構造以外を変えてあるので混乱しました、すいません。
それで、結局どうすれば。。。
0865847NGNG
一行目訂正…
str[0]='\0'でした。
0866デフォルトの名無しさんNGNG
class foo
{
char str[256];
public:
foo();
char *Getstr();
};

foo::foo()
{
strcpy(str, "aaaaaa");
strcat(str, "\r\n");
}

char *foo::Getstr()
{
return str;
}
0867デフォルトの名無しさんNGNG
strcatというのは、あらかじめ文字列があることが前提だからね。
ヌルな文字列にstrcatしても追加できないです。

だから、文字列のはじめに終端文字\0を入れるか
strcpyをして文字列そのものを移すなど
0868847NGNG
>>866
ありがとうございます。でもなんかうまくいってないです・・・
>>867
なるほどそういうことですか。ありがとうございました。

多分省略してあるほかの部分が変な風に作用してるのかもしれません。。
とりあえずこの問題は放置して他の事やることにします。
色々ありがとうございました。
0869デフォルトの名無しさんNGNG
>>868
867は(ry
0870デフォルトの名無しさんNGNG
>>868
うまくいかないのはDOSプログラムでTextOut関数を使っているから。
strcat以前の問題。
0871デフォルトの名無しさんNGNG
また一人馬鹿が沸いたようですな
0872デフォルトの名無しさんNGNG
>>868
ついでにここも参考までに
http://www.kumei.ne.jp/c_lang/sdk/sdk_05.htm
"\r\n"は使えない。
0873お願いしますNGNG
C++でのお願いなんですが、
クラスで、qsort関数を使おうとしたのですが、比較関数のところでエラーが出るんですがなぜ出るのか、
皆目検討つきません。
どう間違っているのか、教えてもらえないでしょうか?

http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1094377310&res=1

お願いします。
0874デフォルトの名無しさんNGNG
>皆目検討つきません
警告読んでこんなこと買いいるのであれば別の言語に乗り換えた方が吉
0875デフォルトの名無しさんNGNG
>>874
すみません。ですが、自分なりに検討してみたんですがわからなくて・・・。
それで、ココに来たんです。
教えてもらえないでしょうか?
0876デフォルトの名無しさんNGNG
>>875
だから警告嫁っt(ry

int compare(const void* p1, const void* p2);→static int compare(const void* p1, const void* p2);
とするか、

namespace
{
    AAA* g_aaa = NULL;
}
AAA::AAA()
{
    g_aaa = this;
}
inline int
compare_stub(const void* p1, const void* p2)
{
    return g_aaa->compare(p1, p2);
}
qsort(wpaaa, IT, sizeof *wpaaa, compare_stub);

ってしろ
0877デフォルトの名無しさんNGNG
警告じゃなくてエラーになるはずなんだが。
0878デフォルトの名無しさんNGNG
また一人馬鹿が沸いたようですな
0879デフォルトの名無しさんNGNG
すみません。エラーを書くのを忘れました。

それで、教えていただいた通りに書いてみたのですが、
二つとも、
データ整理.obj : error LNK2001: 外部シンボル ""public: void __thiscall AAA::Addresses(class AAA * *,class AAA *,int)" (?Addresses@AAA@@QAEXPAPAV1@PAV1@H@Z)" は未解決です
Debug/データ整理.exe : fatal error LNK1120: 外部参照 1 が未解決です。

っていうエラーが出たんですが・・・。
0880デフォルトの名無しさんNGNG
>>879
プログラムやめろ
0881デフォルトの名無しさんNGNG
また一人馬鹿が沸いたようですな
0882 NGNG
>>879
void Addresses(AAA** wpA, AAA* pA, int n)
{
for(int i = 0; i < n; i++)
wpA[i] = &pA[i];
}

これがクラススコープになってないっすw
0883デフォルトの名無しさんNGNG
>>879
メンバー関数は無理っしょ
0884デフォルトの名無しさんNGNG
なるほど〜 メンバー関数は無理なんですか。
なら、普通にクラスに入れずに考えればいいんですね。
0885デフォルトの名無しさんNGNG
VC++.netで、従来のVC++6.0みたいな開発はできるんですか??
0886デフォルトの名無しさんNGNG
ってか、C++ならqsort使わんでファンクタ書いてstd::sort使えよ。
0887デフォルトの名無しさんNGNG
>>886
すみません。そこまで進んでいなくて。。。
最近始めたので。
0888デフォルトの名無しさんNGNG
888げとー
0889デフォルトの名無しさんNGNG
>>887
いろいろ修正させていただきました。
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1094377310&res=2
0890デフォルトの名無しさんNGNG
元のコードが激しく見にくいんで文法正しくしても微妙すぎるな
0891887NGNG
みなさんのおかげで出来ました☆ありがとうございます。
それで、さらに質問で申し訳ないのですが、
>>876氏が教えて頂いたところで、staticを使う理由を教えてもらえないでしょうか?
できれば、初心者でもわかるように説明をお願いします。
重ね重ね、すみません。
0892デフォルトの名無しさんNGNG
>>891
ここで聞くより自分で調べたほうが早い。
あえて教えるなら・・・・。
うるさい方々が現れるから。
0893デフォルトの名無しさんNGNG
そうですか。そうですね!これぐらいは自分で調べます!
本当にありがとうございました!!
0894デフォルトの名無しさんNGNG
qsort は入れ替えの操作にメモリ同士のコピーが使われることが多いので、
クラスのインスタンスに使うのは個人的にスキじゃないです。
0895デフォルトの名無しさんNGNG
>>894
スキじゃないとか好みの問題じゃなくて、memcpyでコピーできないクラスには使っちゃダメだろ。
0896893ですNGNG
クラスのメンバ関数で、比較関数を定義する時、
staticをつけるのは、クールバック関数だから。
と、調べたら書いていたのですが、
それであっているのでしょうか?
0897デフォルトの名無しさんNGNG
>>896 まちがってます。
0898896ですNGNG
・・・そうなんですか。
すみません。ギブです。
教えてもらえませんか?
0899デフォルトの名無しさんNGNG
>クールバック関数
どんな関数か考え込んでしまった
0900898ですNGNG
コールバック関数ですね。もう一度同じサイトを見たら、そう書いてました。
読み間違いです。
で、コールバック関数だからでしょうか?
0901デフォルトの名無しさんNGNG
>>896
staticをつけないと関数を呼び出すときにthisポインタを渡す必要がある。
普通のコールバック関数だとそんなことしない(できない)。
staticをつけた静的メンバ関数はthisポインタを受け取る関数ではないのでコールバック関数として使える。
0902900ですNGNG
>>901
ありがとうございます。理解できました!
本当にありがとうございました!
0903デフォルトの名無しさんNGNG
ワラタ
0904デフォルトの名無しさんNGNG
ある共通関数にarray stringというパラメタがあったのですが、
これは具体的にはどうのようなもんでっしょうか?

stringはたぶんSTLで、arrayって????
0905デフォルトの名無しさんNGNG
文字列かどうか判断する関数とかってありますか?
javaでいう、isStringのような
0906デフォルトの名無しさんNGNG
>>905
ないと思うがな。
javaってそういう関数あるのか。便利やぁ。
じゃヴぁ勉強してみよかな?
0907デフォルトの名無しさんNGNG
>>905
bool string::isString()
{
  return true;
}
これで代用してください。
常に正しい値を返します。
0908デフォルトの名無しさんNGNG
>>907
ネタなんですか?
本気でおもしろくないんですが・・・
0909デフォルトの名無しさんNGNG
>>908
こういうものが欲しいのじゃないんですか?
0910デフォルトの名無しさんNGNG
>>908
文字のクラスを返す関数は作れても、
文字列であるかどうかを判定することはかなり難しいと思うのですが・・・
例えばCの文字列か判定する関数があったとして許せる?
0911デフォルトの名無しさんNGNG
なんのためにそんなものが必要なのかさっぱりわからん。
0912906NGNG
そうですか・・
あきらめます。ありがとうございました。
0913デフォルトの名無しさんNGNG
>>912
いや、待て。
君には説明の義務が有る。
何故必要になったんだ?
0914 NGNG
文字列がアルファベットと数字だけだったりしたら簡単にできそうだがな。

漢字だと先行バイトが漢字の範囲に入っているか、とか調べないといけない。
ShiftJISとか文字コードを限定したら簡単には作れそうな気はするな。

でも本当に文字列かどうかを判断する事はできない。
0915デフォルトの名無しさんNGNG
#include <string.h>

int isString(const char *s,size_t n)
{
return memchr(s,0,n)?1:0;
}
0916デフォルトの名無しさんNGNG
>>915
isStringじゃおかしいだろ。
0917デフォルトの名無しさんNGNG
>>916
え?
0918デフォルトの名無しさんNGNG
Contain()とかじゃないの?
0919デフォルトの名無しさんNGNG
ContainZero()
0920デフォルトの名無しさんNGNG
JavaのisStringってどんなものなんだろう?
どのクラスにあるんだ?
0921デフォルトの名無しさんNGNG
JavaにはVBのVariant型みたいなものがあると聞いた。それに使うんじゃないかなぁ。
0922デフォルトの名無しさんNGNG
>>920
J2SE1.4には無いようだから、1.5からの新機能に対応して出来たのかな?
0923デフォルトの名無しさんNGNG
>>921だった。
0924デフォルトの名無しさんNGNG
J2SE1.5にも無かった・・・orz
0925デフォルトの名無しさんNGNG
J2SE1.6以降のドキュメントの場所教えてください。
0926デフォルトの名無しさんNGNG
>925
>1010をご確認ください。
0927 NGNG
CだとisStringみたいなのはどういう場面で必要になるんだ?(;´Д`)
void*のデータでも調べるつもりなのかな?
0928デフォルトの名無しさんNGNG
Javaスレで訊いてくるか。
0929デフォルトの名無しさんNGNG
どこかのサイト教えていただくだけでもいいんですが、クロスプラットフォームで
オープンソースなクラスライブラリ(GUIツールキットじゃなくて)でメジャーな
のってありませんか? Stringとかxml周りとかjavaのクラス並に充実してるやつ。
0930デフォルトの名無しさんNGNG
Boostのような?
0931デフォルトの名無しさんNGNG
age忘れました
0932デフォルトの名無しさんNGNG
>>929
ちょうどよかった。
その質問に答えるから、JavaのisStringについて教えてもらえないっすか?
0933 NGNG
>>932
交換条件とかせこすぎw
持ってる情報は出しなされw
0934デフォルトの名無しさんNGNG
>>933
いや、それがさ、isString誰も教えてくれないんだよ。
WideStudioとかどうよ?
俺?俺は使わないよ。
だってJavaみたいだもん。
0935デフォルトの名無しさんNGNG
Cで配列の引数int[50]を受けて、
その引数の中身を例としてint{0,1,0,1,0}のように
操作するにはどうすればいいですか?

void __fastcall TCard::GetCards(int c[50])
{
d = Cards;
return;
}

だとうまくいかないみたいなんで
0936デフォルトの名無しさんNGNG
X  d = Cards;
O  c = Cards;
0937935,936NGNG
すんません、俺慌てすぎ
C++ ですね。
Cards はクラスの変数 int Cards[50] だけどこの際無視で。

935のコード関係無しで答え希望。
0938 NGNG
>>937
ようするに配列データを関数に渡して、関数の中でデータをいじりたいってことか?

int buf[255];
foo(buf, 255);

void foo(int *data, int size) {
data[1] = 0;
}

普通は配列ごと関数に渡すなんてことはしない。データコピーが発生するから重い。
0939デフォルトの名無しさんNGNG
> int{0,1,0,1,0}のように操作する

これがよくわからない。
配列のコピーならmemcpyでできるけど
0940デフォルトの名無しさんNGNG
>>938
>普通は配列ごと関数に渡すなんてことはしない。データコピーが発生するから重い。

ためになります。

>>939
わかりにくくてですみません。
memcpy で出来ました。
0941デフォルトの名無しさんNGNG
typedef struct tagProcudure
{
 char   procName[32];
 void   (*EvtProc)(LPRDATA,DWORD,DWORD);
 LPPROC lastProc;
 LPPROC nextProc;
}PROCUDURE;
typedef PROCUDURE *    LPPROC;

typedef struct tagRunData
{
 PROCUDURE sProc;
 
 BOOL  (*AddSubclass)(LPRDATA,void*,const char[32]);
 BOOL  (*DelSubclassAll)(LPRDATA,void);
 BOOL  (*DelSubclass)(LPRDATA,const char*);
}RUNDATA;
typedef RUNDATA *    LPRDATA;

以上のような定義を行いたいのですが、LPRDATA,LPPROCがシンタックスエラーとなってしまいます。
よくよく考えれば、上から順に解釈されるのだからこうなることは理解できました。
しかしその後、どう考えても解決策が分かりません。VC6で開発しております。ご教授ください。
0942 NGNG
>>941
typedef struct tagProcudure
{
 char           procName[32];
 void           (*EvtProc)(LPRDATA,DWORD,DWORD);
 struct tagProcedure lastProc;
 struct tagProcedure nextProc;
}PROCUDURE;
typedef PROCUDURE *    LPPROC

これじゃ駄目か?(´・ω・`)
スマートな書き方じゃないのは分かるが
0943 NGNG

 struct tagProcedure* lastProc;
 struct tagProcedure* nextProc;

ちと修正
0944 NGNG
 struct tagProcedure *lastProc;
 struct tagProcedure *nextProc;

さらに修正
0945デフォルトの名無しさんNGNG
あああ、なるほと、そういうやり方がありましたね。ありがとうございます。
あとはLPRDATAとLPPROCの相互参照をどうにか出来ればよいのですが・・
0946デフォルトの名無しさんNGNG
このスレで聞くべきなのかわからないけど、
変数名の頭のLPってどういう意味で付けられているんですか?
0947デフォルトの名無しさんNGNG
当方、おフランス産のソフトの拡張ライブラリ作成用のSDKで育ちました
当然コメントの意味も分からず、ただ猿真似的に名前をつけているのですが
恐らくLocal pointerの略なのではないかと思っております。
0948 デフォルトの名無しさんNGNG
>>946
Microsoftの趣味だな。Long Pointer の略。

LPCTSTRとか Long Pointer Const Tchar String とかだぜ。ヒデー
0949デフォルトの名無しさんNGNG
>>941
struct tagProcudure;
typedef struct tagProcudure PROCUDURE;
typedef PROCUDURE* LPPROC;

struct tagRunData;
typedef struct tagRunData RUNDATA;
typedef RUNDATA* LPRDATA;

struct PROCUDURE
{
  char procName[32];
  void (*EvtProc)(LPRDATA,DWORD,DWORD);
  LPPROC lastProc;
  LPPROC nextProc;
};

struct RUNDATA
{
  PROCUDURE sProc;
  BOOL (*AddSubclass)(LPRDATA,void*,const char[32]);
  BOOL (*DelSubclassAll)(LPRDATA,void*);
  BOOL (*DelSubclass)(LPRDATA,const char*);
};
0950デフォルトの名無しさんNGNG
ああ、Longなんですね。良いことを聞きました
0951デフォルトの名無しさんNGNG
>>946
thx
習って頭に型付けてるけど
プログラムの規模が小さいから
ただ長ったらしくなるだけで
俺にはあまり意味がないようです。
0952949NGNG
答えておいてから言うのもおかしいが。

LP〜というポインタのtypedefはお勧めしない。
LPをつけたせいでPROCEDUREがPROCに、
RUNDATAがRDATAに省略されるなんてデメリット大きすぎ。
意味もわからずに付けてるなら即やめておけ。

あと、構造体のタグ名とtypedef名は同じでいい。
普段使う名前をタグ名にしておけば、
struct PROCEDURE;
などと前方宣言して struct PROCEDURE* を関数引数の型、
構造体メンバの型として使えるようになる。
コンパイル時のヘッダの依存関係を軽減するのに有効。
0953デフォルトの名無しさんNGNG
>>951
どうもありがとうございます!下のタグ名のほうを直したらコンパイル通りました。
更にご指摘まで頂き感謝します、参考にし書き直します。本当にお世話になりました。
0954デフォルトの名無しさんNGNG
あほな質問で申し訳ないですが、クラスの代入演算子のオーバーロードで自分自身への代入を防ぐ理由とがわかりません。。
myclass3 = myclass2のような代入ではmyclass3のstirng* pstrがあらかじめ指していたオブジェクトを破棄して新しくオブジェクトを作成する理由はわかるのですが。。
myclass3 = myclass3という処理を可能にしたらmyclass3のインスタンスがメモリ上に2できるってことなんでしょうか。。?

http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/lounge/file/1074774948_31/des.txt
0955949NGNG
>>953
あぁ、すまんかったょ。
元コードの修正とお勧めとは分けて書き込もうと思って
手直しした後にコンパイルとおして無かったよ。
0956デフォルトの名無しさんNGNG
>>954
防がずに処理したら、delete pstr で破棄したポインタに original.pstr でアクセスすることになるだろ。
うpされてるソースだと、 pstr = new string した時点で original.pstr にも同じ値が入る。
どちらも望む処理結果にはならないだろう。
0957929NGNG
>>930
BoostってSTLの補完的な感じですよね。

求めてるのはQtからGUIを除いたような、javaの標準ライブラリくらいはそろってる
ような高級な奴なんですが・・・。やっぱそんなのないですか?
0958デフォルトの名無しさんNGNG
半角全角が混ざった文字列buffがあるとして、
↓のような感じに一文字ずつ正しく表示するにはどうすればいいでしょうか。

for(i=0;i<strlen(buff);i++){
 if(buff[i]=='\0')return;
 TextOut(hdc,i*16,0,&buff[i],???);
}
0959デフォルトの名無しさんNGNG
>>958
for(i=0; buff[i] != '\0'; i+=IsDBCSLeadByte(buff[i]) ? 2 : 1) {
 TextOut(hdc, i*16, 0, buff+i, IsDBCSLeadByte(buff[i]) ? 2 : 1);
}
0960958NGNG
>>959
できました。ありがとうございました。
0961デフォルトの名無しさんNGNG
ダイテル親子のC言語プログラミングで勉強中の物です。

カウンタ制御やってて下にある初期化フェーズのカウンタを1にする事に納得がいきません。
0だと思い、試しにやってみたら11回カウントしちゃうし・・・・何故なんでしょ?

#include<stdio.h>

main()
{
int counter, grade, total, average;

/*初期化フェーズ*/
total = 0;
counter = 1;

/*処理フェーズ*/
while (counter <= 10)
{
printf("成績を入力して下さい。:");
scanf("%d",&grade);
total = total + grade;
counter = counter + 1;
}

/*終了フェーズ*/
average=total / 10;
printf("平均は%d\n",average);
return 0; /*プログラム正常終了をお知らせ*/
0962デフォルトの名無しさんNGNG
デバッグして追いかけてみたら良く分かるでしょ?
0963デフォルトの名無しさんNGNG
counter = 0;
while (counter < 10)
0から9まで10回

counter = 1;
while (counter <= 10)
1から10まで10回
0964デフォルトの名無しさんNGNG
>962
はじめたばかりなので言ってる事がわかんないっす。
>963
ありがとうございます。知りたい事とちょっとずれてましたがヒントになってわかりました。
0965デフォルトの名無しさんNGNG
>>964
それなら頭の中で変数の値を記録しながら一行ずつ実行してみたらどうでしょうか?
0966デフォルトの名無しさんNGNG
今日こそはisStringのなぞを解き明かしたい。
協力ヨロシク、みなの衆。
0967デフォルトの名無しさんNGNG
まず質問者の意図を解き明かすのが先なんで
面倒なんだよな
0968デフォルトの名無しさんNGNG
「Java」「isString」で検索すれば意図はだいたい分かりますよ.
ただ,C++でどういうコードを書いていたのでそれが欲しくなったのかを知りたい気はする.
0969デフォルトの名無しさんNGNG
>>968
Java isString の検索結果のうち 日本語のページ 約 14 件中 1 - 12 件目 (0.06 秒)
ここから何を読み取れと??
0970968NGNG
>>969
Javaのじゃの字も知らないのでハズしてるかもしれないんだけど,
検索すると
boolean isString(java.lang.Object o)
ってのをよく目にする.これなのでは?
Objectって全てのクラスの先祖で,Javaって参照渡しなんでしょ.
間違ってたらゴメンなさい.

920,929を見るにまだ何も書いてないのかなという気はします.
stringは標準ライブラリ+boostで十分として,
あとはクロスプラットホームなxmlライブラリを紹介したらすむのでは?
0971デフォルトの名無しさんNGNG
>>970
どのページですか?
たぶんはずしてると思う。
0972デフォルトの名無しさんNGNG
C++ で Hoge *&hoge
って参照へのポインタでよろしかったでしょうか?
0973デフォルトの名無しさんNGNG
ポインタへの参照

Hoge**とほぼ等価。
0974968NGNG
>>971
このへんとか.
http://www.jajakarta.org/struts/struts1.1/documentation/ja/targetWP/api/org/apache/struts/validator/FieldChecks.html

やっぱ違いますか? (汗)
0975デフォルトの名無しさんNGNG
>>974
strutsは違うだろw
0976デフォルトの名無しさんNGNG
練習で自分で考えたジャンケンコード書いたんですが、どうもゴチャゴチャしてる様な気がします。。。
宜しければ良い見本コードを見せてもらえませんか?

int main(void){
bool flag = true;
int play = 0, comp = 0;
string te[] = { "グー", "チョキ", "パー" };
int check[3][3] = { { 2, 1, 0 }, { 0, 2, 1 }, { 1, 0, 2 } };

  srand((unsigned int)time(NULL));
  cout << "グー = 1, チョキ = 2, パー = 3" << "\n" << endl;

  while(flag){
    cout << "ジャンケン... ";
    comp = rand() % 3;
    play = getch() - 0x31;
    if(play > 2){ play = 2; }
    cout << "ポン !" << endl;
    cout << "player " << te[play] << " vs " << te[comp] << " comp" << endl;

    switch(check[play][comp]){
      case 0:
        cout << "you lose...\n" << endl;
        cout << "retry? y/n ";
        if(getch() != 'y'){ flag = false; } cout << "\n" << endl;
        break;
      case 1: cout << "you win!!\n" << endl; break;
      case 2: cout << "even\n" << endl; break;
    }
  }
  return 0;
}
0977デフォルトの名無しさんNGNG
>>976
手のクラスを作り、数値を隠蔽化する。
勝ち負けのenum値を作り、上記手のクラスの比較関数の戻り値として使用する。
それやるだけで随分とプログラムの意図は読みやすくなるんで内科医?
全部をmain()でやろうとせずに、機能を関数として分けるだけで随分違うと思う。
0978968NGNG
>>975
失礼致しました.
0979デフォルトの名無しさんNGNG
他スレから移動してきました。

C++に関する質問があります。
template <class T> class mylist
{
public:
typedef list<T> L;
typedef L::iterator I;
L list;
};

このクラス定義内のL::iteratorを、以下のようにクラス外部で使いたい場合はどうすればいいのでしょうか。
mylist<int>::Iという形ではなく、インスタンス.I iter; のように、パラメーター化された型を除外できたらなと考えています。

int main()
{
mylist<int> list;
list.I iter;//mylist::I iter;
〜
}

よろしくお願いします。
0980デフォルトの名無しさんNGNG
>>979
mylist<int>::I を main() の中で typedef すれば終いでは?
そういう話じゃないのかな
0981デフォルトの名無しさんNGNG
>>980
よくわかんないよねえ。
俺も一応答えたんだけど、一言の返事も無いまま
> mylist<int>::Iという形ではなく
とかいって却下されてるしw
0982デフォルトの名無しさんNGNG
mylist::I iter;
mylist<int> il; iter = il.begin();
mylist<double> dl; iter = dl.begin();
とかやりたいのか?
無理だ。
0983デフォルトの名無しさんNGNG
>>982
おまいじゃ無理だろうねw
0984979NGNG

>>980
ありがとうございます。
現状では、namespaceでtypedefを隔離して利用しています。
C++学習中なんで、実際には瑣末な事だろうと思うのですが
せっかく型付きで宣言したインスタンスがあるのだから、イテレーターの利用において、再度同じ宣言をするのはスマートじゃない気がして。
FAQ的な部分に感じたので、何か方法があるのではと考えています。

>>981
ttp://pc5.2ch.net/test/read.cgi/tech/1092665695/611
の方でしょうか。
却下されてるというか、返事が遅くなってしまった点については、あやまります。
昨日の時点で、以下の発言において、返事自体は行っています。
ttp://pc5.2ch.net/test/read.cgi/tech/1092665695/622
0985979NGNG
>>982
ありがとうございます。

mylist<int> il;
mylist<int>::iterator iter;
を、
mylist<int> il;
il.iterator iter;
mylist::iterator _iter;
としたいのです。
typedef mylist<int> mylistint;
mylistint::iterator iter;
とするのと同じ効果を、typedef無しでもできるのではと(r
すいません、学習中なんですorz
0986デフォルトの名無しさんNGNG
>>985
標準じゃないけどtypeof演算子が欲しいってことでしょうね.
0987976NGNG
>>977 どうにかこうにか出来ました。こんな感じでしょうか?
enum judge{ lose = 0, win = 1, even = 2, };

class cte{
protected:
  string m_type[3];
  judge m_judgelst[3][3];
  int m_play, m_comp;
public:
  void select(void){
    m_comp = rand() % 3;
    m_play = getch() - 0x31;
    if(m_play > 2){ m_play = 2; }
  }
  
  void show(void){ cout << "player " << m_type[m_play] << " vs " << m_type[m_comp] << " comp" << endl; }
  judge check(void){ return m_judgelst[m_play][m_comp]; }
  
  cte(){
    srand((unsigned int)time(NULL));
    m_type[0] = "グー"; m_type[1] = "チョキ"; m_type[2] = "パー";
    m_judgelst[1][2] = m_judgelst[2][0] = m_judgelst[0][1] = win;
    m_judgelst[0][0] = m_judgelst[1][1] = m_judgelst[2][2] = even;
    m_judgelst[2][1] = m_judgelst[0][2] = m_judgelst[1][0] = lose;
  }
  ~cte(){}
};
0988976NGNG
int main(void)
{
bool flag = true;
cte te;

  while(flag){
    cout << "ジャンケン... ";
    te.select();
    cout << "ポン !" << endl;
    te.show();
    
    switch(te.check()){
      case lose: cout << "you lose...\n" << endl; flag = false; break;
      case win: cout << "you win!!\n" << endl; break;
      case even: cout << "even\n" << endl; break;
    }
  }
  return 0;
}
0989デフォルトの名無しさんNGNG
>>983
一行目の時点で既に不可能だし、型を限定しない静的でタイプセーフなコンテナは作れない。
0990デフォルトの名無しさんNGNG
>>988=976
自分で前よりよくなったと思う?
先ずはそれが一つのポイント。
#ごちゃごちゃさ加減が減ったかどうかね。
で、次はそれで充分かどうかを検討してみましょう。

処でこの問題の場合、「手」をクラス化しました。
しかし、コンピュータの手とオペレータの手を纏めてしまったために
オペレータ同士の対戦にしたりコンピュータ同士の対戦にすることができません。
このような改修に耐えられるように手はそれぞれ独立したオブジェクトとして扱えた方が面白いでしょうね。
0991デフォルトの名無しさんNGNG
>>979
>>986 の言うとおり、 typeof ほしいって話だね。
残念ながら現状では(イテレータのインスタンスを直接定義する限り)型名を書かざるを得ない。
STL のアルゴリズムみたいなイテレータを引数に受け取る関数テンプレートに
関数の戻り値を直接渡してコンパイラに型推論してもらうときれいにできるんだけどねえ。
0992デフォルトの名無しさんNGNG
C++のリストでeraseで要素を削除したときに、そこを詰めたいんですが、どのようにしたらいいのでしょうか?
0993976NGNG
>>990
なるほど。。。
0994デフォルトの名無しさんNGNG
>>992
勝手に詰められませんか?
0995992NGNG
994>>ありがとうございます。勝手に詰められているとは知りませんでした。
erase(itr);
itr++
とかしてておかしなことになってました。
0996デフォルトの名無しさんNGNG
erase(itr++);とすればitrは消した直後を指すのではないか?
0997デフォルトの名無しさんNGNG
次スレ立ってるんだっけ?ここ
0998デフォルトの名無しさんNGNG
きゃーーーー
0999デフォルトの名無しさんNGNG
あはーーん
1000976NGNG
>>990
どうにかまた出来ました! でももうこのスレ終わりですね。。。
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。