【初心者歓迎】C/C++室 Ver.48【環境依存OK】
2get
3 :
デフォルトの名無しさん :2008/02/05(火) 01:51:09
C はもういいだろ
int *p; p=new int[3]; deleteせずに p=new int[4]; deleteせずに p=new int[2]; とした場合どうなりますか?
>>4 p は最後の new int[2] で確保された配列の先頭を指す。
前2つの new で確保された配列を破棄する手段はなくなっている。
>>5 ありがとうございます。領域の再利用も破棄もされないまま新たに確保されちゃうんですね
新たにnewするまえにdeleteを必ずつけるようにします
7 :
デフォルトの名無しさん :2008/02/05(火) 07:05:31
>>8 そうだよな! ネットの入門サイトにも載ってるよな!
10 :
デフォルトの名無しさん :2008/02/05(火) 09:58:32
vector<string> v; として、vを {"AAAAAA","BBBBBB","CCCCCC","DDDDDD","EEEEEE"}; という内容で初期化したいときは、push_back()とかで1つずつ代入するしかないですか?
>>10 イテレータを受け取るコンストラクタを使うといい。
コンストラクタと同じ引数で assign() というメンバ関数もあるから覚えとこう。
12 :
デフォルトの名無しさん :2008/02/05(火) 11:36:57
>11 ありがとうございます。 でもやり方がわかりませんでした。もう少し教えてください。 std::string a[] = {"AAAAA", "BBBBB", "CCCCC", "DDDDD"}; std::vector<std::string> v(a); これだと、コンパイルエラーになってしまいました。 invalid conversion from 'std::string*' to 'unsigned int' どう書けばよいですか?
>>12 イテレータを受け取るコンストラクタを使えってばよ。
14 :
デフォルトの名無しさん :2008/02/05(火) 12:20:42
>>13 イテレータを渡したいけど、どこにあるのかわかりません
>>14 配列要素へのポインタはイテレータとして使える。
16 :
デフォルトの名無しさん :2008/02/05(火) 12:34:21
>>15 ありがとうございます。
std::string a[] = {"AAAAA", "BBBBB", "CCCCC", "DDDDD"};
std::vector<std::string> v(&a[0], &a[3]);
で、できました!
それだと"DDDDD"は収容されないけどな。
18 :
売国まるはん :2008/02/05(火) 13:11:26
assign()のソースを出し渋ってる奴から使えと言われてもねー
20 :
デフォルトの名無しさん :2008/02/05(火) 15:11:24
はじめまして。今までCの学習用開発環境としてvmware上のFreeBSDでemacsを使ってきた者です。 何かと不便なのでwindows上で開発環境を整えようと思うのですが、何かお勧めのソフトはありますでしょうか?
このような構造体があるとして struct KOUZOUTAI{ std::vector<int> Array; int nNum; std::string str; }; KOUZOUTAI g_Kouzoutai; std::ofstream fout; fout.write( (char*)(&g_Kouzoutai), sizeof( g_Kouzoutai ) ); こんな風に構造体を書き込んでおきます。 このデータを次に読み込みたい場合、 KOUZOUTAI data; fin.read( (char*)(&data), sizeof( data ) ); こうやって読み込むと配列の部分が正常に読み込めません。 何かいい方法はありますか?
>>23 ありません。つーか、そもそもそれではvectorは書き込まれていない筈です。ご愁傷様。
std::vectorの中身をserialize/unserializeする関数を作成して、保存/読み込み時にその関数を経由させる。
動的配列はメモリが無条件に動的になるわけじゃなく、 動的配列を実現できるようなメンバ関数でアクセスするから動的配列たりうるわけで。 エレベーターのボタンを押さずに扉こじ開けてもエレベーターには乗れないでしょ?
その例えもどうかと思う。
ただの配列なら書き込めますか?
はい。
わかりました ありがとうございました
31 :
デフォルトの名無しさん :2008/02/05(火) 19:03:05
下記のコードはBCB6で通りません。 template<typename FunctionPtr> struct FunctionTraits; template<typename ResultType,class ClassT> struct FunctionTraits<ResultType (ClassT::*)(void)> { typedef ClassT ClassType; }; テンプレートの関数ポインタによる特殊化でメソッドのクラスを推測することは不可能なんでしょうか。
32 :
デフォルトの名無しさん :2008/02/05(火) 19:35:31
VCでは通ったが。
>>31 部分特殊化は VC6 あたりでも対応してなかったと思う。
コンパイラが対応してないのはありうると思う。
とりあえずBCB2007で通るか検証してみては
最近Cを勉強し始めたのですが、とりあえずチンチロリンでも 作ってみろというようなことをいわれました。 早速やってみようと思ったのですが、何から手をつけていいのか さっぱりです。何か良い書籍などあるでしょうか? チンチロリンのサンプルプログラムを見てみるのも勉強になると いわれたので、検索してみたのですがサンプルが無く困っています。 どうかよろしくお願いします。
本屋に行って何冊か立ち読みしてみるか、ぐぐればいいと思うよ
>チンチロリンのサンプルプログラムを見てみるのも勉強になると >いわれたので 簡単にそんなものが見つかるのが前提のアドバイスにワロタw でも、そういう簡単なゲームを作るのはいい練習になると思うよ。 とりあえず、今勉強に使ってる本かサイトか知らんが その知識だけで自分で作ってみるといいよ。 多分いろいろと汚いプログラムになりはするとは思うけど、 そうやって作ってみた後にサンプルなり本なりを読むと、 どこがマズかったのかってのがよく分かっていいと思うぜ。
>>36 今は、手元にある入門書とぐぐって何とかやってる状態です。
何冊か立ち読みして、よさそうなのをもう1冊買ってみようかと
思います。ありがとうございます。
>>37 簡単に見つかるものじゃないんですね・・。
なんとか形にしてみてから調べてみることにします。
ありがとうございます。
VC9ですけど、 std::exceptionにうにこーど入れると文字が壊れますか?
やっぱりそうですか。
UTF-8なら入れられると思う。そこまでする必要があるかは別として。
43 :
デフォルトの名無しさん :2008/02/06(水) 05:39:37
コンソールアプリケーションで、ユーザにインプットをもらって処理をするコードがあります。 その時、 int a; cin >> a; として、入力が数字ではなかったとき、変数aにはなにも代入されず、 ユーザが行った入力はどこかのバッファに溜まってる のでしょうか。その次の入力から動作がおかしくなります。 あと、もし上記が正しいとすると、ユーザからの入力を受け取る処理は、 とりあえずstringで受けるべきなのでしょうか?
>>43 intには数字しか読込めない。今の場合、何も読込まれずに
cinにはfailbitが立つ。cin.clear()か何かでgoodbit立てない
限り次の読み込みは出来ない。stringにすべきかどうかは何を
読み込むかによる。
45 :
デフォルトの名無しさん :2008/02/06(水) 11:34:06
>>44 ありがとうございます。自分でも調べてみたのですが、
int a;
cin >> a;
入力データを使って処理する
cin.clear();
cin.ignore(numeric_limits<int>::max(),'\n');
とするとcinが元の状態に戻りました。
ここで、clear()はgoodbitを立てるものだとして、
ignore()は指定文字数分か指定した文字(上記だと'\n')が出るまで
入力値をバッファから消す、という処理ですよね。
cinの入力ってこう書かないとだめなのでしょうか?
(結構面倒かも、と思った)
Win32APIなんですがnewで確保した領域をWM_DESTROY:がきたときにdeleteしたら コンパイル時はエラーでないけど、実行してnewで確保した後プログラムを終了 (WM_DESTROYが送られる)したらエラーがでるんですが、何故ですか? WM_CLOSEでならdeleteしてもエラーでないんで問題は無いんですが興味本位で
>>45 入力フォーマットの仕様がどうなってるのかわからないから
なんとも言えないな。任意の値が入力されるならgetlineで
一行読込んでstring解析したほうがいいかも。
49 :
デフォルトの名無しさん :2008/02/06(水) 14:18:30
doubleをcoutを使って出力するときに、かならず小数点以下2桁までを 出力するようにしたいのですが、どうすればよいですか? double amount = 3.33333; cout << amount; => 3.33 どうかお願いします。
50 :
デフォルトの名無しさん :2008/02/06(水) 14:27:18
今までソフトのバイナリいじったりして満足してたんですが これからCを始めようと思ってます。 (とりあえず、Cが基本だからやっとけ!と、どこかで見たので) その際、アルゴリズムを先に学んだ方がいいですか? 周りに技術者がいないので、ネットで勉強する形になりますが・・。
>>50 すみません
書き込む場所間違えました・・。
吊って来るんで許してください
52 :
デフォルトの名無しさん :2008/02/06(水) 14:47:22
49です。 ios::rightとかその他諸々を使って出来たみたいだったのですが、 次回必要になった時に絶対わすれてそうだったので、sprintf()を使ってやりました。 失礼しました。
53 :
デフォルトの名無しさん :2008/02/06(水) 14:48:25
stringは、値渡しですか
値渡しでも参照渡しでもポインタ渡しでもお好きな方法をどうぞ
55 :
デフォルトの名無しさん :2008/02/06(水) 14:54:21
コンパイラに任せたときは値渡しですか
56 :
デフォルトの名無しさん :2008/02/06(水) 14:57:04
文字列 は参照ですが、stringもそうなりますか
>>49 <iomanip>ヘッダ
setprecisionマニピュレータを使う。
double amount = 3.33333;
streamsize oldprec = cout.precision();
cout << setprecision(3) << amount << setprecision(oldprec) << endl;
しかし1の位が0だと小数点以下が3ケタになってしまいます #include <iostream> #include <iomanip> int main() { using namespace std; double amount=3.33333; double aaa=0.3333; streamsize oldprec = cout.precision(); cout << setprecision(3) << amount << ' ' << aaa << setprecision(oldprec) << endl; } $ bjam precision-run 3.33 0.333 EXIT STATUS: 0 こういう場合は文字列処理に持っていくしかないですかねぇ?
>>55 コンパイラは自動的にプログラムを書いたりはしてくれませんので、コンパイラに任せるなどということはできません
コンパイラは あなた が書いた通りに動きます
>>56 文字列(=文字の配列)への参照っていうと、こういうのでしょうか
void foo(const char(&s)[6]) {
printf("%s\n", s);
}
int main() {
foo("Hello");
}
あんまりやらないと思いますが
60 :
58 :2008/02/06(水) 15:40:26
#include <iostream> #include <sstream> #include <cassert> using namespace std; string foo (double n) { ostringstream os; string s; os << n; assert(os.str().size() >= 4); s = os.str(); string::size_type b=0, e=0; b = s.find('.'); e = b+3; --b; return s.substr(b, e); } int main() { double amount=3.33333, aaa=0.3333; cout << foo(amount) << ' ' << foo(aaa) << endl; } $ bjam 3.33 0.33 よくわからないので適当にsstreamで
>>58 cout.setf(ios::fixed, ios::floatfield); をcout前に追加
setprecision(3) → setprecision(2)
普通小さくするのがぬ゛うんキャストじゃないの?
64 :
デフォルトの名無しさん :2008/02/06(水) 18:59:44
MacOSXとGLUTの組み合わせで◯◯.appというディレクトリを作って 起動させると、はじめカレントディレクトリは ルートディレクトリになってるんですけど glutInit()を通過すると、◯◯.app/Contents/Resourcesが カレントディレクトリになってんですよ なんでこんな妙なところに行っちゃうんですかね ちなみに◯◯.appの中身は以下の通りです ◯◯.app/Contents/Info.plist <--謎 ◯◯.app/Contents/MacOS/○○.exe <--実際に動くc++コード ◯◯.app/Contents/Resources/icon.icns <--アイコンの絵
D3DPRESENT_PARAMETERS d3dpp; ::ZeroMemory(&d3dpp, sizeof(d3dpp)); と D3DPRESENT_PARAMETERS d3dpp = {0}; はちがいますか?
詰め物
>>64 そこがアプリケーションのリソースを置く場所だから、
親切に(あるいは余計なお世話か)移動してくれてるんじゃないかな
68 :
デフォルトの名無しさん :2008/02/06(水) 20:39:50
>>67 なるほど
Glutで何かしているのではなく
◯◯.exeに引数で渡してるんですね。
そんな気がしてきました。
ちょっとチェックしてみます。
>>48 NULLポインタdeleteって問題ないんじゃないの?
>>69 二重解放つったら解放したアドレスをもっかい解放のことだろ?
deleteしただけで、0(NULL)になってるとは限らないんじゃないの?
とりあえず gcc だとなってないな
73 :
デフォルトの名無しさん :2008/02/06(水) 23:35:43
質問です。g++を使っています。O2 で最適化してます。 クラスの中で定義した関数は勝手に inline となるのでしょうか? inline をつけても意味は無いのでしょうか?
deleteした後自分で0をポインタに代入するというTipsがある位だからな
>>73 inline指定してるのと同じになる。
実際にinline化されてるかはコンパイラ次第。
ありがとう。何か勘違いしてたみたい deleteした後nullになるわけじゃないのね WM_DESTROYが来た時点ではOSかが自動的にdeleteしちゃってるから多重解放 でエラーでかうのかな
OSは自動的にdeleteなんてしません
libhoge.so をスタティックリンクすることってできるんでしょうか?
はい。それがスタティックリンクできるようなアーカイブやオブジェクトモジュールであれば。
>>77 じゃあ何でエラーでるの?
newしたまま終了してしまっても最悪OSがエラー処理として解放してくれるって聞いたけど
>>80 エラーが出る事と自動的にdeleteする事を同列に考えるなよ
そもそもソース出してないのに的確な答えが出せると思える?
つーか自分で考えて答え出すか出たんなら帰れよ、必要最低限のレスは付いたんだから
的確な答じゃないなら断言口調で書くなよ、紛らわしい。
>>81 その考えをおまえが否定したから聞いてきてるんだろ
84 :
デフォルトの名無しさん :2008/02/07(木) 06:42:38
vector って大きさが可変のはずですが、vectorの配列のポインタ操作ってうまくいくのでしょうか? たとえば以下のように double の vector の配列を作ったとします。 std::vector<double> a[3][4]; この vector 配列の要素ごとに違う回数だけ push_back() で値を入れたとします。 そして vector のポインターを引数にとる以下の関数があり void hogehoge (std::vector<double>* arg ){ for(std::vector<double>::const_iterator it=arg[0].begin(); it!=arg[0].end(); it++){ std::cout<<"arg[1] " } } その引数に a[1] を以下のように入れた場合は hogehoge(a[1]); arg[0]というのは a[1][0] をちゃんとさしてくれるのでしょうか?
否定したんじゃなくて、ありがちなパターンに陥っていそうだから指摘しただけだろ。
>>80 newしたまま終了って、main/WinMain すら終了した後の話だぜ
88 :
84 :2008/02/07(木) 07:20:43
>>86 ありがとう!
ってことは sizeof(vector<double> は要素の数にかかわらず値は変わらないって事か。
不思議。
>>88 意味が分からん。
ポインタに [0] をつけたら
そのアドレスにあるオブジェクトを指す。
極めてシンプルな答え。
90 :
84 :2008/02/07(木) 07:30:44
メモリを動的に作ってるからコンテナの要素が増えてもポインタは同じ所にあるって事か
vectorの中身はnewで確保したメモリへのポインタ(と管理情報)だからな
いいえ。
94 :
デフォルトの名無しさん :2008/02/07(木) 09:42:52
vectorの中の要素をソートしたいのですが、そのとき、自分で定義した関数によって ソートしたいです。どうすればよいですか?
vectorは連続領域に格納される(配列と同じように扱える)から普通にソートしたらいい。
スタティックリンクとかシャードリンクとかそのあたりのことが勉強できるサイトありませんでしょうか?
98 :
デフォルトの名無しさん :2008/02/07(木) 14:26:10
>>96 sort(vec.begin(), vec.end(), func);
と書きたい時、funcはどういう風に書けばよいでしょうか?
class func : public binary_function
{
bool operator()(const string &a, const string &b){}
};
と書いてみたのですが、コンパイルも通りません。
どうかお願いします。
binary_functionでぐぐれ
>>98 厳密に言うとstrict weak orderingを満たすように書く
ことになるが、
struct func : public binary_function
{
bool operator()(const string &a, const string &b) {
return a < b; //辞書順で昇順
}
};
sort( vec.begin(), vec.end(), func() );
とかでどう?
質問です。
VC6.0で自前のライブラリをまとめたStatic Link Libraryを作っています。
そのライブラリを実際に他のプロジェクトで使う際、リンクのところで以下のように躓きました。
・すでに LIBCMTD.lib(crt0dat.obj) で定義されています
これを筆頭に、大量にリンク警告がでました。
調べたところ
ttp://m--takahashi.com/bbs/pastlog/08900/08806.html libの方はシングルスレッドで。テストプロジェクトのほうはマルチスレッドでコンパイルしているのが問題のようでした。
両方マルチスレッドにしたところ…
・"libcmt.lib" は他のライブラリの使用と競合しています
今度はこれだけでました。
調べたところ
ttp://m--takahashi.com/bbs/pastlog/03900/03888.html libがReleaseコンパイルで、テストプロジェクトがDebugコンパイルなのが悪いようでした。
libをRelease版とDebug版の両方をつくり、適切にリンクするようにしたところ、エラーがきえました。
ここで疑問なのですが、今後の汎用性を考えるとlibは
・シングルスレッドDebug版
・シングルスレッドRelease版
・マルチスレッドDebug版
・マルチスレッドRelease版
をそれぞれ用意しておかなければならないのでしょうか?
一般的に用意されている"winmm.lib"などは、何も考えずにstdafx.hに
#pragma comment(lib, "winmm.lib")
と書いておけば、シングルスレッドだろうがマルチスレッドだろうが、DebugだろうがReleaseだろうが適切にリンクされました(警告やエラーでません)
自作のlibも同じくらい気軽に使えるようにするには、どのようにしたら良いのでしょうか?
おっと、
>>99 を見て
struct func : public binary_function<string, string, bool>
{
bool operator()(const string &a, const string &b) {
return a < b; //辞書順で昇順
}
};
か。
const が有った方がいいな。
104 :
デフォルトの名無しさん :2008/02/07(木) 14:39:36
ハードディスクへの書き込みで、メモリへのキャッシュを自動で行ってくれる命令ありますか
おっと、
>>103 を見て
struct func : public binary_function<string, string, bool>
{
bool operator()(const string &a, const string &b) const {
return a < b; //辞書順で昇順
}
};
か。おれはconstをよく忘れる。
>>101 ・Debug版は公開しちゃいけません
・現行VCはシングルスレッド版ランタイムがありません
>>104 そんな「命令」なんてあるもんですか。
>>106 MFC等のデバッグ版DLLの再配布が禁止なだけで
自前ライブラリのデバッグ版配布は禁止じゃねえだろ。
108 :
デフォルトの名無しさん :2008/02/07(木) 15:05:41
>>106 101です
お返事ありがとうございます。
>・Debug版は公開しちゃいけません
確かにそもそもDebug版は用意しておく必要ないですよね
ただ、d3d9.lib も、デバッグ版らしき d3d9d.libというものがあります。
もしかして「Debug/Releaseで自動的にリンクを変えている」なんていうのは私の妄想で
d3d9d.libは使われていないのでしょうか?
>・現行VCはシングルスレッド版ランタイムがありません
これはつまり、世の中に配布されてるlibはマルチスレッド版で作られており、
マルチスレッド版libは、シングルスレッドなプロジェクトで利用しても特に問題が起きないということでしょうか?
(実際試してみたところ、シングルプロジェクトからマルチLibを呼び出してもエラーとなりませんでした)
そもそも「_beginthreadを使うためにはマルチスレッド版にする必要がある」という認識しかもっておらず、
「マルチスレッド版にしないことによる利点」は知らないのです
>>109 まず、デバッグ版のlibがあるやつはpragmaで切り替えてるはず。
自分の作ったlibが物によって変わるのは、そいつの中でデバッグ版や
MT版のlibを呼んでるから。
そういうの避けたければスタティックリンクしてしまうといいかも。
>>109 です
>(実際試してみたところ、シングルプロジェクトからマルチLibを呼び出してもエラーとなりませんでした)
これですが、勘違いでした。
やはり「マルチスレッド版のlibファイル」を「シングルスレッド版のプロジェクト」からリンクすると、
LINK : warning LNK4098: defaultlib "LIBCMTD" は他のライブラリの使用と競合しています; /NODEFAULTLIB:library を使用してください
となってしまいました。
(上のは、Debugマルチ版LibをDebugシングル版のプロジェクトにリンクした場合の警告です)
>>110 なるほど。hファイルあたりで、#ifdef _DEBUG やら色々としているのでしょうか。
>そういうの避けたければスタティックリンクしてしまうといいかも。
ちょっとこの意味合いがわからないのですが、詳しく教えていただけますでしょうか
どこかのサイトへのリンクでも構いません
112 :
デフォルトの名無しさん :2008/02/07(木) 16:26:09
教えてください。 以下の式で、shinが偽になるのはなぜでしょうか? unsigned int a =10, b = 20; char shin = ((a - b) < (b - a)); (a - b) = -10, (b - a) = 10 なので、shin = 真になるように思うのですが。。。
unsigned同士の演算の結果はunsigned
int型変数(-32768〜32767)に-40000とか入れようとしたらどうなると思う?
115 :
デフォルトの名無しさん :2008/02/07(木) 16:32:16
ありがとうございます
>>101 コンパイラオプション/ZlってVC6にない?
これはobjファイルにLIBCMTD.LIBとかCRTへの参照を
埋め込まないようにするコンパイラオプション。
1つのlibで全てを賄えるようにもなる。
けど現実的には最適化・デバッグオプションの有無で、
少なくともRelease/Debugの2種用意すべきだと思うけど。
>116 Zlオプションを使ったところ、DebugプロジェクトからReleaseLibを使っても警告がでなくなりました。 ありがとうございます。 (最初 Zl が ゼット・アイだと思って混乱しましたw ゼット・エルですね) しかし、StaticLibraryの作り方を詳しく解説しているサイトって全然見当たりませんね…。 Lib側としては、Releaseだけ用意しておけばいいと思うのですがどうでしょうか? Libがバグっていないと仮定して利用するのが前提ですけど
>>101 winmm.libってwinmm.dllの単なるインポートライブラリでは?
VCのランタイムをリンクしないライブラリならそういった問題は当然起きない
別にReleaseだけでもいいと思う。 DLLだとデバッグ版も提供なんて話聞かないし。
>>118 あ、なるほど。そういえばlibにはもうひとつ「DLLとリンクするためのインポートライブラリ」という役目がありましたね。
winmmはそっちですか。
(拡張子変えればいいのになぁ…)
>>119 了解しました。
>ALL
大変参考になりました。
ありがとうございました!
デバッグ版のlibを提供するのはlibをデバッグしてもらおうということじゃなくて、 それを使ったプログラムもLibのソースをトレースできるようにだよw
>121 誰への返事だ??
環境依存のレスはすべてスルーしてます
スレタイももちろんスルーです
template<typename T> void foo() { T x = T(); } intやint*などの基本型に対してテンプレートでのデフォルト初期化 を可能にするために上のような表記が許されておりint*ポインタも渡せます。 (NULLポインタに初期化されている) しかし、以下のポインタの初期化は許されていないのでしょうか? int* p = int*(); //コンパイルNGでした int i = int(); //OK
126 :
デフォルトの名無しさん :2008/02/07(木) 18:05:37
ISO 9660ファイルを参照できるDLLとかありませんか
>>125 それはできないけど、これならできる。
typedef int* pint;
template<typename T>
struct identity
{
typedef T type;
};
int* p1 = pint();
int* p2 = identity<int*>::type();
メモリが解放されてるかどうか確認する方法ってなんかあるかな? void a( void* p ) { if( rand() %2 ) delete p; } void main () { char*pc = new char[100]; a(pc); // pcが解放されてなかったら解放 if( soreppoino( pc ) ) delete pc; } みたいな。
すまん誤爆った・・・ってここでもいいのかなこれ
>>127 typedefで可能ということは単なるシンタックスの問題だという
ことですかね。だとしてもfoo<int*>()は結果的に
int*()となるからNGのような気もしますがね。
131 :
デフォルトの名無しさん :2008/02/07(木) 19:31:29
リスト管理の時 リストのアイテムをdeleteしたとき、自動的に所属するリストからはずれる機能は、 stlでvectorとかlistとか使って所属リストを覚えて、リストからはずすより、 前後のポインタを持った、自己連結クラスのほうが速度的に早いですか? というか、deleteしたとき、自動的に所属するリストから外れるtemplateみたいなもの STLみたいな標準ライブラリにありますか?
>>130 単純にシンタックスの問題っぽいよ
>postfix-expression:
> simple-type-specifier ( expression-listopt )
(略)
>simple-type-specifier:
> ::opt nested-name-specifieropt type-name
> ::opt nested-name-specifier template template-id
> char
> wchar_t
> bool
> short
> int
(略)
>type-name:
> class-name
> enum-name
> typedef-name
>class-name:
> identifier
> template-id
intやクラス名やtypedef名はOKだけどint*は構文に合致しないっていう・・
>>128 そういうクラスでも用意しない限り、ありません。
つーか、そんな阿呆なメモリ管理戦略はありえません。
>>131 逆に、リストにあるオブジェクトをremoveするときにdeleteしては?
1904年の日露戦争の際に、ロシア正教会は全教会をあげて日本に天罰を 下すように神に祈りをささげた。結局なにも天罰は降りず、ロシアは負けた。 20年後、日本で関東大震災が発生。ロシアの物理学者カピッツァはこの事実から 「神はわれわれから9光年以内にいる」と結論を下したという。
お、おかしいアル・・・ /'⌒`ヽ、 5年後の世界に行ったらチューゴクがなかったアル・・・ ヽ、┗ ノ `ーー' γ⌒`ヽ /'⌒⌒ヽ、 ,-ーー-、 .|| ̄ ̄ ( ┃ ⌒ヽ / ┃ ) || ∧_∧ \ ━┛ ) .(. ┃ ) ||. ( `ハ´;) ヽ、__,ノ || _(つ¶¶と)__ /||'''''| 三 | |'(⌒) / '―――――`  ̄ \ `============'
>>132 なるほど。まあテンプレートのときのために用意されてる
規則なので、そのときだけ利用します。
ありがとうございました。
ところで、みなさんは原文の規格を持ってるんですか?
買うと4万近かったので高くてとても買えません。
JISならオンラインで読めるじゃん。画像だけど。
Visual C++ 6.0を使っているんですけど C++のプログラムを実行すると c:\program files\microsoft visual studio\vc98\include\new(16) : error C2143: 構文エラー : ';' が '<class-head>' の前に必要です。 c:\program files\microsoft visual studio\vc98\include\new(16) : error C2501: '_STD_BEGIN' : 識別名を宣言するのに、型が指定されていません。 c:\program files\microsoft visual studio\vc98\include\new(16) : fatal error C1004: 予期せぬ EOF が検出されました。 と出てしまいます。 どんなプログラムでもこのエラーが出てしまい実行できません… どのようにすればこのエラーはなくなりますか?
>>137 そこでドラフトですよ。
若干現規格と違うけど、
古いドラフトだとまあまあ現規格に近いから十分参考にはなる。
>>138 必要なものが入ってないか入れる設定にしていない。
_STD_BEGINってのはSTLが使う宣言だからSTLが使えないんだろう。
(vectorでも使ってるんかね?)
俺はSTL使ってないんで後はぐーぐる先生か他の人にまかすわ
>>137 >>139 あれ検索できないから不便ですよね。まあ無料なのでたまに見ますが。
正式版を無料で配布して欲しいですね。
>>138 Visual C++ 2008 Expressとかだとどうなる?
143 :
デフォルトの名無しさん :2008/02/07(木) 22:50:19
>>105 (遅くなりましたが)
ありがとうございました。
>>128 標準では用意されていないので、人によっては解放したらその領域を指
していたポインタ変数を (* 自分で *) NULL にしておくようにしてい
る人もいる。
どっちかって言うと、バグってた時の二重解放除けとか、変な領域を壊さ
ないようにと言う防御策だが。
void a( void** p ) {
if( rand() %2 ) delete *p;
}
void main () {
char*pc = new char[100];
a(&pc);
// pcが解放されてなかったら解放
if( soreppoino( pc ) ) delete pc;
}
145 :
デフォルトの名無しさん :2008/02/08(金) 01:48:10
確保していないのにdeleteするとバグるんですが対処法ありますか
146 :
デフォルトの名無しさん :2008/02/08(金) 01:50:44
単独ではつかわないでコンストラクタ、デストラクタ内で使えば安全かなあ
void a( void** p ) { if( rand() %2 ){ delete *p; *p = NULL; // delete後はNULLを入れておく } } void main () { char*pc = NULL; // ポインタは普通NULLで初期化しておく if( rand() %2 ) new char[100]; a(&pc); delete pc; // pcがNULLなら何もしない }
148 :
デフォルトの名無しさん :2008/02/08(金) 01:59:41
while (cin) { ... } という処理についてなんですが、cinって最初はとりあえずtrueになるのですか? すると、いつfalseになるんですか? エラーフラグがたってればfalse、それ以外はtrueになるのかな? cinで何かデータを読み込んだ後だけtrueになるのかと思ってました。
> new char[100]; pc = new char[100] でした。
スタート ↓ 標準入力からデータがcinに行く ↓ cinがtrueになる ↓ while(cin)が評価される というかんじなんじゃね?
>>147 C++では汎用ポインタへのポインタって合法だったっけ。
問題ない。
153 :
デフォルトの名無しさん :2008/02/08(金) 03:55:20
coutとfstream(適当なファイルに対してオープン済みのもの)とのそれぞれに、ほぼ同じ処理を書くのですが、 1つの関数にまとめたいと思うのですが、どうすればいいでしょうか? void print((型が分からない) stream) { stream << "hogehoge" << endl; ... } こんなのも考えてみたのですが、コンパイルできず、ダメでした。 template<class T> void print(char *filename) { T outStream; if (filename) outStream.open(filename); outStream << "hogehoge" << endl; ... } どうかよろしくお願いします。
>>138 new ヘッダをインクルードする前に
new をマクロで置き換えてないか?
サクラエディタのソースコードを眺めていたのですが、コメント部でよくわからない表記があります。 @param などはなんとなく想像がつくのですが、「//!<」や「/*! */」は何を意図しているのでしょうか。 どなたか教えてください。
まさに、それですね。 ありがとうございました。
例外処理の使い方がいまいち分かりません 例外を投げたらその処理の中で解決した方が良いのか それとも解決方法を使う側に投げっぱなしにしてしまうのか 例外をどういう形でthrowするのがいいのか なんというか感覚的に掴みにくいというかなんというか
無用物
参照を返すとオブジェクトが捨てられたときに 帰ってきたものも向こうに?
>>159 自関数の中でリカバリできるならcatchして処理すればよい
そうでないなら呼び出し元にまかせる
普通のエラー処理と同じようなもんだ
自分で処理できるならして、処理できないなら呼び出し元にエラーコードなりなんなりをreturnするだろう
エラーコードのreturnが例外のthrowに変わるだけ
>>162 そういう感じで良いんですか
気軽に使えるなら使ってみようかな・・・
とある3種類の計測器をモニターするプログラムなんですが 似てるけど若干ちがう命令が3つあるとします この場合 クラス分けをしていくとき 計器の共通化持つクラスを基底として、それぞれの機能をもつ派生クラスを作るか 機能の共通処理をもつクラスを基底として、それぞれの計器にあわせて派生クラスを作るか どちらが今後計器が増える可能性を加味したとき、よい設計でしょうか
>>165 その計測器メーカに合わせるのが一番。
あるメーカは旧型機種の機能を改変しつつ新機能を作るかもしれないし、
あるメーカは旧型機種の機能を残しつつ新機能を作るかもしれない。
なんてことは兎も角、使い易いように作れば?
167 :
138 :2008/02/08(金) 15:05:04
返信遅くなってすいません!
>>140 STLは使ってなくてもこのエラーなんですよ…
Hello Worldみたいな文字を出力するだけのプログラムでも
実行できないです。
>>142 Visual C++ 2008 Express Editionで実行したらできました!
ありがとうございます。
>>154 マクロも使ってないので違うと思うのですが…
Visual C++ 6.0を使い慣れているので
どうにかして実行させたいのですが・・・
class Fruit; class Apple : Fruit; std::vector<Fruit> fruits;を作ると 抽象クラスをインスタンス化できません。 と言われるです。どうするですか?
Fruit がそういうつくりになってるんじゃないの?
>>168 class Fruitを具体化してください。
std::vector<Fruit*> fruits;
コンパイラにBCCを使って数値計算をしているのですが、 しばらくプログラム実行していると、EXP: OVERFLOW ERRORと出ます。 これは、exp関数に入れた値がexp関数の扱える値(doubleの範囲)よりも大きいと言うことでしょうか?
173 :
デフォルトの名無しさん :2008/02/08(金) 16:23:52
vevtorにvcの_com_ptrは入りますか?
コピー初期化もコピー代入もできるから問題ないはず。
すいませんちょっとお聞きしたいんですが、 #include <iostream> using namespace std; int main(){ char ss[80] = "これは文字列です"; cout << ss[0] << ss[1]; return 0; } ってやって、coutで「こ」って表示されないのは、どういう理屈でしょうか??
UTF-8 なら3バイト必要だが、そういうわけではなくて?
>>176 ひょっとしてなんか変な文字がでたりしてるか?
179 :
176 :2008/02/08(金) 22:34:23
ぐは、そうだったんですね・・2バイトでいいんだと思ってました汗 cout << ss[0] << ss[1] << ss[2]; とやったらちゃんと表示されました。 ありがとうございましたm(_ _)m
ちなみにWindows上だと
>>176 のコードで「こ」はちゃんと出た。(bcc32 / gcc@cygwin)
それはお前がソースをSJISで書いてるだけ
UTF-8 だと全て3バイトって訳じゃないのが面倒なところだよな。
他で聞いてきます
fatal error LNK1104:コンパイラは、ファイルd3d9.libを開けません とでてしまいビルドできません 手動でリンカにd3d9.libを設定しましたが無理でした どうすればよいのか
ファイルはあるの?
pathの設定はしたか?
More Exceptional C++が届いたんだが いきなり最初のコードがコンパイルできねえ 一気にやる気失くした。やっぱ古い本はこんな もんかねえ。
ちなみにコレ VC++2008 g++ 4.0 でも不可 #include <iostream> #include <fstream> using namespace std; int main(int argc, char* argv[]) { (argc > 2 ? ofstream(argv[2], ios::out | ios::binary) : cout) << (argc > 1 ? ifstream(argv[1], ios::in | ios::binary) : cin ) .rdbuf(); return 0; }
全く問題ないけど。まさかとは思うが、>190って2バイト空白入れたままで悪態ついているお馬鹿さん?
コンパイルできないときはエラーメッセージを書こう なんてのは宿題スレでも徹底されてるような気がする。
gcc 4 で通らないな。 まあ当たり前だな。 右辺値の ofstream と左辺値の ostream(cout) だと 片方が右辺値なので右辺値にキャストして型を揃えようとするが、 この2つじゃどうやっても型を揃えられない。
VC だと右辺値の ofstream を テンポラリオブジェクトを作成して ofstream& にキャストしてしまえるから(拡張機能) コンパイル通るかもしれん。
たぶん、ここでしか聞けないのかなと思い書き込みさせてください! File1.cppで定義・使用している複数配列 double a[10][5] を他の ファイル(File2.cpp)でも共有して使用したいときって (File2.cpp) void CGridDlg::OnGdraw() //中で使用したい関数です { extern double a[10][5]; ・・・・・・・・ } と定義すれば使用できるものなのでしょうか。単配列(a[10]等)の時は同様の 方法で使用できたのですが。複数配列になると上記ではリンクエラー (LNK2001)がでてしまいます。環境はVC6++(MFCダイヤログベース)です。 超初心者です。Cの本を見てポインタなり、externなりが関係しそうかなと思った のですが、なかなかいい兆しが見えなくて助けを借りたい次第です。
>>191 ここに見やすく貼るために全角にしてるんよ
>>192 VC++2008でのエラーメッセージだがprivateメンバーにアクセスしようとしてる
らしい。
error C2248: 'std::basic_ios<_Elem,_Traits>::basic_ios' : private メンバ
(クラス 'std::basic_ios<_Elem,_Traits>' で宣言されている) にアクセスで
きません。
>>193 ostream(cout)の意味が分からないんですが。3項演算子 A ? B : C
のBがrvalueでCがlvalueだからC(ここではcout)を右辺値にしようと
するということかな?
>>194 昔の規格なりコンパイラではOKだったのかもしれんです。
空白orタブ <-> /**/ の置換スクリプトを希望
>>197 >昔の規格なりコンパイラではOKだったのかもしれんです。
>>196 左辺値の ostream の値である cout って意味ね。
エラーの理由はそれで問題ない。
>>195 externで共有させるのはお勧めしない。
他の関数で配列を参照させるためには、ポインタを渡せばよい。
関数内のローカル変数へのポインタは、その関数実行中にしか有効にならないから、一時的にしか参照・共有できない。
>>195 CGridDlg の private メンバ変数にして、
a の取得関数を用意すれ。
class CGridDlg {
public:
typedef double Hoge[5];
Hoge* GetA() { return m_a; }
const Hoge* GetA() const { return m_a; }
private:
Hoge m_a[10];
};
Hoge* a = grid_dlg.GetA();
a[0][0] = 1;
猫でもわかるを買ったんですが、 超初心者の俺にはさっぱりわかりません。 何かわかりやすい本などあったら教えてください。お願いします。
>>203 ちなみにC言語です。よろしくお願いします。
>>203 その本で分かりにくいとかじゃなくて
さっぱり分からないというのであれば無理です、あきらめてください
それより多少分かりやすいと評判のものもありますが、大差はありません
それとも環境が用意できないとかそういうことですか?
>>203 その本は読んだ事はないが、サンプルをぽちぽち手で入力して実行してみなされ。
手で入力して試すのが肝心。
付属CDとかダウンロードをクリックして終わりじゃ絶対に理解できない。
>>200 なるほど。3項演算子は片方がrvalueのときは結果もrvalueになるという
ことですね。
試したところでは、static_cast<ostream>(cout)やostream obj(cout);
はできないみたいでが、そもそもostreamオブジェクトは生成できないも
のなんですか?だとしたらostreamオブジェクトであるcoutはどのように
作成されたのですかね?
コピーしようとすると見るエラーだな
>>207 ostreamやistreamには、引数を取るコンストラクタがある。
coutやcinはそれを使って作られるんだろう。
>>207 static_cast<ostream&>(cout) とか ostream out(cout.rdbuf()); ならできる
>>209 >>210 ストリームとストリームバッファには弱い結合(ストリームバッファの同期)
と強い結合(ストリームバッファの共有)ってのがあるみたいですね。
おそらく、コンソールデバイスに関連付けられたストリームバッファ
(例えばcdevという名前だったとして)というのがシステムには存在し
ていてcoutは、ostream cout(&cdev); というふうに定義されてる
んでしょうね。ストリームオブジェクトをコピーできない理由は
無制限にストリームバッファをコピーしたり(メモリの浪費)、
暗黙のうちに共有できたりしたら問題が起こるからかなと思いました。
ストリームオブジェクトをコピーできない理由は
無制限にストリームバッファをコピーしたり(メモリの浪費)、
暗黙のうちに共有できたりしたら問題が起こるからかなと思いました。
は
>>208 さんへのレスでした。
coutをコピーするというのは意味がわからん、ってのもあるかもね コンソール自体が2個に増えるわけじゃあるまいし
>>205 環境が用意できないです。
それでもあきらめた方がいいですか?
あ、なんかすげー誤爆ってた。失礼orz
環境が用意できないっつー意味がわからん。 Macしか持ってないのにWin32前提の入門書買っちゃったってことかね?
219 :
203 :2008/02/09(土) 17:03:06
すいません。アフォで… 自分は今、第二章で止まってます。 と言うのも、いきなり「では、ソースを見てみましょう」となり、 「開発環境によってコンパイルの手順が異なります」 ↑この時点でわかりません。 自分には向いてないのかな…orz
void hoge(const char* name){ char* piyo = name + (sizeof(char) * 5); } こんなようなことはなんで出来ないんでしょうか? 文字列nameの5文字目のポインタ(&(name[4]))をpiyoに格納したいです error C2440: '=' : 'const char *' から 'char *' に変換できません。 このようなエラーが出るのですが正直ここでなんでこのエラーがでるんだ?といった感じです
const char *piyo
>>220 書き換え可能なポインタ(char *)に書き換え不能なポインタ(const char *)を代入しようとしているからです。
void hoge(const char * name)
{
char const * piyo = & name[4];
}
こう書けば問題ありません。
char *のconst性を除去してるから。入れたいならpiyoもconst char *にする。 hoge内で文字列を弄りたいなら引数をchar *にするべき。 引数は変えられず、どうしてもchar *が必要ならconst_cast<char *>(最後の手段)
224 :
220 :2008/02/09(土) 17:17:20
>>221-223 ありがとうございます。
よく考えたらいじる必要はないのでpiyo側をconstにしました
>>219 とりあえず、なにか揮発環境は持っているのか?
> name + (sizeof(char) * 5) 彼は大丈夫だろうか。
>>225 はい。
ジクロルボスは揮発するので大丈夫です。
俺のチームのメンバも先週揮発したぜ。
ちょっと待て、それは「蒸発」じゃないのか?
>>226 それって問題あるのか?パッと見わからん
>>230 char であるときには問題にはならないが int とかになると…
>>230 >220にはこう書いてある。
>文字列nameの5文字目のポインタ(&(name[4]))をpiyoに格納したいです
>>229 そうだな。揮発は性質で、蒸発は現象だからな。
>>231 いや、だいじょうぶだろw
ちゃんとintの大きさに対応してくれるよw
>>230 ポインタは自動的にそのサイズ分進むから、sizeofを掛ける必要はない、とかかな?
ConceptGCCで、190のコードのofstreamとifstreamを ostream&&とifstream&&にstatic_castしたものを食わせたらどうなるかと試してみたが、 エラーだったorz。右辺値参照はライブラリまで及んでいなかった。
sizeof(*name)にするべきとか。
>>219 適当に c 入門 初心者とかでぐぐれば環境の入れ方から説明してるとこがきっと見つかるよ
241 :
203 :2008/02/09(土) 17:46:21
char ch='a'; cout <<(int) ch << '\n'; // 97 int dt=97; cout << (char)dt<< '\n'; // 'a' とできるのに、 wchar_t ch1='あ'; cout <<(int) ch1 << '\n'; // 33340 int dt1=33440; cout << (wchar_t)dt1<< '\n'; // 0x82a0 と'あ'がでないで、82a0が出るのはなぜですか? (82a0は33440の16進です)
class test{ char* str; int len; public: test(const char* str); }; test::test(const char* str0){ len = strlen(str0); str = new char[len+1]; } とすると (msvcr80d.dll) でハンドルされていない例外が発生しました: 0xC0000005: 場所 0xccccccc0 を読み込み中にアクセス違反が発生しました。 こんなようなエラーがでます、いろいろとコメントアウトして試してみていたのですが str = new char[len+1];部分でエラーが出ているようです、これを str = new char[256];のようにするとエラーはでないのですが、定数でなければならないとかないですよね? 一体なんででしょうか?
書いてないところのバグを見つけろって言う話?
>>245 そういう時は先ず、str0の長さが実際にいくつだったのかを確認しましょう。
>>245 その部分は問題ないように見える。
256にするとエラーが出ないところからみて、
どこかでバッファオーバーフローしてるんじゃない?
249 :
245 :2008/02/09(土) 18:12:34
>>246-247 えっとすみません、str0には固定の文字を入れるようにして試しています
16文字の文字列でして、コンストラクタ内でlenの長さを表示させるときちんと16文字になっています。
また、同じくコンストラクタ内でstr0を表示させるときちんと渡した16文字の文字列が表示されます
250 :
245 :2008/02/09(土) 18:15:42
main内に char* buff = "abcdefghijklmnop"; test hoge(buff); これだけです 余計な部分を全てコメントアウトしてるのでこれでコードは全てです
実行部分をみせろ。 test test1("abcdabcdabcdabcd"); ならまったく問題ないはず。
252 :
251 :2008/02/09(土) 18:22:16
ごめん、違うな
>>245 そこを変えたら動くからといって、バグの出元がそこだとは限らない
ぜんぜん関係なさそうな別の場所も疑う必要がある
strにはアクセスしないの? test内でstrcpyしなくていいのか? なにがやりたいんだ?
255 :
245 :2008/02/09(土) 18:36:41
>>253 提示した部分以外をコメントアウトしているのですがエラーが出る状態です
>>254 その部分が原因かとも疑ってコメントアウトさせているのですがエラーが出る状態です
test::test(const char* str0){
len = strlen(str0);
str = new char[len+1];
strcpy_s(str, len+1, str0);
printf("%s\n", str0);
printf("%d\n", len);
printf("%s\n", str);
}
こんな具合にしますと
abcdefghijklmnop
16
abcdefghijklmnop
と表示されますがしっかりエラーがでます
mainってことは、MFCとかは使ってないわけか…… リビルドしたら直るとか言う落ちはないよな?
>>255 余計なincludeもコメントアウト。
さらにエラーが無くなるまでコメントアウト。
新規プロジェクトと作成して、必要なコードだけ貼り付けて動かしてみる。
おかしいなあ、ちゃんと動くぞよ。
class test{ char* str; int len; public: test(const char* str); }; test::test(const char* str0){ len = strlen(str0); str = new char[len+1]; } int main(int, char**) { char* buff = "abcdefghijklmnop"; test hoge(buff); return 0; } これで、エラーになるって事?
少なくともうちでは落ちない。 VC++ 2005 Express Edition SP1 + Win2KSP4
>>255 どの行で例外発生してるか突き止めたのか?
262 :
244 :2008/02/09(土) 19:00:55
こちらもヨロ
>>262 wchar_tがただのtypedefの環境ではそうなる。
VC++6とか。
264 :
244 :2008/02/09(土) 19:05:57
>>263 はい、VC++2005EEですので、
そういうものなのですね。
どうもでした。
2005はさすがにtypedefじゃないんじゃないか?
266 :
244 :2008/02/09(土) 19:10:30
どうすれば確かめられますか?
>>266 wchat_tとsizeofが一致するいろんな組み込み型とで、オーバーロードしてみる。
wchar_tを組み込み型として扱うコンパイルオプションがあったはず
269 :
244 :2008/02/09(土) 19:25:45
>>267 すいません、よくわかりません。
>>268 MSDN
------
Visual C++ コンパイラ オプション
/Zc:wchar_t (wchar_t をネイティブ型として認識)
/Zc:wchar_t を指定しない場合は、wchar_t を定義するか、または
wchar_t が定義された多数のヘッダー ファイルのいずれか
(wchar.h など) をインクルードする必要があります。
通常、wchar_t は unsigned short として定義されます。
----
とあったので、このオプションをON/OFFしてみましたが、
結果は変わりませんでした。
namespace hoge { int main(int argc, char *argv[]) { } } これをコンパイルすると、↓と言われます。どうすればいいですか? error LNK2019: 未解決の外部シンボル _WinMain@16 が関数 ___tmainCRTStartup で参照されました。
>>244 coutはワイド文字に対応していない。
wcoutを使えば良い。
wcout.imbue(locale(""));
wchar_t ch1= L'あ';
wcout << (int)ch1 << L'\n';
int dt1 = 12354;
wcout << (wchar_t)dt1 << L'\n';
>>270 namespace hoge
{
extern "C" int main(int argc, char *argv[])
{
}
}
テラ反則w
275 :
244 :2008/02/09(土) 20:24:00
>>271 動きました。
私のだと、いろいろな点で駄目でしたね。
ありがとうございました!
ちょっとお尋ねしたいのですが、 char *p というポインタに、なにかしらのアドレスが格納されていて、 cout << p; とした時に、仮に ss[100] = {a b, c ...}; (ss[100] = \0 とする) p = ss; だった場合は、ss[0]から順に\0が出てくるまで走査して、 cout << p; で、abc... と表示するわけですよね。つまり配列の要素100個分順番に読み込んでるってことですよね。 では、もしポインタpに格納されているアドレスが普通の変数のアドレス p = &a みたいな場合だった時は、 cout << p; では、単純に変数aのアドレスが出力されるだけですよね。 で、ここで疑問なのですが、 p = &a; cout << p; だった時、処理系はどうやってpが「変数」のポインタだと判断するのでしょうか?? 「配列」のポインタの場合もあるので、何かしらの方法で判断していると思うのですが、 「メモリを順番に走査して\0が出てこなかったら変数のポインタ」だとしたら 毎回\0が出てくるまで番地を順番に走査していかなくてはならないので(\0が出て来ないかもしれないのに(変数の場合))何か違う気がします。 ポインタには、アドレスや型の情報だけではなくて、そのアドレスが変数のアドレスか、それとも配列の先頭アドレスかという情報も入っているんでしょうか?
>>276 単に何の型のポインタになっているかで決まる。
型が char* のときとそれ以外の T* について
operator<< のオーバーロードが違うだけ。
char a = 'A';
char* p = &a;
cout << p << '\n'
とすると確保されていない領域まで突き抜けて文字列が表示される (はず) 。
>>276 コンパイルするときに決まる。
それがconst char*だったら文字列、void*だったらアドレスを表示する。
その他のポインタ型は多重定義解決の規則に従って、上のどっちかに振り分けられる。
>>276 > p = &a
> cout << p;
> では、単純に変数aのアドレスが出力されるだけですよね。
(aがたとえば int であるとして。)
それは間違い。
> p = &a
これをやった時点でコンパイラは型が違うとエラーにする。
p = reinterpret_cast<&a>として無理やりキャストをしてpに int * の値を入れることは可能。
>処理系はどうやってpが「変数」のポインタだと判断するのでしょうか??
pを宣言する際に、その型を char* と指定しているから、pが実際にさす先に実際にあるものが
charの配列であっても、int型の値であっても、コンパイラはcharの文字列であると扱う。
aの値がたまたま有効な文字の文字コードと'\0'が並んだ物となっていれば、該当する文字列として表示されるし、
そうでなければ制御コードを出力したり文字化けしたりする。
>>276 は一貫してpをchar*として話しているのでは。
そうすると、
> p = &a
> みたいな場合だった時は、
> cout << p;
> では、単純に変数aのアドレスが出力されるだけですよね。
は間違い。
aが存在するメモリ位置から始めて、それ以降にたまたま存在するデータを、
無理やり文字列と解釈して出力するだけ。
282 :
176 :2008/02/09(土) 21:37:59
そーかそもそも文字列を扱うのはchar型だけだから、 << がオーバーロードを利用してconst char*型だけ特別に扱うようにしている、ということですね。 ありがとうございましたm(_ _)m
283 :
デフォルトの名無しさん :2008/02/09(土) 23:57:11
こんにちは。角度の比較のよい方法が思いつかずに苦労しています。 角度A,B,Cがあって、BがAとCの中に入っているがを判定する式で悩んでいます。 角度系は時計の3時が0度、反時計回りに360まであります。 (CはAから見て反時計方向に92度離れています) 単純な比較式 A<B && B<C とすると、A=350度、B=0度、C=30度のときうまく成立しません。 A,B,Cそれぞれがどの象限にいるかによって 判別式を変えることも考えたのですが、組み合わせを考えるとあまりスマートな方法とも思えません。 何か簡単な式などでBがはさまれていることを知る方法があれば教えていただけませんか?
>>283 そもそもどんな値を入れたってぐるっと回ってくれば挟まれてると言えるが?
AとCの作る角の小さい方にBがあるかどうかを判定するってことでいいのか?
その場合、AとCが180度離れていればBはどのような値であっても挟まれていないと考えていいのか?
>>283 Aが0度になるようにBとCを回転させればいいよ。
>>284 > CはAから見て反時計方向に92度離れています
って記述があるからそれは気にしなくていいんじゃね?
> A=350度、B=0度、C=30度のときうまく成立しません。
ってのは例のつもりだろう。
>>283 A' = A - A (=0), C' = C - A (=92), B' = B - A とすれば、
BがAとCの間 <=> B'がA'とC'の間
288 :
デフォルトの名無しさん :2008/02/10(日) 00:15:56
角度を図なしで表現すると難しいですね。 AとCの作る角の小さいほうにBがあることを確認したい。 (大きい角のほうには「挟まれていない」という認識) AとCは180度未満(想定は92度です)離れています。
B-A, C-Aの角度を-180~+180に換算して、 C-A<B-A<0 または、 C-A>B-A>0なら、AとCの間にBがあるんじゃないかな。
AとBの角度 + BとCの角度 < 180 なら挟まれてるよ。
どなたか、助けてください。 #include <iostream.h> #include <stdlib.h> int main(void) { int i,n,*ptr; cin >> n; ptr = (int *)calloc(n,sizeof(int)); for(i=0;i<=n-1;i++) { cin >> *ptr; ptr++; } for(i=0;i<=n-1;i++) { cout << i << "," << ptr << "," << *ptr << endl; ptr++; } return 0; } うまく動きません。 orz... どこが間違ってるでしょうか?
292 :
291 :2008/02/10(日) 00:38:34
自己解決しますたw
293 :
デフォルトの名無しさん :2008/02/10(日) 00:39:10
すみません。理解できていません
>>287 A'=A-A = 350 - 350 = 0
C'=C-A = 30 - 350 = -320 = fmod( -320+360, 360) = 40
B'=B-A = 0 - 350 = -350 = fmod( -350 + 360, 360) = 10
としておいて A' < B' < C' ( 0 < 10 < 40)
と比較すればよいのでしょうか?
C言語より数学を勉強しろよ
295 :
デフォルトの名無しさん :2008/02/10(日) 00:49:21
>>287 うまく行きました。皆さんありがとうございました
296 :
デフォルトの名無しさん :2008/02/10(日) 00:58:44
297 :
デフォルトの名無しさん :2008/02/10(日) 02:41:34
C++で、以下のようなコードを見たのですが、 int res = 0; int a = 0; res >?= a; こんな書き方はありえないですよね? >?= の書き手の意図は res > a ? res = a: res と思うのですが、macroによる置き換えも、>?=のような書き方に 対してはできないですよね?
gcc拡張
299 :
デフォルトの名無しさん :2008/02/10(日) 03:53:53
>>298 マジで?
どういう奴ですか?
というか、手元のg++だとコンパイル通らないけど、、、
こんなソースです。(元のソースから問題部分だけ抜き出したもの)
int main(void)
{
int res = 0;
int a = 0;
res >?= a;
return 0;
}
ちゃんとC++になってる?
301 :
デフォルトの名無しさん :2008/02/10(日) 04:26:18
>>300 こんな感じです。環境はlinuxです。(version 4.2.1)
$ cat test.cpp
int main(void)
{
int res = 0;
int a = 0;
res >?= a;
return 0;
}
$ g++ test.cpp
test.cpp: In function 'int main()':
test.cpp:5: error: expected primary-expression before '?' token
test.cpp:5: error: expected primary-expression before '=' token
test.cpp:5: error: expected `:' before ';' token
test.cpp:5: error: expected primary-expression before ';' token
まったくの初心者なのですがC言語を勉強しようと思ってます 入門書で独習Cと独習C++がありますが、どちらを買えばいいでしょうか? また他に良い入門書があれば教えて頂けませんか?
303 :
デフォルトの名無しさん :2008/02/10(日) 08:42:31
>>302 うすい本にしとけ あとはネットで調べればよい 100ページ以下が必須
その二つだったら間違いなく独習C。
>>302 言葉のあやなのかもしれないが
CとC++は別物だからね
306 :
デフォルトの名無しさん :2008/02/10(日) 08:48:40
日本語学者でなくてもしゃべれるのと同じ うすいやつにしとけ ネットで調べたページだけで勉強しても良い なるべく動かし方がわかったらSTLに進むべき 古典的なCプログラムのほとんどはSTLで簡単に書ける
307 :
デフォルトの名無しさん :2008/02/10(日) 08:50:02
たとえばクイックソートや、スタックや、日本語処理など面倒なプログラムは勉強しなくてもSTLなどで置き換えられる
unicodeもろくに扱えない糞ライブラリがナニ言ってるんだか
>とにかく薄いやつ これには同意。 入門書で分厚いの買ってもダラダラ無駄に難しく書いてるだけで理解しにくいだけ 基礎中の基礎さえ理解したら実際作って必要になった処理をネットで調べる方がいい
STLってunicode扱えないんだっけ?
311 :
デフォルトの名無しさん :2008/02/10(日) 09:21:58
つかえる 一語が判別できないのは charでもおなじ
312 :
デフォルトの名無しさん :2008/02/10(日) 09:41:39
>>310 STLに限らずC++にろくなUnicodeサポートがないというだけのこと。
特に気にする必要はない。気にするな。
ただのwchar_tか何かをコンテナに突っ込んで使うだけだ。
ああそういうことか STLが何か文字コードに依存してるのかと思ったよ
315 :
デフォルトの名無しさん :2008/02/10(日) 10:01:29
たとえば10文字目が何バイト目とか判別できないだけ
>>301 GCC 4.0.4, 4.1.2 と 4.2.3 のマニュアルには...
| The G++ minimum and maximum operators (‘<?’ and ‘>?’) and
| their compound forms (‘<?=’) and ‘>?=’) have been deprecated
| and will be removed in a future version. Code using these operators
| should be modified to use std::min and std::max instead.
[Excite 翻訳]
| そして、'G++最小の、そして、最大のオペレータ、(‘<?'、‘>、'、)、
| 彼らの合成フォーム(‘<?=')と‘>=') 非難して、将来のバージョンで取り
| 除くでしょう。 これらのオペレータを使用するコードはstdに以下を使用
| するように変更されるべきです:分とstd:、:代わりに最大限にしてください。
となってるから、4.2.1 なら使えるはずだが、なんかオプションがいるのかも
しれないな。
ちなみに 4.0.4 の一つ前の 3.4.6 のマニュアルには '>?=' 自体の説明がな
いから、実験的に付け加えられた拡張に思える。
excite翻訳ひどいなw g++の最小・最大演算子とその合成形はすでに非推奨であり 将来のバージョンでは廃止されます。これらの演算子を使用 しているコードは代わりに std::min と std::max を使用するように変更すべきです。
T"なんたら" を L"なんたら" に置き換えるマクロはどう書くですか?
#define T Lでできなければ無理。 Windowsは関数形式のマクロにして対処している。
template<class L>
gcc だと wchar_t は4バイトで UTF-32 を入れるようになっている。 wchar_t はあくまでその環境で扱える最大の文字コードを格納できる文字型でしかなく、 2バイト固定でもなければ UTF-16 や UCS-2 専用のものでもない。 C++0x ではそこんとこ困るってことで UTF-16 と UTF-32 を直接サポートするようになる予定のようだ。 また VC++ が対応遅らせそうな気がして憂鬱になるが。
NT3.1時代からUnicode使ってきたOSに従うべき。
先日こちらでアドバイスをいただき、プログラムを 書いてみました。学校でできなかった分を家で作成しようと ソースを持ち帰ったのですが文字化けしてしまい開くことが できなくて困っています。 学校では秀丸エディタで「.cpp」の拡張子で保存をして gccでコンパイルをしているようなのですが、同じ様な 環境を作ることは可能なのでしょうか? winのメモ帳でも開けるものだと思っていたので困っています。 どうかよろしくお願いします。
324 :
291 :2008/02/10(日) 13:34:37
おそらく文字コードが違うんだろ。 nkf使うか、メモ帳以外のエディタでソースコード見れ
まずはまともなエディタを使うんだ 秀丸にあわせるのがよいかと思うがサクラエディタなど他にもいろいろある *.cppをgccでコンパイルというのもなんか引っかかるが・・・
>>323 秀丸のエンコーディングを一時的に変えるか、まともなフリーなエディタを拾って使えばいいんでない?
つーかC/C++全然関係ない問題なのなw
回答いただきありがとうございます。
327さんの仰るとおり、C以前の問題でした申し訳ありません。
>>325 gccでコンパイルというのは、なにかおかしいのでしょうか?
コンパイル時のコマンドがそのようなコマンドを入力すると
教えられたのです。
まずはエディタを探してみることからはじめてみます。
ありがとうございました。
.cppなら普通gccではなくg++を使う。
結局はgccだけどな
質問です。 最近Cを勉強していますが、コンパイルが上手く出来ません。 コンパイラーはBorland C++ Compiler5.5を使ってます。 コンパイルすると、「指定されたパスが見つかりません」となります。 原因は何が考えられますか?
332 :
デフォルトの名無しさん :2008/02/10(日) 15:45:20
#include <iostream> と #include <iomanip> ってどういうとき使うの?
Pathを通してないのが原因。 setbccでぐぐるとよい。
宣言や定義を使用するとき。
std::coutとかstd::cinとか使いたければ、まず<iostream>をインクルードする。 その上で、引数のあるマニピュレータが集められているのが<iomanip>。
>>332 レベルの質問する奴に只「マニピュレータ」なんて書いたって通じないだろ
と思って解説を書こうとしたけど、うんこしたくなったので中止
でもそれ見てマニピュレータで検索すればすぐ解決すると思うけどw
test
十進数の入力を二進数表示するコードを書いてみたんですが、 最初MASKを0x01に設定して1とか255とか入力したら桁が上下逆になりました。 0x80000000に設定して頭からチェックさせてやったらうまくいったんですが、 intel系のプロセッサはリトルエンディアンだからビットを上下逆に扱うんじゃないんですか? /* d2b.c */ #include <stdio.h> #define MASK 0x80000000 int main(void) { unsigned int x; int n; scanf("%d", &x); for(n = 0; n < 32; n++){ if( ((x << n) & MASK) == 0) putchar('0'); else putchar('1'); if( (n+1) % 4 == 0) putchar(' '); } return(0); }
エンディアン関係ナス
343 :
340 :2008/02/10(日) 22:37:25
>>341 バイト単位で逆なんですね。
>>342 あ、全然関係ないんですか;
ありがとうございましたm(__)m
stdio.hのremove関数の使い方は下記で問題ないでしょうか? remove("ファイルのパス"); 今現在、例えば remove("D:\\test\\test.txt"); こんな具合の1文だけを試しても成功しません、-1が返ってきて失敗しているようです パスは絶対パスで問題ないと思いますし、testフォルダとtest.txtは試しに作ってみたものです プログラム中で開いてもいませんし読み取り専用でもありません 見当がつかず困っています、何かご存知の方いたらよろしくお願いします
>>344 そのパスと同じままfopenして開けるのか?
つまりほんとにそのファイルをプログラムから認識できているのかをチェキラ!
あと、strerrorでエラー内容を取得してみては?
test.txt.txtだったりして・・・ いやさすがにそれはないか
Dドライブは実はDVD-ROMドライブだったりして・・・いやさすがにそれはないか
そもそもDドライブが存在しな・・・ないか ないよな
350 :
344 :2008/02/10(日) 23:32:54
permission deniedというエラーが・・ ファイルのプロパティは読み取り専用とか隠しファイルとかチェック入っていないんですが 全く違う部分なんでしょうか?
chmod a+w FILENAME
Dドライブがネットワークドライブ・・ のわけないよな
354 :
344 :2008/02/10(日) 23:36:53
>>351 うわぁ・・そういうの必要なんですか・・
Cじゃ書けないですよね?
Dはあります
^^;
WindowsXP と仮定して 1.コマンドプロンプトを開く [スタートメニュー]-[ファイル名を指定して実行] cmd 2.コマンドプロンプトで下記の三つのコマンドを打つ D: cd \test dir これで test.txt があるかどうか確認する
357 :
デフォルトの名無しさん :2008/02/10(日) 23:38:17
>>351 それはUNIXだろ。
DOSとWindowsは
rd /s/q c:\
だろ。
358 :
344 :2008/02/10(日) 23:39:44
ファイル自体はあります 今ファイルのパスを変数に入れて、開いて中の文を出力させたりしてみました その変数をそのまま使っています それとfcloseもしっかり
>>358 っ attrib d:\test\test.txt
361 :
344 :2008/02/10(日) 23:52:26
>>360 そういう方法以外のコード内に記述して済ませる方法って言うとWin32APIってのを使うしかないんでしょうか
>>360 その前に permission denied ってんだから削除する権利があるのかどうか確認しろよ。
コマンドプロンプトから del してみるとか、エクスプローラから削除してみるとか。
363 :
344 :2008/02/11(月) 00:08:29
>>362 そこら辺は出来ます、管理者権限でログインしてるので間違いないはずです
>>363 実際消してみた?他のソフトがロックしてるってことはない?
365 :
344 :2008/02/11(月) 00:14:34
消してみました、remove関数を試す為に作ったファイルなのでそういったことはないと思います
そのプログラム内でopenしてる状態でremoveしようとしてる、とかいうオチじゃないよね。
同じこと何度も確認されまくっててかわいそす
368 :
344 :2008/02/11(月) 00:23:53
>>366 上で言ったとおり、remove関数を使う最低限の文だけで実行してもエラーはでますし
closeもしています
もうみんな思い当たる節が尽きたんだろ・・・
プログラムを管理者権限で実行してないとか。
371 :
344 :2008/02/11(月) 00:29:09
絶対パス指定出来ない訳ないですよね・・・なんでだろう
あとは、ディレクトリ消そうとしてるとかぐらいかな。 ファイルを開いて中の文を出力させたりしてると言うから多分違うだろうが...。
OS やコンパイラの情報でも出さないとこれ以上どうしようもないだろ。エスパーでもなけりゃ。
リブートしてみるとか
エクスプローラなんかでやったときとプログラムでやったときとで権限が違うとか。 Vistaだったらありそうだ。
おれの経験から予想するとtest.textになってると予想 それで何時間も悩んだことがあるw
>>318 _T("なんたら")
を
L"なんたら"
で良ければ、
#define _T(x) L ## x
でいいんじゃないか?
378 :
デフォルトの名無しさん :2008/02/11(月) 04:10:31
明日までに1000×1000くらいの行列の逆行列とかを計算することが必要な宿題が 出ました。他の人はmatlabでやるのですが、自分はc++でやろうと思ってます。 逆行列の計算は自分で実装しなくてよいので、ライブラリとかを使おうと思ってます。 今調べたところでは、有名なc++用の行列計算ルーチンは、blitz++, MTL, blas, TNTなどがあることが分かりました。将来性(一度覚えたら長く使える)と性能(一番重視) を考えると、どれを選ぶべきでしょうか? よろしくお願いします。
379 :
デフォルトの名無しさん :2008/02/11(月) 04:20:20
すいません、 > 明日まで じゃなくて、来週までです。
俺は LAPACK 使ってるけど、 他の選択肢を吟味した訳じゃないからなあ。
>>378 将来性はどれを覚えても同じかと。
C++を長く使うのであれば他人のライブラリを実装することも多くなると思う。
性能というのが速度重視であれば自分で実測した方が早いかな?
他には、関連ページの多さ、組み込み易さ、ソースが公開されているか?あたりを重視して決めればいいかと
ぶっちゃけmatlab使えるならそっちを使った方がいいようにも思うが・・
382 :
デフォルトの名無しさん :2008/02/11(月) 05:10:35
>>380 >>381 ありがとうございます。自分が一応一番C++ができる(ことになっている)ので、matlabとの
性能比較のために、自分がc++版を実装することを期待されてます。簡単な偏微分を解く課題なのですが、
絶対matlabに勝ちたいので、自分の環境で性能比較してみます。とりあえず、選択範囲としては、
lapack, tnt, blas, mtl, blitz++, ublas(blasのboost版), mkl(intelのマスカーネルライブラリ)
くらいでしょうか?
>>382 無駄な努力だと思うけど。どうしてもってことならコンパイラもiccにすることお勧め。
どうせなら、cublasかClearSpeedでも使ってぶっち切りを狙うのもいいかもねw
384 :
デフォルトの名無しさん :2008/02/11(月) 09:15:11
>>383 どちらも専用ハードが必要じゃないですか。
でもこんなのもあるんですね。知らなかった。
コンパイラはiccとgccを比較します。
385 :
デフォルトの名無しさん :2008/02/11(月) 09:51:09
CloseHandleの前後で、ハンドルが閉じられていることを確認するにはどうしたらいいですか
386 :
デフォルトの名無しさん :2008/02/11(月) 10:00:18
ハンドルが使用中かどうかを知りたいんです
なぜそんなことをする必要があるのですか
388 :
デフォルトの名無しさん :2008/02/11(月) 10:06:36
たとえばサブディレクトリのファイルリストをひとつひとつ取得したいとき、 同一ディレクトリにまだファイルが残っていれば次のファイルを呼んで、 無ければハンドルを解放して、子ティレクトリへ進めたいんです
389 :
デフォルトの名無しさん :2008/02/11(月) 10:07:45
フラグを別に持っていれば確認できますが、なるべく変数を減らしたいと思います
かならずNULLで初期化してCloseしたらNULL代入すればいい。
ファイルハンドルは NULL じゃなくて INVALID_HANDLE_VALUE だ!
NULLで比較しちゃってるコード多いけどな それで動いちゃってるし 型安全なtypedefでもないかぎり防ぐのは無理ぽ
ごめん間違えた INVALID_HANDLE_VALUEは-1だった
>>388 なんか設計がおかしいように気がするけど...
擬似コードでいいから晒してみてよ。
396 :
デフォルトの名無しさん :2008/02/11(月) 10:42:25
main(){ dirserch dir("c:\\windows"); cout << dir.next(); cout << dir.next(); cout << dir.next(); }
C だと不完全型を利用して隠蔽する。
Cでshared_ptrみたいなのはないの?
テンプレートが無いのが辛い所だな。 マクロで何とかできなくはないが。
それ以前にデストラクタが無いんだから仕方が無い
AddRef/Release を自前でやるなら問題ない。 面倒だけど。
COMを勉強中で、インターフェースを実装したクラスの情報を隠したいのですが 取得したものをみると、CFileの内容がくっついて来てしまいます // idl [uuid(...), version(1.0), hidden, object] interface IFile : IUnknown { HRESULT method(); } [uuid(...), version(1.0), hidden] coclass CFile { interface IFileBase; }; // 簡単なインターフェース取得 IFile * __stdcall create() { IUnknown *iface = new CFile; IFile *base = NULL; iface->QueryInterface(IID_IFile, reinterpret_cast<void**>(&base)); return base; } 属性にhidden指定するだけではだめなんでしょうか? WinXPsp2/.net2003/C++/ATL使用せず
なんで CoCreateInstance 使ってないの?
CoCreateInstanceはレジストリに登録しないと使えないと、どこかで見た記憶があり 更にDirectXのレジストリ登録を見る限り、musicしかなかったので この方法でいけるんじゃないかと思っていました CoCreateInstanceの方で調べて試してみます 指摘ありがとうございました
405 :
388 できました :2008/02/11(月) 11:27:38
#include <iostream> #include <vector> #include <string> #include <windows.h> using namespace std; class dirserch{ vector <string> dirname; vector <int > dir[300]; string path[300]; int n; WIN32_FIND_DATA fd; HANDLE hd; public: dirserch(char *ch); int next(string &str); }; main(){ dirserch dr("c:\\windows"); string str; while(dr.next(str))cout<<str<<endl;} dirserch::dirserch(char *ch){ n=0; path[0]=""; dir[0].push_back(0); dirname.push_back(ch); hd=NULL;} int dirserch::next(string &str){ for(;;){ if(hd==NULL){ int k=dir[n].size()-1; if(k<0){ if(n==0)return NULL; n--; continue; } path[n+1] = path[n] + dirname[dir[n][k]] + "\\"; dir[n].resize(k); n++; hd = FindFirstFile((path[n]+"*").c_str(), &fd);} for(;;){ if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){ if(fd.cFileName[0]!='.' || ( fd.cFileName[1]!='.' && fd.cFileName[1]!='\0' )){ int k=dirname.size(); dir[n].push_back(k); dirname.push_back(fd.cFileName);}} else { str=path[n]+fd.cFileName; if(!FindNextFile(hd, &fd)){CloseHandle(hd); hd=NULL;} return 1;} if(!FindNextFile(hd, &fd)){CloseHandle(hd); hd=NULL;break;}}}}
406 :
388 できました :2008/02/11(月) 11:30:24
全ファイル名を順番に出力する機能って基礎的だと思うのですが、標準にないので作ろうと思いましたよ
再帰使わないの?
408 :
388 できました :2008/02/11(月) 11:41:51
再帰はつかいません パソコンにメモリ管理を任せると、鈍くなったり不安定になるからです
それだとWindowsやLinuxといったOS自体使えない理屈だが・・・
410 :
388 できました :2008/02/11(月) 11:46:13
メモリというより、データをスタックへ積むコンパイラの仕組みでした
ファイルの列挙くらいは大丈夫だと思うけど
412 :
デフォルトの名無しさん :2008/02/11(月) 12:02:05
複数のファイル(1000以上)にランダムに書き込みがある時、 HDDの内蔵キャッシュやwindowsの標準キャッシュの効き目が悪くなるので バッファ付きファイル出力クラスを作ります
そうか。がんばれ
414 :
デフォルトの名無しさん :2008/02/11(月) 12:09:05
double であることを明示的にするには、数字の最後にLをつければいいですか?
.0でいいんじゃね?
416 :
デフォルトの名無しさん :2008/02/11(月) 12:20:12
>>415 やっぱりそっちの方がいいかな。
100とか1とか切りのいい数字なんだけど、doubleで計算させたいときに、
せっかく切りがいいのに、100.0とかするのがいやだったんだけど、
100だとintとかにみえてしまう感じ。
やっぱり、.0にしときます。
ありがとうです。
整数リテラルにLつけてもlongにしかならんだろ
100.でもおkだった気がする。すごく中途半端だけど
2.0Lもdoubleではなくね
bccだと100.0Lにするとdoubleじゃなくてlong double(80bit)になっちまう。
あるとすればdだよな。あるとすれば。
> 100だとintとかにみえてしまう感じ 見た目の問題じゃなくて、実際にコンパイラにそう解釈されてしまうよ。 暗黙の型変換はおいておくとして。
bcc以外でもlong doubleだろう・・・
C++なら、double(100)でいいよ。
てゆーかそれでいいならcでも(double)100でいいだろw キャストだけど
>>391 ここでは有効かどうか区別できれば十分なんだからNULL使ってもいいと思う。
>>426 有効なハンドルとしてNULL(=0)返されたらどうすんだ
正常なハンドルとして0を返すライブラリの設計がおかしいと考えるんだ。
おかしくても使わねばならんこともある。
0と-1が無効というハンドルもあるのさ・・・
>>426-430 て言うか、ハンドルはポインタとは違うんだから NULL と
比較するなんて発想する奴はどうかしてると思う。
しかし型の実体がポインタだから困る
PVOID
>>433 実体を一意に示す値じゃないの?
正確な表現かどうかわからないけど。
ポインタもハンドルの1つの設計としてありえるし、
整数で0から順に付番する設計も考えられる。
実態が何かは関係なく、ハンドルはハンドルとして扱わないと。
>>436 そういう抽象的なことで逃げるのがWindowsプログラマ
>>437 まあお前はFILEをいじってドツボにはまってろ。
>435でも似たようなこと言ってるけど将来的に 実体が変わる可能性もあるからねぇ。
いや待て。Windowsとか関係なく、 ハンドルと、ハンドルの実装は切り離して考えるだろ。 ソフトウェアは抽象化が支えているって習わなかったか?
抽象化なんては馬鹿には理解できないと言うだけのことだろ。 かわいそうだから、スルーしてやりなよ。
443 :
デフォルトの名無しさん :2008/02/11(月) 16:04:00
stdio.h読み込むと関数使えますが、 zip.hを自作してこれ読み込むだけでDLLを使用してzipの解凍出来るように出来ますか? ソース内でDLLを読み込まないと無理ですか
>>443 DLLだって元はソースコードなんだからそれを自分で書けばできるよ。難易度は別にして
445 :
デフォルトの名無しさん :2008/02/11(月) 16:25:54
DLLの関数をヘッダファイルの読み込みだけで使えるようには出来ませんか
447 :
デフォルトの名無しさん :2008/02/11(月) 16:28:00
やりかた教えて下さい
ヘッダファイルでロードすりゃいい。コンストラクタとかで。
449 :
デフォルトの名無しさん :2008/02/11(月) 16:29:49
#include "zip.h" main(){ zip_init(); } としてロードする方法しか判りません
Cなのか?環境くらいはまず書いてくれ。 どうでもいいが、その方法がなぜいけないのだ?
451 :
デフォルトの名無しさん :2008/02/11(月) 16:33:55
printfなど標準関数はロードせずに使えて便利じゃないですか DLLの関数も自動でロードしたら便利になります コンストラクタで自動になるかやってみます
思いっきりいろいろ勘違いしている。printfはロードとか関係ない。 zip_init()は初期化のために必要な処理だろ。全然別だ。
printfとか入ってるlibcは標準でリンクするようになってるからな mathだと-lmいるだろ? ようするになんか勘違いしてないか?
printfはスタティックリンクなので、ビルド時にlibがリンクされている。 DLLは名前のとおりダイナミックリンクなので、プログラムが自分でリンクしなければならない。
455 :
443 :2008/02/11(月) 16:47:41
できましたよ これでヘッタファイルの読み込みだけで解凍しました class UNZIP{ typedef int (WINAPI *zipfnc)(const HWND , LPCSTR , LPSTR , const DWORD); HINSTANCE hd; zipfnc unzip; public: UNZIP(){ hd=LoadLibrary("UNZIP32.DLL"); unzip = (zipfnc)GetProcAddress(hd,"UnZip");} int & operator ()(char *ch) { char buf[256]; unzip(NULL, ch, buf, sizeof(buf));} } unzip; main(){ unzip("d:\\a.zip"); }
そのDLLからインポートライブラリ作ってリンクしとけ
2つ以上unzipしたときの動作とかも考えとけと
458 :
デフォルトの名無しさん :2008/02/11(月) 16:53:02
この方法では、どういつDLLの関数でもハンドルを個別に用意しなくてはならないですが 便利なので主要なDLLの関数は書き換えようと思います
DLL見付からなかったらあぼーんだな。その対策入れろよ。
460 :
デフォルトの名無しさん :2008/02/11(月) 17:50:44
自由落下で物体がどのくらい落ちるか計算させたいんですが、めちゃめちゃな計算結果になります。 どこが間違ってますか? float h; DWORD before = timeGetTime(); DWORD after = timeGetTime(); h -= ( 9.8 / 2 * ( after - before ) * ( after - before )/1000000 );
462 :
460 :2008/02/11(月) 18:05:10
>>461 hには元の高さの3.0fが入っています。
afterとbeforeが同一だったら0除算発生しないか? めちゃくちゃなのはその処理だと思うぞ・
>>460 先ずはtimeGetTime()を使わずに、自分で時間軸を制御してみたら?
>>460 h=(1/2)gt^2 だったら -= していくのはおかしいだろ。
計算結果を普通に代入すれ
467 :
460 :2008/02/11(月) 18:46:30
beforeはウィンドウが作られたときに数値を入れて、afterは重力計算直前に数値を入れています。
(after-before)の部分を手動で数字の1や2に書き換えたら正常に動作しました。
DWORDとfloatの単位とかの問題ですか?
>>465 すみません、落下距離じゃなくて必要なのは現在の高さでした。
468 :
デフォルトの名無しさん :2008/02/11(月) 18:56:48
UNZIP32.DLLの解凍時の進行状況を抑止するにはどうすればいいですか
469 :
468 :2008/02/11(月) 19:02:03
自己解決しました
>>467 たぶん
>>463 だろうな。
数百メガから数ギガHzで動くCPUからしてみたら、
ミリ秒なんて気の遠くなるほど長い時間。
471 :
465 :2008/02/11(月) 20:56:12
>>467 そうじゃなくて。
h = 3.0 - ( 9.8 / 2 * ( after - before ) * ( after - before )/1000000 );
だろ?
472 :
デフォルトの名無しさん :2008/02/11(月) 21:00:10
先に質問したものです。 iccについての質問なのですが、-Wall付きでコンパイルすると沢山警告がでます。 これらの警告は対応すべきなのでしょうか? $ icc test.cpp -Wall test.cpp(5): remark #1418: external function definition with no prior declaration double g(double s) { ^test.cpp(6): remark #383: value copied to temporary, reference to temporary used return std::max(s - 100.0, 0.0); test.cpp(6): remark #981: operands are evaluated in unspecified order return std::max(s - 100.0, 0.0); ここで使っているソースはこれです。 #include <iostream> using namespace std; double g(double s) { return std::max(s - 100.0, 0.0); } int main() { double x = 150.0; cout << g(x) << endl; return 0; }
警告なんだから、気にならなきゃ別に対処しなくてもいいんでないかい。 おれは、気にする性質だから可能な限り対処するけど。
>>470 0除算は発生しないよ。乗算してるんだから。
477 :
デフォルトの名無しさん :2008/02/11(月) 22:24:26
ものすごく初歩的な質問でごめんなさい・・・ c++で、任意の位置に文字を表示させる方法を教えてください。例えば「1」を上から100ピクセル100ピクセルの位置に表示させるやり方を。 それと、もう一つ。 文字を上書きする方法を教えてください。上記の「1」の文字を消して「2」に書き換える方法です。 色々検索して調べたのですが、わかりませんでした。 お願いします。
>>4 とりあえず何に表示してるか教えろ
winのコマンドプロンプトか?
>>477 手始めに、VRAMとかフレームバッファとか呼ばれるものにアクセスする方法を探してみてはどうだろうか。
>>477 環境によって違うので、先ずは環境を明らかにしてください。
「質問の仕方が」初歩的だと、手の施しようがないよな・・・。
すいません、プログラミングとは直接は関係ないのですが、 他に適当なスレが見つからなかったので質問させてください。 Dev-C++を使ってプログラムを打っているのですが、 プログラムを作成してソフトから実行するとコマンドプロンプトが一瞬で消えてしまいます。 ↓のような簡単なプログラムで試してみましたが無理のようでした。 どなたか解決策が分かるかた教えてください。 #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { printf("test\n"); return 0; }
getchar();でも入れておけば?
char型、int型の宣言ひとつで何バイトの領域が確保されますか? 環境によって違うってよく聞くけど例えばXP32bitの場合
sizeof(char) sizeof(int)
char型は常に1バイトじゃなかったっけ?
>>486 ありがとう。そういえばそれで見れたね
いつもよくsizeof使ってるのにその発想がでてこなかった
>>487 char型はかわらないのか。勉強になりました
疑問文の内容をまんま受け入れることで「勉強」しないほうがいいのでは。
char型は常に1バイトだが、1バイトが常に8ビットとは限らないからな。
491 :
デフォルトの名無しさん :2008/02/12(火) 08:16:21
生暖かい目で・・ってのはこういうことを言うんだろうな
493 :
デフォルトの名無しさん :2008/02/12(火) 08:19:52
perlをコンパイルしてC言語から使えるDLLを作成できますか
1Byte==sizeof(char)が9bitだったり7bitだったりすることもある
495 :
デフォルトの名無しさん :2008/02/12(火) 08:22:04
アセンブラをソースに埋め込めますが、perlとかフォートランはないですか
>>494 それは既に論外
charこそ1バイトの基準だとでも思ってるのか?
卵が先か鶏が先かとかいうレベルじゃないぞ?
497 :
デフォルトの名無しさん :2008/02/12(火) 08:29:26
>>493 ですが
DLLでなくてもC++から使える方法ならいいです
>>496 客観的な事実として、
- sizeof(char) は常に1。
- もともと、1文字分のデータ量が「バイト」。
- 1バイトは必ずしも8ビットでない(正確に8ビットを表現したい場合は「オクテット」と言う)。
- 1バイトが6ビットや7ビット、9ビットのアーキテクチャが実在した。
- C99では少なくとも1バイトにつき8ビットあることが保証されている(CHAR_BITは8以上)。
疑問を投げかけるだけ投げかけて 496は海の藻屑と消えました。
組み合わせの計算させるようとしたんですが、出力が0になってしまいます。 ブレークポイントで止めて確認したところ、Anの値がAnrの値より小さくなって いるみたいなんですが何故でしょうか? もしかして表現できる桁数を越えてるから? そうだとしたらこれ以上大きな値が扱える型ないですか? unsigned long long int Kumiawase(int); int main(){ int n=36; int r=6; unsigned long long int Ar=Kumiawase(r),An=Kumiawase(n),Anr=Kumiawase(n-r); cout<<An/(Ar*Anr)<<endl; } unsigned long long int Kumiawase(int n){ unsigned long long int Ans=1; for(int i=1;i<=n;i++){ Ans*=i; } return Ans; }
>>500 36! は 371993326789901217467999448150835200000000 であって、
2^64 = 18446744073709551616 を大幅に越えている。
二項係数の値を求めたいのであれば、
パスカルの三角形を使って足し算だけで求めると良い。
>>501 ありがとうございます。扱える数字をオーバーしちゃってるんですね
パスカルの定理調べてみたけどよく分からない…
高校の時の数学の教科書引っ張り出してきます
503 :
デフォルトの名無しさん :2008/02/12(火) 12:50:57
perlembed ? 俺には無理そうだが君なら!
505 :
デフォルトの名無しさん :2008/02/12(火) 16:04:32
クラス内でchar *filename;というメンバ変数を持っているのですが、 コンストラクタ内で、 filename = "memo.txt"; とかやると、 warning: deprecated conversion from string constant to 'char*' と言われます。static_cast<char *>("memo.txt")としても同じでした。 このワーニングが出ないような書き方はないでしょうか?
>>505 char *filename → const char *filename
>>484 言われた通り実行すると、確かにコマンドプロンプトは表示されたままで止まりました。
原因は分かりませんが、しばらくはこれでやってみたいと思います。
もし、どなたか原因が分かる方がいれば教えてください。
>>507 原因ったって、そのプログラムが一瞬で終了するからだろう。
"test\n" を出力したあと、すぐに return してるじゃないか。
プログラムが終了したら窓は消える。
>>508 今まではreturn 0を入れると「終了するには何かキーを押してください」と言う表示がでてたんですが、
急にでなくなって困っています。
getchar();を入れた場合は止まりますが、キー入力待ちにはなりませんでした。
言っていることが聞かれている事とちがったらすいません。
>今まではreturn 0を入れると「終了するには何かキーを押してください」と言う表示がでてたんですが、 そりゃぁ、IDEから起動してたからだろ。
511 :
デフォルトの名無しさん :2008/02/12(火) 17:57:15
#include <iostream> using namespace std; namespace HW { class test { public: test(); virtual ~test(); }; test::test() { cout << "FFF" << endl; } }; int main() { return 0; } これをコンパイルできません。 どうしてですか? /tmp/ccsyUc0A.o: In function `HW::test::test()': samp174.cpp:(.text+0x12d): undefined reference to `vtable for HW::test' /tmp/ccsyUc0A.o: In function `HW::test::test()': samp174.cpp:(.text+0x163): undefined reference to `vtable for HW::test' collect2: ld returned 1 exit status
>>511 デストラクタの宣言があるのに実体がないから。
ついでに言えば、コンストラクタの後にイリーガルなセミコロンがある。
513 :
デフォルトの名無しさん :2008/02/12(火) 18:19:13
VS2005のC++でDXUT,STL使って開発してるのですが、 class A{ std::string m_name; public: void func(std::string str){ m_name = str; } } このコードがデバッグでは何の問題もなく動くのですが、 リリースにするとfuncを呼び出してm_nameに代入した時にthisポインタが0x000001を指し、 バッファオーバーランで落ちてしまいます。 何かご存知の方が居ればどうかご教授ください。
コンストラクタの後のセミコロンはネームスペースの終わりのとこだべ。 なくてもいいけど。 で、デストラクタはオブジェクトを作ってないから呼ばれないので、通所は無くてもいいが virtual の場合は別。
それだけじゃ判らんから、気になったことだけ。 ・なんでstd::stringを値渡ししているの? ・そのAの実体はどこにあるの?
>>511 namespaceの終わりにセミコロンは不要。
仮想関数には定義が必要。定義が無いと仮想関数テーブル
(そのメッセージでいうvtable)のエントリーを作れない。
仮想でなければ呼ばれなければ必ずしも定義は必要ない。
517 :
デフォルトの名無しさん :2008/02/12(火) 18:40:03
>>514 セミコロンは付け忘れました、
まだ継承は知らないのでなんとも。。
>>515 値渡しでうまく動いてたので特に意味なく使ってました、
ためしにfunc(string *str) に変えてみたら見事に動きました。。。
なぜこういう結果になるのかよくわかりません。。。
すばやい解答ありがとうございました。
>>517 どうでもいいが、>514は>512宛てだ。
ついでに言えば、ポインタ渡しじゃなくて参照渡しにするだろ。常考
519 :
デフォルトの名無しさん :2008/02/12(火) 18:49:20
>>518 勘違いしました、、
なぜデバッグだと動いていたのか、と
値渡しだとだめなのかを知りたいのですが。。
521 :
デフォルトの名無しさん :2008/02/12(火) 19:06:43
>>520 というか良く見たらDebugモードになってまして、
Releaseだとやっぱりオーバーランしてましたorz
だめだめだ。。。
class A{
string m_str;
public:
func(string str){
m_str=str; ←
};
};
class X{
public:
func(string str){
A hoge;
hoge.func(str)
};
};
DWORD WINAPI doloop(LPVOID lpParam){
x.func("test"); ←xはグローバル変数になってます
};
最初はこんな感じです。。
>>513 mainもないのが、問題なく動くのか……最近のC++は凄いな
523 :
513 :2008/02/12(火) 19:13:15
>>520 Releaseでビルドプロパティの最適化を無効にしたらReleaseでも大丈夫でした。
>>521 問題が再現する最小のテストコードを作って
検証してから質問してくれ
525 :
513 :2008/02/12(火) 19:15:45
>>522 mainからdoloopをスレッドで動かしてます。。
簡略化しすぎました。。
DWORD WINAPI doloop(LPVOID lpParam){
while(!bMainLoopExit)
{
EnterCriticalSection(&cs);
x.func("test");
LeaveCriticalSection(&cs);
}
ExitThread(NULL);
}
class A{ std::string m_name; public: void func(std::string str){ m_name = str; } } int main(int, char**) { A test; std::string str = "abc"; test.func(str); } // これでも落ちるか?
>>525 まて、複数のスレッドからグローバル変数にアクセスしてるのか?
このあと、衝撃の新事実が!
D3DPRESENT_PARAMETERS d3dpp; ZeroMemory(&d3dpp, sizeof(d3dpp)); D3DPRESENT_PARAMETERS d3dpp = {0}; 結果に違いはありますか?
STL使っておいてExitThreadってのも相当ヤバイ匂いがするけどな
そもそも〜Thread系の関数って使いどころあるのかね?
うむ、少なくともA::funcが問題って訳じゃなさそうだよね。 ってか、なんで値渡し……?
構造体のメンバに、名前と番号両方からアクセスしたいとおもっています。 typedef struct particle{ double data[3][3]; typedef data[][0] position[]; typedef data[][1] verosity[]; typedef data[][2] angle[]; /* ようするに、data[][]に、position[]……という名前でもアクセスしたい */ /* data[][]のままで、loopを回して全部に値を流し込む、ということもしたいので、二重配列も残したい*/ }PARTICLE; 当然のようにエラーなのですが、こういうばあいどのように記述すればいいのでしょうか。
534 :
513 :2008/02/12(火) 19:38:00
>>526 mainの中身を
>>521 のX::funcにあたる場所に入れて実行してみましたがだめみたいです。
>>527 そうです。。
>>530 書かなくてもいいけど明示的に書いても良いって書いてあったので書いてあります。
クリティカルセクションで排他処理した気分になって
親が実体持ってるクラスを使ってます。。
http://2chcity.myminicity.com/env 環境優先的に修復を。たぶんこの項目が一番減る。
NEJITUのように少し公園を先行させてもいいかもしれん。
ランク 国名 .... 街名 人口 (増減) 前日
--- 1 US1 .LUELand 314897 (. +528) 314369
--- 2 US2 .GoonTown ......187254 (. +490) 186764
--- 3 US3 .CreateMyCity Forum 105044 (. +804) 104240
--- 4 Slovenia1 Staregate 100076 (+1393) .98683
--- 5 Poland1 #debian.pl .... .90733 (. +618) .90115
--- 6 Germany1 isnichwahr.de .89782 (. +224) .89558
--- 7 Japan1 ...2ch_city .... .69147 (+1870) .67277
--- 8 Germany2 deluxebits .59250 (. +279) .58971
--- 9 France1 .FanaZ . .56613 (+1377) .55236
--- 10 . Germany3 upOTia . .54802 (. +130) .54672
20位までのランクは下記URLご参照ください
http://mmc.from.tv/world.html
宣伝するのはいいけど、糞重いページだと注意書きしろよ。
>>533 typedef union particle{
double data[3][3];
struct {
double position[3];
double verosity[3];
double angle[3];
} named;
}PARTICLE;
例外を投げるときどういう型で投げるのが一般的なんでしょうか? エラーメッセージ? エラーコード? それともクラスで投げて型判別? どういう形がスマートでしょうか
CAtlException
>537 ありがとうございます // strtest.c #include <stdio.h> typedef union particle{ double data[3][3]; struct { double position[3]; double verosity[3]; double angle[3]; } named; }PARTICLE; int main(void){ PARTICLE pt; pt.data[0][0] = 10; printf("%lf\n",pt.named.position[0]); return 0; } >gcc strtest.c >./a.out 10.00000 所望の動作が得られました。
541 :
513 :2008/02/12(火) 20:42:48
答えてくださった方々ありがとうございました。
542 :
460 :2008/02/12(火) 21:10:50
>>471 !
なるほど。そこの部分と、
>>460 では省略した速度のvをintからfloatにしたらなんとなくうまくいきそうな感じになってきました。
ありがとうございます。
Cの基本的なこと(繰り返しや条件分岐、演算子、ポインタ、構造体)をやってからC++(visual C++)をやろうと思ってるんですが他にCで勉強してた方がいいことってありますか?
STLとATLで、 std::stack<CAutoPtr<Hoge>> hoges; hoges.push(CAutoPtr(new Hoge())); hoges.top()->func(); とすると、Hogeの実体がすでに破棄されているみたいでエラーが出ます。 std::stack<CAutoPtr<Hoge>> hoges; hoges.push(CAutoPtr(new Hoge())); hoge.top().Attach(new Hoge()); hoges.top()->func(); とすれば動きます。 どうして上のだと捨てられているですか?
すまぽい
CAutoPtrってSTLのコンテナに突っ込んで平気だったっけ。実装的に。
auto_ptrと一緒じゃないか? hoge.top().Attach(new Hoge()); で新たなアドレス突っ込んでるから動くだけで。
>>529 D3DPRESENT_PARAMETERSがPOD型なら無い
CAutoPtrが原因だね。
CAutoPtr専用のコンテナがあったはず
>>548 そいつたぶん釣りか荒らしかただのバカだよ…。
それかCSharedPtr
>>534 スレッド中でWindowsAPIのみ使うならCreateThread, ExitThreadでいいよ。
でもCランタイム使うなら_beginthread, _endthread使わないとダメだぜ。
あと、ExitThread等でスレッド終わらせると、スコープ抜けずにスレッドが終わる。
C++使うなら、ローカル変数のデストラクタ呼ばれなくなるからやめた方がいい。
554 :
460 :2008/02/12(火) 22:48:42
すみません、やっぱり無理でした。 ( after - before )の部分をtimeに置き換える。 ・・・・ 正常に動作。 (ただし、事前に float time = 0.1; を宣言しておく。) ( after - before )の部分を数字の0.1に置き換える。 ・・・・ 正常に動作。 ( after - before )の部分をtimeに置き換える。 ・・・・ おかしい (ただし、事前に DWORD time = 0.1; を宣言しておく。) ここから考えるにDWORD型が悪さをしていると思うんですが、 ( after - before )の部分を( float )( after - before )に置き換える。 ・・・・ おかしい 何か特殊な変換をしなければいけないんでしょうか?
>DWORD time = 0.1; DWORDが何のtypedefか分かってる?
556 :
デフォルトの名無しさん :2008/02/12(火) 23:19:54
すみません質問です。 下記のようなコードでBar::fugaを初期化する方法が よくわからないのですが、教えていただけませんでしょうか? この場合はやはり引数空っぽのコンストラクタを作るほかに手はないのでしょうか? class Foo{ public: Foo( int hoge ){ ... } }; class Bar{ public: Foo fuga[ 3 ]; Bar( void ) : ???? { ... } };
>>554 おかしいというときは、after - beforeやtimeの値が0になっているときじゃないか?
timeGetTimeが何を返す関数なのか理解しないで使っているに1ガバス。
戻り値で return *(hoge + (sizeof(piyo) + 2); みたいに書くのって非推奨なんでしょうか?*は無くてもいいんだけれども
ケースバイケース。 つか、それだけじゃ分からん。
>>559 まあ、非推奨だろうね。
コンパイルできないし。
>>559 *があるとないじゃ内容が変わるが?括弧の数が合わないのはtypoでいいよね?
個人的には、あんま複雑になるようならローカルに落として欲しいけど、これくらいなら許容範囲。
ってか、ポインタを+2するだけならreturn hoge + 2;でもいいんでねぇの?
564 :
460 :2008/02/13(水) 00:45:52
うあああああああああ!できました!
>>555 整数型って分かってたつもりなのに小数いれてました!
あと、
>>557 で言われたとおりにtimeの値調べてたら、
ウィンドウ生成時に
before = timeGetTime();
そして計算時にも
before = timeGetTime();
ってやって、afterに何も入ってないような状態になってたような感じでした!
今度こそ解決しました!ありがとうございます!
そもそもさ、めちゃめちゃな計算結果って具体的にどんなんよ
566 :
460 :2008/02/13(水) 01:11:10
3Dのモデルを動かしてて、チェックするまでは数字の表示の仕方がよく分からなくて数字に出してなかったんですが、 とりあえず物体のy座標しかいじってないのにカメラの位置が変わってました。
一時的でなくそこからずっと指定の型で宣言したみたいに扱う方法ってないですか? 例えばchar型で宣言したのを一々(int)とかしなくてもずっとint型として扱う みたいな感じで
>>567 言いたいことがわからない。キャストを毎回するのが面倒ってことか?
ずっとintならはじめからintにしとけばいいんでねぇの?
>>567 union{
char a;
int b;
};
ちょっと違うかもしれんが
>567 #define char int なにが起きても責任とらないよ。
>>568-470 ごめん_beginthreadが引数としてvoid*しか渡せないからそれをchar*として扱える
ようにしたかったんです
関数内でchar *xxx=(char *)xxxとすることで解決しました。ご迷惑おかけしました
>>568-470 ごめん_beginthreadが引数としてvoid*しか渡せないからそれをchar*として扱える
ようにしたかったんです
関数内でchar *xxx=(char *)xxxとすることで解決しました。ご迷惑おかけしました
「charとint」と「void*とchar*」はだいぶ事情が違うだろ・・・
574 :
デフォルトの名無しさん :2008/02/13(水) 06:39:24
>>514 >>516 ありがとうございます。なるほど、仮想関数は定義が必須なのですね。
あと、純粋仮想関数は定義が必要ないけど、デストラクタの純粋仮想関数の場合は
やはり定義が必要になる、というのは正しいですか?
575 :
デフォルトの名無しさん :2008/02/13(水) 08:56:43
質問です。 マルチスレッドプログラムを作った事がないためわからないです。 スレッドAで作ったデータをスレッドBに渡すには普通どうやって渡すのでしょうか?以前お遊びで作った時、グローバル変数を使って渡したのですがデータが化けちゃったんですね。。 【作りたいもの】 ダイアログベースのターミナルソフト。 ・シリアルデータ受信スレッドでデータを受けて表示用(windowsのメッセージループ待ちをしてる)に送りたい 【開発環境】 VC。MFCはつかいません。猫でもわかるレベル
AはBの作成者、じゃないのね? グローバルデータが化けた理由がわかれば解決すると思うよ。
同時に書き込んだんじゃね? もしくは書き込んでない(初期化してない)のに取得したか
どうせ排他してないだけなんだろうな
>>575 多分GUIスレッドにはPostMessage()でブン投げてるんだろうが、
GUIスレッドがPostされたメッセージをメッセージキューから読み取るまでの間に
受信スレッド側からの再Postが発生し得るから、その場合グローバル変数では
当然上書きされてしまうだろ。
Post側は毎回malloc()等でメッセージ用の領域を確保して、受け側で
メッセージを処理したらfree()するように汁。
C++の一時オブジェクトについて質問します。gcc 3.2.1です。 下記のようなコードで"taking address of temporary"のWARNINGが出ますが、 この場合は無視しちゃってもいいですか?いいですよね? #include <stdio.h> class CTmp { public: int x,y; CTmp(int a,int b):x(a),y(b){}; }; int Foo(CTmp* pTmp) { if(pTmp) return pTmp->x + pTmp->y; return 0; } int main(int argc,char** argv) { int result=Foo(&CTmp(1,2)); printf("%d\n",result); return 0; }
581 :
580 :2008/02/13(水) 11:16:23
こうするのがスマートかな。
スマートさ以外で
>>580 のまずい点あったら教えてください。
#include <stdio.h>
class CTmp
{
public:
int x,y;
CTmp(int a,int b):x(a),y(b){};
};
int Foo(const CTmp &Tmp)
{
return Tmp.x + Tmp.y;
}
int main(int argc,char** argv)
{
int result=Foo(CTmp(1,2));
printf("%d\n",result);
return 0;
}
スマートというかそれが普通じゃね。
んじゃ、列挙。 ・ポインタである必要が内のにポインタを使うな ・どうしても使いたいならconst修飾しろ ・そもそもデータメンバは公開するな ・クラスに依存する関数ならメンバにしろ
585 :
デフォルトの名無しさん :2008/02/13(水) 12:15:31
下記のように、fstreamの参照に、ifstreamを渡したいのですが、できません。 そこで、fstream *fsというようにポインタにしてやってるのですが、参照で やる方法はないでしょうか void func(fstream &fs) { return; } int main() { ifstream ifs; ifs.open("ttt"); func(ifs);
return文で計算したりって避けてたけど結構普通にやるもんなんだな
>>585 fstream は読み書き両用。読み取り専用の ifstream を渡せないのはあたりまえ。
なんで ifstream& にしないの?
588 :
580 :2008/02/13(水) 12:26:17
>>582-583 レスありがとうございます。
まあ動くけど将来にわたって安全とは言い難い、
ってかやはり
>>581 推奨ってとこですかね。
>>584 あくまでサンプルなんで御容赦ください。
でもお気遣い感謝します。
まずい点あったら教えてくれと書いてるのに まずい点を指摘したら言い訳ってどーなんだ
>>585 ファイルストリームのクラス階層を確認してみるべき。
fstreamとifstreamは継承階層の中で関係が全く無い。
>>589 いや、質問の主眼が"taking address of temporary"のWARNINGでしたので。
その他は瑣末なことと手を抜いてしまいました。
とりあえずお詫びまで。
まあありゃ誰がどう見てもただの揚げ足取りだな
>>585 ちょっとややこしいけど、そのコードには、一般によくある勘違いにかすっている
君独自の勘違いがある。
まず、ifstreamはistreamを継承してる。fstreamは、iostreamを継承してる。
そのiostreamが、istreamとostreamを継承してるから、つまり両者に共通する近い祖先はistream。
iostreamはistreamの子だけど、fstreamはifstreamの子ではない。これが一般に良くある勘違い。
で、君はこれを踏まえて、fstreamにifstreamを渡すという、更なる勘違いをしてる。
読み書き両用クラス「が」読み取り専用クラス「の」子であるのは明白なわけで、つまり君は、
このセンスがまだ身についていないか、あるいは、普通に渡すだけでダウンキャストが可能になるという、
C++の仕様に対する勘違いをしていることになる。
std::cinをstd::ifstreamに渡しても問題なかですか?
std::istreamじゃイヤなのか? なぜ f が必要?
>>593 そんなくどい説明必要ない。
クラス階層見れば一発で分かる。
他人の勘違いまでも決め付けるなんて教えたがりも甚だしい。
>>596 現実に「クラス階層見てない」人なんだし、
他に可能性が無い状況は決めつけとは言わないよ。
変な理屈で変なスイッチ入っちゃった人に絡まれるのってやだなぁ。
using namespace std; は何かヘッダをincludeした後じゃないとだめなの?
書くだけならお好きにどうぞ
VCで先に書くとstdと認識してくれないのですが
makeファイルがLinux、Windows、Macを識別する方法を教えてください
602 :
デフォルトの名無しさん :2008/02/13(水) 15:46:10
>>600 これを機会にusing namespace std;をグローバルに置くのを
やめちまいなよ
どこに置くのが正解なのでしょうか? mainの中?
グローバルに置くのが正解
605 :
602 :2008/02/13(水) 16:00:48
>>603 いや、mainの中の先頭に置いても良いけど
スコープはmain内だけであってまぁ・・なんていうか・・・
using namespace std;の宣言自体を俺は勧めない
>>603 原則 using を使わず全部書くのが推奨だな
std::vector<int> hoge; 面倒でもこういう記法に慣れるが吉。
cout cin endlくらいはusing宣言したいな
(swap内で) using std::swap; using boost::swap; using 俺ライブラリ::swap; (definition内で) using namespace boost::spirit; これしか使ってないな
>>608 おれもそう思う。stdにいろいろ詰め込み過ぎだ。
::boost::mplを使うときに 専用の名前空間に放り込んでusing namespace ::boost::mpl;してから 共通名前空間にエイリアスとなるメタ関数を書くようにする ぐらいは許してください
専用名前空間って、それのためにしか使わないなら、 名前空間のエイリアスnamespace hoge = boost::mpl;で十分では? それに限らず、cppファイル内ではよくやるんだが。 namespace bll = boost::lambda; namespace algo = boost::algorithm; namespace dr = System::Drawing;
VC++のusing namespaceは壊れてるから 専用の名前空間でも使わない方がいいよ
std::mapから登録していないKeyつかって[]で取り出そうとすると 出来立てのValueが返ってきますか?
うん
_beginthreadでマルチスレッドで実行する関数って戻り値設定できないの?
617 :
デフォルトの名無しさん :2008/02/14(木) 03:53:29
くずたれの質問ですいません class内でのstaticメソドはどういう役割をするんでしょうか csharpやjavaだとわかるんですが C++でのstaticメソッドは、いまいち解りません どなたか解説お願いしていただけないでしょうか
>>616 _endthreadex()を使えば整数は返せる。
>>617 C#やJavaと同じだと思うんだけど。なんで違うと思うの?
win32が名前空間対応してくれればいいのに
621 :
デフォルトの名無しさん :2008/02/14(木) 10:06:21
vectorを初期化するときに、配列を初期化するみたいに、 vector<int> vec = {1,2,3,4,5,6}; みたいな書き方をする方法はありませんか?
>>621 その書き方は現行の C++ ではコンパイルできない。
「みたいな」という幅がどこまであるのかによっては、
似たような書き方ができることもあるけど。
623 :
デフォルトの名無しさん :2008/02/14(木) 10:22:11
batファイルで、処理の途中でキー入力を求められるとき どうすれば入力できますか? パスワード入力を自動的に行いたいのです。
誤爆してしまった… C/C++でGUIを実装する場合、どういった手段が適当でしょうか?(Windows環境) 色々調べてみたところ ・実際の職業プログラマさんなんかはC#やVB.NETみたいなのを使う ・WinAPIを直接、みたいなことは趣味でやる人が使う (山を登るのに、ロープウェイを使うのが賢いが趣味で山登りを楽しむ人がいるみたいな意味で) で、実際人に聞くと今度はMFCという意見が出てきました 調べるとWinAPIを糖衣したようなもののように感じたものの情報がすごく少ない と、こんな感じでして、どっちに進むべきか悩んでいます やりたいのはどっちだ、というのは手段と目的がryってやつでGUIの実装の手段をどうしたものか、という質問です C#/VB.NETというものも一応考慮のうちに入れておきたいです (GUIの実装はC/C++の枠を超えればそれがベターだから、という意見も考慮したいからです) それではよろしくお願いします
>実際の職業プログラマさんなんかはC#やVB.NETみたいなのを使う 業種にもよるけどMFC使ってる職業プログラマも多いよ むしろそっちの方が多いはず MFCの情報が少ないのは調べ方が悪いと思う
627 :
デフォルトの名無しさん :2008/02/14(木) 10:44:20
template <>の中にかけるのは、classと、typename、それにintだけですか?
>>627 type parameter
non-type parameter(intは可 現規格では幾つか制限アリ)
template template parameter(デフォルト引数は考慮されないことに注意)
の三つがOKだよ。
(例)
template<typename T>
template<int I>
template< template<typename, typename> class C >
template<class A, class B> void Foo( B b ){} という関数があったとき、使う側で Foo<int>( bar ); と引数から特定できない型のみを指定できるのは、 C++において正しい仕様なのでしょうか?VS2005では一応コンパイルが通る ようですが…
631 :
625 :2008/02/14(木) 11:05:33
>>626 なるほど・・どうにもうまく調べられないようで、ちょっと離れたプログラム関連の本が多い
書店へ行ったのですが、MFCについての本は独習シリーズを書いている方のものが1冊(古い)と
その他薄いものが何冊かしかありませんでした
それと合わせて情報が少なくマイナーなのかと思ってしまっていました
もうちょっとMFCについて調べてみます
というかそのプログラム関連書籍が多い書店を教えて欲しいw
池袋にあるジュンク堂ってとこです 大型書店何件か回ったけどあそこが群を抜いて多かったです
あそこいいね 立ち読み客のために椅子まで用意されてたし ちょっと前まで近所だったからよく行ってたよ
ただちょっと会計が面倒ですよね 一応MFCやってみようと思います、WinAPI知らないままで不安ですが独習シリーズの人の本買ってみようと思います ありがとうございました
今更MFC?…… 目的にも依るし、ここで続けるのもスレ違いだから詳しくは書かないけれど。
MFCはこれから落ち込んでいくんじゃないか?.NET系(C#とか)やるべきだと思うの俺だけ?
落ち込んでから.NETなり時代に沿ったものに切り替えればいい 目的にもよるけど
MFCはまあ、最初の枠組みやってくれるのだけあてにして使ったりするな。
641 :
デフォルトの名無しさん :2008/02/14(木) 13:28:04
サブスレッドがデータ更新した事を知るためにはwhileなどで繰り返しチェックする以外にどのような方法がありますか
>>635 その本は良書だしMFCを少しでも触ったことがあれば難しくはないが、
MFCの情報を探し出せないという検索の腕からいってもお前さんにその本はまだ早い。
というかMFCなんて仕事で必要でない限りは今更初心者が手を出すべきものでもない。
643 :
641 :2008/02/14(木) 13:32:48
イベントドリブンっていうのはきいたことあるのですが、BCBとかでは無い標準のC言語、C++でどうやるのかわかりません
>>641 Windowsならイベントオブジェクト、Unixなら条件変数
>>643 標準のC/C++にサブスレッドなんて概念は無いと思うが…
645 :
641 :2008/02/14(木) 14:02:49
サンクス
646 :
デフォルトの名無しさん :2008/02/14(木) 14:13:28
CreateEvent() の使い方がわからないので適当なSleepいれてwhileでチェックしようかと思うのですが CreateEvent()のほうが断然良いですか? たとえば500msとか、100msとか待ったとき CreateEvent()のほうが即時性とCPU負荷低いですか
やってみると、それ自体は簡単だからまずやってみろって。
断然良いです 即時性は高いです 負荷は100msも寝るなら大差ない
649 :
デフォルトの名無しさん :2008/02/14(木) 14:18:13
DLLにしたいんのですが、なるべく負荷を下げたいんです 一つのサブスレッドがデータを受信したらそれを知りたいのですが、間隔は2〜10秒くらいです whileで監視しても変わらないですか
少しでも下げたいならイベントオブジェクトの方がいいんじゃね 通知が来るまで寝っぱなしだし 100msごとに起きるよりは当然
651 :
デフォルトの名無しさん :2008/02/14(木) 14:22:04
初心者がわかる文書ありませんか
CreateEventの使い方なんか簡単だ。 HANDLE handle; handle = CreateEvent(NULL, FALSE, FALSE, NULL); これで良い。
winapiのメリットってなんでsか
ウィンドウプロシージャではよくswitchが使われていますが、 ifではなくswitchを使う理由みたいなものがあるんでしょうか?
>>655 ifでも書けるから、ためしにifで書いてごらん。
理由がわかると思うよ。
int main(void){ for(;;) return 0; } これのコンパイルが普通に通って(´・ω・`)?ってなってるんですが、 ぶら下がり文って次の行でなくても許されてるんですか?
空白文字(改行含む)はいくらあっても構わない形式なのです。
for (;;) return 0; って解釈されてるんだろ
>658-659 なるほど、どうもです。 同じ行か、次の行までしか許されないもんだと思いこんでました。
>>657 こんなのでも普通にコンパイル出来るよ
びっくり?
int main(
void){ for(
;
;) return
0;}
>>661 たぶん、そういうのはわかっちゃいるけど、「ついなんとなく」
ぶら下がり文に対してだけ異なる感覚を持ってしまったんだろう。
p r i n t f ( " t e s t \n " ); でもこれは通らないんだね(´・ω・`)
664 :
641 :2008/02/14(木) 15:02:00
サンクス できましたよ #include <iostream> #include <windows.h> #include <process.h> using namespace std; HANDLE handle; unsigned WINAPI fnc(void *x){ int n=(int)x,m; m=3000-n*300; Sleep(m); cout<<n<<"ban "<<m<<"msec Sleep\n\n"; SetEvent(handle);} main(){ handle = CreateEvent(NULL, FALSE, FALSE, NULL); for(int n=0;n<10;n++){ _beginthreadex(NULL, 0, fnc, (void*)n, 0 ,NULL);} while(1){ WaitForSingleObject(handle, INFINITE); cout<<"main reep ga ugoita\n"; }}
>>656 if(○○ == WM_xxx)
○○ ==の部分を毎回書かなければいけない事くらいしか思い当たりません。
その代わりbreak(もしくはreturn)がいらないので記述ミスが減るかなぁと。
と書いているうちに一つ思い浮かんだのが、breakを挟まないことで
case WM_CREATE:
〜処理1〜
case WM_PAINT:
〜処理2〜
break
WM_CREATEがきたときは処理1,処理2をどちらも行うという事が出来ますね。
これがswitchを使う理由ですか?
>>665 そもそもswitch文の存在理由を考えてみるといいかと
およそほとんどのswitch文はif文で書けるわけだし、
C言語のswitch文って要らないよね、ってのは、
それはそれでひとつの考え方だが…
ぶっちゃけswitchでできることはみんなif-elseでできるし、 while、do-whileでできることはみんなforでできる。 選ぶ基準はどっちが見やすいか、書きやすいか。
>>668 ありがとうございます。安心して使うことができます。
店で売ってるソフトって大半がMFC製じゃないの?
671 :
デフォルトの名無しさん :2008/02/14(木) 18:49:22
wchar_tの文字列をcharの文字列に変換したいのですが char buf[256]; wchar_t wbuf[] = _T("Test123あいうアイウ"); int c; setlocale(LC_ALL,"ja"); wcstombs_s(&c,buf,256,wbuf,256); ではwbufに入っている「Test123」までがbufにコピーされ、それ以降は無視されているようです。 理由を教えていただけませんか?
変換できないワイド文字が検出されたのでその直前で変換を打ち切った
"ja"がロケール文字列として有効なのか怪しいな。 単にsetlocale(LC_ALL, "");で試してみたら? あと、本当のワイド文字列リテラルに_Tは使うな。直接L付けろ。 wchar_t wbuf[] = L"Test123あいうアイウ";
Windows だったら setlocale(LC_ALL, "japanese"); だったと思う
WCHAR
676 :
デフォルトの名無しさん :2008/02/14(木) 21:13:33
>>672-675 ありがとうございます
setlocale(LC_ALL, "japanese");
で解決しました。
677 :
デフォルトの名無しさん :2008/02/14(木) 22:00:06
ttp://www.uploda.org/uporg1251163.zip.html (展開時9.7KB程度)
Windowsゲーム向けタイマクラスを作ってみたんですが
(1/60秒休んで累積の休憩時間からfpsや簡易CPU率を取得する機能)
どうにも少しでも負荷がかかるとWindowsタスクマネージャで見てると
まだまだCPUが余裕な割に53fpsくらいに落ち込んでしまいます。
もうすこし改良したいと思うのですが、どこか改良の余地はありますでしょうか?
タイマーをパワーアップ
>>677 あまり詳しく見てないけど、
Sleepが1/60秒以上帰ってこないことが7回/秒あったら53fpsになるのかな?
Sleepの精度なんてそんなもんだし。
理論値どおりに増加するフレームカウンタを作り、
実際に処理できたフレーム数がそれに追いついたら休む、
追いつくまでは休まず連続して何フレームでも処理する、
とすれば、平均のfpsは理論値と合う。
>>679 「どうしても追い付けなければスキップすることも辞さない」も入れとくべきではないか?
バイナリファイルについての質問です。 とあるバイナリファイルの中に、12ビット単位でひとつの要素となるデータが99バイト分入っています。 これを3バイトずつファイルから読み出して12ビット単位で区切り、short型に変換して 再度バイナリファイルに書き出したいと思っています。 この場合、バイナリモードでファイルを開いて、char data[3]にread関数で3バイト格納しても シフト演算子が使えないため、上手く12ビット単位でデータを取得することができません。 何か良い案ないでしょうか?
>>683 「シフト演算子が使えない」と思い込む根拠は?
まぁ、環境依存上等でビットフィールドを使うか、自前でビット演算するかの違いだけどね。
やり方は色々あるけど、とりあえず3byte読んでから4byteの整数に格納sすれば?
>>683 short a1 = (unsigned short)data[0] << 4 | (unsigned short)data[1] >> 4; // 前半12bit
short a2 = (unsigned short)data[1] << 8 | (unsigned short)data[2]; // 後半12bit
これでだめかや?
訂正 short a1 = (unsigned short)data[0] << 4 | (unsigned short)data[1] >> 4; // 前半12bit short a2 = (unsigned short)(data[1] & 0x0f) << 8 | (unsigned short)data[2]; // 後半12bit
a1とa2もunsigned shortでいいと思う。 俺の個人的嗜好だけど。
a1, a2はunsigned shortにすべきだな。 それはそうと、 a1 <- data[0].u data[0].l data[1].u a2 <- data[1].l data[2].u data[2].l って並びなのかな。 a1 <- data[1].l data[0].u data[0].l a2 <- data[2].u data[2].l data[1].u って並びの可能性もありそうだが。
690 :
デフォルトの名無しさん :2008/02/15(金) 01:47:13
VC++のインラインアセンブラで64bitの整数の掛算(UInt32x32To64のような物)をやりたい訳ですが どのようにすれば良いのでしょうか。 32bitなら以下で良いみたいですが64bitのやり方がわからず・・・。 int mul(int a, int b) { _asm{ mov eax, a mov ebx, b mul eax, ebx } }
>>685 〜688
お〜なるほど、とても助かりました。
シフト演算が使えないと言ったのは自分の知識不足です。
3バイトのデータを一気にシフト演算しようとしていました。
上手くいきました。ありがとうございます。
解決したと思ったら、もう一個質問ができました。すいませんが、こちらもお願いします。 読み込んできたデータを次の関数で共用体に格納して、bit単位でいじってるんですが、どうも上手くとれません。 いろいろ省略していますが、以下のような感じです。 テストデータ(バイナリ) 11111111 11111111 11111111 共用体 union UNION{ unsinged char data[3]; struct { unsinged short element1 : 8; unsinged short element2 : 3; unsinged short element3 : 5; unsinged short element4 : 1; unsinged short element5 : 7; }FILED; } 処理 UNION A; read (fd , A.data , 3): printf("%d\n" , A.FILED.elemnt1); ←255が出力される printf("%d\n" , A.FILED.elemnt2); ←7が出力される printf("%d\n" , A.FILED.elemnt3); ←31が出力される printf("%d\n" , A.FILED.elemnt4); ←何故か0が出力される printf("%d\n" , A.FILED.elemnt5); ←127が表示される 4番目の要素が1と表示されるません。 これはなんででしょう?
unionの使い方間違えてないか?
>>690 64ビットの値を返すときは、EDX:EAX。
こんな関数をコンパイルさせたら、
long long mul(int a, int b)
{
return static_cast<long long>(a, b);
}
こんな出力だった。
; Line 3
mov eax, DWORD PTR _a$[esp-4]
imul DWORD PTR _b$[esp-4]
; Line 4
ret 0
>>692 試しに、printf("%u\n", A.FILED.element4)にしてみたら?
>>693 適切かどうかは兎も角、間違ってはいないんじゃないか?
696 :
692 :2008/02/15(金) 02:19:25
>>695 上手くいってないような雰囲気です。
どっか自分が処理を間違えているかもしれないので、
原因を探してみます。
手元のgccだとちゃんと1になるけどなぁ。
698 :
デフォルトの名無しさん :2008/02/15(金) 02:47:14
>>694 上位32bitがEDXに格納されるのは解りました。
それをどうやってUINT64の変数に代入するのでしょうか。
一応、以下みたく物凄く邪道な感じでやってみたり・・・
UINT64 mul64(UINT a, UINT b)
{
FILETIME c;
_asm {
mov eax, a
mul b
mov c.dwHighDateTime, edx //mov dword ptr [ebp-8],eax
mov c.dwLowDateTime, eax //mov dword ptr [ebp-4],edx
}
return *(UINT64*)&c;
}
>mov dword ptr [ebp-8],eax
>mov dword ptr [ebp-4],edx
のインラインアセンブラでの正しい記述方法が解らないです。
>>698 C側で対処するならこんなんとか。
union {
struct {
uint32 l;
uint32 h;
} s;
uint64 w;
} c;
_asm {
mov c.s.l, eax
mov c.s.h, edx
}
return c.w;
これでいいよ。 __declspec(naked) UINT64 __cdecl mul64(UINT a, UINT b) { _asm { mov eax, a mul b ret } }
701 :
デフォルトの名無しさん :2008/02/15(金) 03:29:18
>>699 なるほど、適当に構造体定義してやればいいのか。
>>700 これは警告も出ないしスマートだし関数でやるならこちらが良いですね。
解決です。ありがとうございました。
>>681 ありがとうございます。C++はCの標準関数+これらが使えるのね
こんな感じでも行ける UINT64 res; _asm { mov eax, a mul b mov dword ptr[res], eax mov dword ptr[res+4], edx } return res;
704 :
デフォルトの名無しさん :2008/02/15(金) 14:36:08
DLLから要求があるまで動作を停止したいのですが、どのようにしたらいいんでしょうか? メインのグローバルハンドルを共有出来ないですよね?
>>704 環境とやりたいことを具体的に。どうせ、Windowsだろうけど。
706 :
デフォルトの名無しさん :2008/02/15(金) 15:33:29
すみません 似たような質問なんですが WaitForSingleObject( HANDLE hHandle, // オブジェクトのハンドル DWORD dwMilliseconds // タイムアウト時間 ); ってHANDLEがNULLになるまで待つんですか?どういう価でうごくか教えて下さい
hHandleがシグナル状態になるか、タイムアウトになるまで待つ。 シグナル状態は、そのhHandleが何かによって変わる。 CreateEventしたやつならSetEventしたやつ、とかね。
>>706 もしそれが、WinAPIのWaitForSingleObjectならば>707。
詳しくは、MSDNかAPIスレへ。
もしそうでないなら、環境を提示すること。
709 :
デフォルトの名無しさん :2008/02/15(金) 16:13:48
サンクス
710 :
デフォルトの名無しさん :2008/02/15(金) 20:52:12
HTMLの文字コードをS-jisにしたいのですが、インターネットエクスプローラで読み込んでS-Jisで書きだというのをC言語でできませんか
711 :
デフォルトの名無しさん :2008/02/15(金) 20:53:50
文書全体をS-jisに変換してタグを書き換えるというのでは正しく表されないことが多いです インターネットエクスプローラは変換精度が高いです
すいません、質問があります。 { A a; B b; } と二つのクラスを確保したとき、デストラクタの呼ばれる順番というのは仕様で 定められているのでしょうか?それとも不定なのでしょうか? よろしくお願いします。
デストラクタは、コンストラクタが呼び出されたの全く逆の順で呼ばれる。
714 :
デフォルトの名無しさん :2008/02/15(金) 21:23:44
すいません。1次元固定配列をを積み重ねて、 2次の動的配列にしたいのですが。 data[4]固定 data[4] data[4] ↓ 動的 typedef std::vector<int> Four; std::vector<Four> data; にすれば確かに動作するのですが、 これでは両方1次も2次も動的です。 よそのスレで typedef int Fou[4]; std::vector<Four> data; とすればいいと言われましたが スレ違いでこれ以上尋ねるわけにも行かずこちらへ 来ました。 Four four; for(i=0; i<5; i++){ for(j=0; j<4; j++){ four[j]=j; } data.push_back(????); } ここの????の書き方が分かりません。 よろしくお願いします。
>>713 すばやい回答ありがとうございます。継承の時と同じなのですね。
716 :
デフォルトの名無しさん :2008/02/15(金) 21:31:00
>714 すいません、コピーがうまくいきませんでした。 書き込みがTABを上手いこと反映してくれないみたいですね。
>>714 push_back は無理。
構造体にするならいける。
struct Four { int four[4]; };
boost::array<int, 4>ってvectorの要素にできない?
できる
721 :
デフォルトの名無しさん :2008/02/15(金) 23:03:34
関数の中でたまにでてくる参照引数 (int & みたいな・・) ってどういうとき使うんですか?? 複数の関数内で1つの変数を使いたいときとかですか?
>>721 ・ 呼び出し元の変数の値を変更したい時
・ 巨大なオブジェクトをコピーせずに関数に渡したい時
//身長を整数値として読み込んで標準体重を実数で表示 #include <stdio.h> int main() { int na; int weight; printf("身長を入力してくれ:"); scanf("%d", &na); weight = (na - 100) * 0.9; printf("標準体重は%4.1f Kg", weight); return 0; } これを実行しても標準体重が0.0 Kgになるんだけどどこを改善すればいいのでしょうか?
>>724 ×int weight;
○float weight;
>>724 そのコードでちゃんと警告を出してくれるコンパイラに換えるか、そのように設定する。
>>725-726 こんなのも分からん馬鹿でサーセン。cygwin使ってるんだけどロクに設定もできていないもんでして。
ありがとうございます。
△float weight; ○double weight;
gcc -ansi -pedantic -Wall オススメ
寧ろ、gcc -std=c99 -Wall -pedantic で。
732 :
デフォルトの名無しさん :2008/02/15(金) 23:59:03
>718 構造体にしたらできました。 ありがとうございます。
733 :
デフォルトの名無しさん :2008/02/16(土) 00:01:46
>719 boost::array自体が定義できないけど、必要なヘッダファイルとか あったら教えてください。 VC6.0を使っています。
VC6 でコンパイルできるかなあ。 まあ array くらいならできるか。
環境ってMicrosoft Visual C++ 6.0って書けば分かる?
考えてある程度予想してみたんですが、この考えで合ってますか? 質問大量ですみませんが (1)char *p="aaaaaaaaaaaaaaaaaaaaaaaaaaaa";やc="aaaaaaaaaaaaaaaaaaaaaaaaaaaa" ↑ポインタってアドレスを格納するのに何で文字列を入れれるの? これはどこのアドレスを入れてるの? 自動的に領域を確保して"aaaaaaaaaaaaaaaaaaaaaaaaaaaa"を入れてそのアドレスを入れてるってことですか? もしそうだとしたら、関数内で宣言してその関数からでた場合はその領域は開放されるんでしょうか? (2)cout<<sizeof(c)<<endl;とした場合4になる どうみてもaは5つ以上あるのになんで4なの? これはchar *pのサイズ(参照するアドレスを入れる領域のサイズ)だからですか? ちなみにstrlenだと35でした。 (3)sprintf(c,"aaaaaaaaaaaaaaaa");や strcpy(c,"aaaaaaaaaaaaaaaa");でコンパイルして実行するとエラー これは確保されていない領域に無理矢理文字列を突っ込もうとしてるからですか?
738 :
737 :2008/02/16(土) 04:07:15
ごめんなさい間違えました。cを全部pとして考えてください ついでに言うと(1)の2つめはこんなの char *p; p="aaaaaaaaaaaaaaaaaaaaaaaaaaaa";
文字列リテラル(" " で囲んでるやつ)は、 その文字列の置いてあるアドレスを返す。
ありがとうございます。ということは プログラム起動した時点でa〜zや日本語,記号の全ての文字がメモリのどこかに 自動的に置かれるってことですか? それとも"aaaa"の部分を実行した時点で文字列"aaaa"がメモリに置かれる?
起動した時点で置かれてる。
起動した時点で、"aaaa" が置かれる、ね。
>>741-742 ありがとうございます。今まで知らずに使ってきました。
ずっと気になってたので教えてもらえてスッキリした
744 :
デフォルトの名無しさん :2008/02/16(土) 08:26:22
>735 げ、自分でコンパイルするのか。 c++標準なのかと思った。
>>744 Boostは事実上の準標準。
一部のライブラリ以外はヘッダのincludeのみで使える。
>>737 > (3) sprintf(c,"aaaaaaaaaaaaaaaa");や strcpy(c,"aaaaaaaaaaaaaaaa");
> でコンパイルして実行するとエラー
> これは確保されていない領域に無理矢理文字列を突っ込もうとしてるからですか?
違う。
領域は確保されているが、文字列を突っ込めない (要は、書けない) 領域だから。
エラーになるかどうかは環境によって異なる。
素直に書き換わる環境もあるし、単に書き換わらないだけとか、全然別の場所の
文字列が勝手に書き換わるとかすることもある。
要するに、文字列の領域を書き換えるのは基本的にやってはいけない。
>>741-742 規格でそんなこと決まってたっけ?
>>746 staticな変数と同じ寿命に決まっている。
748 :
デフォルトの名無しさん :2008/02/16(土) 09:39:06
HTMLファイルの構文を解析して、UTF8形式をS-JIS形式に変換するにはどうすればいいですか?
750 :
748 :2008/02/16(土) 09:41:44
インターネットエクスプローラで読み込んで、S-jisで保存するのをプログラムでやりたいんです
751 :
748 :2008/02/16(土) 09:43:06
>>749 すみません よんでませんでした
NKFはやったのですが、エンコード属性が指定されていたりして、文字化けしてしまいます
タグを解析する必要があるんです
>>747 そもそも static な変数の寿命なんて決まってたっけ?
例えば、自動変数の寿命ははブロックに入った時から出るまでじゃないだろ。
利用されている区間がかぶらないとわかれば、違う変数を同じレジスタに割り
当てるコンパイラは珍しくない。
それと同じで、利用されてる区間がかぶらない static 変数を同じ領域に割り
当てちゃいかんのか?
753 :
デフォルトの名無しさん :2008/02/16(土) 10:08:02
インターネットエクスプローラの名前をつけて保存 (エンコード指定) だけを利用するには どうすればいいですか?
>>752 のいう同じ領域っていうのは物理メモリの領域を指してるの?
>>753 「IEコンポーネント」で調べてみては?
756 :
デフォルトの名無しさん :2008/02/16(土) 10:52:38
>>753 HTMLの解析とコード変換はMSXMLとADODBを使えばできるがお前には無理。
757 :
デフォルトの名無しさん :2008/02/16(土) 10:55:58
インクルードファイルだけ入れて boost::array<int,4> d; std::vector<d> data; と定義だけはエラーが出ないのはいいのですが 実際はどのように使えばいいのでしょうか。 d[0]=0; d[1]=1; d[2]=2; d[3]=3; data.push_back(d); //この部分がエラー としてもコンパイルエラーが出ます。
758 :
デフォルトの名無しさん :2008/02/16(土) 11:06:03
>757 すいません。できました。別に原因があったようです。
#include <stdio.h> class Test{ public: static int ary[4]; }; int Test::ary[] = {0,1,2,3}; int main(){ printf("%d\n", Test::ary[2]); } すみません。上記のように1次元配列だと初期化できるのですが 2次元配列にするとどう記述しても初期化できません。 例えば static int ary[2][4]; }; int Test::ary[] = {0,1,2,3, 5,6,7,8}; にすると error C2040: 'ary' : 'int []' は 'int [2][4]' と間接操作のレベルが異なります。 となりますし 多次元配列のメンバ変数を初期化する方法はないものでしょうか?
>>759 int Test::ary[] = {0,1,2,3, 5,6,7,8};
これはおかしいよ。
int Test::ary[2][4] = { { 0,1,2,3 }, {5,6,7,8} };
とかじゃないの?
>>760 有難うございます。上手くいきました。
int Test::ary = { { 0,1,2,3 }, {5,6,7,8} };
や
int Test::ary[][] = { { 0,1,2,3 }, {5,6,7,8} };
や
int Test::ary[0][0] = { { 0,1,2,3 }, {5,6,7,8} };
で試してみて上手くいかなかったのでどうやるのかと思っていました。
[2][4]と書けば良かったのですね。
>>752 厳密には寿命と記憶期間は別物だが、
大抵の人は普段は記憶期間の意味で寿命という言葉を使う。
記憶期間なんて言う俺俺用語を語られても...
記憶域期間だった
auto_ptrについて質問です。 以下のコードを実行したとき、throw(A)のあとで TTestクラスのデストラクタが呼び出されると思っていたのですが呼び出されません。 auto_ptrってこういうものなのでしょうか? TTest* TTest::NewL() { std::auto_ptr<TTest> self(new TTest()); throw 1; // A return self.release(); }
例外を投げた際、デストラクタが呼ばれるのは例外が捕捉された時。 例外が捕捉されなければ呼ばれないかもしれない(環境依存)。 auto_ptr の問題じゃなくて、C++ の仕様の問題。
768 :
765 :2008/02/16(土) 12:53:01
すみません、catchしたかどうかが重要とは知らず書いてませんでしたが、catchはしています。 ちなみに、std::auto_ptrの部分を自作のsmart_ptr(スマートポインタの解説サイトを参考に作成) にした場合はきちんとデストラクタが呼ばれました。 コンパイラはBorland C++ Compiler 5.82 なのですが、これのauto_ptrがポンコツなのかも…
memory ヘッダの中を読んでみたら?
とりあえず gcc だと呼ばれる。
771 :
765 :2008/02/16(土) 13:12:49
う〜ん、中身見てみましたがおかしいと思えるところは見つからず… auto_ptrのソースをちょこっと改造して試したところauto_ptrのデストラクタ自体が呼ばれてないようでした。 ただ、gccだと正常に呼ばれるとのことなのでBCCが悪いということで解決します。 どうも、ありがとうございました。
BCC の「どこが」悪いかちゃんと調べないと、 他の所でも沢山困る所があるかもしれないぜ。
とりあえず俺がチェックに使ったコード。 どう表示される? #include <iostream> #include <memory> class Test { public: Test(int n) : n(n) { } ~Test() { std::cout << "~Test(" << n << ")" << std::endl; } static Test* New() { Test test1(1); std::auto_ptr<Test> test2(new Test(2)); throw 1; return NULL; } private: int n; }; int main() { try { Test* test = Test::New(); test = test; } catch(int n) { std::cout << "catch" << std::endl; } return 0; }
>>773 BCCで試したところ、以下のように表示されました。
やはりtest2が削除されないようです。
~Test(1)
catch
>>772 確かに…引き続き調査はしてみます。
memory をいじってコンストラクタで文字列表示するようにして、 それが表示されるかチェックしてみれ。
776 :
デフォルトの名無しさん :2008/02/16(土) 13:56:28
HTMLファイルの構文を解析して、UTF8形式をS-JIS形式に変換するソースありますか
>>752 staticな変数の生存期間はそのプログラムが起動されてから終了されるまで。
絶対に外部から参照される恐れが無い場合でもなければ、使い回しはできない。
例えば、strtok()やlocaltime()は内部のstaticな領域を返すように実装されていることが多い。
従って、その関数を呼び出した先で参照する可能性があるからコンパイラはこれを取り除くことができない。
> 絶対に外部から参照される恐れが無い場合でもなければ そのときの話をしてるんだが? アドレス取られたら削除できないのはあたりまえ。 また、絶対に外部から参照されないケースなんてほとんどないので、 大概の実装ではそんな最適化をしていないと思う。 問題にしているのは、規格としてそう言うことをしていいかどうか だよ。
>>779 規格を云々したいのなら折角そういうスレがあるんだからそちらへどうぞ。
異なるオブジェクトは異なるアドレスを持たないという規定がなかったかな? 仮にあったとしても、779の状況では、 プログラム上から異なるアドレスであることを確かめるすべはないと思うけど。
とりあえず、同じ内容の文字列リテラルが複数箇所に書かれた場合、 それらは同じアドレスに置いても構わない。 また、"abc" というのと "bc" というのがあった場合、 "bc" のアドレスが "abc" + 1 であっても構わない。
783 :
デフォルトの名無しさん :2008/02/16(土) 18:00:20
struct f_point{ float x, y; }; f_point square[4]; // 正方形の頂点が入る for(float angle=0;angle<PI*2;angle+=PI/16){ ... } 構造体squareに正方形の頂点4点の平面座標が入るとして、 その正方形の中心を軸に回転させるには forの中でどういう風に書けばよいでしょうか?
そういう扱い方するんだったら、 正方形を中心と、どれか1つの頂点の角度とで扱えばいいんじゃね?
>>783 宿題スレでもいけばいいんじゃね?解答もらえるよ
x, yをx + y iの複素数とみなして
cosθ + i sinθを掛けた値の実部と虚部を取る
計算を行うようにするとか
x * cosθ-y * sinθ, x * sinθ+y * cosθ
になるんじゃなかったかな多分
786 :
デフォルトの名無しさん :2008/02/16(土) 18:15:37
中心px,py 半径r 角度θ x度回転するには、σ(n) = θ + (x+90n) *π/360 px + r cosσ(n) , py r sinσ(n)に変換する
ループ変数に float 使うなよ・・・。 誤差で境界条件が重い通りにならないかもしれないんだから。
×構造体square ○構造体f_pointの配列square つ[アフィン変換]
(原点ずらす移動の変換行列) × (回転行列) × (原点戻す移動の変換行列) をかければいいんだろ
境界条件っつーと、微分方程式の特種解を決定する物を思い浮かべてしまう なんかビミョーな違和感
// オレ言語ならこれで逝けるぜw f_point center = average(square, square + 4); for (int angle = 0; angle <= 360; ++angle) { for (int ic = 0; ic < 4; ++ic) { print ([square[ic].x square[ic].y] - [center.x center.y]) * [cos(angle * rad) sin(angle * rad); -sin(angle * rad) cos(angle * rad)] + [center.x center.y]; } } // 要は、正方形の中心が原点になるように移動して、回転してから再び移動(≒>789)
>>785 ほんとごめんなさい、よく読んでませんでした
原点中心回転してました
793 :
デフォルトの名無しさん :2008/02/16(土) 19:51:23
文字列で入力された char a ; を、関数の中で数値に変換して int a ; にしたいんだ 同じ変数名aなんだけど char → int ってできますか?(´`)
スクリプト言語を使った方が幸せになれそうな予感
>>793 それだと1文字だろうし最初からintで受け取ればいい
>>793 文字とか文字列を数値にしたいとかじゃなくて
char型変数を名前そのままにint型変数に変えたいんだな?無理です
797 :
783 :2008/02/16(土) 20:04:07
>>784-792 ありがとうございます。無事できました。
float fCenterX = ( x1 + x2 ) / 2;
float fCenterY = ( y1 + y2 ) / 2;
float fR = ( float )hypot( fCenterX - x1, fCenterY - y1 );
float fX[] = { x1, x2, x1, x2 };
float fY[] = { y1, y1, y2, y2 };
float fA_[] = { 7, 5, 1, 3 };
for( int i = 0; i < 4; i++ ){
fX[ i ] = fCenterX - fR * cos( fAngle + D3DX_PI / 4 * fA_[ i ] );
fY[ i ] = fCenterY + fR * sin( fAngle + D3DX_PI / 4 * fA_[ i ] );
}
VisualStudio2008買いました。 重くなるかな?と思ったら、逆に軽くなりましたねw やっぱVistaとVS2005との相性が悪かったんでしょうか。 感激です。
はぁ?相性だぁ?
>>798 単純に2005より最適化されて軽くなっただけ
801 :
デフォルトの名無しさん :2008/02/16(土) 22:39:14
C++クラスのstaticについて質問です。 親クラスに作ったstatic変数は、 全子クラスで共有するのでしょうか? それとも、各子クラスに一つずつ、 オーバーライドした同名のstatic変数ができるのでしょうか? それとも、static変数は継承できず、 各子クラスで同名のstatic変数を宣言しなければいけないのでしょうか?
実験すればいい。 その結果の通りだ。
803 :
801 :2008/02/16(土) 22:53:37
確かに。。。 めんどくさくて質問してしまいました。すいません。 試してみます。
>>801 その中では全子クラスに共有というのが一番近いが、
正確には親クラスにしか存在しない。
ただし、protectedやpublicなら子クラスからでもアクセスできる。
実験してこうなったけど、これって規格通りなのですか? という質問なら良し。
806 :
デフォルトの名無しさん :2008/02/16(土) 22:58:58
807 :
801 :2008/02/16(土) 23:02:26
>>803 ありがとうございます。
具体的に何をやりたかったかというと、
各子クラスのstatic変数にアクセスするstatic関数を、
親クラスに作りたかったのです。
static変数は各子クラス別々のものを使うけど、
それに対して行う処理は全子クラスで共通だったので。
何か想像付かない処理だ。 本当にその実装方法しか無いんけ? static 変数は基本的には再利用性を阻害する癌のような物だから、 ないならないで済むのが一番いいのだが。 まあ、使い勝手と天秤にかけたら static 変数に軍配が上がることもあるけど。
CRTPと言って、親をクラステンプレートにするという手がある。ATLがよく使っている。 template<typename T> class Base { //T::Hogeを使う。 }; class Derived : public Base<Derived> { public: static const int Hoge = 10; };
810 :
801 :2008/02/16(土) 23:22:31
>>808 説明しづらいのですが、
シューティングゲームで、敵ユニットを表すクラスを作っています。
まず親クラスUnitがあって、敵の種類ごとにUnitを継承したクラスを作っています。
敵一匹がUnitのインスタンスになるのですが、
ユニットに使う画像はインスタンスごとに持っている必要は無く、
ユニットの種類ごとにあればいいので、Unit各子クラスのstatic変数にしてます。
だけど、その画像に対して行う処理は、
敵の種類に関わらず全クラス共通なので、親クラスのUnitに作りたい。
そんな感じです。
C++も、ゲーム作るのも初めてなので、
もっといい実装方法案があったら、教えてもらえると嬉しいです。
>>810 とりあえず一旦動くところまで組み上げてしまうんだ
どんなにソースコードが汚くなろうとも
その後で、こうしているんですが
もっと良い方法はありませんか?
と質問するヨロシ
それなら static 変数でもいいかもしんないけど、 画像が要らなくなった時に破棄したくなったとき少し面倒かもね。 俺なら敵ユニット作成クラスと画像管理クラスを作るかな。 でも、とりあえずそれで組んでみてもいいんじゃね。
お聞きしたいのですが 参考書に array[index]の結果は*((array)+(index))と同じなので char ch = p[3]; と char ch = 3[p]; (pはポインタ) は、同じ処理だと書いてあったのですが、データ型がintの場合は3が12バイト分になってdoubleの場合は3が24バイト分になるはずなので 一概に「3+pに格納されてるアドレスの数値」って言えない気がしたのですが何か考え方が間違っているのでしょうか?
*(p+3) と *(3+p) で結果が違うわけなかろう
>>813 ポインタとアドレスは違う(似ているからややこしいが)
char a[2];
double b[2];
printf("%p %p\n", &a[0], &a[1]);
printf("%p %p\n", &b[0], &b[1]);
例えば p の示すアドレスが 0xb1832100 の時、 p が char* なら p + 3 は 0xb1832103 に、 p が int* (int は4バイトとする)なら p + 3 は 0xb183210c に、 p が double* (double は8バイトとする)なら p + 3 は 0xb1832118 になる。 だから、一概にそう言える。
817 :
801 :2008/02/16(土) 23:41:36
>>809 ありがとうございます。
テンプレートというのは知りませんでしたが、使えそうな気がします。
>>811 確かにそうですね。
後から実装を作り替えるのは手間ですが、
実際動くと、モチベーション上がりますよね。
>>812 画像破棄用の全画像リストは、ユニットとは別に作ってます。
ユニットは敵の種類ごとに画像をロードすると同時に、
画像マスターリストにロードした画像を登録して、一括で破棄してます。
>>817 なるほど。
あと、ある敵ユニットから派生して新しい敵を作りたい時に困るかもね。
そういうことがあるかどうか、だが。
画像オブジェクトへの参照のようなもの、
あるいは画像リストのインデックスのようなものを保持させるなら、
ユニットごとにそういう情報を持っていたのでも
大した容量圧迫にはならないと思う。
819 :
813 :2008/02/16(土) 23:49:56
そーか、ポインタ=アドレス みたいに考えてしまっていました。 腑に落ちました。ありがとうございましたm(_ _)m
>>812 static変数の初期化は各子Unitじゃなくて、別の何か(親Unit?)がしてるの?もしそうなら
設計ミスだと思うよ。
それじゃstatic変数をグローバル変数として使ってるのとかわりがない。
static変数の初期化は子Unitが行うべき。
ところで
>各子クラスのstatic変数にアクセスするstatic関数を、
これがイメージできないんだけど、具体的に何をする関数を作りたかったの?
parentStaticFunction( childStaticImage );
みたいな感じで子Unitが呼び出しちゃダメなの?
画像管理クラスに対する処理にはできないものなのかな。 あるいは仮想関数にするか。
WIN32 APIのSetROP2と同じ様な機能を持つ、CarbonAPIをご存じの方いませんか? 開発環境:Winは.net2002 + SDK, MacはCordWarrier pro 5 + Carbonです。
823 :
822 :2008/02/17(日) 00:15:40
使用言語はCです。
824 :
801 :2008/02/17(日) 00:18:43
>>818 ユニットクラスが持ってるのは画像のポインタなので、容量はたいしたことないと思いますが、
大量に敵が出るので、オブジェクトごとにそれを作る負荷がどんなもんか想像つかなくて、
なるべく共有できるものは共有しようと思いました。
>>820 初期化はちゃんと各子Unitでやってます。
>parentStaticFunction( childStaticImage );
これはできます。
今までJavaしかやったことなくて、決まりきった引数を指定するのが嫌だったのです。
神経質ですいません。
でも、割り切ってこれが一番現実的でいいかもしれませんね。
>>821 >画像管理クラスに対する処理
ありがとうございます。
難しそうですが、それは一考の価値があるかも。
敵の大量具合によるんじゃないか? 1億体出るなら馬鹿にできないし
ごめん、JavaこそparentStaticFunction(childStaticImage); のようなことをするしかない気がするんだけど。
ポインタなんて大抵4バイトだし、 敵5000体出した所でたった20キロバイト。 これ以上敵を出そうとしても処理落ちひどくて無理だでよ(5000体でもキツいだろう)。 誤差の範囲だ。
829 :
801 :2008/02/17(日) 00:29:38
>>825 >1億体
出ませんw 最大でも1500くらい。
>>826 そういえばJavaでstatic変数をオーバーライドなんてやったことなかったですw
Javaに比べて、C++とWin32APIは引数が多くて嫌だなと、なんとなく思ってただけです。
すげー悩んで試行錯誤しながら、今の形になってきたんですが、
要件を聞いただけで、ぱっと思いつくなってみんな凄いですね。
破棄のための画像管理クラスなんて最初全然考えてなくて、後から作りました。
830 :
822 :2008/02/17(日) 00:58:39
>>828 PenModeの8つのモードすべてで試したのですが駄目でした。私もPenModeだと思ったんですが。。。
SetROP2のように前景モードで動作するのではなく、GrafPort自体に描画しているようです。
Carbonを使い始めて2ヶ月程度なので、間違いがあったらごめんなさい。
>>830 んー。前景と背景の合成方法を設定するAPIだから、やってることは同じだと思うけどね。
PenModeは現在のGrafPortに対して作用するんで、SetPortPenModeでポートを指定したらどうかな。
もうやってるかもしれないけど。
俺はCocoaな人なので、あんまり力になれなくてすまん。新・mac板の方が詳しい人いるかもね。
832 :
822 :2008/02/17(日) 12:07:03
>>831 書いてなかったけど、ラバー バンディングを実行したくて行き詰まってしまいました。
マウスをドラッグしている間、直前に描かれた線を上書きで消して新しいPointに対する
線を描くという動作なんですが、最後にInvalWindowRectするとエンティティ自体は
正常に描かれます。エンティティ自体を移動させても余計に描画された線は消えます。
長くなって済みません。Macの開発環境がまだ自宅にないので明日会社でSetPortPenMode
を適用してみます。ありがとうございました。
1999/12/31 23:59:59 2008/02/17 11:53:59 みたいな日付をint型もしくはunsigned int型にしたいのですがどうすればいいのでしょうか? 秒に変換する事も考えましたが2008*365*24*60*60だとintに収まり切りません。 そのまま文字列で保存すればいいかもしれませんが、 この値をstlのmapのキーにしてソート等を行いたいので文字列だと遅そうなのでint型にしたいです。 スレ違いかもしれませんが何か良い方法があれば教えてください。 お願いします。
もろ環境依存だけど、__int64とか使えればそのまま入れられるんじゃないかな
区切り文字をあり得ない数字の連続に置き換えるとか
>>833 年だけ別にしたら?
struct Date
すまん送信ミス。 struct Date { unsigned int year; unsigned int sec; }; みたいに。
>>837 それをそのまま使おうとしてmapで使えないと質問しにくるとみた
839 :
833 :2008/02/17(日) 12:53:46
みなさんレスありがとうございます。
>>834 自分の環境では__int64使えるみたいだったけど、他のPCで実行したらどうなるか分からないので今回は辞めておきます。
>>835 えっと、どういう意味ですか?
>>836-838 なるほど。そういう手もありましたね。
つまり、比較演算のオペレーターを自作するって事ですよね?
ちょっと、その方法でやってみます。
今64ビット化が進んでいるtime_tはどう?
閏秒とか考慮しなくていいならそれでいいか 暦法の微妙な問題に足突っ込みたくなければ全部秒で表した方が無難 しかし使えるならboost::gregorian使っとくのが楽ではある
>>833 年が1999年以降しかなくて、2099年までしか使わないのであれば
unsigned intでも収まりそうな気がする
キーワード: 通算秒 time_t
て言うか、「文字列だと遅そう」って思ってるだけじゃないのか? まずはこれで実装してみて、ほんとにそこがネックになってるなら いろいろ工夫すればいいと思う。
845 :
833 :2008/02/17(日) 13:55:31
みなさんいろいろなアドバイスありがとうございました。
キーを構造体にするという
>>836-837 さんのやり方で出来たので今回はこれでいこうと思います。
>>840 ,843
time_tと言う変数は知りませんでした。今度調べてみようと思います。
>>841 閏秒の問題は考えてませんでした。
そこまでの制度の秒を管理する訳じゃないので今回はこれで・・。
boost::gregorianと言うのも知らなかったので調べておきます。
>>842 確かに年を3桁にすれば入りそうですね。
そんなに広い範囲の年を扱う訳じゃないのでそれで良いかもしれませんがなんかなw
>>844 一応、キーをUINT, string, struct{UINT, UINT}の3パターンで挿入の時間を計ってみた所、
UINT > struct{UINT, UINT} > stringの順で速かったです。
Cは文字の扱いにあまり優れていないと聞いたことがあるのでそう思ってました。すいません。
とりあえず、これで解決とさせて頂きます。ありがとうございました。
time_tは型だ
time_tは__int64をtypedefしただけだったりな 環境にもよるが
標準かどうかが大きな違い。
longだったりする可能性があることを考えたら、 素直に__int64使ったほうがマシだと思うけど
せめてlong longがいいな。
案外void*だよ
>>845 1970年の1月1日とかからカウント始めれば、精度が秒くらいならunsignedな32bitで十分収まる。
853 :
デフォルトの名無しさん :2008/02/17(日) 14:42:10
googleでかなり調べたのですが、RC4が うまくコンパイルがとおらないので、教えてください。 fedora core1で、コマンドラインからc++でコンパイルしてます。 --------------------- #include <stdio.h> #include <openssl/rc4.h> int main(){ RC4_KEY key1; const char *keystring = "HOGEHOGE"; RC4_set_key(&key1, 4, (unsigned char *)keystring); return 0; } --------------------- コンパイルすると下のようになります。 ---------- /tmp/ccuOdmEl.o(.text+0x30): In function `main': : undefined reference to `RC4_set_key' collect2: ld はステータス 1 で終了しました ------------- 未定義の関数を用いているようなエラーですが、 rc4.hをインクルードしているのですが、 どこがいけないのでしょうか?
どうやってコンパイルしたの?
855 :
デフォルトの名無しさん :2008/02/17(日) 14:48:34
>>854 コマンドラインから
%c++ main.cpp
としました。
すると、上記のエラーが表示されます。
ライブラリリンクしようよ(´・ω・`)
WindowsのVARIANT型だとdoubleじゃなかったかな 普通は専用のAPIで触ることになるが、 1989/12/30からの日数(1日=1.0で、1秒が1/86400)という単純な仕様 だったと思うんで、自分で計算するのも別に難しくは無いはず 精度(有効範囲)は流石に2038年でオーバーフローする32bitのtime_tよりは ずっとマシ
>>845 time_tなら標準関数の支援を受けられるし、説明も楽だな。
>>857 今時、time_tは64ビットですが。
>>859 そりゃ環境による、でしょ
ま、言い方が悪かったか。「time_tが32bitだ」と言ってるんじゃなくて、
「time_tが32bitであるような環境では〜」と読んで欲しい。
たとえばMSVCでは、6までは32bit 未だに現役で使われてもいるコンパイラなので、注意な
862 :
デフォルトの名無しさん :2008/02/17(日) 14:59:15
>>856 すみません、そのライブラリリンクとは
どのようにやるのか教えていただきたく。。。
いただきたく。。。なんなんだ? 。。。とかね、もう質問の仕方なんて義務教育中に学べと
864 :
デフォルトの名無しさん :2008/02/17(日) 15:05:16
VCで プログラムからキーを押すプログラム作りたいのですが mouse_event みたいな関数教えていただけないでしょうか?
それだけじゃいまいちはっきりしないがgetch()とか
すみません、質問の仕方がわるかったです。 プログラムからキーボードの'A'ボタンを押したいのです。 どうすればよろしいでしょうか。
867 :
デフォルトの名無しさん :2008/02/17(日) 15:15:23
>>863 義務教育での勉強不足で失礼いたしました。
今後は、質問の仕方を改めますので、
ご教示のほどよろしくお願いいたします。
>862 RC4を使ったことがないのでどのファイルをリンクすべきなのか俺にはわからない。 一般に、よほどのことが無い限り、コンパイルするときは関数の実体が入ってるファイルをコンパイラに教えてあげないと コンパイラが迷子になってしまう。 /usr/lib/libRSAglue.a /usr/lib/libcrypto.a /usr/lib/libssl.a さらっとぐぐったかんじだとこのへんのどれかじゃないかとは思うけど。 >866 やっぱりわかんない。 関数に引数として'A'をあげてやればいいだけなのでわ?と思ってしまう。
>>864 mouse_eventときたらkeybd_eventだろ
>>865 getch('A')だと、Aボタンが押されたことを感知する命令ですよね。
putch('A')みたいな命令があればと思ってお聞きしたのですがm(_ _)m
>>869 keybd_eventですか、
使い方をググってみますね
>>859 Windows の VARIANT 型とか言ってる奴は、どうせ Excel ぐらいしか
触れないんだから、スルー推奨。
>>862 目立関係者か?
「いただきたく」なんてローカル用語使うなよ。
>>869 ご教授感謝です、その方法でドンピシャであります!
874 :
デフォルトの名無しさん :2008/02/17(日) 15:51:29
>>868 /usr/lib/libssl.a
で無事動きました。
ありがとうございました。
>866 keybd_event
更新し忘れ。 >872 どうでもいいが、目立関係ないうちの会社でもこの用法の「いただきたく」はたまに使われてる。
教えて頂きたく存じます だろ。
>教えていただきたく そもそも話題になってる意味が分からんのだが。
879 :
デフォルトの名無しさん :2008/02/17(日) 22:26:04
x86_64環境でiccでc++のソースをコンパイルできません。 > icpc ./exercise.4.1.cpp ld: skipping incompatible /usr/lib64/gcc/x86_64-suse-linux/4.1.2/32/../libstdc++.so when searching for -lstdc++ ld: skipping incompatible /usr/lib64/gcc/x86_64-suse-linux/4.1.2/32/../libstdc++.a when searching for -lstdc++ ld: cannot find -lstdc++ これはどうすればよいですか? googleしてみたけど、似たような人がみつけられませんでした。 どうかお願いします。
標準ライブラリが見つからないというエラーに見えるが
>>879 iccのインストール先のbinディレクトリ内にある、環境設定用のスクリプトを動かしてみたら?
参照を戻り値にする関数 (例えば int &sample(); ) って、呼び出す時 int hoge = sample(); って呼び出しますよね。 (ポインタを返す関数は呼び出すときに * を使うけど参照を返す関数は & を使わない。) ってことは int &sample(); が定義されてる時は int sample(); は同一モジュール内で定義できないってことなんでしょうか。 呼び出すときの名前が同じですよね。 一応自分で試したらエラーが出たのでやはり不可ってことなのだと思うのですが合ってるでしょうか?
戻り値の型のみが異なる関数は2つ以上同一スコープ内に作る事が出来ない。 引数に違いが無いとオーバーロードはできない。
たとえばC言語で昔よく使ったprintfやscanfは戻り値はint型だ。void型ではない。 けど、戻り値を使っていないプログラムを見たことあるよな? 関数の戻り値を必ず使う必要はないわけだ。 sample(); こういう呼び出しがあった場合、どちらを使えばいい? コンパイラには判断しようがないため規格上できないようになっている。
885 :
884 :2008/02/17(日) 23:52:55
>>883 さん
レスありがとうございます。
あれ、そもそも
int sample();
と
int &sample();
は、戻り値の型が同じではないんですか?
どっちもint型ですよね?
&sample(); そのものが参照で、その参照が指しているアドレスの値をint型のhogeに戻り値として返す、ということだと思ってたのですが、違うんでしょうか??
>>884 さん
なるほど。
int hoge = sample();
と
int hoge = &sample();
みたいにして、使い分けはできんのかなと思ったのです。
int hoge = &sample(); とするとエラーが出るし、やっぱりできないということなんですね。
ありがとうございましたm(_ _)m
884じゃなくて882でした。
>>885 違う。
int & sample()は、「intの参照型」を返す関数だ。
どこかに C++ 標準ライブラリの 完全なリファレンスマニュアルってないですか? 検索してみたのですか、ほとんどが一部しか載ってなくて… ソースか書籍しか無いのでしょうか…?
889 :
882 :2008/02/18(月) 00:02:07
>>887 さん
レスありがとうございます
む
それなら
int &hoge = sample();
みたいにhogeの前に & が必要な気がするのですが
int hoge = sample();
でもエラーにならないのはなんでなんでしょう?(sample(); は参照を返す関数だとして)
int hoge = sample();
だとhogeはint型の参照じゃなくて普通のint型として定義されてますよね。
int &x; があったときに int y = x; ってできるのと一緒
891 :
882 :2008/02/18(月) 00:19:53
>>890 さん
レスありがとうございます。
なるほど、てことは
&sample()
{
...
}
int hoge = sample();
とあったとき、hogeもsample()そのものも、どっちとも参照型ってことでいいんでしょうか?
int hoge = だったら、hogeは参照じゃないだろう sample() の戻り値が参照してる先の値をコピーしてるんだよ
893 :
882 :2008/02/18(月) 00:22:24
&sample() → int &sample() ですね...
横から質問させてください。
>>890 は(暗黙の)型変換の一つであり、
T&からTへの型変換はdereferenceである
と考えて正しいですか?
>>894 型変換じゃないと思うよ。ただの dereference というか。
897 :
879 :2008/02/18(月) 00:31:47
>>880-881 ありがとうございます。環境設定用のスクリプトは呼び出してるんですが、、、
どうも変なところにstdc++を探しにいっているような、、
どこに探しに行っているかをしらべるコマンドってなかったでしたっけ?
>>888 完全なっていうなら JIS の閲覧用クソ重いやつか、 ISO のドラフトがいいかもね。
899 :
882 :2008/02/18(月) 00:38:22
>>892 さん
レスありがとうございます。
うーむ
int &sample()
{
...
}
int hoge = sample();
hoge = 10;
とやるとエラーが出ずに普通にコンパイル出来ました。
hogeが参照だったら hoge = 10 みたいに再定義できないと思うので、
やっぱりこの場合hogeは参照じゃない・・?
>>899 hogeは参照ではない。分解して書けば一目瞭然。
int& sample();
int hoge; // どう見てもint型です
hoge = sample();
> hogeが参照だったら hoge = 10 みたいに再定義できないと思うので、
int hogehoge = 0;
int& hoge = hogehoge; // hogeが参照だったら
hoge = 10; // 参照先のhogehogeに10が代入される
901 :
882 :2008/02/18(月) 01:01:31
>>900 さん
ですよね。
ありがとうございましたm(_ _)m
visual studio 2008 express版を使っていたんだが error C2057: 定数式が必要です。 error C2466: サイズが 0 の配列を割り当てまたは宣言しようとしました。 というエラーが出たのですがこれはどういったエラーなの?
エラーでた個所のソースを張り付けては? 後ろの方はint i[];とかしたときにでるかな?前はよく見るけど忘れた。
905 :
902 :2008/02/18(月) 01:42:27
ARToolKit を使って連続MQOファイルを表示しようとしてます #define CAMERA_CONFIG_FILE "Data/WDM_camera_flipV.xml" // カメラ設定ファイル #define CAMERA_PARAM_FILE "Data/camera_para.dat" // カメラパラメータファイル #define PATT_FILE "Data/patt.sample1" // パターンファイル #define MQO_FILE "Data/output_0.mqo" // MQOファイル(座標軸) int MOTION_NUM = 60; int motion_total = 60; int MOTION_FPS= 30; MQO_OBJECT g_mqoModel[MOTION_NUM]; // メタセコファイルから読み込んだモデル
>>905 static const int MOTION_NUM = 60;
>896 上2つでは<utility>や<locale><stdexcepts>等の情報が見あたらなかったのですが MSDNのはかなり情報量多そうですね。しばらくMSDNを頼りにしてみます。 >898 JISに行ったら購入とかあったので有料?と思ったのですが 閲覧だけなら出来るみたいですね。 どうやら、保存は出来ないみたいですが。 C++ ISO Draft で調べたら幾つか見つかりました。 英語なのでちょっと大変そうですが、頑張ってみます。
MQO_OBJECTが正しく宣言されていないからだと思うが? その環境がわからんから俺にはこれ以上は答えられん・・・ってこれくらいのこと試してそうだけど・・・
909 :
908 :2008/02/18(月) 01:59:38
はぅ、そっか・・・おれはずかしす・・・
超初心者です char *a[]={"あ","か","さ","た","な"}; printf("%s",a[0]); こんな時、なぜ*が必要なのかいまいちピンときません。 どなたか教えてください…
int a = 5; int a[] = {1, 2, 3, 4, 5}; char* a = "あ"; char* a[] = {"あ", "い", "う", "え", "お"};
913 :
910 :2008/02/18(月) 10:06:32
こんがらがってきた(ヽ'A`) 文字列の扱い方はこんな感じでおかしくないでしょうか char a='N'; char a[]={'N','M'}; char a[]={"NM"}; char *a="NNNN"; char *a="あ"; char *a[]={"NNNN","MMMM"}; char *a[]={"あ","い"};
>>913 ああ、だいたいそれでいい。あとは char* じゃなくて char const* にしとけば完璧だ。
>>913 次は配列とリテラルの違いに苦しむが良い
const char*
917 :
910 :2008/02/18(月) 10:44:53
みなさんありがとうございます。なんとなくわかった気がします 次はどうしてこうなるのか簡潔に説明できるように頑張ります…
918 :
879 :2008/02/18(月) 10:48:57
すいません、誰かたすけて。。 x86-64のマシンでiccでC++のソースがコンパイルできません。 icc : l_cc_p_10.1.008 g++ : g++ (GCC) 4.1.2 20061115 (prerelease) (SUSE Linux) iccvars.shはsourceしてます。 icc samp.cのように、ただのCのソースならコンパイル+実行できます。 でもicpc samp.cppのように、C++のソースをコンパイルしようとすると、 ld: skipping incompatible /usr/lib64/gcc/x86_64-suse-linux/4.1.2/32/../ libstdc++.so when searching for -lstdc++ となって、コンパイルできません。 ちなみに、-lstdc++は、 $ file /usr/lib64/libstdc++.so.6.0.8 /usr/lib64/libstdc++.so.6.0.8: ELF 64-bit LSB shared object, AMD x86-64, version 1 (SYSV), stripped ちゃんと存在してます。
919 :
879 :2008/02/18(月) 10:56:31
すいません、自己解決したかも、です。 x86-64:~> /opt/intel/cce/10.1.008/bin/icc as/samp1.cpp => これはコンパイルでき、実行もできた。 x86-64:~> /opt/intel/cc/10.1.008/bin/icc as/samp1.cpp ld: skipping incompatible /usr/lib64/gcc/x86_64-suse-linux/4.1.2/32/../libstdc++.so when searching for -lstdc++ => これは上に書いたとおりコンパイルできない。 cceを使えばいいみたいです。 お騒がせしました。
920 :
デフォルトの名無しさん :2008/02/18(月) 11:00:15
>>919 ???何故、一つ上のdirectoryに上がるのです???
其の場所に"stdc"が置いて在るのですか?
921 :
デフォルトの名無しさん :2008/02/18(月) 11:31:47
単精度と倍精度でどの程度性能が違うのか、簡単なテストプログラムを書きたいと思っています (Programming Pearls の コラム6 練習問題) gcc -O0 で最適化をオフにして、何らかの計算をループさせて時間を計ろうと思うのですが、こういうのに手ごろな計算ってあるでしょうか?
>>921 単純な性能差を求めようとしても余り意味がない。
何故ならば、最適化なしの指定にすると恐らくはx86ではfpuを使うコードを出力するが、
それはfloatでもdoubleでも同じCPU命令を使うことになるから。
923 :
879 :2008/02/18(月) 11:40:20
>>920 レスありがとうございます。
>???何故、一つ上のdirectoryに上がるのです???
というのは、libstdc++の場所のことですよね?自分も調べてみたのですが、結局その位置は、
/usr/lib64/libstdc++.so.6.0.8 になってて、これがlibstdc++のようです。
cceのディレクトリ以下のコンパイラだとリンクできて、cc以下のコンパイラだとリンクできない
理由は分かってないですが、。。
そりゃぁ、ccはx86-32でcceがx86-em64tだからだ。
925 :
879 :2008/02/18(月) 12:01:30
>>924 ありがとうございます。
なるほど、そういうことですか。
でも、なんでx86-64環境にインストールしたのに、iccとやると、デフォルトで32ビットの
バイナリを作ろうとするんですかね。自分は、
alias icc64="/opt/intel/cce/10.1.008/bin/icc"
しときました。
>>925 cce配下のbinにあるスクリプトを使えばcceにPATHが通る。
927 :
879 :2008/02/18(月) 12:22:03
>>926 以下のようにやると通りました。
source /opt/intel/cce/10.1.008/bin/iccvars.sh
ありがとうです。
文字列を初期化するにはどっちがいいのでしょうか? 1, ZeroMemory( str, sizeof(str) ) 2, memset( str, '\0', sizeof(str) )
両方同じ
'\0'=0ってことなんですか?
>>928 >1, ZeroMemory( str, sizeof(str) )
一部の環境にしか存在しないことを承知で使うのならこっちでもいいが、
そもそも文字列を初期化するのに0クリアはナンセンス。
2なら環境をWindows以外に変えても修正しないで済む。
ZeroMemoryもマクロで結局memsetになる。
文字列の初期化だったら、「*str = '\0';」でいいじゃない。
#include <new> class CBase { public: /** new */ void* operator new(std::size_t aSize) throw(std::bad_alloc); /** delete */ void operator delete(void* aMemory) throw(); /** placement new */ void* operator new(std::size_t aSize, void* aPtr) throw(); /** placement delete */ void operator delete(void* aMemory, void* aPtr) throw(); }; Effective C++にあった配置newを試そうと上のクラスを作ってみたのですが、 BCBでコンパイルすると下記のエラーが出てしまいます E2238 'CBase::operator delete(void *) throw()' の宣言が複数見つかった ボス助けて
>>935 visual c++ 2005では問題なくコンパイルできました。
bccがポンコツということで処理します。
937 :
デフォルトの名無しさん :2008/02/18(月) 23:30:10
GetCurrentDirectory()は最大260文字くらいしか読み取れないね なんとかなりませんか?
938 :
デフォルトの名無しさん :2008/02/18(月) 23:37:18
937です 自己解決しました 途中まで(250字程度)は返してくれるのでそこまで 移動してからディレクトリを進めていって、たとえば適当なファイルを生成してそれを見つければよいです
GetCurrentDirectoryWでも260文字越えはだめ?
940 :
デフォルトの名無しさん :2008/02/19(火) 00:11:17
GetCurrentDirectoryWでも250程度しか行きませんでした
オレ様のGetCurrentDirectory()にはそんなちゃちな制限はないぜ。
942 :
デフォルトの名無しさん :2008/02/19(火) 00:34:58
247文字までは取得できますが、それを越えると一つ上のディレクトリまでしか返さないようです
943 :
デフォルトの名無しさん :2008/02/19(火) 00:36:52
だからたとえば50文字で返却されたとしてもそこがカレントディレクトリとは限りません 200文字のディレクトリ内かも知れない為
時々ファイル名が長すぎてリネームできないファイルがありますが 私はいつもネットワーク共有状態にしてUNC名でリネームしてます
945 :
デフォルトの名無しさん :2008/02/19(火) 01:28:08
階層の深いフォルダをドライブに見せかける命令ってどうやるんでしょうか これが出来れば読めるところまで進めてくりかえせばいいのですが
Linux 2.6.18-6-686 #1 SMP Sun Feb 10 22:11:31 UTC 2008 i686 GNU/Linuxで wtmpの中身をみて遊んでて出た疑問です。 struct utmp u; sizeof(u)をしたら384が出力されたのですが/usr/include/bits/utmp.hを みてメンバー変数のサイズを合計したら382となりました。 下記のサンプルで出したのですがメンバー変数に見落としがあったのでしょうか? #include <stdio.h> #include <stdlib.h> #include <time.h> #include <utmp.h> main(){ struct utmp u; printf("size utmp %d \n", sizeof(u)); printf("size ut_type %d \n", sizeof(u.ut_type)); printf("size ut_pid %d \n", sizeof(u.ut_pid)); printf("size ut_line %d \n", sizeof(u.ut_line)); printf("size ut_id %d \n", sizeof(u.ut_id)); printf("size ut_user %d \n", sizeof(u.ut_user)); printf("size ut_host %d \n", sizeof(u.ut_host)); printf("size ut_exit %d \n", sizeof(u.ut_exit)); printf("size ut_session %d \n", sizeof(u.ut_session)); printf("size ut_tv %d \n", sizeof(u.ut_tv)); printf("size ut_addr_v6 %d \n", sizeof(u.ut_addr_v6)); printf("size __unused %d \n", sizeof(u.__unused)); }
どこかにパディング入ってんじゃね
>947 なるほど。wtmpはバイナリーデータなんですけどutmp.hの構造体のサイズ信じて バイト単位でデータにアクセスした場合ほしい値がもらえない場合があるわけですね。
offsetofでも使えばいいんじゃね
>949 なるほど、パディング入った位置はわかった。
951 :
デフォルトの名無しさん :2008/02/19(火) 05:01:29
952 :
デフォルトの名無しさん :2008/02/19(火) 05:11:17
953 :
いいこと教えてやるヨ :2008/02/19(火) 05:19:15
いつもこのスレにお世話になってるんで、お前らに恩返ししてやるよ。 あのな、クラスの中で、大文字のTっつー名前のメンバ変数を定義すんなよ。 そのあと、クラス内でtemplate <class T>とかするとハマる。 おれはこんな時間までハマった。 じゃあな。
954 :
デフォルトの名無しさん :2008/02/19(火) 05:26:02
いや、 msg[i] += 'A' - 'a' msg[i] -= 'A' - 'a' の処理が大文字と小文字をひっくり返す処理くらい 俺でも分かるよ。 でも、コンパイルできねーんだもん。
>953 申し訳ないけど笑ってしまった。
>>954 #include <string.h>
とかか?
コロンなのがあかんのんやろ
>>951 (msg[i] -= 'A' - 'a') と括弧で括ればいい。
あるいは、C++処理系でコンパイルすればいい。
#include <iostream>やusing namespaceは.hに書くのがよいのでしょうか?それとも.cppに書くべきなのでしょうか?
960 :
デフォルトの名無しさん :2008/02/19(火) 10:28:46
まさか、'A'がchar型だと思ってるバカはいないよな?
961 :
デフォルトの名無しさん :2008/02/19(火) 10:55:47
>>959 それぞれのスタイルでしょ。でも、
using namespace を.hに書くのはやめとけ。というか、c++を使いつづけると、
そのうち自然に止めたくなると思う。
ソースファイル毎に名前空間分けてるWindows用某フレームワークは名前空間一つにまとめてくれといいたくなる。
特定のクラスだけパディングして欲しくない 事があるんですが、何か手はあるでしょうか?
#pragma pack
ofstreamのmemcpyで落ちる場合があるんですが何が原因でしょうか?
ofstreamでmemcpy使うことなんてあったっけ? ここにソース書いてくれ。
じゃあofstreamじゃないのかもしれません。 CStringA str; str = wstrData; fout.write( str, DATA_SIZE ); この様なことをやっていて 何回も動かしていると落ちてしまうんですが マルチバイトとワイド文字の変換にCStringAを使ってるのでここかもしれません
原因を予想してもらうより、まずどこで落ちるのか確定するにはどうすればいいかを聞いたほうがいい気が・・・ スタックのトレースも無さそうだな
fout.write(str, str.GetLength()); じゃないの? あるいは fout << str;
プログラムの勉強に飽きたとき息抜きで何やる?
一人で電機屋で1980円で買った麻雀ゲーやってる あと最近興味ないクラシックを聴いて10分で眠くなる特技が出来た
えーとごめんなさい。VC使って5年ぐらい経つんですが 未だに普通のウィンドウにコントロールを貼り付けるような リソースエディタ的なソレを知りません。 ダイアログなら直球なんですがウィンドウでそういうの出来ますか?
975 :
974 :2008/02/20(水) 00:11:14
使ってるのはVC6です。
日本語が使えないんじゃ何年VC使っててもだめだろうね
こんくらいは分かるだろ。 とりあえず VC ではそういうのは知らない。
普通のウィンドウにあんまりコントロールをはっつけるなってことじゃないのかな。 Windows 的には。
979 :
デフォルトの名無しさん :2008/02/20(水) 00:15:28
980 :
974 :2008/02/20(水) 00:21:42
>>976 んじゃ0年でもOK
てゆかVC6のウィンドウエディタはリソースエディタしかないから
それでやってたけど、ダイアログしか作れないのはおかしいだろ、
とか思いながらやってたんだけど、その疑問をはらしたくてな。
>>977-978 あれ?やっぱこれでOKなのか。
要するに「VC6に"ウィンドウ"エディタは無い」でOK?
てゆか
BCB にはありそうな気がする。
>>980 ダイアログをウィンドウに張ることはできますが。
ダイアログにウィンドウクラスを割り当ててしまえば、 もはやダイアログではないウィンドウができる。 でも俺は983のようにすることが多いけど。
アンマネージドでも.NETくらい楽にUI作れるようにならんかなー
ちなみにBCBでダイアログ作るとダイアログもどきな普通のウィンドウになる
987 :
デフォルトの名無しさん :2008/02/20(水) 05:25:33
virtualデストラクタを持つ親クラスを継承して、子供クラスを作りました。 その子供クラスを、親クラスのポインタをつかって扱ってます。そのとき、 親クラスのポインタに対して、delete ptr;とやると、まず子供クラスの デストラクタが呼ばれた後で、親クラスのデストラクタが呼ばれるのですが、 これって正しい動きですか? 親クラスのデストラクタは呼ばれないと思ってた。
>>987 正しい。
親のが呼ばれなきゃ親のリソース開放できないじゃん。
989 :
デフォルトの名無しさん :2008/02/20(水) 06:21:51
>>988 その通りですね。
ありがとうございました。
990 :
デフォルトの名無しさん :2008/02/20(水) 11:16:24
vectorをnewを使って確保するというのは出来ますか? (vector<int>とか) 色々やってみたんですが、なぜかどうやってもコンパイル失敗してしまいます。 もしかして、できないのかな、と思った。
>>990 #include <vector>
int main() {
std::vector<int> *p = new std::vector<int>;
delete p;
}
>>990 なんでまたそんな希代なことしようと思ったのかが気になる。
993 :
デフォルトの名無しさん :2008/02/20(水) 12:25:18
>>991-992 ありがとうございます。なぜそんなことをしようと思ったかというと、vectorを関数間でやりとり
したかったからです。適当にクラスを準備して、その中にvectorを保持してましたが、単体でも
newで出来るかなと思いました。
次立てて埋めようとしたらたてらんねえ
995 :
デフォルトの名無しさん :2008/02/20(水) 12:34:23
立てたよ。
>>993 別にわざわざnewする必要なんか無いだろ。そのための参照渡しがあるんだから。
でも複数の場所にたらい回しにするときは、 boost::shared_ptr<std::vector<int> >(new std::vector<int>()); とかやる?
梅て次いこう
ほいほいほい
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。