C言語何でも質問掲示板


アンケートにご協力下さい → >> アンケートフォーム <<

規約と使い方

 
   エラーの内容がどうし ....   
     ・[10534] GPGA 
     ・[10535] pipi 
   無題   
     ・[10520] 管理人 
     ・[10524] tkmakwins15 
   コマンドライン引数   
     ・[10498] たかぎ 
     ・[10501] toyo 
     ・[10519] 天丼 
   ジョイパッドについて   
     ・[10499] Justy 
     ・[10513] 夏天 
   newのオーバーロード   
     ・[10466] Justy 
     ・[10467] tkmakwins15 
     ・[10468] Justy 
     ・[10469] tkmakwins15 
     ・[10470] Justy 
     ・[10471] tkmakwins15 
     ・[10472] Justy 
     ・[10473] tkmakwins15 
     ・[10474] Justy 
     ・[10475] tkmakwins15 
     ・[10477] Justy 
     ・[10479] たかぎ 
     ・[10480] Justy 
     ・[10482] tkmakwins15 
     ・[10483] たかぎ 
     ・[10484] tkmakwins15 
     ・[10485] たかぎ 
     ・[10491] YuO 
     ・[10495] tkmakwins15 
     ・[10497] たかぎ 
     ・[10500] tkmakwins15 
   2万桁の円周率計算   
     ・[10445] TT414 
     ・[10463] けるびん 
   this修飾子とclass:: ....   
     ・[10199] さば 
     ・[10204] たかぎ 
     ・[10206] さば 
     ・[10207] たかぎ 
     ・[10208] バグ 
     ・[10213] 管理人 
     ・[10236] さば 
     ・[10238] 管理人 
     ・[10260] なぎ 
     ・[10269] たかぎ 
     ・[10329] さば 
     ・[10330] たかぎ 
     ・[10361] さば 
     ・[10362] たかぎ 
     ・[10365] さば 
     ・[10366] YuO 
     ・[10367] たかぎ 
     ・[10368] たかぎ 
     ・[10369] さば 
     ・[10370] たかぎ 
     ・[10371] GPGA 
     ・[10372] さば 
     ・[10373] たかぎ 
     ・[10374] GPGA 
     ・[10375] さば 
     ・[10376] さば 
     ・[10377] たかぎ 
     ・[10378] GPGA 
     ・[10379] たかぎ 
     ・[10380] さば 
     ・[10381] tkmakwins15 
     ・[10382] GPGA 
     ・[10383] たかぎ 
     ・[10384] たかぎ 
     ・[10385] tkmakwins15 
     ・[10388] さば 
     ・[10390] たかぎ 
     ・[10392] tkmakwins15 
     ・[10397] GPGA 
     ・[10398] たかぎ 
     ・[10399] さば 
     ・[10400] たかぎ 
     ・[10402] さば 
     ・[10405] tkmakwins15 
     ・[10423] バグ 
     ・[10424] バグ 
     ・[10425] たかぎ 
     ・[10426] バグ 
     ・[10427] さば 
     ・[10428] さば 
     ・[10433] たかぎ 
     ・[10434] さば 
     ・[10436] tkmakwins15 
     ・[10442] さ 
     ・[10453] tkmakwins15 
     ・[10455] さば 
     ・[10456] さば 
     ・[10458] tkmakwins15 
     ・[10459] 管理人 
   同じpointであっても生 ....   
     ・[10454] てつ 
     ・[10457] keichan 
   delete[] について   
     ・[10444] Blue 
     ・[10446] さなお 
     ・[10447] Blue 
     ・[10448] たかぎ 
     ・[10449] さなお 
   構造体   
     ・[10409] tkmakwins15 
     ・[10411] box 
     ・[10412] Shera 
     ・[10413] tkmakwins15 
     ・[10419] toyo 
     ・[10421] たかぎ 
     ・[10435] tkmakwins15 
     ・[10438] Shera 
     ・[10439] たかぎ 
     ・[10440] tkmakwins15 
   作れるゲーム、作れな ....   
     ・[10414] tkmakwins15 
     ・[10416] 管理人 
     ・[10418] とおりすがり 
     ・[10437] 0時 
   Windows アプリケーシ ....   
     ・[10356] Lbfuvab 
     ・[10357] かしす 
     ・[10360] Blue 
     ・[10429] かしす 
     ・[10430] Blue 
     ・[10431] かしす 
     ・[10432] Blue 
   DirectXによる、切れ目 ....   
     ・[10407] GPGA 
     ・[10417] りむ 
     ・[10422] Justy 
   日本語の文字化け   
     ・[10420] たかぎ 
   ダブルクォートで括っ ....   
     ・[10279] Hermit 
     ・[10282] むずかC 
     ・[10284] たかぎ 
     ・[10289] Hermit 
     ・[10309] むずかC 
     ・[10311] むずかC 
     ・[10334] たかぎ 
     ・[10355] むずかC 
     ・[10363] たかぎ 
     ・[10364] バグ 
     ・[10393] むずかC 
     ・[10394] むずかC 
     ・[10395] GPGA 
     ・[10401] YuO 
     ・[10403] たかぎ 
     ・[10404] たかぎ 
   無題   
     ・[10387] tkmakwins15 
     ・[10389] 管理人 
     ・[10391] tkmakwins15 
     ・[10396] GPGA 
   動作チェックして貰い ....   
     ・[10300] てつ 
     ・[10301] てつ 
     ・[10302] てつ 
     ・[10303] toorisugari 
     ・[10308] 管理人 
     ・[10312] てつ 
     ・[10319] 管理人 
     ・[10331] てつ 
     ・[10337] 管理人 
     ・[10351] てつ 
     ・[10358] 管理人 
     ・[10359] てつ 
   無題   
     ・[10350] たかぎ 
     ・[10352] Hermit 
   C++とC#どちらがよいの ....   
     ・[10340] バグ 
     ・[10341] たかぎ 
     ・[10342] tkmakwins15 
     ・[10344] みみ 
     ・[10345] たかぎ 
     ・[10346] バグ 
     ・[10348] tkmakwins15 
     ・[10349] たかぎ 
   ゲームプログラミング ....   
     ・[10163] 一本杉 
     ・[10166] tkmakwins15 
     ・[10174] しのぶ 
     ・[10179] 管理人 
     ・[10180] 管理人 
     ・[10181] tkmakwins15 
     ・[10182] 管理人 
     ・[10183] Justy 
     ・[10184] 管理人 
     ・[10186] Justy 
     ・[10188] 管理人 
     ・[10189] 管理人 
     ・[10191] Justy 
     ・[10192] 管理人 
     ・[10193] 管理人 
     ・[10197] バグ 
     ・[10200] 管理人 
     ・[10202] tkmakwins15 
     ・[10205] 管理人 
     ・[10209] tkmakwins15 
     ・[10210] しのぶ 
     ・[10211] Justy 
     ・[10212] 管理人 
     ・[10214] Justy 
     ・[10215] 管理人 
     ・[10217] 管理人 
     ・[10219] Justy 
     ・[10220] 管理人 
     ・[10222] tkmakwins15 
     ・[10223] Justy 
     ・[10225] 管理人 
     ・[10228] tkmakwins15 
     ・[10230] Justy 
     ・[10232] 管理人 
     ・[10241] tkmakwins15 
     ・[10242] 管理人 
     ・[10248] tkmakwins15 
     ・[10250] 管理人 
     ・[10251] tkmakwins15 
     ・[10253] 管理人 
     ・[10259] tkmakwins15 
     ・[10265] Mag 
     ・[10271] しのぶ 
     ・[10272] Justy 
     ・[10276] tkmakwins15 
     ・[10277] Justy 
     ・[10281] tkmakwins15 
     ・[10283] Justy 
     ・[10286] tkmakwins15 
     ・[10290] Mag 
     ・[10291] 管理人 
     ・[10304] tkmakwins15 
     ・[10305] 管理人 
     ・[10310] tkmakwins15 
     ・[10318] Justy 
     ・[10320] 管理人 
     ・[10321] tkmakwins15 
     ・[10323] 管理人 
     ・[10324] tkmakwins15 
     ・[10325] Justy 
     ・[10327] tkmakwins15 
     ・[10333] GPGA 
     ・[10336] 組木紙織 
     ・[10343] tkmakwins15 
   動画をループさせたい ....   
     ・[10295] バグ 
     ・[10314] 宇宙人 
     ・[10315] バグ 
     ・[10316] Justy 
     ・[10332] 宇宙人 
     ・[10338] 宇宙人 
   Borland C++ Compiler   
     ・[10335] 管理人 
   CSV形式文字列の読 ....   
     ・[10322] Justy 
     ・[10326] トラトラ 
   初めまして、質問です ....   
     ・[10307] 管理人 
     ・[10313] 0時 
     ・[10317] 管理人 
   無題   
     ・[10263] てつ 
     ・[10264] kora 
     ・[10288] 管理人 
   無題   
     ・[10270] たかぎ 
     ・[10287] 管理人 
   ファイルの読み込み   
     ・[10274] box 
     ・[10278] ligaty 
     ・[10280] box 
   無題   
     ・[10268] kon 
   半角全角の区別   
     ・[10256] 管理人 
     ・[10257] box 
     ・[10258] バグ 
     ・[10261] 夏天 
   製作中のアクションゲ ....   
     ・[10252] 管理人 
     ・[10254] ルルーシュ 
   ReadStringについて   
     ・[10247] Blue 
   リストビューのフォー ....   
     ・[10195] toyo 
     ・[10203] Chii☆ 
     ・[10245] Chii☆ 
   フレームとコンテナに ....   
     ・[10233] Justy 
     ・[10234] ま〜く 
     ・[10237] Justy 
     ・[10240] はね 
     ・[10244] Justy 
   裏画面の反映ができな ....   
     ・[10201] 管理人 
     ・[10226] サッシ 
     ・[10229] 管理人 
     ・[10239] サッシ 
     ・[10243] 管理人 
   文字列ポインタ配列を ....   
     ・[10224] 管理人 
     ・[10227] Justy 
     ・[10235] てつ 
   無題   
     ・[10218] 管理人 
   サンプルプログラムの ....   
     ・[10187] 管理人 
     ・[10190] kon 
   Visual C++ 2008 Expr ....   
     ・[10138] 管理人 
     ・[10141] DDK 
     ・[10142] 楊主席代表 
     ・[10143] 管理人 
     ・[10147] tkmakwins15 
     ・[10148] YuO 
     ・[10149] DDK 
     ・[10154] YuO 
     ・[10156] DDK 
     ・[10158] YuO 
     ・[10159] たかぎ 
     ・[10160] DDK 
     ・[10161] たかぎ 
     ・[10176] DDK 
   void *について   
     ・[10164] tkmakwins15 
   ホームランかアウトの ....   
     ・[10107] tkmakwins15 
     ・[10110] 管理人 
     ・[10112] tkmakwins15 
     ・[10125] プーコ 
     ・[10126] バグ 
     ・[10129] 管理人 
     ・[10155] プーコ 
   無題   
     ・[10134] box 
     ・[10135] 管理人 
     ・[10136] billy 
     ・[10139] box 
     ・[10140] billy 
     ・[10144] 管理人 
     ・[10145] GPGA 
     ・[10146] 管理人 
     ・[10150] billy 
     ・[10151] 管理人 
     ・[10152] バグ 
   シューティングゲーム ....   
     ・[10128] tkmakwins15 
     ・[10131] るーふぁす 
     ・[10132] 管理人 
   10進数を2,8,1 ....   
     ・[10109] 管理人 
     ・[10111] 蘇我入鹿 
     ・[10113] tkmakwins15 
     ・[10119] バグ 
     ・[10120] tkmakwins15 
     ・[10121] Justy 
     ・[10124] tkmakwins15 
     ・[10130] 楊主席代表 
   1000行プログラムって ....   
     ・[10116] へろり 
     ・[10117] 管理人 
     ・[10118] 黒マンタ 
     ・[10122] たかぎ 
     ・[10123] tkmakwins15 
   エラーについて   
     ・[10069] たかぎ 
     ・[10076] chunezu 
     ・[10078] へろり 
     ・[10079] たかぎ 
     ・[10083] chunezu 
     ・[10084] Blue 
     ・[10092] chunezu 
     ・[10097] tkmakwins15 
     ・[10098] 管理人 
     ・[10114] chunezu 

Name: pipi  ..ぴよぴよ(178ポイント)   Date: 2007/09/18(火) 11:15   No:10533       
Title: エラーの内容がどうしても分かりません。    
申し訳ありません、このサイトで勉強しております。初心者なので教えてください。
VC2005を使ってプログラミングをしております。
エラーは、以下のようになっております。
見づらいと思いますが、ご親切な方、よろしくお願いします。

c:\program files\microsoft platform sdk\include\mmreg.h : warning C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存してください。

c:\documents and settings\yu-ki-pippi\デスクトップ\dxlib_vc\サンプルプログラム実行用フォルダ\dxlib.h(1529) : warning C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存してください。

c:\documents and settings\yu-ki-pippi\デスクトップ\dxlib_vc\サンプルプログラム実行用フォルダ\test.cpp(6) : error C3872: '0x3000': この文字を識別子で使用することはできません

c:\documents and settings\yu-ki-pippi\デスクトップ\dxlib_vc\サンプルプログラム実行用フォルダ\test.cpp(7) : error C2144: 構文エラー : 'int' は ';' によって先行されなければなりません。

c:\documents and settings\yu-ki-pippi\デスクトップ\dxlib_vc\サンプルプログラム実行用フォルダ\test.cpp(7) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません

c:\documents and settings\yu-ki-pippi\デスクトップ\dxlib_vc\サンプルプログラム実行用フォルダ\test.cpp(7) : error C3872: '0x3000': この文字を識別子で使用することはできません

c:\documents and settings\yu-ki-pippi\デスクトップ\dxlib_vc\サンプルプログラム実行用フォルダ\test.cpp(7) : error C3872: '0x3000': この文字を識別子で使用することはできません

c:\documents and settings\yu-ki-pippi\デスクトップ\dxlib_vc\サンプルプログラム実行用フォルダ\test.cpp(8) : error C2144: 構文エラー : 'int' は ';' によって先行されなければなりません。

c:\documents and settings\yu-ki-pippi\デスクトップ\dxlib_vc\サンプルプログラム実行用フォルダ\test.cpp(8) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません

ブラウザ情報ファイルを作成しています...
Microsoft Browse Information Maintenance Utility Version 8.00.50727
Copyright (C) Microsoft Corporation. All rights reserved.
ビルドログは "file://c:\Documents and Settings\yu-ki-pippi\デスクトップ\DxLib_VC\サンプルプログラム実行用フォルダ\Debug\BuildLog.htm" に保存されました。
DxLib - エラー 7、警告 2



178ポイント を手に入れた。


Name: GPGA  ..プログラマー(36,764ポイント)   Date: 2007/09/18(火) 11:30   No:10534     
Title: Re:エラーの内容がどうしても分かりません。    
6行目と7行目に全角スペースが入っているからエラーが出ています。

27ポイント を手に入れた。

Name: pipi  ..ぴよぴよ(280ポイント)   Date: 2007/09/18(火) 12:59   No:10535 解決!     
Title: ご回答ありがとうございました。    
>GPGAさん

素早いご回答ありがとうございました。

仰っられた通り、全角スペースが入っていたためでした。

大変助かりました^^。

また、質問をすると思いますので、その時はよろしくお願いします。


102ポイント を手に入れた。



Name: ボーラン堂  ..ぴよぴよ(52ポイント)   Date: 2007/09/17(月) 14:58   No:10518       
Title: 無題    
こんにちは.
管理人さんの『ゲームプログラミングの館』を
参考にして勉強しています.

ところが,実はまだセッティングの
段階でつまづいています.


コードギアホームページから
BCCCompilerをダウンロードしました.

そして,
ダウンロードの際に
個人情報を送信して
コードギアから返信されてきた
メールには
「ダウンロードファイルを開くには
以下のパスワードを入力してください」

と書いてあり,
パスワードを入手しましたが
このパスワードを
どこで使用するのかが
解かりません.


保存したダウンロードファイルを
クリックすると,
"freecommadlinetools"

という
空のフォルダが
作成されただけでした.

解凍ソフトの”ALLadin Expander”
にも入れてみましたが
うまくいきませんでした.


52ポイント を手に入れた。


Name: 管理人 [URL]  ..伝説のハッカー(408,536ポイント)   Date: 2007/09/17(月) 16:06   No:10520     
Title: Re:無題    
ゲームプログラミングの館の0節にコンパイラの導入について書いています。

コンパイラはBCCよりマイクロソフト製のVC++がオススメです。


86ポイント を手に入れた。

Name: tkmakwins15 [URL]  ..上級者(23,512ポイント)   Date: 2007/09/17(月) 20:30   No:10524     
Title: Re:無題    
BCCのダウンロードは難しくなりましたね。これでできるのではないでしょうか。
http://www.codegear.com/jp/downloads/free/cppbuilder
から
Borland C++Compiler / Turbo Debugger
というところに入ります。
そしてユーザー登録して、登録したところにメールが来ます。
次に、ダウンロードのとこクリックします、すると保存するとか実行するとかダイアログ出てくるので、
そこで実行クリック。
そうするとパスワードの入力画面が出てくるはずです。
解凍ソフトをLhacaにするといいかもしれません。
http://park8.wakwak.com/~app/Lhaca/
のLhaca076.EXEをクリックしてください。


199ポイント を手に入れた。



Name: 天丼  ..ぴよぴよ(240ポイント)   Date: 2007/09/16(日) 13:24   No:10494       
Title: コマンドライン引数    
本で学習しています。
コマンドラインから引数をつけてプログラムを実行すると、
main()関数の引数にプログラム自身のファイル名と
コマンドライン引数の情報が入るプログラムです。

問題は実行画面で cmdparam.exe enum orange apple と入力したいのに
続行するには何かキーを押して下さいと出るだけでプログラムが終了してしまうことです。

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[])
{
int i;
if(argc<=1)
return;
if(strcmp(argv[1],"enum")==0)
for(i=0;i<argc;i++)
printf("argv[%d] : %s\n",i,argv[i]);
else if(strcmp(argv[1],"count")==0)
printf("コマンドライン引数の数:%d\n",argc-1);
}

本の実行画面では
cmdparam.exe enum orange appleと入力してenterを押すと

argv[0] : cmdparam.exe
argv[1] : enum
argv[2] : orange
argv[3] : apple

cmdparam.exe count orange appleと入力してenterを押すと
コマンドライン引数の数 : 3
と表示されています。


240ポイント を手に入れた。


Name: たかぎ [URL]  ..中級者(11,533ポイント)   Date: 2007/09/16(日) 14:24   No:10498     
Title: Re:コマンドライン引数    
ちゃんと動いていますよ。

> 続行するには何かキーを押して下さいと出るだけでプログラムが終了してしまうことです。

環境も分かりませんし、現象を再現することができませんでした。


11ポイント を手に入れた。

Name: toyo  ..入門者(4,966ポイント)   Date: 2007/09/16(日) 18:51   No:10501     
Title: Re:コマンドライン引数    
何かの開発環境から直接プログラムを実行しているようですね
コマンドラインというのはコマンドプロンプトという黒い画面のウィンドウを開いてそこに入力するということです。
でもディレクトリを移動やファイル一覧を表示といった基礎的なコマンド等を知っていないとちょっときびしいかも。


32ポイント を手に入れた。

Name: 天丼  ..ぴよぴよ(262ポイント)   Date: 2007/09/17(月) 15:20   No:10519     
Title: Re:コマンドライン引数    
開発環境は
windows vista home premium
vc++2005 express edition
です。


22ポイント を手に入れた。



Name: 夏天 [URL]  ..初心者(5,887ポイント)   Date: 2007/09/16(日) 13:10   No:10493       
Title: ジョイパッドについて    
ジョイパッドのキー割り当ては
PAD_INPUT_BがキーボードのXになっていますよね?
これをZに変えるにはどうすればよいのでしょうか
ヘッダファイルを弄らなければならないのでしょうか


21ポイント を手に入れた。


Name: Justy  ..ハッカー(163,772ポイント)   Date: 2007/09/16(日) 14:24   No:10499     
Title: Re:ジョイパッドについて    
 ジョイパッドは持ってないので、確証はないと断った上で。
 
 GetJoypadInputState()に DX_INPUT_KEYとか DX_INPUT_KEY_PAD1を指定した場合の話ですか?
 う〜ん、DxLibMakeの方のソースを修正して、ビルドし直すしかないような・・・。


 でも同様のことをやりたいのであればパッドの判定は DX_INPUT_KEYとかを指定しないで行い、
それとは別にGetHitKeyStateAll()などで自分でキー判定すればいいだけなのでは?

if(パッドのBが押された || キーボードのZが押された)
{
}
 みたく。


132ポイント を手に入れた。

Name: 夏天 [URL]  ..初心者(5,890ポイント)   Date: 2007/09/17(月) 11:43   No:10513 解決!     
Title: Re:ジョイパッドについて    
ありがとうございます
頑張ってみます


3ポイント を手に入れた。



Name: tkmakwins15 [URL]  ..上級者(22,144ポイント)   Date: 2007/09/15(土) 09:29   No:10465       
Title: newのオーバーロード    
配列型newで確保したメモリを拡張、収縮したい時に、newのオーバーロードで対処したいのですが、
どうしてもエラーになります。一体どこに問題があるのでしょうか。教えてもらえないでしょうか。

template<class type>
void *operator new[](size_t size,type* pointer,size_t beforesize)
{
type *temp;
temp=new type[size];
memcpy(temp,p,beforesize);
delete[] p;
return temp;
}

第一引数に変更後のサイズ、第二引数に変更するメモリブロックのポインタ。第三引数に変更前のサイズ。という意図です。
この状態ではメモリを減らす時の事はまだ考慮していません。


197ポイント を手に入れた。


Name: Justy  ..ハッカー(162,186ポイント)   Date: 2007/09/15(土) 12:00   No:10466     
Title: Re:newのオーバーロード    
どうしてもエラーになります
 そのエラーはどういうエラーなのでしょうか?

 とりあえず見た感じでは 変数pが定義されていないように見えます。
 pを pointerにすれば "コンパイル" は通るはずです。

 実行時の問題に関しては未完とのことなのでここでは言及はしませんが、
エラーが実行に発生するのであれば、言って下さい。


配列型newで確保したメモリを拡張、収縮したい時に、newのオーバーロードで対処
 std::vectorは使わないのですか?
 普通そういう用途で operator new[]を定義しようとはしないものなのですが。


148ポイント を手に入れた。

Name: tkmakwins15 [URL]  ..上級者(22,357ポイント)   Date: 2007/09/15(土) 12:26   No:10467     
Title: Re:newのオーバーロード    
>普通そういう用途で operator new[]を定義しようとはしないものなのですが。

今まさにSTLの勉強中で、まだしっかりとは扱えないので、何とかしてnewで今は対処する事にしています。一番いいのはvectorクラスの使用なのですが。
もともとmalloc→reallocという処理の流れを書き換えている作業なので、どうにかして演算子単位で解決したほうがdelete[]による開放だとわかりやすくなるのではと思ってオーバーロードしています。

もしかして呼び出し側に問題があるのではないでしょうか。

int main()
{
int *temp;
temp=new int[10];
temp=new int(temp,10)[30];
delete []temp;
return 0;
}

これはサンプルです。書き換えのテストをやっているコードです。


213ポイント を手に入れた。

Name: Justy  ..ハッカー(162,138ポイント)   Date: 2007/09/15(土) 12:34   No:10468     
Title: Re:newのオーバーロード    
 呼び出し側に問題有りです。

temp=new(temp,10) int[30];

 こうです。


48ポイント を落としてしまった。

Name: tkmakwins15 [URL]  ..上級者(22,385ポイント)   Date: 2007/09/15(土) 12:38   No:10469 解決!     
Title: Re:newのオーバーロード    
ありがとうございます。何とかコンパイル通りました。

2倍のポイントを手に入れた! 28ポイント を手に入れた。

Name: Justy  ..ハッカー(162,268ポイント)   Date: 2007/09/15(土) 12:42   No:10470     
Title: Re:newのオーバーロード    
malloc→reallocという処理の流れ
 なるほど。
 それでいろいろ謎がわかりました。

 C互換型のオブジェクトが前提だから memcpyだったのですね。
(C++で memcpyは不味いなー、と思っていたので)


130ポイント を手に入れた。

Name: tkmakwins15 [URL]  ..上級者(22,431ポイント)   Date: 2007/09/15(土) 13:42   No:10471     
Title: Re:newのオーバーロード    
>(C++で memcpyは不味いなー、と思っていたので)

エッ、まずいんですか!?僕は平気でCライブラリ関数乱用してますけど…。


46ポイント を手に入れた。

Name: Justy  ..ハッカー(162,997ポイント)   Date: 2007/09/15(土) 14:12   No:10472     
Title: Re:newのオーバーロード    
まずいんですか!?
 Cと互換性を持つオブジェクトなら大丈夫です。

 が、問題はCと互換のないオブジェクト・・・例えばデストラクタがある、参照メンバ変数があるとか・・・
の場合、memcpyのようなものでコピーするとビット的には正しくコピーされるかもしれませんが、
オブジェクトとして正当なものになるかは保証はありません。

 C++でコピーを行う場合は std::copyのように型に応じてコピーしないと
トラブルの元になるかもしれません。
 例えば以下のように。

#include <cstring> 


struct TestClass
{
TestClass() : i(new int()) {}
TestClass(int v) : i(new int(v)) {}
TestClass(const TestClass& a) : i(new int(*(a.i))) {}
~TestClass() { delete i; }

TestClass& operator =(const TestClass& rhs)
{
if(this != &rhs)
{
delete this->i;
this->i = new int(*rhs.i);
}
return *this;
}
private:
int *i;
};

int main(void)
{
TestClass a(5);
TestClass b;
b = a; // 正当

TestClass *c = new TestClass;
std::memcpy(c, &a, sizeof(TestClass));
delete c; // この deleteの結果・・・

return 0;
}


 最後の delete cの後、aのデストラクタが動いたらどうなることやら。


#追記
 このサンプルでは例外は考慮に入れていません。


729ポイント を手に入れた。

Name: tkmakwins15 [URL]  ..上級者(22,544ポイント)   Date: 2007/09/15(土) 14:23   No:10473     
Title: Re:newのオーバーロード    
組み込み型であれば大丈夫ですよね。まだクラスは普通に静的に実体を作るぐらいの事しかやっていません。std::copyはSTLのアルゴリズム関数でしょうか。

>最後の delete cの後、aのデストラクタが動いたらどうなることやら。

行く果ては2重deleteによるメモリ破壊につながるのでしょうか?


113ポイント を手に入れた。

Name: Justy  ..ハッカー(163,117ポイント)   Date: 2007/09/15(土) 14:39   No:10474     
Title: Re:newのオーバーロード    
組み込み型であれば大丈夫ですよね
 なら大丈夫です。

std::copyはSTLのアルゴリズム
 そうです。
 あれはちゃんと operator=を使ってコピーするので、実装に問題がなければ
正当なコピーを行います。

行く果ては2重deleteによるメモリ破壊につながるのでしょうか
 ええ、メモリ破壊されるかどうかは環境次第ですが、リーク&二重解放になりますです。


120ポイント を手に入れた。

Name: tkmakwins15 [URL]  ..上級者(22,619ポイント)   Date: 2007/09/15(土) 17:31   No:10475     
Title: Re:newのオーバーロード    
>あれはちゃんと operator=を使ってコピーするので、実装に問題がなければ
>正当なコピーを行います。

ということは動的メモリ確保や動的インスタンスをメンバに持つ場合、
代入演算子をオーバーロードしなければエラーになるということでしょうか


75ポイント を手に入れた。

Name: Justy  ..ハッカー(163,602ポイント)   Date: 2007/09/15(土) 18:11   No:10477     
Title: Re:newのオーバーロード    
ということは動的メモリ確保や動的インスタンスをメンバに持つ場合、
代入演算子をオーバーロードしなければエラーになるということでしょうか
 エラーというのは operator=()が定義されていないからエラーという意味でしょうか?
 そういう意味でしたら組込型にしてもC互換オブジェクトにしても、或いは operator=()
定義していないクラスにしても operator=()は暗黙に定義されていますから、
(コンパイル)エラーにはなりません。


 ただ、実行時での話となると、例えば上の TestClassの例だと operator =()を削除したら、
main関数での b = aの処理以降、aと bのメンバ iは同じポインタ値になるので、どちらかのデストラクタが
動いた段階でもう一方のオブジェクトは "爆弾" と化します。

 というわけで、こういうクラスのような場合はoperator=()を定義するとか、スマートポインタを使うとか、
或いは根本的にオブジェクトのコピーを禁止するとか、何らかの対処は必要になりますね。


485ポイント を手に入れた。

Name: たかぎ [URL]  ..中級者(11,262ポイント)   Date: 2007/09/15(土) 18:21   No:10479     
Title: Re:newのオーバーロード    
大きなお世話な気もしますが...

> 実装に問題がなければ正当なコピーを行います。

念のため指摘しておくと、
>    TestClass& operator =(const TestClass& rhs)

> {
> if(this != &rhs)
> {
> delete this->i;
> this->i = new int(*rhs.i);
> }
> return *this;
> }


は、問題がありますね。
というのも、this->i を delete してから new に失敗すると、このオブジェクトは破綻してしまうからです。


81ポイント を落としてしまった。

Name: Justy  ..ハッカー(163,640ポイント)   Date: 2007/09/15(土) 18:32   No:10480     
Title: Re:newのオーバーロード    
> 問題がありますね
 それはその通りですね。
 このサンプルでは例外を考慮に入れていません。

 ちょっと一文いれておきます。


38ポイント を手に入れた。

Name: tkmakwins15 [URL]  ..上級者(22,642ポイント)   Date: 2007/09/15(土) 18:44   No:10482     
Title: Re:newのオーバーロード    
この実装だと、newが失敗すると破綻どころか例外が捕獲できないのでプログラムが以上終了するような気がします。

例外を起こすと問題になる場所でのnewはnothrow形式のnewを使っています。
NULLで帰ってくればifで捕まえてエラー番号を格納するメンバ変数にそれを通知するように実装しています。


23ポイント を手に入れた。

Name: たかぎ [URL]  ..中級者(11,411ポイント)   Date: 2007/09/15(土) 20:38   No:10483     
Title: Re:newのオーバーロード    
> この実装だと、newが失敗すると破綻どころか例外が捕獲できないのでプログラムが以上終了するような気がします。

そんなことはありません。
例外を捕獲するのは、operator= の内部ではなく、それを呼び出した側で行う必要があります。
もちろん、this->i は解放済みのポインタ値が設定されたまま、それ以降は行き詰りますし、おそらくデストラクタで二重解放する羽目になるでしょう。

> 例外を起こすと問題になる場所でのnewはnothrow形式のnewを使っています。
> NULLで帰ってくればifで捕まえてエラー番号を格納するメンバ変数にそれを通知するように実装しています。

この方法を使うと、代入演算子を使うたびにエラー番号の確認が必要になり、非常に面倒です。
そして、おそらくエラー処理を時々忘れることになります。


149ポイント を手に入れた。

Name: tkmakwins15 [URL]  ..上級者(22,695ポイント)   Date: 2007/09/15(土) 20:58   No:10484     
Title: Re:newのオーバーロード    
>この方法を使うと、代入演算子を使うたびにエラー番号の確認が必要になり、非常に面倒です。
>そして、おそらくエラー処理を時々忘れることになります。

それはまずいですね。ということは例外を投げるほうがコーディングとしてもよくなるということですね。

後、やはりmallocはnewで置き換えるよりも、vectorクラスで置き換えたほうがいいのでしょうか。


53ポイント を手に入れた。

Name: たかぎ [URL]  ..中級者(11,468ポイント)   Date: 2007/09/15(土) 23:11   No:10485     
Title: Re:newのオーバーロード    
> ということは例外を投げるほうがコーディングとしてもよくなるということですね。

何らかの事情で例外が使えないのでない限り、例外を送出する方がよいですね。

> やはりmallocはnewで置き換えるよりも、vectorクラスで置き換えたほうがいいのでしょうか。

はい。これも、何らかの事情で std::vector が使えない状況でない限り、std::vector を使う方がよいと思います。


57ポイント を手に入れた。

Name: YuO  ..中級者(12,137ポイント)   Date: 2007/09/16(日) 02:19   No:10491     
Title: Re:newのオーバーロード    
Cでmalloc/realloc等を使っていた場合でstd::vectorを使わないのは,std::stringとかstd::wstringを使う場合くらいですかね。
文字列に関しては,\0終端の文字列を代入できたりと,std::vectorよりも便利な事があります。


思いっきり元の話を蒸し返すようですが,operator new[]でreallocのかわりをすることは無理ですよ。
operator new[]の戻り値とnew[]の戻り値は異なることがあるので。
次のコードは,VC++ 2005 Professional環境下で異なる戻り値になる例です。

#include <cstdlib>
#include <cstdio>

class foo
{
private:
int val_;
public:
foo (int val = 0) : val_(val)
{
std::printf("%p : foo.ctor\n", reinterpret_cast<void*>(this));
}
~foo ()
{
std::printf("%p : foo.dtor\n", reinterpret_cast<void*>(this));
}
};

void * operator new[] (std::size_t size)
{
void * p = std::malloc(size);
std::printf("%p : op.new[] (%u)\n", p, static_cast<unsigned>(size));
return p;
}

void operator delete[] (void * ptr)
{
std::printf("%p : op.delete[]\n", ptr);
std::free(ptr);
}

int main ()
{
foo * p = new foo[1];
std::printf("%p : new[] result\n", reinterpret_cast<void *>(p));
delete[] p;
return 0;
}
ちなみに,手元での実行結果は,
003A5BE0 : op.new[] (8)

003A5BE4 : foo.ctor
003A5BE4 : new[] result
003A5BE4 : foo.dtor
003A5BE0 : op.delete[]
でした。
# VC++ 2005 Professionalで確認。
VC++ 2005の場合はデストラクタがなければoperator new[]の戻り値とnew[]の戻り値が一致するようですが。
# つまり,Cの構造体であれば一致するようです。

ただ,operator new/operator new[]が確保した領域に何らかの値を書き込んだ場合に,
コンストラクタの実行やnew/new[]から制御が返った時点において書き込まれた値が保持され続けている保証について,
標準を軽く読んだ程度では見つけられませんでした。


464ポイント を手に入れた。

Name: tkmakwins15 [URL]  ..上級者(22,744ポイント)   Date: 2007/09/16(日) 13:57   No:10495     
Title: Re:newのオーバーロード    
newの中で新たに要求したサイズ分新たに確保して、受け取ったもともとの動的インスタンスをコピーして、受け取ったほうを開放するというやり方では無理でしょうか。

49ポイント を手に入れた。

Name: たかぎ [URL]  ..中級者(11,522ポイント)   Date: 2007/09/16(日) 14:20   No:10497     
Title: Re:newのオーバーロード    
> operator new[]でreallocのかわりをすることは無理ですよ。

必ずしも無理ではないですよ。
確かに、operator new[] の返却値と、それを用いた new 式の結果がずれる場合がありますが、delete 式によって operator delete[] が呼び出される際には、operator new[] が返した値が渡されますから。
つまり、使い方を new/delete 式に統一するか、operator new/delete[] に統一することができれば、特に問題はないはずです。

もっとも、わざわざこんな管理が面倒なことをやってまで、new でどうにかする必要は全くないと思います。


54ポイント を手に入れた。

Name: tkmakwins15 [URL]  ..上級者(22,744ポイント)   Date: 2007/09/16(日) 14:30   No:10500     
Title: Re:newのオーバーロード    
やはりこの類の書き換えに使うのはvectorでしょうか。vectorを使えるかどうか検討してみます。



Name: けるびん  ..かけだし(2,027ポイント)   Date: 2007/09/14(金) 09:22   No:10441       
Title: 2万桁の円周率計算    
いつもお世話になってます。

学校で、円周率をからマーチンの公式を使い求めよ。
ただし、最大桁数は2万桁とし、その桁数はコマンドラインから与えられるものとする。

という問題が出たのですが。

自分で作ったものや調べたものは多倍長のプログラム(100桁)
マーチンの公式…π/4=4arctan(1/5)-arctan(1/239)

ぐらいです。

分からないところは求め方のアルゴリズムなんです。

何か質問の内容として足りない部分がありましたら、その部分を言っていただけると幸いです


170ポイント を手に入れた。


Name: TT414  ..ぴよぴよ(253ポイント)   Date: 2007/09/14(金) 11:21   No:10445     
Title: Re:2万桁の円周率計算    
同じ様なものを見つけました。
http://oshiete1.goo.ne.jp/qa3328218.html


41ポイント を手に入れた。

Name: けるびん  ..かけだし(2,095ポイント)   Date: 2007/09/14(金) 22:40   No:10463     
Title: Re:2万桁の円周率計算    
大体の理解はできました。

流れを簡単に言えば
最初にコマンドラインから桁数入力できるようプログラムを書いて
10進数と16進数を組み合わせながら
マーチンの公式を使い円周率を求める

こういう感じでいいでしょうか?


59ポイント を手に入れた。



Name: さば  ..ぴよぴよ(361ポイント)   Date: 2007/09/06(木) 11:07   No:10198       
Title: this修飾子とclass:: 修飾子との違いは?    
例えば、

calss A{
short s;
....

}

A::A(short s){ // class Aのコンストラクタ
A::s = s; // ------@ class Aのコンストラクタの引数をclass Aのメンバーに代入したい。
this->s = s; // ------A class Aのコンストラクタの引数をclass Aのメンバーに代入したい。
}

MS VC2005の場合、両方ともコンパイルできたのですが、
以前から大原則として、コンストラクタの中に"this"を使ってはいけないという記憶を持っていて、
ずーと守ってきました。

それでは
Q1. A::s と this->s とは何が違うのでしょうか?
Q2. コンストラクタの中に"this"を使ってはいけないという大原則はもう敗れてもいい時代になっているのでしょうか?


おしえていただけませんでしょうか。


361ポイント を手に入れた。


Name: さば  ..ぴよぴよ(393ポイント)   Date: 2007/09/06(木) 11:09   No:10199     
Title: Re:this修飾子とclass:: 修飾子との違いは?    
すみません。

訂正:
[誤]敗れてもいい...
[正]破ってもいい...


32ポイント を手に入れた。

Name: たかぎ [URL]  ..初心者(5,863ポイント)   Date: 2007/09/06(木) 18:19   No:10204     
Title: Re:this修飾子とclass:: 修飾子との違いは?    
> 以前から大原則として、コンストラクタの中に"this"を使ってはいけないという記憶を持っていて、

その記憶の出所はどこでしょうか?
私が知る限り、そんな原則は存在しません。


20ポイント を落としてしまった。

Name: さば  ..ぴよぴよ(349ポイント)   Date: 2007/09/06(木) 18:34   No:10206     
Title: Re:this修飾子とclass:: 修飾子との違いは?    
> その記憶の出所はどこでしょうか?
> 私が知る限り、そんな原則は存在しません。

私の理解ではコンストラクタの時点ではthis(classのobject)がまだ生成されてないため、使えないわけですけれども。
これは私の想像ではないと思います。






44ポイント を落としてしまった。

Name: たかぎ [URL]  ..初心者(6,151ポイント)   Date: 2007/09/06(木) 19:03   No:10207     
Title: Re:this修飾子とclass:: 修飾子との違いは?    
> 私の理解ではコンストラクタの時点ではthis(classのobject)がまだ生成されてないため、使えないわけですけれども。

その情報の出所を知りたいですね。

ISO/IEC 14882:2003の9.3.1 Nonstatic member functionsから引用すると、

When an id-expression (5.1) that is not part of a class member access syntax (5.2.5) and not used to form a
pointer to member (5.3.1) is used in the body of a nonstatic member function of class X or used in the
mem-initializer for a constructor of class X, if name lookup (3.4.1) resolves the name in the id-expression to
a nonstatic nontype member of class X or of a base class of X, the id-expression is transformed into a class
member access expression (5.2.5) using (*this) (9.3.2) as the postfix-expression to the left of the .
operator.

とあり、(コンストラクタを含む)非静的メンバ関数の中で、クラスメンバアクセス構文を使わずに直接メンバを触る場合は、(*this).メンバ と書くのと同じことになります。
つまり、明示的に this を書く書かないに関わらず、this が使われることになるわけです。


288ポイント を手に入れた。

Name: バグ  ..熟練のプログラマー(57,473ポイント)   Date: 2007/09/06(木) 19:19   No:10208     
Title: Re:this修飾子とclass:: 修飾子との違いは?    
私は、コンストラクタでメンバの初期化処理をしたりしてますが、さばさんの理屈でいくと…コンストラクタが呼ばれた時点でオブジェクトが存在してないという事は、コンストラクタの中では何もできない事になってしまいませんか?

66ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(401,296ポイント)   Date: 2007/09/06(木) 20:11   No:10213     
Title: Re:this修飾子とclass:: 修飾子との違いは?    
このトピにおける投稿に一部規約に違反した文章がありましたので、複数修正いたしました。
またこの掲示板はトップにあります「規約」に準じています。
他にも禁止行為が残っていますので規約を良くお読みになり、禁止行為や義務行為については規約を守った投稿をお願いします。


138ポイント を手に入れた。

Name: さば  ..ぴよぴよ(751ポイント)   Date: 2007/09/07(金) 10:48   No:10236     
Title: Re:this修飾子とclass:: 修飾子との違いは?    
たかぎ様、バグ様
ご返事有難う御座います。

たかぎ様の文章はとても説得力ありますね。
でも、コンストラクタの中にthisを使ってはいけない記憶も強くて、
大変申し訳御座いませんが、すぐ根拠を出せと言われても出せないんですが、
可能性のあるところを挙げますと
1.MS VC6.0か
2.詳解 C++ 雑誌ではないですけど C MAGAZINE ----ソフトバンク出版
3.解明 C++ ???

いずれも自分が所有する本ではないので、詳しくいえないのです。

ただ、これから調べるつもりです。

管理人さんへ:
お世話になっております。

>このトピにおける投稿に一部規約に違反した文章がありましたので、複数修正いたしました。
これから避けるために
1."一部規約に違反した文章"について一つでも具体的なところをご説明いただけませんか。
2."複数修正いたしました" どんな処でしょうか。

どうぞ宜しくお願いします





402ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(402,262ポイント)   Date: 2007/09/07(金) 11:10   No:10238     
Title: Re:this修飾子とclass:: 修飾子との違いは?    
違反した箇所についてやその他投稿者様の個人情報について公の場で公言しないと規約に書きましたので、具体的な部分についてはメールでお答えいたします。
よろしければ
dixqhp@gmail.com
宛てにメールをお送り下さい。


85ポイント を手に入れた。

Name: なぎ  ..プログラマー(26,281ポイント)   Date: 2007/09/08(土) 08:52   No:10260     
Title: Re:this修飾子とclass:: 修飾子との違いは?    
コンストラクタの中では、オブジェクトの生成は*完了していない*のは確かです。
ただし、this は、コンストラクタに入った時点では存在しています。

コンストラクタの入り口では、少なくとも、将来オブジェクトになるはずの領域だけは確保されていて、その後で、いわゆる初期化が行われて、オブジェクトの生成が完了することになります。

この点が話題になるのは、コンストラクタ内で例外をスルーできるかどうかというようなことですね。
例外がスルーされると、「構築の完了したオブジェクト」は暗黙のうちにデストラクトされるわけですが、コンストラクタ内で例外がスルーされると、未構築のオブジェクトが残骸となって残ってしまうというわけです。



248ポイント を手に入れた。

Name: たかぎ [URL]  ..初心者(6,212ポイント)   Date: 2007/09/08(土) 21:38   No:10269     
Title: Re:this修飾子とclass:: 修飾子との違いは?    
コンストラクタからの例外送出に関しては、(手前味噌ですが)下記で解説しています。
http://www.kijineko.co.jp/tech/superstitions/dont-throw-exception-from-constructor.html


61ポイント を手に入れた。

Name: さば  ..ぴよぴよ(829ポイント)   Date: 2007/09/10(月) 09:33   No:10329 解決!     
Title: Re:this修飾子とclass:: 修飾子との違いは?(さすが! お礼)    
たかぎ様に膝まずくしかできない!

「生成は完了していない」という記憶と「コンストラクタ内で例外をスルーできない」
記憶の間から、なんと「this」を使ってはいけないという"記憶"が生まれてしまいました。
そしてずーと守ってきたのです!


>この点が話題になるのは、コンストラクタ内で例外をスルーできるかどうかというようなことですね。
>例外がスルーされると、「構築の完了したオブジェクト」は暗黙のうちにデストラクトされるわけですが、コ>ンストラクタ内で例外がスルーされると、未構築のオブジェクトが残骸となって残ってしまうというわけです。

!!!

ほんとうにいい勉強になりました。


78ポイント を手に入れた。

Name: たかぎ [URL]  ..初心者(6,968ポイント)   Date: 2007/09/10(月) 10:25   No:10330     
Title: コンストラクタからの例外送出    
もしかすると誤解があるといけませんので念のため。

コンストラクタの中でエラーが発生した場合は、例外を送出することで外部に通知すべきです。

先に紹介したリンク先でも解説していますが、コンストラクタが失敗したということは、そのオブジェクトは未生成です。
オブジェクトの中に状態フラグのようなものを持たせたとしても、未生成のオブジェクトを操作して、フラグの値を参照するのはナンセンスだからです。


146ポイント を手に入れた。

Name: さば  ..かけだし(1,292ポイント)   Date: 2007/09/11(火) 11:27   No:10361     
Title: Re:コンストラクタからの例外送出(あっ、そう言えば)    
たかぎ 様
ご教授本当に有難うございます。

この前頂いたページの中に以下のような事が書かれております。
1. ★「オブジェクトの生存期間というのは、コンストラクタの処理が完了した時点から始まります。
生まれていないものが(デストラクタによって)死ぬことはナンセンスですし、生まれていないものに対して、
何らかの操作を行うのも同じくナンセンスです。」

この文脈からしますと、やはり、コンストラクタの処理が完成していない時に、
object(classのinstance)が生成されていないようですね。
Q1. にも関わらず、 objectを指すpointerが先行して生成されるのでしょうか。

2.★「また、コンストラクタが失敗したことを通知する一般的な手段は例外しかありません。」
Q2. これも"コンストラクタ内で例外をスルーできない"に矛盾するような感じですね

実際、私が作ったclassのコンストラクタの中で結構いろいろな処理をやっています。
例外や失敗を発生する可能性は十分あります。

Q3.コンストラクタの中で発生した例外や失敗をどうやってclassの生成側に知らせるのでしょうか
(コンストラクタにはreturn値を持たないですね)

また宜しくお願い申し上げます


463ポイント を手に入れた。

Name: たかぎ [URL]  ..初心者(8,322ポイント)   Date: 2007/09/11(火) 11:34   No:10362     
Title: Re:コンストラクタからの例外送出(あっ、そう言えば)    
> Q1. にも関わらず、 objectを指すpointerが先行して生成されるのでしょうか。

生成が完了していないことと、それを指すポインタが利用できるかどうかは話が別です。
何らかの方法で生成しようとしているオブジェクトにアクセスできなければ、生成そのものができません。

> Q2. これも"コンストラクタ内で例外をスルーできない"に矛盾するような感じですね

ですから、コンストラクタから例外は送出できるのです。

> Q3.コンストラクタの中で発生した例外や失敗をどうやってclassの生成側に知らせるのでしょうか
> (コンストラクタにはreturn値を持たないですね)

例外を送出することで通知します。


86ポイント を手に入れた。

Name: さば  ..かけだし(1,348ポイント)   Date: 2007/09/11(火) 13:00   No:10365     
Title: Re:コンストラクタからの例外送出(一点だけご確認させてください)    
たかぎ様が言われた「送出」ということは「スルー」ではないですね?
私は「スルー」として理解していますが。


また宜しくお願い申し上げます。


56ポイント を手に入れた。

Name: YuO  ..中級者(11,620ポイント)   Date: 2007/09/11(火) 13:06   No:10366     
Title: Re:コンストラクタからの例外送出(一点だけご確認させてください)    
> たかぎ様が言われた「送出」ということは「スルー」ではないですね?
> 私は「スルー」として理解していますが。

スルーとは?
たかぎさんの言われる「送出」とは,例外をthrowすることだと思います。
ISO/IEC 14882の「throw」に相当する部分はJIS X 3014でも「送出」を使っているので,間違いないでしょう。

逆に,例外を「スルー」するという表現は初めて見ました。

ちなみに,throwはカタカナで書くなら通常「スロー」です。


116ポイント を手に入れた。

Name: たかぎ [URL]  ..初心者(8,436ポイント)   Date: 2007/09/11(火) 13:13   No:10367     
Title: Re:コンストラクタからの例外送出(一点だけご確認させてください)    
> たかぎさんの言われる「送出」とは,例外をthrowすることだと思います。
> ISO/IEC 14882の「throw」に相当する部分はJIS X 3014でも「送出」を使っているので,間違いないでしょう。

はい、そのとおりです。


9ポイント を手に入れた。

Name: たかぎ [URL]  ..初心者(8,524ポイント)   Date: 2007/09/11(火) 13:44   No:10368     
Title: Re:コンストラクタからの例外送出(一点だけご確認させてください)    
> 逆に,例外を「スルー」するという表現は初めて見ました。

私は throw の意味だと解釈していましたが、もしかすると例外を catch せずに through するという意味だったのかもしれませんね。

A::A()
{
func(); // ← ここで発生した例外を catch せず、呼び出し元にそのまま伝播するという意味?
}

 


88ポイント を手に入れた。

Name: さば  ..かけだし(1,570ポイント)   Date: 2007/09/11(火) 14:07   No:10369     
Title: Re:コンストラクタからの例外送出(一点だけご確認させてください)    
>たかぎさんの言われる「送出」とは,例外をthrowすることだと思います。
私もそういうふうに理解していました。
そうしますと、
「コンストラクタ内で例外がスルーされると、未構築のオブジェクトが残骸となって残ってしまうというわけです。 (さば注:後にリークになりかねます)」という説もありまして、結局、コンストラクタ内で例外がスルー(= throw = 送出)はいけないことになるのでは、という質問になりますね。

私の誤解かもしれませんが、またご指導お願い致します。


222ポイント を手に入れた。

Name: たかぎ [URL]  ..初心者(8,648ポイント)   Date: 2007/09/11(火) 14:20   No:10370     
Title: Re:コンストラクタからの例外送出(一点だけご確認させてください)    
> 「コンストラクタ内で例外がスルーされると、未構築のオブジェクトが残骸となって残ってしまうというわけです。 (さば注:後にリークになりかねます)」という説もありまして、結局、コンストラクタ内で例外がスルー(= throw = 送出)はいけないことになるのでは、という質問になりますね。

リークするから例外を送出してはいけないのではなく、例外が送出されてもリークが起こらないように実装しなければならないのです。
また、下手糞な設計やコーディングによってリークが発生するのは、何もコンストラクタに限ったことではありません。


2倍のポイントを手に入れた! 124ポイント を手に入れた。

Name: GPGA  ..プログラマー(35,642ポイント)   Date: 2007/09/11(火) 14:43   No:10371     
Title: Re:コンストラクタからの例外送出(一点だけご確認させてください)    
コンストラクタ内で、エラーが発生した際に、リークが起こらないようにし
さらに例外を送出するというのは以下のようなことですか?

#include <iostream>

class A
{
public :
A() {
p1 = NULL;
p2 = NULL;
p1 = new unsigned int[1024 * 1024];
//if (p1 == NULL) { //本当はこちらが正しいが、あえてエラーということにさせる
if (p1 != NULL) {
goto err;
}
p2 = new unsigned int[1024 * 1024];
if (p2 == NULL) {
goto err;
}
return ;

err :
delete[] p2;
delete[] p1;
throw "out of memory";
return ;
}
~A() {
delete[] p2;
delete[] p1;
}
private :
unsigned int* p1;
unsigned int* p2;
};

int main()
{
try {
A* a = new A();
delete a;
} catch (const char* p) {
std::cout << p << std::endl;
}
return 0;
}

 


457ポイント を手に入れた。

Name: さば  ..かけだし(1,696ポイント)   Date: 2007/09/11(火) 14:44   No:10372 解決!     
Title: Re:コンストラクタからの例外送出(なるほど!)    
たかぎ様
良く分かりました。

>リークするから例外を送出してはいけないのではなく、例外が送出されてもリークが起こらないように実装しなければならないのです。
>また、下手糞な設計やコーディングによってリークが発生するのは、何もコンストラクタに限ったことではありません。

そういう意味ですね!

ほんとうに有難うございます。
また宜しくお願い致します。


126ポイント を手に入れた。

Name: たかぎ [URL]  ..初心者(8,769ポイント)   Date: 2007/09/11(火) 14:56   No:10373     
Title: Re:コンストラクタからの例外送出(一点だけご確認させてください)    
> コンストラクタ内で、エラーが発生した際に、リークが起こらないようにし
> さらに例外を送出するというのは以下のようなことですか?

いいえ。
new 式が失敗した場合は、NULL を返すのではなく、std::bad_alloc が例外として送出されます。
ですから、そのコードではリークが発生してしまいます。
以下のようにすることで、リークは回避できます。
A::A()

try
: p1(0), p2(0)
{
p1 = new unsigned int[1024*1024];
p2 = new unsigned int[1024*1024];
}
catch (...)
{
delete[] p1;
delete[] p2;
throw;
}


あるいは、
class A

{
public:
A() : v1(1024*1024, 0), v2(1024*1024, 0) {}
private:
std::vector<unsigned int> v1;
std::vector<unsigned int> v2;
};


のようにしてもよいでしょう。



121ポイント を手に入れた。

Name: GPGA  ..プログラマー(36,006ポイント)   Date: 2007/09/11(火) 14:56   No:10374     
Title: Re:コンストラクタからの例外送出(なるほど!)    
現行のコンパイラで考えると戻り値のNULLチェックより
例外のbad_allocのほうが、もう主流ですかね?

#include <iostream>

class A
{
public :
A() {
p1 = NULL;
p2 = NULL;
try {
p1 = new unsigned int[1024 * 1024];
p2 = new unsigned int[1024 * 1024];
} catch (std::bad_alloc) {
delete[] p2;
delete[] p1;
throw "out of memory";
}
}
~A() {
delete[] p2;
delete[] p1;
}
private :
unsigned int* p1;
unsigned int* p2;
};

int main()
{
try {
A* a = new A();
delete a;
} catch (const char* p) {
std::cout << p << std::endl;
}
return 0;
}
 


364ポイント を手に入れた。

Name: さば  ..かけだし(1,889ポイント)   Date: 2007/09/11(火) 15:03   No:10375 解決!     
Title: Re:コンストラクタからの例外送出(なるほど!)    
GPGA様へ
GPGA様のご返答を見逃したので申し訳ございませんでした!

丁寧な実例コードありがとうございます。
面白い例ですね。どうなるのでしょうか。
経験からしますと、

delete[] p2;
この文にる例外が先に起こって

delete[] p1; と
throw "out of memory";
が実行されないはずです。

ややこしいC言語ですね。
一歩間違えば地獄!
例えば、
銀行業なんかC(C++)で開発する場合、想像だけでも背筋にびりっと寒気が走るほど、、、

また宜しくお願い致します。



193ポイント を手に入れた。

Name: さば  ..かけだし(1,968ポイント)   Date: 2007/09/11(火) 15:13   No:10376     
Title: Re:コンストラクタからの例外送出(なるほど!)    
試しに回答します。

sp = new (nothrow) short[100];
にすれば、メモリ確保失敗の場合、NULLを返します。
さもなければ、throwが起きます。

【どっちが主流になるべきかについて私は回答できませんが】


また宜しくお願い致します


79ポイント を手に入れた。

Name: たかぎ [URL]  ..初心者(8,939ポイント)   Date: 2007/09/11(火) 15:15   No:10377     
Title: Re:コンストラクタからの例外送出(なるほど!)    
> 現行のコンパイラで考えると戻り値のNULLチェックより
> 例外のbad_allocのほうが、もう主流ですかね?

組込み向けのものを除けば、new 式が失敗したときに NULL を返す処理系はもうないと思います。
(NULL を返したいのであれば、std::nothrow を引数として渡す必要があります。)

> delete[] p2;
> この文にる例外が先に起こって

これはなぜでしょう?
delete 演算子が例外を送出することはありませんし、デストラクタは決して例外を送出してはなりません。

> ややこしいC言語ですね。

C++ですね。

> 一歩間違えば地獄!

C/C++では、いい加減なコーディングを行って、動かしてみてバグを見つけるというのは駄目です。
地獄に落ちない設計を行い、道を誤りそうになってもすぐにそれを検出できるように、いろいろ仕掛けをしておく必要がありますね。


170ポイント を手に入れた。

Name: GPGA  ..プログラマー(36,071ポイント)   Date: 2007/09/11(火) 15:21   No:10378     
Title: Re:コンストラクタからの例外送出(なるほど!)    
> たかぎさん
すいません、かぶってしまいました。

>new 式が失敗した場合は、NULL を返すのではなく、std::bad_alloc が例外として送出されます。
>ですから、そのコードではリークが発生してしまいます。
私が保持しているEfective C++の第二版(もう第三版が出てますが)には、新しいコンパイラでも必要であると
判断されたのであれば NULL を返すと記載されていました。もっともこの第二版が出たのは9年も昔なので
あまり当てにできませんが。
返答内容を確認させていただきますと、やはりbad_allocで例外をキャッチするのが当たり前と考えてよさそうですね。

その他コンストラクタの初期化の前に tryを挟むことができることは、初めて知りました。
勉強させていただきました。

二番目に提示していただいた、vectorクラスを使用している部分ですが、テンプレートの第二引数は
確か、標準でstd::allocatorが代入されていたと思うのですが
これをはずすことにどのような意味があるのでしょうか?


>さばさん
最初の提示したコードに関しては、たかぎさんがおっしゃるとおり、bad_allocが例外として投げられ
それが、main内での try〜catch に引っかかるため問題がメモリが開放されずにリークが発生いたします。
2番目に提示したコードでは、たかぎさんからご指摘のあったbad_allocで例外を取得して処理をしています。
ここでキャッチした後のdelete[]文についてですが、C++の規格では、deleteおよび、delete[]の対象が
NULLであった場合、deleteおよび、delete[]は何も処理を行わないというのが決められていたと思います。
コンストラクタの最初で P2にNULLを代入していますので、delete[] p2; で問題が発生することはないと思います。


65ポイント を手に入れた。

Name: たかぎ [URL]  ..中級者(9,163ポイント)   Date: 2007/09/11(火) 15:35   No:10379     
Title: Re:コンストラクタからの例外送出(なるほど!)    
> Efective C++の第二版

第二版の内容はすでに時代遅れになっている部分も多いですね。第三版では、例外安全に関する記述もかなり含まれていたように記憶しています。(例外安全に関しては Exceptinal C++ の方が詳しいですし、分かりやすいかと思います。)

> 二番目に提示していただいた、vectorクラスを使用している部分ですが、テンプレートの第二引数は
> 確か、標準でstd::allocatorが代入されていたと思うのですが
> これをはずすことにどのような意味があるのでしょうか?

今回使用している std::vector のコンストラクタは
template<class InputIterator>

vector(InputIterator first, InputIterator last, const Allocator& a = Allocator());


です。これは本来反復子を渡すためのものですが、実引数の型次第では、
explicit vector(size_type n, const value_type& value = T(),

const Allocator& a = Allocator());


を呼び出したのと同じ意味になります。




224ポイント を手に入れた。

Name: さば  ..かけだし(2,128ポイント)   Date: 2007/09/11(火) 16:03   No:10380     
Title: Re:コンストラクタからの例外送出    
経験談ですけれども、
NULLポインタに対するdelete[]は決して何もしないわけではないようです。
すぐにはthrowしないかもしれませんが、その直後(どの時点については言えませんが)
必ずメモリエラー出ます(プログラムが強制中止されます)
これはVC6.0の時代でも VC2005の時代でも変わらないと思います。
皆さん経験されていません?



160ポイント を手に入れた。

Name: tkmakwins15 [URL]  ..上級者(20,620ポイント)   Date: 2007/09/11(火) 16:15   No:10381     
Title: Re:コンストラクタからの例外送出    
>NULLポインタに対するdelete[]は決して何もしないわけではないようです。
>すぐにはthrowしないかもしれませんが、その直後(どの時点については言えませんが)
>必ずメモリエラー出ます(プログラムが強制中止されます)


それ本当ですか。free(NULL)の場合は何も起きないのはANSI規格で定められていますけど。


116ポイント を手に入れた。

Name: GPGA  ..プログラマー(36,229ポイント)   Date: 2007/09/11(火) 16:21   No:10382     
Title: Re:コンストラクタからの例外送出    
>Exceptinal C++
まだ呼んだことがなかったので早速アマゾンで購入してみました。


>> 二番目に提示していただいた、vectorクラスを使用している部分ですが、テンプレートの第二引数は
>> 確か、標準でstd::allocatorが代入されていたと思うのですが
>> これをはずすことにどのような意味があるのでしょうか?
ここの私の発言はテンプレートとコンストラクタをごちゃ混ぜにしていますね。
後から見て自分でも何を言っているのかわからなかったです。。。


>今回使用している std:vector のコンストラクタは
>template<class InputIterator>
> vector(InputIterator first, InputIterator last, const Allocator& a = Allocator());
このコンストラクタは始めて見ました。
イテレータを扱えるコンストラクタがあったのですね。


158ポイント を手に入れた。

Name: たかぎ [URL]  ..中級者(9,239ポイント)   Date: 2007/09/11(火) 16:24   No:10383     
Title: Re:コンストラクタからの例外送出    
> NULLポインタに対するdelete[]は決して何もしないわけではないようです。
> すぐにはthrowしないかもしれませんが、その直後(どの時点については言えませんが)
> 必ずメモリエラー出ます(プログラムが強制中止されます)

ISO/IEC 14882:2003の5.3.5 Deleteの段落2に

if the value of the operand of delete is the null pointer the operation
has no effect.

とありますから、少なくとも標準規格では、delete[] NULL; は何も行いません。


76ポイント を手に入れた。

Name: たかぎ [URL]  ..中級者(9,357ポイント)   Date: 2007/09/11(火) 16:54   No:10384     
Title: Re:コンストラクタからの例外送出    
> >Exceptinal C++
> まだ呼んだことがなかったので早速アマゾンで購入してみました。

素早いですね。
この本はかなりレベルが高いので、もしかすると読み進めるのにかなり時間がかかるかもしれません。
それでも、一通り読破すれば、C++に関する知識は格段に深まるはずです。


2倍のポイントを手に入れた! 118ポイント を手に入れた。

Name: tkmakwins15 [URL]  ..上級者(20,666ポイント)   Date: 2007/09/11(火) 17:50   No:10385     
Title: Re:コンストラクタからの例外送出    
そうですか、ならばdeleteやdelete[]のあとにNULL代入という技が使えるわけですね。
あるコーディングに関する本に載っていましたので。


46ポイント を手に入れた。

Name: さば  ..入門者(2,605ポイント)   Date: 2007/09/11(火) 19:33   No:10388     
Title: Re:コンストラクタからの例外送出(自分もショックな感想)    
本当にいい勉強になりました。

【以下は自分の苦悩を述べているだけで、CやC++のファインに対する否定ではないです。
[C++やCの歴史的な位置も知っているつもりですけれども]
------技術的な視点からのご批判を期待致します】

A. C(C++)の場合、アルゴリズム以外、言語自身について(センテンスエラーレベルでなくて)
いろいろ考えなければ危険が満ちています。
それに、長い間やってもやはりはっきりしないところ多いです。 (言語自身の変化やバージョンも多い)

B. 各プログラマが言語自身のためのあらゆる安全策を講じることは、
負担が多すぎではないかと思います。

C. 仮に立派な仕組み(メモリの自動的な安全管理、例外発生する時のstack的なメッセージ表示など)を独自で構築できても、所詮Java言語になるのではないでしょうか!?

D. Javaなら、OSでさえ意識しなくてもいいような感じですね------工学や科学領域の処理内容(アルゴリズム)の多くはそもそもOSに依存すべきではないですから。

E. 銀行業なら、Javaを選択するのは賢明に思います。

F. OSやハードを制御するにのみ、(C)C++の強みでしょう。

G. CやC++にある程度経験を持っているつもりだが、やはり完敗! そして無残に!



477ポイント を手に入れた。

Name: たかぎ [URL]  ..中級者(10,043ポイント)   Date: 2007/09/11(火) 21:24   No:10390     
Title: Re:コンストラクタからの例外送出(自分もショックな感想)    
> A. C(C++)の場合、アルゴリズム以外、言語自身について(センテンスエラーレベルでなくて)
> いろいろ考えなければ危険が満ちています。

これは、その通りです。

> それに、長い間やってもやはりはっきりしないところ多いです。 (言語自身の変化やバージョンも多い)

標準規格をよりどころにすることで、かなりすっきりすると思います。
言語自身の変化という意味では、10年前以上前ならともかく、現在では非常に安定しています。(処理系の標準準拠度の問題が残ってはいますが)
少なくとも、Java や C# よりはずっと安定しています。

> B. 各プログラマが言語自身のためのあらゆる安全策を講じることは、
> 負担が多すぎではないかと思います。

C/C++は、半日〜数日程度勉強して、後はリファレンスを見ながら何とかする類の言語ではありません。
いちいち考えながらプログラミングしていたのでは非常に効率が悪いので、安全策に関してはある程度体で覚えることが必須です。

> C. 仮に立派な仕組み(メモリの自動的な安全管理、例外発生する時のstack的なメッセージ表示など)を独自で構築できても、所詮Java言語になるのではないでしょうか!?

C++ には Java にはない強力な機能(テンプレートなど)が備わっています。
それに、Java そっくりな立派な仕組みを作ったとしても、それを「使わない」という選択が可能なことが、C++ の最大の利点ですね。

> D. Javaなら、OSでさえ意識しなくてもいいような感じですね------工学や科学領域の処理内容(アルゴリズム)の多くはそもそもOSに依存すべきではないですから。

それだけ Java は対応可能な環境が限られているということです。Java でも、ちょっと変わった環境に対しては、OS を意識しなければなりません。例えば、JTRON 上のプログラムを書くのであれば、Java であっても OS を意識せざるを得ないでしょう。
C/C++ は、OS 無しの環境から、μITRON のような比較的簡単なカーネルや、Windows や Unix などのフルセットの OS まで対応していますし、OS そのものの記述にも使われるわけですから、ある程度 OS を意識するのはやむを得ないでしょう。
なお、C/C++ でも OS に依存しないプログラムを書くことは可能です。事実、私は仕事で OS に依存しないプログラムを日常的に書いています。

> E. 銀行業なら、Javaを選択するのは賢明に思います。

まあそうなのですが、人命に関わる自動車の制御プログラムは C で書かれているということをお忘れなく。
Java では時間的な制約のあるプログラムを書くのは困難なのです。例えば、ブレーキペダルを踏んだときに GC が走るとどうなるか、想像しただけでも嫌ですよね。

> F. OSやハードを制御するにのみ、(C)C++の強みでしょう。

他にも、先ほど書いたリアルタイム制御(必ずしも OS やハードの話ではありません)や、パフォーマンスが要求される場合は C/C++ ですね。
# Fortran の方がパフォーマンスがよい場合もあるわけですが...


686ポイント を手に入れた。

Name: tkmakwins15 [URL]  ..上級者(21,007ポイント)   Date: 2007/09/11(火) 23:19   No:10392     
Title: Re:コンストラクタからの例外送出(自分もショックな感想)    
>A. C(C++)の場合、アルゴリズム以外、言語自身について(センテンスエラーレベルでなくて)
>いろいろ考えなければ危険が満ちています。

ある程度は安全になった面もあると思いますが、例えば…
コンストラクタ、デストラクタ
参照
STLのコンテナクラス。(特にvectorクラスやstringクラス、メモリリークなどの心配が少ない)
など。

速度はC/C++にかなうものってあるんでしょうか。たぶんアセンブリ言語ぐらいしか思いつきませんが。


115ポイント を手に入れた。

Name: GPGA  ..プログラマー(36,531ポイント)   Date: 2007/09/12(水) 02:05   No:10397     
Title: Re:コンストラクタからの例外送出(自分もショックな感想)    
>たかぎさん

>この本はかなりレベルが高いので、もしかすると読み進めるのにかなり時間がかかるかもしれません。
>それでも、一通り読破すれば、C++に関する知識は格段に深まるはずです。
たかぎさんに「C++に関する知識は格段に深まるはず」とおっしゃっていただけると非常に心強いです。
今後も精進していきたいと思います。

> tkmakwins15さん
最近のC/C++のコンパイラが吐き出す最適化されたバイナリは侮れません。
20年くらい前からやっていたアセンブラプログラマが書くコードなら話は別ですが
私などのように、近年にプログラマになった人であれば、C/C++で書いて
コンパイラに最適化をかけさせたほうが、よほど速く動作します。


222ポイント を手に入れた。

Name: たかぎ [URL]  ..中級者(10,338ポイント)   Date: 2007/09/12(水) 09:45   No:10398     
Title: Re:コンストラクタからの例外送出(自分もショックな感想)    
> tkmakwins15さん
> STLのコンテナクラス。(特にvectorクラスやstringクラス、メモリリークなどの心配が少ない)

メモリリークの心配は少なくなりましたが、要素を追加したときに反復子が無効化するという罠がありますね。
それに、反復子の操作によって例外が送出されたり、一時オブジェクトが生成されたりという注意点も出てきます。

> GPGAさん
> 最近のC/C++のコンパイラが吐き出す最適化されたバイナリは侮れません。
> 20年くらい前からやっていたアセンブラプログラマが書くコードなら話は別ですが
> 私などのように、近年にプログラマになった人であれば、C/C++で書いて
> コンパイラに最適化をかけさせたほうが、よほど速く動作します。

大体の目安としてですが、8ビット CPU の場合であれば、経験の浅いプログラマであっても、おそらくアセンブリ言語で頑張った方が速いコードを書けると思います。
16ビット〜32ビットになってくるとアーキテクチャにかなり依存します。パイプラインやスーパースカラのない CPU であれば、アセンブリ言語で速いコードを書くのもそれほど難しくないでしょう。RISC 用のアセンブラによっては、オペコードの並べ替えや命令の置換などの最適化を行ってくれるものもあるので、何ともいえませんね。


295ポイント を手に入れた。

Name: さば  ..入門者(3,508ポイント)   Date: 2007/09/12(水) 10:21   No:10399     
Title: Re:コンストラクタからの例外送出(お礼+雑談?)    
::> たかぎ 様
とても立派なご返答に心からお礼を申し上げたいです。
一応C/C++でやってよかったという安心感を持ち始めました。
ただ、これからさらなる勉強と磨きが必要だと思います。

-----------------
>> D. Javaなら、OSでさえ意識しなくてもいいような感じですね------工学や科学領域の処理内容(アルゴリズム)の多くはそもそもOSに依存すべきではないですから。

>それだけ Java は対応可能な環境が限られているということです。Java でも、ちょっと変わった環境に対しては、OS を意識しなければなりません。例えば、JTRON 上のプログラムを書くのであれば、Java であっても OS を意識せざるを得ないでしょう。
-----------------
>> C. 仮に立派な仕組み(メモリの自動的な安全管理、例外発生する時のstack的なメッセージ表示など)を独自で構築できても、所詮Java言語になるのではないでしょうか!?

>.....それに、Java そっくりな立派な仕組みを作ったとしても、それを「使わない」という選択が可能なことが、C++ の最大の利点ですね。
-----------------

ご返答に哲学性富んでいます...

::> tkmakwins15 様

-----------------
>>A. C(C++)の場合、アルゴリズム以外、言語自身について(センテンスエラーレベルでなくて)
>>いろいろ考えなければ危険が満ちています。

>....参照 STLのコンテナクラス。(特にvectorクラスやstringクラス、メモリリークなどの心配が少ない)
など。
-----------------

私のようなC 時代から来た人間は「STLのコンテナクラス」のことを忘れがちですね。
これから最大限にSTLのコンテナクラスを利用したいです。

【以下は雑談中の雑談(?)】

*****************************************************************
人間の言語の場合、「言語比較学」あるらしい。
コンピュータ言語もいろいろ比較したら結構面白いのではと感じました。
*****************************************************************

皆さんによく指摘されているJavaのリアルタイム性の問題についてですが、
いつも不思議に思うのは、リアルタイム性のないくせに、なぜ、javaは携帯電話をはじめとして
組み込み系(ハードウェアに直結-----おそらくリアルタイム性が要求される)に
よく利用されているのでしょうかね。

また宜しくお願い致します。


903ポイント を手に入れた。

Name: たかぎ [URL]  ..中級者(10,431ポイント)   Date: 2007/09/12(水) 10:47   No:10400     
Title: Re:コンストラクタからの例外送出(お礼+雑談?)    
> 皆さんによく指摘されているJavaのリアルタイム性の問題についてですが、
> いつも不思議に思うのは、リアルタイム性のないくせに、なぜ、javaは携帯電話をはじめとして
> 組み込み系(ハードウェアに直結-----おそらくリアルタイム性が要求される)に
> よく利用されているのでしょうかね。

携帯電話は専門ではないので、それほど事情に詳しいわけではありませんが...
Java が使われているのは、本当に表面的な部分のアプリケーションだけですよね。下の階層になれば、C + リアルタイム OS が使われているはずです。

これは汎用機などでも言えることで、表面的なアプリケーションは COBOL などで書くとしても、下の階層は、やはり C やアセンブリ言語で書かれているはずです。


93ポイント を手に入れた。

Name: さば  ..入門者(3,630ポイント)   Date: 2007/09/12(水) 13:33   No:10402 解決!     
Title: Re:コンストラクタからの例外送出(お礼+雑談?)    
たかぎ様
ご教授ほんとうにありがとうございました!

>Java が使われているのは、本当に表面的な部分のアプリケーションだけですよね。下の階層になれば、C + リアルタイム OS が使われているはずです。

なるほど。きっとそういうことでしょう。

また宜しくお願い致します


122ポイント を手に入れた。

Name: tkmakwins15 [URL]  ..上級者(21,351ポイント)   Date: 2007/09/12(水) 16:34   No:10405     
Title: Re:コンストラクタからの例外送出(お礼+雑談?)    
>メモリリークの心配は少なくなりましたが、要素を追加したときに反復子が無効化するという罠がありますね。
>それに、反復子の操作によって例外が送出されたり、一時オブジェクトが生成されたりという注意点も出てきます。

そこには新たな危険も満ち溢れているということですね。自分もそこらへんは気をつけるようにします。

>最近のC/C++のコンパイラが吐き出す最適化されたバイナリは侮れません。
>20年くらい前からやっていたアセンブラプログラマが書くコードなら話は別ですが
>私などのように、近年にプログラマになった人であれば、C/C++で書いて
>コンパイラに最適化をかけさせたほうが、よほど速く動作します。

なるほど、「コンパイラの最適化」ということは全く考慮していませんでした。コードをそのままコンパイルした時の速度
を中心に考えていました。


344ポイント を手に入れた。

Name: バグ  ..熟練のプログラマー(58,560ポイント)   Date: 2007/09/13(木) 14:07   No:10423     
Title: Re:コンストラクタからの例外送出(お礼+雑談?)    
>>経験談ですけれども、
>>NULLポインタに対するdelete[]は決して何もしないわけではないようです。
>>すぐにはthrowしないかもしれませんが、その直後(どの時点については言えませんが)
>>必ずメモリエラー出ます(プログラムが強制中止されます)
>>これはVC6.0の時代でも VC2005の時代でも変わらないと思います。
>>皆さん経験されていません?

VC++2005では未確認ですが、VC++6.0では100%エラーが出ますね。
そんな訳で、私の場合はdeleteする前にポインタがNULLでない事を確認するようにしています。


2倍のポイントを手に入れた! 314ポイント を手に入れた。

Name: バグ  ..熟練のプログラマー(58,622ポイント)   Date: 2007/09/13(木) 14:13   No:10424     
Title: Re:コンストラクタからの例外送出(お礼+雑談?)    
1つ前の書き込みですが、100%というのは言い過ぎでした。
今、試してみたら、何故かコンソールアプリではエラーになりませんでした…意味不明です。


62ポイント を手に入れた。

Name: たかぎ [URL]  ..中級者(11,062ポイント)   Date: 2007/09/13(木) 15:23   No:10425     
Title: Re:コンストラクタからの例外送出(お礼+雑談?)    
> VC++2005では未確認ですが、VC++6.0では100%エラーが出ますね。

念のため、VC++6.0で確認してみました。単純なWindowsアプリケーションとMFCの両方を試しましたが、いずれもエラーにはなりませんでした。これまでも、VC++6.0は何度も使っていますが、NULL を delete しておかしくなった記憶はありません。
未初期化のポインタを delete しているとかではないのでしょうか?


2倍のポイントを手に入れた! 216ポイント を手に入れた。

Name: バグ  ..熟練のプログラマー(58,680ポイント)   Date: 2007/09/13(木) 15:44   No:10426     
Title: Re:コンストラクタからの例外送出(お礼+雑談?)    
いえ、間違いなく、コンストラクタ内でNULLを代入して初期化しています。

正直、ここのスレを見るまで、deleteが例外を返さないという事を知らなかったので、NULLチェックをしなければいけないものだと思ってましたし…(^_^;)


58ポイント を手に入れた。

Name: さば  ..入門者(3,700ポイント)   Date: 2007/09/13(木) 16:00   No:10427     
Title: Re:コンストラクタからの例外送出(やっぱり、なにか、、、)    

>未初期化のポインタを delete しているとかではないのでしょうか?
これも犯した経験ありますね。
なぜ、コンパイルの段階で検出してくれないのでしょうか。

このような場合、"すぐ" + "必ず"メモリエラー出るのはまだ幸運なケースで、
怖いのはいつ、どんな形でトラブルが起きるかは分からないというのはC(C++)言語ですね。
定時爆弾の場合、置き場所や爆発時刻に関して少なくとも仕掛けた人は知っているはずですが、
C(C++)言語の場合ですね、その仕掛けた人(プログラマ)でさえ知る由はないということは恐怖きわまり。

銀行業務の場合、C(C++)のこんなトラブルで(いつ発生は分からないですが)一夜にして富豪が貧乏人になる可能性十分あります。(逆に成り立たない----貧乏人は銀行に貯金しないだから)

ブレーキ制御のようなロジック的には簡単で、短いシーケンス制御の場合、デバグやテストと実験は簡単なほうですが、
規模が大きい管理システム(多数人で開発した後、ドッキング)や、アルゴリズム複雑な工学的、科学的な場合、本当に長い間C(C++)と戦う経験者や記憶の優れた人でないと、どうなるでしょうかね。

またも恐怖感が起きてしまいました。


70ポイント を手に入れた。

Name: さば  ..入門者(3,942ポイント)   Date: 2007/09/13(木) 16:27   No:10428     
Title: Re:コンストラクタからの例外送出(やっぱり、なにか、、、(補足))    
追伸:
大規模なアプリケーションの場合(ネット関連、DB関連)、フルケースのテストは不可能な場合もあります。
たとえフルケースのテストできても、C(C++)のメモリ関連の不都合(メモリリークなど)、
必ずしもテストのケースで起きるわけではない、、、、
本格稼動しはじめの時も起きない、、、、
幾つかの条件がそろえば、突然発生します。
そして、わけの分からない形で現れます、、、
なぜ?どうして?どこ?誰のせい?
判明には要時間.....最終的にはアプリケーションを放棄せざるを得ない?
(OS開発史上に実例があったような記憶もありますが)

どうもプログラマの優秀さに任せというのはやはり危険に感じます。
いくら優秀なプログラマでも時には微妙なミスを犯す場合あるでしょう。
それこそ見つかりにくくて、後になって、とんでもないトラブルを起こします。

やはり、
言語自身にはなんらかの仕組みで人間の過ちを防ぐのは正論のような感じですね。
なぜなら、ルールを従う視点からは機械のほうはどんな人間よりも「優秀」ですから。




242ポイント を手に入れた。

Name: たかぎ [URL]  ..中級者(11,260ポイント)   Date: 2007/09/13(木) 17:06   No:10433     
Title: Re:コンストラクタからの例外送出(やっぱり、なにか、、、)    
> またも恐怖感が起きてしまいました。

必要以上に迷信深くなっているような気がします。
自然を相手にしているわけではないので、言語仕様をちゃんと把握していれば何も怖いことはありません。
不可解な動きをすることがあるのは、最適化バグを踏んだときぐらいです(その場合でも、逆アセンブルリストを追えば大体尻尾はつかめます)。

まあ、C/C++ はともかく、癌細胞のようなコードを大量生成してくれる恐怖の自称プログラマに遭遇することは少なくありませんが...。

ところで、ブレーキ制御は思っているほど簡単ではありませんよ。
# ある意味、自然が相手の部分もあるので。


198ポイント を手に入れた。

Name: さば  ..入門者(4,088ポイント)   Date: 2007/09/13(木) 17:20   No:10434     
Title: Re:コンストラクタからの例外送出(やっぱり、なにか、、、)    
::>たかぎ 様
>ブレーキ制御は思っているほど簡単ではありませんよ。

失礼致しました!
動的な過程(慣性システム)を制御することはまさに工学的、科学的なジャンルで、
複雑になる可能性十分あります。
(ただ、多くの簡単なシステムのシーケンス制御は比較的にテストしやすい)



146ポイント を手に入れた。

Name: tkmakwins15 [URL]  ..上級者(21,398ポイント)   Date: 2007/09/13(木) 19:26   No:10436     
Title: Re:コンストラクタからの例外送出(やっぱり、なにか、、、)    
どうしても言語機能だけではミスはカバーできないんですね。どうしても人がプログラミングする以上は、細心の注意を払う必要があるようですね。

63ポイント を落としてしまった。

Name:  ..ぴよぴよ(318ポイント)   Date: 2007/09/14(金) 10:05   No:10442     
Title: Re:コンストラクタからの例外送出(超雑談?)    
>どうしても言語機能だけではミスはカバーできないんですね。どうしても人がプログラミングする以上は、細心の注意を払う必要があるようですね。

それはそのとおりでしょう。
特にロジック的、アルゴリズム的なミスと過ちはまったく人間の責任です。
ただ、それ以外の言語自身の特徴によるミスの性格はいろいろあるでしょう。
業務ロジックの遂行はCOBOLやFortrun、 MATLAB(科学技術系)は最高でしょう。
(言語自身の特徴によるミスの発生しやすさは比較的に低い)

CとC++はCPUのスピードが遅い、メモリ量が少ない時代においてその能率の優秀さは目立っていたのです。
僕も一番親しい感を持ち、馴染んでいる言語はCとC++です。
ただ、時代もCPUも変わっています。少なくとも実行のスピードの面において
現在ではCとJAVAの差はそれほどでもないと主張する人たちはいます。-----恐らくケース・バイ・ケース的でしょう。

JAVAのGCについてある程度制御できれば、
(例えば、クリティカル的な部分に対してGCのactive度合いを抑制できる#progmaのような印を与えばとか)
(現在のJAVAはこのような仕様になっていない?------確認していません)

勿論、少なくともしばらくはC++を使い続けたいです。
しかし、付き合いの年数からすれば、C++には大きな改革の必要性があるような感じですね。
これで、個人的にJAVAのことを注目したいのです。
JAVAは結構中道的で、バランスを取れた適切な言語かなと思います。

ちなみに、JAVAにはGeneric TypeがあってC++のtemplate classに当たるって、、、

それにしても、C++を放棄しろと言われたら、つらいですね。

*************************************************************************
JAVAにしろ、C++にしろ、関数の形に拘り過ぎは開発能率アップの障壁になっています。

表現の自然さと能率からすれば、やはりBATLABは一番汎用性高き、理想なモデルだと思います。
勿論、どの言語も欠点はありますが。
*************************************************************************


318ポイント を手に入れた。

Name: tkmakwins15 [URL]  ..上級者(21,603ポイント)   Date: 2007/09/14(金) 16:47   No:10453     
Title: Re:コンストラクタからの例外送出(超雑談?)    
>勿論、どの言語も欠点はありますが

欠点というのはこのような感じでしょうか?
C → 高度なプログラミングにはポインタがつき物、型チェックが甘い
C++ → 仕様が肥大化したこと、人のミスに対する考慮が薄い
JAVA → 速度の問題?
C# → 特定の環境に依存する。(.NET)
(これぐらいしかわかりません。何しろ中学生ですので。)

言語の使い分けはこのような欠点と利点において最優先すべき利点がある言語を選択するということになるのでしょうか。


189ポイント を手に入れた。

Name: さば  ..入門者(4,206ポイント)   Date: 2007/09/14(金) 17:23   No:10455     
Title: これこそC/C++の欠点の現れでは    
現に君のような中学生でさえ、おいらのような古参よりも上になる可能性が高いということは
まさにC/C++の欠点の現れだと思う。
要は人の記憶に頼りすぎ。

肥大化した仕様や微妙なところは散々だと、やっぱり機械処理や記憶のいい年に向いているよね。


118ポイント を手に入れた。

Name: さば  ..入門者(4,251ポイント)   Date: 2007/09/14(金) 17:33   No:10456     
Title: コンストラクタからの例外送出(超雑談?)に訂正    

>表現の自然さと能率からすれば、やはりBATLABは一番汎用性高き、理想なモデルだと思います。
勿論、どの言語も欠点はありますが。

[誤] "BATLAB"
[正] "MATLAB"


45ポイント を手に入れた。

Name: tkmakwins15 [URL]  ..上級者(21,779ポイント)   Date: 2007/09/14(金) 18:29   No:10458     
Title: Re:コンストラクタからの例外送出(超雑談?)に訂正    
>現に君のような中学生でさえ、おいらのような古参よりも上になる可能性が高いということは
>まさにC/C++の欠点の現れだと思う。
>要は人の記憶に頼りすぎ。

それが安全性の犠牲というものでしょうか。確かにC/C++はプログラマの能力に依存しているところが多いと思います。
しかし、僕はやはりまだまだレベルは低いですよ。実際のところC/C++しかよく分かりませんし。


176ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(406,514ポイント)   Date: 2007/09/14(金) 18:32   No:10459     
Title: Re:コンストラクタからの例外送出(超雑談?)に訂正    
さばさん、こちらにフリーメールでいいのでメールを送っていただけませんでしょうか。
お話したいことがありますので。
→ dixqhp@gmail.com


40ポイント を手に入れた。



Name: DDK  ..入門者(2,627ポイント)   Date: 2007/09/14(金) 14:34   No:10451       
Title: 同じpointであっても生成された方法を知らなければ解放できない?    
お久しぶりです。
基本的な質問申しわけないですが。
関数の引数に short *p があるとします。
このpに対してfree(p)で解放すると delete(p)で解放するとは
何が違うのでしょうか。
そのpの本体の生成法によります?

例えば、他人に渡される関数
f(short *p){

}

があるとします。

pの内容とサイズを変更したい場合、新しいメモリを用意し、
最終的にその新しいメモリのアドレスをpに設定しなければなりません。
ところがこの前に元のメモリ領域が解放しなければならない。







198ポイント を手に入れた。


Name: てつ  ..かけだし(1,456ポイント)   Date: 2007/09/14(金) 16:51   No:10454     
Title: Re:同じpointであっても生成された方法を知らなければ解放できない?    
mallocで確保したメモリはfreeで、newで確保したメモリはdeleteで
開放しなければいけないと参考書に書いてあった気がします。


39ポイント を手に入れた。

Name: keichan  ..プログラマー(27,213ポイント)   Date: 2007/09/14(金) 18:24   No:10457     
Title: Re:同じpointであっても生成された方法を知らなければ解放できない?    
malloc : free
new : delete
は二個一です。どちらかで作ったオブジェクトは対になる解放語でなければなりません。
C++言語でnewで生成したオブジェクトをfreeで解放してやるとデストラクタが働きません。
これはやってはならないことです。


85ポイント を手に入れた。



Name: さなお  ..ぴよぴよ(399ポイント)   Date: 2007/09/14(金) 10:18   No:10443       
Title: delete[] について    
はじめまして。C++のnew/deleteについて質問させて下さい。
とっても初心者的な質問で、とっても恥ずかしい質問かも知れませんが
教えていただけるととっても助かります。よろしくお願いします。
配列を動的にメモリを割り当てるためにnewを使いdeleteでメモリを解放させるというやり方がありますよね。
その時ポインタが有効かそうでないかを判断するのにはポインタがNULLであるかで判断するというのが
正しいコーディングだと理解しています。
もしも、newで割り当てたメモリをdeleteで解放する前にNULLで初期化を間違ってしてしまった場合
どんな影響が出るのかが知りたいと思います。やはりメモリは解放されませんか?

例として
char *pn=NULL;

if (pn==NULL)
pn = new char[20];
.
.
.

pn = NULL;



delete[] pn;

例では、deleteでメモリの解放は最終的に行うのですが
その前にポインタをNULLにしてしまったという場合です。

こんな事をすると、メモリリークが起こるとか
メモリの共用違反の原因になりますか?

とっても恥ずかしい質問ですみません。
例の事をやった場合に起こる事の問題の可能性などを
教えていただけると、とてもありがたく思います。
よろしくお願い致します。



399ポイント を手に入れた。


Name: Blue  ..入門者(3,942ポイント)   Date: 2007/09/14(金) 10:23   No:10444     
Title: Re:delete[] について    
>こんな事をすると、メモリリークが起こるとか
メモリリークしますよ。

NULLを設定しなくても

char* p = NULL;


p = new char[10]; // 1
p = new char[5]; // 2

delete[] p;


とすると、1でnewした領域は解放できないのでリークします。
今回は 2 が単に NULL だということです。


79ポイント を手に入れた。

Name: さなお  ..ぴよぴよ(590ポイント)   Date: 2007/09/14(金) 11:27   No:10446     
Title: Re:delete[] について    
Blueさん、とっても早くにお返事いただけてありがとうございます。
やはりメモリリークの原因になりますよね・・・。

では、もう一つ追加で聞かせていただいて良いですか?
書いていただいた例では1でnewした領域は解放できませんが
2で書いたnewの領域は解放出来てますよね?

でももし、私が書いた例のように
ポインタをNULLにしてしまった場合
delete[] pn;
の行は何を解放しにいっているのでしょうか?
ここも何かのエラーの原因になりうりますか?

追加質問ですみません。
よろしくお願い致します。


191ポイント を手に入れた。

Name: Blue  ..入門者(4,056ポイント)   Date: 2007/09/14(金) 11:33   No:10447     
Title: Re:delete[] について    
>ポインタをNULLにしてしまった場合
>delete[] pn;
>の行は何を解放しにいっているのでしょうか?
は確か何も問題ないはず。
(だけどNULLにする前の領域は当然解放できない)

気持ちが悪いなら

if (pn != NULL)
delete[] pn;

と条件文を入れればいいでしょう、


114ポイント を手に入れた。

Name: たかぎ [URL]  ..中級者(11,343ポイント)   Date: 2007/09/14(金) 12:09   No:10448     
Title: Re:delete[] について    
動作を正しく理解することは重要ですし、避けて通ることはできませんが、メモリ管理で楽をしたいのであれば、配列を new で割りつけるのではなく std::vector クラステンプレートを使用することをお勧めします。


74ポイント を手に入れた。

Name: さなお  ..ぴよぴよ(792ポイント)   Date: 2007/09/14(金) 13:07   No:10449     
Title: Re:delete[] について    
Blueさん早速のお返事ありがとうございます。
本来あってはならない事なので
教えていただいたように条件文を付けるようにして
これ以上の問題を起こさないように対処していくようにします。

たかぎさん、お返事ありがとうございました。
クラステンプレートとか使用したことない初心者です。
これを使う方が安全に出来るのですね?
楽もしたいですが、でも、基本的な動作も理解したいと思います。
クラステンプレートの方も追って勉強できればと思っています。
教えていただきましてありがとうございます。



202ポイント を手に入れた。



Name: Shera  ..ぴよぴよ(149ポイント)   Date: 2007/09/12(水) 21:30   No:10408       
Title: 構造体    
初めまして
夏から勉強を始めたのですが


シューティングの館の4節に

typedef struct{
    double x,y;
    int status,counter;
    int shot [11][15];
} BODY_player_t;

BODY_player_t Player;

とありますが
自分で調べたところ、構造体は

struct 〜

で書き出すとありましたが

これはどちらで書いても大丈夫と解釈していいんでしょうか?


149ポイント を手に入れた。


Name: tkmakwins15 [URL]  ..上級者(21,432ポイント)   Date: 2007/09/12(水) 21:36   No:10409     
Title: Re:構造体    
この場合、structをつけるとエラーになります。なぜなら、structの後に宣言するのはタグ名ですが、
typedef struct{…
の書き方の場合は、タグ名のない構造体型に、名前をつけているという意味になるので、
structをつけずに宣言するのです。


81ポイント を手に入れた。

Name: box  ..比類無きプログラマー(86,231ポイント)   Date: 2007/09/12(水) 22:04   No:10411     
Title: Re:構造体    

> typedef struct{
> double x,y;
> int status,counter;
> int shot [11][15];
> } BODY_player_t;

これは、x, y, status, counter, そしてshotというメンバーを持つ
構造体に、BODY_player_tという別名を付けている、という意味です。
これ以降は、くだんの構造体をBODY_player_t型として扱えるようになります。

> BODY_player_t Player;

これが、BODY_player_t型の変数Playerの定義です。


137ポイント を手に入れた。

Name: Shera  ..ぴよぴよ(305ポイント)   Date: 2007/09/12(水) 22:33   No:10412     
Title: Re:構造体    
お早い返信ありがとうございます
あのあと typedef
について調べたところ

>>構造体では、頭に「struct」が付くのでどうしても型名が長くなります。そのため、構造体の宣言を簡潔にするために、typedef は非常に多く用いられます

とありました

また上のお二方の内容からしますと
4節の記述は

typedef struct 以降の {} のなかの内容は =BODY_player_t Player

であっているんでしょうか?


156ポイント を手に入れた。

Name: tkmakwins15 [URL]  ..上級者(21,272ポイント)   Date: 2007/09/12(水) 22:57   No:10413     
Title: Re:構造体    
要は、構造体とはプログラミングをする人が作る新たな型なのです。その型の名前を、typedefで
つけるということなので、ほぼ同意としてもあまり問題は起きません。もっと簡単に言うと、

typedef int seisuu; /*整数の型であるint型にseisuuという名前をつけている*/

これはあまりよくない例です。しかし、seisuuというのはこの時点でintというのと同義になります
構造体の中身も型なので、=としてもさほど問題は起きないと思います。


160ポイント を落としてしまった。

Name: toyo  ..入門者(4,934ポイント)   Date: 2007/09/13(木) 09:15   No:10419     
Title: Re:構造体    
typedefは構造体以外でも結構使われています
typedef 型 別名;
の様に書きます
Windowsでも
typedef unsigned long DWORD;
typedef int BOOL;
typedef unsigned char BYTE;
など型定義がされています。
型の部分には構造体も使えるので
typedef struct タグ名{ } 別名;
と書けます。
typedefの場合は構造体タグ名を省略できるのでご質問の部分の書き方になっています。
使用目的はやはりタイプ量を減らせるというのが大きいですね


147ポイント を手に入れた。

Name: たかぎ [URL]  ..中級者(10,846ポイント)   Date: 2007/09/13(木) 11:11   No:10421     
Title: Re:構造体    
構造体の場合は typedef を使っても害は少ないのですが、整数型の typedef はあまり乱用しない方がいいですよ。
というのも、typedef 名にしてしまうと本来の型が一見しただけではわからなくなるので、整数拡張や通常の算術型変換の振る舞いが把握しづらくなるからです。

C++ の場合はもっと顕著で、多重定義やテンプレートがどう解決されるのか、ソースを少し見ただけでは分からなくなってしまいます。実際の型に依存しないように、正しくコーディングされているならよいのですが、そんなことは稀ですから。


147ポイント を手に入れた。

Name: tkmakwins15 [URL]  ..上級者(21,461ポイント)   Date: 2007/09/13(木) 18:56   No:10435     
Title: Re:構造体    
>C++ の場合はもっと顕著で、多重定義やテンプレートがどう解決されるのか、ソースを少し見ただけでは分からなくなってしまいます。実際の型に依存しないように、正しくコーディングされているならよいのですが、そんなことは稀ですから。

もしかしてtemplate機能においてtypedefした型をtypedefごとに生成するコンパイラはありませんよね?


161ポイント を手に入れた。

Name: Shera  ..ぴよぴよ(348ポイント)   Date: 2007/09/13(木) 22:05   No:10438 解決!     
Title: Re:構造体    
皆さん、詳しい回答をありがとうございます

またなにかわからないことがあればお聞きすると思いますので
そのときはよろしくお願いします


43ポイント を手に入れた。

Name: たかぎ [URL]  ..中級者(11,269ポイント)   Date: 2007/09/13(木) 23:05   No:10439     
Title: Re:構造体    
> もしかしてtemplate機能においてtypedefした型をtypedefごとに生成するコンパイラはありませんよね?

ありません。


9ポイント を手に入れた。

Name: tkmakwins15 [URL]  ..上級者(21,414ポイント)   Date: 2007/09/13(木) 23:21   No:10440     
Title: Re:構造体    
それはさすがに無茶でした。

16ポイント を手に入れた。



Name: 0時  ..ぴよぴよ(505ポイント)   Date: 2007/09/12(水) 21:43   No:10410       
Title: 作れるゲーム、作れないゲーム    
ようやく入門編を終えました。
これからゲーム基本編に入る所ですが、ふと疑問に思ったので投稿しました。

DXライブラリで出来るゲームのジャンルで作れない、作り難いゲームというのはあるんでしょうか?
ゲームにも色々とあります。
RPGやアクション、シューティングにパズル・落ちモノ、シミュレーションや格闘ゲーム、果てはタイピングやカードゲームなどなど。
私はカードゲームを一度作ってみようかなと思ってるんですが、これは作りやすい方でしょうか?作り難い方でしょうか?
例えばキー入力でなく、マウスクリックでクリックした位置の処理を行うとか。
表示したカード(画像)をクリックする事でカードを場に出したり、手札に戻したりするように処理するとか。
宜しければご指導お願いします。

また、良ければ皆さんが作っているゲームや作ろうとしているゲームはどういうジャンルか教えて貰えると参考として有り難いです。


265ポイント を手に入れた。


Name: tkmakwins15 [URL]  ..上級者(21,300ポイント)   Date: 2007/09/12(水) 22:59   No:10414     
Title: Re:作れるゲーム、作れないゲーム    
Dxライブラリには「2D」という制限以外あまりないと思います。無理すれば3Dでもいけるようです。

28ポイント を手に入れた。

Name: 管理人 [URL]  ..伝説のハッカー(406,474ポイント)   Date: 2007/09/13(木) 01:15   No:10416     
Title: Re:作れるゲーム、作れないゲーム    
DXライブラリではどんなゲームでも作れます。
なんちゃってオンラインゲームでも作れます。チャットソフトでも作れます。
唯一つ作れないのは3Dです。もしDXライブラリを利用して本体を作り、背景を3Dで表示したい場合などは、
DXライブラリはDirectX7のライブラリであることから、その部分をDirectX7で書く事になります。

DXライブラリだけで作ろうとすると一般的に2Dのみだと思ってください。
私が思う、ゲームを作るその難易度のジャンルを簡単な順番に書いて見ます。
以下私が勝手に感じた難易度ですので、参考程度にしてください。

簡単

サウンドノベルゲーム
ボードゲーム・タイピングゲーム
パズルゲーム(どんなパズルかにもよる)
FF1やドラクエ1のような簡単なRPG
シューティングゲーム
アクションゲーム・格闘ゲーム・アクションRPG等

難しい

何度も言いますが、あくまで個人的な見解です。
ゲームを作る難しさというものは「どれだけ見栄えをよくするか」でものすごく大きく変わります。
決定ボタンを押した瞬間別の場面に何のエフェクトも無くかわるのと、
決定ボタンを押した瞬間キラキラするエフェクトが出てワイプを使ってキレイにシーン変化させるなどするのでは
難易度が全く違います。ですから、上記の順番で作ったとしても、そこにどれだけの見栄えを要求するかで難易度は全く異なります。
例えば私が作ったぷよぷ○もどきのBLACKでは「ぷよんっ」とする質感を出すために色々試行錯誤しました。
しかし、そんな演出にこだわらず、石が等速で落ちてくるように描けばとても簡単です。

ボードゲームはゲームの中でもかなり簡単に作れる方でしょう。
何のエフェクトもなく、ボードゲームを作ると言うテーマは入門時にうってつけだと思います。
私がはじめて作ったゲームはFF1のようなRPGでしたが、高飛びしすぎて色々苦労しました。
その苦労は無駄にはならないですけどね、作るのが嫌になってやめてしまったらそこまでになってしまうので、その危険性だけの問題です。

マウスクリックの処理はそこまで難しい処理じゃないですし、手札に戻すような処理も、DXライブラリの問題ではなく、普通のC言語として処理をかくことになるでしょうし。
DXライブラリの知識としては入門編を終えればある程度網羅したと思います。
まだまだ使い方は定着していないでしょうけど、そこは書きながら覚えればOKです。
後、必要な知識として 30〜34 , s0 の章は見てください。
また、これらの内容は見てしっかり理解出来なくてもいいです。
作っていく中でいつかつまずいたら、またココを見る繰り返しで覚えてください。


823ポイント を手に入れた。

Name: とおりすがり  ..ぴよぴよ(13ポイント)   Date: 2007/09/13(木) 08:59   No:10418     
Title: Re:作れるゲーム、作れないゲーム    
オンゲーは作れませんね。LANで直接つなげない限りサーバーが必要になりますから。

13ポイント を手に入れた。

Name: 0時  ..ぴよぴよ(940ポイント)   Date: 2007/09/13(木) 21:52   No:10437     
Title: Re:作れるゲーム、作れないゲーム    
皆さん、アドバイスありがとうございます。

どうやら3Dだけは無理なようですね。
さすがにそこまで追求するのは準・初心者の私には無謀というものですので素直に2Dで作る事にしますよ。
最初の作成もボードゲームで行こうと思います。
まだまだ勉強中ですが、じっくり時間を掛けて作りますよ。

ここから雑談ですが、実は一度C++でゲームを作ったことがあるんですよ。
というのも専門校でC++やっててプログラミング課題でゲームを作ったのでね。
当時は毎日朝から夕方までC++やってたものですが、卒業して数年たった今はすっかり当時の学習内容を忘れてしまったという始末です。
作ったゲームもCDに焼いてあるんですが、一部データが消えてたり(一番苦労した自作画像が消滅)、何より「こんな難しいプログラムよく作れたなぁ〜」と昔の自分を誉めてるんだか今の自分を馬鹿にしてるんだか分からない状態でして(^^;
人間やっぱり毎日使ってないとすぐに物を忘れてしまうものですねぇ〜、漢字とか。