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


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

【C++】STL(Standard Template Library)相談室 9



1 名前:デフォルトの名無しさん [2008/02/27(水) 02:03:30 ]
C++標準ライブラリの一つ、STLについて。

前スレ
【C++】STL(Standard Template Library)相談室 8
pc11.2ch.net/test/read.cgi/tech/1198435319/

過去ログ・リンク・書籍紹介は >>2 以降

29 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 11:38:38 ]
>>28
いきなりメモリプールって言われても何のことだかわからん。
読みながら増やすのが嫌なら読む前にファイルサイズで確保すれば
「プール」とか要らんだろ。

30 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 11:41:46 ]
ストリームを読む場合なんかだと、最初にサイズが分かりませんが、
効率的なプールはどうやったら作れますか?

31 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 12:27:52 ]
>>30
サイズが分からないという前提なら、読みながらメモリ確保が必須なのはしょうがないだろ。

「効率的な」というのが「読みながらメモリ確保しない」という意味でないのなら、説明して
もらわないとわからん。

32 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 12:51:08 ]
>>28
漠然とし過ぎていてなんとも。メモリプールを最適化するのに実測なし
で議論するのは簡単ではないと思う。

33 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 12:54:51 ]
STLはメモリプールですが?

34 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 12:58:18 ]
>>33
コンテナだろ?そりゃそうだ。

35 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 13:00:23 ]
STLを使って、
LoadFromFile/Save〜、
LoadFromStream/Save〜、
がある、
メモリプールの実装教えれ!

36 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 13:02:11 ]
>>35
ぶん ぶん ぶん ハチが飛ぶ

37 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 13:11:28 ]
>>35
ありません。さようなら。



38 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 13:15:09 ]
assignだけで、ファイルがメモリに展開されるの?
 ↓
#include <vector>
#include <map>
#include <string>
#include <istream>
#include <iterator>
#include <fstream>
#include <cstddef>
#include <exception>
#include <iostream>
typedef std::vector<char> memory_type;
class pocket {
 std::map<std::string, memory_type> naka;
public:
 void ireru(std::string const& filename) {
  std::ifstream file(filename.c_str());
  file.exceptions(std::ios::badbit | std::ios::failbit);
  naka[filename].assign(std::istreambuf_iterator<char>(file)
  , std::istreambuf_iterator<char>());
 }
};

int main(int argc, char* argv[]) {
 try {
  pocket pocket;
  for (int i = 1; i < argc; ++i) { pocket.ireru(argv[i]); }
  return EXIT_SUCCESS;
 }
  catch (std::exception const& e) { std::cerr << e.what() << std::endl; return EXIT_FAILURE;
 }
}

39 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 13:18:52 ]
やってみたらわかるんでない?

40 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 13:21:34 ]
>>38
範囲指定イテレータのassignだよ。vector, deque, list, stringにある。
void container_type::assign(InputIterator b, InputIterator e);

41 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 13:22:41 ]
istreambuf_iteratorで検索したら分かりますた。

ttp://ml.tietew.jp/cppll/cppll/thread_articles/3804

>stringのコンストラクタはiteratorを取れるんですね。
>ifstream fs(path);
>s= string((istreambuf_iterator<char>(fs)),
>istreambuf_iterator<char>());

1行でLoadは分かりましたが、逆に対になる1行でSaveするにはどうすれば良いでしょう?

42 名前:41 mailto:sage [2008/02/28(木) 13:24:42 ]
それと、stringによるLoadだとテキストファイル対象のようですが、
バイナリファイルだとどうなりますか?

43 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 13:39:26 ]
vector

44 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 13:48:55 ]
>>41
string s("unko benki");
ofstream ofs("koumon.txt");
copy(s.begin(), s.end(), ostreambuf_iterator<char>(ofs));

45 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 13:52:12 ]
>>44
>ostreambuf_iterator
の使い方サンks。

次バイナリファイルの場合キボン。

これが分かれば、LoadFromFile/SaveFromFileメソッドを実装して、今日は定時でさっさと帰ります。

46 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 13:53:56 ]
>>42
istreambuf_iteratorはバイナリ入力(sgetc, sbumpc)なんだが。

47 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 13:57:30 ]
>>45
ostreambuf_iteratorはバイナリ出力(sputc)なんだが。
詳しくは、ストリームバッファクラス。



48 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 13:58:48 ]
>>46
なるほど、
vector<char> Memだったとして、
ファイルストリームfsを作って、
のistreambuf_iteratorをfsから作って、
Memに代入すれば良いのですね?

ってイマイチ書き方が分からない。
コンパイラに相談しながら書いてみます。

イテレーターって難い。


49 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 14:00:01 ]
thx>>47
>ストリームバッファクラス

あ、これ未調査だった。
やっぱ、ストリームの基底クラスがあるんだね。
それが分かれば分かる筈。

50 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 14:03:23 ]
>>49
ストリームクラスの基底クラスではない。
継承関係にはない。
ストリームバッファクラス(basic_streambuf<>)のオブジェクトへの
ポインタを保持している。

51 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 14:29:38 ]
テキスト版は出来ますた。

//---------------------------------------------------------------------------
bool Test::LoadFromFile(const char *filepath, bool bAdd)
{
ifstream fs(filepath);
string SBuf((istreambuf_iterator<char>(fs)), istreambuf_iterator<char>());

//stringからバッファへロード
}
//---------------------------------------------------------------------------
bool Test::SaveToFile(const char *filepath)
{
string SBuf(Text());

//バッファからstringへセーブ

ofstream fs(filepath);
copy(SBuf.begin(), SBuf.end(), ostreambuf_iterator<char>(fs));
}
//---------------------------------------------------------------------------


52 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 14:52:45 ]
>>51
ファイルのオープンに成功したかどうかは
チェックせんの?

53 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 15:02:08 ]
伸びてると思ったらまた宿題の続きかよ

54 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 15:05:56 ]
>ファイルのオープン

//---------------------------------------------------------------------------
bool Test::LoadFromFile(const char *filepath, bool bAdd)
{
ifstream fs(filepath);
string SBuf((istreambuf_iterator<char>(fs)), istreambuf_iterator<char>());

if (!fs.is_open()) return false;

//stringからバッファへロード

if (fs.bad()) return false;
if (fs.fail()) return false;

return true;
}
//---------------------------------------------------------------------------


55 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 15:06:46 ]
あ、やっぱこう。

//---------------------------------------------------------------------------
bool Test::LoadFromFile(const char *filepath, bool bAdd)
{
ifstream fs(filepath);
string SBuf((istreambuf_iterator<char>(fs)), istreambuf_iterator<char>());

if (!fs.is_open()) return false;

if (fs.bad()) return false;
if (fs.fail()) return false;

//stringからバッファへロード

return true;
}
//---------------------------------------------------------------------------


56 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 15:10:29 ]
少しはマニュアル読め
コード読んでるこっちが恥ずかしくなるわ

57 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 15:10:42 ]
if(!fs)

でいいだろ



58 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 15:14:02 ]
ラジャ!

//---------------------------------------------------------------------------
bool Test::LoadFromFile(const char *filepath, bool bAdd)
{
ifstream fs(filepath);
if (!fs) return false;

string SBuf((istreambuf_iterator<char>(fs)), istreambuf_iterator<char>());

if (fs.bad()) return false;
if (fs.fail()) return false;

//stringからバッファへロード

return true;
}
//---------------------------------------------------------------------------

59 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 15:30:28 ]
やっぱ、バイナリの場合、書き方分かりません。

既に、
>vector<char> Memory
ってのが存在していた場合は、
上の書き方のままだったらロードするときのメモリは別にとって、次に、Memoryにコピーしなきゃならないのでしょうか?

それだと、メモリ2倍で勿体ないような。

60 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 15:41:00 ]
>>59
vectorに読み込みたいのか?
ならvectorにも同様のコンストラクタがある。


61 名前:59 mailto:sage [2008/02/28(木) 15:48:05 ]
あ、そうではなくて、既に存在しているvectorにロードしたい場合は、ですが。

もしかして、
>vector::swap
でおk?

62 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 15:55:06 ]
>>61
assign では駄目なのか?
なんか基本があやしいふいんきだから
Accelerated C++ くらいは目を通した方がいいと思うんだが。

63 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 16:02:10 ]
>>61
Memory.assign((istreambuf_iterator<char>(fs)), istreambuf_iterator<char>());
vector<char>(Memory).swap(Memory);

64 名前:59 mailto:sage [2008/02/28(木) 16:05:38 ]
>>62
ふいんきでヴぁれました?

>>63
回答サンks。
上の1行で良いように見えますが、上下2行でセットですか?

まずは、assignぐぐってみまつ。

65 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 16:11:15 ]
この内容って関係してますか?
ttp://etwas.wolfish.org/diary/2007/02/28/2007022801/

66 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 16:58:38 ]
チャットじゃないんだから少し頭ん中整理してから投下してくれ

67 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 17:04:43 ]
>>59
おまえ C++Builderスレでも同じ様なこと書いてる奴だろ?



68 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 17:04:59 ]
バイナリの方、整理しますた。
//---------------------------------------------------------------------------
クラスヘッダー: std::vector<char> Memory;
//---------------------------------------------------------------------------
bool Bin::LoadFromFile(const char *filepath, bool bAdd)
{
ifstream fs(filepath, std::ios::in | std::ios::binary);
if (!fs) return false;

fs.seekg(0, std::ifstream::end);
Memory.resize(fs.tellg());
fs.seekg(0, std::istream::beg);
if (fs.bad()) return false;
if (fs.fail()) return false;

fs.read(&Memory[0], Memory.size());
fs.close();
return true;
}
//---------------------------------------------------------------------------
bool Bin::SaveToFile(const char *filepath)
{
ofstream fs(filepath, std::ios::out | std::ios::binary);
if (!fs) return false;

copy(Memory.begin(), Memory.end(), ostreambuf_iterator<char>(fs));
if (fs.bad()) return false;
if (fs.fail()) return false;

return true;
}
//---------------------------------------------------------------------------

69 名前:59 mailto:sage [2008/02/28(木) 17:06:08 ]
>>67
自分もそう思ったが、よくよく見ると違った。ていうか、あっちの方がラベルが高くて難しい単語が出てくるおw

70 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 17:12:44 ]
鼻血ブーーーーーーーーーーーーーーーーーーー
うんこブリブリブリーーーーーーーーーーーーー

71 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 18:11:16 ]
>>69
いや、それじゃねえな。 偶々std::を使ったレスを持ち出して、 話のはぐらかしか?

72 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 18:19:14 ]
イミフメ>>71


ttp://articles.blog79.fc2.com/blog-date-200610.html
>std::stringの大文字/小文字変換
>通常は上記の書き方で問題ありませんが、これがコンパイルエラーとなる場合があります。

についてkwskキボンorz

73 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 18:24:42 ]
>>72
解説文も解読できないんならおまえ向いてないよ。 工場のライン工やっとけ

74 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 18:30:01 ]
のびてると思ったら…
C++って学校の宿題スレなかったっけ?

75 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 18:31:09 ]
>int toupper(int);
>int tolower(int);
> std::transform(str.begin(),str.end(),str.begin(),toupper);
>: error: no matching function for call to 'transform(__gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >,
__gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >,
__gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, <unknown type>)'

これでもエラー出るんですよねorz

76 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 18:34:38 ]
ゴメンなさい、
> (int (*)(int))std::toupper
に直してませんですたorz

77 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 20:57:33 ]
マクロの場合があるからと違うんか



78 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 22:13:46 ]
>>77
違う。localeを引数に取る多重定義があって、それと曖昧と言われてしまうため。

79 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 23:29:51 ]
関数オブジェクトを使うべき

80 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 05:46:31 ]
typedef std::map<char, void*> MyMAP //void* にはMyMAPのポインタが入る

このようにmapに自分と同じ型を含めたい場合は、どう書くのがスタンダードでしょうか?
今はnewで確保して入れて、(MyMAP*)にキャストして使用&deleteしてるんですが。

81 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 09:43:26 ]
>>80
typedef だと無理っぽいねぇ。 class で囲ってやるか、意味的に奇怪だけど継承するとか。
struct MyMap : std::map<char, MyMap*> {};

82 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 10:15:18 ]
今、軽く衝撃を受けたわ

83 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 10:32:04 ]
>>81
>struct MyMap : std::map<char, MyMap*> {};
そんな事ができるとは思いもしなかった

84 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 10:42:27 ]
>>83
できない理由が無ければできるもんだよ。

85 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 11:08:07 ]
例えば、vectorってベクターって呼んで、vectorクラスなんて呼ばないけど、
STLってできあがるものってクラスなんだね。

86 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 11:14:36 ]
>>85
いいえ。コンテナだけがSTLではありません。

87 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 11:17:57 ]
え”?

STL = コンテナ ∩ イテレーター ∩ ?



88 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 11:23:47 ]
つ[<algorithm>, <numeric>, ...]

89 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 11:25:34 ]
>[<algorithm>, <numeric>, ...]

こういうのって何て呼ぶんだ?
インライン関数群?

90 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 11:45:02 ]
なぜ何でもカテゴライズしたがるんだか

91 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 11:51:26 ]
>>89
インクルードファイルalgorithmやnumericで定義されている関数

>>90
日本人だからでしょ

92 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 12:09:35 ]
テンプレートだけに型に(ry

93 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 12:52:10 ]
boost::type_traits早く標準化汁

94 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 15:59:45 ]
標準アルゴリズムって言葉使わないか?

95 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 17:22:11 ]
いやまて朝鮮人かもしれんぞ
ことによると中国人かも

96 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 17:56:00 ]
>>90
神の教えだからだろ

97 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 18:34:41 ]
std::wstringに入ってるファイル名があるのですが、
ここから拡張子だけを抽出したい場合、定番の方法などあるのでしょうか?



98 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 18:50:10 ]
rfind と substr でいけるんじゃね?
まあ c_str と _splitpath() のほうが面倒が少ないと思うけど。

99 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 13:02:13 ]
Win32APIが使えるなら一発

100 名前:デフォルトの名無しさん [2008/03/03(月) 16:27:08 ]
>>97
std::stringにファイル名が入ってるなら
そのファイル名が入ってるstd::string型のオブジェクト名
がfilenameという名前とすると
char *fname = filename.c_str();
てな感じでchar *型で受け取り
#include <cstring>をインクルードしておき
char *piliod = strrchr(fname,'.');
で拡張子の手前のピリオド位置を取得し
piliod++;ってすれば拡張子名だけchar *型で取得できる
これらの操作をwchar_t用の関数に変更すれば
wchar_t *型で拡張子名を取得できる
まぁ、STL板だしstd::wstringを操作するとしたなら
素直にクラスのfind_last_of使って
sizetype pos = filename.find_last_of(L'.')てな感じで
けつからピリオドの位置見つけてpos++;して
std::wstring fextenshion =filename.substr(pos)とすれば
拡張子だけ手に入る


101 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 18:54:54 ]
が、特殊ケースを想定するとそれだけでは済まないので、
ちまちま書くよりc_strでランタイムやAPIの既存のルーチンに任せるのが定番。

102 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 18:57:59 ]
だよなぁ。hoge\2007.11.10\bar とか。

103 名前:デフォルトの名無しさん [2008/03/06(木) 14:54:51 ]
>std::vector<char> resultBuf;
から、
>std::string SBuf;
にデータを移すにはどう記述したら良いですか?

SBuf = resultBuf;

とするとコンパイルエラーです。

インテリセンスの無い環境でやっててつらいです。

104 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 15:12:55 ]
>>100
char *fname = filename.c_str();
これは、不味いんじゃないのか?


105 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 15:15:26 ]
>>103
SBuf = &resultBuf[0];

106 名前:103 mailto:sage [2008/03/06(木) 15:20:33 ]
>>105
有難うございます。コンパイル通りました。


ついでですが、resutlBufにNULLが入ってる場合、どう書けば良いですか?
今回不要なんですが。
memcpy使うのもC言語っぽいしぃ。

107 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 15:21:39 ]
std::string SBuf(resultBuf.begin(), resultBuf.end());
または、
SBuf.assign(resultBuf.begin(), resultBuf.end());
resultBufがnull終端なら>>105でもいい



108 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 15:24:40 ]
>>105
stringの内部バッファの連続性はまだ保証されてない気がしたが。

109 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 15:27:58 ]
>>108
それは関係ないだろ
string s = "foo";
とかやるのと一緒

110 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 15:31:41 ]
>>108
resultBufは、char型のvector
vectorはバッファの連続性を保証されているから無問題
問題があるとすれば、>>107の指摘の様にnull終端では無い場合

111 名前:103 mailto:sage [2008/03/06(木) 15:42:13 ]
NULL入りの場合、無しの場合、両方分かりました。
ありがとうございましたorz

112 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 15:52:55 ]
>>108
それよりも、>>104の指摘している
>>100
char *fname = filename.c_str();
の方がやばいんじゃない?
*fnameの代入が終了したら、c_str()の戻したポインタの有効期限が切れているから

char *piliod = strrchr(fname,'.');
の処理をするときには、何が起こるのか判らない状態になっていると思うんだけど


113 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 16:06:11 ]
>>112
filename.c_str()で返るポインタは、filenameの非constメンバ関数が呼ばれるまで有効

114 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 16:27:45 ]
>>105だとresultBufが空のときにまずいような気がする

115 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 16:31:54 ]
null終端なら空ってことはありえない

116 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 16:43:22 ]
>>113
お前そんなプログラム書いてるのか。お前には仕事を任せられんな。

117 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 16:44:44 ]
>>113
まじ?
ゴミになったのに、ゴミになったって気が付いてないとかそう言う問題の気がするが...

lstrcpy(buf, str.c_str());
これは怖くないが

char *word = str.c_str();
lstrcpy(buf, word);
これは、いつ見ても、ヤバイ香りがするんだ

関数の返すポインタには何度も煮え湯を飲まされたし...orz



118 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 16:52:12 ]
>>116
>>117

>>113 is right.

About c_str()

The return value is valid only as long as the string exists, and as long as only
constant functions are called for it.



119 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 16:53:25 ]
>>118
言い訳はいいからお前には仕事はやらん。

120 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 16:54:49 ]
>>116
お前のレスだけ明後日の方向むいててワラタ

121 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 16:56:16 ]
>>116
「そんなプログラム」ってどんなプログラム?
>>113はプログラムの書き方なんか一言も触れてないよね。
c_str()の戻り値の寿命についての情報を書いてるだけ。

「そんなプログラム」ってどんなプログラム?
それは113のどこに書いてあるの? 教えて。

122 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 17:05:37 ]
煽ってるようだけどその手には乗らないよ。
びびりまくりでワロタw

123 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 17:08:15 ]
ちゃんと寿命を理解しないで使う方が怖いよ

124 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 17:09:05 ]
仕様をちゃんと知らずに見よう見まねでライブラリを使う人ってのは結構いるだろうけど、
見よう見まねや雑談で得た俺仕様を根拠にして、正しい仕様に基づく使い方を攻撃するのは
みっともないと思う。

125 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 17:10:03 ]
うっかり誰かがstring書き換えるコードを途中に入れてしまったら、
なんて心配をするようなら、116の言うことだって分からなくもない。

126 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 17:11:55 ]
どうでもいいが、
>lstrcpy(buf, str.c_str());
これと
>char *word = str.c_str();
>lstrcpy(buf, word);
これで振る舞いが異るようにc_strを実装する方法は存在しないだろ

127 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 17:11:59 ]
>>117
>関数の返すポインタには何度も煮え湯を飲まされたし...orz

仕様を確認せずに「香り」でコード書くから何度もそういうミスを繰り返すのかもね



128 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 17:15:34 ]
仕様仕様言ってて仕事がもらえない方が悲惨だと思わない?
会社にはその会社の流儀って物があってね。

129 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 17:17:33 ]
>>126
>lstrcpy(buf, str.c_str());
は、lstrcpyの処理が終わるまで、誰もstrを変更しないことが保証されている。

>char *word = str.c_str();
>lstrcpy(buf, word);
は、どこかの禿が
>char *word = str.c_str();
>f(str);
>lstrcpy(buf, word);
と変更しない保証は何処にもないし、f(str)がstrを変更しない保証も無い






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

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

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