[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 05/27 13:34 / Filesize : 231 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

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



1 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 23:26:08 ]
エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.40【環境依存OK】
pc11.2ch.net/test/read.cgi/tech/1184717430/
【アップローダー】(質問が長い時はココ使うと便利)
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm

175 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 10:50:52 ]
>>172
pubsetbuf()でバッファでかく取っとくと、一般には速くなると期待されるんだが、
gccの少なくとも古いバージョンでは、open済みのstreambufに
pubsetbuf()を実行しても、何食わぬ顔をして元のバッファを使うようだ。

mmap()したポインタをstrstreamにそのまま突っ込むのが多分一番速いが、
移植性に欠ける上にstrstreamがdeprecatedなのがネックだな。
stringstreamのstrメンバを使うとせっかくmmap()したものを
わざわざコピーしてしまうし、
stringstreamのpubsetbuf()も有効とは限らないようだ。
(少なくともVC++では平然とシカトされる)

>>173
それ記述が簡単でいいんだが、少なくとも
VC++のostream実装とかだと、大して速く無さそうなんだよな。
sgetc()/snextc()と、sputc()使って1文字ずつコピーしてるし
微妙に無駄の多いコードになってるんで、
下手すりゃ手書き1文字コピー回したしたほうがまだ速いかもしれん。

176 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 10:52:02 ]
>>174
どっちもだめ
ディレクトリのないファイルシステムもあるんで、CやC++の標準は
ディレクトリがらみを一切扱っていないはず

177 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 10:57:35 ]
>>168
C99はCであって、
互換性がないのはCとC++

178 名前:漏れが書かなくてもきっと誰かが書く mailto:sage [2007/08/10(金) 10:58:24 ]
>>176
そこでboostですよ。

179 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 11:12:01 ]
>>178
無論そんなことは知っているが、>>174は「標準ライブラリだけ」と
2度も強調しているんだし、非標準の方法があることぐらいは知ってて
聞いてるんだろ

180 名前:175 mailto:sage [2007/08/10(金) 11:23:23 ]
ごめんあほなこと書いた
> stringstreamのpubsetbuf()も有効とは限らない
そもそもpubsetbuf()を入力を食わせるのに使えるはずがないな

181 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 11:26:26 ]
>>179
>178の名前欄。

つーか、>176はなんで「扱っていないはず」なんて曖昧なままにしておくのだろう。
調べれば直ぐに答が出ることなのに。

182 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 11:28:03 ]
>>181
すまん、扱っていないことは知っている
理由のほうが推測だ

183 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 11:35:59 ]
>>182
なるほど、それは失敬。そしてその推測は妥当だろう。
実際、CP/Mやtronにはディレクトリがない。



184 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 11:42:45 ]
まぁ一方ではsignal()なんかが標準だし
わけわからんところもあるよな

185 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 11:50:07 ]
大丈夫、signal()は内容が規定されていないから存在しない環境では何もしなければいいから。

186 名前:174 mailto:sage [2007/08/10(金) 11:53:44 ]
>>176
レスありがとです。
標準ライブラリにディレクトリ絡みがまったくないのでおかしいなぁ
とは思ってたんですが、そんな理由があったとは。。
ソースを他環境に持ってたとき、すぐコンパイルできないとイヤだなと思って
できるだけ標準でやる方法を探してたんですが、
>>178さんの仰るとおり、こりゃおとなしくboost使っといたほうがいいですね。

187 名前:デフォルトの名無しさん [2007/08/10(金) 12:06:28 ]
なんだboost厨の自演か

188 名前:デフォルトの名無しさん [2007/08/10(金) 12:09:27 ]
やっぱりブーストがいちばんですね^^

189 名前:デフォルトの名無しさん [2007/08/10(金) 12:31:53 ]
char *p = "hogehoge";
の時
*(p++)
がさす値はoですか?

190 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 12:34:48 ]
いいえ

*(p++) の値は 'h' になります

191 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 12:37:41 ]
いいえ

*(p++) の値は 'g' にもなります

192 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 12:37:42 ]
はい、トムはペンです

193 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 12:38:25 ]
出力してみりゃ分かることだろうに。
2ch に書き込むより早く分かる。



194 名前:デフォルトの名無しさん [2007/08/10(金) 12:44:01 ]
*(++p) オヌヌメ

195 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 12:52:10 ]
*next(p)
^^;;

196 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 12:53:03 ]
>>189
p が指す値と
式 *(p++) の値を混同してないか?


197 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 12:53:46 ]
有り難うございます。
ちなみに
*pには何が代入されているんですか?

198 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 13:01:58 ]
*pには何も代入されていないと思いますが。

199 名前:デフォルトの名無しさん [2007/08/10(金) 13:02:37 ]
夏・・・

200 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 13:09:34 ]
最近は季節に関係なく年中馬鹿が湧く、と考えていたけど、
やっぱり長期休暇は頻度もスケールも一回り違うかな。

201 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 13:36:08 ]
出力してみりゃわかることをうだうだと質問してからに・・・

202 名前:デフォルトの名無しさん [2007/08/10(金) 15:01:04 ]
ちょっとしつもんします
ギャルゲーとかで「フラグをたてる」ていうんですが
フラグというのはビットなんですか?

203 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 15:03:07 ]
ビットなフラグはビットフラグ
ビットじゃないフラグも当然ある



204 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 15:07:07 ]
「立てる」っていう表現をするようなフラグなら、
「立てる」か「倒す」かだからビットだろうなぁという気はする。

205 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 15:10:54 ]
死亡フラグは立てるのに倒れてしまう件

206 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 15:22:38 ]
私生活では全くフラグが立たない件について

207 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 15:26:46 ]
>>204
boolは大抵intかcharで実装されている罠。

208 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 15:27:55 ]
>>206
立ち過ぎてて困るから
1ビット分けてあげるぞ

209 名前:デフォルトの名無しさん [2007/08/10(金) 19:04:06 ]
cygwinまたはlinuxの環境下でコンパイラに追加依存ファイルの検索パスを与えようとしています
仮に追加依存ファイルのパスを~/xxx/includeとすれば
.bash_profileではexport CDPATH="$CDPATH":"~/xxx/include/"のようにして環境変数を設定し
シェル上でcd includeと打てばカレントパスが意図通りに変化するところまでは設定しています

ここから、このパス下にあるtest.hppを#include <test.hpp>のように指定しているファイル
~/main.cppを
コンパイルする目的で~/下でg++ main -I includeと打ったのですが
コンパイラからはtest.hppが見付からないというエラーが返ってきます

正しくはどのように指定するべきなのでしょうか?


210 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 19:13:01 ]
CDPATH はその名前の通り cd コマンドにしか効かないんじゃない?
-I~/xxx/include
ってやれば?

211 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 19:15:55 ]
CDPATHはcdに関係するだけでコンパイラには関係ないんじゃないか?
何がしたいのか良く分からないけど、普通に-I~/xxx/include/とか書くとか

ていうか、そもそも-Iの後ろにスペースあるのはOKだっけ?

212 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 19:39:34 ]
なるほどフルパスで指定しないと駄目なんですね、あと' 'が入ってても駄目と
それら二点に気を付けて打てば通りました
助言ありがとうございました

213 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 19:45:54 ]
>>212
相対パスでもいけるけど、「ソースがある場所からの」相対パスであることに注意



214 名前:213 mailto:sage [2007/08/10(金) 19:47:00 ]
あ、-Iオプションで指定する場合はそうじゃないか?
すまん、俺自身あやふやになってきた。忘れてくれ

215 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 19:53:16 ]
-Iオプションは相対パスでもいけるハズ。
たぶんコンパイラ実行時の作業ディレクトリかなんかからの相対パスになると思うけど・・・。
いつもmakefileコピペ改変でやっちまうから、俺も記憶があやふやだ・・・

216 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 20:29:01 ]
相対パスでOK。
Makefileに-Ipathと書いておいて、ln -s どっかの/pathとかよくやる。

217 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 22:46:58 ]
クラスの実際の型に応じた処理を簡単に書く方法はありますか?

例えば、基本クラス Hoge を継承するクラス Foo と Bar があるとして、
void func(const Hoge &hoge)
{
  // hoge が Foo の時の処理
  // hoge が Bar の時の処理
}
というのを簡潔に書きたいのですが。普通にdynamic_castを使って(ダウンキャストの例外呼ばれたくないのでポインタで)
{
  if ((const Foo *p = dynamic_cast<const Foo *>(&hoge)) != NULL)
    ...;
  else if ((const Bar *p = dynamic_cast<const Bar *>(&hoge)) != NULL)
    ...;
}
とやる方法と、try...catchの変な使い方で
{
  try {
    throw hoge;
  } catch (const Foo &foo) {
    ...;
  } catch (const Bar &bar) {
    ...;
  }
}
っていうのも思いついたんですが、こんな書き方はしないですよね。実際はどういう書き方が普通でしょうか。
instanceofとかisとかC++にはないようなので。

218 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 22:50:17 ]
そのクラスに virtual 関数を作ればいいんじゃないの?
instanceof は dynamic_cast
いちおう typeid もあるけど

219 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 22:52:33 ]
>>217
funcをHogeの仮想関数にする(必要に応じて純粋仮想関数にする)。
そして、FooとBarがそれぞれオーバーライドする。

instanceofとかisとかがある言語でも、
そんな書き方よりこういう仮想関数でやる方法が普通だぞ。

220 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 23:00:22 ]
>>217
void func(const Foo& foo);
void func(const Bar& bar);
...

221 名前:デフォルトの名無しさん mailto:sage [2007/08/11(土) 00:26:58 ]
Lisp じゃないから。

222 名前:デフォルトの名無しさん mailto:sage [2007/08/11(土) 10:54:08 ]
>>217
基底クラスが派生クラスの面倒までみるべきではないよ

223 名前:デフォルトの名無しさん mailto:sage [2007/08/11(土) 13:04:07 ]
>>222
funcはHogeのメンバ関数じゃ無い、とかそんな状況な気もする



224 名前:デフォルトの名無しさん mailto:sage [2007/08/11(土) 13:54:38 ]
func から Hoge の仮想関数呼べばいいだけだよ

225 名前:デフォルトの名無しさん mailto:sage [2007/08/11(土) 16:49:10 ]
あぁ、いや。
単に基底クラスに面倒見さそうとしてるわけじゃないんじゃない?というだけの話で。

226 名前:デフォルトの名無しさん mailto:sage [2007/08/11(土) 18:31:47 ]
その、try...catchの変な使い方、だが、結局投げてるのはHoge型だから
本当のクラスでは捕まえられない。

#include <stdio.h>
struct B{virtual ~B(){}};
struct D1:B{};
struct D2:B{};

int main(){
B *b = new D1;
try{ throw *b; }
catch( D1 &){ puts("D1"); }
catch( D2 &){ puts("D2"); }
catch( B & ){ puts("B"); }
}

227 名前:デフォルトの名無しさん mailto:sage [2007/08/11(土) 20:52:01 ]
ダブルディスパッチ使えばいいじゃん。

228 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 06:43:01 ]
それなにぬねの

229 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 07:11:10 ]
#include <stdio.h>

struct B { virtual ~B(){} virtual void Throw() { throw this; } };
struct D1 : public B { virtual void Throw() { throw *this; } };
struct D2 : public B { virtual void Throw() { throw *this; } };

int main(){
B *b = new D1;
try{ b->Throw(); }
catch( D1 &){ puts("D1"); }
catch( D2 &){ puts("D2"); }
catch( B & ){ puts("B"); }
}

230 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 08:44:07 ]
#include <stdio.h>

struct B { virtual ~B(){} virtual void Func() { puts("B"); } };
struct D1 : public B { virtual void Func() { puts("D1"); } };
struct D2 : public B { virtual void Func() { puts("D2"); } };

ダントツでこれが一番いいんだけどなぁ

231 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 08:45:40 ]
そりゃそうだ。

232 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 09:30:33 ]
基本に戻るような質問

VC8Express (cl v14.00.50727.762 for 80x86)で、

void main(void){main();}

を、

cl /MD stackov.cpp

でコンパイルして実行しても、黙って落ちるだけで、_invoke_watsonされない
そういう例外って、なにかしらダイアログ出して落ちるものとばかり思っていたのに

昔からこんなでしたっけ、これってこういうもん?

233 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 10:19:39 ]
スタックオーバーフローで落ちるだけじゃないの?



234 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 11:51:22 ]
うん。まさに、スタックオーバーフローで落ち…
…たときに、アプリケーションエラーって出ないのが

デバッガから起動すれば、ちゃんと
Stack overflow - code c00000fd (first chance)
って捕捉されるんだけど…。

235 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 12:08:26 ]
コンソールアプリだからじゃないのかな。

236 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 12:10:47 ]
int ch = ' '
if (!isspace(ch) && !iscntrl(ch))
break;
という文なのですが、
何故かbreakされてしまいます。
chがスペースでないときかつchが制御文字でないとき
にbreakされるはずなのですが、条件式間違っているでしょうか?

237 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 12:14:01 ]
gcc gdbではSIGSEGVでstack over flowにならんのだけど
検出する方法は別にあるんだろうな、あるんだろうね

238 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 12:26:17 ]
>>236
動かない断片を提示されてもなんとも言えませんが。
症状を再現できる最低限のロジックを提示してみてください。

239 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 12:33:45 ]
iscntrl()はロケールに依存するとされるし、
chか、iscntrl()の挙動が直感に反しているのでは

printf("%x: %d, %d\n",ch,isspace(ch),iscntrl(ch));

をifの前に置いてみては。

240 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 12:41:07 ]
>>232
気になって試した

どうもスタックのサイズによるみたい
void main(void){
char cc[4096];
main();
}
とすればダイアログはでる。
(アセンブラ見ると、__chkstk の呼び出しが追加されてる)

ただし、VCのオプション的にはスタックサイズが4Kより小さいときでも、
/Gs0 とか付ければいけそうに思えるし、実際アセンブラリストに
__chkstk の名前でてるんだけどダイアログはでない。謎。

241 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 12:44:01 ]
>>238,239
失礼です。
IDEでソースコードを読んでるんですが、動きが気になったので
static int
skip_space(void)
{
int ch ;

for (;;){
if ((ch = getc(stdin)) < 0)
return -1; /* end-of-file */
if (!isspace(ch) && !iscntrl(ch))
break;
}
return ch;
}

chに'¥t'や' 'を代入して/*if ((ch = getc(stdin)) < 0) return -1; */
として、ステップオーバーしていったのですが、
> if (!isspace(ch) && !iscntrl(ch))
の段階で止まってしまって、ブレイクしたのかなと思って。


242 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 12:50:44 ]
誰か、エスパー頼む

243 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 13:42:25 ]
>>241
関数名から推測して

static int skip_space(void)

を呼び出す上位関数に問題があるんじゃないか?例えば

int main(void) {
int ch;
for(;;) {
if(-1 == (ch = skip_space())) break;
putc(ch,stdout);
}
return 0;
}

とか。




244 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 14:16:01 ]
ははぁ、成る程!
ちなみに (!isspace(ch) && !iscntrl(ch))
な文字コードってどんなのが当てはまりますかね?

245 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 14:38:10 ]
>>244
空白文字でも制御文字でもない文字。
まぁ、大抵の可読文字が該当する罠。

246 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 16:49:05 ]
すいませんわかりました。
自分馬鹿だorz
ほんと皆さん電波な質問して申し訳有りません
二徹して疲れたので寝ます

247 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 18:57:05 ]
eclipse with CDTが生成したmakefile用の依存リストで
src/test.d src/test.o: ../src/test.cpp \
H:/root/usr/src/boost/boost/shared_ptr.hpp \
H:/root/usr/src/boost/boost/config.hpp \




248 名前:247 mailto:sage [2007/08/13(月) 19:03:44 ]
(ミスして送信しちまったorz 続き)

の最初の行で
multiple target pattern stop
とmakeがエラーになるんですが、
これはどうすれば解決するんでしょうか?

test.dと.oのルールを同じ行で定義しているのが問題かと思ってわけてみたり
test.d(つまり自分自身)のルールを定義しているのが問題かた思ってtest.dを消してみましたが
解決しませんでした

249 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 19:48:51 ]
インクルードパスにドライブ名が入ってるとだめらしい
C: とか H: とか
代わりに /cygdrive/c/ や /cygdrive/h/ を使うと大丈夫とかいうことらしい

250 名前:247 mailto:sage [2007/08/13(月) 20:15:55 ]
>>249
そのようにしたらmakeのエラーは消えdebugができるようになりました
しかし今度は
Invalid project path: Include path not found (\cygdrive\\root\usr\src\boost)
のような警告がでてきましが、これなら実害ないので我慢します
助言ありがとうございました

251 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 06:40:57 ]
char *parse( char *buff )
{
int c;
int at = 0;
while( (c = getchar()) != EOF ) {
if( isdigit( c ) ) {
buff[at++] = c;
} else if( isspace( c ) ) {
if( at == 0 ) {
continue;
} else {
buff[at] = '¥0';
return buff;
}
}
}
int main( void )
{
char buff[256];
int i;
for(i=0;i<256;i++)
buff[i] = 0;
char *s;
while( (s = parse( buff )) != NULL ) {
printf( "read %s¥n", s );
}
}
というプログラムなのですが、
これって¥0とNULLが同じってことですよね。
buffはただのchar型の配列のはずなのになぜ¥0がNULLになるんでしょうか?
char *buff[256]ならNULLで判定出来るのは理解出来るのですが。


252 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 07:26:45 ]
NULLはヌルポインタ、\0はヌル文字
当然、ヌル終端文字列は後者を末尾に持つ

253 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 07:27:29 ]
parse内のgetcharがEOFだった時、何を返すんだ?
思いっきりバグ、もしくはコピペミスだろ。



254 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 07:27:44 ]
どこの\0とどこのNULLだ?
12行目の'\0'と24行目のNULLなら別物だし、
比較も代入もしていないが

255 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 07:37:24 ]
parseからNULL返って来ないな

256 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 07:40:16 ]
お前ら朝から優しいな

257 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 07:41:58 ]
あーそうか、parseが切れてるのか。
{}が対応してないな。

258 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 07:54:20 ]
朝から結構人がいてワロタw


259 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 08:15:31 ]
こんな感じで隠れてる

    (⌒─-⌒) EXILE!EXILE!
  〃((´・ω・`)) ミ ○
((´・ω・`))  O((´・ω・`))   
Oヽ(    )〃ノO      
   ∪⌒∪          
""" "" " """ "" " """ "" " ""

260 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 09:55:22 ]
亀ですが

>>240 ありです、それかもな感じ 何かがひらめいた予感 ちょっと調べてみます
>>235 ちなみに、WinMainでやってみても、なんもいわれんかったのです;

261 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 12:54:16 ]
>>251
コンパイルできるソースをもってきてください。

それから処理系によって'\0'とNULLは同じじゃない。

#define NULL ((void *)0)
と定義してあったら違う型。
#define NULL 0
と定義してあったら同じ型として扱える。

'\0'は、int型の整数だから後者の処理系なら比較できてしまう。
     ~~~~~
しかし、もともとNULLはヌルポインタ(どこも指していないポインタ)を意味しているので
'\0'(整数)とNULL(ポインタ)の比較をしているソースは窓から放り投げろ。

推測だが、char *parse(char *buff)
の最後の方は、こんなふうになってるんだろう。
buff[at] = '\0';
return buff;
}
}
}
return NULL;
}

それから、buff[256]はスタックオーバーしていて不定な値だ。
*buff[256]なんてどこを指しているかわかりゃしない。NULLじゃない。
このプログラムは、文字数を判定していないから、'\0'を入れて256文字以上になると
スタックオーバーで動作は不定になる。うまく動いてもそれは運がいいだけ。


262 名前:251 mailto:sage [2007/08/14(火) 13:07:51 ]
どうやってソースを窓から放り投げるんだ・・・?

263 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 13:12:15 ]
ソースを窓から放り投げるを開始するには、まず窓を開けます。



264 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 13:12:43 ]
バッファオーバーフローであってスタックオーバーフローとは(ry

265 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 13:21:55 ]
なぜこれがコンパイルエラーになるのですか?

class A
{
public:
void hoge(int i) { MessageBox(NULL, _T("A"), _T("hoge(int)"), 0);}
virtual void hoge() = 0;
};
class B : public A
{
public:
void hoge() { MessageBox(NULL, _T("B"), _T("hoge()"), 0); }
};
int _tmain(int argc, TCHAR **argv)
{
B b;
b.hoge(1); // コンパイルエラー C2660
}

266 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 13:24:09 ]
なんでそんなこともわからないのですか?

267 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 13:29:50 ]
>>266
まぁそう言わんと。

>>265
EffectiveC++を読むことをお勧めしておきます。

268 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 13:47:53 ]
>>266
初心者だからです。例えば、以下のJavaのソースはコンパイルが通るので、C++でも同様のことが可能かを考えています。
public class Test1 {
public static void main(String[] args) {
B b = new B();
b.hoge(1);
}
}
abstract class A {
public void hoge(int i) {System.out.println("A : hoge(int)");}
public abstract void hoge();
}
class B extends A {
public void hoge() {System.out.println("B : hoge()");}
}
>>267
このあたりですか?
ttp://www002.upp.so-net.ne.jp/ys_oota/effec/chapter6.htm#36kou
265のclass Aのhoge(int)はhogeImplのようにするこで解決できました。ありがとうございます。

269 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 14:09:57 ]
>>265,268
hoge という名前の関数は B に 1 個あるので、それ以上辿って A まで探しには行かない
で、見つかった hoge() は引数が一致しないのでエラー

C++ と Java が一緒だと思ってるのが間違い

270 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 14:12:39 ]
>>269
>hoge という名前の関数は B に 1 個あるので、それ以上辿って A まで探しには行かない
なるほど。すっきりしました。ありがとうございます。

271 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 16:26:39 ]
wavファイルの再生について質問があります。
PlaySoundを使う方法は簡単にできたのですが、wavファイルを実行ファイルに組み込むことはできるのでしょうか?
できるなら、方法や資料を教えて頂けませんか?
宜しくお願いします。

272 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 16:44:38 ]
とりあえずC/C++とは関係ない

273 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 16:46:19 ]
実行ファイルの種類による



274 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 16:47:42 ]
PlaySound リソース でぐぐれば?

275 名前:271 mailto:sage [2007/08/14(火) 17:15:30 ]
PlaySoundでできるとは思っていませんでした。
本当に助かりました。ありがとうございます。







[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<231KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef