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


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

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



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

29 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 17:08:28 ]
>>28
>>22で指摘したのに……
配列str[]のサイズは2ではなく3にしろ

30 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 17:10:00 ]
なんでダメかというと
char*にconst char *はそのままでは代入できないからだ

const char *s[3];
とするか(こっちが推奨)、
s[0] = const_cast<char*>(str[0].c_str());
とでも汁(こっちは非推奨)

31 名前:デフォルトの名無しさん [2007/06/25(月) 17:11:53 ]
>>29さん
すみません、これは単純な書きミスでした。

 string str[3];
  str[0] = "●";
  str[1] = "●●";
  str[2] = "●●●";

  char* s[3];
  s[0] = str[0].c_str();
  s[1] = str[1].c_str();
  s[2] = str[2].c_str();

としてます。

32 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 17:16:47 ]
>>30
非推奨っつーか、やっちゃだめ

33 名前:デフォルトの名無しさん [2007/06/25(月) 17:17:48 ]
>>30さん
ありがとうございます。
やってみたらできました。

みなさんありがとうございました。

# 書き込む前に新しいレスがあるかリロードでチェックしなくてはいけませんね。
# 何か自分が書き込むタイミングが一歩遅いようで。申し訳ないです。


34 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 17:18:39 ]
>>32
char *s = "hello";
と犯罪性は同じだと思うけど。
でもこれは合法だしな未だに。

35 名前:23 [2007/06/25(月) 17:20:24 ]
>>25
>>27
詳しい説明ありがとうございます、
助かるとともに勉強になります。

36 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 17:21:18 ]
>>34
そんな負の遺産も使っちゃダメ。

37 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 17:23:44 ]
>>36
 〃〃  _, ,_
  ⊂⌒( `Д´) < ヤダヤダ!
    `ヽ_つ ⊂ノ
           ジタバタ




38 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 17:54:43 ]
main で catch(...) ってどう思います?

例外がキャッチされなかった場合、
デストラクタが実行されるかどうかは未定義で、
実際 g++ だと実行されなかったりします。
それを考えると、main で catch(...) しといた方が
安全なのかな・・・とか思うのですが。

39 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 18:03:13 ]
#include<stdio.h>
#include<stdlib.h>

char *search_r(char *s,char *p){
char *x;
int i;
x=p;
i=sizeof(p);
while(1){
p=x;
if(*s=='\0')exit(1);
while(*s==*p){
if(*s=='\0')exit(1);
s++;
p++;
}
if(*p=='\0')break;
s++;
}
return s-(i-1);
}
int main(){
char *x;
x=search_r("konbanhasensei","hasen");
printf("%s",x);
return 0;
}
文字列pから文字列sを検索するプログラム
このプログラムで結果を 「hasensei」と表示したいのですが「sensei」となってしまいます。
どこがおかしいのでしょうか。
よろしくお願いします。

40 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 18:08:15 ]
>>39
マンドクセーからちゃんと読んでないが
> i=sizeof(p);

sizeof(p)はポインタpのサイズ(4とか)が分かるだけだ。
pが指してる文字列の長さを測りたいのなら、strlen()を使え。

41 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 18:08:25 ]
sizeof(p) → strlen(p)
s-(i-1) → s-i

exit(1); が凄い気になるが・・・。
NULL 返したのでいいんじゃないかな。
for 使ってないあたりも読みづらい。

42 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 18:11:37 ]
>>40
>>41
ありがとうございます。

43 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 18:19:29 ]
それ以外にもバグはあるけど、
まあそれは自分で確認してくれ。

44 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 21:19:09 ]
環境はC++です

今日自分の作ったサブルーティンを上司がチェックしたみたいなんですが
この構造体はインパラメータだから値渡しにしろ
と言ってきました。
サブルーティンの引数に構造体を渡すときに値渡しって使いますか?
このサブルーティンで使っている構造体のサイズは決して小さくはありませんし、
自分的には構造体のサイズが小さくても値渡しは使わないと思っていたので
ちょっと衝撃的でした。


45 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 21:25:18 ]
場合による

46 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 21:25:36 ]
>>44
const参照渡しをしててそう言われたんなら上司を鼻で笑ってやれ
constのつかないポインタ渡しでもしてたんなら君も悪い

47 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 21:47:18 ]
つうか値渡しでどうやって受け取るんだ



48 名前:47 mailto:sage [2007/06/25(月) 21:48:37 ]
あぁ読み込みパラメータね

勘違いした ごめんよ

49 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 21:56:24 ]
const ポインタ渡しするのが普通だな。

小さい構造体の場合は別な事もあるけど、
まあ場合によるな。

50 名前:44 mailto:sage [2007/06/25(月) 22:21:39 ]
>>46
上司を鼻で笑ってやったら首になりました。
貰ってやって下さい。

51 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 22:24:29 ]
>>50
早っ!

52 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 22:24:49 ]
>>50
うちに来い。Cだが、ひどいデスマも無い。
残業代は0だけど・・・

53 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 22:43:57 ]
>>16-17
15です。
曜日、時間でのバックアップの件でしたが、
お礼遅れてすみません。sleepで行きます。
ありがとうございました。

54 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 23:02:28 ]
>>49
C++ならconst参照だろ

55 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 23:03:36 ]
あ、C++ だったか。
大きな構造体って時点で C かと思ってしまってた。

56 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 23:07:00 ]
C++です。

struct S {
int a;
int b;
int c;
};
という定義の構造体があったとして、

S s = {0};
と書いた場合、b と c が 0 になることは保証されますか?


57 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 23:09:31 ]
されます。



58 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 23:16:54 ]
8.5.1p7 に書いてあるね。
int() すなわち 0 で初期化される。

59 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 23:24:54 ]
>>57,58
ありがとです。


60 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 01:00:48 ]
C++Builderです。
builderのウィンドウで、タブ(Astandard,Additional,Win32,System,,,)
ってありますが、こういうことする場合は、どんな部品を
使用すればよいでしょうか?

61 名前:60 mailto:sage [2007/06/26(火) 01:03:49 ]
タブをクリックしたら、なにか表示させたり、
追加、削除もしたいんです。
よろしくお願いします。

62 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 02:34:19 ]
>>38
あんたの思ってるとおり、しといたほうが安全だよ。
その前に std::exception は別でキャッチしてエラー表示してね。

63 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 05:55:44 ]
変な状態のままデストラクタが呼ばれたら、
それはそれで危険という気もしなくもない。
どっちがいいのかね?

64 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 06:36:20 ]
例外と言えば、例外指定って使ってる?
俺は使ってない。

65 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 08:37:35 ]
正常にインスタンスができたかどうかフラグ持っておけばいいんじゃないか

66 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 08:41:34 ]
まあ、たとえ例外が起きても
メンバ変数が変にならないように気をつけるべきということで、
キャッチされても問題ないように作るべき、なのかな?

67 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 08:55:33 ]
>>63,65,66
www.boost.org/more/generic_exception_safety.html
boost.cppll.jp/HEAD/more/generic_exception_safety.html

「まるで例外は、正しいコードに対するミステリアスな攻撃であり、
我々が自らをその攻撃から守らなければいけないようなものであると
見なされているかのようである。 言うまでもなく、これはエラー捕捉との
健全な関係に繋がらない!」



68 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 09:00:32 ]
>>64
boost や標準ライブラリの方針によれば、使わないほうがいいってことになる。
www.boost.org/more/lib_guide.htm#Exception-specification

69 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 09:08:14 ]
最適化の問題で使わない方がいいという話もあるのか。なるほど。

70 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 09:17:40 ]
標準ライブラリで std::exception::what だけ例外的に例外指定を持ってるのは、
catch 中で別の例外起こされたら面倒だからかな?

71 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 09:23:55 ]
>>67
確かに健全な関係ではないけど、
無視できないんだよなあ。

例外指定を普通使わない以上、
どの関数がどんな例外を投げるか
パッと見分からないことも多いし、
思わぬ例外を投げられたらそれは
ミステリアスな攻撃と思われてもしゃーない気がするよ。

全ての関数が例外を投げる可能性があるって感覚で
プログラムを組むのがいいのかね。

72 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 09:35:26 ]
>>71
安全側に倒すという意味で、そう思ってかかってもいいだろう。

思わぬ例外を投げられてもきちんと動作するように書くべきだし、
極力そう書くことができるように言語や標準ライブラリが整備されている。

73 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 09:36:45 ]
>>70
標準ライブラリの中でも throw() はいろんな関数についてるよ。
型付で指定してるのはグローバルな operator new () ぐらいかな?

74 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 09:44:20 ]
>>73
あ、そうなんだ。
std::exception::what はオーバーライドすることがあるから
目立つってだけのことか。

75 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 09:46:24 ]
>>72
Joel タンが例外嫌いなのも、そのあたりが気持ち悪いからなんだろうな。
でも、標準ライブラリやキーワードが例外投げる以上、
無視するわけにもいかないと思うんだけどね・・・。

76 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 10:26:57 ]
>>75
あの話は戻り値についてもいっしょだろ。
ただ単に戻り値でのチェックに慣れているから、
戻り値をチェックしていないコードのほうが見つけやすいって話。

例外に慣れてしまえば、例外安全でないコードは同じぐらい
簡単に見つけられる。ただし現状では、↑の理由で他の人に
伝わらないことが多い。

敢えて言い切ってみたけど、ホントのところはちょっと自信が無い。

新しい言語をデザインするなら、 try ブロックじゃなくって
nothrow ブロックを作ればいいんじゃないかと思う。
「オレはここでは例外が飛ばないと仮定して書くぜ」っていう
ブロックね。

77 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 10:31:57 ]
どうなんかねえ。
例外をうっかり無視するコードより、
戻り値をうっかり無視するコードの方が危険性は高いと
個人的には思うんだけど。



78 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 10:35:19 ]
つーかC++の例外が糞で使いにくいだけ

79 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 10:35:24 ]
例外は「うっかり無視」できないのがいいんだよ。

80 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 10:43:09 ]
そうそう。

81 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 11:55:16 ]
例外は戻り値と違って発生源や内容の概要が簡単に特定できるから
エラー→復旧っていう処理に使いやすい

エラーしたら即一連の処理を中断するだけなら戻り値でもいいけど
エラー内容によってstrategyパターンを使って処理を色々と変えるなら
例外の方がやりやすい

と思ったんだけどどうかな?
軽く試してみてちょっと良いかもって思っただけで使い続けられるとは限らないけど

82 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 14:05:12 ]
std::fstream のコンストラクタに渡すファイル(パス)文字列って、
ネイティブなフォーマットのものなの?それとも POSIX
準拠じゃなきゃいけない?たとえば UNIX では /home/hoge/test.txt
で Windows では C:\home\hoge\test.txt ?

どういうフォーマットのパス文字列を取りうるかに関する
規約って定められてるの??

83 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 14:39:34 ]
POSIX かんけーねー。
処理系で好きに決めりゃいいべさ。

84 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 14:48:09 ]
そうか・・・標準の C++ のライブラリではそこまでは
決められていないんだね。 boost::filesystem では
native/ portable が厳密に切り分けられていたので、
fopen や fstream でもそうなってるのかと思った。

85 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 14:51:43 ]
>>82
const char*なのが困り物

たとえばVC++8.0ではlocale依存の方法でUTF-16に変換する
それ以前ではコードページ依存の方法でUTF-16に変換する
いずれにせよ、NTFSのUTF-16なパスを正しく扱えるとは言いがたい

UTF-16なパス名をちゃんと扱いたければ、fstreamを捨てて
カスタムのストリームバッファを作れという話になるだろう

86 名前:デフォルトの名無しさん [2007/06/26(火) 21:17:53 ]
ofstreamやifstreamでファイルを開くとき、
ios::binary指定というのは、意味があるのでしょうか?
コンパイラはg++です。
いままでとくに指定してもしなくても結果は同じになりました。


87 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 21:23:21 ]
>>86
UNIX系は関係ない。
WIndowsはstd::endlや\nを書き込むと0x0d0x0aになって書き込まれ
読むときは0x0d0aが0x0aになる。



88 名前:デフォルトの名無しさん [2007/06/26(火) 21:26:02 ]
ios::binaryしない奴は死ねっていつも思う。

89 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 21:27:15 ]
>>86
テキストファイルを特別扱いする(というよりC++としては特別扱いしなければならない)環境も結構ある
有名どころではDOS/Windows系のテキストファイルでは改行コードがCR+LFになっていることが挙げられる
そういう環境では、テキストファイル特有の処理を行わせたくないときに、バイナリモードを指定する必要がある
逆にUnix関係では大抵違いがないが、移植性向上のために必要に応じバイナリモードを意識的に使うのは良いことだ

Unixとかでもワイド文字ストリームなら、文字コード変換をどうするかで
テキストモードとバイナリモードの違いが表れるはず

90 名前:デフォルトの名無しさん [2007/06/26(火) 23:37:20 ]
while(!feof(fp1)){
ch = fgetc(fp1)
if(!feof(fp1) fputc(ch,temp);
}

ファイルの中身を別のファイルにコピーする場合の例題に書かれていたコードなんですが
whileの式で(!feof(fp1))と記述されているにもかかわらず何故さらにif(!feof(fp1)と書いているのは何故なんでしょうか?
何か意味があるんですか?
whileの式でファイルの末端にきたらループ終了なのでifの式は必要ないように思えるんですが


91 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 23:44:12 ]
>>90
意味以前にその例題、コンパイルできるか?

92 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 23:45:19 ]
>>90
fgetc()で読みに行ってみないとEOFだとわからんことがあるから。
その場合、whileの条件式の時点ではEOFではないと判断して
読みに行ってみたらEOFだった(読めませんでした)というカタチになるので
下のチェックが要る。

だがこんなのは糞コード。
while ((ch = getc(fp)) != EOF) putc(ch, temp);
とするがよい。

93 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 00:12:20 ]
>>92
バイナリファイルを操作する場合は>>90の方がよい

94 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 00:13:20 ]
>>93
なぜ?

95 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 00:16:51 ]
>>94
int型と比較した時、EOFと同じ値のバイトが存在する可能性があるから


96 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 00:17:02 ]
とても初歩的な質問ですが

short i;
long k;
float f;
double d;

としたときに

@ (f+15)/(long)(d-15)
A k+20.0
B (int)d/i

の型(double,longなど…)はどうなるでしょうか?
こういう場合は計算式の中でもっとも高精度な変数の型になると理解すればいいのでしょうか?

97 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 00:17:55 ]
>>95
あ、chがcharだと仮定しているわけね。
それならば、単にint chと宣言して>>92のコードで良い。



98 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 00:21:04 ]
>>96
整数拡張、型の昇格


99 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 00:23:00 ]
というかgetc()の戻り値をcharで受け取る奴がアホ

100 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 02:13:04 ]
C++でのバイナリファイルの読み書きは、ifstreamのreadとか、ofstreamのwriteを使うんですよね。
気になったのは、どちらも char * を指定するところです。freadは void * だったと思うんですが。。。

ifs.read(reinterpret_cast<char *>(&hoge), sizeof(unsigned)); という感じで、毎回キャストしないといけないんですか?

101 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 02:27:57 ]
>>100
残念ながらキャストが必要。
毎回キャストするのが嫌なら、適当な関数で包め。

102 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 04:13:44 ]
別にfread使っても一向にかまわないわけだし。
適材適所。

103 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 09:36:59 ]
freadはvoid*の代わりに、サイズと数の2つを指定するだろう

104 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 09:42:16 ]
fread()/fwrite()は(Unixの)read()/write()のインタフェース
真似れば良かったのにな

105 名前:デフォルトの名無しさん [2007/06/27(水) 10:16:53 ]
データがBIG ENDIANかLITTLE ENDIANのどちらかで
単純に&hogeで受け取れない場合もあるし。

つまり、CPUとデータの並びが逆の場合。

今回みたいに並びが合ってるのなら、union使えばいいんじゃないか?

106 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 10:26:23 ]
ネットワークを跨ぐとか、別PCでもそのファイルを r/w するのならエンディアン気にするけど…
たかだか、同じPC内で完結するのならそのまま保存するよね?

107 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 10:41:33 ]
そりゃファイル仕様に因るべさ。



108 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 10:49:46 ]
ああ、先にファイル仕様があって(当然エンディアンも明示されてて)それを
読む→(なんかする)→(書く) なら、それに従うしかないね。

109 名前:デフォルトの名無しさん [2007/06/27(水) 12:14:06 ]
>>87-89
なるほど、ではテキストでないときには、
ios::binaryを付けるようにします。


110 名前:デフォルトの名無しさん [2007/06/27(水) 14:39:49 ]
基底クラスのポインタを継承クラスの動的配列でオーバーライドすることはできませんか?
class Base{
public:
Base(){val0=0;};
virtual ~Base(){};
virtual void show(void){cout << val0 << endl;}
int val0;
};
class Deriv:public Base{
public:
Deriv(){val1 = 1;};
virtual ~Deriv(){};
virtual void show(void){cout << val1 << endl;}
int val1;
};
int main(int argc, char *argv[]) {
Base *test;
int num = 10;
test = new Deriv[num];
for(int i=0;i<num;i++)
test[i].show();
}
を実行すると,main()の中のfor文2回目のループ(i=1)で
0x0041e12c でハンドルされていない例外が発生しました : 0xC0000005: 場所 0x00000005 を読み込み中にアクセス違反が発生しました。 。
というエラーが出ます。
test[0]は無事Derivにオーバーライドできていますが,test[1]以降が不可能なようです。
何か良い方法はないでしょうか?
環境:WindowsXP + VisualC++ Ver.7


111 名前:110 [2007/06/27(水) 15:02:56 ]
オーバーライドの意味間違ってますね。
何と呼んで良いのか分からないですが、領域確保?
とにかくnewするという意味です。

112 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 15:11:45 ]
>>110-111
BaseとDerivのメモリ上の大きさが違うのに、配列でどう動けと。


113 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 15:34:55 ]
無理するなら↓
 ((Deriv *)((char *)test + sizeof(Deriv) * i))->show();
もしくは↓
 ((Deriv *)test)[i].show();

114 名前:110 [2007/06/27(水) 15:51:45 ]
>>112,113
ありがとうございます。
なんとなく分かりました。
new Deriv[num]が失敗してるのではなく、
forループのなかでのindexの指定が間違ってるということですね。
*testがBase型のポインタなので
test[i]はtest[0]からBaseを基準にアドレスを進めることになるのか。
>>113さんの方法で動きましたけど、
そもそもこういう状況が必要になる設計はまずいでしょうか?

115 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 16:28:34 ]
>>114
一般的にはまずい。
でも、テンプレートを使って下のようにやればできないことはない。

template<class T>
class poly_array {
 template<class U>
 poly_array(U *ptr, int array_size) : ptr_(ptr), size_(sizeof(U)) ... {...}

 T *get(int i) {return (T *)((char *)ptr_ + size_ * i); }

private:
 T *ptr_;
 size_t ptr_size_;
 ...
};

116 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 16:34:21 ]
基底クラスへのポインタの配列を作って、
それぞれに対してまたオブジェクトを作っていくのが、
まあ一番安全なのかね。
メモリ管理が複雑になるという点では、
安全とは言えんかもしれんが。

>>115 はちょっと感動したよ。

117 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 17:51:04 ]
下記を左側の数字のキー値で、ソートしたいです。
(8,x),(2,y),(3,z)・・・
ソートして、
(2,y),(3,z),(8,x)・・・
を出力。(int,std::string)の形です。

どういうデータで扱って、どのような方法がよいでしょうか。
mapとか自動でソートされるみたいですが、
自分で比較して並べ替えたいです。
よろしくお願いします。



118 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 17:58:37 ]
int, std::string をメンバに持つ構造体の配列?
それなら構造体で < 演算子をオーバーロードするか
比較関数を定義するかすれば
std::sort でソートできるけど。

119 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 18:00:21 ]
>>117
つ[std::vector]

120 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 18:12:57 ]
訂正お願いします。
×キー値で、ソート
○キーでソート

>>118
ごめんなさい。
「(int,std::string)」
これは、余計でした。(数字,文字列) なんです。
どのデータに入れて、どんな風に処理するのか知りたいです。

>>119
std::vectorに、キーを入れてソートするんでしょうか?
対応する値は、どうやって対応させて出力を。。。



121 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 18:19:20 ]
何がしたいのかよく分からない。
int 値はキーで、std::string はキーに対応する値?
std::map を使うのがベストだと思うけど、
std::map を使わない理由は何かあるの?

122 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 18:22:08 ]
>>117
とりあえず、すんごい単純で愚直な方法。
#include <iostream>
#include <string>
#include <vector>
#include <utility>
#include <algorithm>

typedef std::pair<int,std::string> nspair;
bool cmp(const nspair& a, const nspair& b) { return a.first < b.first; }
int main()
{
    int n;
    std::string s;
    std::vector<nspair> vec;
    while (std::cin >> n >> s)
        vec.push_back(nspair(n,s));
    sort(vec.begin(), vec.end(), cmp);
    for (std::vector<nspair>::iterator i = vec.begin(); i != vec.end(); ++i)
        std::cout << '(' << i->first << ',' << i->second << ')' << std::endl;
}

123 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 18:25:51 ]
>>116
つboost::ptr_vector

124 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 18:41:02 ]
>>121
(数字,文字列),,,,
をキーでソートするんですが、どんなデータに格納して
どんな処理をするのか知りたかったんです。

>>122
プログラムも、書いていただきありがとうございます。
数分しかたってないのに。(汗

中身がstd::pairのstd::vectorですか。
typedefの使い方もすごい勉強になります。
ありがとうございました。

125 名前:119 mailto:sage [2007/06/27(水) 19:10:32 ]
ちっ、プログラムを書いてみたけどstd::pairとstructの違いだけで殆ど同じだから貼るのやめよ。

126 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 21:01:34 ]
>>124
(数字,文字列) 全体がキーなの?
じゃ、それに対応する値もあるの?
それとも set みたいにキー=値なの?

そして、数字が同じ時には文字列も比較するの?

と、質問攻めになってしまった。

127 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 21:30:26 ]
結局ポインタって何に使うんですか?
違った名前の変数で同じ値を参照できるってことですか?
でも同じアドレスの値を参照するだけならわざわざポインタの方の変数を作る必要は無い気が・・・・
ていうかそもそもいろんなソースコードを見ててもポインタを使ってるのはあまり見かけませんが・・・・



128 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 21:32:29 ]
>>127
C はポインタが無ければ配列も関数に渡せない言語です。

129 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 21:34:24 ]
ポインタ使いまくりw
ポインタを理解していないみたいだが君も知らない内に使ってるよ






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

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

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