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


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

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



1 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 01:18:41 ]
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.47【環境依存OK】
pc11.2ch.net/test/read.cgi/tech/1200464091/
【アップローダー】(質問が長い時はココ使うと便利)
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm


7 名前:デフォルトの名無しさん [2008/02/05(火) 07:05:31 ]
>>6
入門書買えやカス!

8 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 07:18:25 ]
>>7
うっせーカス!

9 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 12:13:11 ]
>>12
イテレータを受け取るコンストラクタを使えってばよ。

14 名前:デフォルトの名無しさん [2008/02/05(火) 12:20:42 ]
>>13
イテレータを渡したいけど、どこにあるのかわかりません

15 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 12:57:07 ]
それだと"DDDDD"は収容されないけどな。

18 名前:売国まるはん [2008/02/05(火) 13:11:26 ]
パチンコスレで遠隔、ホルコン、サクラ、マネーロンダリングなどについて書き込むと渋谷マルハン社員やマルハンに依頼された
ネット工作会社がスレ荒らしをしてスレが機能停止します。
↓↓工作員の荒らしのやり方↓↓
2008/01/10(木)ID:iA54nBU50
■■■■マルハン総合スレッド 9■■■■money6.2ch.net/test/read.cgi/pachij/1187021165/783-784
【宮崎県都城市】パチ事情そのAmoney6.2ch.net/test/read.cgi/pachij/1187189246/658-659
【山と川】宮崎県児湯付近PART1【自然イパーイ】money6.2ch.net/test/read.cgi/pachij/1188235164/471-472
【基地外が大暴れ4】エスパス日拓総合スレ【18発目】money6.2ch.net/test/read.cgi/pachij/1188885488/401-410
2008/01/13(日)ID:1HLcWzUK0
【基地外が大暴れ4】エスパス日拓総合スレ【18発目】money6.2ch.net/test/read.cgi/pachij/1188885488/461-462
■■■■マルハン総合スレッド 9■■■■money6.2ch.net/test/read.cgi/pachij/1187021165/809-810
【香川】パーラーグランドのスレ2【徳島】money6.2ch.net/test/read.cgi/pachij/1188315438/324
【延岡】宮崎県北情報PART3【日向】money6.2ch.net/test/read.cgi/pachij/1196865970/186

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

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

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



19 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 13:29:53 ]
assign()のソースを出し渋ってる奴から使えと言われてもねー

20 名前:デフォルトの名無しさん [2008/02/05(火) 15:11:24 ]
はじめまして。今までCの学習用開発環境としてvmware上のFreeBSDでemacsを使ってきた者です。
何かと不便なのでwindows上で開発環境を整えようと思うのですが、何かお勧めのソフトはありますでしょうか?


21 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 15:15:20 ]
>>20
cygwin

22 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 15:24:55 ]
>>20
Eclipse + CDT

23 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 15:53:06 ]
>>23
ありません。つーか、そもそもそれではvectorは書き込まれていない筈です。ご愁傷様。

25 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 15:56:15 ]
std::vectorの中身をserialize/unserializeする関数を作成して、保存/読み込み時にその関数を経由させる。



26 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 15:58:56 ]
動的配列はメモリが無条件に動的になるわけじゃなく、
動的配列を実現できるようなメンバ関数でアクセスするから動的配列たりうるわけで。
エレベーターのボタンを押さずに扉こじ開けてもエレベーターには乗れないでしょ?

27 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 16:01:53 ]
その例えもどうかと思う。

28 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 17:20:39 ]
ただの配列なら書き込めますか?

29 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 17:21:42 ]
はい。

30 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 19:46:16 ]
>>31
部分特殊化は VC6 あたりでも対応してなかったと思う。
コンパイラが対応してないのはありうると思う。

34 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 20:08:26 ]
とりあえずBCB2007で通るか検証してみては

35 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 21:20:13 ]
最近Cを勉強し始めたのですが、とりあえずチンチロリンでも
作ってみろというようなことをいわれました。

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

どうかよろしくお願いします。



36 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 21:47:25 ]
本屋に行って何冊か立ち読みしてみるか、ぐぐればいいと思うよ

37 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 21:58:18 ]
>チンチロリンのサンプルプログラムを見てみるのも勉強になると
>いわれたので
簡単にそんなものが見つかるのが前提のアドバイスにワロタw
でも、そういう簡単なゲームを作るのはいい練習になると思うよ。

とりあえず、今勉強に使ってる本かサイトか知らんが
その知識だけで自分で作ってみるといいよ。
多分いろいろと汚いプログラムになりはするとは思うけど、
そうやって作ってみた後にサンプルなり本なりを読むと、
どこがマズかったのかってのがよく分かっていいと思うぜ。

38 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 22:03:38 ]
>>36
今は、手元にある入門書とぐぐって何とかやってる状態です。
何冊か立ち読みして、よさそうなのをもう1冊買ってみようかと
思います。ありがとうございます。

>>37
簡単に見つかるものじゃないんですね・・。
なんとか形にしてみてから調べてみることにします。
ありがとうございます。

39 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 23:41:22 ]
VC9ですけど、
std::exceptionにうにこーど入れると文字が壊れますか?

40 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 23:43:58 ]
>>39
[std::exception unicode]でググって速効。
jinguru.blog86.fc2.com/blog-entry-10.html

41 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 23:56:32 ]
やっぱりそうですか。

42 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 23:59:49 ]
UTF-8なら入れられると思う。そこまでする必要があるかは別として。

43 名前:デフォルトの名無しさん [2008/02/06(水) 05:39:37 ]
コンソールアプリケーションで、ユーザにインプットをもらって処理をするコードがあります。
その時、
int a;
cin >> a;
として、入力が数字ではなかったとき、変数aにはなにも代入されず、
ユーザが行った入力はどこかのバッファに溜まってる
のでしょうか。その次の入力から動作がおかしくなります。
あと、もし上記が正しいとすると、ユーザからの入力を受け取る処理は、
とりあえずstringで受けるべきなのでしょうか?


44 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/06(水) 11:59:49 ]
Win32APIなんですがnewで確保した領域をWM_DESTROY:がきたときにdeleteしたら
コンパイル時はエラーでないけど、実行してnewで確保した後プログラムを終了
(WM_DESTROYが送られる)したらエラーがでるんですが、何故ですか?
WM_CLOSEでならdeleteしてもエラーでないんで問題は無いんですが興味本位で

47 名前:デフォルトの名無しさん mailto:sage [2008/02/06(水) 12:16:07 ]
>>45
入力フォーマットの仕様がどうなってるのかわからないから
なんとも言えないな。任意の値が入力されるならgetlineで
一行読込んでstring解析したほうがいいかも。


48 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/06(水) 14:50:57 ]
値渡しでも参照渡しでもポインタ渡しでもお好きな方法をどうぞ

55 名前:デフォルトの名無しさん [2008/02/06(水) 14:54:21 ]
コンパイラに任せたときは値渡しですか



56 名前:デフォルトの名無しさん [2008/02/06(水) 14:57:04 ]
文字列 は参照ですが、stringもそうなりますか

57 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/06(水) 15:34:32 ]
>>55
コンパイラは自動的にプログラムを書いたりはしてくれませんので、コンパイラに任せるなどということはできません
コンパイラは あなた が書いた通りに動きます
>>56
文字列(=文字の配列)への参照っていうと、こういうのでしょうか
void foo(const char(&s)[6]) {
printf("%s\n", s);
}
int main() {
foo("Hello");
}
あんまりやらないと思いますが

60 名前:58 mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/06(水) 15:41:03 ]
>>58
cout.setf(ios::fixed, ios::floatfield); をcout前に追加
setprecision(3) → setprecision(2)

62 名前:デフォルトの名無しさん mailto:sage [2008/02/06(水) 17:21:15 ]
普通小さくするのがぬ゛うんキャストじゃないの?

63 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/06(水) 19:21:04 ]
D3DPRESENT_PARAMETERS d3dpp;
::ZeroMemory(&d3dpp, sizeof(d3dpp));



D3DPRESENT_PARAMETERS d3dpp = {0};

はちがいますか?



66 名前:デフォルトの名無しさん mailto:sage [2008/02/06(水) 19:23:40 ]
詰め物

67 名前:デフォルトの名無しさん mailto:sage [2008/02/06(水) 19:30:09 ]
>>64
そこがアプリケーションのリソースを置く場所だから、
親切に(あるいは余計なお世話か)移動してくれてるんじゃないかな

68 名前:デフォルトの名無しさん [2008/02/06(水) 20:39:50 ]
>>67
なるほど
Glutで何かしているのではなく
◯◯.exeに引数で渡してるんですね。
そんな気がしてきました。
ちょっとチェックしてみます。

69 名前:デフォルトの名無しさん mailto:sage [2008/02/06(水) 22:00:07 ]
>>48
NULLポインタdeleteって問題ないんじゃないの?

70 名前:デフォルトの名無しさん mailto:sage [2008/02/06(水) 22:03:06 ]
>>69
二重解放つったら解放したアドレスをもっかい解放のことだろ?

71 名前:デフォルトの名無しさん mailto:sage [2008/02/06(水) 22:04:35 ]
deleteしただけで、0(NULL)になってるとは限らないんじゃないの?

72 名前:デフォルトの名無しさん mailto:sage [2008/02/06(水) 22:32:43 ]
とりあえず gcc だとなってないな

73 名前:デフォルトの名無しさん [2008/02/06(水) 23:35:43 ]
質問です。g++を使っています。O2 で最適化してます。

クラスの中で定義した関数は勝手に inline となるのでしょうか?
inline をつけても意味は無いのでしょうか?

74 名前:デフォルトの名無しさん mailto:sage [2008/02/06(水) 23:38:40 ]
deleteした後自分で0をポインタに代入するというTipsがある位だからな

75 名前:デフォルトの名無しさん mailto:sage [2008/02/06(水) 23:44:29 ]
>>73
inline指定してるのと同じになる。
実際にinline化されてるかはコンパイラ次第。



76 名前:デフォルトの名無しさん mailto:sage [2008/02/06(水) 23:48:07 ]
ありがとう。何か勘違いしてたみたい
deleteした後nullになるわけじゃないのね
WM_DESTROYが来た時点ではOSかが自動的にdeleteしちゃってるから多重解放
でエラーでかうのかな

77 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 00:42:46 ]
OSは自動的にdeleteなんてしません

78 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 00:47:50 ]
libhoge.so
をスタティックリンクすることってできるんでしょうか?

79 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 00:54:20 ]
はい。それがスタティックリンクできるようなアーカイブやオブジェクトモジュールであれば。

80 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 03:40:14 ]
>>77
じゃあ何でエラーでるの?
newしたまま終了してしまっても最悪OSがエラー処理として解放してくれるって聞いたけど

81 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 05:19:50 ]
>>80
エラーが出る事と自動的にdeleteする事を同列に考えるなよ
そもそもソース出してないのに的確な答えが出せると思える?
つーか自分で考えて答え出すか出たんなら帰れよ、必要最低限のレスは付いたんだから

82 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 05:55:50 ]
的確な答じゃないなら断言口調で書くなよ、紛らわしい。

83 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 06:44:38 ]
否定したんじゃなくて、ありがちなパターンに陥っていそうだから指摘しただけだろ。



86 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 07:16:58 ]
>>84
当然さす

87 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 07:18:13 ]
>>80
newしたまま終了って、main/WinMain すら終了した後の話だぜ

88 名前:84 [2008/02/07(木) 07:20:43 ]
>>86
ありがとう!
ってことは sizeof(vector<double> は要素の数にかかわらず値は変わらないって事か。
不思議。

89 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 07:23:40 ]
>>88
意味が分からん。

ポインタに [0] をつけたら
そのアドレスにあるオブジェクトを指す。
極めてシンプルな答え。

90 名前:84 [2008/02/07(木) 07:30:44 ]
メモリを動的に作ってるからコンテナの要素が増えてもポインタは同じ所にあるって事か

91 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 07:31:39 ]
vectorの中身はnewで確保したメモリへのポインタ(と管理情報)だからな

92 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 07:35:21 ]
>>88
要素自体は動的確保されているからな

93 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 07:35:52 ]
いいえ。

94 名前:デフォルトの名無しさん [2008/02/07(木) 09:42:52 ]
vectorの中の要素をソートしたいのですが、そのとき、自分で定義した関数によって
ソートしたいです。どうすればよいですか?

95 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 09:45:44 ]
vectorは連続領域に格納される(配列と同じように扱える)から普通にソートしたらいい。



96 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 10:00:45 ]
>>94
std::sort

97 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 14:29:08 ]
binary_functionでぐぐれ

100 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 14:38:33 ]
const が有った方がいいな。

104 名前:デフォルトの名無しさん [2008/02/07(木) 14:39:36 ]
ハードディスクへの書き込みで、メモリへのキャッシュを自動で行ってくれる命令ありますか

105 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 14:53:31 ]
>>101
・Debug版は公開しちゃいけません
・現行VCはシングルスレッド版ランタイムがありません

>>104
そんな「命令」なんてあるもんですか。

107 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 14:59:57 ]
>>106
MFC等のデバッグ版DLLの再配布が禁止なだけで
自前ライブラリのデバッグ版配布は禁止じゃねえだろ。

108 名前:デフォルトの名無しさん [2008/02/07(木) 15:05:41 ]
>>106
自前でキャッシュ用意しましたよ

109 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 15:16:46 ]
>>106
101です
お返事ありがとうございます。

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

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

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

そもそも「_beginthreadを使うためにはマルチスレッド版にする必要がある」という認識しかもっておらず、
「マルチスレッド版にしないことによる利点」は知らないのです

110 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 15:21:59 ]
>>109
まず、デバッグ版のlibがあるやつはpragmaで切り替えてるはず。
自分の作ったlibが物によって変わるのは、そいつの中でデバッグ版や
MT版のlibを呼んでるから。

そういうの避けたければスタティックリンクしてしまうといいかも。

111 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 16:29:04 ]
unsigned同士の演算の結果はunsigned

114 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 16:32:12 ]
int型変数(-32768〜32767)に-40000とか入れようとしたらどうなると思う?

115 名前:デフォルトの名無しさん [2008/02/07(木) 16:32:16 ]
ありがとうございます



116 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 16:37:11 ]
>>101
コンパイラオプション/ZlってVC6にない?
これはobjファイルにLIBCMTD.LIBとかCRTへの参照を
埋め込まないようにするコンパイラオプション。
1つのlibで全てを賄えるようにもなる。

けど現実的には最適化・デバッグオプションの有無で、
少なくともRelease/Debugの2種用意すべきだと思うけど。

117 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 16:48:16 ]
>116
Zlオプションを使ったところ、DebugプロジェクトからReleaseLibを使っても警告がでなくなりました。
ありがとうございます。
(最初 Zl が ゼット・アイだと思って混乱しましたw ゼット・エルですね)

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

Lib側としては、Releaseだけ用意しておけばいいと思うのですがどうでしょうか?
Libがバグっていないと仮定して利用するのが前提ですけど

118 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 16:51:38 ]
>>101
winmm.libってwinmm.dllの単なるインポートライブラリでは?
VCのランタイムをリンクしないライブラリならそういった問題は当然起きない

119 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 16:52:47 ]
別にReleaseだけでもいいと思う。
DLLだとデバッグ版も提供なんて話聞かないし。

120 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 17:02:19 ]
>>118
あ、なるほど。そういえばlibにはもうひとつ「DLLとリンクするためのインポートライブラリ」という役目がありましたね。
winmmはそっちですか。
(拡張子変えればいいのになぁ…)

>>119
了解しました。

>ALL
大変参考になりました。
ありがとうございました!

121 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 17:19:25 ]
デバッグ版のlibを提供するのはlibをデバッグしてもらおうということじゃなくて、
それを使ったプログラムもLibのソースをトレースできるようにだよw

122 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 17:23:39 ]
>121
誰への返事だ??

123 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 17:26:13 ]
環境依存のレスはすべてスルーしてます

124 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 17:36:05 ]
スレタイももちろんスルーです

125 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 19:08:34 ]
すまん誤爆った・・・ってここでもいいのかなこれ

130 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 20:03:47 ]
>>128
そういうクラスでも用意しない限り、ありません。
つーか、そんな阿呆なメモリ管理戦略はありえません。

>>131
逆に、リストにあるオブジェクトをremoveするときにdeleteしては?

134 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 20:22:12 ]
1904年の日露戦争の際に、ロシア正教会は全教会をあげて日本に天罰を
下すように神に祈りをささげた。結局なにも天罰は降りず、ロシアは負けた。
20年後、日本で関東大震災が発生。ロシアの物理学者カピッツァはこの事実から
「神はわれわれから9光年以内にいる」と結論を下したという。

135 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 20:47:14 ]
 お、おかしいアル・・・
/'⌒`ヽ、 5年後の世界に行ったらチューゴクがなかったアル・・・
ヽ、┗ ノ  
  `ーー'        γ⌒`ヽ           /'⌒⌒ヽ、
  ,-ーー-、      .|| ̄ ̄             (     ┃  ⌒ヽ
 /  ┃  )    ||    ∧_∧       \ ━┛    )
.(.   ┃   )   ||.   ( `ハ´;)
 ヽ、__,ノ     ||  _(つ¶¶と)__
           /||'''''|  三  |    |'(⌒)
        /    '―――――`  ̄ \
        `============'




136 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 20:51:06 ]
>>132
なるほど。まあテンプレートのときのために用意されてる
規則なので、そのときだけ利用します。
ありがとうございました。

ところで、みなさんは原文の規格を持ってるんですか?
買うと4万近かったので高くてとても買えません。


137 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 21:14:24 ]
JISならオンラインで読めるじゃん。画像だけど。

138 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 21:18:22 ]
>>137
そこでドラフトですよ。
若干現規格と違うけど、
古いドラフトだとまあまあ現規格に近いから十分参考にはなる。

140 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 21:25:29 ]
>>138
必要なものが入ってないか入れる設定にしていない。

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

俺はSTL使ってないんで後はぐーぐる先生か他の人にまかすわ

141 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 21:37:29 ]
>>137
>>139
あれ検索できないから不便ですよね。まあ無料なのでたまに見ますが。
正式版を無料で配布して欲しいですね。

142 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 22:03:32 ]
>>138
Visual C++ 2008 Expressとかだとどうなる?

143 名前:デフォルトの名無しさん [2008/02/07(木) 22:50:19 ]
>>105
(遅くなりましたが)
ありがとうございました。

144 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 02:00:03 ]
> new char[100];
pc = new char[100] でした。

150 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 02:04:09 ]
スタート

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

cinがtrueになる

while(cin)が評価される

というかんじなんじゃね?

151 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 02:12:09 ]
>>147
C++では汎用ポインタへのポインタって合法だったっけ。

152 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 07:25:40 ]
>>138
new ヘッダをインクルードする前に
new をマクロで置き換えてないか?

155 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 10:49:42 ]
>>153
std::ostream



156 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 11:53:19 ]
サクラエディタのソースコードを眺めていたのですが、コメント部でよくわからない表記があります。
@param などはなんとなく想像がつくのですが、「//!<」や「/*! */」は何を意図しているのでしょうか。
どなたか教えてください。

157 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 11:57:37 ]
>>156
つ[Doxygen]

158 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 11:59:11 ]
まさに、それですね。
ありがとうございました。

159 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 13:23:53 ]
例外処理の使い方がいまいち分かりません

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

なんというか感覚的に掴みにくいというかなんというか

160 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 13:25:33 ]
無用物

161 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 13:32:44 ]
参照を返すとオブジェクトが捨てられたときに
帰ってきたものも向こうに?

162 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 13:34:05 ]
>>159
自関数の中でリカバリできるならcatchして処理すればよい
そうでないなら呼び出し元にまかせる

普通のエラー処理と同じようなもんだ
自分で処理できるならして、処理できないなら呼び出し元にエラーコードなりなんなりをreturnするだろう
エラーコードのreturnが例外のthrowに変わるだけ

163 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 13:34:37 ]
>>161
日本語で

164 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 13:48:01 ]
>>162
そういう感じで良いんですか
気軽に使えるなら使ってみようかな・・・

165 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 14:03:21 ]
とある3種類の計測器をモニターするプログラムなんですが
似てるけど若干ちがう命令が3つあるとします

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

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

どちらが今後計器が増える可能性を加味したとき、よい設計でしょうか



166 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 14:07:41 ]
>>165
その計測器メーカに合わせるのが一番。
あるメーカは旧型機種の機能を改変しつつ新機能を作るかもしれないし、
あるメーカは旧型機種の機能を残しつつ新機能を作るかもしれない。

なんてことは兎も角、使い易いように作れば?

167 名前:138 mailto:sage [2008/02/08(金) 15:05:04 ]
返信遅くなってすいません!

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

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

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

Visual C++ 6.0を使い慣れているので
どうにかして実行させたいのですが・・・

168 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 15:22:22 ]
class Fruit;
class Apple : Fruit;

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

抽象クラスをインスタンス化できません。
と言われるです。どうするですか?

169 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 15:23:31 ]
Fruit がそういうつくりになってるんじゃないの?

170 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 15:24:38 ]
>>168
class Fruitを具体化してください。

171 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 15:36:19 ]
std::vector<Fruit*> fruits;

172 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 16:14:45 ]
コンパイラにBCCを使って数値計算をしているのですが、
しばらくプログラム実行していると、EXP: OVERFLOW ERRORと出ます。
これは、exp関数に入れた値がexp関数の扱える値(doubleの範囲)よりも大きいと言うことでしょうか?


173 名前:デフォルトの名無しさん [2008/02/08(金) 16:23:52 ]
>>167
俺、解決方法知ってるんだが…

174 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 16:25:09 ]
vevtorにvcの_com_ptrは入りますか?

175 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 16:59:55 ]
コピー初期化もコピー代入もできるから問題ないはず。



176 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 22:24:09 ]
UTF-8 なら3バイト必要だが、そういうわけではなくて?

178 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 22:34:20 ]
>>176
ひょっとしてなんか変な文字がでたりしてるか?

179 名前:176 mailto:sage [2008/02/08(金) 22:34:23 ]
ぐは、そうだったんですね・・2バイトでいいんだと思ってました汗
cout << ss[0] << ss[1] << ss[2];
とやったらちゃんと表示されました。
ありがとうございましたm(_ _)m

180 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 22:40:31 ]
ちなみにWindows上だと>>176のコードで「こ」はちゃんと出た。(bcc32 / gcc@cygwin)

181 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 22:44:58 ]
それはお前がソースをSJISで書いてるだけ

182 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 22:55:36 ]
>>175

ども。

183 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 23:42:34 ]
UTF-8 だと全て3バイトって訳じゃないのが面倒なところだよな。

184 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 23:43:11 ]
>>181
UTF-16 でも出るがな。

185 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 00:17:28 ]
他で聞いてきます



186 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 00:20:35 ]
fatal error LNK1104:コンパイラは、ファイルd3d9.libを開けません
とでてしまいビルドできません
手動でリンカにd3d9.libを設定しましたが無理でした
どうすればよいのか

187 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 00:33:08 ]
ファイルはあるの?

188 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 00:40:25 ]
pathの設定はしたか?

189 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 01:58:17 ]
More Exceptional C++が届いたんだが
いきなり最初のコードがコンパイルできねえ
一気にやる気失くした。やっぱ古い本はこんな
もんかねえ。

190 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 02:06:46 ]
全く問題ないけど。まさかとは思うが、>190って2バイト空白入れたままで悪態ついているお馬鹿さん?

192 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 02:15:25 ]
コンパイルできないときはエラーメッセージを書こう

なんてのは宿題スレでも徹底されてるような気がする。

193 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 02:17:41 ]
gcc 4 で通らないな。
まあ当たり前だな。
右辺値の ofstream と左辺値の ostream(cout) だと
片方が右辺値なので右辺値にキャストして型を揃えようとするが、
この2つじゃどうやっても型を揃えられない。

194 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 02:20:34 ]
VC だと右辺値の ofstream を
テンポラリオブジェクトを作成して ofstream& にキャストしてしまえるから(拡張機能)
コンパイル通るかもしれん。

195 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 08:25:12 ]
>>191

198 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 08:27:28 ]
空白orタブ <-> /**/
の置換スクリプトを希望

199 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 08:28:26 ]
>>197
>昔の規格なりコンパイラではOKだったのかもしれんです。

200 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 08:55:15 ]
>>196
左辺値の ostream の値である cout って意味ね。
エラーの理由はそれで問題ない。

201 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 09:50:51 ]
>>195
externで共有させるのはお勧めしない。
他の関数で配列を参照させるためには、ポインタを渡せばよい。
関数内のローカル変数へのポインタは、その関数実行中にしか有効にならないから、一時的にしか参照・共有できない。


202 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 10:37:35 ]
猫でもわかるを買ったんですが、
超初心者の俺にはさっぱりわかりません。
何かわかりやすい本などあったら教えてください。お願いします。

204 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 10:39:09 ]
>>203
ちなみにC言語です。よろしくお願いします。

205 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 10:41:09 ]
>>203
その本で分かりにくいとかじゃなくて
さっぱり分からないというのであれば無理です、あきらめてください

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


それとも環境が用意できないとかそういうことですか?



206 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 11:54:33 ]
>>203
その本は読んだ事はないが、サンプルをぽちぽち手で入力して実行してみなされ。

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

付属CDとかダウンロードをクリックして終わりじゃ絶対に理解できない。


207 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 13:26:37 ]
>>200
なるほど。3項演算子は片方がrvalueのときは結果もrvalueになるという
ことですね。
試したところでは、static_cast<ostream>(cout)やostream obj(cout);
はできないみたいでが、そもそもostreamオブジェクトは生成できないも
のなんですか?だとしたらostreamオブジェクトであるcoutはどのように
作成されたのですかね?

208 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 13:37:27 ]
コピーしようとすると見るエラーだな

209 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 13:55:53 ]
>>207
ostreamやistreamには、引数を取るコンストラクタがある。
coutやcinはそれを使って作られるんだろう。

210 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 14:04:36 ]
>>207
static_cast<ostream&>(cout) とか ostream out(cout.rdbuf()); ならできる

211 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 15:06:27 ]
>>209
>>210
ストリームとストリームバッファには弱い結合(ストリームバッファの同期)
と強い結合(ストリームバッファの共有)ってのがあるみたいですね。
おそらく、コンソールデバイスに関連付けられたストリームバッファ
(例えばcdevという名前だったとして)というのがシステムには存在し
ていてcoutは、ostream cout(&cdev); というふうに定義されてる
んでしょうね。ストリームオブジェクトをコピーできない理由は
無制限にストリームバッファをコピーしたり(メモリの浪費)、
暗黙のうちに共有できたりしたら問題が起こるからかなと思いました。

212 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 15:07:47 ]
ストリームオブジェクトをコピーできない理由は
無制限にストリームバッファをコピーしたり(メモリの浪費)、
暗黙のうちに共有できたりしたら問題が起こるからかなと思いました。

>>208さんへのレスでした。

213 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 15:24:28 ]
coutをコピーするというのは意味がわからん、ってのもあるかもね
コンソール自体が2個に増えるわけじゃあるまいし

214 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 15:33:48 ]
>>198
つかってやってください
ttp://pc11.2ch.net/test/read.cgi/unix/997605845/55

215 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 16:41:15 ]
>>205
環境が用意できないです。
それでもあきらめた方がいいですか?



216 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 16:49:08 ]
>>203
そのままの意味が分からないけど、HDVも圧縮された素材ですよ。
H.264とは異なる方式で。

ttp://ja.wikipedia.org/wiki/HDV

217 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 16:52:43 ]
あ、なんかすげー誤爆ってた。失礼orz

218 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 16:58:08 ]
環境が用意できないっつー意味がわからん。
Macしか持ってないのにWin32前提の入門書買っちゃったってことかね?

219 名前:203 mailto:sage [2008/02/09(土) 17:03:06 ]
すいません。アフォで…
自分は今、第二章で止まってます。
と言うのも、いきなり「では、ソースを見てみましょう」となり、
「開発環境によってコンパイルの手順が異なります」
↑この時点でわかりません。

自分には向いてないのかな…orz

220 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:12:11 ]
const char *piyo 

222 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:13:49 ]
>>220
書き換え可能なポインタ(char *)に書き換え不能なポインタ(const char *)を代入しようとしているからです。
void hoge(const char * name)
{
char const * piyo = & name[4];
}
こう書けば問題ありません。

223 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:14:36 ]
char *のconst性を除去してるから。入れたいならpiyoもconst char *にする。
hoge内で文字列を弄りたいなら引数をchar *にするべき。
引数は変えられず、どうしてもchar *が必要ならconst_cast<char *>(最後の手段)

224 名前:220 mailto:sage [2008/02/09(土) 17:17:20 ]
>>221-223
ありがとうございます。
よく考えたらいじる必要はないのでpiyo側をconstにしました


225 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:18:01 ]
>>219
とりあえず、なにか揮発環境は持っているのか?




226 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:18:34 ]
> name + (sizeof(char) * 5)
彼は大丈夫だろうか。

227 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:19:23 ]
>>225
はい。
ジクロルボスは揮発するので大丈夫です。

228 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:22:30 ]
俺のチームのメンバも先週揮発したぜ。

229 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:23:57 ]
ちょっと待て、それは「蒸発」じゃないのか?

230 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:24:28 ]
>>226
それって問題あるのか?パッと見わからん

231 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:26:23 ]
>>230
char であるときには問題にはならないが int とかになると…

232 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:26:24 ]
>>230
>220にはこう書いてある。
>文字列nameの5文字目のポインタ(&(name[4]))をpiyoに格納したいです

233 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:26:31 ]
>>229
そうだな。揮発は性質で、蒸発は現象だからな。

234 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:27:47 ]
>>231
いや、だいじょうぶだろw
ちゃんとintの大きさに対応してくれるよw

235 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:27:55 ]
>>230
ポインタは自動的にそのサイズ分進むから、sizeofを掛ける必要はない、とかかな?



236 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:28:25 ]
>>234
ごめん間違えた

237 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:28:46 ]
ConceptGCCで、190のコードのofstreamとifstreamを
ostream&&とifstream&&にstatic_castしたものを食わせたらどうなるかと試してみたが、
エラーだったorz。右辺値参照はライブラリまで及んでいなかった。

238 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:29:06 ]
sizeof(*name)にするべきとか。

239 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:29:46 ]
>>238
阿呆ですか?

240 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:30:00 ]
>>219
適当に c 入門 初心者とかでぐぐれば環境の入れ方から説明してるとこがきっと見つかるよ

241 名前:203 mailto:sage [2008/02/09(土) 17:46:21 ]
>>225
>>240
すいません。もう一度調べなおしてみます。

242 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:47:29 ]
>>238-239
&5[name] でいいだろ。

243 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:49:48 ]
>>242
>232

244 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 18:10:38 ]
書いてないところのバグを見つけろって言う話?

247 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 18:10:39 ]
>>245
そういう時は先ず、str0の長さが実際にいくつだったのかを確認しましょう。

248 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 18:10:53 ]
>>245
その部分は問題ないように見える。
256にするとエラーが出ないところからみて、
どこかでバッファオーバーフローしてるんじゃない?

249 名前:245 mailto:sage [2008/02/09(土) 18:12:34 ]
>>246-247
えっとすみません、str0には固定の文字を入れるようにして試しています
16文字の文字列でして、コンストラクタ内でlenの長さを表示させるときちんと16文字になっています。
また、同じくコンストラクタ内でstr0を表示させるときちんと渡した16文字の文字列が表示されます

250 名前:245 mailto:sage [2008/02/09(土) 18:15:42 ]
main内に
char* buff = "abcdefghijklmnop";
test hoge(buff);
これだけです
余計な部分を全てコメントアウトしてるのでこれでコードは全てです

251 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 18:16:08 ]
実行部分をみせろ。
test test1("abcdabcdabcdabcd");
ならまったく問題ないはず。

252 名前:251 mailto:sage [2008/02/09(土) 18:22:16 ]
ごめん、違うな

253 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 18:23:47 ]
>>245
そこを変えたら動くからといって、バグの出元がそこだとは限らない
ぜんぜん関係なさそうな別の場所も疑う必要がある

254 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 18:24:42 ]
strにはアクセスしないの?
test内でstrcpyしなくていいのか?
なにがやりたいんだ?

255 名前:245 mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 18:44:34 ]
mainってことは、MFCとかは使ってないわけか……
リビルドしたら直るとか言う落ちはないよな?

257 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 18:44:45 ]
>>255
余計なincludeもコメントアウト。
さらにエラーが無くなるまでコメントアウト。
新規プロジェクトと作成して、必要なコードだけ貼り付けて動かしてみる。

258 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 18:44:52 ]
おかしいなあ、ちゃんと動くぞよ。

259 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 18:53:05 ]
少なくともうちでは落ちない。

VC++ 2005 Express Edition SP1 + Win2KSP4

261 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 18:59:59 ]
>>255
どの行で例外発生してるか突き止めたのか?

262 名前:244 mailto:sage [2008/02/09(土) 19:00:55 ]
こちらもヨロ

263 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 19:02:03 ]
>>262
wchar_tがただのtypedefの環境ではそうなる。
VC++6とか。

264 名前:244 mailto:sage [2008/02/09(土) 19:05:57 ]
>>263
はい、VC++2005EEですので、
そういうものなのですね。
どうもでした。

265 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 19:06:46 ]
2005はさすがにtypedefじゃないんじゃないか?



266 名前:244 mailto:sage [2008/02/09(土) 19:10:30 ]
どうすれば確かめられますか?

267 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 19:14:15 ]
>>266
wchat_tとsizeofが一致するいろんな組み込み型とで、オーバーロードしてみる。

268 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 19:15:47 ]
wchar_tを組み込み型として扱うコンパイルオプションがあったはず

269 名前:244 mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 19:50:27 ]
namespace hoge
{
 int main(int argc, char *argv[])
 {

 }
}

これをコンパイルすると、↓と言われます。どうすればいいですか?
error LNK2019: 未解決の外部シンボル _WinMain@16 が関数 ___tmainCRTStartup で参照されました。


271 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 19:52:06 ]
>>270 何がしたいのか考え直すといいです。

273 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 20:03:51 ]
>>270

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

 }
}

274 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 20:18:31 ]
テラ反則w

275 名前:244 mailto:sage [2008/02/09(土) 20:24:00 ]
>>271
動きました。
私のだと、いろいろな点で駄目でしたね。
ありがとうございました!



276 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 20:30:49 ]
>>274
正しい。

278 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 20:43:53 ]
>>276
単に何の型のポインタになっているかで決まる。
型が char* のときとそれ以外の T* について
operator<< のオーバーロードが違うだけ。

  char a = 'A';
  char* p = &a;
  cout << p << '\n'
とすると確保されていない領域まで突き抜けて文字列が表示される (はず) 。


279 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 20:43:57 ]
>>276
コンパイルするときに決まる。
それがconst char*だったら文字列、void*だったらアドレスを表示する。
その他のポインタ型は多重定義解決の規則に従って、上のどっちかに振り分けられる。

280 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 20:58:25 ]
>>276は一貫してpをchar*として話しているのでは。
そうすると、
> p = &a
> みたいな場合だった時は、
> cout << p;
> では、単純に変数aのアドレスが出力されるだけですよね。
は間違い。
aが存在するメモリ位置から始めて、それ以降にたまたま存在するデータを、
無理やり文字列と解釈して出力するだけ。

282 名前:176 mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 00:00:30 ]
>>283
そもそもどんな値を入れたってぐるっと回ってくれば挟まれてると言えるが?
AとCの作る角の小さい方にBがあるかどうかを判定するってことでいいのか?
その場合、AとCが180度離れていればBはどのような値であっても挟まれていないと考えていいのか?

285 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 00:11:50 ]
>>283
Aが0度になるようにBとCを回転させればいいよ。



286 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 00:11:56 ]
>>284

> CはAから見て反時計方向に92度離れています
って記述があるからそれは気にしなくていいんじゃね?
> A=350度、B=0度、C=30度のときうまく成立しません。
ってのは例のつもりだろう。

287 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 00:22:38 ]
AとBの角度 + BとCの角度 < 180
なら挟まれてるよ。

291 名前:デフォルトの名無しさん mailto:sage [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... どこが間違ってるでしょうか?

292 名前:291 mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 08:39:32 ]
まったくの初心者なのですがC言語を勉強しようと思ってます
入門書で独習Cと独習C++がありますが、どちらを買えばいいでしょうか?
また他に良い入門書があれば教えて頂けませんか?

303 名前:デフォルトの名無しさん [2008/02/10(日) 08:42:31 ]
>>302
うすい本にしとけ あとはネットで調べればよい 100ページ以下が必須

304 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 08:43:31 ]
その二つだったら間違いなく独習C。

305 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 08:54:23 ]
unicodeもろくに扱えない糞ライブラリがナニ言ってるんだか

309 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 09:03:20 ]
>とにかく薄いやつ
これには同意。
入門書で分厚いの買ってもダラダラ無駄に難しく書いてるだけで理解しにくいだけ
基礎中の基礎さえ理解したら実際作って必要になった処理をネットで調べる方がいい

310 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 09:20:07 ]
STLってunicode扱えないんだっけ?

311 名前:デフォルトの名無しさん [2008/02/10(日) 09:21:58 ]
つかえる 一語が判別できないのは charでもおなじ

312 名前:デフォルトの名無しさん [2008/02/10(日) 09:41:39 ]
ここ勉強すれば良いよ

www.geocities.co.jp/SiliconValley-Bay/8490/c/index.html
rina.jpn.ph/~rance/c_language/index.html
www.asahi-net.or.jp/~yf8k-kbys/newcpp0.html

313 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 09:54:05 ]
>>310
STLに限らずC++にろくなUnicodeサポートがないというだけのこと。
特に気にする必要はない。気にするな。
ただのwchar_tか何かをコンテナに突っ込んで使うだけだ。

314 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 09:59:53 ]
ああそういうことか
STLが何か文字コードに依存してるのかと思ったよ

315 名前:デフォルトの名無しさん [2008/02/10(日) 10:01:29 ]
たとえば10文字目が何バイト目とか判別できないだけ



316 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 10:36:34 ]
excite翻訳ひどいなw
g++の最小・最大演算子とその合成形はすでに非推奨であり
将来のバージョンでは廃止されます。これらの演算子を使用
しているコードは代わりに std::min と std::max を使用するように変更すべきです。

318 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 11:03:47 ]
T"なんたら"

L"なんたら"
に置き換えるマクロはどう書くですか?

319 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 11:04:42 ]
#define T Lでできなければ無理。
Windowsは関数形式のマクロにして対処している。

320 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 12:13:50 ]
template<class L>

321 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 12:36:12 ]
NT3.1時代からUnicode使ってきたOSに従うべき。

323 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 13:33:02 ]
先日こちらでアドバイスをいただき、プログラムを
書いてみました。学校でできなかった分を家で作成しようと
ソースを持ち帰ったのですが文字化けしてしまい開くことが
できなくて困っています。

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

winのメモ帳でも開けるものだと思っていたので困っています。
どうかよろしくお願いします。

324 名前:291 mailto:sage [2008/02/10(日) 13:34:37 ]
おそらく文字コードが違うんだろ。
nkf使うか、メモ帳以外のエディタでソースコード見れ

325 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 13:36:29 ]
まずはまともなエディタを使うんだ
秀丸にあわせるのがよいかと思うがサクラエディタなど他にもいろいろある

*.cppをgccでコンパイルというのもなんか引っかかるが・・・



326 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 13:37:13 ]
>>323
秀丸のエンコーディングを一時的に変えるか、まともなフリーなエディタを拾って使えばいいんでない?

327 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 13:56:49 ]
つーかC/C++全然関係ない問題なのなw

328 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 14:42:18 ]
回答いただきありがとうございます。
327さんの仰るとおり、C以前の問題でした申し訳ありません。

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

まずはエディタを探してみることからはじめてみます。
ありがとうございました。

329 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 14:48:08 ]
.cppなら普通gccではなくg++を使う。

330 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 14:55:04 ]
結局はgccだけどな

331 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 15:44:22 ]
質問です。
最近Cを勉強していますが、コンパイルが上手く出来ません。

コンパイラーはBorland C++ Compiler5.5を使ってます。
コンパイルすると、「指定されたパスが見つかりません」となります。
原因は何が考えられますか?

332 名前:デフォルトの名無しさん [2008/02/10(日) 15:45:20 ]
#include <iostream>

#include <iomanip>
ってどういうとき使うの?


333 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 15:46:08 ]
Pathを通してないのが原因。

setbccでぐぐるとよい。

334 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 15:46:20 ]
宣言や定義を使用するとき。

335 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 15:47:03 ]
std::coutとかstd::cinとか使いたければ、まず<iostream>をインクルードする。
その上で、引数のあるマニピュレータが集められているのが<iomanip>。



336 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 15:49:39 ]
>>332レベルの質問する奴に只「マニピュレータ」なんて書いたって通じないだろ

と思って解説を書こうとしたけど、うんこしたくなったので中止

337 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 15:54:56 ]
でもそれ見てマニピュレータで検索すればすぐ解決すると思うけどw

338 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 16:08:51 ]
用途としては>>49みたいな場合に。

339 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 22:21:50 ]
test

340 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 22:34:58 ]
>>340
×ビットを上下逆
○バイトの並びが逆

342 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 22:35:39 ]
エンディアン関係ナス

343 名前:340 mailto:sage [2008/02/10(日) 22:37:25 ]
>>341
バイト単位で逆なんですね。
>>342
あ、全然関係ないんですか;

ありがとうございましたm(__)m

344 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 23:18:02 ]
stdio.hのremove関数の使い方は下記で問題ないでしょうか?
remove("ファイルのパス");

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

見当がつかず困っています、何かご存知の方いたらよろしくお願いします

345 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 23:21:13 ]
>>344 perror() してみれ



346 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 23:22:15 ]
>>344
そのパスと同じままfopenして開けるのか?
つまりほんとにそのファイルをプログラムから認識できているのかをチェキラ!
あと、strerrorでエラー内容を取得してみては?

347 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 23:23:36 ]
test.txt.txtだったりして・・・ いやさすがにそれはないか

348 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 23:26:52 ]
Dドライブは実はDVD-ROMドライブだったりして・・・いやさすがにそれはないか

349 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 23:30:58 ]
そもそもDドライブが存在しな・・・ないか ないよな

350 名前:344 mailto:sage [2008/02/10(日) 23:32:54 ]
permission deniedというエラーが・・
ファイルのプロパティは読み取り専用とか隠しファイルとかチェック入っていないんですが
全く違う部分なんでしょうか?

351 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 23:33:25 ]
chmod a+w FILENAME

352 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 23:35:53 ]
Dドライブがネットワークドライブ・・
のわけないよな

353 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 23:36:33 ]
>>351
ahodesuka?

354 名前:344 mailto:sage [2008/02/10(日) 23:36:53 ]
>>351
うわぁ・・そういうの必要なんですか・・
Cじゃ書けないですよね?

Dはあります

355 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 23:37:30 ]
^^;



356 名前:デフォルトの名無しさん mailto:sage [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:\
だろ。

358 名前:344 mailto:sage [2008/02/10(日) 23:39:44 ]
ファイル自体はあります
今ファイルのパスを変数に入れて、開いて中の文を出力させたりしてみました
その変数をそのまま使っています
それとfcloseもしっかり

359 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 23:39:53 ]
>>357
そうだったな

360 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 23:45:39 ]
>>358
っ attrib d:\test\test.txt

361 名前:344 [2008/02/10(日) 23:52:26 ]
>>360
そういう方法以外のコード内に記述して済ませる方法って言うとWin32APIってのを使うしかないんでしょうか

362 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 23:56:03 ]
>>360
その前に permission denied ってんだから削除する権利があるのかどうか確認しろよ。
コマンドプロンプトから del してみるとか、エクスプローラから削除してみるとか。

363 名前:344 mailto:sage [2008/02/11(月) 00:08:29 ]
>>362
そこら辺は出来ます、管理者権限でログインしてるので間違いないはずです

364 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 00:12:57 ]
>>363
実際消してみた?他のソフトがロックしてるってことはない?

365 名前:344 mailto:sage [2008/02/11(月) 00:14:34 ]
消してみました、remove関数を試す為に作ったファイルなのでそういったことはないと思います



366 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 00:19:03 ]
そのプログラム内でopenしてる状態でremoveしようとしてる、とかいうオチじゃないよね。

367 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 00:23:02 ]
同じこと何度も確認されまくっててかわいそす

368 名前:344 mailto:sage [2008/02/11(月) 00:23:53 ]
>>366
上で言ったとおり、remove関数を使う最低限の文だけで実行してもエラーはでますし
closeもしています

369 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 00:26:22 ]
もうみんな思い当たる節が尽きたんだろ・・・

370 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 00:29:05 ]
プログラムを管理者権限で実行してないとか。

371 名前:344 mailto:sage [2008/02/11(月) 00:29:09 ]
絶対パス指定出来ない訳ないですよね・・・なんでだろう

372 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 00:29:59 ]
あとは、ディレクトリ消そうとしてるとかぐらいかな。

ファイルを開いて中の文を出力させたりしてると言うから多分違うだろうが...。

373 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 00:30:13 ]
OS やコンパイラの情報でも出さないとこれ以上どうしようもないだろ。エスパーでもなけりゃ。

374 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 00:42:31 ]
リブートしてみるとか

375 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 02:53:40 ]
エクスプローラなんかでやったときとプログラムでやったときとで権限が違うとか。
Vistaだったらありそうだ。



376 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 02:54:17 ]
おれの経験から予想するとtest.textになってると予想
それで何時間も悩んだことがあるw

377 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 04:20:26 ]
俺は LAPACK 使ってるけど、
他の選択肢を吟味した訳じゃないからなあ。

381 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 10:00:48 ]
なぜそんなことをする必要があるのですか

388 名前:デフォルトの名無しさん [2008/02/11(月) 10:06:36 ]
たとえばサブディレクトリのファイルリストをひとつひとつ取得したいとき、
同一ディレクトリにまだファイルが残っていれば次のファイルを呼んで、
無ければハンドルを解放して、子ティレクトリへ進めたいんです

389 名前:デフォルトの名無しさん [2008/02/11(月) 10:07:45 ]
フラグを別に持っていれば確認できますが、なるべく変数を減らしたいと思います

390 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 10:09:05 ]
かならずNULLで初期化してCloseしたらNULL代入すればいい。

391 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 10:09:56 ]
ファイルハンドルは NULL じゃなくて
INVALID_HANDLE_VALUE だ!

392 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 10:16:38 ]
NULLで比較しちゃってるコード多いけどな
それで動いちゃってるし

型安全なtypedefでもないかぎり防ぐのは無理ぽ

393 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 10:17:59 ]
ごめん間違えた
INVALID_HANDLE_VALUEは-1だった

394 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 10:19:16 ]
>>392
クラス作ればいいじゃん。

395 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 10:44:52 ]
C だと不完全型を利用して隠蔽する。

398 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 10:53:10 ]
Cでshared_ptrみたいなのはないの?

399 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 10:55:22 ]
テンプレートが無いのが辛い所だな。
マクロで何とかできなくはないが。

400 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 10:56:52 ]
それ以前にデストラクタが無いんだから仕方が無い

401 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 11:00:54 ]
AddRef/Release を自前でやるなら問題ない。
面倒だけど。

402 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 11:08:24 ]
なんで CoCreateInstance 使ってないの?

404 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 11:21:28 ]
CoCreateInstanceはレジストリに登録しないと使えないと、どこかで見た記憶があり
更にDirectXのレジストリ登録を見る限り、musicしかなかったので
この方法でいけるんじゃないかと思っていました

CoCreateInstanceの方で調べて試してみます
指摘ありがとうございました

405 名前:388 できました [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;}}}}



406 名前:388 できました [2008/02/11(月) 11:30:24 ]
全ファイル名を順番に出力する機能って基礎的だと思うのですが、標準にないので作ろうと思いましたよ

407 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 11:39:33 ]
再帰使わないの?

408 名前:388 できました [2008/02/11(月) 11:41:51 ]
再帰はつかいません パソコンにメモリ管理を任せると、鈍くなったり不安定になるからです

409 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 11:45:04 ]
それだとWindowsやLinuxといったOS自体使えない理屈だが・・・

410 名前:388 できました [2008/02/11(月) 11:46:13 ]
メモリというより、データをスタックへ積むコンパイラの仕組みでした

411 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:00:59 ]
ファイルの列挙くらいは大丈夫だと思うけど

412 名前:デフォルトの名無しさん [2008/02/11(月) 12:02:05 ]
複数のファイル(1000以上)にランダムに書き込みがある時、
HDDの内蔵キャッシュやwindowsの標準キャッシュの効き目が悪くなるので
バッファ付きファイル出力クラスを作ります

413 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:05:26 ]
そうか。がんばれ

414 名前:デフォルトの名無しさん [2008/02/11(月) 12:09:05 ]
double であることを明示的にするには、数字の最後にLをつければいいですか?


415 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:14:08 ]
.0でいいんじゃね?



416 名前:デフォルトの名無しさん [2008/02/11(月) 12:20:12 ]
>>415
やっぱりそっちの方がいいかな。
100とか1とか切りのいい数字なんだけど、doubleで計算させたいときに、
せっかく切りがいいのに、100.0とかするのがいやだったんだけど、
100だとintとかにみえてしまう感じ。
やっぱり、.0にしときます。
ありがとうです。


417 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:24:19 ]
整数リテラルにLつけてもlongにしかならんだろ

418 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:27:18 ]
100.でもおkだった気がする。すごく中途半端だけど

419 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:27:22 ]
2.0Lもdoubleではなくね

420 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:27:59 ]
bccだと100.0Lにするとdoubleじゃなくてlong double(80bit)になっちまう。

421 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:29:00 ]
あるとすればdだよな。あるとすれば。

422 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:30:26 ]
> 100だとintとかにみえてしまう感じ
見た目の問題じゃなくて、実際にコンパイラにそう解釈されてしまうよ。
暗黙の型変換はおいておくとして。

423 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 12:30:29 ]
bcc以外でもlong doubleだろう・・・

424 名前:漏れは 100. かな。 mailto:sage [2008/02/11(月) 13:16:38 ]
C++なら、double(100)でいいよ。

425 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 13:19:51 ]
てゆーかそれでいいならcでも(double)100でいいだろw キャストだけど



426 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 13:24:28 ]
>>391
ここでは有効かどうか区別できれば十分なんだからNULL使ってもいいと思う。

427 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 13:40:07 ]
>>426
有効なハンドルとしてNULL(=0)返されたらどうすんだ

428 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 13:41:49 ]
正常なハンドルとして0を返すライブラリの設計がおかしいと考えるんだ。

429 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 13:43:49 ]
おかしくても使わねばならんこともある。

430 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 13:45:03 ]
0と-1が無効というハンドルもあるのさ・・・

431 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 14:07:48 ]
>>426-430
て言うか、ハンドルはポインタとは違うんだから NULL と
比較するなんて発想する奴はどうかしてると思う。

432 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 14:13:04 ]
しかし型の実体がポインタだから困る

433 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 14:13:06 ]
>>431
ハンドルの正確な定義って何?

434 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 14:19:45 ]
PVOID

435 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 14:26:24 ]
>>433
実体を一意に示す値じゃないの?
正確な表現かどうかわからないけど。

ポインタもハンドルの1つの設計としてありえるし、
整数で0から順に付番する設計も考えられる。



436 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 14:32:01 ]
実態が何かは関係なく、ハンドルはハンドルとして扱わないと。

437 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 14:49:17 ]
>>436
そういう抽象的なことで逃げるのがWindowsプログラマ

438 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 14:58:02 ]
>>437
まあお前はFILEをいじってドツボにはまってろ。

439 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 14:59:39 ]
>435でも似たようなこと言ってるけど将来的に
実体が変わる可能性もあるからねぇ。

440 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 15:12:46 ]
>>438
MSの下僕乙

441 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 15:17:16 ]
いや待て。Windowsとか関係なく、
ハンドルと、ハンドルの実装は切り離して考えるだろ。
ソフトウェアは抽象化が支えているって習わなかったか?

442 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 15:43:47 ]
抽象化なんては馬鹿には理解できないと言うだけのことだろ。

かわいそうだから、スルーしてやりなよ。

443 名前:デフォルトの名無しさん [2008/02/11(月) 16:04:00 ]
stdio.h読み込むと関数使えますが、
zip.hを自作してこれ読み込むだけでDLLを使用してzipの解凍出来るように出来ますか?
ソース内でDLLを読み込まないと無理ですか

444 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 16:23:19 ]
>>443
DLLだって元はソースコードなんだからそれを自分で書けばできるよ。難易度は別にして

445 名前:デフォルトの名無しさん [2008/02/11(月) 16:25:54 ]
DLLの関数をヘッダファイルの読み込みだけで使えるようには出来ませんか



446 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 16:26:49 ]
>>445
できるよ

447 名前:デフォルトの名無しさん [2008/02/11(月) 16:28:00 ]
やりかた教えて下さい

448 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 16:28:55 ]
ヘッダファイルでロードすりゃいい。コンストラクタとかで。

449 名前:デフォルトの名無しさん [2008/02/11(月) 16:29:49 ]
#include "zip.h"

main(){
zip_init();
}

としてロードする方法しか判りません

450 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 16:31:23 ]
Cなのか?環境くらいはまず書いてくれ。
どうでもいいが、その方法がなぜいけないのだ?

451 名前:デフォルトの名無しさん [2008/02/11(月) 16:33:55 ]
printfなど標準関数はロードせずに使えて便利じゃないですか
DLLの関数も自動でロードしたら便利になります
コンストラクタで自動になるかやってみます

452 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 16:36:06 ]
思いっきりいろいろ勘違いしている。printfはロードとか関係ない。
zip_init()は初期化のために必要な処理だろ。全然別だ。

453 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 16:37:45 ]
printfとか入ってるlibcは標準でリンクするようになってるからな
mathだと-lmいるだろ?

ようするになんか勘違いしてないか?

454 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 16:40:12 ]
printfはスタティックリンクなので、ビルド時にlibがリンクされている。
DLLは名前のとおりダイナミックリンクなので、プログラムが自分でリンクしなければならない。

455 名前:443 [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 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 16:49:37 ]
そのDLLからインポートライブラリ作ってリンクしとけ

457 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 16:52:42 ]
2つ以上unzipしたときの動作とかも考えとけと

458 名前:デフォルトの名無しさん [2008/02/11(月) 16:53:02 ]
この方法では、どういつDLLの関数でもハンドルを個別に用意しなくてはならないですが
便利なので主要なDLLの関数は書き換えようと思います

459 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 17:51:53 ]
>>460
hの初期化してる?

462 名前:460 mailto:sage [2008/02/11(月) 18:05:10 ]
>>461
hには元の高さの3.0fが入っています。

463 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 18:05:49 ]
afterとbeforeが同一だったら0除算発生しないか?
めちゃくちゃなのはその処理だと思うぞ・

464 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 18:07:34 ]
>>460
先ずはtimeGetTime()を使わずに、自分で時間軸を制御してみたら?

465 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 18:38:08 ]
>>460
h=(1/2)gt^2 だったら -= していくのはおかしいだろ。



466 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 18:41:18 ]
計算結果を普通に代入すれ

467 名前:460 mailto:sage [2008/02/11(月) 18:46:30 ]
beforeはウィンドウが作られたときに数値を入れて、afterは重力計算直前に数値を入れています。

(after-before)の部分を手動で数字の1や2に書き換えたら正常に動作しました。
DWORDとfloatの単位とかの問題ですか?
>>465
すみません、落下距離じゃなくて必要なのは現在の高さでした。

468 名前:デフォルトの名無しさん [2008/02/11(月) 18:56:48 ]
UNZIP32.DLLの解凍時の進行状況を抑止するにはどうすればいいですか

469 名前:468 [2008/02/11(月) 19:02:03 ]
自己解決しました

470 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 20:20:58 ]
>>467
たぶん>>463だろうな。
数百メガから数ギガHzで動くCPUからしてみたら、
ミリ秒なんて気の遠くなるほど長い時間。

471 名前:465 mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 21:12:06 ]
警告なんだから、気にならなきゃ別に対処しなくてもいいんでないかい。

おれは、気にする性質だから可能な限り対処するけど。

474 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 21:48:10 ]
>>470
0除算は発生しないよ。乗算してるんだから。

475 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 22:11:40 ]
>>472
remarkは警告ですらないよ。



476 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 22:15:11 ]
>>474
orzぼけていた。

477 名前:デフォルトの名無しさん [2008/02/11(月) 22:24:26 ]
ものすごく初歩的な質問でごめんなさい・・・

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

色々検索して調べたのですが、わかりませんでした。
お願いします。

478 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 22:28:22 ]
>>4
とりあえず何に表示してるか教えろ
winのコマンドプロンプトか?

479 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 22:29:25 ]
>>477
手始めに、VRAMとかフレームバッファとか呼ばれるものにアクセスする方法を探してみてはどうだろうか。

480 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 22:29:56 ]
>>477
環境によって違うので、先ずは環境を明らかにしてください。

481 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 22:30:27 ]
>>479
ちょw

482 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 23:49:04 ]
「質問の仕方が」初歩的だと、手の施しようがないよな・・・。

483 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 03:40:56 ]
getchar();でも入れておけば?

485 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 05:23:58 ]
char型、int型の宣言ひとつで何バイトの領域が確保されますか?
環境によって違うってよく聞くけど例えばXP32bitの場合



486 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 05:25:40 ]
sizeof(char)
sizeof(int)

487 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 05:29:08 ]
char型は常に1バイトじゃなかったっけ?

488 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 05:52:00 ]
>>486
ありがとう。そういえばそれで見れたね
いつもよくsizeof使ってるのにその発想がでてこなかった
>>487
char型はかわらないのか。勉強になりました

489 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 05:56:23 ]
疑問文の内容をまんま受け入れることで「勉強」しないほうがいいのでは。

490 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 07:18:48 ]
char型は常に1バイトだが、1バイトが常に8ビットとは限らないからな。

491 名前:デフォルトの名無しさん [2008/02/12(火) 08:16:21 ]
>>490


492 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 08:18:44 ]
生暖かい目で・・ってのはこういうことを言うんだろうな

493 名前:デフォルトの名無しさん [2008/02/12(火) 08:19:52 ]
perlをコンパイルしてC言語から使えるDLLを作成できますか

494 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 08:21:42 ]
1Byte==sizeof(char)が9bitだったり7bitだったりすることもある

495 名前:デフォルトの名無しさん [2008/02/12(火) 08:22:04 ]
アセンブラをソースに埋め込めますが、perlとかフォートランはないですか



496 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 08:26:22 ]
>>494
それは既に論外

charこそ1バイトの基準だとでも思ってるのか?
卵が先か鶏が先かとかいうレベルじゃないぞ?

497 名前:デフォルトの名無しさん [2008/02/12(火) 08:29:26 ]
>>493ですが
DLLでなくてもC++から使える方法ならいいです

498 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 08:58:38 ]
疑問を投げかけるだけ投げかけて
496は海の藻屑と消えました。

500 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 09:11:10 ]
>>500
36! は 371993326789901217467999448150835200000000 であって、
2^64 = 18446744073709551616 を大幅に越えている。

二項係数の値を求めたいのであれば、
パスカルの三角形を使って足し算だけで求めると良い。

502 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 10:43:24 ]
>>501
ありがとうございます。扱える数字をオーバーしちゃってるんですね
パスカルの定理調べてみたけどよく分からない…
高校の時の数学の教科書引っ張り出してきます

503 名前:デフォルトの名無しさん [2008/02/12(火) 12:50:57 ]
>>497
COMの知識があれば使えるかも。

504 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 16:09:15 ]
>>505
char *filename → const char *filename

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

もし、どなたか原因が分かる方がいれば教えてください。

508 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 16:26:28 ]
>>507
原因ったって、そのプログラムが一瞬で終了するからだろう。
"test\n" を出力したあと、すぐに return してるじゃないか。
プログラムが終了したら窓は消える。

509 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 16:30:51 ]
>>508
今まではreturn 0を入れると「終了するには何かキーを押してください」と言う表示がでてたんですが、
急にでなくなって困っています。
getchar();を入れた場合は止まりますが、キー入力待ちにはなりませんでした。

言っていることが聞かれている事とちがったらすいません。

510 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 18:22:49 ]
コンストラクタの後のセミコロンはネームスペースの終わりのとこだべ。
なくてもいいけど。
で、デストラクタはオブジェクトを作ってないから呼ばれないので、通所は無くてもいいが
virtual の場合は別。

515 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 18:24:58 ]
それだけじゃ判らんから、気になったことだけ。
・なんでstd::stringを値渡ししているの?
・そのAの実体はどこにあるの?



516 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 18:32:17 ]
>>511
namespaceの終わりにセミコロンは不要。
仮想関数には定義が必要。定義が無いと仮想関数テーブル
(そのメッセージでいうvtable)のエントリーを作れない。
仮想でなければ呼ばれなければ必ずしも定義は必要ない。

517 名前:デフォルトの名無しさん [2008/02/12(火) 18:40:03 ]
>>514
セミコロンは付け忘れました、
まだ継承は知らないのでなんとも。。
>>515
値渡しでうまく動いてたので特に意味なく使ってました、
ためしにfunc(string *str) に変えてみたら見事に動きました。。。
なぜこういう結果になるのかよくわかりません。。。
すばやい解答ありがとうございました。

518 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 18:42:07 ]
>>517
どうでもいいが、>514は>512宛てだ。
ついでに言えば、ポインタ渡しじゃなくて参照渡しにするだろ。常考

519 名前:デフォルトの名無しさん [2008/02/12(火) 18:49:20 ]
>>518
勘違いしました、、
なぜデバッグだと動いていたのか、と
値渡しだとだめなのかを知りたいのですが。。

520 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 19:11:48 ]
>>513
mainもないのが、問題なく動くのか……最近のC++は凄いな

523 名前:513 mailto:sage [2008/02/12(火) 19:13:15 ]
>>520
Releaseでビルドプロパティの最適化を無効にしたらReleaseでも大丈夫でした。

524 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 19:14:50 ]
>>521
問題が再現する最小のテストコードを作って
検証してから質問してくれ

525 名前:513 mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 19:16:44 ]
>>525
まて、複数のスレッドからグローバル変数にアクセスしてるのか?

528 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 19:18:51 ]
このあと、衝撃の新事実が!

529 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 19:21:42 ]
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));


D3DPRESENT_PARAMETERS d3dpp = {0};

結果に違いはありますか?

530 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 19:23:24 ]
STL使っておいてExitThreadってのも相当ヤバイ匂いがするけどな

531 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 19:27:49 ]
そもそも〜Thread系の関数って使いどころあるのかね?


532 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 19:27:50 ]
うむ、少なくともA::funcが問題って訳じゃなさそうだよね。
ってか、なんで値渡し……?

533 名前:デフォルトの名無しさん mailto:sage [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;

当然のようにエラーなのですが、こういうばあいどのように記述すればいいのでしょうか。

534 名前:513 mailto:sage [2008/02/12(火) 19:38:00 ]
>>526
mainの中身を >>521のX::funcにあたる場所に入れて実行してみましたがだめみたいです。
>>527
そうです。。
>>530
書かなくてもいいけど明示的に書いても良いって書いてあったので書いてあります。

クリティカルセクションで排他処理した気分になって
親が実体持ってるクラスを使ってます。。

535 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 19:44:25 ]
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ご参照ください
mmc.from.tv/world.html



536 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 19:49:09 ]
宣伝するのはいいけど、糞重いページだと注意書きしろよ。

537 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 19:59:41 ]
例外を投げるときどういう型で投げるのが一般的なんでしょうか?

エラーメッセージ?
エラーコード?
それともクラスで投げて型判別?
どういう形がスマートでしょうか

539 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 20:03:05 ]
CAtlException

540 名前:デフォルトの名無しさん mailto:sage [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

所望の動作が得られました。

541 名前:513 mailto:sage [2008/02/12(火) 20:42:48 ]
答えてくださった方々ありがとうございました。

542 名前:460 mailto:sage [2008/02/12(火) 21:10:50 ]
>>471

なるほど。そこの部分と、>>460では省略した速度のvをintからfloatにしたらなんとなくうまくいきそうな感じになってきました。
ありがとうございます。

543 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 21:18:08 ]
Cの基本的なこと(繰り返しや条件分岐、演算子、ポインタ、構造体)をやってからC++(visual C++)をやろうと思ってるんですが他にCで勉強してた方がいいことってありますか?

544 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 21:52:39 ]
すまぽい



546 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 21:54:00 ]
CAutoPtrってSTLのコンテナに突っ込んで平気だったっけ。実装的に。

547 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 22:03:06 ]
auto_ptrと一緒じゃないか?

hoge.top().Attach(new Hoge());
で新たなアドレス突っ込んでるから動くだけで。

548 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 22:13:30 ]
>>529
D3DPRESENT_PARAMETERSがPOD型なら無い

549 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 22:13:52 ]
CAutoPtrが原因だね。

550 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 22:14:39 ]
CAutoPtr専用のコンテナがあったはず

551 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 22:16:31 ]
>>548
そいつたぶん釣りか荒らしかただのバカだよ…。

552 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 22:16:54 ]
それかCSharedPtr

553 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 22:24:25 ]
>>534
スレッド中でWindowsAPIのみ使うならCreateThread, ExitThreadでいいよ。
でもCランタイム使うなら_beginthread, _endthread使わないとダメだぜ。
あと、ExitThread等でスレッド終わらせると、スコープ抜けずにスレッドが終わる。
C++使うなら、ローカル変数のデストラクタ呼ばれなくなるからやめた方がいい。

554 名前:460 mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 23:22:46 ]
>>554
おかしいというときは、after - beforeやtimeの値が0になっているときじゃないか?

558 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 23:34:52 ]
timeGetTimeが何を返す関数なのか理解しないで使っているに1ガバス。

559 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 23:42:03 ]
戻り値で
return *(hoge + (sizeof(piyo) + 2);
みたいに書くのって非推奨なんでしょうか?*は無くてもいいんだけれども

560 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 23:52:53 ]
ケースバイケース。
つか、それだけじゃ分からん。

561 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 23:55:35 ]
>>559
まあ、非推奨だろうね。








コンパイルできないし。

562 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 23:57:36 ]
>>559
*があるとないじゃ内容が変わるが?括弧の数が合わないのはtypoでいいよね?
個人的には、あんま複雑になるようならローカルに落として欲しいけど、これくらいなら許容範囲。
ってか、ポインタを+2するだけならreturn hoge + 2;でもいいんでねぇの?


563 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 23:58:57 ]
>>559
何がいいたいのかさっぱり分からない。

564 名前:460 mailto:sage [2008/02/13(水) 00:45:52 ]
うあああああああああ!できました!
>>555
整数型って分かってたつもりなのに小数いれてました!
あと、>>557で言われたとおりにtimeの値調べてたら、
ウィンドウ生成時に
before = timeGetTime();
そして計算時にも
before = timeGetTime();
ってやって、afterに何も入ってないような状態になってたような感じでした!
今度こそ解決しました!ありがとうございます!

565 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 00:53:15 ]
そもそもさ、めちゃめちゃな計算結果って具体的にどんなんよ



566 名前:460 mailto:sage [2008/02/13(水) 01:11:10 ]
3Dのモデルを動かしてて、チェックするまでは数字の表示の仕方がよく分からなくて数字に出してなかったんですが、
とりあえず物体のy座標しかいじってないのにカメラの位置が変わってました。

567 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 01:53:03 ]
一時的でなくそこからずっと指定の型で宣言したみたいに扱う方法ってないですか?
例えばchar型で宣言したのを一々(int)とかしなくてもずっとint型として扱う
みたいな感じで

568 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 02:02:10 ]
>>567
言いたいことがわからない。キャストを毎回するのが面倒ってことか?
ずっとintならはじめからintにしとけばいいんでねぇの?

569 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 02:08:09 ]
>>567
union{
char a;
int b;
};
ちょっと違うかもしれんが

570 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 02:08:59 ]
>567
#define char int
なにが起きても責任とらないよ。

571 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 02:26:22 ]
>>568-470
ごめん_beginthreadが引数としてvoid*しか渡せないからそれをchar*として扱える
ようにしたかったんです
関数内でchar *xxx=(char *)xxxとすることで解決しました。ご迷惑おかけしました

572 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 02:27:27 ]
>>568-470
ごめん_beginthreadが引数としてvoid*しか渡せないからそれをchar*として扱える
ようにしたかったんです
関数内でchar *xxx=(char *)xxxとすることで解決しました。ご迷惑おかけしました

573 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 09:45:29 ]
AはBの作成者、じゃないのね?
グローバルデータが化けた理由がわかれば解決すると思うよ。

577 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 09:49:28 ]
同時に書き込んだんじゃね?
もしくは書き込んでない(初期化してない)のに取得したか

578 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 09:58:22 ]
どうせ排他してないだけなんだろうな

579 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 10:00:48 ]
>>575
多分GUIスレッドにはPostMessage()でブン投げてるんだろうが、
GUIスレッドがPostされたメッセージをメッセージキューから読み取るまでの間に
受信スレッド側からの再Postが発生し得るから、その場合グローバル変数では
当然上書きされてしまうだろ。

Post側は毎回malloc()等でメッセージ用の領域を確保して、受け側で
メッセージを処理したらfree()するように汁。

580 名前:デフォルトの名無しさん mailto:sage [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;
}


581 名前:580 mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 11:58:15 ]
スマートというかそれが普通じゃね。

583 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 12:01:25 ]
>>580
標準 C++ ではエラーになるはず。 gcc のバグっぽいな。
gcc.gnu.org/bugzilla/show_bug.cgi?id=21386
(だいぶ古いけど CONFIRM されてない。)

584 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 12:19:49 ]
return文で計算したりって避けてたけど結構普通にやるもんなんだな

587 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 12:20:57 ]
>>585
fstream は読み書き両用。読み取り専用の ifstream を渡せないのはあたりまえ。
なんで ifstream& にしないの?

588 名前:580 mailto:sage [2008/02/13(水) 12:26:17 ]
>>582-583
レスありがとうございます。
まあ動くけど将来にわたって安全とは言い難い、
ってかやはり>>581推奨ってとこですかね。

>>584
あくまでサンプルなんで御容赦ください。
でもお気遣い感謝します。

589 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 12:46:25 ]
まずい点あったら教えてくれと書いてるのに
まずい点を指摘したら言い訳ってどーなんだ

590 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 12:46:29 ]
>>585
ファイルストリームのクラス階層を確認してみるべき。
fstreamとifstreamは継承階層の中で関係が全く無い。


591 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 12:53:03 ]
>>589
いや、質問の主眼が"taking address of temporary"のWARNINGでしたので。
その他は瑣末なことと手を抜いてしまいました。
とりあえずお詫びまで。

592 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 12:56:48 ]
まあありゃ誰がどう見てもただの揚げ足取りだな

593 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 13:03:19 ]
>>585
ちょっとややこしいけど、そのコードには、一般によくある勘違いにかすっている
君独自の勘違いがある。

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

で、君はこれを踏まえて、fstreamにifstreamを渡すという、更なる勘違いをしてる。
読み書き両用クラス「が」読み取り専用クラス「の」子であるのは明白なわけで、つまり君は、
このセンスがまだ身についていないか、あるいは、普通に渡すだけでダウンキャストが可能になるという、
C++の仕様に対する勘違いをしていることになる。

594 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 13:19:14 ]
std::cinをstd::ifstreamに渡しても問題なかですか?

595 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 13:36:47 ]
std::istreamじゃイヤなのか? なぜ f が必要?



596 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 13:47:04 ]
>>593
そんなくどい説明必要ない。
クラス階層見れば一発で分かる。
他人の勘違いまでも決め付けるなんて教えたがりも甚だしい。


597 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 14:10:16 ]
>>596
現実に「クラス階層見てない」人なんだし、
他に可能性が無い状況は決めつけとは言わないよ。
変な理屈で変なスイッチ入っちゃった人に絡まれるのってやだなぁ。

598 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 15:23:56 ]
using namespace std;
は何かヘッダをincludeした後じゃないとだめなの?

599 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 15:28:19 ]
書くだけならお好きにどうぞ

600 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 15:39:47 ]
VCで先に書くとstdと認識してくれないのですが


601 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 15:41:55 ]
makeファイルがLinux、Windows、Macを識別する方法を教えてください

602 名前:デフォルトの名無しさん [2008/02/13(水) 15:46:10 ]
>>600
これを機会にusing namespace std;をグローバルに置くのを
やめちまいなよ

603 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 15:50:50 ]
どこに置くのが正解なのでしょうか?
mainの中?

604 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 15:58:42 ]
グローバルに置くのが正解

605 名前:602 [2008/02/13(水) 16:00:48 ]
>>603
いや、mainの中の先頭に置いても良いけど
スコープはmain内だけであってまぁ・・なんていうか・・・

using namespace std;の宣言自体を俺は勧めない



606 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 16:11:52 ]
>>603
原則 using を使わず全部書くのが推奨だな

607 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 16:18:05 ]
std::vector<int> hoge;

面倒でもこういう記法に慣れるが吉。

608 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 16:25:19 ]
cout cin endlくらいはusing宣言したいな

609 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 16:39:53 ]
(swap内で)
using std::swap;
using boost::swap;
using 俺ライブラリ::swap;
(definition内で)
using namespace boost::spirit;

これしか使ってないな

610 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 16:44:03 ]
>>608
おれもそう思う。stdにいろいろ詰め込み過ぎだ。

611 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 16:55:48 ]
::boost::mplを使うときに
専用の名前空間に放り込んでusing namespace ::boost::mpl;してから
共通名前空間にエイリアスとなるメタ関数を書くようにする
ぐらいは許してください


612 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 18:52:47 ]
専用名前空間って、それのためにしか使わないなら、
名前空間のエイリアスnamespace hoge = boost::mpl;で十分では?

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

namespace dr = System::Drawing;

613 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 22:36:33 ]
VC++のusing namespaceは壊れてるから
専用の名前空間でも使わない方がいいよ

614 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 22:52:15 ]
std::mapから登録していないKeyつかって[]で取り出そうとすると
出来立てのValueが返ってきますか?

615 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 22:55:30 ]
うん



616 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 03:32:31 ]
_beginthreadでマルチスレッドで実行する関数って戻り値設定できないの?

617 名前:デフォルトの名無しさん [2008/02/14(木) 03:53:29 ]
くずたれの質問ですいません
class内でのstaticメソドはどういう役割をするんでしょうか
csharpやjavaだとわかるんですが
C++でのstaticメソッドは、いまいち解りません
どなたか解説お願いしていただけないでしょうか


618 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 03:58:05 ]
>>616
_endthreadex()を使えば整数は返せる。


619 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 03:58:44 ]
>>617
C#やJavaと同じだと思うんだけど。なんで違うと思うの?


620 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 10:08:44 ]
>>621
その書き方は現行の C++ ではコンパイルできない。
「みたいな」という幅がどこまであるのかによっては、
似たような書き方ができることもあるけど。

623 名前:デフォルトの名無しさん [2008/02/14(木) 10:22:11 ]
batファイルで、処理の途中でキー入力を求められるとき
どうすれば入力できますか?
パスワード入力を自動的に行いたいのです。

624 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 10:32:29 ]
>>621

>>10

625 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 10:36:58 ]
>実際の職業プログラマさんなんかはC#やVB.NETみたいなのを使う
業種にもよるけどMFC使ってる職業プログラマも多いよ
むしろそっちの方が多いはず

MFCの情報が少ないのは調べ方が悪いと思う

627 名前:デフォルトの名無しさん [2008/02/14(木) 10:44:20 ]
template <>の中にかけるのは、classと、typename、それにintだけですか?


628 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 10:46:03 ]
>>623
スレ立てるまでもない質問はここで 第89刷
pc11.2ch.net/test/read.cgi/tech/1202726651/

SET /P password=

629 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 10:59:57 ]
template<class A, class B> void Foo( B b ){}

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

Foo<int>( bar );

と引数から特定できない型のみを指定できるのは、
C++において正しい仕様なのでしょうか?VS2005では一応コンパイルが通る
ようですが…


631 名前:625 mailto:sage [2008/02/14(木) 11:05:33 ]
>>626
なるほど・・どうにもうまく調べられないようで、ちょっと離れたプログラム関連の本が多い
書店へ行ったのですが、MFCについての本は独習シリーズを書いている方のものが1冊(古い)と
その他薄いものが何冊かしかありませんでした
それと合わせて情報が少なくマイナーなのかと思ってしまっていました
もうちょっとMFCについて調べてみます

632 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 11:08:19 ]
というかそのプログラム関連書籍が多い書店を教えて欲しいw

633 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 11:23:26 ]
池袋にあるジュンク堂ってとこです
大型書店何件か回ったけどあそこが群を抜いて多かったです

634 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 11:30:11 ]
あそこいいね
立ち読み客のために椅子まで用意されてたし
ちょっと前まで近所だったからよく行ってたよ

635 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 11:49:07 ]
ただちょっと会計が面倒ですよね

一応MFCやってみようと思います、WinAPI知らないままで不安ですが独習シリーズの人の本買ってみようと思います
ありがとうございました




636 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 12:18:20 ]
今更MFC?……
目的にも依るし、ここで続けるのもスレ違いだから詳しくは書かないけれど。

637 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 12:19:34 ]
MFCはこれから落ち込んでいくんじゃないか?.NET系(C#とか)やるべきだと思うの俺だけ?

638 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 12:31:40 ]
落ち込んでから.NETなり時代に沿ったものに切り替えればいい
目的にもよるけど

639 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 12:45:38 ]
MFCはまあ、最初の枠組みやってくれるのだけあてにして使ったりするな。

640 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 13:07:23 ]
>>621
ttp://www.kmonos.net/alang/boost/classes/assign.html

641 名前:デフォルトの名無しさん [2008/02/14(木) 13:28:04 ]
サブスレッドがデータ更新した事を知るためにはwhileなどで繰り返しチェックする以外にどのような方法がありますか

642 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 13:29:25 ]
>>635
その本は良書だしMFCを少しでも触ったことがあれば難しくはないが、
MFCの情報を探し出せないという検索の腕からいってもお前さんにその本はまだ早い。
というかMFCなんて仕事で必要でない限りは今更初心者が手を出すべきものでもない。

643 名前:641 [2008/02/14(木) 13:32:48 ]
イベントドリブンっていうのはきいたことあるのですが、BCBとかでは無い標準のC言語、C++でどうやるのかわかりません

644 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 13:51:27 ]
>>641
Windowsならイベントオブジェクト、Unixなら条件変数
>>643
標準のC/C++にサブスレッドなんて概念は無いと思うが…

645 名前:641 [2008/02/14(木) 14:02:49 ]
サンクス



646 名前:デフォルトの名無しさん [2008/02/14(木) 14:13:28 ]
CreateEvent() の使い方がわからないので適当なSleepいれてwhileでチェックしようかと思うのですが
CreateEvent()のほうが断然良いですか? たとえば500msとか、100msとか待ったとき
CreateEvent()のほうが即時性とCPU負荷低いですか

647 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 14:15:07 ]
やってみると、それ自体は簡単だからまずやってみろって。

648 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 14:16:31 ]
断然良いです
即時性は高いです
負荷は100msも寝るなら大差ない

649 名前:デフォルトの名無しさん [2008/02/14(木) 14:18:13 ]
DLLにしたいんのですが、なるべく負荷を下げたいんです 
一つのサブスレッドがデータを受信したらそれを知りたいのですが、間隔は2〜10秒くらいです
whileで監視しても変わらないですか

650 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 14:20:42 ]
少しでも下げたいならイベントオブジェクトの方がいいんじゃね
通知が来るまで寝っぱなしだし
100msごとに起きるよりは当然

651 名前:デフォルトの名無しさん [2008/02/14(木) 14:22:04 ]
初心者がわかる文書ありませんか

652 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 14:30:41 ]
CreateEventの使い方なんか簡単だ。
HANDLE handle;
handle = CreateEvent(NULL, FALSE, FALSE, NULL);
これで良い。

653 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 14:31:42 ]
winapiのメリットってなんでsか

654 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 14:34:42 ]
>>653
何に対するメリット?比較対象は?

655 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 14:41:07 ]
ウィンドウプロシージャではよくswitchが使われていますが、
ifではなくswitchを使う理由みたいなものがあるんでしょうか?



656 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 14:42:24 ]
>>655
ifでも書けるから、ためしにifで書いてごらん。
理由がわかると思うよ。

657 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 14:48:20 ]
int main(void){
  for(;;)
 
  return 0;
}

これのコンパイルが普通に通って(´・ω・`)?ってなってるんですが、
ぶら下がり文って次の行でなくても許されてるんですか?

658 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 14:51:34 ]
空白文字(改行含む)はいくらあっても構わない形式なのです。

659 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 14:51:35 ]
for (;;) return 0;

って解釈されてるんだろ

660 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 14:54:21 ]
>658-659
なるほど、どうもです。
同じ行か、次の行までしか許されないもんだと思いこんでました。

661 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 14:54:45 ]
>>657
こんなのでも普通にコンパイル出来るよ
びっくり?

int main(
void){ for(
;

;) return

0;}

662 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 14:58:05 ]
>>661
たぶん、そういうのはわかっちゃいるけど、「ついなんとなく」
ぶら下がり文に対してだけ異なる感覚を持ってしまったんだろう。

663 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 15:01:51 ]
p
r
i
n
t
f
(
"
t
e
s
t
\n
"
);

でもこれは通らないんだね(´・ω・`)

664 名前:641 [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 15:12:56 ]
>>665
そもそもswitch文の存在理由を考えてみるといいかと
およそほとんどのswitch文はif文で書けるわけだし、
C言語のswitch文って要らないよね、ってのは、
それはそれでひとつの考え方だが…

667 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 15:14:05 ]
ぶっちゃけswitchでできることはみんなif-elseでできるし、
while、do-whileでできることはみんなforでできる。
選ぶ基準はどっちが見やすいか、書きやすいか。

668 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 15:23:30 ]
>>630
正しい仕様です。




669 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 17:03:06 ]
>>668
ありがとうございます。安心して使うことができます。

670 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 18:55:03 ]
変換できないワイド文字が検出されたのでその直前で変換を打ち切った

673 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 19:40:47 ]
"ja"がロケール文字列として有効なのか怪しいな。
単にsetlocale(LC_ALL, "");で試してみたら?

あと、本当のワイド文字列リテラルに_Tは使うな。直接L付けろ。
wchar_t wbuf[] = L"Test123あいうアイウ";

674 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 19:54:01 ]
Windows だったら setlocale(LC_ALL, "japanese"); だったと思う

675 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 22:05:20 ]
タイマーをパワーアップ

679 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 00:55:33 ]
>>677
あまり詳しく見てないけど、
Sleepが1/60秒以上帰ってこないことが7回/秒あったら53fpsになるのかな?
Sleepの精度なんてそんなもんだし。

理論値どおりに増加するフレームカウンタを作り、
実際に処理できたフレーム数がそれに追いついたら休む、
追いつくまでは休まず連続して何フレームでも処理する、
とすれば、平均のfpsは理論値と合う。

680 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 00:57:29 ]
こんな感じで見やすくC++の標準関数載せてくれてるサイトありませんか?

ttp://cham.ne.jp/piro/p_stdfunc.html

681 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 01:03:00 ]
ttp://www.cppll.jp/cppreference/

682 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 01:15:08 ]
>>679
「どうしても追い付けなければスキップすることも辞さない」も入れとくべきではないか?

683 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 01:17:05 ]
バイナリファイルについての質問です。
とあるバイナリファイルの中に、12ビット単位でひとつの要素となるデータが99バイト分入っています。
これを3バイトずつファイルから読み出して12ビット単位で区切り、short型に変換して
再度バイナリファイルに書き出したいと思っています。
この場合、バイナリモードでファイルを開いて、char data[3]にread関数で3バイト格納しても
シフト演算子が使えないため、上手く12ビット単位でデータを取得することができません。
何か良い案ないでしょうか?

684 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 01:24:09 ]
>>683
「シフト演算子が使えない」と思い込む根拠は?
まぁ、環境依存上等でビットフィールドを使うか、自前でビット演算するかの違いだけどね。

685 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 01:24:18 ]
やり方は色々あるけど、とりあえず3byte読んでから4byteの整数に格納sすれば?



686 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 01:33:49 ]
a1とa2もunsigned shortでいいと思う。
俺の個人的嗜好だけど。

689 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 01:54:36 ]
>>685〜688
お〜なるほど、とても助かりました。
シフト演算が使えないと言ったのは自分の知識不足です。
3バイトのデータを一気にシフト演算しようとしていました。
上手くいきました。ありがとうございます。



692 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 02:00:33 ]
unionの使い方間違えてないか?

694 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 02:02:56 ]
>>692
試しに、printf("%u\n", A.FILED.element4)にしてみたら?

>>693
適切かどうかは兎も角、間違ってはいないんじゃないか?



696 名前:692 mailto:sage [2008/02/15(金) 02:19:25 ]
>>695
上手くいってないような雰囲気です。
どっか自分が処理を間違えているかもしれないので、
原因を探してみます。

697 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 04:57:05 ]
>>681
ありがとうございます。C++はCの標準関数+これらが使えるのね

703 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 15:01:58 ]
>>704
環境とやりたいことを具体的に。どうせ、Windowsだろうけど。



706 名前:デフォルトの名無しさん [2008/02/15(金) 15:33:29 ]
すみません 似たような質問なんですが

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

ってHANDLEがNULLになるまで待つんですか?どういう価でうごくか教えて下さい

707 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 15:36:24 ]
hHandleがシグナル状態になるか、タイムアウトになるまで待つ。
シグナル状態は、そのhHandleが何かによって変わる。
CreateEventしたやつならSetEventしたやつ、とかね。

708 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 21:16:31 ]
すいません、質問があります。
{
A a;
B b;
}

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

よろしくお願いします。

713 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 21:27:13 ]
>>713
すばやい回答ありがとうございます。継承の時と同じなのですね。



716 名前:デフォルトの名無しさん [2008/02/15(金) 21:31:00 ]
>714
すいません、コピーがうまくいきませんでした。
書き込みがTABを上手いこと反映してくれないみたいですね。


717 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 21:32:58 ]
>>710-711
日本語でおk

718 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 21:48:34 ]
>>714
push_back は無理。
構造体にするならいける。

struct Four { int four[4]; };

719 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 21:50:00 ]
boost::array<int, 4>ってvectorの要素にできない?

720 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 22:19:07 ]
できる

721 名前:デフォルトの名無しさん [2008/02/15(金) 23:03:34 ]
関数の中でたまにでてくる参照引数
(int & みたいな・・)
ってどういうとき使うんですか??

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



722 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 23:04:13 ]
>>721
コピーコンストラクタ作るとき

723 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 23:05:43 ]
>>721
・ 呼び出し元の変数の値を変更したい時
・ 巨大なオブジェクトをコピーせずに関数に渡したい時

724 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 23:14:04 ]
>>724
×int weight;
○float weight;



726 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 23:17:22 ]
>>724
そのコードでちゃんと警告を出してくれるコンパイラに換えるか、そのように設定する。

727 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 23:36:08 ]
>>725-726
こんなのも分からん馬鹿でサーセン。cygwin使ってるんだけどロクに設定もできていないもんでして。
ありがとうございます。

728 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 23:36:33 ]
△float weight;
○double weight;

729 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 23:41:41 ]
>>727
つ[gcc -Wall foo.c]

730 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 23:46:09 ]
gcc -ansi -pedantic -Wall オススメ

731 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 00:10:27 ]
>>733
まずはBOOSTでぐぐって来るんだ

735 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 00:35:37 ]
VC6 でコンパイルできるかなあ。
まあ array くらいならできるか。



736 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 01:41:19 ]
環境ってMicrosoft Visual C++ 6.0って書けば分かる?

737 名前:デフォルトの名無しさん mailto:sage [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");でコンパイルして実行するとエラー
これは確保されていない領域に無理矢理文字列を突っ込もうとしてるからですか?

738 名前:737 mailto:sage [2008/02/16(土) 04:07:15 ]
ごめんなさい間違えました。cを全部pとして考えてください
ついでに言うと(1)の2つめはこんなの
char *p;
p="aaaaaaaaaaaaaaaaaaaaaaaaaaaa";

739 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 04:14:11 ]
文字列リテラル(" " で囲んでるやつ)は、
その文字列の置いてあるアドレスを返す。

740 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 04:18:58 ]
ありがとうございます。ということは
プログラム起動した時点でa〜zや日本語,記号の全ての文字がメモリのどこかに
自動的に置かれるってことですか?
それとも"aaaa"の部分を実行した時点で文字列"aaaa"がメモリに置かれる?

741 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 04:19:58 ]
起動した時点で置かれてる。

742 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 04:20:42 ]
起動した時点で、"aaaa" が置かれる、ね。

743 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 04:27:32 ]
>>741-742
ありがとうございます。今まで知らずに使ってきました。
ずっと気になってたので教えてもらえてスッキリした

744 名前:デフォルトの名無しさん [2008/02/16(土) 08:26:22 ]
>735
げ、自分でコンパイルするのか。
c++標準なのかと思った。


745 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 08:33:14 ]
>>744
Boostは事実上の準標準。
一部のライブラリ以外はヘッダのincludeのみで使える。



746 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 09:08:08 ]
>>737
> (3) sprintf(c,"aaaaaaaaaaaaaaaa");や strcpy(c,"aaaaaaaaaaaaaaaa");
> でコンパイルして実行するとエラー
> これは確保されていない領域に無理矢理文字列を突っ込もうとしてるからですか?

違う。

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

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

>>741-742
規格でそんなこと決まってたっけ?

747 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 09:25:51 ]
>>746
staticな変数と同じ寿命に決まっている。

748 名前:デフォルトの名無しさん [2008/02/16(土) 09:39:06 ]
HTMLファイルの構文を解析して、UTF8形式をS-JIS形式に変換するにはどうすればいいですか?

749 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 09:40:49 ]
>>748
っ NKF

750 名前:748 [2008/02/16(土) 09:41:44 ]
インターネットエクスプローラで読み込んで、S-jisで保存するのをプログラムでやりたいんです

751 名前:748 [2008/02/16(土) 09:43:06 ]
>>749
すみません よんでませんでした
NKFはやったのですが、エンコード属性が指定されていたりして、文字化けしてしまいます
タグを解析する必要があるんです

752 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 09:59:59 ]
>>747
そもそも static な変数の寿命なんて決まってたっけ?

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

それと同じで、利用されてる区間がかぶらない static 変数を同じ領域に割り
当てちゃいかんのか?

753 名前:デフォルトの名無しさん [2008/02/16(土) 10:08:02 ]
インターネットエクスプローラの名前をつけて保存 (エンコード指定) だけを利用するには
どうすればいいですか?

754 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 10:40:02 ]
>>752 のいう同じ領域っていうのは物理メモリの領域を指してるの?

755 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 12:04:02 ]
>>752
厳密には寿命と記憶期間は別物だが、
大抵の人は普段は記憶期間の意味で寿命という言葉を使う。

763 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 12:16:55 ]
記憶期間なんて言う俺俺用語を語られても...

764 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 12:23:50 ]
記憶域期間だった

765 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 12:47:54 ]
例外を投げた際、デストラクタが呼ばれるのは例外が捕捉された時。
例外が捕捉されなければ呼ばれないかもしれない(環境依存)。
auto_ptr の問題じゃなくて、C++ の仕様の問題。

767 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 12:48:27 ]
>>765
catchしたか

768 名前:765 mailto:sage [2008/02/16(土) 12:53:01 ]
すみません、catchしたかどうかが重要とは知らず書いてませんでしたが、catchはしています。
ちなみに、std::auto_ptrの部分を自作のsmart_ptr(スマートポインタの解説サイトを参考に作成)
にした場合はきちんとデストラクタが呼ばれました。

コンパイラはBorland C++ Compiler 5.82 なのですが、これのauto_ptrがポンコツなのかも…

769 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 12:58:41 ]
memory ヘッダの中を読んでみたら?

770 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 13:01:09 ]
とりあえず gcc だと呼ばれる。

771 名前:765 mailto:sage [2008/02/16(土) 13:12:49 ]
う〜ん、中身見てみましたがおかしいと思えるところは見つからず…
auto_ptrのソースをちょこっと改造して試したところauto_ptrのデストラクタ自体が呼ばれてないようでした。

ただ、gccだと正常に呼ばれるとのことなのでBCCが悪いということで解決します。
どうも、ありがとうございました。

772 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 13:16:48 ]
BCC の「どこが」悪いかちゃんと調べないと、
他の所でも沢山困る所があるかもしれないぜ。

773 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 13:26:09 ]
>>773
BCCで試したところ、以下のように表示されました。
やはりtest2が削除されないようです。

~Test(1)
catch

>>772
確かに…引き続き調査はしてみます。

775 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 13:27:49 ]
memory をいじってコンストラクタで文字列表示するようにして、
それが表示されるかチェックしてみれ。



776 名前:デフォルトの名無しさん [2008/02/16(土) 13:56:28 ]
HTMLファイルの構文を解析して、UTF8形式をS-JIS形式に変換するソースありますか

777 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 14:00:52 ]
>>776
あるけどおまえにはそれすら無意味

778 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 14:28:58 ]
>>752
staticな変数の生存期間はそのプログラムが起動されてから終了されるまで。
絶対に外部から参照される恐れが無い場合でもなければ、使い回しはできない。
例えば、strtok()やlocaltime()は内部のstaticな領域を返すように実装されていることが多い。
従って、その関数を呼び出した先で参照する可能性があるからコンパイラはこれを取り除くことができない。

779 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 15:07:48 ]
> 絶対に外部から参照される恐れが無い場合でもなければ

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

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

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

問題にしているのは、規格としてそう言うことをしていいかどうか
だよ。

780 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 15:23:33 ]
>>779
規格を云々したいのなら折角そういうスレがあるんだからそちらへどうぞ。

781 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 15:25:24 ]
異なるオブジェクトは異なるアドレスを持たないという規定がなかったかな?
仮にあったとしても、779の状況では、
プログラム上から異なるアドレスであることを確かめるすべはないと思うけど。

782 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 18:08:56 ]
そういう扱い方するんだったら、
正方形を中心と、どれか1つの頂点の角度とで扱えばいいんじゃね?

785 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 18:17:45 ]
ループ変数に float 使うなよ・・・。
誤差で境界条件が重い通りにならないかもしれないんだから。

788 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 18:19:30 ]
×構造体square
○構造体f_pointの配列square

つ[アフィン変換]

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

をかければいいんだろ

790 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 18:27:16 ]
境界条件っつーと、微分方程式の特種解を決定する物を思い浮かべてしまう
なんかビミョーな違和感

791 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 18:43:04 ]
>>785
ほんとごめんなさい、よく読んでませんでした
原点中心回転してました

793 名前:デフォルトの名無しさん [2008/02/16(土) 19:51:23 ]
文字列で入力された
char a ;
を、関数の中で数値に変換して
int a ;
にしたいんだ

同じ変数名aなんだけど
char → int
ってできますか?(´`)

794 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 19:55:18 ]
スクリプト言語を使った方が幸せになれそうな予感

795 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 20:00:53 ]
>>793
それだと1文字だろうし最初からintで受け取ればいい



796 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 20:01:01 ]
>>793
文字とか文字列を数値にしたいとかじゃなくて

char型変数を名前そのままにint型変数に変えたいんだな?無理です

797 名前:783 mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 20:18:21 ]
VisualStudio2008買いました。

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

感激です。

799 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 20:22:36 ]
はぁ?相性だぁ?

800 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 21:01:00 ]
>>798
単純に2005より最適化されて軽くなっただけ

801 名前:デフォルトの名無しさん [2008/02/16(土) 22:39:14 ]
C++クラスのstaticについて質問です。

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

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

それとも、static変数は継承できず、
各子クラスで同名のstatic変数を宣言しなければいけないのでしょうか?

802 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 22:51:28 ]
実験すればいい。
その結果の通りだ。

803 名前:801 mailto:sage [2008/02/16(土) 22:53:37 ]
確かに。。。
めんどくさくて質問してしまいました。すいません。
試してみます。

804 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 22:54:13 ]
>>801
その中では全子クラスに共有というのが一番近いが、
正確には親クラスにしか存在しない。
ただし、protectedやpublicなら子クラスからでもアクセスできる。

805 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 22:56:06 ]
実験してこうなったけど、これって規格通りなのですか?
という質問なら良し。



806 名前:デフォルトの名無しさん [2008/02/16(土) 22:58:58 ]
>>795
>>796

ありがとうございました!!


807 名前:801 mailto:sage [2008/02/16(土) 23:02:26 ]
>>803
ありがとうございます。

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

static変数は各子クラス別々のものを使うけど、
それに対して行う処理は全子クラスで共通だったので。

808 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 23:05:56 ]
何か想像付かない処理だ。
本当にその実装方法しか無いんけ?
static 変数は基本的には再利用性を阻害する癌のような物だから、
ないならないで済むのが一番いいのだが。
まあ、使い勝手と天秤にかけたら static 変数に軍配が上がることもあるけど。

809 名前:デフォルトの名無しさん mailto:sage [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;
};

810 名前:801 mailto:sage [2008/02/16(土) 23:22:31 ]
>>808
説明しづらいのですが、
シューティングゲームで、敵ユニットを表すクラスを作っています。

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

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

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

C++も、ゲーム作るのも初めてなので、
もっといい実装方法案があったら、教えてもらえると嬉しいです。

811 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 23:25:32 ]
>>810
とりあえず一旦動くところまで組み上げてしまうんだ
どんなにソースコードが汚くなろうとも

その後で、こうしているんですが
もっと良い方法はありませんか?
と質問するヨロシ

812 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 23:31:23 ]
それなら static 変数でもいいかもしんないけど、
画像が要らなくなった時に破棄したくなったとき少し面倒かもね。

俺なら敵ユニット作成クラスと画像管理クラスを作るかな。
でも、とりあえずそれで組んでみてもいいんじゃね。

813 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 23:33:59 ]
*(p+3) と *(3+p) で結果が違うわけなかろう

815 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 になる。
だから、一概にそう言える。

817 名前:801 mailto:sage [2008/02/16(土) 23:41:36 ]
>>809
ありがとうございます。
テンプレートというのは知りませんでしたが、使えそうな気がします。

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

>>812
画像破棄用の全画像リストは、ユニットとは別に作ってます。
ユニットは敵の種類ごとに画像をロードすると同時に、
画像マスターリストにロードした画像を登録して、一括で破棄してます。

818 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 23:45:31 ]
>>817
なるほど。
あと、ある敵ユニットから派生して新しい敵を作りたい時に困るかもね。
そういうことがあるかどうか、だが。

画像オブジェクトへの参照のようなもの、
あるいは画像リストのインデックスのようなものを保持させるなら、
ユニットごとにそういう情報を持っていたのでも
大した容量圧迫にはならないと思う。

819 名前:813 mailto:sage [2008/02/16(土) 23:49:56 ]
そーか、ポインタ=アドレス みたいに考えてしまっていました。
腑に落ちました。ありがとうございましたm(_ _)m

820 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 00:00:03 ]
>>812
static変数の初期化は各子Unitじゃなくて、別の何か(親Unit?)がしてるの?もしそうなら
設計ミスだと思うよ。
それじゃstatic変数をグローバル変数として使ってるのとかわりがない。
static変数の初期化は子Unitが行うべき。

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

parentStaticFunction( childStaticImage );

みたいな感じで子Unitが呼び出しちゃダメなの?

821 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 00:03:45 ]
画像管理クラスに対する処理にはできないものなのかな。
あるいは仮想関数にするか。

822 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 00:13:42 ]
WIN32 APIのSetROP2と同じ様な機能を持つ、CarbonAPIをご存じの方いませんか?
開発環境:Winは.net2002 + SDK, MacはCordWarrier pro 5 + Carbonです。

823 名前:822 mailto:sage [2008/02/17(日) 00:15:40 ]
使用言語はCです。

824 名前:801 mailto:sage [2008/02/17(日) 00:18:43 ]
>>818
ユニットクラスが持ってるのは画像のポインタなので、容量はたいしたことないと思いますが、
大量に敵が出るので、オブジェクトごとにそれを作る負荷がどんなもんか想像つかなくて、
なるべく共有できるものは共有しようと思いました。

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

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

>>821
>画像管理クラスに対する処理
ありがとうございます。
難しそうですが、それは一考の価値があるかも。

825 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 00:23:25 ]
敵の大量具合によるんじゃないか?
1億体出るなら馬鹿にできないし



826 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 00:24:10 ]
ごめん、JavaこそparentStaticFunction(childStaticImage);
のようなことをするしかない気がするんだけど。

827 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 00:26:03 ]
ポインタなんて大抵4バイトだし、
敵5000体出した所でたった20キロバイト。
これ以上敵を出そうとしても処理落ちひどくて無理だでよ(5000体でもキツいだろう)。
誤差の範囲だ。

828 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 00:26:55 ]
>>822
QiuckDrawのPenModeかなぁ。
ttp://developer.apple.com/DOCUMENTATION/mac/QuickDraw/QuickDraw-59.html
ttp://developer.apple.com/DOCUMENTATION/mac/QuickDraw/QuickDraw-75.html

829 名前:801 mailto:sage [2008/02/17(日) 00:29:38 ]
>>825
>1億体
出ませんw 最大でも1500くらい。

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

すげー悩んで試行錯誤しながら、今の形になってきたんですが、
要件を聞いただけで、ぱっと思いつくなってみんな凄いですね。
破棄のための画像管理クラスなんて最初全然考えてなくて、後から作りました。

830 名前:822 mailto:sage [2008/02/17(日) 00:58:39 ]
>>828
PenModeの8つのモードすべてで試したのですが駄目でした。私もPenModeだと思ったんですが。。。
SetROP2のように前景モードで動作するのではなく、GrafPort自体に描画しているようです。
Carbonを使い始めて2ヶ月程度なので、間違いがあったらごめんなさい。

831 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 01:47:40 ]
>>830
んー。前景と背景の合成方法を設定するAPIだから、やってることは同じだと思うけどね。
PenModeは現在のGrafPortに対して作用するんで、SetPortPenModeでポートを指定したらどうかな。
もうやってるかもしれないけど。

俺はCocoaな人なので、あんまり力になれなくてすまん。新・mac板の方が詳しい人いるかもね。

832 名前:822 mailto:sage [2008/02/17(日) 12:07:03 ]
>>831
書いてなかったけど、ラバー バンディングを実行したくて行き詰まってしまいました。
マウスをドラッグしている間、直前に描かれた線を上書きで消して新しいPointに対する
線を描くという動作なんですが、最後にInvalWindowRectするとエンティティ自体は
正常に描かれます。エンティティ自体を移動させても余計に描画された線は消えます。

長くなって済みません。Macの開発環境がまだ自宅にないので明日会社でSetPortPenMode
を適用してみます。ありがとうございました。

833 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 12:27:22 ]
もろ環境依存だけど、__int64とか使えればそのまま入れられるんじゃないかな

835 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 12:34:17 ]
区切り文字をあり得ない数字の連続に置き換えるとか



836 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 12:34:32 ]
>>833
年だけ別にしたら?

struct Date

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

みたいに。


838 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 12:39:52 ]
>>837
それをそのまま使おうとしてmapで使えないと質問しにくるとみた

839 名前:833 mailto:sage [2008/02/17(日) 12:53:46 ]
みなさんレスありがとうございます。

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

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

>>836-838
なるほど。そういう手もありましたね。
つまり、比較演算のオペレーターを自作するって事ですよね?
ちょっと、その方法でやってみます。


840 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 12:56:41 ]
今64ビット化が進んでいるtime_tはどう?

841 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 13:05:02 ]
閏秒とか考慮しなくていいならそれでいいか
暦法の微妙な問題に足突っ込みたくなければ全部秒で表した方が無難
しかし使えるならboost::gregorian使っとくのが楽ではある

842 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 13:06:27 ]
>>833
年が1999年以降しかなくて、2099年までしか使わないのであれば
unsigned intでも収まりそうな気がする

843 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 13:10:27 ]
キーワード:
通算秒
time_t

844 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 13:21:04 ]
て言うか、「文字列だと遅そう」って思ってるだけじゃないのか?

まずはこれで実装してみて、ほんとにそこがネックになってるなら
いろいろ工夫すればいいと思う。

845 名前:833 mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 14:05:06 ]
time_tは型だ

847 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 14:08:39 ]
time_tは__int64をtypedefしただけだったりな 環境にもよるが

848 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 14:13:50 ]
標準かどうかが大きな違い。

849 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 14:20:16 ]
longだったりする可能性があることを考えたら、
素直に__int64使ったほうがマシだと思うけど

850 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 14:21:27 ]
せめてlong longがいいな。

851 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 14:26:08 ]
案外void*だよ

852 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 14:43:57 ]
どうやってコンパイルしたの?

855 名前:デフォルトの名無しさん [2008/02/17(日) 14:48:34 ]
>>854
コマンドラインから
%c++ main.cpp
としました。
すると、上記のエラーが表示されます。




856 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 14:51:51 ]
ライブラリリンクしようよ(´・ω・`)

857 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 14:52:16 ]
WindowsのVARIANT型だとdoubleじゃなかったかな

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

精度(有効範囲)は流石に2038年でオーバーフローする32bitのtime_tよりは
ずっとマシ


858 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 14:52:30 ]
>>845
time_tなら標準関数の支援を受けられるし、説明も楽だな。

859 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 14:53:35 ]
>>857
今時、time_tは64ビットですが。

860 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 14:55:30 ]
>>859
そりゃ環境による、でしょ
ま、言い方が悪かったか。「time_tが32bitだ」と言ってるんじゃなくて、
「time_tが32bitであるような環境では〜」と読んで欲しい。

861 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 14:57:43 ]
たとえばMSVCでは、6までは32bit
未だに現役で使われてもいるコンパイラなので、注意な

862 名前:デフォルトの名無しさん [2008/02/17(日) 14:59:15 ]
>>856
すみません、そのライブラリリンクとは
どのようにやるのか教えていただきたく。。。


863 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 15:04:51 ]
いただきたく。。。なんなんだ?
。。。とかね、もう質問の仕方なんて義務教育中に学べと

864 名前:デフォルトの名無しさん [2008/02/17(日) 15:05:16 ]
VCで
プログラムからキーを押すプログラム作りたいのですが
mouse_event
みたいな関数教えていただけないでしょうか?

865 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 15:07:03 ]
それだけじゃいまいちはっきりしないがgetch()とか



866 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 15:09:08 ]
すみません、質問の仕方がわるかったです。
プログラムからキーボードの'A'ボタンを押したいのです。
どうすればよろしいでしょうか。

867 名前:デフォルトの名無しさん [2008/02/17(日) 15:15:23 ]
>>863
義務教育での勉強不足で失礼いたしました。
今後は、質問の仕方を改めますので、
ご教示のほどよろしくお願いいたします。


868 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 15:18:05 ]
>862
RC4を使ったことがないのでどのファイルをリンクすべきなのか俺にはわからない。
一般に、よほどのことが無い限り、コンパイルするときは関数の実体が入ってるファイルをコンパイラに教えてあげないと
コンパイラが迷子になってしまう。
/usr/lib/libRSAglue.a
/usr/lib/libcrypto.a
/usr/lib/libssl.a
さらっとぐぐったかんじだとこのへんのどれかじゃないかとは思うけど。

>866
やっぱりわかんない。
関数に引数として'A'をあげてやればいいだけなのでわ?と思ってしまう。

869 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 15:19:40 ]
>>864
mouse_eventときたらkeybd_eventだろ

870 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 15:20:28 ]
>>865
getch('A')だと、Aボタンが押されたことを感知する命令ですよね。
putch('A')みたいな命令があればと思ってお聞きしたのですがm(_ _)m


871 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 15:21:17 ]
>>869
keybd_eventですか、
使い方をググってみますね

872 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 15:28:41 ]
>>859
Windows の VARIANT 型とか言ってる奴は、どうせ Excel ぐらいしか
触れないんだから、スルー推奨。

>>862
目立関係者か?

「いただきたく」なんてローカル用語使うなよ。

873 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 15:31:58 ]
>>869
ご教授感謝です、その方法でドンピシャであります!

874 名前:デフォルトの名無しさん [2008/02/17(日) 15:51:29 ]
>>868
/usr/lib/libssl.a
で無事動きました。
ありがとうございました。


875 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 17:44:00 ]
>866
keybd_event



876 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 17:46:00 ]
更新し忘れ。

>872
どうでもいいが、目立関係ないうちの会社でもこの用法の「いただきたく」はたまに使われてる。

877 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 18:26:26 ]
教えて頂きたく存じます だろ。

878 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 22:30:05 ]
標準ライブラリが見つからないというエラーに見えるが

881 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 22:33:52 ]
>>879
iccのインストール先のbinディレクトリ内にある、環境設定用のスクリプトを動かしてみたら?

882 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 23:33:06 ]
参照を戻り値にする関数 (例えば int &sample(); )
って、呼び出す時 int hoge = sample(); って呼び出しますよね。
(ポインタを返す関数は呼び出すときに * を使うけど参照を返す関数は & を使わない。)

ってことは int &sample(); が定義されてる時は int sample(); は同一モジュール内で定義できないってことなんでしょうか。
呼び出すときの名前が同じですよね。
一応自分で試したらエラーが出たのでやはり不可ってことなのだと思うのですが合ってるでしょうか?

883 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 23:36:09 ]
戻り値の型のみが異なる関数は2つ以上同一スコープ内に作る事が出来ない。
引数に違いが無いとオーバーロードはできない。

884 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 23:46:15 ]
たとえばC言語で昔よく使ったprintfやscanfは戻り値はint型だ。void型ではない。
けど、戻り値を使っていないプログラムを見たことあるよな?
関数の戻り値を必ず使う必要はないわけだ。

sample();

こういう呼び出しがあった場合、どちらを使えばいい?
コンパイラには判断しようがないため規格上できないようになっている。

885 名前:884 mailto:sage [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 mailto:sage [2008/02/17(日) 23:54:30 ]
884じゃなくて882でした。

887 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 23:55:40 ]
>>885
違う。
int & sample()は、「intの参照型」を返す関数だ。

888 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 23:57:32 ]
どこかに C++ 標準ライブラリの
完全なリファレンスマニュアルってないですか?
検索してみたのですか、ほとんどが一部しか載ってなくて…
ソースか書籍しか無いのでしょうか…?

889 名前:882 mailto:sage [2008/02/18(月) 00:02:07 ]
>>887 さん
レスありがとうございます


それなら
int &hoge = sample();
みたいにhogeの前に & が必要な気がするのですが
int hoge = sample();
でもエラーにならないのはなんでなんでしょう?(sample(); は参照を返す関数だとして)
int hoge = sample();
だとhogeはint型の参照じゃなくて普通のint型として定義されてますよね。


890 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 00:09:12 ]
int &x;
があったときに
int y = x;
ってできるのと一緒

891 名前:882 mailto:sage [2008/02/18(月) 00:19:53 ]
>>890さん
レスありがとうございます。

なるほど、てことは
&sample()
{
...
}
int hoge = sample();
とあったとき、hogeもsample()そのものも、どっちとも参照型ってことでいいんでしょうか?


892 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 00:22:02 ]
int hoge = だったら、hogeは参照じゃないだろう
sample() の戻り値が参照してる先の値をコピーしてるんだよ

893 名前:882 mailto:sage [2008/02/18(月) 00:22:24 ]
&sample() → int &sample()
ですね...

894 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 00:24:04 ]
横から質問させてください。
>>890は(暗黙の)型変換の一つであり、
T&からTへの型変換はdereferenceである
と考えて正しいですか?

895 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 00:29:37 ]
>>894
型変換じゃないと思うよ。ただの dereference というか。



896 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 00:30:20 ]
>>888
C++ referenceでググっても軽くこんなに見付かる。
www.cppreference.com/
www.cplusplus.com/reference/
msdn2.microsoft.com/en-us/library/cscc687y.aspx

897 名前:879 [2008/02/18(月) 00:31:47 ]
>>880-881
ありがとうございます。環境設定用のスクリプトは呼び出してるんですが、、、
どうも変なところにstdc++を探しにいっているような、、
どこに探しに行っているかをしらべるコマンドってなかったでしたっけ?

898 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 00:33:28 ]
>>888
完全なっていうなら JIS の閲覧用クソ重いやつか、 ISO のドラフトがいいかもね。

899 名前:882 mailto:sage [2008/02/18(月) 00:38:22 ]
>>892 さん
レスありがとうございます。

うーむ

int &sample()
{
...
}

int hoge = sample();
hoge = 10;

とやるとエラーが出ずに普通にコンパイル出来ました。
hogeが参照だったら hoge = 10 みたいに再定義できないと思うので、
やっぱりこの場合hogeは参照じゃない・・?

900 名前:デフォルトの名無しさん mailto:sage [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が代入される

901 名前:882 mailto:sage [2008/02/18(月) 01:01:31 ]
>>900 さん
ですよね。
ありがとうございましたm(_ _)m

902 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 01:16:17 ]
visual studio 2008 express版を使っていたんだが

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

というエラーが出たのですがこれはどういったエラーなの?

903 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 01:20:58 ]
エラーでた個所のソースを張り付けては?
後ろの方はint i[];とかしたときにでるかな?前はよく見るけど忘れた。

904 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 01:26:08 ]
>>902
メタプログラミングでもやってんのか?

905 名前:902 mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 01:57:25 ]
>>905
static const int MOTION_NUM = 60;

907 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 01:58:34 ]
>896
上2つでは<utility>や<locale><stdexcepts>等の情報が見あたらなかったのですが
MSDNのはかなり情報量多そうですね。しばらくMSDNを頼りにしてみます。

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

C++ ISO Draft で調べたら幾つか見つかりました。
英語なのでちょっと大変そうですが、頑張ってみます。

908 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 01:59:00 ]
MQO_OBJECTが正しく宣言されていないからだと思うが?
その環境がわからんから俺にはこれ以上は答えられん・・・ってこれくらいのこと試してそうだけど・・・

909 名前:908 mailto:sage [2008/02/18(月) 01:59:38 ]
はぅ、そっか・・・おれはずかしす・・・

910 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 08:36:27 ]
超初心者です

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


こんな時、なぜ*が必要なのかいまいちピンときません。
どなたか教えてください…

911 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 08:43:14 ]
>>910
aはポインタ配列だからです。

912 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 08:52:47 ]
int a = 5;
int a[] = {1, 2, 3, 4, 5};

char* a = "あ";
char* a[] = {"あ", "い", "う", "え", "お"};


913 名前:910 mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 10:14:24 ]
>>913
ああ、だいたいそれでいい。あとは char* じゃなくて char const* にしとけば完璧だ。

915 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 10:21:50 ]
>>913
次は配列とリテラルの違いに苦しむが良い



916 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 10:43:58 ]
const char*

917 名前:910 mailto:sage [2008/02/18(月) 10:44:53 ]
みなさんありがとうございます。なんとなくわかった気がします

次はどうしてこうなるのか簡潔に説明できるように頑張ります…

918 名前:879 [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
ちゃんと存在してます。


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

923 名前:879 [2008/02/18(月) 11:40:20 ]
>>920

レスありがとうございます。
>???何故、一つ上のdirectoryに上がるのです???
というのは、libstdc++の場所のことですよね?自分も調べてみたのですが、結局その位置は、
/usr/lib64/libstdc++.so.6.0.8 になってて、これがlibstdc++のようです。
cceのディレクトリ以下のコンパイラだとリンクできて、cc以下のコンパイラだとリンクできない
理由は分かってないですが、。。


924 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 11:42:37 ]
そりゃぁ、ccはx86-32でcceがx86-em64tだからだ。

925 名前:879 [2008/02/18(月) 12:01:30 ]
>>924
ありがとうございます。
なるほど、そういうことですか。
でも、なんでx86-64環境にインストールしたのに、iccとやると、デフォルトで32ビットの
バイナリを作ろうとするんですかね。自分は、
alias icc64="/opt/intel/cce/10.1.008/bin/icc"
しときました。



926 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 12:05:45 ]
>>925
cce配下のbinにあるスクリプトを使えばcceにPATHが通る。

927 名前:879 [2008/02/18(月) 12:22:03 ]
>>926
以下のようにやると通りました。
source /opt/intel/cce/10.1.008/bin/iccvars.sh
ありがとうです。


928 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 13:22:58 ]
文字列を初期化するにはどっちがいいのでしょうか?

1, ZeroMemory( str, sizeof(str) )

2, memset( str, '\0', sizeof(str) )


929 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 13:24:25 ]
両方同じ

930 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 13:31:27 ]
'\0'=0ってことなんですか?

931 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 13:32:53 ]
>>928
>1, ZeroMemory( str, sizeof(str) )
一部の環境にしか存在しないことを承知で使うのならこっちでもいいが、
そもそも文字列を初期化するのに0クリアはナンセンス。

932 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 13:33:01 ]
2なら環境をWindows以外に変えても修正しないで済む。

933 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 13:52:19 ]
ZeroMemoryもマクロで結局memsetになる。

934 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 14:06:59 ]
文字列の初期化だったら、「*str = '\0';」でいいじゃない。



935 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 00:01:14 ]
GetCurrentDirectoryWでも260文字越えはだめ?

940 名前:デフォルトの名無しさん [2008/02/19(火) 00:11:17 ]
GetCurrentDirectoryWでも250程度しか行きませんでした

941 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 01:13:09 ]
時々ファイル名が長すぎてリネームできないファイルがありますが
私はいつもネットワーク共有状態にしてUNC名でリネームしてます

945 名前:デフォルトの名無しさん [2008/02/19(火) 01:28:08 ]
階層の深いフォルダをドライブに見せかける命令ってどうやるんでしょうか
これが出来れば読めるところまで進めてくりかえせばいいのですが



946 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 03:15:24 ]
どこかにパディング入ってんじゃね

948 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 03:21:17 ]
>947
なるほど。wtmpはバイナリーデータなんですけどutmp.hの構造体のサイズ信じて
バイト単位でデータにアクセスした場合ほしい値がもらえない場合があるわけですね。

949 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 03:32:44 ]
offsetofでも使えばいいんじゃね

950 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 04:11:21 ]
>949
なるほど、パディング入った位置はわかった。

951 名前:デフォルトの名無しさん [2008/02/19(火) 05:01:29 ]
質問です。
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 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 05:26:49 ]
>953
申し訳ないけど笑ってしまった。



956 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 06:09:39 ]
>>954
#include <string.h>

とかか?

957 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 07:09:34 ]
コロンなのがあかんのんやろ

958 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 07:15:33 ]
>>951
(msg[i] -= 'A' - 'a') と括弧で括ればいい。
あるいは、C++処理系でコンパイルすればいい。

959 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 12:30:34 ]
ソースファイル毎に名前空間分けてるWindows用某フレームワークは名前空間一つにまとめてくれといいたくなる。

963 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 14:08:56 ]
特定のクラスだけパディングして欲しくない
事があるんですが、何か手はあるでしょうか?


964 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 14:16:05 ]
#pragma pack

965 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 14:40:34 ]
>>964
おーあるのね。感謝!



966 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 16:35:49 ]
ofstreamのmemcpyで落ちる場合があるんですが何が原因でしょうか?

967 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 17:03:21 ]
ofstreamでmemcpy使うことなんてあったっけ?
ここにソース書いてくれ。

968 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 17:09:37 ]
じゃあofstreamじゃないのかもしれません。

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

この様なことをやっていて
何回も動かしていると落ちてしまうんですが
マルチバイトとワイド文字の変換にCStringAを使ってるのでここかもしれません

969 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 17:17:52 ]
原因を予想してもらうより、まずどこで落ちるのか確定するにはどうすればいいかを聞いたほうがいい気が・・・
スタックのトレースも無さそうだな

970 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 17:33:57 ]
>>968
DATA_SIZE

971 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 20:44:05 ]
fout.write(str, str.GetLength());

じゃないの?
あるいは

fout << str;

972 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 23:53:25 ]
プログラムの勉強に飽きたとき息抜きで何やる?

973 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 23:54:55 ]
一人で電機屋で1980円で買った麻雀ゲーやってる
あと最近興味ないクラシックを聴いて10分で眠くなる特技が出来た

974 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 00:10:05 ]
えーとごめんなさい。VC使って5年ぐらい経つんですが
未だに普通のウィンドウにコントロールを貼り付けるような
リソースエディタ的なソレを知りません。

ダイアログなら直球なんですがウィンドウでそういうの出来ますか?

975 名前:974 mailto:sage [2008/02/20(水) 00:11:14 ]
使ってるのはVC6です。



976 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 00:11:23 ]
日本語が使えないんじゃ何年VC使っててもだめだろうね

977 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 00:13:42 ]
こんくらいは分かるだろ。
とりあえず VC ではそういうのは知らない。

978 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 00:14:29 ]
普通のウィンドウにあんまりコントロールをはっつけるなってことじゃないのかな。
Windows 的には。

979 名前:デフォルトの名無しさん [2008/02/20(水) 00:15:28 ]
>>974
初心者は、C#かBCBつかえよ 無理

980 名前:974 mailto:sage [2008/02/20(水) 00:21:42 ]
>>976
んじゃ0年でもOK

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

>>977-978
あれ?やっぱこれでOKなのか。
要するに「VC6に"ウィンドウ"エディタは無い」でOK?

981 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 00:22:26 ]
てゆか

982 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 00:26:09 ]
BCB にはありそうな気がする。

983 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 00:34:32 ]
>>980
ダイアログをウィンドウに張ることはできますが。

984 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 00:51:48 ]
ダイアログにウィンドウクラスを割り当ててしまえば、
もはやダイアログではないウィンドウができる。

でも俺は983のようにすることが多いけど。

985 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 00:54:52 ]
アンマネージドでも.NETくらい楽にUI作れるようにならんかなー



986 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 01:38:22 ]
ちなみにBCBでダイアログ作るとダイアログもどきな普通のウィンドウになる

987 名前:デフォルトの名無しさん [2008/02/20(水) 05:25:33 ]
virtualデストラクタを持つ親クラスを継承して、子供クラスを作りました。
その子供クラスを、親クラスのポインタをつかって扱ってます。そのとき、
親クラスのポインタに対して、delete ptr;とやると、まず子供クラスの
デストラクタが呼ばれた後で、親クラスのデストラクタが呼ばれるのですが、
これって正しい動きですか?
親クラスのデストラクタは呼ばれないと思ってた。


988 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 11:31:28 ]
>>990
#include <vector>
int main() {
std::vector<int> *p = new std::vector<int>;
delete p;
}

992 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 11:46:47 ]
>>990
なんでまたそんな希代なことしようと思ったのかが気になる。

993 名前:デフォルトの名無しさん [2008/02/20(水) 12:25:18 ]
>>991-992
ありがとうございます。なぜそんなことをしようと思ったかというと、vectorを関数間でやりとり
したかったからです。適当にクラスを準備して、その中にvectorを保持してましたが、単体でも
newで出来るかなと思いました。


994 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 12:28:17 ]
次立てて埋めようとしたらたてらんねえ

995 名前:デフォルトの名無しさん [2008/02/20(水) 12:34:23 ]
立てたよ。



996 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 12:36:34 ]
【初心者歓迎】C/C++室 Ver.49【環境依存OK】
pc11.2ch.net/test/read.cgi/tech/1203478421/

>>995

997 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 12:47:08 ]
>>993
別にわざわざnewする必要なんか無いだろ。そのための参照渡しがあるんだから。

998 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 12:54:35 ]
でも複数の場所にたらい回しにするときは、
boost::shared_ptr<std::vector<int> >(new std::vector<int>());
とかやる?

999 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 12:56:51 ]
梅て次いこう

1000 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 12:57:38 ]
ほいほいほい

1001 名前:1001 [Over 1000 Thread]
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

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

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