【初心者歓迎】C/C++室 Ver.50【環境依存OK】at TECH
【初心者歓迎】C/C++室 Ver.50【環境依存OK】 - 暇つぶし2ch331:デフォルトの名無しさん
08/03/04 19:37:21
oprator void *() const
{ if (state&(badbit|failbit)) return 0; return (void *) this; }

のopratorはここではどういう意味で使われているのでしょうか?
この位置にあるのを初めて見まして、よくわからないんです。

332:デフォルトの名無しさん
08/03/04 19:41:08
>>331
型変換の演算子。

333:デフォルトの名無しさん
08/03/04 20:00:13
>>331
例えば
class Foo {
public:
 operator int() { return 42; }
};
main() {
 Foo foo;
 int x = foo; // <-- ここ
 cout << x;
}
というふうに、クラスを別の型に変換するときに呼ばれる。

334:デフォルトの名無しさん
08/03/04 21:54:20
ちなみに、このvoid*への変換演算子は
if (str)のように条件式で用いるために用意されている。

なぜoperator boolでないかというと、boolでは整数へ変換できてしまうから。
int x = str;のような想定外の変換を行わせないためである。

335:デフォルトの名無しさん
08/03/04 23:21:45
C#で開発したプログラムを、事情で一部C++.Netで書き直さないといけなくなったのですが
[C#]
List<int[]> foo;
の書式が、C++.Netではどう直せばいいのかわかりません。
intの配列ではテンプレートを適応できないのでしょうか?

336:デフォルトの名無しさん
08/03/04 23:24:05
>>335
List<array<int>^>^ foo;

337:デフォルトの名無しさん
08/03/04 23:24:19
URLリンク(vene.wankuma.com)
これ?

338:335
08/03/04 23:25:39
>>336
ありがとうございます。私の4時間が返ってきた。
これで作業が続きます。

339:336
08/03/04 23:40:27
>>338
ちなみにあなたが書いてるのはC++/CLIなので
分らないことがあったらC++/CLIスレに行くと幸せになれるかも。

340:デフォルトの名無しさん
08/03/04 23:56:55
List<array<int>^>^ foo;

笑ってるように見えて何かムズムズするw

341:デフォルトの名無しさん
08/03/05 00:36:11
List<List<List<array<int>^>^>^>^ foo = gcnew List<List<List<array<int>^>^>^>();

342:デフォルトの名無しさん
08/03/05 00:37:46
積年の疑問なんですが、スタックサイズはいつどうやって決まるんでしょうか。
1. コンパイル時に
2. リンク時に
3. 実行時に
a. 自動的に(コンパイラとかが自動変数の使用状況などを見て)
b. 固定的に
多分、どれかに当てはまると思うんですが。

343:デフォルトの名無しさん
08/03/05 00:40:00
コンパイルしたら

344:デフォルトの名無しさん
08/03/05 00:48:12
>>342
環境依存。

Windowsはリンク時に実行ファイルのヘッダにサイズが書かれるんだった
かな。子スレッドのスタックは実行時。


345:デフォルトの名無しさん
08/03/05 00:48:49
>>342
Windowsではexeにスタックサイズが書かれるので、リンク時以前
組み込みなんかでリセットベクタもコンパイルする必要がある場合は、コンパイル時
と思う。

346:デフォルトの名無しさん
08/03/05 01:31:09
組み込みで開発してたときはスタックサイズのチェックしてたな
どこまで上ってきてるか心配だったから。
あのときはコンパイル時だな。

347:デフォルトの名無しさん
08/03/05 01:34:24
うちもスタックポインタのチェックやってる。んでも、リンク時だと思う。
リンク時にスタックポインタの開始アドレスとかグローバル変数の確保領域アドレスとかの設定ファイルを使うから。

348:デフォルトの名無しさん
08/03/05 01:52:00
>>347
そうだな。何とか形式のファイルのサマリーを
出してくれるツールがあったな。

349:デフォルトの名無しさん
08/03/05 02:57:13
よく、C++ における class と struct の違いはデフォルトで private か
public かの差しかないって言うけど、本当?
class だと継承やらの情報を管理するための暗黙のメンバが最初にくっつかない?

class C {int a;}
struct S{int a;}
C c;
S s;

を実行してデバッガで c と s の中身見てみるとメンバ違わない?



350:デフォルトの名無しさん
08/03/05 03:10:19
クラスはメンバ関数や、オーバーロードが使えるだろ
構造体の拡張だろう

351:デフォルトの名無しさん
08/03/05 03:14:17
本とかだと、class と struct はデフォルトの可視範囲が異なるだけで、
コンパイラレベルでは全く同一ですと書いてある。

352:デフォルトの名無しさん
08/03/05 03:16:08
>>349
structも継承できるのに何でそこが違うとおもったんだ?

353:デフォルトの名無しさん
08/03/05 03:16:27
細かいことは気にするな 使う側として同じなら構わないだろう

354:デフォルトの名無しさん
08/03/05 03:17:46
>>349
大抵の実装では、仮想関数を持つクラス・構造体は、
仮想関数呼出のためのテーブル (vtbl)へのポインタを隠し持っているが、
これもクラス・構造体どちらでも同じ。

規格でも構造体とクラスは完全に同一視され、
構造体について何か独立した規定は存在しない。
全てクラスとしてまとめられている。

355:デフォルトの名無しさん
08/03/05 04:19:31
full bokko

356:デフォルトの名無しさん
08/03/05 07:17:09
そして大抵の実装では
仮想関数を持たないクラス・構造体は
vtbl へのポインタを持っていない。

357:デフォルトの名無しさん
08/03/05 07:38:19
>>347
H8やSHでは#pragma stacksize XXX というのがあるので、
スタックサイズはコンパイル時、スタックアドレスはリンク時ということかな。

358:デフォルトの名無しさん
08/03/05 08:45:07
struct S{ int m_a; int m_b}

として m_b に代入しようとして

void hoge(void *s){
 int offset = sizeof(int);
 unsgiend char * p = (unsgiend char *)s;
 int * m_b = p[offset];
 *m_b = 1234
}

みたいなコードが書いてあると位置がずれて死ぬ訳か

359:デフォルトの名無しさん
08/03/05 09:23:24
>>358
いいえ、環境依存です。

360:デフォルトの名無しさん
08/03/05 09:30:41
struct S {
 int a;
 int b;

 void clear() {
  ZeroMemory(this, sizeof(*this));
 };
}

こういうのもマズイ?

361:デフォルトの名無しさん
08/03/05 09:32:20
>>360
いつか POD の規則から外れる変更を加えたときに忘れずに修正する覚悟が必要。

362:デフォルトの名無しさん
08/03/05 09:42:56
vectorとか追加した場合ですね。
上のほうで出てた、仮想関数を持つクラスを継承して
vtbl へのポインタを持ってる場合は>360で問題無しですか?

363:デフォルトの名無しさん
08/03/05 10:42:35
>>362
仮想関数を持ったものも POD から外れる。

364:デフォルトの名無しさん
08/03/05 10:45:50
>>357
HEWでそれやってたな。てかconfig入力画面でメモリセクションのカスタマイズできた。

365:デフォルトの名無しさん
08/03/05 10:47:58
struct S {
 std::vector m_v;
} s;



ZeroMemory(&s, sizeof(S));

ってやって死んだ事がある



366:デフォルトの名無しさん
08/03/05 11:46:02
コンパイラBCC55
class PPP{
public:
union{
  struct{
    int n;
    struct{
      enum Hoge hoge;
      int x;
    }aa[32][32];
    LPCWSTR name[256];
  }a;
  struct{
    int p;
    char i;
    float y;
    Hoge *o;
  }b;
  struct{}c;
}data;
};
こんな共用体がクラス変数になってる時に
PPP ppp;
とするとそこでプログラムが例外も吐かずに落ちてしまいます。
しかし、PPPを他のクラスのクラス変数として宣言しておけば落ちません。
class Hoka{
PPP p;
};
分かる人おながいしまつ・・・。

367:デフォルトの名無しさん
08/03/05 11:47:00
ちなみにenum HogeはPPPの中で定義されてます。すいません

368:デフォルトの名無しさん
08/03/05 12:21:18
現象が再現する最小限のソースうp

369:デフォルトの名無しさん
08/03/05 14:39:59
今更ですが>>290のことで

vector<int> num;
num[i*j]=a;

でnum.size()が不定のとき(i*jより小さいときもある)場合
先にnum[i*j]を確保して、num[i*j]=aを入れればよいのでしょうか

確保の仕方を教えてください

370:デフォルトの名無しさん
08/03/05 14:46:08
>>369
num.resize(100) とかで好きなサイズに変更する

371:デフォルトの名無しさん
08/03/05 15:20:53
num.resize(i*j)っていうのも可能ってことでしょうか?


372:デフォルトの名無しさん
08/03/05 15:28:07
>>368最小限が分かりづらいのでエラーの出ないnewで代用しました。

373:デフォルトの名無しさん
08/03/05 15:58:15
>>371
可能だが resize(i*j) ではサイズが足りないと思うぞ

374:デフォルトの名無しさん
08/03/05 16:14:35
もっとも使われていないバッファを解放したいのですがSTLなどで良いライブラリはありますか?

375:デフォルトの名無しさん
08/03/05 16:53:00
>>374
せめてもうちょっと具体的に言わないとどうにもならないと思うよ

376:デフォルトの名無しさん
08/03/05 16:57:59
LRUを実装するのに適したコンテナはどれでしょうかってことだとエスパーしてみる
JavaのLinkedHashMapみたいなやつ?
STLにそれはないから、mapとlistを組み合わせるのかな・・

377:デフォルトの名無しさん
08/03/05 18:39:44
3次元配列(texture)を動的に確保しようと

if( (int)texture.size() < ( temp[0] + temp[1]*maxValue[0] + temp[2]*maxValue[0]*maxValue[1] ) )
texture.resize(temp[0] + temp[1]*maxValue[0] + temp[2]*maxValue[0]*maxValue[1]);

texture[temp[0] + temp[1]*maxValue[0] + temp[2]*maxValue[0]*maxValue[1]] = num;

こうしたら、格納されません。

現在の3次元配列の幅よりも、大きいのが出てきたら値を取り直して、入るべき所にぶち込む
ってことをやりたいだけなのですが

378:デフォルトの名無しさん
08/03/05 18:58:40
>>377
サイズが 10 だったら、有効なインデックスは 0~9 だ
サイズが temp[0] + .... *maxValue[1] だったら、
有効なインデックスは 0 ~ temp[0] + .... *maxValue[1] - 1 までだ

379:デフォルトの名無しさん
08/03/05 19:07:20
>>378
ありがとうございます、それが抜けていました

ただ 0 0 0 があったときに格納できないというエラーが出てきて
後少しなのに

380:デフォルトの名無しさん
08/03/05 19:20:23
class Aを例外として投げるとき

throw new A;
のようにnewで生成して投げるのと
throw A();
と投げるのはどっちが良いのでしょうか?


381:デフォルトの名無しさん
08/03/05 19:25:04
自プロセスのHWNDを取るにはどうしたらいいのでしょうか?

382:デフォルトの名無しさん
08/03/05 19:25:10
むかーしどっかで見たのですが、3次元以上の配列は使わない方が良いってどういうことでしょうか?
ソースがどこだったか覚えてないのですが、そのときの記憶があり3次元以上はなるたけ使わないようにしてる原状です

383:デフォルトの名無しさん
08/03/05 19:27:31
あんま多いと気づかずやらかす類のバグが増えるかも…しれないけど決定的な理由じゃねえよな

384:デフォルトの名無しさん
08/03/05 19:37:17
>>380
Javaと一緒にすんな

385:デフォルトの名無しさん
08/03/05 19:57:35
>>382
その配列が表すモノが本質的に3次元以上のモノなら3次元配列で良いけど
構造体やクラス等で表すべきモノを配列にしてしまうのは避けるべき

386:デフォルトの名無しさん
08/03/05 20:47:36
数値計算で添字3つ以上の行列とか扱わない限り、
まず必要になることはないと思うけどね。

387:デフォルトの名無しさん
08/03/05 20:52:58
>>380
newするとどこかでdeleteせんといかんよ。

388:デフォルトの名無しさん
08/03/05 21:29:17
>>380
new はしない。

389:デフォルトの名無しさん
08/03/05 22:04:19
#define SAFE_DELETE(p) {delete (p); (p)=NULL;}
を定義して、
SAFE_DELETE(ptr);
とすると「構文エラー : ';' が~の前にありません」のエラーになってしまいます。
delete ptr;なら普通にコンパイルできるのですが、
どこが悪いのでしょうか。

390:デフォルトの名無しさん
08/03/05 22:06:01
ちょっと行き詰まってしまったので質問させて下さい。
VC2005、WinXP64で以下のようなプログラムを作ったのですが、うまく動いてくれません。

DWORD WINAPI ThreadPrc(LPVOID lpParameter)
{
while (!ThreadTerminated){
//要求があるまで待機
WaitForSingleObject(hEventHandle,INFINITE);
if (ThreadTerminated) break;

//共有オブジェクトの排他アクセス
WaitForSingleObject(hMutexHandle,INFINITE);
//適当に処理
ReleaseMutex(hMutexHandle);

//処理が終わると相手に通知
//ここがおかしい
SetEvent(hDoneEventHandle);
}
return 0;
}

普段はDelphiでやってますが、64ビットでビルドする必要があったので、Delphiで作ったものをC++に移植しました。
プロセス間通信でいろいろやってるわけなのですが、同じところでいつもタイムアウトしてしまいます。
もちろんINFINITEにするとそのまま固まってしまいます。
32ビットプロセスでSetEventして、64ビットプロセスでWaitForするのは成功するのですが、その逆がうまくいかないのです。
VC固有の問題なのか、64ビットの問題なのか、関係ありそうなのは調べましたが全く原因が分かりません。
この部分さえうまくいけば完成なのですが・・・。
どなたか分かる方いましたらアドバイスお願いします(o*。_。)o


391:デフォルトの名無しさん
08/03/05 22:09:05
>>389
SAFE_DELETE(ptr);

{delete (p); (p)=NULL;};
に展開される。
} の後に ; があるのがポイント。
これで何か起こってんじゃね?

392:デフォルトの名無しさん
08/03/05 22:12:09
>>389
問題の起こる最小のコードをplz!

393:デフォルトの名無しさん
08/03/05 22:17:54
>>389
うちの環境だと普通に動いてしまったよー。
周りを疑ってみるべき

394:331
08/03/05 22:18:39
なるほど!
分かりやすい説明ありがとうございましたm(_ _)m

395:389
08/03/05 22:20:21
周りを少し抜き出すとこんな感じです。

-----SystemMacro.h----------
#ifndef SYSTEMMACRO_H
#define SYSTEMMACRO_H
#define SAFE_DELETE(p) {delete (p); (p)=NULL;}
#endif

------List.h----------
#include <windows.h>
#include "../system/SystemMacro.h"
template <class T> class List {
public:
virtual ~List(){
if(!_tempFlg) {
WORD i;
for(i=0; i<_ct; i++) {
delete _arr[i];
}
}
SAFE_DELETE(_arr); //←ここをdelete _arr;にするとコンパイル通る
}
};
※Listのメンバ変数は省略してます。

396:デフォルトの名無しさん
08/03/05 22:21:28
template <typename T>
void SafeDelete(T *& p) { delete p; p = NULL; }

397:デフォルトの名無しさん
08/03/05 22:23:00
なんか怪しげなコードだが
_arrの型は?


398:デフォルトの名無しさん
08/03/05 22:24:06
どーでもいいけど _ は変数名の前につける習慣は良くない。
つけるなら後ろに。

399:389
08/03/05 22:25:12
あ、_arrがテンプレートの、T**型なのですが、
それが悪いのでしょうか。

400:デフォルトの名無しさん
08/03/05 22:29:21
fmtflags setf(fmtflags flg, fmtflags mask);
関数の説明で、この関数は

flags((flags() & ~mask) | (flag & mask));

のような処理をしている、と書いてあったのですが、

flags((flags() & ~mask) | flag);

でも同じではないでしょうか?
なぜわざわざ(flag & mask)と書いてあるのでしょうか。

401:389
08/03/05 22:37:45
>>396
ありがとうございます。

>>397
template <class T>のT**型です。

>>398
とあるJavaのソースでクラスのメンバ変数の先頭に_をつけてたのを真似してます。
C言語はまだ初めたばかりな上、グーグルと2chで全て学んだので、
基礎がなってないのですが、先頭_はなんで不味いんでしょうか。

上のListクラスの機能は、たぶんstd::vectorとほぼ同じです。
標準ライブラリというのを知らなくて、作ってしまいました。

402:デフォルトの名無しさん
08/03/05 22:38:32
>>400
> 同じではないでしょうか?

いや、同じじゃないから。

403:デフォルトの名無しさん
08/03/05 22:43:14
だれか>>391に突っ込んでやれよw

>>401
「_」始まりの単語はシステム予約される可能性があるから。



404:デフォルトの名無しさん
08/03/05 22:45:19
pは何処から出てきた?
でいいのかな。

405:389
08/03/05 22:49:40
>>403
ありがとうございます。

}の後ろに;をつけても、うちの環境では動きました。

406:デフォルトの名無しさん
08/03/05 23:06:52
レスありがとうございます。

fmtflags setf(ios::hex, ios::basefield);
で、
ios::hex が 0x0800
ios::bsaefield が0x0e00
とすると、

ios::hex & ios::basefield

で、
0000 1000 0000 0000

0000 1110 0000 0000

の論理積なので、

0000 1000 0000 0000

で、結局
ios::hex(0000 1000 0000 0000)
そのものと変わらないじゃんと思ったのですが、どこかで勘違いしているのでしょうか。

407:デフォルトの名無しさん
08/03/05 23:08:47
>>406
> 論理積なので、

いや、違うから。

408:デフォルトの名無しさん
08/03/05 23:14:46
とりあえず

SAFE_DELETE(_arr);



{delete (_arr); (_arr)=NULL;};

に置き換えてコンパイルが通るかどうか。

あと、コンパイラは何?

409:デフォルトの名無しさん
08/03/05 23:16:54
>>400
flgは立てたいビット、maskはflgの属するフィールドを指定するが、
flgがmaskのフィールドに属さなかった場合に、
余計なフィールドのビットを立ててしまうのを防ぐため。

410:デフォルトの名無しさん
08/03/05 23:24:26
質問させて頂きたいのですが、
このように宣言しましたが、

char a[] = "1234";
char b[] = "4567";

char* abc[2][255]={
a,
b
};

*abc[1]で値が取り出せません。
こういうやり方は無理でしょうか?

411:デフォルトの名無しさん
08/03/05 23:30:23
>>410
abcはポインタが二次元に並んだ配列だが、それでいいのか?
やりたいのは、ポインタの一次元配列のように見えるが。
つまり、こう。
char* abc[2] = {a,b};
そうしたら、
*abc[0]は'1'
になる。

412:デフォルトの名無しさん
08/03/05 23:47:55
>399
>あ、_arrがテンプレートの、T**型なのですが

>395を見ると delete _arr[i]; とあるから、_attrは new[] で確保したアドレスを前提としていないか?
それなら delete ではなく delete[] とすべき。
コンパイルエラーの件とは無関係だが。


413:デフォルトの名無しさん
08/03/05 23:55:17
411>
おっしゃるとおり二次元配列のポインタですね。
全然気がつきませんでした。
ありがとうございます。


414:デフォルトの名無しさん
08/03/06 00:16:05
>389
とりあえず本論とは別だが、その手のマクロは

if(flag)
  SAFE_DELETE(p);
else
  do_something();

みたいにするとエラーになるのでしばしば

#define SAFE_DELETE(p) do { delete (p); (p) = NULL; } while(0)

のように定義されることが多い。

415:デフォルトの名無しさん
08/03/06 00:23:46
この場合なら

#define SAFE_DELETE(p) ((void)(delete (p), (p) = NULL))

でもいいと思うけどね。
まあ、式中に書けるのが嫌だというのであれば、
do-while 使ったのでもいい。

416:デフォルトの名無しさん
08/03/06 00:50:58
SAFE_DELETEを使ってるのを見ると
ああ10年前に学ぶのを止めてしまったんだなと分かる
自分自身がSAFE_DELETEされてしまったんだ

417:デフォルトの名無しさん
08/03/06 03:06:00
>416
ちなみにトレンドは?

418:デフォルトの名無しさん
08/03/06 03:32:56
416じゃないけどshared_ptrとかじゃないの

419:デフォルトの名無しさん
08/03/06 03:44:42
ずっと前から auto_ptr と vector によって delete の出番はほとんど無くなっている。

420:417
08/03/06 04:10:27
ああ、そういう意味でか。勘違いしてた、さんきゅ。

421:デフォルトの名無しさん
08/03/06 06:12:17
ガベージコレクションの緩いやつの理論はありますか?
たとえばファイルに書き出すために複数のバッファを用意したとして
もう書き込みが発生しないだろうと予測されたら書き出してメモリを解放するというやつです

422:デフォルトの名無しさん
08/03/06 06:15:54
100ファイルに書き込みがあって試行するうちに総数の10%のみの書き込みだけになったら
それ以外は書き込みがないだろうと思って解放したいのですが、タイミングをいつにするか具体的に計算する方法は
ありますか

423:デフォルトの名無しさん
08/03/06 06:49:42
LRUでぐぐればいいんじゃない?

424:デフォルトの名無しさん
08/03/06 07:02:10
ちょっと違うんです
たとえばバッファは10個なら、10個前が一番古いですが、11個目の後
1~10番が続くかもしれないじゃないですか
もっとも利用されなかっただけではなく、バッファサイズを増したほうがいいかも調べたいんです

425:デフォルトの名無しさん
08/03/06 09:24:11
最終使用時間を記録しといて、N秒以上使われてなかったら削除
とかでいいんじゃない?

426:デフォルトの名無しさん
08/03/06 14:33:28
>>419
それって大問題なんじゃなかったっけ?

427:デフォルトの名無しさん
08/03/06 16:20:10
質問でございます。
int* A_PTR = new int[5];
として確保した領域の、たとえば、A_PTR[3]のような、
途中の領域だけ解放(delete)することは可能でしょうか?

428:デフォルトの名無しさん
08/03/06 16:45:33
>>427
無理

429:427
08/03/06 16:59:15
>>428
やはり無理なんですね。
別のポインタに入れてからdeleteなど、
いろいろ実験していて気が狂いそうでしたので
大変すっきりしました。
れす、ありがとうございました。

430:デフォルトの名無しさん
08/03/06 17:32:23
CString cstr;
unsigned char uc[sizeof(cstr)] = (unsigned char)(LPCSTR)cstr;

コンパイル通りません。要は、↓を動的にしたいです。
unsigned char uc[10]="0123456789";

よろしくおねがいします

431:デフォルトの名無しさん
08/03/06 17:39:19
配列のサイズを動的に変えるのは無理です。
ヒープで取って良いのなら、
char* uc = new char[文字列の長さ+1];
strcpy(uc, コピーしたい文字列へのポインタ)
でもしてください。


432:デフォルトの名無しさん
08/03/06 17:41:23
これではだめ?
unsigned char* uc = (unsigned char*)(LPCSTR)cstr;

433:430
08/03/06 18:04:24
>>431
やっぱり無理ですか。。

>>432
uc[0],uc[1]みたいに、ポインタではなく配列としてアクセスしたいんですよね。。
なんか根本的に駄目なソース書いてる気がしてきたので、発想を変えてみます。

どうもありがとうございました。

434:デフォルトの名無しさん
08/03/06 18:06:06
動的に大きさを変えたいならstd::vector使えばいいやん。

435:デフォルトの名無しさん
08/03/06 18:06:34
あ、文字列ならstd::stringな。

436:デフォルトの名無しさん
08/03/06 18:09:14
>>433
添え字演算子はポインタでも使えるけど。

437:デフォルトの名無しさん
08/03/06 18:29:09
>>433
E1[E2] は *((E1) + (E2)) の syntax sugar だ。

uc[0] → *(uc + 0)
uc[1] → *(uc + 1)

438:デフォルトの名無しさん
08/03/06 20:40:20
uc[0] → *(uc + 0) → *(0 + uc) → 0[uc]
uc[1] → *(uc + 1) → *(1 + uc) → 1[uc]

439:デフォルトの名無しさん
08/03/06 20:43:02
>>438
さんざん既出
"0123456789ABCDEF"[i]
を大昔はやっていた。

440:デフォルトの名無しさん
08/03/06 20:44:58
それは関係ないだろう・・・。
i["0123456789ABCDEF"] ならともかく。

441:デフォルトの名無しさん
08/03/06 20:48:59
>>440
おんなじやんけ

442:デフォルトの名無しさん
08/03/06 20:49:41
あま~~~い

443:389
08/03/06 22:58:20
みなさん色々とアドバイスありがとうございました。

>>408
通ります。Visual Studio.NET 2003を使ってます。
>>412
_arr = new T*[_max];という感じで確保してます。
delete[] は使ったことないですが、やってみます。
>>414
それは思いつきませんでした。
>>415
その書き方は初めて見ました。
>>416
10年前というか、C言語始めてまだ1ヶ月半なんですが。。。

444:デフォルトの名無しさん
08/03/06 23:05:22
アレだ、「個体進化は系統進化を繰り返す」

445:デフォルトの名無しさん
08/03/06 23:10:44
以下のコードでファイルの2番目のバイトだけを
書き換えようとしたんですが
全く何も代わりません

#include <stdio.h>
int main(void){
FILE *fp;
char cIn;
char cOut = 'X';
int cnt;
fp = fopen("test.txt", "rb+");
fread(&cIn, 1, 1, fp);
printf("%c\n", cIn);
cnt = fwrite(&cOut, 1, 1, fp);
printf("%d\n", cnt);
fclose(fp);
return 0;
}

<test.txtの内容↓>
ABCDEFG

<出力結果↓>
A
1

これはどう理解したらいいんでしょうか?
BCとVCで試してみました

446:デフォルトの名無しさん
08/03/06 23:20:59
freadしてA読んで、表示した(出力1行目)
fwriteして次のBをXで上書きして、(test.txtの中身変化)
要素数の1が戻ってきて表示(出力2行目)
何が不思議なんだ?

447:デフォルトの名無しさん
08/03/06 23:21:31
>>445
readからwriteに切り替える時、もしくはwriteからreadに切り替える時は
必ず間にfseek()を挟む事。

448:デフォルトの名無しさん
08/03/06 23:39:54
>>445
コンパイル君のぼやき
「freadとfwriteに&使わないで下さいよ。あと、辞書ぐらい買ってくださいよ。
何でもかんでも私に聞かないで下さいよ。なんでもかんでもプリントにしないでくさいよ。
宣言するんだったらまともに宣言してくださいよ。main関数の引数ぐらい使ってくださいよ」

449:デフォルトの名無しさん
08/03/06 23:43:29
Visual C++についてなのですが、
分割コンパイルについていまいちよくわかりません。

main.ccp
ClassA.ccp
Def.h
ClassA.h
resource.h
と5つあって、

main.ccpではDef.hがインクルード、
ClassA.hでもDef.hがインクルードされ、Classの宣言と、インラインでのメンバの定義、
ClassA.ccpではClassA.hとDef.hがインクルードされています。
また、Def.hではresource.hがインクルードされているほか、#ifdnefを使って重複しないようにしています。


ビルドをすると、C2143構文エラーなど、ものすごい沢山のエラーが出てきてしまいます。


このようにヘッダとソースファイルを分割する場合、どのようにインクルード等をすればよいのでしょうか。



450:デフォルトの名無しさん
08/03/06 23:48:48
> ClassA.ccpではClassA.hとDef.hがインクルードされています。

とりあえずこのDef.hはインクルードしなくていいいような・・・

451:デフォルトの名無しさん
08/03/06 23:49:48
>>449
その文面だけを見る限り、ファイル分割のしかたもインクルードの仕方
も問題ないよ。エラーが出るのはファイルの内容がどこか間違っている
とか、何かの定義が足りないとか。



452:デフォルトの名無しさん
08/03/06 23:51:02
newを使って確保した領域をポインタとして返す関数を作ったんですけど、開放するにはどうすればいいんですか?
個人的には↓の方法でできるような気がするのですが、できるかどうか心配なので教えてください

char *func(){
char *buf = new char[1024];
//bufにデータを入れる
return buf;
}

int main(){
char *ptr = func()
//ptrであんな処理やこんな処理
delete [] ptr;
}

453:デフォルトの名無しさん
08/03/06 23:51:16
膨大な数のエラーと聞くと、本当に何か書き間違えている気がする。

454:デフォルトの名無しさん
08/03/06 23:55:48
初心者も上級者もnew使うならクラスでつかえよな
解放する方法を間違えたり、しなかったりする
クラスならデストラクタがする

455:デフォルトの名無しさん
08/03/06 23:56:25
>>452
どうでも話にはなるが、
メイン関数のファンクがカマを彫られたって泣いてるが、
わかっててほられたのかほられてないのか気になる。

456:デフォルトの名無しさん
08/03/06 23:56:44
>>452
それで特に問題はないが、

void func(std::vector<char>& buf) {
 buf.resize(1024);
 // buf にデータを入れる
}

int main() {
 std::vector<char> buf;
 func(buf);
 // buf であんな処理やこんな処理
}

とやった方が面倒がないし例外とかあっても確実にメモリが解放されるから安全で便利。

457:デフォルトの名無しさん
08/03/06 23:57:05
>>454
それ・・・なんの冗談?

458:デフォルトの名無しさん
08/03/06 23:57:48
日本語はおかしいが、要するに RAII ってことじゃね?

459:デフォルトの名無しさん
08/03/06 23:58:43
string buf

buf.reserve(1024)

&buf[0]

でも良い

460:デフォルトの名無しさん
08/03/06 23:59:30
それはちょっと・・・。
length 変わらないじゃんか。

461:デフォルトの名無しさん
08/03/06 23:59:47
>>451
あってますか…

1行目初っぱなから
Naive_Grid_Class.cpp(4): error C2143: 構文エラー : ';' が 'NaiveGridCtrl::ChkhCtrl' の前にありません。
などと出てきて(下のようなコード)

#include "DefHeader.h"
#include "Naive_Grid_Class.h"

BOOL NaiveGridCtrl::ChkhCtrl(){
    return (BOOL)hCtrl;
}

もう何が何だかさっぱりなんですが…

462:デフォルトの名無しさん
08/03/07 00:01:05
>>457

class ABC {
char *buf;
ABC(){確保}
~ABC(){解放}
};


main(){
ABC x;
}
とやれば簡単って事

463:デフォルトの名無しさん
08/03/07 00:03:17
呼ばれたタイミングだけでnewしたいとは限らんだろうに

464:デフォルトの名無しさん
08/03/07 00:04:43
>>461
class NaiveGridCtrl の最後の ; を忘れているんじゃないか?

465:デフォルトの名無しさん
08/03/07 00:08:16
質問です。
前から思ってたんだけど、
メモリの解放以外にデストラクタって使い道あるの?

466:デフォルトの名無しさん
08/03/07 00:09:25
データの残りを書き出す

467:デフォルトの名無しさん
08/03/07 00:11:43
リソースの開放

468:デフォルトの名無しさん
08/03/07 00:22:56
質問です。
C++で住所録を作っているのですがソートができません。
構造体に名前、住所、年齢、電話番号・・・など
項目ごとに入れるところまではできたのですが、
名前、住所、年齢、電話番号・・・など項目ごとに分かれているので、
名前なら名前だけがソートされてしまい他のはそのまま。
名前をソートしたらその順序で他の項目が付いてくるようにするには、
どうしたらいいのでしょうか。


469:デフォルトの名無しさん
08/03/07 00:24:16
>>468
まず、どうやってソートしてるんだ?
そこのプログラムみせてみ

470:デフォルトの名無しさん
08/03/07 00:24:24
>>468
え?なんでそうなるのさ?
ソートした順に構造体を並べ替えればいいだけじゃんw

471:デフォルトの名無しさん
08/03/07 00:25:22
名前だけ入れ替えてるんじゃねw

472:デフォルトの名無しさん
08/03/07 00:26:52
構造体にしてる意味がねぇw

473:デフォルトの名無しさん
08/03/07 00:27:37
名前をソートするんじゃなくて、名前のソート順通りに構造体のオブジェクトをソートするんだ。

474:デフォルトの名無しさん
08/03/07 00:33:47
int i = 1;
while(i <= 10){
fout[i].open("dat$i.dat");
fout[i] << i <<'\n';
i++;
}

てな感じでデータファイルを10個作りたいのですが、
""の内のiは変数と見てくれなくて困ってます。

何かいい方法ありませんか??

475:デフォルトの名無しさん
08/03/07 00:36:20
>>474
あたりまえだろw
こうすればいい
char filename[100];
sprintf( filename, "dat$%d.dat", i );
fout[i].open( filename );

476:デフォルトの名無しさん
08/03/07 00:36:50
>>474 stringstream

477:デフォルトの名無しさん
08/03/07 00:37:46
>>468

#include <iostream>
#include <string>
#include <set>
using namespace std;

class memberlist{
public:
string name;
string tel;
string adress;


memberlist(string a, string b,string c){
name=a; tel=b; adress=c;}

bool operator<(const memberlist& a)const{
if(name<a.name)return 1;return 0;}
};

main(){
set<memberlist> x;
x.insert(memberlist("山田太一","030000000","東京都"));
x.insert(memberlist("明石家明","077777777","沖縄県"));
x.insert(memberlist("佐藤一郎","051111111","大阪府"));

set<memberlist>::iterator p;
for(p = x.begin(); p!=x.end(); p++){
cout<< p->name <<" "<< p->tel <<" "<< p->adress <<endl;
}}

478:デフォルトの名無しさん
08/03/07 00:41:10
>>463
どちらにしろ管理クラスに入れとけば
デストラクタが勝手に delete してくれるだろ。

479:445
08/03/07 01:06:00
みなさんドモドモ

>>447
それそれ。それです。
fseek(fp, 0, SEEK_CUR);
が必要みたいなんですが
これがわからない。
カレントポジションから0バイト進めるのは
何もしないのと同じなのではないのでしょうか?

OSのAPIなどの場合
readしてそのままwriteする事でファイル位置が
自然に進む事が多い気がする訳ですが
この仕様はよくわからないです

これはC(ライブラリ)の明示された仕様なのでしょうか?

480:445
08/03/07 01:12:39
そうそう。あと一つ・・・
fwriteで1バイト書き込めたはずなのに
その1バイトはどこへ行ってしまったんでしょうか・・・

481:デフォルトの名無しさん
08/03/07 01:13:18
>>479
APIと違って、バッファリングするのが前提だからfseek()などでバッファを同期を取ることに決められている。

482:デフォルトの名無しさん
08/03/07 01:16:55
>>461
Naive_Grid_Class.h の最後に ; が足りないとか、
BOOLの定義がどこにもないとか。


483:デフォルトの名無しさん
08/03/07 01:17:54
>>480
同期を取っても書き換わらない?

484:デフォルトの名無しさん
08/03/07 01:22:57
>>475
そのようにすれば、できました!
ありがとうございます。
>>476
stringstreamも勉強します。

485:445
08/03/07 01:49:51
>>481
なるほど。仕様ですか・・・
多分FILE構造体の内容とかから必然なのかな?
直感的には把握が難しかったです

>>483
fseekはさめば書き換わりますが、
はさんでなくてもfwriteの結果が1というのが
納得いかず・・・
試しにfread/fwrite/fseek(fp, 0, SEEK_END)
というのもやってはみたけれどやはり書き換わらず・・・

486:デフォルトの名無しさん
08/03/07 02:03:11
int main(){
fin.open("aaa...
fout.open("bbb...
function(....);
}

function(.....){
  fout << "thanks" <<'\n';
}

のようにmain関数でデータファイルを開いて、
function関数の中に開いたファイル持ってきて、書き込みたいんですけど。
どうするのがいいのでしょうか?


487:デフォルトの名無しさん
08/03/07 02:11:36
>>486
ストリームを引数にとればいいんじゃねーの?

488:デフォルトの名無しさん
08/03/07 02:23:55
>>486
ストリームを大域変数にすればいいんじゃねーの?

489:デフォルトの名無しさん
08/03/07 02:48:25
>>486
ストリームを参照で取る
constで取ったらあかんよ

490:デフォルトの名無しさん
08/03/07 03:42:36
>>486
(ofstream& fout[], ifstream& fin[])
ってことですか??
参照型の配列は許されないとかなるんですが。。。
困り果てた。

491:デフォルトの名無しさん
08/03/07 03:47:08
>>490
何故いきなり配列に? >486では一言もそんな話が……

492:デフォルトの名無しさん
08/03/07 03:50:43
>>490
常考参照のポインタだろ

*&fout

493:デフォルトの名無しさん
08/03/07 04:00:42
#include <iostream>
これで通る

#include <fstream>

void sub(std::fstream* f)
{
 f[0];
}

int main()
{
 std::fstream f[10];

 sub(f);
}

494:デフォルトの名無しさん
08/03/07 04:17:54
>>493
すいません、素人目からはさっぱりなんですが。。。
fout,fin???どうなったのでしょうか??

495:デフォルトの名無しさん
08/03/07 04:25:17
>>494
配列だったらリファレンスではなくポインタで渡せばいいだけの話。

496:デフォルトの名無しさん
08/03/07 04:28:51
>>494
あんた>486=>490? >489に答えがあるのに、それをどう曲解したのか>490になって、
>491の質問を無視して>494みたいなこと言われても最早誰も対処できないぞ。

497:デフォルトの名無しさん
08/03/07 07:12:46
もらった回答をすっ飛ばす奴の神経がわからんね。
漢字読むのが面倒臭いからって、上の行↑を「もらったをすっばすのがわからんね」と読んで
「うーん、さっぱりわかりません」とか一人で勝手に困ってるようなものだろ。

498:デフォルトの名無しさん
08/03/07 08:49:37
どっちでもいいといえば どっちでもいいのですが、
現在ゲームを作ってまして、敵の動きを実装するのですが、
C言語で関数のポインタを保持し、タイミングが来たら 保持していた関数を呼び出すのと
C++で、基本のクラスを用意し、それから派生してポリモーフィズムで呼び出すのと どちらが良いでしょうか

開発規模は個人なのでそれほど多くならないです、ですがまだ、仕様が決まってないのでなんともいえないのです。

なにが不満かというと
Cだと 関数だらけになってしまう
C++だと 開発に時間がかかったら保守が大変そうなことです

499:デフォルトの名無しさん
08/03/07 09:01:36
作ったことがないが、C++に一票

500:デフォルトの名無しさん
08/03/07 09:03:21
迷ったらC++。これ鉄則。

501:デフォルトの名無しさん
08/03/07 10:54:41
>>498
Commandパターン or Callback by template

502:デフォルトの名無しさん
08/03/07 11:07:04
くだらない質問で申し訳ありません。

namespace myname{
hogehogehoooge;
}; //←

namespace mymyname{
hagehagehaaage;
} //←

コンパイル自体はどっちでも通ったのですが、どっちが本来の文法的に正しいのでしょうか。

503:デフォルトの名無しさん
08/03/07 11:25:44
コンパイラ的には上のセミコロンは空文があるってだけかと

504:デフォルトの名無しさん
08/03/07 11:43:35
>503
なるほど、納得しました。

505:デフォルトの名無しさん
08/03/07 13:33:34
物凄くくだらない質問なのですが教えてください

double x=1.0; int y = 10000;
int z = y * x;

この場合z=yって成り立つのでしょうか?

506:デフォルトの名無しさん
08/03/07 13:36:02
>>505
成り立つよ
浮動小数点の誤差がどうとか言う観点だよな?

507:デフォルトの名無しさん
08/03/07 13:57:06
はい、そうです
ありがとうございました

508:デフォルトの名無しさん
08/03/07 14:07:28
メンバに変数しかないクラス(ようするに構造体)を継承して、
それらのポインタをdynamic_castしたい場合、親クラスに
virtualな関数を無理やり入れておくしかないのでしょうか?

509:デフォルトの名無しさん
08/03/07 14:09:33
>>508
dynamic_castの意味分かって言ってる?

510:デフォルトの名無しさん
08/03/07 14:10:34
>>508
手っ取り早く済ませたいならそうだね。

手間がかかってもいいなら、たぶん dynamic_cast の必要性を
見直したほうがいいんだろうけど。

511:デフォルトの名無しさん
08/03/07 15:23:55
>>509,510
関数テーブルで引数が違う関数をまとめる場合に、
引数型を全部派生にして親クラスのポインタを
受け取るようにしとくと、キャストミスも無くて便利かなと
思ったんですが。
多分設計見直したほうが良いパターンなんでしょうね。

512:デフォルトの名無しさん
08/03/07 15:49:54
デストラクタを仮想にしておけば良いんじゃないかな

このパターンで自分もはまったな
引数に<list>をとるか可変長引数とか配列とか色々やり用はあるな


513:デフォルトの名無しさん
08/03/07 16:23:58
>>511
つテンプレートの特殊化

514:468
08/03/07 16:44:37
URLリンク(www.borujoa.org)

すみません。ド素人のプログラマですが、質問です。
なるべく上のファイルを利用してファイルソートを行いたいのですが、
これからどうすればいいのかわからず手が止まっております。
ソースではなく文章でいいので答えていただけますか?
filesortがファイルをソートする関数部分です。
つまりVectorとsortを使って何とかしたいわけですが、
この書き方であると要素ごとでしかソートできません。
もちろん要素だけのソートはできました。
なんかあとちょっと弄ればできそうな気がするんですが、
僕の脳ではどうしようもありません。
どなたかご指導ください。

私的にはsetさえ使えば100人力じゃぁみたいな感じになるので、
setを使いたくありません。その点も含めてよろしくお願いいたします。

あとこのソース見て「ここをこうした方がいいのでは?」と思う人はご指摘ください。
よろしくお願いいたします。勉強になります。

開発環境:CentOS 5
コンパイラ:g++
コンパイルエラー:無し

515:デフォルトの名無しさん
08/03/07 16:49:15
クラスについてさっぱりわかってないからこんなこと思うのかも知れませんが、
クラスの公開メンバ関数のアドレスを外部に教えてあげて、
そこから直接クラスの関数にアクセスすることってできますか?

具体的に言うと、Wik32APIでの、ウィンドウプロシージャに、クラスのメンバ関数を使いたいのですが…

516:デフォルトの名無しさん
08/03/07 17:06:28
>514
filesortの中身をちらっと読んだだけ。

・カンマ区切りを取り出す常套手段は
 1:スペース記号、タブ記号をすべて別の文字列で一旦置換
 2:カンマ記号をすべてスペースに置換
 3:stringstreamに流し込んで >> を使って読み込む
 4:1:で入れ替えてたのを元にもどす
 です。こうした方がいいです。

・名前を入れ替えたいだけじゃないんですよね?
 今のあなたのファイルは「名前データを取り出して、それをベクターに格納。そのベクターをソート」
 している「だけ」ですよ。
 あきらめてsetを使うか、set相当のものを自分で書くか、
 そうでなければsort相当のものを自分で書いてください。

・fin>>temp
 この部分は、もし入力ファイル中にスペースがあると困るのではないかと。
 nameに「Richard Feynman」って入ったら、Richardで切れますけど、いいんですか?
 一行取り出したいならgetlineを使いましょう。


517:デフォルトの名無しさん
08/03/07 17:07:45
>>511
普通の関数は仮想にするなよ
つEffective C++ 第38項

ダウンキャストはやめよう
つEffective C++ 第39項

というかEffective C++を購入して一読する事を強く勧める。

518:デフォルトの名無しさん
08/03/07 17:12:53
>>515
メンバ関数の実装は、クラスのポインタを引き渡していることが多い。
(thisポインタが引数としてわたっている)。
よって、関数ポインタを取ってきたところで、メンバ以外からマトモに使えません。

519:デフォルトの名無しさん
08/03/07 17:31:14
>>513
511じゃないが参考までにどういう形で実装するのか教えてくれませんか?
テンプレートを使った経験がないのでどういう風に使うのか見当がつきません

520:452
08/03/07 18:21:57
>>455-456
亀ですがレスthx
Winsockと同時に使うから文字列をstd::stringじゃなくてchar*で使ってたんですが、
例外処理さえつければ>>452のコードで大丈夫ですよね
あと、>>455のカマを掘られたって言うのがどうことかちょっと気になるんですが・・・

521:デフォルトの名無しさん
08/03/07 19:07:56
>>518
やっぱ駄目なんですか。
共通プロシージャ用意してmapしたのを検索する方向で考えてみます。

522:デフォルトの名無しさん
08/03/07 19:31:55
>>515
URLリンク(web.archive.org)

523:デフォルトの名無しさん
08/03/07 19:42:31
>>521
staticなメンバ関数なら問題ない

524:デフォルトの名無しさん
08/03/07 19:48:12
>>523
staticメンバ関数はstaticなメンバしかイジれないじゃん。

525:デフォルトの名無しさん
08/03/07 20:31:15
>>524
そうだよ。単にクラスという名前空間に閉じ込め、
protected/privateにできるという程度の意味しかない。

どっかからインスタンスへのポインタを得て、非静的なメンバ関数を呼ぶのが
静的メンバ関数のウィンドウプロシージャの仕事。
>>522

526:デフォルトの名無しさん
08/03/07 20:34:15
>>524
オブジェクトを作らずに呼び出そうとしてるんだからメンバなんていじる必要ない気が

527:デフォルトの名無しさん
08/03/07 20:42:15
>>515
サンクという手法でウィンドウプロシージャを書き換えて、ウィンドウハンドルの代わりにthisをスタックに積んでメンバ関数にジャンプさせれば?

528:デフォルトの名無しさん
08/03/07 20:47:14
boost::function

529:デフォルトの名無しさん
08/03/07 21:35:51
>>528
どうやってやるのさ

530:デフォルトの名無しさん
08/03/07 21:38:29
>>523-527
あ、オブジェクトではなく、クラスにひも付けすればよいのですね。

有り難うございました!

531:デフォルトの名無しさん
08/03/08 01:39:03
とあるクラスの派生クラス郡の中で一つの派生クラスだけ
関数の引数が異なることになってしまいました

こういう場合はどうしたらよいでしょうかorz

532:デフォルトの名無しさん
08/03/08 01:51:31
設計しなおす

533:デフォルトの名無しさん
08/03/08 01:52:10
>>531
全クラスに引数増やすとか(そしてデフォルト引数をつけておくとか)、
その派生クラスだけ別のメンバ関数で余分の引数を設定しておくとか、
引数の集合を何かクラスにまとめて、上位の概念に置き換えることで引数を共通にするとか。

534:デフォルトの名無しさん
08/03/08 01:53:54
dynamic_castしろと悪魔が囁いているぜ

535:デフォルトの名無しさん
08/03/08 01:56:46
>531
1. きっとやりたいことが間違ってるから考え直す。
2. boost::any とか boost::variant とかでぶちかます。

まぁもう少しやりたいことを詳細に説明するべきだろうね。

536:531
08/03/08 02:14:02
とある計測器と連携して、とあるプロセスを監視してそのデータをモニタに表示するのですが
今回のプロセスだけ表示させたいパラメータの数が増えてしまいました

監視プロセスが複数同時に走っていて、そのうち3つを同時に表示するようにするため
表示対象をユーザーが切り替えられるようにするため
表示クラスに監視クラスのポインタをつかって保持させています
監視クラスに
GetData(int OutputA, int dataB,int dataC)
という関数をよういしていたのですが
最新の計器が監視できるパラメータが増えてしまって・・・orz

537:デフォルトの名無しさん
08/03/08 02:22:28
>>536
そのシグニチャでGetだと言うのなら、参照かポインタ渡しじゃないの?
まあそれはいいとして。
パラメータの種類を指定して、データを1種類だけGetする関数を作ったら?

538:デフォルトの名無しさん
08/03/08 02:38:59
void calc(int& m, fstream* fio);

int main(void)
{
fstream fio[10];
char filename[10];
int m, steps;
steps = 7;
fio[0].open("calc0.dat");
m = 1;
while(m <= steps){
sprintf(filename, "calc%d.dat", m);
fio[m].open(filename, ios::in | ios::out);
m++;
}
m = 1;
while(m <= steps){
calc(m, fio);
m++;
}
return 0;
}

539:デフォルトの名無しさん
08/03/08 02:43:13
void calc(int& m, fstream* fio)
{
int i, j;
int a, d[100];
j = 1;
while(j <= 3){
fio[m-1] >> a;
d[j] = a;
j++;
}
j = 1;
while(j <= 3){
fio[m] << d[j] <<' '<< j <<'\n';
j++;
}
}
calc0.datの中身
5
16
77

基本的にすべてのデータファイルが同じになるようにプログラムを書いたのですが。
うまくいかないです。どこか間違っていますか?

540:デフォルトの名無しさん
08/03/08 02:43:52
void calc(int& m, fstream* fio)
{
int i, j;
int a, d[100];
j = 1;
while(j <= 3){
fio[m-1] >> a;
d[j] = a;
j++;
}
j = 1;
while(j <= 3){
fio[m] << d[j] <<' '<< j <<'\n';
j++;
}
}
calc0.datの中身
5
16
77
基本的にすべてのデータファイルが同じになるようにプログラムを書いたのですが。
うまくいかないです。どこか間違っていますか?

541:デフォルトの名無しさん
08/03/08 09:11:50
>>540
>どこか間違っていますか?
あんたの説明。
結果がどうなったのか、どうなるつもりだったのか(これは全てcalc0.datと同じになるということか)、
実行した環境と処理系は何か、位のことは書いても罰は当たらんよ。

542:511
08/03/08 11:33:07
昨日の続きなんですが、引数のの違う関数を
まとめた関数テーブルって、どう実装するのが
良いでしょうか?
>512のようにlistや可変長引数だと、個数が
違う場合には有効ですが、構造体を渡す場合には
無理があると思えます。
(構造体の要素をPOD型に分解してlist化するとか?)

>513で書かれた特殊化では、どう実装するのかが
全く閃きませんorz
キャストを使う以外で違った構造体やクラスを
スムーズに(できれば低コストで)渡す方法ってあるのでしょうか?

543:デフォルトの名無しさん
08/03/08 11:41:16
>>542
昨日の続きと言われても状況を把握するために過去に遡って読むのは面倒なので目的を詳しく。
まぁ、よくあるGUIライブラリの実装などでは構造体を丸ごと渡すのではなく汎用ポインタを渡す形が多いけどね。

544:511
08/03/08 11:42:33
なお今自分が使ってた方法だとこんな感じです。

class ArgBase { //引数親
public:
 virtual ~ArgBase(){};
}

class Arg1 : public ArgBase {
public:
 int arg;
}
//以下必要なだけArgBaseを引き継いだ構造体を作る

//関数テーブル
typedef bool(*pFunc)(ArgBase*) FUNCPTR;
FUNCPTR fuctable[10];
fnctable[0] = Func1;

//関数例
bool Func1(ArgBase *pArg) {
 //これがArg1が必要な関数なら
 Arg1 *ptr = dynamic_cast<Arg1*>(pArg);
 if(ptr == NULL) return FALSE;
 //処理
 return TRUE;
}

545:デフォルトの名無しさん
08/03/08 15:49:36
久しぶりにプログラムを組むのですが、初歩的なことが分からないので
教えてください。昔


float a;
a=1.0

と1ではなく1.0にしなさいと教わったのですが、その詳しい理由を
忘れました。
どうしてなのでしょうか?


546:デフォルトの名無しさん
08/03/08 15:56:19
>>545
1.0も中途半端だな。1.0fと書け。
1と書くとそれはint型になる。
1.0と書くとdouble型になる。
1.0fと書くとfloat型になる。
intやdoubleからfloatへの変換は警告が出る可能性があるので、
代入先と同じ型にしておけということ。生成される機械語は同じだろうけど。

547:デフォルトの名無しさん
08/03/08 16:23:22
>>543
やはり間違わないように気をつけてvoid*で渡してキャストするのが
常套手段なんですかね。

548:デフォルトの名無しさん
08/03/08 16:25:25
あと、
typedef bool(*pFunc)(ArgBase*) FUNCPTR;
じゃなくて
typedef bool(*FUNCPTR)(ArgBase*);
でしたorz

549:デフォルトの名無しさん
08/03/08 17:09:29
現在、勉強がてらに、Windows用のクラスライブラリを無意味に作ってるのですが
dynamic_castって良い機能ですねぇ
基本クラスに無意味に仮想関数を突っ込まなくても、派生クラスの機能が使えるなんて嬉しすぎる


550:デフォルトの名無しさん
08/03/08 17:12:08
dynamic_cast禁止

551:デフォルトの名無しさん
08/03/08 17:12:19
は?

552:デフォルトの名無しさん
08/03/08 17:12:46
すげークラスライブラリきた

553:デフォルトの名無しさん
08/03/08 17:24:08
俺も今無意味にgtkのラッパークラスライブラリ作ってるよ!

Window wnd("sample",MAIN_WINDOW);
vBox box(MAIN_WINODW);
Label sample_label("sample",MAIN_WINDOW);
Button ok_button("OK",MAIN_WINDOW);

CREATE(MAIN_WINDOW);

ok_button.clicked(func);

box << sample_label << ok_button;
wnd << box;

CONSTRUCT(MAIN_WINDOW);

みたいにmain関数の中で書いたらコンパイルが通るようになるやつ。
今マニピュレーター実装中。

554:デフォルトの名無しさん
08/03/08 17:26:54
これだから演算子多重定義が叩かれるわけだ。

555:デフォルトの名無しさん
08/03/08 17:49:29
>>550
ごめんねごめんね(*‘ω‘ *)
void __fastcall TForm1::N1Click(TObject *Sender) {
 TMenuItem* menu = dynamic_cast<TMenuItem*>(Sender);
 switch(menu->GroupIndex)  {
  case 1:
   switch(static_cast<TSortDirection>(menu->Tag)) {
    case sortLarge:
     break;
    case sortSmall:
     break;
   }
   break;
   case 2:
    switch(static_cast<TLogOutputMode>(menu->Tag)) {
     case logList:
      break;
     case logSingleLine:
      break;
    }
    break;
 }
 UpdateTitle();
}


556:デフォルトの名無しさん
08/03/08 18:05:19
Cらしいプログラムですなあw

557:デフォルトの名無しさん
08/03/08 18:05:55
これなら適切にdynamic_castを使っている場面に見える。

558:デフォルトの名無しさん
08/03/08 18:08:50
TForm1とかN1Clickとかいただけない

559:デフォルトの名無しさん
08/03/08 18:17:40
すみません。えらく単純な質問なんですが、
C++で「なんでもいいからキーを押すと続行」
というのはどうすれば実現できるのでしょうか?
文字列や数字を読み取らせる方法は知ってますし、
ググればいくらでも出てくるのですが、
「いったん入力待ちしていかなるキーを押しても構わず実行」
という風にしたいのです。

もちろん数字読み取らせて適当な数+ENTERという風に組めば
手間が増えるだけで大体同じことはできるます。
しかし、あるデータの異常値の原因を調べるため、
異常のたびにそのデータをグラフにして打ち出させたいんですが
たぶん三万回くらいやらなきゃならないんです・・・

560:デフォルトの名無しさん
08/03/08 18:25:40
OSによる

561:デフォルトの名無しさん
08/03/08 18:26:01
そこでpdcurses(ncurses)

562:デフォルトの名無しさん
08/03/08 18:27:06
enterキーのみ反応でいいならgetchar()でもなんでもいけそうな気がする

563:560
08/03/08 18:33:28
ありがとうございます。getcharでいけました

564:デフォルトの名無しさん
08/03/08 18:33:56
>546
ありがとうございます。
元がfloatなのにいらないお節介しなくても良さそうなのに。


565:デフォルトの名無しさん
08/03/08 18:34:05
559の間違いです。すいません

566:デフォルトの名無しさん
08/03/08 18:46:22
msxml6.dllを使ってXMLのデータを取得しようと思っているのですが、
要素の属性の取り方だけ分かりません。
どのように取り出せばいいのでしょうか?

567:デフォルトの名無しさん
08/03/08 18:48:37
>>564
>元がfloatなのにいらないお節介しなくても良さそうなのに。
大きな勘違いをしている悪寒。

568:デフォルトの名無しさん
08/03/08 19:22:34
もうなんて言うか、初心者とかそういうレベルですらないんですけど、
昨日小一時間このミスに気づかなくてバグと死闘していたので…

int a,c,x;
unsigned int b;

x = max(-c, min(x, a - b));
としたとき、

(a-b)がunsigned intとして評価されてしまうのですが、

こういうとき、オペレーターの戻り値の語ってどうやって決まるんですか?
どこかの本では、大きい方に丸められるとか何とか書いてあった気がするんですが…
実際どのような規則になっているんでしょうか?

569:デフォルトの名無しさん
08/03/08 19:30:35
>>568
算術型の標準変換、整数の格上げとか
そんなもんどの本にも載ってるだろ。

570:デフォルトの名無しさん
08/03/08 19:30:57
>>564
>元がfloatなのにいらないお節介しなくても良さそうなのに。
もとがdoubleの値(1.0)をおまいが勝手にfloat型の変数に入れようとしているのを
コンパイラさんは(おせっかいかなと思いながらも)教えてくれようとしている。

レベルアップするためにも、人の忠告は素直に聞こうな。

571:デフォルトの名無しさん
08/03/08 19:35:44
>>570
おまえはサル

572:デフォルトの名無しさん
08/03/08 19:37:00
サルなら反省できる

573:デフォルトの名無しさん
08/03/08 19:43:39
>>570
お前・・・なんという読解力のなさ・・

574:デフォルトの名無しさん
08/03/08 19:46:59
>>570の言うことは間違ってないような・・・

575:デフォルトの名無しさん
08/03/08 19:48:09
>>570は正しい事を言っている気がするが
オレも読解力がないのだろうか

576:デフォルトの名無しさん
08/03/08 19:53:38
皆無

577:デフォルトの名無しさん
08/03/08 19:54:05
レスをたどると元々は
float a = 1;
のような気がする

578:デフォルトの名無しさん
08/03/08 19:59:33
>>577
それだとfloat変数の初期化だよね。
もともとは以下のようにfloat←doubleの代入だったはず。
>float a;
>a=1.0


579:デフォルトの名無しさん
08/03/08 20:08:18
>>569
持ってる本は2冊ともunsignedまでは書いてないんだが…
駄目なの使ってるのね…(一つは学校指定だけど)


算術型 標準変換 でググったら見つかりました、有り難う。

long double > double > float > unsigned long int > long int > unsigned int > int
int > unsigned int だとばっかり思ってた。
(表現力が大きい方に…ってかいてあるからマイナスが表現できる方が上なのかと…
 よく考えてみたら、表現できる値の絶対値はunsignedの方が大きいけど。)

580:デフォルトの名無しさん
08/03/08 20:15:02
>>566
DOMだったら、selectNodesとかselectSingleNodeとかを使えばいいよ。

581:デフォルトの名無しさん
08/03/08 21:20:47
>578
最初に書き込んだものです。
多分みなさんが思っているよりもっと初歩的なことが
分かっていないのだと思います。
正直doubleとfloatの違いが精度の違いでfloatがメモリ確保の
ためだけに使われるぐらいにしか考えていません。
情報落ちや桁落ちの問題でここまでするのでしょうか?

正しい解釈はこうですか?

int a;
float b;
double c;

a=1;
b=1.0f;
c=1.0;




582:デフォルトの名無しさん
08/03/08 21:23:45
>581
すいません。もう少し質問させてください。
何のためにここまでするのかと言う部分です。
情報落ち、桁落ち、丸め誤差、その他
このうちのどれですか?


583:デフォルトの名無しさん
08/03/08 21:31:40
おっもくそ大量の数値データを扱うときはdoubleじゃなくてfloatにするなぁ・・・
で、単純に、floatを準備したからにはfloatを突っ込む。と。

584:デフォルトの名無しさん
08/03/08 21:37:28
>>581
何をどう解釈しているのか分からないが…。

1や1.0などの定数自身も型を持っていることは理解している?
その定数をどの型の変数に代入するかに無関係に、定数自身が型を持っている。
1 ← int型
1U ← unsigned int型
1.0 ← double型
のように。

>情報落ち、桁落ち、丸め誤差、その他
この場合は、その他。
実数の1.0という値は、double型でもfloat型でも桁落ちも丸め誤差もなく正しく表現できる。

ここで指摘されているのは、定数の書式としてfloat型の定数を表現できるのだから
それを使用したほうが適切だろう、ということ。

精度の大きい型の値を精度の小さい型の変数に代入しても、桁落ちなどがなければ全く問題ない。
桁落ちなどがあるとしても、それを意図して書いているなら動作としては正しい。
でも意図したものかどうかプログラムを他人が読んでも分からないので、そのような場合は明示的なキャストをしたほうがいいこともある。
この場合はキャストなんかせず、定数を明示的にfloat型で書けばいい。

585:デフォルトの名無しさん
08/03/08 21:39:04
定数の1は整数型だが、実数に変換しても何にも問題ないので
int a = 1;
float b = 1;
double c = 1;
としてしまうなぁ。
# ただし、float b = 1.0としてしまうとdouble値からfloat値からのキャストになるのでコンパイラによっては巧くないね。

586:デフォルトの名無しさん
08/03/08 22:09:18
>584-585
早速のレスありがとうございます。
よく分かりました。

>この場合は、その他。
>実数の1.0という値は、double型でもfloat型でも桁落ちも丸め誤差もなく正しく表現で>きる。

そう思っていたのに何故そこまでこだわるのだろうと思っていたら、
定数の型のことを言っていたんですね。


587:デフォルトの名無しさん
08/03/08 22:20:53
マルチスレッドのプログラムでSTLは使えないと聞いたのですが、本当ですか?
あと、_PTHREADSをdefineすれば使えるとも聞いたのですが、、、
googleしても、結構昔の情報が多くて実際のところはどうなのかよく分かりませんでした。


588:デフォルトの名無しさん
08/03/08 22:23:39
FedoraとWindowsでソースレベルで100%互換のアプリケーションを
作ろうとしているのですが、現実的ではないでしょうか?
またどの辺に気をつけて開発した方が良いでしょうか?

内容は不特定多数のPCとsocket通信でバイナリデータをやりとりし、
内部でPostgreSQLにアクセスする、いわゆるサーバアプリケーションです。

開発はほぼ全面的にWindows側(VisualC++.net2003)で行い、
1日2度程、Fedoraでも動作テストをする予定です。

589:デフォルトの名無しさん
08/03/08 22:56:48
>>587
そういうときは、闇雲にググるのではなく、
自分の使っているライブラリのマニュアルを読め。

例えば、Visual C++もlibstdc++もスレッド安全性についての文書がある。
URLリンク(msdn2.microsoft.com)(VS.80).aspx
URLリンク(gcc.gnu.org)

590:デフォルトの名無しさん
08/03/08 22:58:30
かつてKylixという開発環境があってですね

591:デフォルトの名無しさん
08/03/09 03:48:11
>>588
完全に.NET上に載せてしまってMONO使うとか。
俺は使ったことないけど

592:デフォルトの名無しさん
08/03/09 03:56:01
一つお伺いしたいのですが,FLVなどの動画をweb上からdownloadし,
てローカルに保存するプログラムを作りたいのですが,
どのようなライブラリを使えばいいのでしょうか?

ライブラリなどなく自分で作るしかないのでしょうか?

593:デフォルトの名無しさん
08/03/09 04:02:45
ダウンロードするライブラリはあるが、アドレスを発見するライブラリはない

594:デフォルトの名無しさん
08/03/09 04:10:04
レスありがとうございます.
アドレス入力は手動でやろうと思っています.

ダウンロードするライブラリはあるんですね.ありがとうございます



595:デフォルトの名無しさん
08/03/09 04:14:05
Youtubeの動画がおいてある場所がわかれば
ZIPやEXEやAVIやMP3を落とすのと同じ
場所がわからなければ無理
動画が見られるアドレスと違う

596:デフォルトの名無しさん
08/03/09 05:39:49
祭りらしい

【ひめはじめ】その7
スレリンク(megami板)
【ひめはじめ】その8
スレリンク(megami板)

597:デフォルトの名無しさん
08/03/09 09:17:25
>>588
ソケット通信をどうにかする必要がある。
WindowsとPOSIXで似て非なるAPIを持っているから、
自分でラップするなり既存のライブラリを使うなりしないといけない。

598:デフォルトの名無しさん
08/03/09 09:51:30
先にSTLについて質問したものです。
教えてもらったファイルとかを見てみたのですが、マルチスレッド環境で
std::cout に何かを書き出す時、いちいちロックをとらないとだめなようですが、
ロックの必要ないcout相当のものはないでしょうか?
自分でinline関数を作ってつかうようにはしたのですが、、


599:デフォルトの名無しさん
08/03/09 10:33:05
ごめんマクロだった
boost::mutex mutex_io;
#define safe_cout(m) { \
boost::mutex::scoped_lock lock(mutex_io); \
m \
}
int main() {
safe_cout(
std::cout << "hello" << std::endl;
);
こんな感じ。

600:デフォルトの名無しさん
08/03/09 11:39:46
頭がこんがらがってきたのですが、
クラスmyclassの大きさをnバイトとして、次のように定義すると、
myclass *A;
A = new myclass[x];
myclass B[x];
sizeof()の戻り値が
n ← sizeof(myclass),sizeof(*A),sizeof(*B)
4 ← sizeof(A)
x*n ← sizeof(B)
となるわけですが、AとBにはどういう違いがあるんでしょうか

601:デフォルトの名無しさん
08/03/09 11:45:03
配列とポインタの違い。

ちなみにsizeof (*B)は、Bが配列型→ポインタ型への変換を受けた後、
それに単項*演算子を適用しているので、B型のインスタンスをsizeofにかけていることになる。


602:デフォルトの名無しさん
08/03/09 11:56:08
Aはポインタ型(配列の先頭を指す)
Bは配列型(値は配列の先頭を指すポインタ)
ってことでしょうか
両方A[0].xとかB[1].xでクラスのメンバ変数xにアクセスできるので、
イマイチ区別が付きませんでした



603:デフォルトの名無しさん
08/03/09 12:13:17
配列型のインスタンスは、原則として式の中でその先頭要素を指すポインタに変換される。
(sizeof Bのように直接sizeofの演算対象にするのはその例外の1つ)
それで、[]演算子は常にポインタを対象にしている。

このページの中程にそういう話がある。
URLリンク(kmaebashi.com)

604:デフォルトの名無しさん
08/03/09 12:32:06
cout << Bでどう考えてもBがポインタだったのは、
自動で変換されていたためでしたか
そのページを参考に基本的な部分を整理しようと思います
ありがとうございました

605:デフォルトの名無しさん
08/03/09 17:48:09
これの直しかたわかりませんか?
コンパイル時にアットマークがついてしまいます

Error 42: Symbol Undefined _WSACleanup@0

606:デフォルトの名無しさん
08/03/09 17:58:46
それはstdcall関数の仕様。
@がどうとか関係ないから、ws2_32.libか何かをリンクしろ。

607:デフォルトの名無しさん
08/03/09 18:03:44
C++の入門書のお勧めは?

608:デフォルトの名無しさん
08/03/09 18:04:43
accelerated C++

609:デフォルトの名無しさん
08/03/09 19:12:41
>>607
猫でも分かるC++言語プログラミング

610:デフォルトの名無しさん
08/03/09 21:05:34
>>608
そ・れ・は・な・い

611:デフォルトの名無しさん
08/03/09 21:22:02
>>610
え、そうなの?
>>608見てアマゾンに注文したばかりなんだけど。

612:デフォルトの名無しさん
08/03/09 21:29:54
>>611
評判はとてもいいのですが
入門向きでは無いだろあれw

C++が初めてで、他になにかやってたってとかならまだいいんだろうけど

613:デフォルトの名無しさん
08/03/09 21:30:27
>>611
読む価値は非常に高い良書。
ただ入門書を探してる人のレベルによっては
難しいと感じるかもしれないというだけのこと。
いずれ読むべきだから買っておけ。

614:デフォルトの名無しさん
08/03/09 21:42:41
JavaやC#でいうところのInterface的なものを真似る場合
class IHogeの中に実装があってもいいのでしょうか?

615:デフォルトの名無しさん
08/03/09 21:48:02
実装があるならabstractクラスを真似るべきじゃね

616:デフォルトの名無しさん
08/03/09 21:57:55
多重継承最強!

617:デフォルトの名無しさん
08/03/09 22:06:06
>>614
「真似る」のなら駄目
C++的にIHogeの中に実装があってもいいかどうかは別ね

618:デフォルトの名無しさん
08/03/09 22:25:57
accelerated c++ はベターCでなく C++ らしいやり方で進めてるところが好き

619:デフォルトの名無しさん
08/03/09 22:30:02
いずれ読むべきという点で「C++の設計と進化」をお勧(ry

620:デフォルトの名無しさん
08/03/09 23:17:51
独習C++やらロベールやら色々あるから
本屋でとりあえず立ち読みでもしてみれ。
ネットでポチっと買うと合わなかった時悲惨。

621:デフォルトの名無しさん
08/03/09 23:42:18
現行規格とはずれているがARMの内容は秀逸。

622:デフォルトの名無しさん
08/03/09 23:53:59
今のところ、入門に向いてるのは609の
猫でも分かるC++言語プログラミングだけだなw

>>607
「猫でも~」は本買った方がいいけど(著者にとって)、webでも見れるよ。
URLリンク(www.kumei.ne.jp)

623:デフォルトの名無しさん
08/03/10 00:02:50
じゃあ一発

これならわかるC++ ブルーバックス版

624:デフォルトの名無しさん
08/03/10 00:04:46
>>614
それなんてCOM?

625:デフォルトの名無しさん
08/03/10 00:05:50
猫でもを妙に推している人がいるな。
本人なのか、信者なのか。

626:デフォルトの名無しさん
08/03/10 00:08:18
猫でもわかるシリーズにC++編はないわけだが

627:デフォルトの名無しさん
08/03/10 00:10:15
ググったら確かに。書籍化されてるのは C だけだな。
じゃあ本人ではないなw

628:デフォルトの名無しさん
08/03/10 00:10:15
webにはちょっとあるけど全然使えない

629:622
08/03/10 00:13:06
>>625
推してるの一人じゃね?
俺はwebでも見れるよって言いたかったの。
"だけだな"って言ったのはacceleratedとかD&Eとか無茶やろって思ったからw

630:デフォルトの名無しさん
08/03/10 00:16:03
>>628
あれって全部じゃなかったんだ・・・

631:デフォルトの名無しさん
08/03/10 00:18:10
独習やロベールは別に無茶じゃないだろ?

632:デフォルトの名無しさん
08/03/10 00:21:07
>>625
猫は素人でも知ってる場合があったぞw

素人メールに猫の話があった時には目を疑った。
Web主体の素人さんにはPG的に一番名度高いのかも知れんね。

633:デフォルトの名無しさん
08/03/10 00:23:37
>>631
ごめん"立ち読みしてみれ"のあたりしか読んでなかった。
独習は良いかもね。

634:デフォルトの名無しさん
08/03/10 00:25:03
猫でもはサンプル動かして改造するのには最適
入門書読んで、猫でもで遊んで、オブジェクト指向とか良いプログラミング作法でも学んでいけばいいんじゃね

635:デフォルトの名無しさん
08/03/10 01:34:18
C言語を独学で学んでいるのですがよく分からない文字(演算子?)があります
->
↑これはどういった意味の物なのでしょうか?

636:デフォルトの名無しさん
08/03/10 01:37:35
アロー演算子

637:デフォルトの名無しさん
08/03/10 01:38:56
>>635
A* a = new A();

//以下の2行は同じ
(*a).aaa();
a->aaa();

638:デフォルトの名無しさん
08/03/10 01:41:57
>>635
ポインタptrが指す構造体のメンバmemである
(*ptr).mem を ->演算子を用いて
ptr->memと表す。

a -> b は、aが指す構造体のメンバbを表す。

639:デフォルトの名無しさん
08/03/10 01:45:26
>>636-638
良く分かりました。ありがとうございます。

640:デフォルトの名無しさん
08/03/10 01:56:28
俺は (*a) も a-> も導入せずに、
同じ意味で a@ みたいな演算子が欲しかったよ・・・
[0]の構文糖衣として。

a@.aaa();
a@ += 10;
a@++;
まぁ、提案するとしても20年くらい言うのが遅い(C言語宛てになるし)わけだけど。

641:デフォルトの名無しさん
08/03/10 02:03:40
Delphiみたいに ^ がいいな

642:デフォルトの名無しさん
08/03/10 02:22:49
そうなると、定義もDelphiっぽくA^ a;になってC++/CLI設計者が涙目w

643:デフォルトの名無しさん
08/03/10 02:26:36
A$でおk

644:デフォルトの名無しさん
08/03/10 02:53:11
>>640
そもそも*(ついでに&も)が後置だったら良かったと俺は思う。
なんで前置にしたんだろう。

645:デフォルトの名無しさん
08/03/10 02:57:37
それを言い出すとなんで関数ポインタの宣言はあんなに狂ってるんだとかそういうハナシに

646:デフォルトの名無しさん
08/03/10 03:09:58
そもそもなんでこんな話題話してんだという話になる

647:デフォルトの名無しさん
08/03/10 03:24:32
>>644
たしかに。後置で良いよな。

>>646
void 635(){
  640();
}

648:デフォルトの名無しさん
08/03/10 03:46:23
何故前置にしたのか気になってD&Eちょっと見て
C言語の設計者の方じゃないと意味無いことに気付いた

649:デフォルトの名無しさん
08/03/10 05:09:56
素人の友達にWindowsプログラミングしてみたいから
いい本ないかと聞かれて猫でもわかる~を薦めたら
馬鹿にするなと怒られた。

他意はなかったんだが、うかつだったわ。

650:デフォルトの名無しさん
08/03/10 06:44:56
それだけ聞くと、なんか馬鹿っぽい友達だな。

651:デフォルトの名無しさん
08/03/10 07:25:43
数学でも単項演算子は前置である割合が多いから、
特別な理由をその時思いつかなければ
まず後置にはしないと思う。

652:デフォルトの名無しさん
08/03/10 09:54:49
オブジェクトの排他制御というのはマルチスレッドで処理するとき以外は気にしなくて良いのでしょうか?

というか、マルチスレッドを利用する場面というのはどういうときなのでしょうか

653:デフォルトの名無しさん
08/03/10 10:01:09
マルチスレッドでぐぐれよもう

654:デフォルトの名無しさん
08/03/10 11:21:28
>>652
ウンコしながらオナニーとか

655:デフォルトの名無しさん
08/03/10 11:50:51
>>652
GUIアプリなんかで通常の機能を提供しながら重い処理をバックグラウンドでやるとか

656:デフォルトの名無しさん
08/03/10 11:56:51
>>654
流石にそれは難しいだろう。

>>652
トイレで出すもの出しながら飲食するとか。

657:デフォルトの名無しさん
08/03/10 12:20:13
>>649
猫でもわかる~のサイトは、中身はいいけど、体裁がなぁ...
プログラムの入門サイトなんだし、HTMLのタグぐらい、もうちょっと調べようよつとか思うよね...


658:デフォルトの名無しさん
08/03/10 12:24:13
文章が読めたら何でもいいだろ・・・

659:デフォルトの名無しさん
08/03/10 12:32:21
本人乙

660:デフォルトの名無しさん
08/03/10 12:34:24
むしろプレーンテキストでいい

661:デフォルトの名無しさん
08/03/10 13:33:18
Delphiなんかの ExpandFileName関数(相対パスを絶対パスにする)と
同じ働きをする関数って VC++ だとなんて関数?

662:デフォルトの名無しさん
08/03/10 13:37:42
GetModuleFileNameでがんばるとか

663:デフォルトの名無しさん
08/03/10 13:44:38
VC++標準じゃないが、boostにパス変換がある。
boost::filesystem::system_complete

664:デフォルトの名無しさん
08/03/10 13:45:59
>>662
何故GetModuleFileName()?
あれはカレントからの相対パスを解決する関数なんだから、モジュールからの相対パスにしちゃダメだろう。

665:デフォルトの名無しさん
08/03/10 13:54:07
GetFullPathNameは駄目なの?

666:デフォルトの名無しさん
08/03/10 13:56:31
クラスのメソッドから、クラスのインスタンスの変数名を知る方法ってありますか?
具体的には、
class test {};
test a1;
a1.method();
としたとき、method内でa1という名前をしることは出来ますか?

667:デフォルトの名無しさん
08/03/10 14:05:01
>>666
ムリ

668:デフォルトの名無しさん
08/03/10 14:07:08
>>666
thisでよくね?

669:デフォルトの名無しさん
08/03/10 14:12:44
面倒だがコンストラクタの引数で変数名を文字列受け取るようにして
自分で保持するってのは?

class test {
 std::strung instance_name;
public:
 test(const char *pName) {
  instance_name = pName;
 }
}

test a1("a1");

670:デフォルトの名無しさん
08/03/10 14:15:06
変数名が知りたいっていう状況がわからんのだが
どう使うの?

671:デフォルトの名無しさん
08/03/10 14:26:04
>>667-670
ありがとうございます。
用途はデバッグです。あるクラスの中身を表示させているのですが、
どのインスタンスかがわかりやすいようにしたかったので、、
自動化したいので、コンストラクタの引数に書くのは避けたいです。
が、これが一番確実ですかね。


672:デフォルトの名無しさん
08/03/10 14:30:23
>>671
Use the debugger, >671

673:デフォルトの名無しさん
08/03/10 14:32:57
デバッグ用途ならマクロの文字列化演算子 # を使うとか

674:デフォルトの名無しさん
08/03/10 14:44:44
>>671
どういう環境かは知らんが>>672の言うようにデバッガ使ったらいいと思う

675:デフォルトの名無しさん
08/03/10 15:03:47
>>671
何らかの制限で、デバッガが使えない場合
デバッグログが使えるのならば、
生成した側が、確保されたアドレスを出力(__FILE__と、__LINE__も一緒に出力するとわかりやすい)

クラスの中身を表示するところでthisを表示すればいいんじゃないかな?

>>674
なかなか面白い書き込み時間だ


676:デフォルトの名無しさん
08/03/10 16:52:05
URLリンク(www.borujoa.org)

簡易ブラウザを作っているのですが、ソケット接続エラーがでます。
どこが原因か分かりません。教えていただけませんか?

677:デフォルトの名無しさん
08/03/10 18:03:29
>>676
htonsとか?

678:デフォルトの名無しさん
08/03/10 18:06:29
>>676
基礎からやり直せ。

679:デフォルトの名無しさん
08/03/10 19:01:42
         ハ,,ハ  
        ('(゚∀゚∩_ おいらをどこかのスレに送って!
      /ヽ   〈/\ お別れの時にはお土産を持たせてね!
     /| ̄ ̄ ̄|.\/
       |dexiosu|/
        ̄ ̄ ̄
現在の所持品:たばこ・ライター・コーヒー・ブラックブラック・枕・ケータイ電話
睡眠薬・聖教新聞 ・ダッチワイフ・外付けSCSI340MHDD・ネットランナー4月号
TYG02・小嶋進社長・ペプシNEX・モツ煮・ヌルポ・伊予柑・寒いギャグ ・7年ものキムチ
・カビキラーストロング ・ハイスクール奇面組文庫版全13巻 ・(元)関内太郎 ・チャッカマン
・ぺヤングソースやきそば・魔法先生ネギま!14巻限定版 ・小田急3000形・PSP
・デスノート ・ファブリーズ ・ポーション ・SH902i ・Windows3.1

680:デフォルトの名無しさん
08/03/10 19:11:21
>>676
生ソケットでHTTPをやるプログラム例はウェブにやまほど転がってるか
ら、それらを見て何が足りないか調べてみましょ。
gethostbyname()やsocket()のエラーチェックもしましょ。

それ以外にもツッコミ所が多いけど致命的じゃないので省略。



681:676
08/03/10 20:26:39
うん、何か知らないけど分かって言ってるのか分かってないのかようわからん、
役に立たない情報ありがとう。

682:デフォルトの名無しさん
08/03/10 20:37:07
>>680
例えばnewしてdeleteしないのは、それが習慣化すると致命的だと思うぞ。

>>676
ということで、>678。
まさかとは思うが、そのレベルで外部に直接繋ぎに行くなよ。
接続先に迷惑掛けることになるからな。

683:676
08/03/10 20:44:42
>>682
いまどきのパソコンは自動で解放するから別にデリートしなくていいし
(つーかdeleteしなかったのはこの程度のプログラムだったらいらんし面倒くさいからで)、
その機能的な面を考えておるんだったら、最初っから一気にメモリ確保しといて、
解放しますよ。あと、ポート80に設定してないとか言われてたが、
あれはポート80に設定しなかったら自動で80に設定してくれるからで、面倒くさいから。
socket()のエラーチェックしなかったのは、面倒くさかったからで。

684:デフォルトの名無しさん
08/03/10 20:48:29
>>682
newしてdeleteしない習慣がついてます、サーセンwww。
vectorとかshared_ptrがないと生きていけません。

685:デフォルトの名無しさん
08/03/10 20:49:11
お前に教えるのが面倒くさいわ。

686:デフォルトの名無しさん
08/03/10 20:49:20
きみのところの石がPowerPCとかMIPSとかでないなら、
iprt.sin_port=80;

iprt.sin_port=20480;
にするといいお

687:676
08/03/10 20:50:38
>>684
俺もC++で、ついこないだまで必死でc_str( )使ってた。

688:デフォルトの名無しさん
08/03/10 20:52:26
newはクラス以外で使うなよ
STLのように自動開放する以外には使うべきでない

689:676
08/03/10 20:53:06
>>686
あぁ消したハズなのに普通に代入してたの残ってた。
このことか。ありがとう。

てか20480って怪しいポート何?

690:デフォルトの名無しさん
08/03/10 20:54:16
deleteめんどくさいならnewしなきゃいいって発想はないのかなぁ。
悪くてもこの場合固定長配列でいいし、もっと言えばstringを使うべきところ。
全く意味のないnewじゃん。

newしてdeleteしないのが致命的にならないのはこのサイズのバイナリだからであって、
自動でやるからデリートしなくて良いって考え方は非常に危険。くせにするなって言う意見のがもっとも。
たとえば、photoshopみたいなソフトを作ってる人がnewしてdeleteしなかったらどうなるか。

691:デフォルトの名無しさん
08/03/10 20:54:40
はい、GCを導入します

692:676
08/03/10 20:59:43
>>690
ありがとう。今度からできるだけ意味無いことは止める。
string型にすればいいだろうなぁとは思ってた。
最初mallocにしてたけど、知らん間にnewになった。
そもそもstringならnewはいらんはなしだったけど、そこまで頭回らんかった。
俺の脳裏にはC言語っぽいのをできるだけC++っぽくしようってのがあったんだと思う。
かえってそれが変に見えたのは認める。

勉強になりました。

693:デフォルトの名無しさん
08/03/10 21:01:47
つーか、
・getaddrinfo使えタコが
・面倒だからとエラー処理サボると、もっと面倒な事態に
の例

694:676
08/03/10 21:07:27
>>693
ネットワーク系に触るの生まれて初めてなのよn
getaddrinfoか、メモメモ

   / ̄ ̄\/)
  f    ヾ
  | ⊂(゚Д゚)|
  ヽ _(◎)ノ ノつ
  /ノ/ ハヽ二二ノ
 ( (||i) )ヽ\
  ヽ)L人(_/(ノ`J


695:デフォルトの名無しさん
08/03/10 21:30:06
>>694
触んないほうがいい。

696:676
08/03/10 21:42:16
>>695
NEってCCNAとかのイメージが先行して配線を弄ってるイメージ強かったけど、
プログラム組ませると「間違えると危険なんだなぁ」とは思った。勉強になりました。
安全な下級PGに戻ります。

697:デフォルトの名無しさん
08/03/10 22:38:48
スレがカオス気味でワロタ

698:デフォルトの名無しさん
08/03/10 23:10:24
ここでド素人の俺が颯爽と質問
int型へのポインタの宣言って
int *a;
int* a;

この二つで差がありますか?

699:デフォルトの名無しさん
08/03/10 23:13:06
int* a, b;

700:デフォルトの名無しさん
08/03/10 23:13:52
若干スレ違い臭いのですが、質問させてください。

コンパイル時、2つのコンパイルオプションを指定したいのですが、どのように書けばいいのでしょうか。
例えば`wx-config --cppflags` と `pkg-config --cflags gtk+-2.0`
を同時に使いたいのです。

701:デフォルトの名無しさん
08/03/10 23:14:44
>>698
違いはありません。
しかし、その二つはまれに戦争の火種となります。

702:デフォルトの名無しさん
08/03/10 23:19:40
>>698
int *a, b;
int* a, b;



703:デフォルトの名無しさん
08/03/10 23:33:51
>>699,701-702
ありがとうございます
intだとint型とint型へのポインタが同時に宣言でき、
int*だとint型へのポインタのみ宣言できるわけですか

>戦争の火種
(((( ;゚Д゚))))ガクガクブルブル

704:デフォルトの名無しさん
08/03/10 23:39:19
>>703
いいえ、どちらも同じです

705:デフォルトの名無しさん
08/03/10 23:40:40
>703
戦争の火種って言っても空襲は来ないから安心しておじいちゃん。

706:デフォルトの名無しさん
08/03/10 23:47:02
>>703
残念ながらそれは違う

707:デフォルトの名無しさん
08/03/10 23:59:24
int *a, b;
int* a, b;

二つとも
aがint型へのポインタ。int型の変数bでしょうか?

708:デフォルトの名無しさん
08/03/11 00:02:17
Yes.
int* a, b; と書こうが、b はポインタにはならない。

709:デフォルトの名無しさん
08/03/11 00:02:58
>>707
その通り

710:デフォルトの名無しさん
08/03/11 00:05:39
int * a; のように書く人もいるね。

711:デフォルトの名無しさん
08/03/11 00:07:17
>>700
単に並べればいいよ。
gcc `wx-config --cppflags` `pkg-config --cflags gtk+-2.0` mycode.cc



712:デフォルトの名無しさん
08/03/11 00:08:06
int*a; 派

713:デフォルトの名無しさん
08/03/11 00:09:31
おまえがどう書こうが関係ねえ

714:デフォルトの名無しさん
08/03/11 00:10:33
int
*
a
;



715:デフォルトの名無しさん
08/03/11 00:11:23
>>714
ステップ数至上主義者ですね

716:700
08/03/11 00:17:01
>>711 さん
ありがとうございます!

717:デフォルトの名無しさん
08/03/11 00:34:27
i\
n\
t
*
a
;


718:デフォルトの名無しさん
08/03/11 00:37:59
boost::mpl::identity<int*>::type a;派

719:デフォルトの名無しさん
08/03/11 01:21:53
string の読み込みがないのが不便ですね
改行やバリナリはありますが 自作するしかないですか

720:デフォルトの名無しさん
08/03/11 01:24:21
C言語やWindowsAPIはファイルの入出力が低レベルのしか無いです
たとえば空きメモリを調べてバッファを使って出力するとか
そういうのを強化するライブラリ無いですか ビット単位の出力もないです

721:デフォルトの名無しさん
08/03/11 01:25:23
boostでおk

722:デフォルトの名無しさん
08/03/11 01:27:40
詳しく教えてください ライブラリ名とか

723:デフォルトの名無しさん
08/03/11 01:32:21
例えば、Fstream というバッファ付きファイル出力クラスを自作したとします
書き込みがあまりなくなったらメモリを解放したいのですが、
一番最後の書き込み時に解放しなかった場合、
それ以降アクセスがなかったら無いことを知ってメモリ解放するにはどうしたらいいですか

724:デフォルトの名無しさん
08/03/11 01:33:05
デストラクタで開放するようにして、スマートポインタに入れるなりなんなり

725:デフォルトの名無しさん
08/03/11 01:34:41
クラス生成時にサブスレッドを動かして
時間計測してシグナル出せば良さそうですね

726:デフォルトの名無しさん
08/03/11 01:37:56
>>724
複数のファイルを同時に扱いたいです 1000個の書き込みがあれば
一つあたり100KB確保でも大きいです 
単独でバッファ管理するより複数を調べた方が良さそうですが

727:デフォルトの名無しさん
08/03/11 01:43:50
例えば
Fstream fp("out1"), fq("out2"); としたとします
クラスはfpの状態とfqの状態両方を知ることは出来ますか

728:デフォルトの名無しさん
08/03/11 01:51:55
static変数ででも管理すればいいだろ

729:デフォルトの名無しさん
08/03/11 01:57:24
fp[100]としたとき、メモリを解放した方が良い番号がわかったとき自動的に
解放させるにはどうしたらいいですか? 
最近参照された時間を保持していてもメンバ関数からでは
他のメンバ変数はわからないですよね

730:デフォルトの名無しさん
08/03/11 01:58:38
>>729
728読んだ?

731:デフォルトの名無しさん
08/03/11 01:59:49
staticは共用されないですか?
個別の時間を保持しないと駄目ですが

732:デフォルトの名無しさん
08/03/11 02:01:30
全インスタンスの個別の時間を保持するlistかmapかなんかをstatic変数にすればいいだろう

733:デフォルトの名無しさん
08/03/11 02:02:00
だいたい貴様の知識が乏しいのは自分でもわかってるんだろ。
その貧相な知識で勝手に判断して人のレスを無視するんじゃねえよ

734:デフォルトの名無しさん
08/03/11 02:03:54
時間管理もバッファも、vector型にして共用すれば良いですか?

735:デフォルトの名無しさん
08/03/11 02:09:53
あとメモリ解放のためにサブスレッドを動かしたいのですが
コンストラクタに入れるとクラス生成ごとに呼びだれると思うのですが
これも共用するにはどうすればいいですか?
static fnc(){}などと書けば初めの一回だけになりますか

736:デフォルトの名無しさん
08/03/11 02:10:01
質問する前に手を動かしてみたら?

737:デフォルトの名無しさん
08/03/11 02:15:17
闇雲に手を動かすだけで、「~をやってみましたがうまくいきませんでした。なぜですか。」とか聞いてきそうだ。

>static fnc(){}などと書けば初めの一回だけになりますか
staticというキーワードを知っているのなら、それについての最低限の仕様くらいは
自分で調べたほうがいいよ。webを見るなり、まともな入門書を読むなりして。

凝ったことをやろうとする前に、もっと先に学ぶべきことが多そうだ。

738:デフォルトの名無しさん
08/03/11 02:28:02
うごかないですが原因がわかりません
どうすればいいですか

class cls{
public:
static int n;
cls(){ n=0; }
};

main(){ cls x; }

739:デフォルトの名無しさん
08/03/11 02:32:52
どううごかないんだ

コンパイルエラーなのか
画面に何も表示されないのか

後者なら別におかしくないぞ

740:デフォルトの名無しさん
08/03/11 02:37:50
Error: 未解決の外部参照 'cls::n' がTEST.OBJ から参照されました
とでます 

741:デフォルトの名無しさん
08/03/11 02:39:42
static変数の定義がないから

static int cls::n;

742:デフォルトの名無しさん
08/03/11 02:42:55
それは知りませんでした サンクス
あとクラスのメンバ関数も共用出来ますか? 初めに一度コンストラクタで起動するだけにしたいです

743:デフォルトの名無しさん
08/03/11 02:44:44
>>742
staticをメンバ 関数につけたらどうなるか調べなおせ

744:デフォルトの名無しさん
08/03/11 02:56:22
他人のコードを読んでいて、
namespace std {
template <>
void swap(hoge &a)
みたいな記述があったのですが、templateのあとの<>の中が空白でも
コンパイル出来ているのですが、なんででしょうか?

745:デフォルトの名無しさん
08/03/11 02:57:24
パラメータ0個のテンプレート

746:デフォルトの名無しさん
08/03/11 03:01:30
>>745
ありがとうございます。でも意味がないような、、、
どんな時につかうのですか?


747:デフォルトの名無しさん
08/03/11 03:06:02
特殊化でぐぐれ

748:デフォルトの名無しさん
08/03/11 03:11:47
read(fp, x)
write(fq,x)

としたとき、読み込むファイルが1G以上だとメモリがたらなくなります
あらかじめ書き込むサイズが判明していたとしてマルチスレッド化して
read(fp, x)
write(fq, x, N, KAIHOUFLG)
としてメモリを解放しながら読み書きするにはどのように実装すればいいですか

749:デフォルトの名無しさん
08/03/11 03:15:09
マルチスレッドに何の関係があるんだよ。
分割して読み書きすればいいだけだろうが

750:デフォルトの名無しさん
08/03/11 03:17:02
read(fp, x)はファイルを読み込みますが、例えば1G読み切るまで停止しないって事です

751:デフォルトの名無しさん
08/03/11 03:19:17
それはそのreadの設計が悪いだけだろうが。

752:デフォルトの名無しさん
08/03/11 03:20:49
>>747
ありがとうです。特殊化でぐぐったら、wikipediaのエントリが先頭に出てきて、それを
読んだらわかりました。(わかりやすく書いてあった)
templateのうち、コンパイラまかせじゃなくて自分で書いてしまいたいところを自分で
書くということですね。

753:デフォルトの名無しさん
08/03/11 03:21:11
1Gのファイルを読み込んだとして、
メモリを解放しながら書き込むという指定をすると
読み込まれた部分に対して先頭からメモリを解放しながら書き込みます

754:デフォルトの名無しさん
08/03/11 03:23:27
通常使用では一括して読み込むことも出来るし、
メモリを解放させながら読み込むことも出来るという汎用の関数を作りたいんです

755:デフォルトの名無しさん
08/03/11 03:25:35
なら作ってください

756:デフォルトの名無しさん
08/03/11 03:26:09
やり方を教えてください

757:デフォルトの名無しさん
08/03/11 03:30:19
上で散々でてるがな。

758:デフォルトの名無しさん
08/03/11 03:30:20
商品先物や、為替取引と同じようなものです
現物を扱わずに売り買いだけを先にしてしまうようなものです
読み込みと書き込みの約束だけをしてしまい不要ならメモリを解放します

759:デフォルトの名無しさん
08/03/11 04:31:06
口約束で終わるって事か?

760:デフォルトの名無しさん
08/03/11 06:03:12
スレが伸びてると思ったら、梯子もなしに屋上に上ろうとする馬鹿が沸いてたか。

761:デフォルトの名無しさん
08/03/11 07:20:30
VirtualAllocでCOMMITを調整する話か?
まー、32bitアプリは仮想メモリ空間も
2Gあたりでリミットだからあんまし意味がないけど


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch