【初心者歓迎】C/C++室 Ver.35【環境依存OK】at TECH
【初心者歓迎】C/C++室 Ver.35【環境依存OK】 - 暇つぶし2ch279:デフォルトの名無しさん
07/03/04 07:12:04
今後WIN32は消える?

280:デフォルトの名無しさん
07/03/04 07:26:12
>>279
100年後とかには生き残ってないだろな。

281:デフォルトの名無しさん
07/03/04 10:23:01
>>277
allocaをMSのライブラリは拒否している(昔は使っていたが)。
デフォルトで配列を使ってサイズオーバーしたら
ヒープを使うという戦略になっている
当然allocaより速い

282:デフォルトの名無しさん
07/03/04 11:16:36
どうして適当なこと言う奴が後を絶たないのか

283:デフォルトの名無しさん
07/03/04 11:31:09
いい加減な事を発言した奴には罰金を科せばいい。

284:デフォルトの名無しさん
07/03/04 15:13:11
国会でやると大もうけだな

285:デフォルトの名無しさん
07/03/05 18:32:04
レスが付かないのでこちらにきました

Visual Studio2005 C++で
SystemParametersInfo(SPI_SETDESKWALLPAPER, NULL,
"c:\\a.bmp" ,0 );
しても壁紙が変更しません
解る方、教えてください



286:デフォルトの名無しさん
07/03/05 20:14:00
人が居なくても、ちゃんと元スレには「あちらで訊いてみます」って書いたか?

287:デフォルトの名無しさん
07/03/06 00:14:35
>>285
最後の引数に
SPIF_UPDATEINIFILE|SPIF_SENDWININICHANGE
しとけ

288:デフォルトの名無しさん
07/03/06 04:34:28
環境は、C++builderです。

void __fastcall TForm1::Button1Click(TObject *Sender){
//処理
}

他の関数で、ボタンを押した動作をしたいときは、
どのようにすればよいでしょうか。

289:デフォルトの名無しさん
07/03/06 10:29:58
TButton::Click()

290:デフォルトの名無しさん
07/03/06 14:06:31
>>289
ありがとうございます。

291:デフォルトの名無しさん
07/03/06 21:30:09
>>287
レスどうもです
SystemParametersInfo(SPI_SETDESKWALLPAPER, NULL,
"c:\\a.bmp" ,SPIF_UPDATEINIFILE|SPIF_SENDWININICHANGE );
ってしたんですが、だめでした
他にあればお願いします



292:デフォルトの名無しさん
07/03/07 02:58:25
C++
WinAPIをまとめてあるフレームワークライブラリを解析していたんですが

///// hoge.h ////
class hoge{
hoge();
}
extern hoge* phoge;

///// hoge.cpp ////
hoge* phoge;
hoge::hoge(){
phoge = this;
}

上のような(簡略化してあります)記述がありました。
コンストラクタ内でthisポインタでインスタンスのアドレスを
取得していると思うのですが、このインスタンスが実際に何処にあるのかが、分かりません。

他のファイルも調べてみましたが上の場所でしか、phogeにアドレスが代入されていませんでした。
環境はVisualC++2005です。

293:デフォルトの名無しさん
07/03/07 03:04:16
hogeのインスタンスがどこにも無いならコンストラクタも走らず、
したがって、phogeは常にNULLのはず。
とおもったが、phogeの代入箇所?さがすのはhogeのインスタンス化位置でそ?

294:デフォルトの名無しさん
07/03/07 03:38:54
hogeのインスタンス化のいちも探してみましたが、見つかりませんでした。
さっき気がついたのですがウィンドウの作成時にWNDCLASSではなくCREATESTRUCTが
つかわれていました。これが何か関係あるのでしょうか?
以下のように、この構造体のhInstanceに先ほどのhogeのインスタンスがわたされていました。
cs.hInstance = *app;

295:デフォルトの名無しさん
07/03/07 07:08:45
>>292
ソースがあるならそこにブレークポインタでとめて
ステップ実行で周辺を探すって手もある。
上手く行くか知らん。

hoge派生クラスがあるとか。
んなわけないか。

296:デフォルトの名無しさん
07/03/07 07:30:28
生成された時の自分自信のポインタをいれてるだけじゃん?

297:デフォルトの名無しさん
07/03/07 07:36:58
生成されているのは事実だが
何処で生成しているか判らないから聞いている質問だと思うが?

ブレークポイントを置いてこのときはまだ生成されていないとかから
すこしずつ絞り込んで行くとか。

298:デフォルトの名無しさん
07/03/07 07:41:43
extern 宣言してあるんだからコンパイル開始時に生成されると思うんだけど

299:デフォルトの名無しさん
07/03/07 07:43:12
あ、コンパイル開始というかプログラム開始時に

300:デフォルトの名無しさん
07/03/07 08:58:45
「class hoge を継承したクラスのインスタンスを1個は作れ。 作るタイミングはおまえさん次第」
で、どこかで作られたであろう インスタンス をポインタで保持して、
いつでも呼び出せるようにしている と。

# MFC の CWinApp じゃね?

301:デフォルトの名無しさん
07/03/07 09:00:01
グローバルで作ったのなら スタートアップルーチン内 でインスタンス化してる

302:デフォルトの名無しさん
07/03/07 09:30:18
DLLを作成したいのですが、
フリーソフトによる開発環境では不可能なのでしょうか?
Visual C++では出来なかった物で…。

303:デフォルトの名無しさん
07/03/07 09:45:38
できるよ
VCのスレ…いや、画像付きの解説ページがあったはずだから、ぐぐった方が良いな

304:デフォルトの名無しさん
07/03/07 09:50:37
>>303
ExpressバージョンではMFS、ATLが含まれていないので作成出来ないと思っていました。
有難うございます、もう少しぐぐってみます。

305:デフォルトの名無しさん
07/03/07 10:43:30
MFCもATLもなくたってDLLは作れる。
プロジェクト作るときにどこかでDLLを選ぶだけ。

306:デフォルトの名無しさん
07/03/07 11:29:49
>>291
つ GetLastError()

307:デフォルトの名無しさん
07/03/07 16:27:32
質問です。
クラスの「constメンバ関数」は、メンバー変数の書き換えを禁止しますよね。
これによって「その関数は何度呼び出しても問題ないはずだな」
と思って分担作業をしていました。

ところがconstメンバ関数の中から、グローバル空間の変数を書き換えている奴がいたのです。
いままで知らなかったのですが、constメンバ関数はグローバル空間の変数などを書き換えてもコンパイルエラーにならないのですね。

この行為を禁じるための、C++文法的な書き方はありませんでしょうか。
「グローバル変数使うの禁止!」といっても使う奴が稀にでてきてコマっています。

308:デフォルトの名無しさん
07/03/07 16:31:38
ありません。

309:デフォルトの名無しさん
07/03/07 16:43:50
質問です。

ヘッダーファイルで
private:
     int (*ptr)[10];
     int x[10][10];
と宣言しています。ちゃんと機能しています。
それでデコンストラクターでメモリの解放をしたいんですけど
     delete [][] x;
ではコンパイルが通りません。
     delete [] x;
では
     Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
と出てRun-Time Errorになってしまいました。
どうやって解放するんでしょうか?教えてください。

環境はVC++2005 Express Editionです。

310:デフォルトの名無しさん
07/03/07 16:49:12
>>309
newしてないんだからdeleteする必要はない。

311:309
07/03/07 16:53:34
>>310
あア、ナルほど!
newとdeleteはセットなんですね。
ご親切にどうもありがとうございました!

312:デフォルトの名無しさん
07/03/07 17:02:02
あと、デコンストラクタじゃなくて、デストラクタな。
俺も昔勘違いしてた。

313:デフォルトの名無しさん
07/03/07 17:40:36
if(aaa>=1 && aaa<=10)

のように

if(aaa>='1' && aaa<='10')

これも文字だけでできますか?わざわざ数字に変換しなくてもいいですか?

314:デフォルトの名無しさん
07/03/07 17:43:27
わざわざ数字に変換しないとだめです

315:デフォルトの名無しさん
07/03/07 17:43:51
'10'

316:デフォルトの名無しさん
07/03/07 17:45:25
'10'は規格上は通るけど、恐らくあなたの期待した値にはならないでしょう。

317:デフォルトの名無しさん
07/03/07 17:47:25
'9'までしか無理ということですか?

318:デフォルトの名無しさん
07/03/07 17:49:53
文字定数でぐぐれ

319:デフォルトの名無しさん
07/03/07 17:54:32
そもそもaaaの型は何だよ。何が入っているんだ

320:デフォルトの名無しさん
07/03/07 18:00:41
リテラルにあった型です

321:デフォルトの名無しさん
07/03/07 18:30:53
年月日時分秒を取得するlocaltimeという関数は見つかったのですが
その取得した時間に10時間プラスしたときに
24時間を越えると日付によって年月日は変動すると思います

時間をたしたいのですが
こういう処理のためになにか用意されていないでしょうか?
環境はVC++2002です

322:デフォルトの名無しさん
07/03/07 18:33:17
閏秒は無視して、localtimeに渡す前のtime_tに対して10*3600足せばよくね?

323:デフォルトの名無しさん
07/03/07 18:34:19
time_t
struct tm

324:デフォルトの名無しさん
07/03/07 18:34:25
>>321
time_t型にした上で、10時間(10 * 60 * 60[sec])を足し、localtime()でばらすかstrftime()で文字列にすれば宜しい。
既にlocaltime()でばらしてあるなら、tm_hourに10を足してからmktime()でtime_tにしてもいい。

325:デフォルトの名無しさん
07/03/07 18:39:11
初心者本でこの辺りをまともに解説しているのってあるのかな。
ちなみに、localtime(), gmtime(), asctime(), ctime()はスレッドセーフではないので
マルチスレッドプログラミングのときはご用心。

326:321
07/03/07 18:45:56
マルチスレッドプログラミングですがlocaltimeを使うのはまずいでしょうか?

327:デフォルトの名無しさん
07/03/07 18:49:18
処理系のマニュアルを参照セヨ

328:デフォルトの名無しさん
07/03/07 18:49:49
簡単なプログラムの途中に見栄えを良くするために
横線を引きたいのですが、何かいい方法はありますでしょうか?

329:321
07/03/07 18:50:51
1スレッドでしか試してませんが
time_tに対して10*3600してできました
ありがとうございます

330:デフォルトの名無しさん
07/03/07 19:00:18
localtime()などは内部の静的な領域を使い回しするから、
それを呼び出すスレッドが複数ある場合は衝突が発生する可能性がある。
まぁ、呼び出すスレッドが一つだけなら問題ないけどね。

簡単に図式化するとこうなる。
・単一スレッドからの呼び出し
スレッドA ─localtime()呼び出し─内部領域変更─localtime()から復帰─内部領域から結果を回収─

・複数スレッドからの呼び出し
スレッドA ─localtime()呼び出し─内部領域変更─localtime()から復帰─内部領域から結果を回収─
スレッドB ──localtime()呼び出し─内部領域変更─localtime()から復帰─内部領域から結果を回収─
                            ↑                      ↑
                            ここで壊れる。 もし壊れなくても、ここでスレッドBからの呼び出しの結果を読む羽目になる。

331:デフォルトの名無しさん
07/03/07 19:08:53
localtime()を使うスレッドクラスをひとつ用意すればいいということですね
すごく参考になりました

332:デフォルトの名無しさん
07/03/07 19:43:27
>>320
ふざけたこと抜かすんじゃねー

333:デフォルトの名無しさん
07/03/07 19:44:01
VCのCRTはTLS使ってるから問題ないけどね。

334:デフォルトの名無しさん
07/03/07 19:48:49
>>317
数値と文字を一緒にするな。
他の言語だと自動で文字を数値に変換したりするけど
C/C++などは'9'をそのままASCII文字コードだよ。

URLリンク(e-words.jp)

つまり
'9'を数値で言うと57
'$'を数値で言うと36
だ。

'10'はコンパイラによって違うと思う。

335:デフォルトの名無しさん
07/03/07 21:39:31
メイン関数内でnewしている継承される可能性のあるクラスを
継承された場合、継承後のインスタンスでnewしたいのですが、エレガントな方法が
思いつきません、ご教授お願いします。

336:デフォルトの名無しさん
07/03/07 21:49:53
>>335
複数のクラスがそのクラスを継承してる場合はどうするべき?


337:デフォルトの名無しさん
07/03/07 21:52:44
>>335
もうすでにnewしちゃったんじゃしようがないんじゃない。


338:デフォルトの名無しさん
07/03/07 21:54:41
newの代わりにFactoryを用意して(関数ポインタでも可)それ経由で生成するのがC++的には一番楽かな。

339:デフォルトの名無しさん
07/03/07 22:13:46
>>336
継承後も含めてそのクラスのインスタンスが一つしか存在しないようにします。
>>338
Factoryでインスタンスを取得し、
FactoryをVirtualtou(等)にして継承した場合書き換えるという風にですか?

340:デフォルトの名無しさん
07/03/07 22:36:25
継承するクラスをC++より上位のレイヤーで1つだけに制限できるというなら、
グローバルな関数 Base *new_derivered_class(); を実装すればよくね?

それとも、継承先のクラスが存在しない場合Baseをnewする必要があるわけ?

341:デフォルトの名無しさん
07/03/07 23:07:38
ホームページから任意のデータの取得を行いたいんだが
さっぱりその方法が解りません。
その手のことが書かれたサイトを教えていただけませんか?

342:デフォルトの名無しさん
07/03/07 23:10:18
rubyなどのスクリプトを使う

343:デフォルトの名無しさん
07/03/07 23:14:21
>>342
やはりそうですか。
Cでやりたかったのですが、素直に真珠でやります。
ありがとうございました。

344:デフォルトの名無しさん
07/03/07 23:15:59
真珠…

345:デフォルトの名無しさん
07/03/07 23:20:04
>>340
継承してメンバー関数を上書きして処理を記述するようにしたいので、
何か処理をする場合には、必ず継承しなければならないです。
継承しない場合は、現実的にはないと思うのですが・・・

346:デフォルトの名無しさん
07/03/07 23:23:48
>>343
「猫でも分かるネットワークプログラミング」にhtmlを読み込んで表示する方法が書いてあったと思う
今手元にないので分からんが、WinSockをつかってたとおも

347:デフォルトの名無しさん
07/03/07 23:29:17
WinsockでHTTPしゃべるのは結構面倒くさいヨ。

348:デフォルトの名無しさん
07/03/07 23:38:18
どうもです。
分野はネットワーク関係なんですね。
それが解っただけでも十分です。
ありがとうございました。

349:デフォルトの名無しさん
07/03/07 23:51:03
>>343
WindowsならURLDownloadToCacheFile()が一番お手軽

350:デフォルトの名無しさん
07/03/08 01:16:50
>>343
真珠ってPearlって書くのしってんのか?
いやPerlもPearlから来てるんだがな

351:デフォルトの名無しさん
07/03/08 11:07:27
C++builder使っております。
unsigned char*とchar*のキャストは、(*型)だけでキャストできるのでしょうか?
出来ないキャストの場合は、エラーや警告などでますか?
以下のようにしてプログラミングしましたが、希望通りの出力でした。
ネットで危険なキャストがどうの、って良く見かけるんですが
よくわかりません。
”桁が大きくなると、小さい型にキャストするときは気をつける。”
これだけ注意すれば大丈夫でしょうか?

unsigned char* un_str="hoge";
char* str;
unsigned char* from_char_to_unsigned_char_str; //char*->unsigned char *の格納する変数

printf("un_str=%s\n",un_str); //unsigned char*は、char*みたいに出力できるか

str=(char*)un_str;
printf("str=%s\n",str);//(char*)だけで、キャストできるのか

from_char_to_unsigned_char_str=(unsigned char *)str;
printf("from_char_to_unsigned_char_str=%s\n",from_char_to_unsigned_char_str);//(unsigned char*)だけで、キャストできるのか

------出力-------------------------------
un_str=hoge
str=hoge
from_char_to_unsigned_char_str=hoge

352:デフォルトの名無しさん
07/03/08 14:03:04
C言語を仮定するけど、ポインタは全部同じサイズだから相互にキャストできるよ。

> printf("un_str=%s\n",un_str);
%s は const char* 型の引数を期待するから、
*((const char*)un_str)という変換が行われることになる。
un_strが指してるのは"hoge"、つまり const char[] だから、問題なく変換できる。
他も同じ。

353:デフォルトの名無しさん
07/03/08 14:26:55
> C言語を仮定するけど、ポインタは全部同じサイズだから相互にキャストできるよ。
現実には大抵そうなっているけど、規格上はそんな規定なんてないはず。

354:デフォルトの名無しさん
07/03/08 14:28:46
そうだっけ?
んじゃvoid*の扱いはどうなるんだ?

355:デフォルトの名無しさん
07/03/08 14:29:45
同じでない場合は、void*が一番でかいポインタのサイズ
そして使うときはキャストされるので問題なし

356:デフォルトの名無しさん
07/03/08 14:32:17
昔懐かしい、farポインタ、nearポインタ、とか?

357:デフォルトの名無しさん
07/03/08 14:40:29
残念ながら void* も void(*)() を保持できる保証はない。

358:デフォルトの名無しさん
07/03/08 14:42:58
375<< インラインアセンブリならできるかも・・・

359:デフォルトの名無しさん
07/03/08 14:45:19
>>356
普通に char* と int* のサイズが違うようなアーキテクチャも存在した。

360:デフォルトの名無しさん
07/03/08 17:23:43
>>352-359
> C言語を仮定するけど、ポインタは全部同じサイズだから相互にキャストできるよ。
いろいろと実験しながら、少しずつわかってきました。
丁寧に説明ありがとうございました。


361:デフォルトの名無しさん
07/03/09 20:15:24
WinSDKで、
モーダルダイアログボックスを使っているとき、
プロシージャに最後に呼ばれるメッセージは何ですか?
WM_CLOSEメッセージでDestroyWindow(hDlg)して、
WM_DESTROYメッセージが呼ばれた後に、WM_COMMANDがくるのですが…


362:デフォルトの名無しさん
07/03/09 20:55:26
WM_DESTROYでウィンドウが消えた後は
たとえそのウィンドウ宛にメッセージが来ても
それは存在しないウィンドウハンドル宛だし
処理するところがないので無視することになるだけだと思うけど。

何か特殊なケース?

363:デフォルトの名無しさん
07/03/09 21:06:17
>>362
WM_COMMANDがくること自体は問題ないのですが、
エディットコントロールにWM_COMMANDがきたときに使うメモリを解放するのに、
WM_DESTROYの後にエディットコントロールに対してWM_COMMANDがきてしまうと、
わざわざWM_DESTROY呼ばれる前後で、場合分けするのが無駄だと思えるので…

364:デフォルトの名無しさん
07/03/09 21:31:38
VC++6 で CString 使ってるんだけど、
CString な変数に ANSI コードページでもユニコードでもない文字列つっこんで処理したいんですわ。
具体的には、GetLenth とか Replace したい(ANSI コードページでもまともに処理してなさそうだけど)
楽に処理するにはどうしたらいいでしょう?CString 捨てな方法でもいいです。

365:デフォルトの名無しさん
07/03/09 21:56:12
vector<BYTE>でよくね?

366:364
07/03/09 22:07:24
>>365
俺に言ってる?
CString はたとえばコードページ 932 の場合、
Replace で 1 バイト文字を置換対象にするときに、2 バイト文字の下位バイトが置換対象とバイト的には等しくても、置換しないようにするよね?
そういうのをすべてのコードページでやりたいの。
ではよろしくお願いします。

367:デフォルトの名無しさん
07/03/09 22:08:23
>>364
っ nkf

368:364
07/03/09 22:33:56
>>367
nkf のライブラリにコードページを指定出来るようなメソッドを追加したクラスが実装されているということでしょうか?
単なる変換ができるというだけなら却下ですな。
(nkf 使わなくても文字コードの変換はできるし、変換することによってコードをマッピングできなくなる場合とか考えたくない。
ユニコード系のコードに変換すればマップだけはできるんだろうけど。
それといちいち文字コード変換するとよさげなソースコードにならなさそうなんだ。
そもそも nkf って日本語しか対応してないだろ?
個人的には今回の場合 UTF-8,CP51932,CP932 を使えれば問題ないと思ってるんだけど、他の奴が許さないんだぁ。)
注文多すぎてむかつくかもしれないけど、どうかどうかよろしくお願いします。
ぶっちゃけ CString::SetCodepage() とかいうメソッドが実装されていて、あとはよきにはからってくれる実装がほしい。

369:デフォルトの名無しさん
07/03/09 22:44:11
>>368
一々文字コード変換をしたほうがデバッグが楽だと思う

UTF-8 -> Unicode 変換

Unicode で何か処理

Unicode -> UTF-8 変換

よさげなソースコードにならなさそうって言われればそれまでだけど…

370:デフォルトの名無しさん
07/03/09 22:50:22
CStringに自分が今どのコードページのデータを持っているとか
それにあわせてReplaceの動作が変わるなんて出来ないんじゃないのって思うから
vector<BYTE>でよくね?

371:デフォルトの名無しさん
07/03/09 22:53:13
>>364
つ MLang

372:364
07/03/09 23:14:46
>>369
やりたいことの一つに、「ANSI CP 以外の文字列読み込み->文字置換->そのまま書き込み」ってのがあるんだけど、
ユニコードにいちいち変換してたら絶対にスマートでないよね。
あと、調べたところまずなさそうなんだけど、変換->逆変換で違うコードにマッピングされると困る。
>>370
コードページ指定して UNICODE には変換できるんだから、出来ないはずはないとおもうんだけどなぁ。
クラスに変数 1 つだけ入れておけば使用側がセットして良きにはからうことはできるはず。デフォルトは CP_ACP で。
なんで実装されてないのか理解できないほどだ。
vc8 だと reentrant locale が一部実装されていて、1文字送りは簡単にできそうになってるなぁ。VC6 でつくらないといけないんだけど。。。
>>371
ちょっと調べてみます。ざっとみた感じでは変換しかしてくれなさそうだけど。
あと、これつかわないと CP51932 つかえなさそうですね。
MultibyteToWidechar とかに 51932 とかつっこめば変換だけは出来るとおもってたけど。

373:デフォルトの名無しさん
07/03/09 23:17:13
鬼車がCSIじゃなかったっけ。Cだけど。

374:デフォルトの名無しさん
07/03/09 23:30:14
>>372
> ユニコードにいちいち変換してたら絶対にスマートでないよね。
コードページごとに処理を特殊化させるほうがよほどスマートじゃないと思うがね。

375:デフォルトの名無しさん
07/03/09 23:36:58
というか、そういう、1つの言語に対応するエンコーディングが氾濫していて
UNICODEの変換・復元がもったいない、なんていうことを言うのは
日本人だけなのではないか?(w

376:デフォルトの名無しさん
07/03/09 23:38:03
ソケットについて質問です。

クライアントからホストを

char* szHost = "www.google.co.jp"
gethostbyname( szHost );

の様に指定してHTMLをサーバから取得できる事は判ったのですが、例えば、

取得したいHTMLが、

www.google.co.jp/search?hl=ja&q=c言語&btnG=Google+検索&lr=

の様にクエリも含む場合はどうすれば良いのでしょうか。
よろしくお願いします。(板違いなら誘導お願いします。)

377:デフォルトの名無しさん
07/03/09 23:40:20
URLエンコードしてそのままGETにぶち込めばいいだろ?
CESも場合によっては変換する必要があるけど。

378:デフォルトの名無しさん
07/03/09 23:47:15
返信ありがとうございます。
暮れ暮れ君で申し訳ないですが、URLのエンコードってどうやるんでしょうか。

379:364
07/03/09 23:52:19
>>373
単純な置換にはかなり大げさなライブラリですな。いざとなったらこれで Replace をオーバーライドするか。
どうもありがとうございます。
もっと単純にできる方法も引き続き募集いたします。
>>374
個人的にはコードページが違うんだから、特殊になるのは当然だとおもうけど。
ユニコードが*本当に万能*なら汎用的に処理できるんでしょうけど。ま、CSI 論争はやめておきましょうか。
>>375
ま、大きな声でいってるのは日本人だけでしょうな。
でも、XFree86 で utf8 関数が投入されたときは一部の外国人もぶーたれてたな。
CSI かどうかはおいといて、reentrant locale がほしい人は外国でも結構いるみたい。

380:デフォルトの名無しさん
07/03/09 23:55:41
なんかこの人気持ち悪い…

381:デフォルトの名無しさん
07/03/09 23:58:26
>>380
おまえもな

382:デフォルトの名無しさん
07/03/09 23:59:17
俺も俺も

383:デフォルトの名無しさん
07/03/09 23:59:45
std::basic_string<char, euc_jp_traits<char> >みたいな?
traitsを自作するとかさ。

384:デフォルトの名無しさん
07/03/10 00:05:36
>378
「URLのエンコード」程度なら、検索するべきですわん。
簡単に見つかるから。正確な事もわかるし。

ラフに解説すると、URLとして使ってよい文字ってのは
あらかじめ決まってるから(←ってのは知ってたと思うけど)
使えない文字は %xx みたいな形式に置き換える事。

385:デフォルトの名無しさん
07/03/10 00:42:35
>>379
変換コストがもったいないと思っているのなら
大抵のCSI対応クラスは内部で統一コードに変換してるから意味ないぞ

386:デフォルトの名無しさん
07/03/10 00:46:18
>>385
CSIの意味わかってる???

387:デフォルトの名無しさん
07/03/10 01:13:10
キーが倒されている場合は歩くのモーションを、倒されていない場合はウェイトのモーションを再生したいのですが、

whileの中で、

if(キーが倒されている)
アニメーションAを再生
アニメーションBを停止

else if(キーが倒されている)
アニメーションAを停止
アニメーションBを再生

と書くと、()内が真or偽が判定されるたびに、アニメーションが最初から再生されて、0フレーム目しか再生されません。
最初に書いたようなことをするには、どういう風にプログラムを書けば良いでしょうか?
できればヒントでよろしくお願いします。

388:デフォルトの名無しさん
07/03/10 01:19:58
再生時に開始フレーム指定してそっからはじめればいいだけじゃん

389:デフォルトの名無しさん
07/03/10 01:35:22
どっちみちキーが倒されている気がするのは気の所為か?
キーも大変だな、一々倒されて。

390:デフォルトの名無しさん
07/03/10 01:36:17
>>380
ヘンなとこで敬語使ってるからじゃね。

391:デフォルトの名無しさん
07/03/10 02:00:27
整数の加算結果がオーバーフローしたかどうかを調べるにはどうすればいいですか?

392:デフォルトの名無しさん
07/03/10 02:03:47
加算前より減ってたらオーバーフロー

393:デフォルトの名無しさん
07/03/10 02:30:54
>>391
鼻から悪魔がでたらオーバーフローしていると判断してよろしい。
処理系によっては、オーバーフローした場合を判断する方法があるかもしれない。

394:デフォルトの名無しさん
07/03/10 10:26:51
 すいません、初歩的な質問なんですが、どなたかご意見いただければうれしく思います。
 クラスBの中でクラスAのオブジェクトの配列を管理したい。
 でもクラスAは、A2やA3などにも派生させてて、それも配列に入れたい、って場合。

class A {
...
};
class A2 : public A{
...
}
class A3 : public A{
...
}
class B {
vector<A> a1_vector;
}

 ってしたいんだが、これだとa1_vectorにはA2,A3が入らないですよね?
 ってなると・・

class B {
vector<A*> a1_vector;
}

 で、new A, new A2とかでオブジェクト作って、そのポインタをa1_vectorにpushすることになると思うんですが、これだとクラスBのインスタンスが破棄されたときに、a1_vectorで管理されている各オブジェクトって廃棄されないですよね?
 で、google先生とかに聞くと、share_ptr使う人がいるみたいなんですが、それで問題ないですかね?
 なんか注意点とかありますか?もしくは他にいい方法ありますでしょうか?


395:デフォルトの名無しさん
07/03/10 11:11:03
問題ないよ、A のデストラクタを仮想関数にするの忘れないようにね


396:デフォルトの名無しさん
07/03/10 11:19:43
設計を見直せ。

397:デフォルトの名無しさん
07/03/10 11:28:53
>>394
boost::shared_ptrでおk
std:auto_ptrはコピーが破壊的でコンテナにいれらんないから駄目

敢えて他の方法を挙げるとすれば、Boehm GCを使うとか?

398:デフォルトの名無しさん
07/03/10 11:34:10
GC使うと、メモリ解放はいいけど、デストラクタ呼びだしタイミングが
予測不能にならない?

399:デフォルトの名無しさん
07/03/10 11:35:30
>>394ではないが。
>>396
参考までに聞きたいが、どう設計を見直すんだ?

C++でポリモーフィズムを実現したいなら、参照を経由するしかないし
派生クラスを基底型の配列やvectorに突っ込もうとすると
スライシングが発生するから、>>394の言っていることはごく当然の話では?

C++でポリモーフィズムを使うなと言ってる?

400:デフォルトの名無しさん
07/03/10 11:39:21
>>398
勿論その辺は他のGC言語となんも変わらない。

401:デフォルトの名無しさん
07/03/10 12:31:45
Boost使うならポインタに特化したboost::ptr_vectorなんてものもある。

402:デフォルトの名無しさん
07/03/10 13:11:10
>>399
>396ではないが、「他にいい方法」を模索するなら実装方法を検討する前に設計を見直せということでしょ。
>394ではないから、そのクラス構成が最適解なのかは判らないのだから。

403:デフォルトの名無しさん
07/03/10 14:19:41
>>402
それは深読みじゃねえの?
>>394はC++でポリモーフィズムをやりたいときのスマートな方法を問うている
だけに見えるけど。

404:デフォルトの名無しさん
07/03/10 14:36:21
>>402
最適解なのか「判らない」んなら、少なくとも「設計見直せ」は言いすぎだろうな。
「その設計では駄目だ」と断定してるのと同じだ。

405:デフォルトの名無しさん
07/03/10 15:08:24
394です。
みなさん、いろいろありがとうございます。
おおむねsharedでよさげな感じですね。

ただ、396さんの「設計みなおせ」も気にはなるところです。
やっぱり、こういう書き方になる設計って良くないんですかね?
他の人のソース見ても、こういう書き方してるの、あまり見たことないし。


406:デフォルトの名無しさん
07/03/10 15:28:51
他所に見せるソースはサンプルが多いから
サンプルにboost使う状況を避けた設計してるとかじゃないかなぁ(適当

sharedなら割と直感的になるので悪くないと思うし、
EffectiveSTLの7項にもマンドクセってなったらsharedを検討してみては? ってある

407:デフォルトの名無しさん
07/03/10 16:26:35
boostのsharedは物凄く遅いらしいから場合によっては別案を考えた方がいいと思う

408:デフォルトの名無しさん
07/03/10 16:50:44
「物凄く遅い」と言うには、どの程度遅いのかデータが欲しいところだね。

409:デフォルトの名無しさん
07/03/10 16:53:03
URLリンク(www.boost.org)

410:デフォルトの名無しさん
07/03/10 17:01:33
価値観によるところは大きいだろうけど、これが「物凄く遅い」なら
iostreamやソートは「筆舌に尽くしがたいくらい遅い」んだろうね。

411:デフォルトの名無しさん
07/03/10 17:45:37
>>392, 393
鼻から悪魔ですか・・・
まあ、Intel系ならちゃんとオーバーフローしてくれますよね^^

どうもありがとうございました。

412:デフォルトの名無しさん
07/03/10 22:49:42
C++で、Cのstrtok()のような関数はありませんか。

別にstrtok()でも目的は果たせるんですが、
元の文字列を破壊したり、同時に2ヶ所以上で呼びづらかったりと
あまり美しいとは言えないような気がして。


413:デフォルトの名無しさん
07/03/10 22:59:03
無いと思う
けどそれくらい自分で作ればいいんじゃ?
std::stringとか、目的の機能を実装するのに使えそうなモノはあるし

414:デフォルトの名無しさん
07/03/10 23:01:17
>>412
istringstreamからデリミタを指定してgetline()


415:デフォルトの名無しさん
07/03/10 23:11:45
istream_iteratorでfor_eachがC++流

416:デフォルトの名無しさん
07/03/10 23:14:21
高機能さを求めるならboost::tokenizerだと思う。

417:デフォルトの名無しさん
07/03/10 23:17:43
>>415
ただのistream_iteratorだとtokenじゃなくてcharが返らんか?

418:417
07/03/10 23:24:39
ごめん。超アホなこと書いた。
でも、これってデリミタ指定できるか?

419:412
07/03/11 00:10:10
レス感謝。
いただいたヒントを元に、更に調べてみようと思います。

それにしても、strtok()ってクセ強いですよねぇ……。



420:デフォルトの名無しさん
07/03/11 00:23:25
>>412
ちゃんとしたベンダーならマルチスレッドな環境で同時に使っても
問題が起きないことを保証してくれてるもんだぞ>strtok()
まぁ、同じスレッドから複数の処理をやっちゃうと確実にアウトだけど。

421:デフォルトの名無しさん
07/03/11 00:30:41
boost::tokenizerでは、デリミタを残す/捨てる、空トークンを残す/捨てる
を選べるのが良いな。

strtok()には色々問題があるが、デリミタも空トークンも捨てる仕様なので、
これでは困ることもある。
シェルのような感じで空白文字を区切りに使うときはこれでよいのだが。

環境によってはBSD由来のstrsep()という関数が使える場合もある。
こっちは予めリエントラントで、デリミタを捨てて空トークンを残す仕様だ。
ただし、コピーを避けるために元のバッファに破壊的に動作するのは同じ。

Cなら単にsscanf()を使うのも悪くない選択肢。

422:デフォルトの名無しさん
07/03/11 00:32:24
>>420
MSVC++の場合はhidden dataをTLSに隠す仕様だから問題ない。
が、リエントラント版strtok()はstrtok_r()のような別名で提供している
実装も多いよ。
こういうことがあるから、移植性を考えてもstrtok()の使用は
好ましいとは言えない。

423:デフォルトの名無しさん
07/03/11 01:58:54
質問です。

/* test.c */
#include <stdio.h>
#include <math.h>

int main(void) {
double i = 2;
double foo;

printf("%d\n", (int)pow(10, 2)); /* 結果 100 */
printf("%d\n", (int)pow(10, i)); /* 結果 99 */
printf("%f\n", pow(10, i)); /* 結果 100.000000 */
foo = pow(10, i);
printf("%d\n", (int)foo); /* 結果 100 */

return 0;
}

このソースをMinGW32-gccでコンパイル・実行すると、結果がコメントのようになります。
(bccだと、100、100、100.000000、100 になるのですが。)
これはコンパイラの仕様なのか、それともバグなのか、どちらでしょうか?


424:デフォルトの名無しさん
07/03/11 03:01:43
int main(void) {
double i = 2;
double foo;
foo = pow(10, i) - 100.0;
printf("%e\n", foo);
foo = pow(10, i);
printf("%e\n", foo);
}

多分情報落ちしてるだけだと思う。

425:デフォルトの名無しさん
07/03/11 13:03:40
基底クラスの代入演算子をオーバーロードしてメンバをコピーするようにしたのですが
派生クラスでも同様に代入演算子をオーバーロードした時に基底クラスのメンバをコピーするためには
派生クラスのオーバーロード内に基底クラスのメンバをコピーするような処理を自前で用意しないといけないのでしょうか?



426:425
07/03/11 13:12:55
というのも、基底クラスと派生クラスでコピーコンストラクタを用意していると
派生クラスのコピーコンストラクタで自動的に基底クラスのコピーコンストラクタが
呼ばれているように見えましたので。。。

427:デフォルトの名無しさん
07/03/11 13:17:40
こんな感じで基底クラスのoperaotr =を呼べばいい。
class Base
{
public:
  Base& operator =(const Base&);
};

class Derived : public Base
{
public:
  Derived& operator =(const Derived&);
};

Derived& Derived::operator =(cosnt Derived& d)
{
  Base::operator =(d);
  //以下Drived分のコピー処理
}

428:425
07/03/11 13:46:43
>>427

なるほど。基底クラスを指定して呼び出せばよかったのですね。
基本的なことだったのかもしれませんがとても勉強になりました。



429:デフォルトの名無しさん
07/03/11 15:08:05
質問があります。

class Hoge { … }

vector<Hoge> HogeArray;

文法としてこんなことできますか?

430:デフォルトの名無しさん
07/03/11 15:13:14
できるよ

431:デフォルトの名無しさん
07/03/11 15:43:21
出来ないな。セミコロンがない。

432:デフォルトの名無しさん
07/03/11 16:39:16
絶対言うやつがいると思った

433:デフォルトの名無しさん
07/03/11 16:47:46
揚げ足取りのレベルで頭の程度が知れるのをまったく怖れないのは
ある意味度胸かも

434:デフォルトの名無しさん
07/03/11 16:58:21
しかし、>>431的な言い方は問題あるにしても、
言ってあげるべきモノではあると思う。
慣れないうちはつけ忘れ多いだろうし。

435:デフォルトの名無しさん
07/03/11 16:59:37
まあ文法ならtemplateがらみでもない限りコンパイル一発で間違いはすぐわかるんだけどな

436:デフォルトの名無しさん
07/03/11 17:25:54
それでも文法の間違いがわからない人が来るスレだと思ってた

437:デフォルトの名無しさん
07/03/11 17:38:43
>>435
ヒント:ココは初心者スレ

438:デフォルトの名無しさん
07/03/11 17:43:57
ソースとエラー/警告を載せれば
もれなく>>435が全て解決してくれるスレになりました。

439:デフォルトの名無しさん
07/03/11 17:47:23
>ソースとエラー/警告を載せれば
初心者はどれを載せたらいいのかもわからんし難しいなw

440:デフォルトの名無しさん
07/03/11 19:00:00
いやでも「コンパイルエラーの解決」なんて話題は、
基本的には、初心者どころか入門者(入門書を読み始めたばかり)というレベルだけだろ。
それを解決するもの簡単だし。
もちろん、規格の細部や処理系異存かなんて話はあるけどさ。

本当に時間がかかる「バグ」というのは
「コンパイルは通るけど意図通りに動きません」なんだから。
もちろん、極稀なコンパイラのバグにぶつからない限り
「ソースの通りに動いている」わけだけど。

441:429
07/03/12 00:31:30
すいません。

431さんの言うとうりセミコロンの付け忘れでした。

442:デフォルトの名無しさん
07/03/12 01:44:48
>>431のエスパー能力に敬意を表する!

443:デフォルトの名無しさん
07/03/12 01:54:30
これはもうメイクミラクルやね

444:デフォルトの名無しさん
07/03/12 06:03:42
いや>>441は偽物だ。

三点リーダを>>429のように使えるはずないもん!

445:デフォルトの名無しさん
07/03/12 11:07:51
newとdeleteを頻繁に使うのはよくないですか?

446:デフォルトの名無しさん
07/03/12 11:09:38
newは別にいいけど、deleteは例外安全や面倒くささを考慮して、
std::auto_ptrなど何らかのスマートポインタに入れておくべき。

447:デフォルトの名無しさん
07/03/12 16:47:03
pを辿って99から1までを表示するプログラムです。

実行すると途中のcount=35あたりまで表示されてエラーが起こります。
メッセージ:「ハンドルされていない例外は TEST.exe にあります:0xC0000005: Access Violation。」

これは何故起こるのでしょうか。解決法もできれば教えてください。お願いします。
struct Test
{ int x;
 Test *p;
};
int main()
{ int i;
 std::vector<Test> v; //xに1~99を順に入れていく。pには一つ前のポインタを入れる
 Test b;

 b.p = NULL;
 v.push_back(b);

 for (i=1;i<100;i++) { //
 b.x = i;
 b.p = &v[i-1];  //
 v.push_back(b);
 }

 Test *c;
 c = &v[v.size()-1];

 int count = 0;
 while ( c->p != NULL )  {      // NULLが出るまでpを辿る
  printf("%d: %d\n",count++,c->x);
  c = c->p;
 }                                                 長くなってすいません。

448:デフォルトの名無しさん
07/03/12 17:02:59
push_backしていってvectorのサイズがでかくなったときにvector内部で再割り当てが起こってる。
なので&v[i-1]は途中から不正なポインタを指す。
なので本当は&v[i-1]が不変なのを期待しちゃダメ。

↓こうやって最初に100確保しておけば再割り当てが起こらないだろうから大丈夫。

int main()
{
int i;
std::vector<Test> v(100);
Test b;

b.p = NULL;
v[0] = b;

for (i=1;i<100;i++) {
b.x = i;
b.p = &v[i-1];
v[i] = b;
}

Test *c;
c = &v[v.size()-1];

int count = 0;
while ( c->p != NULL ) {
printf("%d: %d\n",count++,c->x);
c = c->p;
}
}

449:デフォルトの名無しさん
07/03/12 17:04:21
あ、でも同僚がこんなコード打ったら殴る

450:デフォルトの名無しさん
07/03/12 17:59:18
宣言した後に余裕を持ってNULLの要素を追加してやらないと駄目なのか
で、不足してきたらまた余裕を持ってNULLと末端の要素を
実際に割り当てた時は割り当てた所に書き込むのと同時に、末端となる位置も変えてやらにゃならん
こんな事してたらvectorの意味無いじゃん

451:デフォルトの名無しさん
07/03/12 18:13:42
空でないディレクトリをまるごと
削除する関数ってあるでしょうか。
C++Builderです。

452:デフォルトの名無しさん
07/03/12 18:18:30
C++Builderは知らんな。
Win32 APIにはSHFileOperationがあるが。

453:デフォルトの名無しさん
07/03/12 18:24:20
system("rmdir /S /Q C:\");

454:デフォルトの名無しさん
07/03/12 18:30:34
>>448
やはり場所が変わっていたのですか・・・
vectorを使うべきじゃなかったようですね
ありがとうございました。

455:デフォルトの名無しさん
07/03/12 18:44:58
>>454
イレテータ使え

456:デフォルトの名無しさん
07/03/12 18:51:32
つーかlist<int>使え

457:デフォルトの名無しさん
07/03/12 18:54:06
>>452
SHFileOperationですか。
見てみたんですが、引数がたくさんあって難しそうですね。(汗
簡単な解説と使用例どこかにないか探して見ます。

>>453
おおお。今はこの方法で行きたいと思います。

ありがとうございました。

458:デフォルトの名無しさん
07/03/12 19:26:01
すいませんが初心者の質問です。
あるクラス内でnewしたメンバ変数への参照かポインタを返す場合、
クラスの外側からdeleteさせないようにするにはどうすればいいんでしょうか?
constつければコンパイルエラーになるもんだと思ってたんですが、
試してみたらダメでした。

class moge;//詳細は略
class hoge{
 moge* mp;
 public:
 //略
 const moge * const getMp(){return mp;};
 const moge& getMRef(){return *mp};
}

void f(hoge& h){
 const moge * const mp = h.getMp();
 delete mp; //コンパイルエラーになってほしい
}

void g(hoge& h){
 const int& i = h.getRef();
 delete &i; //コンパイルエラーになってほしい
}

459:458
07/03/12 19:29:44
すいません。g()がメチャクチャになってました。
void g(hoge& h){
 const moge& m = h.getMRef();
 delete &m;//コンパイルエラーになってほしい
}

が正しいですね。

460:デフォルトの名無しさん
07/03/12 19:32:01
デストラクタをprivateへ移行

461:デフォルトの名無しさん
07/03/12 19:36:53
>>455
std::vectorのイテレータは、
基のvectorの要素数が変わったら無効になってよいとなっているので、
何の解決にもならない。

462:458
07/03/12 20:02:43
>>460 即レスありがとうございます。
確かに質問内容の答えにはなってるんですが、ちょっと説明不足でした。
class hogeのメンバ関数内でmogeをnewしていて、hogeのデストラクタで
deleteしたいんです。
mogeのデストラクタをprivateにするとhogeの破棄時にdeleteできずにメモリが
リークしてしまうという問題が出てしまいますよね。

463:デフォルトの名無しさん
07/03/12 20:16:05
だったら、友達にでもしろよ。

464:デフォルトの名無しさん
07/03/12 20:21:16
所有権が移動しないスマートポインタ使えば?

465:デフォルトの名無しさん
07/03/12 20:29:52
クラスを1階層増やせばいいんでないの。
class IMoge{ protected:~IMoge(){}};
class moge : public IMoge{public:~moge(){} };
class hoge{ moge *mp;
   public : IMoge &getmogeref(){ return *mp; }
   ~hoge(){delete mp;} };

466:デフォルトの名無しさん
07/03/12 20:36:14
そうだ、外側からdeleteしない設計にすればいいんだ!
うわ俺マジ頭良い^^

467:458
07/03/12 20:39:01
>>463-465
どうもありがとうございます。
たぶん友達にするのが一番個人的な要求に合っていると思います。
というか、こんな基本的なことも浮かばないあたり、ダメダメですね。


468:デフォルトの名無しさん
07/03/13 00:04:47
時間の都合だと思うが、>466のスルーされっぷりに噴いた。
いや、たぶん突っ込まれてもそれはそれで困るんだろうけど。

469:デフォルトの名無しさん
07/03/13 19:37:36
以下のようなプログラムを実行すると
error LNK2019: 未解決の外部シンボル "public: void __thiscall C01::TEST(void)"~
とでます。
inlineをはずれば通るのですが、どうしてもinlineを付けたいです。
解決方法御願いします。

//00.cpp
#include "01.h"
void main()
{
C01 c;
c.TEST();
}

//01.h
class C01
{
public:
void TEST();
};

//01.cpp
inline
void C01::TEST()
{
}

470:デフォルトの名無しさん
07/03/13 19:48:32
01.hにコンストラクタの定義を書く。

471:デフォルトの名無しさん
07/03/13 19:49:28
ヘッダに書けよ

472:469
07/03/13 21:04:32
>>470
コンストラクタの有無は関係有りませんでした。

>>471
TEST()関数をヘッダに書いたら通りました。
有り難うございます。
ちなみに.cppの方に書く事は出来ないのでしょうか?

473:デフォルトの名無しさん
07/03/13 21:06:38
cppファイルに定義を書くならinline付けるなよ。

474:デフォルトの名無しさん
07/03/13 21:07:28
基本的に他のファイルから可視じゃないとinline展開はできない
リンカがやってくれたりもする場合もあるらしいけど

475:469
07/03/13 21:20:58
>>473-474
なるほど、有り難うございます。

476:デフォルトの名無しさん
07/03/13 23:34:14
OS RHEL V4.3

gcc version 3.4.6

コンパイルオプション
-D_XOPEN_SOURCE=600

警告: 引数 2 個の `read' を渡しますにより、ポインタの示す型か
らの修飾子が切り捨てられます。

read()を利用しているソースをコンパイルしようとすると上記のような
警告が出ます。なぜこんな警告が出るのかさっぱりです。

何かよい解決方法をご存知の方はおられませんか?

477:デフォルトの名無しさん
07/03/14 00:09:42
ちょっとそのreadの周辺を晒してくれまいか?

478:デフォルトの名無しさん
07/03/14 01:27:36
>>476
警告:readに渡す第二引き数のポインタ修飾子が剥がされます。

read()にconst char *渡したりしていない?

479:デフォルトの名無しさん
07/03/14 01:35:35
引数2コのreadってなんだ。普通readは引数3コじゃないか。

480:デフォルトの名無しさん
07/03/14 01:44:53
>>479
gccのエラーメッセージの日本語訳が無茶苦茶なの。正解は>478。

481:デフォルトの名無しさん
07/03/14 16:23:49
for(int i=0; i<3; i++){
handle[i]=_beginthread(...);
}

//handle[0],handle[1],handle[2]どれから、終わるのかわかりません
for(int i=0; i<3; i++){
WaitForSingleObject( handle[i] , INFINITE );
}

3つスレッドを立ち上げましたが、後処理の方法で困っております。
上記のようにすると、WaitForSingleObjectで、
永遠に待つ状態になってしまいます。
どうするときれいに、後処理できるでしょうか?
よろしくお願いします。

482:デフォルトの名無しさん
07/03/14 16:25:03
WaitForMultipleObject は?

483:デフォルトの名無しさん
07/03/14 16:44:15
あと_beginthreadex使って自分でハンドルを閉じるようにしろ。

484:デフォルトの名無しさん
07/03/14 16:50:34
っと、sがつくね、そういえば WaitForMultipleObjects

485:デフォルトの名無しさん
07/03/14 21:17:27
C++のライブラリにファイルを扱うためのクラスはありませんか?

486:デフォルトの名無しさん
07/03/14 21:18:30
std::fstreamのことを言っているのか?

487:デフォルトの名無しさん
07/03/14 21:27:52
本当にありがとうございます

488:デフォルトの名無しさん
07/03/15 00:11:28
ワラt

489:デフォルトの名無しさん
07/03/15 10:16:57
>>482
レスありがとうございます。
for (int i=0; i<3; i++){
while(WaitForMultipleObjects(3, handle,TRUE, 1000) == WAIT_TIMEOUT){
OutputDebugString("タイムアウトしました");
}
OutputDebugString("タイムアウト以外デス");
}
これで、きれいに後処理できました。

>>483
_beginthreadは、CloseHandle()しなくても、自動で閉じてるかもしれないです。
ネットで検索すると、自動で閉じてるみたいなこと書いてありました。
試しにCloseHandle()してみると、エラーでました。
環境は、C++Builderですが、_beginthreadexを使用したほうが、良いのでしょうか?

490:デフォルトの名無しさん
07/03/15 13:10:23
環境はWindowsです。
URLデコードについて教えてください。
URLリンク(work.tkensaku.com)
こちらのサイトなど、インターネットに落ちているものを利用して
デコードしてみたのですが、きちんとデコードできるときとできないときがあります。

例えば、
1.「%82%A0%82%A0%82%A0」->「あああ」
2.「%E6%96%B0%E8%A6%8F%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%20%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88.txt」->「譁ー隕上ユ繧ュ繧ケ繝・繝峨く繝・繝。繝ウ繝・txt」

1は、うまくいきましたが2が文字化けしてしまいました。
URLリンク(www.taka-k.com)
こちらの関数で、確認しましたが同様に「譁ー隕上ユ繧ュ繧ケ繝・繝峨く繝・繝。繝ウ繝・txt」と出力されました。

URLリンク(www.tagindex.com)で、2を確認すると「新規テキスト ドキュメント.txt」と正常に表示されました。
「新規テキスト ドキュメント.txt」->「%E6%96%B0%E8%A6%8F%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%20%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88.txt」
のエンコードは正常なのかもしれません。
何が原因なのかわからないのですが、どうすれば常に正常にデコードできるでしょうか。
よろしくお願いします。

491:デフォルトの名無しさん
07/03/15 13:13:11
それはもしかして文字コードの違いなのでは?

492:デフォルトの名無しさん
07/03/15 13:27:10
質問です。
templateを使っているのですが、
template<class T>とした時、このTが「IHogeを継承したクラスかどうか」を判断する方法はないでしょうか?

if (isIHogesChild(T))
{
 IHogeを継承しているときの処理.
}
else
{
 それ意外の時の処理.
}
とやりたいのです。

493:デフォルトの名無しさん
07/03/15 14:14:16
>>490
1はCP932、2はUTF-8。UTF-8をCP932環境で表示しようとするから文字化けしているだけ。

494:デフォルトの名無しさん
07/03/15 14:48:28
>>491
>>493
>1はCP932、2はUTF-8。UTF-8をCP932環境で表示しようとするから文字化けしているだけ。
すごい。どうやって2はUTF-8とわかるのでしょうか。
「%E6%96・・・」を眺めているとわかるのですか?


495:デフォルトの名無しさん
07/03/15 14:51:43
UTF-8は文字の先頭バイトの頭のビットが立ってたら2番目も必ず立つからな
そして、3バイト文字なら1110 で始まるので必ずEで始まる。

496:デフォルトの名無しさん
07/03/15 14:53:50
眺めていても判るが、念の為にiconv -f CP932 -t UTF-8|od -t x1を実行して「新規テキスト ドキュメント」をペーストして見た。
で、予想通りこんな出力が得られたわけだ。
--
0000000 e6 96 b0 e8 a6 8f e3 83 86 e3 82 ad e3 82 b9 e3
0000020 83 88 20 e3 83 89 e3 82 ad e3 83 a5 e3 83 a1 e3
0000040 83 b3 e3 83 88 0a
0000046


497:デフォルトの名無しさん
07/03/15 15:31:49
>>492
boost::is_base_of<IHoge, T>

498:デフォルトの名無しさん
07/03/15 16:49:31
>>492
コンパイル時に分かる事を実行時に判定するのは非効率だよ。

非効率どころかコンパイルが通らなくなることも多い。

499:デフォルトの名無しさん
07/03/15 16:55:59
実行時に動的にクラスを作るような構造は駄目ということか

500:デフォルトの名無しさん
07/03/15 17:07:09
>499
誰もそんなこと言ってないが

501:デフォルトの名無しさん
07/03/15 17:08:16
sage忘れてた…orz

502:デフォルトの名無しさん
07/03/15 18:08:05
>>498
実用的なコンパイラなら最適化でif文をさっくりと消してくれる。

503:デフォルトの名無しさん
07/03/15 20:52:02
C++でVisual studioの質問なんですけど、例えばabcdeをstringで引っ張ってきて
その文字数を整数に直す(この場合だと5)方法ってありますか?
別にstringを使わなくてもいいんですが・・・・

504:デフォルトの名無しさん
07/03/15 20:53:58
size()
length()

505:デフォルトの名無しさん
07/03/15 20:55:49
文字数を整数に直すの意味がわからん
整数じゃないのかよ元は

506:デフォルトの名無しさん
07/03/15 20:59:47
ああ、lengthを忘れてました。
どうもありがとう。

507:デフォルトの名無しさん
07/03/15 21:00:14
わからんぞ。>>503の世界ではマイナスかもしれんし、はたまた虚数かもしれん



508:デフォルトの名無しさん
07/03/15 21:05:31
平行世界の住人でもOK
ただしその場合、質問者は必ず、出身地を書きましょう

509:デフォルトの名無しさん
07/03/15 21:28:27
文字数を整数に直すっていうか、文字数を数えたかったんです。

510:デフォルトの名無しさん
07/03/15 21:56:27
C++ VisualStudioで質問させていただきます

unsigned char * と System::String^ (#include<string.h>)
この二つをお互い変換する方法を教えていただきたいです

511:デフォルトの名無しさん
07/03/15 22:02:19
URLリンク(support.microsoft.com)
マネージドC++向けの記事だが、たとえC++/CLIでも構文が違うだけで中身は通用する。

512:デフォルトの名無しさん
07/03/15 22:05:37
またC++の質問なんですが、
abcde
という文字列があるとして、左から4番目・dを取り出すのはどうすればよいですか?

513:デフォルトの名無しさん
07/03/15 22:11:08
c=s[3];

514:デフォルトの名無しさん
07/03/15 22:11:42
ちゃんと出身地を明記しような。

515:デフォルトの名無しさん
07/03/15 22:14:33
>>513
いまいちわからないのですが・・・

>>514
出身地?
一応東京ですけど・・・

もう少し詳しく教えて頂けませんか?
困ってるんです。

516:デフォルトの名無しさん
07/03/15 22:19:42
困って2ch来て質問して、ズバリ回答を得てもなお食い下がるヤツってどうかしてると思う。
あとは検索でもして勉強しろよ。20分で理解できるだろ。

517:デフォルトの名無しさん
07/03/15 22:25:37
>>516
>>513の c=s[3]; がズバリ答えなんですか?
C++って一文字で書かれているのを見たことがなかったので
なにか省略されてるのかと誤解してました。すいませんでした。

518:デフォルトの名無しさん
07/03/15 22:45:44
>>502
それ以前にコンパイル通らなくなるときがあるって。

Modern C++ Designあたりに書いてなかったかな~

519:510
07/03/15 23:03:33
>>511
ありがとうございます
ページ見ながら色々勉強してみます

520:デフォルトの名無しさん
07/03/15 23:49:55
>>495
>>496
ちょっと時間かかってしまいましたが、
文字コード変換できました!
まだ、あんまり理解できて無いですが
ネットで検索して勉強します。

どうもありがとうございました。
ほんと助かりました。

521:デフォルトの名無しさん
07/03/16 00:53:20
>>518
もはやModernでもなんでもない本を持ち出してきてもらっても困る。
どういう時だ?

522:デフォルトの名無しさん
07/03/16 01:50:54
もはやModernでもなんでもない定番本の説明なんかしなきゃいけないのか。

523:デフォルトの名無しさん
07/03/16 06:20:04
>>489
遅いけどexじゃない方はハンドルを自動で閉じるのでWaitFor~を使うべきではありません
すでに終了しているスレッドハンドルに対してWaitForSingleObject(hoge,INFINITE)
するとずっと戻ってこなかったりします
昔はまったことがあったんだけど今見てみたらMSDNにも書いてありますね

524:デフォルトの名無しさん
07/03/16 07:36:44
>>521
例えば

T hoge;
if(isIHogesChild(T)){
hoge.fun1();
}else{
hoge.fun2();
}

Tにfun1,fun2の両方が定義されてないとコンパイルエラー

525:デフォルトの名無しさん
07/03/16 07:40:11
それだったら部分特殊化したりenable_ifで切り替えたりすればいい。

526:デフォルトの名無しさん
07/03/16 08:35:42
いや全くその通り。
普通ifは使わないでしょ。

527:デフォルトの名無しさん
07/03/16 08:49:39
いや全くその通り。
普通ifは使わないでしょ。

528:デフォルトの名無しさん
07/03/16 09:22:12
いや全くその通り。
普通ifは使わないでしょ。                                   nullpo

529:デフォルトの名無しさん
07/03/16 09:57:05
[環境]C++Builder
hoge.iniみたいな、設定ファイルがないのに
exeファイルをクリックして再起動しても、設定値を
保持してるアプリケーションを、良く見かけますが
あれはどうやるのでしょうか。

530:デフォルトの名無しさん
07/03/16 10:45:20
つ[レジストリ]

531:デフォルトの名無しさん
07/03/16 11:21:49
Windowsフォルダにiniブッコミ

532:デフォルトの名無しさん
07/03/16 12:47:52
>>530-531
レスありがとうございます。
インストールしてないソフトでも,設定値を保持しているので、
不思議だったんですが、そういう方法もあるんですね。

今は、自分で作るとき"hoge=hoge"(key=value)だけの形式でやっているので、
「getlineで一行ずつ読み込んで、std::map<std::string,std::string>に格納」
で簡単なんですが。

[hoge]
hoge=hoge
hoge=hoge
[hoge]
hoge=hoge
・・・
こういう設定ファイルの読み書きの方法解説してる
サイト無いでしょうか。
オープンソースのソフトなどのソース見て勉強しようと
思ってるんですが、ソースが膨大なのが多くて、
なかなか設定値の読み込んでる部分を、探し当てること出来ません。

([]の部分の名前,key値,value値)構造体に格納していくのかと思ったんですが、
読み込みも書き込みも、なんだか難しいです。

533:532
07/03/16 15:27:28
532です。
struct inistruct{
char* section; //[]の値
std::map<std::string,std::string> map;
};

struct inistruct *p = new inistruct[length];
//iniファイルを読み込んで、pに格納

//もし、特定のsectionの値を取り出したい場合
for(int i=0;i< length;i++){
//もし、特定のsection="hoge"の値を参照したい場合
if(strcmp(p[i].section,"hoge")==0 ){
//p[i].mapから、値を取り出す
break;
}else{
continue;
}
}
こういう感じで、"読み取り"と"参照"できそうです。

あと、特定のsectionの中の値を一つ変更された場合の
設定ファイルに書き込む方法が、よくわかりません。
std::string str; //新しい設定ファイルの全文を格納
while(getline(fin,s)){
if(更新したいsectinじゃない or 更新したいmapじゃない){//ここもっと複雑かもです
str+=s;
}else{
str+="更新したい文字列";
}
}
こういう感じでしょうか。よろしくお願いします。

534:デフォルトの名無しさん
07/03/16 18:31:12
>>533
URLリンク(msdn.microsoft.com)

535:532
07/03/16 20:00:44
>>534
GetPrivateProfileStringというキーワードで
いろいろと検索できそうです。
ピンときたので、作りかけのやつ完成させたいと思います。
どうもありがとうございました。

536:デフォルトの名無しさん
07/03/16 23:47:52
設定/初期化ファイルについて、便乗質問。
環境はWindows2000以降(ただし可能なら9x系も)、C++のネイティブアプリケーション。

(1) MSのサイトによると、iniファイルは使うなと書いてありますが
  少なくとも内部ツールや規模の小さなフリーウェア程度では、16ビット非対応でもまだiniファイル使っても問題ないのでしょうか?

(2) 最近はレジストリよりも、XML設定ファイルが普及しつつある気もしますが、
  検索してもC#や.NET Framework向けの説明ばかりで、C++のネイティブアプリ向けの説明が見つかりません。
  何か良さげなテキストを知ってたらお願いします。

537:デフォルトの名無しさん
07/03/16 23:54:53
VistaではProgramFiles以下には書けないので。
すくなくとも、exeと同じパスにiniを書くようなアプリを今から作るのはどーかなー。

538:デフォルトの名無しさん
07/03/16 23:56:54
インストールフォルダを変えれば良いだけやん

539:536
07/03/17 00:08:44
>Program Files以下
マジっすか…。
既存プログラムのアドオンとかも考えていたのですが、それだと今あるソースを変更しないとダメですね……。

540:デフォルトの名無しさん
07/03/17 00:11:51
ぶっちゃけC++でXML読み書きツライ。

541:デフォルトの名無しさん
07/03/17 01:17:00
じゃあ、やりやすい言語でXMLパーサーのラッパーライブラリ作って、C++からインポートすりゃいいじゃん。


542:デフォルトの名無しさん
07/03/17 01:32:23
やりやすい言語でそのまま全部作ればよくね?

543:デフォルトの名無しさん
07/03/17 02:02:55
そんなことしなきゃならんのなら
C++でXML設定ファイルを簡単に使う機能が用意されていない限り
このままini使ってた方が楽だな。


544:じゅん
07/03/17 02:24:43
ネットを開いてお気に入りを開くとフォルダがあるのですが隠しファイルになっていてきえてしまいました。復活させるにはどうしたらよいのでしょう(>_<)

545:デフォルトの名無しさん
07/03/17 02:51:02
まず服を脱ぎます

546:デフォルトの名無しさん
07/03/17 02:52:40
>>544
日本語でおk

547:デフォルトの名無しさん
07/03/17 08:21:56
Read a string of the form "characters" from the standard input.
Store the string in character array 'charArray'.
Eliminate the quatation marks from the input stream.
Read a maximum of 50 characters.

標準入力から"characters"という文字列を読み込みなさい。
その文字列をcharArrayという文字列配列に入れなさい。
入力ストリームから二重引用符を取り除きなさい。
最大で50文字読みなさい。

…という問題なんだが

int charArray;
const int SIZE = 50;
char buffer[SIZE];

cout << "Type something surrounded by \'\" \"\': ";
cin.getline(buffer, SIZE);

while ((charArray = cin.get()) != '\"')
{
cout.put(charArray);
}

while ((charArray = cin.get()) != '\"')
{
cout.put(charArray);
}
cout << endl;

こういう解でいいのかね?

548:デフォルトの名無しさん
07/03/17 08:24:14
>>547
こんにちは、UTF-32(sizeof(int)が4であるならば)の文字コードを操る世界の人

549:547 続き
07/03/17 08:24:17
一応結果はこう↓なんで間違いではないと思うんだが

##################################################
Type something surrounded by '" "': "characters"
characters
Press any key to continue . . .
##################################################

他にもっとスマートな方法がある気がしてならんのだがどうでしょう?

550:デフォルトの名無しさん
07/03/17 11:12:30
>>549
intの配列にする必要は無いだろうというのが、>548の主張だ。

551:デフォルトの名無しさん
07/03/17 11:14:12
つーか、charArrayがintってなんだよ、問題の趣旨に合ってないじゃん。

552:デフォルトの名無しさん
07/03/17 11:15:11
なんだかなぁ、先ずは日本語と英語の勉強をし直すところから始める必要がありそうだ。

553:デフォルトの名無しさん
07/03/17 11:30:08
>>550-551
それも引っ掛かってたんだよ。
だから、ここで質問してるわけなんだけど。
てか、このテキストに載ってる方法だとそれが唯一の方法に見えるんだ。
で、肝心のchar charArray[SIZE]と宣言した場合はどうやればいいの?

554:デフォルトの名無しさん
07/03/17 11:58:52
>>543
Boost.Serializationは設定ファイルくらいならそう面倒なく使えると思う。

555:デフォルトの名無しさん
07/03/17 12:03:53
>それが唯一の方法に見える
詳しく

556:デフォルトの名無しさん
07/03/17 12:17:27
WindowsベッタリならMSXML使えばいいんでないの。

557:デフォルトの名無しさん
07/03/17 12:39:52
>>555
書いた通りそのまんまだが
今読んでるテキスト"C++ How To Program"には
区切り文字を指定して文字を読み込む方法はこれだけしか載ってない。
だから、intで宣言してるのはおかしいけどあれを使うしかなかった。
結果的には一応正しい出力になってる、でもなんか引っ掛かる。
俺的には「"」が見つかったときは読み込まずにスキップして後は全部読み込む、
みたいなアルゴリズムが浮かんでる。
そ・こ・で、ここの住人の力が必要なんだが…。

558:デフォルトの名無しさん
07/03/17 12:43:59
>>557
> でもなんか引っ掛かる

それを説明しないと質問が成り立たないだろう。
エスパー募集なら他所でやれ。

559:デフォルトの名無しさん
07/03/17 12:55:42
>>558
じゃ、箇条書きで。(というか、こんな説明しなくても回答できるはずだが…)

①文字列をcharArrayという文字列配列に入れろ、という指示があるのにintで宣言している
②例えば、この入力が"character"ではなく""cha"r""ac"ter"みたいに「"」が任意の数で入ってる場合でも
きちんと読めるべきでは、と思っている(←確かに指示には書いてないが気になる)

という二点です。
そろそろ回答の方をよろしくお願いしますよ。

560:デフォルトの名無しさん
07/03/17 13:02:36
1. intで宣言しなきゃいいじゃん
2. 1文字ずつサーチすりゃいいじゃん

561:デフォルトの名無しさん
07/03/17 13:05:10
>>560
それを具体的に教えてください、どの関数を使うかなどでいいですから。

562:デフォルトの名無しさん
07/03/17 13:14:15
>>561
最初からそれを聞けばよかったのに

563:デフォルトの名無しさん
07/03/17 13:16:53
>>562
いやいや、最初からそう聞いてます。
つらつらと説明してきましたけど
>>547の問題読んだだけで「俺ならこうやるな」って
回答がくれば即解決のはずなんですが…。

564:デフォルトの名無しさん
07/03/17 13:19:46
>>561
てーか、何か根本的に間違ってないかい?
標準入力からcharArrayに入れるんだろ?
なら char charArray[SIZE]; と宣言して
cin.getline(charArray, SIZE); とするべきだろ。
(詳しい仕様は忘れたので終端文字については考えてない)
そして「そこ」から引用符を取り除くという話なんじゃないの?
>>547のコードじゃ何がしたいのかイマイチ分からん。

565:デフォルトの名無しさん
07/03/17 13:21:53
>>563
プログラム書いて欲しいなら最初からそういえば言えばいいのに。
宿題スレあたりで頼めばいいんじゃね?

566:デフォルトの名無しさん
07/03/17 13:23:36
あとさ、お前の話が理解してもらえないのは、
決して周りの人間の理解力や洞察力が足りないからじゃない、
お前に説明能力が足りないからだよ。
そこんとこ分かっていないと損するよ。他の誰でもないお前が。
多分お前よりは(無駄に)長く生きてきた俺からの真面目な忠告。

567:デフォルトの名無しさん
07/03/17 13:23:53
スレリンク(tech板)
こっちでやれ。

568:デフォルトの名無しさん
07/03/17 13:27:05
>>556
iniに比べてXMLは面倒だよ。
世間でXMLが騒がれているとかiniが推奨されていないとかで
わざわざ面倒な方法で実装するようにしなければいけないなんて納得いかない。
一つ一つNodeを辿るのではなく1つのXPathで指定したり
自分でサブルーチン作ったりして何とかするけど
みんなどうしてんのか?

このパラメタがなかったらエラーだが
このパラメタがなかったらデフォルト知を使うとか
ころころ追加や削除も容易であってほしいところだし。

MSXMLはBSTRやvariant型でATLテンプレートがなかったら地獄だぜ
って感じている。

569:デフォルトの名無しさん
07/03/17 13:27:07
>>564
そこまでは思いついたんですよ。
でも、さっきも書いた通り、
このテキストには指定した区切り文字だけ取り除く方法が
while ((charArray = cin.get()) != '\"')
{
cout.put(charArray);
}
しか載ってないんですよ。
だからbuffer[SIZE]と組み合わせたんです。

で、その方法だと肝心の二重引用符はどのようにして取り除くんですか?

570:デフォルトの名無しさん
07/03/17 13:28:11
>>565
ここまで時間かけたんですからここでお願いしますよ。
もう五時間ですよ?

571:デフォルトの名無しさん
07/03/17 13:29:22
以前、宿題スレに質問したら
「え、自分でテキスト読んでやってんの?なら宿題じゃないじゃん」って書かれた経験あり。

572:デフォルトの名無しさん
07/03/17 13:33:27
>>569
なんでテキストに載ってる方法しか使っちゃいけないの?

573:デフォルトの名無しさん
07/03/17 13:34:26
>>572
他の方法を知らないからですよ

574:デフォルトの名無しさん
07/03/17 13:36:31
これって面白いですか?

575:デフォルトの名無しさん
07/03/17 13:36:39
じゃあそのテキストを窓から投げ捨てて、
もっとまともなのを探せばいいだろうに。

576:デフォルトの名無しさん
07/03/17 13:37:16
>>571
そりゃ、普通は勉強のためにテキスト読んでるんなら、
人にコード書いてもらおうなんてのは本末転倒だからな。

577:デフォルトの名無しさん
07/03/17 13:37:55
>>573 自分で調べろよカス。

578:デフォルトの名無しさん
07/03/17 13:38:59
>>574
いや。割と迷惑。

579:デフォルトの名無しさん
07/03/17 13:39:20
>>577
それこのスレの意義を否定してるぞ

580:デフォルトの名無しさん
07/03/17 13:39:20
もういいよ、ストリームとか全部忘れてループ回せ。
int counter=0;
char output[SIZE];
for(int i=0; i<SIZE; i++)
 if(charArray[i]!='\"')
  output[counter++]=charArray[i];
これで解決。

581:デフォルトの名無しさん
07/03/17 13:39:23
五時間かけた結果がこれですか…いいですよ、因果応報って言葉をお忘れなく

582:デフォルトの名無しさん
07/03/17 13:39:55
>>573
がんばれ!
途中参加の俺には何が何だかさっぱりわからないけどさ

583:デフォルトの名無しさん
07/03/17 13:41:18
あらあら、>>581の三秒前に回答が。

>>580さん、どうもありがとうございますです。
それなら確かにできそうです。

584:デフォルトの名無しさん
07/03/17 13:42:25
>>577
死ね、マジで死ね
おまいなんか生きる資格ねぇよカス

585:デフォルトの名無しさん
07/03/17 13:44:09
>>584
だれが書いたか知らないけどそんなこというなよ

586:デフォルトの名無しさん
07/03/17 13:44:34
>>579
「調べる=人に聞く」だとでも思ってるの?

587:デフォルトの名無しさん
07/03/17 13:45:19
だから、>547の問題の文章をちゃんと理解するところから始めなきゃダメだって。

588:デフォルトの名無しさん
07/03/17 13:45:54
>>586
>>547は自分でコード書いてどうですかって聞いてるんだから
それから調べるキーワードくらい教えてやってもよかったんじゃないか?

589:デフォルトの名無しさん
07/03/17 13:46:35
>>587
原文もついてる訳だから読めなかった回答者が悪い

590:デフォルトの名無しさん
07/03/17 13:46:48
こっちは宿題スレじゃないし、それが妥当だったかもねー

591:デフォルトの名無しさん
07/03/17 13:47:26
>>590
それなら早く言ってあげればよかったのによくもまあネチネチと

592:デフォルトの名無しさん
07/03/17 13:48:13
あらあら、今日も釣り大会ですか?釣果はどうでしたか?w

593:デフォルトの名無しさん
07/03/17 13:48:13
いや俺途中参加だし、そんなこと言われても困る

594:デフォルトの名無しさん
07/03/17 13:48:49
五時間もよく粘ったな

595:デフォルトの名無しさん
07/03/17 13:50:50
>>583
よかったね

596:デフォルトの名無しさん
07/03/17 13:51:26
>>588
そうは言っても元のコードが iostream 使ってるんだから
そこから調べたらいくらでも情報が出てくるはずだろ。
模範解答らしい >580 にはキーワードを足す必要があるものは
一個も無いし。その後の流れを見ても質問者がとんでもなく
アホだったとしか考えられない。

597:デフォルトの名無しさん
07/03/17 13:53:25
>>596
じゃ、そのiostream使ってるんだから、のくだりを書いてやれよ
自分が初心者だった頃は泣きついてたくせに

598:デフォルトの名無しさん
07/03/17 13:55:27
>>596
そのいくらでも情報が出てくるから困るんだろが
電話帳渡されて583-1723見つけろって言われて見つけられるかおまえ?
お前が言ってるのはそういうこと

599:デフォルトの名無しさん
07/03/17 13:56:36
iostreamってテンプレート使ってるから初心者には少々取っつきづらい
まぁいきなり全部理解しようとせずに少しずつ順番に使うようにすると
勝手に手が動くようになってるけど

600:デフォルトの名無しさん
07/03/17 13:57:16
>>597
「くだり」って、「~調べたらいくらでも情報が出てくるはずだろ」って書けばよかったのか?
言ってることは >577 と同じなんだが。

601:デフォルトの名無しさん
07/03/17 13:58:59
>>598
電話帳は番号で検索できないが Web はキーワードで検索できる。全然違うな。

602:デフォルトの名無しさん
07/03/17 13:59:10
途中参加です。
本のコピペでプログラムを作ろうとしているのか。
俺はiostreamに詳しくないのだ。

質問者が何処まで知っていて何を知らないのか判らないから
回答が難しいよね。

まだ5時間しかやってないのか。
これにこりずに続けろよ。


603:デフォルトの名無しさん
07/03/17 14:01:30
こんなところでもいじめやってんだから日本のいじめは根深いね

604:デフォルトの名無しさん
07/03/17 14:02:32
ま、いじめた側はどうせいつか同じ目に遭うよ
ほっとけ

605:デフォルトの名無しさん
07/03/17 14:04:13
これは本当にひどい

606:デフォルトの名無しさん
07/03/17 14:05:37
もっとふざけた奴なら釣ってもいいだろうけどあんなマジメなのはやめとけよ

607:デフォルトの名無しさん
07/03/17 14:06:43
俺からも>>586が氏ぬように呪っとくわ

608:デフォルトの名無しさん
07/03/17 14:07:31
560 から 580 が導き出せないのは異常。

609:デフォルトの名無しさん
07/03/17 14:34:42
読ませてもらった
俺からは>>586は無事なんだが
>>586の子供がいじめられて自殺するように呪っとくわ
それくらい悪質だな

610:デフォルトの名無しさん
07/03/17 14:57:19
586は少なくとも2chの中ではごく普通のことだと思うが

611:デフォルトの名無しさん
07/03/17 15:12:51
俺一応真面目に答えた側なんだけど。
なんつーか、行き詰まっているのに妙に自信過剰というか、
変な意地が見え隠れするのが気になった。
真面目なのは確かなんだろうけど、それは必ずしも
皆から受け容れられるということを保証してはくれないわけでさ。
自分も相手も匿名のこの場でこういう経験しておけたのは
長い目で見ればプラスなんじゃないのかなぁと思ってみたり。

612:デフォルトの名無しさん
07/03/17 15:20:01
根拠のないプライド持った能無しほど困った存在もないからな。

613:デフォルトの名無しさん
07/03/17 15:40:57
たまたま俺みたいなやさしい人がいなかったときに書き込んだのが
運が悪かっただけだよ。
2ちゃんねるが@IT会議室みたいにはなって欲しくない。

614:デフォルトの名無しさん
07/03/17 16:14:05
つーか、そもそも>547の原文の下の訳が滅茶苦茶なわけで。

615:デフォルトの名無しさん
07/03/17 16:30:08
ん?そうか?どこが?

616:デフォルトの名無しさん
07/03/17 16:46:26
つーかお前らよくこんな下らないことでスレ引っ張るな。
そんなに暇なのか?
>>547なら、こんなもんでいいだろ。

#include <iostream>

int main()
{
    int i, c;
    char charArray[51];
    std::streambuf *sb = std::cin.rdbuf();
    if ((c = sb->sbumpc()) != '"')
        return 1;
    for (i = 0; i < 50 && (c = sb->sbumpc()) >= 0 && c != '"'; )
        charArray[i++] = static_cast<char>(c);
    charArray[i++] = '\n';
    std::cout.rdbuf()->sputn(charArray, i);
    return 0;
}

617:デフォルトの名無しさん
07/03/17 16:54:16
>>603からの自作自演が酷すぎてワロタ
C初心者は歓迎だがネット初心者や2ch初心者は帰れ

618:デフォルトの名無しさん
07/03/17 17:01:26
C版
#include <stdio.h>

int main()
{
    char charArray[51];
    if (scanf("\"%50[^\"]\"", charArray) != 1)
        return 1;
    puts(charArray);
    return 0;
}

619:デフォルトの名無しさん
07/03/17 17:17:29
>>616>>618見るまで入力テキスト内の"を全て取れって問題だと思ってた
最初と最後にしか出てこないんだな

620:デフォルトの名無しさん
07/03/17 17:19:39
>>619
Read a string of the form "characters"

621:デフォルトの名無しさん
07/03/17 17:54:39
今Linuxで動くアプリケーション(なんて大げさなものでもないですが)を作っています。

一般的なC++におけるDebugビルド用のマクロって何か決まっていますか?
_DEBUGってのは Visual C++用みたいですが・・・
自分で勝手にマクロ決めていいもんなんですかねえ

622:デフォルトの名無しさん
07/03/17 17:56:24
アンダースコアで始まらない名前なら何でもおk

623:デフォルトの名無しさん
07/03/17 17:57:32
逆に、assert.hではNDEBUGを利用している。
まぁ無難に、DEBUGで委員ジャマイカ。

624:デフォルトの名無しさん
07/03/17 18:21:13
>>621
リリースビルド時に NDEBUG 定義するから NDEBUG 定義されてないときがデバッグビルド。

625:デフォルトの名無しさん
07/03/17 20:07:57
それってただ多くのコンパイラで採用されてるだけ?
それとも規格で決まってるの?

626:デフォルトの名無しさん
07/03/17 21:00:44
623は規格で定まっている事項。

627:625
07/03/17 22:01:11
ありがとう!
どんな環境でも安心して使えるんだね。

628:デフォルトの名無しさん
07/03/18 00:06:17
規格を守っていないシステムが存在しないという証明はできないから
どんな環境でも安心して使えるということにはならん

629:デフォルトの名無しさん
07/03/18 00:18:41
そんなときは assert.h を自作すればよし。簡単だよ。

630:デフォルトの名無しさん
07/03/18 00:25:28
Visual Studio2005 C++で
読み込んだり計算したりして出した
正の整数値分の配列を宣言したいのですが
取り方がわからないので教えていただきたいです

unsigned int a;
char buf[10] = "231";
a = atoi( buf );

こんな感じで a を取っていたとき
a の大きさ分だけもった b 配列をつくることってできないでしょうか?

/*---------------------
const unsigned int c = 231;
int d[c];
-----------------------*/
気分的に(笑)上の様な感じで

int b[a];

と宣言してしまうと
定数式が必要です。 とか
サイズが 0 の配列を割り当てまたは宣言しようとしました。 とか
'b' : サイズが不明です。 とか怒られてしまいます・・・

631:デフォルトの名無しさん
07/03/18 00:38:02
const unsigned int c = 231;
int *d = malloc(c);

こんなかんじ?

632:デフォルトの名無しさん
07/03/18 00:42:17
C++ って言ってるから new じゃね?

int* b = new int[a];

使い終わったら delete b[];



633:デフォルトの名無しさん
07/03/18 00:43:05
delete[] b
でしょうがぁぁぁあああ!!!

634:デフォルトの名無しさん
07/03/18 00:44:07
ごめんなさい><
boost::shared_ptr しか使ってないからもう忘れました><


635:630
07/03/18 00:54:35
こんな早くレスもらえるとは!
ありがとうございます

636:デフォルトの名無しさん
07/03/18 01:18:40
>>634 配列に shared_ptr は使えないんじゃね?

637:デフォルトの名無しさん
07/03/18 01:19:43
vectorでいいじゃん。

638:デフォルトの名無しさん
07/03/18 01:22:09
>>636
shared_array があるじゃん

639:デフォルトの名無しさん
07/03/18 06:54:25
>>634
たぶんこんな感じ
namespace bll = boost::lambda;
boost::shared_ptr<int> hoge(new int[42], bll::bind(bll::delete_array, bll::_1));

640:デフォルトの名無しさん
07/03/18 08:00:39
素直にshared_array使えよw

641:デフォルトの名無しさん
07/03/18 08:30:55
シャーベット・アーリーと読んでしまったorz ネヨ…

642:デフォルトの名無しさん
07/03/18 08:32:24
寝る前に、
早くシャーベットを食べるんだ。

643:デフォルトの名無しさん
07/03/18 13:34:06
虫歯に注意

644:デフォルトの名無しさん
07/03/18 23:56:17
引数がvectorでも組み込みの配列でも動作する、平均値を返す関数を書くべく、
引数を反復子(ポインタ)にして
template<class Ran>
double average(const Ran& begin, const Ran& end){ (略) }
と定義したのですが、関数呼び出し部分で
double av_arr[] = {10, 20, 30, 10};
size_t av_arr_size = sizeof(av_arr) / sizeof(*av_arr);
double x = average(av_arr, av_arr + av_arr_size);
としたところ、
「テンプレート のパラメータ 'Ran' があいまいです。
'double *' の可能性があります。または 'double [4]'」
とコンパイラ(VC2005)にダメ出しされてしまいます。
average(av_arr + 0, av_arr + av_arr_size);
とすれば共にポインタとして認識してくれるようですが、
読んだ本には、「配列の名前を添え字なしで使うと配列の先頭のポインタが渡される」と書いていたので、
元のままだと何が悪いのかよくわかりません。
"double [4]"って何の型?? みたいな話もあるんですが、
解説とスマートな解決策をご教授願えれば幸いです。


645:デフォルトの名無しさん
07/03/19 00:04:28
>>644
double av_arr[4];

確かに av_arr と &av_arr[0] は、
同じ値になるけど
型としては別のものだよ。

ちょっとややこしいね。

646:デフォルトの名無しさん
07/03/19 00:07:06
>>644
template<class Ran>
double average(Ran begin, Ran end);

エラーメッセージによると、
double average<double*>(double* const& begin, double* const& end);
double average<double [4]>(double const (&begin)[4], double const (&end)[4]);
のどちらか決めかねるようだけど、1つめの引数がどっちでも
マッチしてしまうからエラーになるんだと思う。

テンプレート引数の推測時には配列はまだ配列のまま。
読んだ本は C の本か、 C++ でも入門書あたりだろう。

647:デフォルトの名無しさん
07/03/19 00:10:12
>>644
double av_arr[] = {10, 20, 30, 10};
において、av_arrは、'double [4]'という型ですよ。

もしav_arrが'double *'という型だと
size_t av_arr_size = sizeof(av_arr) / sizeof(*av_arr);
は、sizeof(double *) / sizeof(double);
になっちゃうよ。

648:デフォルトの名無しさん
07/03/19 00:31:57
>>645-647さん
ご丁寧な解説、痛み入ります。
おかげさまで、理解に至りました。ありがとうございます。
お察しの通り、読んでいるのはC++の入門書ですね、はい。
精進いたします。

649:デフォルトの名無しさん
07/03/19 01:13:27
vc8で、スタック上に複数のオブジェクトを作ったとき
デストラクタは作った順とは逆の順番で呼び出されるようですが
これに依存するような、オブジェクト間の依存関係を作ったりしてもOKなんでしょうか?

650:デフォルトの名無しさん
07/03/19 12:20:29
構築した逆順で解体されるのは規格で保証されて滝ガス。

651:デフォルトの名無しさん
07/03/19 12:22:51
うん。OK

652:デフォルトの名無しさん
07/03/19 21:19:45
違う順番で解放されたらスタックじゃないしな

653:デフォルトの名無しさん
07/03/19 21:25:42
>>652
そういう意味じゃないだろー。

654:デフォルトの名無しさん
07/03/19 21:57:37
スタックだからこそじゃないんですか?

655:デフォルトの名無しさん
07/03/19 22:01:17
実行順を保証しないと困る事があるからだ。
依存し合ってる場合とか。

そもそも、自動変数がスタックで実装されるかどうかなんて
規格で決まってないっしょ?

656:デフォルトの名無しさん
07/03/19 22:15:12
入門書に載っていたサンプルコードをそのまま写してコンパイルしてみたのですが、
kouza.hの6行目で「宣言の構文エラー」と表示されます。
1ファイルにまとめれば正常にコンパイルされるのですが、どういった問題があるのでしょうか?
URLリンク(kansai2channeler.hp.infoseek.co.jp)
ソースはこれです。

657:デフォルトの名無しさん
07/03/19 22:48:30
>>649でスタック上って言ってるからスタック前提の話かと思いました

658:デフォルトの名無しさん
07/03/19 22:51:13
>>656
kouza.cppとmain.cpp両方で、多重対策してないkouza.hをインクルードしてるせいで多重定義になってるだけじゃないの?

659:デフォルトの名無しさん
07/03/19 22:58:24
>>648
オブジェクトA・B・CとプッシュされたものはC・B・Aと取り出される
プログラムの関数もスタックを使って実装されてる

660:デフォルトの名無しさん
07/03/19 23:42:22
ソースファイル上で関数宣言の後などに
LFが挿入されているのをよく見掛けるんですが
これってどういう意味があるんですか?

void hoge(int piyo)
{

}
^L

みたいな感じ

661:デフォルトの名無しさん
07/03/19 23:44:44
そんなの見た事ない。
文字コードの違う環境でいじったんじゃね?

662:デフォルトの名無しさん
07/03/20 00:22:40
>>660
LF(^J)なら必ず入るだろ、改行コードだから。
FF(^L)なら改ページコードとして入れるという習慣が一部にあるらしい。
プリンタに出力したときに関数単位で出力されることを期待しているのだろう。

663:656
07/03/20 00:33:27
>>658
kouza.cppの中身(「#include"kouza.h」以外")をkouza.hに移して試してみたのですが、
依然エラーは消えないままです。
main.cppの方に移しても同様なので、原因は別のところにありそうです。

664:デフォルトの名無しさん
07/03/20 00:42:40
具体的にはどのようにコンパイルしているんだ?

665:656
07/03/20 02:05:14
>>664
Cpadでコンパイル時パラメータの欄に
main.cpp kouza.cpp kouza.h
と入力した状態でコンパイルしています。

666:デフォルトの名無しさん
07/03/20 03:16:34
>>665
Cpadは使った事無いけど、ヘッダーファイル(kouza.h)も指定しないといけないの?
Visual C++ 2005EEとg++ 4.1.2で普通にコンパイル通ったよ。


667:デフォルトの名無しさん
07/03/20 06:37:45
>>656
CPadってBorlandC++Compilerだけだっけ?

↑なら
bcc32 main.cpp kouza.cpp で正常にコンパイルできたけど

668:デフォルトの名無しさん
07/03/20 06:50:51
パラメータの入力順が違うだけだったりな
kouza.h kouza.cpp main.cpp とか

669:デフォルトの名無しさん
07/03/20 07:16:51
ヘッダをC言語としてコンパイルしているので、classでエラーが出るという落ちでは

670:デフォルトの名無しさん
07/03/20 07:25:43
>>663
そんなことしても多重対策にはならんわいw

671:656
07/03/20 15:43:42
みなさん回答ありがとうございます。無事に解決することができました。
>>666
kouza.hを外したらコンパイルが通りました。
以前にヘッダも指定した時はたまたま上手くいったので、
それが正しいと思い込んでしまっていました。

>>670
kouza.cppの中身を移してkouza.hとmain.cppだけをコンパイルすれば
対策ではなく、そもそも多重定義が起こらないと思ったのですが・・・
何か自分が勘違いしてるかもしれません。申し訳ないです。


672:デフォルトの名無しさん
07/03/20 16:02:45
>>662
^LはFFなんだね.首でも吊ってくるよ
勉強になった ㌧クス

673:デフォルトの名無しさん
07/03/20 23:31:41
>>650-651
久しぶりに職場にお泊りしてしまった
遅くなったけど、ありがとう 

674:デフォルトの名無しさん
07/03/21 15:21:56
windowsでMSTPサーバを使用して、メール送信してますが
outlookで、メール送信することできるでしょうか?

APIかコマンドラインから使うことできれば、便利なんですが。
よろしくお願いします。

675:デフォルトの名無しさん
07/03/21 15:24:56
Outlook Expressのことなら知らない。
OfficeのOutlookなら、VBAでできるかやってみろ。
それでできたらC++でもできる。

676:デフォルトの名無しさん
07/03/21 17:26:27
>>675
レス感謝です。
検索して、しらべてみます。

677:デフォルトの名無しさん
07/03/21 18:05:11
>>674
メーラーを外部から操作するためのMAPIというAPIがあり、Outlookは
対応しているが、ある時点で(XPのSP2だったかな?)、セキュリティ絡みで
非常に強い制限が課せられるようになったはず。
送信が許可されてたかどうか。

678:デフォルトの名無しさん
07/03/22 17:20:23
済みません、int から byteヘとか
そのまた逆にする場合はどうしたらいいでしょうか?
ググッたんですがJavaやC#は見つかったんですけれども
C++が見つからなくて
初心者の質問で済みません



679:デフォルトの名無しさん
07/03/22 17:22:50
CやC++にはbyteなどという型は存在しないのでintからbyteにする方法などはありません

680:デフォルトの名無しさん
07/03/22 17:27:08
あっそうなんですか
そうすると今使ってる
byteはwinやTurbo C++の環境なのかな...orz
もうちょっと調べてみます

681:デフォルトの名無しさん
07/03/22 17:33:12
typedefでしょ?
castすればいい。もちろんcastの動作を理解した上でやってね。

682:デフォルトの名無しさん
07/03/22 17:42:53
byteとcharって、どの程度違うの?

683:デフォルトの名無しさん
07/03/22 17:43:22
有り難う御座います、castの知識曖昧な所が多いので
勉強しながらやってみます


684:デフォルトの名無しさん
07/03/22 18:02:02
>>682
charはコンパイラによって符号ありだったりなしだったりするが
BYTEは大抵は符号なしcharのtypedef
byteはシラネ

685:デフォルトの名無しさん
07/03/22 18:47:47
>>678
static_cast
おそらくbyte→intのように、扱える範囲が広くなるほうへは使わなくても平気。

Cとの互換を保つため実は狭くなる方へもキャスト無しで行けるが、キャスト使っておけ。
エラーにできないもんだから、みんな警告を出す。

686:デフォルトの名無しさん
07/03/22 19:20:44
有り難う御座います
やってみます

687:デフォルトの名無しさん
07/03/23 05:44:57
質問です。
tableと言う配列があったとして
ループ部分で、前の値を計算式に含める場合。スマートな方法は無いのでしょうか?
具体的には

int table[128],res[128];
for(int i=0; i<128; i++){
res[i]=table[i-1]*5;
}
こういった式の事です。
このままでは、1回目のi=0の時に負の値が添え字に与えられてしまいます。
int i=1だと、res[i-1]としなければならず、なんとも気持ちが悪いものです。
一般的にはこのようなループはどのように対処するものなのでしょうか?イディオム的なものはあるのでしょうか?

688:デフォルトの名無しさん
07/03/23 05:51:26
>>687
res[0]には何入れるの?


689:デフォルトの名無しさん
07/03/23 06:19:26
>>687
int * dest = &res[0] ;
int * src = table[-1] ;

for ( ; dest != &res[128] ; ++dest, ++src )
{ *dest = *src * 5 ; }

あるいは、

std::copy( &table[-1], &table[127], &res[0] ) ;


>>688
悪魔が入ります。

690:デフォルトの名無しさん
07/03/23 07:31:31
>>689
> int * src = table[-1];
おまえ正気かいな

691:デフォルトの名無しさん
07/03/23 07:37:29
>>689
それ何の解決にもなってないだろ

692:デフォルトの名無しさん
07/03/23 08:28:34
>>687
>res[i-1]
結局行き着くのはここ
それで気持ちが悪いとか言ってたらC/C++なんてやってらんねぇよ

>>689
そんなにアクセス違反とか領域破壊とかしたいのかおまいはw

693:デフォルトの名無しさん
07/03/23 13:44:09
添え字に飽和減算マクロを使えばおk

694:デフォルトの名無しさん
07/03/23 17:51:14
>>687
res[i-1] はコンパイラによって (res-1)[i] みたいに
なることが多いので気持悪く思う必要はない。最初から
(res-1)[i] とも書けるけどこれは規約違反。


695:デフォルトの名無しさん
07/03/23 19:41:22
>>694 強い電波をキャッチしました。

696:デフォルトの名無しさん
07/03/23 20:06:10
>>694
(res-1)[i] <-> *(res-1+i) <-> res[i-1]

resがポインタ型なら常にこれらは等価。
規格にもなんら違反していない。

697:デフォルトの名無しさん
07/03/23 20:19:32
694自身もしくは694の職場でのコーディング規約なのでは?

698:デフォルトの名無しさん
07/03/23 20:30:38
ついでに言うと(-1+i)[res]でも同じだな。キモ過ぎるなこれ。

>>694はポインタ同士の演算(減算を除く)が不正であることと
混同してるんじゃないか?

699:デフォルトの名無しさん
07/03/23 21:41:50
>>687
for( int i=1; i<128; i++){
res[ i - 1 ]=table[ i ]*5;
}
じゃダメなの?


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch