【初心者歓迎】C/C++室 Ver.76【環境依存OK
レス数が1000を超えています。これ以上書き込みはできません。
0001ぴころ ◆lHG3Yzo0a6
2011/08/06(土) 18:08:48.70ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.75【環境依存OK】
http://hibari.2ch.net/test/read.cgi/tech/1299218426/
◆ソースのインデントについて
半角空白やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのも手ですが直接貼る場合は、
全角空白か に置換すると見栄えだけはよくなります。
【アップローダー】(質問が長い時はココ使うと便利)
http://codepad.org/ (コンパイルもできるし出力結果も得られる[]privateをチェック)
http://ideone.com/ (時間帯によってはcodepadが重い事があるのでここも利用)
0002デフォルトの名無しさん
2011/08/06(土) 18:25:17.92リスト構造からやり直しだなw
0003デフォルトの名無しさん
2011/08/06(土) 23:09:19.590004デフォルトの名無しさん
2011/08/07(日) 16:48:13.59誰かわかりやすく図示してくれ図示
0005デフォルトの名無しさん
2011/08/07(日) 16:58:23.84/~~\ ←protected 明るい家族計画
( ゚ )
|o |
|0 |
(ニニニ)
( ・∀・)
) (
(__Y_)
0006デフォルトの名無しさん
2011/08/07(日) 18:59:32.96派生先からはpublic
外からはprivate
0007デフォルトの名無しさん
2011/08/07(日) 19:13:47.22あーそれだけなのか
なんで皆難しく説明するのかねぇ?
0008デフォルトの名無しさん
2011/08/07(日) 20:45:21.26privateはprivate
でも 子供に秘密を教えた時があるよね。
そん時が protected
家族限定みたいな。
0009デフォルトの名無しさん
2011/08/07(日) 20:50:04.07みんな俺頭いいだお?すごいだろぉ?をしたいものさ
0010デフォルトの名無しさん
2011/08/08(月) 02:32:20.900011デフォルトの名無しさん
2011/08/08(月) 09:57:27.080012デフォルトの名無しさん
2011/08/08(月) 18:15:23.620013デフォルトの名無しさん
2011/08/08(月) 21:44:26.61void func(const hoge& arg)
{
}
よりも
void func()
{
hoge h;
}
ってこと?
0014デフォルトの名無しさん
2011/08/08(月) 21:57:21.020015デフォルトの名無しさん
2011/08/08(月) 22:39:39.74速度どうとかより何かを受け取るために必要な引数じゃないの?
0016デフォルトの名無しさん
2011/08/08(月) 22:39:48.01{ hoge h; func1(h); }
なら
void func2(){hoge h;...}
{func2();}
のほうが速いよ
0017デフォルトの名無しさん
2011/08/09(火) 02:34:16.83クラスの関数しか使わないので中で宣言してもやることが変わらないんですよ
>>16
中で宣言した方が速いのですか。これは書きなおしだなー
ありがとうございます
0018デフォルトの名無しさん
2011/08/09(火) 04:40:17.17int main(int argc,char* argv[])
{
std::ofstream ofs("text.txt");
for(int i = 0 ; i < argc ; ++i)
{
ofs << argv[i] << std::endl;
}
return 0;
}
このプログラムになんらかのファイルをドラッグ&ドロップして起動しました。
しかしなぜか同じディレクトリ以外からドラッグしたファイルの名前は
textに出力されません。なぜでしょうか?
VS2010です
0019デフォルトの名無しさん
2011/08/09(火) 06:20:59.42text.txt が出力されているとか
0020デフォルトの名無しさん
2011/08/09(火) 06:33:51.81ほんとだ・・・気づきませんでしたありがとうございます
0021デフォルトの名無しさん
2011/08/09(火) 16:04:01.03へー…前からそうだっけ?
0022デフォルトの名無しさん
2011/08/14(日) 00:39:37.76俺も実行ファイルと同じ場所になるような気がしていたが、今確認したら
Win 7 sp1: ドロップしたファイルの場所
Win XP sp3: ユーザープロファイルの場所
0023デフォルトの名無しさん
2011/08/15(月) 02:00:08.821つのスレッドだけが書き込みを行って
他のスレッドは読み込みだけの場合でも必要なのですか?
書き込み同士は排他が必要だが、読み込み同士は排他は不要。
問題は書き込み中に読み込み、あるいは読み込み中に書き込み、だが、これは書き込み/読み込み対象のオブジェクトが小さければ不要なこともあるかもしれない。
0025デフォルトの名無しさん
2011/08/15(月) 02:08:30.46書き換え途中の変数にアクセスしても泣かないなら不要。
それ以外は必要。
0026デフォルトの名無しさん
2011/08/15(月) 02:37:59.52x86-64限定ならたぶんOK。
0027デフォルトの名無しさん
2011/08/16(火) 00:18:57.57インクルードが上手くいかず、
〜〜〜 定義されていない識別子です。
というエラーが沢山出て頭が爆発しそうです。
ヘッダファイルで宣言、定義した変数、定数、関数、クラスをそのまま対応したソースファイルや
main.cppで使用する方法はありませんか?
0028デフォルトの名無しさん
2011/08/16(火) 01:02:16.82リンクしてるか?
002923
2011/08/16(火) 01:55:03.81書き込み中に読み込みが行われた場合の問題というのは、
書き込み前の値を読み取られる可能性がある、というだけなのでしょうか?
0030デフォルトの名無しさん
2011/08/16(火) 02:34:30.88>>25の書いてる通り、アトミシティーがあるならそう。
無ければ何が起こっても文句は言えない。
0031デフォルトの名無しさん
2011/08/16(火) 11:21:11.46環境によっては、例えば0xffffから0x10000に書き換える瞬間に読み出した結果が
0x1ffffになるかもしれないし、0になるかもしれない。もしかしたら、0x100ffになるかもしれない。
003223
2011/08/17(水) 03:09:05.42>>31
ありがとうございます、環境によっては危険なことになるようですので、
同期はとるようにします。
大変勉強になりました、返答を下さった方々、もう一度ありがとうございます。
0033デフォルトの名無しさん
2011/08/17(水) 19:56:49.90VisualC++なら項目の追加で分割したcppやhを全てプロジェクトの中へいれる。
あと、C++はコンパイルすると関数名を勝手に変えてしまうので、ソースを分割するとそれまでリンク出来ていたものが出来なくなるから、hファイルにおまじないを書かないといけない。
0034デフォルトの名無しさん
2011/08/17(水) 22:07:46.93main(int ac, char **av)
{
const int N = 1000000;
int *alloc = new int[N];
memset(allc, 0, sizeof(alloc) * N);
return 0;
}
これを実行すると、セグメンテーションエラーになります。なにか間違ってますか?
$ ./a.out
Segmentation fault
$
環境は64ビットのUbuntuです。
0035デフォルトの名無しさん
2011/08/17(水) 22:10:05.800036デフォルトの名無しさん
2011/08/17(水) 22:16:38.94ありがとうございます。そうでした。
0037デフォルトの名無しさん
2011/08/18(木) 00:29:23.16intの配列を全要素0で初期化したいんだから、
std::fill_n(&alloc[0], N, 0);
が素直。
0038デフォルトの名無しさん
2011/08/18(木) 00:54:34.53int *alloc = new int[N]();
とかで出来なかったっけ
配列を初期化できたっけ。
0040デフォルトの名無しさん
2011/08/18(木) 08:28:09.97() の場合は可能
0041デフォルトの名無しさん
2011/08/18(木) 12:05:04.81ぉぃぉぃ
0042デフォルトの名無しさん
2011/08/18(木) 21:18:39.03みたいにして長い変数名を短縮する目的で参照を使うのは
行儀が良くないですか?
少なくともプロは使わない、とか、コーディング規約で普通禁止される、
とか、そういう意見があれば教えてください。
0043デフォルトの名無しさん
2011/08/18(木) 23:20:29.01まず長い名前になること自体どっかおかしくね?という視点は必要な気がする。
適切にクラス、関数が切り分けられていないかもしれない。
後は生存期間の問題がなければ個人的には有り。
004442
2011/08/19(金) 00:53:45.00回答ありがとう。
長い名前は自分が作ったわけではないライブラリのAPI名でして。
安易に参照作って生存期間でハマるのは前にやって懲りたので、
引き続き気をつけます。
0045デフォルトの名無しさん
2011/08/19(金) 10:51:09.93--
{
// 長い処理
auto & shortname = very.longlong.name; // shortnameも充分長ぇよ
// ある程度長い処理
// veryの寿命が尽きた後
}
--
よりは
--
{
// 長い処理
{
auto & shortname = very.longlong.name; // shortnameも充分長ぇよ
// ある程度長い処理
}
// veryの寿命が尽きた後
}
--
のようにブロックにしてスコープを狭くすれば少しだけ安心感が増すかと。
0046デフォルトの名無しさん
2011/08/20(土) 15:22:04.70wstring s;
*p = s;
sの方が*pより長いときに、領域外アクセスで落ちることはありますか?
0047デフォルトの名無しさん
2011/08/20(土) 15:28:09.36pは何も指していないが大丈夫か?
単に代入のことを言っているなら、
小さければ内部配列は拡張されるから安心汁
0048デフォルトの名無しさん
2011/08/20(土) 15:31:01.910049デフォルトの名無しさん
2011/08/20(土) 15:54:51.35pは実体が確保されていないので、*p=sは常に問題のあるコードです。
不正メモリアクセスで落ちたらラッキー
0050デフォルトの名無しさん
2011/08/21(日) 23:43:29.47設計的におかしいと思うのですが?
0051デフォルトの名無しさん
2011/08/22(月) 00:21:46.170052デフォルトの名無しさん
2011/08/22(月) 00:42:12.50>>51 rebind もそうですね
そもそも、クラステンプレートなり、構造体テンプレートを別のクラスで縛ることで得られるメリットってあるのかな?
普通に、そのクラスや構造体のインスタンスを生成して使うのが普通だし、譲歩して他のクラスから
そのテンプレートクラスなりが使いたかったとしても対等な関係で使えるはず
クラスが他のクラステンプレートや構造体テンプレートを所有するメリットについて、誰か説明してもらえませんか。
0053デフォルトの名無しさん
2011/08/22(月) 12:00:26.18イメージが湧かないから例を挙げて。
0054デフォルトの名無しさん
2011/08/22(月) 18:10:59.93std::wstring strmid (std::wstring, int, int) ;
std::string strmid (std::string, int, int) ;
を両用したいのです
ご教示お願いします
0055デフォルトの名無しさん
2011/08/22(月) 18:23:08.85それでいけるでしょ
他の部分に問題があるのでは?
0056デフォルトの名無しさん
2011/08/22(月) 18:48:23.79ヘッダーをincludeしてなかったので前方参照できなくて、再帰呼び出しで変換できないエラーになっていました。
ありがとうございます。
0057デフォルトの名無しさん
2011/08/25(木) 18:56:55.180058デフォルトの名無しさん
2011/08/25(木) 21:25:48.000059デフォルトの名無しさん
2011/08/25(木) 21:45:21.62むり
0060デフォルトの名無しさん
2011/08/26(金) 11:42:13.680062デフォルトの名無しさん
2011/08/26(金) 13:43:06.65Windows7/XP等でファイルシステムのシステムコールにフックして
「いつ誰がどのファイルを操作した」といったログを残したいのです。
これって無理なんですかね?
0063デフォルトの名無しさん
2011/08/26(金) 14:09:49.85可能だよ。
http://d.hatena.ne.jp/eco31/20110116/1295112914
0064デフォルトの名無しさん
2011/08/26(金) 15:52:27.37これはSetWindowsHookEx()を使ってフックする方法とはまた違うやり方なんですね
このクラスを使ったほうがいいんですかね・・・
0065デフォルトの名無しさん
2011/08/26(金) 17:22:31.850066デフォルトの名無しさん
2011/08/26(金) 23:35:53.520067デフォルトの名無しさん
2011/08/27(土) 01:03:58.25無理。
・NT関係ないだろ
・今時NTかよ
・C++やめてPerlにすればできるよ
0068デフォルトの名無しさん
2011/08/27(土) 05:34:23.37http://support.amd.com/us/Processor_TechDocs/47414.pdf
に相当するドキュメントはありませんか?
using namespaceはヘッダファイルに書くのでしょうか?それともcppファイルに書くのでしょうか?
0070デフォルトの名無しさん
2011/08/28(日) 00:27:50.950071デフォルトの名無しさん
2011/08/28(日) 14:51:37.660072デフォルトの名無しさん
2011/08/31(水) 19:49:09.53あるcppファイルのグローバル変数は、そのcppのオブジェクト?の、クラスのプライベート変数のようなもの、
externでアクセスできるようになる
という理解はあってるんでしょうか?
0073デフォルトの名無しさん
2011/08/31(水) 20:38:49.97あまり正確ではない
キーワードは「リンケージ」
cppで普通に変数や関数を定義すると、それは外部結合になる
外部結合ならば、extern int a;などと宣言することでそれにアクセスできる。
逆に
cppでstatic int a = 1;などと定義してある変数は内部結合になって、
それは宣言しようが、他のcppからはアクセスできない。
勿論ポインタが手に入ればアクセスできるが
関数の場合は宣言にexternつけなくても宣言になるけどな
0074デフォルトの名無しさん
2011/08/31(水) 21:21:55.36半分くらい理解しました
精進します
むしろstaticの意味が理解できた気がします
0075デフォルトの名無しさん
2011/08/31(水) 21:46:17.82これが包含ってやつですか?
0076デフォルトの名無しさん
2011/09/01(木) 21:05:57.34C++は「クラス」を動的に生成することは出来ません
0077デフォルトの名無しさん
2011/09/02(金) 00:44:50.46このwebサイトはUTF-8です
コマンドライン引数で得た文字列をUTF-8にしてURLエンコードしてGETで渡したいのですがコマンドライン引数の入力の文字コードは何なのでしょうか?
できれば移植性の高いソースにしたいので入力の文字ーコードを割り出してUTF-8への変換を行いたいです
変換の方法や文字コードを調べる方法を教えてください
また、取得したwebサイトを
boost::asio::ip::tcp::iostream socket( "example.com", "http" );
socket << "GET ........" << std::flush;
std::string line;
std::ofstream fp( "test.txt" );
while( std::getline( socket, line ) ) {
fp << line << std::endl;
}
のようにしてファイルへの書き込みをしたのですが
コマンドプロンプトの設定をchcpコマンドを使わずにそのまますると文字化けし
chcpでUTF-8にすると文字化けせずに書き込みできるのですがどう関係しているのでしょうか
(コマンドプロンプトへの出力はフォントの関係でうまくいきませんでした)
最終的には
コマンドライン入力->UTF-8変換->web通信->処理->適切な文字コードに変換->標準出力
└─────UTF - 8─────┘
のように内部的にはUTF-8で処理したいです
stringやwstringなどいろいろありよくわからないです
長くなりましたがよろしくお願いします
0078デフォルトの名無しさん
2011/09/02(金) 00:58:14.800079デフォルトの名無しさん
2011/09/02(金) 01:02:49.030080デフォルトの名無しさん
2011/09/02(金) 14:39:59.01それだけでもいいので教えてください
0081!ninjya
2011/09/02(金) 16:49:41.780082デフォルトの名無しさん
2011/09/02(金) 16:54:04.40charであってる
0083デフォルトの名無しさん
2011/09/02(金) 17:10:02.82ja_JP.UTF-8
#include <stdio.h>
#include <string.h>
int main(void){
char *str="ほげほげ";
printf("%d\n",strlen(str));
return 0;
}
最初 ちょとびびるかもねw
0084デフォルトの名無しさん
2011/09/02(金) 19:21:09.48すいません、オブジェクトAの中で、オブジェクトBを生成するのは可能ですか?
008576
2011/09/02(金) 20:17:31.37不可能なわけない。
struct A {
C c;
B *pb;
A() : c(100) { this->pb = new B(); }
};
BやCをAが所有するという考えの設計なら、包含とかコンポジションと呼んでよい
0086デフォルトの名無しさん
2011/09/02(金) 21:44:13.800087デフォルトの名無しさん
2011/09/02(金) 21:46:40.020088デフォルトの名無しさん
2011/09/02(金) 21:53:19.060089デフォルトの名無しさん
2011/09/02(金) 21:57:14.20int hoge()
{
hoge hogege();
hogege.hogehoge();
}
だいたいこんな感じで関数の中で宣言して使ってるじゃないですか。
hoge hogege();
int hoge()
{
hogege.hogehoge();
}
こういうのはどうなのかなって。
0090デフォルトの名無しさん
2011/09/02(金) 21:58:40.940091デフォルトの名無しさん
2011/09/02(金) 21:59:23.32それってどっちでもコンパイルエラーでない?
0092デフォルトの名無しさん
2011/09/02(金) 22:01:52.15・・・関数名と同じ名前にしたのはまずかったですね
0093デフォルトの名無しさん
2011/09/02(金) 22:03:42.030094デフォルトの名無しさん
2011/09/02(金) 22:21:34.15用語は正しく使おうな。そこをあいまいにしてる人は物事を正しく理解できてないと思われてもしかたない。
で、君の言いたいことはクラスのインスタンス生成のことのようだが
グローバルなインスタンスは本質的にグローバル変数と同じものなので無闇に使うものじゃない
0095デフォルトの名無しさん
2011/09/02(金) 22:23:44.590096デフォルトの名無しさん
2011/09/02(金) 22:38:38.74使わないほうがいいですか。
ありがとうございます
まだまだ勉強が足りませんでしたね。精進します
0097デフォルトの名無しさん
2011/09/03(土) 00:04:49.920098デフォルトの名無しさん
2011/09/03(土) 03:53:21.710099デフォルトの名無しさん
2011/09/03(土) 10:02:27.790100デフォルトの名無しさん
2011/09/03(土) 15:19:46.75変数が組み込み型だろうとクラス型だろうと関係ない。
どうしても静的変数が必要な時のみ使用する。
0101デフォルトの名無しさん
2011/09/03(土) 23:37:04.48ぜ、前方参照なんじゃ、ないかな
0102デフォルトの名無しさん
2011/09/04(日) 19:36:53.06"グローバル"って、クラス内でスコープが有効って意味?
だったらそれは違う。
複数クラス間で共通に使用するインスタンスなら"グローバル"って呼ぶ。それは原則使用しない。
C言語とかだと、
・変数宣言が関数の中にある場合、スコープがブロック内で有効
・変数宣言が関数の外にある場合、スコープがソースファイル内で有効
って事で、
さらに複数ソース間でもスコープ有効をグローバルって言ってた
0103デフォルトの名無しさん
2011/09/04(日) 21:29:36.84グローバル変数はグローバル変数だよ。
関数外で外部リンケージの変数が定義されてるだろ。
>>89見てもわからないなら引っ込んでろ
0104デフォルトの名無しさん
2011/09/04(日) 22:16:48.32いや、だから >89 に
class クラス名 {
public:
hoge hogege;
int hoge();
}
とかって書いて無いぢゃんw
publicでなくてクラス内で閉じてるなら、いわゆるグローバルと違うから問題無いって事だお。
0105デフォルトの名無しさん
2011/09/04(日) 23:33:11.48クラスのメンバーを想像するなんて、Javaで頭がおかしくなったんじゃないのか
0106デフォルトの名無しさん
2011/09/10(土) 02:21:28.82エクスプローラ上でtxtを新規作成してもログに残りません。
テキストエディタでファイルを作成した場合はログに残ります。
エクスプローラはCreateFileを使用していないのでしょうか?
テストしたOSはWindows7です。
0107デフォルトの名無しさん
2011/09/10(土) 08:30:06.800108デフォルトの名無しさん
2011/09/10(土) 18:23:36.34http://mail2.nara-edu.ac.jp/~asait/c_program/part3.htm#section33
上記のサイトにある、switch文についてです。
例コードのcode3.cの4行目にある
#define ESC_Key 0x1b
とは何なのですか?
ご回答よろしくお願いします。
0109デフォルトの名無しさん
2011/09/10(土) 18:26:15.210110デフォルトの名無しさん
2011/09/10(土) 18:34:39.32すみません、難しくてわかりません。
出来ればもっと分かりやすく説明して頂けるとありがたいです。
0111デフォルトの名無しさん
2011/09/10(土) 18:37:31.24ttp://itref.fc2web.com/c/preprocessor.html
0112デフォルトの名無しさん
2011/09/10(土) 18:39:16.72ありがとうございます。
難しいですが大体わかりました。
0113デフォルトの名無しさん
2011/09/10(土) 23:14:02.64memset(buf,0,sizeof(buf));
memset(buf,NULL,sizeof(buf));
どっちが一般的なのでしょうか?
ソースを他人に見せます。恥ずかしくないコーディングをしたいので教えてください
0114デフォルトの名無しさん
2011/09/10(土) 23:17:10.550115デフォルトの名無しさん
2011/09/10(土) 23:38:29.580116デフォルトの名無しさん
2011/09/10(土) 23:55:31.200117デフォルトの名無しさん
2011/09/11(日) 21:33:53.76CHogeのメンバ関数内での this というのは、
意味合いとしては、 CHoge*(CHoge型のポインタ) のような認識で合っていますか?
それと、 &this のような表記が意味するのは、
CHogeの実態へのアドレスを記憶する変数の領域が、thisという形で、他のメンバ変数のように存在しているということでしょうか?
クラスを利用していながら疑問に思っていた事なのですが、ご存じでしたらご回答お願いします。
0118デフォルトの名無しさん
2011/09/12(月) 00:12:30.18その通り CHoge* だが、変数ではない。
0119デフォルトの名無しさん
2011/09/12(月) 07:15:20.320120デフォルトの名無しさん
2011/09/12(月) 09:24:20.81を
(&this)->a
だと思ってんだろね
0121117
2011/09/12(月) 13:26:44.22納得しました。
>>119-120
&this 単体では利用できないのですね
というより、120さんのご指摘通りでした。
疑問が晴れました。どうもありがとうございました。
0122デフォルトの名無しさん
2011/09/12(月) 15:36:38.190123デフォルトの名無しさん
2011/09/12(月) 18:34:29.370124デフォルトの名無しさん
2011/09/12(月) 19:33:13.39前を向いて生きていこうよ。人間は忘れることで生きていけるんだよ
0125デフォルトの名無しさん
2011/09/12(月) 19:50:30.820126デフォルトの名無しさん
2011/09/12(月) 19:54:33.14つWin32API質問箱 Build96
http://hibari.2ch.net/test/read.cgi/tech/1315282582/
0127デフォルトの名無しさん
2011/09/12(月) 21:03:30.91どうもありがとう
0128デフォルトの名無しさん
2011/09/13(火) 22:08:26.850129デフォルトの名無しさん
2011/09/14(水) 22:59:43.49それ以外(intとか)ってどうやって判断したらいいのですか?
0130デフォルトの名無しさん
2011/09/14(水) 23:05:14.55{
static bool const value = false ;
} ;
template < class T > struct is_ptr< T * >
{
static bool const value = true ;
} ;
0131デフォルトの名無しさん
2011/09/14(水) 23:18:26.06ありがとう。
ポインタのとき、charのポインタとか、intのポインタってのは判定できないのですかね?
0132デフォルトの名無しさん
2011/09/14(水) 23:24:54.10どうもありがとう。
0133デフォルトの名無しさん
2011/09/14(水) 23:25:47.80{
static bool const value = false ;
} ;
template < class T > struct is_same< T , T >
{
static bool const value = true ;
} ;
template < class T > struct is_int_ptr
{
static bool const value = is_ptr< T >::value && ( is_same< T , int >::value || is_same< T , int const >::value ) ;
} ;
0134133
2011/09/14(水) 23:27:29.970135デフォルトの名無しさん
2011/09/15(木) 01:12:11.46やりたいことと違うけど参考になったよ。
ありがとう。
入門書よんでからテンプレートの本かったんですが、テンプレートって難しい…
0136デフォルトの名無しさん
2011/09/15(木) 19:50:06.69template<typename T>struct rmp<T*>{typedef T type;};
template<typename T,typename U=typename rmp<T>::type>struct isp{enum{v=1};};
template<typename T>struct isp<T,T>{enum{v=0};};
template<typename T,int is_ptr=isp<T>::v>class my;
template<typename T>class my<T,1>class my{〜 //true
template<typename T>class my<T,0>class my{〜 //false
こういう事?
0137デフォルトの名無しさん
2011/09/15(木) 21:39:30.26template<typename T>class my{〜;
template<typename T>class my<T*>{〜;
でいいんじゃね?
0138デフォルトの名無しさん
2011/09/16(金) 09:07:15.270139デフォルトの名無しさん
2011/09/16(金) 09:17:43.710140デフォルトの名無しさん
2011/09/16(金) 09:53:34.94Cで書かれたライブラリで扱いやすい
0141デフォルトの名無しさん
2011/09/16(金) 09:55:45.83std::stringはスタックに置けないんですか?
>>138
C標準関数や多くのAPIはstd::stringを直接渡すようにできていない。
特に文字列を詰め込んでくれる関数の場合、一旦charのバッファを必要とする。
0142デフォルトの名無しさん
2011/09/16(金) 10:14:13.86毎回char配列でバッファ確保してコピーしてC関数通して逆コピーしてるけど
すごいもったいない気がしてstringを使う気が起きないんだけど
0143デフォルトの名無しさん
2011/09/16(金) 10:17:58.76> 特に文字列を詰め込んでくれる関数の場合、一旦charのバッファを必要とする。
標準としては C++11 からになるけど、あらかじめ十分なサイズを持った std::string s なら
&s[0] で char のバッファと同等に使えるよ。
http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#530
0144デフォルトの名無しさん
2011/09/16(金) 10:59:04.86コンストラクタを使わないでクラスを使うことができますが
コンストラクタ使う・使わないのデメリット・メリットはあるのですか?
コンストラクタを使わないと静的領域に作られる?初期化を手動?
コンストラクタを使うとヒープ領域に作られる?
0145デフォルトの名無しさん
2011/09/16(金) 11:01:29.520146デフォルトの名無しさん
2011/09/16(金) 11:08:00.71「初期化」と言うような処理がある状況でコンストラクタを使わなければ、
初期化を忘れたり2重に初期化してしまうなどの問題が起こる可能性が
高くなる。
領域の割り当ては関係ない。
0147デフォルトの名無しさん
2011/09/16(金) 11:18:59.902重防ぐことでも使うようにします
ありがとう
0148デフォルトの名無しさん
2011/09/17(土) 03:06:40.20バッファの連続性が保証されても、依然として&std::string[0]を
文字列の受け皿として使用するのは駄目だろう。
std::stringのオブジェクトとしての整合性が失われる。
0149デフォルトの名無しさん
2011/09/17(土) 03:15:45.84サイズの範囲内なら文字列の中身が変化するだけなんだから問題ないだろう。
s[0] = 1, s[1] = 2, ... として書き込むのと変わらない。
整合性って、具体的に何のこと言ってるの?
0150デフォルトの名無しさん
2011/09/17(土) 03:17:37.74Cの文字列APIは勝手にNUL止めしたりするでしょ。
0151デフォルトの名無しさん
2011/09/17(土) 03:20:24.69strlen(&s[0]) と s.size() が常に同じになると思ってるなら、それはただの勘違いだ。
0152デフォルトの名無しさん
2011/09/17(土) 03:27:09.12不整合だと言ったんだよ。
まあ確かに今までも[]演算子でもC文字列としての長さは変えられるから、
変わらないと言えば変わらないが。
0153デフォルトの名無しさん
2011/09/17(土) 03:27:44.30そんな「整合性」は提供されない。
s[0] = '\0' した瞬間に size() が 0 になったりはしない。
0154デフォルトの名無しさん
2011/09/17(土) 03:33:29.30それは理解していて、故にそういう使い方をするのは駄目だと言っているの。
0155デフォルトの名無しさん
2011/09/17(土) 03:50:13.55意味が分からないよ。
std::string が提供しない整合性が欲しいなら、その利用者がそのように使えばいいじゃないか。
それの何が駄目なの?
0156デフォルトの名無しさん
2011/09/17(土) 04:09:07.01>std::string が提供しない整合性が欲しい
この時点で、std::stringを使うのは手段を間違ってるよね。
最初からcharバッファとして使うなら、オブジェクトとして文字列長を持っているstd::stringである必然性がなくて、vector<char>でいい。
std::stringを使うと混乱を招くと思わない?
0157デフォルトの名無しさん
2011/09/17(土) 04:17:03.32それが嫌だってところから話が始まってんだよ。 >>141-142 読み直せ。
「整合」させたきゃ詰めた後に resize() すればいいだけだろ。
何の問題も無く std::string を使えるじゃないか。
0158デフォルトの名無しさん
2011/09/17(土) 12:44:43.44void CFunc(char * zs);
void Func03(std::string & s)
{
std::vector<char> v;
v.reserve(s.size() + 1);
v.assign(s.begin(), s.end());
v.push_back('\0');
CFunc(&v[0]);
s.assign(&v[0]);
}
void Func0x(std::string & s)
{
CFunc(&s[0]);
s.resize(strlen(&s[0])); // 短くなった時のため
}
0159デフォルトの名無しさん
2011/09/17(土) 14:26:47.30でいい
0160デフォルトの名無しさん
2011/09/17(土) 23:20:59.79それだとstringが内部的に連続バッファじゃない場合に無駄が多くね?
c_strでゼロ終端作って、vectorにコピーだからコピー二回もしてる
0161デフォルトの名無しさん
2011/09/17(土) 23:36:53.90159を見る限りたいした事ではないんだろ。
0162デフォルトの名無しさん
2011/09/17(土) 23:37:46.32おめでとう
0163デフォルトの名無しさん
2011/09/18(日) 03:46:59.63サイズの受け渡しが無かったり入力と出力が別にできなかったり、
その CFunc() とかいう関数のインターフェースをどうにかしたいところ。
0164デフォルトの名無しさん
2011/09/18(日) 13:45:03.31Func0xはs[s.size()]への書き込みが発生するからだめじゃないの
0165デフォルトの名無しさん
2011/09/18(日) 13:49:54.760xでは内部的にゼロ終端文字列で扱うことになったんじゃなかったっけ?
それともただ単に連続してることだけが保証されてるのかな?
0166デフォルトの名無しさん
2011/09/18(日) 14:26:30.99shall not be modified だってさ
0167デフォルトの名無しさん
2011/09/18(日) 14:59:20.560168デフォルトの名無しさん
2011/09/18(日) 15:58:17.59いやいや、 shall not be modified なのは s[s.size()] で参照される値( '\0' への参照)だけだよ。
&s[0] から s.size() ぶんはただの char 配列と同じように使える。
0169デフォルトの名無しさん
2011/09/18(日) 16:39:08.900170デフォルトの名無しさん
2011/09/18(日) 20:33:13.89void func(int f); ←func(123);のようなときに呼び出される。
このようにしたいのですが、コンパイルが通りません。
どうすればよいですか?
(func(int &f);をfunc(int *f);にすればとおりますが…)
0171デフォルトの名無しさん
2011/09/18(日) 20:59:54.67リテラルはconstであることを利用して、const&で振り分けることは可能だが
即値ではないconstな値を同様に処理してしまうという問題は出る。
0172デフォルトの名無しさん
2011/09/18(日) 21:02:57.920173デフォルトの名無しさん
2011/09/18(日) 21:18:37.20void func(int &f); ←func(i);のようなときに呼び出される。
void func(const int& f); ←func(123);のようなときに呼び出される。
0174デフォルトの名無しさん
2011/09/18(日) 22:24:15.96ありがとうございます。
勉強になりました。
0175デフォルトの名無しさん
2011/09/18(日) 22:34:51.46>171
0176デフォルトの名無しさん
2011/09/18(日) 22:37:35.45ありがとうございます。
奥が深いですね。
最近C++を始めたばかりで、いろいろ難しいです。
0177デフォルトの名無しさん
2011/09/19(月) 12:28:30.30関数定義の際に
クラス名::関数名:親クラス(親クラスのメンバ変数),メンバ変数(0),メンバ変数(new でオブジェクト化){関数定義};
という↑一文があります。実際のソースコードは↓です。
WebView::WebView(QWidget* parent) : QWebView(parent) , m_progress(0) , m_page(new WebPage(this)) { // 関数定義 };
m_progress(0) と m_page(new WebPage(this)) の部分はWebViewクラスのメンバ変数なのですが、
この部分で初期化(インスタンス作成)してるみたいなんですが、そういうことはC++の文法上OKなんでしょうか?
どうも、この関数定義の際の「:」は意味が本を見てもあまり載っていないので、困っています。
0178177
2011/09/19(月) 12:30:05.82クラス名::関数名:親クラス(親クラスのメンバ変数),自分のメンバ変数(0),自分のメンバ変数(new でオブジェクト化){関数定義};
↑こうです。
0179デフォルトの名無しさん
2011/09/19(月) 12:35:05.35ただコンストラクタ呼んでるだけだ
int* p(new int);
が合法なのと同じ
0180デフォルトの名無しさん
2011/09/19(月) 13:35:13.09文法上OK
というかこれを使わないとデフォルトコンストラクタした直後に代入するという二度手間になって無駄なので積極的に使ったほうがいい
ただしここでthisを使うことはオススメしない
オブジェクトを構築するより先にthisを利用されるとバグを生む可能性がある
0181177
2011/09/19(月) 14:31:53.01どうもありがとう。初期化子リストというのですね。名前を教えてもらえたので
グーグルで検索することができます。なにしろ、検索しようにも、コロン(:)では
中々ヒットしないので・・ ただ単純にコンストラクタを使ってるだけなんですね。
どうもありがとうございました。グーグルで更に検索して調べてみたいと思います。
>>180
どうもありがとう。
私はおっしゃるとおり、コンストラクタ内で代入するということをずっとしてきました。
こういうことの手間をはぶくために、この機能があるんですね。ひとつ教えてもらったので
これからはこの機能を使いたいとおもいます。thisは使わないようにすることをよく覚えておきたいと思います。
どうもありがとうございました。
ずっとこれはなんだろうとうやむやのままだったので、ようやくわかってすっきりしました。
どうもありがとうございました。
0182デフォルトの名無しさん
2011/09/19(月) 14:33:39.21それとも全部の雪をまとめて管理するクラスを1つ作ったほうが良いですか?
雪1個1個はキャラの動きや風、爆風などの影響を受けます。
画面上の雪は数百程度を予定しています。
描画回りは別問題として、負荷や速度の観点から、管理するスタイルはどちらが良いでしょうか?
0183デフォルトの名無しさん
2011/09/19(月) 14:39:07.960184デフォルトの名無しさん
2011/09/21(水) 21:43:36.25雪クラスと雪管理クラスを作って機能を分担
しかしそういうのは汎用のパーティクルクラスを作ったほうがよくないか
0185デフォルトの名無しさん
2011/09/22(木) 01:15:12.08テクスチャとかの描画ステートが共通になるだろうから、そこをまとめた何かがあったほうが
安く上がると思うよ。
0187デフォルトの名無しさん
2011/09/22(木) 14:31:09.44void thread_manp(void*){
int a;
while(1){
a++;
a--;
}
}
int main(){
pthread_t t1,t2;
pthread_create(&t1,null,thread_manp,null);
pthread_create(&t2,null,thread_manp,null);
while(1){
//関係ない処理
}
return 0;
}
こうした場合、2つのスレッドのメモリ領域などは別々に確保されたりして安全なのでしょうか?
OS:Linux(CentOS)
コンパイラ:gcc
0188デフォルトの名無しさん
2011/09/22(木) 14:38:00.910190デフォルトの名無しさん
2011/09/22(木) 18:41:15.19ローカル変数(スタック)は別に確保されるから全く問題ない。
グローバル変数の更新は対策が必要。参照する場合もタイミングに注意。
0191デフォルトの名無しさん
2011/09/23(金) 10:23:49.89クラスBはあくまでも(どこかしらに作成された?)クラスAの実体を指し示すポインタしか持ちませんよね?
くだらない質問で申し訳ありません
// A.h
#include <stdio.h>
#pragma once
class A
{
public:
A();
int getI();
private:
int i;
};
//B.h
#pragma once
#include "A.h"
class B
{
public:
B();
private:
A* a;
};
0192デフォルトの名無しさん
2011/09/23(金) 10:27:55.64Bのaは何も指してないかと
0193デフォルトの名無しさん
2011/09/23(金) 10:29:31.85どこにあるか?そもそも実体を指しているのか?は、そのコードだけでは不明
ポインタがゴミかもしれない
Bのコンストラクタや他のメソッドで
new A してる
シングルトンかなんかで管理されているものを引き受けてる
かもしれない
0194デフォルトの名無しさん
2011/09/23(金) 10:29:53.90#include "A.h"
A::A()
{
i = 100;
}
int A::getI()
{
return i;
}
//B.cpp
#include "B.h"
B::B()
{
int i = a->getI();
}
0195デフォルトの名無しさん
2011/09/23(金) 10:32:23.06プロセスが持つメモリー範囲外−>エラー発生
プロセスが持つメモリー範囲内−>何かがおこるw、それはプログラムによるw
0196デフォルトの名無しさん
2011/09/23(金) 10:33:27.370197デフォルトの名無しさん
2011/09/23(金) 11:05:04.58それはおいときまして、この状態では、クラスBの中のメンバaはどこも指してない(厳密には未指定のどこかをさしている)状態で、
クラスBがクラスAのgetI()を使いたいだけ、という場合でも、
クラスBのコンストラクタで、
B::B()
{
a = new A();
int i = a->getI();
}
としてnewするか、クラスBのメンバをクラスAへのポインタをやめてクラスAの実体を持つことにするしかないわけですね。
ありがとうございました。
ちなみに、クラスの中で別のクラスのパブリックメソッドを使いたいだけのときは、ポインタメンバを持つのと、実体メンバを持つのとどちらが良いのでしょうか?好みですか?
0198デフォルトの名無しさん
2011/09/23(金) 11:30:35.57どういう手段でやるにしろ 実体は欲しい
実体は不要で 実質namespace的な用途 って話なら変わってくるかもだが…
class A {
public:
int getI() { return 10; }
};
class A2 {
public:
static int getI() { return 10; }
};
B::B() { int i = A2::getI(); } と呼べるし、BにA2の実体や参照/ポインタを持つ必要がない
0199デフォルトの名無しさん
2011/09/23(金) 12:38:26.02char* a = "?";
std::cout << a << std::endl;
どうすれば?
0200デフォルトの名無しさん
2011/09/23(金) 12:39:39.03? にはハングル文字が入ってると思ってください
0201デフォルトの名無しさん
2011/09/23(金) 12:54:45.940202191(1/4)
2011/09/23(金) 12:57:30.61んーむむ、サンプルコードでの話の抽象化に失敗した気がするので、実際にやりたいことを白状しますと、DirectXの描画関数をクラスで整理したいのです。
描画の制御を別関数化、別クラス化しただけなので、引数、返り値のやりとりはないのですが、1つしかないデバイスの制御なので、実質グローバル関数的な立ち位置になってしまう、static関数はあまり使いたくなかったのです。
ならば、クラスGameMainでもfreindを使えばいい話なんですが、あまりfreindを多用する設計もいかがなものかと思い、呼び出し側のメンバに描画制御クラスを持たせました。(下記ソースコードの状態)
ここまではよかったのですが、ここで、「includeをなるべく使わず、ポインタメンバをもたせることによってincludeの数を減らせ」という文献にあたり、それにしたがってクラスの実体メンバからポインタメンバにしたところメソッドが呼び出せなくなってしまいました。
結局これは、「メンバ関数を使いたい場合にはポインタでもincludeが必要」という記述を見つけ、解決したのですが、
ならば、ポインタメンバを使ってもincludeを節約できないが、ポインタメンバと実体メンバどちらを使ったほうがよいのだろう?と思って質問したのが>>191であり、>197でした。
長文になってしまい申し訳ないです
0203191(2/4)
2011/09/23(金) 12:59:30.55#pragma once
#pragma comment(lib, "d3d9")
#include <d3d9.h>
#include <d3dx9.h>
#include "winMain.h"
class DXBase
{
// 変数宣言
protected:
// DirectXオブジェクト
static LPDIRECT3D9 pD3D;
static LPDIRECT3DDEVICE9 pDevice;
private:
static D3DPRESENT_PARAMETERS d3dpp;
// 関数宣言
private:
// 初期化、終了処理 (winMain上で実行)
friend int APIENTRY _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int);
static bool Initialize(HWND _hWnd, bool isWindowed);
static void UnInitialize();
public:
// リセット
static void Reset();
};
0204191(3/4)
2011/09/23(金) 13:01:32.51#pragma once
#include "DXBase.h"
class DXGraphics :public DXBase
{
public:
DXGraphics(void);
virtual ~DXGraphics(void);
void Clear();
HRESULT BeginScene();
void EndScene();
void Present();
};
// GameMain.h
#pragma once
#include "DXGraphics.h"
class GameMain
{
// 変数宣言
private:
DXGraphics graphics;
// 関数宣言
public:
GameMain();
void MainLoop();
void Game();
};
0205191(4/4)
2011/09/23(金) 13:03:40.92void GameMain::MainLoop()
{
// バックバッファをクリア
graphics.Clear();
// 描画開始
if (SUCCEEDED(graphics.BeginScene()))
{
// GAME処理
Game();
// 描画終了
graphics.EndScene();
}
// バックバッファの内容を画面に表示
graphics.Present();
graphics.Clear();
}
0206デフォルトの名無しさん
2011/09/23(金) 13:45:25.69内容とは関係ないけど、こういうの使ったほうが見やすいよ
http://codepad.org/fJndQ7g2
0207デフォルトの名無しさん
2011/09/23(金) 14:09:06.48> ここまではよかったのですが、ここで、「includeをなるべく使わず、ポインタメンバをもたせることによってincludeの数を減らせ」という文献にあたり、それにしたがってクラスの実体メンバからポインタメンバにしたところメソッドが呼び出せなくなってしまいました。
> 結局これは、「メンバ関数を使いたい場合にはポインタでもincludeが必要」という記述を見つけ、解決したのですが、
> ならば、ポインタメンバを使ってもincludeを節約できないが、ポインタメンバと実体メンバどちらを使ったほうがよいのだろう?と思って質問したのが>>191であり、>197でした。
そういう点で言うなら、「前方宣言」を使えばいいよ。
具体的には、>>191と>>194のコードだと
>>191のコード
//B.h
#pragma once
// #include "A.h" 不要なのでコメントアウト
class A; // 前方宣言
class B
{
(以下略)
>>194のコード
#include "B.h"
#include "A.h" // 追加
(以下略)
0208デフォルトの名無しさん
2011/09/23(金) 14:23:58.43ならシングルトンクラスにすれば?
0209デフォルトの名無しさん
2011/09/23(金) 14:58:54.09後でデバイスが増えたらどうするんだ
0210デフォルトの名無しさん
2011/09/23(金) 15:06:08.76最初から作り直した方が早いだろ
シングルトンで楽になるかどうかは知らんけど
0211デフォルトの名無しさん
2011/09/23(金) 15:28:23.87ありがとうございます。ブックマークいれときます!
>>207
…なるほど!クラスの前方宣言とメンバの呼び出しの両立はできないと思っていましたが、実際にメンバを呼び出すcppファイル側でだけインクルードすれば実現できますね!目からうろこでした。ありがとうございます。
>>208
それは、少し考えました...が、今回はシングルトンなオブジェクトを継承させたいのです。
…おかしなことをいっていますが、うまくまとめられないので具体的な話をしますと、>>203の
static LPDIRECT3D9 pD3D;
static LPDIRECT3DDEVICE9 pDevice;
上記2つ、これがアプリケーション上で「1つしかないデバイス」としたいものです。
そして、この2つをprotectedメンバにもつクラスDXBaseを、
>>204のようにDXGraphics, DXInput, DXCamera, DXLight....といった形で継承させ、
さらにDXGraphicsを継承させDX3DObject, DXText...といったクラスを作り、
それらのクラスでpD3D,pDeviceをライブラリ関数の引数として持たせたり、pD3D,pDeviceのメソッドを使ったりしたいのです。
シングルトンパターンに継承させるという概念?拡張?はないような気がしますし(不勉強なら申し訳ありません)、DXBase、DXGraphicsオブジェクトはアプリケーションに1つしか存在してほしくありませんが、
DX3DObject,DXTextなどは複数作成したかったりして、そこらへんがまだうまく消化しきれず、シングルトンパターンを適用するにいたっていません。
前述で継承させたい、と申しましたが、DXxxx系でのみpD3D,pDeviceにアクセスができ、
DXBase, DXGraphicsなどはシングルトンなオブジェクトに、DX3DObject,DXTextなどは複数オブジェクトを作成できる状態にできれば、継承にはこだわっていません。
また、DXGraphicsの子クラスにしたクラス郡も、意味的にそうしただけで、この形にはこだわってません。
当初の話とだいぶ離れてしまいました。申し訳ないです。
0212デフォルトの名無しさん
2011/09/23(金) 15:30:25.84デバイスの周辺の話は、正直正確に把握できているか自信がないのですが、私が今回作ろうとしているのは「1つしかないデバイス」というよりは、正しくは「アプリケーション上ではひとつしか作りたくないデバイス」といったほうが良いのかもしれません。
サンプルソースでは本題でなかったので省略されていますが、>>203のInitialize関数でデバイスの作成処理をしています。
0213デフォルトの名無しさん
2011/09/23(金) 15:31:28.430214デフォルトの名無しさん
2011/09/23(金) 15:43:00.74モノステートパターン!いいキーワードを教えていただいた気がします。
グーグル先生のお世話になってきます。
お答えいただいた皆さん、ありがとうございました!
0215デフォルトの名無しさん
2011/09/24(土) 04:19:01.39PORT.PCIOR0.WORD |= 0x0100u;
質問です
上の文なんですけど
これって、PORT.PCIOR0.WORD と 0x0100u; を OR とって
その結果を PORT.PCIOR0.WORD に代入で良いのですよね?
0x0100u; の uって何ですか?
0216デフォルトの名無しさん
2011/09/24(土) 04:33:01.820217デフォルトの名無しさん
2011/09/24(土) 04:37:38.26unsignedのu
0218デフォルトの名無しさん
2011/09/24(土) 04:43:38.92ありがとう
0219デフォルトの名無しさん
2011/09/24(土) 18:27:59.22例えばゲームをつくろうとしたときにプラットフォームごとに計算結果が違ったらシビアなゲームだと困りますよね
0220デフォルトの名無しさん
2011/09/24(土) 18:39:42.190221デフォルトの名無しさん
2011/09/24(土) 18:59:29.130222デフォルトの名無しさん
2011/09/24(土) 19:55:10.72俺の知る限りではハードウェアにもコンパイラにも依存する
IEEEではビット表現や四則演算の丸め方まで規定されてるはずだけど
たとえばx86では浮動小数点数を80bitのレジスタに格納して演算するので
メモリとの間のロードストアや使用する命令、順序だけで値が変わってくることに
なるし、MMXやSSEが使われればさらに変わってくる
よって、一言で言えば浮動小数点演算は非決定的であるということになる
(同じ入力から常に同じ結果が得られるとは限らない)
たとば離散コサイン変換は圧縮系のソフトウェア(JPEGやMP3)で常用されてるが、
それを浮動小数点演算で行っている場合、生成される結果はコンパイラや環境によって
実際に微妙に変わってくる
0223デフォルトの名無しさん
2011/09/24(土) 21:42:22.06そのために厳密な有効桁数を設定してそこへの正規化を都度行なったり、
固定小数点実数を整備したり、パフォーマンスに影響しない範囲で工夫するしか。
0224デフォルトの名無しさん
2011/09/25(日) 02:52:09.50これを拡張して、コンストラクタに引数を投げて初期化したいのですが、どのような形で実現するのが一般的でしょうか。
Instance関数に毎回初期化用の引数を持たせるのは現実的じゃありませんし...
それともSingletonパターンで引数ありのコンストラクタを使用しようとするのが無謀なのでしょうか。
http://codepad.org/Dbpg8Xp0
0225デフォルトの名無しさん
2011/09/25(日) 03:43:44.50A* A::Instance()
{
if (!_instance) { throw; }
return _instance;
}
A* A::Initialize(...)
{
if(_initialized) { throw; }
Locker lock(m);
if(_initialized){
_instance = new A(...);
_initialized = true;
}
}
Singletonなんだし決めうちでいいとは思うけど。
0226デフォルトの名無しさん
2011/09/25(日) 13:41:38.63ありがとうございます。
>Locker lock(m);
この行みなれないんですが、軽く検索して出てきた、マルチスレッドプログラミングで排他処理をしている何か、という理解で大丈夫だったでしょうか?
0227デフォルトの名無しさん
2011/09/25(日) 14:08:39.040229デフォルトの名無しさん
2011/09/25(日) 16:04:24.80C++だとdouble-checked lockingの問題は起きないの?
なんとなく”大丈夫そうに見える”コードではあるけど
それにシングルスレッドならそのロックは無駄だし
複数スレッドからInitializeされない保障があればそのロックは無駄じゃね?
0230デフォルトの名無しさん
2011/09/25(日) 16:43:33.460231デフォルトの名無しさん
2011/09/25(日) 16:54:42.810232デフォルトの名無しさん
2011/09/25(日) 17:04:38.53Singleton はやめとけ。無理がでてきたんなら、ちょうどやめどきだ。
0233デフォルトの名無しさん
2011/09/25(日) 17:05:04.470234デフォルトの名無しさん
2011/09/25(日) 17:22:29.790235デフォルトの名無しさん
2011/09/25(日) 17:28:47.320236デフォルトの名無しさん
2011/09/25(日) 18:32:32.95まぁシングルトンでなければならない理由が分からんのだが
"シングルトンクラス内部で保持するインスタンス生成"メソッドを外部から実行出来る用意して、そいつで初期化すればいいんじゃねの?
もちろん"インスタンス生成"メソッドを誰もが何度も実行しちゃうのどうよ?とかいろいろ考慮必要だけどね
0237デフォルトの名無しさん
2011/09/25(日) 18:40:36.08教えてもらえないでしょうか
0238デフォルトの名無しさん
2011/09/25(日) 18:46:46.180239デフォルトの名無しさん
2011/09/25(日) 18:48:05.38この例だと、シングルトンが自分で情報を取りに行くようにしたほうが楽だとは思う
0240デフォルトの名無しさん
2011/09/25(日) 19:02:23.14thx
0241デフォルトの名無しさん
2011/09/25(日) 19:26:59.030242デフォルトの名無しさん
2011/09/25(日) 19:33:55.84template<int N> struct uint {};
template<> struct uint<8> { typedef uint8_t type; };
0243デフォルトの名無しさん
2011/09/25(日) 19:41:15.76すいません言い忘れました
stdintを使わない場合のはなしです
0244デフォルトの名無しさん
2011/09/25(日) 20:03:31.64すいません言い忘れました
パソコンを使わない場合のはなしです
0245デフォルトの名無しさん
2011/09/25(日) 20:27:44.56メディアデバイスへのアクセスをしたく思っているのですが、
調べ方が悪いこともあり、みつからずにいるのですが、、、
0246デフォルトの名無しさん
2011/09/25(日) 20:54:49.710247デフォルトの名無しさん
2011/09/25(日) 21:32:59.160248デフォルトの名無しさん
2011/09/25(日) 22:30:30.77無理じゃね。
uintN_t型以外で確実にNビットであるunsigned型なんかないだろ。Nビット以上であることは保証されてる型はあるけど。
0249デフォルトの名無しさん
2011/09/25(日) 22:36:36.97Javaにおける、その問題点は
A *p = new A(); が、
Javaにおいては
A *p = ::operator new(sizeof(A)); //メモリだけを確保
new (p) A(); //配置newによるコンストラクタの呼び出し
という形で行われることを許容していることが原因だったはず。
C/C++においては、通常は=の右辺の演算が行われてから代入されるが
規格において、=の前後にシーケンスポイントは無かったと思うので(詳しい規格は知らない)
コンパイラがそのようなコードを出力することも、絶対無いとは言い切れない、と思う。
が、普通は、最適化OFFであっても、そのような無駄なコードはまずあり得ないはず。
でも、俺がそういうコードを吐くコンパイラを見たことがない、というだけで
厳密なことは知らない。
ただ、C++においてはローカルなstatic変数の初期化の方を問題視する場合も多いので
重視されていないだけかもしれない。
0250デフォルトの名無しさん
2011/09/25(日) 22:48:22.37#include <iostream>
#include <boost/mpl/vector.hpp>
#include <boost/mpl/pop_front.hpp>
#include <boost/mpl/front.hpp>
#include <boost/mpl/eval_if.hpp>
using namespace boost::mpl;
template <typename Vec, int NBits>
struct uint_impl {
static const bool Hit = (sizeof(typename front<Vec>::type) >= (NBits+7)/8);
typedef typename eval_if_c<Hit, front<Vec>, uint_impl<typename pop_front<Vec>::type, NBits> >::type type;
};
template <int NBits>
struct UInt {
typedef vector<unsigned char, unsigned short, unsigned, unsigned long, unsigned long long> Vec;
typedef typename uint_impl<Vec, NBits>::type type;
};
int main() {
UInt<8>::type a = 0;
std::cout << sizeof(UInt<8>::type) << std::endl;
std::cout << sizeof(UInt<16>::type) << std::endl;
std::cout << sizeof(UInt<32>::type) << std::endl;
std::cout << sizeof(UInt<64>::type) << std::endl;
}
0251デフォルトの名無しさん
2011/09/25(日) 23:28:09.750252デフォルトの名無しさん
2011/09/25(日) 23:32:01.580253デフォルトの名無しさん
2011/09/25(日) 23:51:47.63ほぼドンピシャのがあるね。あとは>>250みたいなのと組み合わせればいける。
もちろんboost使わずに泥臭く書くのもありだし、C++11ならvariadic templatesを使えば簡単に書けそう。
0254デフォルトの名無しさん
2011/09/26(月) 00:02:01.070255デフォルトの名無しさん
2011/09/26(月) 16:26:57.53class hoge
{
private:
deque<int> DEQ
}
void hoge::Push_num(int a)
{
DEQ.push_back(a);
}
これだけで何故か実行するとエラーが出て、次のような場所に飛ばされます
inline void _Container_base12::_Orphan_all()
{ // orphan all iterators
#if _ITERATOR_DEBUG_LEVEL == 2
if (_Myproxy != 0)
{ // proxy allocated, drain it
_Lockit _Lock(_LOCK_DEBUG);
for (_Iterator_base12 **_Pnext = &_Myproxy->_Myfirstiter;
*_Pnext != 0; *_Pnext = (*_Pnext)->_Mynextiter)
(*_Pnext)->_Myproxy = 0;
_Myproxy->_Myfirstiter = 0;
}
#endif /* _ITERATOR_DEBUG_LEVEL == 2 */
}
何が悪いのか全く検討もつかないのですが・・・
0256デフォルトの名無しさん
2011/09/26(月) 16:34:33.71中途半端に書き写したりしないで全部コピペしたら?
0257デフォルトの名無しさん
2011/09/26(月) 18:15:02.37class hoge
{
private:
deque<int> DEQ
public:
void Push_num(int a)
{
DEQ.push_back(a);
}
};
または
class hoge
{
private:
deque<int> DEQ
public:
void Push_num(int a);
};
void hoge::Push_num(int a)
{
DEQ.push_back(a);
}
0258デフォルトの名無しさん
2011/09/26(月) 18:24:31.38○見当
0259255
2011/09/26(月) 18:56:17.47コードは257さんの書いてくれた上の方です(最も両方試して同じだったのですが・・・)
それでやっていることは
class Main
{
private:
hoge h;
public:
void mainloop();
}
void Main::mainloop()
{
int a=3;
h.Push_num(a);
}
これだけなのです。単に呼び出して入れるだけで上記のエラーが出ます
実際には他にも関数などがありますがエラーが出る関数でやっていることはこれだけです
DEQに入っている個数は関係ないようで空でもなります
0260デフォルトの名無しさん
2011/09/26(月) 19:09:05.26classの最後にセミコロンが無いんだけど
書き写しせずにコピペしろって
0261デフォルトの名無しさん
2011/09/26(月) 19:29:11.54関係ないものが多量にあるのですが・・・
0262デフォルトの名無しさん
2011/09/26(月) 19:32:57.99関係あるかどうかはこっちが判断するんだよ
0263デフォルトの名無しさん
2011/09/26(月) 19:33:28.20その行番号以外の箇所で起きたエラーがその行番号で顕在化するだけだ。
だから、再現する最低限のソースを全て貼れ。
0264デフォルトの名無しさん
2011/09/26(月) 19:38:32.04元の環境を壊さないためにもまず最初にプロジェクト全体をコピーしてそっちで作業するようにして、
不要と思う場所を全部コメントアウトする。
それでも同じエラーが出る場合、コメントアウトした場所を削除してここに貼り付ける。
0265デフォルトの名無しさん
2011/09/26(月) 19:42:55.84と思ったら解決してしまいました・・・お騒がせしてすいません
class hoge
{
private:
int error[5];
deque<int> DEQ
public:
};
error[5]=num;
これが原因でメモリを突き抜けてたみたいです・・・
クラスでエラーが出たときは別の変数も見ないとダメですね。
自分が不要だと思っていた所が全然不要じゃなかったことが見にしみました
0266デフォルトの名無しさん
2011/09/26(月) 19:55:44.75変換ソフト変えたほうがいいんじゃね?w
0267デフォルトの名無しさん
2011/09/26(月) 20:08:14.510268デフォルトの名無しさん
2011/09/26(月) 20:09:56.140269デフォルトの名無しさん
2011/09/26(月) 20:47:27.24可変長引数に対して動的にメモリを割り当てたいのですが、
左辺にはva_argマクロをおけず、エラーとなります。
void func(int dummy,...)
{
va_list args;
va_start(args,dummy);
va_arg(args,double*)=malloc(sizeof(double)*N);
va_end(args);
}
このような場合に、何かうまい解決策はないものでしょうか。
なお、OSはUbuntuで、コンパイラはインテル C++ コンパイラの非商用版です。
よろしくお願いいたします。
0270デフォルトの名無しさん
2011/09/26(月) 21:09:03.08一度va_argの値を変数に代入すればいいでしょ
void func(int N, ...)
{
va_list args;
double **p;
va_start(args, N);
p = va_arg(args, double **);
*p = (double *)malloc(sizeof(double) * N);
va_end(args);
}
int main(void)
{
double *p;
func(10, &p);
p[0] = 1.0;
printf("%f\n", p[0]);
free(p);
return 0;
}
0271デフォルトの名無しさん
2011/09/26(月) 21:17:50.75早速の返信ありがとうございます。
一回変数をかませるということに考えが至らなかった・・・orz
勉強になりました。ありがとうございました。
0272デフォルトの名無しさん
2011/09/26(月) 21:54:39.060273デフォルトの名無しさん
2011/09/26(月) 22:06:14.460274269
2011/09/27(火) 21:37:11.05先日いただいた指摘を元にコードを組んでみたのですが、
どうにもsegmentation faultが取り除けず、困っております。
もしよろしければ、再度見ていただけないでしょうか。
以下がコードです。
http://codepad.org/O5ITfhND
http://codepad.org/BhDlvQRc
上が問題ないコード、下が問題のあるコードです。
new_memory、およびdelete_memoryは単独では
問題なく動きます。setArrayおよびfreeArrayも、
可変引数がひとつの場合はちゃんと動くのですが、
下のように二つ以上になるとsegmentation faultと
なってしまいます。どうやら可変長引数を解析する段階で、
一つ目の変数しかメモリを確保していないようです。
0275デフォルトの名無しさん
2011/09/27(火) 21:56:36.720276デフォルトの名無しさん
2011/09/27(火) 22:10:04.68というかC++でそういうのやめろよ
0277デフォルトの名無しさん
2011/09/27(火) 22:15:57.95そもそも、setArrayは、何故に可変引数を受け取る形にしてるわけ?
まあCなら、&でアドレス渡しにすると型とかがどうなるのかよくわからない、
というのも理解できなくはないけど
C++なのだから、参照渡しにすれば(見た目)同じdouble**型を扱うだけで済むでしょ。
可変引数のおべんきょ、ってわけでも無さそうだし。
0278デフォルトの名無しさん
2011/09/27(火) 22:35:28.90ttp://codepad.org/Vtzpx5lA
なにがやりたいのか分からんが、こういう感じか?
0279デフォルトの名無しさん
2011/09/27(火) 22:45:52.73可変引数は使わない方がいいぞ。
0280デフォルトの名無しさん
2011/09/27(火) 22:57:37.96下記の実験コードで、VC2008で動作していたものが
VC2010でstd::bindにエラーが出てコンパイルが通らなくなりました。
#include <functional>
#include <algorithm>
#include <vector>
#include <list>
namespace std { using namespace std::tr1; }
using namespace std::tr1::placeholders;
struct STRUCT {
int a;
};
typedef std::vector<STRUCT> VStruct;
typedef std::list<VStruct> LVStruct;
static LVStruct lvs;
int main()
{
const STRUCT str = {0, 0, 0};
std::for_each(lvs.begin(), lvs.end(), std::tr1::bind(&VStruct::push_back, _1, str));
}
namespaceの部分からtr1を取り除いてcygwin版g++で試したところコンパイルが通らなかったので、
もともとNGだったようなのですが、bindをどう修正すればよいのか教えて頂けないでしょうか。
※エラーコードは長いので、先頭の方を抜粋して次レスに書きます。
0281デフォルトの名無しさん
2011/09/27(火) 22:59:58.080282280
2011/09/27(火) 23:01:25.471>d:\usr\home\var\dev\testfunc\main.cpp(27): error C2780: 'std::tr1::_Bind<_Rx,_Rx,std::tr1::_Bind10<std::tr1::_
Callable_pmf<_Rx(__fastcall _Farg0::* const )(_Farg1,_Farg2,_Farg3,_Farg4,_Farg5,_Farg6,_Farg7,_Farg8,_Farg9)
volatile const,_Farg0>,_Arg0,_Arg1,_Arg2,_Arg3,_Arg4,_Arg5,_Arg6,_Arg7,_Arg8,_Arg9>> std::tr1::bind(_Rx (__fastc
all _Farg0::* const )(_Farg1,_Farg2,_Farg3,_Farg4,_Farg5,_Farg6,_Farg7,_Farg8,_Farg9) volatile const,_Arg0,_Arg1
,_Arg2,_Arg3,_Arg4,_Arg5,_Arg6,_Arg7,_Arg8,_Arg9)' : 11 引数が必要です - 3 が設定されます。
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\xxbind1(1026) : 'std::tr1::bind' の宣言を確認してください。
※後は延々と同じエラーが100個ほど出てからコンパイラが
error C1003: プログラム内のエラーが 100 個を超えました。コンパイルは中断されます。
といってコンパイルを断念します。
0283281
2011/09/27(火) 23:05:27.16というかVStructのインスタンスはどこにあるの?
0284280
2011/09/27(火) 23:11:13.17回答ありがとうございます。
VStructのインスタンスは実際のコードだとfor_eachを呼び出す前に
LVStructにpush_backでコピーしています。
0285デフォルトの名無しさん
2011/09/27(火) 23:20:17.55std::for_each(lvs.begin(), lvs.end(), [str](VStruct& vec) {
vec.push_back(str[0]);
vec.push_back(str[1]);
vec.push_back(str[2]);
});
こういうことがやりたかったのかな?
0286280
2011/09/27(火) 23:32:52.14str[1]1、str[2]は不要ですが、概ねそのようなものです。
※というか、この場合str[1]、str[2]って何を指すのでしょうか?
意図としては
lvsに複数のvectorが登録済みで、外部から与えられた値strを
全てのvectorにコピーするための処理です。
うまく表示されるかわかりませんが
lvs---+--vec[0] <= str
+--vec[1] <= str
+--vec[2] <= str
上記のようなイメージです。
0287デフォルトの名無しさん
2011/09/27(火) 23:42:41.53> const STRUCT str = {0, 0, 0};
これが配列に見えただけ
bindでメンバ関数呼び出すには第二引数がインスタンスへのポインタじゃないとダメ
0288280
2011/09/28(水) 00:16:12.93回答ありがとうございます。
第二引数が _1の方かstrの方かわからなかったので
typedef std::vector<STRUCT*> VStruct;
typedef std::list<VStruct*> LVStruct;
上記両方試してみましたがどちらにしろVC2010、g++どちらもエラー内容は変わりませんでした。
0289デフォルトの名無しさん
2011/09/28(水) 00:20:22.52_1の方
インスタンスへのポインタっていうのはそういう意味じゃない
VStruct v;
std::tr1::bind(&VStruct::push_back, &v, str)(); // これはOK
std::tr1::bind(&VStruct::push_back, v, str)(); // これはダメ
0290デフォルトの名無しさん
2011/09/28(水) 00:25:59.18std::bind<void (VStruct::*)(const STRUCT &)>(&VStruct::push_back, std::placeholders::_1, str)
push_backにmove用のpush_backが追加でオーバーロードされて一意に決定できなくなったから
呼び出すべき関数の型を明示する必要がある。
0291280
2011/09/28(水) 00:53:34.75moveセマンティクス対応でしたっけ。
記載していただいた対応をしてみたらエラーメッセージが変わりました。
このあたりに原因がありそうですね。
1> include\xxcallobj(13): error C2064: 2 引数を取り込む関数には評価されません。
1> include\xxbind1(292) : コンパイルされたクラスの テンプレート のインスタンス化
'_Ret std::tr1::_Callable_obj<_Ty,_Indirect>::_ApplyX<_Ret,std::vector<STRUCT>&,_Arg&>(_Arg0,_Arg1)' の参照を確認してください
1> with
1> [
1> _Ret=_Rx,
1> _Ty=void (__thiscall std::vector<STRUCT>::* )(const STRUCT &),
1> _Indirect=false,
1> _Arg=STRUCT,
1> _Arg0=std::vector<STRUCT> &,
1> _Arg1=STRUCT &
1> ]
0292デフォルトの名無しさん
2011/09/28(水) 01:39:22.46std::bind<void, void (VStruct::*)(const STRUCT &)>(&VStruct::push_back, std::placeholders::_1, str)
0293デフォルトの名無しさん
2011/09/28(水) 04:12:41.01そもそもsetArrayのような関数を定義したのは、
同じサイズの2次元配列を異なる名前で大量に
(50個以上)確保する必要があり、それを
コード上にベタ打ちしたく無かったからです.
すなわち、可変長引数の部分にはdouble**型の引数が
(そしてそれのみ)大量に存在し、そのそれぞれについて
2次元配列を確保したい、と言うことです.
>>275
va_startからva_endまでが勝手にループになっていると
勘違いしていました.ありがとうございます.
C++ではこのような書き方は推奨されないのでしょうか.
>>276
参照渡しというものがあるのですか.勉強します.
>>277
まさにそのようなかんじです。第一引数に可変引数の
個数を書いておけばよかったのですね.このコードは、
それぞれの配列のサイズを変える場合に拡張してある、
という理解でよいでしょうか.
>>279
可変引数には何か問題があるのでしょうか.
0294デフォルトの名無しさん
2011/09/28(水) 04:20:55.39ラムダか自分でファンクタ書いたほうがいいって
0296280
2011/09/28(水) 07:55:41.17>>294
ありがとうございます。どちらのコードもVC2010でコンパイルが通る事が確認できました。
ラムダかファンクタ書いた方が良いのはその通りですね。
実際にVC++2010に移植する際にはラムダ式に書き換えようと思います。
(今回は移植可能かの調査だったので、元コードをあまり変えないで解決しようと考えていました)
※一応試してみたg++ 4.3.4 -std=c++0xでは、やはりエラーは治りませんでした。
>>292はエラー変化なし、>>294は「address of overloaded function with no contextual type information」といった体です。
g++はVC++より型解決が厳しいのでしょうね。(後に出たエラーはよくわかりませんでしたが)
0297デフォルトの名無しさん
2011/09/28(水) 17:04:06.280298デフォルトの名無しさん
2011/09/28(水) 18:37:07.950299デフォルトの名無しさん
2011/09/28(水) 20:06:32.00クラスファイルとソースファイルのわけかたがよくわからないでつ。
0300デフォルトの名無しさん
2011/09/28(水) 20:08:17.87共通のヘッダファイルみたいなのを作ってその中にクラスを入れたりすればいいの?
#include "共通ヘッダ.h"
int WINAPI WinMain(HINSTANCE hi, HINSTANCE hi2, LPSTR pstr, int wwwwwww)
{
クラスA* ca = new クラスA();
クラスB* cb = new クラスB();
ca->数値 = 0;
cb->数値 = 8;
ca->数値 = cb->数値;
ca->メッセージテスト();
cb->メッセージテスト();
delete(cb);
delete(ca);
return 0;
}
0301デフォルトの名無しさん
2011/09/28(水) 20:11:08.69クラスの場合はクラス名だけexternしてもだめっぽくてクラスの宣言と実体を分けて記述しなきゃいかんの?
↓こんなかんじでいいのかな?
クラスA.h
#ifndef _インクルードガード_クラスA_
#define _インクルードガード_クラスA_
#include "共通ヘッダ.h"
class クラスA
{
public: int 数値;
public: クラスA();
public: ~クラスA();
public: void メッセージテスト();
};
#endif//_インクルードガード_クラスA_
0302デフォルトの名無しさん
2011/09/28(水) 20:11:49.55#include "共通ヘッダ.h"
クラスA::クラスA()
{
MessageBox(NULL,"クラスAのコンストラクタ","",MB_OK);
}
クラスA::~クラスA()
{
MessageBox(NULL,"クラスAのデストラクタ","",MB_OK);
}
void クラスA::メッセージテスト()
{
MessageBox(NULL,"クラスAのメッセージテスト","",MB_OK);
}
0303デフォルトの名無しさん
2011/09/28(水) 20:13:21.66作法的にっていうかデザイン的にっていうかこんな感じでいいんでしょうか?
#ifndef _インクルードガード_共通ヘッダ_
#define _インクルードガード_共通ヘッダ_
#include <windows.h>
#include "クラスA.h"
#include "クラスB.h"
#endif//_インクルードガード_共通ヘッダ_
0304デフォルトの名無しさん
2011/09/28(水) 20:16:08.41みんなよく理解できるよね。慣れれば楽勝なの?
JAVA使ってたのでプロトタイプ宣言とかヘッダファイルとか
わけわからんです。
おまえらよくわかるね。すごすぎ。
0305デフォルトの名無しさん
2011/09/28(水) 20:16:44.040306デフォルトの名無しさん
2011/09/28(水) 20:22:40.572回以上同じクラスの宣言しちゃまずいから コピペ抑制の為にガードしてるん
0307デフォルトの名無しさん
2011/09/28(水) 20:27:17.60共通ヘッダ.hを全てのファイルでインクルードしまくるってのは
コンパイルが遅くなる以外でなにかまずかったりするの?
特に問題ないの?
テンプレートを使うともっと複雑になるのでつね。
0308デフォルトの名無しさん
2011/09/28(水) 20:28:12.73そのやり方は無駄なインクルードが多くなるしいつか相互インクルードにぶち当たるからやめたほうがいいな
クラスはexternじゃなくて前方宣言する
0309デフォルトの名無しさん
2011/09/28(水) 20:28:27.920310デフォルトの名無しさん
2011/09/28(水) 20:28:53.490311デフォルトの名無しさん
2011/09/28(水) 20:42:03.35前方宣言というのはプロトタイプ宣言みたいなやつ?
こんな感じでいいのでせうか?
#include <windows.h>
class クラスA;
class クラスB;
#include "クラスA.h"
#include "クラスB.h"
int WINAPI WinMain(HINSTANCE hi, HINSTANCE hi2, LPSTR pstr, int wwwwwww)
{
クラスA* ca = new クラスA();
クラスB* cb = new クラスB();
ca->メッセージテスト();
delete(cb);
delete(ca);
return 0;
}
しかしこれだとクラスのヘッダファイルごとに#include <windows.h>しないとだめでせうよね?
0312デフォルトの名無しさん
2011/09/28(水) 20:43:44.110313デフォルトの名無しさん
2011/09/28(水) 21:01:45.21あー前方宣言の話をしたのがまずかったかな。
とりあえず共通ヘッダーは相互インクルードっていうのが起きる可能性があるからそれに注意する
前方宣言は相互インクルードを防ぐ手段の1つ
前方宣言は#include "クラスA.h"をインクルードしたらエラーが起きるけどクラスAを使用したい時に使う
だからそのWinMainのやつでは普通に#include "クラスA.h"できるからいらない
0314デフォルトの名無しさん
2011/09/28(水) 21:06:40.49クラスAとクラスBが相互参照しているなら、
class クラスA;
はクラスB..hに、
class クラスB;
はクラスA.hに記述されてるはずでは?
ヘッダファイルは「それをインクルードする時にXX.hも一緒にしなければならない」
というような前提条件を作らないのが基本。
もし、まっさらのcppに
#include "クラスA.h"
だけ書いてコンパイルしてwindows.hが必要だってエラーが出るならそれはクラスA.hに含めるべき。
その上で、ヘッダファイルがヘッダファイルをインクルードする回数を極力減らすようにする。
0315デフォルトの名無しさん
2011/09/28(水) 21:15:57.180316デフォルトの名無しさん
2011/09/28(水) 21:16:17.79相互参照の話は共通ヘッダーを使うと相互参照が起きる可能性があるよって話だけで
別にAとBが相互参照してるわけじゃない・・・と思う
0317デフォルトの名無しさん
2011/09/28(水) 21:19:18.24とりあえず、な。でも使わないほうがいいとは言っておく
0318デフォルトの名無しさん
2011/09/28(水) 21:20:22.66> 相互参照とかができなくて不便
とか書いてたから、既にしてる/これからする可能性がある、のかと思って書いた。
してるなら設計まずいし、してないならそれに越したことないね。
0319デフォルトの名無しさん
2011/09/28(水) 21:26:57.96解決しました
0320デフォルトの名無しさん
2011/09/28(水) 22:38:33.42実際相互参照できたら便利じゃん と思っていたけど
できるかどうか検証してみたらやらないほうがいいのがよくわかりまつた
今回は長々と質問に答えていただきましてありがとうございまつた
0321デフォルトの名無しさん
2011/09/28(水) 23:08:06.020322デフォルトの名無しさん
2011/10/02(日) 10:31:15.74最初のファイルオープンが読 → 後続は読のみ許可
最初のファイルオープンが書 → 後続はオープン禁止
という感じで
0323デフォルトの名無しさん
2011/10/02(日) 11:14:52.96Windowsなら、CreateFileで共有モードを適切に設定すればできそう
前者: chmod -w
後者: chmod -rw
0325デフォルトの名無しさん
2011/10/07(金) 17:52:48.12そういうライブラリってすでにどこかにないっすか?
0326デフォルトの名無しさん
2011/10/08(土) 15:36:01.14{
// dは使われない
}
int main( void )
{
double x , y , z;
Func( x * y * z ) ;
return 0 ;
}
こういうコードはメジャーなコンパイラでは最適化されてx*y*zの計算はスキップされたりする?
0327デフォルトの名無しさん
2011/10/08(土) 15:40:05.250328デフォルトの名無しさん
2011/10/08(土) 15:57:05.560329デフォルトの名無しさん
2011/10/08(土) 18:47:27.630330デフォルトの名無しさん
2011/10/08(土) 20:39:16.25bcc32(5.82 オプション -G)、gcc(4.6.1 オプション -O2)で省略された
0331デフォルトの名無しさん
2011/10/08(土) 22:08:56.240332デフォルトの名無しさん
2011/10/10(月) 21:34:58.73何があっても使われないかにも寄るな → だったら(double const&)にしとけよと
0333デフォルトの名無しさん
2011/10/10(月) 23:25:54.860334デフォルトの名無しさん
2011/10/11(火) 00:16:28.900335デフォルトの名無しさん
2011/10/11(火) 00:21:03.040336デフォルトの名無しさん
2011/10/11(火) 00:26:40.600337デフォルトの名無しさん
2011/10/11(火) 00:34:06.98と思ってたら最近のコンパイラはエラーにならないのね
0338デフォルトの名無しさん
2011/10/11(火) 00:38:10.760339デフォルトの名無しさん
2011/10/11(火) 00:38:30.340340デフォルトの名無しさん
2011/10/11(火) 00:58:51.210341デフォルトの名無しさん
2011/10/11(火) 02:11:33.130342デフォルトの名無しさん
2011/10/11(火) 19:57:43.490343デフォルトの名無しさん
2011/10/11(火) 20:51:59.74返す整数値が0以上ならファイルハンドルで負ならエラーという仕様です。
現状intをキーとしたファイル情報のmapを使って要素が空なら0を、
空でないなら最終要素のキーに1を足した値をキーに使ってファイルハンドルとして返しています。
あまりよい方法に思えないのですが、なにかよい方法はないでしょうか?
0344デフォルトの名無しさん
2011/10/11(火) 20:57:32.74何言ってんだかわかんない
0345343
2011/10/11(火) 21:07:06.74http://ideone.com/CStaJ
0346デフォルトの名無しさん
2011/10/11(火) 21:18:19.44何したいんだかわかんない
0347デフォルトの名無しさん
2011/10/11(火) 21:26:28.15なぜFILE*を敢えてそういう形でラップしたいのかは分からんけど
少なくとも実装がスレッドセーフにはなっていないな
それと、map<>でもいいけど、やや富豪的というか……
intがキーで0から採番していくんなら、配列かvector<>でよくね
別途フリーリスト管理をしないなら、空きスロットを探すときに
下から舐めないといけないから、open相当の処理は多少遅くなるが
物凄く大量のファイルを開くわけでもないだろうから(どうせ制限がある)
リニアに舐めたところで全然大した話じゃないし、それ以降のアクセスはO(1)で済む
メモリの無駄も少ないだろう
0348デフォルトの名無しさん
2011/10/11(火) 21:29:35.71そんなラップならしない方がマシだと思う
0349デフォルトの名無しさん
2011/10/11(火) 21:43:18.86eraseしたら乙るね
>>348
何がしたいのかも聞かずに
頭ごなしに否定するのはどーかと思う
0350デフォルトの名無しさん
2011/10/11(火) 21:54:16.59こういうのはどういう使われ方をされるかから考えて決めるもんだよね。
>>343は内部の処理から決めようとしてるからうまくいかない。
後は気になってるのがg_IoList
グローバル変数のつもりなら改めて否定させてもらうよ。
0351デフォルトの名無しさん
2011/10/11(火) 22:06:00.57配列やvector<>を使うなら、close()したら、この場合は単にdeleteして
ヌルポインタをかわりに入れるような実装を想定していたよ
開きスロットとかフリーリスト管理とかいうのは、そういう意味
0352343
2011/10/11(火) 22:15:34.63それを擬似的に可能にしようとしてあのようなコードになりました。
mapかvectorかはどちらがよいのかわからずmapを使ったのと、
スレッドセーフ云々は見づらくなるので省きました。
0353デフォルトの名無しさん
2011/10/11(火) 22:27:27.78>それを擬似的に可能にしようとしてあのようなコードになりました。
ちょっと言っている意味が分からない
システムってのはOSや処理系のことじゃなくて、自分が作ろうとしている
シロモノのことか?
その自分が作ろうとしているものに、ファイルを最大10個しか開けないように
しなければならない、という謎の要求仕様があるので、ああいうものを作った
ということで合ってる?
0354デフォルトの名無しさん
2011/10/11(火) 22:28:27.350355デフォルトの名無しさん
2011/10/11(火) 22:28:37.27そういうのは事前に書いておく方がいいよ。
他にもメモリが超少ないとかあったら早めに書いてね。
(組み込み系の人かな?)
> 擬似的に可能にしようとしてあのようなコードになりました。
話を聞いた後でコードを見直してもそんな事情なんてさっぱりわからんw
どういう方針で可能にするつもり?
例えば、10個既に開いてる時に更に要求が来たらどう対処するの?
0356デフォルトの名無しさん
2011/10/11(火) 22:35:02.51346=348なんてのは書いた本人にしか分からん
>>351
後半読んでなかったわ、なるほどね
>>352
うん
人にはいろいろ悩みがあるよね
で、何がしたくて悩んでるの?
0357デフォルトの名無しさん
2011/10/11(火) 22:47:50.50>346=>348=>350=>355です。
なんとなく>343の事情が見えてきたな。
状況を説明すると仕事だってバレるから必要な情報ですら小出しにしてたんでしょ。
0358343
2011/10/11(火) 22:58:51.08小出しですみません。
説明大変なので全部上げます。
mutex関連は説明長くなるので省きました。
http://ideone.com/idaD5
あと仕事じゃなくてただの学生の趣味です。
0359デフォルトの名無しさん
2011/10/11(火) 23:10:14.360360デフォルトの名無しさん
2011/10/11(火) 23:14:35.35IoCtx*をかえせばいいんじゃないの?
0361デフォルトの名無しさん
2011/10/11(火) 23:15:53.31C>C++がすんなりいかない人は
間にJavaやC#を挟むといいよ
0362デフォルトの名無しさん
2011/10/11(火) 23:16:24.530363357
2011/10/11(火) 23:38:37.76better Cで全部行くつもりなのね。
この使いかたならグローバルも仕方ないか…
mapやlist使うの止めて自前のリングバッファにすればずっと簡潔・高速になると思うよ。
正直無駄なことばっかやってるようにみえる。
0364デフォルトの名無しさん
2011/10/11(火) 23:39:58.20なら、なんで自分でわざわざ管理するのかやっぱり分からんな……
自分で管理してもシステムの制限は越えられないのんと違う?
だから、システムの制限よりなんらかの理由で減らしたいから管理してるのかと
思ってた
それとも、ファイルうっかり開きすぎてもEMFILE(Too many open files)が
帰ってこないようなシステムなんか?
0365343
2011/10/11(火) 23:50:06.26openを置き換えれるようにint型で管理したいんです。
>>363
無理にSTL使う必要はないんですね。
C++は多機能すぎて選ぶのが難しいです。
おとなしく自前にします。
>>364
読み書きのたびに開いたり閉じたりしています。
そのままだとさすがに遅いので若干工夫したつもりですが…。
0366デフォルトの名無しさん
2011/10/11(火) 23:57:55.14なるほど、そこまで聞いてやっと意図がわかった
0368デフォルトの名無しさん
2011/10/12(水) 00:23:00.15返すときにintにキャストすればいい
負ならエラーっていう仕様も満たしたければ-1引いとけばいい
0369デフォルトの名無しさん
2011/10/12(水) 00:24:27.440370デフォルトの名無しさん
2011/10/12(水) 01:38:13.080371デフォルトの名無しさん
2011/10/12(水) 02:52:56.68ヌルポインタを int にキャストすれば 0 になると思ってるんなら CFAQ からやりなおせ。
http://www.kouno.jp/home/c_faq/c5.html
0372デフォルトの名無しさん
2011/10/12(水) 03:01:38.91実例よろしくw
0373デフォルトの名無しさん
2011/10/12(水) 03:11:00.540374デフォルトの名無しさん
2011/10/12(水) 03:15:19.53アホ。内部表現が0じゃなくてもintにキャストすれば0になることは保証されてんだあよ。
0375デフォルトの名無しさん
2011/10/12(水) 03:24:06.60現役でお願いw
0376デフォルトの名無しさん
2011/10/12(水) 04:43:54.99C or C++ 規格のどこで?それとも特定のコンパイラの話?
0377デフォルトの名無しさん
2011/10/12(水) 09:29:00.960378デフォルトの名無しさん
2011/10/12(水) 09:49:00.350379デフォルトの名無しさん
2011/10/12(水) 10:01:44.86if(p){
なにか
}
これはもしかして未定義になりますか?
0380デフォルトの名無しさん
2011/10/12(水) 10:02:55.450381デフォルトの名無しさん
2011/10/12(水) 10:03:36.600382デフォルトの名無しさん
2011/10/12(水) 10:04:09.280383デフォルトの名無しさん
2011/10/12(水) 18:03:36.85ありがとう
0384デフォルトの名無しさん
2011/10/13(木) 15:33:05.74a++;
}
WindowsだとSleep(1);挟まないとCPUが100%に張り付きますが、
Linuxだと挟まなくても張り付きません。
そんなもんなんですかね?
Linuxではそこのところ特に気にしなくでもOKということでしょうか?
0385デフォルトの名無しさん
2011/10/14(金) 00:28:41.58・マルチコアのCPU使用率の見方を間違えている
0386デフォルトの名無しさん
2011/10/14(金) 01:04:15.030387デフォルトの名無しさん
2011/10/14(金) 22:01:27.56っていう場合はexit、abort、terminate、その他、どれが一番マシですか?
0388デフォルトの名無しさん
2011/10/14(金) 23:56:58.180389デフォルトの名無しさん
2011/10/15(土) 00:39:29.370390デフォルトの名無しさん
2011/10/15(土) 00:43:05.680391デフォルトの名無しさん
2011/10/15(土) 01:24:58.520392384
2011/10/15(土) 09:01:13.81ありがとうございます。
Windowsではタスクマネージャーで確認すると、1つのCPUコアが100%に張り付きます。
Linuxではtopコマンドで当該プロセスのCPU使用率が0.1%とか0.2%です。
趣味プログラムなので当面WindowsのみSleep挟む方向でやってます。
0393デフォルトの名無しさん
2011/10/15(土) 19:58:14.01その式をHevensコンパイラ1.7に書けても
ストイコリッチーしか復活しないぞ。
しかも、左手左足がついてなかった。
0394デフォルトの名無しさん
2011/10/15(土) 21:51:55.89死者を甦らせる方法は今の所誰一人成功していないぜ
0395デフォルトの名無しさん
2011/10/15(土) 22:04:27.160396デフォルトの名無しさん
2011/10/15(土) 22:19:11.61脳死したらまず無理だ
0397デフォルトの名無しさん
2011/10/15(土) 22:19:59.760398デフォルトの名無しさん
2011/10/15(土) 22:34:19.040399デフォルトの名無しさん
2011/10/15(土) 22:35:52.730400デフォルトの名無しさん
2011/10/15(土) 23:06:07.03サンプルのプログラムではSequenceファイルの中にGameファイルがあり、
SequenceとGameファイルの中にはいくつかcppがあるのですが、
これを自分で一から作ろうと思ったらどうしたらいいのでしょうか?
例えば、
新規プロジェクトを作成→その中にSequenceファイルを作成→Sequenceフォルダの中に
cppを作成→Sequenceフォルダの中にGameフォルダを作成→その中にcppを作成。
といった手順で作成するのですが、コンパイル出来ません。
本にはプロジェクト内部にディレクトリが構成されているので、
プロジェクトのディレクトリをインクルードパスに指定してやらないといけないと書いてありますが、
あまり意味が分かりません。
ちなみにインクルード出来ない部分は
#include "Sequence/Game/〜.h"です。
0401デフォルトの名無しさん
2011/10/15(土) 23:12:23.64プロジェクトフォルダ
Sequenceフォルダ
*.cpp
�@エクスプローラーから上のようにファイルを作成
�AVC++を開く
�B画面左のソリューションエクスプローラーの該当プロジェクト名で右クリック
�C追加→既存の項目→さっき作ったファイルを指定
0402デフォルトの名無しさん
2011/10/15(土) 23:16:02.400403デフォルトの名無しさん
2011/10/15(土) 23:19:54.52VC++上でフォルダを作るんじゃなくて、新規プロジェクトのフォルダ内に
Sequenceフォルダを作ればいいんですよね?
0404デフォルトの名無しさん
2011/10/15(土) 23:22:33.31それって
プロジェクト → プロパティ → C/C++ → 全般 → 追加のインクルードディレクトリ
に書けばいいんですよね?本に載ってあったんでそのまま書いたんですけどダメ
でした。
エラーはこんな感じで出てます。
未解決の外部シンボル "public: __thiscall Sequence::Game::Parent::~Parent(void)" (??1Parent@Game@Sequence@@QAE@XZ) が関数
0405デフォルトの名無しさん
2011/10/15(土) 23:26:26.90cppの方の名前空間指定を間違えていないか?
0406デフォルトの名無しさん
2011/10/16(日) 00:01:59.21丸々コピーして試したので間違ってないと思います。
0407400
2011/10/16(日) 11:17:28.92あれから調べてみたのですが、VC++上でフォルダを作成しても
Windowsの上では作成されないので、Windows上でも同じように
フォルダを作成し、VC++上と同じようにフォルダを配置すればいいんですよね?
それから、$(GAME_LIB_DIR)\Sequence1\include、だけを追加のインクルードディレクトリに
追加したときには、
fatal error C1083: include ファイルを開けません。'Sequence/Parent.h': No such file or directory
fatal error C1083: include ファイルを開けません。'Sequence/StageSelect.h': No such file or directory
といった感じのエラーが出たので、追加のインクルードディレクトリに$(ProjectDir)を追加しました。
すると先ほどのエラーは消えたのですが、今度は
未解決の外部シンボル "public: __thiscall Sequence::Game::Parent::~Parent(void)"(??1Parent@Game@Sequence@@QAE@XZ) が関数
"public: void * __thiscall Sequence::Game::Parent::`scalar deleting destructor'(unsigned int)" (??_GParent@Game@Sequence@@QAEPAXI@Z) で参照されました。
未解決の外部シンボル "public: __thiscall Sequence::Game::Parent::Parent(int)"(??0Parent@Game@Sequence@@QAE@H@Z) が関数
"public: void __thiscall Sequence::Parent::update(void)" (?update@Parent@Sequence@@QAEXXZ) で参照されました。
と出ました…こんな事も分からない自分に涙が出そうです…
0408デフォルトの名無しさん
2011/10/16(日) 11:37:22.340409デフォルトの名無しさん
2011/10/16(日) 11:52:44.27Parent.cpp,Parent.cxx,Parent.ccなどがあるだろうから
それをプロジェクトに追加
0410384
2011/10/16(日) 15:58:23.91Linuxでも100%に張り付いていました。
お騒がせしました。
0411デフォルトの名無しさん
2011/10/18(火) 18:38:37.58while(AtomicChack(is_not_end)) // 他のスレッドがAtomicSet(is_not_end, false)を実行するのを待つ
{
// 何かする。空ではない
} ;
って書いていてるんだけど
while(is_not_end)
{
// 何かする。空ではない
} ;
こういうふうに書き換えたらまずいですか?
0412デフォルトの名無しさん
2011/10/18(火) 20:51:35.060413デフォルトの名無しさん
2011/10/18(火) 21:28:06.74短くいえば、ダメ
もう少し長く言うと、アトミック性、コンパイラの最適化、メモリの可視性の問題を
全部は解決できないからダメ
C++11ではその目的のためにstd::atomicというのが導入されますた
他の(もっと高級な)言語では、単にその変数をvolatileと宣言しておけばいい
場合もあるけど、C/C++では違います(volatileはあるけどメモリの可視性は
保障されない)
0414デフォルトの名無しさん
2011/10/19(水) 17:56:53.59どれのこと?
0416デフォルトの名無しさん
2011/10/19(水) 18:37:43.140417デフォルトの名無しさん
2011/10/19(水) 21:28:17.97{
public:
A(void)
{
static_cast<D *>(this)->Func() ; // Bの構築が完全に終わってから呼びたい
}
} ;
class B : public A<B>
{
public:
void Func(void)
{
// これはBが完全に構築されてからでないと呼び出してはいけない
}
} ;
なんとかしてコンストラクト時に自動で呼ばせたいんですがいい方法はないでしょうか
B Make(void) { B b; b.Func(); return b; }
のようにファクトリを使うのはコピー不可なので無理です
0418デフォルトの名無しさん
2011/10/19(水) 21:34:31.450419デフォルトの名無しさん
2011/10/19(水) 21:38:31.82ファクトリでコピーじゃなくてshared_ptrででも返すのは?
0420デフォルトの名無しさん
2011/10/20(木) 16:06:51.96ADHDとかADDを指摘された事無い?
0421デフォルトの名無しさん
2011/10/20(木) 17:10:25.24こちらへどうぞ。
日下部陽一著 作ってわかるCプログラミング(第6版)
http://hibari.2ch.net/test/read.cgi/tech/1179389033/
むしろADHD くらいの奴の方が化ける可能性がある。化けそこなうことも多いが。
とにかくみんないっしょじゃつまらん
0423デフォルトの名無しさん
2011/10/26(水) 10:26:13.23template <class A1> void func(A1 const & a1) ;
template <class A1, class A2> void func(A1 const & a1, A2 const & a2) ;
template <class A1, class A2, class A3> void func(A1 const & a1, A2 const & a2, A3 const & a3) ;
}
namespace Fuga { // アプリケーションで使うラップされた関数
template <class A1> inline void Func(A1 const & a1) { hoge::func(a1) ; }
template <class A1, class A2> inline void Func(A1 const & a1, A2 const & a2) { hoge::func(a1, a2) ; }
template <class A1, class A2, class A3> inline void Func(A1 const & a1, A2 const & a2, A3 const & a3) { hoge::func(a1, a2, a3) ; }
}
名前規則に合わせるためと後々の差し替えの可能性を考慮して
上のように既存の関数の薄いラッパーを書いたんだけどオーバーロードがたくさんあるとめんどくさい
これをtypedefのように一発で置換する方法はないだろうか?
0424デフォルトの名無しさん
2011/10/27(木) 22:18:50.14デバッグにコンソールを開いてやりたいのですが
コンソールを開くにはどうすればいいのでしょうか?
0425デフォルトの名無しさん
2011/10/27(木) 22:50:58.33リンカの設定でサブシステムをコンソールにするか
http://comsci.liu.edu/~murali/win32gui/Win32Apps.htm
0426デフォルトの名無しさん
2011/10/27(木) 23:22:04.87デバックしやすくなっわ!
0427デフォルトの名無しさん
2011/10/28(金) 09:43:25.30#ifndef NDEBUG
#include <iostream>
#endif
#ifndef NDEBUG
int main(void) {
HINSTANCE hInstance = (HINSTANCE)GetModuleHandle(0);
#else
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE , LPSTR , int) {
#endif
#ifndef NDEBUG
std::cout << "Debug Msg" << std::endl;
#endif
return 0;
}
0428デフォルトの名無しさん
2011/10/28(金) 10:41:32.72C++11 の variadic templates でなんとか。
0429デフォルトの名無しさん
2011/10/30(日) 15:15:36.49以下のようにしたのですが、#undefと#defineは条件式内で使っても無意味なのか、変数aが1でも2番のマイナスになります。
計算式の種類分、コードを書き出すしか手は無いものなのでしょうか?
#define HUGOU
//上だけグローバルスコープ、以下は関数の中
switch (a) {
case 1: //加算
#undef HUGOU
#define HUGOU +
break;
case 2: //減産
#undef HUGOU
#define HUGOU -
break;
}
int result = 7 HUGOU 5; // プラスのはずがマイナスに。
0430429
2011/10/30(日) 15:22:14.77誤
#define HUGOU
//上だけグローバルスコープ、以下は関数の中
正
#define HUGOU +
//上だけグローバルスコープ、以下は関数の中
0431デフォルトの名無しさん
2011/10/30(日) 15:37:37.060432デフォルトの名無しさん
2011/10/30(日) 15:55:00.29#defineとかはコンパイル前に処理される
加算、減算の関数を作って呼び分けるのが楽なんじゃね
つ>>431
#define はプリプロセッサにより、コンパイラに渡る前に消える。
>>429 をプリプロセッサを通ると次のようなコードになる(はずである)。
switch (a) {
case 1: //加算
break;
case 2: //減産
break;
}
int result = 7 - 5;
0434デフォルトの名無しさん
2011/10/30(日) 16:09:45.10今のほとんどのコンパイラはプリプロセッサ内蔵だから正確には
コンパイラに渡る前に消えるじゃなくてコンパイラ内部で消すだろ
0435429
2011/10/30(日) 16:51:44.23定数がちゃんと文字に置き換わるんですから、定数の宣言は当然それより前に処理されますよね。。
編集時にミスが起こり難い様に工夫しながら別々に関数にする事にします。
ご助言、ありがとうございました〜
bcc32/cpp32: Borland C/C++ Preprocessor
gcc/cpp-3or4.exe
この二つは別プロセスで起動されるようですね。
>>435
#define とか #include とか #if/#ifdef/#elif とかはプリプロセッサが処理する。
ソースコードは、
(1)プリプロセッサ
(2)...(n) コンパイラ (何段階かあると思う)
(n+1) リンカ
と形を変えながら渡って最後に実行可能ファイルに変容する。
>>429 のコードで#define で定義された HUGOU はコンパイラに渡る前に - に置き換えられている。
コンパイル前には、switch 文の中の各 case には、break; 文しか記述されていない。#define そのものはコンパイラには渡っていない。
0437デフォルトの名無しさん
2011/10/30(日) 17:58:43.57実際やってみるとよくわかる
0438デフォルトの名無しさん
2011/10/30(日) 19:02:11.09お前本当に何も知らないんだな
cpp32.exeはトライグラフを内部で処理するとコンパイルが遅くなるから
その部分をくっつけて外に出しただけだ
つまりお前はEmbarcaderoの正規ユーザーではなく割れ厨って事がバレバレ
いつぞや、私のソースを毎回 bcc32 -v -vG でチェックされていた方ですか?お久しぶりです。
>お前本当に何も知らないんだな
いろいろと解説ありがとうございます。
>つまりお前はEmbarcaderoの正規ユーザーではなく割れ厨って事がバレバレ
毎度のことながら、論理が飛躍していませんか?
0440デフォルトの名無しさん
2011/10/30(日) 19:19:18.08>いつぞや、私のソースを毎回 bcc32 -v -vG でチェックされていた方ですか?お久しぶりです。
(゚Д゚)ハァ?何勝手に決めつけてんの?
説明書を読めない==説明書を持っていない==割れ厨ですがな
0441デフォルトの名無しさん
2011/10/30(日) 22:36:31.91/E オプションとかでプリプロセス結果を見られる
0442デフォルトの名無しさん
2011/10/31(月) 16:13:07.86typedef tagHandle * Handle ;
shared_ptr<remove_pointer<Handle>::type> p ;
tpedef int Handle ;
shared_ptr<???> p;
↑どないしましょう?
0443デフォルトの名無しさん
2011/10/31(月) 16:48:07.43とか
0444デフォルトの名無しさん
2011/10/31(月) 18:20:34.140445デフォルトの名無しさん
2011/10/31(月) 18:25:24.63自演?
0446デフォルトの名無しさん
2011/10/31(月) 18:38:18.76http://d.hatena.ne.jp/nagoya313/20100305/1267758837
0447デフォルトの名無しさん
2011/10/31(月) 20:24:39.70pointerという名のtypedefメンバを定義したデリータを指定すればT*型でないものを保持・処理するようになる
#include <iostream>
#include <memory>
typedef int Handle;
Handle get(int v) { return v; }
void release(Handle & h) { std::cout << "release:" << h << std::endl; }
struct handle_deleter
{
typedef Handle pointer;
void operator() (Handle & h) const { release(h); }
};
int main()
{
std::unique_ptr<Handle, handle_deleter> p1(get(100));
return 0;
}
0448デフォルトの名無しさん
2011/11/01(火) 13:26:29.61std::shared_ptr<Handle> handle_factory()
{
return std::shared_ptr<Handle>(new Handle(getHandle()), [](Handle * p) { releaseHandle(*p); delete p; });
}
std::shared_ptr<Handle> p = handle_factory();
とか
0449デフォルトの名無しさん
2011/11/02(水) 00:41:27.43もしそうならどこかで規定されてるもの?
0450デフォルトの名無しさん
2011/11/02(水) 00:43:35.560451デフォルトの名無しさん
2011/11/03(木) 04:28:50.110452デフォルトの名無しさん
2011/11/10(木) 00:09:22.79int *p ;
public:
} ;
のポインタpの中身ってCHoge.(*p)とかじゃなくて *CHoge.pなんだな
何かしっくりこないんだが
0453デフォルトの名無しさん
2011/11/10(木) 00:20:04.910454デフォルトの名無しさん
2011/11/10(木) 10:24:49.55を読んでVS2010でWin32を使ってみたのですが、いきなり躓きました。
以下の通りに書いてみたのですが、メッセージボックスに何も表示されません。(コメント行は原文です)
http://codepad.org/Ca89uaSG
この場合、何がいけないのでしょうか?
すいませんが、よろしくお願いします。
0455デフォルトの名無しさん
2011/11/10(木) 10:35:31.480456454
2011/11/10(木) 10:41:37.50LPWSTR s = L"";
と、宣言すればポインタは取得しているのですが、やはりメッセージボックスには何も表示されませんでした。
0457デフォルトの名無しさん
2011/11/10(木) 10:47:47.90http://codepad.org/O5w3nJge
0458454
2011/11/10(木) 11:56:26.59これだと動きますね。
LPWSTR s = L"テスト";
にして>>454を動かすと、「テスト」が表示されますし。
コピーの方法に問題があるのでしょうか?
原文に戻してstrcpyにすれば、とりあえずsには文字列が入りますが、メッセージボックスが使えないですし。
文字列を変換すれば良いのでしょうが、lstrcpyが使えない理由がわからないままなのが気になります。
0459デフォルトの名無しさん
2011/11/10(木) 12:30:51.95http://social.msdn.microsoft.com/forums/ja-JP/vcgeneralja/thread/5807895a-b602-4a13-a34f-5524ba0843c6/
0460デフォルトの名無しさん
2011/11/10(木) 12:42:56.060461デフォルトの名無しさん
2011/11/10(木) 12:57:28.97自分もその本読んだけど、悪いことは言わん、今すぐ捨てろ。めちゃくちゃだから、その本。
1巻のWin32APIを学びたいならプログラミングWindows(上下)しかない。
値段は高いけど、これ読むかMSDN読む以外にWin32APIを「正しく」理解する方法はない。
2巻の「オブジェクト指向」は「名詞と動詞」みたいな有害なだけの化石概念が出てくる。捨ててよし。
3巻のMFCはクソの極み。読むだけで死ぬ。開く前に捨てよう。
0462デフォルトの名無しさん
2011/11/10(木) 13:04:35.72でももう売ってないだろ?
0463454
2011/11/10(木) 13:06:06.50一度そこを見ましたが・・・よく考えたらUnicodeになってました。
マルチバイトにしたら動きました、ありがとうございます。
>>460
似て異なる物だとは思うのですが、正確に把握出来て無いですね。
ググってみます。
>>461
流石にVC6はもう古いですかね?
評価が高いから、この本で勉強してみようと思ったのですが・・・。
MFCを覚える前にWin32APIを理解する必要があるかと思って、触ってみました。
0464デフォルトの名無しさん
2011/11/10(木) 13:18:12.73LPWSTR は long pointer wide string の意味。
つまり、wchar_t *。
wchar_t *s = NULL;
wcscpy( s, L"おぱんぽん" );
なんてやったらメモリぶっこわして終わりなのはわかるでしょ?
wchar_t s[ 100000 ];
wcscpy( s, L"おぱんぽん" );
のように書かないと。
そしてもう一つ。残念なことにいまのところ、
まだWindowsアプリケーションはUnicodeで万事OKとは言いがたい。
従って、TCHARとTEXTを用いるべき。例えば…
TCHAR s[ 100000 ];
_tcscpy( s, TEXT( "おはようございます" ) );
iRet = MessageBox( NULL, s, TEXT( "MsgBox" ), MB_OK );
>流石にVC6はもう古いですかね?
さすがに標準から逸脱しすぎて、現代的なテクニックの大部分が使えなくなってる。
>評価が高いから
2ちゃんの某スレでそうだったので自分も買ったのだが、単なる提灯書き込みであったことが後に発覚。
0465デフォルトの名無しさん
2011/11/10(木) 13:25:32.56>まだWindowsアプリケーションはUnicodeで万事OKとは言いがたい。
UnicodeでNGになるのってどんなこと?
0466デフォルトの名無しさん
2011/11/10(木) 13:26:04.24プリプロセッサでワイド文字とマルチバイト文字を切り替えなきゃいけないのって、
たとえばどういう状況?どういうときにそれを気にすればいいの?
0467デフォルトの名無しさん
2011/11/10(木) 13:34:55.670468デフォルトの名無しさん
2011/11/10(木) 13:47:48.52倣うなら、WCHAR s[100000];
0469454
2011/11/10(木) 14:05:35.86wchar_t *s = NULL;
wcscpy( s, L"おぱんぽん" );
これだとポインタをNULLにしているので初期化になっておらず、
確かに場所が無いから入れようが無いのはわかるのですが
wchar_t *s = "ぬるぽ";
wcscpy( s, L"おぱんぽん" );
なら、ポインタの場所があるから上書きされる・・・と思ったのですが違うのですね?
配列にして領域を確保しないといけないと言ったところでしょうか?
またこの場合、"おぱんぽん"はどこにコピーされているのでしょうか?
0470デフォルトの名無しさん
2011/11/10(木) 14:29:29.21んー。いろいろ自分なりに理屈を考えたけど、わからんなぁ。
個人的にはUnicode決め打ちでもいいような気はするんだが…↓
MSDNは国際化対応のためにTCHAR系使えっていってるし
http://msdn.microsoft.com/ja-jp/library/xxh1wfhz.aspx
オプションでwchar_tそのものの定義も変わってしまうので
http://msdn.microsoft.com/ja-jp/library/dh8che7s.aspx
おとなしくMicrosoft様のいうとおりTCHAR系をお勧めしておきたい。
>>469
Win32APIの前にK&R第二版でも読んでCの基礎を固めておいたほうが良い感じ…
0471デフォルトの名無しさん
2011/11/10(木) 16:36:02.85ttp://jasonjano.wordpress.com/2010/02/09/a-simple-c-wrapper-for-ffmpeg/ (Running the ffMpeg Processの部分)
ここのコードを使ってみたんですが、Parameterに"-formats"を入れるとproc.WaitForExit();でとまってしまいます。
どうすれば止まらずに、出力を取得できるでしょうか。
ちなみに、 ("-i {0}", videoPath) はできます。
0472デフォルトの名無しさん
2011/11/10(木) 16:39:05.05スレ間違えました。
ごめんなさい。
0473デフォルトの名無しさん
2011/11/10(木) 16:43:13.35「メモリの確保=初期化」では無いよ。
場所があっても書き込みして良いとは限らないよ。
以下のスレを参考に。
http://hibari.2ch.net/test/read.cgi/tech/1319581056/46-
0474454
2011/11/10(木) 17:28:06.77なるほど、constやdefineのように固定値になっているのですね。
書き換えるなら最初から書き換え用の領域を確保が必要と。
ありがとうざいました。
0475デフォルトの名無しさん
2011/11/11(金) 03:51:26.94プリプロセッサの機能と思うのですが出来ないです。
0476デフォルトの名無しさん
2011/11/11(金) 04:37:11.42何をどうしたいの?
目的が分からない
0477デフォルトの名無しさん
2011/11/11(金) 06:42:30.72マクロはわからん
0478デフォルトの名無しさん
2011/11/11(金) 23:37:49.09CHoge obj ( ) ;
と書くのではなく,
CHoge obj ;
と書くのはデフォルトコンストラクタが関係したりしています?
0479デフォルトの名無しさん
2011/11/11(金) 23:42:25.060480デフォルトの名無しさん
2011/11/11(金) 23:45:49.20僕はそのことに耐えられなかったのだ
括弧を省略したのにはそんな訳があった
0481デフォルトの名無しさん
2011/11/11(金) 23:57:16.27言われてみれば確かにCHogeを返す引数なしのobjという関数に見える
ということは,デフォルト引数ありで引数省略のコンストラクタと,引数なしのコンストラクタとは共存できないのね
スッキリしたthx
0482デフォルトの名無しさん
2011/11/12(土) 09:15:40.63void
fetch_info(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
vfprintf(stderr, fmt, ap);
va_end(ap);
fputc('\n', stderr);
}
という関数をコンパイルすると、
va_start(ap, fmt);で
discards qualifiers from pointer target type
というワーニングが出ます。
エラー部のマクロを展開すると、
( ap = (va_list)((long *)&( fmt ) + __extension__ ( __builtin_classify_type(*( __typeof( fmt ) *)0) == __real_type_class ? sizeof (*( __typeof( fmt ) *)0) > sizeof (double) ? 4 : 2 :
__builtin_classify_type(*( __typeof( fmt ) *)0) == __record_type_class || __builtin_classify_type(*( __typeof( fmt ) *)0) ==
__union_type_class ? (sizeof (*( __typeof( fmt ) *)0) +
sizeof (int) - 1) / sizeof (int) :
__builtin_classify_type(*( __typeof( fmt ) *)0) ==
__integer_type_class && sizeof (*( __typeof( fmt ) *)0) >
sizeof (int) ? 2 : 1 ) )) ;
あまりにも難しくて理解できないのですが、
どこが悪いのでしょうか?
0483デフォルトの名無しさん
2011/11/12(土) 10:47:39.890484デフォルトの名無しさん
2011/11/12(土) 12:18:23.69ずいぶん古いの使ってるんだな
0485デフォルトの名無しさん
2011/11/12(土) 13:50:48.16const char * * を long * にキャストするとconstが無くなるけどそれでいいのかいって警告
この場合問題ないから無視するかGCCのバージョンをあげな
0486デフォルトの名無しさん
2011/11/13(日) 01:46:43.740487デフォルトの名無しさん
2011/11/13(日) 02:11:22.130488デフォルトの名無しさん
2011/11/13(日) 09:05:18.780489デフォルトの名無しさん
2011/11/13(日) 18:02:14.680490デフォルトの名無しさん
2011/11/13(日) 22:17:21.49vc++とかでプロジェクトの設定をする時に
includeのパスを通すのは分かるんですが
libにパスを通す意味ってなん何でしょうか
ライブラリのディレクトリパスを指定する、というのは分かるのですが
ライブラリのファイルを読んでくることの必要性というのは何なのでしょうか
includeは、
#include <stdio.h>
などでよく使うので馴染みがあるのですが
初心者ゆえライブラリというものをどういう時に使うのかが分からないのです。
0491デフォルトの名無しさん
2011/11/13(日) 22:37:34.29#include で宣言を libで処理の実体を頂いてくると考えておくといい
ヘッダーで完結するライブラリもあるから、
必ずしもこのパターンになるとは限らない。
例えば、
void hoge(); /*宣言 ヘッダ*/
void hoge() /*実体 lib*/
{
}
0492デフォルトの名無しさん
2011/11/13(日) 22:52:40.520493デフォルトの名無しさん
2011/11/13(日) 22:59:48.72ライブラリってのはコンパイル済みのソースみたいなもんです
printfの中身とかが入ってます
で、exeを作るときにはprintfの中身が必要になることもあるのでそれのおいてある場所を指定するわけです
printfの入ってるようなlibならvcの場合は勝手に取ってきますが
そういう標準なやつでないものを使いたいときにその中身が入っているファイルのあるパス、およびそのファイル名を指定します
0494デフォルトの名無しさん
2011/11/13(日) 23:06:04.470495デフォルトの名無しさん
2011/11/13(日) 23:13:10.16stdio.h だけじゃなくて、
本当は stdio.c (に相当する物)も必要だから。
C/C++プログラムが作られる工程
(3つのソースからhello.exeをつくる場合)
コンパイル:
test.c --> test.obj
test2.c --> test2.obj
main.c --> main.obj
リンク:
test.obj test2.obj main.obj --> hello.exe
* リンク: 複数の.objを、1つにまとめる。
.objはVCプロジェクトのフォルダ内にあると思う。
ライブラリもプログラムも.obj形式の一種。
(ライブラリはwindowsだと.libファイル。)
ヘッダーファイルは一覧しか書いてない!
だから、stdio.obj に相当するものが必要。
それがライブラリ!
0496デフォルトの名無しさん
2011/11/13(日) 23:15:19.120497デフォルトの名無しさん
2011/11/13(日) 23:15:56.47test.obj test2.obj main.obj --> main-obj.obj
なんてこともできます。
0498デフォルトの名無しさん
2011/11/13(日) 23:16:40.65厳密には異なる形式だから
0499デフォルトの名無しさん
2011/11/13(日) 23:17:30.46libはobjのコレクションだ。
objの状態でも使えるけど、libにまとめておいたほうが管理しやすい。
obj専用のアーカイブファイルみたいなものだね。
0500デフォルトの名無しさん
2011/11/13(日) 23:33:38.31.lib は後処理して綺麗にしたもの。
exeもobjを綺麗にしたもの。
0501デフォルトの名無しさん
2011/11/13(日) 23:48:10.14objもソースの中身だけど 各コンパイラが勝手に作った形式で
libは他のコンパイラでも使えるように共通化されたものかもしれない
objは自分用でlibは公開用とでも思っておけば。
0502デフォルトの名無しさん
2011/11/13(日) 23:50:35.79憶測で大間違いを書くなw
0503デフォルトの名無しさん
2011/11/14(月) 00:19:35.67.exeと.lib、.selfと.aにしか興味ないんで認識あまかったかw うふふ。
0504デフォルトの名無しさん
2011/11/14(月) 00:32:49.82じゃあ
stdio.hをインクルードして
#include <stdio.h>
int main() {
printf "helloWorld";
}
というファイルをhello.cとして保存した後、
コンパイルした場合は、studio.cとhello.cをリンクするような動作をしているということでしょうか
0505デフォルトの名無しさん
2011/11/14(月) 01:33:03.07そのとおり。
よく使うもの(標準ライブラリなど)は、
必要な分だけVCが勝手にやってくれてるだけ。
本当はリンクの指定も自分で行わないといけない。
逆にそれらをリンクしない設定もできる。
もちろん必要なのにリンクされない場合、
リンカが「足りないよ」ってエラーを出す。
0506デフォルトの名無しさん
2011/11/14(月) 01:39:49.74考え方はあってるがリンクするのはソースファイルじゃなくてhello.cをコンパイルしたhello.objと
stdio.libの中のprintf.obj(ライブラリの作成者が事前にprintf.cをコンパイルしておいたもの)とかだけどな
0507デフォルトの名無しさん
2011/11/14(月) 01:51:01.58.selfってどの環境なんだろ
.out と .a ならわかるんだけれど
0508デフォルトの名無しさん
2011/11/14(月) 01:58:41.47なるほど、わかりやすいです。
コンパイルするとobjという形式になるんですね
0509デフォルトの名無しさん
2011/11/14(月) 01:59:26.49もうすぐ出るゲーム機の開発かんきょー
0510デフォルトの名無しさん
2011/11/14(月) 04:04:27.88なんでそんなマイナーな環境持ち出したの?
0511デフォルトの名無しさん
2011/11/14(月) 05:27:56.630512デフォルトの名無しさん
2011/11/14(月) 05:45:38.74クラスBはクラスCを継承してhoge()をオーバライドしていて、
クラスCはクラスBを継承してhoge()をオーバライドしていて、
クラスDがクラスCを継承しているとき、
クラスDでhoge()を記述しようとしたら、クラスAのhoge()と全く同じことに気がつきました。
この際に、クラスAのhoge()を再利用して、コード量を減らすことってできます?
よろしくお願いします。
0513デフォルトの名無しさん
2011/11/14(月) 05:47:08.170514512
2011/11/14(月) 06:13:04.72申し訳ない
×クラスBはクラスCを継承してhoge()をオーバライドしていて、
○クラスBはクラスAを継承してhoge()をオーバライドしていて、
そういうことではなくて、コードを書いた方がいいということです?
0515デフォルトの名無しさん
2011/11/14(月) 06:22:40.360516デフォルトの名無しさん
2011/11/14(月) 06:24:36.93リファクタリングすればいいと思う。
クラス分割がうまくいってないんじゃないかなと。
0517デフォルトの名無しさん
2011/11/14(月) 06:50:54.32D::hoge() の中で A::hoge() と明示的に A:: を付けて呼び出せば改めて
書く必要は無いけど、 A::hoge() の実装をいじったときに D::hoge() まで
影響を受けるようだと困るかもしれない。
0518デフォルトの名無しさん
2011/11/14(月) 17:21:01.12青い背景にすると焼き付きが目立つって噂のあのゲーム機?
0519デフォルトの名無しさん
2011/11/14(月) 21:21:25.73ポインタのことを理解していないと分からないものですか?
0520デフォルトの名無しさん
2011/11/14(月) 21:24:05.020521デフォルトの名無しさん
2011/11/15(火) 01:18:38.08え、マジ?そんな噂あるの?
今品薄で俺のところまで最新の実機来てないから本物の焼き付きとかわかんねです
0522デフォルトの名無しさん
2011/11/15(火) 01:28:56.82うちの会社では管理してる物にアクセスするIDとかをハンドルって呼んでるなぁ
たとえばシステムが管理してるものの入った配列があってその3番目のにアクセスしたいときのハンドルは2、もしくは3になってたりする
(実際は安全のためもうちょっと工夫したのを使ってるんだけど)
めんどいときはnewしたポインタをそれっぽいのにキャストして返して、それにアクセスする関数でもとのにキャストしなおして使うとか
C++の「ハンドル」ってのはなにかはシラネ
もしかしてHWNDとかそっちの話?
0523482
2011/11/15(火) 01:53:08.69(va_list)((long *)&( fmt )
の場所を
(va_list)((const long *)&( fmt )
や
(va_list)((long * const)&( fmt )
や
(va_list)((const char *)&( fmt )
や
(va_list)((char * const)&( fmt )
とやってみましたが、無理でした。
__builtin_classify_type(...
は引数の始まりを計算しているから触らないでよいんですよね?
>>const char * * を long * にキャストするとconstが無くなるけどそれでいいのかいって警告
gccのバージョンをあげるのは無理な状態です。
(ソースからコンパイルできる自信が無い)
ワーニングを無視するのも、少し心配です。
constを保ったままキャストする方法は無いのでしょうか?
0524デフォルトの名無しさん
2011/11/15(火) 03:14:45.73からconstを取る。
Cのリテラルはconst char *じゃなく、char *だったはず
これが正しいかどうかは識者が後ほど突っ込んでくれるはず。
0525デフォルトの名無しさん
2011/11/15(火) 03:41:47.59if( __builtin_classify_type( const char* ) == __real_type_class ) {
if( sizeof( const char* ) > sizeof( double ) ) {
ap = (va_list)(long *)&(fmt) + __extension__ 4;
}
else {
ap = (va_list)(long *)&(fmt) + __extension__ 2;
}
}
else {
if( ( __builtin_classify_type( const char* ) == __record_type_class ) || ( __builtin_classify_type( const char* ) == __union_type_class ) ) {
ap = (va_list)(long *)&(fmt) + __extension__ ((sizeof(const char*) + sizeof(int) - 1) / sizeof (int));
}
else {
if( __builtin_classify_type( const char* ) == __integer_type_class ) {
if( sizeof( const char* ) > sizeof(int) ) {
ap = (va_list)(long *)&(fmt) + __extension__ 2;
}
else {
ap = (va_list)(long *)&(fmt) + __extension__ 1;
}
}
else {
ap = (va_list)(long *)&(fmt) + __extension__ 1;
}
}
}
よくわかんないけど(long *)を(const long*)にしたところで
(va_list)のキャストでまたconstはずしてるからなんか言われてんじゃないの?
0526デフォルトの名無しさん
2011/11/15(火) 21:26:49.08このページの中ほどにある、
「planet() : equatorial_axis() {}」
というのはどういう意味ですか?
planet()というのはコンストラクタですか?「:」以降はどういった意味で?
よろしくおねがいします。
0527デフォルトの名無しさん
2011/11/15(火) 21:54:26.74初期化
0528デフォルトの名無しさん
2011/11/15(火) 22:08:53.50コンストラクタと初期化子の並び
構造体 planet の変数 equatorial_axis は int 型でC由来の組み込み型。
std::string と std::vector はデフォルトで空初期化されるけど
int 型は明示的に指定しないと初期化されない。(中身が不定)
それで : equatorial_axis() と初期化子を書いてゼロ初期化している。
0529デフォルトの名無しさん
2011/11/16(水) 00:24:09.00開発機で白文字放置したら簡単に…って噂
ゼビウスとかきっとヤバイ
0530526
2011/11/16(水) 12:40:44.77>それで : equatorial_axis() と初期化子を書いてゼロ初期化している。
とてもわかりやすかったです。ありがとうございます。
どうして、「equatorial_axis() 」という空っぽの関数を書いているのかと悩みましたが、初期化する場合の書き方でしたか。
追加でもうひとつお願いします。
try{}catch{}で例外を捕まえたときに、
その例外がどんなものなのかコンソールに表示したいのですが、
javaのSystem.out.printlnのように簡単に表示することは出来るのでしょうか?
とりあえず、cout <<としてみたところ、Javaのような変換はされませんでした。
0531デフォルトの名無しさん
2011/11/16(水) 12:48:40.58ttp://codepad.org/OoWV3a7e
0532デフォルトの名無しさん
2011/11/16(水) 13:11:15.21stringへのキャスト演算子をオーバーロードすればどうにかなるだろうか。
0533530
2011/11/16(水) 13:14:38.71即レスありがとうございます。
今回catchした例外は、「boost::property_tree::ptree_error」配下の何かなのですが、同じ方法ではダメなようでした。
せめてなんという例外なのか表示したく、近所のソースを追うと、文字列を詰めているコードがあったので、coutでいけるんじゃね?と思いましたが、ダメでした。
後からの情報追加で申し訳ないです。あと隠れている情報はないと思います。
再度お願いします。
0534デフォルトの名無しさん
2011/11/16(水) 13:21:10.02そもそも、ファイルの内容がXMLとしておかしくないかチェックしてくれる便利なライブラリを紹介いただけないでしょうか?
<root>
<aa>えー</cc>
<bb>びー</bb>
</root>
rapid_xml(もしくは、boost::property_tree)でxmlのパースができることを見つけました。
が、<aa>の閉じタグが何故か</cc>になっているのでパースエラーになってほしいのですが、問題なしにされてしまいました。
ここまでのチェックは、他のライブラリも含めて、してくれないものなのでしょうか?
欲を出すと、boostライセンスのように取扱が簡単なものがよいのですが…。
MSXMLも試してみます。引数の意味を理解できなかったので後回しにしていました。
(530ですが、別件なので別名で書き込みます。)
0535デフォルトの名無しさん
2011/11/16(水) 13:29:23.13what()でなんかでるだろ
catch(boost::property_tree::ptree_error & e)
{
cout << e.what();
}
0536530=533
2011/11/16(水) 13:44:38.84解決しました。
…なるほど、std::exceptionにwhat()があって、各例外クラスはそれをオーバーライドするのですか。ふむふむ。
0537デフォルトの名無しさん
2011/11/16(水) 14:06:22.350538デフォルトの名無しさん
2011/11/16(水) 19:04:16.91のインターフェースをDLLで実装して生成(破棄もDLL側で)
ってコンパイラ間の移植性ありますか?
たとえば上のようにVC++でコンパイルしたDLLをロードして使う方のEXEはMinGWでコンパイル的な感じで
0539デフォルトの名無しさん
2011/11/16(水) 19:59:33.01なければ作りたいと思うのでコンパイル時にwindowsとlinuxで別のコードを使うようにする方法をおしえてください
0540デフォルトの名無しさん
2011/11/16(水) 20:07:48.44問題ないよ
>>539
http://homepage1.nifty.com/herumi/prog/gcc-and-vc.html
0541デフォルトの名無しさん
2011/11/16(水) 20:44:06.55parse<parse_validate_closing_tags>(...)
他のフラグも幾つかあるので、一度マニュアルを読んだほうがいいよ
0542デフォルトの名無しさん
2011/11/16(水) 23:35:58.05数値を初期化するためのものなんですか?
初期化以外には使われないのですか?
コンストラクタがあると、どういう時に便利なのですか?
僕みたいなバカにも分かるようにセーラームーンの登場人物で例えて教えて下さい
0543デフォルトの名無しさん
2011/11/16(水) 23:43:45.840544デフォルトの名無しさん
2011/11/17(木) 00:03:29.13ちょっとわかりにくいです
0545デフォルトの名無しさん
2011/11/17(木) 00:12:33.76毎回セーラー服や装飾品の数々をひとつずつ装備していかなければならず、どうしても
たまには髪のセットを間違えたりティアラを忘れるなど重大な問題を起こす可能性がある。
一連の手順をまとめて自動化したムーン・プリズムパワー・メイクアップは非常に大切
なのであるかもしれない。
0546デフォルトの名無しさん
2011/11/17(木) 00:25:15.54結局のところ薔薇を投げることで、タキシード仮面が現れたことに気づいてもらえるわけだが、
たとえば、なるちゃんがタキシード仮面を視認した後、薔薇を投げるというルールにすると、
なるちゃんがたまたま近くにいないと美奈子が困るじゃん。
なので、タキシード仮面はなるちゃんがいなくてもいいように毎回自分で投げることにしてる。
これで美奈子の安全が守られる。
0547デフォルトの名無しさん
2011/11/17(木) 01:14:17.87美少女戦士クラス
...コンストラクタ(ムーンプリズムパワーメイクアップ)
.......髪
.......ティアラ
.......セーラー服
月野うさぎ.ムーンプリズムパワーメイクアップ
=美少女戦士セーラームーン(セーラー服、ティアラ、髪)??
ってこと?
ムーンプリズムパワーメイクアップをしても、キャラごとに服や髪の色は違うけれど
それはどう対処するのでしょうか
0548デフォルトの名無しさん
2011/11/17(木) 01:40:16.81struct data{
char name[20];
}mydata = { "nanasi"};
struct data *p;
p=&mydata;
printf("hello! %s \n",p->name);
とやると、hello ! nanasi
と表示されると思うんですが、
これを
char *moji = "hello! %s \n";
printf(moji,p->name);
とやった場合、
hello ! nanasi
と表示させることは可能でしょうか?
もし不可能な場合、
printfに文字列へのポインタしか渡せない場合、
"hello! %s \n",p->name
をどのように展開して文字列へのポインタに代入してやれば
良いのでしょうか?
0549デフォルトの名無しさん
2011/11/17(木) 02:06:56.830550デフォルトの名無しさん
2011/11/17(木) 08:54:32.24ん、出来ます?
ちょっと今コンピュターを触れる
環境になくて、自信なかったのですが
0551デフォルトの名無しさん
2011/11/17(木) 09:21:10.83http://codepad.org/ldXSqgsO
0552548
2011/11/17(木) 12:15:51.26ございます。
もうひとつ質問なんですが、
char *moji = "hello! %s \n,p->name";
printf(moji);
とやった場合は無理ですよね。
何とかして%sにp->nameを展開?
した状態で文字列へのポインタとして
printfに渡したいんですが、
その場合はstrcpyを駆使しないと
難しいでしょうか?
0553デフォルトの名無しさん
2011/11/17(木) 12:53:52.760554デフォルトの名無しさん
2011/11/17(木) 13:06:54.99http://codepad.org/19Fe9ida
0555デフォルトの名無しさん
2011/11/17(木) 22:16:18.22ありがとうございました
0556デフォルトの名無しさん
2011/11/18(金) 00:10:50.80friend ob operator=(ob ob1, int i) {
ob tmp ;
tmp.x = ob1.x + i ;
return tmp ;
}
と定義できて,ob2 = 10 ;と書けそうなものですが.
0557デフォルトの名無しさん
2011/11/18(金) 00:16:58.51そういう書き方が出来ると勝手にクラスからむしり取る悪いfriendになってしまうから
あくまでもクラス側でfriendにならないとだめ
0558デフォルトの名無しさん
2011/11/18(金) 00:22:02.150559デフォルトの名無しさん
2011/11/18(金) 00:28:58.35確かにVC++2010のコンパイラに,operator=はメンバでなければならないと怒られました.
operator+やoperator-がfriendで定義できることと何が違うんです?
0560デフォルトの名無しさん
2011/11/18(金) 00:30:26.52クラス内で定義もしくは宣言すると引数一つ、相手は自分自身
friendにすると引数二つ、自分と同じクラス
0561デフォルトの名無しさん
2011/11/18(金) 00:40:35.12それは理解しているつもりです.
ob ob::operator+(ob ob1) ;
friend ob operator+(ob ob1, ob ob2) ;
と書けるならば
ob ob::operator=(ob ob1) ;
friend ob operator=(ob ob1, ob ob2) ;
も書けてもいいのではないかと思ったのでした
0562デフォルトの名無しさん
2011/11/18(金) 00:44:54.650563デフォルトの名無しさん
2011/11/18(金) 01:01:40.55曖昧になってしまわないか?
0564デフォルトの名無しさん
2011/11/18(金) 02:51:23.620565デフォルトの名無しさん
2011/11/18(金) 06:04:43.97§12.8.9
A user-declared copy assignment operator X::operator= is a non-static non-template member function
of class X with exactly one parameter of type X, X&, const X&, volatile X& or const volatile
X&.109)
[Note: an overloaded assignment operator must be declared to have only one parameter; see 13.5.3.]
[Note: more than one form of copy assignment operator may be declared for a class. ]
[Note: if a class X only has a copy assignment operator with a parameter of type X&,
an expression of type const X cannot be assigned to an object of type X].
§13.5.3.1
An assignment operator shall be implemented by a non-static member function with exactly
one parameter.
Because a copy assignment operator operator= is implicitly declared for a class if not declared by
the user (12.8), a base class assignment operator is always hidden by the copy assignment
operator of the derived class.
規格で決まっちゃってんのよ
friendは代入演算子=のオーバーロードには使えない
0566デフォルトの名無しさん
2011/11/18(金) 06:06:30.880567デフォルトの名無しさん
2011/11/18(金) 08:06:51.04お付き合い頂きありがとう
0568デフォルトの名無しさん
2011/11/18(金) 13:24:11.15…と思ったけど、オーバーヘッドとバイナリ肥大を気にしなければ、
templateで対応できるな。
0569デフォルトの名無しさん
2011/11/18(金) 14:22:01.100570デフォルトの名無しさん
2011/11/18(金) 14:44:44.34クラス名を格納する変数を事前定義するか、
ソース解析、バイナリ解析すれば可能だけど、まず無理。
あきらめろ。
0571デフォルトの名無しさん
2011/11/18(金) 15:25:09.50コンパイラ言語だから不要と判断されたんだろう
gcc拡張なら__FUNCTION__, __PRETTY_FUNCTION__はあるけど
さすがにクラス名はない
というかもしあったらリンクした時たまたま同一のクラス名でファイル内だけに
通用したい場合もぶつかっちゃうっしょ
0572デフォルトの名無しさん
2011/11/18(金) 15:34:28.82RTTIはまさにC++のリフレクションの実装だろ。
それを使わないで実行時情報を取得するには?って質問だから、
代わりに静的解析使えば?って言っただけに過ぎないんだが。
0573デフォルトの名無しさん
2011/11/18(金) 15:39:11.85用意されたもんだけどな
サイズならsizeofで得られるしメンバポインタもあるしtypeid().name()で
返される文字列は環境依存だし結構使えない
0574デフォルトの名無しさん
2011/11/18(金) 15:40:30.71だからそれをリフレクションと言うんだよ。
0575デフォルトの名無しさん
2011/11/18(金) 15:43:36.33使い道が限定されると言ってるだけなんだが
0576デフォルトの名無しさん
2011/11/18(金) 15:53:01.33俺も最初の2行について言及しただけだが。
0577デフォルトの名無しさん
2011/11/18(金) 15:58:41.67JavaやC#と一緒に考えんなよ
0578デフォルトの名無しさん
2011/11/18(金) 19:11:33.70手持ちの入門書を見ると、関数のオーバーライドのときは親クラスの関数宣言にvirtualをつけるようにと説明されています。
ところが、このvirtualの指定をしなくても親クラス子クラスで同名同シグネチャの関数を作ることができます。
ここで質問ですが、
�@このようなvirtual指定しない使い方は、文法的に正しいのでしょうか?(それとも暗黙のルールが適用されてしまっている?)
�Aこれもオーバーライドと読んでいいのでしょうか?それとも別の呼び名があるのでしょうか?
�Bなぜこの使い方(?)は入門書では割愛されているのでしょうか?(プログラム自体はふつうにコンパイルできて動くのに)
0579デフォルトの名無しさん
2011/11/18(金) 20:03:59.55ttp://codepad.org/BBF3Ssjn
virtualつけないとCBase側のtest2が呼ばれてしまう
0580デフォルトの名無しさん
2011/11/18(金) 20:04:01.68http://d.hatena.ne.jp/pknight/20090725/1248542230
0581デフォルトの名無しさん
2011/11/18(金) 20:22:47.11>>580
ありがとうございます
しかし、どのような挙動をするかは実験して既知なんです
0582デフォルトの名無しさん
2011/11/18(金) 20:35:53.201 正しい
2 隠蔽。オーバーライドとは挙動が違う。
3 説明が面倒だから
0583デフォルトの名無しさん
2011/11/18(金) 20:51:27.50ありがとうございます
>>580のサイトからさらに飛んだ先のサイトで、オーバーライドと区別して「上書き」という言葉を使っているのを発見しました。
すなおに英語に戻すと、overwriteですが、オーバーライド(override)の日本語訳としても「上書き」は使われています。
やや、用語に混乱があるように思うのですが、実際の現場ではどうなんでしょう?
(「誰も気にしていない」、が一番可能性高そうですが・・・・)
0584デフォルトの名無しさん
2011/11/18(金) 20:56:13.41クラス内のインスタンスメソッドからのみアクセスできるようにしたいのですが。
privateの中に、staticで変数を宣言すると、定義する際に、そんな変数は見付からないといわれます。
@Visual C++ 2010 Express。
よろしくお願いします。
0585デフォルトの名無しさん
2011/11/18(金) 21:03:07.68変数の型 クラス名::変数名;
と定義を書かないといけない
0586デフォルトの名無しさん
2011/11/18(金) 21:06:30.50Hoge obj; obj.a = 10 等のように使いたいならpublicにしないとダメ。
派生したクラスから基底クラスのメンバを参照したいならprotectedにする。
0587デフォルトの名無しさん
2011/11/18(金) 21:08:20.50新しい関数を作ることで元の関数が使えなくなったりするわけじゃないので
「上書き」と呼ぶのは非推奨
0588デフォルトの名無しさん
2011/11/18(金) 21:14:08.86よく考えたらオーバーライドも元の関数が使えなくなるわけじゃないわw
0589デフォルトの名無しさん
2011/11/18(金) 21:17:05.380590デフォルトの名無しさん
2011/11/18(金) 22:05:18.371 文法的に正しい
2 オーバーライドと読んでいい
3 すごく雑に言うと、非仮想関数はオーバーライドを禁止するセマンティクスを持つため
0591デフォルトの名無しさん
2011/11/18(金) 22:26:07.22…と思って自分も読もうと思ったが、JISの検索サイトで開けない('∀`)
クソJIS死ね
0592デフォルトの名無しさん
2011/11/18(金) 22:52:16.79Acrobat Readerでないと閲覧出来ない
Acrobat Reader X は NG
0593デフォルトの名無しさん
2011/11/18(金) 22:58:12.700594デフォルトの名無しさん
2011/11/18(金) 23:05:23.37ansiの方は金払わないと見られなかったと思う。
0595デフォルトの名無しさん
2011/11/18(金) 23:35:10.81WndProcからWM_MOUSEHWHEELを拾っえたのですが
setpoint(6.32)起動すると拾えなくなり
setpoint停止すると拾えるようになる
(setpointの設定はデフォルト(左スクロールと右スクロール))
setpoint起動時でも拾えるようにするにはどうすればいいんでしょうか?
0596デフォルトの名無しさん
2011/11/18(金) 23:59:13.99WindowsのバージョンによってもWM違うし。
0597デフォルトの名無しさん
2011/11/19(土) 01:15:47.360598デフォルトの名無しさん
2011/11/19(土) 01:16:39.060599デフォルトの名無しさん
2011/11/19(土) 03:27:05.56M500, Windows7 64bit, Setpoint6.32.7 デフォルト設定(左スクロールと右スクロール) だけど
チルト WM_MOUSEHWHEEL(0x020E) は setpoint を終了しなくても来てたよ?
ただ, X-Mouse Button Control V2.2 では setpoint 起動しているとチルトが反応しないので setpoint が
チルトの何かいじっている可能性は高いと思うけど.
これはとりあえず user.xml の Button Number="6" と "7" の内容(HorzScrollLeftSet,HorzScrollRightSet) を編集して
GenericMouseButton と同じ内容に書き換えれば反応するようになったよ.
SetpointPlus を入れて「汎用ボタン」に設定してもたぶん同じことだと思うけど.
0600デフォルトの名無しさん
2011/11/19(土) 04:05:30.17CSub sub; sub.test1(); // CSub::test1
CBase* pBase = new CSub; pBase->test1(); // CBase::test1
CSub* pSub = new CSub; pSub->test1(); // CSub::test1
//CSub* pSub2 = new CBase; pSub2->test1(); // エラー
僕にはわけがわかりません!
0601デフォルトの名無しさん
2011/11/19(土) 05:25:41.03どこらへんが?
0602デフォルトの名無しさん
2011/11/19(土) 11:05:35.78typedef class ClassA {
(中略)
} CLASSA, *LPCLASSA;
と、typedefしてるクラスを見かける時があるんだが
これは何故このようなtypedefをしてるんだろうか。
Windowsプログラムに混ぜて書くときに、見やすくする為か?
それとも慣例か何かか?
それにLPCLASSAのようにポインタを隠匿するメリットって何だろうか。
これは可読性云々って話なんだろうか。
0603デフォルトの名無しさん
2011/11/19(土) 11:09:16.41マイクロソフトに魂を売ったんだろ
0604デフォルトの名無しさん
2011/11/19(土) 11:12:08.60obj1->func(); // OK
obj2->func() // NG
ということじゃないか?obj2はAであってA*ではない。
このような誤りを防ぐためにtypedefしているのでは?
0605デフォルトの名無しさん
2011/11/19(土) 11:47:05.56LPHOGE pH = Hoge_Create();
Hoge_DoSomething(pH);
Hoge_Delete(pH);
のように書いておけば
typedef uint_ptr LPHOGE;
と書き換えてもおkで便利だから
0606デフォルトの名無しさん
2011/11/19(土) 12:39:40.09EEにもついていればいいのに
書き換えないとうごかないか・・・
何かいい方法はないかな
0607デフォルトの名無しさん
2011/11/19(土) 12:48:03.55使ったことがないから詳しくは知らないが、UISpyなるツールがあるらしい。
0609デフォルトの名無しさん
2011/11/19(土) 19:33:54.06int a[X][Y]; のような二次元配列をnewして動的に生成したいのですが
ぐぐると、配列へのポインタをnewして、二次元目は二次元の要素数分だけ、
forループでnewする例ばかりいっぱい出てきました。
int** a=new int[X][Y]; <--エラーになる
みたいに簡単に出来ないものかと思い試行錯誤してみたら
void* a=new int[X][Y]; がコンパイルを通りました。
配列へのアクセスは
((int(*)[X])((int*)a))[x][y]=100;
上記のような記述でOKでした。
とりあえずは動作しているみたいなのですが、
これで問題はないのでしょうか。
それともこの方法は間違いであり、ぐぐるといっぱい出てくる二次元目は要素数分だけnewが正解なのでしょうか?
Webで公開しているような方々が、こんな簡単に動的配列を生成する方法を
知らない訳はないのではと思い、きっとどこか間違っていそうな気がしています。
よろしくお願いします。
0610デフォルトの名無しさん
2011/11/19(土) 19:49:54.33そんな混み合った記述よりも内部で一次元配列使って、
アクセスだけ2次元にすればわかりやすい
width * heightの要素をもつ1次元配列(vectorだと横着できる)
int index = width * y + x;
で添え字にアクセスして終わり
template <class T>
class Array2D{...}
とかつくっといてもいいかも
0611デフォルトの名無しさん
2011/11/19(土) 19:50:39.89int (*a)[Y] = new int[X][Y];
0612609
2011/11/19(土) 20:10:35.89なるほど〜、勉強になります。ありがとうございます。
int (*a)[Y] = new int[X][Y];
と宣言すると
a[x][y]=100;
となりますね。
多次元配列をforループでnewしまくっているばかり出てくるwebの例は
この記述を知らないってことなんでしょうかね。
0613デフォルトの名無しさん
2011/11/19(土) 20:14:13.220614デフォルトの名無しさん
2011/11/19(土) 20:19:21.54多段階配列を使いたい場合はやはり個別にnewする必要があるけどな
0615デフォルトの名無しさん
2011/11/19(土) 20:26:13.480616デフォルトの名無しさん
2011/11/19(土) 20:49:28.41でいいじゃん
0617デフォルトの名無しさん
2011/11/19(土) 20:56:35.340618デフォルトの名無しさん
2011/11/19(土) 21:17:03.00public:
DebugStream();
int precision( int );
DebugStream& operator<<( char );
DebugStream& operator<<( unsigned char );
DebugStream& operator<<( int );
DebugStream& operator<<( unsigned );
DebugStream& operator<<( short );
DebugStream& operator<<( unsigned short );
DebugStream& operator<<( float );
DebugStream& operator<<( double );
DebugStream& operator<<( const string& );
DebugStream& operator<<( const char* );
DebugStream& operator<<( char* );
DebugStream& operator<<( const RefString& );
DebugStream& operator<<( const OStringStream& );
DebugStream& operator<<( DebugStream& ( *f )( DebugStream& ) );
DebugStream& endl();
DebugStream& hex();
DebugStream& dec();
void begin();
void end();
private:
class Impl; //ここ
Impl* mImpl;
};
クラス宣言中のクラス宣言?
これはどういう理由があるのですか
0619デフォルトの名無しさん
2011/11/19(土) 21:21:11.240620デフォルトの名無しさん
2011/11/19(土) 21:23:04.860621デフォルトの名無しさん
2011/11/19(土) 21:34:17.71ニキビ?
0622デフォルトの名無しさん
2011/11/19(土) 21:56:03.96たしかに、方言でニキビパターンとも言いますね
0623デフォルトの名無しさん
2011/11/19(土) 22:11:04.510624デフォルトの名無しさん
2011/11/19(土) 22:24:20.990625デフォルトの名無しさん
2011/11/19(土) 22:36:04.360626デフォルトの名無しさん
2011/11/19(土) 22:46:59.370627デフォルトの名無しさん
2011/11/19(土) 23:03:58.270628デフォルトの名無しさん
2011/11/19(土) 23:10:25.690629デフォルトの名無しさん
2011/11/19(土) 23:12:22.50起きた事ないけど
0630デフォルトの名無しさん
2011/11/20(日) 00:25:57.10無知は恥ですよ^^
0631デフォルトの名無しさん
2011/11/20(日) 00:27:00.670632デフォルトの名無しさん
2011/11/20(日) 00:28:01.48固定サイズのバッファならだいじょうぶじゃね?
0633デフォルトの名無しさん
2011/11/20(日) 01:00:00.96ますますもって恥ですなあ
ソクラテス。「弁明」21B〜をみてね。
でも一種の開き直りにしかみえないのですけれども‥‥‥。
0635デフォルトの名無しさん
2011/11/20(日) 01:42:31.84良書云々は、良書であることは知っているが、読んでいないんだろ
0636デフォルトの名無しさん
2011/11/20(日) 01:48:07.88まぁ、ちょっと大きめのプログラムを組んでいると
すぐPimpleイディオムに行き着く。
0637デフォルトの名無しさん
2011/11/20(日) 03:28:35.16基底クラスのコンストラクタが 基底クラスからのコンストラクトか
派生クラスから巡ってきたコンストラクトかを
基底クラスのコンストラクタ内で判定することはできますか?
よろしくお願いいたします
0638デフォルトの名無しさん
2011/11/20(日) 04:07:53.510639デフォルトの名無しさん
2011/11/20(日) 04:16:33.63基底クラスにフラグ変数を用意して派生クラス毎に初期化リストで代入する値を変えるとか
でもコンストラクタが終了しないとメンバ変数は使用不能なんだよなあ
0640デフォルトの名無しさん
2011/11/20(日) 04:24:10.64Derived() : Base(true)
こうしとけば?
0641デフォルトの名無しさん
2011/11/20(日) 04:33:08.07コンストラクタの引数にデフォルト引数として書いて置けばいける
0642デフォルトの名無しさん
2011/11/20(日) 04:37:23.71ほかの解決方法があるような気がする
0643デフォルトの名無しさん
2011/11/20(日) 06:20:47.39// 前者
std::string tmpString = xpathExpressionPrefix + std::string("/hoge/foo/piyo/text()");
const char* pc1 = tmpString.c_str();
xpathExpression = BAD_CAST pc1;
xpathObject = ::xmlXPathEvalExpression(xpathExpression, xpathContext);
// 後者
xpathExpression = BAD_CAST (const char*)(xpathExpressionPrefix + std::string("/hoge/foo/piyo/text()")).c_str();
xpathObject = ::xmlXPathEvalExpression(xpathExpression, xpathContext);
キャストがどうしてまずいのかいまいちわからないです。
よろしくお願いします。
0644デフォルトの名無しさん
2011/11/20(日) 06:32:51.760645デフォルトの名無しさん
2011/11/20(日) 06:38:34.49前者はconstはがしなのかなぁ
0646デフォルトの名無しさん
2011/11/20(日) 06:50:01.01それだ!
そうか…、確かに…。
言葉足らずで申し訳ない。
先に後者のコードで書いて動かしてみたところ、ハンドルされてない例外で停止して、分割していった結果が前者でした。
0647646
2011/11/20(日) 06:50:33.47感謝の言葉を忘れてました。
ありがとうございます。
0648デフォルトの名無しさん
2011/11/20(日) 07:03:57.86>>647わざわざどうもです。
できれば脱Cスタイルキャストを。
0649646=647
2011/11/20(日) 07:25:54.46指摘を受けてぐぐるして、
c++スタイルのキャストというのを初めて見ました。
ありがとうございます。
0650デフォルトの名無しさん
2011/11/20(日) 13:07:27.34よろしくお願いします。
0651デフォルトの名無しさん
2011/11/20(日) 13:49:12.850652デフォルトの名無しさん
2011/11/20(日) 17:02:46.26対応するランタイムライブラリ(msvcrt.dll系)が入ってない環境では動かないときもある
0653デフォルトの名無しさん
2011/11/20(日) 17:19:01.07将来、新しいバージョンが出たときのことを考えているのなら、それは大丈夫
0654デフォルトの名無しさん
2011/11/20(日) 17:24:00.910655デフォルトの名無しさん
2011/11/20(日) 18:00:02.29想定ではVS2005を考えていたのですがどうやら怪しそうですね。。
とりあえず一度駄目もとで実行さしてみようと思います。
回答頂きありがとうございました!
0656653
2011/11/20(日) 18:29:10.76ちなみに実行ファイルをほかのマシンで動かすことについての話なら
世の中の一般ユーザはVSなんて入れてないけど、VSで作られたアプリが動作していることを考えれば答えは出る
唯一つ注意するのは、リリースビルドにすること。
0657デフォルトの名無しさん
2011/11/20(日) 21:52:24.77ここで、もうひとつ基底クラスのポインタを作成し、
先ほどnewしたインスタンスの複製を作って、そのアドレスをポイントしたいです。
可能でしょうか?可能であれば方法をおしえてほしいです。
ここで、派生クラスは複数あって、どのクラスがつかわれているかは、わからないです。(もしかして、それを知る方法がある?)
以下がイメージです。
Base* pBase1;
pBase1 = new Derrived; // Derrived は Base の派生クラス
Base* pBase2;
// ★ここで、pBase2 にさっきnewしたインスタンスの複製をつくってそのアドレスを格納したいです。
std::mapで要素の部分にインスタンスを入れていました。
更新されるmapと、←を一時的にロックして複製して、複製にメソッドで操作を行おうと思っていました。
ポインタを要素の一部に含まないstd::mapのコピーを行うと、内容がそっくりうつるので、とても便利だなぁと。
既に気がついた方もいるかと思いますが、(継承の経験が無く、)誤って、ポインタではなく、基底クラス型を指定していました。
するとどうも、スライシングということが起きることに気がつきました。
基底クラスのメソッドしか呼べないし…。
そこで、ポインタに変更しようとしたら、要素の複製の方法がわからない、と。
以上、よろしくお願いします。
0658デフォルトの名無しさん
2011/11/20(日) 21:57:05.560659657
2011/11/20(日) 22:00:47.11…、
とか考えましたが、スマートではないですね。
そのクラスを作るという行為も異常ですね。
0660デフォルトの名無しさん
2011/11/20(日) 22:03:07.26virtual base * clone(void) const = 0;
};
struct derived : base {
derived * clone(void) const { return new derived(*this); }
};
0662デフォルトの名無しさん
2011/11/21(月) 00:29:13.13×Derrived
○Derived
0664657
2011/11/21(月) 08:46:22.71↑は、どういう意味です?
virtual base * clone(void) const { return new base(*this); };
のようにはしないのですか?
0665デフォルトの名無しさん
2011/11/21(月) 09:52:48.49基礎の基礎なんだが
0666デフォルトの名無しさん
2011/11/21(月) 09:56:04.74int* pi1;
int* pi2;
pi2 = &(*(pi1));
これって、pi1とpi2とで、指しているインスタンス違います?同じです?
Int()というのについて、リファレンス読むと答えわかります?
0667デフォルトの名無しさん
2011/11/21(月) 10:17:43.09そもそもpi1が何も指していない状態でデリファレンスしているので鼻から悪魔。
0668666
2011/11/21(月) 10:25:45.18int* pi1 = &i1;
int* pi2;
pi2 = &(*(pi1));
std::cout << " pi1 : " << pi1 << std::endl;
std::cout << " pi2 : " << pi2 << std::endl;
忘れてた。
pi1とpi2が示しているアドレスそのものを表示させてみてから質問するべきだでした。
同じですね。違ったら質問する価値があったかもしれないが。残念。
失礼しました。
0669デフォルトの名無しさん
2011/11/21(月) 11:36:36.38#include <map>
#include <string>
int main() {
class StringLap
{
public:
std::string hoge;
};
std::map<int, StringLap*> foo1;
}
上記をeclipseで行うと、コンパイルが通りません。どうしてでしょうか?
Visual C++だと通ります。
よろしくお願いします。
error: `main()::StringLap*' uses local type `main()::StringLap'
error: trying to instantiate `template<class _T1, class _T2> struct std::pair'
error: template argument 4 is invalid
error: invalid type in declaration before ';' token
0670デフォルトの名無しさん
2011/11/21(月) 12:14:54.52eclipseでなくgcc(mingw-gcc?)のバージョンかコンパイルオプションのせい。
C++98/03ではローカルクラス(及びその合成型)はテンプレートの実引数にできない。
0671デフォルトの名無しさん
2011/11/21(月) 12:32:06.45>>670
ありがとうございます。理解できました。
0672デフォルトの名無しさん
2011/11/21(月) 15:04:36.57struct deleter { shared_ptr<x> p; void operator () (y * q) { delete q; } };
shared_ptr<x> p(new x);
shared_ptr<y> q(new y, deleter(p));
こういうこと普通にやりますかね?
もっと直接的に明確に寿命の順番を決めれるイディオムとかってありますか?
0673デフォルトの名無しさん
2011/11/21(月) 15:12:31.98何か一言書くと出来るようになるおまじないとか無いのですか?
欲しかったら、内部クラスのインスタンスを生成する際に、外側のクラスのポインタを渡して参照させないとダメですか?
0674デフォルトの名無しさん
2011/11/21(月) 15:43:19.930675デフォルトの名無しさん
2011/11/21(月) 16:07:44.80書いた順とは逆順にデストラクタが呼ばれるから、そんな無意味なことはする必要がない
0676デフォルトの名無しさん
2011/11/21(月) 16:29:50.18↑のページに書いてある、
SubClass(const SubClass &sub) : BaseClass(sub){}
という一文ですが、
これは、継承元のクラスのコピーコンストラクタを利用して(: BaseClass(sub))、その後、このクラスで追加したコピー作業は特に無い({})
という意味ですか?
とすると、この一文がなかった場合、コピーコンストラクタは継承されないということですか?
コンストラクタは強制的に継承されるのに、コピーコンストラクタは継承されない?
↑強制的に継承されるコンストラクタは、デフォルトコンストラクタしか無い場合?(ttp://www.geocities.jp/ky_webid/cpp/language/008.html)
まとめられなくなってきた。
0677デフォルトの名無しさん
2011/11/21(月) 16:44:16.450678デフォルトの名無しさん
2011/11/21(月) 16:48:38.62詳しくはEffectiveC++を読むといいです。持ってないなら今すぐ買う。
参考 http://www002.upp.so-net.ne.jp/ys_oota/effec/chapter3.htm
しばらくはわからないことだろうけど、目次の各条項だけでも覚えておくとそのうち理解できるようになる。
0679デフォルトの名無しさん
2011/11/21(月) 16:49:30.570680デフォルトの名無しさん
2011/11/21(月) 17:23:01.16みなさん、ありがとうございます。
EffectiveC++は第二版と第三版とどっちがよいですか?
第三版は、意味が逆に取られそうな箇所があると○mazonのレビューに書いてありました。
最新の第三版を買えば、改修されているのでしょうか?
第三版は10年以上前なのであまり良くないのでしょうか?
ところで、コンストラクタについて、もうひとつ教えてください。
いま手元で継承先のインスタンスを作った際にどのようにコンストラクタが呼ばれるか実行して動作を確認してみているのですが、
継承先のコンストラクタを記述する際に、
継承元に引数なしのコンストラクタがある場合は、デフォルトでこのコンストラクタが呼ばれ、
継承元に引数なしのコンストラクタがない場合は、明示的にどのコンストラクタを利用するか指定しないとコンパイルエラーになる、
のですが、これは仕様ですか?特に前者。
いいとか、いやとかではなくて、そのように覚えてしまってよいのかな?と。
0681デフォルトの名無しさん
2011/11/21(月) 17:23:44.78○第二版は10年以上前なのであまり良くないのでしょうか?
0682デフォルトの名無しさん
2011/11/21(月) 17:58:41.720683680
2011/11/21(月) 18:09:23.06了解した。
派生クラスで、コピーコンストラクタのオーバーライドを強要することは出来ます?
デストラクタのようにvirtualかなと思ったら、別の意味でした。
0684デフォルトの名無しさん
2011/11/21(月) 18:24:13.820685デフォルトの名無しさん
2011/11/21(月) 19:27:09.15struct Hoge {int foo,bar,baz}; という構造体があるとして、
これをstd::mapの値として使うには、どのように書けば良いでしょうか。 キーはとりあえずintとします。
std::map<int,Hoge> m;
……まではコンパイルが通るのですが、どうやって要素を追加すればいいのかが分かりません。
Hogeを配列にして、そのインデックスをmapに突っ込むという方法も考えましたが、
すごく無駄なことしているような気がします(´・ω・`)
0686デフォルトの名無しさん
2011/11/21(月) 19:46:55.520687デフォルトの名無しさん
2011/11/21(月) 19:51:07.17http://www.geocities.jp/ky_webid/cpp/library/010.html
0688デフォルトの名無しさん
2011/11/21(月) 19:52:07.47map<int, Hoge> m;
for(int i=0; i<10; i++) {
Hoge h = { 100+i, 200+i, 300+i };
//m[i] = h;
//m.insert(make_pair(i, h));
//m.insert(pair<int, Hoge>(i, h));
//m.insert(map<int, Hoge>::value_type(i, h));
}
0689デフォルトの名無しさん
2011/11/21(月) 19:55:51.06struct Hoge {
int foo, bar, baz;
};
int main()
{
std::map<int, Hoge> mih;
const int N = 10;
for (int i(0); i < N; i++) {
Hoge h;
h.foo = std::rand();
h.bar = std::rand();
h.baz = std::rand();
mih[i] = h;
}
for (std::map<int, Hoge>::const_iterator pos = mih.begin(); pos != mih.end(); ++pos)
std::cout << "mih[" << pos->first << "] = (" << pos->second.foo << ", " << pos->second.bar << ", " << pos->second.baz << ')' << std::endl;
}
0690685
2011/11/21(月) 20:37:52.73>>686
初期値を指定しないなら、それが一番簡単そうですね。
コンストラクタを用意すれば初期化も出来そうですが、そうなると初期化子が使えなくなるという。
>>687
そこは読んでいたのですが、構造体を突っ込む方法が分かりませんでした(´・ω・`)
>688-689
初期化子や、構造体に代入する別の関数(SetHoge()的なもの)を流用しようと考えると、
素直にforで回すのが良さそうですね。
0691デフォルトの名無しさん
2011/11/21(月) 21:44:42.36次はconstなmapをどうやって初期化するかで悩むね
0692デフォルトの名無しさん
2011/11/22(火) 18:38:55.68環境
Visual Studio 2010 Professional
DirectX SDK (June 2010)
コード
http://codepad.org/roAJTiEX
メインループからは、Sequence::ParentクラスのUpdate関数が呼ばれています。
ここまでで実装しようとしていることは、シーンを切り替える処理と、シーンごとの描画を行う処理です。
Sequence\Childクラスを継承するTitleクラス、StageSelectクラスを
1キー:Title 2キー:StageSelectと切り替えるだけの処理を行なっていますが、
実行直後はTitle→2キーを押してStageSelectに切り替え→1キーを押してTitleに切り替えたところで、
エラー
game.exe の 0x779915ee でハンドルされていない例外が発生しました:
0xC0000005: 場所 0xfeeeff2e を読み込み中にアクセス違反が発生しました。
が発生してしまいます。
具体的にはTitleクラスのコンストラクタから呼ばれた、shader.setRenderState関数内の277行目ですとか、
277行目をコメントアウトした場合は281行目で起きてしまいます。
要するに2回目には初期化済みじゃないことになっている?みたいなのですが、なぜなのかわかりません。
コメントがなくてよみづらく、長いコードになっていて申し訳ありませんが、どうぞよろしくお願いします。
0693デフォルトの名無しさん
2011/11/22(火) 18:39:33.830694デフォルトの名無しさん
2011/11/22(火) 19:20:18.690695デフォルトの名無しさん
2011/11/22(火) 19:36:10.26Titleが持ってるShaderがデストラクタで全部解放する作りになってる
void Parent::Update() {
Child* next = m_child->Update(this);
if (next != m_child){
SAFE_DELETE(m_child); <-- シーンが変わって delete m_child
class Title : public Child {
::myDirectX::Shader shader; <-- Title をdeleteしたらデストラクタが呼ばれる
Shader::~Shader(void) {
RELEASE(m_pd3dDevice);
m_dxDevice->Destruct(); <-- 関数呼んでる
void DXDevice::Destruct() {
if (--m_ref_count <= 0) {
SAFE_DELETE(m_instance); <-- m_instance は delete される
DXDevice* DXDevice::getInstance() {
if (m_instance) {
} else {
MessageBox( 0, _T("DXDeviceクラスの初期化をされる前に呼び出しがありました"), NULL, MB_OK);
PostQuitMessage(EXIT_FAILURE);
return 0; <--- NULL 返してる、これを使ってアクセスしてぬるぽ?
0696デフォルトの名無しさん
2011/11/22(火) 19:41:25.93読むの早いなあ
0697デフォルトの名無しさん
2011/11/22(火) 20:29:37.33SUGEEEE!
270行目をコメントアウトすることで、無事通りました!
Shader::~Shader(void)
{
//RELEASE(m_pd3dDevice);
m_dxDevice->Destruct();
}
この行をShaderクラスが行ってしまうことによって、
まだ使うはずのDXDeviceクラスのm_pd3dDeviceが解放されてしまい(NULLポインタになってしまい)、
277行目から飛んだ562行目でNULLポインタ参照、
または、281行目でNULLポインタ参照がおきてしまっていたのが原因でした。
2,3日ここでつまっていたので、本当に助かりました!ありがとうございました!
0698697
2011/11/22(火) 20:32:28.78あ、あと、これは知りませんでした。
勉強になりました!ありがとうございました!
0699デフォルトの名無しさん
2011/11/22(火) 21:07:49.770700デフォルトの名無しさん
2011/11/22(火) 22:01:17.77pBase = new Derrived(); // Baseは、Derrivedの継承元
delete pBase;
ってやったらまずいんですか?
(ttp://d.hatena.ne.jp/tt_clown/20091105/1257399660)
そしたら、多様化つかった場合にメモリリークを回避することができなくないですか?
よろしくお願いします。
0701デフォルトの名無しさん
2011/11/22(火) 22:23:37.42そうでないならだめ
0702700
2011/11/23(水) 02:06:35.86>>701
ありがとうございます。とてもわかりやすかったです。
教わったことを元に検索してみたら、以下をみつけて、
ttp://d.hatena.ne.jp/ajiyoshi/20080925/p1
ttp://d.hatena.ne.jp/Isoparametric/20080925/1222300488
そういえば、前にも見たけど何言ってるのか全然わかんねぇよ、という感じだったのから、とてもわかるようになりました。
ところで、
ttp://codepad.org/A9PqHZqg
のソースですが、エラーにならないのは、継承後のクラスに、新たにデフォルトの「コピーコンストラクタとoperator=」が出来たからで間違いないですか?
0703デフォルトの名無しさん
2011/11/23(水) 02:55:49.280704700
2011/11/23(水) 03:00:15.17ほんとだ!継承してない!
何という節穴…。
ありがとうございます。
0705デフォルトの名無しさん
2011/11/23(水) 19:27:13.91doubleの値をunsigned long longへキャストする時
LONGLONG_MAXを超えULONGLONG_MAX以下の数が
正しく変換されません(0x8000000000000000になる)
これってこのコンパイラだけですかね
Cの標準的にはどうなんだろう
他のコンパイラのでの結果を教えてください
0706デフォルトの名無しさん
2011/11/23(水) 19:29:29.160707デフォルトの名無しさん
2011/11/23(水) 19:37:51.67多倍長浮動小数ライブラリ MPFR
というのがある。これは連動して使えるはず。この使用で環境依存をなくせる。
http://ryukyu.astr.tohoku.ac.jp/pukiwiki/index.php?Members%2Fchinone%2F%B3%D0%BD%F1%2FGMP
0708デフォルトの名無しさん
2011/11/23(水) 19:47:35.340x800・・になるのが正しいかは知らんが、
(unsigned long long int)double_manko; → llrint(double_manko) なのだから
unsigned long longの値を扱えないのは正しいのでは?
ISO/IEC 9899:1999 H.2.4
0709デフォルトの名無しさん
2011/11/23(水) 20:12:39.55int演算の時のゼロ除算みたくデバッガ等で検出することってできますか?
0710デフォルトの名無しさん
2011/11/23(水) 20:16:46.37の戻り値ってどうして参照なんですか?
構造体そのものが返ってる気がするのです。どう考えればよいのでしょう?
0711デフォルトの名無しさん
2011/11/23(水) 20:18:32.900712657
2011/11/23(水) 23:12:52.82>struct base {
> virtual base * clone(void) const = 0;
>};
>
>struct derived : base {
> derived * clone(void) const { return new derived(*this); }
>};
これって純粋仮想関数のオーバーライドって言うのですか?(抽象クラスの実装とか?)
戻り値の型が、base* と derived* とで異なりますけど、その辺のところは気にしなくてOKです?
コンパイルは通って、目的の動きをしているのは確認済みなのですが、何となくしっくりこないす。
0713デフォルトの名無しさん
2011/11/24(木) 04:10:44.77複数行(マルチパート)の標準入力取得がうまくいかない。
fread、std::cin >> 変数等試してみたが、1行目しか取得できなかったり、
全く取得できなかったりする。
一括で(じゃなくてもいいけど)、複数行の標準入力を取得することはできない?
0714デフォルトの名無しさん
2011/11/24(木) 04:17:08.54読み込みを行で止めないとすると、どこまで読みたいのか言ってもらわないと。
やりたいこと・実際にやったこと・実際の結果の3つを示すのが相談の基本だぜ。
0715デフォルトの名無しさん
2011/11/24(木) 12:52:48.75> 戻り値の型が、base* と derived* とで異なりますけど、その辺のところは気にしなくてOKです?
仮想関数で共変の返却値を実現するために用意されてる機能。規格にあるのでその意味では気にしなくてよい。
0716デフォルトの名無しさん
2011/11/24(木) 20:10:15.34範囲選択後にタブでまとめて右にインデントができますが、
左にインデントはシフトとタブで実現できました。
本当にありがとうございました。
0717デフォルトの名無しさん
2011/11/24(木) 20:25:59.80どうもありがとうございます
0718デフォルトの名無しさん
2011/11/24(木) 21:17:17.34hitoクラスのコンストラクタでokanクラスのメンバに影響を与える時、
「静的でないメンバー参照は特定のオブジェクトを基準とする相対参照である必要があります」
とエラーメッセージがでてコンパイルできません。
下のコードだと6行目 okan.hp-- の部分です
これはなぜでしょうか?
class hito
{
public:
int hp;
hito(){
okan.hp--;
}
};
class okan{
public:
int hp;
};
0719デフォルトの名無しさん
2011/11/24(木) 21:21:33.17ワンパスに物凄い拘りがあるのかワンパスの制約がなんか都合がいいのか知らんけど
0720デフォルトの名無しさん
2011/11/24(木) 21:34:38.79各クラスのメンバ変数は、生成したインスタンスごとに別物として扱うから。
実際に生成されてない(もしくは指定されていない)のに、hpに1足しますって言われても、主語を言えよ!って怒られる。
0721デフォルトの名無しさん
2011/11/24(木) 21:37:51.05クラス名とインスタンス名を間違えていました。大変申し訳ありませんでした。
逝ってきます・・・
0722デフォルトの名無しさん
2011/11/24(木) 22:04:40.77基底クラスのコンストラクタを実行させる方法ってありますか?
ちなみに環境はVC++ 2010 Express Edition、OSはWindows VistaもしくはWindows Developer Preview です。
0723デフォルトの名無しさん
2011/11/24(木) 22:07:24.400724デフォルトの名無しさん
2011/11/24(木) 22:13:19.93基底クラスの引数を取るコンストラクタを使いたいわけなのですが、
派生クラス(コンストラクタは定義していない)のオブジェクトを
引数を付けて生成してやると、コンパイルエラーが出るのです。
0725デフォルトの名無しさん
2011/11/24(木) 22:15:24.00{
public:
Derived(int a) : Base(a) {}
}
こういう事?
0726デフォルトの名無しさん
2011/11/24(木) 22:21:53.52出来ました、ありがとうございました!
しかし何が起こっているのやらさっぱりなので説明してくださると有難いです。
0727デフォルトの名無しさん
2011/11/24(木) 22:32:01.88目的通りの内容しかやってない気がする
0728デフォルトの名無しさん
2011/11/24(木) 22:32:48.510729デフォルトの名無しさん
2011/11/25(金) 00:54:31.10対策をご教授頂けます様お願いします。
■環境
言語:C
HW:SunFire V240
OS:Solaris9
コンパイラ:SunStudio付属(?) cc
下記のようなソースにて、構造体のメンバを増やすと、関数functionを
呼び出した際にセグメントエラーとなってしまう。※定義の直下にデバッグ文を入れても出ないため定義自体でアウトになっている?
dbxでcoreを読み込んでみると「フォルトのアドレスにマッピングしていません」等のメッセージ。
--------------------
typedef struct {
int ia;
short sa;
short sb
}child;
typedef struct {
child ca;
child cb;
child cc; // 新規追加
}parent;
int function() {
parent pa[288][140];
//以降処理
}
--------------------
0730デフォルトの名無しさん
2011/11/25(金) 01:18:24.63100%勘で答えるけど、
その構造体の配列宣言のところでエラーになってると思う。
原因は配列全体のサイズが大きいから。
その宣言の仕方だとその配列に割り当てられるメモリ上のアドレスは連続していなければならないため、
例え容量が空いていても連続した領域でそれだけの領域が確保できなければエラーになる。
malloc使えば領域確保の段階でエラーが出てるかどうかをきっちり判別できるはず。(mallocの戻り値で判別)
どうしたら良いんだろうな、
parentの配列一つ一つにmallocで確保した領域を渡してやればいけるだろうけどそれはスマートじゃないしな。
教えてエロい人。
0731デフォルトの名無しさん
2011/11/25(金) 01:54:34.37解決策はいくつかあるが、例えば
・コンパイラのオプションでスタック領域を増やす・・・場当たり的、コンパイラ次第では不可
・staticで宣言する・・・再起呼び出しや複数スレッドからの呼び出しができない
・動的に確保する・・・開放が必要、C++ならvectorの利用もあり
等々。
二次元配列であっても、mallocで確保するのは一次元のときと違いはない。
ただし、当然ながら最後の次元以外の要素数は、定数でなければいけない。
0732デフォルトの名無しさん
2011/11/25(金) 02:52:11.820733デフォルトの名無しさん
2011/11/25(金) 03:06:31.73ここに「メンバを増やすと」落ちると言っている。
0734デフォルトの名無しさん
2011/11/25(金) 03:16:18.600735デフォルトの名無しさん
2011/11/25(金) 03:22:07.660736デフォルトの名無しさん
2011/11/25(金) 13:53:22.83二次元配列を動的確保する方法は何通りかあるが、
pa[a][b]のように書くことに拘らないならば
一次元として確保するのが拡張性からも保守性からもお勧め。
その場合、こんな感じ。
-- こういう関数を用意して
unsigned offsetOfPa(unsigned a, unsigned b, unsigned bSize) {return a * bSize + b;}
-- こうやって確保して、
parent * pa = malloc(sizeof(* pa) * 288 * 140);
-- こうやって使って、
pa[offsetOfPa(a, b, 140)];
-- こうやって解放する。
free(pa);
-- 面倒だったら関数を用意しないで毎回計算式を書いてもいいけどね。
0737デフォルトの名無しさん
2011/11/25(金) 18:02:40.96auto at([&](int i, int j) -> hoge & { return v[i * col + j] ; });
at(4, 5).func();
0738デフォルトの名無しさん
2011/11/25(金) 18:14:44.270739デフォルトの名無しさん
2011/11/25(金) 18:30:18.48http://www.atmarkit.co.jp/fdotnet/dotnettips/193codefrmt/codefrmt.html
C#だと以上の方法で一気に揃えることができるようなのですが、
C++にこの項目はありませんでした
手動か放置するしか無いでしょうか
0740デフォルトの名無しさん
2011/11/25(金) 19:04:27.240741デフォルトの名無しさん
2011/11/25(金) 19:06:40.67IDEに限らず使える。
0742デフォルトの名無しさん
2011/11/25(金) 19:12:31.58これでいいんじゃ
int function() {
typedef parent pa_140[140];
pa_140 *pa = malloc(sizeof(pa_140) * 288);
//なんか処理
pa[232][13].ca.ia = 1;
//開放
free(pa);
}
0743デフォルトの名無しさん
2011/11/25(金) 19:13:14.97ナンテコッタ、偶然であります。マルチではないです。。
C-k C-f ですね、うまくいきました。ありがとうございました。
>>741
ありがとうございます
今後のためにも使ってみます
0744デフォルトの名無しさん
2011/11/25(金) 19:46:19.96プロジェクトで決まっている整形ルールを設定する必要があるからなぁ。
大抵は一般的なスタイルだからいいんだろうけど、たまにね。
0745デフォルトの名無しさん
2011/11/25(金) 19:48:09.01連続領域にするかどうかの話はさておき、mallocは確保できなくても確保できたように振舞う環境(設定)があるから気をつけてね。
0746デフォルトの名無しさん
2011/11/25(金) 19:56:28.43mjd!?
0747デフォルトの名無しさん
2011/11/25(金) 20:21:37.18> デフォルトでは、Linux は楽観的メモリ配置戦略を用いている。つまり、 malloc() が NULL でない値を返しても、そのメモリが実際に利用可能であることが保証されない。
Solaris9がどうなのかは知らない
0748デフォルトの名無しさん
2011/11/25(金) 20:47:14.32これは知らなかった(; ゚д゚)いい勉強になりました。
0749デフォルトの名無しさん
2011/11/25(金) 21:57:26.15リソースを調べてもDLLの入れ方が出てこないです。
0750デフォルトの名無しさん
2011/11/25(金) 22:19:27.62こんなコトしてるからシェア奪えないんだよwww
0751デフォルトの名無しさん
2011/11/25(金) 23:40:03.66どゆことw
0752デフォルトの名無しさん
2011/11/25(金) 23:41:22.98DLLの作り方で調べるのが早いと思う
0753デフォルトの名無しさん
2011/11/25(金) 23:54:14.61無理です。諦めてください。
>>752
テキトーなことぬかすな
0754デフォルトの名無しさん
2011/11/25(金) 23:57:08.57>>730->>731のご両人はじめ、ご意見頂いた方ありがとうございました。
時間もないし、シングルスレッドゆえstaticつけて解決しました。
これからもちょくちょく質問させて頂きますので、よろしくお願いします。
Javaしかやってこなかったから厳しい・・・orz
0755デフォルトの名無しさん
2011/11/26(土) 04:56:31.67ソースへそのまま埋め込んでも良い所を、可読性のために関数化したときなど。
0756デフォルトの名無しさん
2011/11/26(土) 05:05:19.16頭だいじょうぶ?
0757デフォルトの名無しさん
2011/11/26(土) 11:37:12.790758デフォルトの名無しさん
2011/11/26(土) 14:10:03.12その分速いって事でしょ。
でもどんだけ速くなるのかのデータは見たことがないような...
0759デフォルトの名無しさん
2011/11/26(土) 14:28:18.52ほとんどコストが掛からなくなってるからな
0760デフォルトの名無しさん
2011/11/26(土) 22:03:53.16class MyExcept : public std::exception {
char const * m_pWhat;
MyExcept(char const * pWhat) : m_pWhat(pWhat) {}
char const * what() const { return m_pWhat; }
};
void func(void) {
throw MyExcept("something bad"); }
こう書いても問題は起こらないですか?
0761デフォルトの名無しさん
2011/11/26(土) 23:11:07.680762デフォルトの名無しさん
2011/11/26(土) 23:15:27.640763デフォルトの名無しさん
2011/11/26(土) 23:24:54.81後でソースを呼んだときに、this->なの?グローバルなの?と気にしたくなです、みたいな。(今はthis->を必ず書いています。)
c言語の関数を呼ぶときは、例えば「c::[関数名]」と出来るように何かをかぶせることは出来ないでしょうか?
実際に、今までどおりに呼ぶことが可能でもいいので、コードとして書くときにc::のような何名前空間の配下にいることを書きたいだけです。
例えば、DXライブラリがおもしろくて、最近使ってみているのですが、このライブラリ配下の関数を呼ぶときには、dxlib::[関数名]と書ければいいなぁなんて…。
よろしくお願いします。
0764712=657
2011/11/26(土) 23:27:27.10レス遅くなりました。
>>715
>規格にあるのでその意味では気にしなくてよい。
了解です。ありがとうございます。
0765デフォルトの名無しさん
2011/11/26(土) 23:29:55.38c::printf( "homu\n" );
0766デフォルトの名無しさん
2011/11/26(土) 23:37:44.25C++でオブジェクト指向使ってます。
UMLっていいですか?現場で使ってますか?
設計書なんてどうでもいいからもっとコード書いた方がいいですか?
Effective C++のように、本当に役に立つようないい本はありますか?
0767デフォルトの名無しさん
2011/11/26(土) 23:38:39.280768763
2011/11/26(土) 23:49:08.00?、!?、え?、あれ?
これどういう意味です?出来たのですが、理解できない。
…。
おぉ!、「#define c [なんもなし]」で、「c」がプリプロセッサに削除されるという感じですか?
間違ってたらレスよろしくお願いします。
(ヘッダ読んでみたら、DXライブラリが、C++で書かれていたので、既にDxLibという名前空間にあったのはさておき。)
0769デフォルトの名無しさん
2011/11/26(土) 23:52:49.06ラッパー書けばいいよ
0770デフォルトの名無しさん
2011/11/26(土) 23:58:05.73namespace manko {
using ::GetTickCount;
using ::CreateFile;
}
>this->なの?グローバルなの?と気にしたくなです、みたいな。(今はthis->を必ず書いています。)
すまんが意味がわからん
0771デフォルトの名無しさん
2011/11/26(土) 23:58:19.69なんもなしで
::printf ってやったのと同じだよ、thisの外にあるやつを明示的に使うときに使う
0772デフォルトの名無しさん
2011/11/26(土) 23:59:44.62>dxlib::[関数名]と書ければいいなぁ
もちろん、DxLib.hを読んだ上で聞いてるんだよな?
0773デフォルトの名無しさん
2011/11/27(日) 00:00:37.37#defineの痴漢マクロ使うバカはしね
0774デフォルトの名無しさん
2011/11/27(日) 00:05:10.50大きなアプリになると追えなくなるとか?
0775デフォルトの名無しさん
2011/11/27(日) 00:06:44.200776デフォルトの名無しさん
2011/11/27(日) 00:06:57.21∧||∧
( ⌒ ヽ
∪ ノ
∪∪
0777デフォルトの名無しさん
2011/11/27(日) 00:22:52.82コンパイルエラーで止まってくれるとは思うけど、
自分が書いたわけじゃなく、かつ見えるところに#defineが無ければ、そのまま丸1日くらい悩むかもしれんw
0778デフォルトの名無しさん
2011/11/27(日) 00:26:26.26うわぁ…。
0779デフォルトの名無しさん
2011/11/27(日) 00:37:09.02何を今さら「置換マクロの危険性に気づいちゃった」的な驚きなの
0780デフォルトの名無しさん
2011/11/27(日) 00:40:50.26#include <stdio.h>
}
これって大丈夫だっけ
0781デフォルトの名無しさん
2011/11/27(日) 00:47:07.010782デフォルトの名無しさん
2011/11/27(日) 00:54:07.11namespace manko {
extern "C" {
#include <Windows.h>
}
}
int main() {
manko::GetTickCount();
}
0783デフォルトの名無しさん
2011/11/27(日) 01:09:32.18できたとしても その中で定義されてるstructとかにキャストしたものを返すマクロを使うとキャスト部分にネームスペース入れられなくて詰む
0784デフォルトの名無しさん
2011/11/27(日) 01:12:55.990785デフォルトの名無しさん
2011/11/27(日) 01:25:22.000786デフォルトの名無しさん
2011/11/27(日) 02:08:20.95>>763は1行目と2行目との間でつながりがおかしな文章だが、そこから意味を汲み取れない>>785は出家した方がいい
0787デフォルトの名無しさん
2011/11/27(日) 02:54:54.86今、「AIZU ONLINE JUDGE」の0087番の問題を解いています。
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0087
コードを書き終わり、手持ちの環境でチェックするときちんと動いているようなのですが、いざsubmitしてみるとRuntime Errorになってしまいます。
http://codepad.org/geukm98H
何か間違っているのでしょうが、見当がつきません…
どなたかご教示下さい。
0788デフォルトの名無しさん
2011/11/27(日) 03:12:14.11入力に与えられる「数」には負数もあるんじゃないの?
0789デフォルトの名無しさん
2011/11/27(日) 03:46:05.15ありがとうございます!Accepted貰えました。
負数は無いものと勝手に思い込んでました…
0790デフォルトの名無しさん
2011/11/27(日) 07:20:23.43>「オブジェクトが入出力機器やファイルや通信、プロセスやスレッド、ウィンドウとウィジェットなど
>ハードウェアやオペレーティングシステム (OS) が提供する資源を管理するために利用される場合に、
>構築子や消滅子でそれらの資源の使用開始(オープン処理)や使用終了(クローズ処理)をそれぞれ管理し、
>通常のメソッドでそれらにまつわる各種サービスを提供するようにすることで、
>それらのリソースがあたかもプログラム中のオブジェクトであるかのように自然に取り扱うことができるようになる。」
と書いてあったのですが、コンストラクタで↑のような資源を取得することに失敗した場合ってどう対応すればいいのですか?
コンストラクタにはreturn falseのようなものがないですよね?
途中でthrowで例外を投げてしまう感じですか?
0791デフォルトの名無しさん
2011/11/27(日) 09:16:28.760792デフォルトの名無しさん
2011/11/27(日) 09:17:57.00hoge.open();
hoge.read();
hoge.write();
hoge.close();
delete hoge;
}
0793デフォルトの名無しさん
2011/11/27(日) 09:23:10.71そう。
コンストラクタで問題が起きたらコンストラクタから例外を投げるのが良くあるパターン。
0794デフォルトの名無しさん
2011/11/27(日) 10:57:58.60コンストラクタであれば、
class B : public A
{
public:
B() : A()
{
this->print();
}
protected:
void print()
{
std::cout << "piyoB" << std::endl;
// A::print(); と書くより、super::print();みたいな表記の方がわかりやすいかなぁ、なんて。
}
};
みたいに、継承元クラスのコンストラクタ名を指定すれば使えるみたいですけど。
よろしくお願いします。
0795794
2011/11/27(日) 10:59:03.37×// A::print(); と書くより、super::print();みたいな表記の方がわかりやすいかなぁ、なんて。
○// A::print(); と書くより、super->print();みたいな表記の方がわかりやすいかなぁ、なんて。
0796デフォルトの名無しさん
2011/11/27(日) 11:04:53.880797デフォルトの名無しさん
2011/11/27(日) 11:21:26.900798デフォルトの名無しさん
2011/11/27(日) 11:23:56.43環境はgcc4,2,1です。
0799デフォルトの名無しさん
2011/11/27(日) 11:25:22.320800デフォルトの名無しさん
2011/11/27(日) 11:26:17.01inline A * base() { return static_cast<A *>(this); }
public:
void f() { base()->g(); }
};
0801デフォルトの名無しさん
2011/11/27(日) 11:27:31.04getline
0802デフォルトの名無しさん
2011/11/27(日) 11:28:26.88#include <string>
...
string s;
std::cin >> s;
0803デフォルトの名無しさん
2011/11/27(日) 11:31:43.82#include <iostream>
#include <string>
...
std::istringstream iss;
std::string s;
std::iss >> s; // fgets(buf, n, fp)
std::cin >> s; // fgets(buf, n, stdin)
ttp://www.geocities.jp/cbc_vbnet/vc/string.html
0804794
2011/11/27(日) 11:36:35.34おぉぅ!アップキャストとinlineで。なんか感動しました。
ありがとうございます。
(とりあえず、C++にはsuperは無いんですね。)
0805デフォルトの名無しさん
2011/11/27(日) 11:44:00.02いろいろとC++は古い
Cにいろいろくっつけて無理矢理OOP言語にしたのだから仕方がない
その代償として著しくCからの移行が楽になっている
0806794
2011/11/27(日) 11:45:30.39もうひとつお願いします。
仮想関数の宣言のvirtualは、基底クラスのみに書けばよいのですか?
A→継承→B→継承→Cとしたときに、
該当のメソッドについて、全てのクラスにvirtualを書いた場合と、Aにのみ書いた場合とで、
A* pa = new C();
pa->method();
B* pb = new C();
pb->method();
した場合で、オーバーライドが効いているか試してみた感じそんな雰囲気でした。
基底のメソッドのみに書くのが正しいのかな?
0807794
2011/11/27(日) 11:46:53.33○した場合で、オーバーライドが効いているか試してみた感じ効いていました。
0808デフォルトの名無しさん
2011/11/27(日) 11:47:19.21ありがとうございます!
Cとは作法が違う所が有るようですね。
もう少し勉強しなければ...
0809デフォルトの名無しさん
2011/11/27(日) 12:04:30.24どっちでもいいが基底クラスには必ずvirtualが必要
§10.3.2
If a virtual member function vf is declared in a class Base and in a class Derived, derived directly or
indirectly from Base, a member function vf with the same name and same parameter list as Base::vf is
declared, then Derived::vf is also virtual (whether or not it is so declared) and it overrides97)
Base::vf. For convenience we say that any virtual function overrides itself. Then in any well-formed
class, for each virtual function declared in that class or any of its direct or indirect base classes there is a
unique final overrider that overrides that function and every other overrider of that function. The rules for
member lookup (10.2) are used to determine the final overrider for a virtual function in the scope of a
derived class but ignoring names introduced by using-declarations.
0810デフォルトの名無しさん
2011/11/27(日) 17:58:14.28端的に言うと、親が一人じゃないから特定できないんよ
0811デフォルトの名無しさん
2011/11/27(日) 18:52:00.89仮想関数をオーバーライドする場合は仮想関数にすべき。
オーバーライドになるのか、隠蔽になるのかを知るために、
すべての親をたどらなければならなくなるため。
0812デフォルトの名無しさん
2011/11/28(月) 01:16:10.12ttp://codezine.jp/article/detail/125
↑の「ステップ2 アダプタ一覧の取得」にあるような、ダイアログボックスを使いたいです。
サンプルプログラムを落として、2003→2010の変換をしてビルドすると、Expressでは無理、みないにいわれました。
�@ダイアログボックスを出すには有料版が必要ですか?
�AGUIとしえMessageBoxは使ったことがある(1行ですし。)のですが、ダイアログは数行では済まないでしょうか?
無理やりMessageBoxを繰り返してリスト的なことを実装したほうがらくなのかな、と意気消沈しています。
0813デフォルトの名無しさん
2011/11/28(月) 01:24:08.500814デフォルトの名無しさん
2011/11/28(月) 01:47:38.53Expressでも作れるけどわからない人からしたら苦行
ttp://wisdom.sakura.ne.jp/system/winapi/common/common15.html
ttp://wisdom.sakura.ne.jp/system/winapi/common/common16.html
C#使えC#
0815デフォルトの名無しさん
2011/11/28(月) 01:55:46.61fp = fopen("test.txt")
if (fgets(buf, sizeof(buf), fp)) == NULL) {
exit(-1);
}
0816デフォルトの名無しさん
2011/11/28(月) 02:18:46.86それは>>794の望む結果にならないんでは。
C++なら this->A::print(); と書く。
0817デフォルトの名無しさん
2011/11/28(月) 02:48:04.96「C++でSUPERっぽい書き方出来ないの?」が質問の主旨なんじゃねーの
0818デフォルトの名無しさん
2011/11/28(月) 02:55:13.830819816
2011/11/28(月) 03:07:45.30super経由で呼び出す関数を、派生クラスでなく基本クラスにしたいという意図と理解したんだが考えすぎ?
字面が似てるだけでいいならsuperって変数用意すればいい。>>800のは動作がsuperと異なるぜ。
そもそも他重軽傷を許すC++にsuperなんて変だろ
0820デフォルトの名無しさん
2011/11/28(月) 05:47:45.400821デフォルトの名無しさん
2011/11/28(月) 08:30:36.62>Expressでも作れるけどわからない人からしたら苦行
>C#使えC#
HINSTANCE とか出てくると途端にコードの意味を読めなくなるので諦めます。
了解しました。C#を学んできます。
0822821
2011/11/28(月) 08:46:02.78C++じゃないから当然のように無理です?
0823デフォルトの名無しさん
2011/11/28(月) 09:06:22.69そんなのなくても.net frameworkは強力だから要らない
0824デフォルトの名無しさん
2011/11/28(月) 09:42:03.90inline InterfaceA(A * p) : p(p) { }
inline void print() const { p->T::print(); }
A * p;
};
struct B : A {
InterfaceA base() { return this; }
void base_print() { base().print(); }
};
0825デフォルトの名無しさん
2011/11/28(月) 12:51:26.51もういちどお願いします。
たとえば、インスタンスが何個つくられたか記録してみよう、としたとき、
クラス変数を用いると比較的簡単に作れるかなと思いきや、
この方法では外から変数の値を書き換えが出来るので欠陥持ちです。
(確かJavaの入門書でこの用途の例題があった。)
クラスメソッドかインスタンスメソッドからのみ、書き換えを許可したいのですが、無理でしょうか?
#include <iostream>
class A{
public:
static int hogehoge; // 静的変数宣言
A() { this->hogehoge++; }
void printNum(){ std::cout << hogehoge << "個生まれたかも。" << std::endl; }
};
int A::hogehoge = 0; // 静的変数定義
class B : public A{
public:void printNum(){ std::cout << "ハンバーガー" << hogehoge << "個分かな。" << std::endl; }
};
int main()
{
A a1, a2;
B::hogehoge = 999; // protectedやprivateでは、static変数を宣言は出来るが定義ができない。
a1.printNum(); B b; b.printNum();
return 0;
}
0826デフォルトの名無しさん
2011/11/28(月) 13:13:51.96protected
0827デフォルトの名無しさん
2011/11/28(月) 13:15:41.71> B::hogehoge = 999; // protectedやprivateでは、static変数を宣言は出来るが定義ができない。
これなんなの?コンストラクタでやるのはだめなの?
0828デフォルトの名無しさん
2011/11/28(月) 13:18:13.93> int A::hogehoge = 0; // 静的変数定義
定義はできてるだろ。 private でも通る。
初期値が 999 なら 999 で定義しろよ。
0829デフォルトの名無しさん
2011/11/28(月) 13:18:22.460830825
2011/11/28(月) 18:07:09.52↑は、出来て欲しくないことが、出来てしまうのでこまるなぁ、というつもりで書きました。すみません。
privateにするとコンパイル通りません、通りました。
あれー!?何度も試したんだけどな。
protectedで解決しました。
ありがとうございました。
0831デフォルトの名無しさん
2011/11/28(月) 23:23:46.710832デフォルトの名無しさん
2011/11/28(月) 23:26:20.32無駄無駄無駄無駄無無駄無駄無駄無駄無無駄無駄無駄無駄
無駄無駄無駄無駄無無駄無駄無駄無駄無無駄無駄無駄無駄
無駄無駄無駄無駄無無駄無駄無駄無駄無無駄無駄無駄無駄
無駄無駄無駄無駄無無駄無駄無駄無駄無無駄無駄無駄無駄
無駄無駄無駄無駄無無駄無駄無駄無駄無無駄無駄無駄無駄
無駄無駄無駄無駄無無駄無駄無駄無駄無無駄無駄無駄無駄
無駄無駄無駄無駄無無駄無駄無駄無駄無無駄無駄無駄無駄
無駄無駄無駄無駄無無駄無駄無駄無駄無無駄無駄無駄無駄
無駄無駄無駄無駄無無駄無駄無駄無駄無無駄無駄無駄無駄
無駄無駄無駄無駄無無駄無駄無駄無駄無無駄無駄ァーー!
0833デフォルトの名無しさん
2011/11/28(月) 23:46:42.46なんで protected なの?
0834デフォルトの名無しさん
2011/11/29(火) 02:41:44.180835デフォルトの名無しさん
2011/11/29(火) 11:11:17.510836デフォルトの名無しさん
2011/11/30(水) 10:57:59.02boost::this_thread::sleep(boost::posix_time::milliseconds(1));
↑ふたつって、意味は同じ?
それとも、下側のソースは、基準になる現在時刻がないから、最低の時間のsleepになる?
テンプレートでどう変化するのか良くわからない。
よろしくおねがいします。
…boostスレに書いたほうがいいです?(過疎ってるみたいなのでこちらに書いてみました。)
0837デフォルトの名無しさん
2011/11/30(水) 19:28:35.18これは常に真になるべき?
0838デフォルトの名無しさん
2011/11/30(水) 19:35:02.49!(a < b) && !(b > a)
ここがバグってんじゃないの
0839デフォルトの名無しさん
2011/11/30(水) 19:49:23.85分かりにくいので式を簡単にしていく。
p = XOR(!(a < b) && !(b > a), a == b) ・・・ 最初の式
p = XOR(!(a < b) && !(a < b), a == b) ・・・ aとbの向きを合わせる
p = XOR((a >= b) && (a >= b), a == b) ・・・ NOT取る
p = XOR(a >= b, a == b) ・・・ (a >= b) && (a >= b)をまとめる
ここで試しに値を入れる
a > b = 真
a == b = 偽
a < b = 偽
0840デフォルトの名無しさん
2011/11/30(水) 21:58:48.20ある関数が、共有ライブラリの中で見つかったらそれを使い、
見つからなかったら静的な関数を「デフォルト」として使うようにしたいのですが、
どのようにしたらいいのでしょうか?
0841デフォルトの名無しさん
2011/11/30(水) 22:02:47.340842デフォルトの名無しさん
2011/11/30(水) 22:15:22.76共有ライブラリであるところの「ファイル自体」が存在しない場合も
まともに実行ファイルが起動するようにしたいです
素朴にやると、ビルド時に指定したファイル名の共有ライブラリがないと起動しないですよね
0843デフォルトの名無しさん
2011/11/30(水) 22:31:05.460844デフォルトの名無しさん
2011/12/01(木) 00:05:02.43起動後に共有ライブラリを(あれば)ロード・そこから各関数の関数ポインタを取得して利用するようにする
0845デフォルトの名無しさん
2011/12/01(木) 07:25:43.710846デフォルトの名無しさん
2011/12/01(木) 11:14:06.530847デフォルトの名無しさん
2011/12/02(金) 20:26:11.85コンストラクタ−を読んだだけだったというミスをしていた
//Hoge hoge(hikisu);//のつもりで
Hoge(hikisu);//と書いていた
目的の動作はしなかったけどコンパイルは通ってて、これはなにをしてるの?
単に関数として呼んでるだけ?
0848デフォルトの名無しさん
2011/12/02(金) 20:56:13.13引数 hikisu でコンストラクトしている。
ただし、名前が無いのでアクセスできず、結果として文の終わりで破棄される。
0849デフォルトの名無しさん
2011/12/02(金) 20:59:25.99しかしそれだとなるほど目的の動作にはならないわけだ
0850デフォルトの名無しさん
2011/12/02(金) 21:18:47.05あと、class HUMAN はどういう構造にすればいいんでしょう?
class HUMAN
{
class LUNG
class HEART
といったように、各器官を包含するようにすればいいのか、
class HUMAN
{
class RESPIRATORY_SYSTEM
class REPRODUCTIVE_SYSTEM
のように系を中心としてまとめればいいんでしょうか? くだらない質問ですみません。皆さんならどうします?
0851デフォルトの名無しさん
2011/12/02(金) 21:39:10.99その時所属してるチームの方針によって変わります
0852デフォルトの名無しさん
2011/12/02(金) 22:04:09.17レスありがとうございます。
個人やチームの、その時々の考え方で変わるということですね。
前者は、人間は複数の器官から成り立つという考え方、後者は機能(系)に注目した見方と思います。
どちらが良いか・優れているか、ではなく、場合により適切な方を選択すれば良いということでしょうか。
クラスについて、さらっと勉強した程度ですので、どのように設計すれば良いかが分からず、難しく思います。
クラスの設計に「正解」はないのかもしれませんが・・・
0853デフォルトの名無しさん
2011/12/03(土) 07:24:15.00どんな時ですか?
派生クラスのインスタンスを、基底クラスにキャストして、そこから派生クラス側で
オーバーライドした仮想関数を呼び出すような使い方って、あまり思いつかない
のですけど。全部、非仮想関数にするのは反則?
0854デフォルトの名無しさん
2011/12/03(土) 08:41:35.17基底クラスのメンバ関数を、派生クラス側で実装してほしい場合
かつ
基底クラスを利用する既存のプログラムを、そのまま利用したい場合
0855デフォルトの名無しさん
2011/12/03(土) 08:45:43.540856デフォルトの名無しさん
2011/12/03(土) 09:59:14.01g++のnewはいったい何時からデフォルトではNULLを返さなくなったのだ・・・
0857デフォルトの名無しさん
2011/12/03(土) 11:15:14.28new (nothrow)
0858デフォルトの名無しさん
2011/12/03(土) 11:24:58.12バージョンとか年とか
0859デフォルトの名無しさん
2011/12/03(土) 12:34:22.51少なくとも2.95以降は標準C++98準拠で例外投げるようになってると思うな
0860デフォルトの名無しさん
2011/12/03(土) 14:35:21.46基底のクラスはそれ自体で使うことがあるのでprotectにするのは無しで
0861デフォルトの名無しさん
2011/12/03(土) 14:39:11.400862デフォルトの名無しさん
2011/12/03(土) 14:45:55.58public継承は「派生クラスなら基底クラスである」という条件を満たす場合に使うもの
一部分でもprivate化してしまえばそのルールが崩れてしまう
そういう時にはprivate継承して公開するものだけをpublic化するか、
継承させずにメンバ変数で持たせてディスパッチするメンバ関数を用意する
0863デフォルトの名無しさん
2011/12/03(土) 14:52:11.27private継承して公開するものをpublic化てどうするの?
0864デフォルトの名無しさん
2011/12/03(土) 14:57:39.300865デフォルトの名無しさん
2011/12/03(土) 15:04:10.22usingてこういうふうにも使えるのか
ありがとう、勉強になった
0866デフォルトの名無しさん
2011/12/03(土) 16:24:26.08今一番一般的なC(参考書やサイトで情報が多い)はなんというものでしょうか
C#は避けたいです。
今インストールされている開発ツール(マイクロソフトのVB.NETやC#が入っているもの)では
.NET、MFC、Win32あたりでフォームアプリが作れそうなのですがどれが良いでしょうか?
0867デフォルトの名無しさん
2011/12/03(土) 16:27:19.030868デフォルトの名無しさん
2011/12/03(土) 16:36:10.08プロの現場でもそうやってよく使われています
0869デフォルトの名無しさん
2011/12/03(土) 16:41:37.85C#だとあまりメリットがない気がしますが・・・
0870デフォルトの名無しさん
2011/12/03(土) 16:43:59.00おとなしくC#やれ
0871デフォルトの名無しさん
2011/12/03(土) 17:15:22.84C#にしておけとしかいいようがない
0872デフォルトの名無しさん
2011/12/03(土) 17:36:22.12まずそれを伝えないと
0873デフォルトの名無しさん
2011/12/03(土) 18:26:14.400874デフォルトの名無しさん
2011/12/03(土) 18:30:12.060875デフォルトの名無しさん
2011/12/03(土) 18:37:21.183種類の呼び出し手順を混在させて利用するC++マネージ拡張のコード
3種類の呼び出しの結果は同じに見えるが、技術的にはまったく異なっている。
この3つが平然と共存しているソース・コードは、ある意味で驚きの対象といえるだろう。
これらが、いかに異なるテクノロジによって実現されているか、その詳細を知れば知るほど、驚きは大きいものになるのではないだろうか。
技術的な面白さという意味では、C++マネージ拡張はC#やVisual Basicをはるかにしのいでいるかもしれない。
http://www.atmarkit.co.jp/fdotnet/special/cppcli/cppcli_01.html
C++/CLIはネイティブに準ずる速度
http://xptn.dtiblog.com/blog-entry-113.html
0876デフォルトの名無しさん
2011/12/03(土) 18:40:20.94そうやって初心者だますのやめろよ本当に
0877デフォルトの名無しさん
2011/12/03(土) 18:45:38.310878デフォルトの名無しさん
2011/12/03(土) 19:08:08.31と思っていた時期が僕にもありましたが、
マイクロソフトの営業さんに、おすすめしません、と言われてしまった...
0879デフォルトの名無しさん
2011/12/03(土) 19:09:33.61C++って書いたら騙してるも一緒だろう
0880デフォルトの名無しさん
2011/12/03(土) 20:04:37.49VB.NETから移行したい理由は逆アセンブルでコードが可視化するのがいやなのと
処理速度が速いのと、なんとなくプロっぽいのでやってみたいなと・・・
0881デフォルトの名無しさん
2011/12/03(土) 20:24:08.38たぶん挫折するだろうが
0882デフォルトの名無しさん
2011/12/03(土) 20:34:00.020883デフォルトの名無しさん
2011/12/03(土) 23:24:29.970884デフォルトの名無しさん
2011/12/04(日) 01:44:04.16できるだけ簡単に作りたいです
そこまで本格的なものではなく、単純なものでいいなですが
何かアドバイスをお願いしまさ
0885デフォルトの名無しさん
2011/12/04(日) 01:45:28.440886デフォルトの名無しさん
2011/12/04(日) 01:46:36.35まずはデータベースの勉強をしましょう
0887デフォルトの名無しさん
2011/12/04(日) 03:15:47.87ええと、へんな話になると思うけど、まずはVB.netをやってみるのがいいと思うよ。
0888デフォルトの名無しさん
2011/12/04(日) 03:38:30.27しかし、一体なにから始めればいいのか.......
シミュレーション作成ならfortranの方がいいんですかね
0889デフォルトの名無しさん
2011/12/04(日) 03:38:40.10http://www.developerfusion.com/tools/
0891デフォルトの名無しさん
2011/12/04(日) 16:58:10.90っていうかenumを安全に変換できる整数型ってあります?
0892デフォルトの名無しさん
2011/12/04(日) 17:03:18.900893デフォルトの名無しさん
2011/12/04(日) 17:04:06.480894デフォルトの名無しさん
2011/12/04(日) 17:04:22.280895デフォルトの名無しさん
2011/12/04(日) 17:11:41.920896デフォルトの名無しさん
2011/12/04(日) 17:20:44.140897デフォルトの名無しさん
2011/12/04(日) 17:41:25.08C++11ではそのような甘えは許されない
0898デフォルトの名無しさん
2011/12/06(火) 13:53:37.31ま、いまさらどーでもいいけど
0899デフォルトの名無しさん
2011/12/06(火) 13:57:05.350900デフォルトの名無しさん
2011/12/06(火) 13:59:38.80C系列はそういう下らないことにこだわる言語なんだよ
0901デフォルトの名無しさん
2011/12/06(火) 14:08:49.600902デフォルトの名無しさん
2011/12/06(火) 18:44:14.45&(func);
はできるのに
struct hoge { void method(void); }
&(hoge::method);
はできないのはなんで?
0903デフォルトの名無しさん
2011/12/06(火) 18:52:20.370904デフォルトの名無しさん
2011/12/06(火) 19:01:00.93ttp://codepad.org/dsiHZnlu
0905デフォルトの名無しさん
2011/12/06(火) 19:06:56.46普通の関数はカッコを付けてもおkなのに
0906デフォルトの名無しさん
2011/12/06(火) 19:07:04.10へぇ。
delete hoge = new Hoge();
とか?
0907デフォルトの名無しさん
2011/12/06(火) 19:14:34.36(hoge::method)の時点で、staticメンバ関数呼び出しと解釈されて、演算子()が続いてないからエラーになるんじゃないかな?
0908デフォルトの名無しさん
2011/12/06(火) 21:22:36.68∧_∧
( ゚ω゚ ) delete hoge = new Hoge();
C□と)
/ |
(ノ ̄`J
∧_∧
( ゚ω゚ )
C□l丶l丶
/ ( ) やめて!
(ノ ̄と、 i
しーJ
0909デフォルトの名無しさん
2011/12/06(火) 21:36:34.28p += 4; //作業領域
...
delete p - 4;
みたいな。
この場合に限れば、単にp-=4の後にdeleteすれば同じだけど。
0910デフォルトの名無しさん
2011/12/07(水) 10:46:22.40/* main.h */
class Person{
public:
std::string person_name;
int age;
};
class Group{
public:
std::string group_name;
Person *person;
};
/* main.cpp */
void GroupInitialize(Group *g){
Group *g1=new Group[2];
g1[0].group_name="group1";
g1[1].group_name="group2";
Person p1[2]={"hoge1",20,"hoge2",21};
Person p2[2]={"hoge3",22,"hoge4",23};
g1[0].person=p1;
g1[1].person=p2;
*g=g1[0]; ++g; *g=g1[1];
}
int main(int argc, char *argv[]){
Group *g=new Group[2];
GroupInitialize(g);
std::cout << g[1].group_name <<std::endl; //問題ない
std::cout << g[1].person[0].age <<std::endl; //問題ない
std::cout << g[1].person[0].person_name <<std::endl; //エラー
}
0911デフォルトの名無しさん
2011/12/07(水) 10:57:55.760912デフォルトの名無しさん
2011/12/07(水) 11:04:49.690913デフォルトの名無しさん
2011/12/07(水) 12:36:27.19と質問しようとして、
10行目の書き方だと、フィールド部分もpublicできるのか?
と思って、試したらその通りで、
両方の書き方があるって、覚えるだけでいいですか?
本来の意味的な意味で。
0914デフォルトの名無しさん
2011/12/07(水) 13:05:52.110915デフォルトの名無しさん
2011/12/07(水) 15:16:15.27これをdeleteするには?
delete[] a;
delete a;
どっち?
0916デフォルトの名無しさん
2011/12/07(水) 15:18:15.060917デフォルトの名無しさん
2011/12/07(水) 15:28:30.09ありがとう
0918デフォルトの名無しさん
2011/12/07(水) 15:39:42.990919デフォルトの名無しさん
2011/12/07(水) 16:41:32.94え、いらないの!?
0920デフォルトの名無しさん
2011/12/07(水) 16:44:39.900921デフォルトの名無しさん
2011/12/07(水) 16:46:59.69std::vector<int> *p = new std::vector<int>();
delete p;
いらない。[]をつけるのは[]がついてるときだけ。
0922919
2011/12/07(水) 16:52:17.930923デフォルトの名無しさん
2011/12/07(水) 16:53:04.480924デフォルトの名無しさん
2011/12/07(水) 16:58:06.220925デフォルトの名無しさん
2011/12/07(水) 19:51:46.220926デフォルトの名無しさん
2011/12/07(水) 19:59:05.210927デフォルトの名無しさん
2011/12/07(水) 20:34:27.300928デフォルトの名無しさん
2011/12/07(水) 20:54:20.610929デフォルトの名無しさん
2011/12/07(水) 21:00:31.630930デフォルトの名無しさん
2011/12/07(水) 21:01:39.130931デフォルトの名無しさん
2011/12/07(水) 21:05:55.010932デフォルトの名無しさん
2011/12/07(水) 21:07:42.080933デフォルトの名無しさん
2011/12/07(水) 21:16:01.330934デフォルトの名無しさん
2011/12/07(水) 21:42:56.310935デフォルトの名無しさん
2011/12/07(水) 21:48:28.12シリアライズする予定のクラスには一部のライブラリは使えないということですね
0936デフォルトの名無しさん
2011/12/07(水) 22:32:34.610937デフォルトの名無しさん
2011/12/08(木) 20:21:18.00自動変数という項目は正しい値が出ているのにコンソールになると
「1837536996たす30193049は2147328000」となってしまいます
何が悪いかも分からず困っています
何が原因なんでしょうか?
#include <stdio.h>
int main()
{
int a, b, c;
a = 10;
b = 15;
c = a + b;
printf("%dたす%dは%dです\n"), a, b, c;
return 0;
}
0938デフォルトの名無しさん
2011/12/08(木) 20:22:54.990939デフォルトの名無しさん
2011/12/08(木) 20:25:51.09分かりました。ありがとうございます!
恥ずかしい・・・
0940デフォルトの名無しさん
2011/12/08(木) 20:27:05.77× printf("%dたす%dは%dです\n"), a, b, c;
○ printf("%dたす%dは%dです\n", a, b, c);
0941937
2011/12/08(木) 20:49:10.96ま、まあとにかく出来たのでよかったです
ありがとうございました!
0942デフォルトの名無しさん
2011/12/08(木) 20:59:00.851日無駄にしないように、警告レベルを上げておくとよいのだよ。
0943デフォルトの名無しさん
2011/12/08(木) 21:06:07.36gcc は printf のフォーマット文字列で要求した引数数と、実際に引数に渡してる数の差をチェックできるんだっけ?
VC は最近のは知らないけど、古いのではチェックできない(警告出せない)
0944デフォルトの名無しさん
2011/12/08(木) 21:08:01.230945デフォルトの名無しさん
2011/12/08(木) 21:15:37.73ほんとだ。てっきりclでもできるだろうと思い込んでたごめん
0946デフォルトの名無しさん
2011/12/08(木) 22:03:08.94libxml2というライブラリをつかうことにしました。
すると、iconvとzlibも必要だ、と配布サイトに書いていたので準備しました。
とりあえず、libxml2のヘッダにパスを通してビルドすると、libがないと言われたので、libにパスを通しました。
次は、iconvのヘッダがない、といわれていたので、パスを通しました。
するとビルドに成功して実行可能な状態になりました。
実行時には、libxml2.dll・iconv.dll・zlib1.dllがないと言われたので、パスを通しました。
すると動きました。
そこで疑問が起こりました。
zlibのヘッダ使ってないのに、どうして、zlib1.dllが必要と言い出すのでしょうか?
ご存知の方教えてください。
(libxml2.dllかiconv.dllがzlib1.dllをよこせといっている?)
0947デフォルトの名無しさん
2011/12/08(木) 22:29:10.25class Hoge{
public:
void foo(void){
std::cout << "foo" << std::endl;
this->piyo();
}
private:
void piyo(void){
std::cout << "piyo" << std::endl;
}
}
int main ()
{
Hoge hoge;
hoge.foo();
} // ttp://codepad.org/aKOWeYt4
この中の、「private:void piyo(void)」をユニットテストしたい場合は、どうすればよいのでしょうか?
言語的には出来なくて、IDEの機能を使ったりする感じなのでしょうか?
0948デフォルトの名無しさん
2011/12/08(木) 22:31:36.61friend void Test(void);
};
0949デフォルトの名無しさん
2011/12/08(木) 22:39:21.81他の人のWebページでの紹介の通りにやったので、出来て当然なのですが。
WindowsとLinuxとか他のOSとで、同じソースというのが不思議です。
徹底的に環境に依存しないコードで書いているということなのでしょうか?
APIを使う場合は、どうしても環境依存になってしまう気がします。
どうしても依存しそうなときには、各OS毎にプリプロセッサで変化させるような書き方をしていて、未対応OSでは失敗してしまう感じですか?
0950デフォルトの名無しさん
2011/12/08(木) 22:42:07.96OS差を吸収している。コンパイル可能な言語・OSでも全機能がおなじように使える訳でない。
どっかに公式の対応表がある。
0951デフォルトの名無しさん
2011/12/08(木) 22:42:16.960952デフォルトの名無しさん
2011/12/08(木) 22:54:32.46あってる
0953デフォルトの名無しさん
2011/12/08(木) 22:55:42.730954デフォルトの名無しさん
2011/12/08(木) 23:18:50.02お願いします。
*
**
***
****
*****
******
*******
********
*********
**********
0955デフォルトの名無しさん
2011/12/08(木) 23:22:19.09int main(void) {
puts("*\n**\n***\n****\n*****\n******\n*******\n********\n*********\n**********\n");
return 0;
}
0956デフォルトの名無しさん
2011/12/08(木) 23:23:52.960958デフォルトの名無しさん
2011/12/08(木) 23:40:04.49int main(void) {
if(1) {
puts("*\n**\n***\n****\n*****\n******\n*******\n********\n*********\n**********\n");
}
return 0;
}
0959デフォルトの名無しさん
2011/12/08(木) 23:41:40.500960デフォルトの名無しさん
2011/12/08(木) 23:54:36.24for (int i = 0; i < 10; ++i) {
for (int j = 0; j < 10; ++j) {
if (i >= j) putchar('*');
}
putchar('\n');
}
0961デフォルトの名無しさん
2011/12/08(木) 23:57:18.360962デフォルトの名無しさん
2011/12/09(金) 00:46:52.36int main()
{
int i, j;
for( j = i = 0; i < 10; j=++i) while( j ? putchar( '*') : puts( "*"), j--);
return 0;
}
0963デフォルトの名無しさん
2011/12/09(金) 03:56:17.72int main()
{
char s[]="**********";
int n=10;
while(n--)printf("%s¥n",&s[n]);
return 0;
}
0964デフォルトの名無しさん
2011/12/09(金) 04:02:16.91if (i > 0) printf("*");
if (i > 1) printf("*");
if (i > 2) printf("*");
if (i > 3) printf("*");
...
printf("*\n");
}
0965デフォルトの名無しさん
2011/12/09(金) 04:07:34.43int main()
{
char s[10]= {};
int i;
for(i=0; i<sizeof(s); i++) {
s[i]='*';
printf("%s¥n",s);
}
return 0;
}
0966デフォルトの名無しさん
2011/12/09(金) 04:16:06.09やはり最後に空行がつきます。なにか意図があるのでしょうか?
0967デフォルトの名無しさん
2011/12/09(金) 04:17:52.70> char s[10]= {};
これってどう定義されてたか覚えてないな。
未定義でいいのかな。
0968デフォルトの名無しさん
2011/12/09(金) 04:20:54.32clangとgccではワーニングだね。
clang version 1.5
: warning: data argument not used by format string
gcc version 4.2.1
:warning: ISO C forbids empty initializer braces
0969デフォルトの名無しさん
2011/12/09(金) 04:21:23.87puts
→ printf
0970デフォルトの名無しさん
2011/12/09(金) 04:24:09.54#include <stdio.h>
int
main()
{
char s[10] = {};
int i = 0;
while (1 - i / 10)
printf("%s¥n", s, s[i++] = '*');
return 0;
}
0971デフォルトの名無しさん
2011/12/09(金) 05:56:29.44int i=sizeof(s)-1;
do{puts(&s[--i]);}while(i);
0972デフォルトの名無しさん
2011/12/10(土) 09:37:44.61それとも、ずっと同じ領域を使用するんですか?
0973デフォルトの名無しさん
2011/12/10(土) 10:04:21.49おなじ領域。
0974デフォルトの名無しさん
2011/12/11(日) 03:33:53.33973に補足すると、規格上はどちらとも決まっていない。
VC++やGCCでは同じ領域になる。
わざわざ領域を確保し直す理由もないから、他のコンパイラでも同じだと思うけど。
0975デフォルトの名無しさん
2011/12/11(日) 04:45:05.34わざわざEBPやRBPをいじって新しく確保すると速度が落ちるだけだし
0976デフォルトの名無しさん
2011/12/11(日) 13:05:58.31rbp? 何それ?
0977デフォルトの名無しさん
2011/12/11(日) 19:07:37.19class定義のcppファイルの先頭に先祖代々のclassメンバ宣言ファイルがincludeされていた
・・・・どう思う? というか、どうすべき?
0978デフォルトの名無しさん
2011/12/11(日) 19:49:29.980979デフォルトの名無しさん
2011/12/11(日) 20:48:27.33子クラス.h
------------------------------
#include "親クラス.h"
class 子クラス : public 親クラス {
・・・
};
--------------------------------
子クラス.cpp
------------------------------
#include "子クラス.h"
・・・
-----------------------------
0980デフォルトの名無しさん
2011/12/11(日) 21:18:46.50例えば、ヘッダ内では前方宣言だけで済む場合は
インクルードすべきではない…コンパイル時間が爆発するからだ。
子クラス.h
class 親クラス; // 前方宣言で済むのでインクルードしない
子クラス.cpp
#inlcude "子クラス.h"
#include "親クラス.h" // 親クラスの実体サイズを知るためにインクルードが必要
えーっと、めんどいから参照しないけど、C++ Cording Standardsに書いてあったはず^^;
0981デフォルトの名無しさん
2011/12/11(日) 21:20:20.13前方宣言は無理だな。わはは。すまん。(´・ω・`)
0982デフォルトの名無しさん
2011/12/11(日) 22:31:28.00関連性の強いクラス郡を↓のような感じでincludeしてるんだが、
これもなんだか気持ち悪いか…?
まとめ用ヘッダ.h
#include クラスAとクラスBとクラスCで使うヘッダ
#include "クラスA.h"
#include "クラスB.h"
#include "クラスC.h"
クラスA.cpp
#include "まとめ用ヘッダ.h"
クラスB.cpp
#include "まとめ用ヘッダ.h"
クラスC.cpp
#include "まとめ用ヘッダ.h"
0983デフォルトの名無しさん
2011/12/11(日) 22:47:59.050984デフォルトの名無しさん
2011/12/11(日) 22:52:01.80(クラスA.cpp)
#include "クラスB.h"
#include "クラスC.h"
ってしちゃうな
0985デフォルトの名無しさん
2011/12/11(日) 23:07:34.030986デフォルトの名無しさん
2011/12/12(月) 01:48:58.99void func(x){
//xの内容を表示
}
int a[10];
string s[20];
func(a);
func(s);
の様にしたいのですが、c++では難しいのでしょうか?
0987デフォルトの名無しさん
2011/12/12(月) 01:58:25.700988デフォルトの名無しさん
2011/12/12(月) 02:00:54.74#include <iostream>
#include <boost/range.hpp>
template<typename Range>
void print( Range& r )
{
using namespace boost;
typename
range_const_iterator<Range>::type i = begin(r), e = end(r);
for(; i!=e; ++i)
std::cout << *i << std::endl;
}
int main()
{
int a[5] = { 1, 2, 3, 4, 5 };
std::string s[7] = { "a1", "a2", "a3", "b4", "b5", "b6", "c7" };
print(a);
print(s);
}
0989デフォルトの名無しさん
2011/12/12(月) 02:02:45.48void println(const T (&a)[N])
{
std::cout << "{";
std::copy(a, a + N - 1, std::ostream_iterator<T>(std::cout, ", "));
std::cout << a[N - 1] << "}" << std::endl;
}
0990デフォルトの名無しさん
2011/12/12(月) 07:58:39.780991デフォルトの名無しさん
2011/12/12(月) 11:36:59.640992デフォルトの名無しさん
2011/12/12(月) 12:12:41.63C++相談室
スレを勃てるまでもないC/C++の質問はここで
同じようなスレが多すぎる。
初心者はどこに書いたらいいのかわからないし
たいていの回答者はどのスレも見てる。
このスレは終了
0993デフォルトの名無しさん
2011/12/12(月) 12:31:18.970994デフォルトの名無しさん
2011/12/12(月) 12:50:54.370995デフォルトの名無しさん
2011/12/12(月) 15:10:32.53>>992のどれかに書き込んで、それぞれの専用スレに
誘導するという図式はどうか
環境依存OK。でも環境依存でないものも扱ってる。
だから他のスレと重複っぽい内容になってしまう。
環境依存専門だと、それぞれの専用スレに池ってことだ。
0996デフォルトの名無しさん
2011/12/12(月) 21:01:02.310997デフォルトの名無しさん
2011/12/12(月) 21:14:06.09unsigned char c;
unsigned int i;
c = 0xff;
i = c<<16;
printf("c: %x\n", (unsigned int)c);
printf("i: %x\n", i);
---------------------------------------
出力
c: ff
i: ff0000
---------------------------------------
・・・・・( ゚Д゚)ハァ?
素朴に考えたら、「i: 0」だと思うのですが、↑なんでなんでしょうか?
0998デフォルトの名無しさん
2011/12/12(月) 21:22:00.15【初心者歓迎】C/C++室 Ver.77【環境依存OK】
http://hibari.2ch.net/test/read.cgi/tech/1323692486/
0999デフォルトの名無しさん
2011/12/12(月) 21:23:55.88sizeof(unsigned int) が 2より大きい系だからじゃね?
1000デフォルトの名無しさん
2011/12/12(月) 21:43:20.4010011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
1002デフォルトの名無しさん
2011/12/13(火) 04:45:19.7010031001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。