【初心者歓迎】C/C++室 Ver.44【環境依存OK】
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2007/11/03(土) 00:20:13ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.43【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1190860744/l50
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0331デフォルトの名無しさん
2007/11/15(木) 02:43:49一瞬、「じゃあふたつ後ろならいいのかよ」とか思ってしまったよ
0332デフォルトの名無しさん
2007/11/15(木) 10:42:18仕様の読み方わかってないだろ。
プログラムの勉強からはじめたほうがいいね。
0333デフォルトの名無しさん
2007/11/15(木) 10:57:22どこをどう読んだら >329 みたいな解釈になるのか教えてください。
0334デフォルトの名無しさん
2007/11/15(木) 11:24:57加減演算子
ポインタオペランド及びその結果の両方が同じ配列オブジェクトの要素、又は
配列オブジェクトの最後の要素を一つ越えたところを指している場合、演算に
よって、オーバーフローを生じてはならない。それ以外の場合、動作は未定義
とする。
あくまで未定義といっているのだから、規格上は何でもあり得る、つまり
実装依存ということになるね。>>329の言っている、エラーが出ない
とか参照しなければ単なる数字になるということは、多くの実装がそう
なっているだけであって、str+5000の加算演算で仮にクラッシュする実装が
あっても、それは規格には従っていることになる。結局、この場合、
動作は未定義だから実装まかせ。
なので、厳密には>>328の意見が正しいと思われる。
0335デフォルトの名無しさん
2007/11/15(木) 13:04:40例えばint array[2]に対してarrayが0xfff0にアサインされているかもしれない。
ポインタもintも16bitなら、array + 4が0になってしまい、NULLと区別できなくなってしまう。
# 流石に即クラッシュはしないだろうけどね。
0336デフォルトの名無しさん
2007/11/15(木) 14:02:360337デフォルトの名無しさん
2007/11/15(木) 17:44:010338デフォルトの名無しさん
2007/11/15(木) 17:57:270339デフォルトの名無しさん
2007/11/15(木) 18:16:43そもそも誰か、境界の話なんてしているんですか?
0340デフォルトの名無しさん
2007/11/15(木) 18:31:330341wolf ◆8VH3XAqjlU
2007/11/15(木) 22:09:24*** For your reference ***
Windows. _heapwalk (CRT)
http://msdn2.microsoft.com/en-us/library/h0c183dk(VS.80).aspx
Linux 2.4x
src\drivers\char\drm\sis_ds.c "void mmDumpMemInfo( memHeap_t *mmInit )"
0342デフォルトの名無しさん
2007/11/16(金) 13:49:41単純な文章をファイル出力させようとfoutを使っているのですが
”(ダブルクォーテーション)
って奴はどうやったら出力できますか?
囲みを’に変えてみたりしたがうまくいかねえ…
0343デフォルトの名無しさん
2007/11/16(金) 13:58:430344デフォルトの名無しさん
2007/11/16(金) 15:06:55MFCDLLにはMFCのクラスのポインタを引数としたエクスポート関数があります。
MFCDLLでそのクラスをnewし、アプリケーション側でdeleteしています。
この両者が、プロジェクトの設定の"MFCの使用"を"共有DLLでMFCを使用する"
の設定だったらうまく動いてるけれど、
"スタティックライブラリでMFCを使用する"の設定にすると、アプリケーション側で
DLLでnewしたクラスをdeleteしたタイミングでハングします。
なぜスタティックリンクすると、だめなんでしょうか。
0345344
2007/11/16(金) 15:07:370346デフォルトの名無しさん
2007/11/16(金) 15:19:42サンクスです。それをやってもできないから質問したのに、
そこ以外の場所でミスってるとは思わなかった…
0347デフォルトの名無しさん
2007/11/16(金) 15:20:26EXEにスタティックリンクされたMFCとDLLにスタティックリンクされたMFCの2つのMFCが存在することになるから管理が混乱するんじゃないの
0348デフォルトの名無しさん
2007/11/16(金) 22:43:06ってのは嘘だけど、newもdeleteもアプリ側で行うようにできないのかね?
0349デフォルトの名無しさん
2007/11/16(金) 23:02:27関数のオーバーロードをした際、引数がぴたりとあってない場合に
「引数の型があいまいです」とでますよね。
暗黙の型変換をがんばろうとして駄目だった。ということはわかるのですが
どういう優先度でがんばろうとしてるのか、色々実験してみても法則がわかりませんでした
C++における「関数オーバーロード時の呼び出し優先順位の決め方」みたいなものを教えていただけませんでしょうか
0350OPENCV
2007/11/16(金) 23:36:35ttp://www.seman.cs.uec.ac.jp/~takahashi/OpenCV/functions/index.htm
などを参考にすれば導入できるはずなのですが、
デバッグなしで開始をしたときに、
「プログラム 'C:\Users\koizumi\Documents\Visual Studio 2005\Projects\cv
\debug\cv.exe'を開始できません。
指定されたパスが見つかりません」
と言われてしまいます。
リンカの設定で
追加のライブラリディレクトリ--C:\Program Files\OpenCV\lib
追加の依存ファイル--cv.lib cxcore.lib cvaux.lib highgui.lib
と設定しましたし、
インクルードファイル、ライブラリファイルのパス設定もしました。
どこが悪いかわかる方がいらっしゃいましたら、教えてください。
よろしくお願いします。
0351デフォルトの名無しさん
2007/11/16(金) 23:44:58cv.exeが見つからないって感じに見えるんだけどコイズミくん。
0352OPENCV
2007/11/17(土) 00:00:45お返事ありがとうございます。
ビルドしたとき、エラーになっている感じはありません。
========== ビルド: 0 正常終了、0 失敗、1 更新、0 スキップ ==========
いつものようにデバッグなしで開始が通るときは、
Documentsフォルダの中にexeファイルができるのですが、
今回はexeファイル自体が作成されていないようです。
何かわかることがあれば、コメントお願いします。
0353デフォルトの名無しさん
2007/11/17(土) 00:16:55プログラミング言語C++を見てみろ
0354デフォルトの名無しさん
2007/11/17(土) 00:50:48JIS の規格買うか、 JIS の糞思い pdf を見るか、 ISO のドラフトダウンロードするか。
0355OPENCV
2007/11/17(土) 08:08:15>>354
コメントありがとうございます。
プログラミング言語C++は規格についても書かれた本のようですね。ただ、高い。。。
JISの規格は、私ではなおさら分からなくなりそう。。。
もう少し格闘してみます。
それで分からなければまた質問させてください。それでは。
0356デフォルトの名無しさん
2007/11/17(土) 08:27:27ルールを見る前に格闘したって時間の無駄。
先に確認すればいだろ。
0357デフォルトの名無しさん
2007/11/17(土) 09:02:21ScreenFlip関数ってのは、「表示する画面を入れ替える」なんでしょうか、それとも「書き込む画面を入れ替える」なんでしょうか?
0358357
2007/11/17(土) 09:07:00すんません
0359デフォルトの名無しさん
2007/11/17(土) 15:31:07>>355
プログラミング言語C++(第3版)の7.4(p193)にあります。立ち読みでどうぞ。
0360デフォルトの名無しさん
2007/11/17(土) 15:39:450361デフォルトの名無しさん
2007/11/17(土) 15:56:49MFCでメンバ変数のCFontをOnInitDialog内でダイアログのコントロールに設定してますが、
なぜかフォントの種類がMS ゴシックになってしまいます。
デフォルトはダイアログエディタでMS 明朝にしてます。
が、SetFontを呼ぶとサイズはCreatePointFontで指定したサイズになりますが、
なぜかフォントの種類が勝手にMS ゴシックになってしまうのです。
フォントには何を指定してもだめでした。(意味はなくてもMS 明朝で試しましたがMS ゴシックになりました)
サイズは変わってるのに何故でしょうか?
0362361
2007/11/17(土) 16:22:41フォント作成時に指定したフォント名に1バイト余計な空白がありました。
なのにCreatePointFontが成功を返してたので気づきませんでした。
0364デフォルトの名無しさん
2007/11/18(日) 13:34:54char *utf8Char に、ヌルターミネイトされたUTF8のバイト列が入っています。
("wb"でfopenして、fwrite( utf8Char, strlen( utf8Char), 1, fp )したものを
テキストエディタでUTF8指定で開くとちゃんと読める。
何もせずにcoutしてDOS窓に出すと、ASCII文字は読めるけど日本語が化ける)
これを_bstr_t型の変数に入れ込みたいのですが、どうすれば良いのでしょうか。
_bstr_t utf8Bstr( utf8Char );
cout << _com_util::ConvertBSTRToString( utf8Bstr ) << endl;
とすると、全体が文字化けしたようになりますし、
WideCharToMultibyteで別のchar *hogeに入れて、cout << hoge << endl;
としても文字化けしました…。
0365デフォルトの名無しさん
2007/11/18(日) 14:14:04だから、MultiByte2WideCharなんかで、UTF-8を明示した上で、WCHAR変換をかける。
これ以外の、ソースエンコーディングの指定がない変換系関数は、だいたい
ANSIコード(日本ではCP932)を仮定するので、変換が破綻する。
0366デフォルトの名無しさん
2007/11/18(日) 16:15:42http://hpcgi1.nifty.com/MADIA/Vcbbs/wwwlng.cgi?print+200701/07010007.txt
このページの最後の方にある、UTF8ToUTF16という処理であってますでしょうか?
手元に開発環境がないので、今試せないのですが…。
0367デフォルトの名無しさん
2007/11/18(日) 18:12:18CComPtr< IHage > hage;
//hoge->HageがIHageのインスタンスを持つ処理
hage = hoge->Hage;
としたとき、その後すぐ hoge.Release() としてもいいんでしょうか。
した後でもhageはNULLになったりしてないようですが、
それはたまたまメモリがそのままになってるだけで、本当はhageを完全に使い終わってから
hage.Release();
hoge.Release();
としなければならないのでしょうか。
0368デフォルトの名無しさん
2007/11/18(日) 19:43:29それでもあってはいるけど、俺だったら直接_bstr_tへ書き込むようにする。
BOOL UTF8ToUTF16(const char* data, const int len, _bstr_t& ret)
{
if (!data)
{
return FALSE;
}
if (len == 0)
{
ret = L"";
return TRUE;
}
_bstr_t t;
const int wlen = ::MultiByteToWideChar(CP_UTF8, 0, data, len, NULL, 0);
if (wlen == 0)
{
return FALSE;
}
t.Attach(SysAllocStringLen(0, wlen));
if (t.GetBSTR() == 0)
{
return FALSE;
}
if (::MultiByteToWideChar(CP_UTF8, 0, data, len, t.GetBSTR(), wlen) != 0)
{
ret = t;
return TRUE;
}
return FALSE;
}
0369デフォルトの名無しさん
2007/11/18(日) 19:46:13そのための参照カウントなのだから大丈夫。
そもそもCComPtr使うんだったら、
必要に迫られない限りReleaseを明示的に呼ぶ必要もないと思うけど。
0370デフォルトの名無しさん
2007/11/18(日) 19:50:32VC++なら_com_ptr_t使ったほうがよくね?
0371デフォルトの名無しさん
2007/11/18(日) 19:52:24理論上はhoge.Release()を先にしても問題無いし、そう実装されているべき。
ただ、OfficeのApplicationオブジェクトとかで、
稀に子オブジェクトも一緒くたに無効化してしまうことがあるので、
一応頭の片隅に置いておくといい。
昔の話かもしれないけど。
0372デフォルトの名無しさん
2007/11/18(日) 19:58:16_COM_SMARTPTR_TYPEDEF ('A`)マンドクセ
例外対応 ('A`)マンドクセ
ATLのシンプルな構造 (゚д゚)ウマー
0373デフォルトの名無しさん
2007/11/18(日) 20:09:14int x;
int y;
};
というクラスの「ポインタ」がたくさん入ったvectorがあるとして、
例えばこれを各ポインタが指しているxでソートすることってできますか?
ポインタでなければ<の定義でできると思うんですが、
ポインタの場合どうやって書いたらよいか分かりません。
もし可能でしたら書き方を教えてください。お願いします。
0374デフォルトの名無しさん
2007/11/18(日) 20:11:360375デフォルトの名無しさん
2007/11/18(日) 20:17:19>>374 アリ。
0376デフォルトの名無しさん
2007/11/18(日) 20:32:08#include <functional>
#include <vector>
#include <cassert>
#include <boost/lambda/lambda.hpp>
#include <boost/lambda/bind.hpp>
struct Value {
int x;
int y;
};
struct comparator : public std::binary_function<const Value*, const Value*, bool> {
result_type operator()(first_argument_type lhs, second_argument_type rhs) const {
return lhs->x > rhs->x;
}
};
int main() {
Value v0 = { 1,2 }, v1 = { 2,3};
std::vector<Value*> v;
v.push_back(&v0);
v.push_back(&v1);
std::sort(v.begin(), v.end(), comparator());
assert(v[0]->x == 2 || v[0]->y == 3);
using namespace boost::lambda;
std::sort(v.begin(), v.end(), bind(&Value::x, *_1) < bind(&Value::x, *_2));
assert(v[0]->x == 1 || v[0]->y == 2);
}
どっちにしろ大概だな
0377デフォルトの名無しさん
2007/11/18(日) 20:36:13bool hoge_less_x(hoge const* lhs, hoge const* rhs) { return lhs->x < rhs->x; }
でいいだろ。
0378デフォルトの名無しさん
2007/11/18(日) 20:50:59ども。
とりあえず比較関数を渡せるsortってのを試してみようと思います。
ありがとうございました。
0379デフォルトの名無しさん
2007/11/19(月) 02:46:28という関数があった場合、
doSomething(&Widget());
という風にWidgetのオブジェクトを引数で作成して、そのままアドレス取って呼び出すのは、全く問題ないですか?
0380デフォルトの名無しさん
2007/11/19(月) 05:50:07そのオブジェクトがなくなってしまっていても
いいならいいんじゃないの
0381デフォルトの名無しさん
2007/11/19(月) 09:10:290382デフォルトの名無しさん
2007/11/19(月) 10:47:53&演算子はオブジェクトに対しては左辺値にしか適用できないんでないか?
0383デフォルトの名無しさん
2007/11/19(月) 12:51:390384デフォルトの名無しさん
2007/11/19(月) 12:56:300385デフォルトの名無しさん
2007/11/19(月) 13:05:51ファイルを閉じるときに、
fp.close();
while( fp && fp.fail() )Sleep(10);
とやると良いよ
まだ閉じていないで次のやつを開くと駄目だからだ
0386デフォルトの名無しさん
2007/11/19(月) 13:08:05class A{
public:
A(){}
int operator&(){return 123;}
};
int main()
{
printf("%d\n", &A());
}
0387デフォルトの名無しさん
2007/11/19(月) 13:14:37まずは、その必要性をよく考えたほうがいい。
0388デフォルトの名無しさん
2007/11/19(月) 13:15:31379はあくまでアドレスが欲しいわけだから意味ないんでない?
0389デフォルトの名無しさん
2007/11/19(月) 13:32:34#include <string.h>
char s[] = "This is a pen. That is an apple.";
void main(void)
{ char check[256],str[256];
int i;
printf("This is a pen. That is an apple.\n\n");
gets(str);
for(i=0;str[i]==s[i];i++)
{
check[i]=strcmp(str[i],s[i]);
if (check[i]==0)
{printf("ok");}
else
{printf("ng");}}}
初期化した文字列と入力した文字列strに対しThis is〜がstrで始まっているかどうかを
判定するプログラムですが、check[i]=strcmp(str[i],s[i]);にてエラーが出ます。
教えてください(例えばThis→OK,Th→OK,Thos→NG.....)
0390デフォルトの名無しさん
2007/11/19(月) 14:05:06char s[] = "This is a pen. That is an apple.";
int main(void)
{ char check[256],str[256];
int i,checker;
printf("This is a pen. That is an apple.\n\n");
gets(str);
for(i=0;str[i]!='\0';i++)
if(str[i]==s[i])
{
checker=1;
}
else
{
checker=0;
break;
}
if(checker==0)
{
printf("NG!その文字列から始まっていません。\n");
}
else
{
printf("OK!その文字列から始まっています。\n");
}
}
これでいけた
0391デフォルトの名無しさん
2007/11/19(月) 14:10:470392デフォルトの名無しさん
2007/11/19(月) 15:06:09この関数はlexicographical_compare(s1, s2);
とした場合、辞書順でs1がs2より前にあるときにtrueを返し、
そうでないときfalseを返すため、文字列の一致は判定できない
と思います。
この関数を使って二つの文字列(string)が等しいことを判定するためには
lexicographical_compare(s1, s2); //false (s1はs2の前にはない)
lexicographical_compare(s2, s1); //false (s2はs1の前にはない)
がともにfalseを返すことを確認しなければいけないのでしょうか?
0393デフォルトの名無しさん
2007/11/19(月) 15:43:510394392
2007/11/19(月) 15:47:44方法として以下のコードがあるのですが、これでは一致を
判定できないのでは?と思ったんです。
bool ciStringCompare(const string &s1, const string &s2)
{
return lexicographical_compare(s1.begin(), s1.end(),
s2.begin(), s2.end(),
ciCharLess);
}
// 1文字の比較
bool ciCharLess(char c1, char c2)
{
return tolower(static_cast<unsigned char>(c1)) <
tolower(static_cast<unsigend char>(c2));
}
0395デフォルトの名無しさん
2007/11/19(月) 15:55:50言いたいことがわからん。大文字小文字区別しないならその範囲で
しか一致は判定できないのでは?そんだけじゃないの?
0396392
2007/11/19(月) 17:03:12上記のプログラムでいうと
lexicographical_compareでは一方の文字列が他方のものより
辞書順で前にあるかないかは判定できますが、一致は判定
できないのでは?という意味です。
たとえば、ciStringCompareで二つのstringが一致
するかどうかを判定できるなら
ciStringCompare("ABC", "abc");
はtrueを返すと思ったのですが、呼び出している
lexicographical_compareの仕様ではfalseになります
よね?結局文字列の一致は判定できないのではないかと。
ソース Effective STL 第35項
0397デフォルトの名無しさん
2007/11/19(月) 17:27:33ttp://www.aristeia.com/BookErrata/estl1e-errata_frames.html
0398デフォルトの名無しさん
2007/11/19(月) 18:01:30また、どの部分に依存してますか?
0399デフォルトの名無しさん
2007/11/19(月) 18:09:15CPU,メモリも大事だけど、HDDが高速な方がいい。
ヘッダやライブラリ等がIDE接続のフラッシュメモリにあるとコンパイルは早い。
たぶんね。
0400デフォルトの名無しさん
2007/11/19(月) 18:19:26コンパイルするやつもある。
0401デフォルトの名無しさん
2007/11/19(月) 18:31:190402デフォルトの名無しさん
2007/11/19(月) 18:38:58スワップが発生したらかなりの速度低下になるし、逆にパフォーマンス改善としては一番コストパフォーマンスがいいかも
最初から2Gとか積んでたらほとんど変わらないだろうがね
ちなみにクロック速度は殆ど関係ないと思うけど、実際はどうなんだろう
0404デフォルトの名無しさん
2007/11/19(月) 19:24:08thisを返すoperator &をメンバとして定義すれば可能なはず。
誰がやるかそんなもん、って程度のことだが。
0405デフォルトの名無しさん
2007/11/19(月) 22:50:54すいません、t.Attachのところなんですけど、_bstr_tにAttachという
メソッドが見あたらなかったんですが…。
何かをインクルードすればいいのでしょうか?
0406デフォルトの名無しさん
2007/11/19(月) 22:53:110407デフォルトの名無しさん
2007/11/20(火) 00:19:01CComPtr< _bstr_t > t;
とかって…。
違う気がする。
すみません!教えてください!
>>368そのままではコンパイラ通らないので…。
0408デフォルトの名無しさん
2007/11/20(火) 01:32:14バージョンは何?
少なくともVC++ 7.1にはあるはずなんだけど。
http://msdn2.microsoft.com/en-us/library/c671cyay(VS.71).aspx
0409デフォルトの名無しさん
2007/11/20(火) 03:01:35あてずっぽうだけど
0410デフォルトの名無しさん
2007/11/20(火) 06:54:36VC6です。
0411デフォルトの名無しさん
2007/11/20(火) 17:10:12キューブ状態のものにLogo.bmpをテクスチャで貼り付けてクルクル回したスクリーンセーバを作りたいと考えました
OMEGA POINT - プログラミング(OpenGL,数学,画像処理,Win32API, C++) -
http://omega-point.ddo.jp/programming/opengl/index.html
の上から2コ目のzipファイルが使えそうだったのでホイホイ弄ってたら画像の読み込みで壁にぶつかりました
現在はキューブがクルクル回っているところですが、画像は読み込めてません
MFC使ってないのでBitmap定義が使えないみたいなんです ( ; ; )
ResouceFilesにはLogo.bmp(256*256)を登録してあるのでどうにかして触る方法がありませんか?
何かを勘違いしてる場合は指摘してくださいー
0412デフォルトの名無しさん
2007/11/20(火) 17:42:070413デフォルトの名無しさん
2007/11/20(火) 20:51:20例えば
char File_Name[30];
fout.open(File_Name,ios::out);
とした場合、File_Nameに文章を詰め込む(File_Name="Function_Name")
みたいなことはできますか?
いや、できないことはなさげだけど、string型が詰められないとなると手がない…
0414デフォルトの名無しさん
2007/11/20(火) 20:56:150415デフォルトの名無しさん
2007/11/20(火) 21:01:51Cでは char Filename[] と char * Filename は同じモノ
つまりFilename[]="name"としてれば
0416デフォルトの名無しさん
2007/11/20(火) 21:46:21え?
0417デフォルトの名無しさん
2007/11/20(火) 21:49:26ろ?
0418デフォルトの名無しさん
2007/11/20(火) 21:50:29>Cでは char Filename[] と char * Filename は同じモノ
違う。前者はあくまで配列で、後者はポインタ。
関数の仮引数としてなら同義だ。
void func(char Filename[]);
void func(char *Filename);
0419デフォルトの名無しさん
2007/11/20(火) 21:53:01どうしてもというならstrcpyでも使えば?
stringのc_str使えばいいとは思うけど。
string File_Name;
fout.open(File_Name.c_str(),ios::out);
0420419
2007/11/20(火) 21:54:23string File_Name("Function_Name");
0421デフォルトの名無しさん
2007/11/20(火) 21:57:22{
strcpy( buf, src ):
return src;
}
0422デフォルトの名無しさん
2007/11/20(火) 22:08:300423デフォルトの名無しさん
2007/11/20(火) 22:09:100424デフォルトの名無しさん
2007/11/20(火) 22:53:460425デフォルトの名無しさん
2007/11/20(火) 23:21:450426デフォルトの名無しさん
2007/11/20(火) 23:25:200427デフォルトの名無しさん
2007/11/20(火) 23:51:290428デフォルトの名無しさん
2007/11/21(水) 00:32:33馬鹿ですか?
0429デフォルトの名無しさん
2007/11/21(水) 01:12:010430デフォルトの名無しさん
2007/11/21(水) 01:21:33ここまで理解できてたらこれから先も呑み込めて行けそうじゃね?
間違いを受け止める心があればだけど・・・
■ このスレッドは過去ログ倉庫に格納されています