09/03/01 21:31:09
>>236
死ねハゲ
238:デフォルトの名無しさん
09/03/01 21:31:47
反復処理とか繰り返し処理とか
239:デフォルトの名無しさん
09/03/01 21:47:20
リピート
240:デフォルトの名無しさん
09/03/01 22:14:30
>>228-231
見事な繰り返し処理
>>232は空気嫁
241:デフォルトの名無しさん
09/03/01 22:19:39
>>232
ssize_tとか、でもCでもC++でも標準ではないけど。
242:デフォルトの名無しさん
09/03/01 22:24:27
>>232
ptrdiff_tのこと?ポインタ同士の引き算の型だからちょっと違うが
243:デフォルトの名無しさん
09/03/01 22:34:14
>>241 >>242
そうだな。size_tでよかった。
244:デフォルトの名無しさん
09/03/03 05:50:11
まだ初心者なのですが、batファイルをC++builder6で
ボタンを押したら実行するようにしたいので
ShellExecute(Handle,"open",ファイル名.c_str,NULL,NULL,SW_SHOW);
と書いたのですが、うまくいきません・・・どなたか教えてくださいOTL
245:デフォルトの名無しさん
09/03/03 06:13:52
>>244
何故、どう巧くいかないのか書かないのですか?
246:デフォルトの名無しさん
09/03/03 06:28:56
実行はされるのですが(コマンドプロントが一瞬表示される)
バッチファイルの中身自体が実行されません;;
247:デフォルトの名無しさん
09/03/03 06:39:59
batの最後に
pause
入れとけ
248:デフォルトの名無しさん
09/03/03 07:00:46
>>247
ありがとうございます。
やってみたところ指定されたパスがありませんとのことでした。
普通にbatファイルを起動すると何も問題がないのですが・・・
原因などわからないでしょうか?
249:デフォルトの名無しさん
09/03/03 07:08:14
ファイルパスをちゃんと指定すればいいじゃん・・・
250:デフォルトの名無しさん
09/03/03 07:12:19
できました!
こんな時間に、質問に答えてくださりありがとうございました
大変助かりました。
251:デフォルトの名無しさん
09/03/03 18:34:32
以下のような感じで「*」の前後にスペースが
入っている場合もポインタの宣言なんでしょうか?
static unsigned int * ADDR;
スペースが、後だけのもは参考書にも紹介されていますが
前後両方ともスペースのものは見つかりませんでした。
よろしくお願いいたします。
252:デフォルトの名無しさん
09/03/03 19:01:49
vector<string> * const (&u)[buf]; // こんな感じですか?
253:デフォルトの名無しさん
09/03/03 19:06:04
>>251
おんなじ。空白類がいくらあろうと関係ない。
254:デフォルトの名無しさん
09/03/03 19:47:28
>>252
static unsigned int * ADDR;
全くこのままのコードです。
>>253
ご回答有難う御座いました。
もやもやしていましたが、これですっきりしました。
255:デフォルトの名無しさん
09/03/04 03:11:45
VC++9の質問です。Unicode環境で
Void Func(LPCSTR pMsg);
みたいな関数があって、ここに文字列を渡すのですが、
Func("xxx");
というように普通に書くと問題ないのですが、
Func(_T("xxx"));
とやると、
const wchar_t[3] から LPCSTRに変換できません、みたいなエラーが出ます。
全ての文字列を_T("") で括ればいいのかと思ってたのですが、違うのでしょうか?
256:デフォルトの名無しさん
09/03/04 03:14:42
>>255
_Tで括るのはLPC"T"STRのとき。
LPCSTRはconst char*のtypedefだから_Tは要らない。
257:デフォルトの名無しさん
09/03/04 03:25:58
>>256
なるほど、ありがとうございました。
258:デフォルトの名無しさん
09/03/04 13:36:24
初歩的過ぎてすいませんが...
すでに宣言してある配列の配列数を求めて
それと同じ配列数の配列を宣言するには
どうすればいいですか?
よろしくお願いします。
259:デフォルトの名無しさん
09/03/04 13:39:38
>>258
配列数はプログラム書いた人しか知らないから無理
それができたら配列のオーバーフロー管理も楽なんだけど
260:デフォルトの名無しさん
09/03/04 13:44:40
>>258
状況がよくわからん
261:259
09/03/04 13:44:42
sizeof(配列) / sizeof(型)
でいいか
マクロで定義して同じマクロ使うとか
262:デフォルトの名無しさん
09/03/04 13:49:06
char a[]={10, 10, 10};
char b[sizeof(a)];
int c[(sizeof(a)-1+sizeof(int))/sizeof(int)]
263:258
09/03/04 13:53:28
すいません言葉が足りなすぎました。。
int a[]= {1,2,...};
size=sizeof(a)/sizeof(a[0]);
int b[size];
として同じ配列数の新しい配列を宣言しようとしてもできません。
264:デフォルトの名無しさん
09/03/04 13:56:39
C++ なら const int size
Cなら int b[sizeof(a)]
265:デフォルトの名無しさん
09/03/04 13:57:14
>>263
size の型は何か
言語をいえ言語を
C か C++どっちだ
あとCならC89かC99なのか
266:デフォルトの名無しさん
09/03/04 13:57:33
>>263
コンパイラも
267:デフォルトの名無しさん
09/03/04 14:03:12
>>265
C++です。
size の型はintです
>>266
gccです。
268:258
09/03/04 14:08:43
const int size = sizeof(a)/sizeof(a[0]);
int b[size];
として宣言できました。
ありがとうございました。
269:デフォルトの名無しさん
09/03/04 15:03:27
配列の要素に変数が使える規格って無かったっけ
270:デフォルトの名無しさん
09/03/04 15:30:51
>>269
C99だろ
271:デフォルトの名無しさん
09/03/04 17:19:24
連立方程式のを渡したら戻ってくる関数ってありますか?
272:デフォルトの名無しさん
09/03/04 17:20:51
>>271
標準にはない
標準じゃなくていいならある
273:デフォルトの名無しさん
09/03/05 09:53:35
assert()と_ASSERT()ってなにか違いがあるのでしょうか?
274:デフォルトの名無しさん
09/03/05 10:11:11
assertはC/C++標準
結果としてabort()
_ASSERTはVC++独自
_CrtSetReportMode等で動作の調整が可能
275:デフォルトの名無しさん
09/03/05 18:14:15
メンバ関数のポインタの宣言はCxxx::*funcなのに
取得はCxxx::&funcでなく&Cxxx::funcなの?
&がなんで宣言の時の*の位置より移動するの?
276:デフォルトの名無しさん
09/03/05 18:40:47
>>275
発想としては、Cxxx::という修飾が
メンバへのポインタ型では*にかかっていて、
メンバへのポインタを得るときには、メンバ名funcにかかっている
ということのようだ。
277:デフォルトの名無しさん
09/03/05 18:51:32
俺としては逆なんだが
なんでCxxx::&funcなの?
どこのクラスのメンバ関数のアドレスか分からんが
278:デフォルトの名無しさん
09/03/05 20:41:28
大変だー
さっぱりわからん
279:デフォルトの名無しさん
09/03/05 20:43:44
>>278
何が分からないんだかさっぱり分からないぞ
280:デフォルトの名無しさん
09/03/05 20:44:43
>>275
単に文法的な曖昧さを除いた結果そうなっただけ。
class A {
public:
static void (*A::func)();
};
としてしまうと、static メンバ変数の実体定義がこうなってしまう。
void (*A::A::func)();
どっちがどっちの A:: やら分からん。
281:デフォルトの名無しさん
09/03/05 21:16:46
もうクラスのメンバ関数のポインタは無しで
282:デフォルトの名無しさん
09/03/05 22:09:09
9割くらいBoostやTR1のbind(暗黙のmem_fun)と一緒にしか使わない。
283:デフォルトの名無しさん
09/03/05 22:41:19
delegate パターンで使うね
284:デフォルトの名無しさん
09/03/06 01:31:13
じゃあdeleteパターンで
285:276
09/03/06 19:49:52
>>276, >>280
すみません、レス読んでも、それが
取得はCxxx::&funcでなく&Cxxx::funcなの?
の回答になるのか、さっぱり理解できないですが><
あと、&Cxxx::funcは&(Cxxx::func)としては良くないと本に書いてあるんですが
なんで良くないんですか?
286:デフォルトの名無しさん
09/03/06 20:12:15
なんか抽象クラスをインスタンス化できないらしいのですがどうすればいいですか?
派生クラスは無いのですが
その派生クラスの無い抽象クラスが型な引数をとる関数を使いたいのですが初期化?の方法がわかりません
287:デフォルトの名無しさん
09/03/06 20:16:31
>>286
まずは、その抽象クラスへのポインタ型か参照型を引数にしている?
288:デフォルトの名無しさん
09/03/06 20:24:22
>>287
ポインタ型を宣言してます、いろいろ上手くいかなかったのでポインタで宣言、元の抽象型で宣言、アドレスをポインタ型に代入→引数に
としてます、エラーメッセージはメンバが抽象型です、宣言を確認してください、です
289:デフォルトの名無しさん
09/03/06 20:27:48
>>286
派生クラスがない、ではなく、派生クラスは自分で作れということでは?
290:デフォルトの名無しさん
09/03/06 20:29:59
ああ、そうかもしれない
291:デフォルトの名無しさん
09/03/06 20:43:25
"派生クラスの無い抽象クラスが型な引数をとる関数"
これ、抽象クラスのインターフェイスを使って新しいクラスを作れということ
292:デフォルトの名無しさん
09/03/06 20:56:18
覚えておきます、ありがとうございました
293:デフォルトの名無しさん
09/03/06 22:13:20
>>285
普通の関数でも&(func)はよくないだろ?
そういうこと
294:デフォルトの名無しさん
09/03/06 22:51:58
>>293
普通の関数で、&funcを&(func)にするとコンパイルエラーにでもなるのか?
>>280 のvoid (*A::func)(); は何を宣言しているんだ?
本人はメンバー関数へのポインタ宣言のつもりなのかな
これだと、俺俺的にはfuncはスコープAにあり、引数void型で戻り型voidの関数を指すポインタの宣言してると解釈するんだが
つまり、funcは引数void型で戻り型voidの関数ならA::以外のでも受付OK
そうなると、funcはA::以外のでも受付OKなのにメンバー関数へのポインタ宣言ですって言えないよな
そうなるから、*Cxx::じゃなく、Cxx::*をメンバーへのポインタ宣言としているだろ
俺俺解釈間違ってる?
295:デフォルトの名無しさん
09/03/06 23:05:45
>>294
関数は式中に現れると関数ポインタに暗黙変換される
だから(func)はfunc関数へのポインタで、&(func)はそのポインタのアドレスになる
つまり関数ポインタへのポインタになる
そして(func)は右辺値だから、そんなものを使うとろくなことにならない
一方&funcは、関数が単項&演算子のオペランドの場合は関数ポインタに変換されないと特別に決まってるから
無事にfuncへのポインタが取れる
と、思ってたんだがよくよく読むと()の中身が関数の場合は特別に()を外しても関数になると決まっているらしい
だから&funcも&(func)も全く一緒だ
すまん
296:デフォルトの名無しさん
09/03/07 23:59:08
グローバル変数についての質問です。
C言語の参考書などには「グローバル変数は初期化をしなくてもはじめから0が入る」
と書かれていたので今まで特に初期化処理を追加せずに書いてきたのですが、
プログラムの途中でグローバル変数を初期化(中身を全て0にする)処理を入れる必要が出たので
//EDIT_DATAは構造体配列で事前にDATA EDIT_DATA[16][64][34][64]と宣言しています。
memset(EDIT_DATA, 0, sizeof(EDIT_DATA));
という処理を加えたところ途端にメモリの使用量が跳ね上がりました。
最初から0が入っているのであれば、新たに0を入れ直してもメモリの使用量はかわらないと思ったのですが、どうやら違うようなので
いったい初期化処理を行っていない宣言した直後のグローバル変数と
memsetを利用し初期化処理を行ったグローバル変数では何が違うのかを教えて頂きたいです。
297:デフォルトの名無しさん
09/03/08 00:16:13
おまいの使ってるOSが
書き込みが起こるまでは非初期化データ領域(BSS等と呼ばれる)には
アドレスを割り当てるだけで物理メモリは割り当てない仕様になっているから。
298:デフォルトの名無しさん
09/03/08 01:38:45
>>297
私の知識不足で非初期化データ領域や物理メモリと言われても、ぱっと理解できなかったのですが
以下のような考えでよいのでしょうか?
私の使っているOS(WinsowsXP)の場合
・関数内で宣言するローカル変数の場合
void main(){
int a; //この時点で非初期化データ領域に変数aの存在が知らされる。
printf("%d\n", a); //この時点では値を代入したわけではないので何が表示されるか分からない(物理メモリにはaが存在しないのでメモリの使用量は増えない)
a = 0; //値が代入された(これによりaには0という値が存在するということになり物理メモリに割り当てられメモリの使用量が増える)
printf("%d\n", a); //0が表示される(物理メモリにはaが存在する)
}
・関数外で宣言するグローバル変数の場合
int b; //この時点で非初期化データ領域に変数bの存在が知らされる。
void main(){
printf("%d\n", b); //0が表示される(物理メモリに割り当てられているわけではないがグローバル変数なので特別にbは0として扱える)
b = 0; //値が代入された(これによりbには0の値が存在するということになり物理メモリに割り当てられメモリの使用量が増える)
printf("%d\n", b); //0が表示される(物理メモリにはbが存在する)
}
299:デフォルトの名無しさん
09/03/08 06:38:13
>298
とりあえず環境依存の話だというのは認識しておいてくれ。
まずローカル変数とグローバル変数では確保されるメモリ領域が異なる。
ローカル変数は BSS には確保されない(スタックに確保される)。
非初期化データ領域への割り当てはコンパイラ、リンカによって行われるので実行時に
「知らされる」という表現はおかしい。
物理メモリの割り当ては OS、ローダが行う。
恐らく、書き込みじゃなくて読み込みでも物理メモリへの割り当ては発生すると思われる。
なので memset じゃなくてループで全領域に対してアクセスしてもメモリ使用量は増えないか?
「仮想記憶」でぐぐるといいと思う。
300:デフォルトの名無しさん
09/03/08 08:00:03
void fn(int x){~;};
void fn_nul(int){};
if(a){ fn(a);}
と
static void (*const_f[2])(int) = {fn, fn_nul};
f[(a>>3)&0x1](a);
どっちが効率いいかな?
301:300 訂正
09/03/08 08:01:30
static void (*const _f[2])(int) = {fn, fn_nul};
_f[(a>>3)&0x1](a);
302:デフォルトの名無しさん
09/03/08 08:08:17
>>299
やはり知識不足で具体的には理解できておらず、考えを上手く文字にまとめる事ができませんでしたが
ぐぐりつつ調べてみた結果、何となくではありますがイメージすることができました。
仰るとおりfor文でアクセスした結果もmemsetした際と同じ結果になりました。
もう少し時間をかけてじっくりと理解を深めていこうかと思います。
ありがとうございました。
303:デフォルトの名無しさん
09/03/08 10:23:48
CPUアーキテクチャ側から勉強するといいかもね。
俺は「はじめて読む486」という本が参考になった。
304:デフォルトの名無しさん
09/03/08 10:46:03
>>301
下の方が効率いい。
ただし、何かコメントしておかないと
可読性が低い。
305:デフォルトの名無しさん
09/03/08 17:01:16
>>303
CPUじゃなくOS
306:デフォルトの名無しさん
09/03/08 19:10:52
困ってます。教えてください。
1つはサウンドバッファ書き込み用のCALLBACK関数で、
もう一つはMAINスレッドにあるリードルーチン。
MAINスレッドにあるリードルーチンをある条件時に寝かせ、
CALLBACK関数側から寝てる状態を起こしたい処理なのですが、
何か良い方法ありますでしょうか?
sigwait()を使ってできそうなんだが、通常処理なので
signalは使いたくないのです。よろしくお願いします。
307:デフォルトの名無しさん
09/03/08 19:12:40
>>306
環境依存なので利用環境を書いてね
308:デフォルトの名無しさん
09/03/08 19:31:42
306です。
環境:linux. gcc version 4.3.2 ,SDL(Callback)
マルチスレッドではないのですが、CallBack関数側から、
MAINスレッドの寝ている状態を起こせないものかと、、、
MAINスレッドでやっている処理は、標準入力から
データ読み込み、固定領域にバッファリングしています。
バッファが一杯だったら、標準入力からの読み込みは
しないで寝かせたいのです。(BusyWaitやポーリングはNG)
gdk_input_addとgtk_mainの組み合わせで
とりあえずできたのですが、gtkを使うのは目的外かと、
よろしくお願いします。
309:デフォルトの名無しさん
09/03/08 20:08:54
>>308
pthread.h を覗いてみては?
pthread_cond_??? あたりでいけそう
310:デフォルトの名無しさん
09/03/08 21:11:29
>>309
サンクスです。チューw
pthread_cond_wait(&cond,&mutex);
pthread_cond_signal(&cond);
上記で実装しました。動作OKでした。
mutexの使い方は良く判りませんがこれから理解しておきます。
CPUもビジーウェイトにはなっていないのでOKです。ありがとうございました。
(DIONは書き込み規制はいってるの?)
311:デフォルトの名無しさん
09/03/09 03:45:12
ATL/WTLを参考にwindowsの簡易クラスライブラリ作ってみてるのですが
(ただのパクリですが・・・もちろん勉強のためです)
CStatic : public CWindow {
public:
CStatic(HWND hWnd) : CWindow(hWnd) {}
CStatic& operator=(HWND hWnd) { m_hWnd = hWnd; return *this; }
...
};
CStatic text = GetDlgItem(IDC_STATIC); // CWindow型を返す
などのCStaticコンストラクタの初期化がコンパイル通りません。
>error C2679: 二項演算子 '=' : 型 'class CWindow' の右オペランドを扱う演算子は定義されていません。(または変換できません)
考えてみれば派生クラスに基底クラス代入しようとしてるので当然の結果だと思うのですが
ATL/WTLではこれが上手くいっているのは何故なんでしょうか?
ATL/WTL見たことある方で分かられる方があればご教示ください。
312:デフォルトの名無しさん
09/03/09 04:09:36
CStatic& operator=(HWND hWnd)
それ以前にこれ間違ってね?
313:デフォルトの名無しさん
09/03/09 04:16:54
>>312
レスありがとうございます。
WTLのをそのまま流用したつもりでしたが;
どこが間違ってるのでしょうか?戻り値の参照ですか?
314:デフォルトの名無しさん
09/03/09 04:27:45
いや、それだけしかないなら
CStatic text = GetDlgItem(IDC_STATIC); // CWindow型を返す
これに当てはまるoperator=が無いじゃん
315:デフォルトの名無しさん
09/03/09 04:47:48
>>314
すみません、そもそもoperator=は今回関係ないみたいです。
コンストラクタの初期化で
CStatic text(GetDlgItem(IDC_STATIC));
CStatic text = GetDlgItem(IDC_STATIC);
上の2つは同じという認識だったのですが上だけコンパイル通ります;
CWindowでは operator HWND() const { return m_hWnd; } を持ってるので初期化構文でこれが適用されるかと期待したのですが。
316:デフォルトの名無しさん
09/03/09 10:11:14
IDC_STATICは実際にこう書いてるの?
IDC_STATICは-1でdefineされていて、こういう場面で使えないと思うけど。
317:デフォルトの名無しさん
09/03/09 19:02:57
>>316
遅くなりすみません。実際は違う値(オリジナルの値)です。すみません。
例えばATL/WTL解説で有名な↓ここ
URLリンク(home.att.ne.jp)
では CStatic view = GetDlgItem(IDC_STATIC_VIEW); としておられます。
318:デフォルトの名無しさん
09/03/09 20:03:55
>>315
コンストラクタにexplicit付いてんじゃねぇの
319:デフォルトの名無しさん
09/03/09 20:49:52
>>318
explicitは付けていません。変換コンストラクタについてもっと勉強が必要でしょうか;
試しに簡易コードで再現してみました。皆さんの環境ではコンパイル通りますでしょうか?
class A { // 基底クラス
public:
DWORD_PTR a; // データメンバ
operator DWORD_PTR() { return a; }
A(DWORD_PTR x = 0) : a(x) {} // コンストラクタ
A getData() { return A(a); } // 自クラスでキャスト
};
class B : public A { // 派生クラス
public:
B(DWORD_PTR x = 0) : A(x) {} // コンストラクタ
B& operator=(DWORD_PTR x) { a = x; return *this; }
};
A aaa;
B bbb = aaa.getData(); // NG
bbb = aaa.getData(); // OK
それともこの再現自体が間違ってるのでしょうか・・・?
320:デフォルトの名無しさん
09/03/09 20:53:33
>>319
class A に A(a)のコンストラクタは付けないの?
321:デフォルトの名無しさん
09/03/09 21:06:28
>>319
VC2008EEで通ったけど
322:デフォルトの名無しさん
09/03/09 21:42:54
class Aの中でコピイコンストラクタ俺タイプが隠してあるんじゃ?
323:デフォルトの名無しさん
09/03/09 21:59:40
[質問内容]
C++で、ヘッダに書いたクラスの宣言の中にあるstatic constなメンバ構造体、
メンバ配列についてお行儀のよい書き方を教えてください。
メンバ構造体の初期化値(たとえば、文字列 "hogehoge" や 10 や 20 といった値)は、cppで持つとして、
文字列や値は同様にメンバ変数として持つのか? それとも、
cppの上の方に無名空間で切った変数を新たに宣言するのか?
そもそも前提条件のstatic constな値を持つメンバ構造体や配列は、クラスに持たないで
cppの上の方に無名空間で値を作って、ポインタかなんかで受けるのが正しいのか?
ちょっと、わからないので教えてください。
324:デフォルトの名無しさん
09/03/09 22:34:42
static constならクラス内で初期化しない?
325:323
09/03/09 22:42:56
簡単に言うと、以下のようなクラスを考えてください。
<hoge.h>
class CHoge {
public:
CHoge(){}
~CHoge(){}
private:
enum { END = 10 };
static const int Array[END];
};
<hoge.cpp>
const int CHoge::Array[END] = {
0,1,2,3,4,5,6,7,8,9 //!< ←ここの値をどのように書くとお行儀がいいか?
};
>>324
レスありがとうございます。
その場合、マジックナンバなどはどこに宣言してありますか?
326:デフォルトの名無しさん
09/03/09 22:52:04
>>325
そのまま数値書いてコメント付けとけばいいんじゃねぇの。
その値をどういう意味があって、どう使うかわからんから
ケースバイケースとしか言いようが無いと思うけど。
327:323
09/03/09 23:05:52
>>326 レスありがとうございます。
ケースバイケースについて質問なんですが、ユーザーインターフェイスを作成するときにボタンがあったとします。
ボタンに表示する文字列とか,ボタンのサイズを持つ構造体配列を作ると
その構造体配列自体で、共通する値が出てきます。
<hoge.h>
class CHoge {
public:
CHoge(){}
~CHoge(){}
private:
enum { END = 3 };
struct BTN_TAG {
int X;
int Y;
int W;
int H;
char *Str;
};
static const BTN_TAG m_BTN[END];
};
<hoge.cpp>
const CHoge::BTN_TAG CHoge::m_BTN[END] = {
{ 100, 200, 200, 50, "ボタン1" }, //!< ここら辺の100とかの値
{ 100, 300, 200, 50, "ボタン2" },
{ 100, 400, 200, 50, "ボタン3" },
};
こういう場合は、どのようにするのがお行儀がいいでしょうか?
328:デフォルトの名無しさん
09/03/09 23:14:02
文字リテラル : リージョン の比次第だけどリージョン固定のクラス作れば?
329:デフォルトの名無しさん
09/03/09 23:26:46
>>327
そのまま100でいいんじゃないかなぁ。
200と50がデフォルトのボタン幅・高さとかだったり
頻繁に調整する必要があるなら、無名名前空間にでも定数作ればいいと思う。
でもまぁ俺だったら、UIの情報はプログラム中に書かず
リソースや外部ファイルに書いて実行時に読み込むけど。
330:デフォルトの名無しさん
09/03/09 23:27:48
>>328
返信ありがとうございます。
リージョン固定というのを不勉強で知らないのですが、
CHogeからのみ参照できる、statc constだらけのクラスと考えれば
いいでしょうか?
331:デフォルトの名無しさん
09/03/09 23:35:33
template<TwidthX, TwidthY>class Btn{
static struct{int x, y; char *c;}m_BTN[3];
}
追い出すメリットが勝つるメンバは追い出す。
332:デフォルトの名無しさん
09/03/09 23:46:04
>>329
返信ありがとうございます。
考え方として了解しました。
333:デフォルトの名無しさん
09/03/09 23:59:08
>>331
返信ありがとうございます。
Btnクラスを作って、CHogeで参照するということでいいでしょうか?
(CHogeがメンバクラス(Btn)をもつという解釈でいいでしょうか?)
templateにしている理由が理解できていないのですが、お時間があれば説明いただけないでしょうか?
334:デフォルトの名無しさん
09/03/10 04:18:48
class Game {
char **board;
public:
void init() {
board = reinterpret_cast<char**>(new char[9][9]);
}
};
こう書くとコンパイルは通るんですが、boardにはBadpointerの値が
入ってます。なにか間違ってますでしょうか?
335:デフォルトの名無しさん
09/03/10 04:36:16
何もかもが間違っているような・・・
なんでキャストしてるのん?
そして何ゆえそんな危険なキャストしてるのん?
あと、配列の配列は配列のポインタで受けることはできても
ポインタのポインタで受けることはできないよ?
っていうか、僕も初心者だから意味わからん^^
336:デフォルトの名無しさん
09/03/10 05:50:54
>>335
ありがとうございます。
char *p[10] = new (char*)[10];
とか出来なくて、あんなコードになってしまいました。
どうすればいいですか?
char **p;
char *p[10];
とかをnewで初期化するにはどうすればいいですか?
337:デフォルトの名無しさん
09/03/10 06:55:33
p = new char[10];
338:デフォルトの名無しさん
09/03/10 10:30:43
そもそもinit()を呼んでいるのだろうか。
339:デフォルトの名無しさん
09/03/10 13:26:15
char** p;
p = new char*[10];
340:デフォルトの名無しさん
09/03/10 15:44:07
void init(int sfx1,int sfx2){ // 素敵な cast をどうしても使いたい場合。
board = reinterpret_cast<char**>(new char[sfx1*(sizeof(char*)+sfx2)]);
for(int i = 0; i< sfx1; ++i)board[i] = new(reinterpret_cast<char*>(board)+sfx1*sizeof(char*)+(sfx2*i))char[sfx2];
}
341:デフォルトの名無しさん
09/03/10 16:09:07
>>340
何がなにやらわけわからんw
342:デフォルトの名無しさん
09/03/10 17:33:37
>>340 を理解した上で
char *p[10]; とは char* を 10個用意する事だよ と指摘されればポンと膝を打つ
って寸法だ。
343:デフォルトの名無しさん
09/03/10 18:27:00
newってtry-catchするのとnothrowするのどっちがいいの?
344:デフォルトの名無しさん
09/03/10 18:52:35
>>343
try-cathc も nothrowも付けずにほっとく
345:デフォルトの名無しさん
09/03/10 20:13:46
膝を打った後どっちに進むかは読み書きしたコード量に因るかな
346:デフォルトの名無しさん
09/03/11 01:31:35
ptr_arrayつかうか、吹っ切れてmallocに先祖返りするかってことかい?
347:デフォルトの名無しさん
09/03/11 01:48:32
パッディングの罠に嵌りに逝くか[]演算子のくっ付き方を考えるか
348:デフォルトの名無しさん
09/03/11 07:51:57
初心者が配列 new なんか使うんじゃねーよ。 std::vector にしとけ。
349:デフォルトの名無しさん
09/03/11 15:13:45
vector 使うのが正解
下手に深く判ってるコード書いて、おまけに手が遅かったりしたら上司に認められて
他人のクソコードをメンテする係に抜擢されちまうよ
350:デフォルトの名無しさん
09/03/11 15:37:46
C++ Coding Standradsでは
生の配列はクラス内部で小さなデータを持ちまわるような場合は使ってもいいって書いてたな、確か。
同じく、生ポインタも局所的な使い方なら可。スマポは便利だがやや使われすぎの嫌いがあるとも。
Googleコーディング標準ではスマポよりもまずスコポの使用を考えたら?って提案してた。
351:デフォルトの名無しさん
09/03/11 16:08:52
スコティッシュポールド
352:デフォルトの名無しさん
09/03/11 16:10:08
最近の若い子の省略はよくわからんのぉ
353:デフォルトの名無しさん
09/03/11 16:13:29
シコスでは
生配はクラ内で小デを持ちまわるような場合は使ってもいいって書いてたな、確か。
同じく、生ポも局所的な使い方なら可。スマポは便利だがやや使われすぎの嫌いがあるとも。
グルコではスマポよりもまずスコポの使用を考えたら?って提案してた。
354:デフォルトの名無しさん
09/03/11 16:22:02
スコポ の検索結果 約 495 件中 1 - 10 件目 (0.43 秒)
スマポ の検索結果 約 1,710 件中 1 - 10 件目 (0.09 秒)
355:デフォルトの名無しさん
09/03/11 17:25:01
>>350
scoped_ptrもスマートポインタの一種だよ。
356:デフォルトの名無しさん
09/03/11 18:42:06
局所的、たとえば小さな関数内とかじゃ、なまぽで良いだろ
出来れば、ぽんたを扱わないで良い言語を使い、でC++で無いといけないところだけ
達人がその部分をプログラムする。
357:デフォルトの名無しさん
09/03/11 18:47:38
スマポってのも曖昧な言葉だな
auto_ptrなんか心情的にはそう呼びたくないけど一応スマポだし
*とかが使えるからってイテレータまでスマポ呼ばわりする奴もいるし
逆にshared_ptr以外はスマポじゃないって奴もいるし
スマポって何?
358:デフォルトの名無しさん
09/03/11 18:50:02
アホコードを書くDQNを隔離しておくための足かせ
359:デフォルトの名無しさん
09/03/11 19:00:48
ポインタのような動きをするものは全てスマートポインタ
具体的に言うと*とか->が使える生ポインタ以外の物
360:デフォルトの名無しさん
09/03/11 19:02:12
そーなのかー
361:デフォルトの名無しさん
09/03/11 19:20:52
>>358
お舞! それは絶対に正しい。
ポインタすら使えない、つまりC++を扱ってはいけないような奴に、
C++を使わせるのに必要なものだよな
362:デフォルトの名無しさん
09/03/11 19:27:16
自己も相対的にDQNかも知れない場合に備え
自主的に足かせを装着する訳だが
363:デフォルトの名無しさん
09/03/11 20:32:27
>>362
ですよね~。
364:デフォルトの名無しさん
09/03/11 21:43:09
ほんとDQNですみません。
365:デフォルトの名無しさん
09/03/12 02:06:14
ここでC++の勉強法を質問するのはスレ違いでしょうか?
それらしいスレがなかったので、一度ここで聞いてみようかなと…
独学のため、先輩方の意見などをお聞きしたいと思っています。
366:デフォルトの名無しさん
09/03/12 02:54:55
おれも知りたいかも
Cやったら、ビジネス的な意味とオブジェクト指向を学びたいので、次はJavaに行くべきか、C++もやったほうがいいのか、迷う
C++は、モノにするには、やる範囲が広そうだし、Javaなのかな
ビジネス的な意味でC++,C#,Javaの位置付けってどういうもんなんですか?
367:デフォルトの名無しさん
09/03/12 06:58:49
スレ違い
368:デフォルトの名無しさん
09/03/12 12:20:28
まずビジネス的な意味というのがわからん訳だが
369:デフォルトの名無しさん
09/03/12 19:44:28
Windows上のC++の質問なんですが、プロパティの中のコード生成のランタイムライブラリーには
/MT
/MTd
/MD
/MDd
の4つの選択肢がありますが、デフォルトは/MDdだと思いますが、本のサンプルを実行する際に、
/MTdに変更するように指示があり、実際変更しなければコンパイルできませんでした。
どういう場合に/MTdにしなければだめになるのでしょうか?
370:デフォルトの名無しさん
09/03/12 20:13:31
>>369
ソリューションの構成をDebugからReleaseにする
ツールバーの下にDebugっていうドロップダウンリストがあるからそこで切り替えろ
371:デフォルトの名無しさん
09/03/12 20:22:34
ネットワーク共有ファイルに対してFindFirstFileを行うにはどうすればよいのでしょうか?
例えば
\\Server\folder\test.txt
にあるファイルに対して
FindFirstFile( "\\\\Server\\folder\\test.txt",&data );
とやっても失敗になってしまいます。
ショートパスからロングパスにしたいのですが、、、、
372:デフォルトの名無しさん
09/03/12 21:58:54
ドライブにマウントしてから x:\test.txt とかでアクセスすればいいのでは?
373:デフォルトの名無しさん
09/03/13 14:45:20
2chトリップ生成プログラム教えてください。
ライブラリ作った人とかいますか?
374:デフォルトの名無しさん
09/03/13 15:17:00
団子さんの出番ですね!!
375:デフォルトの名無しさん
09/03/13 15:21:22
やばい、>>374と同じ事が頭に浮かんだ
376:デフォルトの名無しさん
09/03/13 15:37:46
>>373
2chのトリップと互換のPHPやらPerlやらの掲示板ソースでも探したらあるよ
377:デフォルトの名無しさん
09/03/13 15:40:55
[環境]C++ WindowsMobile向けアプリ(練習でデスクトップ版を作ります)
GoogleCalendarとの同期を取るアプリを作りたいんですが、
最初の認証(ユーザーアカウント&パスワード)をどうやって投げれば
いいのかご存知の方いらっしゃいましたら、ご教授願えないでしょうか?
378:デフォルトの名無しさん
09/03/13 15:44:06
>>373
PHPのを探してきた
$trip = '';
if (preg_match("/([^\#]*)\#(.+)/", $_POST['FROM'], $match)) {
$salt = substr($match[2]."H.", 1, 2);
$salt = preg_replace("/[^\.-z]/", ".", $salt);
$salt = strtr($salt,":;<=>?@[\\]^_`","ABCDEFGabcdef");
$trip = substr(crypt($match[2], $salt),-10);
$_POST['FROM'] = $match[1].'</b>◆'.$trip.'<b>';
}
cryptがDESかMD5かで結果が変わる
379:デフォルトの名無しさん
09/03/13 15:55:43
>>373
Cのソースがあった
URLリンク(www.geocities.com)
380:デフォルトの名無しさん
09/03/14 20:40:26
using namespace std;
とソースの上に書くのと、
ソース全体を
namespace std {
...
}
というようにnamespaceの中に書くのとは、同じ意味ですか?
381:デフォルトの名無しさん
09/03/14 20:45:14
違います
382:デフォルトの名無しさん
09/03/14 21:00:19
ありがとうございます。
どう違うか、教えてください。
383:デフォルトの名無しさん
09/03/14 21:04:06
利用と宣言の違い棚。
384:デフォルトの名無しさん
09/03/14 21:11:37
わかりました。
後者の場合stdの中で宣言するというだけなので、Main関数を入れたりとかは
できないということですね。
ありがとうございました。
385:デフォルトの名無しさん
09/03/14 21:22:45
std 名前空間内に自分で宣言を追加してはいけない。
規格上未定義動作になる。
386:デフォルトの名無しさん
09/03/15 00:23:57
std::swapの特殊化は置いてもいいけどね。
387:デフォルトの名無しさん
09/03/15 00:31:35
std::swapの特殊化じゃなくて、テンプレートの完全特化が許されてるってことね
388:デフォルトの名無しさん
09/03/16 01:03:47
stringのvectorにファイルを一行づつ読み込んで、まとめて別のファイルに書き込むというプログラムを作ってるんですけど
エラーチェックは↓見たいな感じで十分ですかね?
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
using namespace std;
void read(char *file, vector<string> &lines);
void write(char *file, vector<string> &lines);
int main(void)
{
vector<string> lines;
read("C:/Work/from.txt", lines);
write("C:/Work/to.txt", lines);
cout << "正常終了" << endl;
return 0;
}
389:デフォルトの名無しさん
09/03/16 01:04:39
void read(char *file, vector<string> &lines)
{
ifstream ifs(file);
if(!ifs.is_open()){
cout << "コピー元ファイルを開けない" << endl;
exit(EXIT_FAILURE);
}
while(ifs.good()){
string line;
getline(ifs, line);
lines.push_back(line);
}
if(!ifs.good() && !ifs.eof()){
cout << "読み込み途中でエラー" << endl;
ifs.close();
exit(EXIT_FAILURE);
}
}
390:デフォルトの名無しさん
09/03/16 01:05:31
void write(char *file, vector<string> &lines)
{
ofstream ofs(file);
if(!ofs.is_open()){
cout << "コピー先ファイルを開けない" << endl;
exit(EXIT_FAILURE);
}
vector<string>::iterator i = lines.begin();
while(ofs.good())
{
ofs << *i;
if(++i == lines.end())
break;
ofs << endl;
}
if(!ofs.good() && !ofs.eof())
{
cout << "書き込み途中でエラー" << endl;
ofs.close();
exit(EXIT_FAILURE);
}
}
391:デフォルトの名無しさん
09/03/16 01:39:45
while (!feof()) {}
と同じ匂いを感じる。
ところで、
while (...) {
string str;
...
}
より
string str;
while (...) {
...
}
の方が、コンストラクタとデストラクタが毎回走らない分、コスト的には良いよね?
でも、スコープを限定した方が可読性等の面からは好ましいよね?
どっちが良いのかな。
392:デフォルトの名無しさん
09/03/16 01:44:22
その辺を言い出したらvectorから見直しだけどな。
393:デフォルトの名無しさん
09/03/16 02:11:37
>>391
{string str; while(...){...}}
394:デフォルトの名無しさん
09/03/16 02:26:56
for(string str; ifs.good();)
395:デフォルトの名無しさん
09/03/16 02:36:54
初期化がループに依存しないならコンパイラが良きに計らってくれると思うよ。
396:デフォルトの名無しさん
09/03/16 02:40:10
getline(,)後!ifs.good()でも1回push_backしちゃうのはマズくないか。
397:デフォルトの名無しさん
09/03/16 07:38:25
VC++9での質問です。
あるライブラリをインクルードする必要があるのですが、
ソース中に #pragma comment(lib, "ライブラリ名") と書くと、LNK2005のエラーが出ます。でも、
プロジェクト→プロパティ→リンカ→追加のライブラリ
のところに「ライブラリ名」を書くとLNK2005は出なくなりコンパイルできます。
リンクの順序が関係してるのかと思ったのですが、よくわかりません。
どういう基準で方法を選べばいいですか?
398:デフォルトの名無しさん
09/03/16 07:41:35
>>397
ライブラリのパスを通せばいいと思う
399:デフォルトの名無しさん
09/03/16 07:50:49
>>398
ありがとうございます。
ライブラリは見えてます。LNK2005は、同じライブラリを複数回リンクしようとした、
というエラーみたいなのです。自分の場合、
unsigned int *a = new unsigned int(100);
みたいな行がエラーになります。でもLNK2005が出ないやり方でリンクすると
この行も問題なくコンパイルされます。
書いてて思ったのですが、追加のライブラリのところにライブラリ名を書くと、
Visual Studioがリンクの順序を勝手に調整してくれるんですかね?
400:デフォルトの名無しさん
09/03/16 13:38:45
あるテーブルより、KOJIN_ID(数値型8桁)を一旦ホスト変数H_KOJIN_IDに入れ
それを11桁の文字型として出力しなければいけないのですが(余った桁はスペースで埋める)
下記のようにsprintf関数を使ってH_KOJIN_IDから、ファイル書き出し用構造体outの項目KOJIN_IDに
セットするときに、現状のままだと余った桁に0が入ってしまいます。
データセット部
sprintf(out.KOJIN_ID,"%11.11ld",H_KOJIN_ID);
余った桁に半角スペースが入るようなsprintf指定方法はありませんか?
401:デフォルトの名無しさん
09/03/16 14:41:57
>>399
もしかして複数ファイルに分けてる?
スタティックライブラリの関数名がダブってるような気がする
402:デフォルトの名無しさん
09/03/16 14:44:55
>>400
いってる意味がよく分からないけど
%11ld または %-11ld でいいのかな?
403:デフォルトの名無しさん
09/03/16 16:44:14
400です。
おかげさまで解決です。
404:デフォルトの名無しさん
09/03/16 16:54:03
おかげさまってマルチでよそで答えもらっただけだろ。
405:デフォルトの名無しさん
09/03/16 20:22:15
std::cinで矢印キーの入力を取得することはできますか?
406:デフォルトの名無しさん
09/03/16 20:29:07
質問です
WM_NCHITTESTをフックしたいのですが
SetWindowsHookEXの中のどの項目ならフックできるでしょうか?
407:デフォルトの名無しさん
09/03/16 22:16:04
>406
>The WM_NCHITTEST message is sent to a window when the cursor moves
より、このメッセージは Send される。
従って WH_CALLWNDPROC か WH_CALLWNDPROCRET だが、いずれもメッセージを調べるだけで変更することはできない。
別途処理したいならサブクラス化とかが必要。
408:デフォルトの名無しさん
09/03/16 22:17:02
っつーか、Win32API質問箱の管轄だな。
409:406
09/03/16 22:53:13
>>407
ありがとうございます。
メッセージの変更ができなかった謎も解けました。
410:デフォルトの名無しさん
09/03/17 00:11:37
const stringのイテレーターってどうやって宣言するんでしょうか?
std::_String_const_iterator<char,std::char_traits<char>,std::allocator<char>> でイテレーターを宣言すればうまくいくんですが、もっとスマートな書き方が知りたいです
411:デフォルトの名無しさん
09/03/17 00:13:31
>>410
#include <string>
412:デフォルトの名無しさん
09/03/17 00:15:06
>>411
#include <string>はちゃんとしてます
413:デフォルトの名無しさん
09/03/17 00:17:51
>>412
ならイテレータの宣言は済んでる。
何がしたいのかよくわからん。 std::string::const_iterator i; みたいにイテレータ型の
変数を宣言したいってこと?
414:デフォルトの名無しさん
09/03/17 00:19:17
あ、const_iteratorってやるんですね。解決しました。ありがとうございます
415:デフォルトの名無しさん
09/03/17 00:19:30
const stringのイテレータという言い方は無い。
stringのconst_iteratorならstd::string::const_iteratorで宣言できる。
416:デフォルトの名無しさん
09/03/18 17:14:42
newが失敗するのってメモリが足りない時以外にどんな状況が考えられますか?
417:デフォルトの名無しさん
09/03/18 17:27:57
何をnewするかに拠る
418:デフォルトの名無しさん
09/03/18 17:42:35
コンストラクタがエラー投げてることもある
419:デフォルトの名無しさん
09/03/18 17:46:41
そもそもメモリが足りてなくても失敗するとは限らない。
420:デフォルトの名無しさん
09/03/18 18:52:06
STLの出す例外一覧みたいなのってありませんか?
421:デフォルトの名無しさん
09/03/18 19:54:38
これ格納すればあらゆる例外投げてくれるよ
struct Hoge{
Hoge(){throw new MyFavoriteException;}
};
422:デフォルトの名無しさん
09/03/19 16:14:20
そうかなあ
423:デフォルトの名無しさん
09/03/20 02:41:10
VC++でCGIを作ってます(ただの興味本位です
HTMLの文字コードはUTF-8にしたいので、文字列リテラルの文字コードをUTF-8にするために、
ソースコードをUTF-8で保存して、コンパイルしました。
すると「現在のコードページで表示できない文字を含んでます。Unicode形式で保存してください。」という警告が出て、
更に文法エラーが出てきてコンパイルできませんでした。
ソースコードにBOM付けてコンパイルしたら成功しましたが、出力された文字列は何故かShift_JISになってました。(VC++が日本語版だから?
文字列にUTF-8を使うことは不可能なんですか?
424:デフォルトの名無しさん
09/03/20 03:11:19
ソースファイルの文字コードとプログラムの出力は別物
ソースはShift_JISでもUTF-8でもコンパイルすれば内容は同じ
で、出力をUTF-8にするためにはプログラムで文字列を組み立ててから
最後にUTF-8に自力で変換してやらなくてはいけない
UTF-8への変換はWin32APIを使う必要がある
たぶんIMultiLanguage2のあたりつかえばできると思うので検索して調べてみてくれ
あと、Shift_JIS以外の文字コードをstdoutに出力するなら、stdoutをバイナリモードに
する必要があるような気がするので、fprintfとかfwriteの前に以下のようなコードが必要かも
setmode( fileno(stdout), O_BINARY );
425:デフォルトの名無しさん
09/03/20 04:28:22
2005以降なら、fopenなどでccs=UTF-8を付加すればいいのではと思う
426:デフォルトの名無しさん
09/03/20 12:00:07
あー、fopenなんてここ何年も使ってないからすっかり忘れてたわ
427:デフォルトの名無しさん
09/03/20 13:06:36
環境依存しない方法で変換するにはどうすればよかろうの?
428:デフォルトの名無しさん
09/03/20 13:15:48
無理
環境ごとに#ifdefしまくるのが精一杯
429:デフォルトの名無しさん
09/03/20 13:45:03
CGIやるならLinuxだろ
>>425
stdoutには使えないよね
430:デフォルトの名無しさん
09/03/20 15:38:25
ソースが Shift_JIS なら、環境に依存してない。
431:デフォルトの名無しさん
09/03/20 16:55:09
Visual Studioで画面に複数のソースを表示させる方法ってありますか?
Source.cppとSource.hを横に並べて表示したいんですが、、
432:デフォルトの名無しさん
09/03/20 17:01:15
タブを右クリ→垂直タブグループの新規製作
433:デフォルトの名無しさん
09/03/20 17:04:01
すごい、出来ました!
ありがとうございました。
434:デフォルトの名無しさん
09/03/20 23:07:02
URLリンク(page4.auctions.yahoo.co.jp)
435:デフォルトの名無しさん
09/03/21 13:22:55
opendialogを使うと
ShellExeCuteを使いバッチファイルを起動すると
パスが見つからなくなってしまいます。
opendialogを使わない状態でバッチファイルを起動すると大丈夫でした。
何かディレクトリを指定するようなコマンドがあったら教えてください。
436:デフォルトの名無しさん
09/03/21 14:24:00
chdir
437:デフォルトの名無しさん
09/03/21 14:42:32
436>>
バッチファイルのほうで探したら見つかりました
ありがとうございます。
438:デフォルトの名無しさん
09/03/21 20:56:55
Visual C++の質問なんですが、
新規プロジェクトを作成した後、ソリューションエクスプローラーでフォルダを追加して、そのフォルダの中に
ソースファイルを追加しました。でも実際にはそのフォルダは作られてなくて、プロジェクトのフォルダのトップに
全部のファイルが存在してました。ソリューションエクスプローラーからフォルダを追加しては駄目だったので
しょうか?
439:デフォルトの名無しさん
09/03/21 20:59:56
ファイルシステム上のフォルダとは別物だ。
440:デフォルトの名無しさん
09/03/21 21:03:40
>>439
ええーそうなんですか、、、と思ってもう一回見てみたら追加されるのはフィルタになってました。
じゃあ、プロジェクト内にソースを入れておくフォルダを作るにはどうすればいいですか?
ソースを追加するときに新規フォルダを作っても、ソリューションエクスプローラからは見えません
でした。
フィルタって何の意味があるんだろう。。
441:デフォルトの名無しさん
09/03/21 21:10:07
自己レスです。
自分なりに考えてみたのですが、ソース追加時に新規フォルダーを作ってそちらにソースを追加した場合、
フィルターもあわせて設定すれば、やりたいことができそうです。
でも途中でフォルダ名を変更しようとすると面倒そうですが、、、。
プロジェクトのトップに全ファイルが置かれるのがいやなのですが、皆さんはどうされてますか?
442:デフォルトの名無しさん
09/03/21 21:21:54
hoge/srcフォルダにソースもヘッダもぶち込む
443:デフォルトの名無しさん
09/03/21 21:51:18
>>442
ありがとうございます。なんか、そっちのほうがいいのかと思えてきました。
自分のプロジェクト内には、DaemonとCommandという2つのフォルダがあって、それぞれの中に
PrintInfo.cppというのがあるのですが、ビルド時にPrintInfo.objというのが重なってるせいか、
リンクでエラーになります。(LNK2019とかLNK2001とか)
同じ名前のソースが1つのプロジェクト内にあると、フォルダをわけてもよくないのでしょうか?
何度もすいません。
444:デフォルトの名無しさん
09/03/21 22:13:52
URLリンク(image.space.rakuten.co.jp)
445:デフォルトの名無しさん
09/03/21 22:23:20
>>444
浦賀湾のあたり?
解決しました。
出力ファイルのオブジェクトファイル名を変更すればできました。
ただ、両方のPrintInfo.cppに対して、オブジェクトファイル名を手動で指定
しないとだめなのが、分かりにくかった。
片方だけ手動で変更すればいいんじゃないか、、と思ったんですが。
ありがとうございました。
446:デフォルトの名無しさん
09/03/21 22:33:42
>>444
テラナツカシス
447:デフォルトの名無しさん
09/03/22 13:01:45
昨日VSいれてみました。いきなり分りません。
System::Object^
の^ってなんですか
448:デフォルトの名無しさん
09/03/22 13:12:49
>>447
C++の入門書買ってくるか入門サイトを見て最低限の知識をつけろ
449:デフォルトの名無しさん
09/03/22 13:12:55
検索すればわかることだと思うけれど、
URLリンク(www.google.com)
の3番目
450:デフォルトの名無しさん
09/03/22 13:27:51
C++builderでTreeViewを使っているのですが、子を持つノードだけそのままの位置にして
他のノードのみをソートしたいのですが、alphasortだと全て並び変わってしまい
うまくいきません。
何か良い方法があったら教えてください。
451:デフォルトの名無しさん
09/03/22 13:34:07
C++の入門書には載ってないだろうな。
C++/CLIの入門書嫁。
452:デフォルトの名無しさん
09/03/22 13:54:28
CLIだったのか。どうりで。
ありがとね。
453:デフォルトの名無しさん
09/03/22 15:29:42
int hoge(int n) { return n; }
int hoge(const int n) { return n; }
int hoge(int &n) { return n; }
int hoge(const int &n) { return n; }
だと、2番目だけコンパイルできないんですけど、どうしてなんでしょうか。
呼び出すときに、結局intを丸ごとコピーして引数に渡すので、呼び出し元では
int であろうがconst int であろうが区別していないのでしょうか。
454:デフォルトの名無しさん
09/03/22 15:41:21
>>453
そう。関数引数の型としてはトップレベルの const は無視され、区別されない。
ただし定義においてはローカル変数への const と同様に働く。
455:デフォルトの名無しさん
09/03/22 16:58:39
暗号の本で一通りのアルゴリズムのようなものは理解したのですが、
Cに組み込むにはどうすればいいのでしょうか?
アセンブリはやったことがないのですが、Cプログラムを逆アセンブルすると簡単にバレたりしませんか?
たとえば全てのバイトにn加算するという暗号化を施す場合、
その加算するという処理、nという数値が逆アセンブルによって解ると思うのですが、
そうさせないために何か対策する必要はないのでしょうか?
456:デフォルトの名無しさん
09/03/22 17:04:17
アルゴリズムが判明して脆弱になるような暗号は、その時点で脆弱なのです。
457:デフォルトの名無しさん
09/03/22 17:21:23
例が悪かったですね。
AES等安全性の確立されたアルゴリズムを使うことを前提とします。
ある暗号化されたデータをプログラムで読み込み複合化する場合、プログラムコードに鍵を含める必要がありますよね。
その鍵は逆アセンブル等で簡単に解ったりしないんですか?
458:デフォルトの名無しさん
09/03/22 17:24:55
>>457
分かります
AES暗号化を使っていることが分かるだけでも
どこを調べればいいか分かってしまいます
ある程度以上は諦めるしかないです
459:デフォルトの名無しさん
09/03/22 18:09:08
MFCでアプリを作っているのですが、
動作確認のため、コンソールも起動しております。
_cprintf_sや_cscanf_s関数を使っているのですが、
_cscanf_s関数でバックスペースのキーを入力すると、
プログラムが無限ループで暴走してしまいます。
普通のscanf()関数のようにバックスペースで一つ前の文字を削除するには
どうすればよいでしょうか?
460:デフォルトの名無しさん
09/03/22 18:53:39
#include <iostream>
int main(){return 0;}
というプログラムなんですが、プロジェクトを新規作成するときに、
(1)最初から空のプロジェクト
(2)Win32プロジェクトを選択して、空のプロジェクト
という2つの方法でやると、(1)はコンパイルできるのですが、(2)だとコンパイルが
通らず、LNK2019というエラーになります。
この2つの方法って何が違うのでしょうか?
461:デフォルトの名無しさん
09/03/22 18:55:39
Win32プロジェクトはGUIプログラム用です
462:デフォルトの名無しさん
09/03/22 19:01:50
>>460
プロジェクトのプロパティをよく比較するとわかるが、いくつかの初期設定が異なっている。
そのエラーの元になっている違いはエントリポイントの違い。
Win32プロジェクトでは、main()の代わりにWinMain()という関数からプログラム開始する。
他にもコンソールが表示されるかとかプリプロセッサ定義とか諸々も違う。
463:デフォルトの名無しさん
09/03/22 19:24:03
>>461-462
ありがとうです。
でもmainをWinMainに書き直しても駄目でした。
>他にもコンソールが表示されるかとかプリプロセッサ定義とか諸々も違う。
本当にほかにも色々違うんですね。
464:デフォルトの名無しさん
09/03/22 20:09:48
#include <windows.h>
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {return 0}
これが一応の最小プログラムね
Windowsプログラミングでは初めて見る型がたくさん出てくるけど
ほとんどtypedefしただけだから、惑わされずに命名規則と元の型を覚えるといいよ
465:デフォルトの名無しさん
09/03/22 20:15:12
>>464
何のためのtypedefだよ…
466:デフォルトの名無しさん
09/03/22 20:23:08
typedef元の型が変化しても書き直す必要をなくすため
467:デフォルトの名無しさん
09/03/22 20:26:11
個人的にはAPIENTRYの方が好きだなあ
468:デフォルトの名無しさん
09/03/22 22:28:20
可読性のためだろ
469:デフォルトの名無しさん
09/03/23 00:16:56
memcpy.asmの
mov [edi],al ;U - write second byte to destination
でエラーが発生してしまいます。なぜでしょうか?
以下 プログラムです。
class ErrorDiffusion{
public:
ErrorDiffusion(int campussize);
~ErrorDiffusion();
void Upperandlowerreversing(int width,int height,unsigned char *Grey);
private:
unsigned char *Output;
};
//上下反転
void ErrorDiffusion::Upperandlowerreversing(int width,int height,unsigned char *Grey)
{
int i,flag=1;
printf("上下反転\n");
for(i=0;i<height;i++)
{ //printf("memcpy mae\n");
memcpy(&OutPut[(height-flag)*width],&Grey[i*width],width);
//printf("%d loop\n",i);
flag++;
}
}
//ここで関数を呼んでいます。
errordiffusion.Upperandlowerreversing(width,height,&Grey[0]);
470:デフォルトの名無しさん
09/03/23 00:47:52
private:
unsigned char *Output; にして、コンストラクタで、メモリを確保していて
NULLにはなっていないのですが・・。privateへのアクセスは、普通に
Outputでいいはずだとおもうのですが違うのかな?
471:デフォルトの名無しさん
09/03/23 01:09:47
自己解決しまsちあ
472:デフォルトの名無しさん
09/03/23 09:55:51
ifstream ifs(filename, ifstream::binary);
Windows環境で、Ifstreamの読みこみで、Ifstream::binaryを書かなかったら
どうしてだめなのでしょうか?
473:デフォルトの名無しさん
09/03/23 10:16:20
テキストファイルの読み込みとか、書かなくてもいい場合があるじゃん。
Cの"r" "rb" と同じ関係。
474:デフォルトの名無しさん
09/03/23 10:58:52
>>473
ありがとうです。テキストファイルの読み込みの場合は書かなくていいんですね。
ついでにあと1個質問させてください。
Ifstream.seekg()で、
Ifstream.seekg(0,ifstream::end)
Ifstream.seekg(ifstream::end)
はどうちがいますか?どっちもコンパイルできるし、意味も同じっぽいんですけど、、、
475:デフォルトの名無しさん
09/03/23 11:02:37
>>474
省略時はどの値を渡したのと同じってのを意識するといい。
476:デフォルトの名無しさん
09/03/23 11:36:04
>>475
なるほど。
省略時は0を渡したのと同じですね。
477:デフォルトの名無しさん
09/03/23 11:46:00
念のため書くけど、省略時にどの値を採用するかはその関数を書いた人が決めるのよ。
さっきのIfstream::binaryも同じ
478:デフォルトの名無しさん
09/03/23 12:35:15
>>477
本当ですね。
VC9++で試したら、ゼロじゃなかったです。
どういう値になっているのか調べられなかったけど、
ちゃんと読めてなかったです。
479:デフォルトの名無しさん
09/03/23 12:50:29
ああそうか、binary modeとcooked modeはCP/M、ひいてはMS-DOSの
ためにC言語時代から受け継いでいる伝統だったな
unix系は意識不要
480:デフォルトの名無しさん
09/03/23 14:42:51
おまえFTPとか知らないだろ
481:デフォルトの名無しさん
09/03/23 14:54:43
File Transfer Proturk がどうかなさいましたか?
482:デフォルトの名無しさん
09/03/23 15:09:04
TDateTime now = Date();
String hiduke=DateTimeToStr(now);
SaveDialog1->FileName=hiduke;
日付をFileNameのところに表示したいのですが、上記のようにやっても
うまくいきません原因の分かる方教えてくださいー。
483:デフォルトの名無しさん
09/03/23 15:39:00
482です
解決しました
2009/03/23の
/がダメだったようです。
484:デフォルトの名無しさん
09/03/23 22:00:05
free(array);
すると、プログラムが止まってしまいます。
メモリは確保しているし、なぜfreeするとエラーになるかわからないです
メモリのエラーはerrorno でチェックしろとかいてあったのですが
どうやってチェックすればいいかサンプルコードをください
485:デフォルトの名無しさん
09/03/23 22:07:14
エスパーさんたのみます!
486:デフォルトの名無しさん
09/03/23 22:13:31
間違えたアドレスを開放しようとしてる
487:高橋
09/03/23 22:15:23
>>485
情報がこれだけじゃ、いかに魔美くんでも無理だよ。
488:Cの達人
09/03/23 22:27:56
Cの達人と申します。
ネイティブCのことなら、お任せください。
by Cの達人
489:デフォルトの名無しさん
09/03/23 22:29:38
URLリンク(www.kouno.jp)
490:デフォルトの名無しさん
09/03/23 22:35:46
TCPで他のマシンから要求を受け付けるサーバーを書いてるのですが、過去の一定の時間内(例えば1時間)で処理した
要求の上限を設定(例えば100個まで)して、それ以上は処理しない(要求を受け付けるだけ)ようにしたいと思ってます。
そこで、受け付けた全要求の{受け付けた時間、処理が終わった時間}という構造体を作って、それをダブルリンク
リストにつないで置くようにしました。新しい要求が来たらそのダブルリンクを回って、処理が終わってから1時間
たってないものの数をカウントして、処理する/しないを決めます。
ところがこれだと要求の数が増えると(10万件とか50万件とか)、どんどん重くなるのですが、何か良い方法はない
でしょうか?こういう処理って結構色々な場面で使われると思うのですが。
よろしくお願いします。
491:デフォルトの名無しさん
09/03/23 22:38:48
10万とかのオーダーになったら、DB 使うことを考えちゃうな。
492:デフォルトの名無しさん
09/03/23 22:43:43
>>490
deque を使ってみるといいよ
新しい要求がきたときに
1.一番古い [0] の時刻が1時間より前だったら pop_front で削除
2.1.で削除が行われた場合1.に戻る
3.deque のサイズが 100 未満であれば要求を受け付ける
4.deque に push_back で追加
最近同じような質問があった気がする
493:デフォルトの名無しさん
09/03/23 22:50:42
>>491
DB使ったほうがいいですかね。
出来るだけ軽い処理で実装しろと言われてて、自分はCで実装してるのですが、、、
上限を過ぎた要求は拒否しちゃえばいいのかな、、。でも拒否された方にいつ
リトライすればいいか教えるのも面倒だし。一応、受け付けた要求の数があまり
多くなりすぎた時には拒否できるようなオプションも付けようかとは思ってます。
リトライのタイミングは相手まかせです。
ありがとうございます。
494:デフォルトの名無しさん
09/03/23 22:56:09
C++には便利な仕組みがいっぱいあるよねー。
495:デフォルトの名無しさん
09/03/23 22:57:02
>>492
ありがとうございます。
dequeも考えたのですが、処理中の要求がどういう順序で終わるかは決まってないので
(重い要求の少し後に軽いのが来た場合、後から来た軽いのが先に処理が終わる可能性があります)
dequeは使えないか、と思ったんですが、どうですか?
>最近同じような質問があった気がする
ありがとうございます。探してみます。
496:デフォルトの名無しさん
09/03/23 23:09:23
処理中のものは一時的に別のmapとかに保存しておいて、処理が終了したらlistに積むとか
497:デフォルトの名無しさん
09/03/23 23:09:26
処理の軽さがあらかじめわかるなら
あの、あれ、なんていったっけ、常にソートされるコンテナ、
それ。
498:デフォルトの名無しさん
09/03/23 23:21:09
時刻をキーにしてstd::set使えばよさげだね
重さ?シラネ
499:デフォルトの名無しさん
09/03/23 23:35:58
どうも自分の環境だと、30万件を越えたあたりからマシンが応答なくなります。
30万件のダブルリンクを、全然内容に変化がないのに1秒とかの間に何度も何度も
回ってて、何度も何度も処理後1時間以内のエントリの数を数えてます。
この処理を減らせれば、もっといけそうな気がする。
メモリ消費自体は、構造体が16バイトなので、100万件でも16MBとかの消費のはず
なんですがね、、、
500:デフォルトの名無しさん
09/03/23 23:41:11
それは「新しい要求が1秒とかの間に何度も何度も」来てるからじゃろ?
そして「受け付けた全要求」、つまりここでは30万件を
要求が来るたびに「回って、処理が終わってから1時間たってないものの数をカウントして」る
からじゃろ? 仕様どおりじゃないのかな?
501:デフォルトの名無しさん
09/03/23 23:48:29
>>500
そうですね。
負荷テストやっとこうと思って、別プロセスからガンガン要求なげてみたんです。
1秒間に10000件とかです。負荷が高いときは要求を拒否しますといったほうがいいんですかね。
そうなると、要求を出す側のプログラムも変更しなくちゃいけないのがいやなんですけどね。。
502:デフォルトの名無しさん
09/03/23 23:52:40
>>497-498
ありがとうございます。
でもC++は手元のコンパイラが対応してなくてですね、、強く要求すれば購入してもらえるかも
しれないんですが、なんとかCでやりたいと思ってます。
自分でstd::setとかコンテナとか実装すればいいのかもしれないですが、
常にソートされるコンテナって重そうな感じがするし、、、、
503:デフォルトの名無しさん
09/03/23 23:53:31
全体的に仕様がおかしい気がするけど
そういう仕様なら仕方ないのであきらめましょう。
プログラマは仕様について意見することはできても
仕様を変える力はありません。しようがないのです。なんちて・・・
コマネチ!
504:デフォルトの名無しさん
09/03/24 00:08:07
>>501
それは仕事でやってるの?
505:デフォルトの名無しさん
09/03/24 00:11:58
>>501
そうです。でも売り物じゃなくて、社内のデータ管理ソフト用の処理を書かされてます。
506:デフォルトの名無しさん
09/03/24 00:22:25
すげー社内システムだな。
507:デフォルトの名無しさん
09/03/24 00:27:16
>>492の方法なら一番軽いと思うんだけどな。処理が終了してからlistとかdequeに積めばいいだけだし。
全探索の力業を少しでも軽くしたいなら要求が来るたびに調べるんじゃなくて、少しの誤差を許容して
調べるのは一秒に1回までとすれば1/10000まで軽くなると思う。
508:デフォルトの名無しさん
09/03/24 00:30:19
結構大きな会社で、ストレージ管理ソフトも自社製のがあるんですが、
そういうのは管理できる人を手配するのが大変らしいです、、、
509:デフォルトの名無しさん
09/03/24 00:30:50
STLは偉大だなぁ。ちゃんと処理時間についても言及されてる。
510:デフォルトの名無しさん
09/03/24 00:40:32
>>507
そうですね。
じゃあ、ダブルリンクには処理が終了してないものを入れておくことにして、終了したものは
dequeで管理する、そしてダブルリンクの全探索は1秒に1回にしてやります。
過去1時間以内に処理した要求の数は、ダブルリンク上の処理中のものの数+deque上のもの。
これで実装してみます。
明日の朝までにできるかな。
511:デフォルトの名無しさん
09/03/24 00:41:40
STLは元々Adaに組み込もうと研究されてたようですね
C++にtemplate機能が付け加えられたのに目を付けた
Stephanov(だっけ)がC++に移植したのが初めだとか
512:デフォルトの名無しさん
09/03/24 07:02:35
template に関してだけど、オーバーロードにするか、templateを書くかといつも
使いどころに迷ってしまう、皆さんはどういう基準で使い分けていますか?
513:デフォルトの名無しさん
09/03/24 07:23:59
オーバーロードで済むならオーバーロード。
テンプレートが必要な時だけテンプレート。
514:デフォルトの名無しさん
09/03/24 08:09:13
時間がないとき以外は全部テンプレート。自分が成長するため。
515:デフォルトの名無しさん
09/03/24 08:30:05
演算子のオーバーロードについて質問があります。STLのIteratorみたいに、
List<int> *list = new List<int>();
llist.push_back(1);
llist.push_back(2);
for(Iterator* iter = (ListIterator<int>*)list->iterator(); iter->hasNext(); iter++){
printf("%d ", (*iter));
}
このような書き方ができるようにソースコードを書きたいのですがうまくいきません。
以下が(全部載せるには少し長いので)自分のソースの抜粋です。
class Iterator{
public:
//省略
virtual bool hasNext() = 0;
virtual Iterator<Type> &next() = 0;
virtual Iterator<Type> &operator++() = 0;
virtual Type& operator*() = 0;
};
template <class Type> class ListIterator : Iterator<Type>{
public:
//省略
Iterator<Type>& operator++ (int dummy){
return next();:
}
Type& operator*(){
return value;//現在イテレータが指しているセルの内容
}
}
このように定義したものを上のように実行すると、4227856のような数字が連続して表示されてしまいます。また、for文のところで実行時エラーが出ます。
どう書き直せばよいでしょうか……。
(素直にSTL使えって話なんですがね……OTL)
516:デフォルトの名無しさん
09/03/24 08:41:56
>>515
よく1回のカキコにおさめたな。
517:デフォルトの名無しさん
09/03/24 08:48:26
>>516
載せるところ選ぶのに苦労しました……。
重要そうなところだけ抜粋してます。
テンプレートクラスのListは自前で教科書読みながら基本的な機能は実装してみました。
こんなことしてるのは、単に興味とステップアップのためなんですが。
ちなみに学生ではありますが、ただの(へたれ)日曜?プログラマです。
サンプルコードまねるだけでろくなソフトも作れませんが……OTL
(っとこんなことはどうでもいいですよね……)
518:デフォルトの名無しさん
09/03/24 10:05:31
あるサイトを参考にして、下記のような半角全角変換関数を
作成したのですが、試しに適当にint型の変数を入れて
動かそうとすると下記のようなエラーが出ます。
参考サイトにあるものをほぼそのまま使用しており、
修正したところはcase文の中の変換する文字のみです。
参考サイトには、そのまま使用できるようなことが
書いてあったのですが、何が間違っているのか教えてください。
519:デフォルトの名無しさん
09/03/24 10:06:52
int han2zen(char *str)
{
char *buf, *p, *ptr;
buf=(char *)calloc(strlen(str)*2+1,sizeof(char));
for(ptr=str,p=buf; *ptr!='0\'; *ptr++){
switch((int)*ptr){
case '0': strcpy(p,"0");p+=2;break;
case '1': strcpy(p,"1");p+=2;break;
case '2': strcpy(p,"2");p+=2;break;
case '3': strcpy(p,"3");p+=2;break;
case '4': strcpy(p,"4");p+=2;break;
case '5': strcpy(p,"5");p+=2;break;
case '6': strcpy(p,"6");p+=2;break;
case '7': strcpy(p,"7");p+=2;break;
case '8': strcpy(p,"8");p+=2;break;
case '9': strcpy(p,"9");p+=2;break;
case default:
*p=*ptr;
p++;
*p='\0';
break;
}
}
strcpy(str,buf);
free(buf);
return(0);
520:デフォルトの名無しさん
09/03/24 10:07:57
(1849) : error C2001: 定数が 2 行目に続いています。
(1849) : error C2015: 定数の文字数が多すぎます。
(1850) : error C2143: 構文エラー : ';' が 'switch' の前にありません。
(1850) : error C2143: 構文エラー : ')' が 'switch' の前にありません。
(1861) : error C2059: 構文エラー : 'default'
(1868) : error C2040: 'strcpy' : 'int ()' は 'char *(char *,const char *)' と間接操作のレベルが異なります。
(1869) : error C2371: 'free' : 再定義されています。異なる基本型です。
C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\\include\malloc.h(123) : 'free' の宣言を確認してください。
(1871) : error C2059: 構文エラー : 'return'
(1872) : error C2059: 構文エラー : '}'
521:デフォルトの名無しさん
09/03/24 10:10:37
>>515
printf("%d ", (**iter));
正直混乱するのでiteratorで多態はやめた方がいいんじゃない?
Listの実装でListIteratorを返すようにして
for(ListIterator iter = list->iterator(); iter->hasNext(); iter++){
printf("%d ", (*iter));
}
522:デフォルトの名無しさん
09/03/24 11:12:35
>>519
'0\'
'\0'
case default:
default;
523:515
09/03/24 12:20:00
>>521
レスありがとうございます。
>printf("%d ", (**iter)
なんでうまくいかないんだろうと4時間くらい混乱してました。
List::iterator()でnewしてポインタを返す仕様でした……(もちろん管理してdeleteもする)。
とりあえず一つ前のソースコードは(**iter)で動きました! どうもです。
ポインタ渡してるんだから*が一個多く必要なのは当然。初歩的なミスだったとは恥ずかしい。
初めて演算子のオーバーロードなんてやるからそれが間違ってるのかと思い込んでました。
List::iterator()は、
ListIterator<Type> iterator(){
return ListIterator<Type>(this);
}
現在のソースコードはポインタじゃなくてこんな感じにしてみました。
>多態はやめたほうが……
Iteratorクラスを作って継承するのはやめる方向で書き直してみます。どうせ自分しか使わないですし。
アドバイスありがとうございました。
スレ汚し失礼しました。
524:デフォルトの名無しさん
09/03/24 13:59:10
518,519,520です。
ありがとうございます。
おかげで動くようにはなったのですが、
期待する値を得ることができません。
下記のような値が返ってきてしまいます。
何がいけないんでしょうか?
INPUT OUTPUT
HAN2ZEN("9") NULL
HAN2ZEN("99") 結果なし
HAN2ZEN("999") 9
HAN2ZEN("9999") 結果なし
HAN2ZEN("99999") 9
HAN2ZEN("999999") 99
HAN2ZEN("9999999") 999
HAN2ZEN("99999999") 99
HAN2ZEN("999999999") 999
HAN2ZEN("9999999999") 9999
525:デフォルトの名無しさん
09/03/24 14:24:58
>>524
int main()
{
char s[100];
for (int i = 1; i <= 10; i++)
{
s[0] = '\0';
for (int j = 0; j < i; j++)
{
strcat(s, "9");
}
printf("HAN2ZEN(\"%s\")", s);
han2zen(s);
printf("%s\n", s);
}
return 0;
}
これでちゃんと出たけどな?
526:デフォルトの名無しさん
09/03/24 14:43:54
ありがとうございました。han2zen関数の使用方法を間違って、
例えばprintf("%s\n", han2zen(s));のように使用していたため
変な値が返ってきていただけでした。助かりました。
527:デフォルトの名無しさん
09/03/24 16:19:10
VS2005を使っているのですが、iostreamをインクルードすると
error C2913:明示的な特殊化; 'std:iterator_traits'はクラス テンプレートの特殊化ではありません。
をはじめ100以上のエラーがでます。
xutilityというファイルが原因のようですが、特に書き換え等行っていません。
プログラムは別のPC(同じOS、同じVS)に移すとエラーを吐きません。
アドバイスを御願いします。
528:デフォルトの名無しさん
09/03/24 16:37:17
VSを入れ直す
529:デフォルトの名無しさん
09/03/24 17:06:31
ところで、
C言語のスレッド関係の関数をC++のクラスでとりあえずラップ・カプセル化っぽくした簡単な自作ソースコードがあるんですけど、
需要ありますか?
機能はかなり限定されてますけど、Windows(ほぼWin32 APIのみのVC++)用、確かLinux用(pthread。簡素です)と両方あります。
これ見られたら、ダメ出しをたくさんくらいそうだけど。
530:デフォルトの名無しさん
09/03/24 18:13:44
需要ありますか?じゃなくて
ダメ出しして欲しいんで見てくれませんか?だろ
boost::threadがあるしな
531:デフォルトの名無しさん
09/03/24 18:16:28
>>530
だよな
いらないよな
532:デフォルトの名無しさん
09/03/24 18:20:01
えー。マルチスレッドなprintfとか欲しいよ。
文字単位でスレッド分割して最終的に正しいストリームを形成するみたいな。
どう?
533:デフォルトの名無しさん
09/03/24 18:21:22
>>529
最近ねたが無いからうpれ
534:デフォルトの名無しさん
09/03/24 18:40:22
土下座して頼むならうpってあげてもいいんですが。
535:デフォルトの名無しさん
09/03/24 19:05:54
>>530,531,533
それが本音で、ネタのためにも、うpしたかったと>>529が申しております。
よかったら見てやってくださいとのこと。
多分、これだ。
URLリンク(kansai2channeler.hp.infoseek.co.jp)
536:デフォルトの名無しさん
09/03/24 20:31:51
>>535
このスレ見るものが、怪しげなzipファイルを踏むとは思えないんだけど
537:デフォルトの名無しさん
09/03/24 20:44:13
オレは踏んだ
そしてどちらかの環境(Win,Linux)しか使わないなら必要ないと判断した
538:デフォルトの名無しさん
09/03/24 20:59:44
svg形式を解析・出力するようなオープンなライブラリないのかな
なけりゃ自力で作るんだが・・・完全準拠って大変だな・・・
改めてブラウザって大変なんだなって思うわ
539:デフォルトの名無しさん
09/03/24 21:13:22
ないわけないやろが
540:デフォルトの名無しさん
09/03/25 00:34:19
>>538
オープンの意味による。
GPLならいっぱいあるが、Non-GPLでC/C++から使えるオープンソース実装は多分ないと思う。
ていうかあるなら俺に教えてくれ。
OpenVGもNon-GPLで非プロプライエタリな実装が見あたらないんだよ。
リファレンス実装をGPLで配布するとかマジやめて欲しい。
541:デフォルトの名無しさん
09/03/25 00:42:20
ハノイの塔を解くプログラムを書いたのですが、結果が正しいのかわかりません。
どなたか検証していただけないでしょうか?
↓ソース
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8999.c
ちなみに、円盤の個数が5までなら正しいのを確認してます。
542:デフォルトの名無しさん
09/03/25 01:14:36
5個まで正しいなら、6個目も正しいのは簡単にわかるよ。
なぜなら、6個目の解法は
5個目までの解法+一番下を動かす+5個目までの解法(ただし最初とは使う柱が違う)
だから。
ちなみに7個目の解法は
6個目までの解法+一番下を動かす+6個目までの解法(ただし最初とは使う柱が違う)
以下同様。ハノイは簡単。
543:デフォルトの名無しさん
09/03/25 01:19:59
>>541
危なっかしい警告が出てるので、まず潰したほうがいい。
結果はこれと比べとき。
#include <stdio.h>
int Solve(int num, int step, int from, int to, int tmp)
{
if (num) {
step = Solve(num-1, step, from, tmp, to);
printf("%d 手目: %d -> %d\n", step++, from, to);
step = Solve(num-1, step, tmp, to, from);
}
return step;
}
int main(void)
{
int num;
printf("円盤の個数を入力して下さい: ");
scanf("%d", &num);
Solve(num, 1, 0, 2, 1);
return 0;
}
544:デフォルトの名無しさん
09/03/25 08:23:34
for (list<int>::iterator i = lists.begin(); i != lists.end(); ++i) {
if (iが何かの条件を満たしているとき)
lists.erase(i);
}
とやれば、リストをたどって、条件を満たしている要素全部を消していくことができますか?
545:デフォルトの名無しさん
09/03/25 08:46:11
remove_if
546:デフォルトの名無しさん
09/03/25 09:02:16
RemoveとEraseはなにが違うんですか?
547:デフォルトの名無しさん
09/03/25 10:27:35
>>546
あなたのお使いのライブラリの仕様によります。
STLについてなら、RemoveもEraseもありませんのでremove, eraseのことだと思いますのでそれについては以下に。
removeは対象の要素が指定したキーと一致した場合のみ削除しますが、eraseは一致を確認することなく削除します。
但し、removeは対象となるコンテナがlistの場合のみ使用できます。
尚、algorythmにあるremoveは、対象要素を移動しますがメモリの後始末はしないので注意が必要です。
548:デフォルトの名無しさん
09/03/25 10:34:29
>>541
円盤の番号を上から1~n、手順を1から数えるとして、手順mに動かす円盤は手順mを
二進表現したときの最初の1が下から数えて何番目に出現するか数えればいい。
例えば、100手目に動かす円盤を知るには先ず100の二進表現を得ればいい。
これが110100なので、下から3番目が1と判る。つまり、上から3番目の円盤を動かすと知れる。
要は、再帰は必須ではない。
549:デフォルトの名無しさん
09/03/25 12:19:05
>>547
ありがとうございます。VC++9を使ってます。
listの中を1周しながら、条件に合うものをerase()しているのですが、1周する途中で
デバッグエラーに引っかかります。何が間違ってるのでしょうか?
550:デフォルトの名無しさん
09/03/25 12:26:29
要素の追加、削除した後のiteratorって保障されないんじゃないの?
remove_ifとかした後で、いらない要素をまとめてeraseすればいいんじゃないだろうか
551:デフォルトの名無しさん
09/03/25 12:35:17
>>544
erase() に渡されたイテレータは無効にり、無効なイテレータは
インクリメントできない(未定義動作になる)。
URLリンク(www.google.co.jp)
552:541
09/03/25 17:06:53
お礼が遅くなってすみません。
大丈夫みたいですね。どうもありがとうございました。
553:デフォルトの名無しさん
09/03/25 17:32:34
list< int >::iterator i = lists.begin();
while ( i != lists.end() ) {
i = lists.erase( i ); // erase()は削除した要素の次の要素を指すイテレータを返す
}
こんなかな。っていうか、STLでは自前のループはなるべく書かない。
554:デフォルトの名無しさん
09/03/25 17:54:06
C++で変数(例えばdouble型)に#INFを代入する方法はないでしょうか?
出来れば環境依存しない方法を探しています。
555:デフォルトの名無しさん
09/03/25 17:59:03
依存無しは無理だろ
浮動小数にIEEE754を使うことが定められてるわけじゃないから
INFなんてものが存在するとは限らないし
556:デフォルトの名無しさん
09/03/25 18:40:44
>>554
std::numeric_limits<double> infinity()
存在するかどうかのテストも用意されてたはず。
557:デフォルトの名無しさん
09/03/25 18:41:42
>>554
環境依存だろうけど
x=1e+1000;
558:デフォルトの名無しさん
09/03/25 21:59:14
Windows(Vistaです)のC++でsleep(秒)を使おうと思っているのですが、どのヘッダを
インクルードすればよいのかわかりません。結局
#include <windows.h>
をインクルードして、
Sleep(ミリ秒);
を使ってますが、Windowsでsleep()はつかえるのでしょうか?
559:sage
09/03/25 21:59:39
すみません。古い技術で恐縮ですが、
VB6用のDLLをVC++で作成するとき、
VB6で使用するタイプライブラリはどのように作成するのでしょうか?
560:デフォルトの名無しさん
09/03/25 22:21:08
>>558
それしかありません
561:デフォルトの名無しさん
09/03/25 22:53:14
>>560
わかりました。
ありがとうございます。
562:デフォルトの名無しさん
09/03/26 00:48:06
VC6.0でビットマップAの特定座標にビットマップBをコピーして、
それらを一切表示せずにビットマップCとして保存したいのですが、
BitBltという関数を用いれば可能なのでしょうか?
563:デフォルトの名無しさん
09/03/26 01:26:02
C++で、名前なし名前空間に関数を書いた場合とただのスタティック関数は、機能面から
考えたら同じと思っていいですか?
そのファイル内からだけ使えるという点で。
564:デフォルトの名無しさん
09/03/26 01:37:41
おい、誰か答えろや。
答えんかい!
565:デフォルトの名無しさん
09/03/26 02:43:02
関数使わなくても
座標計算してあとは合成すればいい
まああれだ
566:デフォルトの名無しさん
09/03/26 03:26:22
>>564
ちょっとだけ違う
567:デフォルトの名無しさん
09/03/26 03:54:26
そのへんは週刊 名前空間・創刊号に詳しく載ってるから買ってくるといい
確か初回は特製boost::binderがついてくるはず
568:デフォルトの名無しさん
09/03/26 05:27:59
>>566-567
ほんとに役に立たないスレだな。
もっとちゃんと答えろ。
こっちは眠いのを我慢してレス待ってんだから。
早くしてくれや。
569:デフォルトの名無しさん
09/03/26 06:28:20
あー眠い眠い。早く教えてくれ。寝ちまうぞ。
570:デフォルトの名無しさん
09/03/26 06:55:12
いいよ。
571:デフォルトの名無しさん
09/03/26 06:57:10
おやすみー
572:デフォルトの名無しさん
09/03/26 07:04:18
>>570-571
はやく助けろや。
こっちは急いでんだわ。
573:デフォルトの名無しさん
09/03/26 07:15:17
おぅ。わかった。すぐに答えるからちょっと待ってろ
574:デフォルトの名無しさん
09/03/26 07:21:27
>>563
リンケージが違う。といっても、どのみちファイル外からはアクセスできないんで
あまり実用上の違いはない。
「リンケージが違う」ことを意識して、わざと違いの出るサンプルを作るとこんな感じ。
他にもあるかもしれないけどね。
template<void (*)()> int t() { return 0; }
namespace { void an() {} }
static void st() {}
int main() { return t<an>(); } // t<st> はコンパイルエラー
575:デフォルトの名無しさん
09/03/26 07:28:56
もっとわかりやすく説明しろよカスども
576:デフォルトの名無しさん
09/03/26 08:39:31
あたまだいじょうぶでちゅかあ?
ことばわかりまちゅかあ?
577:デフォルトの名無しさん
09/03/26 08:44:02
わからないでちゅ・・・
578:デフォルトの名無しさん
09/03/26 08:56:46
意味もなく盛り上げてんじゃね~よ
579:デフォルトの名無しさん
09/03/26 09:10:06
>>574
ダメだよこういう時は嘘を教えなきゃ。
580:デフォルトの名無しさん
09/03/26 09:47:06
浅く寝ちまったよ。
>>574
ありがとョ。でもVC++2008だと、t<st>でもt<an>でも両方とも
コンパイルできたけど?ほかの環境でも試したほうがいいのかな?
>>579
うるせーやつだな。
581:デフォルトの名無しさん
09/03/26 11:50:38
>>580
> ほかの環境でも試したほうがいいのかな?
試さなくていいよ。
582:デフォルトの名無しさん
09/03/26 12:45:35
>>581
そうか、まあまずリンケージから理解するかと思って調べたらこんなの出てきたんだけど、
ほんとかどうかついでに教えてよ。
C 言語と C++ 言語では const キーワードを使うことで定数を宣言することができます。
例えば const int cardmax=13; のように使用できます。これが単一のモジュールだけで
使われるのならば問題がないのですが、複数のモジュールにわたって使われる場合、
C言語と C++ 言語では constのリンケージが違うので、注意が必要です。具体的には
C言語では外部リンケージをもち、C++ 言語では内部リンケージを持ちます。つまり
C 言語では他のモジュールから使用する場合、そのモジュール内で
extern const int cardmax;
と宣言すればこの定数は使用可能ですが、C++ 言語では同じようにしても参照する
ことはできません。C++ 言語で外部から const オブジェクトを参照したい場合には、
定数を定義するときに、
extern const int cardmax=13;
のように定義する必要があります。
583:デフォルトの名無しさん
09/03/26 12:49:13
>>582
正しいよ。
ちなみにCでconstで内部リンケージを持たせるなら
static const cardmax=13;
ってやる。
584:デフォルトの名無しさん
09/03/26 15:14:19
>>580
へぇ VC++ だと通るのか。独自拡張じゃないかな? /Za でエラーになるかも。
ちなみに Cygwin の gcc 3.4.4 ではこんなエラーになる。
: In function `int main()':
:4: error: `st' is not a valid template argument
:4: error: no matching function for call to `t()'
585:デフォルトの名無しさん
09/03/26 22:18:37
>>584
/Zaのつけ方を教えて。
586:デフォルトの名無しさん
09/03/26 22:36:10
>>585
つけ方がわかったんで、つけてもう一回コンパイルしてみたけど、それでも
結果は同じ。どっちでも通るけどな。
587:デフォルトの名無しさん
09/03/27 02:07:55
まったくお前らのせいで昼夜逆転しちゃったよ。
はやく解クレや。
今はカップ麺にお湯入れたんで、完成待ち。
やっぱ夜はいいな、静かでな。
588:デフォルトの名無しさん
09/03/27 13:02:08
なんかカキコが減っちゃったな。
俺のせいかな。
悪かったよ。もう消えるわ。
じゃあな。
589:デフォルトの名無しさん
09/03/27 23:33:13
なんか難しい方のスレで聞いちゃったみたいだからこっちで聞きなおしますね。
それにしても初心者スレって沢山あってどこで聞けばいいか良く解らないけどここにする。
C言語は上から順番に処理されるんだよね。
そうすると、割り込むみたいなことは許されないんだよね?
例えばfor文のループ中にキーを押したらそのときのtimeを取れるみたいなのは無理?
for( )
・・・・・・・・・
if(getchar
見たいなのじゃなくて、for文でゲームみたいなの動かしたいんだけど、
その途中でどんな途中でもtimeが取れるみたいなことは出来ないですか?
590:デフォルトの名無しさん
09/03/27 23:50:42
>>589
_beginthreadex
591:デフォルトの名無しさん
09/03/28 00:04:52
つ _kbhit()
592:589
09/03/28 01:09:16
ありがとうございます。
593:デフォルトの名無しさん
09/03/28 05:28:17
>>589
スレッドを作るんだよ。2つのスレッドを作ってそれぞれにHello world出力
させてみろ。話はそれからだ。
あとは環境を書けや。WindowsかLinuxか。
594:デフォルトの名無しさん
09/03/28 07:06:38
スレッド信者ウゼ
595:デフォルトの名無しさん
09/03/28 07:30:11
>>594
信者もなにも、基本だろ。
クソな書き込みするくれーなら、意味のあること書いてミロ。
596:デフォルトの名無しさん
09/03/28 07:57:08
_kbhit()にしてもどんなタイミングでも実行させるならマルチスレッドでやるしかないだろう
597:デフォルトの名無しさん
09/03/28 08:19:14
USBから自作した機器の制御とかをやりたいと思い、Windowsのドライバのプログラミング
について勉強しようと調べてたんですが、ググっても本の通販ページばかり出てきて
何が必要なのか、どのようにして作るのかがまったく分かりません。
どこか基本的なところから作り方解説してくれてるサイトありませんか?
本買えと言われるかもしれかいけど、本買うかはドライバ開発ってどんな感じなのか
知って、本当にやってみようか考えてから買いたいんです。
598:デフォルトの名無しさん
09/03/28 08:26:05
めちゃくちゃ環境依存(処理系依存)の問題だと思うので、こちらで質問です。
下記のように、CHogeHogeのクラス変数を初期化するのに、別のシングルトンクラス(CHoge)のメソッドの
戻り値を与えるコードを書いたところ、CHogeHogeのクラス変数を初期化するタイミングではまだCHogeが
生成されておらず、落ちます。コメント内のコードもうまくいきそうですがNGです
恐らくリンクオプションとか、pragmaで逃げられそうに思うのですが
対策方法を教えてください。処理系はVC6 SP5です
「CHogeHoge.cpp」
CHogeHoge* CHogeHoge::s_pInstance = new CHogeHoge(); // static
CHogeHoge* CHogeHoge::GetInstance()
{
return s_pInstance;
}
int CHogeHoge::GetValue()
{
return m_Value;
}
/* -- これもNG
CHogeHoge CHogeHoge::s_Instance; // static
CHogeHoge* CHogeHoge::GetInstance()
{
return &s_Instance;
}
*/
「CHoge.cpp」
const int CHoge::STATIC_VALUE = CHogeHoge::GetInstance()->GetValue();
なお、GetInstance内でnewすれば問題解決するとは思いますが、それ以外の方法でお願いします。
599:デフォルトの名無しさん
09/03/28 08:32:03
>>598
言ってることと書いていることが違う気がするのは気の所為か?
私にはCHogeクラスの変数をCHogeHogeクラスのメンバ関数で初期化しているように見えるのだが。
つーか、設計を見直すと言う選択肢はないのだろうか。
600:デフォルトの名無しさん
09/03/28 08:46:03
CHogeの実装をCHogeHoge.cppに入れればいいんじゃね?
601:デフォルトの名無しさん
09/03/28 08:51:34
class CHoge {
CHoge & instance() { static CHoge h; return h; }
};
void CHogeHoge::init()
{
m_Value = CHoge::instance().value;
}
602:デフォルトの名無しさん
09/03/28 09:05:29
>>596
入力反応に対応出来る範囲をうまく見積ればどうとでもなる
for(){
int i = 0;
l_c:
switch(_kbhit()?0:++i){
case 0: printf("time");goto lc;
case 1: ~;goto lc;
case 2: ~;goto lc;
default:
}}
603:デフォルトの名無しさん
09/03/28 09:27:12
>>597
ググった結果から microsoft のサイトのものを見るといい
604:デフォルトの名無しさん
09/03/28 10:10:15
>598
>なお、GetInstance内でnewすれば問題解決するとは思いますが、それ以外の方法でお願いします。
なんでそれだと駄目なん?
>めちゃくちゃ環境依存(処理系依存)の問題だと思うので、こちらで質問です。
問題そのものは静的オブジェクトの初期化順序問題として割と有名。
URLリンク(www.parashift.com)
>601 みたいに関数内 static にするのも駄目?
605:598
09/03/28 12:22:45
>601さんの方法でうまくいきました。
しかもインスタンス保持用の変数は、クラス変数である必要すらないってことで、シンプルなので、
今後シングルトンはこの方法を愛用することになりそうです。
>604さん
有名な問題なのですね、勉強になります。
>>なお、GetInstance内でnewすれば問題解決するとは思いますが、それ以外の方法でお願いします。
>なんでそれだと駄目なん?
出来るだけシンプルにしたかったのと、
正攻法の攻略法を知っておこうと思ったからです。
ありがとうございました。
606:デフォルトの名無しさん
09/03/28 13:44:42
>>605
> 正攻法の攻略法を知っておこうと思ったからです。
わかってないから質問してるんだろうに、
正攻法で無いと決め付けてるのは何で?
607:デフォルトの名無しさん
09/03/28 16:26:26
>606
私の設計意図から外れるから。
URLリンク(ja.wikipedia.org)
のJavaの例の後者の方の例でどうしてもやりたかったから。
608:デフォルトの名無しさん
09/03/28 16:28:50
そしてスルーされる>599と>600。
>599の設計を見直すとか、>600のソースを纏めるとか、その辺りが正攻法じゃないのか?w
609:デフォルトの名無しさん
09/03/28 16:33:39
どう転んでも無理なんだから、どこかで妥協するなら、静的メンバで持つのを否定することも選択肢のうちだぜ
610:デフォルトの名無しさん
09/03/28 16:34:50
設計を見直す、は設計の正攻法だけど、設計を変えないといけないから、
対処法の正攻法ではない、と。
単に言葉の問題。変なところに噛み付いてこないでね。
>599は説明ミス。指摘のとおりCHogeとCHogeHogeは逆。
>600は
うーん、
実際のところはCHogeはテンプレートクラスでm_Valueはテンプレートに渡された型からその型のビットサイズを求めてる。
で、これをほかのクラスで定数のように使いたい、っていう感じなんで、一緒のクラスに実装するのは抵抗ありますね。
611:デフォルトの名無しさん
09/03/28 16:38:28
後出しウザい
612:デフォルトの名無しさん
09/03/28 16:41:27
まさかとは思うが、1クラス1ファイルじゃないといけないなんて思ってないよな?
そんな阿呆みたいな糞言語と一緒にされたら困るんだが。
613:デフォルトの名無しさん
09/03/28 17:03:07
型情報から定数作りたいだけならmy_traitsクラスでも作ってろよ
614:デフォルトの名無しさん
09/03/28 17:11:28
相変わらず終わった話に食いつく奴の多いこと。
615:デフォルトの名無しさん
09/03/28 17:17:35
上から目線の質問者が、中途半端な認識で勝手に終了宣言しただけだと
なかなかスパッとはいかないね。
616:デフォルトの名無しさん
09/03/28 17:49:51
>>610
設計が正攻法じゃないのに正攻法な解決っておかしいだろJK
617:デフォルトの名無しさん
09/03/28 21:51:53
class Sample {
public:
static void func();
};
という定義をヘッダに書いたとき、関数の内容をソースファイルに書く際は、
staticを取って、
void Sample::func() {....}
と書けばいいですか?
staticはつけてはだめなんですか?
618:デフォルトの名無しさん
09/03/28 22:02:28
>>584
たしかにCygwinで試すと同じエラーになったけど、どうしてだめなのか
ぜんぜんわからん、、、
結構C++歴長いんだけどな。誰かわかる人いる?
619:デフォルトの名無しさん
09/03/28 22:03:01
そうだね。そっちにはstaticは付けない。
620:デフォルトの名無しさん
09/03/28 22:03:20
>>617
そのとおり。っていうか試せばわかるだろ。
621:デフォルトの名無しさん
09/03/28 22:11:39
>>618
ポインタや参照型のテンプレート実引数には外部リンケージを持つ
オブジェクト(へのポインタ)しか使えない。(メンバへのポインタでは関係ない)
14.4.2 Template non-type arguments p1 より
> A template-argument for a non-type, non-template template-parameter shall be one of:
> - an integral constant expression; or
> - the name of a non-type template-parameter; or
> - the address of an object or function with external linkage, including
> function templates and function template-ids but excluding non-static
> class members, expressed as & id-expression where the & is optional if
> the name refers to a function or array, or if the corresponding
> template-parameter is a reference; or
(以下略)
622:621
09/03/28 22:12:41
ごめん。
× 外部リンケージを持つオブジェクト
○ 外部リンケージを持つオブジェクトまたは関数
623:デフォルトの名無しさん
09/03/28 22:24:28
内部リンケージだと、テンプレートを実体化した先から見えないかもしんないからな。
まあ処理系の実装次第だろうけど、規格としては許すわけにはいかんのだろう。
624:デフォルトの名無しさん
09/03/28 22:32:26
すごい。
そんな仕様があったんだ。でもその仕様から、名前なし名前空間の中の関数とスタティック関数の
動作の違いを作り出すなんて、あんた頭いいね。
ありがとう。
625:デフォルトの名無しさん
09/03/28 22:39:16
>>624
昔 static 付けて定義した関数を template 引数に使おうとしてエラーになって
半日規格を漁ってたことがあってな。こういうのは知ってるかどうかだけの話で、
頭がいいとか言わんよ。