【初心者歓迎】C/C++室 Ver.54【環境依存OK】
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2008/05/14(水) 01:00:02ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.53【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1208989385/l50
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0002デフォルトの名無しさん
2008/05/14(水) 01:11:50(あるなら)wstringstreamとかwstringを使えって意味ね
0003デフォルトの名無しさん
2008/05/14(水) 01:14:32wstringとwstringstreamだと思い込んでいた。
0004前スレ995
2008/05/14(水) 01:22:30本当にありがとうございました。
int i = 123;
std::wstringstream ss;
ss << i;
std::wstring mes = ss.str();
LPCWSTR omes = (LPCWSTR)mes.c_str();
MessageBoxW(0, omes, L"型変換", MB_OK);
0005デフォルトの名無しさん
2008/05/14(水) 02:21:48キャストでなんとかするってのは、はじめのころは
あんまし感心しないコードになることが多い気がする。
0006デフォルトの名無しさん
2008/05/14(水) 04:09:31◆6月にマネージャパン、月刊アスキー、週刊アスキーの3誌が賞金総額2000万円の「シストレFXグランプリ」を開催
http://system-trading.jp/news/index.php?cID=3
5月22日より登録受付開始、6月2日よりグランプリ開始の予定。賞金総額2000万円。
デモトレードの優勝者には賞金三百万円がプレゼントされます。
▼トレード部門
初期資産500万円で、デモ取引のトレード収益を競っていただきます。
http://www.fx-gp.com/about/
▼賞金総額
■社長特別賞(シストレソフト買取価格) 10,000,000円
●シストレソフト部門賞 1位300万円 2位100万円 3位50万円
●トレード部門賞 1位300万円 2位100万円 3位50万円
●前期MVP賞 50万円
●後期MVP賞 50万円
0007デフォルトの名無しさん
2008/05/14(水) 15:04:43eVC++4.0 にて組み込み開発を行っているのですがどうしても下記のwarningが出てしまいます。
class 'Hogehoge' needs to have dll-interface to be used by clients of class 'Foo'
上記エラーが発生した原因はメンバインスタンス変数を static に変更し、かつ、ポインタ
ではなく実体を持つように修正したからだと思われます。
class Foo
{
public:
Hogehoge *hogehoge;
};
↓
class Foo
{
public:
static Hogehoge hogehoge;
};
warningの意味は何なのか? 原因は何なのか? また、解決方法のご存知の方、回答お願いします。
0008デフォルトの名無しさん
2008/05/14(水) 16:07:44やっぱり自分でチェックした方が無難?
0009デフォルトの名無しさん
2008/05/14(水) 18:20:01そのメッセージの前に警告番号とか出なかった?
あと警告やエラーはそれのみ?
>>8
それぞれの関数の仕様を確認すること。
「など」に対しては定義されてないので。
未定義や不定の条件に書いて無ければ、サイズ0もOK。
ただしサイズが負の数みたいな、
有り得ない値は逆に、何も書いてなければNG。
0010デフォルトの名無しさん
2008/05/14(水) 18:31:03それでももちろんsize_tで表現できる最大値とか明らかにおかしいだろって値は存在するけど。
0011デフォルトの名無しさん
2008/05/14(水) 18:33:43Hogeは具体的に何のクラス?
デフォルトコンストラクタがないとか値として持てないクラスじゃね?
0012デフォルトの名無しさん
2008/05/14(水) 18:34:27ありがとうございます。WG14/N843というのを拾ってきたので読んでみました。
snprintf() についてはサイズ0を指定してもよくて、その場合書き込み先バッファはNULLでもいいみたいです。
strncpy()とmemcpy()ではサイズ0の場合については何も書かれてないので、サイズ0もOKみたいですね。
サイズ0のときにバッファをNULLにしてもいいのかどうかまではちょっとわかりませんでしたが…。
あと、サイズはだいたいsize_tで指定するので負になるという心配はあまりなさそうです。
0013デフォルトの名無しさん
2008/05/14(水) 20:26:17サイズ0のときはNULLにして良いよ。
サイズ0なら、指定したバッファのアドレス自体にもアクセスしてはいけないから、
アクセスしたら関数側のバグになる。
0014デフォルトの名無しさん
2008/05/14(水) 20:55:420015デフォルトの名無しさん
2008/05/14(水) 21:44:07そこから派生クラスで実装されている純粋仮想関数を呼びたいのですが、不可能でしょうか?
これが出来ると基底クラスのコンストラクタを再利用出来るし、違う処理(初期化)が必要な部分は
仮想関数の実装を変えるだけでいいので便利だと思ったのですが。
0016デフォルトの名無しさん
2008/05/14(水) 21:52:47できません
基底クラスのコンストラクタ実行中は派生クラスは未構築だからです
0017デフォルトの名無しさん
2008/05/14(水) 22:10:34やはりダメですか・・・
うーん。自分の設計が悪いせいか、基底クラスのコンストラクタ今一役立たずだな・・・
0018デフォルトの名無しさん
2008/05/14(水) 22:18:57>warningの意味は何なのか? 原因は何なのか? また、解決方法のご存知の方、回答お願いします。
英文のままですね。英文の意味が判らないのなら鼬害でしょう。
まぁ、静的なメンバ変数は明示的に実体化しないといけないので普通の環境でもリンクエラーになるわけですが。
0019デフォルトの名無しさん
2008/05/14(水) 22:22:21簡略化した例を示せば賢い人が答えてくれるかも
多分C++ではそういうときにはテンプレートの出番になると思うけど
0020デフォルトの名無しさん
2008/05/14(水) 23:36:19>何も書かれてないということは
いや、書かれていることになる
上の例で出ている関数などでバッファポインタとバッファサイズを取るものは、
[buf, buf+size) の範囲内がアクセス可能ということを要件としているので、
size==0のときはbufのアドレスが何であれ要件を満たすことになる
>>15
似たようなことをする方法はいくつかある
・仮想関数をvfuncとして、基底クラスにinit()などを用意して、
派生クラスのコンストラクタから呼ぶ
※ 基底ctor -> 派生ctor -> 基底init() -> 派生vfunc()
・基底コンストラクタに関数ポインタ類を渡す
・templateクラスにして継承関係を逆にする
※ template<class T> class base : T {};
0021デフォルトの名無しさん
2008/05/14(水) 23:40:30ostringstreamオブジェクトの先頭に任意の文字列を追加できる関数ってありますでしょうか??
探しても見つからなかったのですが。
0022デフォルトの名無しさん
2008/05/15(木) 00:02:36こんなことならできる
int main()
{
using namespace std;
string t("abc");
ostringstream s;
s << "xyz";
s.seekp(0);
s << t + s.str();
cout << s.str() << endl;
return 0;
}
0023デフォルトの名無しさん
2008/05/15(木) 00:07:18一応ストリームなんだから、そういう操作は仮に出来ても勧められないな・・・
前後だけで良いならfront側とback側にstringstreamを持ってstr()時に
結合するラッパーを作るという手はある
超手抜きで書くと
struct {
ostringstream front;
ostringstream back;
string str(){return front.str() + back.str();}
};
またはstd::list<std::string>で構築して、必要になった際に全結合するなど
0025デフォルトの名無しさん
2008/05/15(木) 02:38:37レスありがとうございます。
なるほど、テンプレートや関数ポインタですか。
しかしC++は奥が深そうですね・・・
0026デフォルトの名無しさん
2008/05/15(木) 07:14:4000277
2008/05/15(木) 12:11:02質問するのに肝心な部分を書いてませんでした。
warning C4251 がエラー番号に該当すると思います。
>>11
規約としてデフォルトコンストラクタ、デストラクタは定義
しなければならないのでその点は問題ありません。
>>18
>まぁ、静的なメンバ変数は明示的に実体化しないといけないので普通の環境でもリンクエラーになるわけですが
cppファイル内で実体化させているのか、という意味ならば実体化させているので
その点は問題ないように思います。
試しにstaticをはずしてみたのですが、同様のエラーでした。
NULLチェックやdelete処理などが面倒なので実体を持つようにし、かつ、1つのシステム内で
唯一1つのインスタンスしか使用しないのでstaticで良いじゃないか?
staticにするとわざわざどこかのクラスから参照やポインタで辿っていかなくても Foo::hogehoge
とアクセスできるから楽じゃないか?
と安易に思ったのが失敗だったんでしょう。
0028デフォルトの名無しさん
2008/05/15(木) 12:14:3900297
2008/05/15(木) 12:30:25言っている意味がわからないのですが、こちらでどう調査しても
warning C4251: 'hogehoge : 'class 'Hogehoge' needs to have dll-interface to be used by clients of class 'Foo'
しかわからない
上記warningが発生した原因は特定インスタンスメンバをポインタではなく、static かつ 実体として持つようにした
というのは 7 で書いたつもりです。
言葉足らずのところはこちらのミスですので謝りますが。
エラー番号ではなく警告番号でしたが、どう調査してもC4251しかわかりません。
0030デフォルトの名無しさん
2008/05/15(木) 12:40:36Hohehogeの宣言を晒してくれなきゃワカンネ。
エラーが起こる最小のコードをup
0031デフォルトの名無しさん
2008/05/15(木) 12:46:16どこをどのように直したらいいか教えてください。お願いします。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6554.c
0032デフォルトの名無しさん
2008/05/15(木) 12:55:41sort()とやらはgccの拡張機能である、関数内関数定義を行っているだけで呼び出していないから。
他にもいろいろ突っ込みどころだらけだが……
0033デフォルトの名無しさん
2008/05/15(木) 12:57:32ソートを自分で書くのが目的なら、渡すデータ型に注意だ。
00347
2008/05/15(木) 13:00:59そういうことですか!!
確かに質問するにあたって情報が足りなかったですね。
warningが発生するHogehoge最小ソースは
class Hogehoge
{
public:
Hogehoge(){};
virtual ~Hogehoge(){};
};
です。
003531
2008/05/15(木) 13:05:37main関数の前に
void sort(int *p,int n);
を付け加えました。
他に間違ってるところってどこですか?
0036デフォルトの名無しさん
2008/05/15(木) 13:08:23たくさん。あり過ぎて指摘する気にもならん。
まぁ、作った関数は呼ばなきゃ意味がないことくらいは判るだろうから、
後はコンパイラのエラーメッセージをよく読んで順に潰せ。
そうそう、gccを使っているだろうから、gcc file.c -ansi -Wall -pedanticすることをお勧め。
0038デフォルトの名無しさん
2008/05/15(木) 13:11:36{
public:
HogeHoge(){};
virtual ~HogeHoge(){};
};
class Foo
{
public:
static HogeHoge hogehoge;
};
int main ()
{
Foo myClass;
return 0;
}
問題なく通るけど…
003938
2008/05/15(木) 13:14:35004032
2008/05/15(木) 13:15:08>38だとhogehogeの実体を参照しないからエラーにならないかと。
Hogehogeだけ抜き出さずに、実際にそのエラーが出るソースを作って貼ってみては?
00417
2008/05/15(木) 14:08:53してきました。
もう少し調べてみます。
0042デフォルトの名無しさん
2008/05/15(木) 14:10:170043デフォルトの名無しさん
2008/05/15(木) 15:58:58C4251でググったりはしたよね?
0044デフォルトの名無しさん
2008/05/15(木) 16:09:49> virtual ~HogeHoge(){};
セミコロン要らないだろ
0045デフォルトの名無しさん
2008/05/15(木) 17:54:36double x;
double y;
};
struct point q[200];
memcpy(q,p,(n+1)*sizeof(struct point));
これってどういう事をやってるんですか?
0046デフォルトの名無しさん
2008/05/15(木) 18:02:550047デフォルトの名無しさん
2008/05/15(木) 18:08:27恐らくはstruct point * pがあるとして、
先ずはpoint構造体の要素数200の配列qを宣言している。
続いてその配列qに、point構造体(n+1)個分のデータを配列pからコピーしている。
この部分は、for (int ic = 0; ic < n + 1; ++ic) q[ic] = p[ic];とほぼ同等。
0048デフォルトの名無しさん
2008/05/15(木) 18:19:35int func(int n,struct point p[],double d){
struct point q[200];
;
memcpy(q,p,(n+1)*sizeof(struct point));
}
みたいに構造体が引数で渡されています。
0049デフォルトの名無しさん
2008/05/15(木) 18:21:52「構造体」ではなく、「構造体へのポインタ」ね。つまりは、>47。
0050デフォルトの名無しさん
2008/05/15(木) 18:24:31実際のpの大きさがソースを書くときには不定なので、
for文での代入をしていないってことでしょうか?
0051デフォルトの名無しさん
2008/05/15(木) 18:27:58いや違う。pの大きさは、常に一定だ。何故ならpはポインタ変数だからだ。
pが指す領域のサイズについてはnに依存するわけだが、forループでも勿論巧くコピーできる。
では何故memcpy()を使うかというと、保守性よりも(見かけ上の)効率を優先したか、単に習慣か、
書いた人間にでも聞かないと判らないだろう。
0052デフォルトの名無しさん
2008/05/15(木) 18:29:130053デフォルトの名無しさん
2008/05/15(木) 18:42:400054デフォルトの名無しさん
2008/05/15(木) 18:46:59005545
2008/05/15(木) 18:49:170056デフォルトの名無しさん
2008/05/15(木) 19:00:21>memcpy(q,p,(n+1)*sizeof(struct point));
39文字
>for(int i=0;i<n+1;++i)q[i]=p[i];
32文字
0057デフォルトの名無しさん
2008/05/15(木) 20:30:03疑似命令によくある、生データを直接コードに埋め込む事って、どのようにすればいいのですか?
テーブル参照のようなことを仕様と思ったのですが、やり方がよくわからなくて…
0058デフォルトの名無しさん
2008/05/15(木) 20:34:29逆に言えば
memcpyみたいな動作をする命令があるから、
まともでない(古い)コンパイラだとfor使うより遙かに速く動作する
そういう意味では書く人の習慣の影響が強いが
0059デフォルトの名無しさん
2008/05/15(木) 22:04:53多いクラスにPimplを導入しようかと思ってるのですが、Pimplに
すると問題のあるケースなんてのもあるんでしょうか?
0060デフォルトの名無しさん
2008/05/15(木) 22:11:37>memcpy(q,p,(n+1)*sizeof(*p));
29文字
0061デフォルトの名無しさん
2008/05/15(木) 22:27:5421文字
0062デフォルトの名無しさん
2008/05/15(木) 22:45:30pimplを経由することによる性能上のオーバーヘッド
0063デフォルトの名無しさん
2008/05/15(木) 23:02:23メモリ確保のオーバーヘッドと、メモリ確保に失敗する可能性の増加。
0064デフォルトの名無しさん
2008/05/15(木) 23:23:16なるほど。速度が重要な物や大量に生成される物には
避けた方が良さそうなんですね。
0065デフォルトの名無しさん
2008/05/15(木) 23:24:01仮にPimplによる問題が出ても、
大した手間無く対処出来るから気にする必要無いよ。
0066デフォルトの名無しさん
2008/05/15(木) 23:36:11相互参照の必要な場合が多いとソースが汚く見えるようになる。
0067デフォルトの名無しさん
2008/05/16(金) 02:57:03独習Cで勉強しているのですが、月での実効体重だす問題で関数を作ったのですが
float moon(void)
{
float weight;
printf("体重を入力してください:");
scanf("%f",&weight);
return weight*(17/100);
}
という関数を作った時に
「return weight*17/100」や「return weight*0.17」時は正しい値を返してくれるのですが、
自分が分かりやすいように式を()で囲うと正しい値を返してくれずに0.00000という値が返ってきます。
理由がわからないのですが、どなたか分かる方教えて下さい。
0068デフォルトの名無しさん
2008/05/16(金) 02:59:300069デフォルトの名無しさん
2008/05/16(金) 03:01:40(17.0/100)とかならOK
0070デフォルトの名無しさん
2008/05/16(金) 03:04:1317と100が整数だから、17 / 100の結果も整数(切り捨てで0)になってしまう。
weight * 17 / 100と書いたときには、(weight * 17) / 100と扱われ、
weight * 17がfloat型で結果を返し、それに整数100を掛けても
やっぱりfloat型になるのでうまくいくという具合。
逆にいえば、17などをfloat型にすればいいわけで、
return weight * (17.0f / 100.0f);とすればうまくいく。
0071デフォルトの名無しさん
2008/05/16(金) 03:09:58>>70
なるほど、型が大きいほうに合わせられるっていうのは数値だけの計算にも当てはまるんですね。
変数だけしかそういう風にならないと勘違いしていました。
非常に分かりやすい説明ありがとうございました。勉強になりました。
0072デフォルトの名無しさん
2008/05/16(金) 11:46:560073デフォルトの名無しさん
2008/05/16(金) 11:58:440074デフォルトの名無しさん
2008/05/16(金) 13:09:380075デフォルトの名無しさん
2008/05/16(金) 20:39:22>・templateクラスにして継承関係を逆にする
> ※ template<class T> class base : T {};
これ、よく分からないので具体例あげてくれるとありがたい。
0076デフォルトの名無しさん
2008/05/17(土) 03:21:50A() { f(); }
virtual void f() = 0;
};
struct B {
virtual void f(){}
};
を
template<class T>
struct X : T {
X() { f(); }
};
struct Y {
void f() {}
};
typedef X<Y> Z;
0077デフォルトの名無しさん
2008/05/17(土) 03:22:49> X() { f(); }
X() { T::f(); }
0078デフォルトの名無しさん
2008/05/17(土) 09:58:03先日基底クラスのデストラクタを仮想にし忘れ、メモリーリークというお約束のミスをやってしまいました。
この手のミスを無くしたいのですが、warningを出させる方法や、チェックツールなどはないでしょうか?
環境はVS6.0です。
仮想関数テーブルへのアクセスによるオーバーヘッドは現状気にしていないので、全てのクラス関数を仮想にしたいのですが、たまにつけわすれてしまうのです。
0079デフォルトの名無しさん
2008/05/17(土) 10:04:15C++を学ぼうと思ってるんですが良い参考書orWebページはありますか?
008075
2008/05/17(土) 10:09:49ありがとう。
ただこの方法だと元々の継承関係が失われないかい?
(76はミスタイプと思うが、元々はstruct A : B)
質問者は継承関係は維持したいと思うけど。
0082デフォルトの名無しさん
2008/05/17(土) 13:28:04「メモリリーク 検出」とかでググれば解説してるサイトがいっぱいでてくる
0083デフォルトの名無しさん
2008/05/17(土) 13:55:08デストラクタを仮想にした基底クラスを作って、クラスを作るときに必ずそれを派生して使うようにすれば忘れることはない。
0084デフォルトの名無しさん
2008/05/17(土) 13:57:15それを忘れないようにするためって話じゃないのか?w
0085デフォルトの名無しさん
2008/05/17(土) 13:58:33デストラクタの話ね。
0086デフォルトの名無しさん
2008/05/17(土) 14:43:18個別にvirtualを書かなくて済むようにした方が良い、って意味なのでは?
でもそしたら今度は、それ継承するのを忘れない方法は?
って話になりそうだけど。
0087デフォルトの名無しさん
2008/05/17(土) 14:46:510088デフォルトの名無しさん
2008/05/17(土) 14:57:06それを忘れないようにするためって話じゃないのか?w
0089デフォルトの名無しさん
2008/05/17(土) 15:02:42忘れにくさという点で、
>>78より>83
それより>>87
と良くなっているように見えるけど。
0090デフォルトの名無しさん
2008/05/17(土) 15:10:270091デフォルトの名無しさん
2008/05/17(土) 15:42:28の : public Objectを書かなかったらやっぱりバグるわけだしなー
それじゃ意味ないだろう
継承しなければコンパイルエラーになるようにできるなら、別だが。
0092デフォルトの名無しさん
2008/05/17(土) 16:13:220093デフォルトの名無しさん
2008/05/17(土) 16:19:14#define STD_STRUCT(NAME) struct NAME : public virtual Object
#define STD_CLASS(NAME) class NAME : public virtual Object
STD_CLASS(ClassA) {
public:
~ClassA(){std::cout << "~ClassA" << std::endl;}
};
STD_CLASS(ClassB), public ClassA {
public:
~ClassB(){std::cout << "~ClassB" << std::endl;}
};
void f()
{
ClassA* p = new ClassB();
delete p;
}
0094デフォルトの名無しさん
2008/05/17(土) 16:27:100095デフォルトの名無しさん
2008/05/17(土) 16:30:03>>89
5レス前すら読めない人はこのスレに必要ありませんよ
0096デフォルトの名無しさん
2008/05/17(土) 16:31:460097デフォルトの名無しさん
2008/05/17(土) 16:33:46俺は必要としたことないから知らんが、書式チェックツールくらいないのか?
0098デフォルトの名無しさん
2008/05/17(土) 16:36:19デストラクタは先頭に ~ が付いててわかりやすいから、
その前にvirtualが付いてるかどうかくらい簡単に判定できそう
そもそもデストラクタを書いてない場合は役に立たないが・・・
0099デフォルトの名無しさん
2008/05/17(土) 16:38:42>>78を読む限り、まずミスを無くしたい、という目的があって、
その方法として警告、チェックツール「など」、
と手段の例を挙げているので、
同じく、ミスを無くす/減らす方法を書いてるレスが
意図を無視してるようには見えないけど?
0100デフォルトの名無しさん
2008/05/17(土) 17:06:19総称型プログラミングを覚えた方がいいと思った。
0101デフォルトの名無しさん
2008/05/17(土) 17:08:30実行時ポリモーフィズムが必要な場合はどうするの。
0102デフォルトの名無しさん
2008/05/17(土) 17:10:550103デフォルトの名無しさん
2008/05/17(土) 17:31:36export のない C++ でジェネリックばっかやってると
コンパイルが重くて現実的じゃない事も。
0104デフォルトの名無しさん
2008/05/17(土) 21:16:08そしてそのツールでチェックするのをつい忘れるわけですね、わかります。
0105デフォルトの名無しさん
2008/05/17(土) 22:34:11make使うならMakefileに組み込めばおk。
総合環境なら・・・ カスタムビルドステップ?
0106デフォルトの名無しさん
2008/05/17(土) 22:42:35最悪、考え方としてはおかしくなったときにチェックすればいいわけだし。
0107デフォルトの名無しさん
2008/05/17(土) 23:08:54なんかの統合環境で、virtualな関数をオーバーライドする時にvirtualつけておかないとワーニング出すって設定できたよな?
これはvirtualですよー、わかってますかー?って意味合いで
0108デフォルトの名無しさん
2008/05/18(日) 00:36:52delphiならviryualで新しく作って、overrideでオーバーライドするから間違えたらエラーになるんだがなぁ
0109デフォルトの名無しさん
2008/05/18(日) 00:37:370110デフォルトの名無しさん
2008/05/18(日) 00:41:27あれはいい仕様だと思う。
0111デフォルトの名無しさん
2008/05/18(日) 01:18:54それは余計なお世話な気もするな。コーディング規約レベルだと思う。
0112デフォルトの名無しさん
2008/05/18(日) 01:25:16仮想関数じゃないつもりで関数追加して泣きを見るのを防止できる。
0113デフォルトの名無しさん
2008/05/18(日) 09:07:18overrideはいい仕様だ
0114デフォルトの名無しさん
2008/05/18(日) 11:38:49typo で泣くことになる。
0115デフォルトの名無しさん
2008/05/18(日) 11:52:390116デフォルトの名無しさん
2008/05/18(日) 12:19:28アノテーションが用意されました。
0117デフォルトの名無しさん
2008/05/18(日) 13:19:390118デフォルトの名無しさん
2008/05/18(日) 13:30:360119デフォルトの名無しさん
2008/05/18(日) 13:40:200120デフォルトの名無しさん
2008/05/18(日) 13:42:080121デフォルトの名無しさん
2008/05/18(日) 13:42:410122デフォルトの名無しさん
2008/05/19(月) 08:14:21Num = rand() % 100;
で、0から99までの範囲に含まれる値を取得できる
と書いてあるんですが、
どうやったらこうなるんですか?
0123デフォルトの名無しさん
2008/05/19(月) 08:22:05rand() → ランダムな整数を取得
% 100 → 100で割った余り
0124デフォルトの名無しさん
2008/05/19(月) 08:28:10とりあえずここらへん読んだ方がいいと思う
0125デフォルトの名無しさん
2008/05/19(月) 09:43:37■ ■ 違う板にコピペすると、四角の枠の中に
■ ■ メッセージとURLが現れる不思議な絵。
■ ■
■ (´?ω?`) ■ (その仕組みがリンク先に書いてある)
■ ■
■ ■ この原理を応用すると、まったく新しい
■ ■ コピペが作れる予感。
■■■■■■■■■■■■■■■■
0126デフォルトの名無しさん
2008/05/19(月) 10:10:45■■■■■■■■■■■■■■■■
■ ■ 違う板にコピペすると、四角の枠の中に
■ ■ メッセージとURLが現れる不思議な絵。
■ ■
■ (´・ω・`) ■ (その仕組みがリンク先に書いてある)
■ http://kat.cc/19b06f .■
■ ■ この原理を応用すると、まったく新しい
■ ■ コピペが作れる予感。
■■■■■■■■■■■■■■■■
0127デフォルトの名無しさん
2008/05/19(月) 19:25:55取得しなおさなくて使えますか?前にvectorで痛い目見たもんで・・・
0128デフォルトの名無しさん
2008/05/19(月) 19:34:53「erase 戻り値」でgoogle
0129デフォルトの名無しさん
2008/05/19(月) 19:44:30すまん勘違いした。
listでのinsertは全てのイテレータを無効にしない。
eraseは対象イテレータのみ無効になる。
つまり、大丈夫。
0130デフォルトの名無しさん
2008/05/19(月) 20:13:430131デフォルトの名無しさん
2008/05/19(月) 20:31:31↑のやり方でやっていたのですが、どうも拙いと気付きました
巧いファイル構成を身に付けたいのですが、中々しっくり来る資料が…orz
コレ読んどけよって書籍やソースなどあればご指導願いします
0132デフォルトの名無しさん
2008/05/19(月) 20:47:43A L L h p p
0133131
2008/05/19(月) 22:32:000134デフォルトの名無しさん
2008/05/19(月) 23:42:52以下のリソースファイルをプロジェクトに加えてコンパイルすると
Visual Studioが強制終了してしまいます。なぜでしょうか?
//--- menu.rc---
#include <windows.h>
#define MENU_NEW 2000
#define MENU_OPEN 2001
SAMPLE03 MENU DISCARDABLE
{
POPUP L"ファイル"
{
MENUITEM L"新規作成",MENU_NEW
MENUITEM L"読み込み",MENU_OPEN
}
}
0135デフォルトの名無しさん
2008/05/19(月) 23:56:00同じニーズに応えたライブラリはありませんか?
0136デフォルトの名無しさん
2008/05/20(火) 02:59:19そのやりかたで何が拙いと思ったのか気になる。
0137デフォルトの名無しさん
2008/05/20(火) 03:00:19Loki のやつは知らないけど、たぶん segregated strage だろうってことで boost::pool でいいかな?
0138デフォルトの名無しさん
2008/05/20(火) 11:45:17すでに開いてるコマンドプロンプトの標準入出力を別のパイプに繋ぐことってできますか?
0139デフォルトの名無しさん
2008/05/20(火) 12:20:20でもそうやって乱数を取得しないほうがいいんだよ。
0140デフォルトの名無しさん
2008/05/20(火) 18:17:41ROL (ローテート) に相当する演算子は C/C++ では用意されてないのでしょうか?
0141デフォルトの名無しさん
2008/05/20(火) 18:34:520142デフォルトの名無しさん
2008/05/20(火) 18:38:00そうですか。どうもありがとうございました。
0143デフォルトの名無しさん
2008/05/20(火) 18:45:380144デフォルトの名無しさん
2008/05/20(火) 19:28:50なるほど、そんな関数があるんですね。教えてくださってどうもありがとうございました。
0145デフォルトの名無しさん
2008/05/20(火) 19:37:270146デフォルトの名無しさん
2008/05/20(火) 20:18:13int a; a=0x0000000f;
_asm{
MOV EBX,a
ROL EBX,2
MOV a,EBX
}
なんて書くのもアリだったりする?それとも、こういう実装の仕方は普通はしない?
0147デフォルトの名無しさん
2008/05/20(火) 20:25:49ビット演算組み合わせるとか
0148デフォルトの名無しさん
2008/05/20(火) 20:28:30なるほど、分りました。お答えくださってどうもありがとうございました。
0149デフォルトの名無しさん
2008/05/20(火) 20:39:02w = w<<s | w>>(32-s)
みたいにするとrotlにしてくれる場合がある。
確実にしたければ以下のようなインライン関数を作って呼び出せばOK
static inline uint32_t rotl(uint32_t src, uint8_t n) {
__asm__("roll %2,%1"
: "=r"(src)
: "0"(src), "cI"(n));
return src;
}
gccはインラインアセンブラも最適化の対象になるので、
単純に>>146みたいにするとおかしなことになるかも?
0150デフォルトの名無しさん
2008/05/20(火) 21:10:48それ以外の場合で環境依存を強めるのは止めようぜ・・・。
0151デフォルトの名無しさん
2008/05/20(火) 22:54:25環境 VC6.0 / Windows2000
において、以下のコードで
i=m_NoList.begin()実行後に、
アクセスバイオレーションエラーが発生します。
デバッグでは、begin→STLのソース NEXT (_HEAD)・・・という箇所で
不正アドレスを参照しているように見えますが、原因が特定できません。
腑に落ちないのは、
if(m_NoList.size()>0)で要素があるにもかかわらず、
beginを実行するとエラーが発生するという点です。
使い方が間違っているのかもしれませんが、
ご見識のある方がいらしましたら、アドバイスお願いします m(__)m
Mutex.get(); ←ミューテックスでロックする
std::list<ListNo>::iterator i;
if(m_NoList.size()>0)
{
for ( i=m_NoList.begin(); i!=m_NoList.end();i++ ){ ←beginでエラー発生
if ( (*i) == No ) {
Mutex.release(); ←ミューテックスを開放する
return true;
}
}
Mutex.release(); ←ミューテックスを開放する
}
0152デフォルトの名無しさん
2008/05/20(火) 23:00:40ListNoの型は何?
0153デフォルトの名無しさん
2008/05/21(水) 00:37:12最初の*&x=,x=が2,2になるのはわかるんですが、2度目の*&x=が5になるのがわからなくて・・・
もし*&x=5なら最後の出力は10になる気がするのですが。
#include <stdio.h>
int x=1;
void f(int *p){
*p+=x;
}
int main(void){
int y;
f(&x);
printf("*&x=%d,x=%d\n",*&x,x);
{
int x=5;
printf("*&x=%d,x=%d\n",*&x,x);
f(&x);
y=x;
}
x=y;
printf("%d\n",x);
return 0;
}
0154デフォルトの名無しさん
2008/05/21(水) 00:43:08でも二回目に表示されるxはスコープをy=xを終えた後
スコープを抜けて無効になるから結果が7になる
0155デフォルトの名無しさん
2008/05/21(水) 00:44:02>二回目に表示されるxはy=xを終えた後
の間違いでした
0156デフォルトの名無しさん
2008/05/21(水) 00:44:51*&xはいつもxと同じ、わざわざxと並べる意味はない。
外のxと中のxを別の変数だと思えば、理解しやすいと思う。
int グローバルなx=1;
void f(int *p) {
*p+=グローバルなx;
}
int main(void) {
int y;
f(&グローバルなx);
printf("*&x=%d,x=%d\n",*&グローバルなx,グローバルなx);
{
int ローカルなx=5;
printf("*&x=%d,x=%d\n",*&ローカルなx,ローカルなx);
f(&ローカルなx);
y=ローカルなx;
}
グローバルなx=y;
printf("%d\n",グローバルなx);
return 0;
}
0157デフォルトの名無しさん
2008/05/21(水) 01:00:17class AAA
class BBB : public AAA
class CCC : public BBB
という継承しているクラスがあった時に、
AAA *pA;
BBB *pB;
CCC C, *pC;
pA = &C;
pB = &C;
pC = &C;
と書く事ができるのですが、
pA = &C;
pB = &C;
は、何でコンパイラに怒られないんでしょうか?
継承というのは、継承したクラスとしての扱いもできる、というような
イメージでいいんでしょうか?
0158デフォルトの名無しさん
2008/05/21(水) 01:03:32全部同じポインタ変数で扱えて便利なことも多い
0159153
2008/05/21(水) 01:07:19解答ありがとうございました。
よく考えてみれば、int x=5;は代入ではなく変数の宣言でしたね…
ということは、最初のf(&x)でグローバルxにグローバルx+グローバルx(1+1=2)が代入されて、
次のf(&x)ではローカルxにローカルx+グローバルx(5+2=7)が代入され、
最後にローカルx→y→グローバルx(出力)という考え方でよいのでしょうか。
0160デフォルトの名無しさん
2008/05/21(水) 01:11:220161157
2008/05/21(水) 01:25:15レスありがとうございます。
> 同じクラスから派生した物だったら大体似たようなもの筈だから
とありますが、構造体の場合は、
中身が全く一緒だとしてもコンパイルでエラーが出ますよね?
struct AA
struct BB
AA *p, A;
BB B;
p = &A;
p = &B; ←キャスト違い
p = (AA*)(&B)
上のようにキャストを変更してあげればコンパイルは通りますが、
継承したクラスの場合は、勝手にこのような処理をしてくれているのでしょうか?
何でクラスの継承の場合は問題なくコンパイルが通るのかが気になってしまって…。
0162デフォルトの名無しさん
2008/05/21(水) 01:28:48つまりそうなるようにわざわざ作った
0163デフォルトの名無しさん
2008/05/21(水) 01:29:090164デフォルトの名無しさん
2008/05/21(水) 01:31:490165デフォルトの名無しさん
2008/05/21(水) 01:36:44基底クラス←派生クラス
っていうポインタの代入はダウンキャストだもんな。
そこがいまだにしっくり来ない。
0166157
2008/05/21(水) 01:46:32継承したクラスとしての扱いもできるのは
とりあえずそういう仕様だという事なのですね。
おかげさまで勉強になりました。
ありがとうございました!
0167デフォルトの名無しさん
2008/05/21(水) 02:16:00int main(void){
int a[]={0,0,0,0};
int k=1;
a[k]=1;
a[a[k]]=2;
printf("%d\n",a[a[k]]);
return 0;
}
で、出力が2ではなく0になるのですがどうしてでしょうか。
ご教授のほどよろしくお願いします。
0168デフォルトの名無しさん
2008/05/21(水) 02:30:40int main(void){
int a[]={0,0,0,0};
int k=1;
a[k]=1;
a[a[k]]=2; ←ここで a[a[k]]→a[a[1]]→a[1]=2になってる
printf("%d\n",a[a[k]]); ←つまりここでは a[a[k]]→a[a[1]]→a[2]なので0のまま
return 0;
}
0169デフォルトの名無しさん
2008/05/21(水) 02:30:45#include <stdio.h>
int main(void){
int a[]={0,0,0,0};
int k=1;
a[k]=1; // a[k] == a[1]
a[a[k]]=2; // a[a[k]] == a[a[1]] == a[1]
printf("%d\n",a[a[k]]); // a[a[k]] == a[a[1]] == a[2]
return 0;
}
0170デフォルトの名無しさん
2008/05/21(水) 02:31:510171デフォルトの名無しさん
2008/05/21(水) 02:35:31教えて感がでてればええんじゃい
0172デフォルトの名無しさん
2008/05/21(水) 03:08:07170が丁寧に教えてくれただけでもありがたいと思わないと。
0173デフォルトの名無しさん
2008/05/21(水) 04:12:27漢字が違うのではなく、言葉が違うのです。
自分の間違いをできる限り「小さくてどうでもいいこと」と思いたい雑魚特有の気持ちはわかりますが、
たった2文字でも十分過ぎるほど馬鹿さが滲み出てしまう、割と致命的なことですので、
二度と間違えないよう気をつけることをおすすめします。
0174デフォルトの名無しさん
2008/05/21(水) 07:11:01大規模にするにつれてヘッダの量に煩わしさを感じたのですが
普通は纏めないほうが修正が容易で良いと評価されるのでしょうか?
0175デフォルトの名無しさん
2008/05/21(水) 07:28:120176デフォルトの名無しさん
2008/05/21(水) 07:36:18デバッグが楽だと思うんだけど
0177デフォルトの名無しさん
2008/05/21(水) 12:16:16ヘッダを纏めるなんてとんでもない。無駄に依存関係が膨らむだけだろ。
0178デフォルトの名無しさん
2008/05/21(水) 12:31:16たまたま同じ構成だっただけで目的が同じとは限らないからな。3次元の座標の構造体が、3原色を表す構造体にコピーできたら困る品。
0179デフォルトの名無しさん
2008/05/22(木) 23:07:17class A {};
UseA.hpp
#inlcude "A.hpp"
class UseA { A m_obj; };
main.cpp
#include "UseA.h"
とするとmain.cppでA.hppまでインクルードされてしまい、回避するにはUseA.hppにて
class A;
UseA { A* m_p; }
とするくらいしか思いつかないのですが、もっと単純な方法ってありますか?
具体的には、main.cppからはclass Aのインスタンスが作成できないようにしたい、ということです。
0180デフォルトの名無しさん
2008/05/22(木) 23:21:220181デフォルトの名無しさん
2008/05/22(木) 23:26:39無理です。名前空間で工夫してください。
namespace detail { class A{...}; } とか。
0182デフォルトの名無しさん
2008/05/22(木) 23:32:140183デフォルトの名無しさん
2008/05/22(木) 23:38:31class UseA;
class A { friend UseA; ... };
0184デフォルトの名無しさん
2008/05/23(金) 00:31:03sizeof(wchar_t) == 2ならUTF-16、
sizeof(wchar_t) == 4ならUCS4
って考えて実用上は問題ないでしょうか
(Linux||Mac)&gcc、Win&(VC++||bcc)あたりで動けばいいかなと思ってるんですが
ICU使うほどの処理でもないような気がするんです
0185デフォルトの名無しさん
2008/05/23(金) 00:38:390186デフォルトの名無しさん
2008/05/23(金) 00:58:08初心者ながら調べまわったのですがここにたどり着きました。
お願いします。
ベクトルの要素削除eraseは引数にイテレータを入れますが
要素参照のatのように添字を使用して要素を削除することはできないのでしょうか?
0187デフォルトの名無しさん
2008/05/23(金) 00:59:450188デフォルトの名無しさん
2008/05/23(金) 01:03:42erase()ではできませんが、advance()辺りでIteratorを作ればできなくはありません。
0189デフォルトの名無しさん
2008/05/23(金) 01:09:11こういうノリでいける気がするけどどうなんだか
0190デフォルトの名無しさん
2008/05/23(金) 01:36:58Windowsのwchar_tはUTF-16で問題ないと思う。
Linuxのglibcのwchar_tはUCS4で問題ないと思う。
Mac OS X では wchar_tはサポートされていない。
それ以外のUNIXではwchar_tの中身はUnicodeではないことが多い。
0191デフォルトの名無しさん
2008/05/23(金) 02:48:50いけるね。
v[3]とv.begin()+3は結局同じ要素をさしているけど
後者はイテレータとして扱われる。
Accelerated C++でもそういう例が出てくる。
0192デフォルトの名無しさん
2008/05/23(金) 03:35:08型の詳細がわからないオブジェクト同士の比較(メンバ変数の比較)
をするのにいい関数ってありますか?
0193デフォルトの名無しさん
2008/05/23(金) 04:58:15「比較」というのは、どういう比較をしたいのか。この場合の「いい」とは何を指すのか。
現状も願望も曖昧に書かれているから、答えようが無い。
0194デフォルトの名無しさん
2008/05/23(金) 08:43:57細かいことを言うと、あとでvectorをやっぱりlistにしたい
何てことになったときに書き直さなきゃならなくなる。
なのでadvanceで書いておいたほうが良いかも知れない。
0195デフォルトの名無しさん
2008/05/23(金) 08:52:24そこで boost::next() ですよ。
0196デフォルトの名無しさん
2008/05/23(金) 12:13:17advance()とイテレータの加算で解決できました。
ありがとうございました。
>>195
boostというライブラリさえ知りませんでした
おかげで知識の幅が広がりました
0197デフォルトの名無しさん
2008/05/23(金) 12:30:190198デフォルトの名無しさん
2008/05/23(金) 17:35:06char ch [4] = { 0x10, 0x11, 0x12, 0x00}
みたいに値を代入できますが、
char ch [4];
char ch = { 0x10, 0x11, 0x12, 0x00};
みたいに、一旦宣言だけしておいて代入、みたいなことはできませんよね。
では、クラスのchar型のデータメンバをコンストラクタで初期化する時に
char ch [4] = { 0x10, 0x11, 0x12, 0x00}
みたいに格納したいときはどうすればよいでしょうか??
strcpy()は使えないですよね??
0199デフォルトの名無しさん
2008/05/23(金) 17:36:21char ch = { 0x10, 0x11, 0x12, 0x00};
2行目、先頭のcharが余計でした。
0200デフォルトの名無しさん
2008/05/23(金) 17:39:30ch[0] = 0x10;
ch[1] = 0x11;
ch[2] = 0x12;
ch[3] = 0x00;
0201デフォルトの名無しさん
2008/05/23(金) 17:41:23やっぱりコンストラクタでやる場合はそれしかない感じでしょうか。
あとはstaticメンバにしてグローバル領域で初期化ぐらいでしょうか・・
0202デフォルトの名無しさん
2008/05/23(金) 17:42:100203デフォルトの名無しさん
2008/05/23(金) 17:59:210204デフォルトの名無しさん
2008/05/23(金) 18:03:29vector<int> v, v2;
v = list_of(1)(2)(3);
// v = {
v2 = list_of(0).range(v).range(v.begin(),v.end())(4);
// v2 = [0,1,2,3,1,2,3,4]
0205デフォルトの名無しさん
2008/05/23(金) 18:04:56boostにこんなのもある。
生配列に使えたか分からんけど
using namespace boost::assign;
vector<int> v, v2;
v = list_of(1)(2)(3);
// v = {1,2,3}
v2 = list_of(0).range(v).range(v.begin(),v.end())(4);
// v2 = [0,1,2,3,1,2,3,4]
0206デフォルトの名無しさん
2008/05/23(金) 18:08:43boostが使えなくてもoperator()()で糖衣構文が作れるから忘れないでいて欲しい。
0207デフォルトの名無しさん
2008/05/23(金) 18:43:50scanf("%s",input);
scanfで読み込んだファイル名をhoge.txtとして
outfileにhogehoge_hoge.txtと代入するにはどうしたらいいですか?
0208デフォルトの名無しさん
2008/05/23(金) 18:50:260209デフォルトの名無しさん
2008/05/23(金) 19:08:360210デフォルトの名無しさん
2008/05/23(金) 19:11:230211デフォルトの名無しさん
2008/05/23(金) 19:12:580212デフォルトの名無しさん
2008/05/23(金) 19:14:090213デフォルトの名無しさん
2008/05/23(金) 19:54:53>>203
ありがとうございます。コンストラクタ内でコピーでなんとかなりました。
0214デフォルトの名無しさん
2008/05/23(金) 19:59:20ss << "abcdefghijklmn";
ss.str().replace(2,1,1,'x');
fout << ss.str();
みたいなことをしたいのですが、文字列が"abcdefghijklmn"のまま出力されます。
こういうことはできないのでしょうか??
0215マイク ◆yrBrqfF1Ew
2008/05/23(金) 21:34:20stringstream ss;
ss << "abcdefghijklmn";
string str(ss.str());
str.replace(2,1,1,'x');
fout << str;
std::stringstream::str()は呼ばれるたび一時オブジェクトを生成して返すから文字が変更されない、気がした。
詳しくはC++の仕様書なりライブラリドキュメントを参照すべし。
0216マイク ◆yrBrqfF1Ew
2008/05/23(金) 21:41:51const string &str(ss.str().replace(2,1,1,'x'));
の方が無駄なインスタンス作らないかも。
0217デフォルトの名無しさん
2008/05/23(金) 22:46:48プログラミング大会とかゲームコンテストってあるのですか?
できれば高校在学中にどうにかして成果をあげたいので・・・
ゲームの作り込みとかもあるんだろうけど、
意見ある方や知ってる方などいたら教えてくださいな
0218デフォルトの名無しさん
2008/05/23(金) 22:54:44マイク、replaceの戻り値はstring&だから、それヤバイよ。
0219デフォルトの名無しさん
2008/05/23(金) 22:55:59HSPコンテスト
0220デフォルトの名無しさん
2008/05/23(金) 22:58:57HSPコンテストは出しましたw
1次予選は受かったものの賞はもらえませんでしたが・・・
HSPでゲームやツールを作ったくらいでは成果にならない、
ということも耳にします。
0221デフォルトの名無しさん
2008/05/23(金) 22:59:530222デフォルトの名無しさん
2008/05/23(金) 23:01:210223デフォルトの名無しさん
2008/05/23(金) 23:02:18面白いゲームが作れるかは別。
0224デフォルトの名無しさん
2008/05/23(金) 23:04:30ゲームの一部の開発は出来る。ゲームが作りたいの?
0225デフォルトの名無しさん
2008/05/23(金) 23:09:09論旨はわかるけど、別の人を例に出したほうが良いでしょう
0226デフォルトの名無しさん
2008/05/23(金) 23:12:03丁度ばら撒くように賞を出してた頃だったからあれはあれで結構ショックだった。
でもあんなもの何の役にもたたんよ。同人だからな。どうせ219はネタのつもりで書いたんだろう。
0227デフォルトの名無しさん
2008/05/23(金) 23:12:19何でゲーム限定になってるんだ?w
0228デフォルトの名無しさん
2008/05/23(金) 23:12:36http://www.jipdec.or.jp/procon/
0229デフォルトの名無しさん
2008/05/23(金) 23:15:12競いようがない気がするw
0230デフォルトの名無しさん
2008/05/23(金) 23:19:17堀井は言うほど作れなかったよ。
某雑誌の投稿者管理のプログラムを作るのが関の山。
それも、データを変換するとか圧縮するとかいう発想がないために
オンメモリでしか処理できなくて最後は破綻していた希ガス。
0231デフォルトの名無しさん
2008/05/23(金) 23:22:06コンテストもいいのですが、オープンソースの世界にとびこむのはどうでしょうか。
時代遅れの資格試験・どこの馬の骨ともわからないコンテストよりは、はるかに「実績」「キャリア」となり、多くの人に評価されると思います。
Vine Linux のメンテなどは、非常にありがたがられるでしょうね。
年をとると、いろいろなしがらみがあって、こういった方面に手を伸ばすリソースがないのです。
0232デフォルトの名無しさん
2008/05/23(金) 23:42:450233デフォルトの名無しさん
2008/05/23(金) 23:47:42ss << "abcdefghijklmn";
fout << ss.str().replace(2,1,1,'x');
0234デフォルトの名無しさん
2008/05/23(金) 23:53:10おい
const string& を std::replaceするのか
0235デフォルトの名無しさん
2008/05/23(金) 23:57:42std::string std::stringstream::str() const;
だよ。
0237デフォルトの名無しさん
2008/05/24(土) 00:00:41何か日本語的におかしいかな?
0238デフォルトの名無しさん
2008/05/24(土) 00:02:41そこじゃなくて、戻り値がstd::stringだろうと。
値返しでしょ?
0239デフォルトの名無しさん
2008/05/24(土) 00:08:171GBのstr()があったら丸々コピーするのか
0240デフォルトの名無しさん
2008/05/24(土) 00:11:300241デフォルトの名無しさん
2008/05/24(土) 00:12:480242デフォルトの名無しさん
2008/05/24(土) 00:17:21初心者スレなので、初心者のために説明書いておくてst
>>215は問題ない実装。
ただし、ss.str()でインスタンスが作られて、
string strでもう一つインスタンスが作られるので、
ほんの僅かの無駄がある。でも通常気にすることは無いレベル。
>>216は、その僅かな無駄も無くそうとしていて、
const参照による一時オブジェクトの束縛を利用しようとした。
しかし、replaceの戻り値が一時オブジェクトでないので、
束縛出来ず消えてしまい、&strは不正な領域を指してしまう。
>>233は関数から戻るまで、その引数が生存することを利用してる。
str()で作られたインスタンスが、replaceで変更され、
「<<」で出力された後に消える。一番無駄の無い実装。
>>239
そういう場合、普通はstr()などせずにストリームアルゴリズムで扱う。
0243デフォルトの名無しさん
2008/05/24(土) 00:17:39データはstringstreamが握ってるんだから、
std::stringのdata()やc_str()のように、データへの参照を返す手段も
あったほうが良かったよねってことじゃないの
0244デフォルトの名無しさん
2008/05/24(土) 00:34:40>>216はreplaceの戻り値が一時オブジェクトでも不正になる。
0245デフォルトの名無しさん
2008/05/24(土) 00:44:25string::c_str()の存在だって本当は褒められたもんじゃない。
0246デフォルトの名無しさん
2008/05/24(土) 00:44:40const参照は一時オブジェクトを束縛できるよ。
オブジェクトの寿命が参照のスコープまで延命される。
0247デフォルトの名無しさん
2008/05/24(土) 00:45:03>不正になる。
ならないよ。
分かりやすそうなサンプルコードがあった。これ見て。
http://cppemb.blog17.fc2.com/blog-entry-49.html
0249デフォルトの名無しさん
2008/05/24(土) 01:03:09別にプログラマとして「凄腕だった」わけじゃないけど、
一応テニスゲームが入選したことでエニックス(現スクウェア・エニックス)と縁できた人なわけで、
投稿者管理のプログラムが関の山っていうのは、えらく誤解を招く表現だと思うけど。
いずれにせよ、「プログラミングという行為のリアリティ」を経験した上でゲームデザインやってる、
というのは大きいね。
そのフィーリングをまるで知らず、何か肝心のところでピント外れのSEや文系上司、多いものな。
0250デフォルトの名無しさん
2008/05/24(土) 01:40:54軽井沢誘拐案内までは
シナリオ・音楽・グラフィックに加えて
プログラムも組んでたとおもたけど。
0251217
2008/05/24(土) 01:48:53みなさんありがとうございます
軽い処理、ゲームを作るのはプログラマの永遠の課題ですねw
自分のゲーム重いので・・
>>221
HALってこんなこともやっていたのですね・・初耳でした
参考にさせていただきます
>>228
おお このようなものまで
多少調べたのですが出てきませんでした
ありがとうございます、参考にさせていただきます
0252デフォルトの名無しさん
2008/05/24(土) 01:51:23#include <iostream>
#include <string>
int main(){
std::wcout << L"あ" << std::endl;
return 0;
}
何も表示されません。どうすれば良いんですか。
0253デフォルトの名無しさん
2008/05/24(土) 01:53:55std::wcout.imbue(std::locale("japanese"));
したら使えるようになりました。ありがとうございました。
0254デフォルトの名無しさん
2008/05/24(土) 02:25:54優勝すれば大金ゲットのチャンスのある大会。
コンピュータ将棋の大会で優勝したら年収1000万以上らしいよ。
シストレFXグランプリで優勝したら300万で、特別賞が1000万。
YSSと彩のページ http://www32.ocn.ne.jp/~yss/index_j.html
シストレFXグランプリ http://www.fx-gp.com/
0255デフォルトの名無しさん
2008/05/24(土) 14:26:59http://www.gsic.titech.ac.jp/supercon/
高校生で有名なのっていうとコレじゃないかな?グループ参加だけど
0256デフォルトの名無しさん
2008/05/24(土) 18:12:55内部でwchar_tを使用しているので、バイナリファイルの読み込み
にwfstreamを使用しようと思ったのですが、read()のバッファの引数
がwchar_tになってしまうので、このままではwchar_tからcharに変換
するためにコストがかかってしまいます。
C++の標準ライブラリの範囲内で、ファイル名にwchar_tを使いつつ、
char形式のプレーンなバイト列を読み込む方法はありませんでしょうか?
よろしくお願いします。
0257デフォルトの名無しさん
2008/05/24(土) 18:15:08wfstreamでもファイル名はwchar_tではなくてcharですね…
標準ライブラリの範囲内ではファイル名にwchar_tは使えないのでしょうか…
0258デフォルトの名無しさん
2008/05/24(土) 18:19:26fstreamのコンストラクタの引数で、wchar_tも取るんですね。
どうもwfstreamでないとwchar_tを取らないと思い込んでいました。
失礼しました。
0259デフォルトの名無しさん
2008/05/24(土) 18:31:40移植性は無いように思う
0260214
2008/05/24(土) 18:33:32なんだか色々複雑なんですね・・。とても参考になりましたm(_ _)m
0261デフォルトの名無しさん
2008/05/24(土) 18:34:52それはVisual C++など一部処理系の独自拡張。
一般には(現行規格では)、ファイル名の引数の型は
const char*であるものしか存在しない。
もし仮にBoostを使って良ければ、Filesystemのfstreamが使える。
こいつは、ワイド文字列でもファイル名を指定できるようになっていて、
ワイド文字列でファイル名を指定できない環境では、
マルチバイト文字列に変換して開くようになっている。
0262デフォルトの名無しさん
2008/05/25(日) 08:52:53#include <fstream>
std::fstream f(L"test.txt", std::ios::out);
f << L"テスト";
としても何も書かれていないtest.txtが出力されるだけでうまく行きません。
0263デフォルトの名無しさん
2008/05/25(日) 10:39:05#include <locale>
int main()
{
std::wfstream f(L"test.txt", std::ios::out);
f.imbue(std::locale(""));
f << L"テスト";
}
一応、元と合わせておいたけど、
出力だけならofstream/wofstreamで十分。
0264デフォルトの名無しさん
2008/05/25(日) 10:44:29入出力は、8ビットのやつにしとけ
0265デフォルトの名無しさん
2008/05/25(日) 12:01:13自作クラス用にstd::swapを特殊化しようとして上手くいかないんだけど……。
0266デフォルトの名無しさん
2008/05/25(日) 12:11:130267265
2008/05/25(日) 12:23:230268デフォルトの名無しさん
2008/05/25(日) 12:38:12ここに書かれてあるようにcとc++を同時に使うには、はじめに何を宣言したらいいですか?
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include "math.h"
#include "time.h"
#include "sift.h"
#include "imgfeatures.h"
#include "kdtree.h"
#include "utils.h"
#include "xform.h"
#include "cv.h"
#include "highgui.h"
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
こんな宣言したらエラーがでたんですが…
0269デフォルトの名無しさん
2008/05/25(日) 12:54:25何がしたくて、そういう宣言(というかinclude)したんだ?
それとエラーメッセージくらい書かないと、
ここにエスパーは居ないよ。
0270デフォルトの名無しさん
2008/05/25(日) 13:04:46最初から全部宣言してしまえ。と考えるからそうなる
必要になったら追加するように
0271デフォルトの名無しさん
2008/05/25(日) 13:04:47#include <stdio>
これだけ
0272268
2008/05/25(日) 13:07:571>c:\program files\microsoft visual studio 8\vc\include\cstdio(25) : error C2059: 構文エラー : ':'
>c:\program files\microsoft visual studio 8\vc\include\cstdlib(18) : error C2143: 構文エラー : '{' が ':' の前にありません。
1>c:\program files\microsoft visual studio 8\vc\include\cstdlib(18) : error C2059: 構文エラー : ':'
というエラーがだーーーーっとでます。
0273デフォルトの名無しさん
2008/05/25(日) 13:09:200274デフォルトの名無しさん
2008/05/25(日) 13:10:52で、それはCなのかC++なのかはっきりしてもらわないと困る。
0275デフォルトの名無しさん
2008/05/25(日) 13:11:27#include <stdio>
これだけだとエラーでまっせ
0276デフォルトの名無しさん
2008/05/25(日) 13:11:540277デフォルトの名無しさん
2008/05/25(日) 13:17:09cでもともとあったプログラムにC++のソースをドッキングさせることになったので
http://www.geocities.jp/ky_webid/cpp/language/038.html
を試そうとしているところです。
0278デフォルトの名無しさん
2008/05/25(日) 13:18:05環境はvisualstudio2005です
0279デフォルトの名無しさん
2008/05/25(日) 13:20:13extern "C"
{
#include "C_function.h"
}
って囲めばいいよ
0280デフォルトの名無しさん
2008/05/25(日) 13:22:20#include <iostream>
はC++のヘッダーだから、
.cのソースファイルには使えないぞ。
0281デフォルトの名無しさん
2008/05/25(日) 13:34:31class Hoge { float f; };
float f[10];
Hoge hoge[10];
memcpy(f, hoge, sizeof(f));
とするとfにはHogeのfが順番に格納される、という理解は合っているでしょうか。
0282デフォルトの名無しさん
2008/05/25(日) 13:38:33>>class のインスタンスにsizeofを使うとデータメンバだけのサイズが返されますが
そうとは限らないから。
0283デフォルトの名無しさん
2008/05/25(日) 13:42:37floatは4バイトだから32bit環境では期待どおり動くかもしれないが
仮にそれがcharだったら動かないし、64bit環境でコンパイルしたらずれる可能性もある。
0284デフォルトの名無しさん
2008/05/25(日) 13:42:48using namespace std;
int main()
{
cout << "test" << endl;
return 0;
}
268はこれでエラーがでるん?
0285281
2008/05/25(日) 13:44:220286デフォルトの名無しさん
2008/05/25(日) 15:26:41281のHogeはPODになっているから
どんな環境でも問題ないぜ。
0287デフォルトの名無しさん
2008/05/25(日) 15:59:04そうかもしれんがPODでなくなる可能性を考えると
やめたほうがいい。
Win32APIの構造体など、PODであることが将来的にある程度保証された場合しか使わない方がいいと思うんだよね。
0288デフォルトの名無しさん
2008/05/25(日) 17:12:45これを改行ではなく任意の文字で行うにはどうすれば良いんでしょうか?
0289デフォルトの名無しさん
2008/05/25(日) 17:33:020290デフォルトの名無しさん
2008/05/25(日) 18:04:040291デフォルトの名無しさん
2008/05/25(日) 23:16:19単純に{ }でくくるのではなくて以下のように
do{ }while(0)
でくくっているのがありますが
どういう意図ですか?
do {
} while (0);
0292デフォルトの名無しさん
2008/05/25(日) 23:19:16http://www.st.rim.or.jp/~phinloda/cqa/cqa8.html
真ん中付近のマルチステートメントの項
0293デフォルトの名無しさん
2008/05/25(日) 23:19:54if (...)
HOGE();
else
//...
ifとelseの間に{}と;の2文現れるのでコンパイルエラーになる。
0294デフォルトの名無しさん
2008/05/26(月) 00:51:540295デフォルトの名無しさん
2008/05/26(月) 00:56:120296デフォルトの名無しさん
2008/05/26(月) 01:19:561つの式に連続して書ける
0298デフォルトの名無しさん
2008/05/26(月) 12:53:25調べてみたのですが出てきませんでした。
0299デフォルトの名無しさん
2008/05/26(月) 13:00:12一つ一つカウントするか、配列にcharを整数とみなしてカウントしていく。
0300デフォルトの名無しさん
2008/05/26(月) 15:07:110301298
2008/05/26(月) 15:40:330302デフォルトの名無しさん
2008/05/26(月) 19:03:21gccのバージョンは3.4.5、ICUは4.8です。
icu::UnicodeString us(s.c_str(), "utf8");
というだけのコードに
g++ -LC:\Lib\icu\lib -otext.exe text.o -licuuc -licudt
で
undefined reference to `_imp___ZN7icu_3_813UnicodeStringC1EPKcS2_'
undefined reference to `icu_3_8::UnicodeString::~UnicodeString()'
undefined reference to `icu_3_8::UnicodeString::~UnicodeString()'
というエラーがでます。
他にも
icu/lib/*.lib を icu/lib/lib_a/lib*.a にリネームして
g++ -LC:\Lib\icu\lib\lib_a -otext.exe text.o -licuuc -licudt
としたり、
g++ -LC:\Lib\icu\bin -otext.exe text.o -licuuc38 -licudt38
としたりしたのですが、同じエラーがでます。
どうしたらよいのでしょうか?
よろしくお願いします。
0303302
2008/05/26(月) 19:12:14他にも
g++ -LC:\Lib\icu\lib -otext.exe text.o -licuuc -licudt・・・・・
g++ -LC:\Lib\icu\lib\lib_a -otext.exe text.o -licuuc -licudt・・・・・
g++ -LC:\Lib\icu\bin -otext.exe text.o -licuuc38 -licudt38・・・・・
と全てのライブラリをリンクするのも試しましたが、同じエラーがでました。
0304デフォルトの名無しさん
2008/05/26(月) 19:45:25C++はコンパイラが違うと名前マングリングみたいなABIが違うんで
ライブラリのバイナリ互換性は無い
0305302
2008/05/26(月) 19:51:10レスありがとうございます。
その点は考えていませんでした。HPを見ても確かにVC++中心のようです。
でも、検索するとCygwinで使っている人もいるようです。
それならgccから使えるように思うのですが、出来ないのでしょうか?
0306デフォルトの名無しさん
2008/05/26(月) 19:53:130307302
2008/05/26(月) 19:56:45レスありがとうございます。
バイナリがVC++用かもしれないから、自分のコンパイラでgcc用にコンパイルしてみろって事ですよね?
やってみます。
0308マイク ◆yrBrqfF1Ew
2008/05/26(月) 20:42:36ss.str()で値返しされたオブジェクトの参照のconst参照で寿命延長じゃなかったっけ・・・。
あれ・・・そういえばストラウストラップのC++第三版でこんな感じの注意を読んだような読まないような・・・。
スレ汚し失礼した。
0309302
2008/05/26(月) 21:05:19一応結果を書いておきます。
まずreadmeを見たところ、
Cygwinを使った場合には出来上がったライブラリがCygwinに依存するようです。
これは避けたかったので、適当にmingw環境でほぼ丸ごとコンパイルしてみたのですが、
大量の未define・未定義エラーが出ました。
とりあえず適当にdefineはしたのですが、やはりうまく行かないようです。
かなり難しいようなので、他のライブラリを使うなりしようと思います。
結局出来ませんでしたが、ともかくありがとうございました。
0310デフォルトの名無しさん
2008/05/26(月) 21:12:03replaceが無かったら寿命延長される。
0311デフォルトの名無しさん
2008/05/27(火) 01:33:00あ?ほんとに分かってんのか?
「はい」ってのはな「はい、わかりました」を略して「はい」なんだよ
頭だけでわかったって言わねんだぞ?学校の勉強じゃねえんだから
社会では?お?実際に出来て初めて「わかった」言うんだ
出来もしねえ奴が軽々しくはいなんて言うんじゃねえよ
すいませんじゃねえよこら。お?申し訳ありませんじゃねえんだよ。
申し訳ありませんってのは本当に反省した奴だけが言える事だろうが。
反省してるって事は今度は必ず出来るって事だ。
お前今できんのかよ。今日のお前は出来てたのかよ?お?
出来もしねえ癖に口だけ一丁前な事言うんじゃねえよ。
お?聴こえてんのかよコラ?あ?
やる気がねえんだったら来なくていいぞ?
お前ナメてんだろコラ?
仕事中だと思って優しく口で言ってりゃ調子に乗ってんじゃねえぞコラ?お?
外で遭ってたら今頃カタワだぞお前?とっくに?あ?
0312デフォルトの名無しさん
2008/05/27(火) 10:14:35それマジで言ったん?ソースあんならすぐ出せ
マジなら2ちゃんねら総力を上げて潰すが
0313デフォルトの名無しさん
2008/05/27(火) 10:18:460314デフォルトの名無しさん
2008/05/27(火) 12:33:060315デフォルトの名無しさん
2008/05/27(火) 12:34:20を
m_combbox.AddString(Description[64]);
で使えるように
LPCTSTR型に変更するにはどうすればいいですか?
0316デフォルトの名無しさん
2008/05/27(火) 12:47:38返事しないとしないで怒られるし・・・
もう怒られるのがデフォってぐらいに思ってればいいのかな
0317デフォルトの名無しさん
2008/05/27(火) 12:52:06ふつーに
m_combbox.AddString(Description);
でいいんじゃないかい。Unicodeビルドだと一手間必要になるが。
0318デフォルトの名無しさん
2008/05/27(火) 12:53:02上司が基地外の場合、上司の上司と手をつなぐしかないだろう。
これはたいていうまくいく。
うまくいかない場合、自分が基地外の可能性を疑え。
0319デフォルトの名無しさん
2008/05/27(火) 13:01:360320デフォルトの名無しさん
2008/05/27(火) 13:01:49なんだそれ、MFCか?
最近のVC++ならatlconv.hあたりをインクルードしてCA2T
昔のならUSES_CONVERSIONとかいう呪文を唱えてマクロかな
0321デフォルトの名無しさん
2008/05/27(火) 13:03:30ただのコピペだから、「それ懐かしいな」とか「ひさびさに見た」
とか「総力www」とかそんなレスしとけばいいよ
0322デフォルトの名無しさん
2008/05/27(火) 16:34:32面白くないネタは潰すに限る
0323デフォルトの名無しさん
2008/05/27(火) 17:08:31***.DLLの記述がヘッダーファイルにもないしどのDLLを使うかはどこで指定してるんですか?
それらしき文は
#ifndef XXX_H
#define XXX_H
・
・
・
#ifdef XXX_EXPORTS
#define XXX_API __declspec(dllexport)
#else
#define XXX_API __declspec(dllimport)
#endif
ぐらいです
0324デフォルトの名無しさん
2008/05/27(火) 17:15:14インポートライブラリ(.lib)は無いのか?
0325デフォルトの名無しさん
2008/05/27(火) 17:16:26よくある小さなサンプルプログラムでは、エラー処理の箇所に直接文字列リテラルを書きこんでありますが、
大きなプログラムになると、リテラルの保守性の悪さが出てきそうな気がします。
かといって、変数にするとなるとエラーメッセージ1つ1つに変数名をつけるのが大変だし、
"○○がありません。"のように、エラーメッセージに変数を含む場合も困る気がします。
一般的にはどのように実装しているのですか?
0326デフォルトの名無しさん
2008/05/27(火) 17:47:01enum ErrorNos {ErrorMisc, ErrorFileOpenError, ...};
例えばこんな処理があったとして。
FILE * fp = fopen(fileName, "r");
エラー処理関数をそのエラー番号でこんな感じに呼ぶ。
if (fp == NULL) errorProc(ErrorFileOpenError, fileName);
変数がある場合に備えて、幾つかオプション引数を取れるようにしておくこともよくある。
或いは、エラー文字列配列をこんな形で作ってもいい。
const char * const errorStrings[] = {"Undocumented error.", "File(%s) is not found.", ...};
この場合はこんな感じにそれぞれで出力ロジックを用意しなければならないのでお勧めはしない。
if (fp == NULL) fprintf(stderr, errorStrings[ErrorFileOpenError], fileName);
0327デフォルトの名無しさん
2008/05/27(火) 17:49:47UNIX方面ではgettextというライブラリが一般的。
「メッセージカタログ」という用語でいろいろ調べてみるといいかと思う。
0328デフォルトの名無しさん
2008/05/27(火) 18:59:39Win32 API入門のサンプルはどうしてVC++だとエラーになるんだろうか?Cだとコンパイルできる
CとC++は互換性があるはずなのに
#include<windows.h>
int WINAPI WinMain(
HINSTANCE hInstance ,
HINSTANCE hPrevInstance ,
PSTR lpCmdLine ,
int nCmdShow ) {
HWND hwnd = CreateWindow(
TEXT("STATIC") , TEXT("Kitty on your lap") ,
WS_CAPTION ,
100 , 100 , 200 , 200 , NULL , NULL ,
hInstance , NULL
);
if (hwnd == NULL) return 0;
ShowWindow(hwnd , SW_SHOW);
MessageBox(NULL , TEXT("Kitty on your lap") ,
TEXT("Kitty") , MB_ICONINFORMATION);
return 0;
}
0329デフォルトの名無しさん
2008/05/27(火) 19:06:03>CとC++は互換性があるはずなのに
いいえ。
>どうしてVC++だとエラーになるんだろうか?
エラーメッセージくらい転記しましょう。
>http://wisdom.sakura.ne.jp/system/winapi/index.html
そういう間違いのあるサイトを参考にするのは如何なものかと。
0330デフォルトの名無しさん
2008/05/27(火) 19:08:190331デフォルトの名無しさん
2008/05/27(火) 20:57:41std::wcout << L"森鷗外" << std::endl;
wchar_t 文字列1[] = L"森鷗外";
std::wcout << 文字列1 << std::endl;
LPWSTR 文字列2 = L"森鷗外";
std::wcout << 文字列2 << std::endl;
何れのwcoutも正常に表示されません。
MessageBoxなら
MessageBoxW(0, 文字列1, L"", MB_OK);
MessageBoxW(0, 文字列2, L"", MB_OK);
できちんと表示されますが、何が原因なのでしょうか。
0332デフォルトの名無しさん
2008/05/27(火) 21:02:35wchar_tのUTF-16って鷗(!= 鴎)もちゃんと表示してくれるの?
0333デフォルトの名無しさん
2008/05/27(火) 21:15:35wchar_t 文字列1[] = L"森鷗外";
MessageBoxW(0, 文字列1, L"", MB_OK);
でダイアログにきちんと「森鷗外」と表示されます。
0334デフォルトの名無しさん
2008/05/27(火) 21:25:21それは文字列を表示してるコンソールの問題じゃないのか。
0335デフォルトの名無しさん
2008/05/27(火) 21:39:28そうなんですか?
コマンドプロンプトの扱いに不慣れで正直良く分りません。
wcoutを使うのは諦めてWin32APIを使う事にしました。
本当にありがとうございました。
wchar_t 文字列1[] = L"森鷗外";
int lpNumberOfCharsWritten = 0;
HANDLE hConsoleOutput = GetStdHandle(STD_OUTPUT_HANDLE);
WriteConsoleW(hConsoleOutput, 文字列1, lstrlen(文字列1), (LPDWORD)lpNumberOfCharsWritten, NULL);
0336デフォルトの名無しさん
2008/05/27(火) 21:48:560337デフォルトの名無しさん
2008/05/27(火) 22:02:080338デフォルトの名無しさん
2008/05/27(火) 22:04:34正常じゃないってどんな状態?数字が出るとか?
コンパイラは何?
0339デフォルトの名無しさん
2008/05/27(火) 22:33:16CとC++のワイド入出力は、
外ではマルチバイト文字を使い、入出力時に変換するというモデルになっている。
Windowsで日本語なら外部の文字コードとはCP932 (Shift_JIS)になる。
当然、そこに含まれない文字の表示・入力はできないというわけ。
0340325
2008/05/27(火) 23:01:21>>326
なるほど。
しかし、引数を取る時はやはりめんどくさいそうですね。
>>327
初めて知りました。
googleで検索したところ、まとまった解説サイトみたいなのがあまり充実してないのがつらいところです。
0341デフォルトの名無しさん
2008/05/27(火) 23:14:50http://pc11.2ch.net/test/read.cgi/tech/1205059063/l20
立てようと思ったらIPグループスレ立て規制(新このホスト〜)に
引っ掛かってるので。
0342デフォルトの名無しさん
2008/05/27(火) 23:48:470343デフォルトの名無しさん
2008/05/27(火) 23:51:34WaitForSingleObject( >>342 , 3600000 );
0344デフォルトの名無しさん
2008/05/27(火) 23:58:36C++相談室 part62
http://pc11.2ch.net/test/read.cgi/tech/1211900039/l50
0345デフォルトの名無しさん
2008/05/28(水) 00:00:290346デフォルトの名無しさん
2008/05/28(水) 10:31:060347デフォルトの名無しさん
2008/05/28(水) 10:34:59とすると実体なしで。コンパイルが通ります。間違えですか?
0348デフォルトの名無しさん
2008/05/28(水) 10:38:030349デフォルトの名無しさん
2008/05/28(水) 10:39:02基本的にはそう。
>>347
それだけで定数式としては使える。
でも const int& r = C::x とかするとリンクエラーになるから、
広く使うクラスなら定義も作っといたほうがいい。(その場合は初期化部分は無し)
0350デフォルトの名無しさん
2008/05/28(水) 10:41:160351デフォルトの名無しさん
2008/05/28(水) 11:54:06こんなエラーが出ます。
1>main.obj : error LNK2019: 未解決の外部シンボル "__declspec(dllimport) public: void __thiscall ANNkd_tree::annkPriSearch(double *,int,int *,double *,double)"
(__imp_?annkPriSearch@ANNkd_tree@@QAEXPANHPAH0N@Z) が関数 "int __cdecl findmatch(int)" (?findmatch@@YAHH@Z) で参照されました。
1>main.obj : error LNK2019: 未解決の外部シンボル "__declspec(dllimport) public: __thiscall ANNkd_tree::ANNkd_tree(double * *,int,int,int,enum ANNsplitRule)"
(__imp_??0ANNkd_tree@@QAE@PAPANHHHW4ANNsplitRule@@@Z) が関数 "int __cdecl findmatch(int)" (?findmatch@@YAHH@Z) で参照されました。
1>main.obj : error LNK2001: 外部シンボル ""public: virtual void __thiscall ANNkd_tree::annkSearch(double *,int,int *,double *,double)"
(?annkSearch@ANNkd_tree@@UAEXPANHPAH0N@Z)" は未解決です。
1>main.obj : error LNK2001: 外部シンボル ""public: virtual int __thiscall ANNkd_tree::annkFRSearch(double *,double,int,int *,double *,double)"
(?annkFRSearch@ANNkd_tree@@UAEHPANNHPAH0N@Z)" は未解決です。
1>main.obj : error LNK2001: 外部シンボル ""public: virtual int __thiscall ANNkd_tree::theDim(void)" (?theDim@ANNkd_tree@@UAEHXZ)" は未解決です。
1>main.obj : error LNK2001: 外部シンボル ""public: virtual double * * __thiscall ANNkd_tree::thePoints(void)" (?thePoints@ANNkd_tree@@UAEPAPANXZ)"
は未解決です。
1>main.obj : error LNK2019: 未解決の外部シンボル "__declspec(dllimport) public: virtual __thiscall ANNkd_tree::~ANNkd_tree(void)"
(__imp_??1ANNkd_tree@@UAE@XZ) が関数 "public: virtual void * __thiscall ANNkd_tree::`scalar deleting destructor'(unsigned int)"
(??_GANNkd_tree@@UAEPAXI@Z) で参照されました。
c++ と c を合わせて使おうとしているのですが、いたるところでエラーがでています。
このエラーはなぜ起こるのでしょうか
0352デフォルトの名無しさん
2008/05/28(水) 11:55:14必要なライブラリをリンクしていないからだと思うよ
0353デフォルトの名無しさん
2008/05/28(水) 11:56:22名前マングリング でぐぐってみるとよかれ
0354デフォルトの名無しさん
2008/05/28(水) 12:02:32http://www.google.co.jp/search?q=LNK2019
http://www.google.co.jp/search?q=LNK2001
0355デフォルトの名無しさん
2008/05/28(水) 15:53:12それらを消したいのですが、ファイルは成功しますが、フォルダが無理です。
プログラムを終了して次回に消すと平気です。
なぜでしょうか? ファイルにロックがかかっていれば当然無理ですが、ファイルの削除だけは成功してます。
0356デフォルトの名無しさん
2008/05/28(水) 15:55:030357デフォルトの名無しさん
2008/05/28(水) 16:01:1132: ファイルが別の処理で使われているため、アクセスできません。
でした。 ソース見直してみます。サンクス
0358デフォルトの名無しさん
2008/05/28(水) 16:05:510359デフォルトの名無しさん
2008/05/28(水) 16:13:260360デフォルトの名無しさん
2008/05/28(水) 16:21:24カレントディレクトリはどうなってる?
0361デフォルトの名無しさん
2008/05/28(水) 19:20:22どうすれば良くなりますでしょうか?
template < class C > int write(string x, C y) {省略}
: error C2059: 構文エラー : '<'
: error C2334: '{' の前に予期しないトークンがありました。関数の本体は無視されます。
0362デフォルトの名無しさん
2008/05/28(水) 19:27:180363デフォルトの名無しさん
2008/05/28(水) 20:53:00#include <iostream>
class test {};
int main() {
const test aa;
return 0;
}
エラー
$ g++ -Wall samp80.cpp
test.cpp: In function 'int main()':
test.cpp:4: error: uninitialized const 'aa'
test.cpp:4: warning: unused variable 'aa'
0364デフォルトの名無しさん
2008/05/28(水) 20:56:430365デフォルトの名無しさん
2008/05/28(水) 20:58:19英語を勉強しようぜ
0366デフォルトの名無しさん
2008/05/28(水) 21:02:51ありがとうです。でも初期化のやりようがないと思うんですが、、、
class test {}; ってconstタイプのオブジェクトは作成できないんですか?
0367デフォルトの名無しさん
2008/05/28(水) 21:03:590368デフォルトの名無しさん
2008/05/28(水) 21:07:390369デフォルトの名無しさん
2008/05/28(水) 21:26:59constメンバを含んでいてもコンストラクタで初期化は出来る
0370デフォルトの名無しさん
2008/05/28(水) 23:31:35なんかVBっぽくて気持ち悪いんですが。
0371デフォルトの名無しさん
2008/05/28(水) 23:33:41意味あいが全然違うぞ
0372デフォルトの名無しさん
2008/05/28(水) 23:41:180373デフォルトの名無しさん
2008/05/28(水) 23:44:06templateの型解決はきれいな解決。どんな型でも通るわけではない。
0374デフォルトの名無しさん
2008/05/29(木) 00:27:14実行時に型が好きに変わる。
高等な union みたいなもん。
テンプレートの型解決は静的。
コンパイル時に型が決まる。
0375デフォルトの名無しさん
2008/05/29(木) 02:56:07const T* const func() const;
というのがあった時、2個目のconstの意味が分かりません。
どういう意味ですか?
0376デフォルトの名無しさん
2008/05/29(木) 03:13:10戻り値は書き換えできませんよ、って意味。
でも、戻り値は a + b の結果と同じように、元々別のルールで書き換えできないから
あんまり意味は無い。
戻り値の型がクラス型だと、少しは違いが出る。でもやっぱりそんな違いを利用した
コードは書かないほうがいいんで、総じて意味が無い。
0377デフォルトの名無しさん
2008/05/29(木) 04:17:35それだと、一個目のconstがあるから二個目のconstは必要bネくないですか=H
0378デフォルャgの名無しさん
2008/05/29(木) 04:22:59メンバ変数を参照することはあっても変更はしない、
という意味
0379デフォルトの名無しさん
2008/05/29(木) 04:25:06その2つは修飾している先が違うから、片方がもう一方のかわりになったりはしない。
一個目の const はポインタの指す先の値に付く const 。
二個目の const はポインタの値に付く const 。
0380デフォルトの名無しさん
2008/05/29(木) 05:29:50一番左のconstは構文上の利便性のために特別扱いされてる。
「const T* const」は
「T const * const」と解釈される。
constは左結合。
T ←const(実体がconst) * ←const(ポインタ値がconst)
※別の例
char * * const a = NULL;
a = NULL; //コンパイルエラー
char * const * b = NULL;
*b = NULL; //コンパイルエラー
0381デフォルトの名無しさん
2008/05/29(木) 06:19:100382デフォルトの名無しさん
2008/05/29(木) 06:34:492番目の位置にconstを書いてみると分かるよ。
const char const * p; // (VC++2005) warning C4114: 同じ型の修飾子が 2 度以上使われています。
0383デフォルトの名無しさん
2008/05/29(木) 06:50:34typedef const char cchar ;
const cchar c = 0;
こういうのはアリなんだ。constつけれた方が分かりやすいから?
0384デフォルトの名無しさん
2008/05/29(木) 07:07:310385デフォルトの名無しさん
2008/05/29(木) 08:39:54参照やポインタ返しの場合は書き換えを禁止できる点で有効。
0386デフォルトの名無しさん
2008/05/29(木) 08:51:52そうだったのか!いままで法則性をさっぱり見つけられなくって難儀してたとよ。
0387デフォルトの名無しさん
2008/05/29(木) 08:53:56これはインスタンスのメンバをキャッシュ参照で済ませても良いよという事をコンパイラに伝える役割を持っている。
0388387
2008/05/29(木) 08:54:350389デフォルトの名無しさん
2008/05/29(木) 10:47:381.00000000002とか出たときに、
この2の部分を消したい(小数点以下11桁以降を0にしたい)
のですが、何か方法ありますでしょうか?
0390デフォルトの名無しさん
2008/05/29(木) 11:19:56表示の問題?それとも数を変更する問題?後者なら正確には不可能。
double に 10 進法である桁以降完全に 0 にするという概念は無いから。
近似的には 10^10 かけて floor して 10^-10 かけるとかの関数書くとか。
0392デフォルトの名無しさん
2008/05/29(木) 11:36:11こんな方法もあるよ
#include<stdio.h>
#include<math.h>
int main(void){
double x=1.234567890123456789;
printf("%.12f\n", x);
x-=fmod(x, 1e-10);
printf("%.12f\n", x);
return 0;
}
0394デフォルトの名無しさん
2008/05/29(木) 14:00:26<string , クラス>のときは、未使用の判別はどうやれば良いですか?
0395デフォルトの名無しさん
2008/05/29(木) 14:03:38デフォルトコンストラクタで初期化されてる。判別できるかどうかはクラスによる。
int だって、未使用の場合と 0 を入れた場合は判別できないね。
0396デフォルトの名無しさん
2008/05/29(木) 14:05:06> もし存在しないキーを指定してアクセスした場合には、そのキーを自動的に登録します。
> その キーに対応する値は、その値の型のデフォルトコンストラクタによって初期化されます。
0397デフォルトの名無しさん
2008/05/29(木) 14:06:19トンクス! 自分で作るクラスなので判別できるように設定したいと思います。
0398デフォルトの名無しさん
2008/05/29(木) 14:22:280399デフォルトの名無しさん
2008/05/29(木) 14:28:38全部map::operator[]で済まそうとして、本来遭遇しなくていい問題に遭遇している気がする。
「見るだけなのに要素が生成されちゃう。困ったなぁ」みたいな。
0400デフォルトの名無しさん
2008/05/29(木) 14:52:490401デフォルトの名無しさん
2008/05/29(木) 17:52:27Visual C++ で作成したDLLからその配列要素に書き込んだり、読み込んだりすることは出来るの?
もちろん、Visual Basic 6.0で起動中にそのDLLを使います。
今はVisual Basic 6.0を使っていますが、これからVisual C++を勉強する自分にとってまだDLLがよく分からないので、
よろしくお願いします。
0402デフォルトの名無しさん
2008/05/29(木) 18:42:26できる。ここに書いてあることはVB6と今のVC全部でも通用する。
http://support.microsoft.com/kb/410837/ja
0403デフォルトの名無しさん
2008/05/29(木) 19:28:16技術的な問題じゃないんですが、CD付属のものを使わずに、C言語を扱える環境をつくれませんか?
0404デフォルトの名無しさん
2008/05/29(木) 19:33:21サンクス。
あと、インターネットからのホームページのHTMLデータを収得する方法がわかりましたら、
これもよろしくお願いします。
今はVB6で収得していますがチョット時間がかかるため、C++に移植したいので。
0405デフォルトの名無しさん
2008/05/29(木) 19:56:46ここをサポートセンターと勘違いしない方がよい。
0406デフォルトの名無しさん
2008/05/29(木) 19:58:300407デフォルトの名無しさん
2008/05/29(木) 20:25:26わからないならレスしないで下さい。スレが汚れます。
せっかく他の人はいい人なのに。
0408デフォルトの名無しさん
2008/05/29(木) 20:32:46多分>>405は方法を知っているんだと思うよ
とりあえず、>>404はWinsockとHTTPでググれ・・・っと
0409デフォルトの名無しさん
2008/05/29(木) 20:34:020410デフォルトの名無しさん
2008/05/29(木) 21:40:43みなさん、ありがとう。
勉強する糸口がみえました。
>>409
他に早く処理できる方法があるんですか?
VB6でやっている自分としては、C++でやった方が早いと思ったので。
0411デフォルトの名無しさん
2008/05/29(木) 22:12:450412デフォルトの名無しさん
2008/05/29(木) 22:20:20system
spawn
exec
CreateProcess
0414デフォルトの名無しさん
2008/05/29(木) 22:31:36もし、ネットワーク回線がボトルネックなら、
VCで書き換えても劇的に速くなるということはないぞ。
0415デフォルトの名無しさん
2008/05/29(木) 22:45:28参考までに同一回線&PCで、
4000ページを取込処理した場合、
自分で作ったVB6だと80秒。
他人の作ったC++だと25秒。
ということでボトルネックはプログラム手法。
だったら作った他人に聞けということはナシね。
0416デフォルトの名無しさん
2008/05/29(木) 22:48:350417デフォルトの名無しさん
2008/05/29(木) 22:49:130418デフォルトの名無しさん
2008/05/29(木) 22:54:28VB6は非同期で4列並列処理していて、もうこれ以上早くするのは無理かと思って。
となるとC++かなぁと思っています。
0419デフォルトの名無しさん
2008/05/29(木) 23:33:08しかも節操無くアクセスしてたらアクセス遮断されることもあるので、
程ほどに。
0420デフォルトの名無しさん
2008/05/30(金) 01:55:53ロジックのチューニングを検討しないあたりがVB育ちなのかね。
それとも十分に検討済みなのかな。
0421デフォルトの名無しさん
2008/05/30(金) 02:03:18variant 型にどんどん追加してるとかじゃないよね?
0422デフォルトの名無しさん
2008/05/30(金) 07:06:55それは知りませんでした。
となると、2コネクションにするとさらに取得時間がかかります。
>>420>>421
VB6をご存じなら分かると思いますが、
GetChunkでデータをString型でバイト配列または文字列として取得しているだけです。
0423デフォルトの名無しさん
2008/05/30(金) 09:37:00うーん
0424デフォルトの名無しさん
2008/05/30(金) 11:35:28あとVC++の一部にアセンブラを入れられますか?
0425デフォルトの名無しさん
2008/05/30(金) 11:38:46入れられます
0426デフォルトの名無しさん
2008/05/30(金) 11:58:58迷ってます。本だとpairといえばmapだったのですが、vectorの方が使い慣れているし
便利な感じがしてます。どういう基準でmapとvectorを使い分ければよいですか?
0427デフォルトの名無しさん
2008/05/30(金) 12:14:18配列を作りたいなら配列を使えばOK。
伸縮できる配列が欲しいならvectorを使えばOK。
pairの中身がkeyとvalueの対応関係があって(複数のpairでkeyが重ならな
い)、「keyに対応するvalueを取りだす」のような操作が必要ならmap。
0428デフォルトの名無しさん
2008/05/30(金) 12:15:07メモリ効率重視・末尾に追加のみならstd::vector
0429デフォルトの名無しさん
2008/05/30(金) 12:59:16ということなら、dequeでその場を凌いでしまうのも手かなぁ。
0430デフォルトの名無しさん
2008/05/30(金) 13:11:120431デフォルトの名無しさん
2008/05/30(金) 13:13:30MultiThread
0432デフォルトの名無しさん
2008/05/30(金) 13:16:330433デフォルトの名無しさん
2008/05/30(金) 13:28:27ボタンにループ処理はありません。
0434デフォルトの名無しさん
2008/05/30(金) 13:41:33>>430みたいな「まったく言えてない」質問に、こちら側で徹底的に頭を回して答えてあげるのは、
「たまたま動いてるだけのコード」を見てる時みたいな、得も言われぬ不安がわいてくるなぁw
適当にエラーを出して、回答できねえよと言ってあげるのが、長い目で見れば本人のためだと思う。
0435デフォルトの名無しさん
2008/05/30(金) 13:45:300436デフォルトの名無しさん
2008/05/30(金) 13:51:59メッセージハンドラ内でループして
他のメッセージが処理されずにウィンドウが固まっていると予想。
なので俺も >>431 だと思う。
他の方法として、WM_TIMER(OnTimer)で
ループ一回分の処理だけ進め、
一旦抜ける、というのを繰り返す。
0437デフォルトの名無しさん
2008/05/30(金) 14:04:41ありがとうございます。
0438デフォルトの名無しさん
2008/05/30(金) 14:59:41stringstream ss;
ss << "0123456789";
const char* p;
p = ss.str().c_str();
cout << p[2];
みたいにすると、ちゃんと2が出力されるのですが
ss.str.c_str()
はss.str()で生成した一時オブジェクトのポインタを返しているのに、なぜちゃんと2が出力されるんでしょうか??
ss.str()で生成した一時オブジェクトは、その部分を過ぎたら消えてしまうのではないかと思っていたのですが、違うのでしょうか??
0439デフォルトの名無しさん
2008/05/30(金) 15:15:12解放されたメモリというのは、以前に書き込まれていたデータがしばらくそのまま残っていることが多い。
なぜなら解放時にわざわざデータを消すっていうのは時間がかかるので。
ただし、後で誰かがどこかで何かのためにメモリをnewやmallocで確保したとき、その解放されたメモリが再利用される。
その「後で」「誰かが」「どこかで」の把握は基本的に無理なので、たまたまそのときはまだデータが残ってるかもしれないが、いつ再利用され他の用途に使われ内容が書き換えられるかわからない。
そういうわけで、解放されたメモリには触ってはいけない。
0440デフォルトの名無しさん
2008/05/30(金) 15:19:100441デフォルトの名無しさん
2008/05/30(金) 15:22:24「有効でなくなる」のと「値が残っている」のとは違う。
殊にポインタの場合、ポイント先が生きていようと死んでいようとアクセスできればデリファレンスしてしまう。
一時的なオブジェクトは恐らくスタックフレームに作られているはずなので、他の一時的なオブジェクトが
作られたときにでも上書きされるだろう。
例えば、私の環境ならこれで"2"ではなく"c"が(その前の出力と並んで)出力される。
--
stringstream ss;
ss << "0123456789";
stringstream sss;
sss << "abcdefg";
const char* p;
p = ss.str().c_str();
cout << sss.str().c_str()[2];
cout << p[2];
0442デフォルトの名無しさん
2008/05/30(金) 15:45:33Error: 外部シンボル 'myclass::set_a(int)' が未解決
Error: 外部シンボル 'myclass::get_a()' が未解決
ってエラーが出て、これのコンパイルが通らないんだ。
//main.cpp
#include "myclass.h"
int main(){
myclass ob1, ob2;
ob1.set_a(10);
ob2.set_a(99);
cout << ob1.get_a() << "\n";
cout << ob2.get_a() << "\n";
return 0;
}
0443442続き
2008/05/30(金) 15:46:10#include <iostream>
using namespace std;
class myclass{
int a; //private なメンバ変数
public:
void set_a(int num);
int get_a();
};
//myclass.cpp
#include "myclass.h"
void myclass::set_a(int num){
a = num;
}
int myclass::get_a(){
return a;
}
理由がよく分からないんだが、先輩方、この小僧にご教授くださいませんか
0444442
2008/05/30(金) 15:53:49どうやら、使っていた環境の設定をしてなかったみたいだorz
0445デフォルトの名無しさん
2008/05/30(金) 19:56:02#ifndef GUARD_myclass_h
#define GUARD_myclass_h
// ヘッダ本体
#endif
って書こう。でないとすぐにリンカが文句を・・・。
0446デフォルトの名無しさん
2008/05/30(金) 20:03:53多重インクルード防ぐのは呪文でもなんでもないような。
0447デフォルトの名無しさん
2008/05/30(金) 20:07:530448デフォルトの名無しさん
2008/05/30(金) 20:31:11{
HANDLE hThread;
int parm;
AfxBeginThread(CFT245RMFCDlgNonUnicodeDlg::saboThread, &parm, THREAD_PRIORITY_NORMAL);
}
void CFT245RMFCDlgNonUnicodeDlg::saboThread(LPVOID parma)
{
FT_STATUS ftStatus;
ULONG bytesWritten;
int count = 10;
byte ucMask;
for ( int i=0; i < count; i++ ) {
ucMask = 1;
ftStatus = FT_Write(ftHandle, &ucMask, 1, &bytesWritten);
Sleep(500);
ucMask = 0;
ftStatus = FT_Write(CFT245RMFCDlgNonUnicodeDlg::ftHandle, &ucMask, 1, &bytesWritten);
Sleep(500);
}
}
スレッド勉強してきた。下のエラーから進まなくなった、たすけて!
CFT245RMFCDlgNonUnicodeDlg::saboThread': 関数呼び出しには引数リストがありません。
メンバへのポインタを作成するために '&CFT245RMFCDlgNonUnicodeDlg::saboThread' を使用してください
0449デフォルトの名無しさん
2008/05/30(金) 21:06:33ご丁寧に直し方まで教えてくれているわけだけど、
残念ながらそれに従って直しても別なエラーを目にすることになると思う。
AfxBeginThreadの第一引数にはメンバ関数へのポインタを渡すことが出来ないから。
saboThreadをstaticな関数にして引数としてクラスのポインタを渡すとか、別なやり方が必要。
0450デフォルトの名無しさん
2008/05/30(金) 21:21:30//クラスを定義している箇所
class CFT245RMFCDlgNonUnicodeDlg
{
static UINT __cdecl saboThreadStatic(LPVOID pParam){
static_cast<CFT245RMFCDlgNonUnicodeDlg*>(pParam)->saboThread();
}
...
};
void CFT245RMFCDlgNonUnicodeDlg::OnBnClickedsabo()
{
AfxBeginThread(CFT245RMFCDlgNonUnicodeDlg::saboThreadStatic, this, THREAD_PRIORITY_NORMAL);
}
void CFT245RMFCDlgNonUnicodeDlg::saboThread()
{
...
}
0451デフォルトの名無しさん
2008/05/30(金) 23:08:27ありがとうございました
0452デフォルトの名無しさん
2008/05/31(土) 00:54:48PICをかませないでWindowsのUSBのみで0.01ミリ秒単位安定動作させるプログラミング方法はありますか?
0453デフォルトの名無しさん
2008/05/31(土) 00:59:560454デフォルトの名無しさん
2008/05/31(土) 07:48:50PCでっていうのなら自分でOS書けばいける。
0455デフォルトの名無しさん
2008/05/31(土) 07:50:34USBは定周期転送があるからそれを使えばいいんじゃないか
0456デフォルトの名無しさん
2008/05/31(土) 08:14:07struct sex {
int man;
int woman;
};
struct sex ok;
ok.man = 1;
ok.woman= 2;
cout << sex << endl;
とするとエラーになりますが、なんか昔
sex.man = 1, sex.woman = 2
みたいな表示してくれるのを見た記憶があるのですが、
これって私の勘違いか妄想なのでしょうか?
よろしくお願いいたします。
0457デフォルトの名無しさん
2008/05/31(土) 08:56:05std::ostream& operator<<(std::ostream& ost, const sex& val)
{
return ost << 好きな表示方法;
}
0458デフォルトの名無しさん
2008/05/31(土) 09:03:11自分でドライバ書いてCPU占有すれば出来るかも。
カーネルモードならスケジューラに邪魔されずに処理できるから。
ただ、占有中は当然、キーボードもマウスも利かず、画面描画もされないから
ハングアップ同然の状態になるけど。
周期動作に関しては、自分でループして処理する。
QueryPerformanceFrequencey()とQueryPerformanceCounter()で
1GHzのCPUなら 1/1G秒=0.000001ミリ秒の精度で時間を計測出来る。
0459デフォルトの名無しさん
2008/05/31(土) 09:06:08QueryPerformanceFrequency()とQueryPerformanceCounter()ね。
0460デフォルトの名無しさん
2008/05/31(土) 13:07:380461デフォルトの名無しさん
2008/05/31(土) 13:08:08CPU周波数が動的に変わったときちゃんと動かないとか
0462デフォルトの名無しさん
2008/05/31(土) 13:09:04試してみればわかるんじゃ?
0463デフォルトの名無しさん
2008/05/31(土) 13:09:29そうですね、試してみます。
0464デフォルトの名無しさん
2008/05/31(土) 17:50:35一時期CPUクロックだったこともあったけど、
今はだいたいACPIタイマで、周波数は3579545Hz
0465デフォルトの名無しさん
2008/05/31(土) 19:05:27if(str="ABC")をやろうとすると
error C2678: 二項演算子 '==' : 型 'std::string' の左オペランドを扱う演算子が見つかりません (または変換できません) (新しい動作; ヘルプを参照)。
1> 'ビルトイン C++ 演算子==(const char [15], const char [15])' の可能性があります
ってなるんですが何か変わったのですか?
VC++2008です。
0466465
2008/05/31(土) 19:16:03#include<string>にしたら動作しますた
0467デフォルトの名無しさん
2008/05/31(土) 19:56:47を実行させたいです、どうすればいいですか?
0468デフォルトの名無しさん
2008/05/31(土) 19:59:15スマートポインタに包んでおく
etc
0469デフォルトの名無しさん
2008/05/31(土) 20:02:540470デフォルトの名無しさん
2008/05/31(土) 20:14:160471デフォルトの名無しさん
2008/05/31(土) 20:15:37というか普通、何もしなくてもデストラクタ実行されるけど、
どういう終了のさせかたしてる?
0472デフォルトの名無しさん
2008/05/31(土) 20:21:010473デフォルトの名無しさん
2008/05/31(土) 21:10:01環境はWindows VS2005 C++及びLinux g++
0474デフォルトの名無しさん
2008/05/31(土) 21:19:020475デフォルトの名無しさん
2008/05/31(土) 21:27:030476デフォルトの名無しさん
2008/05/31(土) 21:38:570477デフォルトの名無しさん
2008/05/31(土) 22:01:550478デフォルトの名無しさん
2008/05/31(土) 23:04:03ローケルを日本語圏に設定してこれで波ダッシュが出るはずなんですが、何も表示されないみたいです。
更にstd::endlも出力されておらず、これを一般プログラムに使いまわすとそのプログラムが落ちてしまいます。
このような出力すると落ちる文字が書いてある表なんてものは存在するんでしょうか?何とかしたいです。
0479デフォルトの名無しさん
2008/05/31(土) 23:06:37ましてや、intをwchar_tにキャストしてそれをあたかも文字であったかのように扱うなんてとんでもない。
0480デフォルトの名無しさん
2008/05/31(土) 23:15:09環境はvc8です。他の文字はコードをちゃんと設定すればこれで表示されます。
とりあえずUTF-16が内部で使われているみたいなので、その場合に限っての話で進めてもらえませんか?
0481デフォルトの名無しさん
2008/05/31(土) 23:22:300482デフォルトの名無しさん
2008/05/31(土) 23:24:25とにかくデバッグ情報が出力できないので先に進まないです。
聞きたいこと :
コマンドプロンプトで表示が不可能なUTF-16の文字
0483デフォルトの名無しさん
2008/05/31(土) 23:28:170484デフォルトの名無しさん
2008/05/31(土) 23:49:330485デフォルトの名無しさん
2008/05/31(土) 23:55:030486デフォルトの名無しさん
2008/05/31(土) 23:57:43メモ帳にU+307Cの波ダッシュを入力し、ANSIで保存(日本語なのでコードページ932)、
それを開くと?になっていた。
つまり、Windowsの持っているCP932変換では波ダッシュからの変換が存在しないということ。
(全角チルダ0x8160への変換になっていない)
VCもWindowsの変換ルーチンを使っているので、
やはり正しく表示されないことの説明がつく。
Windows APIを使ってUTF-16を直接出力するか(これもフォントの都合でうまく表示されないかもしれないが)、
U+301CをCP932の0x8160にするように自分で予め変換しておくかだな。
0487デフォルトの名無しさん
2008/06/01(日) 00:02:340488デフォルトの名無しさん
2008/06/01(日) 00:13:41MSのCP932では、〜を>>483が書いてるようにU+FF5Eにマップするんだよ
こういう要注意な文字は他にもある
0489デフォルトの名無しさん
2008/06/01(日) 00:38:14上下逆の〜になるんだよね
0490デフォルトの名無しさん
2008/06/01(日) 00:58:24出力出来なくなるってのは何でなんだ?
昔作ったツール経由でコンソールだしたら、
普通にU+307Cだけ?になって、後の出力は問題なく出たんだけど。
0491489
2008/06/01(日) 00:59:29○U+301C
0492490-491
2008/06/01(日) 01:00:130493デフォルトの名無しさん
2008/06/01(日) 01:05:08B b;
A a = b;
って、したとき、
型変換でbの一時オブジェクトが出来て、コピーコンストラクタでaが構築されるのか?
それとも、型変換だけでaが構築されちゃう?
0494デフォルトの名無しさん
2008/06/01(日) 01:07:480495デフォルトの名無しさん
2008/06/01(日) 01:14:23なんで?に置き換わると思うんだ?
そんなもんは変換層の仕様/実装次第だろ
iostreamのエンコード変換に使われるcodecvt<>は、正常に変換できないときには
エラーにする仕様ってだけじゃまいか
0496デフォルトの名無しさん
2008/06/01(日) 01:50:230497デフォルトの名無しさん
2008/06/01(日) 08:52:50その変換って、クラスAにクラスBの参照を引数に取るコンストラクタがあるってこと?だったらそのまま渡される。
でなくて、その変換がクラスBにクラスAへの変換の演算子が定義されてるって意味なら、戻りのオブジェクトがaになるかコピーされるかはコンパイラによるんじゃないか。戻り値の最適化(RVO)でググるべし
0498デフォルトの名無しさん
2008/06/01(日) 10:03:41一応ググってみたんですけど、要注意な文字は
ttp://www2d.biglobe.ne.jp/~msyk/software/libiconv-1.9.2-cp932-patch.html
にある表で全部ですか?
0499デフォルトの名無しさん
2008/06/01(日) 10:44:35493に「クラスAに〜」ってあるから前者かな?
もうちょいソースが必要かな。
0500デフォルトの名無しさん
2008/06/01(日) 10:47:59>>495の通り、変換できないときにはエラーになるなら、
「〜」とかに加えて、ASCIIと日本語以外の文字全部じゃね?
0501デフォルトの名無しさん
2008/06/01(日) 10:50:26たぶん動くw
0502デフォルトの名無しさん
2008/06/01(日) 11:03:23B::operator A()
じゃないかな。
0503デフォルトの名無しさん
2008/06/01(日) 13:41:06どういう意図なのでしょうか?
char* c
c = (char*)NULL;
NULLをポインタに入れるときにあえてその型にキャストする必要はあるのでしょうか?
c = NULL;
ではまずいのでしょうか?
0504デフォルトの名無しさん
2008/06/01(日) 13:58:39のようなソフトはどのようにしてIEと連系を取っているのでしょうか?
OLEやCOMといったようなインタフェース?が関係しているように思っているのですが
よく分かりません。
perlでは、youtube等から動画を保存するモジュールなどがあるようですが、
例えば、上記のようなツールはどこかのサーバに接続してperlスクリプトを走らせた
結果を入力して、URLなどを取得したりしているのでしょうか?
ご教示願います
0505デフォルトの名無しさん
2008/06/01(日) 14:07:50単独で取得できるよ
ブラウザアクセスの履歴を眺めて、それをエミュレートすれば良いだけ
基本のGETアクセスだけで出来る
irvineスレ言ったら、解析済みのコードが見られる。
0506デフォルトの名無しさん
2008/06/01(日) 14:07:58このへん読めばわかるんじゃない?たぶん
http://msdn.microsoft.com/en-us/library/aa753589(VS.85).aspx
0507506
2008/06/01(日) 14:14:240508デフォルトの名無しさん
2008/06/01(日) 14:16:08>>506
ありがとうございます。GETコマンドについて調べてみます。
右クリックメニューは、レジストリキーいじってたんですね。
0509デフォルトの名無しさん
2008/06/01(日) 14:21:490510デフォルトの名無しさん
2008/06/01(日) 14:34:52NULLが(void *)0と定義されていれば暗黙の型変換ができると思うけど
そうじゃなければ型指定しないとだめとかじゃないっけか?
0511デフォルトの名無しさん
2008/06/01(日) 14:36:320512デフォルトの名無しさん
2008/06/01(日) 14:37:510513503
2008/06/01(日) 14:48:45>>511
なるほど。#define NULL (void*)0
しているところばかりじゃないということですね。
ありがとうございます。
0514デフォルトの名無しさん
2008/06/01(日) 15:59:33いや、C++では #define NULL 0 で、その場合もc = NULLでOKと思うよ。
c = (char*)NULL にする必要性あるのかな。詳しい人よろしく。
0515デフォルトの名無しさん
2008/06/01(日) 16:01:430516デフォルトの名無しさん
2008/06/01(日) 16:01:54c = (char*)NULL; とせざるを得ない。
0517デフォルトの名無しさん
2008/06/01(日) 16:02:44昔は違ったかもしれないが、少なくともC89以降、0やNULLはどのポインタ型へも
暗黙の変換ができることになっている。
NULLを(void*)0と定義するのは、
誤ってポインタ以外に使おうとしたときにエラーにさせることが主目的。
規格に沿えば、単に0などという定義でも全く問題ない。
0518デフォルトの名無しさん
2008/06/01(日) 16:05:41ANSI Cが制定される前のCでは、キャストが必要な処理系があった。
その時代のコードならNULLやmallocの戻り値をキャストしてるコードはよくある。
0519513
2008/06/01(日) 16:06:14NULLを(void*)0にするとc=(char*)NULLと
書かないといけなくなるから0にしたという話だったと思う。
0はC/C++どちらでもキャストしないでいいはず。(int* p = 0とか大丈夫でしょ)
いずれにしてもc=(char*)NULLと書く必要はない気がする。
0520513
2008/06/01(日) 16:08:540521デフォルトの名無しさん
2008/06/01(日) 16:20:05そんな簡単に騙されるなよ・・・
0522デフォルトの名無しさん
2008/06/01(日) 16:20:41助かる場合には意味があるかもなぁ。
0523デフォルトの名無しさん
2008/06/01(日) 18:42:010 とは限らなくて、処理系独自のキーワードで定義されていることもある。
C でも C99 で処理系定義になった。
0524デフォルトの名無しさん
2008/06/01(日) 18:43:54C でも void* から別のポインタ型への暗黙のキャストをしようとすると警告出すコンパイラもある。
そういうコンパイラを黙らせるには明示的にキャストをしないといけない。
そういうことなんじゃないの?
0525デフォルトの名無しさん
2008/06/01(日) 20:45:22ただし、可変長引数の末尾には、(char *)NULL と書いておきなさい、という説があるみたいです。
0526デフォルトの名無しさん
2008/06/01(日) 20:47:11末尾に限らず可変長引数の途中でヌルポインタを渡したいときはキャストが必要。
同様に、実引数から型を推測するような関数テンプレートにもヌルポインタを渡す
ためにはキャストなどの注意が必要。
0527デフォルトの名無しさん
2008/06/01(日) 21:10:23NULL終端文字列として扱えるからな。
0528デフォルトの名無しさん
2008/06/01(日) 21:19:040529デフォルトの名無しさん
2008/06/01(日) 21:26:04NULLとだけ書くと整数のゼロを渡してしまうかもしれないからだろ
intとポインタのサイズが同じかつNULLのビット表現がintの0と一致するという限られた環境の下ではたまたま動くかもしれないが
0530デフォルトの名無しさん
2008/06/01(日) 21:35:210531デフォルトの名無しさん
2008/06/01(日) 21:37:01なんか斬新だな
dequeでいいんじゃないか
0532デフォルトの名無しさん
2008/06/01(日) 21:46:370533デフォルトの名無しさん
2008/06/01(日) 22:26:520534デフォルトの名無しさん
2008/06/01(日) 22:56:37boost/circular_buffer
0535デフォルトの名無しさん
2008/06/01(日) 23:40:50void Hoge() throw (HogeException){
}
として、VC++にてビルドすると
C++ の例外の指定は無視されます。
関数が __declspec(nothrow) でないことのみ表示されます。
という警告が出ます、
メソッドの例外型制限は VC++ 以外の環境でもサポート外なのでしょうか
よろしくお願い致します。
0536デフォルトの名無しさん
2008/06/01(日) 23:46:100537デフォルトの名無しさん
2008/06/01(日) 23:46:16gccでは使える
でもそれほど役に立たない機能だぞ
0538デフォルトの名無しさん
2008/06/02(月) 00:25:17>>537
ありがとうございます。
スローする例外を明示したかったのですが、
http://msdn.microsoft.com/ja-jp/library/sa28fef8(VS.80).aspx
を見た感じ、将来ではサポートする事を匂わせてますね。
0539デフォルトの名無しさん
2008/06/02(月) 00:29:090540デフォルトの名無しさん
2008/06/02(月) 01:16:350541デフォルトの名無しさん
2008/06/02(月) 01:20:31int a[] = { 0,1,2,3,4,5,6,7,8,9 }
みたいな組み込み型の配列を関数に引数として渡すにはどうしたらいいんでしょう?
vectorならそのまま参照でもコピーでもできるんですけど組み込み型はどうにもうまくいかなくて。
0542デフォルトの名無しさん
2008/06/02(月) 01:30:23{
...
}
int main()
{
int a[] = {0,1,2,3...};
func(a);
return 0;
}
もし関数内で配列を弄らないなら
void func(const int *a);
と宣言しとけばいい
0543デフォルトの名無しさん
2008/06/02(月) 01:38:58#define ELEMOF(array) (sizeof (array) / sizeof (array)[0])
void func(const int *a, size_t n) { ... }
func(a, ELEMOF(a));
0544デフォルトの名無しさん
2008/06/02(月) 02:06:16どもです。
やっぱり組み込み型はサイズを自動的には受け渡せないんですね。
vector では受け取った関数内で size を確認できるのに
組み込み型は sizeof の結果が変わってしまうので困ってました。
0545デフォルトの名無しさん
2008/06/02(月) 02:55:32テンプレートという手もありだよ。
template<typename T>
void func(T const& a) //中身を書き換えるなら当然T&で
{
...
}
これなら関数内ではsizeof a / sizeof a[0]もできる。
以下蛇足。Boost.Rangeを使ってboost::size(a)などと書けば、
組込配列も渡せるし、std::vectorも渡せるようにできる。
0546デフォルトの名無しさん
2008/06/02(月) 07:11:14void func(const int* begin, const int* end) { ... }
0547デフォルトの名無しさん
2008/06/02(月) 11:10:55valarray va(10);
log(va);
とか出来ますが、これは、自分で作ったクラスに対してlogとかsinとかを適用できるようにすることが
できるということだと思うのですが、どうやればよいですか?
valarrayのソースを見てみたけどよくわからんかったス
0548デフォルトの名無しさん
2008/06/02(月) 12:41:38普通に
Hoge log(Hoge x){ ... }
っていう関数を新たに定義すればいいのでは?
0549デフォルトの名無しさん
2008/06/02(月) 12:44:25csvファイルからデータを読み込むときに、一行目を飛ばして二行目から読み込みを始めたいと思い、
以下のようにプログラムを書きました。
/**** データ読み込み ****/
fscanf(fl,"\n"); //一行目(V1とか書いてあるところ)とばす
for(n = 0; n < P; n++){
以下配列に読み込み
fscanf(fl,"\n"); のところで一行飛ばしてから、for文で読み込んでいこうと思ったのですが、
うまくいきませんでした。
自分なりに調べてみたのですがうまくいきませんでした。ご教授よろしくお願いいたしますm(_ _)m
0550デフォルトの名無しさん
2008/06/02(月) 12:47:17たしかにそれでも出来ますが、valarrayのソース内にはそういう関数定義はないみたいなんですが、
やっぱり普通に定義しないとだめですよね?
0551デフォルトの名無しさん
2008/06/02(月) 12:51:26>fscanf(fl, "\n");
そのように書いても、一行飛ばすという意味にならない。
なぜこれで一行飛ばせると思ったのか?
教科書やリファレンスにそう書いてあったか?
カンでプログラミングしないこと。
while (fgetc(fl) != '\n') ;
などとすれば次の行まで読み飛ばせる (本当は EOF もチェックした方がいいけど)
0552デフォルトの名無しさん
2008/06/02(月) 12:56:32どの処理系か知らないけど、うちの C:\Program Files\Microsoft Visual Studio 8\VC\include\valarray には
>template<class _Ty> inline
>valarray<_Ty> log(const valarray<_Ty>& _Left)
>{ // apply log to each element of valarray
>_VALOP(_Ty, _Left.size(), ::log(_Left[_Idx]));
>}
って書いてあるよ
0553デフォルトの名無しさん
2008/06/02(月) 13:03:28レスありがとうございます。
fscanf(fl,"\n");
と書いて一行飛ばせると思ったのは、\nは改行を示しているために、
一行飛ばせると思ってしまいました。。もっと勉強します。
本当にありがとうございました。
0554デフォルトの名無しさん
2008/06/02(月) 13:09:430555デフォルトの名無しさん
2008/06/02(月) 13:16:13fscanf(fl,"%*[^\n]"); /* 改行以外の文字を読み飛ばしてから */
fscanf(fl,"%*c"); /* 次の一文字(=改行)を読み飛ばす */
とかになる
fscanf(fl, "%*[^\n]%*c");
と一見書けそうに思えるが、いきなり改行が来るとジャムるのでダメ
ま、scanf()系って理解すればそんなに難しいものではないけど
初心者には鬼門だな
0556デフォルトの名無しさん
2008/06/02(月) 15:41:22コール元をVCで作成してるいんですが、
「test.obj : error LNK2019: 未解決の外部シンボル __imp__CareerDataRead が関数 _main で参照されました。」
がでます。testはDLL用テストプロジェクトです。
下記はtest用DLLソースです。
extern "C" __declspec (dllimport) int CareerDataRead(char *chrFileName);
int main()
{
CareerDataRead("test.c");
}
なにが足りないのでしょうか?
0557デフォルトの名無しさん
2008/06/02(月) 15:57:340558デフォルトの名無しさん
2008/06/02(月) 15:58:33DLLをビルドしたときに出来たインポートライブラリをコール元にリンクする
0559556
2008/06/02(月) 16:05:54>>558
即レスありがとうございます。
インポートライブラリのリンクとのことですが、
�@プロパティページの「Frameworkと参照」の「参照」にて当該libファイルを設定する
�A同プロパティページの「リンカ」「入力」「追加の依存ファイル」にて当該libファイルを設定する
と2通りのやり方を調べあげました。どちらもやっても結果が変わりません。
申し遅れましたがVC++2008 Expressにて開発しております。
0560デフォルトの名無しさん
2008/06/02(月) 16:16:51プロジェクトのプロパティのリンカの入力に設定するか、
ソースに #pragma comment(lib, "xxxxxx.lib")
を追加する。
0561デフォルトの名無しさん
2008/06/02(月) 16:18:43そのDLLの関数はCリンケージでexportしてるね?
0562556
2008/06/02(月) 16:38:47>>560さんの指摘は�Aとお見受けしまた。pragmaの方は試してないのですが、なぜ前者の
方でうまくいかないのか謎です。
>>561
ソリューションは以下の構成下にあります。
ExcelVBA
Debug ←ここにlibファイルがあります。
ExcelVBA
Debug
test
よってリンカの「入力」「追加の依存ファイル」より「ExcelVBA.lib」を設定してあります。
また、リンカの「全般」に「追加のライブラリディレクトリ」というのがあったので
上記のライブラリがあるパスをフルパスで設定しました。
が、あいかわらず未解決がでます。
>>561
DLLのエクスポートですが
#define DllExport extern "C" __declspec (dllexport)
DllExport int WINAPI CareerDataRead(char *chrFileName);
を先頭につけており、同関数の中身を return 128;
でExcelから呼び出した場合128が却ってきたことを確認しています。
なお、これから複雑な処理を書くためVBAから結果のみみてデバッグは危険かと思い
ダミーコールプログラムをVC++で書いてる次第でございます。
0563556
2008/06/02(月) 16:43:54/OUT:"C:\Documents and Settings\xxxx\My Documents\Visual Studio 2008\Projects\ExcelVBA\Debug\test.exe"
/INCREMENTAL /NOLOGO /LIBPATH:"C:\Documents and Settings\xxxx\My Documents\Visual Studio 2008\Projects\ExcelVBA\Debug"
/MANIFEST /MANIFESTFILE:"Debug\test.exe.intermediate.manifest" /MANIFESTUAC:"level='asInvoker' uiAccess='false'"
/DEBUG /PDB:"C:\Documents and Settings\xxxx\My Documents\Visual Studio 2008\Projects\ExcelVBA\Debug\test.pdb" /
SUBSYSTEM:CONSOLE /DYNAMICBASE /NXCOMPAT /MACHINE:X86
/ERRORREPORT:PROMPT excelvba.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib
0564デフォルトの名無しさん
2008/06/02(月) 16:52:00windows.h のインクルードもね
0565デフォルトの名無しさん
2008/06/02(月) 16:56:39export側では呼び出し規約がWINAPI
import側はWINAPIが抜けてる(んでcdeclを仮定している)
正しい方に統一汁
dumpbin.exeやバイナリエディタでDLLやlibの中身をのぞいたりすることも
してみると良い
呼び出し規約が違えばライブラリに埋め込まれるリンカ用の名前も変わるから
見りゃすぐ分かるよ
0566556
2008/06/02(月) 17:06:12ちなみに下記のように修正しました。
#include <windows.h>
// extern "C" __declspec (dllimport) int WINAPI CareerDataRead(char *chrFileName);
#define DllImport extern "C" __declspec (dllimport)
DllImport int WINAPI CareerDataRead(char *chrFileName);
int main()
{
CareerDataRead("test.c");
}
0567556
2008/06/02(月) 19:03:10↑の実際の処理手法を調べていました。
処理内容はファイル(テキストファイルで行ごとにタブ区切り)を読み込んで、ある一部分を集計するように
したいのですが、ファイルを読み込む方法として
�@fopen fget等C言語を使用する。
�Aifstreamを使用する。
�BCreateFile ReadFile等 Win32を使用する。
�CMFCの利用(すいません、調べきれてません)
などなどやり方が多くありどれが最適かよくわかりません。
元々VBAでやっていた集計が遅いとのことなのでスピードアップが目的なのですがどのやり方がよいか、
こんなのが一般的だなどアドバイスお願いします。
0568デフォルトの名無しさん
2008/06/02(月) 19:10:35MFCは除外するとして、WinAPIは行単位の読み込み関数がないから敷居が高いんでない?
ifstreamを使うかfopenを使うかは習熟度次第。
読み込むファイルが数値だけの書かれたテキストファイルならどっちでもいいでしょ。
処で、なんでExcel自身に処理させないの?
tsvを読み込むのも集計するのもExcelでできると思うのだけど。
0569566
2008/06/02(月) 19:18:49レスありがとうございます。
ifstreamがC++っぽいらしいのでそれで挑戦します。
ちなみにExcelVBAで処理を行うと1ファイル500行ほどで5万ファイルほど集計をかけなければならないため
(この5万ファイル中で項目によりベスト5、ワースト5等を決めます)
表示を切ったりセルに書き込む処理を抑制しても、処理に15分から20分ほどかかってしまいます。
VBAでいろいろな努力をした結果、1ファイルの処理をDLLで計算させると速いと聞いたのでいま苦戦中です;;
0570デフォルトの名無しさん
2008/06/02(月) 19:19:01場合によっては awk でも実用的な速度になるかもしれない
興味があれば「gawk」でググれば見つかると思う
# こんな感じ
BEGIN{FS="\t"}
{if(NF>=3) sum+=$3} // 3番目のレコードの総和
END{print sum}
0571568
2008/06/02(月) 19:25:27なるほど、ちょっとした量だな。
できれば、DLLにするよりも単体のプログラムにした方がらくだとは思うのだけれど……
あぁそうか、DLL作成のノウハウは(ここで)得ているのか。
0572デフォルトの名無しさん
2008/06/02(月) 19:26:420573デフォルトの名無しさん
2008/06/02(月) 19:32:39サンプルデータを用意してくれれば挑戦してみたい
どんな入力(サンプルデータ)に対してどんな値を返せばいいのかを教えてくれれば
C言語でやってみます
要するに関数プロトタイプとサンプルデータ下さいって事です
0574デフォルトの名無しさん
2008/06/02(月) 19:35:000575デフォルトの名無しさん
2008/06/02(月) 19:45:55そして車輪の再生産ですね?わかります。
0576デフォルトの名無しさん
2008/06/02(月) 19:47:37生産性重視なら他の言語でもいいが、C++にはパフォでは絶対勝てないな
0577デフォルトの名無しさん
2008/06/02(月) 19:49:05awkは以前Unixの処理系でやりましたが挫折しました。
>>571
初心者ですがこれも経験だと思ってチャレンジします。
>>572
集計結果が表やグラフで表示するため保存形式やドキュメントの流用性を考えるとExcelが有効だと考え
ました。
>>573
タブ区切りのデータが8個あり最終は改行です。
1 コメント 300 400 500 600 800 900
2 コメント 200 200 30 6 800 90000
3 コメント 350 100 450 600 20 500
:
(500行ほどあります)
↑このファイルが5万ほどありますが、ファイル指定は親のVBAからします。つまりファイル名を入力として
最終データの最高値、最小値、平均の3つを返せればそれを利用して他の処理もできると考えてます。
0578566
2008/06/02(月) 19:49:550579568
2008/06/02(月) 19:54:56VBAでファイルを読み込んで、VBAでExcel関数を使って集計するのは試した?
ファイル数が多いから微妙だけど、VBAを使いこなせていればそれなりの時間で処理できそうだけど。
0580デフォルトの名無しさん
2008/06/02(月) 19:56:425万ファイルはxlsじゃなくてtsvファイルってこと?
んで、集計結果もエクセルで扱いやすい形式であればよい?
0581デフォルトの名無しさん
2008/06/02(月) 19:59:496種の項目すべてについて最高値・最小値・平均を求めるとして
返すのは一番左の数値?それとも最高値・最小値?
int CarrerDataRead(const char *filename, long *max0, ... , long *max5, long *min0, ... , long *min5, long *ave0, ... , long *ave5);
こんなん?引数の数が半端無いよw
0582デフォルトの名無しさん
2008/06/02(月) 20:01:190583デフォルトの名無しさん
2008/06/02(月) 20:04:39VBAからの呼び出し時に配列を ByRef で渡す方法があれば簡単になるんだけど
その方法を知らないんだ
0584デフォルトの名無しさん
2008/06/02(月) 20:05:00ご指摘の内容はWorksheetFunctionのことだと思われます。が合計、平均等の処理は
当該処理を利用させてもらいました。おそらくダイエット可能な場所はほとんどやり尽く
した感があったためDLL化とうい道を選択しました。
実際算出しなければいけないデータは平均、最高値、最低値だけでないためExcel関数
の範疇を超えております。
0585デフォルトの名無しさん
2008/06/02(月) 20:05:10速度も、安定性もアップする。
なんか開けるすうに制限あるし、不安定な動作することがある c++
0586566
2008/06/02(月) 20:05:540587デフォルトの名無しさん
2008/06/02(月) 20:07:34そりゃぁ、バッファリングしないAPIなら速いでしょうね。早くはありませんが。
つーか、ハンドル閉じ損ねても100や200じゃ問題出ませんもんね。
0588デフォルトの名無しさん
2008/06/02(月) 20:09:09なに、その地雷コードw
0589デフォルトの名無しさん
2008/06/02(月) 20:09:200590デフォルトの名無しさん
2008/06/02(月) 20:09:510591デフォルトの名無しさん
2008/06/02(月) 20:10:29ファイルクローズはデストラクタ任せ
0592デフォルトの名無しさん
2008/06/02(月) 20:10:550593566
2008/06/02(月) 20:10:56データは各行の8項目の最終データのみ対象です。返すのは3つのデータです。(最高、最低、平均)
int CarrerDataRead("ファイル名"、結果の配列)
がベストと考えてます。ただVBAの方で受けられる型とかの検証はまだしてません。すいません。
0594デフォルトの名無しさん
2008/06/02(月) 20:12:14つまり、最終カラム?
0595デフォルトの名無しさん
2008/06/02(月) 20:17:24#include<stdio.h>
#include<stdlib.h>
int main(void){
int i, j, k;
FILE *fp;
char filename[FILENAME_MAX];
for(i=0;i<500;i++){ // とりあえず50000じゃなくて500
sprintf(filename, "temp/dat%05d", i+1); // tempというディレクトリは予め作っておいて下さい
printf("%s\n", filename);
if((fp=fopen(filename, "w"))==NULL) exit(1);
for(j=0;j<500;j++){
fprintf(fp, "%d\tコメント", j+1);
for(k=0;k<6;k++) fprintf(fp, "\t%d", rand());
fprintf(fp, "\n");
}
fclose(fp);
}
return 0;
}
0596デフォルトの名無しさん
2008/06/02(月) 20:25:17俺もこの手の内容ならawk か perlあたりでいいかなと思ったんだけどね。
UN*Xユーザはなかなか理解されないのだろうかorz
0597デフォルトの名無しさん
2008/06/02(月) 20:37:29awkは全て実数だし配列処理が遅いことでも有名なので、
awkが遅すぎると思えるならperl/ruby/pythonあたりを試すといいだろう
別解としては、TSVなら簡単にDBに取り込めるはずなので、
SQLに集計処理をやらせる手もある
#!/usr/bin/awk -f
BEGIN {
from = 3
to = 9
}
NR == 1 {
for (i = from; i < to; i++)
amax[i] = amin[i] = asum[i] = $i
}
NR > 1 {
for (i = from; i < to; i++) {
if ($i > amax[i]) amax[i] = $i
if ($i < amin[i]) amin[i] = $i
asum[i] += $i
}
}
END {
for (i = from; i < to; i++) printf("%d\t", amax[i])
printf("\n")
for (i = from; i < to; i++) printf("%d\t", amin[i])
printf("\n")
for (i = from; i < to; i++) printf("%g\t", asum[i]/NR)
printf("\n")
}
0598デフォルトの名無しさん
2008/06/02(月) 20:40:48スレ違い感が否めないが、$8だけでいいらしいよ。
0599デフォルトの名無しさん
2008/06/02(月) 20:42:03よく読んでなかった
まあ、俺がいいたかったのは、わざわざC/C++で書く必要がある仕事には見えない
ってことだったんだけどね
0600デフォルトの名無しさん
2008/06/02(月) 20:43:38>>402そんな面倒ではないぞ。
0601デフォルトの名無しさん
2008/06/02(月) 20:48:39だがもしかするとみんなそれを理解したうえで、主のDLLで
何とかしたいという要求に答えたいだけなのかもしれないや。
とりあえずawkでやってみたけど、大して速くないものの処理が終わり、
テストデータの大きさが2ギガあったことにびっくりしつつ削除してオワタ。
0602573
2008/06/02(月) 21:41:470603573
2008/06/02(月) 23:14:20typedef long value_t;
int value_get(FILE *fp, value_t *value){
return fscanf(fp, "%*[^\t]\t%*[^\t]\t%*[^\t]\t%*[^\t]\t%*[^\t]\t%*[^\t]\t%*[^\t]\t%ld", value)==1;
}
int CareerDataRead_internal(const char *filename, value_t *best, value_t *worst, value_t *average){
FILE *fp;
long i, sum=0;
value_t value, maximum, minimum;
if((fp=fopen(filename, "r"))==NULL) return 0;
if(!value_get(fp, &value)){
fclose(fp);
return 0;
}
maximum=minimum=value;
sum+=value;
for(i=1;;i++){
if(!value_get(fp, &value)) break;
if(value>maximum) maximum=value;
if(value<minimum) minimum=value;
sum+=value;
}
fclose(fp);
*best=maximum;
*worst=minimum;
*average=sum/i;
return i;
}
__declspec(dllexport) int CareerDataRead(const char *filename, value_t *result){
return CareerDataRead_internal(filename, &result[0], &result[1], &result[2]);
}
0604デフォルトの名無しさん
2008/06/03(火) 00:12:02全角空白でもいいからインデントしてくれるとありがたい。
だと半角空白のままインデント出来るから尚いいけど、
こっちは文字数制限に掛かりやすくなるからね。
0605デフォルトの名無しさん
2008/06/03(火) 00:12:430606デフォルトの名無しさん
2008/06/03(火) 00:15:050607デフォルトの名無しさん
2008/06/03(火) 00:18:15自分でindent叩くとかindent-regionするとかさー
0608デフォルトの名無しさん
2008/06/03(火) 00:25:150609デフォルトの名無しさん
2008/06/03(火) 00:39:27試したところ 3 分弱。結構かかるねー。
0610デフォルトの名無しさん
2008/06/03(火) 00:44:13ifstreamなんて糞みたいに遅いから、わざわざC++使ってもちっとも速くならないと
思う
0611デフォルトの名無しさん
2008/06/03(火) 00:47:12#include <stdlib.h>
void hyouji(int x);
main()
{
int i,x;
char hikisu[];
printf("数値を入力してください(1-52):");
scanf("%d",&x);
hyouji(x);
for (i=1; i <= x; i++){
printf("%d %c",i,hikisu[i]);
}
}
void hyouji(int x)
{
FILE fp;
int i;
if(NULL == (fp = fopen("homework.txt","r"))){
printf("ファイルが開けません\n");
exit(1);
}
for (i=1; i <= x; i++){
fscanf(fp, "%c", &hikisu[i]);
}
fclose(fp);
return;
}
以上のプログラムで『LightC』を使ってコンパイルしようとしても上手くいきません。
どの辺りが間違っているのでしょうか?
『LightC』
ttp://www.tamasoft.co.jp/lc/index.html
0612デフォルトの名無しさん
2008/06/03(火) 00:48:03少なくともVC6の頃は鼻血出そうなくらい遅かった。
0613デフォルトの名無しさん
2008/06/03(火) 00:50:590614デフォルトの名無しさん
2008/06/03(火) 01:06:23#include <stdlib.h>
void hyouji(int x);
main() ←戻り値の型指定が無い
{
int i,x;
char hikisu[]; ←サイズが決まってない
printf("数値を入力してください(1-52):");
scanf("%d",&x);
hyouji(x);
for (i=1; i <= x; i++){
printf("%d %c",i,hikisu[i]);
}
}
void hyouji(int x)
{
FILE fp; ←普通ファイルポインタを使うので*fp
int i;
if(NULL == (fp = fopen("homework.txt","r"))){
printf("ファイルが開けません\n");
exit(1);
}
for (i=1; i <= x; i++){
fscanf(fp, "%c", &hikisu[i]); ←hikisuなどと言うものはこの関数内に存在しない
}
fclose(fp);
return;
}
ぱっと見た感じこんなもの
0615デフォルトの名無しさん
2008/06/03(火) 01:07:37vimで
ggVG=
とやればよいよ。VSなら}を書き直したらそれでやってくれなかったっけ?
0616デフォルトの名無しさん
2008/06/03(火) 01:12:31基礎から学べ
0617デフォルトの名無しさん
2008/06/03(火) 01:28:45わざわざそれだけのためにエディタ起動させるのか。
0618611
2008/06/03(火) 01:31:43test.c(7): エラー C.2530: 変数 hikisu のサイズが不明です
test.c(5): 警告 C.5280: 関数 main に return 文がありません
test.c(19): エラー C.2920: struct _FILE/* を struct _FILE に変換することはできません
test.c(24): エラー C.2130: 識別子 hikisu が未定義です
test.c(26): エラー C.2920: struct _FILE を struct _FILE/* に変換することはできません
0619デフォルトの名無しさん
2008/06/03(火) 02:13:20だってビルドエラーとか、半端なソースの場合とか、動かす前に
見なきゃじゃん。
エディタ起動すらめんどくさがるとかどうやってソース書いてんの?
0620611
2008/06/03(火) 02:16:05#include <stdio.h>
#include <stdlib.h>
void hyouji(int x);
char main(char hikisu[])
{
int i,x;
printf("数値を入力してください(1-52):");
scanf("%d",&x);
hyouji(x);
for (i=1; i <= x; i++){printf("%d %c",i,hikisu[i]);}
}
void hyouji(int x,)
{
FILE *fp;
int i;
char hikisu[52];
if(NULL == (fp = fopen("homework.txt","r"))){
printf("ファイルが開けません\n");
exit(1);
}
for (i=1; i <= x; i++){fscanf(fp, "%c", &hikisu[i]);}
fclose(fp);
return;
}
しかし、それでも以下のようなエラー文が出ます。
test.c(4): 警告 C.5280: 関数 main に return 文がありません
test.c(19): エラー C.2150: == 演算子の引数が正しくありません
一体どこにエラーがあるのでしょうか・・・
0621デフォルトの名無しさん
2008/06/03(火) 02:44:28void f(int **p){
int x[2]={1,2};
*p=x;
}
int main(void){
int *p;
f(&p);
printf("%d\n",p[0]+p[1]);
return 0;
}
上のプログラムの誤りを指摘せよという問題が出たのですが、
どこが間違っているのかよくわからないので教えてください。
おそらくp[0],p[1]のあたりが違うのだと思うんですが・・・
0622デフォルトの名無しさん
2008/06/03(火) 02:46:40>char main(char hikisu[])
ただ付ければ良いって物でもないだろ。
一度「ちゃんとした」入門書を買ってきて勉強したほうがいい。
>test.c(4): 警告 C.5280: 関数 main に return 文がありません
「return文がない」と言われているのだから、どこかにreturn文を追加すれば
いいのではないか、というくらいは想像つかないか?
0623デフォルトの名無しさん
2008/06/03(火) 02:48:37※1
char main(char hikisu[])
↓
int main(int argc, char** argv)
※2
printf("%d %c",i,hikisu[i]);のhikisuが不明
※3
main関数の最後にreturn 0;を付ける
※4
void hyoujiと関数の戻り値がvoidになっている。
戻り値を使わないのなら、最後のreturn;は必要ないです。
※5
void hyouji(int x,)
↓
void hyouji(int x)
0624デフォルトの名無しさん
2008/06/03(火) 02:49:14つ ヒント「ローカル変数の寿命」
0625623
2008/06/03(火) 03:12:28※2
printf("%d %c",i,hikisu[i]);のhikisuが不明
と書いたけど、mainの引数を使いたいっぽいのですよね。
mainの引数を使うなら、
argcの方に引数の数が入ってるから、その数を参考にしてその数をオーバーする事のないようにして、
printf("%s", argv[i]);
これみたいに表示かな。
06261/2
2008/06/03(火) 03:20:56#include <stdlib.h>
void hyouji(char*, size_t);
int main()
{
char *hikisu;
size_t size;
while(1){
printf("数値を入力してください(1-52):");
scanf("%d", &size);
if(size > 0 && size < 53) break;
else printf("サイズを超えています\n");
}
hikisu = (char*)malloc(size * sizeof(char));
if(NULL == hikisu){
printf("メモリが確保出来ません\n");
exit(1);
}
hyouji(hikisu, size);
free(hikisu);
return 0;
}
06272/2
2008/06/03(火) 03:21:17{
FILE *fp;
int i;
if(NULL == (fp = fopen("homework.txt","r"))){
printf("ファイルが開けません\n");
exit(1);
}
for(i=0; i < size; ++i){
fscanf(fp, " %c", &hikisu[i]);
printf("%2d: %c\n", i+1, hikisu[i]);
}
fclose(fp);
}
やりたいんだろうなと言う事を考えたらこんな感じになるかな
homework.txtの中身を知らないからその辺は変わるかも知れないけど
0628デフォルトの名無しさん
2008/06/03(火) 04:17:380629611
2008/06/03(火) 09:19:09ありがとうございます、そして本当にご迷惑をおかけしました・・・
>>614-627とテキストを見直してもう一度自分で考えてみようと思います。
0630デフォルトの名無しさん
2008/06/03(火) 16:57:39using namespace std;
int main(void)
{ cout << "Hello" << endl; }
上記のソースをコンパイルして、 c:\>hello.exe > hello.txt
のように実行すれば、テキストファイルができるのですが、
出力させたいのがテキストではなく、バイナリデータの時はどうすれば良いのでしょうか?
cout << binary_data;
とすると、意図しないデータが出力されてしまいます。
どうすればバイナリデータを変換させないでそのまま出力させることができるのでしょうか?
どなたか、優しい方いましたら教えて下さい。
携帯から書き込んでいるので、見にくかったらすみません。
0631デフォルトの名無しさん
2008/06/03(火) 17:45:51バイナリモードにすればよろしかろ。
0632デフォルトの名無しさん
2008/06/03(火) 17:48:55その、バイナリモードってやつにはどうすればできるのでしょうか?
0633デフォルトの名無しさん
2008/06/03(火) 17:53:18cout バイナリとかでググればいいんじゃね?
0634デフォルトの名無しさん
2008/06/03(火) 17:55:32Windowsだよね。__setmode(__fileno(stdout), _O_BINARY)でOK。
0635デフォルトの名無しさん
2008/06/03(火) 18:05:47char*にキャストしてwrite()とかするんだね
0636デフォルトの名無しさん
2008/06/03(火) 18:15:310637デフォルトの名無しさん
2008/06/03(火) 21:32:59俺なんかおかしいこと言った?
バイナリ出力ならエンコード変換も書式フォーマットも改行制御も要らない
つまりiostreamは完全に余計な邪魔者でしかない
ostream::write()がマシだと思うが
streambufを使う方がマシで、
本当はiostreamなんて使わないのが一番いい
0638デフォルトの名無しさん
2008/06/03(火) 22:05:430639デフォルトの名無しさん
2008/06/03(火) 22:33:51fwrite()一発で済む仕事でなぜわざわざそんなことをやる
明らかに遅く、特に得るものがあるとも思えない
0640デフォルトの名無しさん
2008/06/03(火) 22:36:30実際の出力との対応を分かりやすくできて、メリットだと思うけどね。
0641デフォルトの名無しさん
2008/06/03(火) 22:40:1332bit整数をバイナリ出力するときとか、Cならアドレス取って4byte書き出す
わけじゃん
iostreamの作法ではどうするの?
0642デフォルトの名無しさん
2008/06/03(火) 23:13:280643デフォルトの名無しさん
2008/06/03(火) 23:15:39意味が分からない
バイナリビューワなら、出力は「テキスト」じゃないか
>>630は「バイナリデータを出力したい」と言ってるんだぞ
質問者の意図を理解してなかったの?
0644630
2008/06/04(水) 00:00:25あれから、色々頑張ってみたのですが、なにぶん初心者な者で、かなりてこずりました。
最終的には _setmode でなんとかできました。
fwrite で書き出したファイルとも一致するので、とりあえずはこれで良しとします。
色々と教えて下さった皆さん、どうもありがとうございました。
0645デフォルトの名無しさん
2008/06/04(水) 00:04:53分かってると思うけどC++でもfwrite()は普通に使っていいんだよ
0646デフォルトの名無しさん
2008/06/04(水) 00:30:570647デフォルトの名無しさん
2008/06/04(水) 00:46:23参考までに聞くけど、fwrite()の替わりに何使ってるの?
fwrite()なら
int a = 0xdeadbeaf;
fwrite(&a, sizeof a, 1, fp);
で済むけど
ostream::write()やstreambuf::sputn()はキャストしなきゃいけないから
stream.write(reinterpret_cast<char*>(&a), sizeof a);
とかになるよね
コードは長い、汚い、その上遅い
0648デフォルトの名無しさん
2008/06/04(水) 00:55:240649デフォルトの名無しさん
2008/06/04(水) 00:59:260650デフォルトの名無しさん
2008/06/04(水) 01:11:14必要ならFILEポインタからstreamオブジェクトに
キャストできるし、f系の方が便利よね。
0651デフォルトの名無しさん
2008/06/04(水) 01:12:010652デフォルトの名無しさん
2008/06/04(水) 09:44:440653デフォルトの名無しさん
2008/06/04(水) 09:51:42if ( MAX - 値 < 変数)
変数+値はオーバーフローしちゃうよヽ(゚∀゚)ノ
0654デフォルトの名無しさん
2008/06/04(水) 14:57:290655デフォルトの名無しさん
2008/06/04(水) 17:37:470656デフォルトの名無しさん
2008/06/04(水) 19:20:07警告レベル最高だと、未初期化の変数が使用される可能性がある場合に
ビルド時に警告が出力されますが
構造体変数の初期化方法に困っています
使用直前で変数宣言すべきか、構造体1つ1つに初期値をセットすべきか
他に何かスマートな方法があるのでしょうか、
よろしくお願い致します。
0657566
2008/06/04(水) 19:57:17仕様変更などもともなって、long型のデータ7個とdouble型のデータ4個をVBA側に返すことになりました。
が、これらのデータをどうやってVBA側に渡せばよいのかわかりません。
なお、処理はCのライブラリのみ使用してC++ MFCのライブラリ等はほとんど使用しておりません。
あともう少しなのでアドバイスお願いします。
0658566
2008/06/04(水) 20:00:59・VBAの処理をC++で書き直してDLL化。
・VBAからDLLの関数を呼ぶ。
・DLLの関数から結果をVBAで受ける。
・VBAでグラフやレポートを出力する。
こんなことする理由:データ量が多いので処理が遅いため。
でございます。
0659566
2008/06/04(水) 20:05:580660デフォルトの名無しさん
2008/06/04(水) 20:35:361文字ずつ扱えるようにしたいのですが、
入力する文字列を保存する変数には最初に、
char c[256];
のようにメモリを確保しないとバッファオーバーフローがおき、
問題がありますよね?
メモリの動的確保の目的が、メモリの効率的な利用なのはわかりますが、
この入力する文字列のメモリ確保の無駄は、
オーバーフローを防ぐためには仕方がないのでしょうか?
また、メモリ確保の無駄を無くすために、宣言時に
char c;
として、故意にバッファオーバーフローを起こさせるのは、
やはりプログラム的にはNGですよね?
よろしくお願いします。
0661デフォルトの名無しさん
2008/06/04(水) 20:36:20全部 0 で良ければこんな感じでどう?
struct foo = {};
0662デフォルトの名無しさん
2008/06/04(水) 20:39:55日本語でおk
0663デフォルトの名無しさん
2008/06/04(水) 20:43:06ストリームからは一文字づつ取得すればいいいだろ
0664デフォルトの名無しさん
2008/06/04(水) 20:45:08それはダメだ。{}の中には最低一つの式がないといけない。
0665デフォルトの名無しさん
2008/06/04(水) 20:49:51レスありがとうございます
オール0になってて使えそうです
0666デフォルトの名無しさん
2008/06/04(水) 20:52:59そもそもその処理は頻繁に行う必要があり、短時間で処理を終える
必要があるの?
0667デフォルトの名無しさん
2008/06/04(水) 20:59:5710Kバイトくらいをバッファとして用意していて、入力が数バイトしかなければ
残りの9Kバイトくらいは無駄になりますね。
けれど、実際の環境において、9Kバイト余分に使用したからといって
破綻するような精一杯な状態って、あまりないですよね。
富豪的プログラミングというか、そういう発想でいいと思いますよ。
どうしても無駄にallocしたくない、って言うのであれば一文字ずつ取得して、
都度reallocすればいいと思いますが。。
0668660
2008/06/04(水) 21:16:55レスありがとうございます。
プロバイダ規制中のため、携帯でちまちま打ってたら反応が遅くなってしまいました。
打ってる最中でしたが、望んでいた答えが>>667さんから得られたので、
ここは、富豪的プログラミングということで手を打ちたいと思います。
ありがとうございました。
0669デフォルトの名無しさん
2008/06/04(水) 21:32:370670デフォルトの名無しさん
2008/06/04(水) 21:37:47VBAから呼ばれる関数の引数で返せばいい。
配列(ポインタ)引数で、要素に書き込んでおけば、VBA側にも反映される。
0671デフォルトの名無しさん
2008/06/04(水) 21:55:140672デフォルトの名無しさん
2008/06/04(水) 21:57:14読み込んだ量
0673デフォルトの名無しさん
2008/06/04(水) 21:59:100674デフォルトの名無しさん
2008/06/04(水) 22:01:58量の単位は何ですか?
0675デフォルトの名無しさん
2008/06/04(水) 22:14:570676デフォルトの名無しさん
2008/06/04(水) 22:18:550677デフォルトの名無しさん
2008/06/04(水) 22:19:290678デフォルトの名無しさん
2008/06/04(水) 22:21:320679デフォルトの名無しさん
2008/06/04(水) 22:23:020680デフォルトの名無しさん
2008/06/04(水) 22:38:39ん?
0681デフォルトの名無しさん
2008/06/04(水) 23:13:18Cのエディタって何使ってます?
今までVS使ってたんですけど、マイコン用のに使うのには向かなくて…
テキストエディタでオススメの教えていただけませんか?
個人的に、ヘッダファイル読んで構造体や関数の補完入力、表示の機能があるといいですね。
0682デフォルトの名無しさん
2008/06/04(水) 23:16:52個人的にはvimなんだけど、sakuraとかemacsとかEclipseもいいんでないの?
0683デフォルトの名無しさん
2008/06/04(水) 23:17:45つってもVS見たいなポップアップではないが
0684デフォルトの名無しさん
2008/06/04(水) 23:36:22宿題スレから。realloc() を使います。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFFSIZE 3 /* >= 2 */
char *getline(void) {
static char inbuff[BUFFSIZE];
char *outbuff_malloc, *tmpbuff, *p;
int fEOL;
if ((outbuff_malloc = malloc(1)) == NULL)
return NULL;
*outbuff_malloc = '\0';
fEOL = 0;
do {
if (fgets(inbuff, BUFFSIZE, stdin) == NULL) break;
for (p = inbuff; *p != '\0'; p++);
if (*(p - 1) == '\n') { *(p - 1) = '\0'; fEOL = 1; }
if ((tmpbuff = realloc(outbuff_malloc, strlen(outbuff_malloc) + strlen(inbuff) + 1)) ==NULL) { free(outbuff_malloc); return NULL; }
strcat(tmpbuff, inbuff);
outbuff_malloc = tmpbuff;
} while (!fEOL);
return outbuff_malloc;
}
int main()
{
char *inputLine_malloc;
if ((inputLine_malloc = getline()) != NULL) { printf(">>%s\n", inputLine_malloc); } else { printf("getline: cannot alloc memory.\n"); }
free(inputLine_malloc); /* NULL ok */
return 0;
}
/* end */
0685デフォルトの名無しさん
2008/06/04(水) 23:56:36ありがとうございます!
試してみます
0686C++で質問です
2008/06/05(木) 00:14:03#include <string>
#include <cstddef>
// T 型オブジェクト e 個分の領域を確保し、値 t で埋める
template< class T >
void foo( const int e, const T& t )
{
using namespace std;
allocator< T > alloc;
T *begin, *end, *iter;
// 領域の確保
begin = alloc.allocate( e );
end = begin + e;
uninitialized_fill( begin, end, t );
// 何らかの処理
// 領域の開放
iter = end;
while( iter != begin )
{
alloc.destroy( --iter ); // オブジェクトを後方から順に破棄
}
alloc.deallocate( begin, end - begin ); // 確保した領域を破棄
}
上記のような関数で、領域開放の際、 deallocate の前に
各要素に対して destroy を実行するのが通例ですが、
これを行う意味ってなんでしょう? 実行しない場合、何が起こると考えられますか?
0687デフォルトの名無しさん
2008/06/05(木) 00:24:410688686
2008/06/05(木) 00:32:49なるほど。
型 T がポインタやクラス(特に自らリソースを確保するクラス)であったような時
メモリリークを引き起こす可能性があるわけですね。
一方、型 T が int や double であった場合には
オブジェクトが使っているメモリ領域は
まさに deallocate で削除される領域なので問題はおきない
と考えてよろしいでしょうか?
0689デフォルトの名無しさん
2008/06/05(木) 01:15:19テンプレートを使わない場合でもコードが入り組んでくると
ほにゃらら_tみたいな、実態が組み込み型なんだかクラスなんだか
後で組み込み型からクラスに変更されるかも知れないような怪しいtypedefが出てくるので、
POD型の時にはデストラクタを呼ばないようなテンプレートを書いておいて
call_destructors<T>(begin, end);
みたいな感じで必ず記述しておいたほうが良いと思うけど。
0690デフォルトの名無しさん
2008/06/05(木) 01:23:050691デフォルトの名無しさん
2008/06/05(木) 01:29:260693デフォルトの名無しさん
2008/06/05(木) 12:44:52VC++2008EEで独自のダイアログを表示するクラスを作ったのですが、メンバ関数からDialogBox()する時に同じメンバ関数のダイアログプロシージャを呼ぶ方法が良く分りません。
DialogBox(g_hInst, MAKEINTRESOURCE(IDD_DIALOG1), g_hWnd, hoge::MsgBox);
↓
error C3867: 'hoge::MsgBox: 関数呼び出しには引数リストがありません。メンバへのポインタを作成するために '&hoge::MsgBox' を使用してください
その通り書き換えてもキャスト出来ない旨のエラーが出ますし、ヘルプの凡例には該当するものがなくて対処出来ません。
クラスを使わなければ表示出来るのですが、何が原因でしょうか。
0694デフォルトの名無しさん
2008/06/05(木) 12:47:310695デフォルトの名無しさん
2008/06/05(木) 12:55:44MsgBoxが非staticメンバ関数であることが原因
非staticメンバ関数にはthisポインタという隠れた引数があるので普通の関数と同等には扱えない
そういう場合には普通の関数かstaticメンバ関数を渡しておき、
何かのトリックを使ってどこかからthisポインタを取り出し、それを使ってメンバ関数を呼ぶ
0696デフォルトの名無しさん
2008/06/05(木) 13:36:08回答ありがとうございます。
処理が複雑になりそうなので(普通の関数とローカル変数を使えば出来そうな気もしますが)、現状ではダイアログプロシージャをクラスに含めない事にしました。
本当にありがとうございました。
0697デフォルトの名無しさん
2008/06/05(木) 16:16:26あー__is_podか。
大分前にispodって書いてる人がいて、それで検索してたんだけど、
どうりで見つからなかったわけだ。
0698デフォルトの名無しさん
2008/06/05(木) 16:20:480699デフォルトの名無しさん
2008/06/05(木) 16:36:34yacc/lex
0700デフォルトの名無しさん
2008/06/05(木) 20:26:23> POD型の時にはデストラクタを呼ばないような
それ、まさにallocatorのdestroy。
正確に言うとx.~T()の構文はPODでもエラーにならず、何の効果も起きないだけ。
ちなみに、こんなコードも合法のはず。
int main()
{
typedef int t;
t i;
i.~t();
}
0701デフォルトの名無しさん
2008/06/06(金) 14:37:58やり方が分かりません。
アプリケーションのアイコンをタスクトレイに表示させた後、そのアイコン上に
マウスを移動させた場合に指定したメッセージを表示させる事は出来ます。
これを、マウスをアイコン上に移動させなくてもイベントが発生した際に
バルーンを表示させるようにしたいのですが・・・。
NIM_SETFOCUSを使えば似た事が可能なのですが、NIM_SETFOCUSを利用すると
ウィンドウのフォーカスがアイコンに持っていかれてしまうので不便です。
別のやり方は無いでしょうか?
伝えにくいので以下に現状のプログラムを示します。
NOTIFYICONDATA g_nid;
case WM_CREATE:
ZeroMemory ( &g_nid, sizeof( NOTIFYICONDATA ));
sprintf( g_nid.szTip, "TESTメッセージです" );
g_nid.cbSize = sizeof( NOTIFYICONDATA );
g_nid.hWnd = hWnd;
g_nid.uID = TRAY_ID;
g_nid.uFlags = NIF_ICON | NIF_TIP | NIF_MESSAGE;
g_nid.uCallbackMessage = MYWM_NOTIFYICON;
Shell_NotifyIcon( NIM_ADD, &g_nid );
break;
case WM_MYEVENT://任意のタイミングでメッセージを表示
Shell_NotifyIcon( NIM_SETFOCUS , &g_nid );//フォーカスを割り当てる、これで一応バルーンは表示される
break;
0702デフォルトの名無しさん
2008/06/06(金) 20:35:140703デフォルトの名無しさん
2008/06/07(土) 08:07:02以下のプログラムで構造体を初期化するには
どう記述すればいいでしょうか。
括弧のつけ方をいろいろ変えているんですけど、
初期化の一部だけに括弧が付いているとか、
宣言構文エラーとか出てうまくいきません。
typedef struct {
int a;
int b;
}FOO_STRUCT;
typedef struct {
FOO_STRUCT foo[2];
}HOGE_STRUCT;
int main(void)
{
HOGE_STRUCT hoge = {{0, 1}, {2, 3}};
return 0;
}
0704デフォルトの名無しさん
2008/06/07(土) 08:32:03HOGE_STRUCT hoge = {{{0, 1}, {2, 3}}};
0705デフォルトの名無しさん
2008/06/07(土) 08:45:48通りました。ありがとうございます。
0706デフォルトの名無しさん
2008/06/07(土) 13:44:39なぜ calloc等で動的確保した変数には、
解放のコードを書かないといけないのでしょうか、
逆に自動変数はなぜ解放のコードが不要なのでしょうか。
0707デフォルトの名無しさん
2008/06/07(土) 13:57:31自動変数は自動的に確保/解放されるから「自動」変数なのです
0708デフォルトの名無しさん
2008/06/07(土) 14:13:32ありがとうございます、初歩的な質問ですみませんでした
0709デフォルトの名無しさん
2008/06/07(土) 14:18:38結合規則の問題で悩んでます。
|A| = |B|*|C|*|D|の式をプログラムで表現するときに、
MATRIX matA, matB, matC, matD;
matA = matB * matC * matD;
と書いて表現させたいのですが、普通にやると
|A| = (|B|*|C|)*|D|
と認識してしまいます。
()などを使わずに
右辺を右から左の順序で乗算させる方法が何かありませんでしょうか
0710デフォルトの名無しさん
2008/06/07(土) 14:26:29結合律が成り立たない場合は括弧で括ってください。
0711デフォルトの名無しさん
2008/06/07(土) 14:30:13ありがとうございました。
それでやろうと思います。
0712デフォルトの名無しさん
2008/06/07(土) 14:31:44(B×C)×D = B×(C×D) でしょ?
どっちでも一緒じゃん?
0713デフォルトの名無しさん
2008/06/07(土) 14:33:05結合順によって計算量が変わる可能性は高い
0714デフォルトの名無しさん
2008/06/07(土) 14:55:30行列演算で×を使うと意味が変わっちゃうよ
0715デフォルトの名無しさん
2008/06/07(土) 15:14:340716デフォルトの名無しさん
2008/06/07(土) 15:28:01ただ外積は順番によっては計算量が著しく変わる。内積はどんな順番でも行 * 列 * 項の数で一定
0717デフォルトの名無しさん
2008/06/07(土) 15:50:05そもそも行列積に operator* を使わない方がいいと思うが。
0718デフォルトの名無しさん
2008/06/07(土) 15:51:07A 100x100
B 100x100
C 10x100
(AB)C
100x100x100+100x10x100=1100000
A(BC)
100x10x100+100x10x100=200000
0719デフォルトの名無しさん
2008/06/07(土) 16:00:330720デフォルトの名無しさん
2008/06/07(土) 16:16:160721デフォルトの名無しさん
2008/06/07(土) 16:20:51ない。
0722デフォルトの名無しさん
2008/06/07(土) 16:27:47それならスカラーになるから>>716の言ってるのはアダマール積のことだと思う。
0723デフォルトの名無しさん
2008/06/07(土) 16:54:150724デフォルトの名無しさん
2008/06/07(土) 17:07:16そして行列の外積って何を表しているんだろう?
0725デフォルトの名無しさん
2008/06/07(土) 17:09:18Σij AijBji のことか? と聞こうとしたんだった。
要するに tr A^T B
0726デフォルトの名無しさん
2008/06/07(土) 19:08:48_,,....,,_ _人人人人人人人人人人人人人人人_
-''":::::::::::::`''> ゆっくりしていってね!!! <
ヽ::::::::::::::::::::: ̄^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^ ̄
|::::::;ノ´ ̄\:::::::::::\_,. -‐ァ __ _____ ______
|::::ノ ヽ、ヽr-r'"´ (.__ ,´ _,, '-´ ̄ ̄`-ゝ 、_ イ、
_,.!イ_ _,.ヘーァ'二ハ二ヽ、へ,_7 'r ´ ヽ、ン、
::::::rー''7コ-‐'"´ ; ', `ヽ/`7 ,'==─- -─==', i
r-'ァ'"´/ /! ハ ハ ! iヾ_ノ i イ iゝ、イ人レ/_ルヽイ i |
!イ´ ,' | /__,.!/ V 、!__ハ ,' ,ゝ レリイi (ヒ_] ヒ_ン ).| .|、i .||
`! !/レi' (ヒ_] ヒ_ン レ'i ノ !Y!"" ,___, "" 「 !ノ i |
,' ノ !'" ,___, "' i .レ' L.',. ヽ _ン L」 ノ| .|
( ,ハ ヽ _ン 人! | ||ヽ、 ,イ| ||イ| /
,.ヘ,)、 )>,、 _____, ,.イ ハ レ ル` ー--─ ´ルレ レ´
0727デフォルトの名無しさん
2008/06/07(土) 19:09:230728デフォルトの名無しさん
2008/06/07(土) 19:12:52電磁気の話だと物理的意味があるよ
0729デフォルトの名無しさん
2008/06/07(土) 19:15:48行列でouter productって言ったらテンソル積のことじゃね。
0730デフォルトの名無しさん
2008/06/07(土) 19:19:10http://www.jspf.or.jp/cd2/7505cd/75-5/sakagami/2-11.html
などのサイトに乗っている15種類の状態からでは2^8=256通りではなく254通りしか
生成できません
具体的には立方体のうち向かい会う2面のそれぞれ対角線上の格子点が垂直をなすように
ON(OFF)になっているケースの2通りの状態が含まれていません。
どこのサイトを見てもこのことに関する情報はありませんでした。
マーチングキューブ法ではこのような状態は異常として無視して描画しないのでしょうか?
しかしどこを見ても必ず「256通り」の記述があるのがどうにも・・
0731デフォルトの名無しさん
2008/06/07(土) 19:24:10おまいら頭だけはでかいんだな
0732デフォルトの名無しさん
2008/06/07(土) 19:25:290733デフォルトの名無しさん
2008/06/07(土) 19:28:2614通りのうち表の左上が0。
そしてトポロジーにより0の状態が2つある。
よって2^256 - 2 = 254
0734デフォルトの名無しさん
2008/06/07(土) 19:34:221+Σ(1/i!) (1〜10まで)
やってみたのですが分かりません。
何がおかしいでしょうか?
#include <stdio.h>
main(){
int i,fact;
double j,e;
fact=1;
i=1;
while(i<=10){
fact=fact*i;
j=1/fact;
i=i+1;
}
e=1+j;
printf("e=%lf\n",e);
}
0735デフォルトの名無しさん
2008/06/07(土) 19:36:100736デフォルトの名無しさん
2008/06/07(土) 19:36:13とりあえず
1/fact;
これの結果は切り捨てになるぞ?
0.いくつとかにはならずに
0737デフォルトの名無しさん
2008/06/07(土) 19:37:14main(){
int i,fact;
double j = 0.0,e;
fact=1;
i=1;
while(i<=10){
fact=fact*i;
j+=1.0/fact;
i=i+1;
}
e=1+j;
printf("e=%lf\n",e);
}
0738デフォルトの名無しさん
2008/06/07(土) 19:38:4813番目の状態が>>730で欠落している2箇所にあたります
ポリゴンは正しいけど黒丸の表示位置がそれとずれていました
0739デフォルトの名無しさん
2008/06/07(土) 19:46:36doubleで定義すると1.0としないとだめなんですか?
>>736
なぜですか?
>>737
なぜそういう風にしないといけないのか教えてもらいたいのですが・・・
0740デフォルトの名無しさん
2008/06/07(土) 19:50:150741デフォルトの名無しさん
2008/06/07(土) 19:53:34整数同士の演算結果は整数だから、そんでその結果をdoubleにして代入だから
暗黙の型変換とかでぐぐれ
0743デフォルトの名無しさん
2008/06/07(土) 21:25:22doubleだけだとちょっと辛いだろw
0744デフォルトの名無しさん
2008/06/07(土) 21:27:380745デフォルトの名無しさん
2008/06/07(土) 21:30:340746デフォルトの名無しさん
2008/06/08(日) 09:04:59[2]問題文
三つの整数値を読み込んで、それらの値が全て等しければ、「三つの値は等しいです。」と、どれか二つの値が等しければ、「二つの値が等しいです。」と、そうでなければ、「三つの値は異なります。」と表示するプログラムを作る。
[3-1]windows
[3-2]gcc
[3-3]C言語
[4]明後日まで。
[5]if文を使って下さい。お願いいたします。
0747デフォルトの名無しさん
2008/06/08(日) 09:07:45スレ違いです
こちらへどうぞw
http://pc11.2ch.net/test/read.cgi/tech/1211980711/944
0748デフォルトの名無しさん
2008/06/08(日) 09:19:330749デフォルトの名無しさん
2008/06/08(日) 10:20:13[5]が増えてるw
0750デフォルトの名無しさん
2008/06/08(日) 12:18:02ttp://moyashi.air-nifty.com/hitori/2006/09/gsplayer225_0036.html
を読んでGSPlayerをビルドしようとしたんですが上手くいきません
そこに書いてあるようにVisual C++ 4.0などを入れてファイルを開いたら固まるので
Visual C++ 2005 Express EditionとPlatform SDKを入れてみたんですが上手くいきません
他に何かインストールしなきゃダメな物があるんでしょうか?
0751デフォルトの名無しさん
2008/06/08(日) 12:21:51目的はWin32版のビルドです
0752デフォルトの名無しさん
2008/06/08(日) 12:39:540753デフォルトの名無しさん
2008/06/08(日) 12:40:10上手くいきません、だけじゃ回答の仕様が無い。
何をやって、どういう状況になったか明確に説明せずに、回答者側にそれを想像することを求めている?
そもそも、そのブログに
>eVC++ 4.0、eVC++ 4.0のサービスパッチ、PPC2003 SDK、PPC2003のエミュレータを順次インストールすればOK。
と書いてあるのに、勝手にVC++2005を使って上手くいかないと言われても。
VC++2005の他に何かインストールしなければいけないのではなく、上記のものを正しくインストールすべき。
>Visual C++ 4.0などを入れてファイルを開いたら固まるので
これについてはどこか他スレで。
0754デフォルトの名無しさん
2008/06/08(日) 12:43:34自分では試せないので、上記を参考に試してみてください。
現在GSPlayer2は「Windows Mobile 2005」にも対応してます。この場合は、「Visual Studio 2005 Standard Edition」でビルドするんですかね。
相応のSDKも必要になるでしょう。
ただ、上記の手順で作ったバイナリは、H/PC系を除き、各種WMで動くと思います。
をやろうとしたんだと思う。多分。
0755750
2008/06/08(日) 13:02:52>VC++ 4.0、eVC++ 4.0のサービスパッチ、PPC2003 SDK、PPC2003のエミュレータを順次インストール
はやったのですが固まってしまうので下の方に書いてあるVisual Studio 2005 Standard Editionを入れました。
libmad.vcwを開くとあるのですが見つからないので、libmad.dspをダブルクリックで開くと
「Visual C++ プロジェクト形式に変換されなければなりません」と出たので変換して開いてソリューションのビルドをすると1 失敗となってしまいます
>>754
それをやろうとしたんですが上手くいきませんでした
>相応のSDKも必要
とあるので何かインストールしなければならない物があるのかと思ったのですが見当違いでしょうか
0756デフォルトの名無しさん
2008/06/08(日) 13:19:11勝手に、インクルードのパス変えてみたりフォルダの構造変えてみたり・・・
聴いてみれば、あれがなかったからかえてみた。とか、パスを通すの面倒だからコピーしたとか・・・・
どんな経験者でも、他人が作ったプロジェクトのどこにノウハウが隠れているか分からないものを変更するのは細心の注意が必要なのにな。
0757デフォルトの名無しさん
2008/06/08(日) 13:37:33>ソリューションのビルドをすると1 失敗となってしまいます
ビルドエラー時にもっと詳細なメッセージが出ているはずだけど、それについて調べる努力はした?
自分にとって意味不明なメッセージはスルー?
>>753も書いているけど、失敗というだけでなくもっと詳細な情報を出さなければ回答してもらえないよ。
たぶんこのスレで聞く様な問題ではなく、visual stdioとかそっち系を探すべきだとは思うけど。
0758750
2008/06/08(日) 13:54:49すみません
エラーが多いので環境自体が整ってないのかと思っていました。
長いのでttp://uproda.2ch-library.com/src/lib030582.txt
スレ違いのようでしたら移ります。
0759デフォルトの名無しさん
2008/06/08(日) 14:13:530760デフォルトの名無しさん
2008/06/08(日) 14:18:09d:\gsplayer\libmad\libmad.c(2) : fatal error C1083: include ファイルを開けません。'windows.h': No such file or directory
0761デフォルトの名無しさん
2008/06/08(日) 15:42:11++a; /* lvalue required as increment operand */
printf("%p", &a);でアドレスは取れるのにもかかわらず、このaは左辺値じゃないんですか?
0762デフォルトの名無しさん
2008/06/08(日) 15:43:040763デフォルトの名無しさん
2008/06/08(日) 15:49:24lvalueでもmodifiableなものとそうでないものがある。
その例のほかに、たとえばconst修飾されたlvalueはmodifiableでない。
0764761
2008/06/08(日) 16:00:36代入が不可能である時点でインクリメントが出来ないんだろうなという気はするんですが、
>lvalue required as increment operand
というような表現なんで不思議に思ったのですよ
>>763
じゃあこのエラーメッセージは罠で、
aが変更不可能な変数であることがポイントって事なんでしょうか?
0765デフォルトの名無しさん
2008/06/08(日) 16:06:37char a[] は、
char* const a だと思っておけ。
0766デフォルトの名無しさん
2008/06/08(日) 16:14:06The pointer shall be created explicitly, using the unary & operator, or
implicitly using a non-type template parameter of pointer type, or using
an expression of array (4.2) or function (4.3) type.
このルールで右辺値じゃないけど&でポインタをとれる
0767デフォルトの名無しさん
2008/06/08(日) 16:15:13そもそもa[0]などがlvalueであって、a自体はlvalueではないだろ。
&演算子が使えるかどうかはlvalueであることとは無関係では?
0768デフォルトの名無しさん
2008/06/08(日) 16:18:320769デフォルトの名無しさん
2008/06/08(日) 16:18:44lvalue の解釈を「アドレスが取れるもの」とせずに、素直に「代入式の左辺に置けるもの」と
考えておけば何も問題ないエラーメッセージじゃないか?
0770768
2008/06/08(日) 16:19:34modifiableでないlvalueだ
0771デフォルトの名無しさん
2008/06/08(日) 16:25:07左辺値なら何でも代入可能とは限らない。
0772デフォルトの名無しさん
2008/06/08(日) 17:58:07#include <bitset>
#include <boost/lambda/lambda.hpp>
#include <boost/cstdint.hpp>
int main() {
double d=1.0;
std::bitset<64> b(*((boost::int64_t *) &d));
namespace bl=boost::lambda;
for (int i=0; i < b.size(); ++i)
std::cout << b[i];
}
doubleのビット表現をbitsetにぶちこむ為に一時変数使ってポインタのキャストしてるんですが
こういう面倒臭いことせずに
std::bitset<64> b( foo(1.0) );
みたいに一発でできる方法ってないですかね?
0773デフォルトの名無しさん
2008/06/08(日) 18:16:38std::string("0110110101")みたいな
0774デフォルトの名無しさん
2008/06/08(日) 18:48:03一時変数を使うほうが分かりやすいと思うぞ。
reinterpret_cast<boost::uint64_t const&>(static_cast<double const&>(1.0))
そもそも標準のbitsetでは、コンストラクタが
773も言っているstringを取るやつと、unsigned longを取るやつ、
あとコピーコンストラクタしかないからうまくいかなくても知らないぞ。
0775デフォルトの名無しさん
2008/06/08(日) 19:00:00double型を引数としてビット表現を文字列表記したstd::string型を返す関数fooを用意すれば
>std::bitset<64> b( foo(1.0) );
という風にかけるんじゃない?
以下は適当に書いてみた。テストもコンパイルもしてない。
template<typename T>
std::string foo(T d)
{
char buf[sizeof(T)];
for (int i= 0 ; i < sizeof(T) ; i++)
{
buf[i] = *(reinterpret_cast<char*>(&d))[i/8] & (0x80 >> i%8);
}
return std::string(buf);
}
0776デフォルトの名無しさん
2008/06/08(日) 19:00:53○ (reinterpret_cast<char*>(&d))
0777デフォルトの名無しさん
2008/06/08(日) 20:13:530778デフォルトの名無しさん
2008/06/08(日) 20:16:040779デフォルトの名無しさん
2008/06/08(日) 20:30:490780デフォルトの名無しさん
2008/06/08(日) 21:35:470781デフォルトの名無しさん
2008/06/08(日) 23:46:000782デフォルトの名無しさん
2008/06/08(日) 23:47:520783デフォルトの名無しさん
2008/06/08(日) 23:50:170784デフォルトの名無しさん
2008/06/08(日) 23:51:520785デフォルトの名無しさん
2008/06/09(月) 00:02:360786デフォルトの名無しさん
2008/06/09(月) 00:10:190787デフォルトの名無しさん
2008/06/09(月) 00:18:270788デフォルトの名無しさん
2008/06/09(月) 00:19:080789デフォルトの名無しさん
2008/06/09(月) 00:19:540790デフォルトの名無しさん
2008/06/09(月) 00:32:22#undef nagato
#endif
0791デフォルトの名無しさん
2008/06/09(月) 00:56:190792デフォルトの名無しさん
2008/06/09(月) 01:13:110793デフォルトの名無しさん
2008/06/09(月) 01:14:500794デフォルトの名無しさん
2008/06/09(月) 01:42:570795デフォルトの名無しさん
2008/06/09(月) 23:34:24構造体の配列をユーザ関数で作って
それをメイン関数に返したいのですが可能ですか?
0796デフォルトの名無しさん
2008/06/09(月) 23:35:40staticな変数なら返してもおk
0797デフォルトの名無しさん
2008/06/09(月) 23:36:250798デフォルトの名無しさん
2008/06/09(月) 23:43:18T data[L];
};
array_wrapper<int, 10> function(){
array_wrapper<int, 10> result_value;
/* ... */
return result_value;
}
0799デフォルトの名無しさん
2008/06/09(月) 23:45:29どうすればメイン関数で使えるか分からないんです
返却値を構造体の配列の0番目の要素のアドレスにして、
メイン関数で使おうとしたら、0番目の要素以外には処理に使えなくて…
どうすれば、メイン関数ですべての構造体の配列が使えるようになりますか?
0800795
2008/06/09(月) 23:47:39使ってるのはCです
0801デフォルトの名無しさん
2008/06/09(月) 23:47:57使えるよ。
どう使えないの?
0802デフォルトの名無しさん
2008/06/09(月) 23:48:500803デフォルトの名無しさん
2008/06/09(月) 23:56:010804デフォルトの名無しさん
2008/06/09(月) 23:57:190805795
2008/06/09(月) 23:57:59printf("%d n",a[i]->num);
}
見たいな処理を関数内とメイン関数内ですると
構造体を作った関数内では表示できるんですけど
メインでは0番目の要素を処理した後に処理が止まります
0806デフォルトの名無しさん
2008/06/09(月) 23:58:570807デフォルトの名無しさん
2008/06/10(火) 00:18:560808デフォルトの名無しさん
2008/06/10(火) 11:20:430809デフォルトの名無しさん
2008/06/10(火) 11:46:51TCHAR bar = foo;
但し、桁あふれに注意。
0810デフォルトの名無しさん
2008/06/10(火) 15:12:36「char型データ(\t)int型データ(\t)int型データ(\t)double型データ(\n)」
この形式で、保存されている分(1件〜無制限)だけデータを表示させたいのですが、
char型データは最大で全角20文字で、この文字数によって表示が崩れてしまいます。
0811810
2008/06/10(火) 15:24:03氏名 英語 数学 平均
ほげ 20 21 20.5
名無しのごんべ 100 100 100.0
このように揃えたいのですが、現状だと
名前 英語 数学 平均
ほげ 20 21 20.5
名無しのごんべ 100 100 100.0
名無し 50 50 50.0
このように表示されてしまいます。
0812810=811
2008/06/10(火) 15:24:550813デフォルトの名無しさん
2008/06/10(火) 15:26:06それはchar型ではなく、char配列だろ。
と言うのはさておき、printf()を使えば済む話なのか?
printf("%20.20s\t%12d\t%12d\t%24.20g\n", string, int1, int2, double1)
0814デフォルトの名無しさん
2008/06/10(火) 15:49:51そうでした、ご指摘ありがとうございます。
printf("%40.40s\t%d\t%d\t%0.1f\n",p->name,p->english,p->mathematics,p->average);
このように記述したところ、一応揃いました。
ただこの構造体は、毎回標準入力でデータを保管していくので、氏名の文字数も毎回変わります。
その都度(全データにおけるの氏名の最大文字数)に合わせて幅を変えたいのですが、可能でしょうか?
そんなのねえよ!というのであれば、ここで諦めるのですが・・・。
0815デフォルトの名無しさん
2008/06/10(火) 16:05:56printf("%*s", 40, "string")
0816デフォルトの名無しさん
2008/06/10(火) 19:52:040817デフォルトの名無しさん
2008/06/10(火) 20:12:48VS2003のVC++のGDI+なんですが、
Font font = new Font(dc, &logfont);
とするとフォントをインスタンス化できますけど、logfontのフォント名に
"@MSゴシック" のように横に傾くフォントを指定すると、うまく指定され
ないように思われます。
たとえば
LOGFONT lf1, lf2;
lf1.lfFaceName = "@MS ゴシック"
Font* font = new Font(dc, &lf1);
font->GetLogFontW(&graphics, &lf2);
というように確認してみると、lf1には確かに"@MS ゴシック"がセットされて
いるのに、lf2には"@"が外れて"MS ゴシック"がセットされてしまいます。
私は何を勘違いしてるでしょうか?
0818デフォルトの名無しさん
2008/06/10(火) 20:25:330819817
2008/06/10(火) 20:31:54ぷーん
それじゃ他のトコで質問してきます…
0820デフォルトの名無しさん
2008/06/10(火) 21:17:12どのように書けばいいのでしょうか
#include <iostream>
using namespace std;
class A {
public: virtual void func() { cout << "func A" << endl; }
};
class B {
public: virtual void func() { cout << "func B" << endl; }
};
enum COMMAND { FUNCA_CMD, FUNCB_CMD, EoC };
int main()
{
A a;
B b;
void (*f[EoC]) = { &a, &b };
//(*f[FUNCA_CMD])->func(); エラー
return 0;
}
0821デフォルトの名無しさん
2008/06/10(火) 21:46:35class Base {
public:
virutal void func() = 0;
}
class A : public Base {
public:
virtual void func() { cout << "func A" << endl; }
};
class B : public Base {
public:
virtual void func() { cout << "func B" << endl; }
};
int main()
{
A a;
B b;
Base* f[2] = {&a, &b};
f[0].func();
f[1].func();
}
0822デフォルトの名無しさん
2008/06/10(火) 21:53:00次は示して頂いた物をテンプレートを使って再現できないか弄ってみます。
0823デフォルトの名無しさん
2008/06/10(火) 22:01:450824デフォルトの名無しさん
2008/06/10(火) 22:28:36template < class _T >
sub( _T & t )
{
A aa;
B bb;
t F[2] = {&aa, &bb}; // error
}
int main()
{
A a;
sub ( a )
}
なんだか二度手間っぽくて面倒だし、型もBはAに出来ないと言われちゃいましたw
0825デフォルトの名無しさん
2008/06/10(火) 22:35:020826デフォルトの名無しさん
2008/06/10(火) 22:36:550827デフォルトの名無しさん
2008/06/10(火) 23:02:030828デフォルトの名無しさん
2008/06/11(水) 01:37:31#include <iostream>
template < class T >
class test
{
friend std::ostream& operator<< ( std::ostream& os, test< T > t );
public:
void set( T val ) { x = val; }
private:
T x;
};
template < class T >
std::ostream& operator<< ( std::ostream& os, test< T > t )
{
os << t.x;
return os;
}
↑のようにfriend宣言したとき、
int main()
{
test< int > t;
t.set( 5 );
cout << t << endl;
}
とするとエラーが出るのですがなぜでしょう・・・。orz
テンプレートクラスでなければ問題なく動くのですが・・・。
0829デフォルトの名無しさん
2008/06/11(水) 02:01:02template < class T >
class test
{
friend template< class U > std::ostream& operator<< ( std::ostream& os, test< U > t );
public:
void set( T val ) { x = val; }
private:
T x;
};
本当は知らない。
0830デフォルトの名無しさん
2008/06/11(水) 02:02:03エラーメッセージぐらい貼ろうぜ。
どうせ friend の <> なんだろうけど。
0831デフォルトの名無しさん
2008/06/11(水) 02:08:06エラーメッセージは「エラー」という意味しか持たないものだから、
どういうエラーが出たかを書くという行為にまったく意味を見出せないんだろうね。
いつか胃ガンにでもなった時、「病気である」とだけ解釈してどういう病気かまったく興味を持たず、
呑気に胃薬飲み続けて死ねばいいと思うよ。
0832デフォルトの名無しさん
2008/06/11(水) 04:30:56実行時クラッシュです・・・
0833デフォルトの名無しさん
2008/06/11(水) 04:31:19コンパイルは通るのです。
0834デフォルトの名無しさん
2008/06/11(水) 04:59:21テンプレート周りにバグ抱えてる処理系はまだまだ多いぞ
0835デフォルトの名無しさん
2008/06/11(水) 05:09:420836デフォルトの名無しさん
2008/06/11(水) 07:40:39実行時クラッシュでもエラーメッセージは出てるだろ?
そうじゃなけりゃ何を見て「実行時クラッシュ」だと思ったのさ?
0837デフォルトの名無しさん
2008/06/11(水) 08:48:19どうせ答えは>>830だろうけど。
0838デフォルトの名無しさん
2008/06/11(水) 17:11:00VC9だけど通らない
Temaplate1.obj : error LNK2019: 未解決の外部シンボル "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class test<int>)"
(??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@V?$test@H@@@Z) が関数 _main で参照されました。
C:\Documents and Settings\*****\My Documents\Visual Studio 2008\Projects\Learn1\Debug\Temaplate1.exe : fatal error LNK1120: 外部参照 1 が未解決です。
0839デフォルトの名無しさん
2008/06/11(水) 17:12:52class test {
template <class U>
friend std::ostream& operator<<(std::ostream& os, test<U> t);
public:
void set(T val ){ x = val; }
private:
T x;
};
これなら通るし正常に動く
0840デフォルトの名無しさん
2008/06/11(水) 18:19:36class Hoge{
int nhoge;
public:
operator==(Hoge hoge){
if(this->nhoge == hoge.nhoge){ return true;
}else{ return false; }
}
hoge(int nhoge){ this->nhoge = nhoge; }
}
class Hogehoge{
std::vector<Hoge> vHoge;
public:
std::vector<Hoge> getVhoge(){return vhoge;}
void push_back(Hoge hoge){vHoge.push_back(hoge);}
}
main関数以下次レス。
0841840
2008/06/11(水) 18:20:13int main(){
Hoge hoge1(1), hoge2(2), hoge3(3), hoge4(4);
Hogehoge hogehoge;
hogehoge.push_back(hoge1);
hogehoge.push_back(hoge2);
hogehoge.push_back(hoge3);
std::vector<Hoge>::iterator itrHoge;
itrHoge = std::find(hogehoge.getVhoge().begin(), <-ここがおかしい
hogehoge.getVhoge().end(),hoge2);
hogehoge.insert(itrHoge,hoge4);
return 0;
}
とかいう感じでやりたいんですが、findのところで上手くイテレータを返してくれません。
hogehoge.getVhoge()を一時変数std::vector<hoge> tmpVhogeなどに格納してから
std::find(tmpVhoge.begin(),tmpVhoge.end(),hoge2)
などとやれば動くのですが、一時変数ではなく実体を直接いじりたいのでこれだと上手くないです。
原因がおわかりになるでしょうか?また、解決策はありますでしょうか。
コンパイラはcygwinのg++です。よろしくお願いします。
0842デフォルトの名無しさん
2008/06/11(水) 18:24:35getVhogeがvHoge自身ではなくvHogeのコピーを返してるから
実体を直接いじりたいなら
std::vector<Hoge> &getVhoge(){return vhoge;}
0843840
2008/06/11(水) 18:43:31それでしたorz
とても助かりました。ありがとうございます。
Effective C++にも似たようなことが書いてあったので読んで修行します。
0844デフォルトの名無しさん
2008/06/11(水) 20:03:13ベンチマークソフトと言ったら大袈裟ですが
HDDの単純な読み書き性能テストを行える
ソフトを作ろうかと思ってます。
単純にファイルの読み書きを100回位やった
ラップタイムを計測しようと思っています。
ベンチマークソフトのHDD性能計測ってなんか
凄いロジックとか使ってるんでしょうか?
C++じゃダメで何か他の言語じゃないと
いけないとかあるんでしょうか?
アドバイスをお願いします。
0845デフォルトの名無しさん
2008/06/11(水) 20:34:25メモリ/CPUの速度を測るオチになる
0846デフォルトの名無しさん
2008/06/11(水) 20:52:020847デフォルトの名無しさん
2008/06/11(水) 21:55:06挿入が終わったあとにイテレータが指している要素が
場合によって変わってしまう現象が起こります。
具体的には
vector:12345 iterator:3 vector.insert(iterator,6)
をやったときに
vector:126345 iterator:6
となる場合と
vector:126345 iterator:3
となる場合があります。
ちなみに前者は大きめのコードを書いてcygwin g++でコンパイル、
後者は検証用に仮想マシンのvine Linux上で書いてg++でコンパイルしてます。
原因等わかりますでしょうか。
0848デフォルトの名無しさん
2008/06/11(水) 21:58:56変わるのは仕様
メモリ確保しなおすからアドレスが変わるの
イテレータセットしなおすかlist使うとかしてください
0849848
2008/06/11(水) 21:59:430850847
2008/06/11(水) 22:05:19イテレータの位置が変わるのはいいのですが、
・insertした要素を指すように変わる
・insert前に指していた要素を指すように変わる
場合が発生して、どちらかに統一されていないので困るという話です。
insert後のイテレータの位置は保障されないってだけの気もしてきました。
だとしたらなんて不便なんだvector…
0851デフォルトの名無しさん
2008/06/11(水) 22:06:340852デフォルトの名無しさん
2008/06/11(水) 22:10:53単独ならinsertの戻り値
0853847
2008/06/11(水) 22:11:03orz
ありがとうございます。
ランダムアクセスイテレータを前提にしたコードなので今更listにするわけにもいかず…。
いちいちinsertする度にfindするしかなさそうですね。遅くなりそうだ…。
0854847
2008/06/11(水) 22:15:22それだ(;´Д`)上手く行きました!どうもありがとうございます!
0855デフォルトの名無しさん
2008/06/11(水) 22:38:55って関数があったとき、
void mein() {
struct na = *ni();
}
って呼び方あってる?
0856デフォルトの名無しさん
2008/06/11(水) 22:41:39printf("A");
sleep(1);
printf("B");
}
としてもABが同時に表示されるのは何故ですか?
sleep(1) を system("sleep 1") としても同じです。
コンパイラは gcc version 4.1.2 20061021 prerelease (NetBSD nb3 20061125) です。
0857デフォルトの名無しさん
2008/06/11(水) 22:44:13AとBが重なって出るようなら端末がしぼん
0858デフォルトの名無しさん
2008/06/11(水) 22:45:17setvbuf でググるよろし
0859デフォルトの名無しさん
2008/06/11(水) 22:45:26切ってしまうか必要に応じてfflushするか、stderrに出力するか
0860デフォルトの名無しさん
2008/06/11(水) 22:45:32バッファの問題じゃないかな
printf("A");
fflush(stdout);
sleep(1);
printf("B");
ってやってみては?
0861デフォルトの名無しさん
2008/06/11(水) 22:45:40ni()の仕様による。mein()ので正しい場合もある。
>>856
printf()の出力がバッファリングされているから。間にfflush(stdout)
とか入れると意図どおりになるかと。
0862デフォルトの名無しさん
2008/06/11(水) 23:05:25ありがとうございます。
最近の悩みが解消した気がします。
0863デフォルトの名無しさん
2008/06/11(水) 23:16:04fgets(buff,sizeof(buff),stdin);
if(!strcmp(buff, "A\n")){
.....
}
上のプログラムで、何故かループ2週目からのfgetsでキーボードからの入力を待機せずにそのままif文に入ってしまいます。
どなたか原因を教えていただけないでしょうか(´・ω・)
0864デフォルトの名無しさん
2008/06/11(水) 23:17:01buff が小さすぎるんじゃね?
0865デフォルトの名無しさん
2008/06/11(水) 23:17:37win32API勉強中なんですが、
CreateProcess("hoge.exe",..., pInfo);
WaitForSingleObject(pInfo.hProcess, INFINITE);
DeleteFile("hoge.exe");
とやると たまに DeleteFileが失敗するときがあります。
アクセス拒否 5 を返してるようです。
まだプロセスが終了していないということなのでしょうか。
0866デフォルトの名無しさん
2008/06/11(水) 23:18:19移植性のある解決方法としては空読みして捨てるしかない
0867863
2008/06/11(水) 23:18:340869デフォルトの名無しさん
2008/06/12(木) 00:42:08DWORD dwBaudRate; // 取り得る値 9600/19200/38400
BYTE byByteSize; // 取り得る値 4/5/6/7/8
・・・ // 上記以外の5個ほどの変数
}SERIAL_PARAM;
CSerialCom::Open(SERIAL_PARAM *pParam)
{
// 引数チェック {・・・}
// dcb構造体に代入
GetCommState(hComm, &dcb);
}
上記のような型が違う可変の引数を複数チェックをする場合、
みなさんならどのように実装しますか?
ケースバイケースと言われそうな気もしてますが、
ソースコードの可読性を優先して実装案をお願い致します。
0870デフォルトの名無しさん
2008/06/12(木) 06:05:43int num;
num = min + max;
return num;
}
例えばこれだったら
int sum(int min,int max){
return min + max;
}
でもいいと思うんだけど
そうしないのが慣習なのは見やすくするため?
0871デフォルトの名無しさん
2008/06/12(木) 07:42:18構造体チェック用の関数を作る
さらに構造体メンバそれぞれについてチェック用の関数を作る
構造体自身を隠蔽して(不完全型)セッターでのアクセスしかできないようにする
C++ならセッターで制限する
0872デフォルトの名無しさん
2008/06/12(木) 08:52:53そこまで短いコードだったら下1択でいいと思うよ。
0873デフォルトの名無しさん
2008/06/12(木) 12:44:49書き方がまちまちだと気持ち悪いから統一する
自分のルールに則ってるだけ
自分ルールでOKなら下でいいんじゃないかな
複数人開発なら気持ち悪いの度合いが違うからルールを統一する
このときはルールを厳しくした方が例外出にくいから上の書き方に統一したりする
0874デフォルトの名無しさん
2008/06/12(木) 13:25:05そんな慣習無いだろ。無駄だよ。
0875デフォルトの名無しさん
2008/06/12(木) 13:39:260876デフォルトの名無しさん
2008/06/12(木) 14:09:45これを実行して
性別のとこで1と入力しても結果が「性別不明」になってしまいます
どうしてですか?
0877デフォルトの名無しさん
2008/06/12(木) 14:11:05ありがとうございます
もし誰かと何か作ることになったら周りの人に合わせる感じでいきます
0878デフォルトの名無しさん
2008/06/12(木) 14:17:42最初の if 文の条件が成立してもしなくても、2番目の if 文が実行されるから
0879デフォルトの名無しさん
2008/06/12(木) 14:21:32解決しました
ありがとうございます
0880デフォルトの名無しさん
2008/06/12(木) 14:24:490881デフォルトの名無しさん
2008/06/12(木) 14:30:58「コンテナ」として同様に扱うことができるようにするため。
このための要件はコンセプトとして定義されている。
http://www.sgi.com/tech/stl/Container.html
0882デフォルトの名無しさん
2008/06/12(木) 14:31:49「vectorとかと同じメソッド」というのは「コンテナと同じメンバ関数」という意味だろうけど、
「同じ」というのは関数名のこと? 機能まで含めてのこと?
0883デフォルトの名無しさん
2008/06/12(木) 16:35:31どちらの場合も同じような寿命を持つ気がするのですが、区別するべきですか?
0884デフォルトの名無しさん
2008/06/12(木) 16:38:360885デフォルトの名無しさん
2008/06/12(木) 16:45:220886デフォルトの名無しさん
2008/06/12(木) 16:51:230887デフォルトの名無しさん
2008/06/12(木) 18:28:04ある処理の実行時間を計測しようと思い、次のようなコードを書いたのですが、うまく動きません。
int main()
{
s=GetTickCount();
{ // 処理 }
e=GetTickCount();
cout << s; cout << e; cout << e-t << endl;
return 0;
}
このようなコードをコンパイル、実行すると、sとeが一致してしまいます。
一体なぜなのでしょうか?
どなたか、ご回答よろしくお願いします。
0888デフォルトの名無しさん
2008/06/12(木) 18:42:37試しに処理のとこにSleep()入れてみては
0889887
2008/06/12(木) 19:21:15GetTickCountで時間を取得するタイミングをずらしても計測できました。
でも、
s=GetTickCount();
{ // 処理 }
e=GetTickCount();
みたいにすると、計測できません。
一体なぜ?
極端に短い時間で処理が終了した?
うーん…。
とにかく、ご回答下さった皆さん、ありがとうございました。
0890デフォルトの名無しさん
2008/06/12(木) 19:27:020891デフォルトの名無しさん
2008/06/12(木) 21:10:50明確なメリットってあるの?
0892デフォルトの名無しさん
2008/06/12(木) 21:19:50C++的には「非推奨」なんで将来なくなるかも知れない
現実にはありえないだろうけど
0893デフォルトの名無しさん
2008/06/12(木) 21:29:44最適化で、無意味処理として削られたんじゃないの?
ちなみにSleep()は削られないから測定可能。
0894デフォルトの名無しさん
2008/06/12(木) 21:55:04使ったらいいんじゃね?
SetPriorityClass()で他のプロセスの影響を最小限に
抑えておかないと測定の度にバラツキが出やすいけど
0895デフォルトの名無しさん
2008/06/12(木) 23:39:48C++です。プリプロセッサでsizeof(int)に応じて新しい型を定義したいのですが、
こういうことって不可能なんでしょうか?
0896デフォルトの名無しさん
2008/06/12(木) 23:41:13クラスなど、無名名前空間にできてstaticでは不可能な
ものがあるということが大きな違いだと俺は思っている。
もともとの趣旨はstaticを静的確保の意味だけにする
(可視性制御の意味をなくす)ということだったと思うけど。
0897デフォルトの名無しさん
2008/06/12(木) 23:43:06struct hoge;に対してsizeof(hoge)の結果を任意に決めたいってこと?
0898895
2008/06/12(木) 23:48:34いえ、例えば
#if sizeof(int) == 4
#define int32 int
#elif sizeof(int) == 8
#define int64 int
#else
#error("unsupported")
#endif
といったような感じです。通りませんけど。
0899デフォルトの名無しさん
2008/06/12(木) 23:51:08目的がよく分からないんだけど
int と書いたほうが処理速度が速くなるんじゃなくて
処理速度が速いものが int だと思ったほうがいいよ
0900デフォルトの名無しさん
2008/06/12(木) 23:51:40intのサイズは処理系依存で、大抵はその処理系のヘッダファイルにサイズ保証の整数型がtypedefされている。
0901895
2008/06/12(木) 23:54:58まあ上の例はただの例なんですけど、
やっぱりできないみたいなのでまた別の方法を考えてみます。
どうもありがとうございました。
0902デフォルトの名無しさん
2008/06/12(木) 23:56:060903デフォルトの名無しさん
2008/06/12(木) 23:56:400904デフォルトの名無しさん
2008/06/12(木) 23:58:340905デフォルトの名無しさん
2008/06/13(金) 00:00:49レスありがとうございます。
以下の認識でOKですか?
>構造体チェック用の関数を作る
>さらに構造体メンバそれぞれについてチェック用の関数を作る
→bool CSerialCom::CheckParam(SERIAL_PARAM *pParam) { bool ret = checkBaud(pParam->dwBaudRate); ...}
>構造体自身を隠蔽して(不完全型)セッターでのアクセスしかできないようにする
>C++ならセッターで制限する
→bool CSerialCom::Open() {}
bool CSerialCom::SetParam(void *pParam) {... m_Param = *(SERIAL_PARAM *)pParam) ...}
0906デフォルトの名無しさん
2008/06/13(金) 00:04:33型のサイズに応じて別な型をtypedefするってことなら
まさにテンプレートの領域じゃないか?
selector<sizeof(hoge)>::fuga_type fuga; // hogeのサイズによってfugaの型が変わる
0907デフォルトの名無しさん
2008/06/13(金) 00:45:050908デフォルトの名無しさん
2008/06/13(金) 00:54:360910905
2008/06/13(金) 01:17:46早々のご回答ありがとうございます。
便乗して追加質問よいですか?
>構造体自身を隠蔽して(不完全型)セッターでのアクセスしかできないようにする
>C++ならセッターで制限する
無学で申し訳ないですが、上記2案の差分がモヤモヤしてました。
もう少し詳しく意見をいただけませんか?(サンプルコードがあると助かります)
0911871
2008/06/13(金) 01:46:02Cの場合には不完全型にしないと隠蔽できないから
// ----- hoge.h -----
typedef struct tagSerialParam SERIAL_PARAM;
SERIAL_PARAM *hoge_alloc(void);
void hoge_free(SERIAL_PARAM *param);
int hoge_BaudRate_set(SERIAL_PARAM *param);
// ----- hoge.c -----
#include"hoge.h"
struct tagSerialParam {
DWORD dwBaudRate; // 取り得る値 9600/19200/38400
BYTE byByteSize; // 取り得る値 4/5/6/7/8
・・・ // 上記以外の5個ほどの変数
};
static const DWORD dwBaudRateList[]={9600, 19200, 38400};
SERIAL_PARAM *hoge_alloc(void){
SERIAL_PARAM *param;
param=malloc(sizeof(*param));
param->dwBaudRate=dwBaudRateList[0];
param->... // 色々有効範囲内になるよう初期設定
return param;
}
int hoge_BaudRate_set(SERIAL_PARAM *param, DWORD dwBaudRate){
int i;
for(i=0;i<ARRAY_SIZE(dwBaudRateList);i++)
if(dwBaudRate==dwBaudRateList[i]){
param->dwBaudRate=dwBaudRate;
return 1;
}
return 0;
}
0912デフォルトの名無しさん
2008/06/13(金) 10:36:26自分はBorland C++ CompilerってのとBCC Developer 1.2.21使ってるんですが
勉強になるかもしれないし他のやつ使ってみたいです
0913デフォルトの名無しさん
2008/06/13(金) 11:17:42VC++ Express (コンパイラとエディタとその他もろもろのセット)とか。
GCC と Emacs とか。
0914デフォルトの名無しさん
2008/06/13(金) 12:21:33エディタとしてインストールするのもありだな。これはいいこと聞いた
0915デフォルトの名無しさん
2008/06/13(金) 12:42:37テンプレートを使うメリットと言うのは何になるんでしょうか。
自分なりに考えた結論としては下記のような感じなんですが
・コードを書く量が少なくて済む
・変数を扱う場合、型を指定しなくて良いので柔軟に出来る
0916デフォルトの名無しさん
2008/06/13(金) 12:45:44目的も効果も違う2つを比べる意味がわからない。
何をするときの話?
0917デフォルトの名無しさん
2008/06/13(金) 12:45:48比べるものではないと思うけど。
0918デフォルトの名無しさん
2008/06/13(金) 12:52:16ありがとうございます
0919デフォルトの名無しさん
2008/06/13(金) 13:25:53どんなときにテンプレートを使ったりするんでしょうか
0920デフォルトの名無しさん
2008/06/13(金) 13:28:13とりあえず Google に聞いてみろ。ひとつでも解説ページを見れば同じ物だなんて思わないはずだから。
0921デフォルトの名無しさん
2008/06/13(金) 17:36:35昔から愛用していたVC6.0製品版から、このたびVC9.0(VS2008)の無料版に乗り換えました。
VC6.0用のプロジェクトを9.0用に変換し、コンパイルを通したのですが、実行速度にだいぶ差があるように見えます。
単純なファイルコンバータプログラムなのですが、だいたい9.0版のほうが1.5倍程度時間がかかります。
両方最適化をONにしていますし、ソースも当然同一のものです。
時代が経過して性能が下がったというのは不思議なのですが、そんなものなのでしょうか?
2008質問スレで聞こうかと思ったのですが、そういうスレがなかったのでここで質問させていただきました。
よろしくお願いします。
0922デフォルトの名無しさん
2008/06/13(金) 17:48:28コンパイラオプション調べて弄ってみろとしか言えない。
0923デフォルトの名無しさん
2008/06/13(金) 17:50:25まぁ、2008のスレはあるけどね。
0924デフォルトの名無しさん
2008/06/13(金) 17:52:33以前libc.lib(シングルスレッド版のCランタイム)を使っていたのなら、
マルチスレッド版ランタイムを使うようになったためである可能性が高いかな。
libc.libはVC7.1以前のデフォだが、VC8以後は無くなって、現在は
マルチスレッド版のCランタイムしかない。マルチスレッド版ランタイムは
デフォで排他制御を行うので、何も考えずにgetc()のようなものを使うと
パフォーマンスへの影響がデカい。
一応その対策として、_getc_nolock()のような関数が用意されているんだが。
MSDNの「マルチスレッドライブラリのパフォーマンス」の項目を
参照。
ttp://msdn.microsoft.com/ja-jp/library/ms235505(VS.80).aspx
0925デフォルトの名無しさん
2008/06/13(金) 18:02:18>>922
なるほど。確かにそのとおりです。オプション調べてみます
>>923
2008スレ自体はあったのですが、なんだかピリピリしていて・・・
>>924
あ、ほんとですね。マルチにさせられてます。
リンク先を読んで、改良してみようと思います。
シングルスレッド版のころそのもののスピードはでなくても、近い速度が出るといいなぁ
ありがとうございました。
改良してテストしたら、また報告に伺います
0926デフォルトの名無しさん
2008/06/13(金) 18:07:52とりあえず #define _CRT_DISABLE_PERFCRIT_LOCKS しとけば、ファイルアクセスは全部nolock版使うよ
とあったので速攻試せました。
速度はがっつりあがり、VC6.0版の半分程度の時間で処理が終わるようになりました。
やっぱり最適化の部分は進化してたんですね!
アドバイスありがとうございました。
0927デフォルトの名無しさん
2008/06/13(金) 18:18:00今までvectorに追加した文字列全てを
ひとつの文字列にして返す関数が欲しくて
以下のように書いたのですが
vector<const char*> ログ;
char* ログ追加・取得(const char* getstr)
{
ログ.push_back(getstr);
char logs[1000];
for(int i = 0; i<ログ.size() - 1 ; ++i)
{
strcat(logs,ログ[i]);
}
return logs;
}
strcatのところで入力した文字が化けてしまいます
どこがまずいでしょうか?
0928デフォルトの名無しさん
2008/06/13(金) 18:20:080929デフォルトの名無しさん
2008/06/13(金) 18:28:53・ローカル変数を返してどーする
0930デフォルトの名無しさん
2008/06/13(金) 19:20:41class Hoge{
int hogehoge;
public:
Hoge(int hogehoge){this->hogehoge = hogehoge;}
int getHogehoge(){return hogehoge;}
}
int main(){
Hoge hoge1(1);
Hoge hoge2(2);
std::vector<Hoge> vhoge;
vhoge.push_back(hoge1);
vhoge.push_back(hoge2);
std::cout << *(vhoge.begin()).getHogehoge(); <-この辺が上手くいかない
std::cout << *(--vhoge.end()).getHogehoge(); <-
}
例えばvectorの先頭要素と終端要素を比較したい場合にこういうのを使いたいのですが、
うまくコンパイルできません(getHogehoge()などというメソッドは無いと言われる)。
環境はcygwin g++です。解決策等あればよろしくお願いします。
0931デフォルトの名無しさん
2008/06/13(金) 19:26:07× *(vhoge.begin()).getHogehoge()
○ (*vhoge.begin()).getHogehoge()
0932デフォルトの名無しさん
2008/06/13(金) 19:26:19なんで全部hogeにするかなあ?
foo とか bar とか分けてくれないと難読化したようにしか思えないわ
0934デフォルトの名無しさん
2008/06/13(金) 20:13:58:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\kadai\Release\kadai.exe : fatal error LNK1120: 外部参照 1 が未解決です。
このようなエラーがでてきてコンパイルできてもビルドできません
どうすれば良いのか教えてください
使用ソフトはVC++2008EEです
0935デフォルトの名無しさん
2008/06/13(金) 20:16:12いいからコードをよこせ
0936デフォルトの名無しさん
2008/06/13(金) 20:19:03コンソールアプリケーションなのにウィンドウアプリだと思ってリンクしようとして
エラーになっているんだよ
プロジェクトを作り直せ
0937デフォルトの名無しさん
2008/06/13(金) 20:29:08\0ないとコピーし続けるって始めて聞きますた
>>928
charはもういや
string使うことにします
0938デフォルトの名無しさん
2008/06/13(金) 20:36:41一応解決しました、また問題が発生した時はコードも一緒に張るのでその時はよろしくお願いします
>>936
解決しました
ありがとうございます
0939デフォルトの名無しさん
2008/06/13(金) 20:39:11文字列を扱う関数はほぼ全部\0を終端の判断に利用するんだよ
だから\0は常につけとけ
0940デフォルトの名無しさん
2008/06/13(金) 21:00:56ビルドに関してなのですが、エラー0行目と表示されています。
Eclipseで確認しながら作成したのでおそらく書いたコード自体にはエラーはないと思います。
エラーがどういう意味なのかが分からないので質問させて頂きました。
作成したプログラムはソケット関連で、
「TCP/IPプログラミング C言語編」の一番最初のコードです。
エラーの詳細表示は
Eclipse
make: ***[libtcp_ip1.dylib] Error 1 line0
Undefined symbols: line0
Eclipse コンソール
/usr/bin/libtool: internal link edit command failed
make: *** [libtcp_ip1.dylib] Error 1
となっています。
これはどのように解釈すればいいのでしょうか?
0941デフォルトの名無しさん
2008/06/13(金) 21:07:31ソースどっかにアップしたら?
0942デフォルトの名無しさん
2008/06/13(金) 21:11:48#include <stdio.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define RCVBUFSIZE 32
void DieWithError(char *errorMessage);
int main(int argc, char *argv[]){
int sock;
struct sockaddr_in echoServAddr;
unsigned short echoServPort;
char *servIP;
char *echoString;
char echoBuffer[RCVBUFSIZE];
unsigned int echoStringLen;
int bytesRcvd, totalBytesRcvd;
if((argc < 3) || (argc > 4)){
fprintf(stderr, "Usage: %s <server IP> <Echo Word> [<Echo Port>]n", argv[0]);
exit(1);
}
0943デフォルトの名無しさん
2008/06/13(金) 21:12:24echoString = argv[2];
if (argc == 4){
echoServPort = atoi(argv[3]);
}else{
echoServPort = 7;
}
if((sock = socket(PF_INET, SOCK_STREAM, 0)) < 0){
DieWithError("socket() failed");
}
memset(&echoServAddr,0,sizeof(echoServAddr));
echoServAddr.sin_family = AF_INET;
echoServAddr.sin_addr.s_addr = inet_addr(servIP);
echoServAddr.sin_port = htons(echoServPort);
if(connect(sock, (struct sockaddr *)&echoServAddr, sizeof(echoServAddr)) < 0){
DieWithError("connect() faild");
}
echoStringLen = strlen(echoString);
if(send(sock, echoString, echoStringLen, 0) != echoStringLen){
DieWithError("send() sent a different number of bytes than expected");
}
0944デフォルトの名無しさん
2008/06/13(金) 21:13:01printf("Received: ");
while(totalBytesRcvd < echoStringLen){
if((bytesRcvd = recv(sock, echoBuffer, RCVBUFSIZE -1, 0)) <= 0){
DieWithError("recv() faild or connection closed prematurely");
}
totalBytesRcvd += bytesRcvd;
echoBuffer[bytesRcvd] = '0';
printf(echoBuffer);
}
printf("n");
close(sock);
exit(0);
}
よろしくお願いします。
0945デフォルトの名無しさん
2008/06/13(金) 21:15:09#include <stdio.h>
#include <stdlib.h>
void DieWithError(char *errorMessage){
perror(errorMessage);
exit(1);
}
0946デフォルトの名無しさん
2008/06/13(金) 21:38:45まずはシェルから自分で直接ccでコンパイルしてみて、
「何が」エラーを出しているのか切り分けたらいいと思うよ
0947デフォルトの名無しさん
2008/06/13(金) 21:38:56がんばって耐えるんだよ。
0948デフォルトの名無しさん
2008/06/13(金) 22:14:04明日やってみます。
>>947
ごめんなさいwww
0949デフォルトの名無しさん
2008/06/13(金) 23:10:07どこかにアップしろっていう言葉が(ry
ってのは冗談だけど、次に貼るときがあればインデント付けてね。
半角空白は消えるから全角空白で。
スレ上でも読みやすし、全角空白→半角空白の置換は簡単だから。
0950438
2008/06/14(土) 00:39:55ありがとうございましたm(_ _)m
0951デフォルトの名無しさん
2008/06/14(土) 09:52:470952デフォルトの名無しさん
2008/06/14(土) 10:02:22インデントを気にするくらいなら、アップローダを使えばいい。
>949のような専用ブラウザも使わない阿呆は放置でいいからね。
0953デフォルトの名無しさん
2008/06/14(土) 10:13:590954デフォルトの名無しさん
2008/06/14(土) 10:36:010955デフォルトの名無しさん
2008/06/14(土) 10:37:02>専用ブラウザも使わない阿呆は
専ブラは全て同じ仕様だと思ってる阿呆ですか。
文句なら壷作ったマァブ達に言ってくれ。
0956デフォルトの名無しさん
2008/06/14(土) 11:42:08専用ブラウザも使わない、或いはインデントごときで駄々を捏ねる阿呆ってことで。
ちょっと手元のエディタにコピペして、インデント掛けさせるだけのことができないってどんだけかと。
0957デフォルトの名無しさん
2008/06/14(土) 12:18:43【初心者歓迎】C/C++室 Ver.54【環境依存OK】だろ
スレとは関係無い所であおってばかりだな
何のスレかよく考えろよ
0958デフォルトの名無しさん
2008/06/14(土) 13:20:000959デフォルトの名無しさん
2008/06/14(土) 13:26:48お前の頭にはemacsしか無いのかもしれないが、
多くの環境で、自動的にインデント掛けるより
全角空白を半角空白に置換する方が容易。
また、コピペするまでも無く読みやすい。
専ブラなどの余計な前提無しにな。
少なくとも、その程度のことも分からないお前に
阿呆と呼ばれる筋合いは無いな。
ちなみに質問者がロダにも上げず、半角空白のまま
貼ったとしても責める気は無いし、責めたことも無い。
より良いという話をしているだけだ。
0960デフォルトの名無しさん
2008/06/14(土) 13:29:18で、初心者って、例を最少にする技術がまだまだだから、貼るソースが長くなりがちだし、
書き方も洗練されていないから、内容的に読み取りづらかったりするよね。
つまり、初心者歓迎スレであるが故に、「要所を押さえた貼り方をしなかった時の害」が、
通常より大きいってことなんだ。
つまり、ここが
【初心者歓迎】C/C++室 Ver.54【環境依存OK】
であるから、こういう話が通常より濃く交わされる、というのは、少なからず言える。
>>957
だから、関係関係と連呼するほど、関係無くはないんじゃないかな。
0961デフォルトの名無しさん
2008/06/14(土) 13:53:19アップローダをつかってもらうの推奨ってことでおk?
0962デフォルトの名無しさん
2008/06/14(土) 13:55:100963デフォルトの名無しさん
2008/06/14(土) 14:07:35VC2008で_CrtSetDbgFlagを使い、メモリリークのチェックをしたところ
Detected memory leaks!
Dumping objects ->
f:\dd\vctools\crt_bld\self_x86\crt\src\mbctype.c(593) : {4} crt block at 0x003D3728, subtype 0, 544 bytes long.
Data: < > 02 00 00 00 A4 03 00 00 01 00 00 00 11 04 00 00
f:\dd\vctools\crt_bld\self_x86\crt\src\ioinit.c(136) : {2} crt block at 0x003D2110, subtype 0, 2048 bytes long.
Data: < > FE FF FF FF C1 0A 00 00 00 00 00 00 00 00 00 00
f:\dd\vctools\crt_bld\self_x86\crt\src\tidtable.c(394) : {1} crt block at 0x003D1EC0, subtype 0, 532 bytes long.
Data: <X > 58 12 00 00 FF FF FF FF 00 00 00 00 00 00 00 00
Object dump complete.
とメモリリークが検出されたんですが、
1.出力されたディレクトリのパスに自分のソースもVCのソースも入ってない
2.上記3つのソースはVCのディレクトリに入っていたので、ここがメモリリークの原因だとは思えない
この2つの理由から対処に困っています。
この場合どうすればいいのでしょうか?
OSはXPです。
0964デフォルトの名無しさん
2008/06/14(土) 14:17:300965デフォルトの名無しさん
2008/06/14(土) 14:29:17_CrtSetDbgFlagの下で_CrtSetBreakAlloc(4)とかやってみる
0966デフォルトの名無しさん
2008/06/14(土) 14:30:06_CrtSetBreakAlloc
呼び出し履歴
0967デフォルトの名無しさん
2008/06/15(日) 00:29:38おおむね同意。
置換だけならXP以降のメモ帳でもできるしね。
補足として、再インデント可能なエディタは割と多いですよ。
元がトラップ気味なインデントであることを考慮すると再インデントして
読むようにしてます。
if (hoge)
A;
B;
みたいなね;-)
0968デフォルトの名無しさん
2008/06/15(日) 00:38:59とりあえずそのままコンパイルできるから。
逆に言えば、VC++とかGCCが全角空白を受け付けてくれるようになれば、
全角空白でも別にいいと、俺は思う。
0969デフォルトの名無しさん
2008/06/15(日) 00:40:08makefile を使うのはどうだろう?
0970デフォルトの名無しさん
2008/06/15(日) 00:41:12コピペったときにU+0160になってしまうようだと困るのかなと
思うのだけれど
0971963
2008/06/15(日) 00:42:03無事場所が分かりました!
mapのinsertの中でメモリリークが起きていました。
ただ、mapには120個くらいデータを挿入しているんですが、
メモリリークが起きるタイミングがまちまちで、メモリリークの合計が3回ということもあり、今一原因が分かりません。
オーバーフローが起きていると考えていいのでしょうか?
mapはmap<wstring, list<wstring> >で宣言してあります。
0972デフォルトの名無しさん
2008/06/15(日) 00:56:12> オーバーフロー
なんで?
0973デフォルトの名無しさん
2008/06/15(日) 01:02:07わざわざそうするならうpすればいいのに。
検索エンジンに引っかかるように、あえてスレにソースを載せたいのかな?
0975デフォルトの名無しさん
2008/06/15(日) 01:22:132chに貼り付けるのは、数行のコードだからねぇ
「わざわざ」ってのは、意味が分からないな
それこそ、「わざわざ」手で置換するわけがないでしょ?
プログラマ板の住人ならさ
0976デフォルトの名無しさん
2008/06/15(日) 01:22:310977デフォルトの名無しさん
2008/06/15(日) 01:31:43NBSP(U+A0)つかわないでも、普通のSPでいいでしょ。
0978デフォルトの名無しさん
2008/06/15(日) 01:35:420979デフォルトの名無しさん
2008/06/15(日) 01:39:00おっぱい
おっぱい
0980デフォルトの名無しさん
2008/06/15(日) 01:41:280981デフォルトの名無しさん
2008/06/15(日) 01:41:550982デフォルトの名無しさん
2008/06/15(日) 01:43:430983デフォルトの名無しさん
2008/06/15(日) 01:45:56開発対象によってはスペースでインデントすることもあるから妙に気にしてしまった。
0984デフォルトの名無しさん
2008/06/15(日) 01:48:27とかでいいんでねえの。
インデント以外でスペース4個以上の連続なんてそうそう出てこないだろ。
0985デフォルトの名無しさん
2008/06/15(日) 01:49:53newしてるような箇所は無いのか?
mapにwstringにlistだと問題なさそうだけど
0986デフォルトの名無しさん
2008/06/15(日) 01:52:12俺はこんな感じのやつをviから%!で噛ませてる
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6908.zip
バイト数=文字幅とは限らない環境でマジメにタブを開くには、
EAST_ASIAN_WIDTHとか見る必要があると思う
0987デフォルトの名無しさん
2008/06/15(日) 02:00:05ふぅむ。
タブインデントを空白インデントにするだけならvimで
:set et
ggVG=
ってやってる。
0988デフォルトの名無しさん
2008/06/15(日) 02:06:26で、その後で空白を全部エンティティ参照に置換するとレス長が無駄に長くなるので、
置換をなるべく押さえた上で一発で仕事が済むようにプログラムを書いたわけですよ
まあ馬鹿げてるとは思うが
0989デフォルトの名無しさん
2008/06/15(日) 02:09:220990デフォルトの名無しさん
2008/06/15(日) 02:16:01行頭だけは特別扱いする必要あるけど、
1) タブを開く
2) 行頭のSPを に置換
3) SPSPを SPに置換
でいいのかな
0991デフォルトの名無しさん
2008/06/15(日) 02:38:010992デフォルトの名無しさん
2008/06/15(日) 02:40:45いや、行頭に空白一文字だけあるときに潰れてしまうことだけが問題
書いてから気づいたが、2)と3)は逆順のほうがいいな
0993デフォルトの名無しさん
2008/06/15(日) 02:43:02もちろん、必要に応じて空白から SPの並びへの置換もやるとして。
0994デフォルトの名無しさん
2008/06/15(日) 02:46:05タブ位置が行頭以外の場合、いくつの空白に置換すべきかが自明ではないでしょ。
だから、「きちんと」タブを開いてから空白だけを処理したほうが楽だと思う。
Unixのexpandコマンドは、バイト数=文字幅が成り立たない環境では
役に立たないものがほとんどだと思うけれど。
0995デフォルトの名無しさん
2008/06/15(日) 02:49:17自分が行頭インデントにしかタブを使わないんで、
常にタブ1つを機械的に置換できると思い込んでいた。
0996デフォルトの名無しさん
2008/06/15(日) 02:54:57コメントとコードの両方が不揃いなのに比べれば。
0997デフォルトの名無しさん
2008/06/15(日) 02:56:16【初心者歓迎】C/C++室 Ver.55【環境依存OK】
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.54【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1210694402/l50
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0998デフォルトの名無しさん
2008/06/15(日) 03:02:450999デフォルトの名無しさん
2008/06/15(日) 03:03:59【初心者歓迎】C/C++室 Ver.55【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1213466622/
1000デフォルトの名無しさん
2008/06/15(日) 03:04:1910011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。