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


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

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



1 名前:デフォルトの名無しさん [2008/09/06(土) 22:45:12 ]
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。

【前スレ】
【初心者歓迎】C/C++室 Ver.58【環境依存OK】
pc11.2ch.net/test/read.cgi/tech/1218023777/

【アップローダー】(質問が長い時はココ使うと便利)
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm

◆ソースのインデントについて
半角やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのが最も良いですが、
直接貼るのであれば、全角空白か に置換しておくことをお勧めします。

231 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 18:12:39 ]
>>225
list だと、こうじゃなかったっけ?
ごめん。調べないで書いてる。

for (list<C *>::iterator it = mylist.begin(); it != mylist.end();) {
  if ((*it)->ic == 1) {
    delete *it;
    mylist.erase(it++);
  } else {
    ++it;
  }
}

232 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 18:37:02 ]
erase したイテレータを++するのは未定義動作じゃなかったか?

233 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 18:45:29 ]
>>232
mylist.erase(it++);
はイテレータを進めてから、進める前のイテラータに対してeraseするから問題ないと思うよ。
listのeraseでは消したイテレータ以外は無効にならないから。

234 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 21:04:13 ]
戻り値が次の要素じゃなかったっけ?
it = mylist.erase(it);

235 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 21:41:25 ]
listなら++でも安全だとしても、別なコンテナに変えられる可能性も
考慮して、戻りを代入するべきでは。

236 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 22:10:33 ]
>>235
set,multissetとかだとeraseの戻り値の型がvoidだったりするから、
it == hoge.eraseが書けないときもある。

vectorならeraseの戻り値を使えても、別なコンテナに変えられる可能性も
考慮してit++にするべきでは。

237 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 22:53:20 ]
>>236
vectorならit++は使えない。

238 名前:229 [2008/09/14(日) 22:53:23 ]
>>230
ありがとうございます。

<<のオーバーロードで修正がベスト何ですかね。


239 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 23:26:15 ]
vectorの場合remove_ifして得た新しい末尾以降をそれぞれdeleteした後にerase(new_end, end)
とlistとはやりかたが違うから、差し替え考慮するのは無理があるんでない?




240 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 02:15:17 ]
vectorとdequeはeraseの後反復子が無効化されるので、eraseの戻り値が必要。
mapやsetはeraseの戻り値がvoidなので、it++するしかない。
シーケンスコンテナと連想コンテナの取り替えを想定するのは
無理があるって事だな。

241 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 09:14:33 ]
effective STL に同じような話がある

242 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 10:28:05 ]
Visual C++ 2008 Express Editionでコンパイルした実行ファイルを、VC++が入ってないPCではエラーが出て実行できないんですけど
VC++が入ってないPCでも実行する方法を教えてください。

243 名前:207 mailto:sage [2008/09/15(月) 10:29:22 ]
>>225 氏の方法でも >>231 氏の方法でもうまくいきました。
ありがとうございます。

「別なコンテナに変える」ということの意味はまだ良くわからないので、
引き続き勉強します。

>>241
> effective STL に同じような話がある

なるほど、早速ポチりました。

244 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 10:47:02 ]
>>242
エラーが出ないように修正する

245 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 10:53:17 ]
>>244
VC++がインストールされているPCではエラーがなく実行できます。

246 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 10:54:07 ]
>>242
まずはエラーの内容を示さないと・・・・
MFC7のdllがないとかか。

247 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 10:59:51 ]
SideBySide絡みじゃ?
MSから再配布可能なんちゃらを実行するPCにインストールすればいいとおも

248 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 11:49:58 ]
>>246
ほかのパソコンで実行すると指定したプログラムは実行できません。と表示されます。

249 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 11:52:21 ]
何で初心者って「エラーが出ます」「うまくいきません」
「動きません」って言って具体的なこと書かないんだろうな。



250 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 11:53:18 ]
>>248
本当にメッセージそれだけ?

251 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 11:57:28 ]
>>250
今はほかのパソコンにもVC++を入れてしまっているので確認はできないんですけど、もう少し長かったような気がします。
VC++を入れてない人のパソコンでも何かインストールをしなくても普通のアプリケーションみたいに実行できるようにしたいんです。

252 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 12:01:39 ]
>>251
1. VC++のバージョンにあうランタイムライブラリをインストールさせる。
www.microsoft.com/downloads/details.aspx?FamilyID=9b2da534-3e03-4391-8a4d-074b9f2bc1bf&DisplayLang=ja
www.microsoft.com/downloads/details.aspx?FamilyID=a5c84275-3b97-4ab7-a40d-3802b2af5fc2&DisplayLang=ja

2. msvcr90.dllなどをMicrosoft.VC90.CRT.manifestなどと共にEXEと同じフォルダに置く。

253 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 12:22:30 ]
>>251
基本的によく分からないエラーが出たら、
スクリーンショットを撮る事。

そのプログラムのプロジェクトプロパティの
共通言語ランタイムサポートが「使用しない」以外なら
.NET Framework Runtime をインストールする必要がある。

MFCの使用が「共有DLLで〜」なら「スタティックライブラリで〜」に。

構成プロパティ - C/C++のランタイムライブラリが「/MD」なら「/MT」に。

254 名前:242 mailto:sage [2008/09/15(月) 12:26:45 ]
調べたらDebugフォルダの中の実行ファイルをただほかのPCに移動するだけでは、駄目らしいということがわかりました。
ソリューション構成をReleaseにしてコンパイルしたものを、ほかのPCに移動して実行すればいいんでしょうか。
今はそばにVC++が入ってないPCがないので確認ができないんですけど、それでいいのでしょうか。

>>253
今はエラーを確認できないのでスクリーンショットも撮れません。

255 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 12:30:06 ]
pow DOMAIN errorのメッセージダイアログを出ないようにするにはどうすればいいですか

256 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 12:31:07 ]
>>254
>それでいいのでしょうか。
お前、>>252-253を読んだ上で言ってるの?

257 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 12:51:00 ]
STLSOFTが良さそう 日本語の解説すくない だれか教えて。 Windowsに限ればboostよりいい気がしてる。

www.stlsoft.org
STLSoftの中身

ACESTL (acestl.org).
ATLSTL (atlstl.org).
COMSTL (comstl.org).
.netSTL (dotnetstl.org).
InetSTL (inetstl.org).
MFCSTL (mfcstl.org).
UNIXSTL (unixstl.org)
WinSTL (winstl.org).
もうなんだか至れり尽せりですね。

自分がやっているプロジェクトの意味が無いように思えてきた・・・。おrz!!!
d.hatena.ne.jp/studiokingyo/20061223

258 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 12:51:32 ]
>>255
どういうソースで出るんだ?

259 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 12:53:36 ]
>>252
できればほかのパソコンに何かインストールする方法は避けたいです。
>2. msvcr90.dllなどをMicrosoft.VC90.CRT.manifestなどと共にEXEと同じフォルダに置く。
よくわかりませんでした。もう少し詳しく教えてください。

>>253
共通言語ランタイムサポートを使用しないになっています。
>MFCの使用が「共有DLLで〜」なら「スタティックライブラリで〜」に。

>構成プロパティ - C/C++のランタイムライブラリが「/MD」なら「/MT」に。
この設定でコンパイルすると
1>MSVCRT.lib(wcrtexew.obj) : error LNK2019: 未解決の外部シンボル _wWinMain@16 が関数 ___tmainCRTStartup で参照されました。
1>C:\Documents and Settings\****\My Documents\Visual Studio 2008\Projects\Othello\Debug\Othello.exe : fatal error LNK1120: 外部参照 1 が未解決です。
と、なってコンパイルできません。

>>256
調べてる間にレスがきてしまったので失礼しました。



260 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 12:55:16 ]
>>257
自分で翻訳なり、ソース解析なり出来ないなら諦めた方が良い
問題が起きたとき、自力で解決出来んだろう

261 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 13:02:02 ]
>>259
main() で始まるコンソールプログラムなのに コンソールプロジェクトになっていないんじゃ・・・

WinMain() で始まる windows プログラムなのに、
そのエラーとなると tchar.h あたりの UNICODE 関連が怪しい

262 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 13:02:51 ]
>>259
「/MDd」を「/MT」にしてないか?
「/MDd」なら「/MTd」だぞ。MD→MTなんだから。

あとプロジェクトプロパティの左上に構成ってあるだろ。
デバッグ版とリリース版で設定が分かれてるから、それぞれ設定を変えること。
まぁ、リリース版だけでも良いと思うけど。

263 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 13:06:10 ]
>>261 忘れて。 オプション変えたらリンク通らなくなっただけじゃ違うわ

264 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 14:03:24 ]
2chでスレたてて盛り上げていこうぜ > STLport
日本語の解説サイトも作る

265 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 14:04:29 ]
STLport > STLsoft ね。

266 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 14:29:55 ]
>>258
こんな感じだそうです。
pow()は底 の乗数 乗の計算を行って返す関数である。底 がゼロで乗数 がゼロ以下の場合にはdomain errorが発生する。また、底 が負で乗数 が小数の場合にもdomain errorになる。計算結果がオーバーフローする場合はrange errorが発生する。

267 名前:266 mailto:sage [2008/09/15(月) 14:30:56 ]
追記:その状態になってもダイアログを出したくないのです

268 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 14:54:55 ]
double d;
d = pow(0.0, -2.1);
std::cout << d << std::endl;

d = pow(-2.1, 0.1);
std::cout << d << std::endl;

d = pow(10e10, 100);
std::cout << d << std::endl;

---------------
1.#INF
-1.#IND
1.#INF

再現出来ないな。何が違うんだろう。

269 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 15:01:17 ]
ウィンドウプロジェクトにするとなります。



270 名前:デフォルトの名無しさん [2008/09/15(月) 16:19:19 ]
stlの質問です。
下記のプログラムを実行するとhoge関数が呼ばれて戻ってきた時には、TESTメンバのstrの領域はデストラクタで、
解放されてしまってます。この場合は、main()の最後でlistのstrを解放するしかないのでしょうか?
もっと別のやり方があれば教えて下さい。宜しくお願いします。

#include <string>
#include <list>

struct TEST {
std::string *str;
TEST() : str(NULL) {}
~TEST() { delete[] str; }
};

void hoge(std::list<TEST> &list)
{
TEST test;
test.str = new std::string[10];
list.push_back(test);
}

int main()
{
std::list<TEST> list;
hoge(list);
// list.str不適切なポインタ
return 0;
}

271 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 17:02:15 ]
C++で数値計算を行なっていて、
計算結果を1ステップごとにfstream使ってファイルhoge.txtに出力していました。
上記とは一切関係ない部分のバグを取って再度実行したら、
ファイルへの出力が途中からされなくなってしまいました。
1000回計算するとしたら380回から出力されません。ただ、coutではきちんと値が表示されます。
出力されなくなった後もプ゚ログラム自体は動き続けているためエラーが出ず、原因がわかりません。
このような症状の場合、どのような原因が考えられるか教えていただけませんか?

272 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 17:12:59 ]
・ストレージの空き容量が不足している。

273 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 17:20:56 ]
・ストリームをフラッシュしていない(勿論、クローズしていない)。

274 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 17:23:12 ]
そんなわけ・・・・マジだ、吊ってきます orz
エラーを出す方法とかありますか?

275 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 17:23:27 ]
380回のあたりで異常な文字列を吐いてしまって
fstreamがエラー状態になっているとか。

276 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 17:24:33 ]
>>270
TESTにきちんとコピーコンストラクタとoperator =を設ける。

277 名前:271 mailto:sage [2008/09/15(月) 17:25:52 ]
>>274>>272に対してのレスです。
申し訳ない

278 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 17:34:40 ]
of.exceptions(badbit| failbit)としておけば、例外投げてくれる。
例外が嫌なら書き込み後にof.bad()とかof.fail()とか見ればいい。

279 名前:242 mailto:sage [2008/09/15(月) 17:40:36 ]
ソリューション構成をReleaseにしてみたら知り合いに送ったところ実行できたそうです。
皆様ありがとうございます。



280 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 18:53:59 ]
>>270
ポインタのメンバをディープコピーするTESTのコピーコンストラクタをきちんと書くこと。

281 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 00:20:58 ]
このプログラムで値が変わるのはなぜですか?

main(){
char a[]="マルチバイト文字列 mbs の sz 文字分をワイド文字列に変換します。";
wchar_t b[300];

cout<<strlen(a)<<endl;
MultiByteToWideChar(CP_ACP, 0, a, n, b, 300);
cout<<wcslen(b)<<endl;
}

282 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 00:28:54 ]
自己解決しました

283 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 00:46:12 ]
自己解決しませんでした。 値が変わります? なぜですか?


int m,n;
char a[]="マル"; wchar_t b[300];
n=strlen(a); mbstowcs(b,a,n);
m=wcslen(b); wcstombs(a,b,m);
cout<<n<<" "<<m<<" "<<strlen(a)<<endl;


284 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 00:50:03 ]
自己解決しました

285 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 01:08:59 ]
chatとw_charの変換はWindows APIのほうが鈍いようです。
 
#include <windows.h>
#include <time.h>
#include <iostream>
using namespace std;

main(){
int m,n,r,k;
char a[500]="マクロの動作は、有効になっているコンパイラ ディレクティブによって異なる。変換元と変換先の型が同じ場合は変換は行われない。コンパイラ ディレクティブでは、T および OLE を次のように変換する。";
wchar_t b[500];
n=strlen(a); mbstowcs(b,a,n+1);
m=wcslen(b); wcstombs(a,b,m+1);

int cl=clock();
for(k=0;k<1000000;k++){
r=MultiByteToWideChar(CP_ACP, 0, a, n, b, 500); b[r]=0;
r=WideCharToMultiByte(CP_ACP, 0, b, m, a, 500, NULL, NULL ); a[r]=0;}
cl=clock()-cl; cout<<cl<<endl;

for(k=0;k<1000000;k++){
mbstowcs(b,a,n+1); wcstombs(a,b,m+1);}
cl=clock()-cl; cout<<cl<<endl;}

286 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 01:34:51 ]
MultiByteToWideCharの使い方が間違っているからです

287 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 01:44:31 ]
正しい使い方はどうすればできますか

288 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 10:03:56 ]
MSDNをよく読む

289 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 12:28:05 ]
サイズが決まっていないchar*型の文字列が10個ていどあって
一致する文字が存在するか見つける高速な方法はSTLのmapですか。
一番速い方法教えてください。 あと元データは削除、追加可能でお願いします。




290 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 12:32:39 ]
Double-Arrayていうのがありますが、単語数は少ないので、そんな最新技術はいらないし、速く見つかる方法がいいです。



Double-Array は Trie を表現するためのデータ構造です. ハッシュ木, デジタルトライ, パトリシア木, Suffix Array による
擬似 Trieといった 他の Trie の実装に比べ高速に動作します.
オリジナル の Double-Arrayは, 動的に key の追加削除を行えるような枠組ですが,
Darts は ソート済の辞書を一括してDouble-Array に変換することに機能を絞っています.
chasen.org/~taku/software/darts/

291 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 15:49:12 ]
hashmapはそれほど速くないです。
#include <windows.h>
#include <iostream>
#include <map>
#include <hash_map>
#include <string>
#include <vector>
using namespace std;

map<string,int> stlmap;
hash_map<string,int> hashmap;
vector<string> vec;
string strgen(){ int R=10+rand()%10; string str=""; for(int j = 0; j < R; j++) str+=(char)(97+rand()%3); return str; }


int main() {
int i,cl; pair<string,int> p;
for(i = 0; i < 100; i++) { p = make_pair(strgen(),i); stlmap.insert(p);hashmap.insert(p);vec.push_back(p.first);}

int n=0; string searchword(strgen());
#define N 500000
// 空のループ
cl=timeGetTime();for(i = 0; i < N; i++) ;cl=timeGetTime()-cl; cout<<cl<<endl;
// STLmap
cl=timeGetTime(); for(i = 0; i < N; i++) stlmap.find(searchword); cl=timeGetTime()-cl; cout<<cl<<endl;
// STLport_hashmap
cl=timeGetTime(); for(i = 0; i < N; i++) hashmap.find(searchword); cl=timeGetTime()-cl; cout<<cl<<endl;
// Vector
cl=timeGetTime();
for(i = 0; i < N; i++)for(int j=0;j<vec.size();j++)if(vec[j]==searchword)break;
cl=timeGetTime()-cl; cout<<cl<<endl;}

292 名前:十分速いじゃん… mailto:sage [2008/09/16(火) 16:25:57 ]
#include <iostream>
#include <map>
#include <stlport/hash_map>
#include <string>
#include <vector>
#include <boost/progress.hpp>
using namespace std;
map<string,int> stlmap; hash_map<string,int> hashmap; vector<string> vec;
string strgen(){ int R=10+rand()%10; string str=""; for(int j = 0; j < R; j++) str+=(char)(97+rand()%3); return str; }
int main() {
int i,cl; pair<string,int> p;
for(i = 0; i < 100; i++) { p = make_pair(strgen(),i); stlmap.insert(p);hashmap.insert(p);vec.push_back(p.first);}
#define BEGIN { boost::progress_timer t;
#define END }
int n=0; string searchword(strgen());
#define N 500000
BEGIN;for(i = 0; i < N; i++) ;END; // 空のループ
BEGIN; for(i = 0; i < N; i++) stlmap.find(searchword); END; // STLmap
BEGIN; for(i = 0; i < N; i++) hashmap.find(searchword); END; // STLport_hashmap
BEGIN; // Vector
for(i = 0; i < N; i++)for(int j=0;j<vec.size();j++)if(vec[j]==searchword)break; END;}
g++ hashmap.cxx -I /usr/include/stlport/ -lstlport -O2
% ./a.out |tr "\n" " "
0.00 s
0.66 s
0.17 s
4.95 s

293 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 16:35:30 ]
訂正: -O2 -> -O0

294 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 17:15:34 ]
unordred_mapのがいいよ多分

295 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 17:35:55 ]
unordred_mapきはなかなかですね。 
#include <iostream>
#include <map>
#include <hash_map>
#include <string>
#include <vector>
#include <unordered_map>
#include <time.h>
using namespace std;
map<string,int> stlmap;
hash_map<string,int> hashmap;
tr1::unordered_map<string,int> unorderedmap;
string strgen(){ int R=10+rand()%10; string str=""; for(int j = 0; j < R; j++){int r=rand(); str+=(char)(97+r&3)+(char)(97+(r>>2)&3);} return str; }

int main() {
int i,cl; pair<string,int> p;
for(i = 0; i < 10000; i++) { p = make_pair(strgen(),i); stlmap.insert(p);hashmap.insert(p);unorderedmap.insert(p);}

int n=0; string searchword(strgen());
#define N 500000
// 空のループ
cl=clock();for(i = 0; i < N; i++) ;cl=clock()-cl; cout<<cl<<endl;
// STLmap
cl=clock(); for(i = 0; i < N; i++) stlmap.find(searchword); cl=clock()-cl; cout<<cl<<endl;
// STLport_hashmap
cl=clock(); for(i = 0; i < N; i++) hashmap.find(searchword); cl=clock()-cl; cout<<cl<<endl;
//unorderedmap
cl=clock(); for(i = 0; i < N; i++) unorderedmap.find(searchword); cl=clock()-cl; cout<<cl<<endl;}

296 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 18:02:46 ]
GoogleCode sparse_hash_map GoogleCode dense_hash_mapのインストール方法が判りません。 教えてください。
ここのコードがコンパイルしたいです。 BCC2009かVC++2008のやり方判りたいです。


articles.blog79.fc2.com/blog-entry-25.html

297 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 18:16:27 ]
なんにもいれずにそのコードを実行しようとしてるようなレベルですか?

298 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 19:07:44 ]
VC2008のhash_mapはstdext名前空間に入ってるのか
コンパイルできずにしばらく悩んだ
それにしてもDinkumwareは遅い・・・

299 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 23:05:05 ]
>>298
SP1当てればstd::tr1::unordered_mapも使えるよ。
もちろん性能は変わらないだろうけど。



300 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 23:59:36 ]
ある変数に連動して、複数のvectorのサイズを変更できますか?
自分で増減させると面倒です。

301 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 00:02:40 ]
自己解決しました。 tasu(); hiku(); という関数を作ってそこで処理することにしました。

302 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 00:13:45 ]
関数って良いよね……
造形が凄くソソるよね……

303 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 00:19:27 ]
free(normal) functionより
major(static) function objectの方がそそります^q^

304 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 00:34:32 ]
もっと俗っぽくresult_ofよりdecltypeのほうが欲しいな

305 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 02:44:47 ]
a,b,c・・・は0に近い値とし、x,y,z・・・は自然数とします。

このとき、(1+a)^x (1+b)^y (1+c)^z ・・・・の(x+y+z+・・・)乗根を求めたいです。

どのように計算するのが速いでしょうか? 100項目程度あるとします。

306 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 02:47:04 ]
つTaylor展開の低次の項

307 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 02:59:26 ]
log経由で計算するのが速いと思うのですが・・・
>>306 C++のソース教えてください

308 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 03:02:51 ]
2つの場合に限定してたとえば  (1+a)^x (1+b)^y の(x+y)乗根 をRとおくと

(x+y)logR=xlog(1+a)+ylog(1+b)となり、logの計算量がどの位かかるかってことです。

309 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 03:23:15 ]
>>307
ソースはめんどくさい
x+y+z+... = Sとおくと、答えはおよそ1+(ax+by+cz+...)/S
a<<1の時の近似式(1+a)^x=1+axを使って、a,b,c,...の1次の項だけ取り出すとこうなる
logとか使うまでもない



310 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 03:23:31 ]
POWよりLOGのほうが速かったです。

#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 200000

main(){
int n, *a=new int[N];
float *x=new float[N];

for(n=0;n<N;n++){ a[n]=rand(); x[n]=(float)(a[n]&255)/1024;}
double kei=0; for(n=0;n<N;n++) kei+=a[n];

double s=1; int cl=clock();
for(n=0;n<N;n++)s*=pow(1.0+a[n],x[n]/kei); cl=clock()-cl;
printf("%g %d\n",s,cl);

s=0; cl=clock();
for(n=0;n<N;n++)s+=x[n]*log(1+a[n]); s/=kei; s=exp(s); cl=clock()-cl;
printf("%g %d\n",s,cl);
}

311 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 03:28:26 ]
>>309
トンクス 教えてもらったものを付け加えましたが、値がかなり違っています。
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 200000

main(){
int n, *a=new int[N];
float *x=new float[N];

for(n=0;n<N;n++){ a[n]=rand(); x[n]=(float)(a[n]&255)/1024;}
double kei=0; for(n=0;n<N;n++) kei+=a[n];

double s=1; int cl=clock();
for(n=0;n<N;n++)s*=pow(1.0+a[n],x[n]/kei); cl=clock()-cl;
printf("%g %d\n",s,cl);

s=0; cl=clock();
for(n=0;n<N;n++)s+=x[n]*log(1+a[n]); s/=kei; s=exp(s); cl=clock()-cl;
printf("%g %d\n",s,cl);

s=0; cl=clock();
for(n=0;n<N;n++) s+=a[n]*x[n]; s=1 + s/kei; cl=clock()-cl;
printf("%g %d\n",s,cl);
}

312 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 03:29:33 ]
はじめとaとxの関係が違っているところが原因かもしれません 見直してきます

313 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 03:34:13 ]
誤差は大体、max(a[n])^2*nくらいで抑えられるはず

314 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 03:42:10 ]
あるていど近づきました。 aとxが逆になっていました。

#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 200000

main(){
int n, *a=new int[N];
float *x=new float[N];

for(n=0;n<N;n++){ a[n]=rand(); x[n]=(float)(a[n]&255)/1024;}
double kei=0; for(n=0;n<N;n++) kei+=a[n];

double s=1; int cl=clock();
for(n=0;n<N;n++)s*=pow(1.0+x[n],a[n]/kei); cl=clock()-cl;
printf("%g %d\n",s,cl);

s=0; cl=clock();
for(n=0;n<N;n++)s+=a[n]*log(1+x[n]); s/=kei; s=exp(s); cl=clock()-cl;
printf("%g %d\n",s,cl);

s=0; cl=clock();
for(n=0;n<N;n++) s+=a[n]*x[n]; s=1 + s/kei; cl=clock()-cl;
printf("%g %d\n",s,cl);
}

315 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 03:47:04 ]
しかし、おかしい点があります。 教えてもらった式は、小さい項を無視しているので
値が小さくなるはずですが、計算結果が他より大きいです。

あと、(1+A) (1+B) (1+C) ・・・のS乗根は、なぜ上のような式になりますか?
Aの値は1より大きいかも知れないですが・・・すると高次の項のほうが大きいかもしれません。
(Aはaxなどです。)

316 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 03:48:25 ]
というか、100項目程度の話じゃなかったのか?
N=200000でやったら、そりゃ誤差でかくなるの当たり前

317 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 03:51:31 ]
要するに求めるのは(1+a)^(x/S)(1+b)^(y/S)...≒(1+ax/S)(1+by/S)...≒1+ax/S+by/S+...
a,b,...<<1なんだから、ax/S,by/,...S<<1だよな


318 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 03:54:25 ]
トンクス そういうことですか わかりました 

319 名前:デフォルトの名無しさん [2008/09/18(木) 13:14:45 ]
質問です。 1バイト文字列とwchar_t文字列 (特にwchar_t型文字で可)はどのように
変換できますか? 自作できますか?



320 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 13:18:48 ]
>>319
wchar_tの文字コードは処理系依存であって、変換はcharの文字コードとwchar_tの文字コードを明確に示してくれないと答えようがない。
とりあえず使ってるコンパイラから書くってのはどう?

321 名前:デフォルトの名無しさん [2008/09/18(木) 13:20:55 ]
VC++2008、BCC2009でおねがいします。

322 名前:デフォルトの名無しさん [2008/09/18(木) 13:26:38 ]
すみません。なるべく速く変換したかったのですが、いい方法が自分で判りました。
すべての一語を標準関数で求めておいて、配列にいれておくという方法です。

323 名前:デフォルトの名無しさん [2008/09/18(木) 13:29:33 ]
>>320
文字列を記録している文字コードにも依存しますか?
SJIS、EUCなど、それぞれで変換関数は変わりますか?


324 名前:デフォルトの名無しさん [2008/09/18(木) 13:31:57 ]
コンパイラのフォルダを検索しましたが、wcstombsのコードはみつかりませんでした。 本体はlibになっているとおもいます。

325 名前:デフォルトの名無しさん [2008/09/18(木) 13:38:18 ]
かなり簡単であるとおもいました。
wchar_t → charはこれでいいみたいです。


wctomb(char *s, wchar_t wc)
{
*s = (char)wc;
}

libc.blog47.fc2.com/blog-entry-71.html

326 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 13:42:17 ]
またまたご冗談を

327 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 13:58:54 ]
下記のようなプログラムで、どのように記述すれば、正常に動作するのでしょうか?

やりたいことは、gushtUpdataAreaが配列であり、gulngUpdataAddressの示すアドレスに対してオフセットしたアドレスにgushtUpdataAreaの中身をコピーするというものです。

volatile static u_short *pushtWrAdr;
volatile static u_short *pushtRdAdr;
volatile static u_long ulngAdr;
u_long ulngI;

ulngAdr = (gulngUpdataAddress & 0x0fffffff) + 0x0c800000;
pushtRdAdr = gushtUpdataArea;
pushtWrAdr = (u_long *)ulngAdr;
for(ulngI = 0; ulngI < gulngUpdataDataCount; ulngI++ ){
*pushtWrAdr++ = *pushtRdAdr++;
}

pushtWrAdr = (u_long *)ulngAdr;の部分の記述が悪いと思うのですが、どうすればいいでしょうか?



328 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 14:10:06 ]
>>327
コンパイルできてる?
gulngUpdataAddressの型が気になる。


329 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 14:13:42 ]
memcpy(reinterpret_cast<char*>(gulngUpdataAddress) + オフセット量, gushtUpdataArea, sizeof(gushtUpdataArea));



330 名前:デフォルトの名無しさん [2008/09/18(木) 14:14:37 ]
結果が変です。こうでます。 なぜですか?
a[] no size = 3
65 130 160
b[] no size = 3
65 130 160


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
main(){
unsigned char a[]="Aあ";
wchar_t b[10];
printf("a[] no size = %d\n",strlen(a));
for(int n=0;b[n]!=0;n++) printf("%d ",a[n]);
mbstowcs(b,a,strlen(a)+1);
printf("\n\nb[] no size = %d\n",wcslen(b));
for(int n=0;b[n]!=0;n++) printf("%d ",b[n]);
}

331 名前:デフォルトの名無しさん [2008/09/18(木) 14:18:48 ]
mbstowcsという関数のバグと思います。 
これはなんの変換もしていないみたいです。
BCC2009です。






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

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

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