[表示 : 全て 最新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でのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのが最も良いですが、
直接貼るのであれば、全角空白か に置換しておくことをお勧めします。

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です。

332 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 14:19:29 ]
ロケール設定してないからだろ

333 名前:デフォルトの名無しさん [2008/09/18(木) 14:28:55 ]
いい状態になりました

#include <iostream>
#include <locale.h>
using namespace std;

main(){
setlocale(LC_ALL, "japanese");
unsigned char a[]="Aあ"; wchar_t b[10];

printf("a[] no size = %d\n",strlen(a));
for(int n=0;a[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]);
}

334 名前:デフォルトの名無しさん [2008/09/18(木) 16:43:57 ]
while(true) {
 for(int i=0; i < 10; i++)
  ;
}

上のやつってwhileが回っている間int型の変数分のメモリをどんどん食っていく?
開放せん?

335 名前:デフォルトの名無しさん [2008/09/18(木) 16:46:52 ]
ローカル変数は有効範囲をすぎると無くなります

336 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 16:48:58 ]
ファイルを指定すると更新日を表示するプログラム。
VCで動いてたコードをBCCに持ってきたら動かない現象が発生しました。
_fstatで0が返ってくるのに中身がちゃんと入ってないみたいです。
up01.ayame.jp/up/download/1221723883.c

あれこれ弄ってみたけどうまくいかないorz

337 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 17:45:00 ]
>>336
先頭にアンダーラインが付いてる関数は基本的に移植性がない。
BCCではPOSIX準拠の fstat() を代わりに提供している。

www.linux.or.jp/JM/html/LDP_man-pages/man2/stat.2.html

338 名前:デフォルトの名無しさん [2008/09/18(木) 17:50:16 ]
コンパイラ限定の命令は使わないようにしよう
WinならAPIでいいだろう
無理なら、boostとかから探すとか

339 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 17:55:29 ]
BCC って SEH の __try と __finary を実装しているのだろうか?
まず表面化することないだろうけどね Win32例外

340 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 18:03:06 ]
>>339
__tryは実装していない。__finallyのみ実装しているが
これは__tryに対応するものではない。



341 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 18:07:07 ]
>>340
ありがとー
WinAPI だからといって必ずしも全て利用可能ではない ってことか
ま、SEHはかなり特殊だから仕方ない部分ではあるな

342 名前:336 mailto:sage [2008/09/18(木) 18:22:33 ]
>>337,338
stract _stat → stract stat
_fstat() → fstat()
に変更したらBCCでも問題なく動きました。ありがとうございます。
本業はマイコン/ラダー屋なのもあって、こういった部分はあまり気にする機会がなく勉強になりました。

Boost覗いてみました。
C++はBCBでも殆どC記述で組むような状態でオブジェクト指向が身についてないので
サンプルを見ながら少しずつ導入していこうと思います。

343 名前:デフォルトの名無しさん [2008/09/18(木) 19:12:50 ]
インクルードについて教えてください。

あるサンプルソースコードを入手して、
~~.slnを実行して、デバッグしたら動きました。

ファイル入出力をしようと思って、
メイン関数が書いてある.cファイルで#include <iostream>とすると、
1>c:\program files\microsoft visual studio 8\vc\include\cstdio(35) : error C2059: 構文エラー : ':'
1>c:\program files\microsoft visual studio 8\vc\include\cstdio(36) : error C2143: 構文エラー : '{' が ':' の前にありません。
が大量に出てきてしまいました。

インクルードしただけです。
何がいけなかったのでしょうか?

344 名前:デフォルトの名無しさん [2008/09/18(木) 19:16:53 ]
cppにする

345 名前:345 [2008/09/18(木) 19:32:12 ]
344さん、ありがとうございます。解決しました。

346 名前:デフォルトの名無しさん [2008/09/18(木) 20:55:40 ]
親クラス
┣親クラス及び全ての子クラスで使うデバッグ用クラス
┣子クラス
┣子クラス

・以下略

┗子クラス
 ┗子クラス
という構成なんですが、子クラスがデバッグクラスにアクセスする、定石のような方法ってどういうのがありますか?
今自分がやっているやり方は、子クラスをnewで作成した後に、デバッグクラスのポインタをchildcls->SetDebugCls( cls )みたいな感じで渡しています。
しかしそれだと、全ての子クラスにセットしなくてはならず、非常に手間がかかっています。
実際はデバッグクラス以外にも、全ての子クラスで使いたいクラスが数個あります。
良い方法があったら教えてください

347 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 21:13:31 ]
単一のデバッグクラスのインスタンスを子クラスで共有するの?

348 名前:346 mailto:sage [2008/09/18(木) 21:25:09 ]
>>347
はい。全ての子クラスで1つのデバッグクラスを操作したいのです。
デバッグでそれぞれのクラスのデータを集計し、統計のようなものを出したいデバッグクラスなので、単一の方向でお願いします。

349 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 21:32:10 ]
基底クラスのインナークラスとしてデバッグクラスを記述して、
基底クラスがそのデバッグクラスを包含するのじゃ駄目なの?

350 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 22:39:51 ]
デバッグクラスをグローバルにすればいいだけじゃないの?
それかシングルトン



351 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 22:58:27 ]
俺もグローバルで良いと思うけど。

まぁグローバル変数が嫌なら、
デバッグクラスかそれへのポインタの
staticなメンバ変数でも用意すれば良いんじゃね?

352 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 23:12:31 ]
流れが分からん
デバッグクラスが派生クラスにかかわらず単一なのは分かった
そのインスタンスは1個だけ?
それとも各インスタンスにつき1個ずつ?

いずれにしてもデバッグクラスを基底クラスの内部クラスとして定義して、
基底クラスの通常のメンバなり、静的メンバなりにそのデバッグクラスのインスタンスを持たせればいいと思うが






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

前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