[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 12/22 20:21 / Filesize : 245 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【初心者歓迎】C/C++室 Ver.50【環境依存OK】



1 名前:デフォルトの名無しさん [2008/02/28(木) 00:01:39 ]
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.49【環境依存OK】
pc11.2ch.net/test/read.cgi/tech/1203478421/
【アップローダー】(質問が長い時はココ使うと便利)
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm

381 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 19:25:04 ]
自プロセスのHWNDを取るにはどうしたらいいのでしょうか?

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

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

384 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 19:37:17 ]
>>380
Javaと一緒にすんな

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

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

387 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 20:52:58 ]
>>380
newするとどこかでdeleteせんといかんよ。

388 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 21:29:17 ]
>>380
new はしない。

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



390 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 22:09:05 ]
>>389
SAFE_DELETE(ptr);

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

392 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 22:12:09 ]
>>389
問題の起こる最小のコードをplz!

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

394 名前:331 mailto:sage [2008/03/05(水) 22:18:39 ]
なるほど!
分かりやすい説明ありがとうございましたm(_ _)m

395 名前:389 mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 22:21:28 ]
template <typename T>
void SafeDelete(T *& p) { delete p; p = NULL; }

397 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 22:23:00 ]
なんか怪しげなコードだが
_arrの型は?


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

399 名前:389 mailto:sage [2008/03/05(水) 22:25:12 ]
あ、_arrがテンプレートの、T**型なのですが、
それが悪いのでしょうか。



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

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

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

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

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

401 名前:389 mailto:sage [2008/03/05(水) 22:37:45 ]
>>396
ありがとうございます。

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

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

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

402 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 22:38:32 ]
>>400
> 同じではないでしょうか?

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

403 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 22:43:14 ]
だれか>>391に突っ込んでやれよw

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



404 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 22:45:19 ]
pは何処から出てきた?
でいいのかな。

405 名前:389 mailto:sage [2008/03/05(水) 22:49:40 ]
>>403
ありがとうございます。

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

406 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 23:08:47 ]
>>406
> 論理積なので、

いや、違うから。

408 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 23:14:46 ]
とりあえず

SAFE_DELETE(_arr);



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

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

あと、コンパイラは何?

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



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

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

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

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

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

412 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 23:47:55 ]
>399
>あ、_arrがテンプレートの、T**型なのですが

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


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


414 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 00:23:46 ]
この場合なら

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

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

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

417 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 03:06:00 ]
>416
ちなみにトレンドは?

418 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 03:32:56 ]
416じゃないけどshared_ptrとかじゃないの

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



420 名前:417 mailto:sage [2008/03/06(木) 04:10:27 ]
ああ、そういう意味でか。勘違いしてた、さんきゅ。

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

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

423 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 06:49:42 ]
LRUでぐぐればいいんじゃない?

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

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

426 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 14:33:28 ]
>>419
それって大問題なんじゃなかったっけ?

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

428 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 16:45:33 ]
>>427
無理

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



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

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

よろしくおねがいします

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


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

433 名前:430 mailto:sage [2008/03/06(木) 18:04:24 ]
>>431
やっぱり無理ですか。。

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

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

434 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 18:06:06 ]
動的に大きさを変えたいならstd::vector使えばいいやん。

435 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 18:06:34 ]
あ、文字列ならstd::stringな。

436 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 18:09:14 ]
>>433
添え字演算子はポインタでも使えるけど。

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

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

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

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



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

441 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 20:48:59 ]
>>440
おんなじやんけ

442 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 20:49:41 ]
あま〜〜〜い

443 名前:389 mailto:sage [2008/03/06(木) 22:58:20 ]
みなさん色々とアドバイスありがとうございました。

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

444 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 23:05:22 ]
アレだ、「個体進化は系統進化を繰り返す」

445 名前:デフォルトの名無しさん [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 23:20:59 ]
freadしてA読んで、表示した(出力1行目)
fwriteして次のBをXで上書きして、(test.txtの中身変化)
要素数の1が戻ってきて表示(出力2行目)
何が不思議なんだ?

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

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

449 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 23:48:48 ]
> ClassA.ccpではClassA.hとDef.hがインクルードされています。

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

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



452 名前:デフォルトの名無しさん [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 23:51:16 ]
膨大な数のエラーと聞くと、本当に何か書き間違えている気がする。

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

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

456 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 23:57:05 ]
>>454
それ・・・なんの冗談?

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

459 名前:デフォルトの名無しさん [2008/03/06(木) 23:58:43 ]
string buf

buf.reserve(1024)

&buf[0]

でも良い



460 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 23:59:30 ]
それはちょっと・・・。
length 変わらないじゃんか。

461 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん [2008/03/07(金) 00:01:05 ]
>>457

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


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

463 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 00:03:17 ]
呼ばれたタイミングだけでnewしたいとは限らんだろうに

464 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 00:04:43 ]
>>461
class NaiveGridCtrl の最後の ; を忘れているんじゃないか?

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

466 名前:デフォルトの名無しさん [2008/03/07(金) 00:09:25 ]
データの残りを書き出す

467 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 00:11:43 ]
リソースの開放

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


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



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

471 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 00:25:22 ]
名前だけ入れ替えてるんじゃねw

472 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 00:26:52 ]
構造体にしてる意味がねぇw

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

474 名前:デフォルトの名無しさん [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 00:36:20 ]
>>474
あたりまえだろw
こうすればいい
char filename[100];
sprintf( filename, "dat$%d.dat", i );
fout[i].open( filename );

476 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 00:36:50 ]
>>474 stringstream

477 名前:デフォルトの名無しさん [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 00:41:10 ]
>>463
どちらにしろ管理クラスに入れとけば
デストラクタが勝手に delete してくれるだろ。

479 名前:445 mailto:sage [2008/03/07(金) 01:06:00 ]
みなさんドモドモ

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

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

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



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

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






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<245KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef