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

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.47【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1200464091/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
2デフォルトの名無しさん:2008/02/05(火) 01:31:04
2get
3デフォルトの名無しさん:2008/02/05(火) 01:51:09
C はもういいだろ
4デフォルトの名無しさん:2008/02/05(火) 03:58:45
int *p;
p=new int[3];
deleteせずに
p=new int[4];
deleteせずに
p=new int[2];
とした場合どうなりますか?
5デフォルトの名無しさん:2008/02/05(火) 04:39:44
>>4
p は最後の new int[2] で確保された配列の先頭を指す。
前2つの new で確保された配列を破棄する手段はなくなっている。
6デフォルトの名無しさん:2008/02/05(火) 06:52:35
>>5
ありがとうございます。領域の再利用も破棄もされないまま新たに確保されちゃうんですね
新たにnewするまえにdeleteを必ずつけるようにします
7デフォルトの名無しさん:2008/02/05(火) 07:05:31
>>6
入門書買えやカス!
8デフォルトの名無しさん:2008/02/05(火) 07:18:25
>>7
うっせーカス!
9デフォルトの名無しさん:2008/02/05(火) 07:20:47
>>8
そうだよな! ネットの入門サイトにも載ってるよな!
10デフォルトの名無しさん:2008/02/05(火) 09:58:32
vector<string> v;
として、vを
{"AAAAAA","BBBBBB","CCCCCC","DDDDDD","EEEEEE"};
という内容で初期化したいときは、push_back()とかで1つずつ代入するしかないですか?
11デフォルトの名無しさん:2008/02/05(火) 10:51:55
>>10
イテレータを受け取るコンストラクタを使うといい。
コンストラクタと同じ引数で assign() というメンバ関数もあるから覚えとこう。
12デフォルトの名無しさん:2008/02/05(火) 11:36:57
>11
ありがとうございます。
でもやり方がわかりませんでした。もう少し教えてください。

std::string a[] = {"AAAAA", "BBBBB", "CCCCC", "DDDDD"};
std::vector<std::string> v(a);
これだと、コンパイルエラーになってしまいました。
invalid conversion from 'std::string*' to 'unsigned int'
どう書けばよいですか?
13デフォルトの名無しさん:2008/02/05(火) 12:13:11
>>12
イテレータを受け取るコンストラクタを使えってばよ。
14デフォルトの名無しさん:2008/02/05(火) 12:20:42
>>13
イテレータを渡したいけど、どこにあるのかわかりません
15デフォルトの名無しさん:2008/02/05(火) 12:28:14
>>14
配列要素へのポインタはイテレータとして使える。
16デフォルトの名無しさん:2008/02/05(火) 12:34:21
>>15
ありがとうございます。
std::string a[] = {"AAAAA", "BBBBB", "CCCCC", "DDDDD"};
std::vector<std::string> v(&a[0], &a[3]);
で、できました!
17デフォルトの名無しさん:2008/02/05(火) 12:57:07
それだと"DDDDD"は収容されないけどな。
18売国まるはん:2008/02/05(火) 13:11:26
パチンコスレで遠隔、ホルコン、サクラ、マネーロンダリングなどについて書き込むと渋谷マルハン社員やマルハンに依頼された
ネット工作会社がスレ荒らしをしてスレが機能停止します。
↓↓工作員の荒らしのやり方↓↓
2008/01/10(木)ID:iA54nBU50
■■■■マルハン総合スレッド 9■■■■http://money6.2ch.net/test/read.cgi/pachij/1187021165/783-784
【宮崎県都城市】パチ事情そのAhttp://money6.2ch.net/test/read.cgi/pachij/1187189246/658-659
【山と川】宮崎県児湯付近PART1【自然イパーイ】http://money6.2ch.net/test/read.cgi/pachij/1188235164/471-472
【基地外が大暴れ4】エスパス日拓総合スレ【18発目】http://money6.2ch.net/test/read.cgi/pachij/1188885488/401-410
2008/01/13(日)ID:1HLcWzUK0
【基地外が大暴れ4】エスパス日拓総合スレ【18発目】http://money6.2ch.net/test/read.cgi/pachij/1188885488/461-462
■■■■マルハン総合スレッド 9■■■■http://money6.2ch.net/test/read.cgi/pachij/1187021165/809-810
【香川】パーラーグランドのスレ2【徳島】http://money6.2ch.net/test/read.cgi/pachij/1188315438/324
【延岡】宮崎県北情報PART3【日向】http://money6.2ch.net/test/read.cgi/pachij/1196865970/186

工作員に荒らされ機能停止したスレ
■■■■マルハン総合スレッド 9■■■■http://money6.2ch.net/test/read.cgi/pachij/1187021165/
【山崎】MPT渋谷パート9【シャネル】http://money6.2ch.net/test/read.cgi/pachij/1197771701
【基地外が大暴れ4】エスパス日拓総合スレ【18発目】http://money6.2ch.net/test/read.cgi/pachij/1188885488
MPT渋谷はマルハン・パチンコ・タワー渋谷の略です。

パチンコ産業は荒らすことでレスとレスの間を空けて読む気をなくさせたり
マネーロンダリング、さくら、ホルコン、遠隔、などの風評被害を最小限に抑えようとしてる。

新スレ→○○○マルハンパチンコタワー渋谷パート10○○○
★★★★★このスレの解説★★★★★を読んでみるとよく判る。
http://money6.2ch.net/test/read.cgi/pachij/1201304777/52-54

19デフォルトの名無しさん:2008/02/05(火) 13:29:53
assign()のソースを出し渋ってる奴から使えと言われてもねー
20デフォルトの名無しさん:2008/02/05(火) 15:11:24
はじめまして。今までCの学習用開発環境としてvmware上のFreeBSDでemacsを使ってきた者です。
何かと不便なのでwindows上で開発環境を整えようと思うのですが、何かお勧めのソフトはありますでしょうか?
21デフォルトの名無しさん:2008/02/05(火) 15:15:20
>>20
cygwin
22デフォルトの名無しさん:2008/02/05(火) 15:24:55
>>20
Eclipse + CDT
23デフォルトの名無しさん:2008/02/05(火) 15:47:35
このような構造体があるとして
struct KOUZOUTAI{
 std::vector<int> Array;
 int nNum;
 std::string str;
};

KOUZOUTAI g_Kouzoutai;

std::ofstream fout;
fout.write( (char*)(&g_Kouzoutai), sizeof( g_Kouzoutai ) );

こんな風に構造体を書き込んでおきます。

このデータを次に読み込みたい場合、
KOUZOUTAI data;
fin.read( (char*)(&data), sizeof( data ) );

こうやって読み込むと配列の部分が正常に読み込めません。
何かいい方法はありますか?
24デフォルトの名無しさん:2008/02/05(火) 15:53:06
>>23
ありません。つーか、そもそもそれではvectorは書き込まれていない筈です。ご愁傷様。
25デフォルトの名無しさん:2008/02/05(火) 15:56:15
std::vectorの中身をserialize/unserializeする関数を作成して、保存/読み込み時にその関数を経由させる。
26デフォルトの名無しさん:2008/02/05(火) 15:58:56
動的配列はメモリが無条件に動的になるわけじゃなく、
動的配列を実現できるようなメンバ関数でアクセスするから動的配列たりうるわけで。
エレベーターのボタンを押さずに扉こじ開けてもエレベーターには乗れないでしょ?
27デフォルトの名無しさん:2008/02/05(火) 16:01:53
その例えもどうかと思う。
28デフォルトの名無しさん:2008/02/05(火) 17:20:39
ただの配列なら書き込めますか?
29デフォルトの名無しさん:2008/02/05(火) 17:21:42
はい。
30デフォルトの名無しさん:2008/02/05(火) 17:26:50
わかりました
ありがとうございました
31デフォルトの名無しさん:2008/02/05(火) 19:03:05
下記のコードはBCB6で通りません。

template<typename FunctionPtr>
struct FunctionTraits;

template<typename ResultType,class ClassT>
struct FunctionTraits<ResultType (ClassT::*)(void)>
{
typedef ClassT ClassType;
};

テンプレートの関数ポインタによる特殊化でメソッドのクラスを推測することは不可能なんでしょうか。
32デフォルトの名無しさん:2008/02/05(火) 19:35:31
VCでは通ったが。
33デフォルトの名無しさん:2008/02/05(火) 19:46:16
>>31
部分特殊化は VC6 あたりでも対応してなかったと思う。
コンパイラが対応してないのはありうると思う。
34デフォルトの名無しさん:2008/02/05(火) 20:08:26
とりあえずBCB2007で通るか検証してみては
35デフォルトの名無しさん:2008/02/05(火) 21:20:13
最近Cを勉強し始めたのですが、とりあえずチンチロリンでも
作ってみろというようなことをいわれました。

早速やってみようと思ったのですが、何から手をつけていいのか
さっぱりです。何か良い書籍などあるでしょうか?
チンチロリンのサンプルプログラムを見てみるのも勉強になると
いわれたので、検索してみたのですがサンプルが無く困っています。

どうかよろしくお願いします。
36デフォルトの名無しさん:2008/02/05(火) 21:47:25
本屋に行って何冊か立ち読みしてみるか、ぐぐればいいと思うよ
37デフォルトの名無しさん:2008/02/05(火) 21:58:18
>チンチロリンのサンプルプログラムを見てみるのも勉強になると
>いわれたので
簡単にそんなものが見つかるのが前提のアドバイスにワロタw
でも、そういう簡単なゲームを作るのはいい練習になると思うよ。

とりあえず、今勉強に使ってる本かサイトか知らんが
その知識だけで自分で作ってみるといいよ。
多分いろいろと汚いプログラムになりはするとは思うけど、
そうやって作ってみた後にサンプルなり本なりを読むと、
どこがマズかったのかってのがよく分かっていいと思うぜ。
38デフォルトの名無しさん:2008/02/05(火) 22:03:38
>>36
今は、手元にある入門書とぐぐって何とかやってる状態です。
何冊か立ち読みして、よさそうなのをもう1冊買ってみようかと
思います。ありがとうございます。

>>37
簡単に見つかるものじゃないんですね・・。
なんとか形にしてみてから調べてみることにします。
ありがとうございます。
39デフォルトの名無しさん:2008/02/05(火) 23:41:22
VC9ですけど、
std::exceptionにうにこーど入れると文字が壊れますか?
40デフォルトの名無しさん:2008/02/05(火) 23:43:58
>>39
[std::exception unicode]でググって速効。
http://jinguru.blog86.fc2.com/blog-entry-10.html
41デフォルトの名無しさん:2008/02/05(火) 23:56:32
やっぱりそうですか。
42デフォルトの名無しさん:2008/02/05(火) 23:59:49
UTF-8なら入れられると思う。そこまでする必要があるかは別として。
43デフォルトの名無しさん:2008/02/06(水) 05:39:37
コンソールアプリケーションで、ユーザにインプットをもらって処理をするコードがあります。
その時、
int a;
cin >> a;
として、入力が数字ではなかったとき、変数aにはなにも代入されず、
ユーザが行った入力はどこかのバッファに溜まってる
のでしょうか。その次の入力から動作がおかしくなります。
あと、もし上記が正しいとすると、ユーザからの入力を受け取る処理は、
とりあえずstringで受けるべきなのでしょうか?
44デフォルトの名無しさん:2008/02/06(水) 10:57:57
>>43
intには数字しか読込めない。今の場合、何も読込まれずに
cinにはfailbitが立つ。cin.clear()か何かでgoodbit立てない
限り次の読み込みは出来ない。stringにすべきかどうかは何を
読み込むかによる。
45デフォルトの名無しさん:2008/02/06(水) 11:34:06
>>44
ありがとうございます。自分でも調べてみたのですが、

int a;
cin >> a;
入力データを使って処理する
cin.clear();
cin.ignore(numeric_limits<int>::max(),'\n');

とするとcinが元の状態に戻りました。
ここで、clear()はgoodbitを立てるものだとして、
ignore()は指定文字数分か指定した文字(上記だと'\n')が出るまで
入力値をバッファから消す、という処理ですよね。

cinの入力ってこう書かないとだめなのでしょうか?
(結構面倒かも、と思った)
46デフォルトの名無しさん:2008/02/06(水) 11:59:49
Win32APIなんですがnewで確保した領域をWM_DESTROY:がきたときにdeleteしたら
コンパイル時はエラーでないけど、実行してnewで確保した後プログラムを終了
(WM_DESTROYが送られる)したらエラーがでるんですが、何故ですか?
WM_CLOSEでならdeleteしてもエラーでないんで問題は無いんですが興味本位で
47デフォルトの名無しさん:2008/02/06(水) 12:16:07
>>45
入力フォーマットの仕様がどうなってるのかわからないから
なんとも言えないな。任意の値が入力されるならgetlineで
一行読込んでstring解析したほうがいいかも。
48デフォルトの名無しさん:2008/02/06(水) 12:21:08
>>46 どうせメモリ破壊や二重解放だろ。
49デフォルトの名無しさん:2008/02/06(水) 14:18:30
doubleをcoutを使って出力するときに、かならず小数点以下2桁までを
出力するようにしたいのですが、どうすればよいですか?
double amount = 3.33333;
cout << amount;
=> 3.33
どうかお願いします。
50デフォルトの名無しさん:2008/02/06(水) 14:27:18
今までソフトのバイナリいじったりして満足してたんですが
これからCを始めようと思ってます。
(とりあえず、Cが基本だからやっとけ!と、どこかで見たので)

その際、アルゴリズムを先に学んだ方がいいですか?
周りに技術者がいないので、ネットで勉強する形になりますが・・。
51デフォルトの名無しさん:2008/02/06(水) 14:35:04
>>50
すみません
書き込む場所間違えました・・。

吊って来るんで許してください
52デフォルトの名無しさん:2008/02/06(水) 14:47:22
49です。
ios::rightとかその他諸々を使って出来たみたいだったのですが、
次回必要になった時に絶対わすれてそうだったので、sprintf()を使ってやりました。
失礼しました。
53デフォルトの名無しさん:2008/02/06(水) 14:48:25
stringは、値渡しですか
54デフォルトの名無しさん:2008/02/06(水) 14:50:57
値渡しでも参照渡しでもポインタ渡しでもお好きな方法をどうぞ
55デフォルトの名無しさん:2008/02/06(水) 14:54:21
コンパイラに任せたときは値渡しですか
56デフォルトの名無しさん:2008/02/06(水) 14:57:04
文字列 は参照ですが、stringもそうなりますか
57デフォルトの名無しさん:2008/02/06(水) 15:06:37
>>49
<iomanip>ヘッダ
setprecisionマニピュレータを使う。

double amount = 3.33333;
streamsize oldprec = cout.precision();
cout << setprecision(3) << amount << setprecision(oldprec) << endl;
58デフォルトの名無しさん:2008/02/06(水) 15:17:12
しかし1の位が0だと小数点以下が3ケタになってしまいます

#include <iostream>
#include <iomanip>

int main() {
   using namespace std;
   double amount=3.33333;
   double aaa=0.3333;
   streamsize oldprec = cout.precision();
   cout << setprecision(3) << amount << ' ' << aaa << setprecision(oldprec) << endl;
}

$ bjam precision-run
3.33 0.333

EXIT STATUS: 0

こういう場合は文字列処理に持っていくしかないですかねぇ?
59デフォルトの名無しさん:2008/02/06(水) 15:34:32
>>55
コンパイラは自動的にプログラムを書いたりはしてくれませんので、コンパイラに任せるなどということはできません
コンパイラは あなた が書いた通りに動きます
>>56
文字列(=文字の配列)への参照っていうと、こういうのでしょうか
void foo(const char(&s)[6]) {
printf("%s\n", s);
}
int main() {
foo("Hello");
}
あんまりやらないと思いますが
6058:2008/02/06(水) 15:40:26
#include <iostream>
#include <sstream>
#include <cassert>

using namespace std;

string foo (double n) {
  ostringstream os;
  string s;
  os << n;
  assert(os.str().size() >= 4);
  s = os.str();
  string::size_type b=0, e=0;
  b = s.find('.');
  e = b+3; --b;
  return s.substr(b, e);
}
int main() {
   double amount=3.33333, aaa=0.3333;
   cout << foo(amount) << ' ' << foo(aaa) << endl;
}
$ bjam
3.33 0.33

よくわからないので適当にsstreamで
61デフォルトの名無しさん:2008/02/06(水) 15:41:03
>>58
cout.setf(ios::fixed, ios::floatfield); をcout前に追加
setprecision(3) → setprecision(2)
62デフォルトの名無しさん:2008/02/06(水) 17:21:15
普通小さくするのがぬ゛うんキャストじゃないの?
63デフォルトの名無しさん:2008/02/06(水) 17:56:43
>>62
ごめん、よくわからない
64デフォルトの名無しさん:2008/02/06(水) 18:59:44
MacOSXとGLUTの組み合わせで◯◯.appというディレクトリを作って
起動させると、はじめカレントディレクトリは
ルートディレクトリになってるんですけど
glutInit()を通過すると、◯◯.app/Contents/Resourcesが
カレントディレクトリになってんですよ
なんでこんな妙なところに行っちゃうんですかね

ちなみに◯◯.appの中身は以下の通りです
◯◯.app/Contents/Info.plist <--謎
◯◯.app/Contents/MacOS/○○.exe <--実際に動くc++コード
◯◯.app/Contents/Resources/icon.icns <--アイコンの絵
65デフォルトの名無しさん:2008/02/06(水) 19:21:04
D3DPRESENT_PARAMETERS d3dpp;
::ZeroMemory(&d3dpp, sizeof(d3dpp));



D3DPRESENT_PARAMETERS d3dpp = {0};

はちがいますか?
66デフォルトの名無しさん:2008/02/06(水) 19:23:40
詰め物
67デフォルトの名無しさん:2008/02/06(水) 19:30:09
>>64
そこがアプリケーションのリソースを置く場所だから、
親切に(あるいは余計なお世話か)移動してくれてるんじゃないかな
68デフォルトの名無しさん:2008/02/06(水) 20:39:50
>>67
なるほど
Glutで何かしているのではなく
◯◯.exeに引数で渡してるんですね。
そんな気がしてきました。
ちょっとチェックしてみます。
69デフォルトの名無しさん:2008/02/06(水) 22:00:07
>>48
NULLポインタdeleteって問題ないんじゃないの?
70デフォルトの名無しさん:2008/02/06(水) 22:03:06
>>69
二重解放つったら解放したアドレスをもっかい解放のことだろ?
71デフォルトの名無しさん:2008/02/06(水) 22:04:35
deleteしただけで、0(NULL)になってるとは限らないんじゃないの?
72デフォルトの名無しさん:2008/02/06(水) 22:32:43
とりあえず gcc だとなってないな
73デフォルトの名無しさん:2008/02/06(水) 23:35:43
質問です。g++を使っています。O2 で最適化してます。

クラスの中で定義した関数は勝手に inline となるのでしょうか?
inline をつけても意味は無いのでしょうか?
74デフォルトの名無しさん:2008/02/06(水) 23:38:40
deleteした後自分で0をポインタに代入するというTipsがある位だからな
75デフォルトの名無しさん:2008/02/06(水) 23:44:29
>>73
inline指定してるのと同じになる。
実際にinline化されてるかはコンパイラ次第。
76デフォルトの名無しさん:2008/02/06(水) 23:48:07
ありがとう。何か勘違いしてたみたい
deleteした後nullになるわけじゃないのね
WM_DESTROYが来た時点ではOSかが自動的にdeleteしちゃってるから多重解放
でエラーでかうのかな
77デフォルトの名無しさん:2008/02/07(木) 00:42:46
OSは自動的にdeleteなんてしません
78デフォルトの名無しさん:2008/02/07(木) 00:47:50
libhoge.so
をスタティックリンクすることってできるんでしょうか?
79デフォルトの名無しさん:2008/02/07(木) 00:54:20
はい。それがスタティックリンクできるようなアーカイブやオブジェクトモジュールであれば。
80デフォルトの名無しさん:2008/02/07(木) 03:40:14
>>77
じゃあ何でエラーでるの?
newしたまま終了してしまっても最悪OSがエラー処理として解放してくれるって聞いたけど
81デフォルトの名無しさん:2008/02/07(木) 05:19:50
>>80
エラーが出る事と自動的にdeleteする事を同列に考えるなよ
そもそもソース出してないのに的確な答えが出せると思える?
つーか自分で考えて答え出すか出たんなら帰れよ、必要最低限のレスは付いたんだから
82デフォルトの名無しさん:2008/02/07(木) 05:55:50
的確な答じゃないなら断言口調で書くなよ、紛らわしい。
83デフォルトの名無しさん:2008/02/07(木) 06:04:00
>>81
その考えをおまえが否定したから聞いてきてるんだろ
84デフォルトの名無しさん:2008/02/07(木) 06:42:38
vector って大きさが可変のはずですが、vectorの配列のポインタ操作ってうまくいくのでしょうか?


たとえば以下のように double の vector の配列を作ったとします。

std::vector<double> a[3][4];

この vector 配列の要素ごとに違う回数だけ push_back() で値を入れたとします。
そして vector のポインターを引数にとる以下の関数があり

void hogehoge (std::vector<double>* arg ){

 for(std::vector<double>::const_iterator it=arg[0].begin();
  it!=arg[0].end();
  it++){
   std::cout<<"arg[1] "
 }
}

その引数に a[1] を以下のように入れた場合は

hogehoge(a[1]);

arg[0]というのは a[1][0] をちゃんとさしてくれるのでしょうか?
85デフォルトの名無しさん:2008/02/07(木) 06:44:38
否定したんじゃなくて、ありがちなパターンに陥っていそうだから指摘しただけだろ。
86デフォルトの名無しさん:2008/02/07(木) 07:16:58
>>84
当然さす
87デフォルトの名無しさん:2008/02/07(木) 07:18:13
>>80
newしたまま終了って、main/WinMain すら終了した後の話だぜ
8884:2008/02/07(木) 07:20:43
>>86
ありがとう!
ってことは sizeof(vector<double> は要素の数にかかわらず値は変わらないって事か。
不思議。
89デフォルトの名無しさん:2008/02/07(木) 07:23:40
>>88
意味が分からん。

ポインタに [0] をつけたら
そのアドレスにあるオブジェクトを指す。
極めてシンプルな答え。
9084:2008/02/07(木) 07:30:44
メモリを動的に作ってるからコンテナの要素が増えてもポインタは同じ所にあるって事か
91デフォルトの名無しさん:2008/02/07(木) 07:31:39
vectorの中身はnewで確保したメモリへのポインタ(と管理情報)だからな
92デフォルトの名無しさん:2008/02/07(木) 07:35:21
>>88
要素自体は動的確保されているからな
93デフォルトの名無しさん:2008/02/07(木) 07:35:52
いいえ。
94デフォルトの名無しさん:2008/02/07(木) 09:42:52
vectorの中の要素をソートしたいのですが、そのとき、自分で定義した関数によって
ソートしたいです。どうすればよいですか?
95デフォルトの名無しさん:2008/02/07(木) 09:45:44
vectorは連続領域に格納される(配列と同じように扱える)から普通にソートしたらいい。
96デフォルトの名無しさん:2008/02/07(木) 10:00:45
>>94
std::sort
97デフォルトの名無しさん:2008/02/07(木) 14:14:42
スタティックリンクとかシャードリンクとかそのあたりのことが勉強できるサイトありませんでしょうか?
98デフォルトの名無しさん:2008/02/07(木) 14:26:10
>>96
sort(vec.begin(), vec.end(), func);
と書きたい時、funcはどういう風に書けばよいでしょうか?
class func : public binary_function
{
bool operator()(const string &a, const string &b){}
};
と書いてみたのですが、コンパイルも通りません。
どうかお願いします。
99デフォルトの名無しさん:2008/02/07(木) 14:29:08
binary_functionでぐぐれ
100デフォルトの名無しさん:2008/02/07(木) 14:30:57
>>98
厳密に言うとstrict weak orderingを満たすように書く
ことになるが、

struct func : public binary_function
{
bool operator()(const string &a, const string &b) {
    return a < b; //辞書順で昇順
}
};

sort( vec.begin(), vec.end(), func() );

とかでどう?
101デフォルトの名無しさん:2008/02/07(木) 14:31:04
質問です。
VC6.0で自前のライブラリをまとめたStatic Link Libraryを作っています。
そのライブラリを実際に他のプロジェクトで使う際、リンクのところで以下のように躓きました。

・すでに LIBCMTD.lib(crt0dat.obj) で定義されています
これを筆頭に、大量にリンク警告がでました。
調べたところ
ttp://m--takahashi.com/bbs/pastlog/08900/08806.html
libの方はシングルスレッドで。テストプロジェクトのほうはマルチスレッドでコンパイルしているのが問題のようでした。
両方マルチスレッドにしたところ…

・"libcmt.lib" は他のライブラリの使用と競合しています
今度はこれだけでました。
調べたところ
ttp://m--takahashi.com/bbs/pastlog/03900/03888.html
libがReleaseコンパイルで、テストプロジェクトがDebugコンパイルなのが悪いようでした。
libをRelease版とDebug版の両方をつくり、適切にリンクするようにしたところ、エラーがきえました。

ここで疑問なのですが、今後の汎用性を考えるとlibは
・シングルスレッドDebug版
・シングルスレッドRelease版
・マルチスレッドDebug版
・マルチスレッドRelease版
をそれぞれ用意しておかなければならないのでしょうか?

一般的に用意されている"winmm.lib"などは、何も考えずにstdafx.hに
#pragma comment(lib, "winmm.lib")
と書いておけば、シングルスレッドだろうがマルチスレッドだろうが、DebugだろうがReleaseだろうが適切にリンクされました(警告やエラーでません)

自作のlibも同じくらい気軽に使えるようにするには、どのようにしたら良いのでしょうか?
102デフォルトの名無しさん:2008/02/07(木) 14:32:02
おっと、
>>99を見て
struct func : public binary_function<string, string, bool>
{
bool operator()(const string &a, const string &b) {
    return a < b; //辞書順で昇順
}
};

か。
103デフォルトの名無しさん:2008/02/07(木) 14:38:33
const が有った方がいいな。
104デフォルトの名無しさん:2008/02/07(木) 14:39:36
ハードディスクへの書き込みで、メモリへのキャッシュを自動で行ってくれる命令ありますか
105デフォルトの名無しさん:2008/02/07(木) 14:52:29
おっと、
>>103を見て
struct func : public binary_function<string, string, bool>
{
bool operator()(const string &a, const string &b) const {
    return a < b; //辞書順で昇順
}
};

か。おれはconstをよく忘れる。
106デフォルトの名無しさん:2008/02/07(木) 14:53:31
>>101
・Debug版は公開しちゃいけません
・現行VCはシングルスレッド版ランタイムがありません

>>104
そんな「命令」なんてあるもんですか。
107デフォルトの名無しさん:2008/02/07(木) 14:59:57
>>106
MFC等のデバッグ版DLLの再配布が禁止なだけで
自前ライブラリのデバッグ版配布は禁止じゃねえだろ。
108デフォルトの名無しさん:2008/02/07(木) 15:05:41
>>106
自前でキャッシュ用意しましたよ
109デフォルトの名無しさん:2008/02/07(木) 15:16:46
>>106
101です
お返事ありがとうございます。

>・Debug版は公開しちゃいけません
確かにそもそもDebug版は用意しておく必要ないですよね
ただ、d3d9.lib も、デバッグ版らしき d3d9d.libというものがあります。

もしかして「Debug/Releaseで自動的にリンクを変えている」なんていうのは私の妄想で
d3d9d.libは使われていないのでしょうか?

>・現行VCはシングルスレッド版ランタイムがありません
これはつまり、世の中に配布されてるlibはマルチスレッド版で作られており、
マルチスレッド版libは、シングルスレッドなプロジェクトで利用しても特に問題が起きないということでしょうか?
(実際試してみたところ、シングルプロジェクトからマルチLibを呼び出してもエラーとなりませんでした)

そもそも「_beginthreadを使うためにはマルチスレッド版にする必要がある」という認識しかもっておらず、
「マルチスレッド版にしないことによる利点」は知らないのです
110デフォルトの名無しさん:2008/02/07(木) 15:21:59
>>109
まず、デバッグ版のlibがあるやつはpragmaで切り替えてるはず。
自分の作ったlibが物によって変わるのは、そいつの中でデバッグ版や
MT版のlibを呼んでるから。

そういうの避けたければスタティックリンクしてしまうといいかも。
111デフォルトの名無しさん:2008/02/07(木) 16:08:21
>>109です
>(実際試してみたところ、シングルプロジェクトからマルチLibを呼び出してもエラーとなりませんでした)
これですが、勘違いでした。
やはり「マルチスレッド版のlibファイル」を「シングルスレッド版のプロジェクト」からリンクすると、
LINK : warning LNK4098: defaultlib "LIBCMTD" は他のライブラリの使用と競合しています; /NODEFAULTLIB:library を使用してください
となってしまいました。
(上のは、Debugマルチ版LibをDebugシングル版のプロジェクトにリンクした場合の警告です)

>>110
なるほど。hファイルあたりで、#ifdef _DEBUG やら色々としているのでしょうか。

>そういうの避けたければスタティックリンクしてしまうといいかも。
ちょっとこの意味合いがわからないのですが、詳しく教えていただけますでしょうか
どこかのサイトへのリンクでも構いません

112デフォルトの名無しさん:2008/02/07(木) 16:26:09
教えてください。
以下の式で、shinが偽になるのはなぜでしょうか?

unsigned int a =10, b = 20;
char shin = ((a - b) < (b - a));

(a - b) = -10, (b - a) = 10 なので、shin = 真になるように思うのですが。。。
113デフォルトの名無しさん:2008/02/07(木) 16:29:04
unsigned同士の演算の結果はunsigned
114デフォルトの名無しさん:2008/02/07(木) 16:32:12
int型変数(-32768〜32767)に-40000とか入れようとしたらどうなると思う?
115デフォルトの名無しさん:2008/02/07(木) 16:32:16
ありがとうございます
116デフォルトの名無しさん:2008/02/07(木) 16:37:11
>>101
コンパイラオプション/ZlってVC6にない?
これはobjファイルにLIBCMTD.LIBとかCRTへの参照を
埋め込まないようにするコンパイラオプション。
1つのlibで全てを賄えるようにもなる。

けど現実的には最適化・デバッグオプションの有無で、
少なくともRelease/Debugの2種用意すべきだと思うけど。
117デフォルトの名無しさん:2008/02/07(木) 16:48:16
>116
Zlオプションを使ったところ、DebugプロジェクトからReleaseLibを使っても警告がでなくなりました。
ありがとうございます。
(最初 Zl が ゼット・アイだと思って混乱しましたw ゼット・エルですね)

しかし、StaticLibraryの作り方を詳しく解説しているサイトって全然見当たりませんね…。

Lib側としては、Releaseだけ用意しておけばいいと思うのですがどうでしょうか?
Libがバグっていないと仮定して利用するのが前提ですけど
118デフォルトの名無しさん:2008/02/07(木) 16:51:38
>>101
winmm.libってwinmm.dllの単なるインポートライブラリでは?
VCのランタイムをリンクしないライブラリならそういった問題は当然起きない
119デフォルトの名無しさん:2008/02/07(木) 16:52:47
別にReleaseだけでもいいと思う。
DLLだとデバッグ版も提供なんて話聞かないし。
120デフォルトの名無しさん:2008/02/07(木) 17:02:19
>>118
あ、なるほど。そういえばlibにはもうひとつ「DLLとリンクするためのインポートライブラリ」という役目がありましたね。
winmmはそっちですか。
(拡張子変えればいいのになぁ…)

>>119
了解しました。

>ALL
大変参考になりました。
ありがとうございました!
121デフォルトの名無しさん:2008/02/07(木) 17:19:25
デバッグ版のlibを提供するのはlibをデバッグしてもらおうということじゃなくて、
それを使ったプログラムもLibのソースをトレースできるようにだよw
122デフォルトの名無しさん:2008/02/07(木) 17:23:39
>121
誰への返事だ??
123デフォルトの名無しさん:2008/02/07(木) 17:26:13
環境依存のレスはすべてスルーしてます
124デフォルトの名無しさん:2008/02/07(木) 17:36:05
スレタイももちろんスルーです
125デフォルトの名無しさん:2008/02/07(木) 18:04:43
template<typename T>
void foo() {
T x = T();
}

intやint*などの基本型に対してテンプレートでのデフォルト初期化
を可能にするために上のような表記が許されておりint*ポインタも渡せます。
(NULLポインタに初期化されている)

しかし、以下のポインタの初期化は許されていないのでしょうか?

int* p = int*(); //コンパイルNGでした

int i = int(); //OK
126デフォルトの名無しさん:2008/02/07(木) 18:05:37
ISO 9660ファイルを参照できるDLLとかありませんか
127デフォルトの名無しさん:2008/02/07(木) 18:28:40
>>125
それはできないけど、これならできる。
typedef int* pint;
template<typename T>
struct identity
{
  typedef T type;
};
int* p1 = pint();
int* p2 = identity<int*>::type();
128デフォルトの名無しさん:2008/02/07(木) 19:05:06
メモリが解放されてるかどうか確認する方法ってなんかあるかな?

void a( void* p ) {
if( rand() %2 ) delete p;
}

void main () {
char*pc = new char[100];
a(pc);
// pcが解放されてなかったら解放
if( soreppoino( pc ) ) delete pc;
}

みたいな。
129デフォルトの名無しさん:2008/02/07(木) 19:08:34
すまん誤爆った・・・ってここでもいいのかなこれ
130デフォルトの名無しさん:2008/02/07(木) 19:13:57
>>127
typedefで可能ということは単なるシンタックスの問題だという
ことですかね。だとしてもfoo<int*>()は結果的に
int*()となるからNGのような気もしますがね。
131デフォルトの名無しさん:2008/02/07(木) 19:31:29

リスト管理の時
リストのアイテムをdeleteしたとき、自動的に所属するリストからはずれる機能は、
stlでvectorとかlistとか使って所属リストを覚えて、リストからはずすより、
前後のポインタを持った、自己連結クラスのほうが速度的に早いですか?
というか、deleteしたとき、自動的に所属するリストから外れるtemplateみたいなもの
STLみたいな標準ライブラリにありますか?
132デフォルトの名無しさん:2008/02/07(木) 19:34:12
>>130
単純にシンタックスの問題っぽいよ

>postfix-expression:
> simple-type-specifier ( expression-listopt )
(略)
>simple-type-specifier:
> ::opt nested-name-specifieropt type-name
> ::opt nested-name-specifier template template-id
> char
> wchar_t
> bool
> short
> int
(略)
>type-name:
> class-name
> enum-name
> typedef-name
>class-name:
> identifier
> template-id

intやクラス名やtypedef名はOKだけどint*は構文に合致しないっていう・・
133デフォルトの名無しさん:2008/02/07(木) 20:03:47
>>128
そういうクラスでも用意しない限り、ありません。
つーか、そんな阿呆なメモリ管理戦略はありえません。

>>131
逆に、リストにあるオブジェクトをremoveするときにdeleteしては?
134デフォルトの名無しさん:2008/02/07(木) 20:22:12
1904年の日露戦争の際に、ロシア正教会は全教会をあげて日本に天罰を
下すように神に祈りをささげた。結局なにも天罰は降りず、ロシアは負けた。
20年後、日本で関東大震災が発生。ロシアの物理学者カピッツァはこの事実から
「神はわれわれから9光年以内にいる」と結論を下したという。
135デフォルトの名無しさん:2008/02/07(木) 20:47:14
 お、おかしいアル・・・
/'⌒`ヽ、 5年後の世界に行ったらチューゴクがなかったアル・・・
ヽ、┗ ノ  
  `ーー'        γ⌒`ヽ           /'⌒⌒ヽ、
  ,-ーー-、      .|| ̄ ̄             (     ┃  ⌒ヽ
 /  ┃  )    ||    ∧_∧       \ ━┛    )
.(.   ┃   )   ||.   ( `ハ´;)
 ヽ、__,ノ     ||  _(つ¶¶と)__
           /||'''''|  三  |    |'(⌒)
        /    '―――――`  ̄ \
        `============'
136デフォルトの名無しさん:2008/02/07(木) 20:51:06
>>132
なるほど。まあテンプレートのときのために用意されてる
規則なので、そのときだけ利用します。
ありがとうございました。

ところで、みなさんは原文の規格を持ってるんですか?
買うと4万近かったので高くてとても買えません。
137デフォルトの名無しさん:2008/02/07(木) 21:14:24
JISならオンラインで読めるじゃん。画像だけど。
138デフォルトの名無しさん:2008/02/07(木) 21:17:09
Visual C++ 6.0を使っているんですけど
C++のプログラムを実行すると

c:\program files\microsoft visual studio\vc98\include\new(16) : error C2143: 構文エラー : ';' が '<class-head>' の前に必要です。
c:\program files\microsoft visual studio\vc98\include\new(16) : error C2501: '_STD_BEGIN' : 識別名を宣言するのに、型が指定されていません。
c:\program files\microsoft visual studio\vc98\include\new(16) : fatal error C1004: 予期せぬ EOF が検出されました。

と出てしまいます。
どんなプログラムでもこのエラーが出てしまい実行できません…
どのようにすればこのエラーはなくなりますか?
139デフォルトの名無しさん:2008/02/07(木) 21:18:22
>>137
そこでドラフトですよ。
若干現規格と違うけど、
古いドラフトだとまあまあ現規格に近いから十分参考にはなる。
140デフォルトの名無しさん:2008/02/07(木) 21:25:29
>>138
必要なものが入ってないか入れる設定にしていない。

_STD_BEGINってのはSTLが使う宣言だからSTLが使えないんだろう。
(vectorでも使ってるんかね?)

俺はSTL使ってないんで後はぐーぐる先生か他の人にまかすわ
141デフォルトの名無しさん:2008/02/07(木) 21:37:29
>>137
>>139
あれ検索できないから不便ですよね。まあ無料なのでたまに見ますが。
正式版を無料で配布して欲しいですね。
142デフォルトの名無しさん:2008/02/07(木) 22:03:32
>>138
Visual C++ 2008 Expressとかだとどうなる?
143デフォルトの名無しさん:2008/02/07(木) 22:50:19
>>105
(遅くなりましたが)
ありがとうございました。
144デフォルトの名無しさん:2008/02/07(木) 23:20:56
>>128
標準では用意されていないので、人によっては解放したらその領域を指
していたポインタ変数を (* 自分で *) NULL にしておくようにしてい
る人もいる。

どっちかって言うと、バグってた時の二重解放除けとか、変な領域を壊さ
ないようにと言う防御策だが。

void a( void** p ) {
if( rand() %2 ) delete *p;
}

void main () {
char*pc = new char[100];
a(&pc);
// pcが解放されてなかったら解放
if( soreppoino( pc ) ) delete pc;
}
145デフォルトの名無しさん:2008/02/08(金) 01:48:10
確保していないのにdeleteするとバグるんですが対処法ありますか
146デフォルトの名無しさん:2008/02/08(金) 01:50:44
単独ではつかわないでコンストラクタ、デストラクタ内で使えば安全かなあ
147デフォルトの名無しさん:2008/02/08(金) 01:59:05
void a( void** p ) {
  if( rand() %2 ){
    delete *p;
    *p = NULL;   // delete後はNULLを入れておく
  }
}

void main () {
  char*pc = NULL;    // ポインタは普通NULLで初期化しておく
  if( rand() %2 )
    new char[100];
  a(&pc);
  delete pc;      // pcがNULLなら何もしない
}
148デフォルトの名無しさん:2008/02/08(金) 01:59:41
while (cin) {
...
}
という処理についてなんですが、cinって最初はとりあえずtrueになるのですか?
すると、いつfalseになるんですか?
エラーフラグがたってればfalse、それ以外はtrueになるのかな?
cinで何かデータを読み込んだ後だけtrueになるのかと思ってました。
149デフォルトの名無しさん:2008/02/08(金) 02:00:03
> new char[100];
pc = new char[100] でした。
150デフォルトの名無しさん:2008/02/08(金) 02:04:09
スタート

標準入力からデータがcinに行く

cinがtrueになる

while(cin)が評価される

というかんじなんじゃね?
151デフォルトの名無しさん:2008/02/08(金) 02:12:09
>>147
C++では汎用ポインタへのポインタって合法だったっけ。
152デフォルトの名無しさん:2008/02/08(金) 03:44:28
問題ない。
153デフォルトの名無しさん:2008/02/08(金) 03:55:20
coutとfstream(適当なファイルに対してオープン済みのもの)とのそれぞれに、ほぼ同じ処理を書くのですが、
1つの関数にまとめたいと思うのですが、どうすればいいでしょうか?

void print((型が分からない) stream) {
stream << "hogehoge" << endl;
 ...
}
こんなのも考えてみたのですが、コンパイルできず、ダメでした。
template<class T>
void print(char *filename) {
T outStream;
if (filename) outStream.open(filename);
outStream << "hogehoge" << endl;
...
}
どうかよろしくお願いします。
154デフォルトの名無しさん:2008/02/08(金) 07:25:40
>>138
new ヘッダをインクルードする前に
new をマクロで置き換えてないか?
155デフォルトの名無しさん:2008/02/08(金) 10:49:42
>>153
std::ostream
156デフォルトの名無しさん:2008/02/08(金) 11:53:19
サクラエディタのソースコードを眺めていたのですが、コメント部でよくわからない表記があります。
@param などはなんとなく想像がつくのですが、「//!<」や「/*! */」は何を意図しているのでしょうか。
どなたか教えてください。
157デフォルトの名無しさん:2008/02/08(金) 11:57:37
>>156
つ[Doxygen]
158デフォルトの名無しさん:2008/02/08(金) 11:59:11
まさに、それですね。
ありがとうございました。
159デフォルトの名無しさん:2008/02/08(金) 13:23:53
例外処理の使い方がいまいち分かりません

例外を投げたらその処理の中で解決した方が良いのか
それとも解決方法を使う側に投げっぱなしにしてしまうのか
例外をどういう形でthrowするのがいいのか

なんというか感覚的に掴みにくいというかなんというか
160デフォルトの名無しさん:2008/02/08(金) 13:25:33
無用物
161デフォルトの名無しさん:2008/02/08(金) 13:32:44
参照を返すとオブジェクトが捨てられたときに
帰ってきたものも向こうに?
162デフォルトの名無しさん:2008/02/08(金) 13:34:05
>>159
自関数の中でリカバリできるならcatchして処理すればよい
そうでないなら呼び出し元にまかせる

普通のエラー処理と同じようなもんだ
自分で処理できるならして、処理できないなら呼び出し元にエラーコードなりなんなりをreturnするだろう
エラーコードのreturnが例外のthrowに変わるだけ
163デフォルトの名無しさん:2008/02/08(金) 13:34:37
>>161
日本語で
164デフォルトの名無しさん:2008/02/08(金) 13:48:01
>>162
そういう感じで良いんですか
気軽に使えるなら使ってみようかな・・・
165デフォルトの名無しさん:2008/02/08(金) 14:03:21
とある3種類の計測器をモニターするプログラムなんですが
似てるけど若干ちがう命令が3つあるとします

この場合
クラス分けをしていくとき
計器の共通化持つクラスを基底として、それぞれの機能をもつ派生クラスを作るか

機能の共通処理をもつクラスを基底として、それぞれの計器にあわせて派生クラスを作るか

どちらが今後計器が増える可能性を加味したとき、よい設計でしょうか
166デフォルトの名無しさん:2008/02/08(金) 14:07:41
>>165
その計測器メーカに合わせるのが一番。
あるメーカは旧型機種の機能を改変しつつ新機能を作るかもしれないし、
あるメーカは旧型機種の機能を残しつつ新機能を作るかもしれない。

なんてことは兎も角、使い易いように作れば?
167138:2008/02/08(金) 15:05:04
返信遅くなってすいません!

>>140
STLは使ってなくてもこのエラーなんですよ…
Hello Worldみたいな文字を出力するだけのプログラムでも
実行できないです。

>>142
Visual C++ 2008 Express Editionで実行したらできました!
ありがとうございます。

>>154
マクロも使ってないので違うと思うのですが…

Visual C++ 6.0を使い慣れているので
どうにかして実行させたいのですが・・・
168デフォルトの名無しさん:2008/02/08(金) 15:22:22
class Fruit;
class Apple : Fruit;

std::vector<Fruit> fruits;を作ると

抽象クラスをインスタンス化できません。
と言われるです。どうするですか?
169デフォルトの名無しさん:2008/02/08(金) 15:23:31
Fruit がそういうつくりになってるんじゃないの?
170デフォルトの名無しさん:2008/02/08(金) 15:24:38
>>168
class Fruitを具体化してください。
171デフォルトの名無しさん:2008/02/08(金) 15:36:19
std::vector<Fruit*> fruits;
172デフォルトの名無しさん:2008/02/08(金) 16:14:45
コンパイラにBCCを使って数値計算をしているのですが、
しばらくプログラム実行していると、EXP: OVERFLOW ERRORと出ます。
これは、exp関数に入れた値がexp関数の扱える値(doubleの範囲)よりも大きいと言うことでしょうか?
173デフォルトの名無しさん:2008/02/08(金) 16:23:52
>>167
俺、解決方法知ってるんだが…
174デフォルトの名無しさん:2008/02/08(金) 16:25:09
vevtorにvcの_com_ptrは入りますか?
175デフォルトの名無しさん:2008/02/08(金) 16:59:55
コピー初期化もコピー代入もできるから問題ないはず。
176デフォルトの名無しさん:2008/02/08(金) 22:22:37
すいませんちょっとお聞きしたいんですが、

#include <iostream>
using namespace std;

int main(){
char ss[80] = "これは文字列です";

cout << ss[0] << ss[1];

return 0;

}

ってやって、coutで「こ」って表示されないのは、どういう理屈でしょうか??
177デフォルトの名無しさん:2008/02/08(金) 22:24:09
UTF-8 なら3バイト必要だが、そういうわけではなくて?
178デフォルトの名無しさん:2008/02/08(金) 22:34:20
>>176
ひょっとしてなんか変な文字がでたりしてるか?
179176:2008/02/08(金) 22:34:23
ぐは、そうだったんですね・・2バイトでいいんだと思ってました汗
cout << ss[0] << ss[1] << ss[2];
とやったらちゃんと表示されました。
ありがとうございましたm(_ _)m
180デフォルトの名無しさん:2008/02/08(金) 22:40:31
ちなみにWindows上だと>>176のコードで「こ」はちゃんと出た。(bcc32 / gcc@cygwin)
181デフォルトの名無しさん:2008/02/08(金) 22:44:58
それはお前がソースをSJISで書いてるだけ
182デフォルトの名無しさん:2008/02/08(金) 22:55:36
>>175

ども。
183デフォルトの名無しさん:2008/02/08(金) 23:42:34
UTF-8 だと全て3バイトって訳じゃないのが面倒なところだよな。
184デフォルトの名無しさん:2008/02/08(金) 23:43:11
>>181
UTF-16 でも出るがな。
185デフォルトの名無しさん:2008/02/09(土) 00:17:28
他で聞いてきます
186デフォルトの名無しさん:2008/02/09(土) 00:20:35
fatal error LNK1104:コンパイラは、ファイルd3d9.libを開けません
とでてしまいビルドできません
手動でリンカにd3d9.libを設定しましたが無理でした
どうすればよいのか
187デフォルトの名無しさん:2008/02/09(土) 00:33:08
ファイルはあるの?
188デフォルトの名無しさん:2008/02/09(土) 00:40:25
pathの設定はしたか?
189デフォルトの名無しさん:2008/02/09(土) 01:58:17
More Exceptional C++が届いたんだが
いきなり最初のコードがコンパイルできねえ
一気にやる気失くした。やっぱ古い本はこんな
もんかねえ。
190デフォルトの名無しさん:2008/02/09(土) 02:00:08
ちなみにコレ
VC++2008 g++ 4.0 でも不可

#include <iostream>
#include <fstream>
using namespace std;

int main(int argc, char* argv[])
{

(argc > 2
   ? ofstream(argv[2], ios::out | ios::binary)
   : cout)
<<
 (argc > 1
    ? ifstream(argv[1], ios::in | ios::binary)
    : cin )
.rdbuf();

 return 0;

}

191デフォルトの名無しさん:2008/02/09(土) 02:06:46
全く問題ないけど。まさかとは思うが、>190って2バイト空白入れたままで悪態ついているお馬鹿さん?
192デフォルトの名無しさん:2008/02/09(土) 02:15:25
コンパイルできないときはエラーメッセージを書こう

なんてのは宿題スレでも徹底されてるような気がする。
193デフォルトの名無しさん:2008/02/09(土) 02:17:41
gcc 4 で通らないな。
まあ当たり前だな。
右辺値の ofstream と左辺値の ostream(cout) だと
片方が右辺値なので右辺値にキャストして型を揃えようとするが、
この2つじゃどうやっても型を揃えられない。
194デフォルトの名無しさん:2008/02/09(土) 02:20:34
VC だと右辺値の ofstream を
テンポラリオブジェクトを作成して ofstream& にキャストしてしまえるから(拡張機能)
コンパイル通るかもしれん。
195デフォルトの名無しさん:2008/02/09(土) 04:37:38
たぶん、ここでしか聞けないのかなと思い書き込みさせてください!
File1.cppで定義・使用している複数配列 double a[10][5] を他の
ファイル(File2.cpp)でも共有して使用したいときって

(File2.cpp)
void CGridDlg::OnGdraw() //中で使用したい関数です
{
  extern double a[10][5];
 ・・・・・・・・
}

と定義すれば使用できるものなのでしょうか。単配列(a[10]等)の時は同様の
方法で使用できたのですが。複数配列になると上記ではリンクエラー
(LNK2001)がでてしまいます。環境はVC6++(MFCダイヤログベース)です。
超初心者です。Cの本を見てポインタなり、externなりが関係しそうかなと思った
のですが、なかなかいい兆しが見えなくて助けを借りたい次第です。
196デフォルトの名無しさん:2008/02/09(土) 07:49:02
>>191
ここに見やすく貼るために全角にしてるんよ

>>192
VC++2008でのエラーメッセージだがprivateメンバーにアクセスしようとしてる
らしい。
error C2248: 'std::basic_ios<_Elem,_Traits>::basic_ios' : private メンバ
(クラス 'std::basic_ios<_Elem,_Traits>' で宣言されている) にアクセスで
きません。

>>193
ostream(cout)の意味が分からないんですが。3項演算子 A ? B : C
のBがrvalueでCがlvalueだからC(ここではcout)を右辺値にしようと
するということかな?

>>194
昔の規格なりコンパイラではOKだったのかもしれんです。
197デフォルトの名無しさん:2008/02/09(土) 08:25:12
198デフォルトの名無しさん:2008/02/09(土) 08:27:28
空白orタブ <-> /**/
の置換スクリプトを希望
199デフォルトの名無しさん:2008/02/09(土) 08:28:26
>>197
>昔の規格なりコンパイラではOKだったのかもしれんです。
200デフォルトの名無しさん:2008/02/09(土) 08:55:15
>>196
左辺値の ostream の値である cout って意味ね。
エラーの理由はそれで問題ない。
201デフォルトの名無しさん:2008/02/09(土) 09:50:51
>>195
externで共有させるのはお勧めしない。
他の関数で配列を参照させるためには、ポインタを渡せばよい。
関数内のローカル変数へのポインタは、その関数実行中にしか有効にならないから、一時的にしか参照・共有できない。
202デフォルトの名無しさん:2008/02/09(土) 09:59:52
>>195
CGridDlg の private メンバ変数にして、
a の取得関数を用意すれ。

class CGridDlg {
public:
typedef double Hoge[5];
Hoge* GetA() { return m_a; }
const Hoge* GetA() const { return m_a; }
private:
Hoge m_a[10];
};

Hoge* a = grid_dlg.GetA();
a[0][0] = 1;
203デフォルトの名無しさん:2008/02/09(土) 10:37:35
猫でもわかるを買ったんですが、
超初心者の俺にはさっぱりわかりません。
何かわかりやすい本などあったら教えてください。お願いします。
204デフォルトの名無しさん:2008/02/09(土) 10:39:09
>>203
ちなみにC言語です。よろしくお願いします。
205デフォルトの名無しさん:2008/02/09(土) 10:41:09
>>203
その本で分かりにくいとかじゃなくて
さっぱり分からないというのであれば無理です、あきらめてください

それより多少分かりやすいと評判のものもありますが、大差はありません


それとも環境が用意できないとかそういうことですか?
206デフォルトの名無しさん:2008/02/09(土) 11:54:33
>>203
その本は読んだ事はないが、サンプルをぽちぽち手で入力して実行してみなされ。

手で入力して試すのが肝心。

付属CDとかダウンロードをクリックして終わりじゃ絶対に理解できない。
207デフォルトの名無しさん:2008/02/09(土) 13:26:37
>>200
なるほど。3項演算子は片方がrvalueのときは結果もrvalueになるという
ことですね。
試したところでは、static_cast<ostream>(cout)やostream obj(cout);
はできないみたいでが、そもそもostreamオブジェクトは生成できないも
のなんですか?だとしたらostreamオブジェクトであるcoutはどのように
作成されたのですかね?
208デフォルトの名無しさん:2008/02/09(土) 13:37:27
コピーしようとすると見るエラーだな
209デフォルトの名無しさん:2008/02/09(土) 13:55:53
>>207
ostreamやistreamには、引数を取るコンストラクタがある。
coutやcinはそれを使って作られるんだろう。
210デフォルトの名無しさん:2008/02/09(土) 14:04:36
>>207
static_cast<ostream&>(cout) とか ostream out(cout.rdbuf()); ならできる
211デフォルトの名無しさん:2008/02/09(土) 15:06:27
>>209
>>210
ストリームとストリームバッファには弱い結合(ストリームバッファの同期)
と強い結合(ストリームバッファの共有)ってのがあるみたいですね。
おそらく、コンソールデバイスに関連付けられたストリームバッファ
(例えばcdevという名前だったとして)というのがシステムには存在し
ていてcoutは、ostream cout(&cdev); というふうに定義されてる
んでしょうね。ストリームオブジェクトをコピーできない理由は
無制限にストリームバッファをコピーしたり(メモリの浪費)、
暗黙のうちに共有できたりしたら問題が起こるからかなと思いました。
212デフォルトの名無しさん:2008/02/09(土) 15:07:47
ストリームオブジェクトをコピーできない理由は
無制限にストリームバッファをコピーしたり(メモリの浪費)、
暗黙のうちに共有できたりしたら問題が起こるからかなと思いました。

>>208さんへのレスでした。
213デフォルトの名無しさん:2008/02/09(土) 15:24:28
coutをコピーするというのは意味がわからん、ってのもあるかもね
コンソール自体が2個に増えるわけじゃあるまいし
214デフォルトの名無しさん:2008/02/09(土) 15:33:48
>>198
つかってやってください
ttp://pc11.2ch.net/test/read.cgi/unix/997605845/55
215デフォルトの名無しさん:2008/02/09(土) 16:41:15
>>205
環境が用意できないです。
それでもあきらめた方がいいですか?
216デフォルトの名無しさん:2008/02/09(土) 16:49:08
>>203
そのままの意味が分からないけど、HDVも圧縮された素材ですよ。
H.264とは異なる方式で。

ttp://ja.wikipedia.org/wiki/HDV
217デフォルトの名無しさん:2008/02/09(土) 16:52:43
あ、なんかすげー誤爆ってた。失礼orz
218デフォルトの名無しさん:2008/02/09(土) 16:58:08
環境が用意できないっつー意味がわからん。
Macしか持ってないのにWin32前提の入門書買っちゃったってことかね?
219203:2008/02/09(土) 17:03:06
すいません。アフォで…
自分は今、第二章で止まってます。
と言うのも、いきなり「では、ソースを見てみましょう」となり、
「開発環境によってコンパイルの手順が異なります」
↑この時点でわかりません。

自分には向いてないのかな…orz
220デフォルトの名無しさん:2008/02/09(土) 17:05:32
void hoge(const char* name){ char* piyo = name + (sizeof(char) * 5); }

こんなようなことはなんで出来ないんでしょうか?
文字列nameの5文字目のポインタ(&(name[4]))をpiyoに格納したいです

error C2440: '=' : 'const char *' から 'char *' に変換できません。
このようなエラーが出るのですが正直ここでなんでこのエラーがでるんだ?といった感じです
221デフォルトの名無しさん:2008/02/09(土) 17:12:11
const char *piyo 
222デフォルトの名無しさん:2008/02/09(土) 17:13:49
>>220
書き換え可能なポインタ(char *)に書き換え不能なポインタ(const char *)を代入しようとしているからです。
void hoge(const char * name)
{
char const * piyo = & name[4];
}
こう書けば問題ありません。
223デフォルトの名無しさん:2008/02/09(土) 17:14:36
char *のconst性を除去してるから。入れたいならpiyoもconst char *にする。
hoge内で文字列を弄りたいなら引数をchar *にするべき。
引数は変えられず、どうしてもchar *が必要ならconst_cast<char *>(最後の手段)
224220:2008/02/09(土) 17:17:20
>>221-223
ありがとうございます。
よく考えたらいじる必要はないのでpiyo側をconstにしました
225デフォルトの名無しさん:2008/02/09(土) 17:18:01
>>219
とりあえず、なにか揮発環境は持っているのか?
226デフォルトの名無しさん:2008/02/09(土) 17:18:34
> name + (sizeof(char) * 5)
彼は大丈夫だろうか。
227デフォルトの名無しさん:2008/02/09(土) 17:19:23
>>225
はい。
ジクロルボスは揮発するので大丈夫です。
228デフォルトの名無しさん:2008/02/09(土) 17:22:30
俺のチームのメンバも先週揮発したぜ。
229デフォルトの名無しさん:2008/02/09(土) 17:23:57
ちょっと待て、それは「蒸発」じゃないのか?
230デフォルトの名無しさん:2008/02/09(土) 17:24:28
>>226
それって問題あるのか?パッと見わからん
231デフォルトの名無しさん:2008/02/09(土) 17:26:23
>>230
char であるときには問題にはならないが int とかになると…
232デフォルトの名無しさん:2008/02/09(土) 17:26:24
>>230
>220にはこう書いてある。
>文字列nameの5文字目のポインタ(&(name[4]))をpiyoに格納したいです
233デフォルトの名無しさん:2008/02/09(土) 17:26:31
>>229
そうだな。揮発は性質で、蒸発は現象だからな。
234デフォルトの名無しさん:2008/02/09(土) 17:27:47
>>231
いや、だいじょうぶだろw
ちゃんとintの大きさに対応してくれるよw
235デフォルトの名無しさん:2008/02/09(土) 17:27:55
>>230
ポインタは自動的にそのサイズ分進むから、sizeofを掛ける必要はない、とかかな?
236デフォルトの名無しさん:2008/02/09(土) 17:28:25
>>234
ごめん間違えた
237デフォルトの名無しさん:2008/02/09(土) 17:28:46
ConceptGCCで、190のコードのofstreamとifstreamを
ostream&&とifstream&&にstatic_castしたものを食わせたらどうなるかと試してみたが、
エラーだったorz。右辺値参照はライブラリまで及んでいなかった。
238デフォルトの名無しさん:2008/02/09(土) 17:29:06
sizeof(*name)にするべきとか。
239デフォルトの名無しさん:2008/02/09(土) 17:29:46
>>238
阿呆ですか?
240デフォルトの名無しさん:2008/02/09(土) 17:30:00
>>219
適当に c 入門 初心者とかでぐぐれば環境の入れ方から説明してるとこがきっと見つかるよ
241203:2008/02/09(土) 17:46:21
>>225
>>240
すいません。もう一度調べなおしてみます。
242デフォルトの名無しさん:2008/02/09(土) 17:47:29
>>238-239
&5[name] でいいだろ。
243デフォルトの名無しさん:2008/02/09(土) 17:49:48
>>242
>232
244デフォルトの名無しさん:2008/02/09(土) 17:58:03
char ch='a';
cout <<(int) ch << '\n'; // 97
int dt=97;
cout << (char)dt<< '\n'; // 'a'
とできるのに、

wchar_t ch1='あ';
cout <<(int) ch1 << '\n'; // 33340
int dt1=33440;
cout << (wchar_t)dt1<< '\n'; // 0x82a0

と'あ'がでないで、82a0が出るのはなぜですか?
(82a0は33440の16進です)
245デフォルトの名無しさん:2008/02/09(土) 18:03:03
class test{
 char* str;
 int len;
public:
 test(const char* str);
};
test::test(const char* str0){
 len = strlen(str0);
 str = new char[len+1];
}

とすると
(msvcr80d.dll) でハンドルされていない例外が発生しました: 0xC0000005: 場所 0xccccccc0 を読み込み中にアクセス違反が発生しました。
こんなようなエラーがでます、いろいろとコメントアウトして試してみていたのですが
str = new char[len+1];部分でエラーが出ているようです、これを
str = new char[256];のようにするとエラーはでないのですが、定数でなければならないとかないですよね?
一体なんででしょうか?
246デフォルトの名無しさん:2008/02/09(土) 18:10:38
書いてないところのバグを見つけろって言う話?
247デフォルトの名無しさん:2008/02/09(土) 18:10:39
>>245
そういう時は先ず、str0の長さが実際にいくつだったのかを確認しましょう。
248デフォルトの名無しさん:2008/02/09(土) 18:10:53
>>245
その部分は問題ないように見える。
256にするとエラーが出ないところからみて、
どこかでバッファオーバーフローしてるんじゃない?
249245:2008/02/09(土) 18:12:34
>>246-247
えっとすみません、str0には固定の文字を入れるようにして試しています
16文字の文字列でして、コンストラクタ内でlenの長さを表示させるときちんと16文字になっています。
また、同じくコンストラクタ内でstr0を表示させるときちんと渡した16文字の文字列が表示されます
250245:2008/02/09(土) 18:15:42
main内に
char* buff = "abcdefghijklmnop";
test hoge(buff);
これだけです
余計な部分を全てコメントアウトしてるのでこれでコードは全てです
251デフォルトの名無しさん:2008/02/09(土) 18:16:08
実行部分をみせろ。
test test1("abcdabcdabcdabcd");
ならまったく問題ないはず。
252251:2008/02/09(土) 18:22:16
ごめん、違うな
253デフォルトの名無しさん:2008/02/09(土) 18:23:47
>>245
そこを変えたら動くからといって、バグの出元がそこだとは限らない
ぜんぜん関係なさそうな別の場所も疑う必要がある
254デフォルトの名無しさん:2008/02/09(土) 18:24:42
strにはアクセスしないの?
test内でstrcpyしなくていいのか?
なにがやりたいんだ?
255245:2008/02/09(土) 18:36:41
>>253
提示した部分以外をコメントアウトしているのですがエラーが出る状態です

>>254
その部分が原因かとも疑ってコメントアウトさせているのですがエラーが出る状態です

test::test(const char* str0){
 len = strlen(str0);
 str = new char[len+1];
 strcpy_s(str, len+1, str0);
 printf("%s\n", str0);
 printf("%d\n", len);
 printf("%s\n", str);
}
こんな具合にしますと
abcdefghijklmnop
16
abcdefghijklmnop
と表示されますがしっかりエラーがでます
256デフォルトの名無しさん:2008/02/09(土) 18:44:34
mainってことは、MFCとかは使ってないわけか……
リビルドしたら直るとか言う落ちはないよな?
257デフォルトの名無しさん:2008/02/09(土) 18:44:45
>>255
余計なincludeもコメントアウト。
さらにエラーが無くなるまでコメントアウト。
新規プロジェクトと作成して、必要なコードだけ貼り付けて動かしてみる。
258デフォルトの名無しさん:2008/02/09(土) 18:44:52
おかしいなあ、ちゃんと動くぞよ。
259デフォルトの名無しさん:2008/02/09(土) 18:46:07
class test{
 char* str;
 int len;
public:
 test(const char* str);
};
test::test(const char* str0){
 len = strlen(str0);
 str = new char[len+1];
}

int main(int, char**)
{
char* buff = "abcdefghijklmnop";
test hoge(buff);
return 0;
}

これで、エラーになるって事?
260デフォルトの名無しさん:2008/02/09(土) 18:53:05
少なくともうちでは落ちない。

VC++ 2005 Express Edition SP1 + Win2KSP4
261デフォルトの名無しさん:2008/02/09(土) 18:59:59
>>255
どの行で例外発生してるか突き止めたのか?
262244:2008/02/09(土) 19:00:55
こちらもヨロ
263デフォルトの名無しさん:2008/02/09(土) 19:02:03
>>262
wchar_tがただのtypedefの環境ではそうなる。
VC++6とか。
264244:2008/02/09(土) 19:05:57
>>263
はい、VC++2005EEですので、
そういうものなのですね。
どうもでした。
265デフォルトの名無しさん:2008/02/09(土) 19:06:46
2005はさすがにtypedefじゃないんじゃないか?
266244:2008/02/09(土) 19:10:30
どうすれば確かめられますか?
267デフォルトの名無しさん:2008/02/09(土) 19:14:15
>>266
wchat_tとsizeofが一致するいろんな組み込み型とで、オーバーロードしてみる。
268デフォルトの名無しさん:2008/02/09(土) 19:15:47
wchar_tを組み込み型として扱うコンパイルオプションがあったはず
269244:2008/02/09(土) 19:25:45
>>267
すいません、よくわかりません。
>>268
MSDN
------
Visual C++ コンパイラ オプション
/Zc:wchar_t (wchar_t をネイティブ型として認識)
/Zc:wchar_t を指定しない場合は、wchar_t を定義するか、または
wchar_t が定義された多数のヘッダー ファイルのいずれか
(wchar.h など) をインクルードする必要があります。
通常、wchar_t は unsigned short として定義されます。
----
とあったので、このオプションをON/OFFしてみましたが、
結果は変わりませんでした。
270デフォルトの名無しさん:2008/02/09(土) 19:50:27
namespace hoge
{
 int main(int argc, char *argv[])
 {

 }
}

これをコンパイルすると、↓と言われます。どうすればいいですか?
error LNK2019: 未解決の外部シンボル _WinMain@16 が関数 ___tmainCRTStartup で参照されました。
271デフォルトの名無しさん:2008/02/09(土) 19:51:37
>>244
coutはワイド文字に対応していない。
wcoutを使えば良い。

wcout.imbue(locale(""));
wchar_t ch1= L'あ';
wcout << (int)ch1 << L'\n';
int dt1 = 12354;
wcout << (wchar_t)dt1 << L'\n';
272デフォルトの名無しさん:2008/02/09(土) 19:52:06
>>270 何がしたいのか考え直すといいです。
273デフォルトの名無しさん:2008/02/09(土) 20:03:51
>>270

namespace hoge
{
 extern "C" int main(int argc, char *argv[])
 {

 }
}
274デフォルトの名無しさん:2008/02/09(土) 20:18:31
テラ反則w
275244:2008/02/09(土) 20:24:00
>>271
動きました。
私のだと、いろいろな点で駄目でしたね。
ありがとうございました!
276デフォルトの名無しさん:2008/02/09(土) 20:29:58
ちょっとお尋ねしたいのですが、
char *p
というポインタに、なにかしらのアドレスが格納されていて、
cout << p;
とした時に、仮に
ss[100] = {a b, c ...}; (ss[100] = \0 とする)
p = ss;
だった場合は、ss[0]から順に\0が出てくるまで走査して、
cout << p;
で、abc... と表示するわけですよね。つまり配列の要素100個分順番に読み込んでるってことですよね。

では、もしポインタpに格納されているアドレスが普通の変数のアドレス
p = &a
みたいな場合だった時は、
cout << p;
では、単純に変数aのアドレスが出力されるだけですよね。

で、ここで疑問なのですが、
p = &a;
cout << p;
だった時、処理系はどうやってpが「変数」のポインタだと判断するのでしょうか??
「配列」のポインタの場合もあるので、何かしらの方法で判断していると思うのですが、
「メモリを順番に走査して\0が出てこなかったら変数のポインタ」だとしたら
毎回\0が出てくるまで番地を順番に走査していかなくてはならないので(\0が出て来ないかもしれないのに(変数の場合))何か違う気がします。
ポインタには、アドレスや型の情報だけではなくて、そのアドレスが変数のアドレスか、それとも配列の先頭アドレスかという情報も入っているんでしょうか?
277デフォルトの名無しさん:2008/02/09(土) 20:30:49
>>274
正しい。
278デフォルトの名無しさん:2008/02/09(土) 20:43:53
>>276
単に何の型のポインタになっているかで決まる。
型が char* のときとそれ以外の T* について
operator<< のオーバーロードが違うだけ。

  char a = 'A';
  char* p = &a;
  cout << p << '\n'
とすると確保されていない領域まで突き抜けて文字列が表示される (はず) 。
279デフォルトの名無しさん:2008/02/09(土) 20:43:57
>>276
コンパイルするときに決まる。
それがconst char*だったら文字列、void*だったらアドレスを表示する。
その他のポインタ型は多重定義解決の規則に従って、上のどっちかに振り分けられる。
280デフォルトの名無しさん:2008/02/09(土) 20:47:05
>>276

> p = &a
> cout << p;
> では、単純に変数aのアドレスが出力されるだけですよね。

(aがたとえば int であるとして。)
それは間違い。

> p = &a
これをやった時点でコンパイラは型が違うとエラーにする。
p = reinterpret_cast<&a>として無理やりキャストをしてpに int * の値を入れることは可能。

>処理系はどうやってpが「変数」のポインタだと判断するのでしょうか??
pを宣言する際に、その型を char* と指定しているから、pが実際にさす先に実際にあるものが
charの配列であっても、int型の値であっても、コンパイラはcharの文字列であると扱う。

aの値がたまたま有効な文字の文字コードと'\0'が並んだ物となっていれば、該当する文字列として表示されるし、
そうでなければ制御コードを出力したり文字化けしたりする。

281デフォルトの名無しさん:2008/02/09(土) 20:58:25
>>276は一貫してpをchar*として話しているのでは。
そうすると、
> p = &a
> みたいな場合だった時は、
> cout << p;
> では、単純に変数aのアドレスが出力されるだけですよね。
は間違い。
aが存在するメモリ位置から始めて、それ以降にたまたま存在するデータを、
無理やり文字列と解釈して出力するだけ。
282176:2008/02/09(土) 21:37:59
そーかそもそも文字列を扱うのはchar型だけだから、
<< がオーバーロードを利用してconst char*型だけ特別に扱うようにしている、ということですね。
ありがとうございましたm(_ _)m
283デフォルトの名無しさん:2008/02/09(土) 23:57:11
こんにちは。角度の比較のよい方法が思いつかずに苦労しています。
 
角度A,B,Cがあって、BがAとCの中に入っているがを判定する式で悩んでいます。

角度系は時計の3時が0度、反時計回りに360まであります。
(CはAから見て反時計方向に92度離れています)

単純な比較式
A<B && B<C
とすると、A=350度、B=0度、C=30度のときうまく成立しません。

A,B,Cそれぞれがどの象限にいるかによって
判別式を変えることも考えたのですが、組み合わせを考えるとあまりスマートな方法とも思えません。

何か簡単な式などでBがはさまれていることを知る方法があれば教えていただけませんか?
284デフォルトの名無しさん:2008/02/10(日) 00:00:30
>>283
そもそもどんな値を入れたってぐるっと回ってくれば挟まれてると言えるが?
AとCの作る角の小さい方にBがあるかどうかを判定するってことでいいのか?
その場合、AとCが180度離れていればBはどのような値であっても挟まれていないと考えていいのか?
285デフォルトの名無しさん:2008/02/10(日) 00:11:50
>>283
Aが0度になるようにBとCを回転させればいいよ。
286デフォルトの名無しさん:2008/02/10(日) 00:11:56
>>284

> CはAから見て反時計方向に92度離れています
って記述があるからそれは気にしなくていいんじゃね?
> A=350度、B=0度、C=30度のときうまく成立しません。
ってのは例のつもりだろう。
287デフォルトの名無しさん:2008/02/10(日) 00:15:25
>>283
A' = A - A (=0), C' = C - A (=92), B' = B - A とすれば、
BがAとCの間 <=> B'がA'とC'の間
288デフォルトの名無しさん:2008/02/10(日) 00:15:56
角度を図なしで表現すると難しいですね。 

AとCの作る角の小さいほうにBがあることを確認したい。
(大きい角のほうには「挟まれていない」という認識)

AとCは180度未満(想定は92度です)離れています。


289デフォルトの名無しさん:2008/02/10(日) 00:21:23
B-A, C-Aの角度を-180~+180に換算して、

C-A<B-A<0 または、 C-A>B-A>0なら、AとCの間にBがあるんじゃないかな。
290デフォルトの名無しさん:2008/02/10(日) 00:22:38
AとBの角度 + BとCの角度 < 180
なら挟まれてるよ。
291デフォルトの名無しさん:2008/02/10(日) 00:32:45
どなたか、助けてください。

#include <iostream.h>
#include <stdlib.h>

int main(void)
{
int i,n,*ptr;
cin >> n;
ptr = (int *)calloc(n,sizeof(int));

for(i=0;i<=n-1;i++)
{
cin >> *ptr;
ptr++;
}

for(i=0;i<=n-1;i++)
{
cout << i << "," << ptr << "," << *ptr << endl;
ptr++;
}
return 0;
}

うまく動きません。 orz... どこが間違ってるでしょうか?
292291:2008/02/10(日) 00:38:34
自己解決しますたw
293デフォルトの名無しさん:2008/02/10(日) 00:39:10
すみません。理解できていません
>>287
A'=A-A = 350 - 350 = 0
C'=C-A = 30 - 350 = -320 = fmod( -320+360, 360) = 40
B'=B-A = 0 - 350 = -350 = fmod( -350 + 360, 360) = 10
としておいて A' < B' < C' ( 0 < 10 < 40)
と比較すればよいのでしょうか?
294デフォルトの名無しさん:2008/02/10(日) 00:49:20
C言語より数学を勉強しろよ
295デフォルトの名無しさん:2008/02/10(日) 00:49:21
>>287
うまく行きました。皆さんありがとうございました
296デフォルトの名無しさん:2008/02/10(日) 00:58:44
>>283
リーマン幾何学
297デフォルトの名無しさん:2008/02/10(日) 02:41:34
C++で、以下のようなコードを見たのですが、

int res = 0;
int a = 0;
res >?= a;

こんな書き方はありえないですよね?
>?= の書き手の意図は res > a ? res = a: res
と思うのですが、macroによる置き換えも、>?=のような書き方に
対してはできないですよね?
298デフォルトの名無しさん:2008/02/10(日) 02:49:35
gcc拡張
299デフォルトの名無しさん:2008/02/10(日) 03:53:53
>>298
マジで?
どういう奴ですか?
というか、手元のg++だとコンパイル通らないけど、、、
こんなソースです。(元のソースから問題部分だけ抜き出したもの)
int main(void)
{
int res = 0;
int a = 0;
res >?= a;
return 0;
}
300デフォルトの名無しさん:2008/02/10(日) 03:58:31
ちゃんとC++になってる?
301デフォルトの名無しさん:2008/02/10(日) 04:26:18
>>300
こんな感じです。環境はlinuxです。(version 4.2.1)
$ cat test.cpp
int main(void)
{
int res = 0;
int a = 0;
res >?= a;
return 0;
}
$ g++ test.cpp
test.cpp: In function 'int main()':
test.cpp:5: error: expected primary-expression before '?' token
test.cpp:5: error: expected primary-expression before '=' token
test.cpp:5: error: expected `:' before ';' token
test.cpp:5: error: expected primary-expression before ';' token
302デフォルトの名無しさん:2008/02/10(日) 08:39:32
まったくの初心者なのですがC言語を勉強しようと思ってます
入門書で独習Cと独習C++がありますが、どちらを買えばいいでしょうか?
また他に良い入門書があれば教えて頂けませんか?
303デフォルトの名無しさん:2008/02/10(日) 08:42:31
>>302
うすい本にしとけ あとはネットで調べればよい 100ページ以下が必須
304デフォルトの名無しさん:2008/02/10(日) 08:43:31
その二つだったら間違いなく独習C。
305デフォルトの名無しさん:2008/02/10(日) 08:48:21
>>302
言葉のあやなのかもしれないが
CとC++は別物だからね
306デフォルトの名無しさん:2008/02/10(日) 08:48:40
日本語学者でなくてもしゃべれるのと同じ うすいやつにしとけ ネットで調べたページだけで勉強しても良い
なるべく動かし方がわかったらSTLに進むべき 
古典的なCプログラムのほとんどはSTLで簡単に書ける
307デフォルトの名無しさん:2008/02/10(日) 08:50:02
たとえばクイックソートや、スタックや、日本語処理など面倒なプログラムは勉強しなくてもSTLなどで置き換えられる
308デフォルトの名無しさん:2008/02/10(日) 08:54:23
unicodeもろくに扱えない糞ライブラリがナニ言ってるんだか
309デフォルトの名無しさん:2008/02/10(日) 09:03:20
>とにかく薄いやつ
これには同意。
入門書で分厚いの買ってもダラダラ無駄に難しく書いてるだけで理解しにくいだけ
基礎中の基礎さえ理解したら実際作って必要になった処理をネットで調べる方がいい
310デフォルトの名無しさん:2008/02/10(日) 09:20:07
STLってunicode扱えないんだっけ?
311デフォルトの名無しさん:2008/02/10(日) 09:21:58
つかえる 一語が判別できないのは charでもおなじ
312デフォルトの名無しさん:2008/02/10(日) 09:41:39
313デフォルトの名無しさん:2008/02/10(日) 09:54:05
>>310
STLに限らずC++にろくなUnicodeサポートがないというだけのこと。
特に気にする必要はない。気にするな。
ただのwchar_tか何かをコンテナに突っ込んで使うだけだ。
314デフォルトの名無しさん:2008/02/10(日) 09:59:53
ああそういうことか
STLが何か文字コードに依存してるのかと思ったよ
315デフォルトの名無しさん:2008/02/10(日) 10:01:29
たとえば10文字目が何バイト目とか判別できないだけ
316デフォルトの名無しさん:2008/02/10(日) 10:20:58
>>301
GCC 4.0.4, 4.1.2 と 4.2.3 のマニュアルには...

| The G++ minimum and maximum operators (‘<?’ and ‘>?’) and
| their compound forms (‘<?=’) and ‘>?=’) have been deprecated
| and will be removed in a future version. Code using these operators
| should be modified to use std::min and std::max instead.

[Excite 翻訳]
| そして、'G++最小の、そして、最大のオペレータ、(‘<?'、‘>、'、)、
| 彼らの合成フォーム(‘<?=')と‘>=') 非難して、将来のバージョンで取り
| 除くでしょう。 これらのオペレータを使用するコードはstdに以下を使用
| するように変更されるべきです:分とstd:、:代わりに最大限にしてください。

となってるから、4.2.1 なら使えるはずだが、なんかオプションがいるのかも
しれないな。

ちなみに 4.0.4 の一つ前の 3.4.6 のマニュアルには '>?=' 自体の説明がな
いから、実験的に付け加えられた拡張に思える。
317デフォルトの名無しさん:2008/02/10(日) 10:36:34
excite翻訳ひどいなw
g++の最小・最大演算子とその合成形はすでに非推奨であり
将来のバージョンでは廃止されます。これらの演算子を使用
しているコードは代わりに std::min と std::max を使用するように変更すべきです。
318デフォルトの名無しさん:2008/02/10(日) 11:03:47
T"なんたら"

L"なんたら"
に置き換えるマクロはどう書くですか?
319デフォルトの名無しさん:2008/02/10(日) 11:04:42
#define T Lでできなければ無理。
Windowsは関数形式のマクロにして対処している。
320デフォルトの名無しさん:2008/02/10(日) 12:13:50
template<class L>
321デフォルトの名無しさん:2008/02/10(日) 12:17:02
gcc だと wchar_t は4バイトで UTF-32 を入れるようになっている。
wchar_t はあくまでその環境で扱える最大の文字コードを格納できる文字型でしかなく、
2バイト固定でもなければ UTF-16 や UCS-2 専用のものでもない。

C++0x ではそこんとこ困るってことで
UTF-16 と UTF-32 を直接サポートするようになる予定のようだ。
また VC++ が対応遅らせそうな気がして憂鬱になるが。
322デフォルトの名無しさん:2008/02/10(日) 12:36:12
NT3.1時代からUnicode使ってきたOSに従うべき。
323デフォルトの名無しさん:2008/02/10(日) 13:33:02
先日こちらでアドバイスをいただき、プログラムを
書いてみました。学校でできなかった分を家で作成しようと
ソースを持ち帰ったのですが文字化けしてしまい開くことが
できなくて困っています。

学校では秀丸エディタで「.cpp」の拡張子で保存をして
gccでコンパイルをしているようなのですが、同じ様な
環境を作ることは可能なのでしょうか?

winのメモ帳でも開けるものだと思っていたので困っています。
どうかよろしくお願いします。
324291:2008/02/10(日) 13:34:37
おそらく文字コードが違うんだろ。
nkf使うか、メモ帳以外のエディタでソースコード見れ
325デフォルトの名無しさん:2008/02/10(日) 13:36:29
まずはまともなエディタを使うんだ
秀丸にあわせるのがよいかと思うがサクラエディタなど他にもいろいろある

*.cppをgccでコンパイルというのもなんか引っかかるが・・・
326デフォルトの名無しさん:2008/02/10(日) 13:37:13
>>323
秀丸のエンコーディングを一時的に変えるか、まともなフリーなエディタを拾って使えばいいんでない?
327デフォルトの名無しさん:2008/02/10(日) 13:56:49
つーかC/C++全然関係ない問題なのなw
328デフォルトの名無しさん:2008/02/10(日) 14:42:18
回答いただきありがとうございます。
327さんの仰るとおり、C以前の問題でした申し訳ありません。

>>325
gccでコンパイルというのは、なにかおかしいのでしょうか?
コンパイル時のコマンドがそのようなコマンドを入力すると
教えられたのです。

まずはエディタを探してみることからはじめてみます。
ありがとうございました。
329デフォルトの名無しさん:2008/02/10(日) 14:48:08
.cppなら普通gccではなくg++を使う。
330デフォルトの名無しさん:2008/02/10(日) 14:55:04
結局はgccだけどな
331デフォルトの名無しさん:2008/02/10(日) 15:44:22
質問です。
最近Cを勉強していますが、コンパイルが上手く出来ません。

コンパイラーはBorland C++ Compiler5.5を使ってます。
コンパイルすると、「指定されたパスが見つかりません」となります。
原因は何が考えられますか?
332デフォルトの名無しさん:2008/02/10(日) 15:45:20
#include <iostream>

#include <iomanip>
ってどういうとき使うの?
333デフォルトの名無しさん:2008/02/10(日) 15:46:08
Pathを通してないのが原因。

setbccでぐぐるとよい。
334デフォルトの名無しさん:2008/02/10(日) 15:46:20
宣言や定義を使用するとき。
335デフォルトの名無しさん:2008/02/10(日) 15:47:03
std::coutとかstd::cinとか使いたければ、まず<iostream>をインクルードする。
その上で、引数のあるマニピュレータが集められているのが<iomanip>。
336デフォルトの名無しさん:2008/02/10(日) 15:49:39
>>332レベルの質問する奴に只「マニピュレータ」なんて書いたって通じないだろ

と思って解説を書こうとしたけど、うんこしたくなったので中止
337デフォルトの名無しさん:2008/02/10(日) 15:54:56
でもそれ見てマニピュレータで検索すればすぐ解決すると思うけどw
338デフォルトの名無しさん:2008/02/10(日) 16:08:51
用途としては>>49みたいな場合に。
339デフォルトの名無しさん:2008/02/10(日) 22:21:50
test
340デフォルトの名無しさん:2008/02/10(日) 22:28:40
十進数の入力を二進数表示するコードを書いてみたんですが、
最初MASKを0x01に設定して1とか255とか入力したら桁が上下逆になりました。
0x80000000に設定して頭からチェックさせてやったらうまくいったんですが、
intel系のプロセッサはリトルエンディアンだからビットを上下逆に扱うんじゃないんですか?

/* d2b.c */

#include <stdio.h>

#define MASK 0x80000000

int main(void)
{
unsigned int x;
int n;

scanf("%d", &x);

for(n = 0; n < 32; n++){
if( ((x << n) & MASK) == 0)
putchar('0');
else
putchar('1');
if( (n+1) % 4 == 0)
putchar(' ');
}

return(0);
}
341デフォルトの名無しさん:2008/02/10(日) 22:34:58
>>340
×ビットを上下逆
○バイトの並びが逆
342デフォルトの名無しさん:2008/02/10(日) 22:35:39
エンディアン関係ナス
343340:2008/02/10(日) 22:37:25
>>341
バイト単位で逆なんですね。
>>342
あ、全然関係ないんですか;

ありがとうございましたm(__)m
344デフォルトの名無しさん:2008/02/10(日) 23:18:02
stdio.hのremove関数の使い方は下記で問題ないでしょうか?
remove("ファイルのパス");

今現在、例えば
remove("D:\\test\\test.txt");
こんな具合の1文だけを試しても成功しません、-1が返ってきて失敗しているようです
パスは絶対パスで問題ないと思いますし、testフォルダとtest.txtは試しに作ってみたものです
プログラム中で開いてもいませんし読み取り専用でもありません

見当がつかず困っています、何かご存知の方いたらよろしくお願いします
345デフォルトの名無しさん:2008/02/10(日) 23:21:13
>>344 perror() してみれ
346デフォルトの名無しさん:2008/02/10(日) 23:22:15
>>344
そのパスと同じままfopenして開けるのか?
つまりほんとにそのファイルをプログラムから認識できているのかをチェキラ!
あと、strerrorでエラー内容を取得してみては?
347デフォルトの名無しさん:2008/02/10(日) 23:23:36
test.txt.txtだったりして・・・ いやさすがにそれはないか
348デフォルトの名無しさん:2008/02/10(日) 23:26:52
Dドライブは実はDVD-ROMドライブだったりして・・・いやさすがにそれはないか
349デフォルトの名無しさん:2008/02/10(日) 23:30:58
そもそもDドライブが存在しな・・・ないか ないよな
350344:2008/02/10(日) 23:32:54
permission deniedというエラーが・・
ファイルのプロパティは読み取り専用とか隠しファイルとかチェック入っていないんですが
全く違う部分なんでしょうか?
351デフォルトの名無しさん:2008/02/10(日) 23:33:25
chmod a+w FILENAME
352デフォルトの名無しさん:2008/02/10(日) 23:35:53
Dドライブがネットワークドライブ・・
のわけないよな
353デフォルトの名無しさん:2008/02/10(日) 23:36:33
>>351
ahodesuka?
354344:2008/02/10(日) 23:36:53
>>351
うわぁ・・そういうの必要なんですか・・
Cじゃ書けないですよね?

Dはあります
355デフォルトの名無しさん:2008/02/10(日) 23:37:30
^^;
356デフォルトの名無しさん:2008/02/10(日) 23:37:45
WindowsXP と仮定して

1.コマンドプロンプトを開く
[スタートメニュー]-[ファイル名を指定して実行]
cmd

2.コマンドプロンプトで下記の三つのコマンドを打つ
D:
cd \test
dir

これで
test.txt
があるかどうか確認する
357デフォルトの名無しさん:2008/02/10(日) 23:38:17
>>351
それはUNIXだろ。
DOSとWindowsは
rd /s/q c:\
だろ。
358344:2008/02/10(日) 23:39:44
ファイル自体はあります
今ファイルのパスを変数に入れて、開いて中の文を出力させたりしてみました
その変数をそのまま使っています
それとfcloseもしっかり
359デフォルトの名無しさん:2008/02/10(日) 23:39:53
>>357
そうだったな
360デフォルトの名無しさん:2008/02/10(日) 23:45:39
>>358
っ attrib d:\test\test.txt
361344:2008/02/10(日) 23:52:26
>>360
そういう方法以外のコード内に記述して済ませる方法って言うとWin32APIってのを使うしかないんでしょうか
362デフォルトの名無しさん:2008/02/10(日) 23:56:03
>>360
その前に permission denied ってんだから削除する権利があるのかどうか確認しろよ。
コマンドプロンプトから del してみるとか、エクスプローラから削除してみるとか。
363344:2008/02/11(月) 00:08:29
>>362
そこら辺は出来ます、管理者権限でログインしてるので間違いないはずです
364デフォルトの名無しさん:2008/02/11(月) 00:12:57
>>363
実際消してみた?他のソフトがロックしてるってことはない?
365344:2008/02/11(月) 00:14:34
消してみました、remove関数を試す為に作ったファイルなのでそういったことはないと思います
366デフォルトの名無しさん:2008/02/11(月) 00:19:03
そのプログラム内でopenしてる状態でremoveしようとしてる、とかいうオチじゃないよね。
367デフォルトの名無しさん:2008/02/11(月) 00:23:02
同じこと何度も確認されまくっててかわいそす
368344:2008/02/11(月) 00:23:53
>>366
上で言ったとおり、remove関数を使う最低限の文だけで実行してもエラーはでますし
closeもしています
369デフォルトの名無しさん:2008/02/11(月) 00:26:22
もうみんな思い当たる節が尽きたんだろ・・・
370デフォルトの名無しさん:2008/02/11(月) 00:29:05
プログラムを管理者権限で実行してないとか。
371344:2008/02/11(月) 00:29:09
絶対パス指定出来ない訳ないですよね・・・なんでだろう
372デフォルトの名無しさん:2008/02/11(月) 00:29:59
あとは、ディレクトリ消そうとしてるとかぐらいかな。

ファイルを開いて中の文を出力させたりしてると言うから多分違うだろうが...。
373デフォルトの名無しさん:2008/02/11(月) 00:30:13
OS やコンパイラの情報でも出さないとこれ以上どうしようもないだろ。エスパーでもなけりゃ。
374デフォルトの名無しさん:2008/02/11(月) 00:42:31
リブートしてみるとか
375デフォルトの名無しさん:2008/02/11(月) 02:53:40
エクスプローラなんかでやったときとプログラムでやったときとで権限が違うとか。
Vistaだったらありそうだ。
376デフォルトの名無しさん:2008/02/11(月) 02:54:17
おれの経験から予想するとtest.textになってると予想
それで何時間も悩んだことがあるw
377デフォルトの名無しさん:2008/02/11(月) 03:23:03
>>318
_T("なんたら")

L"なんたら"
で良ければ、
#define _T(x) L ## x
でいいんじゃないか?
378デフォルトの名無しさん:2008/02/11(月) 04:10:31
明日までに1000×1000くらいの行列の逆行列とかを計算することが必要な宿題が
出ました。他の人はmatlabでやるのですが、自分はc++でやろうと思ってます。
逆行列の計算は自分で実装しなくてよいので、ライブラリとかを使おうと思ってます。
今調べたところでは、有名なc++用の行列計算ルーチンは、blitz++, MTL, blas,
TNTなどがあることが分かりました。将来性(一度覚えたら長く使える)と性能(一番重視)
を考えると、どれを選ぶべきでしょうか?
よろしくお願いします。
379デフォルトの名無しさん:2008/02/11(月) 04:20:20
すいません、
> 明日まで
じゃなくて、来週までです。
380デフォルトの名無しさん:2008/02/11(月) 04:20:26
俺は LAPACK 使ってるけど、
他の選択肢を吟味した訳じゃないからなあ。
381デフォルトの名無しさん:2008/02/11(月) 04:37:58
>>378
将来性はどれを覚えても同じかと。
C++を長く使うのであれば他人のライブラリを実装することも多くなると思う。
性能というのが速度重視であれば自分で実測した方が早いかな?
他には、関連ページの多さ、組み込み易さ、ソースが公開されているか?あたりを重視して決めればいいかと

ぶっちゃけmatlab使えるならそっちを使った方がいいようにも思うが・・
382デフォルトの名無しさん:2008/02/11(月) 05:10:35
>>380
>>381
ありがとうございます。自分が一応一番C++ができる(ことになっている)ので、matlabとの
性能比較のために、自分がc++版を実装することを期待されてます。簡単な偏微分を解く課題なのですが、
絶対matlabに勝ちたいので、自分の環境で性能比較してみます。とりあえず、選択範囲としては、
lapack, tnt, blas, mtl, blitz++, ublas(blasのboost版), mkl(intelのマスカーネルライブラリ)
くらいでしょうか?
383デフォルトの名無しさん:2008/02/11(月) 05:32:00
>>382
無駄な努力だと思うけど。どうしてもってことならコンパイラもiccにすることお勧め。
どうせなら、cublasかClearSpeedでも使ってぶっち切りを狙うのもいいかもねw
384デフォルトの名無しさん:2008/02/11(月) 09:15:11
>>383
どちらも専用ハードが必要じゃないですか。
でもこんなのもあるんですね。知らなかった。
コンパイラはiccとgccを比較します。
385デフォルトの名無しさん:2008/02/11(月) 09:51:09
CloseHandleの前後で、ハンドルが閉じられていることを確認するにはどうしたらいいですか
386デフォルトの名無しさん:2008/02/11(月) 10:00:18
ハンドルが使用中かどうかを知りたいんです
387デフォルトの名無しさん:2008/02/11(月) 10:00:48
なぜそんなことをする必要があるのですか
388デフォルトの名無しさん:2008/02/11(月) 10:06:36
たとえばサブディレクトリのファイルリストをひとつひとつ取得したいとき、
同一ディレクトリにまだファイルが残っていれば次のファイルを呼んで、
無ければハンドルを解放して、子ティレクトリへ進めたいんです
389デフォルトの名無しさん:2008/02/11(月) 10:07:45
フラグを別に持っていれば確認できますが、なるべく変数を減らしたいと思います
390デフォルトの名無しさん:2008/02/11(月) 10:09:05
かならずNULLで初期化してCloseしたらNULL代入すればいい。
391デフォルトの名無しさん:2008/02/11(月) 10:09:56
ファイルハンドルは NULL じゃなくて
INVALID_HANDLE_VALUE だ!
392デフォルトの名無しさん:2008/02/11(月) 10:16:38
NULLで比較しちゃってるコード多いけどな
それで動いちゃってるし

型安全なtypedefでもないかぎり防ぐのは無理ぽ
393デフォルトの名無しさん:2008/02/11(月) 10:17:59
ごめん間違えた
INVALID_HANDLE_VALUEは-1だった
394デフォルトの名無しさん:2008/02/11(月) 10:19:16
>>392
クラス作ればいいじゃん。
395デフォルトの名無しさん:2008/02/11(月) 10:29:42
>>388
なんか設計がおかしいように気がするけど...

擬似コードでいいから晒してみてよ。
396デフォルトの名無しさん:2008/02/11(月) 10:42:25
main(){
dirserch dir("c:\\windows");
cout << dir.next();
cout << dir.next();
cout << dir.next();
}
397デフォルトの名無しさん:2008/02/11(月) 10:44:52
C だと不完全型を利用して隠蔽する。
398デフォルトの名無しさん:2008/02/11(月) 10:53:10
Cでshared_ptrみたいなのはないの?
399デフォルトの名無しさん:2008/02/11(月) 10:55:22
テンプレートが無いのが辛い所だな。
マクロで何とかできなくはないが。
400デフォルトの名無しさん:2008/02/11(月) 10:56:52
それ以前にデストラクタが無いんだから仕方が無い
401デフォルトの名無しさん:2008/02/11(月) 11:00:54
AddRef/Release を自前でやるなら問題ない。
面倒だけど。
402デフォルトの名無しさん:2008/02/11(月) 11:02:11
COMを勉強中で、インターフェースを実装したクラスの情報を隠したいのですが
取得したものをみると、CFileの内容がくっついて来てしまいます

// idl
[uuid(...), version(1.0), hidden, object]
interface IFile : IUnknown {
HRESULT method();
}

[uuid(...), version(1.0), hidden]
coclass CFile {
interface IFileBase;
};

// 簡単なインターフェース取得
IFile * __stdcall create() {
IUnknown *iface = new CFile;
IFile *base = NULL;

iface->QueryInterface(IID_IFile, reinterpret_cast<void**>(&base));
return base;
}

属性にhidden指定するだけではだめなんでしょうか?

WinXPsp2/.net2003/C++/ATL使用せず
403デフォルトの名無しさん:2008/02/11(月) 11:08:24
なんで CoCreateInstance 使ってないの?
404デフォルトの名無しさん:2008/02/11(月) 11:21:28
CoCreateInstanceはレジストリに登録しないと使えないと、どこかで見た記憶があり
更にDirectXのレジストリ登録を見る限り、musicしかなかったので
この方法でいけるんじゃないかと思っていました

CoCreateInstanceの方で調べて試してみます
指摘ありがとうございました
405388 できました:2008/02/11(月) 11:27:38
#include <iostream>
#include <vector>
#include <string>
#include <windows.h>
using namespace std;
class dirserch{
vector <string> dirname; vector <int > dir[300]; string path[300]; int n; WIN32_FIND_DATA fd; HANDLE hd;
public: dirserch(char *ch); int next(string &str); };

main(){ dirserch dr("c:\\windows");
string str;
while(dr.next(str))cout<<str<<endl;}

dirserch::dirserch(char *ch){
n=0; path[0]=""; dir[0].push_back(0); dirname.push_back(ch); hd=NULL;}

int dirserch::next(string &str){
for(;;){
if(hd==NULL){
int k=dir[n].size()-1;
if(k<0){ if(n==0)return NULL; n--; continue; }
path[n+1] = path[n] + dirname[dir[n][k]] + "\\";
dir[n].resize(k); n++;
hd = FindFirstFile((path[n]+"*").c_str(), &fd);}
for(;;){
if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){
if(fd.cFileName[0]!='.' || ( fd.cFileName[1]!='.' && fd.cFileName[1]!='\0' )){
int k=dirname.size(); dir[n].push_back(k); dirname.push_back(fd.cFileName);}}
else { str=path[n]+fd.cFileName;
if(!FindNextFile(hd, &fd)){CloseHandle(hd); hd=NULL;}
return 1;}
if(!FindNextFile(hd, &fd)){CloseHandle(hd); hd=NULL;break;}}}}
406388 できました:2008/02/11(月) 11:30:24
全ファイル名を順番に出力する機能って基礎的だと思うのですが、標準にないので作ろうと思いましたよ
407デフォルトの名無しさん:2008/02/11(月) 11:39:33
再帰使わないの?
408388 できました:2008/02/11(月) 11:41:51
再帰はつかいません パソコンにメモリ管理を任せると、鈍くなったり不安定になるからです
409デフォルトの名無しさん:2008/02/11(月) 11:45:04
それだとWindowsやLinuxといったOS自体使えない理屈だが・・・
410388 できました:2008/02/11(月) 11:46:13
メモリというより、データをスタックへ積むコンパイラの仕組みでした
411デフォルトの名無しさん:2008/02/11(月) 12:00:59
ファイルの列挙くらいは大丈夫だと思うけど
412デフォルトの名無しさん:2008/02/11(月) 12:02:05
複数のファイル(1000以上)にランダムに書き込みがある時、
HDDの内蔵キャッシュやwindowsの標準キャッシュの効き目が悪くなるので
バッファ付きファイル出力クラスを作ります
413デフォルトの名無しさん:2008/02/11(月) 12:05:26
そうか。がんばれ
414デフォルトの名無しさん:2008/02/11(月) 12:09:05
double であることを明示的にするには、数字の最後にLをつければいいですか?
415デフォルトの名無しさん:2008/02/11(月) 12:14:08
.0でいいんじゃね?
416デフォルトの名無しさん:2008/02/11(月) 12:20:12
>>415
やっぱりそっちの方がいいかな。
100とか1とか切りのいい数字なんだけど、doubleで計算させたいときに、
せっかく切りがいいのに、100.0とかするのがいやだったんだけど、
100だとintとかにみえてしまう感じ。
やっぱり、.0にしときます。
ありがとうです。
417デフォルトの名無しさん:2008/02/11(月) 12:24:19
整数リテラルにLつけてもlongにしかならんだろ
418デフォルトの名無しさん:2008/02/11(月) 12:27:18
100.でもおkだった気がする。すごく中途半端だけど
419デフォルトの名無しさん:2008/02/11(月) 12:27:22
2.0Lもdoubleではなくね
420デフォルトの名無しさん:2008/02/11(月) 12:27:59
bccだと100.0Lにするとdoubleじゃなくてlong double(80bit)になっちまう。
421デフォルトの名無しさん:2008/02/11(月) 12:29:00
あるとすればdだよな。あるとすれば。
422デフォルトの名無しさん:2008/02/11(月) 12:30:26
> 100だとintとかにみえてしまう感じ
見た目の問題じゃなくて、実際にコンパイラにそう解釈されてしまうよ。
暗黙の型変換はおいておくとして。
423デフォルトの名無しさん:2008/02/11(月) 12:30:29
bcc以外でもlong doubleだろう・・・
424漏れは 100. かな。:2008/02/11(月) 13:16:38
C++なら、double(100)でいいよ。
425デフォルトの名無しさん:2008/02/11(月) 13:19:51
てゆーかそれでいいならcでも(double)100でいいだろw キャストだけど
426デフォルトの名無しさん:2008/02/11(月) 13:24:28
>>391
ここでは有効かどうか区別できれば十分なんだからNULL使ってもいいと思う。
427デフォルトの名無しさん:2008/02/11(月) 13:40:07
>>426
有効なハンドルとしてNULL(=0)返されたらどうすんだ
428デフォルトの名無しさん:2008/02/11(月) 13:41:49
正常なハンドルとして0を返すライブラリの設計がおかしいと考えるんだ。
429デフォルトの名無しさん:2008/02/11(月) 13:43:49
おかしくても使わねばならんこともある。
430デフォルトの名無しさん:2008/02/11(月) 13:45:03
0と-1が無効というハンドルもあるのさ・・・
431デフォルトの名無しさん:2008/02/11(月) 14:07:48
>>426-430
て言うか、ハンドルはポインタとは違うんだから NULL と
比較するなんて発想する奴はどうかしてると思う。
432デフォルトの名無しさん:2008/02/11(月) 14:13:04
しかし型の実体がポインタだから困る
433デフォルトの名無しさん:2008/02/11(月) 14:13:06
>>431
ハンドルの正確な定義って何?
434デフォルトの名無しさん:2008/02/11(月) 14:19:45
PVOID
435デフォルトの名無しさん:2008/02/11(月) 14:26:24
>>433
実体を一意に示す値じゃないの?
正確な表現かどうかわからないけど。

ポインタもハンドルの1つの設計としてありえるし、
整数で0から順に付番する設計も考えられる。
436デフォルトの名無しさん:2008/02/11(月) 14:32:01
実態が何かは関係なく、ハンドルはハンドルとして扱わないと。
437デフォルトの名無しさん:2008/02/11(月) 14:49:17
>>436
そういう抽象的なことで逃げるのがWindowsプログラマ
438デフォルトの名無しさん:2008/02/11(月) 14:58:02
>>437
まあお前はFILEをいじってドツボにはまってろ。
439デフォルトの名無しさん:2008/02/11(月) 14:59:39
>435でも似たようなこと言ってるけど将来的に
実体が変わる可能性もあるからねぇ。
440デフォルトの名無しさん:2008/02/11(月) 15:12:46
>>438
MSの下僕乙
441デフォルトの名無しさん:2008/02/11(月) 15:17:16
いや待て。Windowsとか関係なく、
ハンドルと、ハンドルの実装は切り離して考えるだろ。
ソフトウェアは抽象化が支えているって習わなかったか?
442デフォルトの名無しさん:2008/02/11(月) 15:43:47
抽象化なんては馬鹿には理解できないと言うだけのことだろ。

かわいそうだから、スルーしてやりなよ。
443デフォルトの名無しさん:2008/02/11(月) 16:04:00
stdio.h読み込むと関数使えますが、
zip.hを自作してこれ読み込むだけでDLLを使用してzipの解凍出来るように出来ますか?
ソース内でDLLを読み込まないと無理ですか
444デフォルトの名無しさん:2008/02/11(月) 16:23:19
>>443
DLLだって元はソースコードなんだからそれを自分で書けばできるよ。難易度は別にして
445デフォルトの名無しさん:2008/02/11(月) 16:25:54
DLLの関数をヘッダファイルの読み込みだけで使えるようには出来ませんか
446デフォルトの名無しさん:2008/02/11(月) 16:26:49
>>445
できるよ
447デフォルトの名無しさん:2008/02/11(月) 16:28:00
やりかた教えて下さい
448デフォルトの名無しさん:2008/02/11(月) 16:28:55
ヘッダファイルでロードすりゃいい。コンストラクタとかで。
449デフォルトの名無しさん:2008/02/11(月) 16:29:49
#include "zip.h"

main(){
zip_init();
}

としてロードする方法しか判りません
450デフォルトの名無しさん:2008/02/11(月) 16:31:23
Cなのか?環境くらいはまず書いてくれ。
どうでもいいが、その方法がなぜいけないのだ?
451デフォルトの名無しさん:2008/02/11(月) 16:33:55
printfなど標準関数はロードせずに使えて便利じゃないですか
DLLの関数も自動でロードしたら便利になります
コンストラクタで自動になるかやってみます
452デフォルトの名無しさん:2008/02/11(月) 16:36:06
思いっきりいろいろ勘違いしている。printfはロードとか関係ない。
zip_init()は初期化のために必要な処理だろ。全然別だ。
453デフォルトの名無しさん:2008/02/11(月) 16:37:45
printfとか入ってるlibcは標準でリンクするようになってるからな
mathだと-lmいるだろ?

ようするになんか勘違いしてないか?
454デフォルトの名無しさん:2008/02/11(月) 16:40:12
printfはスタティックリンクなので、ビルド時にlibがリンクされている。
DLLは名前のとおりダイナミックリンクなので、プログラムが自分でリンクしなければならない。
455443:2008/02/11(月) 16:47:41
できましたよ これでヘッタファイルの読み込みだけで解凍しました

class UNZIP{
typedef int (WINAPI *zipfnc)(const HWND , LPCSTR , LPSTR , const DWORD);
HINSTANCE hd;
zipfnc unzip;
public:
UNZIP(){ hd=LoadLibrary("UNZIP32.DLL");
unzip = (zipfnc)GetProcAddress(hd,"UnZip");}
int & operator ()(char *ch) { char buf[256]; unzip(NULL, ch, buf, sizeof(buf));}
} unzip;


main(){
unzip("d:\\a.zip");
}
456デフォルトの名無しさん:2008/02/11(月) 16:49:37
そのDLLからインポートライブラリ作ってリンクしとけ
457デフォルトの名無しさん:2008/02/11(月) 16:52:42
2つ以上unzipしたときの動作とかも考えとけと
458デフォルトの名無しさん:2008/02/11(月) 16:53:02
この方法では、どういつDLLの関数でもハンドルを個別に用意しなくてはならないですが
便利なので主要なDLLの関数は書き換えようと思います
459デフォルトの名無しさん:2008/02/11(月) 16:56:47
DLL見付からなかったらあぼーんだな。その対策入れろよ。
460デフォルトの名無しさん:2008/02/11(月) 17:50:44
自由落下で物体がどのくらい落ちるか計算させたいんですが、めちゃめちゃな計算結果になります。
どこが間違ってますか?
float h;
DWORD before = timeGetTime();
DWORD after = timeGetTime();
h -= ( 9.8 / 2 * ( after - before ) * ( after - before )/1000000 );
461デフォルトの名無しさん:2008/02/11(月) 17:51:53
>>460
hの初期化してる?
462460:2008/02/11(月) 18:05:10
>>461
hには元の高さの3.0fが入っています。
463デフォルトの名無しさん:2008/02/11(月) 18:05:49
afterとbeforeが同一だったら0除算発生しないか?
めちゃくちゃなのはその処理だと思うぞ・
464デフォルトの名無しさん:2008/02/11(月) 18:07:34
>>460
先ずはtimeGetTime()を使わずに、自分で時間軸を制御してみたら?
465デフォルトの名無しさん:2008/02/11(月) 18:38:08
>>460
h=(1/2)gt^2 だったら -= していくのはおかしいだろ。
466デフォルトの名無しさん:2008/02/11(月) 18:41:18
計算結果を普通に代入すれ
467460:2008/02/11(月) 18:46:30
beforeはウィンドウが作られたときに数値を入れて、afterは重力計算直前に数値を入れています。

(after-before)の部分を手動で数字の1や2に書き換えたら正常に動作しました。
DWORDとfloatの単位とかの問題ですか?
>>465
すみません、落下距離じゃなくて必要なのは現在の高さでした。
468デフォルトの名無しさん:2008/02/11(月) 18:56:48
UNZIP32.DLLの解凍時の進行状況を抑止するにはどうすればいいですか
469468:2008/02/11(月) 19:02:03
自己解決しました
470デフォルトの名無しさん:2008/02/11(月) 20:20:58
>>467
たぶん>>463だろうな。
数百メガから数ギガHzで動くCPUからしてみたら、
ミリ秒なんて気の遠くなるほど長い時間。
471465:2008/02/11(月) 20:56:12
>>467
そうじゃなくて。
h = 3.0 - ( 9.8 / 2 * ( after - before ) * ( after - before )/1000000 );
だろ?
472デフォルトの名無しさん:2008/02/11(月) 21:00:10
先に質問したものです。
iccについての質問なのですが、-Wall付きでコンパイルすると沢山警告がでます。
これらの警告は対応すべきなのでしょうか?

$ icc test.cpp -Wall
test.cpp(5): remark #1418: external function definition with no prior declaration
double g(double s) {
^test.cpp(6): remark #383: value copied to temporary, reference to temporary used return std::max(s - 100.0, 0.0);
test.cpp(6): remark #981: operands are evaluated in unspecified order return std::max(s - 100.0, 0.0);

ここで使っているソースはこれです。
#include <iostream>
using namespace std;
double g(double s) {
return std::max(s - 100.0, 0.0);
}

int main()
{
double x = 150.0;
cout << g(x) << endl;
return 0;
}
473デフォルトの名無しさん:2008/02/11(月) 21:12:06
警告なんだから、気にならなきゃ別に対処しなくてもいいんでないかい。

おれは、気にする性質だから可能な限り対処するけど。
474デフォルトの名無しさん:2008/02/11(月) 21:48:10
>>470
0除算は発生しないよ。乗算してるんだから。
475デフォルトの名無しさん:2008/02/11(月) 22:11:40
>>472
remarkは警告ですらないよ。
476デフォルトの名無しさん:2008/02/11(月) 22:15:11
>>474
orzぼけていた。
477デフォルトの名無しさん:2008/02/11(月) 22:24:26
ものすごく初歩的な質問でごめんなさい・・・

c++で、任意の位置に文字を表示させる方法を教えてください。例えば「1」を上から100ピクセル100ピクセルの位置に表示させるやり方を。
それと、もう一つ。
文字を上書きする方法を教えてください。上記の「1」の文字を消して「2」に書き換える方法です。

色々検索して調べたのですが、わかりませんでした。
お願いします。
478デフォルトの名無しさん:2008/02/11(月) 22:28:22
>>4
とりあえず何に表示してるか教えろ
winのコマンドプロンプトか?
479デフォルトの名無しさん:2008/02/11(月) 22:29:25
>>477
手始めに、VRAMとかフレームバッファとか呼ばれるものにアクセスする方法を探してみてはどうだろうか。
480デフォルトの名無しさん:2008/02/11(月) 22:29:56
>>477
環境によって違うので、先ずは環境を明らかにしてください。
481デフォルトの名無しさん:2008/02/11(月) 22:30:27
>>479
ちょw
482デフォルトの名無しさん:2008/02/11(月) 23:49:04
「質問の仕方が」初歩的だと、手の施しようがないよな・・・。
483デフォルトの名無しさん:2008/02/12(火) 03:40:09
すいません、プログラミングとは直接は関係ないのですが、
他に適当なスレが見つからなかったので質問させてください。

Dev-C++を使ってプログラムを打っているのですが、
プログラムを作成してソフトから実行するとコマンドプロンプトが一瞬で消えてしまいます。
↓のような簡単なプログラムで試してみましたが無理のようでした。
どなたか解決策が分かるかた教えてください。

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
printf("test\n");
return 0;
}
484デフォルトの名無しさん:2008/02/12(火) 03:40:56
getchar();でも入れておけば?
485デフォルトの名無しさん:2008/02/12(火) 05:23:58
char型、int型の宣言ひとつで何バイトの領域が確保されますか?
環境によって違うってよく聞くけど例えばXP32bitの場合
486デフォルトの名無しさん:2008/02/12(火) 05:25:40
sizeof(char)
sizeof(int)
487デフォルトの名無しさん:2008/02/12(火) 05:29:08
char型は常に1バイトじゃなかったっけ?
488デフォルトの名無しさん:2008/02/12(火) 05:52:00
>>486
ありがとう。そういえばそれで見れたね
いつもよくsizeof使ってるのにその発想がでてこなかった
>>487
char型はかわらないのか。勉強になりました
489デフォルトの名無しさん:2008/02/12(火) 05:56:23
疑問文の内容をまんま受け入れることで「勉強」しないほうがいいのでは。
490デフォルトの名無しさん:2008/02/12(火) 07:18:48
char型は常に1バイトだが、1バイトが常に8ビットとは限らないからな。
491デフォルトの名無しさん:2008/02/12(火) 08:16:21
>>490
492デフォルトの名無しさん:2008/02/12(火) 08:18:44
生暖かい目で・・ってのはこういうことを言うんだろうな
493デフォルトの名無しさん:2008/02/12(火) 08:19:52
perlをコンパイルしてC言語から使えるDLLを作成できますか
494デフォルトの名無しさん:2008/02/12(火) 08:21:42
1Byte==sizeof(char)が9bitだったり7bitだったりすることもある
495デフォルトの名無しさん:2008/02/12(火) 08:22:04
アセンブラをソースに埋め込めますが、perlとかフォートランはないですか
496デフォルトの名無しさん:2008/02/12(火) 08:26:22
>>494
それは既に論外

charこそ1バイトの基準だとでも思ってるのか?
卵が先か鶏が先かとかいうレベルじゃないぞ?
497デフォルトの名無しさん:2008/02/12(火) 08:29:26
>>493ですが
DLLでなくてもC++から使える方法ならいいです
498デフォルトの名無しさん:2008/02/12(火) 08:53:16
>>496
客観的な事実として、
- sizeof(char) は常に1。
- もともと、1文字分のデータ量が「バイト」。
- 1バイトは必ずしも8ビットでない(正確に8ビットを表現したい場合は「オクテット」と言う)。
- 1バイトが6ビットや7ビット、9ビットのアーキテクチャが実在した。
- C99では少なくとも1バイトにつき8ビットあることが保証されている(CHAR_BITは8以上)。
499デフォルトの名無しさん:2008/02/12(火) 08:58:38
疑問を投げかけるだけ投げかけて
496は海の藻屑と消えました。
500デフォルトの名無しさん:2008/02/12(火) 09:00:25
組み合わせの計算させるようとしたんですが、出力が0になってしまいます。
ブレークポイントで止めて確認したところ、Anの値がAnrの値より小さくなって
いるみたいなんですが何故でしょうか?
もしかして表現できる桁数を越えてるから?
そうだとしたらこれ以上大きな値が扱える型ないですか?

unsigned long long int Kumiawase(int);

int main(){
int n=36;
int r=6;
unsigned long long int Ar=Kumiawase(r),An=Kumiawase(n),Anr=Kumiawase(n-r);
cout<<An/(Ar*Anr)<<endl;

}

unsigned long long int Kumiawase(int n){
unsigned long long int Ans=1;
for(int i=1;i<=n;i++){
Ans*=i;
}
return Ans;
}
501デフォルトの名無しさん:2008/02/12(火) 09:11:10
>>500
36! は 371993326789901217467999448150835200000000 であって、
2^64 = 18446744073709551616 を大幅に越えている。

二項係数の値を求めたいのであれば、
パスカルの三角形を使って足し算だけで求めると良い。
502デフォルトの名無しさん:2008/02/12(火) 10:43:24
>>501
ありがとうございます。扱える数字をオーバーしちゃってるんですね
パスカルの定理調べてみたけどよく分からない…
高校の時の数学の教科書引っ張り出してきます
503デフォルトの名無しさん:2008/02/12(火) 12:50:57
>>497
COMの知識があれば使えるかも。
504デフォルトの名無しさん:2008/02/12(火) 13:16:35
perlembed ?
俺には無理そうだが君なら!
505デフォルトの名無しさん:2008/02/12(火) 16:04:32
クラス内でchar *filename;というメンバ変数を持っているのですが、
コンストラクタ内で、
filename = "memo.txt";
とかやると、
warning: deprecated conversion from string constant to 'char*'
と言われます。static_cast<char *>("memo.txt")としても同じでした。
このワーニングが出ないような書き方はないでしょうか?

506デフォルトの名無しさん:2008/02/12(火) 16:09:15
>>505
char *filename → const char *filename
507デフォルトの名無しさん:2008/02/12(火) 16:14:45
>>484
言われた通り実行すると、確かにコマンドプロンプトは表示されたままで止まりました。
原因は分かりませんが、しばらくはこれでやってみたいと思います。

もし、どなたか原因が分かる方がいれば教えてください。
508デフォルトの名無しさん:2008/02/12(火) 16:26:28
>>507
原因ったって、そのプログラムが一瞬で終了するからだろう。
"test\n" を出力したあと、すぐに return してるじゃないか。
プログラムが終了したら窓は消える。
509デフォルトの名無しさん:2008/02/12(火) 16:30:51
>>508
今まではreturn 0を入れると「終了するには何かキーを押してください」と言う表示がでてたんですが、
急にでなくなって困っています。
getchar();を入れた場合は止まりますが、キー入力待ちにはなりませんでした。

言っていることが聞かれている事とちがったらすいません。
510デフォルトの名無しさん:2008/02/12(火) 16:42:18
>今まではreturn 0を入れると「終了するには何かキーを押してください」と言う表示がでてたんですが、
そりゃぁ、IDEから起動してたからだろ。
511デフォルトの名無しさん:2008/02/12(火) 17:57:15
#include <iostream>
using namespace std;
namespace HW {
class test {
public:
test();
virtual ~test();
};
test::test() {
cout << "FFF" << endl;
}
};
int main()
{
return 0;
}
これをコンパイルできません。 どうしてですか?

/tmp/ccsyUc0A.o: In function `HW::test::test()':
samp174.cpp:(.text+0x12d): undefined reference to `vtable for HW::test'
/tmp/ccsyUc0A.o: In function `HW::test::test()':
samp174.cpp:(.text+0x163): undefined reference to `vtable for HW::test'
collect2: ld returned 1 exit status

512デフォルトの名無しさん:2008/02/12(火) 18:15:43
>>511
デストラクタの宣言があるのに実体がないから。
ついでに言えば、コンストラクタの後にイリーガルなセミコロンがある。
513デフォルトの名無しさん:2008/02/12(火) 18:19:13
VS2005のC++でDXUT,STL使って開発してるのですが、
class A{
std::string m_name;
public:
void func(std::string str){
m_name = str;
}
}
このコードがデバッグでは何の問題もなく動くのですが、
リリースにするとfuncを呼び出してm_nameに代入した時にthisポインタが0x000001を指し、
バッファオーバーランで落ちてしまいます。
何かご存知の方が居ればどうかご教授ください。
514デフォルトの名無しさん:2008/02/12(火) 18:22:49
コンストラクタの後のセミコロンはネームスペースの終わりのとこだべ。
なくてもいいけど。
で、デストラクタはオブジェクトを作ってないから呼ばれないので、通所は無くてもいいが
virtual の場合は別。
515デフォルトの名無しさん:2008/02/12(火) 18:24:58
それだけじゃ判らんから、気になったことだけ。
・なんでstd::stringを値渡ししているの?
・そのAの実体はどこにあるの?
516デフォルトの名無しさん:2008/02/12(火) 18:32:17
>>511
namespaceの終わりにセミコロンは不要。
仮想関数には定義が必要。定義が無いと仮想関数テーブル
(そのメッセージでいうvtable)のエントリーを作れない。
仮想でなければ呼ばれなければ必ずしも定義は必要ない。
517デフォルトの名無しさん:2008/02/12(火) 18:40:03
>>514
セミコロンは付け忘れました、
まだ継承は知らないのでなんとも。。
>>515
値渡しでうまく動いてたので特に意味なく使ってました、
ためしにfunc(string *str) に変えてみたら見事に動きました。。。
なぜこういう結果になるのかよくわかりません。。。
すばやい解答ありがとうございました。
518デフォルトの名無しさん:2008/02/12(火) 18:42:07
>>517
どうでもいいが、>514は>512宛てだ。
ついでに言えば、ポインタ渡しじゃなくて参照渡しにするだろ。常考
519デフォルトの名無しさん:2008/02/12(火) 18:49:20
>>518
勘違いしました、、
なぜデバッグだと動いていたのか、と
値渡しだとだめなのかを知りたいのですが。。
520デフォルトの名無しさん:2008/02/12(火) 18:54:58
>>519
>515
521デフォルトの名無しさん:2008/02/12(火) 19:06:43
>>520
というか良く見たらDebugモードになってまして、
Releaseだとやっぱりオーバーランしてましたorz
だめだめだ。。。
class A{
string m_str;
public:
func(string str){
m_str=str; ←
};
};

class X{
public:
func(string str){
A hoge;
hoge.func(str)
};
};

DWORD WINAPI doloop(LPVOID lpParam){
x.func("test"); ←xはグローバル変数になってます
};

最初はこんな感じです。。
522デフォルトの名無しさん:2008/02/12(火) 19:11:48
>>513
mainもないのが、問題なく動くのか……最近のC++は凄いな
523513:2008/02/12(火) 19:13:15
>>520
Releaseでビルドプロパティの最適化を無効にしたらReleaseでも大丈夫でした。
524デフォルトの名無しさん:2008/02/12(火) 19:14:50
>>521
問題が再現する最小のテストコードを作って
検証してから質問してくれ
525513:2008/02/12(火) 19:15:45
>>522
mainからdoloopをスレッドで動かしてます。。
簡略化しすぎました。。
DWORD WINAPI doloop(LPVOID lpParam){
while(!bMainLoopExit)
{
EnterCriticalSection(&cs);
x.func("test");
LeaveCriticalSection(&cs);
}
ExitThread(NULL);
}
526デフォルトの名無しさん:2008/02/12(火) 19:16:01
class A{
std::string m_name;
public:
void func(std::string str){
m_name = str;
}
}

int main(int, char**)
{
A test;
std::string str = "abc";
test.func(str);
}


//
これでも落ちるか?
527デフォルトの名無しさん:2008/02/12(火) 19:16:44
>>525
まて、複数のスレッドからグローバル変数にアクセスしてるのか?
528デフォルトの名無しさん:2008/02/12(火) 19:18:51
このあと、衝撃の新事実が!
529デフォルトの名無しさん:2008/02/12(火) 19:21:42
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));


D3DPRESENT_PARAMETERS d3dpp = {0};

結果に違いはありますか?
530デフォルトの名無しさん:2008/02/12(火) 19:23:24
STL使っておいてExitThreadってのも相当ヤバイ匂いがするけどな
531デフォルトの名無しさん:2008/02/12(火) 19:27:49
そもそも〜Thread系の関数って使いどころあるのかね?
532デフォルトの名無しさん:2008/02/12(火) 19:27:50
うむ、少なくともA::funcが問題って訳じゃなさそうだよね。
ってか、なんで値渡し……?
533デフォルトの名無しさん:2008/02/12(火) 19:36:24
構造体のメンバに、名前と番号両方からアクセスしたいとおもっています。
typedef struct particle{
double data[3][3];
typedef data[][0] position[];
typedef data[][1] verosity[];
typedef data[][2] angle[];
/* ようするに、data[][]に、position[]……という名前でもアクセスしたい */
/* data[][]のままで、loopを回して全部に値を流し込む、ということもしたいので、二重配列も残したい*/
}PARTICLE;

当然のようにエラーなのですが、こういうばあいどのように記述すればいいのでしょうか。
534513:2008/02/12(火) 19:38:00
>>526
mainの中身を >>521のX::funcにあたる場所に入れて実行してみましたがだめみたいです。
>>527
そうです。。
>>530
書かなくてもいいけど明示的に書いても良いって書いてあったので書いてあります。

クリティカルセクションで排他処理した気分になって
親が実体持ってるクラスを使ってます。。
535デフォルトの名無しさん:2008/02/12(火) 19:44:25
http://2chcity.myminicity.com/env

環境優先的に修復を。たぶんこの項目が一番減る。
NEJITUのように少し公園を先行させてもいいかもしれん。

ランク   国名     .... 街名           人口   (増減)   前日
--- 1   US1       .LUELand          314897 (. +528)  314369
--- 2   US2       .GoonTown       ......187254 (. +490)  186764
--- 3   US3       .CreateMyCity Forum  105044 (. +804)  104240
--- 4   Slovenia1    Staregate          100076 (+1393)   .98683
--- 5   Poland1     #debian.pl        .... .90733 (. +618)   .90115
--- 6   Germany1   isnichwahr.de        .89782 (. +224)   .89558
--- 7   Japan1    ...2ch_city         .... .69147 (+1870)   .67277
--- 8   Germany2   deluxebits          .59250 (. +279)   .58971
--- 9   France1    .FanaZ            . .56613 (+1377)   .55236
--- 10 . Germany3   upOTia           . .54802 (. +130)   .54672


20位までのランクは下記URLご参照ください
http://mmc.from.tv/world.html
536デフォルトの名無しさん:2008/02/12(火) 19:49:09
宣伝するのはいいけど、糞重いページだと注意書きしろよ。
537デフォルトの名無しさん:2008/02/12(火) 19:53:41
>>533
typedef union particle{
double data[3][3];
struct {
double position[3];
double verosity[3];
double angle[3];
} named;
}PARTICLE;
538デフォルトの名無しさん:2008/02/12(火) 19:59:41
例外を投げるときどういう型で投げるのが一般的なんでしょうか?

エラーメッセージ?
エラーコード?
それともクラスで投げて型判別?
どういう形がスマートでしょうか
539デフォルトの名無しさん:2008/02/12(火) 20:03:05
CAtlException
540デフォルトの名無しさん:2008/02/12(火) 20:20:13
>537
ありがとうございます
// strtest.c
#include <stdio.h>

typedef union particle{
double data[3][3];
struct {
double position[3];
double verosity[3];
double angle[3];
} named;
}PARTICLE;

int main(void){
PARTICLE pt;
pt.data[0][0] = 10;
printf("%lf\n",pt.named.position[0]);
return 0;
}

>gcc strtest.c
>./a.out
10.00000

所望の動作が得られました。
541513:2008/02/12(火) 20:42:48
答えてくださった方々ありがとうございました。
542460:2008/02/12(火) 21:10:50
>>471

なるほど。そこの部分と、>>460では省略した速度のvをintからfloatにしたらなんとなくうまくいきそうな感じになってきました。
ありがとうございます。
543デフォルトの名無しさん:2008/02/12(火) 21:18:08
Cの基本的なこと(繰り返しや条件分岐、演算子、ポインタ、構造体)をやってからC++(visual C++)をやろうと思ってるんですが他にCで勉強してた方がいいことってありますか?
544デフォルトの名無しさん:2008/02/12(火) 21:35:53
STLとATLで、
std::stack<CAutoPtr<Hoge>> hoges;
hoges.push(CAutoPtr(new Hoge()));
hoges.top()->func();
とすると、Hogeの実体がすでに破棄されているみたいでエラーが出ます。
std::stack<CAutoPtr<Hoge>> hoges;
hoges.push(CAutoPtr(new Hoge()));
hoge.top().Attach(new Hoge());
hoges.top()->func();
とすれば動きます。

どうして上のだと捨てられているですか?
545デフォルトの名無しさん:2008/02/12(火) 21:52:39
すまぽい
546デフォルトの名無しさん:2008/02/12(火) 21:54:00
CAutoPtrってSTLのコンテナに突っ込んで平気だったっけ。実装的に。
547デフォルトの名無しさん:2008/02/12(火) 22:03:06
auto_ptrと一緒じゃないか?

hoge.top().Attach(new Hoge());
で新たなアドレス突っ込んでるから動くだけで。
548デフォルトの名無しさん:2008/02/12(火) 22:13:30
>>529
D3DPRESENT_PARAMETERSがPOD型なら無い
549デフォルトの名無しさん:2008/02/12(火) 22:13:52
CAutoPtrが原因だね。
550デフォルトの名無しさん:2008/02/12(火) 22:14:39
CAutoPtr専用のコンテナがあったはず
551デフォルトの名無しさん:2008/02/12(火) 22:16:31
>>548
そいつたぶん釣りか荒らしかただのバカだよ…。
552デフォルトの名無しさん:2008/02/12(火) 22:16:54
それかCSharedPtr
553デフォルトの名無しさん:2008/02/12(火) 22:24:25
>>534
スレッド中でWindowsAPIのみ使うならCreateThread, ExitThreadでいいよ。
でもCランタイム使うなら_beginthread, _endthread使わないとダメだぜ。
あと、ExitThread等でスレッド終わらせると、スコープ抜けずにスレッドが終わる。
C++使うなら、ローカル変数のデストラクタ呼ばれなくなるからやめた方がいい。
554460:2008/02/12(火) 22:48:42
すみません、やっぱり無理でした。

( after - before )の部分をtimeに置き換える。     ・・・・ 正常に動作。
(ただし、事前に float time = 0.1; を宣言しておく。)

( after - before )の部分を数字の0.1に置き換える。  ・・・・ 正常に動作。

( after - before )の部分をtimeに置き換える。      ・・・・ おかしい
(ただし、事前に DWORD time = 0.1; を宣言しておく。)


ここから考えるにDWORD型が悪さをしていると思うんですが、
( after - before )の部分を( float )( after - before )に置き換える。 ・・・・ おかしい

何か特殊な変換をしなければいけないんでしょうか?
555デフォルトの名無しさん:2008/02/12(火) 22:52:40
>DWORD time = 0.1;
DWORDが何のtypedefか分かってる?
556デフォルトの名無しさん:2008/02/12(火) 23:19:54
すみません質問です。
下記のようなコードでBar::fugaを初期化する方法が
よくわからないのですが、教えていただけませんでしょうか?
この場合はやはり引数空っぽのコンストラクタを作るほかに手はないのでしょうか?

class Foo{
 public:
 Foo( int hoge ){ ... }
};

class Bar{
 public:
 Foo fuga[ 3 ];
 Bar( void ) : ???? { ... }
};
557デフォルトの名無しさん:2008/02/12(火) 23:22:46
>>554
おかしいというときは、after - beforeやtimeの値が0になっているときじゃないか?
558デフォルトの名無しさん:2008/02/12(火) 23:34:52
timeGetTimeが何を返す関数なのか理解しないで使っているに1ガバス。
559デフォルトの名無しさん:2008/02/12(火) 23:42:03
戻り値で
return *(hoge + (sizeof(piyo) + 2);
みたいに書くのって非推奨なんでしょうか?*は無くてもいいんだけれども
560デフォルトの名無しさん:2008/02/12(火) 23:52:53
ケースバイケース。
つか、それだけじゃ分からん。
561デフォルトの名無しさん:2008/02/12(火) 23:55:35
>>559
まあ、非推奨だろうね。








コンパイルできないし。
562デフォルトの名無しさん:2008/02/12(火) 23:57:36
>>559
*があるとないじゃ内容が変わるが?括弧の数が合わないのはtypoでいいよね?
個人的には、あんま複雑になるようならローカルに落として欲しいけど、これくらいなら許容範囲。
ってか、ポインタを+2するだけならreturn hoge + 2;でもいいんでねぇの?
563デフォルトの名無しさん:2008/02/12(火) 23:58:57
>>559
何がいいたいのかさっぱり分からない。
564460:2008/02/13(水) 00:45:52
うあああああああああ!できました!
>>555
整数型って分かってたつもりなのに小数いれてました!
あと、>>557で言われたとおりにtimeの値調べてたら、
ウィンドウ生成時に
before = timeGetTime();
そして計算時にも
before = timeGetTime();
ってやって、afterに何も入ってないような状態になってたような感じでした!
今度こそ解決しました!ありがとうございます!
565デフォルトの名無しさん:2008/02/13(水) 00:53:15
そもそもさ、めちゃめちゃな計算結果って具体的にどんなんよ
566460:2008/02/13(水) 01:11:10
3Dのモデルを動かしてて、チェックするまでは数字の表示の仕方がよく分からなくて数字に出してなかったんですが、
とりあえず物体のy座標しかいじってないのにカメラの位置が変わってました。
567デフォルトの名無しさん:2008/02/13(水) 01:53:03
一時的でなくそこからずっと指定の型で宣言したみたいに扱う方法ってないですか?
例えばchar型で宣言したのを一々(int)とかしなくてもずっとint型として扱う
みたいな感じで
568デフォルトの名無しさん:2008/02/13(水) 02:02:10
>>567
言いたいことがわからない。キャストを毎回するのが面倒ってことか?
ずっとintならはじめからintにしとけばいいんでねぇの?
569デフォルトの名無しさん:2008/02/13(水) 02:08:09
>>567
union{
char a;
int b;
};
ちょっと違うかもしれんが
570デフォルトの名無しさん:2008/02/13(水) 02:08:59
>567
#define char int
なにが起きても責任とらないよ。
571デフォルトの名無しさん:2008/02/13(水) 02:26:22
>>568-470
ごめん_beginthreadが引数としてvoid*しか渡せないからそれをchar*として扱える
ようにしたかったんです
関数内でchar *xxx=(char *)xxxとすることで解決しました。ご迷惑おかけしました
572デフォルトの名無しさん:2008/02/13(水) 02:27:27
>>568-470
ごめん_beginthreadが引数としてvoid*しか渡せないからそれをchar*として扱える
ようにしたかったんです
関数内でchar *xxx=(char *)xxxとすることで解決しました。ご迷惑おかけしました
573デフォルトの名無しさん:2008/02/13(水) 02:28:44
「charとint」と「void*とchar*」はだいぶ事情が違うだろ・・・
574デフォルトの名無しさん:2008/02/13(水) 06:39:24
>>514
>>516
ありがとうございます。なるほど、仮想関数は定義が必須なのですね。
あと、純粋仮想関数は定義が必要ないけど、デストラクタの純粋仮想関数の場合は
やはり定義が必要になる、というのは正しいですか?
575デフォルトの名無しさん:2008/02/13(水) 08:56:43
質問です。
マルチスレッドプログラムを作った事がないためわからないです。
スレッドAで作ったデータをスレッドBに渡すには普通どうやって渡すのでしょうか?以前お遊びで作った時、グローバル変数を使って渡したのですがデータが化けちゃったんですね。。

【作りたいもの】
ダイアログベースのターミナルソフト。
・シリアルデータ受信スレッドでデータを受けて表示用(windowsのメッセージループ待ちをしてる)に送りたい

【開発環境】
VC。MFCはつかいません。猫でもわかるレベル
576デフォルトの名無しさん:2008/02/13(水) 09:45:29
AはBの作成者、じゃないのね?
グローバルデータが化けた理由がわかれば解決すると思うよ。
577デフォルトの名無しさん:2008/02/13(水) 09:49:28
同時に書き込んだんじゃね?
もしくは書き込んでない(初期化してない)のに取得したか
578デフォルトの名無しさん:2008/02/13(水) 09:58:22
どうせ排他してないだけなんだろうな
579デフォルトの名無しさん:2008/02/13(水) 10:00:48
>>575
多分GUIスレッドにはPostMessage()でブン投げてるんだろうが、
GUIスレッドがPostされたメッセージをメッセージキューから読み取るまでの間に
受信スレッド側からの再Postが発生し得るから、その場合グローバル変数では
当然上書きされてしまうだろ。

Post側は毎回malloc()等でメッセージ用の領域を確保して、受け側で
メッセージを処理したらfree()するように汁。
580デフォルトの名無しさん:2008/02/13(水) 10:57:14
C++の一時オブジェクトについて質問します。gcc 3.2.1です。
下記のようなコードで"taking address of temporary"のWARNINGが出ますが、
この場合は無視しちゃってもいいですか?いいですよね?

#include <stdio.h>

class CTmp
{
public:
int x,y;
CTmp(int a,int b):x(a),y(b){};
};

int Foo(CTmp* pTmp)
{
if(pTmp) return pTmp->x + pTmp->y;
return 0;
}

int main(int argc,char** argv)
{
int result=Foo(&CTmp(1,2));
printf("%d\n",result);
return 0;
}
581580:2008/02/13(水) 11:16:23
こうするのがスマートかな。
スマートさ以外で>>580のまずい点あったら教えてください。

#include <stdio.h>

class CTmp
{
public:
int x,y;
CTmp(int a,int b):x(a),y(b){};
};

int Foo(const CTmp &Tmp)
{
return Tmp.x + Tmp.y;
}

int main(int argc,char** argv)
{
int result=Foo(CTmp(1,2));
printf("%d\n",result);
return 0;
}
582デフォルトの名無しさん:2008/02/13(水) 11:58:15
スマートというかそれが普通じゃね。
583デフォルトの名無しさん:2008/02/13(水) 12:01:25
>>580
標準 C++ ではエラーになるはず。 gcc のバグっぽいな。
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=21386
(だいぶ古いけど CONFIRM されてない。)
584デフォルトの名無しさん:2008/02/13(水) 12:02:19
んじゃ、列挙。
・ポインタである必要が内のにポインタを使うな
・どうしても使いたいならconst修飾しろ
・そもそもデータメンバは公開するな
・クラスに依存する関数ならメンバにしろ
585デフォルトの名無しさん:2008/02/13(水) 12:15:31
下記のように、fstreamの参照に、ifstreamを渡したいのですが、できません。
そこで、fstream *fsというようにポインタにしてやってるのですが、参照で
やる方法はないでしょうか

void func(fstream &fs)
{
return;
}
int main()
{
ifstream ifs;
ifs.open("ttt");
func(ifs);
586デフォルトの名無しさん:2008/02/13(水) 12:19:49
return文で計算したりって避けてたけど結構普通にやるもんなんだな
587デフォルトの名無しさん:2008/02/13(水) 12:20:57
>>585
fstream は読み書き両用。読み取り専用の ifstream を渡せないのはあたりまえ。
なんで ifstream& にしないの?
588580:2008/02/13(水) 12:26:17
>>582-583
レスありがとうございます。
まあ動くけど将来にわたって安全とは言い難い、
ってかやはり>>581推奨ってとこですかね。

>>584
あくまでサンプルなんで御容赦ください。
でもお気遣い感謝します。
589デフォルトの名無しさん:2008/02/13(水) 12:46:25
まずい点あったら教えてくれと書いてるのに
まずい点を指摘したら言い訳ってどーなんだ
590デフォルトの名無しさん:2008/02/13(水) 12:46:29
>>585
ファイルストリームのクラス階層を確認してみるべき。
fstreamとifstreamは継承階層の中で関係が全く無い。
591デフォルトの名無しさん:2008/02/13(水) 12:53:03
>>589
いや、質問の主眼が"taking address of temporary"のWARNINGでしたので。
その他は瑣末なことと手を抜いてしまいました。
とりあえずお詫びまで。
592デフォルトの名無しさん:2008/02/13(水) 12:56:48
まあありゃ誰がどう見てもただの揚げ足取りだな
593デフォルトの名無しさん:2008/02/13(水) 13:03:19
>>585
ちょっとややこしいけど、そのコードには、一般によくある勘違いにかすっている
君独自の勘違いがある。

まず、ifstreamはistreamを継承してる。fstreamは、iostreamを継承してる。
そのiostreamが、istreamとostreamを継承してるから、つまり両者に共通する近い祖先はistream。
iostreamはistreamの子だけど、fstreamはifstreamの子ではない。これが一般に良くある勘違い。

で、君はこれを踏まえて、fstreamにifstreamを渡すという、更なる勘違いをしてる。
読み書き両用クラス「が」読み取り専用クラス「の」子であるのは明白なわけで、つまり君は、
このセンスがまだ身についていないか、あるいは、普通に渡すだけでダウンキャストが可能になるという、
C++の仕様に対する勘違いをしていることになる。
594デフォルトの名無しさん:2008/02/13(水) 13:19:14
std::cinをstd::ifstreamに渡しても問題なかですか?
595デフォルトの名無しさん:2008/02/13(水) 13:36:47
std::istreamじゃイヤなのか? なぜ f が必要?
596デフォルトの名無しさん:2008/02/13(水) 13:47:04
>>593
そんなくどい説明必要ない。
クラス階層見れば一発で分かる。
他人の勘違いまでも決め付けるなんて教えたがりも甚だしい。
597デフォルトの名無しさん:2008/02/13(水) 14:10:16
>>596
現実に「クラス階層見てない」人なんだし、
他に可能性が無い状況は決めつけとは言わないよ。
変な理屈で変なスイッチ入っちゃった人に絡まれるのってやだなぁ。
598デフォルトの名無しさん:2008/02/13(水) 15:23:56
using namespace std;
は何かヘッダをincludeした後じゃないとだめなの?
599デフォルトの名無しさん:2008/02/13(水) 15:28:19
書くだけならお好きにどうぞ
600デフォルトの名無しさん:2008/02/13(水) 15:39:47
VCで先に書くとstdと認識してくれないのですが
601デフォルトの名無しさん:2008/02/13(水) 15:41:55
makeファイルがLinux、Windows、Macを識別する方法を教えてください
602デフォルトの名無しさん:2008/02/13(水) 15:46:10
>>600
これを機会にusing namespace std;をグローバルに置くのを
やめちまいなよ
603デフォルトの名無しさん:2008/02/13(水) 15:50:50
どこに置くのが正解なのでしょうか?
mainの中?
604デフォルトの名無しさん:2008/02/13(水) 15:58:42
グローバルに置くのが正解
605602:2008/02/13(水) 16:00:48
>>603
いや、mainの中の先頭に置いても良いけど
スコープはmain内だけであってまぁ・・なんていうか・・・

using namespace std;の宣言自体を俺は勧めない
606デフォルトの名無しさん:2008/02/13(水) 16:11:52
>>603
原則 using を使わず全部書くのが推奨だな
607デフォルトの名無しさん:2008/02/13(水) 16:18:05
std::vector<int> hoge;

面倒でもこういう記法に慣れるが吉。
608デフォルトの名無しさん:2008/02/13(水) 16:25:19
cout cin endlくらいはusing宣言したいな
609デフォルトの名無しさん:2008/02/13(水) 16:39:53
(swap内で)
using std::swap;
using boost::swap;
using 俺ライブラリ::swap;
(definition内で)
using namespace boost::spirit;

これしか使ってないな
610デフォルトの名無しさん:2008/02/13(水) 16:44:03
>>608
おれもそう思う。stdにいろいろ詰め込み過ぎだ。
611デフォルトの名無しさん:2008/02/13(水) 16:55:48
::boost::mplを使うときに
専用の名前空間に放り込んでusing namespace ::boost::mpl;してから
共通名前空間にエイリアスとなるメタ関数を書くようにする
ぐらいは許してください
612デフォルトの名無しさん:2008/02/13(水) 18:52:47
専用名前空間って、それのためにしか使わないなら、
名前空間のエイリアスnamespace hoge = boost::mpl;で十分では?

それに限らず、cppファイル内ではよくやるんだが。
namespace bll = boost::lambda;
namespace algo = boost::algorithm;

namespace dr = System::Drawing;
613デフォルトの名無しさん:2008/02/13(水) 22:36:33
VC++のusing namespaceは壊れてるから
専用の名前空間でも使わない方がいいよ
614デフォルトの名無しさん:2008/02/13(水) 22:52:15
std::mapから登録していないKeyつかって[]で取り出そうとすると
出来立てのValueが返ってきますか?
615デフォルトの名無しさん:2008/02/13(水) 22:55:30
うん
616デフォルトの名無しさん:2008/02/14(木) 03:32:31
_beginthreadでマルチスレッドで実行する関数って戻り値設定できないの?
617デフォルトの名無しさん:2008/02/14(木) 03:53:29
くずたれの質問ですいません
class内でのstaticメソドはどういう役割をするんでしょうか
csharpやjavaだとわかるんですが
C++でのstaticメソッドは、いまいち解りません
どなたか解説お願いしていただけないでしょうか
618デフォルトの名無しさん:2008/02/14(木) 03:58:05
>>616
_endthreadex()を使えば整数は返せる。
619デフォルトの名無しさん:2008/02/14(木) 03:58:44
>>617
C#やJavaと同じだと思うんだけど。なんで違うと思うの?
620デフォルトの名無しさん:2008/02/14(木) 04:26:56
win32が名前空間対応してくれればいいのに
621デフォルトの名無しさん:2008/02/14(木) 10:06:21
vectorを初期化するときに、配列を初期化するみたいに、
vector<int> vec = {1,2,3,4,5,6};
みたいな書き方をする方法はありませんか?
622デフォルトの名無しさん:2008/02/14(木) 10:08:44
>>621
その書き方は現行の C++ ではコンパイルできない。
「みたいな」という幅がどこまであるのかによっては、
似たような書き方ができることもあるけど。
623デフォルトの名無しさん:2008/02/14(木) 10:22:11
batファイルで、処理の途中でキー入力を求められるとき
どうすれば入力できますか?
パスワード入力を自動的に行いたいのです。
624デフォルトの名無しさん:2008/02/14(木) 10:32:29
625デフォルトの名無しさん:2008/02/14(木) 10:34:51
誤爆してしまった…

C/C++でGUIを実装する場合、どういった手段が適当でしょうか?(Windows環境)

色々調べてみたところ
・実際の職業プログラマさんなんかはC#やVB.NETみたいなのを使う
・WinAPIを直接、みたいなことは趣味でやる人が使う
(山を登るのに、ロープウェイを使うのが賢いが趣味で山登りを楽しむ人がいるみたいな意味で)

で、実際人に聞くと今度はMFCという意見が出てきました
調べるとWinAPIを糖衣したようなもののように感じたものの情報がすごく少ない

と、こんな感じでして、どっちに進むべきか悩んでいます
やりたいのはどっちだ、というのは手段と目的がryってやつでGUIの実装の手段をどうしたものか、という質問です
C#/VB.NETというものも一応考慮のうちに入れておきたいです
(GUIの実装はC/C++の枠を超えればそれがベターだから、という意見も考慮したいからです)
それではよろしくお願いします
626デフォルトの名無しさん:2008/02/14(木) 10:36:58
>実際の職業プログラマさんなんかはC#やVB.NETみたいなのを使う
業種にもよるけどMFC使ってる職業プログラマも多いよ
むしろそっちの方が多いはず

MFCの情報が少ないのは調べ方が悪いと思う
627デフォルトの名無しさん:2008/02/14(木) 10:44:20
template <>の中にかけるのは、classと、typename、それにintだけですか?
628デフォルトの名無しさん:2008/02/14(木) 10:46:03
>>623
スレ立てるまでもない質問はここで 第89刷
http://pc11.2ch.net/test/read.cgi/tech/1202726651/

SET /P password=
629デフォルトの名無しさん:2008/02/14(木) 10:56:59
>>627
type parameter
non-type parameter(intは可 現規格では幾つか制限アリ)
template template parameter(デフォルト引数は考慮されないことに注意)
の三つがOKだよ。

(例)
template<typename T>
template<int I>
template< template<typename, typename> class C >
630デフォルトの名無しさん:2008/02/14(木) 10:59:57
template<class A, class B> void Foo( B b ){}

という関数があったとき、使う側で

Foo<int>( bar );

と引数から特定できない型のみを指定できるのは、
C++において正しい仕様なのでしょうか?VS2005では一応コンパイルが通る
ようですが…
631625:2008/02/14(木) 11:05:33
>>626
なるほど・・どうにもうまく調べられないようで、ちょっと離れたプログラム関連の本が多い
書店へ行ったのですが、MFCについての本は独習シリーズを書いている方のものが1冊(古い)と
その他薄いものが何冊かしかありませんでした
それと合わせて情報が少なくマイナーなのかと思ってしまっていました
もうちょっとMFCについて調べてみます
632デフォルトの名無しさん:2008/02/14(木) 11:08:19
というかそのプログラム関連書籍が多い書店を教えて欲しいw
633デフォルトの名無しさん:2008/02/14(木) 11:23:26
池袋にあるジュンク堂ってとこです
大型書店何件か回ったけどあそこが群を抜いて多かったです
634デフォルトの名無しさん:2008/02/14(木) 11:30:11
あそこいいね
立ち読み客のために椅子まで用意されてたし
ちょっと前まで近所だったからよく行ってたよ
635デフォルトの名無しさん:2008/02/14(木) 11:49:07
ただちょっと会計が面倒ですよね

一応MFCやってみようと思います、WinAPI知らないままで不安ですが独習シリーズの人の本買ってみようと思います
ありがとうございました
636デフォルトの名無しさん:2008/02/14(木) 12:18:20
今更MFC?……
目的にも依るし、ここで続けるのもスレ違いだから詳しくは書かないけれど。
637デフォルトの名無しさん:2008/02/14(木) 12:19:34
MFCはこれから落ち込んでいくんじゃないか?.NET系(C#とか)やるべきだと思うの俺だけ?
638デフォルトの名無しさん:2008/02/14(木) 12:31:40
落ち込んでから.NETなり時代に沿ったものに切り替えればいい
目的にもよるけど
639デフォルトの名無しさん:2008/02/14(木) 12:45:38
MFCはまあ、最初の枠組みやってくれるのだけあてにして使ったりするな。
640デフォルトの名無しさん:2008/02/14(木) 13:07:23
641デフォルトの名無しさん:2008/02/14(木) 13:28:04
サブスレッドがデータ更新した事を知るためにはwhileなどで繰り返しチェックする以外にどのような方法がありますか
642デフォルトの名無しさん:2008/02/14(木) 13:29:25
>>635
その本は良書だしMFCを少しでも触ったことがあれば難しくはないが、
MFCの情報を探し出せないという検索の腕からいってもお前さんにその本はまだ早い。
というかMFCなんて仕事で必要でない限りは今更初心者が手を出すべきものでもない。
643641:2008/02/14(木) 13:32:48
イベントドリブンっていうのはきいたことあるのですが、BCBとかでは無い標準のC言語、C++でどうやるのかわかりません
644デフォルトの名無しさん:2008/02/14(木) 13:51:27
>>641
Windowsならイベントオブジェクト、Unixなら条件変数
>>643
標準のC/C++にサブスレッドなんて概念は無いと思うが…
645641:2008/02/14(木) 14:02:49
サンクス
646デフォルトの名無しさん:2008/02/14(木) 14:13:28
CreateEvent() の使い方がわからないので適当なSleepいれてwhileでチェックしようかと思うのですが
CreateEvent()のほうが断然良いですか? たとえば500msとか、100msとか待ったとき
CreateEvent()のほうが即時性とCPU負荷低いですか
647デフォルトの名無しさん:2008/02/14(木) 14:15:07
やってみると、それ自体は簡単だからまずやってみろって。
648デフォルトの名無しさん:2008/02/14(木) 14:16:31
断然良いです
即時性は高いです
負荷は100msも寝るなら大差ない
649デフォルトの名無しさん:2008/02/14(木) 14:18:13
DLLにしたいんのですが、なるべく負荷を下げたいんです 
一つのサブスレッドがデータを受信したらそれを知りたいのですが、間隔は2〜10秒くらいです
whileで監視しても変わらないですか
650デフォルトの名無しさん:2008/02/14(木) 14:20:42
少しでも下げたいならイベントオブジェクトの方がいいんじゃね
通知が来るまで寝っぱなしだし
100msごとに起きるよりは当然
651デフォルトの名無しさん:2008/02/14(木) 14:22:04
初心者がわかる文書ありませんか
652デフォルトの名無しさん:2008/02/14(木) 14:30:41
CreateEventの使い方なんか簡単だ。
HANDLE handle;
handle = CreateEvent(NULL, FALSE, FALSE, NULL);
これで良い。
653デフォルトの名無しさん:2008/02/14(木) 14:31:42
winapiのメリットってなんでsか
654デフォルトの名無しさん:2008/02/14(木) 14:34:42
>>653
何に対するメリット?比較対象は?
655デフォルトの名無しさん:2008/02/14(木) 14:41:07
ウィンドウプロシージャではよくswitchが使われていますが、
ifではなくswitchを使う理由みたいなものがあるんでしょうか?
656デフォルトの名無しさん:2008/02/14(木) 14:42:24
>>655
ifでも書けるから、ためしにifで書いてごらん。
理由がわかると思うよ。
657デフォルトの名無しさん:2008/02/14(木) 14:48:20
int main(void){
  for(;;)
 
  return 0;
}

これのコンパイルが普通に通って(´・ω・`)?ってなってるんですが、
ぶら下がり文って次の行でなくても許されてるんですか?
658デフォルトの名無しさん:2008/02/14(木) 14:51:34
空白文字(改行含む)はいくらあっても構わない形式なのです。
659デフォルトの名無しさん:2008/02/14(木) 14:51:35
for (;;) return 0;

って解釈されてるんだろ
660デフォルトの名無しさん:2008/02/14(木) 14:54:21
>658-659
なるほど、どうもです。
同じ行か、次の行までしか許されないもんだと思いこんでました。
661デフォルトの名無しさん:2008/02/14(木) 14:54:45
>>657
こんなのでも普通にコンパイル出来るよ
びっくり?

int main(
void){ for(
;

;) return

0;}
662デフォルトの名無しさん:2008/02/14(木) 14:58:05
>>661
たぶん、そういうのはわかっちゃいるけど、「ついなんとなく」
ぶら下がり文に対してだけ異なる感覚を持ってしまったんだろう。
663デフォルトの名無しさん:2008/02/14(木) 15:01:51
p
r
i
n
t
f
(
"
t
e
s
t
\n
"
);

でもこれは通らないんだね(´・ω・`)
664641:2008/02/14(木) 15:02:00
サンクス できましたよ

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

unsigned WINAPI fnc(void *x){
int n=(int)x,m;
m=3000-n*300;
Sleep(m);
cout<<n<<"ban "<<m<<"msec Sleep\n\n";
SetEvent(handle);}

main(){
handle = CreateEvent(NULL, FALSE, FALSE, NULL);
for(int n=0;n<10;n++){
_beginthreadex(NULL, 0, fnc, (void*)n, 0 ,NULL);}
while(1){
WaitForSingleObject(handle, INFINITE);
cout<<"main reep ga ugoita\n";
}}
665デフォルトの名無しさん:2008/02/14(木) 15:05:42
>>656
if(○○ == WM_xxx)
○○ ==の部分を毎回書かなければいけない事くらいしか思い当たりません。
その代わりbreak(もしくはreturn)がいらないので記述ミスが減るかなぁと。

と書いているうちに一つ思い浮かんだのが、breakを挟まないことで
case WM_CREATE:
〜処理1〜
case WM_PAINT:
〜処理2〜
break

WM_CREATEがきたときは処理1,処理2をどちらも行うという事が出来ますね。
これがswitchを使う理由ですか?
666デフォルトの名無しさん:2008/02/14(木) 15:12:56
>>665
そもそもswitch文の存在理由を考えてみるといいかと
およそほとんどのswitch文はif文で書けるわけだし、
C言語のswitch文って要らないよね、ってのは、
それはそれでひとつの考え方だが…
667デフォルトの名無しさん:2008/02/14(木) 15:14:05
ぶっちゃけswitchでできることはみんなif-elseでできるし、
while、do-whileでできることはみんなforでできる。
選ぶ基準はどっちが見やすいか、書きやすいか。
668デフォルトの名無しさん:2008/02/14(木) 15:23:30
>>630
正しい仕様です。


669デフォルトの名無しさん:2008/02/14(木) 17:03:06
>>668
ありがとうございます。安心して使うことができます。
670デフォルトの名無しさん:2008/02/14(木) 18:08:59
店で売ってるソフトって大半がMFC製じゃないの?
671デフォルトの名無しさん:2008/02/14(木) 18:49:22
wchar_tの文字列をcharの文字列に変換したいのですが
  char buf[256];
  wchar_t wbuf[] = _T("Test123あいうアイウ");
  int c;
  setlocale(LC_ALL,"ja");
  wcstombs_s(&c,buf,256,wbuf,256);
ではwbufに入っている「Test123」までがbufにコピーされ、それ以降は無視されているようです。
理由を教えていただけませんか?
672デフォルトの名無しさん:2008/02/14(木) 18:55:03
変換できないワイド文字が検出されたのでその直前で変換を打ち切った
673デフォルトの名無しさん:2008/02/14(木) 19:40:47
"ja"がロケール文字列として有効なのか怪しいな。
単にsetlocale(LC_ALL, "");で試してみたら?

あと、本当のワイド文字列リテラルに_Tは使うな。直接L付けろ。
wchar_t wbuf[] = L"Test123あいうアイウ";
674デフォルトの名無しさん:2008/02/14(木) 19:54:01
Windows だったら setlocale(LC_ALL, "japanese"); だったと思う
675デフォルトの名無しさん:2008/02/14(木) 20:12:53
WCHAR
676デフォルトの名無しさん:2008/02/14(木) 21:13:33
>>672-675
ありがとうございます
setlocale(LC_ALL, "japanese");
で解決しました。
677デフォルトの名無しさん:2008/02/14(木) 22:00:06
ttp://www.uploda.org/uporg1251163.zip.html (展開時9.7KB程度)

Windowsゲーム向けタイマクラスを作ってみたんですが
(1/60秒休んで累積の休憩時間からfpsや簡易CPU率を取得する機能)
どうにも少しでも負荷がかかるとWindowsタスクマネージャで見てると
まだまだCPUが余裕な割に53fpsくらいに落ち込んでしまいます。

もうすこし改良したいと思うのですが、どこか改良の余地はありますでしょうか?
678デフォルトの名無しさん:2008/02/14(木) 22:05:20
タイマーをパワーアップ
679デフォルトの名無しさん:2008/02/15(金) 00:55:33
>>677
あまり詳しく見てないけど、
Sleepが1/60秒以上帰ってこないことが7回/秒あったら53fpsになるのかな?
Sleepの精度なんてそんなもんだし。

理論値どおりに増加するフレームカウンタを作り、
実際に処理できたフレーム数がそれに追いついたら休む、
追いつくまでは休まず連続して何フレームでも処理する、
とすれば、平均のfpsは理論値と合う。
680デフォルトの名無しさん:2008/02/15(金) 00:57:29
こんな感じで見やすくC++の標準関数載せてくれてるサイトありませんか?

ttp://cham.ne.jp/piro/p_stdfunc.html
681デフォルトの名無しさん:2008/02/15(金) 01:03:00
682デフォルトの名無しさん:2008/02/15(金) 01:15:08
>>679
「どうしても追い付けなければスキップすることも辞さない」も入れとくべきではないか?
683デフォルトの名無しさん:2008/02/15(金) 01:17:05
バイナリファイルについての質問です。
とあるバイナリファイルの中に、12ビット単位でひとつの要素となるデータが99バイト分入っています。
これを3バイトずつファイルから読み出して12ビット単位で区切り、short型に変換して
再度バイナリファイルに書き出したいと思っています。
この場合、バイナリモードでファイルを開いて、char data[3]にread関数で3バイト格納しても
シフト演算子が使えないため、上手く12ビット単位でデータを取得することができません。
何か良い案ないでしょうか?
684デフォルトの名無しさん:2008/02/15(金) 01:24:09
>>683
「シフト演算子が使えない」と思い込む根拠は?
まぁ、環境依存上等でビットフィールドを使うか、自前でビット演算するかの違いだけどね。
685デフォルトの名無しさん:2008/02/15(金) 01:24:18
やり方は色々あるけど、とりあえず3byte読んでから4byteの整数に格納sすれば?
686デフォルトの名無しさん:2008/02/15(金) 01:27:43
>>683
short a1 = (unsigned short)data[0] << 4 | (unsigned short)data[1] >> 4; // 前半12bit
short a2 = (unsigned short)data[1] << 8 | (unsigned short)data[2]; // 後半12bit
これでだめかや?
687デフォルトの名無しさん:2008/02/15(金) 01:31:54
訂正
short a1 = (unsigned short)data[0] << 4 | (unsigned short)data[1] >> 4; // 前半12bit
short a2 = (unsigned short)(data[1] & 0x0f) << 8 | (unsigned short)data[2]; // 後半12bit
688デフォルトの名無しさん:2008/02/15(金) 01:33:49
a1とa2もunsigned shortでいいと思う。
俺の個人的嗜好だけど。
689デフォルトの名無しさん:2008/02/15(金) 01:38:19
a1, a2はunsigned shortにすべきだな。
それはそうと、
a1 <- data[0].u data[0].l data[1].u
a2 <- data[1].l data[2].u data[2].l
って並びなのかな。
a1 <- data[1].l data[0].u data[0].l
a2 <- data[2].u data[2].l data[1].u
って並びの可能性もありそうだが。
690デフォルトの名無しさん:2008/02/15(金) 01:47:13
VC++のインラインアセンブラで64bitの整数の掛算(UInt32x32To64のような物)をやりたい訳ですが
どのようにすれば良いのでしょうか。

32bitなら以下で良いみたいですが64bitのやり方がわからず・・・。
int mul(int a, int b)
{
_asm{
mov eax, a
mov ebx, b
mul eax, ebx
}
}
691デフォルトの名無しさん:2008/02/15(金) 01:54:36
>>685〜688
お〜なるほど、とても助かりました。
シフト演算が使えないと言ったのは自分の知識不足です。
3バイトのデータを一気にシフト演算しようとしていました。
上手くいきました。ありがとうございます。

692デフォルトの名無しさん:2008/02/15(金) 01:55:49
解決したと思ったら、もう一個質問ができました。すいませんが、こちらもお願いします。
読み込んできたデータを次の関数で共用体に格納して、bit単位でいじってるんですが、どうも上手くとれません。
いろいろ省略していますが、以下のような感じです。

テストデータ(バイナリ)
11111111 11111111 11111111

共用体
union UNION{
unsinged char data[3];
struct {
unsinged short element1 : 8;
unsinged short element2 : 3;
unsinged short element3 : 5;
unsinged short element4 : 1;
unsinged short element5 : 7;
}FILED;
}

処理
UNION A;

read (fd , A.data , 3):
printf("%d\n" , A.FILED.elemnt1); ←255が出力される
printf("%d\n" , A.FILED.elemnt2); ←7が出力される
printf("%d\n" , A.FILED.elemnt3); ←31が出力される
printf("%d\n" , A.FILED.elemnt4); ←何故か0が出力される
printf("%d\n" , A.FILED.elemnt5); ←127が表示される

4番目の要素が1と表示されるません。
これはなんででしょう?
693デフォルトの名無しさん:2008/02/15(金) 02:00:33
unionの使い方間違えてないか?
694デフォルトの名無しさん:2008/02/15(金) 02:02:51
>>690
64ビットの値を返すときは、EDX:EAX。

こんな関数をコンパイルさせたら、
long long mul(int a, int b)
{
return static_cast<long long>(a, b);
}
こんな出力だった。
; Line 3
mov eax, DWORD PTR _a$[esp-4]
imul DWORD PTR _b$[esp-4]
; Line 4
ret 0
695デフォルトの名無しさん:2008/02/15(金) 02:02:56
>>692
試しに、printf("%u\n", A.FILED.element4)にしてみたら?

>>693
適切かどうかは兎も角、間違ってはいないんじゃないか?
696692:2008/02/15(金) 02:19:25
>>695
上手くいってないような雰囲気です。
どっか自分が処理を間違えているかもしれないので、
原因を探してみます。
697デフォルトの名無しさん:2008/02/15(金) 02:47:09
手元のgccだとちゃんと1になるけどなぁ。
698デフォルトの名無しさん:2008/02/15(金) 02:47:14
>>694
上位32bitがEDXに格納されるのは解りました。
それをどうやってUINT64の変数に代入するのでしょうか。

一応、以下みたく物凄く邪道な感じでやってみたり・・・
UINT64 mul64(UINT a, UINT b)
{
FILETIME c;
_asm {
mov eax, a
mul b
mov c.dwHighDateTime, edx //mov dword ptr [ebp-8],eax
mov c.dwLowDateTime, eax //mov dword ptr [ebp-4],edx
}
return *(UINT64*)&c;
}

>mov dword ptr [ebp-8],eax
>mov dword ptr [ebp-4],edx
のインラインアセンブラでの正しい記述方法が解らないです。
699デフォルトの名無しさん:2008/02/15(金) 02:54:44
>>698
C側で対処するならこんなんとか。
union {
struct {
uint32 l;
uint32 h;
} s;
uint64 w;
} c;
_asm {
mov c.s.l, eax
mov c.s.h, edx
}
return c.w;
700デフォルトの名無しさん:2008/02/15(金) 02:56:12
これでいいよ。
__declspec(naked) UINT64 __cdecl mul64(UINT a, UINT b)
{
  _asm
  {
    mov eax, a
    mul b
    ret
  }
}
701デフォルトの名無しさん:2008/02/15(金) 03:29:18
>>699
なるほど、適当に構造体定義してやればいいのか。

>>700
これは警告も出ないしスマートだし関数でやるならこちらが良いですね。

解決です。ありがとうございました。
702デフォルトの名無しさん:2008/02/15(金) 04:57:05
>>681
ありがとうございます。C++はCの標準関数+これらが使えるのね
703デフォルトの名無しさん:2008/02/15(金) 05:17:09
こんな感じでも行ける
UINT64 res;
_asm {
mov eax, a
mul b
mov dword ptr[res], eax
mov dword ptr[res+4], edx
}
return res;
704デフォルトの名無しさん:2008/02/15(金) 14:36:08
DLLから要求があるまで動作を停止したいのですが、どのようにしたらいいんでしょうか?
メインのグローバルハンドルを共有出来ないですよね?
705デフォルトの名無しさん:2008/02/15(金) 15:01:58
>>704
環境とやりたいことを具体的に。どうせ、Windowsだろうけど。
706デフォルトの名無しさん:2008/02/15(金) 15:33:29
すみません 似たような質問なんですが

WaitForSingleObject(
HANDLE hHandle, // オブジェクトのハンドル
DWORD dwMilliseconds // タイムアウト時間
);

ってHANDLEがNULLになるまで待つんですか?どういう価でうごくか教えて下さい
707デフォルトの名無しさん:2008/02/15(金) 15:36:24
hHandleがシグナル状態になるか、タイムアウトになるまで待つ。
シグナル状態は、そのhHandleが何かによって変わる。
CreateEventしたやつならSetEventしたやつ、とかね。
708デフォルトの名無しさん:2008/02/15(金) 15:40:37
>>706
もしそれが、WinAPIのWaitForSingleObjectならば>707。
詳しくは、MSDNかAPIスレへ。
もしそうでないなら、環境を提示すること。
709デフォルトの名無しさん:2008/02/15(金) 16:13:48
サンクス
710デフォルトの名無しさん:2008/02/15(金) 20:52:12
HTMLの文字コードをS-jisにしたいのですが、インターネットエクスプローラで読み込んでS-Jisで書きだというのをC言語でできませんか
711デフォルトの名無しさん:2008/02/15(金) 20:53:50
文書全体をS-jisに変換してタグを書き換えるというのでは正しく表されないことが多いです
インターネットエクスプローラは変換精度が高いです
712デフォルトの名無しさん:2008/02/15(金) 21:16:31
すいません、質問があります。
{
A a;
B b;
}

と二つのクラスを確保したとき、デストラクタの呼ばれる順番というのは仕様で
定められているのでしょうか?それとも不定なのでしょうか?

よろしくお願いします。
713デフォルトの名無しさん:2008/02/15(金) 21:21:15
デストラクタは、コンストラクタが呼び出されたの全く逆の順で呼ばれる。
714デフォルトの名無しさん:2008/02/15(金) 21:23:44
すいません。1次元固定配列をを積み重ねて、
2次の動的配列にしたいのですが。

data[4]固定
data[4]
data[4]
 ↓
動的

typedef std::vector<int> Four;
std::vector<Four> data;

にすれば確かに動作するのですが、
これでは両方1次も2次も動的です。

よそのスレで
typedef int Fou[4];
std::vector<Four> data;

とすればいいと言われましたが
スレ違いでこれ以上尋ねるわけにも行かずこちらへ
来ました。
       Four four;
for(i=0; i<5; i++){
for(j=0; j<4; j++){
four[j]=j;
}
data.push_back(????);

}
ここの????の書き方が分かりません。
よろしくお願いします。
715デフォルトの名無しさん:2008/02/15(金) 21:27:13
>>713
すばやい回答ありがとうございます。継承の時と同じなのですね。
716デフォルトの名無しさん:2008/02/15(金) 21:31:00
>714
すいません、コピーがうまくいきませんでした。
書き込みがTABを上手いこと反映してくれないみたいですね。
717デフォルトの名無しさん:2008/02/15(金) 21:32:58
>>710-711
日本語でおk
718デフォルトの名無しさん:2008/02/15(金) 21:48:34
>>714
push_back は無理。
構造体にするならいける。

struct Four { int four[4]; };
719デフォルトの名無しさん:2008/02/15(金) 21:50:00
boost::array<int, 4>ってvectorの要素にできない?
720デフォルトの名無しさん:2008/02/15(金) 22:19:07
できる
721デフォルトの名無しさん:2008/02/15(金) 23:03:34
関数の中でたまにでてくる参照引数
(int & みたいな・・)
ってどういうとき使うんですか??

複数の関数内で1つの変数を使いたいときとかですか?

722デフォルトの名無しさん:2008/02/15(金) 23:04:13
>>721
コピーコンストラクタ作るとき
723デフォルトの名無しさん:2008/02/15(金) 23:05:43
>>721
・ 呼び出し元の変数の値を変更したい時
・ 巨大なオブジェクトをコピーせずに関数に渡したい時
724デフォルトの名無しさん:2008/02/15(金) 23:12:44
//身長を整数値として読み込んで標準体重を実数で表示

#include <stdio.h>

int main()
{
int na;
int weight;

printf("身長を入力してくれ:");
scanf("%d", &na);
weight = (na - 100) * 0.9;
printf("標準体重は%4.1f Kg", weight);

return 0;
}

これを実行しても標準体重が0.0 Kgになるんだけどどこを改善すればいいのでしょうか?
725デフォルトの名無しさん:2008/02/15(金) 23:14:04
>>724
×int weight;
○float weight;
726デフォルトの名無しさん:2008/02/15(金) 23:17:22
>>724
そのコードでちゃんと警告を出してくれるコンパイラに換えるか、そのように設定する。
727デフォルトの名無しさん:2008/02/15(金) 23:36:08
>>725-726
こんなのも分からん馬鹿でサーセン。cygwin使ってるんだけどロクに設定もできていないもんでして。
ありがとうございます。
728デフォルトの名無しさん:2008/02/15(金) 23:36:33
△float weight;
○double weight;
729デフォルトの名無しさん:2008/02/15(金) 23:41:41
>>727
つ[gcc -Wall foo.c]
730デフォルトの名無しさん:2008/02/15(金) 23:46:09
gcc -ansi -pedantic -Wall オススメ
731デフォルトの名無しさん:2008/02/15(金) 23:47:50
寧ろ、gcc -std=c99 -Wall -pedantic で。
732デフォルトの名無しさん:2008/02/15(金) 23:59:03
>718
構造体にしたらできました。
ありがとうございます。
733デフォルトの名無しさん:2008/02/16(土) 00:01:46
>719
boost::array自体が定義できないけど、必要なヘッダファイルとか
あったら教えてください。
VC6.0を使っています。
734デフォルトの名無しさん:2008/02/16(土) 00:10:27
>>733
まずはBOOSTでぐぐって来るんだ
735デフォルトの名無しさん:2008/02/16(土) 00:35:37
VC6 でコンパイルできるかなあ。
まあ array くらいならできるか。
736デフォルトの名無しさん:2008/02/16(土) 01:41:19
環境ってMicrosoft Visual C++ 6.0って書けば分かる?
737デフォルトの名無しさん:2008/02/16(土) 04:04:52
考えてある程度予想してみたんですが、この考えで合ってますか?

質問大量ですみませんが
(1)char *p="aaaaaaaaaaaaaaaaaaaaaaaaaaaa";やc="aaaaaaaaaaaaaaaaaaaaaaaaaaaa"
↑ポインタってアドレスを格納するのに何で文字列を入れれるの?
これはどこのアドレスを入れてるの?
自動的に領域を確保して"aaaaaaaaaaaaaaaaaaaaaaaaaaaa"を入れてそのアドレスを入れてるってことですか?
もしそうだとしたら、関数内で宣言してその関数からでた場合はその領域は開放されるんでしょうか?

(2)cout<<sizeof(c)<<endl;とした場合4になる
どうみてもaは5つ以上あるのになんで4なの?
これはchar *pのサイズ(参照するアドレスを入れる領域のサイズ)だからですか?
ちなみにstrlenだと35でした。

(3)sprintf(c,"aaaaaaaaaaaaaaaa");や strcpy(c,"aaaaaaaaaaaaaaaa");でコンパイルして実行するとエラー
これは確保されていない領域に無理矢理文字列を突っ込もうとしてるからですか?
738737:2008/02/16(土) 04:07:15
ごめんなさい間違えました。cを全部pとして考えてください
ついでに言うと(1)の2つめはこんなの
char *p;
p="aaaaaaaaaaaaaaaaaaaaaaaaaaaa";
739デフォルトの名無しさん:2008/02/16(土) 04:14:11
文字列リテラル(" " で囲んでるやつ)は、
その文字列の置いてあるアドレスを返す。
740デフォルトの名無しさん:2008/02/16(土) 04:18:58
ありがとうございます。ということは
プログラム起動した時点でa〜zや日本語,記号の全ての文字がメモリのどこかに
自動的に置かれるってことですか?
それとも"aaaa"の部分を実行した時点で文字列"aaaa"がメモリに置かれる?
741デフォルトの名無しさん:2008/02/16(土) 04:19:58
起動した時点で置かれてる。
742デフォルトの名無しさん:2008/02/16(土) 04:20:42
起動した時点で、"aaaa" が置かれる、ね。
743デフォルトの名無しさん:2008/02/16(土) 04:27:32
>>741-742
ありがとうございます。今まで知らずに使ってきました。
ずっと気になってたので教えてもらえてスッキリした
744デフォルトの名無しさん:2008/02/16(土) 08:26:22
>735
げ、自分でコンパイルするのか。
c++標準なのかと思った。
745デフォルトの名無しさん:2008/02/16(土) 08:33:14
>>744
Boostは事実上の準標準。
一部のライブラリ以外はヘッダのincludeのみで使える。
746デフォルトの名無しさん:2008/02/16(土) 09:08:08
>>737
> (3) sprintf(c,"aaaaaaaaaaaaaaaa");や strcpy(c,"aaaaaaaaaaaaaaaa");
> でコンパイルして実行するとエラー
> これは確保されていない領域に無理矢理文字列を突っ込もうとしてるからですか?

違う。

領域は確保されているが、文字列を突っ込めない (要は、書けない) 領域だから。
エラーになるかどうかは環境によって異なる。
素直に書き換わる環境もあるし、単に書き換わらないだけとか、全然別の場所の
文字列が勝手に書き換わるとかすることもある。

要するに、文字列の領域を書き換えるのは基本的にやってはいけない。

>>741-742
規格でそんなこと決まってたっけ?
747デフォルトの名無しさん:2008/02/16(土) 09:25:51
>>746
staticな変数と同じ寿命に決まっている。
748デフォルトの名無しさん:2008/02/16(土) 09:39:06
HTMLファイルの構文を解析して、UTF8形式をS-JIS形式に変換するにはどうすればいいですか?
749デフォルトの名無しさん:2008/02/16(土) 09:40:49
>>748
っ NKF
750748:2008/02/16(土) 09:41:44
インターネットエクスプローラで読み込んで、S-jisで保存するのをプログラムでやりたいんです
751748:2008/02/16(土) 09:43:06
>>749
すみません よんでませんでした
NKFはやったのですが、エンコード属性が指定されていたりして、文字化けしてしまいます
タグを解析する必要があるんです
752デフォルトの名無しさん:2008/02/16(土) 09:59:59
>>747
そもそも static な変数の寿命なんて決まってたっけ?

例えば、自動変数の寿命ははブロックに入った時から出るまでじゃないだろ。
利用されている区間がかぶらないとわかれば、違う変数を同じレジスタに割り
当てるコンパイラは珍しくない。

それと同じで、利用されてる区間がかぶらない static 変数を同じ領域に割り
当てちゃいかんのか?
753デフォルトの名無しさん:2008/02/16(土) 10:08:02
インターネットエクスプローラの名前をつけて保存 (エンコード指定) だけを利用するには
どうすればいいですか?
754デフォルトの名無しさん:2008/02/16(土) 10:40:02
>>752 のいう同じ領域っていうのは物理メモリの領域を指してるの?
755デフォルトの名無しさん:2008/02/16(土) 10:44:34
>>753
「IEコンポーネント」で調べてみては?
756デフォルトの名無しさん:2008/02/16(土) 10:52:38
>>753
HTMLの解析とコード変換はMSXMLとADODBを使えばできるがお前には無理。
757デフォルトの名無しさん:2008/02/16(土) 10:55:58
インクルードファイルだけ入れて
boost::array<int,4> d;
std::vector<d> data;
と定義だけはエラーが出ないのはいいのですが
実際はどのように使えばいいのでしょうか。

d[0]=0;
d[1]=1;
d[2]=2;
d[3]=3;

data.push_back(d); //この部分がエラー

としてもコンパイルエラーが出ます。
758デフォルトの名無しさん:2008/02/16(土) 11:06:03
>757
すいません。できました。別に原因があったようです。
759デフォルトの名無しさん:2008/02/16(土) 11:31:11
#include <stdio.h>
class Test{
public:
static int ary[4];
};

int Test::ary[] = {0,1,2,3};

int main(){
printf("%d\n", Test::ary[2]);
}

すみません。上記のように1次元配列だと初期化できるのですが
2次元配列にするとどう記述しても初期化できません。
例えば
static int ary[2][4];
};

int Test::ary[] = {0,1,2,3, 5,6,7,8};

にすると
error C2040: 'ary' : 'int []' は 'int [2][4]' と間接操作のレベルが異なります。
となりますし
多次元配列のメンバ変数を初期化する方法はないものでしょうか?
760デフォルトの名無しさん:2008/02/16(土) 11:42:03
>>759
int Test::ary[] = {0,1,2,3, 5,6,7,8};
これはおかしいよ。

int Test::ary[2][4] = { { 0,1,2,3 }, {5,6,7,8} };
とかじゃないの?
761デフォルトの名無しさん:2008/02/16(土) 11:51:33
>>760
有難うございます。上手くいきました。
int Test::ary = { { 0,1,2,3 }, {5,6,7,8} };

int Test::ary[][] = { { 0,1,2,3 }, {5,6,7,8} };

int Test::ary[0][0] = { { 0,1,2,3 }, {5,6,7,8} };
で試してみて上手くいかなかったのでどうやるのかと思っていました。
[2][4]と書けば良かったのですね。
762デフォルトの名無しさん:2008/02/16(土) 12:04:02
>>752
厳密には寿命と記憶期間は別物だが、
大抵の人は普段は記憶期間の意味で寿命という言葉を使う。
763デフォルトの名無しさん:2008/02/16(土) 12:16:55
記憶期間なんて言う俺俺用語を語られても...
764デフォルトの名無しさん:2008/02/16(土) 12:23:50
記憶域期間だった
765デフォルトの名無しさん:2008/02/16(土) 12:43:32
auto_ptrについて質問です。
以下のコードを実行したとき、throw(A)のあとで
TTestクラスのデストラクタが呼び出されると思っていたのですが呼び出されません。
auto_ptrってこういうものなのでしょうか?

TTest* TTest::NewL()
{
std::auto_ptr<TTest> self(new TTest());
throw 1; // A
return self.release();
}
766デフォルトの名無しさん:2008/02/16(土) 12:47:54
例外を投げた際、デストラクタが呼ばれるのは例外が捕捉された時。
例外が捕捉されなければ呼ばれないかもしれない(環境依存)。
auto_ptr の問題じゃなくて、C++ の仕様の問題。
767デフォルトの名無しさん:2008/02/16(土) 12:48:27
>>765
catchしたか
768765:2008/02/16(土) 12:53:01
すみません、catchしたかどうかが重要とは知らず書いてませんでしたが、catchはしています。
ちなみに、std::auto_ptrの部分を自作のsmart_ptr(スマートポインタの解説サイトを参考に作成)
にした場合はきちんとデストラクタが呼ばれました。

コンパイラはBorland C++ Compiler 5.82 なのですが、これのauto_ptrがポンコツなのかも…
769デフォルトの名無しさん:2008/02/16(土) 12:58:41
memory ヘッダの中を読んでみたら?
770デフォルトの名無しさん:2008/02/16(土) 13:01:09
とりあえず gcc だと呼ばれる。
771765:2008/02/16(土) 13:12:49
う〜ん、中身見てみましたがおかしいと思えるところは見つからず…
auto_ptrのソースをちょこっと改造して試したところauto_ptrのデストラクタ自体が呼ばれてないようでした。

ただ、gccだと正常に呼ばれるとのことなのでBCCが悪いということで解決します。
どうも、ありがとうございました。
772デフォルトの名無しさん:2008/02/16(土) 13:16:48
BCC の「どこが」悪いかちゃんと調べないと、
他の所でも沢山困る所があるかもしれないぜ。
773デフォルトの名無しさん:2008/02/16(土) 13:19:46
とりあえず俺がチェックに使ったコード。
どう表示される?

#include <iostream>
#include <memory>

class Test {
public:
Test(int n) : n(n) { }
~Test() { std::cout << "~Test(" << n << ")" << std::endl; }
static Test* New() {
Test test1(1);
std::auto_ptr<Test> test2(new Test(2));
throw 1;
return NULL;
}
private:
int n;
};

int main() {
try {
Test* test = Test::New();
test = test;
} catch(int n) {
std::cout << "catch" << std::endl;
}
return 0;
}
774デフォルトの名無しさん:2008/02/16(土) 13:26:09
>>773
BCCで試したところ、以下のように表示されました。
やはりtest2が削除されないようです。

~Test(1)
catch

>>772
確かに…引き続き調査はしてみます。
775デフォルトの名無しさん:2008/02/16(土) 13:27:49
memory をいじってコンストラクタで文字列表示するようにして、
それが表示されるかチェックしてみれ。
776デフォルトの名無しさん:2008/02/16(土) 13:56:28
HTMLファイルの構文を解析して、UTF8形式をS-JIS形式に変換するソースありますか
777デフォルトの名無しさん:2008/02/16(土) 14:00:52
>>776
あるけどおまえにはそれすら無意味
778デフォルトの名無しさん:2008/02/16(土) 14:28:58
>>752
staticな変数の生存期間はそのプログラムが起動されてから終了されるまで。
絶対に外部から参照される恐れが無い場合でもなければ、使い回しはできない。
例えば、strtok()やlocaltime()は内部のstaticな領域を返すように実装されていることが多い。
従って、その関数を呼び出した先で参照する可能性があるからコンパイラはこれを取り除くことができない。
779デフォルトの名無しさん:2008/02/16(土) 15:07:48
> 絶対に外部から参照される恐れが無い場合でもなければ

そのときの話をしてるんだが?

アドレス取られたら削除できないのはあたりまえ。

また、絶対に外部から参照されないケースなんてほとんどないので、
大概の実装ではそんな最適化をしていないと思う。

問題にしているのは、規格としてそう言うことをしていいかどうか
だよ。
780デフォルトの名無しさん:2008/02/16(土) 15:23:33
>>779
規格を云々したいのなら折角そういうスレがあるんだからそちらへどうぞ。
781デフォルトの名無しさん:2008/02/16(土) 15:25:24
異なるオブジェクトは異なるアドレスを持たないという規定がなかったかな?
仮にあったとしても、779の状況では、
プログラム上から異なるアドレスであることを確かめるすべはないと思うけど。
782デフォルトの名無しさん:2008/02/16(土) 16:08:56
とりあえず、同じ内容の文字列リテラルが複数箇所に書かれた場合、
それらは同じアドレスに置いても構わない。
また、"abc" というのと "bc" というのがあった場合、
"bc" のアドレスが "abc" + 1 であっても構わない。
783デフォルトの名無しさん:2008/02/16(土) 18:00:20
struct f_point{ float x, y; };

f_point square[4]; // 正方形の頂点が入る
for(float angle=0;angle<PI*2;angle+=PI/16){
 ...
}

構造体squareに正方形の頂点4点の平面座標が入るとして、
その正方形の中心を軸に回転させるには
forの中でどういう風に書けばよいでしょうか?
784デフォルトの名無しさん:2008/02/16(土) 18:08:56
そういう扱い方するんだったら、
正方形を中心と、どれか1つの頂点の角度とで扱えばいいんじゃね?
785デフォルトの名無しさん:2008/02/16(土) 18:13:27
>>783
宿題スレでもいけばいいんじゃね?解答もらえるよ

x, yをx + y iの複素数とみなして
cosθ + i sinθを掛けた値の実部と虚部を取る
計算を行うようにするとか

x * cosθ-y * sinθ, x * sinθ+y * cosθ
になるんじゃなかったかな多分
786デフォルトの名無しさん:2008/02/16(土) 18:15:37
中心px,py 半径r 角度θ

x度回転するには、σ(n) = θ + (x+90n) *π/360

px + r cosσ(n) , py r sinσ(n)に変換する
787デフォルトの名無しさん:2008/02/16(土) 18:17:45
ループ変数に float 使うなよ・・・。
誤差で境界条件が重い通りにならないかもしれないんだから。
788デフォルトの名無しさん:2008/02/16(土) 18:19:30
×構造体square
○構造体f_pointの配列square

つ[アフィン変換]
789デフォルトの名無しさん:2008/02/16(土) 18:22:09
(原点ずらす移動の変換行列) × (回転行列) × (原点戻す移動の変換行列)

をかければいいんだろ
790デフォルトの名無しさん:2008/02/16(土) 18:27:16
境界条件っつーと、微分方程式の特種解を決定する物を思い浮かべてしまう
なんかビミョーな違和感
791デフォルトの名無しさん:2008/02/16(土) 18:38:47
// オレ言語ならこれで逝けるぜw
f_point center = average(square, square + 4);
for (int angle = 0; angle <= 360; ++angle) {
for (int ic = 0; ic < 4; ++ic) {
print ([square[ic].x square[ic].y] - [center.x center.y]) * [cos(angle * rad) sin(angle * rad); -sin(angle * rad) cos(angle * rad)] + [center.x center.y];
}
}
// 要は、正方形の中心が原点になるように移動して、回転してから再び移動(≒>789)
792デフォルトの名無しさん:2008/02/16(土) 18:43:04
>>785
ほんとごめんなさい、よく読んでませんでした
原点中心回転してました
793デフォルトの名無しさん:2008/02/16(土) 19:51:23
文字列で入力された
char a ;
を、関数の中で数値に変換して
int a ;
にしたいんだ

同じ変数名aなんだけど
char → int
ってできますか?(´`)
794デフォルトの名無しさん:2008/02/16(土) 19:55:18
スクリプト言語を使った方が幸せになれそうな予感
795デフォルトの名無しさん:2008/02/16(土) 20:00:53
>>793
それだと1文字だろうし最初からintで受け取ればいい
796デフォルトの名無しさん:2008/02/16(土) 20:01:01
>>793
文字とか文字列を数値にしたいとかじゃなくて

char型変数を名前そのままにint型変数に変えたいんだな?無理です
797783:2008/02/16(土) 20:04:07
>>784-792
ありがとうございます。無事できました。

float fCenterX = ( x1 + x2 ) / 2;
float fCenterY = ( y1 + y2 ) / 2;
float fR = ( float )hypot( fCenterX - x1, fCenterY - y1 );
float fX[] = { x1, x2, x1, x2 };
float fY[] = { y1, y1, y2, y2 };
float fA_[] = { 7, 5, 1, 3 };
for( int i = 0; i < 4; i++ ){
fX[ i ] = fCenterX - fR * cos( fAngle + D3DX_PI / 4 * fA_[ i ] );
fY[ i ] = fCenterY + fR * sin( fAngle + D3DX_PI / 4 * fA_[ i ] );
}
798デフォルトの名無しさん:2008/02/16(土) 20:18:21
VisualStudio2008買いました。

重くなるかな?と思ったら、逆に軽くなりましたねw
やっぱVistaとVS2005との相性が悪かったんでしょうか。

感激です。
799デフォルトの名無しさん:2008/02/16(土) 20:22:36
はぁ?相性だぁ?
800デフォルトの名無しさん:2008/02/16(土) 21:01:00
>>798
単純に2005より最適化されて軽くなっただけ
801デフォルトの名無しさん:2008/02/16(土) 22:39:14
C++クラスのstaticについて質問です。

親クラスに作ったstatic変数は、
全子クラスで共有するのでしょうか?

それとも、各子クラスに一つずつ、
オーバーライドした同名のstatic変数ができるのでしょうか?

それとも、static変数は継承できず、
各子クラスで同名のstatic変数を宣言しなければいけないのでしょうか?
802デフォルトの名無しさん:2008/02/16(土) 22:51:28
実験すればいい。
その結果の通りだ。
803801:2008/02/16(土) 22:53:37
確かに。。。
めんどくさくて質問してしまいました。すいません。
試してみます。
804デフォルトの名無しさん:2008/02/16(土) 22:54:13
>>801
その中では全子クラスに共有というのが一番近いが、
正確には親クラスにしか存在しない。
ただし、protectedやpublicなら子クラスからでもアクセスできる。
805デフォルトの名無しさん:2008/02/16(土) 22:56:06
実験してこうなったけど、これって規格通りなのですか?
という質問なら良し。
806デフォルトの名無しさん:2008/02/16(土) 22:58:58
>>795
>>796

ありがとうございました!!
807801:2008/02/16(土) 23:02:26
>>803
ありがとうございます。

具体的に何をやりたかったかというと、
各子クラスのstatic変数にアクセスするstatic関数を、
親クラスに作りたかったのです。

static変数は各子クラス別々のものを使うけど、
それに対して行う処理は全子クラスで共通だったので。
808デフォルトの名無しさん:2008/02/16(土) 23:05:56
何か想像付かない処理だ。
本当にその実装方法しか無いんけ?
static 変数は基本的には再利用性を阻害する癌のような物だから、
ないならないで済むのが一番いいのだが。
まあ、使い勝手と天秤にかけたら static 変数に軍配が上がることもあるけど。
809デフォルトの名無しさん:2008/02/16(土) 23:19:34
CRTPと言って、親をクラステンプレートにするという手がある。ATLがよく使っている。

template<typename T>
class Base
{
//T::Hogeを使う。
};

class Derived : public Base<Derived>
{
public:
static const int Hoge = 10;
};
810801:2008/02/16(土) 23:22:31
>>808
説明しづらいのですが、
シューティングゲームで、敵ユニットを表すクラスを作っています。

まず親クラスUnitがあって、敵の種類ごとにUnitを継承したクラスを作っています。

敵一匹がUnitのインスタンスになるのですが、
ユニットに使う画像はインスタンスごとに持っている必要は無く、
ユニットの種類ごとにあればいいので、Unit各子クラスのstatic変数にしてます。

だけど、その画像に対して行う処理は、
敵の種類に関わらず全クラス共通なので、親クラスのUnitに作りたい。
そんな感じです。

C++も、ゲーム作るのも初めてなので、
もっといい実装方法案があったら、教えてもらえると嬉しいです。
811デフォルトの名無しさん:2008/02/16(土) 23:25:32
>>810
とりあえず一旦動くところまで組み上げてしまうんだ
どんなにソースコードが汚くなろうとも

その後で、こうしているんですが
もっと良い方法はありませんか?
と質問するヨロシ
812デフォルトの名無しさん:2008/02/16(土) 23:31:23
それなら static 変数でもいいかもしんないけど、
画像が要らなくなった時に破棄したくなったとき少し面倒かもね。

俺なら敵ユニット作成クラスと画像管理クラスを作るかな。
でも、とりあえずそれで組んでみてもいいんじゃね。
813デフォルトの名無しさん:2008/02/16(土) 23:31:50
お聞きしたいのですが
参考書に
array[index]の結果は*((array)+(index))と同じなので

char ch = p[3];

char ch = 3[p];
(pはポインタ)
は、同じ処理だと書いてあったのですが、データ型がintの場合は3が12バイト分になってdoubleの場合は3が24バイト分になるはずなので
一概に「3+pに格納されてるアドレスの数値」って言えない気がしたのですが何か考え方が間違っているのでしょうか?
814デフォルトの名無しさん:2008/02/16(土) 23:33:59
*(p+3) と *(3+p) で結果が違うわけなかろう
815デフォルトの名無しさん:2008/02/16(土) 23:35:29
>>813
ポインタとアドレスは違う(似ているからややこしいが)
char a[2];
double b[2];
printf("%p %p\n", &a[0], &a[1]);
printf("%p %p\n", &b[0], &b[1]);
816デフォルトの名無しさん:2008/02/16(土) 23:40:10
例えば p の示すアドレスが 0xb1832100 の時、
p が char* なら p + 3 は 0xb1832103 に、
p が int* (int は4バイトとする)なら p + 3 は 0xb183210c に、
p が double* (double は8バイトとする)なら p + 3 は 0xb1832118 になる。
だから、一概にそう言える。
817801:2008/02/16(土) 23:41:36
>>809
ありがとうございます。
テンプレートというのは知りませんでしたが、使えそうな気がします。

>>811
確かにそうですね。
後から実装を作り替えるのは手間ですが、
実際動くと、モチベーション上がりますよね。

>>812
画像破棄用の全画像リストは、ユニットとは別に作ってます。
ユニットは敵の種類ごとに画像をロードすると同時に、
画像マスターリストにロードした画像を登録して、一括で破棄してます。
818デフォルトの名無しさん:2008/02/16(土) 23:45:31
>>817
なるほど。
あと、ある敵ユニットから派生して新しい敵を作りたい時に困るかもね。
そういうことがあるかどうか、だが。

画像オブジェクトへの参照のようなもの、
あるいは画像リストのインデックスのようなものを保持させるなら、
ユニットごとにそういう情報を持っていたのでも
大した容量圧迫にはならないと思う。
819813:2008/02/16(土) 23:49:56
そーか、ポインタ=アドレス みたいに考えてしまっていました。
腑に落ちました。ありがとうございましたm(_ _)m
820デフォルトの名無しさん:2008/02/17(日) 00:00:03
>>812
static変数の初期化は各子Unitじゃなくて、別の何か(親Unit?)がしてるの?もしそうなら
設計ミスだと思うよ。
それじゃstatic変数をグローバル変数として使ってるのとかわりがない。
static変数の初期化は子Unitが行うべき。

ところで
>各子クラスのstatic変数にアクセスするstatic関数を、
これがイメージできないんだけど、具体的に何をする関数を作りたかったの?

parentStaticFunction( childStaticImage );

みたいな感じで子Unitが呼び出しちゃダメなの?
821デフォルトの名無しさん:2008/02/17(日) 00:03:45
画像管理クラスに対する処理にはできないものなのかな。
あるいは仮想関数にするか。
822デフォルトの名無しさん:2008/02/17(日) 00:13:42
WIN32 APIのSetROP2と同じ様な機能を持つ、CarbonAPIをご存じの方いませんか?
開発環境:Winは.net2002 + SDK, MacはCordWarrier pro 5 + Carbonです。
823822:2008/02/17(日) 00:15:40
使用言語はCです。
824801:2008/02/17(日) 00:18:43
>>818
ユニットクラスが持ってるのは画像のポインタなので、容量はたいしたことないと思いますが、
大量に敵が出るので、オブジェクトごとにそれを作る負荷がどんなもんか想像つかなくて、
なるべく共有できるものは共有しようと思いました。

>>820
初期化はちゃんと各子Unitでやってます。

>parentStaticFunction( childStaticImage );
これはできます。
今までJavaしかやったことなくて、決まりきった引数を指定するのが嫌だったのです。
神経質ですいません。
でも、割り切ってこれが一番現実的でいいかもしれませんね。

>>821
>画像管理クラスに対する処理
ありがとうございます。
難しそうですが、それは一考の価値があるかも。
825デフォルトの名無しさん:2008/02/17(日) 00:23:25
敵の大量具合によるんじゃないか?
1億体出るなら馬鹿にできないし
826デフォルトの名無しさん:2008/02/17(日) 00:24:10
ごめん、JavaこそparentStaticFunction(childStaticImage);
のようなことをするしかない気がするんだけど。
827デフォルトの名無しさん:2008/02/17(日) 00:26:03
ポインタなんて大抵4バイトだし、
敵5000体出した所でたった20キロバイト。
これ以上敵を出そうとしても処理落ちひどくて無理だでよ(5000体でもキツいだろう)。
誤差の範囲だ。
828デフォルトの名無しさん:2008/02/17(日) 00:26:55
829801:2008/02/17(日) 00:29:38
>>825
>1億体
出ませんw 最大でも1500くらい。

>>826
そういえばJavaでstatic変数をオーバーライドなんてやったことなかったですw
Javaに比べて、C++とWin32APIは引数が多くて嫌だなと、なんとなく思ってただけです。

すげー悩んで試行錯誤しながら、今の形になってきたんですが、
要件を聞いただけで、ぱっと思いつくなってみんな凄いですね。
破棄のための画像管理クラスなんて最初全然考えてなくて、後から作りました。
830822:2008/02/17(日) 00:58:39
>>828
PenModeの8つのモードすべてで試したのですが駄目でした。私もPenModeだと思ったんですが。。。
SetROP2のように前景モードで動作するのではなく、GrafPort自体に描画しているようです。
Carbonを使い始めて2ヶ月程度なので、間違いがあったらごめんなさい。
831デフォルトの名無しさん:2008/02/17(日) 01:47:40
>>830
んー。前景と背景の合成方法を設定するAPIだから、やってることは同じだと思うけどね。
PenModeは現在のGrafPortに対して作用するんで、SetPortPenModeでポートを指定したらどうかな。
もうやってるかもしれないけど。

俺はCocoaな人なので、あんまり力になれなくてすまん。新・mac板の方が詳しい人いるかもね。
832822:2008/02/17(日) 12:07:03
>>831
書いてなかったけど、ラバー バンディングを実行したくて行き詰まってしまいました。
マウスをドラッグしている間、直前に描かれた線を上書きで消して新しいPointに対する
線を描くという動作なんですが、最後にInvalWindowRectするとエンティティ自体は
正常に描かれます。エンティティ自体を移動させても余計に描画された線は消えます。

長くなって済みません。Macの開発環境がまだ自宅にないので明日会社でSetPortPenMode
を適用してみます。ありがとうございました。
833デフォルトの名無しさん:2008/02/17(日) 12:19:09
1999/12/31 23:59:59
2008/02/17 11:53:59
みたいな日付をint型もしくはunsigned int型にしたいのですがどうすればいいのでしょうか?
秒に変換する事も考えましたが2008*365*24*60*60だとintに収まり切りません。

そのまま文字列で保存すればいいかもしれませんが、
この値をstlのmapのキーにしてソート等を行いたいので文字列だと遅そうなのでint型にしたいです。

スレ違いかもしれませんが何か良い方法があれば教えてください。
お願いします。
834デフォルトの名無しさん:2008/02/17(日) 12:27:22
もろ環境依存だけど、__int64とか使えればそのまま入れられるんじゃないかな
835デフォルトの名無しさん:2008/02/17(日) 12:34:17
区切り文字をあり得ない数字の連続に置き換えるとか
836デフォルトの名無しさん:2008/02/17(日) 12:34:32
>>833
年だけ別にしたら?

struct Date
837デフォルトの名無しさん:2008/02/17(日) 12:35:41
すまん送信ミス。
struct Date
{
unsigned int year;
unsigned int sec;
};

みたいに。
838デフォルトの名無しさん:2008/02/17(日) 12:39:52
>>837
それをそのまま使おうとしてmapで使えないと質問しにくるとみた
839833:2008/02/17(日) 12:53:46
みなさんレスありがとうございます。

>>834
自分の環境では__int64使えるみたいだったけど、他のPCで実行したらどうなるか分からないので今回は辞めておきます。

>>835
えっと、どういう意味ですか?

>>836-838
なるほど。そういう手もありましたね。
つまり、比較演算のオペレーターを自作するって事ですよね?
ちょっと、その方法でやってみます。
840デフォルトの名無しさん:2008/02/17(日) 12:56:41
今64ビット化が進んでいるtime_tはどう?
841デフォルトの名無しさん:2008/02/17(日) 13:05:02
閏秒とか考慮しなくていいならそれでいいか
暦法の微妙な問題に足突っ込みたくなければ全部秒で表した方が無難
しかし使えるならboost::gregorian使っとくのが楽ではある
842デフォルトの名無しさん:2008/02/17(日) 13:06:27
>>833
年が1999年以降しかなくて、2099年までしか使わないのであれば
unsigned intでも収まりそうな気がする
843デフォルトの名無しさん:2008/02/17(日) 13:10:27
キーワード:
通算秒
time_t
844デフォルトの名無しさん:2008/02/17(日) 13:21:04
て言うか、「文字列だと遅そう」って思ってるだけじゃないのか?

まずはこれで実装してみて、ほんとにそこがネックになってるなら
いろいろ工夫すればいいと思う。
845833:2008/02/17(日) 13:55:31
みなさんいろいろなアドバイスありがとうございました。
キーを構造体にするという>>836-837さんのやり方で出来たので今回はこれでいこうと思います。

>>840,843
time_tと言う変数は知りませんでした。今度調べてみようと思います。

>>841
閏秒の問題は考えてませんでした。
そこまでの制度の秒を管理する訳じゃないので今回はこれで・・。
boost::gregorianと言うのも知らなかったので調べておきます。

>>842
確かに年を3桁にすれば入りそうですね。
そんなに広い範囲の年を扱う訳じゃないのでそれで良いかもしれませんがなんかなw

>>844
一応、キーをUINT, string, struct{UINT, UINT}の3パターンで挿入の時間を計ってみた所、
UINT > struct{UINT, UINT} > stringの順で速かったです。
Cは文字の扱いにあまり優れていないと聞いたことがあるのでそう思ってました。すいません。

とりあえず、これで解決とさせて頂きます。ありがとうございました。
846デフォルトの名無しさん:2008/02/17(日) 14:05:06
time_tは型だ
847デフォルトの名無しさん:2008/02/17(日) 14:08:39
time_tは__int64をtypedefしただけだったりな 環境にもよるが
848デフォルトの名無しさん:2008/02/17(日) 14:13:50
標準かどうかが大きな違い。
849デフォルトの名無しさん:2008/02/17(日) 14:20:16
longだったりする可能性があることを考えたら、
素直に__int64使ったほうがマシだと思うけど
850デフォルトの名無しさん:2008/02/17(日) 14:21:27
せめてlong longがいいな。
851デフォルトの名無しさん:2008/02/17(日) 14:26:08
案外void*だよ
852デフォルトの名無しさん:2008/02/17(日) 14:37:03
>>845
1970年の1月1日とかからカウント始めれば、精度が秒くらいならunsignedな32bitで十分収まる。
853デフォルトの名無しさん:2008/02/17(日) 14:42:10
googleでかなり調べたのですが、RC4が
うまくコンパイルがとおらないので、教えてください。
fedora core1で、コマンドラインからc++でコンパイルしてます。
---------------------
#include <stdio.h>
#include <openssl/rc4.h>

int main(){
RC4_KEY key1;
const char *keystring = "HOGEHOGE";

RC4_set_key(&key1, 4, (unsigned char *)keystring);
return 0;
}
---------------------
コンパイルすると下のようになります。
----------
/tmp/ccuOdmEl.o(.text+0x30): In function `main':
: undefined reference to `RC4_set_key'
collect2: ld はステータス 1 で終了しました
-------------
未定義の関数を用いているようなエラーですが、
rc4.hをインクルードしているのですが、
どこがいけないのでしょうか?
854デフォルトの名無しさん:2008/02/17(日) 14:43:57
どうやってコンパイルしたの?
855デフォルトの名無しさん:2008/02/17(日) 14:48:34
>>854
コマンドラインから
%c++ main.cpp
としました。
すると、上記のエラーが表示されます。
856デフォルトの名無しさん:2008/02/17(日) 14:51:51
ライブラリリンクしようよ(´・ω・`)
857デフォルトの名無しさん:2008/02/17(日) 14:52:16
WindowsのVARIANT型だとdoubleじゃなかったかな

普通は専用のAPIで触ることになるが、
1989/12/30からの日数(1日=1.0で、1秒が1/86400)という単純な仕様
だったと思うんで、自分で計算するのも別に難しくは無いはず

精度(有効範囲)は流石に2038年でオーバーフローする32bitのtime_tよりは
ずっとマシ
858デフォルトの名無しさん:2008/02/17(日) 14:52:30
>>845
time_tなら標準関数の支援を受けられるし、説明も楽だな。
859デフォルトの名無しさん:2008/02/17(日) 14:53:35
>>857
今時、time_tは64ビットですが。
860デフォルトの名無しさん:2008/02/17(日) 14:55:30
>>859
そりゃ環境による、でしょ
ま、言い方が悪かったか。「time_tが32bitだ」と言ってるんじゃなくて、
「time_tが32bitであるような環境では〜」と読んで欲しい。
861デフォルトの名無しさん:2008/02/17(日) 14:57:43
たとえばMSVCでは、6までは32bit
未だに現役で使われてもいるコンパイラなので、注意な
862デフォルトの名無しさん:2008/02/17(日) 14:59:15
>>856
すみません、そのライブラリリンクとは
どのようにやるのか教えていただきたく。。。
863デフォルトの名無しさん:2008/02/17(日) 15:04:51
いただきたく。。。なんなんだ?
。。。とかね、もう質問の仕方なんて義務教育中に学べと
864デフォルトの名無しさん:2008/02/17(日) 15:05:16
VCで
プログラムからキーを押すプログラム作りたいのですが
mouse_event
みたいな関数教えていただけないでしょうか?
865デフォルトの名無しさん:2008/02/17(日) 15:07:03
それだけじゃいまいちはっきりしないがgetch()とか
866デフォルトの名無しさん:2008/02/17(日) 15:09:08
すみません、質問の仕方がわるかったです。
プログラムからキーボードの'A'ボタンを押したいのです。
どうすればよろしいでしょうか。
867デフォルトの名無しさん:2008/02/17(日) 15:15:23
>>863
義務教育での勉強不足で失礼いたしました。
今後は、質問の仕方を改めますので、
ご教示のほどよろしくお願いいたします。
868デフォルトの名無しさん:2008/02/17(日) 15:18:05
>862
RC4を使ったことがないのでどのファイルをリンクすべきなのか俺にはわからない。
一般に、よほどのことが無い限り、コンパイルするときは関数の実体が入ってるファイルをコンパイラに教えてあげないと
コンパイラが迷子になってしまう。
/usr/lib/libRSAglue.a
/usr/lib/libcrypto.a
/usr/lib/libssl.a
さらっとぐぐったかんじだとこのへんのどれかじゃないかとは思うけど。

>866
やっぱりわかんない。
関数に引数として'A'をあげてやればいいだけなのでわ?と思ってしまう。
869デフォルトの名無しさん:2008/02/17(日) 15:19:40
>>864
mouse_eventときたらkeybd_eventだろ
870デフォルトの名無しさん:2008/02/17(日) 15:20:28
>>865
getch('A')だと、Aボタンが押されたことを感知する命令ですよね。
putch('A')みたいな命令があればと思ってお聞きしたのですがm(_ _)m
871デフォルトの名無しさん:2008/02/17(日) 15:21:17
>>869
keybd_eventですか、
使い方をググってみますね
872デフォルトの名無しさん:2008/02/17(日) 15:28:41
>>859
Windows の VARIANT 型とか言ってる奴は、どうせ Excel ぐらいしか
触れないんだから、スルー推奨。

>>862
目立関係者か?

「いただきたく」なんてローカル用語使うなよ。
873デフォルトの名無しさん:2008/02/17(日) 15:31:58
>>869
ご教授感謝です、その方法でドンピシャであります!
874デフォルトの名無しさん:2008/02/17(日) 15:51:29
>>868
/usr/lib/libssl.a
で無事動きました。
ありがとうございました。
875デフォルトの名無しさん:2008/02/17(日) 17:44:00
>866
keybd_event
876デフォルトの名無しさん:2008/02/17(日) 17:46:00
更新し忘れ。

>872
どうでもいいが、目立関係ないうちの会社でもこの用法の「いただきたく」はたまに使われてる。
877デフォルトの名無しさん:2008/02/17(日) 18:26:26
教えて頂きたく存じます だろ。
878デフォルトの名無しさん:2008/02/17(日) 22:16:26
>教えていただきたく

そもそも話題になってる意味が分からんのだが。
879デフォルトの名無しさん:2008/02/17(日) 22:26:04
x86_64環境でiccでc++のソースをコンパイルできません。
> icpc ./exercise.4.1.cpp
ld: skipping incompatible /usr/lib64/gcc/x86_64-suse-linux/4.1.2/32/../libstdc++.so when searching for -lstdc++
ld: skipping incompatible /usr/lib64/gcc/x86_64-suse-linux/4.1.2/32/../libstdc++.a when searching for -lstdc++
ld: cannot find -lstdc++
これはどうすればよいですか?
googleしてみたけど、似たような人がみつけられませんでした。
どうかお願いします。
880デフォルトの名無しさん:2008/02/17(日) 22:30:05
標準ライブラリが見つからないというエラーに見えるが
881デフォルトの名無しさん:2008/02/17(日) 22:33:52
>>879
iccのインストール先のbinディレクトリ内にある、環境設定用のスクリプトを動かしてみたら?
882デフォルトの名無しさん:2008/02/17(日) 23:33:06
参照を戻り値にする関数 (例えば int &sample(); )
って、呼び出す時 int hoge = sample(); って呼び出しますよね。
(ポインタを返す関数は呼び出すときに * を使うけど参照を返す関数は & を使わない。)

ってことは int &sample(); が定義されてる時は int sample(); は同一モジュール内で定義できないってことなんでしょうか。
呼び出すときの名前が同じですよね。
一応自分で試したらエラーが出たのでやはり不可ってことなのだと思うのですが合ってるでしょうか?
883デフォルトの名無しさん:2008/02/17(日) 23:36:09
戻り値の型のみが異なる関数は2つ以上同一スコープ内に作る事が出来ない。
引数に違いが無いとオーバーロードはできない。
884デフォルトの名無しさん:2008/02/17(日) 23:46:15
たとえばC言語で昔よく使ったprintfやscanfは戻り値はint型だ。void型ではない。
けど、戻り値を使っていないプログラムを見たことあるよな?
関数の戻り値を必ず使う必要はないわけだ。

sample();

こういう呼び出しがあった場合、どちらを使えばいい?
コンパイラには判断しようがないため規格上できないようになっている。
885884:2008/02/17(日) 23:52:55
>>883 さん
レスありがとうございます。

あれ、そもそも
int sample();

int &sample();
は、戻り値の型が同じではないんですか?
どっちもint型ですよね?

&sample(); そのものが参照で、その参照が指しているアドレスの値をint型のhogeに戻り値として返す、ということだと思ってたのですが、違うんでしょうか??


>>884 さん
なるほど。
int hoge = sample();

int hoge = &sample();
みたいにして、使い分けはできんのかなと思ったのです。
int hoge = &sample(); とするとエラーが出るし、やっぱりできないということなんですね。
ありがとうございましたm(_ _)m

886↑884:2008/02/17(日) 23:54:30
884じゃなくて882でした。
887デフォルトの名無しさん:2008/02/17(日) 23:55:40
>>885
違う。
int & sample()は、「intの参照型」を返す関数だ。
888デフォルトの名無しさん:2008/02/17(日) 23:57:32
どこかに C++ 標準ライブラリの
完全なリファレンスマニュアルってないですか?
検索してみたのですか、ほとんどが一部しか載ってなくて…
ソースか書籍しか無いのでしょうか…?
889882:2008/02/18(月) 00:02:07
>>887 さん
レスありがとうございます


それなら
int &hoge = sample();
みたいにhogeの前に & が必要な気がするのですが
int hoge = sample();
でもエラーにならないのはなんでなんでしょう?(sample(); は参照を返す関数だとして)
int hoge = sample();
だとhogeはint型の参照じゃなくて普通のint型として定義されてますよね。
890デフォルトの名無しさん:2008/02/18(月) 00:09:12
int &x;
があったときに
int y = x;
ってできるのと一緒
891882:2008/02/18(月) 00:19:53
>>890さん
レスありがとうございます。

なるほど、てことは
&sample()
{
...
}
int hoge = sample();
とあったとき、hogeもsample()そのものも、どっちとも参照型ってことでいいんでしょうか?
892デフォルトの名無しさん:2008/02/18(月) 00:22:02
int hoge = だったら、hogeは参照じゃないだろう
sample() の戻り値が参照してる先の値をコピーしてるんだよ
893882:2008/02/18(月) 00:22:24
&sample() → int &sample()
ですね...
894デフォルトの名無しさん:2008/02/18(月) 00:24:04
横から質問させてください。
>>890は(暗黙の)型変換の一つであり、
T&からTへの型変換はdereferenceである
と考えて正しいですか?
895デフォルトの名無しさん:2008/02/18(月) 00:29:37
>>894
型変換じゃないと思うよ。ただの dereference というか。
896デフォルトの名無しさん:2008/02/18(月) 00:30:20
897879:2008/02/18(月) 00:31:47
>>880-881
ありがとうございます。環境設定用のスクリプトは呼び出してるんですが、、、
どうも変なところにstdc++を探しにいっているような、、
どこに探しに行っているかをしらべるコマンドってなかったでしたっけ?
898デフォルトの名無しさん:2008/02/18(月) 00:33:28
>>888
完全なっていうなら JIS の閲覧用クソ重いやつか、 ISO のドラフトがいいかもね。
899882:2008/02/18(月) 00:38:22
>>892 さん
レスありがとうございます。

うーむ

int &sample()
{
...
}

int hoge = sample();
hoge = 10;

とやるとエラーが出ずに普通にコンパイル出来ました。
hogeが参照だったら hoge = 10 みたいに再定義できないと思うので、
やっぱりこの場合hogeは参照じゃない・・?
900デフォルトの名無しさん:2008/02/18(月) 00:42:17
>>899
hogeは参照ではない。分解して書けば一目瞭然。
int& sample();
int hoge; // どう見てもint型です
hoge = sample();

> hogeが参照だったら hoge = 10 みたいに再定義できないと思うので、
int hogehoge = 0;
int& hoge = hogehoge; // hogeが参照だったら
hoge = 10; // 参照先のhogehogeに10が代入される
901882:2008/02/18(月) 01:01:31
>>900 さん
ですよね。
ありがとうございましたm(_ _)m
902デフォルトの名無しさん:2008/02/18(月) 01:16:17
visual studio 2008 express版を使っていたんだが

error C2057: 定数式が必要です。
error C2466: サイズが 0 の配列を割り当てまたは宣言しようとしました。

というエラーが出たのですがこれはどういったエラーなの?
903デフォルトの名無しさん:2008/02/18(月) 01:20:58
エラーでた個所のソースを張り付けては?
後ろの方はint i[];とかしたときにでるかな?前はよく見るけど忘れた。
904デフォルトの名無しさん:2008/02/18(月) 01:26:08
>>902
メタプログラミングでもやってんのか?
905902:2008/02/18(月) 01:42:27
ARToolKit を使って連続MQOファイルを表示しようとしてます

#define CAMERA_CONFIG_FILE "Data/WDM_camera_flipV.xml" // カメラ設定ファイル
#define CAMERA_PARAM_FILE "Data/camera_para.dat" // カメラパラメータファイル
#define PATT_FILE        "Data/patt.sample1" // パターンファイル
#define MQO_FILE "Data/output_0.mqo" // MQOファイル(座標軸)


int MOTION_NUM = 60;
int motion_total = 60;

int MOTION_FPS= 30;

MQO_OBJECT g_mqoModel[MOTION_NUM]; // メタセコファイルから読み込んだモデル
906デフォルトの名無しさん:2008/02/18(月) 01:57:25
>>905
static const int MOTION_NUM = 60;
907デフォルトの名無しさん:2008/02/18(月) 01:58:34
>896
上2つでは<utility>や<locale><stdexcepts>等の情報が見あたらなかったのですが
MSDNのはかなり情報量多そうですね。しばらくMSDNを頼りにしてみます。

>898
JISに行ったら購入とかあったので有料?と思ったのですが
閲覧だけなら出来るみたいですね。
どうやら、保存は出来ないみたいですが。

C++ ISO Draft で調べたら幾つか見つかりました。
英語なのでちょっと大変そうですが、頑張ってみます。
908デフォルトの名無しさん:2008/02/18(月) 01:59:00
MQO_OBJECTが正しく宣言されていないからだと思うが?
その環境がわからんから俺にはこれ以上は答えられん・・・ってこれくらいのこと試してそうだけど・・・
909908:2008/02/18(月) 01:59:38
はぅ、そっか・・・おれはずかしす・・・
910デフォルトの名無しさん:2008/02/18(月) 08:36:27
超初心者です

char *a[]={"あ","か","さ","た","な"};
printf("%s",a[0]);


こんな時、なぜ*が必要なのかいまいちピンときません。
どなたか教えてください…
911デフォルトの名無しさん:2008/02/18(月) 08:43:14
>>910
aはポインタ配列だからです。
912デフォルトの名無しさん:2008/02/18(月) 08:52:47
int a = 5;
int a[] = {1, 2, 3, 4, 5};

char* a = "あ";
char* a[] = {"あ", "い", "う", "え", "お"};
913910:2008/02/18(月) 10:06:32
こんがらがってきた(ヽ'A`)
文字列の扱い方はこんな感じでおかしくないでしょうか

char a='N';
char a[]={'N','M'};
char a[]={"NM"};
char *a="NNNN";
char *a="あ";
char *a[]={"NNNN","MMMM"};
char *a[]={"あ","い"};
914デフォルトの名無しさん:2008/02/18(月) 10:14:24
>>913
ああ、だいたいそれでいい。あとは char* じゃなくて char const* にしとけば完璧だ。
915デフォルトの名無しさん:2008/02/18(月) 10:21:50
>>913
次は配列とリテラルの違いに苦しむが良い
916デフォルトの名無しさん:2008/02/18(月) 10:43:58
const char*
917910:2008/02/18(月) 10:44:53
みなさんありがとうございます。なんとなくわかった気がします

次はどうしてこうなるのか簡潔に説明できるように頑張ります…
918879:2008/02/18(月) 10:48:57
すいません、誰かたすけて。。
x86-64のマシンでiccでC++のソースがコンパイルできません。
icc : l_cc_p_10.1.008
g++ : g++ (GCC) 4.1.2 20061115 (prerelease) (SUSE Linux)
iccvars.shはsourceしてます。
icc samp.cのように、ただのCのソースならコンパイル+実行できます。
でもicpc samp.cppのように、C++のソースをコンパイルしようとすると、
ld: skipping incompatible /usr/lib64/gcc/x86_64-suse-linux/4.1.2/32/../
libstdc++.so when searching for -lstdc++
となって、コンパイルできません。
ちなみに、-lstdc++は、
$ file /usr/lib64/libstdc++.so.6.0.8
/usr/lib64/libstdc++.so.6.0.8: ELF 64-bit LSB shared object, AMD x86-64, version 1 (SYSV), stripped
ちゃんと存在してます。
919879:2008/02/18(月) 10:56:31
すいません、自己解決したかも、です。
x86-64:~> /opt/intel/cce/10.1.008/bin/icc as/samp1.cpp
=> これはコンパイルでき、実行もできた。
x86-64:~> /opt/intel/cc/10.1.008/bin/icc as/samp1.cpp
ld: skipping incompatible /usr/lib64/gcc/x86_64-suse-linux/4.1.2/32/../libstdc++.so when searching for -lstdc++
=> これは上に書いたとおりコンパイルできない。
cceを使えばいいみたいです。
お騒がせしました。

920デフォルトの名無しさん:2008/02/18(月) 11:00:15
>>919
???何故、一つ上のdirectoryに上がるのです???
其の場所に"stdc"が置いて在るのですか?
921デフォルトの名無しさん:2008/02/18(月) 11:31:47
単精度と倍精度でどの程度性能が違うのか、簡単なテストプログラムを書きたいと思っています (Programming Pearls の コラム6 練習問題)
gcc -O0 で最適化をオフにして、何らかの計算をループさせて時間を計ろうと思うのですが、こういうのに手ごろな計算ってあるでしょうか?

922デフォルトの名無しさん:2008/02/18(月) 11:37:42
>>921
単純な性能差を求めようとしても余り意味がない。
何故ならば、最適化なしの指定にすると恐らくはx86ではfpuを使うコードを出力するが、
それはfloatでもdoubleでも同じCPU命令を使うことになるから。
923879:2008/02/18(月) 11:40:20
>>920

レスありがとうございます。
>???何故、一つ上のdirectoryに上がるのです???
というのは、libstdc++の場所のことですよね?自分も調べてみたのですが、結局その位置は、
/usr/lib64/libstdc++.so.6.0.8 になってて、これがlibstdc++のようです。
cceのディレクトリ以下のコンパイラだとリンクできて、cc以下のコンパイラだとリンクできない
理由は分かってないですが、。。
924デフォルトの名無しさん:2008/02/18(月) 11:42:37
そりゃぁ、ccはx86-32でcceがx86-em64tだからだ。
925879:2008/02/18(月) 12:01:30
>>924
ありがとうございます。
なるほど、そういうことですか。
でも、なんでx86-64環境にインストールしたのに、iccとやると、デフォルトで32ビットの
バイナリを作ろうとするんですかね。自分は、
alias icc64="/opt/intel/cce/10.1.008/bin/icc"
しときました。
926デフォルトの名無しさん:2008/02/18(月) 12:05:45
>>925
cce配下のbinにあるスクリプトを使えばcceにPATHが通る。
927879:2008/02/18(月) 12:22:03
>>926
以下のようにやると通りました。
source /opt/intel/cce/10.1.008/bin/iccvars.sh
ありがとうです。
928デフォルトの名無しさん:2008/02/18(月) 13:22:58
文字列を初期化するにはどっちがいいのでしょうか?

1, ZeroMemory( str, sizeof(str) )

2, memset( str, '\0', sizeof(str) )
929デフォルトの名無しさん:2008/02/18(月) 13:24:25
両方同じ
930デフォルトの名無しさん:2008/02/18(月) 13:31:27
'\0'=0ってことなんですか?
931デフォルトの名無しさん:2008/02/18(月) 13:32:53
>>928
>1, ZeroMemory( str, sizeof(str) )
一部の環境にしか存在しないことを承知で使うのならこっちでもいいが、
そもそも文字列を初期化するのに0クリアはナンセンス。
932デフォルトの名無しさん:2008/02/18(月) 13:33:01
2なら環境をWindows以外に変えても修正しないで済む。
933デフォルトの名無しさん:2008/02/18(月) 13:52:19
ZeroMemoryもマクロで結局memsetになる。
934デフォルトの名無しさん:2008/02/18(月) 14:06:59
文字列の初期化だったら、「*str = '\0';」でいいじゃない。

935デフォルトの名無しさん:2008/02/18(月) 22:37:43
#include <new>

class CBase
{
public:
 /** new */
 void* operator new(std::size_t aSize) throw(std::bad_alloc);
 /** delete */
 void operator delete(void* aMemory) throw();
 /** placement new */
 void* operator new(std::size_t aSize, void* aPtr) throw();
 /** placement delete */
 void operator delete(void* aMemory, void* aPtr) throw();
};

Effective C++にあった配置newを試そうと上のクラスを作ってみたのですが、
BCBでコンパイルすると下記のエラーが出てしまいます

E2238 'CBase::operator delete(void *) throw()' の宣言が複数見つかった

ボス助けて
936デフォルトの名無しさん:2008/02/18(月) 23:02:54
>>935
visual c++ 2005では問題なくコンパイルできました。
bccがポンコツということで処理します。
937デフォルトの名無しさん:2008/02/18(月) 23:30:10
GetCurrentDirectory()は最大260文字くらいしか読み取れないね なんとかなりませんか?
938デフォルトの名無しさん:2008/02/18(月) 23:37:18
937です 自己解決しました 途中まで(250字程度)は返してくれるのでそこまで
移動してからディレクトリを進めていって、たとえば適当なファイルを生成してそれを見つければよいです
939デフォルトの名無しさん:2008/02/19(火) 00:01:14
GetCurrentDirectoryWでも260文字越えはだめ?
940デフォルトの名無しさん:2008/02/19(火) 00:11:17
GetCurrentDirectoryWでも250程度しか行きませんでした
941デフォルトの名無しさん:2008/02/19(火) 00:15:38
オレ様のGetCurrentDirectory()にはそんなちゃちな制限はないぜ。
942デフォルトの名無しさん:2008/02/19(火) 00:34:58
247文字までは取得できますが、それを越えると一つ上のディレクトリまでしか返さないようです
943デフォルトの名無しさん:2008/02/19(火) 00:36:52
だからたとえば50文字で返却されたとしてもそこがカレントディレクトリとは限りません
200文字のディレクトリ内かも知れない為
944デフォルトの名無しさん:2008/02/19(火) 01:13:09
時々ファイル名が長すぎてリネームできないファイルがありますが
私はいつもネットワーク共有状態にしてUNC名でリネームしてます
945デフォルトの名無しさん:2008/02/19(火) 01:28:08
階層の深いフォルダをドライブに見せかける命令ってどうやるんでしょうか
これが出来れば読めるところまで進めてくりかえせばいいのですが
946デフォルトの名無しさん:2008/02/19(火) 03:13:51
Linux 2.6.18-6-686 #1 SMP Sun Feb 10 22:11:31 UTC 2008 i686 GNU/Linuxで
wtmpの中身をみて遊んでて出た疑問です。
struct utmp u; sizeof(u)をしたら384が出力されたのですが/usr/include/bits/utmp.hを
みてメンバー変数のサイズを合計したら382となりました。

下記のサンプルで出したのですがメンバー変数に見落としがあったのでしょうか?
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <utmp.h>

main(){
struct utmp u;
printf("size utmp %d \n", sizeof(u));
printf("size ut_type %d \n", sizeof(u.ut_type));
printf("size ut_pid %d \n", sizeof(u.ut_pid));
printf("size ut_line %d \n", sizeof(u.ut_line));
printf("size ut_id %d \n", sizeof(u.ut_id));
printf("size ut_user %d \n", sizeof(u.ut_user));
printf("size ut_host %d \n", sizeof(u.ut_host));
printf("size ut_exit %d \n", sizeof(u.ut_exit));
printf("size ut_session %d \n", sizeof(u.ut_session));
printf("size ut_tv %d \n", sizeof(u.ut_tv));
printf("size ut_addr_v6 %d \n", sizeof(u.ut_addr_v6));
printf("size __unused %d \n", sizeof(u.__unused));
}

947デフォルトの名無しさん:2008/02/19(火) 03:15:24
どこかにパディング入ってんじゃね
948デフォルトの名無しさん:2008/02/19(火) 03:21:17
>947
なるほど。wtmpはバイナリーデータなんですけどutmp.hの構造体のサイズ信じて
バイト単位でデータにアクセスした場合ほしい値がもらえない場合があるわけですね。
949デフォルトの名無しさん:2008/02/19(火) 03:32:44
offsetofでも使えばいいんじゃね
950デフォルトの名無しさん:2008/02/19(火) 04:11:21
>949
なるほど、パディング入った位置はわかった。
951デフォルトの名無しさん:2008/02/19(火) 05:01:29
質問です。
http://itpro.nikkeibp.co.jp/article/COLUMN/20061204/255878/
のプログラムがコンパイルできないのですが、
msg[i] += 'A' - 'a'
の処理ってどうやればコンパイルできるようになるのでしょうか?
というか、どんな処理型だったらコンパイルできるのでしょうか?
gcc -std=c99では駄目でした。
952デフォルトの名無しさん:2008/02/19(火) 05:11:17
>>951
お前にはVB6がお似合い
953いいこと教えてやるヨ:2008/02/19(火) 05:19:15
いつもこのスレにお世話になってるんで、お前らに恩返ししてやるよ。
あのな、クラスの中で、大文字のTっつー名前のメンバ変数を定義すんなよ。
そのあと、クラス内でtemplate <class T>とかするとハマる。
おれはこんな時間までハマった。
じゃあな。
954デフォルトの名無しさん:2008/02/19(火) 05:26:02
いや、
msg[i] += 'A' - 'a'
msg[i] -= 'A' - 'a'
の処理が大文字と小文字をひっくり返す処理くらい
俺でも分かるよ。
でも、コンパイルできねーんだもん。
955デフォルトの名無しさん:2008/02/19(火) 05:26:49
>953
申し訳ないけど笑ってしまった。
956デフォルトの名無しさん:2008/02/19(火) 06:09:39
>>954
#include <string.h>

とかか?
957デフォルトの名無しさん:2008/02/19(火) 07:09:34
コロンなのがあかんのんやろ
958デフォルトの名無しさん:2008/02/19(火) 07:15:33
>>951
(msg[i] -= 'A' - 'a') と括弧で括ればいい。
あるいは、C++処理系でコンパイルすればいい。
959デフォルトの名無しさん:2008/02/19(火) 10:28:20
#include <iostream>やusing namespaceは.hに書くのがよいのでしょうか?それとも.cppに書くべきなのでしょうか?
960デフォルトの名無しさん:2008/02/19(火) 10:28:46
まさか、'A'がchar型だと思ってるバカはいないよな?
961デフォルトの名無しさん:2008/02/19(火) 10:55:47
>>959
それぞれのスタイルでしょ。でも、
using namespace を.hに書くのはやめとけ。というか、c++を使いつづけると、
そのうち自然に止めたくなると思う。
962デフォルトの名無しさん:2008/02/19(火) 12:30:34
ソースファイル毎に名前空間分けてるWindows用某フレームワークは名前空間一つにまとめてくれといいたくなる。
963デフォルトの名無しさん:2008/02/19(火) 14:08:56
特定のクラスだけパディングして欲しくない
事があるんですが、何か手はあるでしょうか?
964デフォルトの名無しさん:2008/02/19(火) 14:16:05
#pragma pack
965デフォルトの名無しさん:2008/02/19(火) 14:40:34
>>964
おーあるのね。感謝!
966デフォルトの名無しさん:2008/02/19(火) 16:35:49
ofstreamのmemcpyで落ちる場合があるんですが何が原因でしょうか?
967デフォルトの名無しさん:2008/02/19(火) 17:03:21
ofstreamでmemcpy使うことなんてあったっけ?
ここにソース書いてくれ。
968デフォルトの名無しさん:2008/02/19(火) 17:09:37
じゃあofstreamじゃないのかもしれません。

CStringA str;
str = wstrData;
fout.write( str, DATA_SIZE );

この様なことをやっていて
何回も動かしていると落ちてしまうんですが
マルチバイトとワイド文字の変換にCStringAを使ってるのでここかもしれません
969デフォルトの名無しさん:2008/02/19(火) 17:17:52
原因を予想してもらうより、まずどこで落ちるのか確定するにはどうすればいいかを聞いたほうがいい気が・・・
スタックのトレースも無さそうだな
970デフォルトの名無しさん:2008/02/19(火) 17:33:57
>>968
DATA_SIZE
971デフォルトの名無しさん:2008/02/19(火) 20:44:05
fout.write(str, str.GetLength());

じゃないの?
あるいは

fout << str;
972デフォルトの名無しさん:2008/02/19(火) 23:53:25
プログラムの勉強に飽きたとき息抜きで何やる?
973デフォルトの名無しさん:2008/02/19(火) 23:54:55
一人で電機屋で1980円で買った麻雀ゲーやってる
あと最近興味ないクラシックを聴いて10分で眠くなる特技が出来た
974デフォルトの名無しさん:2008/02/20(水) 00:10:05
えーとごめんなさい。VC使って5年ぐらい経つんですが
未だに普通のウィンドウにコントロールを貼り付けるような
リソースエディタ的なソレを知りません。

ダイアログなら直球なんですがウィンドウでそういうの出来ますか?
975974:2008/02/20(水) 00:11:14
使ってるのはVC6です。
976デフォルトの名無しさん:2008/02/20(水) 00:11:23
日本語が使えないんじゃ何年VC使っててもだめだろうね
977デフォルトの名無しさん:2008/02/20(水) 00:13:42
こんくらいは分かるだろ。
とりあえず VC ではそういうのは知らない。
978デフォルトの名無しさん:2008/02/20(水) 00:14:29
普通のウィンドウにあんまりコントロールをはっつけるなってことじゃないのかな。
Windows 的には。
979デフォルトの名無しさん:2008/02/20(水) 00:15:28
>>974
初心者は、C#かBCBつかえよ 無理
980974:2008/02/20(水) 00:21:42
>>976
んじゃ0年でもOK

てゆかVC6のウィンドウエディタはリソースエディタしかないから
それでやってたけど、ダイアログしか作れないのはおかしいだろ、
とか思いながらやってたんだけど、その疑問をはらしたくてな。

>>977-978
あれ?やっぱこれでOKなのか。
要するに「VC6に"ウィンドウ"エディタは無い」でOK?
981デフォルトの名無しさん:2008/02/20(水) 00:22:26
てゆか
982デフォルトの名無しさん:2008/02/20(水) 00:26:09
BCB にはありそうな気がする。
983デフォルトの名無しさん:2008/02/20(水) 00:34:32
>>980
ダイアログをウィンドウに張ることはできますが。
984デフォルトの名無しさん:2008/02/20(水) 00:51:48
ダイアログにウィンドウクラスを割り当ててしまえば、
もはやダイアログではないウィンドウができる。

でも俺は983のようにすることが多いけど。
985デフォルトの名無しさん:2008/02/20(水) 00:54:52
アンマネージドでも.NETくらい楽にUI作れるようにならんかなー
986デフォルトの名無しさん:2008/02/20(水) 01:38:22
ちなみにBCBでダイアログ作るとダイアログもどきな普通のウィンドウになる
987デフォルトの名無しさん:2008/02/20(水) 05:25:33
virtualデストラクタを持つ親クラスを継承して、子供クラスを作りました。
その子供クラスを、親クラスのポインタをつかって扱ってます。そのとき、
親クラスのポインタに対して、delete ptr;とやると、まず子供クラスの
デストラクタが呼ばれた後で、親クラスのデストラクタが呼ばれるのですが、
これって正しい動きですか?
親クラスのデストラクタは呼ばれないと思ってた。
988デフォルトの名無しさん:2008/02/20(水) 06:16:06
>>987
正しい。
親のが呼ばれなきゃ親のリソース開放できないじゃん。
989デフォルトの名無しさん:2008/02/20(水) 06:21:51
>>988
その通りですね。
ありがとうございました。
990デフォルトの名無しさん:2008/02/20(水) 11:16:24
vectorをnewを使って確保するというのは出来ますか?
(vector<int>とか)
色々やってみたんですが、なぜかどうやってもコンパイル失敗してしまいます。
もしかして、できないのかな、と思った。
991デフォルトの名無しさん:2008/02/20(水) 11:31:28
>>990
#include <vector>
int main() {
std::vector<int> *p = new std::vector<int>;
delete p;
}
992デフォルトの名無しさん:2008/02/20(水) 11:46:47
>>990
なんでまたそんな希代なことしようと思ったのかが気になる。
993デフォルトの名無しさん:2008/02/20(水) 12:25:18
>>991-992
ありがとうございます。なぜそんなことをしようと思ったかというと、vectorを関数間でやりとり
したかったからです。適当にクラスを準備して、その中にvectorを保持してましたが、単体でも
newで出来るかなと思いました。
994デフォルトの名無しさん:2008/02/20(水) 12:28:17
次立てて埋めようとしたらたてらんねえ
995デフォルトの名無しさん:2008/02/20(水) 12:34:23
立てたよ。
996デフォルトの名無しさん:2008/02/20(水) 12:36:34
【初心者歓迎】C/C++室 Ver.49【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1203478421/

>>995
997デフォルトの名無しさん:2008/02/20(水) 12:47:08
>>993
別にわざわざnewする必要なんか無いだろ。そのための参照渡しがあるんだから。
998デフォルトの名無しさん:2008/02/20(水) 12:54:35
でも複数の場所にたらい回しにするときは、
boost::shared_ptr<std::vector<int> >(new std::vector<int>());
とかやる?
999デフォルトの名無しさん:2008/02/20(水) 12:56:51
梅て次いこう
1000デフォルトの名無しさん:2008/02/20(水) 12:57:38
ほいほいほい
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。