07/05/14 22:58:24
>>171
なるほど。そのとおりでした。
サンクス。
176:デフォルトの名無しさん
07/05/14 23:01:02
>>173
試しにその行を削除するなりコメントアウトするなりしてコンパイルしてみろ
たぶんエラー吐くから
177:デフォルトの名無しさん
07/05/15 02:58:46
>>168
そのルールでいくと、自分の型のポインタか参照を返すようなメソッドは
すべて下位クラスで再定義する必要がある。
('return *this' だけのメソッドは特別なんていうルールを採用する?)
ちなみに、以下のようなプログラムではどんな結果になるべき?
void prt3(A* obj) { printf("prt3(A)\n"); }
void prt3(B* obj) { printf("prt3(B)\n"); }
class A {
public:
A() {}
virtual void prt() const { printf("A::prt\n"); }
void prt2() const { printf("A::prt2\n"); }
// thisの型はA?,B? return時だけB?
A& geta() { prt(); prt2(); prt3(*this); return *this; }
};
class B : public A {
public:
B() {}
virtual void prt() const { printf("B::prt\n"); }
void prt2() const { printf("B::prt2\n"); }
};
int main() {B b; b.geta(); }
結果
B::prt
?::prt2
prt3(?)
178:デフォルトの名無しさん
07/05/15 03:35:58
*thisをthisにしてVC2003でコンパイル
結果:
B::prt
A::prt2
prt3(A)
179:デフォルトの名無しさん
07/05/15 18:49:47
VS2005,XPです。
HWND hwnd;
RECT rc;
GetWindowRect(hwnd,&rc);
if ((rc.bottom-rc.top) == GetSystemMetrics(SM_CYCAPTION))
うまくいかないのですが、こういう比較の仕方は使えないのでしょうか?
使えない場合、どのように直せばいいですか?
180:デフォルトの名無しさん
07/05/15 19:33:30
クラスなどを使って、通常存在しないサイズの変数にアクセスできませんか?
int型の変数を24と8ビットに分けて使うような
x.aは24bit
x.bは8bit
として使いたいんですが
181:デフォルトの名無しさん
07/05/15 19:33:42
>>17
D&Eには、できるようにしたところでメリットがない(オーバーライドできる仮想関数がない)し、
Cの型変換のルールが混沌としていて内蔵型をクラスとして扱おうとしてもうまくいかないと、
そうできるようにしなかった理由が書かれている。
182:180
07/05/15 19:34:31
代入、参照が普通の変数のように出来る方法を教えてください
183:デフォルトの名無しさん
07/05/15 19:35:55
>>180
どうしてもやりたいなら、ビットフィールドがその目的に使える。
但し、移植性を大きく損なうことになりかねないので注意。
184:デフォルトの名無しさん
07/05/15 19:40:06
>>183
サンクス!!!
185:デフォルトの名無しさん
07/05/15 19:59:46
>>183
すみません boolとcharだとどっちを使った方がいいとかありますか???
struct A{
char n : 1; char m : 7;
};
struct A{
bool n : 1; bool m : 7;
};
186:デフォルトの名無しさん
07/05/15 20:02:53
>>179
何をしたいのか分からんが、使える。
187:185
07/05/15 20:07:05
自己解決しました
移植性を考慮して、unsigned char n : 1; にしておきますね
188:デフォルトの名無しさん
07/05/15 20:10:51
移植性が欲しいならunsigned intにしておけ
189:デフォルトの名無しさん
07/05/15 20:12:37
>>188
サイズは出来るだけ削りたいんです
上の例では32bit使っていますけど
8bit以内ならcharのほうが削れます
190:デフォルトの名無しさん
07/05/15 20:13:25
ビットフィールドに使えるのはsignedかunsignedのintだけ。
191:デフォルトの名無しさん
07/05/15 20:15:54
ビットフィールドの移植性って実のところどうなの?
一応、標準だよね?
192:デフォルトの名無しさん
07/05/15 20:16:15
bcc(c++)だと使えますけど
193:デフォルトの名無しさん
07/05/15 20:21:35
>>192
処理系依存で他の型が使えても構わないことにはなっている。
194:デフォルトの名無しさん
07/05/15 20:22:42
C++ならほとんどの整数型が使えるだろ。
195:デフォルトの名無しさん
07/05/15 20:31:15
>>189
unsigned charがビットフィールドに使える処理系で、
同じ8ビットのビットフィールドでもunsigned intにするかunsigned charにするかで
違いが生じるなんて話聞いたことがない。
196:デフォルトの名無しさん
07/05/15 20:42:39
>>195
#include <iostream>
template<typename T> struct S { T a: 1; T b: 7; };
int main() {
std::cout << "sizeof(S<unsigned int>) = " << sizeof(S<unsigned int>) << std::endl;
std::cout << "sizeof(S<unsigned char>) = " << sizeof(S<unsigned char>) << std::endl;
}
g++だと違う結果になったが。
197:デフォルトの名無しさん
07/05/15 20:42:42
>>195
違いますけど・・・
#include <stdio.h>
int main(void){
struct A{
unsigned int m : 1;
unsigned int n : 7;};
struct B{
unsigned char m : 1;
unsigned char n : 7;};
printf( "%u\n", sizeof(struct A) );
printf( "%u\n", sizeof(struct B) );
return 0;}
198:デフォルトの名無しさん
07/05/15 20:51:15
VC8で確認。こちらも違った。
199:デフォルトの名無しさん
07/05/15 21:54:53
VC7.1でも違った。
200:デフォルトの名無しさん
07/05/15 21:58:58
ふつう違うよな
int とchar
一バイトと四バイトだんもんな
201:デフォルトの名無しさん
07/05/15 22:01:29
その理屈はおかしい。
202:デフォルトの名無しさん
07/05/15 22:29:47
BCC55で次のソースをコンパイルするとリンカがエラーを出すのですが、
私は何を誤っているのでしょうか?
どう直せばよいか教えていただけないでしょうか。
●ソース
#include<iostream>
class Singleton {
public:
static Singleton getInstance() {
if(&singleton == '\0') {
singleton = *(new Singleton());
std::cout << "Created!" << std::endl;
} else {
std::cout << "Not Created!" << std::endl;
}
return singleton;
}
~Singleton() {}
private:
static Singleton singleton;
Singleton() {}
};
int main() {
Singleton s1 = Singleton::getInstance();
Singleton s2 = Singleton::getInstance();
}
203:202
07/05/15 22:31:15
エラーの内容は次の通りです。
●コマンドラインとエラー
X:\>bcc32 -nX:\data\bin -5 -f X:\data\src\Singleton.cpp
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
X:\data\src\Singleton.cpp:
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Error: 外部シンボル 'Singleton::singleton' が未解決(X:\DATA\BIN\SINGLETON.OBJ が参照)
204:デフォルトの名無しさん
07/05/15 22:33:49
一時オブジェクトとして使うならコンストラクタ呼び出さないと駄目ぽ
Singleton()::getInstance();
205:デフォルトの名無しさん
07/05/15 22:39:53
static変数の実体がないって怒ってるわけなんだが…
そんなことよりも、何もかもが誤りだから
ポインタと参照とシングルトンの勉強をしたほうがいいと思うよ。
206:デフォルトの名無しさん
07/05/15 22:41:02
>>202
クラスの静的メンバ変数は、外部で定義しなければならない。
Cのグローバル変数がヘッダで宣言して、どこか1ヶ所で定義するのと同じ理屈。
それはともかくマルチスレッドを考慮しないのなら、単にこうでいい。
class Singleton {
public:
static Singleton getInstance() {
return singleton;
}
~Singleton() {}
private:
static Singleton singleton;
Singleton() {}
};
static Singleton Singleton::singleton;
マルチスレッドを考慮するなら、Singletonはポインタ、
当然std::auto_ptrやboost::scoped_ptrあたりにすべき。
207:202
07/05/15 23:07:21
>>204-206
有難うございます。
マルチスレッドやboostのライブラリは当分手を出しません。
コマンドラインアプリをある程度満足に作れるようになってから先に行きます。
まだポインタの使い方も習得できてないわけですし。
ずっとJavaをやってきたんですが、アレは全部参照扱いだから
ポインタと実体を意識するシーンは限定されてたんですが、
C++はそうでないから難しいです。
C++プログラマにJavaを教える本はあるのに、その逆はないんですよね。
仕事ではないので、手探りでなんとかやっていこうと思います。
208:デフォルトの名無しさん
07/05/15 23:12:41
Accelerated C++マジオヌヌメ
209:206
07/05/16 00:07:44
>>206
getInstanceがSingletonへの参照を返すようにするのを忘れていたorz
正しくはこう
class Singleton {
public:
static Singleton& getInstance() {
return singleton;
}
private:
static Singleton singleton;
Singleton() {}
Singleton(const Singleton&);
~Singleton() {}
Singleton& operator =(const Singleton&);
};
210:202
07/05/16 01:31:34
>>208
Amazonのレビューによると、
既に他言語の知識がある人間にとって丁度良い本のようですね。
店頭で探してみます。
>>209
ありがとうございます。
operatorを使うんですね・・・。
まだ「パッと見」で、なぜこれがシングルトンを実現するのかが
分からないレベルなので、ソースを研究してみます。
211:デフォルトの名無しさん
07/05/16 01:44:03
Singleton(const Singleton&);
Singleton& operator =(const Singleton&);
はインスタンスのコピーを禁止するためのちょっとした工夫だよ。
privateにする&処理の内容を記述しないことで、
コピーしようとしたらコンパイルエラーになるようにしてる。
あと、コンストラクタをprivateにしてるのも、
getInstance()以外で勝手にインスタンスを作られないようにするため。
212:202
07/05/16 01:58:23
>>211
ありがとうございます。
なるほど、インスタンスのコピー禁止も意識しないといけないんですね。
privateなコンストラクタについては、Javaも同じ手法なのでわかりました。
213:デフォルトの名無しさん
07/05/16 06:57:01
C++で読むデザインパターン
URLリンク(www.01-tec.com)
214:デフォルトの名無しさん
07/05/16 09:59:08
XPです。
タスクトレイのアイコンを指定しても違うアイコン(赤い×マーク)が出るんですけど何故でしょうか?
アイコンは32x32,256色と16x16,256色が入ってます。
215:214
07/05/16 10:36:34
ソース
nid.hIcon = (HICON)LoadImage(hInstance,MAKEINTRESOURCE(IDI_ICON1), IMAGE_ICON, 16, 16, 0);
リソース
IDI_ICON1 ICON "1.ico"
こんな感じで読み込んでます。
それとあともう一つお願いします。
タスクトレイのアイコンを右クリックしたらTrackPopupMenuという便利な位置指定できる関数がありますが、
右クリックメニューからダイアログなどのウィンドウを開いた場合のウィンドウ位置の指定はどうやるのがスマートでしょうか?
タスクバーを移動してる場合にも、アイコン位置の角に表示させたいです。
それぞれの位置の場合の処理を書く必要があるんでしょうか?
216:デフォルトの名無しさん
07/05/16 10:51:57
そのアイコンを試しにクライアントエリアに描いてみては
位置指定は、、、思ったとおりにやってみなよ
217:デフォルトの名無しさん
07/05/16 13:59:23
struct base{};
template<typename T>struct drived:base{
template<typename TT>bool typecmp(){ return typeid(T)==typeid(TT); }
};
base *p1=new drived<int> , *p2=new drived<char>;
//で、base*からdrived::typecmpにアクセスしたい訳だが
218:デフォルトの名無しさん
07/05/16 14:01:53
vipの方が人がいそうなので。
スレリンク(tech板:217番)
217 名前:デフォルトの名無しさん[sage] 投稿日:2007/05/16(水) 13:59:23
struct base{};
template<typename T>struct drived:base{
template<typename TT>bool typecmp(){ return typeid(T)==typeid(TT); }
};
base *p1=new drived<int> , *p2=new drived<char>;
//で、base*からdrived::typecmpにアクセスしたい訳だが
これをやりたいんだけど、やっぱり原理的に無理だよね?
219:218
07/05/16 14:02:42
すみません、218は誤爆です
220:デフォルトの名無しさん
07/05/16 16:30:30
>>215
IDI_ICON1の値が問題な希ガス
ヘッダでの#defineも晒したほうがいいとおも
221:デフォルトの名無しさん
07/05/16 16:48:29
>>217
お勧めはしないがdynamic_cast<derived<int>*>(p1)->typecmp<int>()
222:デフォルトの名無しさん
07/05/16 21:35:09
URLリンク(kansai2channeler.hp.infoseek.co.jp)
誰か応えてください。
223:デフォルトの名無しさん
07/05/16 21:57:45
>>222
よく読んでないけど、delete p;は実行されないと思うぞ
配列はmain関数側で作って渡した方がいいと思うぞ
224:デフォルトの名無しさん
07/05/16 22:00:19
あ、やっぱりそうですか。
・・・あ、なるほど、思いついた
ありがとさんでした
225:デフォルトの名無しさん
07/05/16 23:27:10
>>221
仮想関数無いと dynamic_cast って効かないんじゃない?
>>217
new drived した直後なら static_cast でいいだろう。
やっぱりお勧めはできないんだけども。
226:202
07/05/16 23:39:03
>>213
ありがとうございます。
こういうサイトは良いですね。
今は鯖落ちしてるようで、キャッシュを見ていますが・・・。
227:デフォルトの名無しさん
07/05/16 23:51:44
なんで実行時に決まる子の型を、コンパイル時判定で
親が使いたい、なんて言う発想になるんだろう
228:デフォルトの名無しさん
07/05/16 23:54:10
vectorについてどなたか教えて下さい。
例えば、メイン関数で空のvectorを定義して
別の関数でその中に数値を代入したい場合には
何を渡して、何を仮引数にとってやればいいのでしょうか?
あくまで別関数のreturnは0か1で返したく、別関数で代入するだけで
メイン関数vectorの値を操作したいのです。
sub(?????)
{
こちらで値を入れたい
}
int main()
{
vector<int> Vint;
sub(?????);
}
何も入っていないためかiteratorを渡しても駄目でした。
またmain{sub(&Vint)}で、sub(vecter<int> *Vint){}でも
値の代入は出来ませんでした。困っていますよろしくお願いします。
229:デフォルトの名無しさん
07/05/17 00:01:12
>>228
一番最後のポインタを使った奴なら大丈夫なはず。
できなかったってのは、何をしたらどうなったんだ?
ポインタのかわりに参照を使うのが C++ 的に適切。
230:デフォルトの名無しさん
07/05/17 00:02:35
>またmain{sub(&Vint)}で、sub(vecter<int> *Vint){}でも
>値の代入は出来ませんでした。
できるよ
…気になったんだが、main の中で値を入れることはできるの?
resize もせずに Vint[0] = 1; とかやってないよな?
231:214
07/05/17 00:38:52
ありがとうございます。
>>216
クライアントエリアにも赤い×マークが描かれました。
>>220
#define IDI_ICON1 103
です。
232:デフォルトの名無しさん
07/05/17 00:54:09
>>231
じゃあそういうデータなんだよ
複数の形式でアイコンが入ってるなら全部チェックしてみては
233:214
07/05/17 01:00:02
自分で作ったアイコンなので赤い×マークなんて入ってないんですが・・・。
実行ファイルのアイコンとタイトルバー左上のアイコンも同じアイコンを使っていてそちらはちゃんと出ます。
234:デフォルトの名無しさん
07/05/17 01:54:58
んじゃOEMアイコンを読んでるんだな。
hInstanceがNULLだったりしないか?
235:214
07/05/17 02:08:59
ビンゴでした。
すいません、どうもありがとうございました。
236:デフォルトの名無しさん
07/05/17 04:06:34
VC++で
ULONGLONG x = 0;
x += 10000000 * 60 * 60 * 3;
ULONGLONG y = 0;
y += (ULONGLONG)10000000 * 60 * 60 * 3;
if (x != y)
cout << "Different" << endl;
とするとxの方はオーバーフローになってxとyが違う数字になってしまうんだけど
64ビットコンパイラではこれは起こらないんだよね? この辺の仕様について
書いてあるページとか無いだろうか?
237:デフォルトの名無しさん
07/05/17 04:17:24
>>236
intが64bitなら起きないけど、VC++の64bitターゲットはintが32bitな
ので、起きる。
ページは知らね。探してないけど、Cの規格書にあるはず。
238:デフォルトの名無しさん
07/05/17 04:35:12
整数定数は(特に記述が無ければ)int。
int同士の演算はintで行われ、結果もint。
これはどんなコンパイラでも一緒。
つまり、>>237の通り。俺もページは知らないが。
239:デフォルトの名無しさん
07/05/17 05:33:31
VIPPERが意外と侮れない
昨日VIPでレスついてた
130 名前:以下、名無しにかわりましてVIPがお送りします。[] 投稿日:2007/05/16(水) 14:52:36.04 ID:G4TJRFdQ0
struct base
{
private:
virtual bool typecmp( const type_info &typeinfo ){ return false; };
public:
template<typename TT> bool typecmp(){ return typecmp( typeid(TT) ); };
};
template<typename T> struct drived : public base
{
public:
virtual bool typecmp( const type_info &typeinfo ){ return typeid(T) == typeinfo; }
};
こんなんでどうだい?
240:デフォルトの名無しさん
07/05/17 07:35:47
>>229-230
一番下ので可能とのことで、もう一度やってみます。
resizeというものに関しては知らなかったです。
どうもありがとうございました。
241:デフォルトの名無しさん
07/05/17 11:28:44
char *strという変数に文字列を格納するのを関数で行う場合
どういう渡し方すれば良いんでしょうか?
242:デフォルトの名無しさん
07/05/17 11:29:48
hoge(char *dst, int dst_size)
243:デフォルトの名無しさん
07/05/17 11:49:19
>>241
その変数に、文字列は格納できない。
244:241
07/05/17 11:56:44
あれ?文字列を格納するのって
char str[50]="hoge";
char *str="hoge";
の二種類でやるのではないのですか?
C言語は今日から勉強し始めたので激しく狂ったこと言ってたらすいません。
245:デフォルトの名無しさん
07/05/17 11:58:10
おとなしく、配列とポインタの関係あたりを勉強してからにしろ。
246:デフォルトの名無しさん
07/05/17 14:23:09
if(a==b)とif(b==a)って同じですか?
247:デフォルトの名無しさん
07/05/17 14:24:50
>>246
それがC++で特殊な演算子オーバロードされていると言うことがないなら、同じ。
248:デフォルトの名無しさん
07/05/17 14:29:06
a, b の型が異なっても同じだったけ?
int と long とか double と int とか
249:デフォルトの名無しさん
07/05/17 14:40:08
>>248
promotion rule に従うってだけで同じじゃね?
250:デフォルトの名無しさん
07/05/17 17:31:45
mallocはnew、freeはdeleteに置き換え可能だと思いますが、
reallocはどうしたらいいでしょうか。(STLのコンテナ使え、は無しで
251:デフォルトの名無しさん
07/05/17 17:42:35
>>250
STLのコンテナを使わない理由を調べ、その理由如何では敢えてnew/deleteに置き換えずにそのままrealloc()を使うべし。
252:デフォルトの名無しさん
07/05/17 17:43:48
C++の機能に置き換えるというなら、インラインアセンブリでシコシコ
253:デフォルトの名無しさん
07/05/17 18:06:40
つplacement new
254:デフォルトの名無しさん
07/05/17 18:56:04
>>236
(ULONGLONG)10000000よりも10000000ullのほうがすっきり
255:デフォルトの名無しさん
07/05/17 19:13:51
意味が違うだろ。
256:デフォルトの名無しさん
07/05/17 20:26:09
scanfでdouble型変数に数値を入力し、その数値を1/2,1/4,1/5の値を出力するプログラムを作成
したいのですが、どのようにして作ればいいのでしょうか?
257:デフォルトの名無しさん
07/05/17 20:32:49
inline指定した関数がインライン展開されなかったとき、なんで警告が出ないの?
個人的には「この関数は現在の設定(orコンパイラ)ではインライン展開されません」という警告が低いレベルで出て欲しい。
258:デフォルトの名無しさん
07/05/17 20:37:56
それでデバッグビルド/サイズ優先ビルドで警告が出まくりか?
259:デフォルトの名無しさん
07/05/17 20:41:57
>>256
どこで躓いてるのか分からん。
scanfでint型変数に数値を入力し、その値を2, 4, 5倍して
出力するプログラムは作れるかい?
260:デフォルトの名無しさん
07/05/17 21:31:09
foo = !!bar;
という文を見たんですか、これは bar をboolにしてるだけで、
foo = (bool)bar;
と同じですか?
261:デフォルトの名無しさん
07/05/17 21:36:14
C++で変態的な演算子定義をしていないなら。
(operator !だけ定義してあるとか)
262:デフォルトの名無しさん
07/05/17 21:42:02
>>259
いやつくれません
263:デフォルトの名無しさん
07/05/17 21:58:16
>>257
コンパイラ作成者に言え。
264:デフォルトの名無しさん
07/05/17 22:07:36
>>262
本買って勉強しよう
265:デフォルトの名無しさん
07/05/17 22:31:35
>>257
警告を出すようにできるものもあるぞ。例えばVisual C++。
/W4でも出てこず、/wで個別指定もしくは/Wallで出てくる。
URLリンク(msdn2.microsoft.com)(vs.80).aspx
URLリンク(msdn2.microsoft.com)(vs.80).aspx
Borland C++Compilerでも警告が出た覚えがある。
266:デフォルトの名無しさん
07/05/17 22:33:39
VC++は-W4異常以上は標準ヘッダですら警告出たりして煩かったから
使ったことないなぁ
今はどうだか知らないが
267:デフォルトの名無しさん
07/05/17 22:39:57
なるほど。
独習C++で「展開されるか否かはコンパイラによる」って書いてあった気がしたから
低血圧な俺は心配しすぎで心拍数上がってぶっ倒れそうだったけど安心した。
268:デフォルトの名無しさん
07/05/17 22:52:02
>>266
標準ライブラリは滅多に出てこないが、
Boostなんかの外部のライブラリのヘッダではよく出てくるから、
#pragma warningが手放せない。
269:デフォルトの名無しさん
07/05/17 23:25:06
自作の型に対し、プリミティブな型と同じような四則演算を行う場合って、
+ - * / % += -= /= %= ++ -- の12個全部定義しないとダメ?
270:デフォルトの名無しさん
07/05/17 23:38:45
boost::operatorsを使えば手間が省けるかと思う。
271:デフォルトの名無しさん
07/05/17 23:52:35
>270
boostに頼るのが現実的っぽいですね。ありがとうございました。
しかし、これを使わないとすると一体何パターン定義すればいいのやら……比較やら何やら。
272:デフォルトの名無しさん
07/05/18 00:02:31
何の型かは知らんが、例えば同じ * でも
MyType * MyType、MyType * int、int * MyType は別定義かもしれんしな
後 const ありなしとか
273:デフォルトの名無しさん
07/05/18 00:16:17
非メンバな演算子でもboost::operatorで定義出来るんですかいね?
274:デフォルトの名無しさん
07/05/18 08:22:41
>>273
クラス定義内で friend 関数を定義することで実現するみたい。
275:デフォルトの名無しさん
07/05/18 11:34:58
VC++2003にSP1あてたら強制コンパイル(Ctrl+F7)できなくなった
のですが、どなたか対処法知りませんか?
276:デフォルトの名無しさん
07/05/18 11:57:41
C/C++の話ではないような・・・
オプションのキーボードで、ビルドのコンパイルがどれに割り当てられているか見てみては
277:デフォルトの名無しさん
07/05/18 13:03:36
>>275です。
>>276さんレスありがとうございました。
ここはスレ違いっぽいとは思いながら該当するスレがみつからず
書いてしまいました。すみません。
書き方が悪かったです。
キーの割り当てがどうという問題ではなく、
1度コンパイルしたソースファイルを
もう1度強制的にコンパイルすることがSP1になってから
できなくなってしまったのです。
適切なスレ探して聞いてみます。
278:デフォルトの名無しさん
07/05/18 13:42:29
Ctrl-F7は普通のビルドだから強制でもなんでもないだろ
リビルドしたいのか?
279:デフォルトの名無しさん
07/05/18 14:05:34
>>277
コマンドラインからdevenv /rebuildしたらどうなる?
280:275
07/05/18 14:26:11
>>278さんレスありがとうございました。
こっちのスレで同様な質問かいてしまいました・・・。
Visual Studio IDE環境
スレリンク(tech板)
要はOBJファイルが存在する状態でも
リビルドではなく普通にもう1度コンパイルかけたいだけなんです。
理由は、ソリューションが巨大なため単にリビルドでなくて一部のみコンパイル
かけたいときがあるので・・・。
>>279さん
OBJ消したり、リビルドすれば大丈夫なのは分かっているのですが、
業務上他のVer.(2005など)のVisualStudioも使うので同様の操作
で何故できないのかと。
ちなみにSP1あてる前は普通にできてたことですし、
VS6.0SP6,2005,2005SP1でも同様に問題なくできていました。
281:デフォルトの名無しさん
07/05/18 14:33:06
コンパイルできなくなったってだけじゃ何もわからんよ。
具体的にどうなってんのか(ビルドログとか)晒せ。
282:デフォルトの名無しさん
07/05/18 14:37:38
普通build っつーのは src target の依存関係を追って時刻更新がかかったもだけを
更新する作業だと思うのだが…
make -u はリビルドと同じだし、なんのことかわかんね<強制ビルド
まさか単に時刻が崩れているおち?
283:275
07/05/18 14:51:25
ログ晒します。
1回目のコンパイル。当然通常通りです。
------ ビルド開始 : プロジェクト : AAAAA, 構成 : Debug Win32 ------
コンパイルしています...
BBBBB.cpp
WINVER not defined. Defaulting to 0x0501 (Windows XP and Windows .NET Server)
C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include\afx.h(281) : warning C4005: 'ASSERT' : マクロが再定義されました。
コマンド ラインの引数 : 'ASSERT' の前の定義を確認してください。
ビルドログは "file://d:\AAAAA\Debug\BuildLog.htm" に保存されました。
AAAAA - エラー 0、警告 1
---------------------- 終了 ----------------------
ビルド : 1 正常終了、0 失敗、0 スキップ
2回目のコンパイル。スキップされてしまいます。
------ ビルド開始 : プロジェクト : AAAAA, 構成 : Debug Win32 ------
---------------------- 終了 ----------------------
ビルド : 1 正常終了、0 失敗、0 スキップ
ソリューション壊れてるのかな・・・?
ちなみに2005で同等のソリューションでは1回目も2回目も同じログはきます。
284:デフォルトの名無しさん
07/05/18 14:58:05
むしろ2回目も同じログ吐くほうがおかしくないか・・・
PCの時刻とファイルのタイムスタンプのチェック、
あと新規でソリューション作って試してみて
285:275
07/05/18 15:06:39
>>284さん
>むしろ2回目も同じログ吐くほうがおかしくないか・・・
ですが、今までSP1あてる前とか、VC6.0のときもこんな動作
してなかったのですが。
PCの時刻やタイムスタンプが壊れていることはないです。
ソリューション大きすぎるとおかしいんですかね?
VC6やVC2005で新規ソリューションで同様の操作してみます。
286:デフォルトの名無しさん
07/05/18 15:07:45
ログじゃなくてゲロ吐きそう・・・・
287:デフォルトの名無しさん
07/05/18 15:09:19
OBJ とかの中間生成物が違うフォルダを指してるとか read-only とかそういうことないか?
288:275
07/05/18 15:26:53
VC6.0MFCアプリで新規プロジェクト作ったら、
2回目スキップされました。あれ?2003SP1と同じでした。
・・・
VC2005のMFCアプリの新規ソリューションも
2回目スキップされました・・・。
ごめんなさい。これがデフォルト動作なんですね・・・。
でもそうすると今あるこの巨大ソリューションの2005版で
こうならないのは何故??
いや、そもそも2003SP1当てる前はスキップされなかった
ですし。
プロジェクトファイルを起こすところからやりなおした方が
よさそうですね。
皆様お騒がせしました。ありがとうございました。
289:デフォルトの名無しさん
07/05/18 15:47:30
>>288
巨大ソリューションの日付が未来。
290:288
07/05/18 15:48:15
SP1前後で違うんだったな。無視してくれ。
291:290
07/05/18 15:50:33
289 だった…orz
292:デフォルトの名無しさん
07/05/18 18:43:13
URLリンク(kansai2channeler.hp.infoseek.co.jp)
画像の情報を圧縮するプログラムをつくろうと思い
今、その前段階で
圧縮せずにそのままの情報量で画像を出力するプログラムをつくっているのですが
元の画像がほぼ復元されるはずなのに全くかけ離れた結果が出てしまいます
どこを修正すればよいのでしょうか?
環境は OS:Linux GCC:4.1.2 言語:C++ です
293:デフォルトの名無しさん
07/05/18 20:22:19
>>292
デバッグ依頼なら他スレ逝ってくれ
294:デフォルトの名無しさん
07/05/18 21:33:10
戻り値として配列を戻したいんだが、そういう時ってのはどうやればいいんでしょうかね?
戻り値の型はどうすればいいのか、return の後に書くのは関数内の配列名でいいのか、関数を呼び出した場所の=の左オペランドはどういう型にすればいいのか
教えてください。
295:デフォルトの名無しさん
07/05/18 21:39:07
引数に配列のポインタ受け取ってそれを操作すればいいような気もする
296:デフォルトの名無しさん
07/05/18 21:41:17
C++でnew演算子には三種類あるらしいですが
普通のnew、placement new、あともう一つは何ですか?
297:デフォルトの名無しさん
07/05/18 21:41:49
>>294
具体的なテストケース書いてみ
298:デフォルトの名無しさん
07/05/18 21:42:54
というよりCではそれが一番使われている。
ほかには、構造体を返したりC++ならstd::vectorを使ったりする方法がある。
関数内でメモリ確保して、呼出元で解放してもらうという手もある。
299:デフォルトの名無しさん
07/05/18 21:43:44
>>296
new[]のような気がするが、そうするとplacement new[]も考えられるんだよな
300:デフォルトの名無しさん
07/05/18 21:45:19
new(nothrow) のことか?
301:デフォルトの名無しさん
07/05/18 21:48:47
>>300
第三のnewはそれでしたか…名前からするにbad_alloc例外を投げないnewってところかな?
ともあれ回答ありがとうございました
302:デフォルトの名無しさん
07/05/18 21:49:41
>>294
配列を含む構造体を使う。
C++ なら std::vector も使える。
303:デフォルトの名無しさん
07/05/18 21:50:49
new(nothrow) は placement new の一種だろう。
三種類あると言ってる人の認識がどうなってるか知らないけど。
304:294
07/05/18 22:06:48
//ん~、こんなんでしょうか?(実際作りたいプログラムはこんなじゃないですけど
#include<iostream>
using namespace std;
int factor(int a[]){
for(int i =0; i<5 ; i++){
a[i]=i+1;
}
return a;
}
int main(){
int a[5];
a = factor(a);
for(int i =0; i<5 ; i++){
cout <<a[i];
}
return 0;
}
て、コンパイルが出来ませんでした。コンパイラはVC。メッセージは次の通りです。
test.cpp(9) : error C2440: 'return' : 'int []' から 'int' に変換できません。
この変換が可能なコンテキストはありません。
test.cpp(14) : error C2440: '=' : 'int' から 'int [5]' に変換できません。
配列型への変換はありませんが、参照またはポインタから配列への変換があります。
やっぱり引数と戻り値の型らへんの知識があいまいなので、どうやって渡してどうやって戻せばいいのか分かりません。
このコード直してくれたりすると、ありがたいんですけど・・・wさすがに無理な頼みでしょうか
305:デフォルトの名無しさん
07/05/18 22:23:24
STL使った方が遥かに楽だと思う
#include <vector>
#include <iostream>
int factor(std::vector<int>& in) {
enum { NUM=5 };
typedef std::vector<int>::size_type vec_sz;
in.reserve(NUM);
for (vec_sz i = 0; i < NUM; ++i)
in.push_back(static_cast<int>(i));
return 0;
}
int out(const std::vector<int>& in) {
for (std::vector<int>::const_iterator i = in.begin(); i != in.end(); ++i)
std::cout << *i << " ";
return 0;
}
int main() {
std::vector<int> v;
factor(v);
out(v);
return 0;
}
306:デフォルトの名無しさん
07/05/18 22:28:29
>>304
JavaかC#でもやっていたのかもしれないけど、
まずCには「配列を渡す」という概念自体がない。
ポインタの型で配列のサイズを指定するというやり方が
ないわけでもないけど、やはり普通は配列の先頭の要素の
アドレス(ポインタ)を渡して処理をすることになる。
その辺が面倒だと言うのならSTLか配列かクラス使う。
307:デフォルトの名無しさん
07/05/18 22:32:47
こんにちは。Cでプログラムをしているのですが、
_beginthread()で作成したスレッドをCloseHandleで終了させる時に、
デバッグなしで実行すると何もエラーは起こらないのですが、
デバッグありで実行すると、例外が発生してしまいます。
おそらくCloseHandleで出ているエラーなのですが、正常な終了方法ではないのでしょうか?
なんか、_freeptd(ptd);の所に矢印があります・・・。
スレッドの作成の部分と終了の部分は下のようになってます。
hThread = (HANDLE)_beginthread(connect, 0, NULL);
CloseHandle(hThread_connect);
308:デフォルトの名無しさん
07/05/18 22:36:27
>>307
_beginthread のマニュアルに
_beginthread に対応する関数書いてない?
malloc と fclose は対応してない様に
違う関数呼ぶと問題が多いよ
309:デフォルトの名無しさん
07/05/18 22:37:48
_beginthreadで開始したスレッドはCloseHandleしちゃ駄目。
310:デフォルトの名無しさん
07/05/18 22:38:24
>>303
new(nothrow) は確保に失敗したら NULL を返す new 。
placement new は既に確保してあるメモリを利用する new 。
全然違う。
311:デフォルトの名無しさん
07/05/18 23:11:19
>>308
_endthreadというのがあって、そのスレッドの最後に
_endthread();すればスレッドが終わるようなのですが、
スレッドの外から強制的にスレッドを終わらしたいのです。
しかも_endthreadは引数を持たないので複数スレッドを走らせている場合は
どのようにスレッドの外から強制的に終わらせればいいのか・・・
>>309
そうなんですか・・・。それはエラーが出るわけですね;;
ん~・・・
312:デフォルトの名無しさん
07/05/18 23:20:19
>>310
new に与える追加の引数のことを総じて new-placement と言う。 (5.3.4)
元々は new (place) T として配置に使う構文として追加されたから
こんな名前になってるんだろうけどね。
313:デフォルトの名無しさん
07/05/18 23:24:43
単純な方法としては
生成時にスレッドを生成して、消滅時にスレッドを終了させる
っていうスレッドそのものを表すクラスは作ってそいつに自殺するように命令するとか
となるとそいつらを生成、管理するクラスが必要になるわけで…
314:デフォルトの名無しさん
07/05/18 23:26:00
ExitThreadでスレッドを終了させた場合、その終了させたスレッドが
プロセスの最後のスレッドであれば、そのプロセスも終了するっぽいので、
これはこれで非常に使いにくいです。一体どうすれば・・・
315:デフォルトの名無しさん
07/05/18 23:28:24
>>311
短い答え:
スレッドを強制的に終了させる必要などないような設計に汁
少し長い答え:
_beginthreadex(), TerminateThread()を使え
316:315
07/05/18 23:29:08
おっと後者のほうが短かったぜ
317:デフォルトの名無しさん
07/05/18 23:44:55
>>315
ありがとうございます。Exではありませんが、
_beginthread()とTerminateThread()でエラーが出ないようになりました。
色々調べたところ、あるサンプルプログラムにおいて
TerminateThread()の後にCloseHandle()で更にハンドル開放を行ってますが
これは必要なのでしょうか?
318:デフォルトの名無しさん
07/05/19 00:05:57
>>317
イベントを受け取ったら自分で_endthreadして死ぬようにした方がいいと思う。
スレッドを無理やり止めるってことはどこで止まるか分からないんだぞ。気色悪い。
319:315
07/05/19 00:12:44
>>317
長い答え:
ヘルプに書いてある筈だが、_beginthread()で開始したスレッドは
自分が終了する時に自分でCloseHandle()を呼び出してスレッドハンドルを
破棄する。言い換えると、_beginthread()で開始したスレッドのハンドルが
いつ無効になるか外からは全く分からないので、スレッドのハンドルを
外から何らかの形で使いたいのなら、必ず_beginthreadex()を使え。
_beginthreadex()で開始したスレッドは自分でCloseHandle()を
呼び出さないので、リークを避けたければ誰かが責任を持って代わりに
呼び出してやる必要がある。つまりWaitForMultipleObjects()などを使って
終了を待ち、その後CloseHandle()を呼ぶ必要があるってことだ。
TerminateThread()した場合も同様だな。
320:デフォルトの名無しさん
07/05/19 00:22:37
>>318
とりあえずスレッドではrecv()をSOCKET_ERRORが出るまで永遠にループさせています。
サーバーが終了した時などは、自動でループを抜けて終了するのですが、
それ以外にこちらから接続を終了する切断ボタンを用意しています。
そのボタンを押したときに強制的にスレッドを終了させているのですが、
ボタンを押されたイベントをスレッド内で取得してすぐにスレッドを終了させる
事なんて出来るのでしょうか・・・?
>>319
丁寧にありがとうございます。とても分かりやすいですw
321:デフォルトの名無しさん
07/05/19 00:41:34
Linux,gccです。
./aaa 3 2 | ./bbb
というように、最初に実行したaaaの結果をパイプでつないで、後ろのbbbというプログラムで操作したいのですが、
うまくbbbに渡すことができません。
aaaは、
1 -2
-1
2
のように出力するので、bbbで
int main(int argc,char **argv) として読み取ろうとしているのですが、
argcの値を出力してみると1とでるので、./bbbそのものしか読み取れていません。
自分としてはここで ./bbb 1 -2 -1 2 でargcの値が5になるようしたいのですが、
このようなパイプの使い方は間違いでしょうか?
322:デフォルトの名無しさん
07/05/19 00:45:11
>>321
大間違い。パイプの使い方の勉強してらっしゃい。
要は、標準出力と標準入力を繋ぐだけだから。
>>320
おいおい、recv()しているスレッドをいきなり殺しちゃ拙いだろ。
323:デフォルトの名無しさん
07/05/19 00:51:05
>>322
ではサーバーとの接続をぷちって切りたい時は
どうすればいいのでしょうか?
324:315
07/05/19 01:01:18
>>320
長い答え:
ブロッキングモードでひたすらrecv()ループをしているんだな。
確かに簡単だが、それでは綺麗にスレッドを終了させられない。
1)ブロッキングモードでrecv()を使う代わりに、
例えばasynchronousモードでWSARecv()+WSAGetOverlappedResult()を使う
2)スレッド間通信用にEventを作る。そのスレッドを止めたい場合は
外からSetEvent()でやんわりと「お願い」する。
3)受信スレッドでは、WSARecv()でトリガした受信の完了と上記のイベントの2つを、
WSAWaitForMultipleEvents()などを用いて、同時に待つようにする。
4)SetEvent()によって待機から抜けた場合は、スレッドが自分で終了する。
こんな感じにすればできるぞ。まあ、基本的なテクニックだが。
325:デフォルトの名無しさん
07/05/19 01:40:49
>>324
初めて聞く関数がいっぱい出てきたので
ちょっくら勉強してきます!
326:デフォルトの名無しさん
07/05/19 02:26:01
まあ要するに、recv()という「外(他スレッド)からブレーク出来ないもの」を使う代わりに
他のもので待機してrecv()ではブロックしないようにする、ということだな。
ネットワークでは誰もが必要とすることなので、対処法もほぼ確立してる。
一般的には「select系」と呼ばれるけど、Windowsにもそれに向けた方法が用意されている。
327:デフォルトの名無しさん
07/05/19 02:54:08
OS依存しない現時点でC++の仕様を網羅した入門的教科
書ってなにかよいのないでしょうか。
クラスとかSTLのさわりのところまで知っているのですが
数年やっていなかったので今どういう機能が投入されている
のかわかりません。図書館でパラパラみていたら
「詳説C++第2版」というのが値段も含めて
よいかなと思ったのですが。
328:デフォルトの名無しさん
07/05/19 02:58:23
CALLBACK関数内で変数の宣言をすると処理が重くなりますか?
329:デフォルトの名無しさん
07/05/19 03:04:22
>>328
↓のどっちと比べて重くなるって言ってるの?
1.CALLBACKじゃない関数で変数の宣言をする
2.CALLBACK関数内で変数の宣言をしない
330:328
07/05/19 03:05:34
すみません。
1.CALLBACKじゃない関数で変数の宣言をする
です。
331:デフォルトの名無しさん
07/05/19 03:10:37
>>327
興味を持ってるところに水を差して悪いが…
>クラスとかSTLのさわりのところまで
このレベルで「最新の仕様」を知る事に意味があるのか?
それならまだ知らないC++の基本を押さえるのが先じゃないか?
332:デフォルトの名無しさん
07/05/19 03:19:00
C系のを中断してLispとかHaskellあと言語そのものを作ったりとか
とかしばらくやっていたので
今度は今のC++らしいところが全体的に知りたいっていう
かんじなんです。
そのあたりの気分を理解していただけますでしょうか。
333:デフォルトの名無しさん
07/05/19 03:34:23
それなら安心して Effective C++
334:デフォルトの名無しさん
07/05/19 03:50:56
質問ですが、ワードパッドの[ファイル]メニューの[送信]コマンドのように
既存の標準電子メールソフトから送信用ウィンドウを呼び出す機能を実現するには
どうすれば良いのでしょうか?
335:デフォルトの名無しさん
07/05/19 03:53:49
gcc -pg でコンパイルしたらそれまで出てなかった
Detaching after fork from child process XXX
と言うメッセージ出るようになったんですけど、これは何ですか?なにか問題あるでしょうか?
336:デフォルトの名無しさん
07/05/19 05:25:39
>>334
「ファイル名を指定して実行」で
mailto::
やってみれ
337:334
07/05/19 06:52:25
>>336
忝い
338:304
07/05/19 07:10:12
>>305
答えてくれてありがとうございました。
が、関数とか全くと言っていいほど知らないので、書いてくださったコードは理解できませんでした・・・。
どうにか自分のコードをちょちょいと直してコンパイルエラー無くなるようにならないでしょうか?
もし良ければお答え下さい。
>>306
>JavaかC#でもやっていたのかもしれないけど
すみません、全くのプログラミング初めて2ヶ月の初心者です
配列の先頭要素のアドレスを渡すには配列名を書けばいい、と本に載っていましたが、それでいいんですよね?
関数内でいじった配列を、元のところに戻してやるとき、returnの後と、関数の戻り値の型はどう書けばいいのか教えてください;;
339:デフォルトの名無しさん
07/05/19 07:29:12
>>338
上手くいかないというのは、知識が足りていない事の証明。
解らないと思うなら、他人に聞く前に死ぬ気で調べなさい。
その方が自分のためだよ。
配列とポインタの関係について、ぐぐりつつ、テストコードを書きつつで、
ちゃんと基本を押さえれば、難しいことはないよ。
340:304
07/05/19 07:44:56
そうですね。甘えてました。
出直してきます。
ありがとうございました!
341:デフォルトの名無しさん
07/05/19 07:47:02
>>338
配列を関数で変更したいだけなら、例えばこれだけでいい。
void incrementArray(int * foo, unsigned nFoo)
{
for (int ic = 0; ic < nFoo; ++ic) {
++foo[ic];
}
}
別の配列にコピーする場合も、関数で配列を新規に確保するのは判り難いからやめた方がいい。
void copyArray(int * bar, int const * foo, unsigned nFoo)
{
for (int ic = 0; ic < nFoo; ++ic) {
bar[ic] = foo[ic];
}
}
342:デフォルトの名無しさん
07/05/19 07:50:14
コピーのほうの仮引数名は
fooだのbarだの書かずにsrc,destにしようぜ。
343:デフォルトの名無しさん
07/05/19 07:51:54
Linuxでの初心者の質問です。
C++のstd::sort(v.begin(), v.end())のsort()の実装を見てみたいのですが、
どこをみればよいのでしょうか。
関数ポインタ2つだけを引数にしなくても、v自体を引数にする仕様の方が
自然な感じがするのですが。。。
どなたかよろしくお願いします。
344:デフォルトの名無しさん
07/05/19 07:55:20
>>343
それでは「配列」か「コンテナ」か、どれか一つの全体しかソートできない。
例えば、vectorの二番目からソートしたいかも知れない。
345:デフォルトの名無しさん
07/05/19 07:58:43
>>343
ディストリビューションによるけど、たとえば
/usr/include/c++/*/bits/stl_algo.h
渡しているのは関数ポインタじゃなくて、イテレータオブジェクトだよ。
範囲を指定できるようにしておけば、コンテナの全体をソートするのも
一部をソートするのも同じ使い方にできるから、いい設計。
346:332
07/05/19 08:48:50
>それなら安心して Effective C++
どうもありがとうございました。読んでみます。
347:デフォルトの名無しさん
07/05/19 09:15:15
>>327
入門的教科書の条件は満たさないが、規格書でも買っとけば?
348:デフォルトの名無しさん
07/05/19 09:18:23
>>330
変数の型が糞重たいコンストラクタ/デストラクタを持ってるクラスだったら重くなるだろうね。
まぁ環境による
349:デフォルトの名無しさん
07/05/19 09:20:24
mixiで暴れてる猫皇って何者?激しく不快なんだけど
C言語コミュ
URLリンク(mixi.jp)
初心者の為のC言語
URLリンク(mixi.jp)
350:デフォルトの名無しさん
07/05/19 09:36:21
>>327
今書いてるから待ってて。
351:デフォルトの名無しさん
07/05/19 10:14:01
執筆中かよw
いつ出版されるんだ?w
352:デフォルトの名無しさん
07/05/19 10:34:30
>>350に期待
353:デフォルトの名無しさん
07/05/19 10:37:36
>>327
その本俺持ってるけど、初心者には詳しく書きすぎてあって読んでいる
うちに眠くなるよ。
独習C++などの問題集を一通りやってみてはいかがかな。あれなら
一冊やり終えた所である程度の力が付く。
354:デフォルトの名無しさん
07/05/19 15:19:22
>349
諦めとけ。
Kusakabe氏と猫王(猫皇)氏の参加コミュニティには近付かないが吉。
自分も「なるほど、考え方の違いですね」などと発言したら
「バカにするのもいい加減にしてください」とか返されてビックリですよ。詳細曖昧でごめん。
355:デフォルトの名無しさん
07/05/19 15:27:12
ミクシィ(笑)
356:デフォルトの名無しさん
07/05/19 15:30:09
2ch(笑)
357:デフォルトの名無しさん
07/05/19 15:32:14
独習C++、exceptional C++以外にC++の問題集ってありますか?
358:デフォルトの名無しさん
07/05/19 15:57:35
C with Classes 問題集
359:デフォルトの名無しさん
07/05/19 16:04:49
そのK氏、マイミクのマイミクなんだよなあ……
なんであんなキチガイと付き合いあるんだろうあの人。
360:デフォルトの名無しさん
07/05/19 16:43:19
A man is judged by the company he keeps.
類は友を呼ぶ。
キチガイの知り合いはキチガイ。
361:デフォルトの名無しさん
07/05/19 17:05:02
つまり359は無自覚のキチガイ
362:デフォルトの名無しさん
07/05/19 17:24:16
話題に対して関係ない人についての言及は思わぬ蛇を出させる
363:デフォルトの名無しさん
07/05/19 17:25:43
キューを配列で作りたいのですが
enqueue時にデータが一杯の時の処理が上手く出来ません
↓は自分で考えてみたものです
URLリンク(kansai2channeler.hp.infoseek.co.jp)
どこが悪いのか教えていただけないでしょうか
(headは先頭要素の一つ手前の要素数、tailは最後尾の要素の要素数)
364:デフォルトの名無しさん
07/05/19 22:20:21
>>363
デバッグくらい自分でしろよ。
デバッグの過程で学ぶ事は、プログラムを書く事以上にあるんだぞ。
365:デフォルトの名無しさん
07/05/19 23:20:06
わからないので書き込んだのですが…
366:デフォルトの名無しさん
07/05/19 23:21:09
わかってて書き込んでたらそれはさすがにまずいだろ
367:デフォルトの名無しさん
07/05/19 23:56:39
>>363
とりあえず、データが一杯の時に
「どういう動きにしたいのか」
「実際はどういう動きをするのか」
を、まとめてみるのはどうだろうか
368:デフォルトの名無しさん
07/05/20 04:20:25
友愛数を探すプログラム
「博士が愛した数式」で出てきた友愛数
友愛数の定義
URLリンク(ja.wikipedia.org)
Aの約数の和=B、Bの約数の和=Aのとき、A、Bは友愛数である
(ただし約数には自分自身を含めない)
例:220と284
220の約数の和=1+2+4+5+10+11+20+22+44+55+110=284
284の約数の和=1+2+4+71+142=220
とりあえず1,000,000まで探してみた。39組あった。
オイラーは60余り見つけたらしい。
が、いかんせん遅すぎる。(Athlon64 3500+で33分)
誰か高速化してくださいな。
ソース:URLリンク(kansai2channeler.hp.infoseek.co.jp)
高速化のポイント
・約数をもっとスマートに見つける方法はないか?(これがかなり遅い)
・10の約数の和が100になるわけないので本探索のjのループに無駄が多い
かといって、どこまではしょっていいかわからない j = i / 2 ~ とか?
・あ、jをループにするから遅いんだ。yakuwaをソートして二分木探索すればいいんだ
369:デフォルトの名無しさん
07/05/20 06:55:55
100まで求めるやつらしい
URLリンク(www.saoyagi.net)
370:デフォルトの名無しさん
07/05/20 08:28:32
Aという起動中のプログラム(既存)のウィンドウを、Bというプログラム(自作)から開きたいです。
できるだけ簡単に開く場合はどんな方法がありますか?(SendMessage?)
Aのウィンドウはメニューから開くタイプでアクセラレータキーは付いていません。
371:デフォルトの名無しさん
07/05/20 08:39:58
std::vectorについて質問です。
#include <vector>
template <class T>
class test{
public:
test(T a){ data.resize(1); data[0] = a; }
const T& getData() const{ return data[0]; }
private:
std::vector <T> data;
};
int main()
{
test <bool> a(true);
a.getData();
test <int> b(0);
b.getData();
return 0;
}
boolで初期化された方にはVC8、GCC3.4共に、テンポラリのリファレンスを返すと怒られてしまいます。
boolとintでどのような違いがあるのでしょうか?
識者の方、ご教授お願いします。
372:デフォルトの名無しさん
07/05/20 09:06:18
>>371
Effective C++第18項
vector<bool>の返す型はbool*ではなくvector<bool>::reference型だから
参照は返せない。だから値で返すしかない。
const T& → const T
内部でプロキシオブジェクトを使っているのでアドレスが取れないため。
373:デフォルトの名無しさん
07/05/20 09:06:47
×Effective C++
○Effective STL
374:デフォルトの名無しさん
07/05/20 10:47:19
なるほど、vector< bool >にそんな事情があったとは。
const T& → const T にすると、vectorの中身によっては、
コピーが馬鹿にならない場合もあるので、この制約は嫌らしいですね。
375:デフォルトの名無しさん
07/05/20 11:02:00
>>374
一応補足しておくと、
const T となるのは vector<bool> ’のみ’ね
376:デフォルトの名無しさん
07/05/20 11:15:08
コピーが気になるなら、boost::call_traitsみたいな感じで
適切な戻り値の型を選ぶようにすればいいんじゃないかな。
377:デフォルトの名無しさん
07/05/20 12:06:05
>>370
C/C++、関係ナクネ?
プログラムAがどういう実装で新しいWindowを生成してるか
分からないとBからじゃ無理だと思うけど。
378:370
07/05/20 12:31:22
分かりにくくてすみません。
プログラムAはWindowsアプリケーションで、
TrackPopupMenu(ショートカットメニュー)からCreateWindowExでウィンドウを開いているようです。
プログラムBはC++(またはC)で作ります。
379:デフォルトの名無しさん
07/05/20 12:36:19
もうちょい詳しく。
てか、APIスレ行こうぜ
380:デフォルトの名無しさん
07/05/20 12:49:15
WM_COMMANDとメニューIDを
SendMessageで送りつければいいんじゃないの?
381:デフォルトの名無しさん
07/05/20 15:14:38
VC++のリストボックスについて、行き詰ってしまいまして、質問させて下さい。
環境はeMbedded Visual C++ 4.0 / windows CE です。
リストボックスにあるスクロールバーを使用せずに、別スクロールを付加させて、
リストボックスの動きを制御させています。
垂直スクロールに関しては、リスト数を取得して、スクロールバーで制御が出来るのですが、
水平スクロールがうまくいきません。。
リストボックス内では、文字列が途中までしか表示されておらず、
水平方向専用のスクロールバーを付加したのですが、
リスト内における表示位置(文字列の表示位置について)が取得&設定出来れば、
擬似スクロールが可能かな、と思ったのですが、取得することが出来ませんでした。
例えば、リストに水平スクロールをつけてしまい、そのスクロール部分を隠してしまい、
別スクロールから操作しているように見せかける、ということも考えたのですが、
その場合のリストについている水平スクロールの表示位置も取得できず。。。
もしかしたら、リストのスクロール位置が取得出来る方法があるのかもしれませんが、
申し訳ないのですが、調べたのですが、いまいち、探すことが出来ませんでした。
何かいい関数や処理がないかなぁ、、と行き詰っている状態です。
どなたか、いい方法をご存知の方がいらっしゃいましたら、教えていただけますでしょうか。
よろしくお願い致します。
追伸:もし、VC自体にそのような関数や処理方法がないのであれば、
別リスト(コピーリスト)を用意して、表示の仕方で擬似スクロールするように
見せかけるしかないのかなぁ。。。と悩み中です。。
382:デフォルトの名無しさん
07/05/20 15:56:47
switch文のcase句の条件を(ほぼ)同時に満たしたら下記の場合どうなるんでしょうか?
int nCount;
switch (a)
{
case1:
nCount=0
break;
case2:
nCount=1
break;
}
383:デフォルトの名無しさん
07/05/20 16:01:29
>>382
switchを通った時点の数値で評価される
384:デフォルトの名無しさん
07/05/20 16:01:57
一回で評価される式は1つ
つまりほぼ同時に満たすと言うのは
a == 0x01 && a == 0x02の時
これを満たすようなaは果たして存在するか?
385:デフォルトの名無しさん
07/05/20 16:17:17
switchとifは実行速度の面では一緒ですか?
386:382
07/05/20 16:18:06
>>384
case1とcase2をそれぞれ満たす違う値のaがほぼ同時に入ってくるということです。
>>383
でしたら下の場合nCountは3になるんでしょうか?
int nCount=3;
switch (a)
{
case1:
nCount=0
break;
case2:
nCount=1
break;
}
387:デフォルトの名無しさん
07/05/20 16:23:01
switch通過後にnCountの値が3になるのはaが1でも2でもない場合
388:デフォルトの名無しさん
07/05/20 16:23:04
>>386
>case1とcase2をそれぞれ満たす違う値のaがほぼ同時に入ってくるということです。
___ ━┓
/ ―\ ┏┛
/ノ (●)\ ・
. | (●) ⌒)\
. | (__ノ ̄ |
\ /
\ _ノ
/´ `\
| |
| |
___ ━┓
/ ― \ ┏┛
/ (●) \ヽ ・
/ (⌒ (●) /
/  ̄ヽ__) /
. /´ ___/
| \
| |
389:デフォルトの名無しさん
07/05/20 16:23:06
>>368
素数を定数配列で持っとけ。1,000,000までの解を求めるんなら
1,000( == √1,000,000 )以下の素数データがあれば十分。
素数を定数配列使うのが邪道だと思う場合でもせめて素数だと
わかった値はどっかにプールしといて再利用しれ。
390:デフォルトの名無しさん
07/05/20 16:25:09
スコープの問題か
ブロックローカルのa、関数ローカルのa、クラスメンバのa、グローバルのa
と色々あっても優先順位がちゃんと決まってるから入る評価されるaは唯一つだよ
391:デフォルトの名無しさん
07/05/20 16:27:09
volatile変数なんだろ。
392:デフォルトの名無しさん
07/05/20 16:28:09
おーい誰かエスパー呼んで来い
393:デフォルトの名無しさん
07/05/20 16:30:33
まさかとは思って念のため >>382 のコードをコンパイルしてみたが
エラーもワーニングもでなくてワラタ。
>>382
case 1: と case1: じゃ全然意味が違うから気をつけてね♪
394:デフォルトの名無しさん
07/05/20 16:38:05
>>393
case 1のコロンがなくてもGCCでコンパイルできるよ
395:デフォルトの名無しさん
07/05/20 16:41:23
それはない。
396:382
07/05/20 16:43:20
混乱させてしまって申し訳ないです。
グローバルフックのコールバック関数で以下のようにしてて、
AとBのウィンドウがあって、Bのウィンドウがアクティブな時にAのウィンドウをアクティブにすれば
BのWA_INACTIVEとAのWA_CLICKACTIVEがほぼ同時に飛んでくるんではないでしょうか?
この場合nCountの値はどうなるんでしょう?
int nCount=0;
case WM_ACTIVATE:
switch (lp->wParam)
{
case WA_ACTIVE:
case WA_CLICKACTIVE:
nCount--;
break;
case WA_INACTIVE:
nCount++;
break;
}
>>382は文法めちゃくちゃでした。
397:デフォルトの名無しさん
07/05/20 16:47:19
queueがあるから同時じゃないよ
398:デフォルトの名無しさん
07/05/20 16:48:05
>>396
switch文の外にあるcase WM_ACTIVATE: は本当にエラーにならないか?
399:デフォルトの名無しさん
07/05/20 16:50:23
まずWA_INACTIVEが呼ばれて次にWA_CLICKACTIVEが呼ばれる。
つまり
nCount=0;
nCount++;
が実行されてから
nCount=0;
nCount--;
が実行される
400:デフォルトの名無しさん
07/05/20 16:55:31
breakしてるからfall-throughはしないんだろ?
401:デフォルトの名無しさん
07/05/20 16:56:30
>>400
お前さんも質問者の言ってることが解ってないようだが、
質問者はそんなレベルじゃない勘違いをしている。
402:デフォルトの名無しさん
07/05/20 17:00:15
まああれだ、変数(または関数)と値というものの区別がついてないんだな、たぶん
403:382
07/05/20 17:05:01
まだいくつか省略してますがどこがおかしいのでしょうか?
>>399
ありがとうございます。見直して成功したら報告させて頂きます。
404:デフォルトの名無しさん
07/05/20 17:40:32
>>385
コンパイラによってはテーブルジャンプにしてくれる場合もあるとか
まぁ環境によるので実測しなさい
405:デフォルトの名無しさん
07/05/20 17:46:27
>>404
それを言うならジャンプテーブルだろ、馬鹿w
それからコンパイラによってはっていうよりそもそも
ジャンプテーブルに変換する為のモンだぞ、switch は。
確かに状況により必ずしもジャンプテーブルになるわけじゃないが。
406:デフォルトの名無しさん
07/05/20 17:58:14
万単位の分岐をelse ifのはしごで書くと
結構はっきり違いが分かるらしい
407:デフォルトの名無しさん
07/05/20 18:02:51
そこまで作るのがここに何人(ry ごめんなさい妬みですorz
408:デフォルトの名無しさん
07/05/20 18:24:51
int型の整数の中に、任意の整数が含まれているか調べる方法ってありますか?
たとえば
int a = 1234;
があって、この中に3という数値が含まれてるかどうか、みたいな感じです。
文字列として扱ってしまえばできそうなのですが、intからcharにキャストすると
どうもおかしくなってしまって・・・
よろしくお願いします
409:デフォルトの名無しさん
07/05/20 18:26:00
sscanf
410:デフォルトの名無しさん
07/05/20 18:26:03
10で割って一桁ずつ見ていけばいいでしょ
411:デフォルトの名無しさん
07/05/20 18:26:56
sprintfしてstrchrで探すとか。
412:410
07/05/20 18:27:24
1の位を見るにはa%10
413:デフォルトの名無しさん
07/05/20 18:54:29
>intからcharにキャスト
toString()ではいかんのか?
(Cなら >411 だが)
414:デフォルトの名無しさん
07/05/20 18:55:38
itoa系列の関数を使うといい
415:デフォルトの名無しさん
07/05/20 19:02:24
itoa()は標準関数じゃないよ。
416:デフォルトの名無しさん
07/05/20 19:08:56
ごめんちゃい><
417:408
07/05/20 19:15:16
いろいろとどうもです
sprintfの存在を初めて知りました
それで挑戦してダメだったら1桁ずつ見ていきたいと思います
418:デフォルトの名無しさん
07/05/20 19:27:37
速度求めるなら一桁ずつ見る方法の方がいいよなO(N)未満だし
419:デフォルトの名無しさん
07/05/21 00:47:05
>>381 です。
なんとか、少しづつ進んでみたのですが・・・。
現状のリストについている水平スクロールの値は取得&設定できました。
でも、設定をすると、リストの水平スクロールは稼動するのですが、
リストは一緒に動いてくれません。
どうしたら、リストも一緒に動いてくれますか?
GetDlgItem(IDC_リストコントロール)->GetScrollRange(SB_HORZ ,&iMin,&iMax);
iTest = GetDlgItem(IDC_リストコントロール)->GetScrollPos(SB_HORZ);
GetDlgItem(IDC_リストコントロール)->SetScrollPos(SB_HORZ,iTest+5,true);
420:デフォルトの名無しさん
07/05/21 01:22:53
>>368
>>389
直観的方法だけど、
・必要な素数列を最初に求める。
・1は定義より含まれないことが自明なので2から始める(2も自明のような気がするけど)。
・任意の数の友愛数は二つ以上ないと仮定して(証明されてるのか知らん)、既に友愛数になった数はスルー。
・求めた素数列を使って素因数分解してから組み合わせを網羅して約数列を作る。
・約数列の合計を求めて元の数より小さければその数は既に調べているのでスルー(等しいということはないだろうけど一応含めてスルー)。
・そうでない場合はその数の約数列を作り合計を求めて元の数と比較し、一致していれば友愛数。
URLリンク(www.geocities.jp)
この方法だと>>368の環境で1000000まで30分どころか30秒もかからない(と思う。当方Pen4 2.53GHzで28秒)。
421:デフォルトの名無しさん
07/05/21 02:10:01
はじめて質問します。よろしくお願いします。
switch文で、int型の特定の値を入力するまで処理を繰り返すものを作っているのですが、
(1、2、のメニュー番号を入力するまで繰り返す、など)
int型(1)ではなく、1.0やaなど指定されたもの以外入力すると
無限ループになってしまい、処理を抜けることができません。
画面に表示された番号以外打ち込むなと言いたいところなのですが…。
これを避けるためにはどのようにcaseを設定したらよいのでしょうか?
よろしくお願いします。
422:デフォルトの名無しさん
07/05/21 02:45:59
default:
423:デフォルトの名無しさん
07/05/21 02:58:07
URLリンク(www.google.co.jp)
424:デフォルトの名無しさん
07/05/21 03:52:32
>>421
switchの前でscanf()を使って入力しているのなら、fgets()+sscanf()に変更してみることお勧め。
425:デフォルトの名無しさん
07/05/21 04:17:38
>>368
これで早くなってるはず
URLリンク(kansai2channeler.hp.infoseek.co.jp)
C7 600MHz で 30秒
426:デフォルトの名無しさん
07/05/21 04:40:48
O(N^2)台のアルゴリズムはまだかね
427:デフォルトの名無しさん
07/05/21 05:13:28
>>368
メモリ大量消費版
URLリンク(kansai2channeler.hp.infoseek.co.jp)
C7 600MHz で 10秒
428:デフォルトの名無しさん
07/05/21 10:11:00
>>368
>>427 のオーバーフロー耐性を強化
yakuwa[i]=yakuwa[i_copy]*(i/i_copy*j-1)/(j-1);
↓
yakuwa[i]=yakuwa[i/j]+yakuwa[i_copy]*(i/i_copy);
429:デフォルトの名無しさん
07/05/21 13:18:08
定数の割り算は、かけ算に自動的に直されてしまうのですか?
430:デフォルトの名無しさん
07/05/21 13:23:44
>>429
そんな事はないけど大抵はコンパイラの最適化によってそうなる
理由は割り算よりかけ算の方が大抵のCPUで速いから
431:デフォルトの名無しさん
07/05/21 18:08:50
ツリービューコントロール等で項目が選択された場合に、何番目の項目が選択されたか調べたいのです。
WM_NOTIFYメッセージを捕まえて、何番目の項目が選択されているか調べているのですが、どうやら
この方法だとツリービューコントロールが選択される直前に選択されていた項目の値が返ってしま
います。
恐らくWM_NOTIFY以外のウィンドウメッセージを捕まえるべきなのでしょうが、どのメッセージを
捕まえればよいのでしょうか?
432:デフォルトの名無しさん
07/05/21 18:14:57
TVN_SELCHANGED
433:デフォルトの名無しさん
07/05/21 18:59:00
>>432
ありがとうございます。
しかしTVN_SELCHANGED メッセージはそのままでは取得できないんですね…。
色々と面倒そうですがやってみます。ありがとうございました。
434:デフォルトの名無しさん
07/05/21 19:02:47
WM_NOTIFY を捕まえてるのに、そのままでは取得できないってのは無いだろう。
435:デフォルトの名無しさん
07/05/21 19:21:13
>>434
すみません、リストビューの扱いを間違っていました。
ちゃんとTVN_SELCHANGEDでそのままメッセージを取得できました。
重ね重ねアドバイス感謝します!
436:デフォルトの名無しさん
07/05/21 19:39:11
リストビュー?
ツリービューじゃないのか?
437:デフォルトの名無しさん
07/05/21 19:42:05
あ、ツリービューでした。
438:デフォルトの名無しさん
07/05/21 20:13:33
class Foo {
public:
Foo(bar b);
func();
private
struct Impl;
smart_ptr<Impl> pimpl;
};
があった時、インスタンス化されたFoo型のオブジェクトfのfunc()を
関数オブジェクトにしてSTLのアルゴリズムに渡したいんですが
(理由:func()はFooのコンストラクタによって初期化されたメンバpimplを利用する)、
どうすればいいんでしょう?
出来れば関数ポインタではなく関数オブジェクトとして扱いたいです
439:デフォルトの名無しさん
07/05/21 20:26:53
boost::function<int ()> f = std::bind1st(std::mem_fun(&Foo::func), that);
だって、boostのチュートリアルに書いてあった
440:デフォルトの名無しさん
07/05/21 20:33:21
boost::bind(std::mem_fun(&Foo::func), &f)
441:デフォルトの名無しさん
07/05/21 20:37:03
回答ありがとうございます、上手く行きました。
しかしこんな奇怪なコードが通ることについてとても不思議に思います。
442:デフォルトの名無しさん
07/05/21 21:45:31
質問です。
プログラム初心者の質問なんですが、
プログラム上で指定したフォルダに、ファイルがいくつ格納されているのか?
また、どんな名前のファイルなのか調べる方法はないものでしょうか?
443:デフォルトの名無しさん
07/05/21 21:47:53
あります。
444:デフォルトの名無しさん
07/05/21 21:47:53
あげてしまいました。ごめんなさい。
あと環境はC++です
445:デフォルトの名無しさん
07/05/21 21:48:02
>>442
Windows環境なら、FindFirstFile でぐぐるとよろし
446:デフォルトの名無しさん
07/05/21 21:50:24
>>442
Win32ならFindFirstFile/FindNextFile
447:デフォルトの名無しさん
07/05/21 21:51:59
>>442
Win32APIを使うならFindFirstFile、FindNextFile、FindClose。
448:デフォルトの名無しさん
07/05/21 21:52:44
>>445-446
式は来月あたりですか?
449:デフォルトの名無しさん
07/05/21 21:53:19
<boost/filesystem/operations.hpp>あたり
450:デフォルトの名無しさん
07/05/21 21:53:51
421です。
いただいたヒントとatoiで修正することができました。
どうもありがとうございました。
451:デフォルトの名無しさん
07/05/21 21:57:59
442です
ありがとうございます。
環境はWindowsなので、FindFirstFileでいいようです。
例になるコードもぐぐれたので、なんとかがんばってみます!
452:デフォルトの名無しさん
07/05/21 22:01:04
>>439-441
boost::bind なら↓でおk
boost::bind(&Foo::func, _1)
453:デフォルトの名無しさん
07/05/21 23:47:50
>448
全然一致してないじゃん
454:デフォルトの名無しさん
07/05/21 23:57:08
tr1::bindでもいいよ
455:デフォルトの名無しさん
07/05/22 02:41:30
二次関数(y = a x^2+ bx +c)でxがx1 <= x <= x2のときの最大値と最小値(そのときのxの値も含めて)を求めるプログラムを作成せよ。
ここでa,b,cは整数、x1,x2は浮動小数とする。
数学の発展課題として出されたのですがさっぱり分かりません。
どなたか手を差し伸べてください・・・orz
456:デフォルトの名無しさん
07/05/22 02:43:42
>>455 丸投げは宿題スレ逝け。
457:デフォルトの名無しさん
07/05/22 03:05:43
C++の質問なのですが、
配列:123224があるとして、2の要素数だけを取り払い、前詰めをして
配列:134にするには、どのような方法がありますか?
お願いします。
458:457
07/05/22 03:13:32
Deleteを使わない方法がありましたら、それをお願いします
459:デフォルトの名無しさん
07/05/22 03:21:13
Deleteというのが何なのか知らんが、
std::vectorと共通アルゴリズム使えば一発じゃないか?
460:デフォルトの名無しさん
07/05/22 03:21:35
>>457-458
配列って std::vector のことか?
結果の要素数が変わってるんで、組み込み配列じゃないんだろう。
だったら remove + erase でいい。
"Delete" って delete 演算子のことか?
new を使ってないなら使うもクソもねーよ。
461:デフォルトの名無しさん
07/05/22 03:31:02
>457
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
int main(){
int array[] = {1,2,3,2,2,4};
vector<int> vi(array, array+6);
vi.erase(remove(vi.begin(), vi.end(), 2), vi.end());
for(int i=0; i<vi.size(); i++)
cout << vi[i] << ' ';
cout << endl;
return 0;
}
462:デフォルトの名無しさん
07/05/22 05:55:58
>>368です
>>389 >>420 >>425 >>427 さん、レスありがとうございます。
素因数分解を使うと手っ取り早く約数が計算できるのですね。
後でwikipediaを見て知りました(汗
あと、本探索部分もいらないループしてましたし。
プログラムを書いていただいたお二方もありがとうございました。
>>427さんのプログラムだと2秒で終わりました!
素因数分解の方法とか、ためになります。(まだ、ちゃんと読めてないですけど)
ありがとうございました。
463:デフォルトの名無しさん
07/05/22 06:22:51
うーむ・・こんなにも差が出るもんなんやね・・
アルゴリズムの大切さをあらためて実感した。
464:デフォルトの名無しさん
07/05/22 07:48:37
>>462
中学で習うよ・・・
465:デフォルトの名無しさん
07/05/22 08:07:40
>>462
約数の和
例
60 の場合
60= 2^2 * 3^1 * 5^1
(60の約数の和)=(2^0 + 2^1 + 2^2)*(3^0 + 3^1)*(5^0 + 5^1)
=(1+2+4)*(1+3)*(1+5)=168
>>427 のアルゴリズム
60=2^2*15
(60の約数の和)=(15の約数の和)*(2^0 + 2^1 + 2^2)
=(15の約数の和)*(2^3-1)/(2-1)
>>428 のアルゴリズム
60=2^2*15
(60の約数の和)=(15の約数の和)*(2^0 + 2^1 + 2^2)
=(15の約数の和)*(2^0 + 2^1) + (15の約数の和)*2^2
=(30の約数の和) + (15の約数の和)*2^2
466:デフォルトの名無しさん
07/05/22 12:56:16
C++で値クラスを作る際に、Cスタイルの構造体を選択した場合、
コンストラクタのオーバーロード
(引数なしでメンバは全てゼロ、または指定引数で初期化といった動作をさせるため)
すること、さらに考えを進めて振る舞い、つまりメンバ関数を持たせることって良くないんでしょうか?
467:デフォルトの名無しさん
07/05/22 13:02:16
凸包を調べるためにQhullを使ってるんだけど、頂点配列points[i]から
凸包の外周要素に使われた点の添字を抜き出す方法って無い?
色々やってみたけど、外周要素の点の座標しかもってこれないです。
468:デフォルトの名無しさん
07/05/22 13:03:45
構造体にメンバ関数を持たせることに対する文法的な質問?
それとも比較的どうでもいいコーディングスタイル的な質問?
前者なら、文法上可能。
classとstructはデフォルトのアクセス修飾が異なるだけでなんら問題なし。
後者なら、好きにすれば?としか言いようがない。
469:デフォルトの名無しさん
07/05/22 13:15:52
|は演算子ですか?こういう使い方みるんですが
a(x|y,z)
470:デフォルトの名無しさん
07/05/22 13:16:26
入門書に書いてあるような事を聞かない。
471:デフォルトの名無しさん
07/05/22 13:18:57
じゃあスレタイに初心者歓迎なんてつけないでください
472:デフォルトの名無しさん
07/05/22 13:26:26
読んでも分からない事ならいいが、
読めば誰でも必ず分かる事を聞かれても困る。
473:デフォルトの名無しさん
07/05/22 13:28:11
1か0かって書いてたんで変数1か0しか無意味ということですか?
474:デフォルトの名無しさん
07/05/22 13:28:27
演算子ですよ
475:デフォルトの名無しさん
07/05/22 13:29:34
x|y ビットOR
x||y 論理演算OR
476:デフォルトの名無しさん
07/05/22 13:30:59
ビットOR の使いかたがわかりません
477:デフォルトの名無しさん
07/05/22 13:33:47
各ビットでORが必要になったら使う
必要でなかったら使わない
478:デフォルトの名無しさん
07/05/22 13:34:01
y==11001010
x==00110101
z=x|y
z==11111111
479:デフォルトの名無しさん
07/05/22 13:34:09
たとえば
a = 99|137;//aには235が代入される
01100011 (99)
10001001 (137)
---------ビットOR
11101011 (235)
480:デフォルトの名無しさん
07/05/22 13:41:08
こんなのにわざわざ…
おまいら親切だな
>>471
モノには順序(ry
481:デフォルトの名無しさん
07/05/22 13:59:50
うん、俺今ちょっと気分いいんだ。
482:デフォルトの名無しさん
07/05/22 14:06:12
惚れました(*´ェ`*)
483:デフォルトの名無しさん
07/05/22 14:15:46
誰かcygwinでwhileを使った九九のプログラムの作り方を教えてくれませんか(´д`)
484:デフォルトの名無しさん
07/05/22 14:17:27
宿題は自分で。
485:デフォルトの名無しさん
07/05/22 16:34:09
URLリンク(www.uploda.org)
リスト云々覚えようかとこんなの書いてみたんですが、下から10行目辺りのreallocの所で、強制終了してしまいます。
どこが悪いんでしょうか・・・・誰か教えて下さい
486:デフォルトの名無しさん
07/05/22 16:41:48
ポインタを初期化もして無いくせにrealloc使うな。
どうしても使いたきゃNULLで初期化してから使え。
487:デフォルトの名無しさん
07/05/22 16:44:04
つーか、
struct late data[20];//とりあえず、20個分
struct late *memp=data;//↑のデータの最初のアドレスをmempに
配列のアドレスで初期化しとる。
初期化しなければ、グローバル変数だからNULLが入るんでうまくうごいたのにね。
488:デフォルトの名無しさん
07/05/22 16:47:11
reallocの動作を勘違いしてる
489:485
07/05/22 16:52:22
む・・・良く分かんない・・・・・・orz
reallocの一つ目の引数には、中身が入ったポインタを指定してはいけないって事ですか?
490:デフォルトの名無しさん
07/05/22 16:54:10
>>489
一つ目の引数は必ずmallocやreallocで取得したポインタ(か、NULL)
同じ位置で指定したサイズが取得できないと、別の場所でallocしなおして
最初のやつはfreeされる。
491:485
07/05/22 16:57:11
>>490
あ、分かりました。
struct late data[20];//とりあえず、30個分
struct late *memp=data;//↑のデータの最初のアドレスをmempに
↑の部分を
struct late *memp;
memp = (struct late*)malloc((sizeof(struct late)) * 20);
こうすればいいんですよね?
492:デフォルトの名無しさん
07/05/22 16:59:54
>>491
まあそういうこと。
そして、reallocするということは、それが常に同じアドレスとは限らない。
493:485
07/05/22 17:01:35
>>492
ありがとうございました。物凄く勘違いしてたっぽいですねorz
勉強になりました。
494:デフォルトの名無しさん
07/05/22 17:09:37
>>466
C++/CLIでのことだったらそっちのスレで聞いたほうが的確な助言がくると思うぞ。
495:デフォルトの名無しさん
07/05/22 21:28:41
URLリンク(www.heat-devil.com)
非常に初心者な質問なのですが、
ファイル分割の勉強中で↑な感じで3つに分けて
borland C/C++コンパイラでbcc32 a.cpp hoge.cpp hoge.hとやったら
『 hoge.h 1: 宣言の構文エラー』と出るのですが、
hoge.hのどこが間違っているのか分からないのでどなたか教えてくださいorz
496:デフォルトの名無しさん
07/05/22 21:50:28
>>495
なんで hoge.h がエラー扱いされてしまうのかは俺も少々不可解だけど、
bcc32 a.cpp hoge.cpp
でおk。hoge.h は a.cpp と hoge.cpp から include される対象に
過ぎないからコンパイルする必要は無し。
497:デフォルトの名無しさん
07/05/22 21:57:29
.hをコンパイルすると、C++じゃなくて、Cとして
コンパイルされるんじゃないの。
498:デフォルトの名無しさん
07/05/22 21:59:58
ああ、なるほど。
499:デフォルトの名無しさん
07/05/22 22:16:23
>>496-497
うわぁああ出来ました!!
そうか、iostreamとかもコンパイルの時書かないですしね><
分割するの初めてだったからファイルの書き方間違っているのかと
今日一日中ネットや本で調べたけど分からなかったのでホントに嬉しいです・・・(;△;)
まさかそっちのやり方が間違っていたとは。
ありがとう、本当にありがとうございます><
500:デフォルトの名無しさん
07/05/22 22:18:59
(;△;)
501:デフォルトの名無しさん
07/05/22 22:49:01
オーム社「C言語によるプログラミング[応用編]」(第一版)
サンプルプログラム sample2 myform.c
をそのまま写して、コンパイルしたところエラーがでました。
環境は、
gcc version 4.1.2 20061115 (prerelease) (Debian 4.1.1-21) です。
エラー出力は、
myform.c:57: error: two or more data types in declaration specifiers
myform.c:104: error: conflicting types for �。GetArg�「
myform.c:57: error: previous declaration of �。GetArg�「 was here
myform.c:256: error: conflicting types for �。LineAdd�「
myform.c:58: error: previous declaration of �。LineAdd�「 was here
int GetArg( int, char *[], int *, int *, int *, int *, char [] );
int GetArg(
int argc,
char *argv[],
int *column, /* カラム数 */
int *line, /* 行数 */
int *upper, /* 上余白行数 */
int *left, /* 左余白行数 */
char file[] /* 入力ファイル */
)
int *LineAdd( char *, char *, int );
char *LineAdd( char *to_buff, char *from_buff, int num )
502:501
07/05/22 22:51:35
このエラーの原因を知りたいのですが、
ヒントやポインタをおねがいします。
一番下のこの部分は無視してください。
int *LineAdd( char *, char *, int );
char *LineAdd( char *to_buff, char *from_buff, int num )
_
503:デフォルトの名無しさん
07/05/22 22:52:40
どこが57行目?
504:デフォルトの名無しさん
07/05/22 22:56:31
>>501
セミコロン
505:デフォルトの名無しさん
07/05/22 23:02:57
int GetArg( int, char *[], int *, int *, int *, int *, char [] );
int GetArg(
int argc,
char *argv[],
int *column, /* カラム数 */
int *line, /* 行数 */
int *upper, /* 上余白行数 */
int *left, /* 左余白行数 */
char file[] /* 入力ファイル */
){
return 0;
}
とりあえず、gcc 3.4.6にかけてみたけど、エラーなんて
でなかったぜよ。
506:501
07/05/22 23:03:33
57行目
int GetArg( int, char *[], int *, int *, int *, int *, char [] );
104行目
int GetArg(
int argc,
char *argv[],
int *column, /* カラム数 */
int *line, /* 行数 */
int *upper, /* 上余白行数 */
int *left, /* 左余白行数 */
char file[] /* 入力ファイル */
)
です。
myform.c:256: error: conflicting types for �。LineAdd�「
myform.c:58: error: previous declaration of �。LineAdd�「 was here
は無視してください。
507:501
07/05/22 23:06:50
>>504
int GetArg( int, char *[], int *, int *, int *, int *, char [] );
^^^
このセミコロンのことでしょうか?
>>505
わざわざコンパイルしてくださって、ありがとうございます。
お手数かけてすいません。
これから、自分の環境でその部分だけコンパイルしてみます。
508:501
07/05/22 23:11:45
>>505をコンパイルしたところ、自分の環境でもエラーはでませんでした。
ほかに GetArg関数に関係があるところは、メイン関数でよびだしたこの場所だと思います。
なにかまちがえたことをしているでしょうか。
int main ( int argc , char *argv[] )
{
int column, line, upper, left;
char file[SMALL_BUFF_SIZE];
int result;
/* main引数取得 */
result = GetArg( argc, argv, &column, &line, &upper, &left, file );
509:デフォルトの名無しさん
07/05/22 23:46:33
「基本クラスにあるprotectedなメンバ関数を、
派生クラスで名前も処理も変えず、publicに昇格する」 というのは、
class base {
protected:
int hoge() { ... }
};
class derived : public base {
public:
int hoge() { return this->base::hoge(); }
};
こんな感じになりますか?
それとも、もっと簡単にできますか?
510:デフォルトの名無しさん
07/05/23 00:04:48
名前も処理も変えないんだったらオーバーライドする意味無いやん
さらに言えばprotectedにする意味無いやんhoge()はpublicにすりゃいいやん
って思ったんですがどうでしょう?
511:501
07/05/23 00:09:27
エラーの原因がわかりました。
57行目の int GetArg( int, char *[], int *, int *, int *, int *, char [] );
の前にある、
enum
{
NORMAL_END, /* 0 */
USAGE_ERROR, /* 1 */
FILE_ERROR /* 2 */
};
^^^^
このセミコロンが欠けていました。
>>504さんのいうとおりでした。
おさわがせいたしまして、どうもすいませんでした。
レスくださった方たち、ありがとうございました。
512:デフォルトの名無しさん
07/05/23 00:10:16
>>510
尤もだ。
513:デフォルトの名無しさん
07/05/23 00:11:15
using base::hoge;
でよくね?
514:デフォルトの名無しさん
07/05/23 12:47:58
C++初心者で申し訳ないのですが、質問させてください。
↓のページのSFMTを、C++プログラムから利用したいのですがうまくいきません。
URLリンク(www.math.sci.hiroshima-u.ac.jp)
URLリンク(www.math.sci.hiroshima-u.ac.jp)
Linux上でg++(ver4.20)でコンパイルしてみると、sample2-1や2-2が詰まります。
ヘッダでinline宣言してある関数が"xxx is used but never defined"と警告され、
リンク時にエラーになります。
sample2-3のようにcファイルをincludeする、またはgccならばコンパイルできますが
c++のソースから呼び出さねばならない場合、どうすればよいのでしょうか?
c++用ライブラリ等も紹介されてますが、呼び出し側プログラムの書き換えを最小限に
したいので、inline関連のオプション追加で解決してくれるなら、と思っています。
よろしくお願いします。
515:デフォルトの名無しさん
07/05/23 13:03:31
>>514
よく見てないけどこんなのは?
extern "C" {
#include "SFMT.h"
}
516:デフォルトの名無しさん
07/05/23 13:33:50
#include<iostream>
#inlucde<iostream.h>
C++でのこの2つって何か違いがあるんですか?
517:デフォルトの名無しさん
07/05/23 13:41:38
はい。
518:デフォルトの名無しさん
07/05/23 13:41:54
後者は過去の遺産。
519:デフォルトの名無しさん
07/05/23 13:49:38
積極的に.h無しが推奨される理由があるなら教えて頂きたいです><
Cの勉強始めた時から.h有りで書いていて慣れていたので。
520:デフォルトの名無しさん
07/05/23 13:53:59
規格に書いてあるから。
521:デフォルトの名無しさん
07/05/23 13:55:57
違いがあるから
522:デフォルトの名無しさん
07/05/23 13:56:20
iostream.h の方は std 名前空間に入ってないから。
523:デフォルトの名無しさん
07/05/23 14:21:06
>>516
iostream.hの方が入出力が速い処理系があります(VC6とかVC6とかVC6とか)。
でも既に古いC++です。
524:デフォルトの名無しさん
07/05/23 14:36:13
>>522
し、正直よく分からないけどあなた様のレスのコピペを保存して
賢くなったら読み返して理解してみます><
>>523
ありがとうございます。
新しい処理系だと.h無しの方が処理が速いんですね。
参考になりました><
525:デフォルトの名無しさん
07/05/23 15:04:09
>>524
>518とか>520も無視すんなや。ちゃんとメモしとき。
それからついでに。
>新しい処理系だと.h無しの方が処理が速いんですね。
誰もそんなこと書いていない。
526:デフォルトの名無しさん
07/05/23 15:18:03
>>525
いや、2chでよくあるYES/NOレスみたいな感じで
スルーか微妙だったから具体的に教えてくれた人にレスしたんだ。
もし気を悪くしたらごめんです。
それと昔は.h有りの方が速かったけど今は>>522さんが言った理由な感じで
.h無しの方が良いから処理速度は.h無しでも変わらなくなったってことかな?
なんだか分かったような分かってないようなだけど突っ込んでくれてありがとう><
527:デフォルトの名無しさん
07/05/23 15:40:43
処理速度なんて関係ない。
要は.h有りは古い規格で、今は.h無しが標準ということ。
実際VC++では2003あたりから標準に則ってiostream.hは提供されなくなった。
528:デフォルトの名無しさん
07/05/23 15:49:52
礼儀のなってない自称初心者ほど嫌われるものはない。
529:デフォルトの名無しさん
07/05/23 16:10:08
>>527
つまりその名前空間云々で.h無しの方が良くて、
その規格に合わせて処理系も変わってきたから.h無しが推奨されると。
という把握をしてみました。
とりあえず名前空間云々を可及的速やかに勉強してみます><
>>528
うん、なんだかごめんです。
「規格だから」「過去の遺産」「違いがあるから」的なのじゃなくて
「どうしてそういう規格でどう違いがあって」的な理由を聞きたくて
「うん」とか表面的な答えの人は2chではあまりちゃんと答えてくれない
経験則から他の人にだけレスしてしまった。
気を悪くしていたら反省している。
530:デフォルトの名無しさん
07/05/23 16:19:34
他の板には余りないこの板の特徴かも知れんが、
「答えだけ書くから後は自分で調べろ」的なパターンかもね。
兎にも角にも>529は「書いてあるものを読み」、「書かれてないことを読まない」ようにしないとな。
531:デフォルトの名無しさん
07/05/23 16:33:20
自分で答えを決め付けてから読むから
回答者の意図なんて全然読み取れてない
532:デフォルトの名無しさん
07/05/23 16:45:07
>>531
こんだけ反省してるって言ってるんだから、
流石にいい加減しつこいというか。
質問者だけにやたら厳しいが仮にも初心者歓迎謳ってるんだから
回答者にもある程度誘導的な姿勢は必要だとも思うし。
533:デフォルトの名無しさん
07/05/23 16:46:04
いつまで苛めてんだ。カルシウム摂れ。
534:デフォルトの名無しさん
07/05/23 16:47:36
いつまでもいいんだ。カルシウムくれ。
535:デフォルトの名無しさん
07/05/23 16:49:06
煮干が美味いんだ。昆布でダシは邪道
536:デフォルトの名無しさん
07/05/23 17:07:43
質問です
最近C++(つかプログラミング)を始めた者です
入門書「やさしいC++」を読んで、一通り簡単な文法とかは理解したんですけど、
この板に出てくるソースによくある、関数の種類とかについては全く分かりません。
そろそろコンソールアプリケーションじゃなくて、ウインドウのソフトも作ってみたいと思うんですが、
どうやら、関数をいっぱい知ってなきゃ作れないらしいですね。
これから自分はどんな本,どんなサイトを見て勉強していくべきなのでしょうか?
537:デフォルトの名無しさん
07/05/23 17:46:03
やれやれ。そろそろネタばらしでもしてやるか。
昔はインクルードするものと言ったらヘッダーファイルで当然だったのだが
果たしてヘッダーファイルが実在する必要があるのか、
それを規格で要求するべきなのかと言う議論があった。
そのためにいかにもファイルの拡張子っぽい.hをなくし、
コンパイラは標準ライブラリのヘッダーをインクルードしている部分を
通常のインクルード処理ではなく、対応する標準関数その他を有効にする
単なるスイッチとして使うことを許すようにした。
538:デフォルトの名無しさん
07/05/23 17:55:49
>>536
MSDN
539:デフォルトの名無しさん
07/05/23 18:01:54
質問です。
typedef float Vector3[3];
なんてtypedefをしたんだけど。
vector<Vector3> vec;
vec.resize(10);
が通らない。
vector<float> vec;
vec.resize(10);
なら通るんだけど。
どうして?
540:デフォルトの名無しさん
07/05/23 18:03:51
>>539
配列にはそのまま代入ができないので、無理。
541:デフォルトの名無しさん
07/05/23 19:27:17
vectorが内部で何やってるか考えてみようぜ
542:デフォルトの名無しさん
07/05/23 20:54:27
ここで聞いて良いのか分からないのですが、間違っていたらすみませんが誘導お願いします
VC++の初心者質問なんですがCOMインターフェイス使って#import する場合
例えば、エクセルなんかの場合
##import "C:\Program Files\Microsoft Office\Office\excel9.olb"
rename("DialogBox", "DialogBoxXL") rename("RGB", "RBGXL") rename("DocumentProperties", "DocumentPropertiesXL") no_dual_interfaces
とかやるんですが、これはビルドしたときにexeに組み込まれちゃうんでしょうか?
もしくはexeが実行したときにオブジェクトライブラリが読み込まれるのでしょうか?
543:デフォルトの名無しさん
07/05/23 21:08:11
>>542
excel9.olbの内容はコンパイル時にのみ参照される。
実行時にexcel9.olbは不要。
544:デフォルトの名無しさん
07/05/23 21:25:18
>>539
vector<vector<float> > vec; でいいじゃん
resize()は要素分行う必要があるので面倒だけど
545:デフォルトの名無しさん
07/05/23 21:29:35
>>543
ありがとうございます
546:デフォルトの名無しさん
07/05/23 21:39:56
>>544
struct Vector3 { float vec[3]; };
vector<Vector3> vec;
の方がいいんじゃないか
547:デフォルトの名無しさん
07/05/23 21:54:57
>>539
struct Vector3 {
float a;
float b;
float c;
};
vector<Vector3> vec;
548:デフォルトの名無しさん
07/05/23 22:01:34
abcよりもxyzのほうが的確だと思う
549:デフォルトの名無しさん
07/05/23 22:03:38
そんなことはどうでもいいと思う
550:デフォルトの名無しさん
07/05/23 22:18:21
M$のABC構造体とかふざけた名前のやつを思い出した
551:デフォルトの名無しさん
07/05/23 22:21:55
フォントの幅だっけ?
552:デフォルトの名無しさん
07/05/24 09:39:23
ABCD包囲網だな。CとDがうぜえ
553:デフォルトの名無しさん
07/05/24 19:01:31
VC++2003でexeのプロジェクトを別のexeで参照設定する事はできますか??
554:デフォルトの名無しさん
07/05/24 19:30:29
---------------------------
Microsoft Development Environment
---------------------------
'○×△□.exe' への参照を追加できませんでした。 これは有効なアセンブリまたは
COM コンポーネントではありません。拡張子 'dll' を持つアセンブリまたは COM
コンポーネントのみを参照することができます。ファイルがアクセス可能で、有効な
アセンブリまたは COM コンポーネントであることを確認してください。
---------------------------
OK
---------------------------
555:デフォルトの名無しさん
07/05/24 19:52:25
COMコンポーネントじゃないので、できませんという事ですね。
ありがとうございます><
556:デフォルトの名無しさん
07/05/24 19:55:02
( ゚д゚)ポカーン
557:デフォルトの名無しさん
07/05/24 19:58:21
>>556
>>555とは別人だけど、違うの?
COMコンポーネントかDLLしか参照できないってことじゃないの……?
558:デフォルトの名無しさん
07/05/24 20:46:00
VC++2003で exeのプロジェクト を 別のexeで 参照設定する事
謎が多いな。 make の依存関係だけなのか、
別のexe が、元 exe をリンケージするのか
559:557
07/05/24 21:02:04
>>558
それは自分も思った。
ShellExecuteとかそのたぐいでいいじゃんてね。
でも、exeの参照の可否と、その有用性はとりあえず関係なくね?
560:デフォルトの名無しさん
07/05/24 21:19:31
>>557
exeでも参照できるよ
.NET Frameworkならね