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

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。

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

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

◆ソースのインデントについて
半角やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのが最も良いですが、
直接貼るのであれば、全角空白か に置換しておくことをお勧めします。
2デフォルトの名無しさん:2008/09/06(土) 22:47:35
3デフォルトの名無しさん:2008/09/06(土) 22:57:39
お勧めのC/C++開発環境ってありますか

VC++ Express 2008は、C言語サポートがしょぼくて・・・。
リファクタリングとか、関数のテンプレートとか作れたり出来るとうれしいんですが
4デフォルトの名無しさん:2008/09/06(土) 22:59:04
???
5デフォルトの名無しさん:2008/09/06(土) 23:01:39
メモリリークのチェックのために

#define new ::new(_T(__FILE__), __LINE__)
ってやってるんだが、

placement newを使いたいときはどうしたらいい?
6デフォルトの名無しさん:2008/09/06(土) 23:03:35
コメントをつけるとき↓どれがいいですか?

// ウィンドウクラスを登録
// ウィンドウクラスを登録する
// ウィンドウクラスを登録する。

// ウィンドウ・クラスを登録
// ウィンドウ・クラスを登録する
// ウィンドウ・クラスを登録する。

// ウィンドウのクラスを登録
// ウィンドウのクラスを登録する
// ウィンドウのクラスを登録する。
7デフォルトの名無しさん:2008/09/06(土) 23:06:36
// ウィンドウクラスの登録
8デフォルトの名無しさん:2008/09/06(土) 23:07:44
Regist window class.
9デフォルトの名無しさん:2008/09/06(土) 23:08:13
>>6

/* ウィンドウクラスを登録
BOOL RegisterWindowClass()
{
   〜〜〜
}
*/
10デフォルトの名無しさん:2008/09/06(土) 23:09:40
>Regist window class.
生半可な知識もここまで来ると笑えるな。
11デフォルトの名無しさん:2008/09/06(土) 23:10:39
みじかいのがいい
12デフォルトの名無しさん:2008/09/06(土) 23:13:26
>>6
関数名で処理が自明なものにコメントは不要だよ。What じゃなくて、
Why を書くようにしたほうがいいね。
135:2008/09/06(土) 23:18:18
事故解決?した。

http://ml.tietew.jp/cppll/cppll/thread_articles/9887#ar9888
これでやってみる
14デフォルトの名無しさん:2008/09/06(土) 23:18:45
// 窓級登録
15デフォルトの名無しさん:2008/09/06(土) 23:24:03
コメントとかいらねーだろ
16デフォルトの名無しさん:2008/09/06(土) 23:26:23
関数のコメントってみんなどんなのつけてるんだろう・・・
17デフォルトの名無しさん:2008/09/06(土) 23:27:26
フリーのリソースエディタでお勧めのものはありますか。
18デフォルトの名無しさん:2008/09/06(土) 23:29:26
/// <summary>
/// ほげほげな関数
/// </summary>
19デフォルトの名無しさん:2008/09/06(土) 23:34:35
>>18
C++だとあんまり役に立たないだろ。
20デフォルトの名無しさん:2008/09/06(土) 23:35:37
Doxygenとかに食わせたりしないの?
21デフォルトの名無しさん:2008/09/06(土) 23:41:31
>>8
Regist という英単語はない
225:2008/09/06(土) 23:44:19
>>13だと

new A()->f();
ってやったときにまずいことになることが発覚

だれかいい方法おせえて
23デフォルトの名無しさん:2008/09/06(土) 23:46:29
>>5,22
そんなマクロは捨てて auto_ptr なり scoped_ptr, shared_ptr なりのスマートポインタを使う。
24デフォルトの名無しさん:2008/09/07(日) 00:02:15
どうでも良い様な話なんですが、
RECT* SetRect(RECT* pDst, int x, int y, int width, int height) {
pDst->left = x;

}

みたいなアサイン補助関数があるじゃないですか。
こういう関数は戻り値でデスティネーションを返して、
if(xend > SetRect(〜)->right) みたいな使い方ができるように
なってますが、この戻り値って*で返すのと&で返すのと
どちらにするべきなんでしょうね?
どちらかに統一した方が見た目がすっきりしそうなのですが。
25デフォルトの名無しさん:2008/09/07(日) 00:04:33
*で受け取るなら*で返す
&で受け取るなら&で返す
のがわかりやすいのではないか
26デフォルトの名無しさん:2008/09/07(日) 04:52:27

SHA-1 のコリジョンの起こるサンプルデータを探しています.
ググってみると MD5 の方はすぐに見つかったのですが,SHA-1 の方は衝突記事はたくさん引っ掛るのですが,
肝心のデータが見つかりません.どこにあるか知っていたら教えていただけないでしょうか?
27デフォルトの名無しさん:2008/09/07(日) 10:54:48
何故このスレで?
2826:2008/09/07(日) 12:08:32

 ごめん,ぶっちゃけ どのスレで聞いたら良いか分からなかったんだ.
 あと RFC についてた MD5 と SHA-1 アルゴリズムのサンプルが C で書かれていたから,
このスレが比較的適当かと思ったんだ….

 あの後調べてたんだけど SHA-1 で見つかったコリジョンは計算回数を減らした奴で,完全版のほうは
コリジョンハッシュを生成する比較的現実的な計算量のアルゴリズムが見つかっただけなのかな?
 それともアルゴリズムが改良されてもう見つかっている?ここらへんがよくわからんとです….
29デフォルトの名無しさん:2008/09/07(日) 12:11:21
CRCで十分
30デフォルトの名無しさん:2008/09/07(日) 12:15:37
CPUのbit数以下であれば、計算コストは同じですか?
(32bitCPUで、intの和算、charの和算等)
もしそうであれば、前スレで64bitOSでも
doubleは64bit、floatは32bitってあるけど、
これも同じことがいえますか?


また、別件で、64bitOSでもintは32bitだったり64bitだったりとありますが、
intが32bitだとfloatと、64bitだとdoubleと共有したい場合、
何か方法ありませんか?
31デフォルトの名無しさん:2008/09/07(日) 12:22:28
計算時間は実測する
32デフォルトの名無しさん:2008/09/07(日) 12:26:50
>>30
int 以下の大きさの整数の演算は int に変換してから行う、と規格で決められている。
だから計算コストは同じ。読み取りと書き込みのコストは違うかもしれないけどね。

double, float についてはこういう規則は決められてないんで、同じことは言えない。
特定の環境に限って実験結果があれば別だけど。

別件については「共有」の意味がわからんので、なんとも。
33デフォルトの名無しさん:2008/09/07(日) 12:27:18
>>30
後者は共用体で。
34デフォルトの名無しさん:2008/09/07(日) 12:36:36
>>32
サンクス

共有は共有体(union)のことです
intのビットサイズがOSによって変わるなら
intが32bitの場合はfloatと、
intが64bitの場合はdoubleと共有体を組むべきだと思ったんですが
そのセオリーな方法はないのかと思いまして
35デフォルトの名無しさん:2008/09/07(日) 12:40:50
>>34
<stdint.h>あるいは<boost/cstdint.hpp>のint32_t/int64_t
36デフォルトの名無しさん:2008/09/07(日) 12:43:14
>>34
×共有体
○共用体
37デフォルトの名無しさん:2008/09/07(日) 12:49:33
>>34
typedef 一段かませばいいんじゃない?
どうやって int のビット数を判別するかは、環境依存のマクロがあればそれでもいいし、
C++ でテンプレートメタプログラミングしてもいい。
38デフォルトの名無しさん:2008/09/07(日) 12:50:33
>>35
32bitOSでも64bitに固定しろってことなんですかね?
せめてコンパイル環境によって
判定してくれるようなマクロを期待していたんですが

>>36
そうでした、お恥ずかしい
39デフォルトの名無しさん:2008/09/07(日) 12:58:27
判定したいならこれでどう

#include <limits.h>
#if INT_MAX == 2147483647
40デフォルトの名無しさん:2008/09/07(日) 13:09:20
template<std::size_t n> struct FP{ };
template<> struct FP<sizeof(float)>{ typedef float type; };
template<> struct FP<sizeof(double)>{ typedef double type; };
typedef FP<sizeof(int)>::type FPint;
41デフォルトの名無しさん:2008/09/07(日) 13:21:49
>>39
にゃるほど

>>37,40
テンプレートはクラスにしか使ったことなかったんですが
本来そういう使用方法だったんですね
メタプログラミングについて勉強してきます


ありがとうございました
42デフォルトの名無しさん:2008/09/07(日) 13:50:40
>>41
いや、メタプログラミングは本来の使い方じゃないからね。
ライブラリ実装内で使うならともかく、他人に使わせるようなところで使うのは控えたほうがいいよ。
43デフォルトの名無しさん:2008/09/07(日) 14:55:03
それでもマクロのifとか使うよりはTMPの方が余程健全に思えるわ
44デフォルトの名無しさん:2008/09/07(日) 15:04:32
C++の事で質問です
::func()という表記はグローバルスコープで宣言されたfuncを明示的に呼び出す場合に使用するものだったと思いますが
::new Hogeという風にnew演算子に対して::を付けている場合はどういう動きになるのでしょうか?
45デフォルトの名無しさん:2008/09/07(日) 15:20:36
グローバルなnew演算子を呼び出す。
46デフォルトの名無しさん:2008/09/07(日) 15:20:48
>28
■暗号技術【ROUNDsurea】■
ttp://pc11.2ch.net/test/read.cgi/tech/1180280982/
47デフォルトの名無しさん:2008/09/07(日) 19:19:25
>17
フリーのリソースエディタ
ResEdit
http://www.forest.impress.co.jp/lib/stdy/program/progsupt/resedit.html
48デフォルトの名無しさん:2008/09/07(日) 22:03:00
皆さんの現場では、ウォーターフォール形式で開発しているところが多いのですか?
これ以外のプロトタイプ形式とか経験ないのですが、なんか能率悪いと思う
49デフォルトの名無しさん:2008/09/07(日) 22:22:00
マ板に池
50デフォルトの名無しさん:2008/09/08(月) 17:41:04
アドバイス頂きたいのですが、プログラム終了時まで値を保存する、なんかのデータ型のオブジェクトの配列を確保したいと思ったのですが、プログラム実行時まで配列の要素数が分からない性質のプログラムだとします。

その場合、C++だと char* ch[] とか int* dt[] だけでは
storage size of `ch' isn't known (MinGW)のようにエラーになってしまうので、事前に配列を宣言しておくことができません。
なので、今回のように必要な数がプログラム実行時まで不明な同型のオブジェクトを動的に確保して、それらを一まとめにしておくには、配列ではなく次の要素へのポインタを格納したオブジェクトのリストを使うしかないでしょうか?
51デフォルトの名無しさん:2008/09/08(月) 17:48:12
>>50
mallocで必要なサイズの領域を確保すればいいんでない
52デフォルトの名無しさん:2008/09/08(月) 17:50:46
std::vector
53デフォルトの名無しさん:2008/09/08(月) 18:00:42
malloc (new) 以外に何か必要なの?
54デフォルトの名無しさん:2008/09/08(月) 18:05:10
>>53
いいえ、std::vectorを使いましょう。
5550:2008/09/08(月) 18:06:43
ありがごうございます。

>>51
プログラム開始から終了の間に、順々に必要な要素数が増えていく感じなので、最初に一気にmalloc とか new int [10] とかではダメだったのです。

>>52
そーか、要素がpriority_queueのポインタでして、ポインタってvectorに格納できないと勝手に思いこんでたんですが、調べてたらポインタでも大丈夫なんですね。
vecotrでなんとかなりそうです。ありがとうございましたm(_ _)m
56デフォルトの名無しさん:2008/09/08(月) 19:01:16
まったくの初心者ですが


#include <stdio.h>

int main(){

int a,b,c;

printf("足し算をします。計算する数字を2つ入力し下さい。\nなお数字の区切りには,を入力してください。\n");
scanf("&d , &d",&a,&b);
c=a+b;
printf("%d+%dは%dです。\n",a,b,c);

return 0;
}

何がいけないんですか?
57デフォルトの名無しさん:2008/09/08(月) 19:13:59
>>56
&d → %d
5856:2008/09/08(月) 19:17:55
>>57
ありがとうございます。
59デフォルトの名無しさん:2008/09/08(月) 20:07:57
次からは、「どんな結果になった(どんなエラーが出た)のか」
「それは自分の望みとどう違うのか」くらいは書いてくれよ。
>>56のケースは、たまたまコトの次第がすぐ特定できる内容だからスムーズに行ったけども。
60デフォルトの名無しさん:2008/09/08(月) 20:21:54
>>59
すみません、今後気を付けます。
61デフォルトの名無しさん:2008/09/09(火) 19:31:39
hStdOutputの出力を、char型配列にするにはどうしたらいいですか?
62デフォルトの名無しさん:2008/09/09(火) 19:45:58
すなわちメモリのハンドルが取得したいんです
63デフォルトの名無しさん:2008/09/09(火) 19:53:38
そういうことは出来ません。
64デフォルトの名無しさん:2008/09/09(火) 19:53:38
GlobalAllocでできることがわかりました。
ところでVirtualAllocなど種類がありますがどんな違いがありますか?
65デフォルトの名無しさん:2008/09/09(火) 20:01:07
マニュアルやAPIをちゃんと読みましょう。
66デフォルトの名無しさん:2008/09/09(火) 20:09:20
みつけたよ

http://konuma.txt-nifty.com/blog/2006/03/heapallocvirtua_5d49.html
・ HeapAlloc
異なるメモリブロックを多数作成するときに利用します。パフォーマンスを最大にしたい場合、
同じブロック長のみで構成したヒープハンドルを複数作成する必要があります。

・ VirtualAlloc
多量のデータを格納する空間を用意する必要があるが、一部は利用しないかもしれない場合に
重宝します(ハッシュテーブル等)。部分的に領域の確保を遅らせることが出来ます。
多量のメモリを確保する場合は基本的にこの関数に頼るべきです。

・ LocalAlloc/GlobalAlloc
どちらもWin16時代の名残です。Win32APIが要求しない限り、新規にこれを採用する理由はありません。

・ malloc (new)
データ長にあわせて、プロセスに既にあるヒープを使ったり、新たにヒープを作成したりします。
またマルチスレッドに対する耐性があるバージョンも存在し、賢いですが、その分最も遅いです。一般的には最後にHeapAllocを呼び出す結果になります。


67デフォルトの名無しさん:2008/09/10(水) 08:46:26
個人のブログをソースにするのはどうかと、MSDN読めよ。
68デフォルトの名無しさん:2008/09/10(水) 12:38:43
出力が変になります。 「あ」の前にゴミがつきます。どこがだめかわかりますか

char *sh=new char[1024];
lstrcat(sh, "あいうえおかき");
printf("%s\n", sh);
delete sh;
69デフォルトの名無しさん:2008/09/10(水) 12:47:08
自己解決しました 

char *p=new char[1024];
strcpy(p,"あいうえ");
printf("%s\n", p);
delete p;
70デフォルトの名無しさん:2008/09/10(水) 12:48:06
>>68
lstrcatは文字列を末尾に結合する関数。
newで確保した領域の中身は不定。
だからlstrcatはsh内の最初の'\0'を探してその位置に"あいうえおかき"を挿入する。
予めsh[0]に'\0'を入れておけば意図どおりの動作はする。
71デフォルトの名無しさん:2008/09/10(水) 12:50:53
>>70
サンクス
72デフォルトの名無しさん:2008/09/10(水) 13:50:46
メモリ確保の方法別に速度を測ったのですが、違いがでません。どうしたら差のでる比較になりますか?
#include <windows.h>
#include <iostream>
using namespace std;
#define memsize 32400000
#define T GetTickCount()
int main(){ int s[4][3]; memset(s, 0, 48); for(int n=0;n<10;n++){
int cl=GetTickCount(); HANDLE hHeap = HeapCreate(NULL, 0, 0);
char *p0 = (char*) HeapAlloc(hHeap, HEAP_ZERO_MEMORY, memsize);
cl=T-cl;s[0][0]+=cl; cl=T; memset(p0, 97, memsize);
cl=T-cl; s[0][1]+=cl; cl=T; HeapFree(hHeap, NULL, p0); HeapDestroy(hHeap);
cl=T-cl; s[0][2]+=cl;

cl=T; HANDLE hShare = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE,0, memsize, "MEMTEST");
char *p1 = (char*)MapViewOfFile(hShare, FILE_MAP_ALL_ACCESS, 0, 0, memsize);
cl=T-cl; s[1][0]+=cl; cl=T; memset(p1, 97, memsize);
cl=T-cl; s[1][1]+=cl; cl=T; UnmapViewOfFile(p1); CloseHandle(hShare);
cl=T-cl; s[1][2]+=cl;

cl=T; char *p2 = (char*)VirtualAlloc(NULL, memsize, MEM_COMMIT, PAGE_READWRITE);
cl=T-cl; s[2][0]+=cl; cl=T; memset(p2, 97, memsize);
cl=T-cl; s[2][1]+=cl; cl=T; VirtualFree(p2, memsize, MEM_DECOMMIT);
cl=T-cl; s[2][2]+=cl;

cl=T; char *p3=new char[memsize]; cl=T-cl; s[3][0]+=cl;
cl=T; memset(p3, 97, memsize); cl=T-cl; s[3][1]+=cl;
cl=T; delete p3; cl=T-cl; s[3][2]+=cl; }

printf("HeapAllocの速度の合計 確保%d コピー%d 解放%d\n",s[0][0],s[0][1],s[0][2]);
printf("FileMappingの速度の合計 確保%d コピー%d 解放%d\n",s[1][0],s[1][1],s[1][2]);
printf("VirtualAllocの速度の合計 確保%d コピー%d 解放%d \n",s[2][0],s[2][1],s[2][2]);
printf("newの速度の合計 確保%d コピー%d 解放%d \n",s[3][0],s[3][1],s[3][2]);}
7372:2008/09/10(水) 14:01:24
メモリ300Mの確保では、newが最速という結果が出ました。なぜかコピーが速いです。
74デフォルトの名無しさん:2008/09/10(水) 14:07:37
それぐらいこだわりを入れるなら、ポインタを使ったほうがいいよ。
75デフォルトの名無しさん:2008/09/10(水) 14:25:45
いやいや、ポインタは一回はまると難しすぎるから初心者には無理無理w
7672:2008/09/10(水) 14:27:12
すみません質問です。これは途中でerrで停止するのですが原因わかりますか?

#include <windows.h>
#include <iostream>
using namespace std;
#define memsize 200000000

int main(){
for(int n=1;n<100;n++){
printf("%d回目の確保\n",n);

char *q = (char*)VirtualAlloc(NULL, memsize, MEM_COMMIT, PAGE_READWRITE);
q[memsize-1]=0; VirtualFree(q, memsize, MEM_DECOMMIT);

HANDLE hd = HeapCreate(NULL, 0, 0);
char *p = (char*) HeapAlloc(hd, HEAP_ZERO_MEMORY, memsize);
if(p==NULL){cout<<"err\n";return -1;} p[memsize-1]=0;
HeapFree(hd, NULL, p); HeapDestroy(hd);}}
77デフォルトの名無しさん:2008/09/10(水) 14:28:12
っGetLastError
78デフォルトの名無しさん:2008/09/10(水) 14:32:24
当たり前だ
10回行かないだろ
言語のまえにバソポンについて勉強汁
7972:2008/09/10(水) 14:33:12
自己解決しました。
VirtualFree(q, memsize, MEM_DECOMMIT);を
VirtualFree(q, 0, MEM_RELEASE);にしたら成功しました。

でも、コミット解除と、領域解放の違いがわかりません。
8072:2008/09/10(水) 14:40:54
領域確保をHDD増設すると、コミットはFormatみたいなものですか?
コミット解除は、NTFSをOSが管理できないFormatと見なすようなものですか?
81デフォルトの名無しさん:2008/09/10(水) 14:46:47
>>79
説明すると長くなるからMSDNのメモリ管理に関する項目読んで。
8272:2008/09/10(水) 15:05:56
>>81
みてみたのですがわかりませんでした。

別々のメモリを確保して、ハンドルも取得したい場合は、hdとheはどのように求めればいいですか?
char *p = (char*)VirtualAllocEx(hd, NULL, memsize, MEM_COMMIT, PAGE_READWRITE);
char *q = (char*)VirtualAllocEx(he, NULL, memsize, MEM_COMMIT, PAGE_READWRITE);
83デフォルトの名無しさん:2008/09/10(水) 15:09:41
メモリ確保関数のうち、巨大な確保が一番成功しやすいのは、VirtualAllocExでしょうか?
あと、CreateFileMapping(INVALID_HANDLE_VALUE,・・・)はVirtualAllocExと同じですか?
メインメモリ。仮想記憶のどこかに確保されて性能に違いはありませんか?
84デフォルトの名無しさん:2008/09/10(水) 15:11:53
ぜんぶMSDNにかいてあるから探せ
85デフォルトの名無しさん:2008/09/10(水) 15:38:40
どうやらメモリ確保の最大容量は、newが少ないほかは全部同じでした。大容量時は使いやすいやつでいいってことですかね
#include <windows.h>
#include <iostream>
using namespace std;
int main(){
printf("HeapAllocのメモリ確保耐久テスト\n");
unsigned int size=200000000; while(1){
HANDLE hd = HeapCreate(NULL, 0, 0);
char *p = (char*) HeapAlloc(hd, HEAP_ZERO_MEMORY, size);
if(p==NULL){printf("エラーサイズ = %d\n",size);break;}
size*=1.05; HeapFree(hd, NULL, p); HeapDestroy(hd);}

printf("\nVirtualAllocのメモリ確保耐久テスト\n");
size=200000000; while(1){
char *q = (char*)VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_READWRITE);
if(q==NULL) {printf("エラーサイズ = %d\n",size);break;}
size*=1.05; VirtualFree(q, 0, MEM_RELEASE);}

printf("\nCreateFileMappingのメモリ確保耐久テスト\n");
size=200000000; while(1){
HANDLE hShare = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE,0,size, "MEMTEST");
char *r = (char*)MapViewOfFile(hShare, FILE_MAP_ALL_ACCESS, 0, 0, size);
if(r==NULL) {printf("エラーサイズ = %d\n",size);break;}
size*=1.05; UnmapViewOfFile(r); CloseHandle(hShare);}

printf("\nnewのメモリ確保耐久テスト\n");
size=200000000; while(1){
char *s=new char[size];
if(s==NULL) {printf("エラーサイズ = %d\n",size); break;}
else printf("成功サイズ = %d\n",size);
size*=1.05; delete s;}}
86デフォルトの名無しさん:2008/09/10(水) 15:42:26
インデントを整えてくれ
醜い
87デフォルトの名無しさん:2008/09/10(水) 16:49:38
メモリが512Mしか乗っていなくて、確保できた最大サイズ1.6Gの読み書きテストをすると
動作がおそくなります。 物理メモリの確保サイズはせいぜい300Mという所とおもいます。
300M以上の場合、メモリや仮想メモリを使わずに、ファイルにマッピングしたいと思います。
アロケータというのを聞きますが、newやSTLを自前で管理するにはどうしたらいいですか?
88デフォルトの名無しさん:2008/09/10(水) 16:59:53
newはoperator new
アロケータは3番目のテンプレート引数に指定できる
89デフォルトの名無しさん:2008/09/10(水) 17:19:32
自前のアロケータを使用してSTLを実用で使うまでにはどのような手順をとればいいかりません。
どうしたらいいですか
90デフォルトの名無しさん:2008/09/10(水) 17:21:59
templateを勉強し始めたのですがなぜエラーなのかわかりません。ご教授ください。
以下、該当ソースです。
typedef struct taghoge {
  int val1;
  union {
    struct {
      int val2_1_1;
      int val2_1_2;
    } val2_1;
    struct {
      long val2_2_1;
    } val2_2;
  } val2;
} hoge;

template <typename T> const char* func(T& temp) { return typeid(temp).name(); }

void main() {
hoge h;
printf("h = %s\n", func(h));
printf("h.val1 = %s\n", func(h.val1));
printf("h.val2 = %s\n", func(h.val2));
printf("h.val2.val2_1 = %s\n", func(h.val2.val2_1)); // 1: OK
printf("h.val2.val2_2 = %s\n", func(h.val2.val2_2)); // 2: NG
}
1の箇所はコンパイルも実行もできます。2の箇所はコンパイルできません。
エラーは「error C2664: 'func' : 1 番目の引数を '' から '&' に変換できません。」とでます。
なぜこのようなコンパイルエラーになるのでしょうか。
環境は VC++2005 ExpressEdition + SP1 です。
9190:2008/09/10(水) 17:25:57
unionのなかのstructに名前をつけたらコンパイルはとおりますが、
つけないで通す方法と、なぜ通らないかが理解したい箇所です。
92デフォルトの名無しさん:2008/09/10(水) 17:27:50
>>89
どういうキーワードでググッた?
93デフォルトの名無しさん:2008/09/10(水) 17:42:57
>>87
そんなことしたって速くならないよ。
それで速くなるならアプリはみんなそうするし、メモリを何Gも積む奴もいない。
94デフォルトの名無しさん:2008/09/10(水) 17:59:03
>>92
アロケータ、STLなどです。 
>>93
他のOSなどのメモリを食い尽くさないためです。
実メモリが無くなれば他のソフトにまで影響が出ます。
95デフォルトの名無しさん:2008/09/10(水) 18:30:22
>>90
2008 SP1では通ったぞ
規格的に適合してるかは知らん
96デフォルトの名無しさん:2008/09/10(水) 18:46:28
一瞬で10Gの空ファイルを作るにはどうすればいいんですか?
97デフォルトの名無しさん:2008/09/10(水) 18:47:06
環境による
98デフォルトの名無しさん:2008/09/10(水) 18:49:02
魔法使いに頼む
99デフォルトの名無しさん:2008/09/10(水) 18:58:45
空ファイルってサイズあるの?
100デフォルトの名無しさん:2008/09/10(水) 19:10:23
これで1Gのファイル生成と、char型配列の関連づけできてますか?

int main() {
char temppath[300], tempfile[300];
GetTempPath(300, temppath);
GetTempFileName(temppath,"mem",0,tempfile);
HANDLE fp=CreateFile(tempfile, GENERIC_READ|GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0 );
int size=1000000000;
LockFile(fp,0,0,size,0);
HANDLE mp=CreateFileMapping( fp, 0, PAGE_READWRITE|SEC_COMMIT, 0, size, "memtest");
char *q=(char*) MapViewOfFile( mp, FILE_MAP_ALL_ACCESS, 0, 0, 0);
q[size-1]='a';
UnmapViewOfFile(mp);
UnlockFile(fp,0,0,size,0);
CloseHandle(fp);}
101デフォルトの名無しさん:2008/09/10(水) 19:23:31
>>96
何の目的かわからないけどWinならスパースファイルを作ればいい。
見せ掛けだけだからディスク容量は減らないが。
102デフォルトの名無しさん:2008/09/10(水) 19:25:34
1Gのファイルを作って見たけど、体感で60秒ぐらいかかった。結構時間かかるんだね。
gcc
103デフォルトの名無しさん:2008/09/10(水) 20:09:44
>>94
それで検索して一番目に作り方と使い方の説明ページが出てくるけど。
そのページでさっぱり分からないとなると、
ここで聞いても無駄だと思う。
レスで書ける文字数的に。

具体的にどこが分からないか書けばアドバイスしてくれる人も居るかもしれないけどね。
104デフォルトの名無しさん:2008/09/10(水) 21:39:44
>>96
Winの場合、適当にファイル作ってファイルポインタを1GBの位置に移動、
ファイル終端をそこに設定すればいける
105デフォルトの名無しさん:2008/09/10(水) 21:40:58
1GBじゃなくて10GBだった。まあサイズはなんだっていいけど。
106デフォルトの名無しさん:2008/09/10(水) 21:46:35
超初心者です。
クラスを3つほど作り
数を入力して、もともと設定されている数と計算をし、
他のクラスの数から引いて、表示する
ってのを作るにはどうしたらいいですか?
107デフォルトの名無しさん:2008/09/10(水) 21:49:34
>>106
宿題スレでもいくといいよ
108デフォルトの名無しさん:2008/09/10(水) 21:53:35
>>107
宿題じゃなくて、宿題を片付けるための試しのプログラムだから・・・OTL
109デフォルトの名無しさん:2008/09/10(水) 22:13:28
>>108
宿題スレでもいくといいよ
110デフォルトの名無しさん:2008/09/10(水) 22:15:13
そもそも意味がわからん
111デフォルトの名無しさん:2008/09/10(水) 23:36:21
トランプを使ったプログラムについて質問です。
mainで、
int card[4][13];
char *mark[4]={"H","D","C","S"};
char *number[13]={"A","2","3","4","5","6","7","8","9","10","J","Q","K"};

と宣言して、これを関数の中でも使いたいときってどうすればいいの?
例えば関数Aで使いたいとしたら
void A( )
{
}

で( )の中には何をいれればいいんですか?
112デフォルトの名無しさん:2008/09/10(水) 23:40:49
char**
113デフォルトの名無しさん:2008/09/10(水) 23:47:07
int card[4][13];

char *mark[4]={"H","D","C","S"};
char *number[13]={"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
で違う
後者は>>112の通り
前者はint x[][13]とかint (*x)[13]とか
114デフォルトの名無しさん:2008/09/10(水) 23:47:35
typedef
115デフォルトの名無しさん:2008/09/10(水) 23:48:53
void A(int card[4][13], char *mark[4], char *number[13])

A(card, mark, number);
116デフォルトの名無しさん:2008/09/10(水) 23:51:06
作ってみたんですけど
エラー E2176 ted.cpp 14: 宣言に型が多すぎる
エラー E2193 ted.cpp 50: 呼び出し時のパラメータが足りない:M::Attacked(Kougeki)(関数 main() )
となって上手くいきません
指摘お願いします。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7709.txt
117111:2008/09/10(水) 23:55:16
111です。
ありがとうございました!
できました!!
118デフォルトの名無しさん:2008/09/11(木) 00:01:51
>>116
class Kougeki
{
(中略)
}; ←ここにセミコロン

m.Attacked(); ←Kougeki型の変数を渡さないといけない
119デフォルトの名無しさん:2008/09/11(木) 00:06:45
k.damage == com * pow;

^^;
120デフォルトの名無しさん:2008/09/11(木) 00:08:41
s.Attack();
m.Attacked();

m.Attacked(s.Attack());

かなあ?どうしたいのかよくわからないので何ともいえないけど。
121116:2008/09/11(木) 00:09:26
解決しますたー
ありがとうございました!
122デフォルトの名無しさん:2008/09/11(木) 00:22:00
結局どうやったかを書いてくれないのがちょっと残念なとこだがいつものことだな
123デフォルトの名無しさん:2008/09/11(木) 06:25:22
自分をお客さんだと思ってるんだろうな。
getばかりでsetの概念が飛んでる。
12490:2008/09/11(木) 07:07:34
その後・・・VC++2008 ExpressEdition だと問題なくコンパイル〜実行できました。
VC++2005 ExpressEdition + SP1 ではコンパイルエラーが出るようです。

コンパイラが対応していない記述方法が原因という理解をしました。
ありがとうございました。
125デフォルトの名無しさん:2008/09/11(木) 07:09:52
>>124
あの糞なBCC(5.9.3)でもまともに走るぞ。
バグじゃね?
126デフォルトの名無しさん:2008/09/11(木) 07:28:44
.
127デフォルトの名無しさん:2008/09/11(木) 09:29:38
名前をつけてあげるといいと思うよ
128デフォルトの名無しさん:2008/09/11(木) 09:41:55
ゴッドファーザーですな
129デフォルトの名無しさん:2008/09/11(木) 18:04:41
こんな風に関数の中でアドレスをコピーして
結果用の引数に入れて返すにはどうしたらいいですか?

void CopyPtr(int* in, int* out)
{
out = in;
}

void main()
{
int* in;
int* out;

*in = 10;

CopyPtr(in,out);
cout << *out << endl;
}
130デフォルトの名無しさん:2008/09/11(木) 18:08:02
void CopyPtr(int* in, int*& out)
{
out = in;
}
131デフォルトの名無しさん:2008/09/11(木) 18:08:21
>>129
void CopyPtr(int* in, int** out)
{
*out = in;
}
.....
CopyPtr(in, &out);
.....
132デフォルトの名無しさん:2008/09/11(木) 18:24:34
>>130-131
できたぁ〜ありがとん!
133デフォルトの名無しさん:2008/09/11(木) 18:35:56
ダイアログのOK、キャンセルを押してもダイアログが閉じません。
あとBCCFormで.rcと.hは作りました。
どうすればいいか教えてください。

あとフリーのリソースエディタで皆さんがいいと思うものを教えてください。

ttp://www2.uploda.org/uporg1664738.zip
134デフォルトの名無しさん:2008/09/11(木) 18:43:21
>>133
ボタンのコントロールIDを IDOK や IDCANCEL にすればよい
135デフォルトの名無しさん:2008/09/11(木) 18:51:17
>>134
できました!
ありがとうございます。

あとBCCFormでリソースファイルを作成すると、include <windows.h>が作成されないんですけどほかのソフトのほうがいいでしょうか?
ちょっと使いにくいかなと思って。
136デフォルトの名無しさん:2008/09/11(木) 20:07:39
>>135
それはBCCがリソースコンパイルにwindows.hを必要としないが故の仕様
137デフォルトの名無しさん:2008/09/11(木) 22:59:31
質問です。なるべく省メモリにしたいのですが。
DLLとEXEが提供されているプログラムがあり、
メモリ (DLLのみ) かファイルを渡して処理(or出力ファイル)を返すのですが
ファイルを渡した方が省メモリになりますよね?
この場合、ファイルが1Gあったとしてはじめの100Mだけ渡したい場合はどうすればいいですか?
138デフォルトの名無しさん:2008/09/11(木) 23:02:44
100M分だけ切り抜いて渡すしかありませんか?
メモリに格納すれば、書き込むコストが無くせますが、100M分余計にメモリを食います。
相手のプログラムがその100Mを作業領域に使ってくれればかまわないのですがその保証はありません。
139デフォルトの名無しさん:2008/09/11(木) 23:04:16
ニホンゴでOKでーす
140デフォルトの名無しさん:2008/09/11(木) 23:04:46
「ファイルを渡す」ってのは具体的にはどういう処理なの?
141デフォルトの名無しさん:2008/09/11(木) 23:06:32
testprg.exe testfile
という風にです。 標準ではプロンプトに出力が出ますが -o outputfileなども書けます。
142デフォルトの名無しさん:2008/09/11(木) 23:08:33
でかいファイルを、小さく見せかける方法がわかれば、コピーする必要がないのですが。
たとうばchar[]でいうと\0を途中にいれるような方法です。
143デフォルトの名無しさん:2008/09/11(木) 23:09:58
中国か韓国の人に聞いたらどうですか?
144デフォルトの名無しさん:2008/09/11(木) 23:11:28
1Gの後半900Mをロックしておいて、前半の100Mで一つのファイルと見せかけて
処理が終わったら、また1Gに戻すような方法はありますか?
145デフォルトの名無しさん:2008/09/11(木) 23:12:48
>>141
じゃ、メモリを渡すってのは?
146デフォルトの名無しさん:2008/09/11(木) 23:14:44
100M切り取ってコピーして終わったら書き戻せよ
147デフォルトの名無しさん:2008/09/11(木) 23:14:51
メモリで渡すと、余分に100M使い込んでしまうんです・・・なんとかなりませんか?
148デフォルトの名無しさん:2008/09/11(木) 23:17:04
>>146
コピーすれば、処理後は削除するだけで良いとは思いますけど・・・
でもコピーのコストが掛かるのが嫌なんです。
149デフォルトの名無しさん:2008/09/11(木) 23:20:49
ファイル内容をロックしたまま、サイズだけを縮小出来れば、
HDD、メモリの物理的な動作は必要なく、一瞬で済むはずです。
戻すのも一瞬です。 教えてください。
150137:2008/09/11(木) 23:26:23
自己解決しました。 
151デフォルトの名無しさん:2008/09/11(木) 23:26:50
してません
152デフォルトの名無しさん:2008/09/11(木) 23:30:09
もうCは難しすぎるからやめた!
153デフォルトの名無しさん:2008/09/11(木) 23:30:10
150は本物です。 その方法は、メモリマップドファイルでサイズ指定してDLLに渡すんです。
でもこれだと、exeしか提供されていない場合は出来ません。 
exeでも出来る方法はありませんか
154デフォルトの名無しさん:2008/09/11(木) 23:36:51
DLLだって、DLLしか提供されてなかったら、渡すほうから勝手に渡し方を決められないだろ。
155デフォルトの名無しさん:2008/09/11(木) 23:39:38
ついに中国共産党の幹部が動き出したぞ!
156デフォルトの名無しさん:2008/09/11(木) 23:39:51
DLLの場合は、ポインタchar *で渡すので同時にサイズを指定できるんです。
exeはファイルしか入力できないので、そのままだと1G全部処理してしまいます。
なんとかなりますか?
157デフォルトの名無しさん:2008/09/11(木) 23:43:23
通信しろよ
158デフォルトの名無しさん:2008/09/11(木) 23:48:10
まずこれがわかりません。
1Gのファイルを先頭100Mだけ残して縮めるのはどうしたらいいですか?
あと、100Mと900Mのファイルをコピー無しに連結するのはどうしたらいいですか?
どちらも書き込み不可にしておけば目的を達成できます。
159デフォルトの名無しさん:2008/09/11(木) 23:49:44
うぜぇな。
しらねぇよ。

NTFSとMFTでもググって勝手にやれ。
160デフォルトの名無しさん:2008/09/12(金) 00:01:29
>>156
154無視かよ、俺じゃないけど。
それはEXEだから、DLLだから、という問題ではない。

EXEでもファイル名と、そのうち何バイト目から何バイト目だけを処理するって
オプションを指定できるようになっているものだってあるし、
DLLでも\0終端文字列を受け取るので、バイト数を直接的に指定できないってものもある。
161デフォルトの名無しさん:2008/09/12(金) 00:10:02
バイナリデータならサイズ指定出来るのは普通ですよ。あとEXEにファイルを渡す場合、内容が見えないのに何バイト目からいくらまでとか指定は困難では?
縮小、結合方法を教えてもらいたいです。 

162デフォルトの名無しさん:2008/09/12(金) 00:40:41
constの付いたポインタは、const_cast使えばconstをはずせますが、
constの付いたポインタでない普通の変数(intとかdoubleとか)のconstを
一時的にはずす方法ってありますか?
163デフォルトの名無しさん:2008/09/12(金) 01:09:47
*(type-name *)&variable = rvalue
const int i = 10;
*(int *)&i = 20;
i = 30; 見なかったことにしてくれ
164デフォルトの名無しさん:2008/09/12(金) 01:18:35
int& j = *const_cast<int*>(&i);
165デフォルトの名無しさん:2008/09/12(金) 01:24:12
>>164
int& j = const_cast<int&>(i);でおk
166デフォルトの名無しさん:2008/09/12(金) 01:30:27
>>161
関数にファイルを渡す場合、内容が見えないのに何バイト目からいくらまでとか指定は困難では?
って言ってるのと同じに見える

で、知りたいのは
・1つのファイルを、メモリに読み込むことなく分割する方法
・2つのファイルを、メモリに読み込むことなく結合する方法
ってこと?それならたぶん無理だと思う

そもそも、ファイルの内容をメモリに読み込まないと、ファイルの操作ができないから

>>138を見ると、どこで100M分余計にメモリを食うのかわからない。
dll なり exe なりに渡すとコピーが発生するって事? >>142からそんな風に感じたんだけど。
でも>>149見ると、その dll や exe が受け取ったデータのコピーを取るとは思えない。
ファイルの中身をメモリに読み込むのが『余計』だと考えてるなら、これは余計じゃないんで効率化は無理
10Mずつ読み込むとか、そういう解決方法しかないと思うよ


結論:何をしてるのか、何がしたいのか、が分からない。今やってることをそのまま書いた方が分かりやすいかもよ
167162:2008/09/12(金) 01:52:35
>>164
>>165 (同じ人?)
ありがとうございます。
168デフォルトの名無しさん:2008/09/12(金) 02:16:59
inodeでぐぐる?
169162:2008/09/12(金) 02:25:10
続けて質問してしまいますが、お願いします。

typeid()を使っているのですが、
typeid(hoge).name()で帰ってくる文字列が本やサイトに載っているのと異なっています。

例えば、
int i; -> i
string s; -> Ss
vector<int> vi; -> St6vectorIiSaIiEE
vector<vector<double> > vvd; -> St6vectorIS_IdSaIdEESaIS1_EE
complex<int> ci; -> St7complexIiE

class Test0{}; Test0 t0; -> 4Test

という感じ(一部省略)になります。
なんとなく分かるのですが、完全には解読できません。

この表記の見方、もしくは解説サイトなどありましたら教えて下さい。
170デフォルトの名無しさん:2008/09/12(金) 02:28:23
typeid(Type).name()はoperator=とoperator!=で比較するしか
意味がない。
返される文字列は処理系依存。だが異なる型は異なる文字列
になる事は保証されている。
171169:2008/09/12(金) 03:03:42
>>170
ありがとうございます。

具体的に書いた方が良さそうなので、書きます。
今、
template<typename T>
class Matrix{
 private:
  vector<vector<T> > _matrix;
 ・・・
};

のような行列クラスを作成しているのですが、
行列を要素に持つ行列を考慮したいので、
T が Matrix<int> というのも考えられます。

行列の中身を参照(表示)するときに、
行列の要素の型がintやdoubleなどの場合と、
行列の要素の型がMatrixの場合とを区別するために、
typeid()を使って,Tの構造を知ろうと思っています。

なので、name()をうまく解読できればと思いました。


方向性自体ダメですか?
172デフォルトの名無しさん:2008/09/12(金) 03:11:10
ダメダメだね。name()はそんなことに使えない。
それこそ"type0", "type1"みたいな連番でも構わないわけだし。
素直に特殊化で頑張ってください。
173169:2008/09/12(金) 03:47:41
>>172
ありがとうございます。

便利なの見付けたと思ったのですが、
>それこそ"type0", "type1"みたいな連番でも構わない
その通りですね。


出直してきます。m(_ _)m
174デフォルトの名無しさん:2008/09/12(金) 06:03:33
PERL RUBY Pythonをcから使いたいとき、どれが最も必要なファイルが少なく済みますか?
合計のファイルサイズが小さい順に押してください。
175デフォルトの名無しさん:2008/09/12(金) 06:38:55
IronPythonにきめました。C++(API)もC$(NET)も利用できてコンパイルして実行ファイルが作れるらしいです。
176デフォルトの名無しさん:2008/09/12(金) 06:40:46
よかったですねkがんばってください
17790:2008/09/12(金) 07:46:35
>>127
名前をつけるという方法で解決はできるのですが、
何かライブラリとかで提供されてきたstructとかだったら、勝手に型名をつけられないなぁと。
それか、型名無しだから名前を勝手につけても問題はない・・・ということになるのでしょうか。

その後いろいろやってたらunionを入れなくても、
struct中に2つ以上の型名のないstructをいれても2つめからのstructで>>90と同じエラーになります。

エラーは「error C2664: 'func' : 1 番目の引数を '' から '&' に変換できません。」とでます。
178デフォルトの名無しさん:2008/09/12(金) 08:06:41
DuplicateHandleの効果を教えてください。コピーを作らずにsi.hStdOutput = hd;と書くと出力されません。
 
f(){
HANDLE hd, he;
hd = CreateFile("out.dat", GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0 );
DuplicateHandle(GetCurrentProcess(), hd, GetCurrentProcess(), &he, 0, 1, DUPLICATE_SAME_ACCESS);
STARTUPINFO si; ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE; si.hStdOutput = he;
PROCESS_INFORMATION pi; pi.hProcess = NULL;
CreateProcess(NULL, "xdoc2txt a.doc", NULL, NULL, TRUE,0, NULL, NULL, &si, &pi );
WaitForSingleObject(pi.hProcess,INFINITE);}
179デフォルトの名無しさん:2008/09/12(金) 10:08:18
C++についての質問です。
ファイルを単純にコピーするとき、次の二つの実行速度はどっちが速いですか?

//A
ifstream fl_in("file1.txt", ios::in| ios::binary);
ifstream fl_out("file2.txt", ios::out| ios::binary);
char ch_get;
while(!file1.eof()){
ch_get= fl_in.get();
if(!file1.eof()) fl_out.put(ch_get);
}

//B
copy(istreambuf_iterator<char>(fl_in), istreambuf_iterator<char>(), ostreambuf_iterator<char>(fl_out));


copyは<algorithm>のです。
もっと高速に処理できるコードがあったら、そちらもよろしくお願いします。
180デフォルトの名無しさん:2008/09/12(金) 10:09:54
実測したわけじゃないが、Cライブラリのfread fwriteを使った方が速いらしい。
181デフォルトの名無しさん:2008/09/12(金) 10:13:36
WindowsAPIが最速なことは間違いない。
Cはコスト掛けた上で最後にAPIを呼ぶ。
182デフォルトの名無しさん:2008/09/12(金) 10:15:28
ありがとうございます。
今度試して見ます。

fread,fwriteで思い出しましたが、c++のread, write関数との速度の違いはいかがでしょうか?
自分としては、freadやfwriteは、使い勝手の面で、境界越えしそうで怖いのですが。
183デフォルトの名無しさん:2008/09/12(金) 10:40:48
Vistaのイベントログに重大のクラスのイベントを書き込みたいです。
ReportEventで何を渡せばいいのでしょうか?
調べたのですが重大だけが見つかりませんでした。。。
184デフォルトの名無しさん:2008/09/12(金) 10:49:23
fread/fwriteは移植用で実際はネイティブのAPIを呼ぶ。
ネイティブAPIを避けるため、普通ならfwriteを呼ぶのがいい。
185デフォルトの名無しさん:2008/09/12(金) 10:53:38
Windowsでスクロール付きのテキスト表示エリアを簡単に作れるライブラリはありませんか?
186デフォルトの名無しさん:2008/09/12(金) 10:55:06
ありがとうございます。
fwriteでがんばります。
187デフォルトの名無しさん:2008/09/12(金) 12:16:10
>>185
エディットコントロール
188デフォルトの名無しさん:2008/09/12(金) 12:26:10
トンクス
189デフォルトの名無しさん:2008/09/12(金) 17:10:52
>>186
fread、fwriteは2Gまでの制限があるから注意な
190デフォルトの名無しさん:2008/09/13(土) 00:50:04
>>178
CreateFileするときにSECURITY_ATTRIBUTESで継承を許可(bInheritHandle = TRUE)にしておけば、
CuplicateHandleは要らないはず。
191デフォルトの名無しさん:2008/09/13(土) 04:30:38
>>185
C++Builder使え
192デフォルトの名無しさん:2008/09/13(土) 17:00:13
2の26乗 (=N) 個の配列どおしの要素を掛けた物の総和を求めたいと思います。
(a,b,c・・・) (x,y,z・・・)とするとき、ax + by + cz + ・・・です。
これを4スレッドに分けて計算したら早くなりますでしょうか?
0〜N/4、 N/4+1〜・・・と分割して和を求めるってことです。
193デフォルトの名無しさん:2008/09/13(土) 17:01:25
シングルコアでやったらまず間違いなく遅くなる
194デフォルトの名無しさん:2008/09/13(土) 17:35:11
>>192
寧ろ4で割った余りが0,1,2,3でスレッドを分けた方が早いかもよ。
特にIntelの2コアや4コアの場合。
195デフォルトの名無しさん:2008/09/13(土) 19:59:55
>>192
Pen4,Core2Duo,AMD系ではおそらく逆に遅くなる
Core2Quadなら上手くやれば早くなる
環境依存だけどプロセスの優先度上げて、
コンテキストスイッチ減らした方が良いんじゃない?
196デフォルトの名無しさん:2008/09/13(土) 20:47:34
>>192
スレッド数が物理コア数以下なら速くなるはずだけど
その処理内容だとメモリアクセスがボトルネックになりそう。
SIMDなんかがある環境ならそれ使うようにオプション指定するなり
インラインアセンブラ使うのもいいんじゃないか。
197デフォルトの名無しさん:2008/09/13(土) 20:48:36
1コアです。 のろくなります。 分割します。

#include <iostream>
#include <windows.h>
#include <process.h>
using namespace std;
#define N 110108864
char *a,*b; unsigned int s[4];
unsigned int f(void){unsigned int sum=0; for(int n=0;n<N;n++)sum+=a[n]*b[n];return sum;}

unsigned WINAPI g0(void*){for(int n=0;n<N/2;n++)s[0]+=a[2*n]*b[2*n];return 0;}
unsigned WINAPI g1(void*){for(int n=0;n<N/2;n++)s[1]+=a[2*n+1]*b[2*n+1];return 0;}
unsigned int g(void){ s[0]=s[1]=0; HANDLE hd[2];
hd[0]=(HANDLE)_beginthreadex(NULL, 0, g0,NULL, 0 ,NULL); hd[1]=(HANDLE)_beginthreadex(NULL, 0, g1,NULL, 0 ,NULL);
WaitForMultipleObjects(2, hd, TRUE, INFINITE);
CloseHandle(hd[0]);CloseHandle(hd[1]); return s[0]+s[1];}

unsigned WINAPI h0(void*){for(int n=0;n<N/4;n++)s[0]+=a[4*n+0]*b[4*n+0];return 0;}
unsigned WINAPI h1(void*){for(int n=0;n<N/4;n++)s[1]+=a[4*n+1]*b[4*n+1];return 0;}
unsigned WINAPI h2(void*){for(int n=0;n<N/4;n++)s[2]+=a[4*n+2]*b[4*n+2];return 0;}
unsigned WINAPI h3(void*){for(int n=0;n<N/4;n++)s[3]+=a[4*n+3]*b[4*n+3];return 0;}
unsigned int h(void){ s[0]=s[1]=s[2]=s[3]=0; HANDLE hd[4];
hd[0]=(HANDLE)_beginthreadex(NULL, 0, h0,NULL, 0 ,NULL); hd[1]=(HANDLE)_beginthreadex(NULL, 0, h1,NULL, 0 ,NULL);
hd[2]=(HANDLE)_beginthreadex(NULL, 0, h2,NULL, 0 ,NULL); hd[3]=(HANDLE)_beginthreadex(NULL, 0, h3,NULL, 0 ,NULL);
WaitForMultipleObjects(4, hd, TRUE, INFINITE); return s[0]+s[1]+s[2]+s[3];}
198デフォルトの名無しさん:2008/09/13(土) 20:49:36
main(){
cout<<"初期値設定中・・・\n";
a=new char[N] ; b=new char[N] ;
int n,cl; for(n=0;n<N;n++){int x=rand(); a[n]=(char)(x&15); b[n]=(char)((x>>4)&15); }
cout<<"計測開始・・・\n";
cl=GetTickCount(); cout<<"1 スレッド 計="<<f()<<" 掛かった時間="; cl=GetTickCount()-cl; cout<<cl<<endl;
cl=GetTickCount(); cout<<"2 スレッド 計="<<g()<<" 掛かった時間="; cl=GetTickCount()-cl; cout<<cl<<endl;
cl=GetTickCount(); cout<<"4 スレッド 計="<<h()<<" 掛かった時間="; cl=GetTickCount()-cl; cout<<cl<<endl;}
199デフォルトの名無しさん:2008/09/13(土) 21:02:22
手間の掛かる処理にしてみました。浮動小数点の割り算。2スレッドが早くなりました。

#include <iostream>
#include <windows.h>
#include <process.h>
using namespace std;
#define N 10097152
double *a,*b; double s[4];
double f(void){s[0]=0; for(int n=0;n<N;n++)s[0]+=a[n]/b[n];return s[0];}

unsigned WINAPI g0(void*){for(int n=0;n<N/2;n++)s[0]+=a[2*n]/b[2*n];return 0;}
unsigned WINAPI g1(void*){for(int n=0;n<N/2;n++)s[1]+=a[2*n+1]/b[2*n+1];return 0;}
double g(void){ s[0]=s[1]=0; HANDLE hd[2];
hd[0]=(HANDLE)_beginthreadex(NULL, 0, g0,NULL, 0 ,NULL); hd[1]=(HANDLE)_beginthreadex(NULL, 0, g1,NULL, 0 ,NULL);
WaitForMultipleObjects(2, hd, TRUE, INFINITE);
CloseHandle(hd[0]);CloseHandle(hd[1]); return s[0]+s[1];}

unsigned WINAPI h0(void*){for(int n=0;n<N/4;n++)s[0]+=a[4*n+0]/b[4*n+0];return 0;}
unsigned WINAPI h1(void*){for(int n=0;n<N/4;n++)s[1]+=a[4*n+1]/b[4*n+1];return 0;}
unsigned WINAPI h2(void*){for(int n=0;n<N/4;n++)s[2]+=a[4*n+2]/b[4*n+2];return 0;}
unsigned WINAPI h3(void*){for(int n=0;n<N/4;n++)s[3]+=a[4*n+3]/b[4*n+3];return 0;}
double h(void){ s[0]=s[1]=s[2]=s[3]=0; HANDLE hd[4];
hd[0]=(HANDLE)_beginthreadex(NULL, 0, h0,NULL, 0 ,NULL); hd[1]=(HANDLE)_beginthreadex(NULL, 0, h1,NULL, 0 ,NULL);
hd[2]=(HANDLE)_beginthreadex(NULL, 0, h2,NULL, 0 ,NULL); hd[3]=(HANDLE)_beginthreadex(NULL, 0, h3,NULL, 0 ,NULL);
WaitForMultipleObjects(4, hd, TRUE, INFINITE); return s[0]+s[1]+s[2]+s[3];}
200デフォルトの名無しさん:2008/09/13(土) 21:03:09

main(){ cout<<"初期値設定中・・・\n"; a=new double[N] ; b=new double[N] ;
int n,cl; for(n=0;n<N;n++){int x=rand(); a[n]=1+(double)(x&15); b[n]=1+(double)((x>>4)&15); }
cout<<"計測開始・・・\n";
cl=GetTickCount(); cout<<"1 スレッド 計="<<f()<<" 掛かった時間="; cl=GetTickCount()-cl; cout<<cl<<endl;
cl=GetTickCount(); cout<<"2 スレッド 計="<<g()<<" 掛かった時間="; cl=GetTickCount()-cl; cout<<cl<<endl;
cl=GetTickCount(); cout<<"4 スレッド 計="<<h()<<" 掛かった時間="; cl=GetTickCount()-cl; cout<<cl<<endl;}
201デフォルトの名無しさん:2008/09/13(土) 21:06:39
1CPUなのに2スレッドは凄い効果あります。およそ倍速出ます。
何度もメモリ読んでいるうちに、キャッシュが効いたりするのではと思い
一番最後にもう一度1スレッドを計算しても速度ははじめと同じでした。
202デフォルトの名無しさん:2008/09/13(土) 21:13:22
>>201
こっちの方が早くね?
主な変更はローカル変数 x の導入
unsigned WINAPI g0(void*dummy){unsigned int x=0;char *p=&a[0],*q=&b[0];for(int n=0;n<N/2;n++)x+=p[n]*q[n];s[0]=x;return 0;}
unsigned WINAPI g1(void*dummy){unsigned int x=0;char *p=&a[N/2],*q=&b[N/2];for(int n=0;n<N/2;n++)x+=p[n]*q[n];s[1]=x;return 0;}
203デフォルトの名無しさん:2008/09/13(土) 21:23:58
BCC2009の速度最適化したときの数値は1700 clockくらいなんですが、
VC++2008の速度最適化したときの数値は250 clockくらいです。
BCCの速度が鈍いだけで。VC++2008だと、1スレッドが最も速かったです。

>>202 このようにしてもVC++では大して効果なく1スレッドが最速でした。1コアCPUなんですが。
unsigned WINAPI h0(void*){int m=0; double x=0; for(int n=0;n<N/4;n++){x+=a[m]/b[m];m+=4;} s[0]=x; return 0;}

204デフォルトの名無しさん:2008/09/13(土) 21:44:21
CPUによって違うだろ。Core2使ってるの?
Athlon64だとどちらも1スレッド>2スレッド>4スレッドとなる。
近々X2かPhenom買うのでそちらも試してみたい。
205デフォルトの名無しさん:2008/09/13(土) 22:15:20
初期のセレロンの1コア2GHzですよ
206デフォルトの名無しさん:2008/09/13(土) 22:19:00
NetBurst系は他のCPUとはかなり異質な結果が出るらしいからなあ
207デフォルトの名無しさん:2008/09/13(土) 23:31:29
すみません、初心者な私に教えて下さい。

#include <list>

using namespace std;

class C
{
public:
 int ic;

 C (int c) { ic = c; }
};

int main()
{
 list<C *> mylist;

 mylist.push_back( new C(0) );
 mylist.push_back( new C(1) );
 mylist.push_back( new C(2) );
}

こんな感じになってるとして、ic == 1 であるようなオブジェクトだけを、
・list から削除し、
・かつ delete する
には、どのように書けばよいのでしょう。
208デフォルトの名無しさん:2008/09/14(日) 00:32:06
#include <iostream>
#include <list>
#include <algorithm>
using namespace std;

class C {
public:
int ic;

C (int c) { ic = c; }
~C() { cout << "~C" << endl; }
};

struct delete_equal_to: public std::binary_function<C *, int, bool> {
bool operator ()(C * p, int c) const {
return (NULL != auto_ptr<C>(p->ic == c ? p: NULL).get());
}
};

int main() {
list<C *> mylist;

mylist.push_back( new C(0) );
mylist.push_back( new C(1) );
mylist.push_back( new C(2) );

cout << mylist.size() << endl;
mylist.remove_if(bind2nd(delete_equal_to(), 1));
cout << mylist.size() << endl;
}
209デフォルトの名無しさん:2008/09/14(日) 00:41:07
>>208
returnの中はp->ic == cだとだめなの?って書こうとしたが、deleteさせる意図があるのね。
そこまでするくらいなら、list<shared_ptr<C> >使えよって言ってやるべきだと思う。
210デフォルトの名無しさん:2008/09/14(日) 00:45:31
「まだ」C++標準ではないのでね。
211207:2008/09/14(日) 00:57:04
ぐっは、難しい…。
もしかしてさらっと書ける構文とかあるのかと思ったら、そうでも無いのですね。
でも一つずつ読解してみます。
ありがとうございました!
212デフォルトの名無しさん:2008/09/14(日) 00:59:34
ついでに言っておくけど
mylist.push_back( new C(0) );
はpush_backに失敗するとnew C(0)したオブジェクトがリークする
213デフォルトの名無しさん:2008/09/14(日) 01:15:33
馬鹿な私に教えて下さい。
宿題板で、作って頂いたc++なのですが習ってない部分も出ていて、
よくわからず、困っています。
習っていない関数を使うのには、特に問題はないのですが
提出の際に説明書っぽいのをつけるのですが作成できず困っています。
例えば、この作業をするには?とか、オプションでこんな事も出来ます
とかです。

スレチかもしれませんが、宜しくお願いします。
ちなみに、宿題板ではボロボロに言われ、ここにきました。
すいません。

http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7720.txt
214207:2008/09/14(日) 01:18:29
なるほど…。

ということは、push_back() の引数として直接与えるんじゃなくて、
いったん

C *p = new C(0);

して、とりあえず mylist.push_back( p ); としてみて、
std::bad_alloc が投げられたらあきらめて delete する、
みたいな感じでしょうか。
215デフォルトの名無しさん:2008/09/14(日) 01:22:08
>>213
そんなの一から読めって言うのかよ。
大まかな機能ぐらい説明しろよ。
お前が作らせたんなら分かるだろうが。
というか、宿題スレ池。

C/C++の宿題を片付けます 115代目
http://pc11.2ch.net/test/read.cgi/tech/1217741118/
216デフォルトの名無しさん:2008/09/14(日) 01:29:56
>>215
わかりました。宿題スレに行きます。
すいませんでした。ご迷惑お掛けしました。

ちなみに、内容はエンコドとデコドで
テキストを吐き出し、オプションでプリントするみたいな感じです。

失礼しました。
217デフォルトの名無しさん:2008/09/14(日) 01:33:41
見たけどコメントついてるじゃん
無理せずに単位落としたら?
218デフォルトの名無しさん:2008/09/14(日) 01:36:08
>>214
bad_allocが投げられたらdeleteする必要はないぞ。
219207:2008/09/14(日) 01:42:05
>>218
了解しました。
どうもありがとうございます。
220デフォルトの名無しさん:2008/09/14(日) 02:24:00
>>218
お前は読み間違えてる
221207:2008/09/14(日) 02:29:02
>>220
あ、やっぱ delete(p); は必要ですか。
ていうか私が言葉足らずでした。
222デフォルトの名無しさん:2008/09/14(日) 03:02:24
std::bad_alloc例外が投げられるという事はメモリ確保に
失敗しているのだから、deleteしたらまずいだろう
223デフォルトの名無しさん:2008/09/14(日) 03:37:51
こういうことだろ。bad_allocを投げるのはmylist、pはdeleteしないといけない。
C *p = new C(0);
try
{
  mylist.push_back(p);
}
catch (std::bad_alloc const&)
{
  delete p;
  throw;
}
auto_ptrでもいける。
std::auto_ptr<C> p(new C(0));
mylist.push_back(p.get());
p.release();
224デフォルトの名無しさん:2008/09/14(日) 03:54:17
>>223
ああそういう意味かごめん
そりゃdeleteは必要だわ

newとpush_backを分離する事を前提とした
話なのね
225デフォルトの名無しさん:2008/09/14(日) 06:23:11
>>207
さらっと、というか自分でループまわす構文はあるよ。
STL的ではないけど。

for(list<C *>::iterator it=mylist.begin(); it != mylist.end();) {
// 1なら
if((*it)->ic == 1) {
delete *it;
it= mylist.erase(it);
}
// 1じゃないなら
else {
++it;
}
}
226デフォルトの名無しさん:2008/09/14(日) 06:53:47
確かboostだとこう書ける

#include <boost/ptr_container/ptr_list.hpp>

typedef boost::ptr_vector<C> list_type; //ポインタ指定しないが、中身はポインタになる
list_type mylist;
mylist.push_back( new C(0) );


for(list_type::iterator it = mylist.begin(); it != mylist.end();) {
 if(it->ic == 1) {
  it = mylist.erase(it);  //消去動作で自動でdeleteされる
 }
〜 //あとは225と一緒

詳細
ttp://www.kmonos.net/alang/boost/classes/pointer_container.html
227207:2008/09/14(日) 10:05:26
>>223
> こういうことだろ。bad_allocを投げるのはmylist、pはdeleteしないといけない。

あ、そうです。言葉足らずというのはそれが言いたかったのでした。

>>225
おおお、これです。こんな感じのを期待していました!

> STL的ではないけど。

というのは、イテレーションしていく過程はあくまでイテレータにまかせるべきで、
「it= mylist.erase(it);」のような「つなぎかえ」(?)のようなことを外野がやるのは
スマートじゃない、ということでしょうか。

うーむ、「実行時に動的に new したものを連結させておき、いらなくなったらそこだけ外す」
というのは良くあるケースかと思っていたのですが、もしかしてそもそもデータ構造の
選び方が間違ってますか……? >>224氏も、

> newとpush_backを分離する事を前提とした
> 話なのね

とおっしゃってるし……。

>>226
いろいろな環境で動かしたいのでできれば boost は避けたいのですが、
でも勉強になります。特にリンク先の「etc」のところ。

ありがとうございます。
228デフォルトの名無しさん:2008/09/14(日) 16:03:52
>>227
boostって静的リンク(?)だから大丈夫じゃないの?
229デフォルトの名無しさん:2008/09/14(日) 16:44:57
ファイル分割+テンプレートの特殊化で悩んでいます。

Test.h(Testクラス ヘッダファイル)
Test.cpp(Testクラス コンストラクタ)
show.cpp(Test<T>::show() 関数)
show1.cpp(Test<Test<int>>::show() show()のテンプレート特殊化)
で構成されています。

show.cppにあるTest<T>::show()を
アップしたファイルのように書き換えるとコンパイルエラーが発生してしまい、
これを解決できません。
よろしくお願いします。

http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7722.txt
230デフォルトの名無しさん:2008/09/14(日) 17:58:13
Test.hのtemplate <typename T>class Testのメンバ関数として
friend ostream &operator << (ostream &str, T const &val) {
return str << val ;
}
C++はあまり使ったことはないけど、これでも追加するといいかも
エロいひとの解答待つか
231デフォルトの名無しさん: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デフォルトの名無しさん:2008/09/14(日) 18:37:02
erase したイテレータを++するのは未定義動作じゃなかったか?
233デフォルトの名無しさん:2008/09/14(日) 18:45:29
>>232
mylist.erase(it++);
はイテレータを進めてから、進める前のイテラータに対してeraseするから問題ないと思うよ。
listのeraseでは消したイテレータ以外は無効にならないから。
234デフォルトの名無しさん:2008/09/14(日) 21:04:13
戻り値が次の要素じゃなかったっけ?
it = mylist.erase(it);
235デフォルトの名無しさん:2008/09/14(日) 21:41:25
listなら++でも安全だとしても、別なコンテナに変えられる可能性も
考慮して、戻りを代入するべきでは。
236デフォルトの名無しさん:2008/09/14(日) 22:10:33
>>235
set,multissetとかだとeraseの戻り値の型がvoidだったりするから、
it == hoge.eraseが書けないときもある。

vectorならeraseの戻り値を使えても、別なコンテナに変えられる可能性も
考慮してit++にするべきでは。
237デフォルトの名無しさん:2008/09/14(日) 22:53:20
>>236
vectorならit++は使えない。
238229:2008/09/14(日) 22:53:23
>>230
ありがとうございます。

<<のオーバーロードで修正がベスト何ですかね。
239デフォルトの名無しさん:2008/09/14(日) 23:26:15
vectorの場合remove_ifして得た新しい末尾以降をそれぞれdeleteした後にerase(new_end, end)
とlistとはやりかたが違うから、差し替え考慮するのは無理があるんでない?
240デフォルトの名無しさん:2008/09/15(月) 02:15:17
vectorとdequeはeraseの後反復子が無効化されるので、eraseの戻り値が必要。
mapやsetはeraseの戻り値がvoidなので、it++するしかない。
シーケンスコンテナと連想コンテナの取り替えを想定するのは
無理があるって事だな。
241デフォルトの名無しさん:2008/09/15(月) 09:14:33
effective STL に同じような話がある
242デフォルトの名無しさん:2008/09/15(月) 10:28:05
Visual C++ 2008 Express Editionでコンパイルした実行ファイルを、VC++が入ってないPCではエラーが出て実行できないんですけど
VC++が入ってないPCでも実行する方法を教えてください。
243207:2008/09/15(月) 10:29:22
>>225 氏の方法でも >>231 氏の方法でもうまくいきました。
ありがとうございます。

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

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

なるほど、早速ポチりました。
244デフォルトの名無しさん:2008/09/15(月) 10:47:02
>>242
エラーが出ないように修正する
245デフォルトの名無しさん:2008/09/15(月) 10:53:17
>>244
VC++がインストールされているPCではエラーがなく実行できます。
246デフォルトの名無しさん:2008/09/15(月) 10:54:07
>>242
まずはエラーの内容を示さないと・・・・
MFC7のdllがないとかか。
247デフォルトの名無しさん:2008/09/15(月) 10:59:51
SideBySide絡みじゃ?
MSから再配布可能なんちゃらを実行するPCにインストールすればいいとおも
248デフォルトの名無しさん:2008/09/15(月) 11:49:58
>>246
ほかのパソコンで実行すると指定したプログラムは実行できません。と表示されます。
249デフォルトの名無しさん:2008/09/15(月) 11:52:21
何で初心者って「エラーが出ます」「うまくいきません」
「動きません」って言って具体的なこと書かないんだろうな。
250デフォルトの名無しさん:2008/09/15(月) 11:53:18
>>248
本当にメッセージそれだけ?
251デフォルトの名無しさん:2008/09/15(月) 11:57:28
>>250
今はほかのパソコンにもVC++を入れてしまっているので確認はできないんですけど、もう少し長かったような気がします。
VC++を入れてない人のパソコンでも何かインストールをしなくても普通のアプリケーションみたいに実行できるようにしたいんです。
252デフォルトの名無しさん:2008/09/15(月) 12:01:39
>>251
1. VC++のバージョンにあうランタイムライブラリをインストールさせる。
http://www.microsoft.com/downloads/details.aspx?FamilyID=9b2da534-3e03-4391-8a4d-074b9f2bc1bf&DisplayLang=ja
http://www.microsoft.com/downloads/details.aspx?FamilyID=a5c84275-3b97-4ab7-a40d-3802b2af5fc2&DisplayLang=ja

2. msvcr90.dllなどをMicrosoft.VC90.CRT.manifestなどと共にEXEと同じフォルダに置く。
253デフォルトの名無しさん:2008/09/15(月) 12:22:30
>>251
基本的によく分からないエラーが出たら、
スクリーンショットを撮る事。

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

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

構成プロパティ - C/C++のランタイムライブラリが「/MD」なら「/MT」に。
254242:2008/09/15(月) 12:26:45
調べたらDebugフォルダの中の実行ファイルをただほかのPCに移動するだけでは、駄目らしいということがわかりました。
ソリューション構成をReleaseにしてコンパイルしたものを、ほかのPCに移動して実行すればいいんでしょうか。
今はそばにVC++が入ってないPCがないので確認ができないんですけど、それでいいのでしょうか。

>>253
今はエラーを確認できないのでスクリーンショットも撮れません。
255デフォルトの名無しさん:2008/09/15(月) 12:30:06
pow DOMAIN errorのメッセージダイアログを出ないようにするにはどうすればいいですか
256デフォルトの名無しさん:2008/09/15(月) 12:31:07
>>254
>それでいいのでしょうか。
お前、>>252-253を読んだ上で言ってるの?
257デフォルトの名無しさん:2008/09/15(月) 12:51:00
STLSOFTが良さそう 日本語の解説すくない だれか教えて。 Windowsに限ればboostよりいい気がしてる。

http://www.stlsoft.org
STLSoftの中身

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

自分がやっているプロジェクトの意味が無いように思えてきた・・・。おrz!!!
http://d.hatena.ne.jp/studiokingyo/20061223
258デフォルトの名無しさん:2008/09/15(月) 12:51:32
>>255
どういうソースで出るんだ?
259デフォルトの名無しさん: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デフォルトの名無しさん:2008/09/15(月) 12:55:16
>>257
自分で翻訳なり、ソース解析なり出来ないなら諦めた方が良い
問題が起きたとき、自力で解決出来んだろう
261デフォルトの名無しさん:2008/09/15(月) 13:02:02
>>259
main() で始まるコンソールプログラムなのに コンソールプロジェクトになっていないんじゃ・・・

WinMain() で始まる windows プログラムなのに、
そのエラーとなると tchar.h あたりの UNICODE 関連が怪しい
262デフォルトの名無しさん:2008/09/15(月) 13:02:51
>>259
「/MDd」を「/MT」にしてないか?
「/MDd」なら「/MTd」だぞ。MD→MTなんだから。

あとプロジェクトプロパティの左上に構成ってあるだろ。
デバッグ版とリリース版で設定が分かれてるから、それぞれ設定を変えること。
まぁ、リリース版だけでも良いと思うけど。
263デフォルトの名無しさん:2008/09/15(月) 13:06:10
>>261 忘れて。 オプション変えたらリンク通らなくなっただけじゃ違うわ
264デフォルトの名無しさん:2008/09/15(月) 14:03:24
2chでスレたてて盛り上げていこうぜ > STLport
日本語の解説サイトも作る
265デフォルトの名無しさん:2008/09/15(月) 14:04:29
STLport > STLsoft ね。
266デフォルトの名無しさん:2008/09/15(月) 14:29:55
>>258
こんな感じだそうです。
pow()は底 の乗数 乗の計算を行って返す関数である。底 がゼロで乗数 がゼロ以下の場合にはdomain errorが発生する。また、底 が負で乗数 が小数の場合にもdomain errorになる。計算結果がオーバーフローする場合はrange errorが発生する。
267266:2008/09/15(月) 14:30:56
追記:その状態になってもダイアログを出したくないのです
268デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2008/09/15(月) 17:02:15
C++で数値計算を行なっていて、
計算結果を1ステップごとにfstream使ってファイルhoge.txtに出力していました。
上記とは一切関係ない部分のバグを取って再度実行したら、
ファイルへの出力が途中からされなくなってしまいました。
1000回計算するとしたら380回から出力されません。ただ、coutではきちんと値が表示されます。
出力されなくなった後もプ゚ログラム自体は動き続けているためエラーが出ず、原因がわかりません。
このような症状の場合、どのような原因が考えられるか教えていただけませんか?
272デフォルトの名無しさん:2008/09/15(月) 17:12:59
・ストレージの空き容量が不足している。
273デフォルトの名無しさん:2008/09/15(月) 17:20:56
・ストリームをフラッシュしていない(勿論、クローズしていない)。
274デフォルトの名無しさん:2008/09/15(月) 17:23:12
そんなわけ・・・・マジだ、吊ってきます orz
エラーを出す方法とかありますか?
275デフォルトの名無しさん:2008/09/15(月) 17:23:27
380回のあたりで異常な文字列を吐いてしまって
fstreamがエラー状態になっているとか。
276デフォルトの名無しさん:2008/09/15(月) 17:24:33
>>270
TESTにきちんとコピーコンストラクタとoperator =を設ける。
277271:2008/09/15(月) 17:25:52
>>274>>272に対してのレスです。
申し訳ない
278デフォルトの名無しさん:2008/09/15(月) 17:34:40
of.exceptions(badbit| failbit)としておけば、例外投げてくれる。
例外が嫌なら書き込み後にof.bad()とかof.fail()とか見ればいい。
279242:2008/09/15(月) 17:40:36
ソリューション構成をReleaseにしてみたら知り合いに送ったところ実行できたそうです。
皆様ありがとうございます。
280デフォルトの名無しさん:2008/09/15(月) 18:53:59
>>270
ポインタのメンバをディープコピーするTESTのコピーコンストラクタをきちんと書くこと。
281デフォルトの名無しさん: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デフォルトの名無しさん:2008/09/16(火) 00:28:54
自己解決しました
283デフォルトの名無しさん: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デフォルトの名無しさん:2008/09/16(火) 00:50:03
自己解決しました
285デフォルトの名無しさん: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デフォルトの名無しさん:2008/09/16(火) 01:34:51
MultiByteToWideCharの使い方が間違っているからです
287デフォルトの名無しさん:2008/09/16(火) 01:44:31
正しい使い方はどうすればできますか
288デフォルトの名無しさん:2008/09/16(火) 10:03:56
MSDNをよく読む
289デフォルトの名無しさん:2008/09/16(火) 12:28:05
サイズが決まっていないchar*型の文字列が10個ていどあって
一致する文字が存在するか見つける高速な方法はSTLのmapですか。
一番速い方法教えてください。 あと元データは削除、追加可能でお願いします。
290デフォルトの名無しさん:2008/09/16(火) 12:32:39
Double-Arrayていうのがありますが、単語数は少ないので、そんな最新技術はいらないし、速く見つかる方法がいいです。



Double-Array は Trie を表現するためのデータ構造です. ハッシュ木, デジタルトライ, パトリシア木, Suffix Array による
擬似 Trieといった 他の Trie の実装に比べ高速に動作します.
オリジナル の Double-Arrayは, 動的に key の追加削除を行えるような枠組ですが,
Darts は ソート済の辞書を一括してDouble-Array に変換することに機能を絞っています.
http://chasen.org/~taku/software/darts/
291デフォルトの名無しさん: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十分速いじゃん…: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デフォルトの名無しさん:2008/09/16(火) 16:35:30
訂正: -O2 -> -O0
294デフォルトの名無しさん:2008/09/16(火) 17:15:34
unordred_mapのがいいよ多分
295デフォルトの名無しさん: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デフォルトの名無しさん:2008/09/16(火) 18:02:46
GoogleCode sparse_hash_map GoogleCode dense_hash_mapのインストール方法が判りません。 教えてください。
ここのコードがコンパイルしたいです。 BCC2009かVC++2008のやり方判りたいです。


http://articles.blog79.fc2.com/blog-entry-25.html
297デフォルトの名無しさん:2008/09/16(火) 18:16:27
なんにもいれずにそのコードを実行しようとしてるようなレベルですか?
298デフォルトの名無しさん:2008/09/16(火) 19:07:44
VC2008のhash_mapはstdext名前空間に入ってるのか
コンパイルできずにしばらく悩んだ
それにしてもDinkumwareは遅い・・・
299デフォルトの名無しさん:2008/09/16(火) 23:05:05
>>298
SP1当てればstd::tr1::unordered_mapも使えるよ。
もちろん性能は変わらないだろうけど。
300デフォルトの名無しさん:2008/09/16(火) 23:59:36
ある変数に連動して、複数のvectorのサイズを変更できますか?
自分で増減させると面倒です。
301デフォルトの名無しさん:2008/09/17(水) 00:02:40
自己解決しました。 tasu(); hiku(); という関数を作ってそこで処理することにしました。
302デフォルトの名無しさん:2008/09/17(水) 00:13:45
関数って良いよね……
造形が凄くソソるよね……
303デフォルトの名無しさん:2008/09/17(水) 00:19:27
free(normal) functionより
major(static) function objectの方がそそります^q^
304デフォルトの名無しさん:2008/09/17(水) 00:34:32
もっと俗っぽくresult_ofよりdecltypeのほうが欲しいな
305デフォルトの名無しさん: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デフォルトの名無しさん:2008/09/18(木) 02:47:04
つTaylor展開の低次の項
307デフォルトの名無しさん:2008/09/18(木) 02:59:26
log経由で計算するのが速いと思うのですが・・・
>>306 C++のソース教えてください
308デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2008/09/18(木) 03:29:33
はじめとaとxの関係が違っているところが原因かもしれません 見直してきます
313デフォルトの名無しさん:2008/09/18(木) 03:34:13
誤差は大体、max(a[n])^2*nくらいで抑えられるはず
314デフォルトの名無しさん: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デフォルトの名無しさん:2008/09/18(木) 03:47:04
しかし、おかしい点があります。 教えてもらった式は、小さい項を無視しているので
値が小さくなるはずですが、計算結果が他より大きいです。

あと、(1+A) (1+B) (1+C) ・・・のS乗根は、なぜ上のような式になりますか?
Aの値は1より大きいかも知れないですが・・・すると高次の項のほうが大きいかもしれません。
(Aはaxなどです。)
316デフォルトの名無しさん:2008/09/18(木) 03:48:25
というか、100項目程度の話じゃなかったのか?
N=200000でやったら、そりゃ誤差でかくなるの当たり前
317デフォルトの名無しさん: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デフォルトの名無しさん:2008/09/18(木) 03:54:25
トンクス そういうことですか わかりました 
319デフォルトの名無しさん:2008/09/18(木) 13:14:45
質問です。 1バイト文字列とwchar_t文字列 (特にwchar_t型文字で可)はどのように
変換できますか? 自作できますか?
320デフォルトの名無しさん: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;
}

http://libc.blog47.fc2.com/blog-entry-71.html
326デフォルトの名無しさん:2008/09/18(木) 13:42:17
またまたご冗談を
327デフォルトの名無しさん: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デフォルトの名無しさん:2008/09/18(木) 14:10:06
>>327
コンパイルできてる?
gulngUpdataAddressの型が気になる。
329デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2008/09/18(木) 16:48:58
ファイルを指定すると更新日を表示するプログラム。
VCで動いてたコードをBCCに持ってきたら動かない現象が発生しました。
_fstatで0が返ってくるのに中身がちゃんと入ってないみたいです。
http://up01.ayame.jp/up/download/1221723883.c

あれこれ弄ってみたけどうまくいかないorz
337デフォルトの名無しさん:2008/09/18(木) 17:45:00
>>336
先頭にアンダーラインが付いてる関数は基本的に移植性がない。
BCCではPOSIX準拠の fstat() を代わりに提供している。

http://www.linux.or.jp/JM/html/LDP_man-pages/man2/stat.2.html
338デフォルトの名無しさん:2008/09/18(木) 17:50:16
コンパイラ限定の命令は使わないようにしよう
WinならAPIでいいだろう
無理なら、boostとかから探すとか
339デフォルトの名無しさん:2008/09/18(木) 17:55:29
BCC って SEH の __try と __finary を実装しているのだろうか?
まず表面化することないだろうけどね Win32例外
340デフォルトの名無しさん:2008/09/18(木) 18:03:06
>>339
__tryは実装していない。__finallyのみ実装しているが
これは__tryに対応するものではない。
341デフォルトの名無しさん:2008/09/18(木) 18:07:07
>>340
ありがとー
WinAPI だからといって必ずしも全て利用可能ではない ってことか
ま、SEHはかなり特殊だから仕方ない部分ではあるな
342336: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にする
345345:2008/09/18(木) 19:32:12
344さん、ありがとうございます。解決しました。
346デフォルトの名無しさん:2008/09/18(木) 20:55:40
親クラス
┣親クラス及び全ての子クラスで使うデバッグ用クラス
┣子クラス
┣子クラス

・以下略

┗子クラス
 ┗子クラス
という構成なんですが、子クラスがデバッグクラスにアクセスする、定石のような方法ってどういうのがありますか?
今自分がやっているやり方は、子クラスをnewで作成した後に、デバッグクラスのポインタをchildcls->SetDebugCls( cls )みたいな感じで渡しています。
しかしそれだと、全ての子クラスにセットしなくてはならず、非常に手間がかかっています。
実際はデバッグクラス以外にも、全ての子クラスで使いたいクラスが数個あります。
良い方法があったら教えてください
347デフォルトの名無しさん:2008/09/18(木) 21:13:31
単一のデバッグクラスのインスタンスを子クラスで共有するの?
348346:2008/09/18(木) 21:25:09
>>347
はい。全ての子クラスで1つのデバッグクラスを操作したいのです。
デバッグでそれぞれのクラスのデータを集計し、統計のようなものを出したいデバッグクラスなので、単一の方向でお願いします。
349デフォルトの名無しさん:2008/09/18(木) 21:32:10
基底クラスのインナークラスとしてデバッグクラスを記述して、
基底クラスがそのデバッグクラスを包含するのじゃ駄目なの?
350デフォルトの名無しさん:2008/09/18(木) 22:39:51
デバッグクラスをグローバルにすればいいだけじゃないの?
それかシングルトン
351デフォルトの名無しさん:2008/09/18(木) 22:58:27
俺もグローバルで良いと思うけど。

まぁグローバル変数が嫌なら、
デバッグクラスかそれへのポインタの
staticなメンバ変数でも用意すれば良いんじゃね?
352デフォルトの名無しさん:2008/09/18(木) 23:12:31
流れが分からん
デバッグクラスが派生クラスにかかわらず単一なのは分かった
そのインスタンスは1個だけ?
それとも各インスタンスにつき1個ずつ?

いずれにしてもデバッグクラスを基底クラスの内部クラスとして定義して、
基底クラスの通常のメンバなり、静的メンバなりにそのデバッグクラスのインスタンスを持たせればいいと思うが
353デフォルトの名無しさん:2008/09/18(木) 23:27:15
親クラスにstaticで持たせるのが正解の気がする
まだエスパー歴が浅いから間違ってるかもしれんが
354デフォルトの名無しさん:2008/09/19(金) 00:36:34
文字の上下4ビットを入れ替える関数(RevChr)を作成しなさい。
ただし、RevChr関数の命令は1行で書かなくてはいけません。←ここ重要!
できた人から、提出するように。

って問題だされたんだけど。
355デフォルトの名無しさん:2008/09/19(金) 00:43:55
>>354
強引にやってみた。アホだ、俺。
(char>>4 + char<<4)
356デフォルトの名無しさん:2008/09/19(金) 01:42:15
優先順位・・・
357デフォルトの名無しさん:2008/09/19(金) 02:28:18
319だけど、wcharをcharに変換する速度は、

WideCharToMultiByte 250ms
wcstombs 1720ms
あらかじめ計算しておいた配列を使う 2170ms

となって圧倒的にwinAPIが速かったです。 前にローケル設定しなくてwcstombsが速いとか間違えを書きました。
358デフォルトの名無しさん:2008/09/19(金) 03:58:49
>>309
その後、実際につかう数字で計算してみたところ、3次の項までは必要となりました。
しかし、logで計算するより5倍は速いので助かりました。
359デフォルトの名無しさん:2008/09/19(金) 09:39:44
for_each を使って、int型の配列 v の集計をしなさいという問題なので、

class sum
{
 int total;
public:
 sum() : total(0) { }
 void operator()(int i)
 { total += i; }
 int get()
 { return total; }
};

sum s;
s = for_each(v.begin(), v.end(), s);

としたのですが、代入しなければならないことが気に入りません。

for_each<vector<int>::iterator, sum&>
  (v.begin(), v.end(), s)

とすれば出来たのですが、やっぱり何か違う気がします。
何かいい表現方法は無いでしょうか?
360デフォルトの名無しさん:2008/09/19(金) 10:23:41
std::for_each(v.begin(), v.end(), std::bind1st(std::mem_fun(&sum::operator ()), &s));

なんで代入したくないのか知らんが、↓のように書いたほうがシンプルでいいと思うけど。
sum s = for_each(v.begin(), v.end(), sum());
361デフォルトの名無しさん:2008/09/19(金) 11:01:51
なんでsumを使うか知らないが、↓のように書いたほうがスンプルでいいと思うけど。
int sum = std::accumulate(v.begin(), v.end(), 0, std::plus<int>());
362デフォルトの名無しさん:2008/09/19(金) 11:28:36
>for_each を使って、int型の配列 v の集計をしなさいという問題なので、
363デフォルトの名無しさん:2008/09/19(金) 11:30:31
>>361
for_each を使って、集計をしなさい
364デフォルトの名無しさん:2008/09/19(金) 11:37:37
そうですかごめんなさい早漏にて候
365デフォルトの名無しさん:2008/09/19(金) 11:51:24
>>359
TR1を使えば以下のようにできる。

std::for_each(v.begin(), v.end(), std::tr1::ref(s) ) ;

ただし、sumを次のように変更する必要がある。

class sum
{
public :
  typedef void result_type ;//ネストされたresult_typeという型で、関数オブジェクトの戻り値の型を表す
//省略
} ;

あるいは、unary_functionを継承すること。
366デフォルトの名無しさん:2008/09/19(金) 12:02:09
VC2008でマリオもどきを作ろうとしてるんですが、↓のソース(関係無さそうなメソッドとかは省略してます)をコンパイルすると
>v:\projects\mario\player.cpp(8) : error C2511: 'Player::Player(int,int,pleyer_type)' : オーバーロードされたメンバ関数が 'Player' にありません。
> v:\projects\mario\player.h(8) : 'Player' の宣言を確認してください。
となります。どこがおかしいのでしょうか?(見づらい質問でごめんなさい)
//Player.h
#include "Characters.h"
class Player : public Characters{
private:
    enum player_type ptype;
public:
    Player(void);
    Player(int x,int y,enum player_type type);
};
//Player.cpp
#include "Player.h"
Player::Player(void){
    this->x = 1;
    this->y = 1;
    this->ptype = PTYPE_NOM;
}
Player::Player(int x,int y,enum pleyer_type type){
    this->x = x;
    this->y = y;
    this->ptype = type;
}
//Characters.h
class Characters{
    enum char_type ctype;
public:
    Characters(void);
    Characters(int x,int y,enum char_type cp);
};
367デフォルトの名無しさん:2008/09/19(金) 12:12:44
>>366
× pleyer_type
○ player_type
ってことだと思うよ
368デフォルトの名無しさん:2008/09/19(金) 12:15:56
……死にたいorz
宣言と定義が違うって事だったんですか、回答有り難うございました
369デフォルトの名無しさん:2008/09/19(金) 12:33:35
>>359
int s = for_each(v.begin(),v.end(),sum()).get();
370359:2008/09/19(金) 12:41:58
みなさん、ありがとうございました。

>>365
いいと思い、(自分の処理系ではTR1が使えないので)boost::refでやってみたら、
> error C2064: 1 引数を取り込む関数には評価されません。
と出て、ダメでした。

TR1とboostはほとんど一緒と聞いていたのに残念でした。
371デフォルトの名無しさん:2008/09/19(金) 13:01:28
>>370
TR1は、確かにBoostを念頭においているとはいえ、より考えられている。
というのも、Boostは単にreference_wrapperで包んでいるに過ぎないので、
このままでは関数オブジェクトとして、operator ()を適用できない。

そこで、TR1では、メタプログラミングを駆使して、単項か二項として呼べるようになっている。
372デフォルトの名無しさん:2008/09/19(金) 13:22:41
この出力は0になります。STLの新規のresizeは常に初期化されますか?

vector<int> r;
r.push_back(1);
r.push_back(2);
r.resize(1);
r.resize(2);
cout<<r[1];
373デフォルトの名無しさん:2008/09/19(金) 13:29:32
されます
374デフォルトの名無しさん:2008/09/19(金) 13:47:28
dクスです
375デフォルトの名無しさん:2008/09/19(金) 15:54:53
これでどんな環境でも、メモリは解放されますか? 
クラス側で解放処理をしなくても、STLを使っている範囲(newは使わない)では自動開放されますか?

class A{ public:vector<char> x; A(){x.resize(10000000);}};

main(){
map<string,string> w;
w["hage"].resize(10000000);
cout<<"enterを押すとstringのメモリを解放します。 ";
getchar(); w.erase("hage");
cout<<"メモリは解放されましたか。 "; getchar();

map<string,A> z;
z["piza"].x[0];
cout<<"enterを押すとクラスのメモリを解放します。 ";
getchar(); z.erase("piza");
cout<<"メモリは解放されましたか。 "; getchar(); }
376デフォルトの名無しさん:2008/09/19(金) 16:01:47
STLのメモリ解放は変な点がありますから心配です。
というのも、vectorでclear();使っても全く解放できないからです。swapしかないので。
377デフォルトの名無しさん:2008/09/19(金) 16:10:25
ブロックでくくれば抜けたとき解放されるだろ
378デフォルトの名無しさん:2008/09/19(金) 16:11:03
何も変な点なんてねぇよ。
clearやresizeでメモリを解放する必要などない。
379デフォルトの名無しさん:2008/09/19(金) 16:13:50
MinGW3.4.5を使っているのですが、
list<vector<int> > l;
vector<int> v(10,0);
l.push_back(v);
とすると、
stl_list.h:435: warning: '__p' might be used uninitialized in this function
という警告が出ます。
l.insert(l.end(),v);
とすれば警告は出ないのですが、何が問題となっているのでしょうか?
380デフォルトの名無しさん:2008/09/19(金) 17:51:32
>>376
効率を上げるために、開放されないよ。
clearするってことは、次に直ぐ追加される可能性があるかもしれないってことで、バッファっは保持されるんだ。

381デフォルトの名無しさん:2008/09/19(金) 18:39:19
AUX
CON
NUL
PRN
をファイル名に使うとバグりますか?
382デフォルトの名無しさん:2008/09/19(金) 18:43:25
バグるかもしれないし、バグら無いかもしれない
383デフォルトの名無しさん:2008/09/19(金) 18:45:05
DOSの予約デバイス名が入っていたときに処理がおかしくなる代表例を教えてください。
WindowsXP以上でAPIを使ったときバグりますか?
384デフォルトの名無しさん:2008/09/19(金) 18:47:45
うちのパソコンだと、AUXを名前に含めても、エラーが出ずに
エクスプローラーで書き換えられます。 問題出ますか?
385デフォルトの名無しさん:2008/09/19(金) 19:04:12
一意的な絶対パスに変換する方法教えてください。 
下のpはパスとして正常なんですけど・・・
これを変換する関数は無いですか?

char p[]="C:\\hoge_hoge\\..\\windows\\Notepad.exe";
system(p); //パスが有効か?
char q[300];

GetLongPathName(p, q, 300);
wcout<<p<<"\n->\n";
wcout<<q<<endl;
386デフォルトの名無しさん:2008/09/19(金) 19:20:50
自己解決しました

char p[]="C:\\////\\hoge_hoge\\..\\windows\\Notepad.exe";
char q[300];
GetFullPathName(p, 300, q, NULL);
printf("%s\n", q);
387デフォルトの名無しさん:2008/09/19(金) 20:34:56
すみません。 wchar_t型配列に、世界各国語と英字の大文字・小文字が入っているとき
大文字を小文字に変換するにはどうしたら良いでしょうか?
388デフォルトの名無しさん:2008/09/19(金) 20:47:41
towlower
389デフォルトの名無しさん:2008/09/19(金) 21:00:05
すみません。このようにしたいんです。

中国語・・・ABCDF・・・中国語 
→中国語・・・abcde・・・中国語

ロシア語・・・FUNCTION・・・ロシア語
→ロシア語・・・function・・・ロシア語
390デフォルトの名無しさん:2008/09/19(金) 21:02:36
何語でも出来ますか??


towlower() の動作は、現在のロケールの LC_CTYPE カテゴリに依存する。

この関数を Unicode 文字に対して使うのはあまり適切でない。なぜなら、
Unicode には大文字(upper case)・小文字(lower case)・タイトル文字(title
case) という 3 つの "case" が含まれているからである。
http://manpages.ubuntu.com/manpages/feisty/ja/man3/towlower.html
391デフォルトの名無しさん:2008/09/19(金) 21:36:50
こんな感じ?

wchar_t
us_tolower(wchar_t c)
{
if(c<='A' && c>='Z')
{
c=c-'A'+'a';
}
return c;
}

392デフォルトの名無しさん:2008/09/19(金) 21:45:26
unicodeて、どのOS、コンパイラでもアルファベットはASCIIと同じですか?
393デフォルトの名無しさん:2008/09/19(金) 21:47:34
何?
394デフォルトの名無しさん:2008/09/19(金) 21:48:44
>>391
なんか怪しいけど、せめてLを・・・
395デフォルトの名無しさん:2008/09/19(金) 21:50:59
たまにはEBCDICも思い出してね
396デフォルトの名無しさん:2008/09/19(金) 21:52:47
コンパイルした環境に依存しないで、たとえば日本のVC++でコンパイルして、
ロシアや中国でも小文字になりますか?
397デフォルトの名無しさん:2008/09/19(金) 21:55:51
BCCでコンパイル中に任意のメッセージ書き出せるマクロみたいのってないよね?
398デフォルトの名無しさん:2008/09/19(金) 21:59:15
GetUserDefaultLCID

LCMapString
でやってみます。
399デフォルトの名無しさん:2008/09/20(土) 02:19:19
intel c++はisostream入っていませんか?
400デフォルトの名無しさん:2008/09/20(土) 02:38:34
日本語体験版だと入ってないのかな?
なんかヘッダが足らないみたいです
インストールの失敗?
英語体験版をいれて日本語で上書きしたらいいかな?
401デフォルトの名無しさん:2008/09/20(土) 02:50:42
わかりました。VC++2008との統合が失敗してたのですがそれが原因みたいです。

wikiより。

実行に必要なライブラリやリンカなどは付属していないため、他のコンパイラの環境に寄生した形で実行される。
WindowsではMicrosoft Visual Studioが、LinuxではGCCが必要である。
402デフォルトの名無しさん:2008/09/20(土) 02:52:46
isostream?
403デフォルトの名無しさん:2008/09/20(土) 17:52:54
あるところからC++のソースコードをダウンロードして、
そのフォルダの中のsample.vcprojというのを実行すると、
VisualStadioが起動しました。
サンプルコードのはずなので、F5を押して実行すると、

「シンボル情報がありません:firefox.exeのデバッグ情報が見つからないか、
または一致しません。シンボルが読み込まれていません」

というウィンドウが表示されました。どうすればよいでしょうか?
404デフォルトの名無しさん:2008/09/20(土) 17:57:33
あるところって、どこ?
405403:2008/09/20(土) 18:10:55
404さん

http://www.cs.umd.edu/~mount/ANN/
からann_1.1.1.zipをダウンロードして、
MS_Win32→sample→sample.vcprojを実行しました。
406デフォルトの名無しさん:2008/09/20(土) 18:29:16
プロジェクトの構成がReleaseになってるだけじゃないの?
Ctrl+F5とかで実行したら?
407403:2008/09/20(土) 18:36:34
406さん

プロジェクトの構成はDebugでした。
Ctrl+F5とすると、Firefoxが新しく起動しました。

プロジェクトの構成をReleaseにしてみて、
F5を押すと「デバッグセッションの実行可能ファイル」というウィンドウが出てきて、
「実行可能ファイル名」を選ばされました。
よく分からず、既定のWebブラウザを選んで実行しました。
それを過去にもやったため、Firefoxが動いているんだと思います。

「デバッグセッションの実行可能ファイル名」を何にすればよかったのでしょうか?
408デフォルトの名無しさん:2008/09/20(土) 19:08:56
1回かたの消しちまって、めんどくさくなった。

>>407
落としたけど、スタートアッププロジェクトがdllになってない?
samleをスタートアッププロジェクトに設定しないと、VSからは起動できない。

あと、sampleをビルドして出来るのは、コマンドラインアプリだったので、
F5実行だと、DOS窓が一瞬出てすぐ消えた。

デバッグセッションの実行可能ファイル名で解決したいなら、
「展開したフォルダ\ann_1.1.1\MS_Win32\bin\ann_sample.exe」
じゃないかね
409403:2008/09/20(土) 19:54:14
408さん

F5実行で、DOS窓が一瞬出てすぐ消えた、ところまではできました。
「引数無しで実行」したときはエラーになるようなので、
コマンド引数に「-df data.pts -qf query.pts」と設定して
実行してみました。すると「cannot open data file」と表示されました。
すこし前進したようです。
あとはどうやってファイルを開くのか試行錯誤しているところです。

query.ptsというのは点のデータだと思います。
Test dataフォルダには「data_pts」がありますがちょっと違う。
これを読めばいいのか、または別のところにデータがあるのか。。。
410デフォルトの名無しさん:2008/09/20(土) 20:12:01
test1-data.pts,test1-query.pts,test2-data.pts,test2-query.pts
ってのがあるみたいだけど
411デフォルトの名無しさん:2008/09/20(土) 20:13:07
俺が落としたヤツだと「ann_1.1.1\test\」の下に
test1-data.ptsとtest1-query.ptsってのが転がってたんで、
それを「ann_1.1.1\MS_Win32\bin\」の下にコピってからDOS窓で

ann_sample.exe -df test1-data.pts -qf test1-query.pts

って打ったら動いたけど。

VCからだとカレントフォルダ分かりづらいから
別にDOS窓起動した方が良いんじゃない?
引数の設定にフルパスで書いても良いと思うけど。

まぁそろそろ飽きたんで引っ込む。
412403:2008/09/20(土) 20:16:28
411さん

長いことありがとうございました。
後は自分で進んでみます。
413デフォルトの名無しさん:2008/09/20(土) 20:41:25
逆アセンブラしてCのソースに貼り付けたら、動かせますか?
コマンドラインの引数を、関数の引数に変換できますか
414デフォルトの名無しさん:2008/09/20(土) 20:44:13
>逆アセンブラしてCのソースに貼り付けたら、動かせますか?
そのまま貼り付けてコンパイルしたら動かないね
いやそも逆アセンブラするってなんだよって話だが

>コマンドラインの引数を、関数の引数に変換できますか
main関数の引数になります
415デフォルトの名無しさん:2008/09/20(土) 20:50:17
DOSプロンプトで動くツールで、ソースが無いものをパクリたいのですが・・
できないですか?

test.exe ファイル名 > 出力名
というツールを

char * test(char *ch){ アセンブラ }
という関数に出来ませんか
416デフォルトの名無しさん:2008/09/20(土) 20:57:14
無理?
417デフォルトの名無しさん:2008/09/20(土) 20:59:24
普通に通信して連携すれば?
418デフォルトの名無しさん:2008/09/20(土) 21:00:36
速度はひとつにした方が速いと思うんですが
419デフォルトの名無しさん:2008/09/20(土) 22:12:24
>>415
関数が export されていて、インターフェイスが公開されているなら簡単にできるが、それ以外だと面倒
グローバル変数を使ってたりしたら「自作のほうが楽じゃね?」ってなるかもw
420デフォルトの名無しさん:2008/09/21(日) 02:22:25
すみません
こういうツールの作り方教えてください 
圧縮ファイルをすべてのアプリに対してフォルダと認識させる方法です
wINDOWSエクスプローラのみなら昔からできたのですが


Zipファイルをマウントする?「Pismo File Mount Audit Package」
http://www.moongift.jp/2008/07/pismo_file_mount_audit_package/
421デフォルトの名無しさん:2008/09/21(日) 03:16:01
#include <stdio.h>
#include<math.h>

double simpson(double, double, double, double);
double func(double);

int main(void){
/* 必要な変数の定義をする */

double h,xkisu,xguu,s0,s1,s2,ans,x1,x2,n,x0,i;

scanf("%lf", &x1);
scanf("%lf", &x2);

printf("x1 = %f\n",x1);
printf("x2 = %f\n",x2);

/* 偶数の分割数を入力するまで繰り返す */
do{
scanf("%lf", &n);
printf("n = %f\n",n);
if ((n%2) != 0){
printf("!! Bunkatsu su ha gu-su- desu !!\n");
} else break;
} while (n%2!=0);
422421:2008/09/21(日) 03:17:12
すみません、みすって投稿してしましました。
上のは途中までのプログラムなのですが
コンパイルすると
22: 浮動小数点の不正な使用(関数 main )
25: 浮動小数点の不正な使用(関数 main ) とでます。
なぜでしょうか?
423デフォルトの名無しさん:2008/09/21(日) 03:33:07
小数を整数で割った余りって何なんだよ。
nはintとかにしとけ。
424デフォルトの名無しさん:2008/09/21(日) 04:52:19
Cでのメモリの取られ方についてご教授いただけませんでしょうか。

下記のようなコードを書いた場合、

static const char *teststr[6] = { "00000", "1111111111", "2", "3", "444", "555555" };

それぞれの文字列でピッタリ埋まるサイズでメモリが確保されて、
それらを指すポインタがteststrに格納されるのでしょうか?

VCで試したところ、確かにteststrの各配列に指定した文字列が格納されていたのですが、
ポインタのみを確保して、その位置のデータを破壊して、指定文字列を格納しているということはないでしょうか?
組み込み(ARM)での開発に使用しようかと思っています。

よろしくお願いします。
425デフォルトの名無しさん:2008/09/21(日) 05:02:09
そんなもの処理系によるとしか
426デフォルトの名無しさん:2008/09/21(日) 05:12:15
Cで@や$や`記号が使われなかった理由ってあるんですか。
427デフォルトの名無しさん:2008/09/21(日) 05:16:12
これ以上トリグラフ増やすのいやだったんじゃね
428デフォルトの名無しさん:2008/09/21(日) 07:28:28
>>424
破壊はしない。
429デフォルトの名無しさん:2008/09/21(日) 13:51:14
>>424
> それぞれの文字列でピッタリ埋まるサイズでメモリが確保されて、
> それらを指すポインタがteststrに格納されるのでしょうか?
そのとおり。
文字列はROM、ポインタはRAMに置かれる。
430デフォルトの名無しさん:2008/09/21(日) 15:26:49
>>429
ポインタが RAM にいっちゃうのは teststr に const が付いてないからだよね?
431デフォルトの名無しさん:2008/09/21(日) 15:27:21
Cから最近C++に移行しました。
関数を

void foo(char* filename);

と宣言して使うときに

foo("data.dat");

とやると deprecated conversion string constant to char みたいな
警告が出ます。これは何が不味いのでしょうか?
432デフォルトの名無しさん:2008/09/21(日) 15:28:02
>>431
const 付けたらいいんじゃね?
433デフォルトの名無しさん:2008/09/21(日) 15:28:17
>>431
文字列リテラルは書き換えできないから char const で受け取らないとあぶない。
434デフォルトの名無しさん:2008/09/21(日) 15:34:55
マクロの中で " をあらわすにはどうしたらいいですか?
エスケープを使うとエラーになり、そのまま使うと文字列リテラルとして解釈されてしまいます。。。
435デフォルトの名無しさん:2008/09/21(日) 15:35:43
つまり
foo(const char* filename);
と宣言すればよいということでしょうか?
436デフォルトの名無しさん:2008/09/21(日) 15:35:48
>>434
状況が見えんな。エラーになるコードとエラーメッセージをどうぞ。
437デフォルトの名無しさん:2008/09/21(日) 15:37:21
現在二次元配列と2重ループを習っている超初心者です
質問なのですが列和と行和を求めるプログラムで、
列和も行和も同じループ内で処理できるのは何故なのでしょうか?
438デフォルトの名無しさん:2008/09/21(日) 15:37:56
>>435
foo の中で filename の指す先を書き換えないんなら、それでいいはず。
っていうか、試せよ。
439デフォルトの名無しさん:2008/09/21(日) 15:39:09
>>437
日本語でどうぞ
440デフォルトの名無しさん:2008/09/21(日) 15:39:55
>>437
それだけ言われてもわかんねーよw
二次元配列を一次元配列にキャストしてるとか?
441437:2008/09/21(日) 15:47:42
すみません・・・どう表現していいかわからず整理しないまま打ってしまいました
考察の一部なんですが、これ以外文章にしようがなくて困っています
プログラムをあげたほうがいいでしょうか?
442デフォルトの名無しさん:2008/09/21(日) 15:49:34
>>441
まだ相談したいならコード晒せ。あの文章じゃ無理だ。
コード晒せば答えが得られる保証はないけどな。
443デフォルトの名無しさん:2008/09/21(日) 16:02:09
簡単なことだ

二重ループは行列の全ての要素にアクセスするための手段でしかないから
その扱いについては制限されない

あとは各行和各列和を格納する配列を定義して要素に応じてそれぞれ適切に加算していくだけ
444441:2008/09/21(日) 16:07:01
初心者丸出しで長ったらしいプログラムなのでろだにあげてみました。
No.7729です。よろしくお願いします。
445デフォルトの名無しさん:2008/09/21(日) 16:38:13
for(j=0;j<4;j++)
 for(i=0;i<3;i++)
  table[3][j]+=table[i][j];
これ行和しか求めてないよ。ソース中には列和を求める部分は見当たらなかったけど。
446444:2008/09/21(日) 18:52:32
>>445
列和の計算を入れ忘れている事に気付きました。ありがとうございます

この行和と列和を求めるプログラムの考察で、
列和も行和も同じループ内で処理できるのは何故かと言う問いなのですが
理由は>>443でOKもらえますかね・・・?
447デフォルトの名無しさん:2008/09/21(日) 19:11:38
>>446
>>443は日本語がちょっとおかしいのでちゃんとした文章を自分で考えてくれろ
正解かどうかは知らないし
448デフォルトの名無しさん:2008/09/21(日) 19:54:02
すいません質問なのですが、とあるクラスのprotectedメンバはその派生クラスの派生クラスからはアクセスできないんでしょうか??
MinGWで色々やっているのですが、間接継承の関係にあるクラスのprotectedメンバにアクセスしているプロググラムを実行すると、フリーズしてしまいます。
アドバイス頂けると幸いです。
449デフォルトの名無しさん:2008/09/21(日) 20:29:22
>>448
フリーズするならそれはまったく別の問題。
450デフォルトの名無しさん:2008/09/21(日) 20:40:54
>>448
フリーズならどこかで無限ループしてるんじゃ
451デフォルトの名無しさん:2008/09/21(日) 21:27:02
VCの_COM_SMARTPTR_TYPEDEFなんですけど
これで作ったCOMのスマートポインタもAttachで入れないと
カウントがずれるですか?
452デフォルトの名無しさん:2008/09/21(日) 23:02:33
頻繁に使われる関数で常にメモリを100Kほど確保して置きたいのですが
どのようにしたら良いですか? マルチスレッド対応の方法教えてください

こういう警告と同じ箇所で英語のエラーがでます。

マルチスレッド アプリケーションのコンストラクタでローカル静的変数を使うことは危険
453デフォルトの名無しさん:2008/09/21(日) 23:08:57
>>452 クラスにしとけ。
454デフォルトの名無しさん:2008/09/21(日) 23:59:27
100K みたいに大きいバッファは
マルチスレッド関係なく動的に確保しる。
455デフォルトの名無しさん:2008/09/22(月) 00:44:37
頻繁に使うから、再確保はしないでそのままにしておきたいのですが。
2個以上同時に使われるとバッファが壊れますが、どうしたらいいでしょうか?
456デフォルトの名無しさん:2008/09/22(月) 00:49:20
確保してから、アプリケーションが終了する直前までずっと確保したままでいい。
とりあえずマルチスレッドプログラムを組む場合は同期オブジェクトを勉強してください。
457デフォルトの名無しさん:2008/09/22(月) 01:34:08
寝る前だけど質問させてもらいます
C++で横スクロールするアクションゲームっぽいもの
作ってるのですがキャラクターをクラスで扱っていて
場面ごとの関数1つ1つにクラスの変数やメソッドを使うから
インスタンス定義ってのをやらなきゃいけないようで
そうするとそのせいで場面の移り変わりのときに
それまで使っていた変数が初期化されてしまって
ttp://www.dotup.org/uploda/www.dotup.org0173.jpg
このようになってしまいますよね
キャラクターのクラスだけでなく他にも場面やステージを
隔てて初期値に戻ると困るものを保存したり引き継いだり
できればいいのですがどうすればいいのでしょうか・・・
458デフォルトの名無しさん:2008/09/22(月) 01:38:03
>>457
保存したり引き継いだりすればいいよ。
コンストラクタ含めて関数には引数が渡せるだろ。

その画像のプレゼン能力はすばらしい。
459424:2008/09/22(月) 01:43:49
>>428
>>429
回答ありがとうございました。
これから検討してみたいと思います。
460デフォルトの名無しさん:2008/09/22(月) 01:45:46
スコープが広めのリサイクルオブジェクトコンテナ見たいなのを作って、シーン終了時に必要なものを追加
次のシーン初期化時に、シーンのオブジェクトコンテナに移し変える
461デフォルトの名無しさん:2008/09/22(月) 03:08:24
質問です。
ファイルオープンで、ファイルから値を読込んでもう一つのファイルにその値を書込むプログラムで、
読込用はテキストファイル(.txt)、書込用はバイナリファイル(.bin)を用いました。
上記の2つのファイルサイズは少量ですけど違いました。
この違いは何によるものなんでしょうか。
462デフォルトの名無しさん:2008/09/22(月) 03:13:07
改行コードじゃない?
463デフォルトの名無しさん:2008/09/22(月) 03:52:47
読込ファイルの値はスペース区切りでした
テキストファイルから「1 2」という値を読み込みバイナリファイルに書き込んで
ファイルをエディタで開くと「01 00 00 00 02」と表示されますが、
つまりは書き込みがバイナリファイルだとスペースにもコードがあるから
ファイルサイズが大きくなる・・・ということでいいんでしょうか・・・?
464デフォルトの名無しさん:2008/09/22(月) 04:06:47
>>461,463
読み込んで形式変えて書き込んでるんだから、そもそも同じになるわけがないな。
465デフォルトの名無しさん:2008/09/22(月) 04:30:31
質問です。
他のプロセスのメモリを監視するプログラム作ろうとしています。
ReadProcessMemoryで値を取得することはできたのですが、
できればそのメモリアドレスの値が更新された時に取得を実行したいです。
この「メモリアドレスの値が更新された」というイベントを取得することは可能でしょうか?
466デフォルトの名無しさん:2008/09/22(月) 04:54:21
>>451
コンストラクタならfalseー緒に渡せば、AddRefしないよ。
operator=は無理だな。
467デフォルトの名無しさん:2008/09/22(月) 07:22:34
>>465
チートツールはほどほどにしとけよ
468448:2008/09/22(月) 12:19:03
>>449
>>450
おっしゃる通り別の問題でした汗
ありがとうございましたm(_ _)m
469デフォルトの名無しさん:2008/09/22(月) 12:42:19
327です。

>329
ありがとうございます。

u_char *ucharAdr;
ucharAdr = (u_char *)(gulngUpdataAddress & 0x0fffffff) + 0x0c800000;
memcpy( ucharAdr, gushtUpdataArea, gulngUpdataDataCount * sizeof(short));

で、いけました。
470デフォルトの名無しさん:2008/09/22(月) 12:45:08
CImageで(a,b)から(x,y)まで直線を引く方法はありませんか??
MoveTo、LineToを使用せずに描きたいです。
471デフォルトの名無しさん:2008/09/22(月) 12:48:25
なんでMoveTo、LineToを使用したくないの?
472デフォルトの名無しさん:2008/09/22(月) 13:13:47
>>470
おいらのCImageなら、メンバにLine(CPoint from, CPoint to)があるからそれを使えるよ。
でも、あんたの言っているCImageにそれがあるかどうかは知らんけどね。
473デフォルトの名無しさん:2008/09/22(月) 19:04:58
const char str1[] = "str";
const char * str2 = "str";
"str"が配置されるのは、前者の場合、配列に格納するコードのところ
後者では文字列を置いておくところだと思うのですが、どういうときに、どちらを選べばいいのでしょうか

自分で考えたところでは、
・上の場合は、コンパイル時に配列のサイズが決まるのでstrlenなどを使う必要がない
・下の場合は、自動変数の確保がポインタだけですむ(速い?)
というちがいだと思うのですが、ほかにも違いがあるのでしょうか
474デフォルトの名無しさん:2008/09/22(月) 19:18:10
>>473
後者は str2 = "another" のような代入が可能になってしまう。たぶん意図したものじゃないだろう。

static const char str3[] = "str";
↑これなら挙げられた前者と同じメリットを得つつ、後者のメリットを上回る(自動変数の確保はゼロ)。
475デフォルトの名無しさん:2008/09/22(月) 19:46:37
const char * const str2
476デフォルトの名無しさん:2008/09/22(月) 20:16:33
>>474-475
ありがとうございます。
475さんのはstr2が同じものをさし続けるようにするのですね。
474さんのは静的変数の初期化に、コストを預けてるわけですね。
477デフォルトの名無しさん:2008/09/22(月) 20:31:51
>>476
str3 の初期化にコストなんか要らないよ。どのケースでも必要になる文字列リテラルの
実体を直接割り付ければいいだけ。
478デフォルトの名無しさん:2008/09/22(月) 22:16:49
>>473
#define str4 "str"
479デフォルトの名無しさん:2008/09/23(火) 22:01:02
ここの場所でC2614のエラーが起きます。
クラスや構造体の初期化子リストに表示できるのは、メンバか基本クラスだけです。
規定クラスのメンバはどうやって初期化するですか?


class A
{
 public:
  A(int apple)
 protected:
  int m_banana;
}

class B : public B
{
  B(int apple)
   : A(apple), m_banana(8)  ←ここ
{
}
}
480デフォルトの名無しさん:2008/09/23(火) 22:04:32
基底クラスのコンストラクタで行う。
class A
{
public:
A(int apple)
protected:
A(int apple, int banana) : m_banana(banana) {}
int m_banana;
};
class B : public A
{
B(int apple)
: A(apple, 8)
{
}
};
481デフォルトの名無しさん:2008/09/23(火) 22:05:16
できました。
ども
482デフォルトの名無しさん:2008/09/24(水) 07:57:18
VC++2005を利用しています
例外を勉強しているのですが、例外を発生させたときに、
catchで例外を処理しても、デバッガに例外があったことが出力されます

catchで例外を処理するときは、
デバッガの出力に例外が発生したことが出力されるのを防ぎたいですが、どのようにすればいいでしょうか
483デフォルトの名無しさん:2008/09/24(水) 12:37:12
>>482
出力って、例外時のデバッガのダイアログ?だったら、デバッグ->例外で設定できる
デバッグ出力の例外のレポートだったら気にするな。レポートが出すぎて困るのだったら例外の使い方が間違っている。
484482:2008/09/24(水) 13:18:40
>>483
れす、ありがとうございます。後者です。

例外のつかいかたについては勉強していくところです。
もし、テストケースとかを今後記述するような場合に、デバッグ出力でOFFにできないのか探しています。
485デフォルトの名無しさん:2008/09/24(水) 14:19:16
>>482
Visual Studio のスレで聞いたほうがいいんじゃないかな?
486346:2008/09/24(水) 14:42:55
>>347-353
超連休で返事が遅くなって申し訳ない。レスありがとう。
グローバルとstaticがいい感じっぽいので、両方試してみます。
487482:2008/09/24(水) 15:56:25
>>485

ありがとうございます。移動します。
488デフォルトの名無しさん:2008/09/24(水) 16:35:28
private List<ISchedule> zTasks = new List<ISchedule>();
これを同じことを NET 1.1でやりたいんですが どうすればいいんですか?
489デフォルトの名無しさん:2008/09/24(水) 16:39:34
ArrayList
490デフォルトの名無しさん:2008/09/24(水) 17:15:17
>>489
すいません><
具体的なコードを教えてくれると助かります^^;
491デフォルトの名無しさん:2008/09/24(水) 17:24:23
C#スレ行けよ
492デフォルトの名無しさん:2008/09/24(水) 19:38:05
tchar.hをインクルードしてあるのですが、コンパイルすると、_tstofが未定義の関数なるのは何故でしょうか?
493デフォルトの名無しさん:2008/09/24(水) 20:14:44
>>492
ちゃんと確かめて無いので間違ってるかもだけど、
_tstofは内部でatofや_wtofを使ってるので、それらを使う
ために必要な<stdlib.h><math.h><wchar.h>をincludeする必要があったかも?
494デフォルトの名無しさん:2008/09/24(水) 23:14:43
>>493
その三つをインクルードしてみましたけど駄目でした。
環境の問題でこういう事ってありますかね?
495デフォルトの名無しさん:2008/09/24(水) 23:56:07
>>493
その理屈はおかしいよ
496マジレスチュウ ◆MaJi/01g.w :2008/09/25(木) 00:43:23 BE:279187542-2BP(50)
スペルはちゃんと合ってる?
497デフォルトの名無しさん:2008/09/25(木) 06:09:59
BCC Developer使ってるんですけど、そのデバッガのTurbo Debugger
がダウンロードできません

どなたか入手方法教えてください
498デフォルトの名無しさん:2008/09/25(木) 06:32:51
自己解決しました すいませんでした
499デフォルトの名無しさん:2008/09/25(木) 06:37:59
turbodebugger.exe
500デフォルトの名無しさん:2008/09/25(木) 21:54:04
>>492
includeする順番を変えてみたらどうだろう?
tcharではなかったかもしれないけど、以前にそんな感じの現象になったことがある。
そのときは、なにかのバージョン番号とかが順番によっては未定義になって
起きた現象だった。tchar.hの中をみて、どのように定義されているか確認すると
いいかもね。
501デフォルトの名無しさん:2008/09/26(金) 01:31:26
VC++2008は.NETの関数を使えるんですか?
502デフォルトの名無しさん:2008/09/26(金) 01:49:00
自己解決しました
C++/CLI言語で出来ることがわかりました
503デフォルトの名無しさん:2008/09/26(金) 19:45:12
動的な配列を作るにあたって、
引数付きコンストラクタを呼び出したいんですが、何か方法はありますか?
Const なメンバ変数のために初期化リストを使いたいんですが・・・。

CHoge *hoge;
hoge = new CHoge[2] //ここでHoge( X )のように引数を指定したい
504デフォルトの名無しさん:2008/09/26(金) 20:18:13
ない
505デフォルトの名無しさん:2008/09/26(金) 20:20:29
0xかCLIでなら・・・・・・
506デフォルトの名無しさん:2008/09/26(金) 21:32:03
プロパティページの中にスライダーコントロールをつけたいのですが
setRangeをする場所がわかりません。
コンストラクタの中でやるとエラーで落ちてしまいます。
OnInitDialogでやっても何もダメでした。
何かよい方法は無いでしょうか?

IMPLEMENT_DYNAMIC(CPropOption, CPropertyPage)
CPropOption::CPropOption()
       : CPropertyPage(CPropOption::IDD)
       , m_xvEditPenthick(_T(""))
       , m_xvSliderPenthick(0)
{
//      m_xcSliderPenthick.SetRange(0,10);      //なぜかこれをつけると壊れる
}

VC 2003です
507デフォルトの名無しさん:2008/09/27(土) 00:49:00
>>506
ありません
508デフォルトの名無しさん:2008/09/27(土) 07:16:59
DLLをlibにするテクありませんか?
509デフォルトの名無しさん:2008/09/27(土) 07:55:01
すみません。質問なんですけど、charとwchar_tを比べたとき、charでは表せない文字やファイル名はありますか?
VC++2008ではchar型は、SJISかEUCであってUNICODEは表せませんか?
510デフォルトの名無しさん:2008/09/27(土) 07:59:35
char型に入るのは英数字とあといくらかなのでsjisとかeucだとか言う時点でなんかおかしい
511デフォルトの名無しさん:2008/09/27(土) 08:03:10
char配列でおねがいします
512デフォルトの名無しさん:2008/09/27(土) 08:32:29
>>511
ただのバイト列だからなんでも入るよ
513デフォルトの名無しさん:2008/09/27(土) 08:51:14
>>509
charは只の8bitの数値。それをどの文字コードで解釈するかってこと。
文字コード表を比較してください
514デフォルトの名無しさん:2008/09/27(土) 13:43:04
dクス
515デフォルトの名無しさん:2008/09/28(日) 02:38:26
クラスが保持するstaticメンバ関数から
同一クラスのprivateメンバ変数へアクセスできない

書き方が悪いのか、それともそういうもんなの?
516デフォルトの名無しさん:2008/09/28(日) 02:54:48
実体を渡せよ
thisとか
517デフォルトの名無しさん:2008/09/28(日) 03:10:16
>>515
class AAA {
private:
int m_a;
public:
static void func(int arg, AAA* pinst);
};

void AAA::func( int arg, AAA* pinst)
{
pinst->m_a = arg;
}

こんな感じか
518デフォルトの名無しさん:2008/09/28(日) 04:00:18
struct Hoge {
  Hoge() {}
  Hoge(const Hoge&) { Sleep(1000); }
  Hoge& operator=(const Hoge&) { Sleep(1000); return *this;}
};
もしこのくらいコピーにコストがかかるクラスをSTLのコンテナに入れる場合、どうするのが良いですか。
特にvectorだとpush_backしていくうちに、サイズ増やすために全部コピーしたりしますよね。(listだとそういうことはないのでしょうか)
ポインタ(std::vector<Hoge*>とかstd::vector<std::tr1::shared_ptr<Hoge> >)で管理するのが普通ですか。
519デフォルトの名無しさん:2008/09/28(日) 05:00:37
>>518
listやset、mapはpush_back(insert)しても新たにコピーされることは無い
ただまぁvectorと同じようには使えないので、boost::ptr_vectorあたりがお手軽か?
520デフォルトの名無しさん:2008/09/28(日) 08:00:28
>>518
そのとおり、shared_ptrが無難
521デフォルトの名無しさん:2008/09/28(日) 20:52:45
クラスAのメンバの配列を動的確保できるようにnewとdelete用の関数を作りました。
そうするとクラスAに全く関係のないクラスBのメンバの値がおかしくなりました。

調べていくと、
クラスBのコンストラクタで初期化完了
         ↓
クラスAのコンストラクタでnewを使う
         ↓
クラスBのメンバの値がおかしくなる

という流れでした。
これは何が原因なのでしょうか?
ちなみにクラスAのnew用関数ではクラスBは全く使用していません。
522デフォルトの名無しさん:2008/09/28(日) 21:01:43
クラスBのデストラクタにブレークポインタ打ってみそ
523デフォルトの名無しさん:2008/09/28(日) 21:08:37
>>522
プログラム終了時のみにしか呼ばれてませんでした
524デフォルトの名無しさん:2008/09/28(日) 21:09:04
new用関数て?
operator new のオーバーロードをしてるわけじゃないよな
525デフォルトの名無しさん:2008/09/28(日) 21:12:00
クラスBのインスタンスをウォッチしながらステップ実行してみそ
526デフォルトの名無しさん:2008/09/28(日) 21:13:28
>>524
多次元配列なのでまとめてるんです

void New()
{
  int i;;

  for(i = 0; i < MAX; i++)
    p[i] = new int [SIZE];
}

こんなのです
527デフォルトの名無しさん:2008/09/28(日) 21:15:24
全く関係ないところでスタックやヒープを壊してる悪寒
528デフォルトの名無しさん:2008/09/28(日) 21:23:12
>>525
ググって見たんですけどやり方が今一分かりませんでした。
クラスA・Bどちらのインスタンスもグローバル変数でクラスBのほうが先に作られます。
529デフォルトの名無しさん:2008/09/28(日) 21:23:20
>>526
pの領域は確保してるか?
530デフォルトの名無しさん:2008/09/28(日) 21:33:09
>>529
pは int *p[SIZEX]; と宣言してます。
531デフォルトの名無しさん:2008/09/28(日) 21:41:51
>>528
VisualStudioだったら、ウオッチにCLASS Bのインスタンスを表示させてステップ実行すると、値が変わったところで赤くなる。
532デフォルトの名無しさん:2008/09/28(日) 21:51:48
>>531
クラスAのコンストラクタでnew用の関数が終わったときに値が変わりました。

原因がつかめないのでnewする前にクラスBの値を保存しておいて終わったらそれを代入することにしました。
皆さんありがとうございました。
533デフォルトの名無しさん:2008/09/28(日) 22:12:57
領域が重なってるんだヤバイ状態だ。
解決してから進まないと、あとで手が着けられない状態になるよ
534デフォルトの名無しさん:2008/09/28(日) 22:13:29
>>532
MAX > SIZEX
になってない?
535デフォルトの名無しさん:2008/09/28(日) 22:22:12
>>534
思いっきりなってました・・・
何で気づかなかったんだろう・・・
直したら正常になりました。
ありがとうございました。
536デフォルトの名無しさん:2008/09/29(月) 01:08:29
Visual C++ 2003
MFC利用

でExcelファイルの読み書きをexcelのtypelibを使って行っているんですが、
CRangeオブジェクトのメンバ
CString get_Address(VARIANT RowAbsolute, VARIANT ColumnAbsolute, long ReferenceStyle, VARIANT External, VARIANT RelativeTo)
のReferenceStyleに設定すべき定数がどこにあるのかわからず困っています。
XlReferenceStyleをxlA1にすれば良いらしいのですが。

CRangeの"C8"などのアドレスを返す代替手段があればそちらでもかまわないです。

他の部分はほとんどなんとかなったんですがこれだけどうしようもないです。
よろしくお願いします。
537デフォルトの名無しさん:2008/09/29(月) 10:10:33
>>508
インポートライブラリを作るってこと?できるよ。
環境によって違うけど。
538デフォルトの名無しさん:2008/09/29(月) 12:01:34
fstreamでパスに日本語を含むファイルを開けないんですが、
std::localeとかimbue()つかってもダメで探してもlocaleのことしか見つかりません。
環境はVC2008使ってるけどやはりVCのバグ?fopenとか_openとか使えってことですかね?
539デフォルトの名無しさん:2008/09/29(月) 12:05:07
ワイド文字版のコンストラクタを使えばいいよ
540デフォルトの名無しさん:2008/09/29(月) 12:22:23
ストリーム関連のライブラリは設計段階でダメダメなので使わないほうがいい。
何しろ、一文字は7bitであるという前提が頭からこびりついて離れない西側諸国の連中が作ったんだから。
541538:2008/09/29(月) 12:24:00
wfstreamでもダメだったんでやはりCライブラリですか
542デフォルトの名無しさん:2008/09/29(月) 12:29:31
>>541
wfstreamはファイルの「中身」をワイド文字で読み書きしたいときに使うんだ
ファイル名の問題とは関係ない

つうか>>539
VC8以降は、fstreamにワイド文字版コンストラクタがあるんだよ
543541:2008/09/29(月) 12:34:34
つまりfstreamのインスタンス作成のときにアドレスをワイド文字で渡せばおkということですか
544543:2008/09/29(月) 12:54:55
できましたー
>>542ご指摘ありです。
>>539理解できてなくてすません。

ところでVC8以降ってことはVC依存のコンストラクタ?他のビルダーとかだとマルチバイトで指定してもおk?
545デフォルトの名無しさん:2008/09/29(月) 13:02:17
>>544
少なくとも非標準
他の環境でも利用したいのならboost使え
546544:2008/09/29(月) 13:14:55
なるほど了解しました。
547デフォルトの名無しさん:2008/09/29(月) 14:39:12
C++…というかC言語自体が初心者です。
C++の開発環境で、PCに『Visual Studio 2005』が入っていたのでそれを使おうとしたのですが、いまいち上手く使えません。
Visual Studio 2005 について解説しているサイトを見ながら設定し、それにのっているプログラムを丸写ししてみたのですが、ビルドが上手くいかなかったり、実行してもエラーが出たり出なかったりでよくわからない状態です。
これ以外で無料で使えて、それでいて使いやすい開発環境はありますか?
548デフォルトの名無しさん:2008/09/29(月) 15:19:22
あきらめた方がいいよ
549デフォルトの名無しさん:2008/09/29(月) 15:39:47
開発環境のせいじゃないだろ。
一歩ずつ進めてみては
550デフォルトの名無しさん:2008/09/29(月) 20:20:09
>>547
VS2005は簡単な部類だからあきらめないでね。
551デフォルトの名無しさん:2008/09/29(月) 20:23:04
>>547
2008を入れて、この本を買いなさい。
http://www.amazon.co.jp/dp/4891005823
http://www.amazon.co.jp/dp/4891005769
552デフォルトの名無しさん:2008/09/29(月) 20:25:45
なんか昔アカデミックのおまけについてたような本だなw
553デフォルトの名無しさん:2008/09/29(月) 20:56:57
そういうツールの解説本は例外なく糞だ。
買うならこれだ。
http://www.amazon.co.jp/dp/0470843993
554デフォルトの名無しさん:2008/09/29(月) 21:01:45
コンパイルができないってのは、独学者がぶつかる最初の壁だろ。
周囲に訊く人間がいなかったら、バカっぽくても画面写真が載りまくりのような本を見るしかない。
555デフォルトの名無しさん:2008/09/29(月) 21:19:19
その辺は、まともな本ほど載ってないような話題だしな
556536:2008/09/30(火) 00:40:35
自己レスです。

enum XlReferenceStyle
{
xlA1 = 1,
xlR1C1 = -4150
};

でした。全て解決しました。
557デフォルトの名無しさん:2008/09/30(火) 03:31:12
クラス名をつけたらコンストラクタ出来ますが、クラス名無しで変数だけ定義したら
コンストラクタは出来ませんか?
558デフォルトの名無しさん:2008/09/30(火) 03:34:39
日本語でおk
559デフォルトの名無しさん:2008/09/30(火) 03:47:13
class cls{
int a;
public: cls(){・・・} };

というクラスを

class {
int a;
public: } hensuu;

と書いた場合に、初期化が出来るか教えてください
560デフォルトの名無しさん:2008/09/30(火) 04:12:46
それを構造体にしない理由は?
561デフォルトの名無しさん:2008/09/30(火) 07:25:39
>>560
後者にコンストラクタは定義できませんか? 構造体にしないのは初期化したいからですよ。
562デフォルトの名無しさん:2008/09/30(火) 07:27:22
>>561
構造体にすれば初期化できるよw
563デフォルトの名無しさん:2008/09/30(火) 07:29:54
初期化は、代入だけとは限らないですが出来ますか? 普通のプログラムも掛けますか
564デフォルトの名無しさん:2008/09/30(火) 07:43:16
POD(Plain Old Data)の定義からも、
PODの初期化のルールからもはずれるから初期化されないと思う。
第一privateなint a;はどこからもさわれない、そこで警告なりなりラーなりになるような。
565デフォルトの名無しさん:2008/09/30(火) 07:47:18
クラス名を付ければ、初期化出来ますけど、クラス名無しだと初期化は無理って事ですか?
566デフォルトの名無しさん:2008/09/30(火) 07:57:35
クラス名のあるなしは関係ない。
グローバル変数としてhensuuがあったら初期化ずみ。
ローカル変数としてhensuuがあったら未初期化。
このへんは普通の変数と同じ考え方でいい。
あとはPODでググる。PODならnewを使った場合にコンストラクタなしでも初期化される。

それから新規の質問以外はsageる。
567デフォルトの名無しさん:2008/09/30(火) 08:07:47
struct {
 int id;
 char *name;
} table[] = {
 { 0, "zero", },
 { 1, "ichi2, },
};
が出来るのだから
デフォルトの公開性が違うだけのclassでも
class {
public:
 int id;
 char *name;
} table[] = {
 { 0, "zero", },
 { 1, "ichi2, },
};
と出来るだろ。

やったことないけど。
568デフォルトの名無しさん:2008/09/30(火) 08:14:06
>>567
そこまで書いたらやってみればいいよwww
569デフォルトの名無しさん:2008/09/30(火) 08:15:04
それでいいはず。
なんでint a; が何でprivateなのだろ。
publicならPODだから、newやhoge xx = {} で初期化可能になる。
570デフォルトの名無しさん:2008/09/30(火) 08:18:42
初期化っていうのはコンストラクタを起動出来るかという質問です。

class cls{
int a;
public:
cls(){a=10;} };

っていうのは出来ますけど、クラス名無しだと標準のコンストラクタ名が使えないですけど
なんとか出来ますか?っていう質問です。
571デフォルトの名無しさん:2008/09/30(火) 08:21:59
無名ではコンストラクタは指定できない。メンバーをpublicにする。以上。
572デフォルトの名無しさん:2008/09/30(火) 08:28:57
>>570
つーかいちいちあげるな
573デフォルトの名無しさん:2008/09/30(火) 08:30:28
>>570
無名クラスではコンストラクタは作れないです
もし名前空間を汚染したくないだけであれば無名名前空間を使うのも手です
574デフォルトの名無しさん:2008/09/30(火) 08:43:28
トンクス
575デフォルトの名無しさん:2008/09/30(火) 09:22:14
すみません質問良いでしょうか。 
関数chk()の戻り値がFALSEになるまで待つにはどうしたらいいですか?
576デフォルトの名無しさん:2008/09/30(火) 09:26:52
なるべくCPUを使わず、即座に進める方法おねがいします。
577デフォルトの名無しさん:2008/09/30(火) 09:40:57
自己解決しました。 関数の戻り値を監視するには、定期的に関数を呼び出すしかないようですね。
578デフォルトの名無しさん:2008/09/30(火) 12:26:27
>>577
戻りが変わった可能性があることをイベントを使って検出してから見にいくといい。
OSのAPIにはそういうイベント関係の関数が多数ある。
579デフォルトの名無しさん:2008/09/30(火) 12:36:18
>>570
PODをクリアするテンプレートクラスを作って、それをクラスに所有させる。するとデフォルトコンストラクタで初期化できるようになる。

template<class T)
class tclear
{
T a;
public:
tclear()
 :a(0)
 {
 }
};

class X
{
tclear<int> a;
};
580デフォルトの名無しさん:2008/09/30(火) 15:54:03
ICL10.1(win)でXP32bit用アプリ?をゴニョゴニョしてるんだけど、
SSEのインラインアセンブラとか組み込み関数を使うと、/archとか/Qxとかに関わり無くなぜか勝手に拡張命令を使うみたいなんで困ってます><
インラインアセンブラはともかく組み込み関数は汎用命令で何とかしてくれると思ってたのに・・・

汎用命令以外吐かないようにする方法を教えてください、よろしくお願いします。
581デフォルトの名無しさん:2008/09/30(火) 17:28:52
もうSSEの無い環境なんて切り捨ててもいい時期に来てるってことだろ。
582デフォルトの名無しさん:2008/09/30(火) 18:14:32
そうだな C3 だとハングアップするソフトも結構あるしな ><
583デフォルトの名無しさん:2008/09/30(火) 20:23:58
いや、SSE2未満なら切捨てでいいと思うけど
オレが使いたいのはSSSE3(_mm_hadd_epi16)までなんでチョットまずいかなと・・
俺自身SSSE3が動かないPCも使ってるし困るんです><


てかQaxがマトモに機能してれば困らない事に気付いたよ!!
ICLがコピーと論理演算位しかベクトル化してくれないのが全部悪いんだ!!!
型が複数あると出来ないとか、無理矢理全部intでやったら複雑すぎとかふざけてるとしか思えない
てことで普通の自動ベクトル化があるコンパイラ教えてください、お願いします。
584デフォルトの名無しさん:2008/09/30(火) 21:35:54
空の書き込み可能なテンポラリディレクトリを確保する命令ありますか?
WindowsXPです。
585デフォルトの名無しさん:2008/09/30(火) 21:38:29
GetTempFileName()のフォルダ版ないですか?  存在していない空のフォルダを作りたいのですが
586デフォルトの名無しさん:2008/09/30(火) 21:51:20
同じ名前のファイルとフォルダは同時に存在できない。
587デフォルトの名無しさん:2008/09/30(火) 22:01:53
GetTempFileNameで取った名前使ってディレクトリ作れば?
588デフォルトの名無しさん:2008/09/30(火) 22:16:51
>>587
それは無理。
GetTempFileNameの作ったファイルを消してディレクトリを作らないといけないから、
その間に他のプロセスに割り込まれる可能性がある。
589デフォルトの名無しさん:2008/09/30(火) 23:15:32
これで出来ました。

GetTempdir(){

wchar_t w[1000], z[1000];
GetTempPathW(1000, w);

if(!GetTempFileNameW(w, L"aa", 0, z) ) {
wcscpy(w,L".\\temp\\"); CreateDirectoryW(w,NULL);
if(!GetTempFileNameW(w, L"aa", 0, z) )
wcscpy(w,L"c:\\temp\\"); CreateDirectoryW(w,NULL);
}

wchar_t ch[9];
for(int n=0;n<100000;n++){
swprintf(ch,L"aa%06d",n);
wcscat(w,ch); CreateDirectoryW(w,NULL);
if( (GetFileAttributesW(w)&FILE_ATTRIBUTE_DIRECTORY) )break;
w[wcslen(w)-8]=0;}
}
590デフォルトの名無しさん:2008/09/30(火) 23:26:38
まちがえました

wchar_t ch[9];
for(int n=0;n<100000;n++){
swprintf(ch,L"aa%06d\\",n);
wcscat(w,ch);
int flg=GetFileAttributesW(w);
if( flg==-1 || !(flg&FILE_ATTRIBUTE_DIRECTORY) )
{CreateDirectoryW(w,NULL); break;}
w[wcslen(w)-9]=0;
591デフォルトの名無しさん:2008/09/30(火) 23:30:25
GetTempdir が使われてないのと>>588の意見を全つっぱした理由が気になるな
592デフォルトの名無しさん:2008/10/01(水) 04:40:03
GetTempFileNameはファイル作らないよ?
593デフォルトの名無しさん:2008/10/01(水) 21:41:36
>>592
作ったり作らなかったりする。
MSDN嫁あほ
594デフォルトの名無しさん:2008/10/01(水) 23:21:58
C++なんですけど、(Cも同じでしょうか)
グローバル変数でstatic付けるのと付けないのと、どんな違いがあるのでしょうか。
595デフォルトの名無しさん:2008/10/01(水) 23:28:51
>>594
その名前がコンパイル単位の外から見えるかどうかが変わる。
C++ では無名の namespace に入れるのが推奨されてる。
596デフォルトの名無しさん:2008/10/01(水) 23:34:01
>>594
つけると静的になり、ファイルスコープになる。
つまり、外部に公開しないで済む。
597デフォルトの名無しさん:2008/10/02(木) 04:58:54
template< class T > class Base を継承したクラス Derived を作りたいのですが
クラス定義はどのように記述すればいいんでしょうか?
598デフォルトの名無しさん:2008/10/02(木) 05:15:16
template<class T>
class Deriv : public Base<T>

こうだろうか?
599デフォルトの名無しさん:2008/10/02(木) 05:19:28
#include <iostream>

template <class T>
class Base {
T a;
public:
Base(T b) : a(b) {}
void print() const {
std::cout << a << std::endl;
}
};

template <class T>
class Derived : public Base<T> {
T c;
public:
Derived(T a, T b) : Base<T>(a), c(b) {}
void print() const {
Base<T>::print();
std::cout << c << std::endl;
}
};

int main()
{
Derived<int> d(1, 2);

d.print();
}
600デフォルトの名無しさん:2008/10/02(木) 06:48:15
おふっ。
できました。ありがとうございます。
601デフォルトの名無しさん:2008/10/02(木) 09:35:56
例外を扱うとき場合
実行中どういう例外を吐いたかログを取るような仕組みを組みこんだりするのでしょうか?

その場合、どういう方法でログ取りの仕組みを実装するのがよいでしょうか?
602デフォルトの名無しさん:2008/10/02(木) 10:29:09
SYSLOGでも利用すれば
603デフォルトの名無しさん:2008/10/02(木) 16:47:32
イベントログも使えば
604594:2008/10/02(木) 18:21:18
>>595-596
ありがとうございます。
staticはローカル変数でしか使ったことがなく、ちゃんと理解してませんでした
605デフォルトの名無しさん:2008/10/02(木) 18:31:59
まあ、まず使わん仕様だがな。
606デフォルトの名無しさん:2008/10/02(木) 19:44:00
質問があります。私は今WindowsGUIプログラムで、WinMainのスレッドでGUIの処理、別に作ったスレッドで
ファイルへの書き込みを行っています。一定時間間隔で複数のデータをサンプリングしてファイルへ書き込んで
いるのですが、メインスレッド終了時に、同時刻上のデータがすべて書き込み終わっている様にしたいのです。
ファイル書き込みスレッドを終了させた場合、どこまで処理を終えているのか確定できませんが、どのようにコントロール
するのが一般的なのでしょうか。よろしくお願いします。
607デフォルトの名無しさん:2008/10/02(木) 19:46:01
>>606
fflush 相当のことをすればいいんじゃないかと
608デフォルトの名無しさん:2008/10/02(木) 19:57:36
>>606
書き込みスレッドにイベントを送って、書き込みスレッドがファイルをクローズしその後スレッド終了するようにすればいい。それを待ってwinmainのスレッドを終了させる。
609デフォルトの名無しさん:2008/10/02(木) 22:00:18
イベントについて調べたところ、これで大丈夫そうです。ありがとうございました。
610デフォルトの名無しさん:2008/10/02(木) 22:52:18
クラスをリスト化してるのですが
クラスの一番最初のメンバ変数をsortを使って
昇順や降順に変更したいと思っています
何かいいやり方はないでしょうか?
611デフォルトの名無しさん:2008/10/02(木) 22:55:20
reverseのが早いんじゃない?
使えるリストなのかは知らないけど
612デフォルトの名無しさん:2008/10/02(木) 22:55:44
>>610
STLを使おう
613デフォルトの名無しさん:2008/10/02(木) 22:57:42
>>609
豆知識

スレッドの実行が終わると、スレッドのハンドルがシグナル状態になる。結構便利
614デフォルトの名無しさん:2008/10/02(木) 23:27:10
豆知識ていうか必須知識だろ
615デフォルトの名無しさん:2008/10/02(木) 23:37:04
>>606
文章の酷さが気になった
もう少し読み書きしようぜ
616デフォルトの名無しさん:2008/10/03(金) 02:04:13
int hoge(int a) {
return a++ * ++a;
}
という関数があるときに
hoge(5)
とすると、Return値は5×6で30になると思ったんだけど、g++とVC++の両方で
答えが36になりました。これってどうしてでしょうか?
どうかお願いします。
617デフォルトの名無しさん:2008/10/03(金) 02:20:56
>>616
それは未定義動作なのでそういうコードは書いちゃいけないけど、
あえてコンパイラの気持ちを大便するなら、
1. a++を発見。「評価後にaの値を+1する」と覚えておく
2. ++aを発見。「評価前にaの値を+1する」と覚えておく
3. コード生成開始
4. 評価前なのでaの値を+1するコードを生成
5. a*a のコードを生成して、その結果が返り値となるようにする
6. aの値を+1するコードを生成する。意味がないから最適化で削除されるかも。
618デフォルトの名無しさん:2008/10/03(金) 02:23:42
水に流せってことですか
619デフォルトの名無しさん:2008/10/03(金) 03:35:14
変な物を放り込むと詰まるという意味も
620デフォルトの名無しさん:2008/10/03(金) 04:08:33
template < class T > class Hoge;
で const の T を受け取った時に、
クラス内部で非 const な T 型を使いたい場合には
どうすればいいんでしょう?

例えば Hoge< const string > というように呼ばれたとき、
内部で(非 const な) string 型を扱いたいのです。
621デフォルトの名無しさん:2008/10/03(金) 07:54:20
>>620
boostのtype_traitsにconstを外した型を返せる
remove_cってのがある。
ttp://www.kmonos.net/alang/boost/classes/type_traits.html

手法としてはtemplateの特殊化で行ってるらしい。
622デフォルトの名無しさん:2008/10/03(金) 07:55:16
すまん、remove_constだね
623デフォルトの名無しさん:2008/10/03(金) 08:36:56
サンクスです。boostが必要ということは
もともと const 修飾された型から 非 const の型を特定するのは
難しいプログラム技術が必要だってことなわけですね・・・。

自作のiteratorを作ってたんですが、こりゃー自分には無理かな。・_・
624デフォルトの名無しさん:2008/10/03(金) 08:59:29
>>623
いや、試してないけど実装はたったこれだけで良いっぽいよ。

// remove_const : const修飾の除去

//非constが渡されたらこれが実体化
template <typename Type>
struct remove_const {
typedef Type type;
};

//constの場合はこちらが実体化
template <typename Type>
struct remove_const<Type const> {
typedef Type type;
};

//用例
remove_const<const int>::type i; //constが外れる
625デフォルトの名無しさん:2008/10/03(金) 11:00:15
>>617
未定義動作じゃなくて不定動作だろ。
a++と++aの評価順が決まってない。
626デフォルトの名無しさん:2008/10/03(金) 11:08:18
>>617
副作用完了点について理解しとかないと泣きを見るよ。
627デフォルトの名無しさん:2008/10/03(金) 11:48:35
またそうやって「何かをわかってるフリ」したデタラメを書くw
628デフォルトの名無しさん:2008/10/03(金) 11:51:43
>>625
↓にはそういったコードは未定義だと書いてあるが・・・
http://www.kouno.jp/home/c_faq/c3.html#2
629デフォルトの名無しさん:2008/10/03(金) 11:59:34
ANSI-C89より前では「不定動作」だったがANSI-C89からは「未定義動作」
に改められたね。
630デフォルトの名無しさん:2008/10/03(金) 13:17:57
>>624
おぉ!すごい!できました!革命的!

が、これは安全なんでしょうか。^^;
VC++2008では
allocator::allocate, allocator::construct は const オブジェクトを引数に取れますが
allocator::deallocate. allocator::destroy は const オブジェクトを引数に取れません。

つまり、例えば const string 型のオブジェクトのためのメモリ領域は確保できますが、
その領域を開放する術はありません。そこで、

// T は const string 型とする。
// T* p;
// allocator< T > alloc;
typedef typename remove_const< T >::type * not_constT; // T 型からコンストはずし
alloc.destroy( const_cast< not_constT >( p ) ); // p からコンストはずし

のようなコードを書いたわけですが、これが正常なのかどうか…。
コンパイルは通っており、テストもパスしていますが、メモリの中身を覗く術がわからないので
もしかしたらメモリリークでもしてるのでは、と。
631デフォルトの名無しさん:2008/10/03(金) 14:29:18
スレッド、セマフォ、ミューテックス辺りを次の業務でするんだけど
プロセスとスレッドの違いが良くわかりませぬ。
スレッドってなんだ?
632デフォルトの名無しさん:2008/10/03(金) 14:42:34
ここのこと
それはスレッド
633デフォルトの名無しさん:2008/10/03(金) 14:44:55
>>632
それだけは言って欲しくなかった…
634デフォルトの名無しさん:2008/10/03(金) 14:54:21
プロセス・・・プロセスごとにメモリ空間(=グローバル変数とかヒープとか)が別々
スレッド・・・全部のスレッドでひとつのメモリ空間を共有

メモリ空間を共有するので複数のスレッドからひとつの変数を
同時に書き換えたりとかわけわからんことにならぬよう注意せよ

セマフォとかは普通にプロセス間でも使えるんじゃ?
635デフォルトの名無しさん:2008/10/03(金) 15:15:19
>>634
ありがとう
確かに共有メモリがどうの聞いた!
636デフォルトの名無しさん:2008/10/03(金) 15:17:08
「業務」で未知状態でマルチスレッドか……

ご愁傷様って奴だな
637デフォルトの名無しさん:2008/10/03(金) 15:25:13
共有メモリとメモリ空間共有とは違うw
638デフォルトの名無しさん:2008/10/03(金) 15:36:17
えらんツッコミのせいでせっかくの感動が台無しだ
639デフォルトの名無しさん:2008/10/03(金) 15:40:48
地獄への第一歩で感動とかされても
640デフォルトの名無しさん:2008/10/03(金) 15:50:50
Windows3.xやWin32sのプロセスはスレッドだったのか
641デフォルトの名無しさん:2008/10/03(金) 16:06:45
地獄とかやめて
確かに既に炎上してるらしいが
642デフォルトの名無しさん:2008/10/03(金) 16:16:21
既に炎上してるところに知識のない奴が投入されるのか・・・
ご愁傷様という他ないな
643デフォルトの名無しさん:2008/10/03(金) 16:16:35
passive hell and death
644デフォルトの名無しさん:2008/10/03(金) 17:19:33
デスマーチのプロジェクトは働かなくても給料もらえるからいいじゃない。
だって、どうせ出来上がらないんだから!
645デフォルトの名無しさん:2008/10/03(金) 17:22:18
const char *hoge[5]={"test","test2","test3","test4","test5"};

というのを宣言します。

char *hoge2;


hoge2 = hoge[3]; という代入をしたいんですが、コンパイルが通りません。hogeのほうにconstをつけなければいけるんですが・・・
教えてください
646デフォルトの名無しさん:2008/10/03(金) 17:26:08
>>645
そういうのを通さないためのconstです。
明示なcastをしてください。
647デフォルトの名無しさん:2008/10/03(金) 17:28:11
>コンパイルが通りません
エラーになった原因とかコードとかでてるだろ?
それを調べてみればここで聞くまでもなく答えはすぐわかるよ。
648デフォルトの名無しさん:2008/10/03(金) 17:28:42
代入される変数がconstついてなければできるのだと思ってました

hoge2 =(char)hoge[3];ですか?
649デフォルトの名無しさん:2008/10/03(金) 17:29:53
hoge2にconst
650デフォルトの名無しさん:2008/10/03(金) 17:31:25
char * だろ。
constのポインタをconstでないポインタに代入しようとしてるから。
651デフォルトの名無しさん:2008/10/03(金) 17:32:21
程よいレベルだとやっぱ群がるなぁ
652デフォルトの名無しさん:2008/10/03(金) 17:35:24
>>649
hoge2はconstだと困るんです
653デフォルトの名無しさん:2008/10/03(金) 17:38:02
char hoge2[5]
でstrcpy
654デフォルトの名無しさん:2008/10/03(金) 17:42:35
>>652
なんで困るのか言ってみようか
655デフォルトの名無しさん:2008/10/03(金) 17:42:48
C++ならSTLのstd::string使うとか
656デフォルトの名無しさん:2008/10/03(金) 17:43:37
>>650
それだといけました

>>653
それもありなんですね

>>654
いろいろ書き換えたいんです
657デフォルトの名無しさん:2008/10/03(金) 17:50:41
文字列定数を書き換えてはいけない
必ずstrcpyでコピーしる
658デフォルトの名無しさん:2008/10/03(金) 17:53:18
そもそもなんとなく この宣言を使ってるんですが

char *hoge[5]={"test","test2","test3","test4","test5"};

イメージ的にはどんな感じですか

hoge[0] 文字列testへのポインタ
hoge[1] 文字列test2へのポインタって感じですか?
659デフォルトの名無しさん:2008/10/03(金) 18:24:19
そんな感じ
660デフォルトの名無しさん:2008/10/03(金) 19:13:21
a.hにクラスAを宣言、別ファイルのb.hでクラスAを継承したクラスBを宣言したいんですが、
B宣言部の「class B:public A」の部分に「型名が必要」とエラーが出ます。(当方Borland C++)
a.hをインクルードしても「Aの宣言が複数見つかった」と言われたりで、どうしたらいいんでしょうか。
661デフォルトの名無しさん:2008/10/03(金) 19:15:04
>>660
class B の定義より前に class A の宣言だけしてみるとか
class A;
662661:2008/10/03(金) 19:16:28
ごめん >>661 は無しで
663デフォルトの名無しさん:2008/10/03(金) 19:26:27
質問です。
他クラスのメンバ変数にアクセスするにあたって
privateなメンバにgetterを使ってアクセスするのと
publicなメンバを直接参照するのではどちらが速いですか?

CHoge hoge;
int a = hoge.m_publicHoge;
int b = hoge.getHoge();

// CHogeの実装
// const int& getHoge(){ return m_hoge; };
// public: :
// int m_publicHoge;
// private :
// int m_hoge;
664デフォルトの名無しさん:2008/10/03(金) 19:30:51
一応
速度は直接アクセス
安全性はゲッター
だろう一般的に
最適化で速度差無い事もあるけど
普通はゲッター使いなさいと教わるはず
665デフォルトの名無しさん:2008/10/03(金) 19:30:52
>>660
それだけだとうまくいくはずなのでもうエスパーさんしか
アドバイスできないんじゃないかと
エラーの出る最小のコードをどうぞ
666デフォルトの名無しさん:2008/10/03(金) 19:32:06
VC++2008のデフォルト状態Releaseでコンパイルしたものを実行し、CPUメーターで見ました。するとコアが満遍なく使われています。
私はマルチスレッドプログラムも何もしていないのに、コンパイラが自動でマルチコアに最適化してくれたということでしょうか?
667デフォルトの名無しさん:2008/10/03(金) 19:35:11
ほかのプログラムが満遍なくCPUを使っていただけだろ。
668デフォルトの名無しさん:2008/10/03(金) 19:42:44
>>660
インクルードガードでぐぐれ
669デフォルトの名無しさん:2008/10/03(金) 19:52:56
670デフォルトの名無しさん:2008/10/03(金) 19:54:33
>>669
#include "ca.cpp"
#include "cb.cpp"

これは。。
ヘッダをインクルードするようにして、多重インクルードガードすればいいと思うよ。
671デフォルトの名無しさん:2008/10/03(金) 19:55:40
ボーランドのリンカ使い方知らないけど、
それぞれのcppからobj作って、それらをリンクして、exeを作るのが普通。
672デフォルトの名無しさん:2008/10/03(金) 19:57:11
>>671
makefileみたらそうなってるから >>670 だけでいいんじゃないかな
673デフォルトの名無しさん:2008/10/03(金) 20:22:08
>>670
つまり、main.cppでa.hとb.hをインクルードして、
a.cppとb.cppではインクルードガードをかけるだけて、単にメンバ関数を書くだけでいいという事ですか?
674663:2008/10/03(金) 20:37:11
>>664
サンクスです。
やはり直接アクセスの方が速いですか。。。
参照返ししてるからほぼ同等だと思ったのですが甘かったようですね。

getter使うにしてもローカルで複数回使う場合

func1( hoge.getHoge(; );
func2( hoge.getHoge() );
func3( hoge.getHoge() );

とするより

int& b = hoge.getHoge();
func1(b);
func2(b);
func3(b);

のようにした方がオーバーヘッドは減りますよね?
675デフォルトの名無しさん:2008/10/03(金) 20:42:29
メンバ関数はインライン関数にできてだな
676デフォルトの名無しさん:2008/10/03(金) 20:43:35
最適化を前提にするなら余計なことはしないほうがよいだろう。
get/setは*.hにインラインで記述するのが基本。
気になるならアセンブリリストを出力したり、実際に測定するといいよ。
677デフォルトの名無しさん:2008/10/03(金) 21:05:57
>>674
intなら参照使わない方が早いんじゃね?
どういう用途か知らないけど


なんにせよ実測するのが一番だな
678デフォルトの名無しさん:2008/10/03(金) 21:23:04
>>674
値をレジスタに置けるなら、メンバの内容をローカル変数にコピーして、
一通り操作が終わったら、メンバに書き戻す方が良いかも。
メンバへの変更 ( 副作用 ) が発生するポイントが、書き戻し部分に限定
される点もメリット。
679673:2008/10/03(金) 21:50:44
解決しました。
どれから読み込んでもいい様、使う関数のあるヘッダはインクルードガード付けた上で
形式上でもインクルードしておけ、って事ですね(多分)。
アドバイスくれた方々、ありがとうございました。
680デフォルトの名無しさん:2008/10/03(金) 22:33:10
>>679
> a.cppとb.cppではインクルードガードをかける
ヘッダ内でガードする。
多重インクルードされた結果、重複定義が発生する。

> ヘッダはインクルードガード付け
となっているから理解したのかもしれないけれど。

すっきりさせるために動かない状態が続くよりは、ぐちゃぐちゃでもなんとか動く状態の
ほうがいいので、動く状態をキープしたまますっきりさせられるように努力するといいですよ。
リファクタリングって言葉も調べてみてください。
681デフォルトの名無しさん:2008/10/03(金) 23:09:43
よくwindowsプログラムのサンプルコードでInitAppとInitInstanceってあるけど、どういう分け方してるんですか?
682デフォルトの名無しさん:2008/10/03(金) 23:31:17
エスパーに失敗した。もうちょっと情報頼む。
683デフォルトの名無しさん:2008/10/04(土) 01:04:14
>>681
気分
684デフォルトの名無しさん:2008/10/04(土) 01:22:24
>>681
そういう作りはWin16時代の遺物なので今となっては意味がない

Win16ではアプリケーションの最初のインスタンスだけが実行すべき処理を
InitApplication()に記述して、
WinMain()の引数hPrevInstanceがNULLの場合にのみInitApplication()を実行していた。
685デフォルトの名無しさん:2008/10/05(日) 03:23:33
同一フォルダ内のすべてのファイルのサイズを取得するにはどうすればいいですか?
686デフォルトの名無しさん:2008/10/05(日) 03:48:44
FindFirstFile、FindNextFile、FindClose
687デフォルトの名無しさん:2008/10/05(日) 05:04:11
liboctave で逆フーリエ変換したいのだが、うまくいかない。
どこがだめなんだろうか?

int OCTAVE_iFFT( double *OCT_POW, int DATASIZE, double *OCT_BUF)
{
ComplexMatrix originalData( DATASIZE/2, 1, 0.0 ) ;
for( int ii=0; ii<DATASIZE/2; ii++ ){
originalData( ii, 0 ).real() = OCT_POW[ii] ;
}
ComplexMatrix ifourierData = originalData.ifourier() ;
for( int ii=0; ii<DATASIZE; ii++ )
OCT_BUF[ii] = ifourierData( ii, 0 ).real() ;
return 0 ;
}
688デフォルトの名無しさん:2008/10/05(日) 13:39:03
689デフォルトの名無しさん:2008/10/05(日) 15:59:48
C++の継承って、
どのくらいの規模のソースから必用になってきますか?
なんだか個人レベルでは必用がないように思えるのですが

此処の人たちが、継承を使い始めたソースの行数とかを、
個人的偏見でいいので教えてもらえると、嬉しいです
690デフォルトの名無しさん:2008/10/05(日) 16:18:02
行数よりは、どんなことをするか、に依るでしょ。
特に多態は、規模がどんなに小さくても、それを使うことで綺麗に実現できる事をするなら
使われるのでは。
691デフォルトの名無しさん:2008/10/05(日) 16:57:49
>>690
根底から仕様変えたくなった時に不便では無いですか?
692デフォルトの名無しさん:2008/10/05(日) 16:59:58
>>691
根底から仕様変える必要に迫られるようでは基本設計の段階で間違っている
としか言いようがない
693デフォルトの名無しさん:2008/10/05(日) 17:03:34
>>691
継承とか多態に対して
「根底から仕様変えたくなった時に不便ではないか」
という疑問を抱くなら、そもそも>>689で前提にしている
「個人レベルではない規模なら、継承を使うこともあるというのはわかる」
っていう認識はあり得なくない?

「大規模なプロジェクトで継承を使うと、根底から仕様を変えたくなったときに不便ではないですか?」
という疑問は持たないの?
694デフォルトの名無しさん:2008/10/05(日) 17:04:17
山じゃないんだから、そこに継承があるから使うなんて考えるな。
695デフォルトの名無しさん:2008/10/05(日) 17:09:04
根底から変えるなら、根底のクラスを継承すればいいだけ。
696デフォルトの名無しさん:2008/10/05(日) 17:09:52
単なる機能の拡張や変更に継承を使ってそうだな。
697デフォルトの名無しさん:2008/10/05(日) 17:39:03
>>692
一人で作るのは、ほぼ趣味みたいなものだから、根底から書き直す事は
自分はかなり多いので。(むしろ毎回?

>>693
>「大規模なプロジェクトで継承を使うと、根底から仕様を変えたくなったときに不便ではないですか?」
大規模なプロジェクトっていうのは、
仕組みの部分の作り方は既に枯れてると思って、
根底から書き換える事はほとんど無いと予想したんですが。
本職じゃないからこの辺りの事情はわからないっす。
698デフォルトの名無しさん:2008/10/05(日) 17:44:42
>>697
だったらOOPなんか使うな。
お前には向いてない。
699デフォルトの名無しさん:2008/10/05(日) 17:47:42
「エディタ作ろうと思ったけど、3D格闘ゲーに変えるわ」
くらい根底から変わるなら、確かに設計をいくらしっかりやってもしょうがないが・・・。
700デフォルトの名無しさん:2008/10/05(日) 18:14:24
継承するとコールのとき楽
701デフォルトの名無しさん:2008/10/05(日) 18:18:25
>>700
そういう問題かよ
702デフォルトの名無しさん:2008/10/05(日) 19:34:46
>>699
それに近いかもしれないww
作ろうと思うものがバラバラで困った
同じものを何度も何度も作るなら継承なのかなぁ
初めて作るものはどうやってもまともに設計なんてできやしない
703デフォルトの名無しさん:2008/10/05(日) 19:36:09
>>698
じゃぁC++初心者はどこからOOP入れば・・・
704デフォルトの名無しさん:2008/10/05(日) 19:39:42
本物の初心者ならPythonやRubyあたりからやったら?
一見遠回りのようでも
705デフォルトの名無しさん:2008/10/05(日) 20:28:34
クラスの設計は何度も作り直して覚えていけばよい。

706デフォルトの名無しさん:2008/10/05(日) 21:09:27
>>703
Qtお勧め
モノ作るためだけにもいいツールだけど、
C++(OOP)を理解する教材としても結構いいと思うよ


英語ダメ、とか泣き言言わない人なら
707デフォルトの名無しさん:2008/10/05(日) 21:21:04
>>706
最後の一行orz

>>704
多分、そこまで初心者でもないです
perlなら使える

>>705
そうですよぬー。
がんばってみます。
708デフォルトの名無しさん:2008/10/05(日) 21:57:20
英語ダメ、とか壁作ってちゃ結局無駄

特定のジャンルの英文なんて、
出てくる単語なんて少ないし、
万国共通の言語(プログラミング言語)が添えてある


足を踏み入れてみたら、
なんだ、ただの食わず嫌いだったんだなということがわかる
709デフォルトの名無しさん:2008/10/05(日) 22:46:02
別に英語の達人にまでなる必要は無いものな。
710デフォルトの名無しさん:2008/10/06(月) 11:42:09
そもそも、「英語」じゃなくて、「プログラミング言語」だからな。
そこんところ間違えちゃだめだ。

まあ、変数名つけるときに辞書引いたりはするけど。
711デフォルトの名無しさん:2008/10/06(月) 15:54:54
便乗で質問します( ・ω・)∩
自分はDirectXのコードばかりなんでMFCや.NETとかは勉強せずに
Win32APIでしかWindowsアプリ作ったことないんですが、
QtはMFCやWin32APIで書くよりも楽しい&効率的でしょうか?
wxWindowsとか他にもあるみたいですが、
それらと比べるとどうなのでしょうか。使った方の感想でいいので
よかったら教えてください。
712デフォルトの名無しさん:2008/10/06(月) 16:04:30
>>710
いや、皆がしてるのは、英語で書かれたコメントやマニュアルを読む話では。
713デフォルトの名無しさん:2008/10/06(月) 16:17:30
>>711
QtはMFCより遥かに楽で美しい
ただ組み立ててるだけのサンプルコードなのに
FireFoxもどきのブラウザまで作れてしまう

ただWindowsしか使わないなら他に選択肢はある
無料版はDirectXサポート外だし、
ソース公開の義務が発生するしな
714デフォルトの名無しさん:2008/10/06(月) 16:50:44
連投スマン

ちなみにGtkはC言語ベースだけあって
オブジェクト指向になれてしまった人には苦痛に感じる汚さだと思う
C++ラッパーはあるけどね
あと、2byte文字が苦手だったのかな?
どこかでマルチプラットフォームという面ではまだあと一歩だった気がする

wxWindowはできが良さそうに見えて
まだまだ発展途上って感じで今後に期待、のまま月日が流れてる・・・


Qtはこの3つの中で最も後発だから、
設計面でもマルチプラットフォームの達成度も一番できがいいけど
やっぱソース公開の義務が足を引っ張ってる感じだな
マニュアルやサンプルはかなり充実してるのに


突っ込み、ご指摘ヨロ
715デフォルトの名無しさん:2008/10/06(月) 17:00:25
商用版買えよ
716デフォルトの名無しさん:2008/10/06(月) 17:11:21
個人の遊びで使うには高すぎるだろ
中古車が買えちゃうぐらいだぞ?w
717711:2008/10/06(月) 17:17:44
>>714
ありがとうございます。かなり興味湧いてきました。
他のプラットフォームでも同じコードでそのまま動くというのもすごいですね。
自分が使うツール組む分には非常によさげですね。

>>715
値段見てちびりそうになりました(´・ω・`)
718デフォルトの名無しさん:2008/10/06(月) 23:25:27
ちょっと教えてくれ

extern "C" void hogehoge()
{

}

こういう風に定義部分にextern "C"を付けて
C++でコンパイルしたらマングリングされなかったが、
ググっても定義部分に付けてるとこ見た事ない。
これってコンパイラ依存な実装?

というか、マングリングってちょっとエロいな
719デフォルトの名無しさん:2008/10/06(月) 23:26:19
万具リングって言葉自体はじめて聞いた。
720デフォルトの名無しさん:2008/10/07(火) 00:06:29
ちゃんと定義されてるけど、わざわざ個別の関数につけることはしないような気がする
721デフォルトの名無しさん:2008/10/07(火) 00:09:14
なんかそんなことしてるってのは知ってたがマングリングって名前だったのか・・・初めて知った。
たしかコンパイラ依存じゃないっけ?
VCとBCBでもマングリング後?の実際の関数名は違ってるはずだし。

だがうろ覚えなので間違ってても責任は持たん。
722デフォルトの名無しさん:2008/10/07(火) 01:10:59
>>718
関数の宣言なしに定義を書いたら、それは宣言も兼ねるというやつだ。
staticな関数も、宣言なしにいきなり定義を書けるだろ?
723デフォルトの名無しさん:2008/10/07(火) 01:23:33
>>722

んじゃ、
extern "C" void hogehoge();
void hogehoge()
{

}
ってやってもマングリングされないの?
今試せる環境ないからわかんないけど

つまり、俺はextern "C"ってマングリングされてない関数を
呼び出す時の為にあると思ってたけど、
マングリングさせないという意味もあるということだな?
724デフォルトの名無しさん:2008/10/07(火) 01:30:22
extern "C"は、その関数をCリンケージにしろという指令だよ。
725デフォルトの名無しさん:2008/10/07(火) 01:33:36
>>724

なるほど。そういう解釈なんだね.
じゃあ、723で書いたコードは多分マングリングされちゃうね。

ありがとう^^
726デフォルトの名無しさん:2008/10/07(火) 03:23:08
>>723,725
一旦 extern "C" で宣言されていれば、同じ名前の定義もリンケージ指定を引き継ぐよ。
723 の hogehoge() は C で使える。
727デフォルトの名無しさん:2008/10/07(火) 13:46:04
DLLを調べて関数名とその引数を取得する方法ありませんか?
728727:2008/10/07(火) 13:50:42
DLLのlibファイルはたいていVC++用なので、bccやminGWでも使えるように
ヘッダファイルを生成して、その中のクラスのコンストラクタで動的にDLLを
呼び出しておきたいのですが。
DLLを渡したら自動でヘッダファイルを生成したいんです。
やり方教えてください。
729デフォルトの名無しさん:2008/10/07(火) 13:55:41
>>727
ヘッダファイルは共用できるように書けます
共用したほうがいいです

引数のトータルバイト数くらいなら頑張れば分かりますが
DLLから引数の個数を自動で調べる方法はありません
730デフォルトの名無しさん:2008/10/07(火) 14:02:00
>>729
そうですか。残念ですがあきらめます。
731デフォルトの名無しさん:2008/10/07(火) 14:06:50
いつも、元々付いているヘッダファイルは使わず、
ライブラリの説明書見ながら、動的呼び出しのC++用のヘッダを作っているのですが。
DLLに、いつも静的リンクと動的リンクの二つヘッダを入れてほしいです。
732デフォルトの名無しさん:2008/10/07(火) 14:07:31
>>730
implib.exe とか dlltool.exe とかでライブラリを作ることは可能
733デフォルトの名無しさん:2008/10/07(火) 14:08:25
付属ヘッダから、実行時に動的リンクするヘッダを生成する部分を作ることにしました。
734デフォルトの名無しさん:2008/10/07(火) 14:19:11
いつもこの様なヘッダを手動で作ってます。 
このヘッダを読むだけでDLLの関数がどのコンパイラでも使えます。
friend関数の中身は省略してます。

class SevenZipDLL {
HINSTANCE hd;
typedef int (WINAPI *FN0)(const HWND, LPCSTR, LPSTR, const DWORD);
typedef BOOL (WINAPI *FN1)(LPCSTR, const int );
FN0 SevenZip_;
FN1 SevenZipCheckArchive_;

public:
friend int SevenZip(string s, string &t);
friend BOOL SevenZipCheckArchive(string);

SevenZipDLL(){
hd = LoadLibrary("7-zip32.dll");
SevenZip_ = (FN0) GetProcAddress(hd,"SevenZip");
SevenZipCheckArchive_ = (FN1) GetProcAddress(hd,"SevenZipCheckArchive");
}
} SevenZipDLL_;
735デフォルトの名無しさん:2008/10/07(火) 17:29:31
winsock2.hなんか両用にできているよね。

それと、静的リンク前提のヘッダでも、0xならもう少し活用できると思う。
g++ -std=c++0xでこんなコードが書ける。
#include <windows.h>
int main()
{
    typedef decltype(MessageBoxA)* PFNMsgBoxA;
    if (HMODULE hmodUser = LoadLibrary(TEXT("user32")))
    {
        if (PFNMsgBoxA pMsgBox = reinterpret_cast<PFNMsgBoxA>(GetProcAddress(hmodUser, "MessageBoxA")))
        {
            pMsgBox(0, "Hello world", "", 0);
        }
        FreeLibrary(hmodUser);
    }
}
736デフォルトの名無しさん:2008/10/07(火) 18:12:40
virtualは遅い?
737デフォルトの名無しさん:2008/10/07(火) 18:16:27
virtualなしに比べて、ということなら。
738デフォルトの名無しさん:2008/10/08(水) 01:23:26
>>736 速度は実測が基本
739デフォルトの名無しさん:2008/10/08(水) 06:22:41
int hoge = 0;
if(++hoge == HogeFunc());


このif文はキチンと保証されてましたっけ?
740デフォルトの名無しさん:2008/10/08(水) 07:17:53
何を保証して欲しいんだ?
741デフォルトの名無しさん:2008/10/08(水) 08:22:05
>>739
C99やC++じゃなければ、そのhogeの定義がブロックの先頭である必要がある。
HogeFunc()は整数型か、それに暗黙的に変換できる型である必要がある。
742デフォルトの名無しさん:2008/10/08(水) 09:30:34
>>739
hogeがHogeFunc()の中で変更されてなければ保証されている。
743デフォルトの名無しさん:2008/10/08(水) 10:43:16
STLのキューにデータが入るまで、待つにはにはどのようにしたらいいですか?
744デフォルトの名無しさん:2008/10/08(水) 10:48:48
whileでサイズを監視していたら、CPU負荷が掛かってしまいます。
745743:2008/10/08(水) 10:57:35
自己解決したと思います。 キューにデータ入れたら、シグナル/非シグナルを切り替えれば良さそうです。
746デフォルトの名無しさん:2008/10/08(水) 11:40:35
747デフォルトの名無しさん:2008/10/08(水) 12:35:41
>>741,742サンクス
748デフォルトの名無しさん:2008/10/08(水) 12:44:40
>>742
==は評価順位決まってるだろ。
749デフォルトの名無しさん:2008/10/08(水) 12:58:46
決まってねーよ
750デフォルトの名無しさん:2008/10/08(水) 13:57:21
>>739のはグローバルでもないのに、どうやって中でいじるんだろう。
751デフォルトの名無しさん:2008/10/08(水) 14:06:43
マクロ?
752デフォルトの名無しさん:2008/10/08(水) 15:53:10
C/C++の関数辞典的な本でお勧めってありますか?
753デフォルトの名無しさん:2008/10/08(水) 16:52:45
Cなら新ANSI C言語辞典持ってりゃいいんでないかな。
C++はわかんね。EffectiveC++とか?辞典的じゃないけど。
754デフォルトの名無しさん:2008/10/08(水) 17:33:06
C/C++実践プログラミングリファレンス@エーアイ出版
携帯なんでググってくれ

古いけど、最初は結構お世話になった
重複機能(各コンテナのpush_backとか)端折ってない上、
そこそこサンプルコードが載ってるため分厚い
比率はC:C++=6:4ぐらいで<algorithm>まで入ってる


まぁこれしか知らないんだがw
755デフォルトの名無しさん:2008/10/08(水) 17:59:10
CはK&Rに決まってるだろ。
C++は、禿のより、Nicolai Josuttisの本の方が分かりやすかった。
アスキー出版から邦訳もあったはずだけど、絶版だった気もする。
まあ原書読め。
756デフォルトの名無しさん:2008/10/08(水) 18:14:29
>>755
流れ読めない人だねえ。もうちょっと落ち着いてレスしようぜ。
757デフォルトの名無しさん:2008/10/08(水) 21:39:04
>>753-755
ありがとう、購入の際の参考にします
しかし近くに大きな本屋がないような田舎だと専門書買うのって苦労するなぁ('A`)
758デフォルトの名無しさん:2008/10/08(水) 23:01:52
C++は辞典を見るより STL on Web を見てる
ttp://www005.upp.so-net.ne.jp/episteme/html/stlprog/

書籍で辞典代わりに唯一買ったのは、これくらいか。
「C++標準ライブラリの使い方 完全ガイド」 柏原 正三 技術評論社
759デフォルトの名無しさん:2008/10/09(木) 03:21:19
変数の値が変化したことをチェックする方法はありますか?
nの値が3を超えるまで待機したりとか。同期オブジェクトしかないですか
760デフォルトの名無しさん:2008/10/09(木) 04:30:26
いいメモリアロケータ教えてください。空きメモリが少なくなったら、
メモリマップドファイルに切り替えて、不安定にならないようにしたり出来ると良いです。
761デフォルトの名無しさん:2008/10/09(木) 04:31:30
OSを信じろ!
762デフォルトの名無しさん:2008/10/09(木) 04:45:49
作り方だけでも教えてもらえませんか アロケータです
763デフォルトの名無しさん:2008/10/09(木) 05:00:16
当然64bit以上のアドレス長を想定しているんだろうな?
764デフォルトの名無しさん:2008/10/09(木) 05:09:09
STLをマルチスレッドな環境で使いたいときにはどうすればよいですか?
基本的な解決策って何でしょうか?
よろしくお願いします。
765デフォルトの名無しさん:2008/10/09(木) 05:29:38
質問です。
ファイルにかかれた
abc:defという文字列ををabcとdefに切り分けるプログラムを考えています。
while((c = fgetc(f)) != EOF){
    if(c == ':'){
    ungetc(c,f);
    fseek(f,1,SEEK_CUR);
    }
    printf("%c\n",c);
}
とやったのですが、abc:defと表示されてしまいます。
fseekには成功した場合ungetcで戻したデータはなかったことになると
manに書いてありました。
abc:まで読む
:戻す
fseek成功。:なかったことになる。
dから読み始める
っていうのを想像していたのですが、:が入ってしまいます。
このような場合どのようにするのが定石なのでしょうか?
766デフォルトの名無しさん:2008/10/09(木) 05:51:55
トークン 分割 C言語 などでググる
767デフォルトの名無しさん:2008/10/09(木) 05:55:29
768デフォルトの名無しさん:2008/10/09(木) 06:00:43
769デフォルトの名無しさん:2008/10/09(木) 07:03:39
メモリ管理はこの中だとどれか良いんでしょうか?

dlmalloc
ptmalloc
STLport
jemalloc
Google malloc
770デフォルトの名無しさん:2008/10/09(木) 07:52:55
グーグルのレポによると、ほぼすべての場合において、Google mallocはptmallocを上回るみたいです。
なので、残っているのは、Google mallocとSTLport、jemallocの比較です。

http://goog-perftools.sourceforge.net/doc/tcmalloc.html
771デフォルトの名無しさん:2008/10/09(木) 08:21:14
すみません。Google mallocとjemallocのインストール方法がわかりません。
標準のメモリ管理を乗っ取りたいのですがどうすればいいですか?

jemalloc
http://mxr.mozilla.org/mozilla-central/source/memory/jemalloc/

Google malloc
http://code.google.com/p/google-perftools/
772デフォルトの名無しさん:2008/10/09(木) 09:36:19
標準って何の標準?
773デフォルトの名無しさん:2008/10/09(木) 09:39:26
コンパイラ付属のmallocです。
ptmallocとjemallocは、UNIX用に作られていてコンパイルできそうにありませんでした。
Google mallocとdlmallocは、変更無しにコンパイルは出来ました。
使い方はわかりません。
774デフォルトの名無しさん:2008/10/09(木) 09:59:37
Windows対応で、試す価値がありそうなのは
Google mallocとSTL portとboost poolくらいですね。
使い方わかったらレポします。 あと知っているいたら教えてください。
775デフォルトの名無しさん:2008/10/09(木) 10:20:30
メモリ確保は重要と思いました。 new と poolを比較したとき9倍ほど速度差がありました。

#include <iostream>
#include <boost/timer.hpp>
#include <boost/pool/pool.hpp>
using namespace std;

#define N 1024*1024
int main()
{
int n, **a=new int *[N];
double cl,cr;
boost::timer timer;

timer.restart();
for(n = 0; n < N ; n++)a[n]=new int;
cr=timer.elapsed();
for(n = 0; n < N ; n++)delete a[n];

timer.restart();
boost::pool<> pool(sizeof(int));
for(n = 0; n < N; n++) pool.malloc();
cl=timer.elapsed();

cout <<"boolの確保速度 "<<cl<<"秒 newの確保速度 "<<cr<<"秒 速度比 "<<cr/cl<< "\n";
}
776デフォルトの名無しさん:2008/10/09(木) 10:24:10
訂正 
#include <iostream>
#include <boost/timer.hpp>
#include <boost/pool/pool.hpp>
using namespace std;

#define N 10*1024*1024
int main()
{
int n, **a=new int *[N];
double cl,cr;
boost::timer timer;

timer.restart();
for(n = 0; n < N ; n++)a[n]=new int;
cr=timer.elapsed();
for(n = 0; n < N ; n++)delete a[n];

timer.restart();
boost::pool<> pool(sizeof(int));
for(n = 0; n < N; n++) a[n] = (int *)pool.malloc();
cl=timer.elapsed();

cout <<"boolの確保速度 "<<cl<<"秒 newの確保速度 "<<cr<<"秒 速度比 "<<cr/cl<< "\n";
}
777デフォルトの名無しさん:2008/10/09(木) 11:42:30
bcc2008にGoogle mallocとSTL port入れたいのですがやり方わかりません
778デフォルトの名無しさん:2008/10/09(木) 14:05:54
スパースファイルっていうのがあるんですけど、これって圧縮とは違うんでしょうか?
たとえば5Gのスパースファイルを作って中身が入っていたとすると、これを読むのは
実5Gのファイルと比べて速かったりしますか?

http://shoppers-jp.com/tech/sdk022.html
779デフォルトの名無しさん:2008/10/09(木) 14:12:47
中身全部00だろそれ
780デフォルトの名無しさん:2008/10/09(木) 14:15:42
>>779
ちゃんと読み書きできますよ。だから全部が0とは限りません。 途中や末尾にデータ入れられます。
781デフォルトの名無しさん:2008/10/09(木) 14:36:50
圧縮してるわけじゃなくて使ってないとことばしてるだけだな。
782デフォルトの名無しさん:2008/10/09(木) 14:58:14
データを入れるとその部分は実際に容量を食う
結局5GB分のデータが入る予定なら変わらないんじゃないか
大部分0のままにしておくことに意味があるのならいいかもしれないけれど
速度は実際に測ってみれよ
783デフォルトの名無しさん:2008/10/09(木) 15:19:30
クラスの構造について質問です

元のクラスが持ってるデータを変換して次のプロセスを担当するクラスへと引き渡すとき

元クラス-変換クラス-次クラスのように数珠繋ぎに各クラスのポインタを持たせるか
元クラスに変換クラスと次クラスへのポインタを一括して持たせしまうか

どちらがよいでしょうか?
784デフォルトの名無しさん:2008/10/09(木) 15:23:33
データクラス作って
それぞれの演算用クラスにぶち込む
785デフォルトの名無しさん:2008/10/09(木) 15:36:28
スパースファイルは速いみたいです。2つに分けます。

#include <windows.h>
#include <iostream>
using namespace std;
#define filesize 100*1024*1024
int main() {
DWORD retsz; int n,m,cl,sum=0;
HANDLE fp = CreateFile("SPARSEFILE", GENERIC_WRITE|GENERIC_READ,0, NULL, CREATE_ALWAYS, 0, NULL);
DeviceIoControl(fp, FSCTL_SET_SPARSE, NULL,0, NULL, 0, &retsz, NULL);
SetFilePointer(fp,filesize, NULL, FILE_BEGIN); SetEndOfFile(fp);
HANDLE hd = CreateFileMapping(fp, NULL, PAGE_READWRITE,0,0, "SPARSETEST");
char *p = (char*)MapViewOfFile(hd, FILE_MAP_ALL_ACCESS, 0, 0, 0);

HANDLE fq = CreateFile("REALFILE", GENERIC_WRITE|GENERIC_READ,0, NULL, CREATE_ALWAYS, 0, NULL);
SetFilePointer(fq,filesize, NULL, FILE_BEGIN); SetEndOfFile(fq);
HANDLE he = CreateFileMapping(fq, NULL, PAGE_READWRITE,0,0, "REALTEST");
char *q = (char*)MapViewOfFile(he, FILE_MAP_ALL_ACCESS, 0, 0, 0);

786デフォルトの名無しさん:2008/10/09(木) 15:37:18
cout<<"疎なデータ書き込み中・・・\n";
for(n=0;n<5000;n++){m=rand()%filesize; p[m]=q[m]='a';}
FlushViewOfFile(p,0);FlushViewOfFile(q,0);
cl=GetTickCount(); for(n=0;n<filesize;n++)sum+=p[n]; cl=GetTickCount()-cl; cout<<"SPARSEFILEの読み込み速度 = "<<cl<<endl;
cl=GetTickCount(); for(n=0;n<filesize;n++)sum+=q[n]; cl=GetTickCount()-cl; cout<<" REALFILEの読み込み速度 = "<<cl<<endl;
cout<<"\n密なデータ書き込み中・・・\n";
for(n=0;n<filesize/2;n+=2){ p[2*n]=q[2*n]='a'; p[2*n+1]=q[2*n+1]='\n'; }
FlushViewOfFile(p,0);FlushViewOfFile(q,0);
cl=GetTickCount(); for(n=0;n<filesize;n++)sum+=p[n]; cl=GetTickCount()-cl; cout<<"SPARSEFILEの読み込み速度 = "<<cl<<endl;
cl=GetTickCount(); for(n=0;n<filesize;n++)sum+=q[n]; cl=GetTickCount()-cl; cout<<" REALFILEの読み込み速度 = "<<cl<<endl;
cout<<"\n終了処理中・・・\n";
FlushViewOfFile(p,0);UnmapViewOfFile(p); CloseHandle(hd); CloseHandle(fp);
FlushViewOfFile(q,0);UnmapViewOfFile(q); CloseHandle(he); CloseHandle(fq);
cout<<"最適化対策のための計 sum = "<<sum<<endl; return 0;}
787デフォルトの名無しさん:2008/10/09(木) 15:50:31
>>783
データ用クラスを作ってそれをそれぞれに共有させるという事ですか?
788デフォルトの名無しさん:2008/10/09(木) 16:01:55
Google mallocの使い方わかりませんか
789デフォルトの名無しさん:2008/10/09(木) 16:05:40
>>788 ↓このサイトを参考にするのがおすすめ。
http://www.google.co.jp/search?q=google+malloc
790デフォルトの名無しさん:2008/10/09(木) 16:18:30
>>787
多態性を、と思ったが、
アマ意見だからこの意見の評価はオレも聞きたい(´・ω・`)

頼りない意見でスマン



↓エロい人
791デフォルトの名無しさん:2008/10/09(木) 18:18:04
Google mallocのtcmalloc.hには、
こういった関数が書いてありますが、
bcc2009の標準にするにはどういった設定をおこなえばいいでしょうか?

extern "C" void cfree
extern "C" int posix_memalign
extern "C" void* memalign
extern "C" void* valloc
extern "C" void* pvalloc
792デフォルトの名無しさん:2008/10/09(木) 19:15:21
>>791
標準にしたいってなんだろ。
そういった関数が書かれているならそういった関数を使えばいいじゃない
793デフォルトの名無しさん:2008/10/09(木) 19:20:23
newやvectorで呼び出すメモリ確保関数にしたいんです
794デフォルトの名無しさん:2008/10/09(木) 19:20:44
ここはお前に日記帳じゃねーんだ。
チラシの裏でやれ。
795デフォルトの名無しさん:2008/10/09(木) 19:22:07
>>793
だったらnew演算子をオーバーロードしたりカスタムアロケーターを作ればいいだろうが。
796765:2008/10/09(木) 20:52:32
>>766
>>767
>>768

ありがとうございます。
このような関数があるとは知りませんでした。
勉強になりました。
じつは、自分はパーサーを作りたいのでungetcを使えた方が良いのです。
abc:defの場合、
abc:でungetcして、'¥0'を入れてreturnするみたいな...
ungetcを使う場合はどのような方法があるでしょうか?
たとえば:の出てきたところを記録していて、
fseekで記録+1の所から、読み始めるとか...
797デフォルトの名無しさん:2008/10/09(木) 20:55:36
>>796
printf を else{ .. } で囲むといいと思うよ
798デフォルトの名無しさん:2008/10/09(木) 23:51:54
ちなみにstrtokは仕様上のバグとされている

正しく使えばトラブル起きないけど、
危険な関数って意味で
799デフォルトの名無しさん:2008/10/10(金) 00:15:04
浮動小数点出力フォーマットの質問です。

#include <iomanip>
#include <iostream>
#include <cmath>
int main()
{
std::cout << std::scientific << std::setprecision(8) << M_PI << std::endl;
return 0;
}
このプログラムを実行すると、
3.14159265e+00
と出力されるんですが、フォートランみたいに、
0.31415926e+01
というように、0の位を0で出力する方法はあるでしょうか?
800デフォルトの名無しさん:2008/10/10(金) 11:14:19
>>790
784に賛成
元クラスと次クラスとの依存関係を作らなくてすむから。
801デフォルトの名無しさん:2008/10/10(金) 12:51:58
関数ポインタってありますが、変数名やクラス名をポインタで定義できますか?
たとえば、このようなクラス、変数名があったとき、これをポインタで定義できますか?
class ABCD { } ABCD_;
802デフォルトの名無しさん:2008/10/10(金) 12:56:39
char ch[]="ABCD";

class ch { } ch_;

こんなのは出来ないしやり方ありますか
803デフォルトの名無しさん:2008/10/10(金) 13:01:45
それをどう使うつもりなんだ?
具体的な使用例があれば何かアドバイスできるかもしれない
804デフォルトの名無しさん:2008/10/10(金) 13:05:25
クラス名は typeid 変数名はプリプロセッサの # かな
805デフォルトの名無しさん:2008/10/10(金) 13:06:15
ごめん、意味間違えてた
806デフォルトの名無しさん:2008/10/10(金) 13:16:10
すみません あきらめます
807デフォルトの名無しさん:2008/10/10(金) 13:16:56
new演算子の引数でstd::nothrowを指定した場合、std::bad_alloc以外の、コンストラクタでの例外も一切投げられないのですか?
808デフォルトの名無しさん:2008/10/10(金) 13:19:43
テンプレートでは、関数ポインタを引数のように扱えますか?
809デフォルトの名無しさん:2008/10/10(金) 13:22:19
>>807
いいえ
operator new の呼び出しとコンストラクタの呼び出しは別個です
810デフォルトの名無しさん:2008/10/10(金) 13:25:40
>>807 コンストラクタからの例外は余裕で飛んでくるよ。
811デフォルトの名無しさん:2008/10/10(金) 13:26:51
>>808
「引数のように扱う」の意味がわからん。
何かができるかどうかって話なら、まず試せばいいんじゃないの?
812デフォルトの名無しさん:2008/10/10(金) 13:27:54
>>808
こうですか?わかりません
template <void(*func)()> class foo {};
void bar(){}
foo<bar> baz;
813デフォルトの名無しさん:2008/10/10(金) 13:28:21
>>809-810
わかりました。ありがとうごいます。
814デフォルトの名無しさん:2008/10/10(金) 13:28:53
自己解決しました

テンプレートパラメータに指定できるもの - Faith and Brave - C++で遊ぼう
関数ポインタも指定できる(サンプルは書かないがメンバ関数ポインタもできる)
http://d.hatena.ne.jp/faith_and_brave/20080527/1211878612
815デフォルトの名無しさん:2008/10/10(金) 14:01:38
これはどうすれば動きますか?

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

typedef int (WINAPI *FN0)(HANDLE, LPCSTR, LPSTR, const DWORD);
typedef BOOL (WINAPI *FN1)(const BOOL);
char dn[3][20]={"aaa.dll","bbb.dll","ccc.dll"};
char en[3][2][20]={"aaa1","aaa2","bbb1","bbb2","ccc1","ccc2"};

void fnc(int n){
// hd = LoadLibrary(dn[n]);
// z1 = (FN0) GetProcAddress(hd,en[n][0]);
// z2 = (FN1) GetProcAddress(hd,en[n][1]);
}

class aaa { HINSTANCE hd;
public: FN0 z1; FN1 z2;
aaa(){ fnc(0); } } aaa_;

class bbb { HINSTANCE hd;
public: FN0 z1; FN1 z2;
bbb(){ fnc(1); } } bbb_;

class ccc { HINSTANCE hd;
public: FN0 z1; FN1 z2;
ccc(){ fnc(2); } } ccc_;

main(){}
816デフォルトの名無しさん:2008/10/10(金) 14:03:17
自己解決しました
817デフォルトの名無しさん:2008/10/10(金) 14:16:58
自己解決が多いなw
818デフォルトの名無しさん:2008/10/10(金) 14:31:21
いいことだ
819デフォルトの名無しさん:2008/10/10(金) 14:32:35
自己解決しました
820デフォルトの名無しさん:2008/10/10(金) 14:33:30
これでコンパイルは通ったのですが、グローバルのen[][][]を無くして
fnc("aaa"); (もしくはクラスを特定できるポインタを与える) ことでfnc側で、
HINSTANCE hd, FN0 z0, FN1 z1を特定させることは出来ないですか?

#include <windows.h>

typedef int (WINAPI *FN0)(HANDLE, LPCSTR, LPSTR, const DWORD);
typedef BOOL (WINAPI *FN1)(const BOOL);

char en[3][3][20]={
{"aaa.dll","aaa1","aaa2"},
{"bbb.dll","bbb1","bbb2"},
{"ccc.dll","ccc1","ccc2"} };

void fnc(HINSTANCE &hd, FN0 &z0, FN1 &z1,int n){
hd = LoadLibrary(en[n][0]);
z0 = (FN0) GetProcAddress(hd,en[n][1]);
z1 = (FN1) GetProcAddress(hd,en[n][2]); }

class aaa { HINSTANCE hd;
public: FN0 z0; FN1 z1;
aaa(){ fnc(hd,z0,z1,0); } } aaa_;

class bbb { HINSTANCE hd;
public: FN0 z0; FN1 z1;
bbb(){ fnc(hd,z0,z1,1); } } bbb_;

class ccc { HINSTANCE hd;
public: FN0 z0; FN1 z1;
ccc(){ fnc(hd,z0,z1,2); } } ccc_;

main(){}
821デフォルトの名無しさん:2008/10/10(金) 14:37:32
自己解決しました
822デフォルトの名無しさん:2008/10/10(金) 15:29:08
本人か知らんが自己解決時には解決策を書いてけ
823デフォルトの名無しさん:2008/10/10(金) 15:35:15
自己解決できない人はレスしないでください。
824デフォルトの名無しさん:2008/10/10(金) 15:37:39
あたらしい遊びですね 
ちなみに次の質問は自己解決してます。
825デフォルトの名無しさん:2008/10/10(金) 15:41:23
コンパイルするとwinnt.hでエラーが出るようになりました。
他の正常だったプロジェクトこコンパイルしてもエラーが出ます。
どうもwinnt.hの内容を変えてしまったようなのですが、どこがいけないのかわかりません。
再インストール以外でいい方法はありませんか?システムプログラムはロックはかかってないんでしょうか?
826825:2008/10/10(金) 15:47:18
あ、自己解決しました
827デフォルトの名無しさん:2008/10/10(金) 16:34:27
まじむかつくなにこおスレ
828デフォルトの名無しさん:2008/10/10(金) 16:41:29
FNC(char *input, char *output)という関数が有り、引数はそれぞれファイル名を指定するものとします。
この際、outputだけメモリを指定したいのですが、メモリをファイルのように見せかけるテクはありませんか?
関数FNCの変更は出来ません
829デフォルトの名無しさん:2008/10/10(金) 16:54:17
2Mメモリを確保したら、一時的にドライブ番号Wを割り当てるとか出来ると良いのですが
ドライバとか不要の方法は無いですか
830デフォルトの名無しさん:2008/10/10(金) 17:19:17
#include<stdio.h>
void sum(int dim[],int num)
{
int i,sum=0;
for(i=0;i<num;i++)
sum+=dim[i];}
int main(void)
{
int i,dim[]={5,1,2,3,4};
int num=5,max,total;
max=dim[0];
for(i=1;i<num;i++)
if(max<dim[i])
max=dim[i];
total=sum(dim,num);
printf("%d\n",max);
printf("%d\n",total);
return(0);
}

voidからintに変換できません、と出ます
どなたか
831デフォルトの名無しさん:2008/10/10(金) 17:21:18
int sum(int dim[],int num)
{
int i,sum=0;
for(i=0;i<num;i++)
sum+=dim[i];
return sum;
}
832デフォルトの名無しさん:2008/10/10(金) 17:22:57
>>830
sum()が何も返さないのにtotal=sum()としているから
833828:2008/10/10(金) 17:26:01
winXPです
834830:2008/10/10(金) 17:39:31
関数はvoid型として宣言されていますが、値を返しました

といわれました・・・・
どういうことなの・・・
835デフォルトの名無しさん:2008/10/10(金) 17:40:36
>>834
>>832がすべて
836820:2008/10/10(金) 17:41:29
>>822
この様にしました。 なるべく重複する部分を無くしたいという目的なのでこれでOKです。

#include <windows.h>
#include <string>
using namespace std;

typedef int (WINAPI *FN0)(HANDLE, LPCSTR, LPSTR, const DWORD);
typedef BOOL (WINAPI *FN1)(const BOOL);

class DLLdata { public: string tag; HINSTANCE hd; FN0 z0; FN1 z1; };

void fnc(DLLdata &x){
string y;
y=x.tag+".DLL"; x.hd = LoadLibrary(y.c_str());
y=x.tag+"0"; x.z0 = (FN0) GetProcAddress(x.hd,y.c_str());
y=x.tag+"1"; x.z1 = (FN1) GetProcAddress(x.hd,y.c_str()); }

class A_ {
DLLdata x;
public: A_(){x.tag="A"; fnc(x);}} A;

class B_ {
DLLdata x;
public: B_(){x.tag="B"; fnc(x);}} B;

class C_ {
DLLdata x;
public: C_(){x.tag="C"; fnc(x);}} C;

main(){}
837デフォルトの名無しさん:2008/10/10(金) 17:46:51
>>835
return sum; で返したつもりなのですが・・・
838デフォルトの名無しさん:2008/10/10(金) 17:50:19
void sum -> int sum
839830:2008/10/10(金) 17:53:02
ありがとうございます皆様
840デフォルトの名無しさん:2008/10/10(金) 17:53:04
VBやPascalの古い書式に、関数名と同じ名前の変数に値を
代入することで関数の戻り値になるというのがあって
それと混同してる予感。
841デフォルトの名無しさん:2008/10/10(金) 18:07:46
VBがそんなことできたな確か
842デフォルトの名無しさん:2008/10/10(金) 18:14:03
メモリをファイルのように見せかけるテクはありませんか?
メモリマップドファイルの逆です。WindowsXPです。
RAMディスクを前準備無しに動的に生成出来る方法でもいいです。 
843デフォルトの名無しさん:2008/10/10(金) 18:24:41
C++でいいの?
844デフォルトの名無しさん:2008/10/10(金) 18:27:54
>>843
おねがいします
845デフォルトの名無しさん:2008/10/10(金) 18:53:09
「C++でいいの?」なんてわざわざ聞いているから、
メモリに対して読み書きするストリームクラスというオチだと予想。
846デフォルトの名無しさん:2008/10/10(金) 19:12:06
早急におねがいします!
847846:2008/10/10(金) 19:42:21
自己解決しました
役立たねぇな
848デフォルトの名無しさん:2008/10/10(金) 19:51:26
していません レスおねがいします
849デフォルトの名無しさん:2008/10/10(金) 19:56:08
名前付きパイプとかで出来ないかな?
850846:2008/10/10(金) 19:57:26
やっぱ、自己解決しました
名前付きパイプとかで出来ました
851846:2008/10/10(金) 20:06:07
さらに自己解決しました
パイプカットとかも役に立ちました。
852デフォルトの名無しさん:2008/10/10(金) 20:34:42
してませんだれかおねがししあmsssぐが
853デフォルトの名無しさん:2008/10/10(金) 20:44:08
今度は解決したものを長引かせる詐欺ですか
854デフォルトの名無しさん:2008/10/10(金) 20:50:16
やめてください
だれかおねがいします
855854:2008/10/10(金) 21:01:18
やっぱり解決しました
856デフォルトの名無しさん:2008/10/10(金) 21:10:02
解決してしまったのか
了解した
857デフォルトの名無しさん:2008/10/10(金) 21:25:53
ズバットですが、怪傑しました。
858デフォルトの名無しさん:2008/10/10(金) 21:30:18
解決させません
859デフォルトの名無しさん:2008/10/10(金) 22:20:37
壊血しました。もう長くないかもしれません。
860デフォルトの名無しさん:2008/10/10(金) 23:18:13
ライムでも喰っとけ
861デフォルトの名無しさん:2008/10/11(土) 01:30:34
どうすればいいかわかりません。
どなたか自己解決してください。
862デフォルトの名無しさん:2008/10/11(土) 04:21:35
カオスだな・・・w


単語一つでググったら、あっさり同じ質問と回答が出てきた
863デフォルトの名無しさん:2008/10/11(土) 05:20:29
可変引数ってこれくらいしかやり方無いですか?
***1と***2のところが機種、コンパイラ依存みたいなんですが

#include <stdarg.h>
#include <stdio.h>

#define print(...) print_(__VA_ARGS__,NULL) // ***1

void print_(char *p, ...){
va_list L;
va_start(L, p);
L = (char *)L - sizeof(char*); // ***2
char *ch;
while((ch=va_arg(L, char*))!=0)puts(ch);
va_end(L);}


int main(void){ print("alpha", "beta", "gamma","saigo"); }
864デフォルトの名無しさん:2008/10/11(土) 05:29:24
boost::formatみたいな可変引数もどきとか
865デフォルトの名無しさん
スマートポインタをメンバに持つクラスで、コピーコンストラクタを自作する必要はありますか?