【初心者歓迎】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
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ここまで理解できてたらこれから先も呑み込めて行けそうじゃね?
間違いを受け止める心があればだけど・・・
0431デフォルトの名無しさん
2007/11/21(水) 16:06:24daemonを作りたいときに、
#include <stdlib.h>
int daemon(int nochdir, int noclose);
呼ぶのと、
#include <sys/types.h>
#include <unistd.h>
pid_t fork(void);
を2回呼ぶのって、実用上何か大きな違いはありますか?
0432デフォルトの名無しさん
2007/11/21(水) 16:11:340433デフォルトの名無しさん
2007/11/21(水) 16:12:46じゃあ、fork()しかない環境ではforkを2回にして、
daemon()がある環境ではdaemon()使っとけって感じですかね。
0434wolf ◆8VH3XAqjlU
2007/11/21(水) 21:32:30*** For your reference ***
How to Daemonize in Linux [Doug Potter]
http://www-theorie.physik.unizh.ch/~dpotter/howto/daemonize
0435デフォルトの名無しさん
2007/11/21(水) 22:16:54と、djb教授がお怒りです(嘘
0436デフォルトの名無しさん
2007/11/22(木) 12:04:210437デフォルトの名無しさん
2007/11/22(木) 12:06:31fprintf(fp , )は出来ないですけどsprintfでchar配列に入れて出力すれば出来ますね
0438デフォルトの名無しさん
2007/11/22(木) 12:50:29機能の上位機能についてです
0439438
2007/11/22(木) 13:11:03うちのパソコン鈍いので保存に二日かかりそうなんですが
あとこれってテキストファイルやhtmlに変換できますか
0440デフォルトの名無しさん
2007/11/22(木) 13:17:09<<演算子とマニピュレータ使えばできるんじゃない?
0441デフォルトの名無しさん
2007/11/22(木) 20:54:43MFCのこと?
>>439
MSDNライブラリの各記事の実体はHTML。
ただし、複数ファイルをまとめて圧縮した形で格納されている。
ms-help:で始まるURLを使えばIEからも見れる。
0442デフォルトの名無しさん
2007/11/23(金) 05:06:20> next の代わりに (++lst.begin()) と書けば良いではないか?と思われるかもしれませんが、
> begin() の返すイテレータが例えば int* などの組込型であった場合、
> 残念ながらその記述はコンパイルエラーになってしまいます。
どうしてコンパイルエラーになってしまうのですか?
0443デフォルトの名無しさん
2007/11/23(金) 05:33:15++0; がエラーなのと同じ。
0444デフォルトの名無しさん
2007/11/23(金) 05:39:36前置++の対象は変更可能な左辺値じゃない許されない(5.3.2)
から?
規格書買っちゃったけどイマイチ読みかたがわからねぇや
0446デフォルトの名無しさん
2007/11/23(金) 06:52:27++foo(); // エラー
0447デフォルトの名無しさん
2007/11/23(金) 14:35:51#include <stdio.h>
int *get_number(void){
static int number[2]={0,999};
return number;
}
int main(void){
printf("%d\n", ++*get_number());
printf("%d\n", ++*get_number());
printf("%d\n", (*get_number())++);
printf("%d\n", (*get_number())++);
printf("%d\n", *get_number()+1);
printf("%d\n", *(get_number()+1));
return 0;
}
0448デフォルトの名無しさん
2007/11/23(金) 14:37:57何が目的?
0449デフォルトの名無しさん
2007/11/23(金) 14:44:32なんとなく書いてみただけからスルーしてもらっておkです
#include <stdio.h>
typedef void (*func_t)(void);
typedef func_t (*func2_t)(void);
void hello(void){printf("Hello\n");}
func_t hello_func(void){return hello;}
func2_t hello_func_func(void){return hello_func;}
int main(void){
hello_func_func()()();
return 0;
}
0450デフォルトの名無しさん
2007/11/23(金) 14:45:200451デフォルトの名無しさん
2007/11/23(金) 17:01:21Aは1秒ごとに、Bは5秒ごとに呼ばれるものとします。
この1秒と5秒はおおよそで良いので、sleepで止めます。
このAとBを並行して実行させたいとき、
普通はマルチスレッドにするものですか?
Linuxです。
0452デフォルトの名無しさん
2007/11/23(金) 17:03:530453451
2007/11/23(金) 17:16:07そこまでは「およそ」じゃないんです。
リアルタイム性は要らない程度の意味でした。
設定秒数を渡して5秒とか1秒ってのは変わりうるので。
0454デフォルトの名無しさん
2007/11/23(金) 17:40:440455デフォルトの名無しさん
2007/11/23(金) 17:42:29sleep(1);
++cnt;
if (cnt % intervalA == 0) A();
if (cnt % intervalB == 0) B();
}
■ このスレッドは過去ログ倉庫に格納されています