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

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.44【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1194016813/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
2デフォルトの名無しさん:2007/12/08(土) 15:30:01
スレ建て乙
3デフォルトの名無しさん:2007/12/08(土) 16:20:05
早速質問です。
引数に小数をとるにほどうすれば良いでしょうか?
int main (int argc, char *argv[]){

float x ;
x = *argv[1];
fprintf(stdout, "%f¥n", x);
return;
}
↑無理
int main (int argc, float *argv[]){

float x ;
x = *argv[1];
fprintf(stdout, "%f¥n", x);
return;
}
↑無理
でした。
4デフォルトの名無しさん:2007/12/08(土) 16:26:55
>>3
int main (int argc, char *argv[]){
float x ;
sscanf(argv[1],"%f",&x);
fprintf(stdout, "%f\n", x);
return 0;
}
5デフォルトの名無しさん:2007/12/08(土) 16:28:03
>>3
引数に小数をとるには〜って変な質問だな。
それぞれの引数(argv)は文字列なのだから、文字列を整数や少数に変換するには?と質問するところだ。

atof
6デフォルトの名無しさん:2007/12/08(土) 16:31:58
>>5
引数が文字列ってのをわかってないんだろ
7デフォルトの名無しさん:2007/12/08(土) 17:01:51
>>6
いや、もちろんわかってますよ。
charへのポインタの配列ぐらい。
で、こんなことしたことないから、どうしようかなと。
>>5
なるほど。そうやればよいですね。
試してみよう。
8デフォルトの名無しさん:2007/12/08(土) 17:07:51
Hoge()というアンマネージドクラスが既にあり、これをマネージ環境で使うことを考えています。
このとき、

Hoge *hoge0 = new Hoge();
Hoge *hoge1 = new Hoge();
Hoge *hoge2 = new Hoge();
 ・・・

というのを

Hoge *hoge[10];
hoge[0] = new Hoge();
hoge[1] = new Hoge();
hoge[2] = new Hoge();
 ・・・

のよう配列にするにはどうしたらよいでしょう?
(マネージ環境だと Hoge *hoge[10]; の時点でCLI配列使え!って怒られてしまうんですよね・・・)
98:2007/12/08(土) 17:09:13
>>8
環境書き忘れました・・・おわっとる・・・

Visual Studio 2005でC++/CLIです。
よろしくお願いいたします。
10デフォルトの名無しさん:2007/12/08(土) 17:11:21
VC++2005でのクラスの宣言で質問です。

まず初めにメンバ変数を宣言しました。
class hoge{
int m_n;
};

次にコンストラクタを書いて初期化してみました。
class hoge{
int m_n;
public:
hoge(int n):m_n(n){};
};

そしてメンバ変数を const にした段階でエラーが出ました。
class hoge{
const int m_n;
public:
hoge(int n):m_n(n){};
};

エラーメッセージは
warning C4512: 'hoge' : 代入演算子を生成できません。
です。

今はまだ型宣言だけなので代入どころかインスタンスすらありません。
これはどういう意味なのでしょうか?
11デフォルトの名無しさん:2007/12/08(土) 17:27:40
>>10
エラーじゃなくて警告(warning)ね

それはそうとVC++2005EEで試したけど、警告でないけどなあ
12デフォルトの名無しさん:2007/12/08(土) 17:31:56
うちのVC2005だとwarningは出ないよ。
上のコードをコピーして、int main(){ return 0;}を下に付けただけ。
13デフォルトの名無しさん:2007/12/08(土) 17:37:26
>>8
C++/CLIは専用スレの方がいいんじゃない?
発展系とはいえ別言語なんだし。
14デフォルトの名無しさん:2007/12/08(土) 17:39:30
C4512は警告レベル4なので、/W4つけてコンパイルすると出るね
代入演算子を定義すれば出なくなる
生成できませんって表現が良くわからないが、暗黙の代入演算子を生成できないってことなのかな
15デフォルトの名無しさん:2007/12/08(土) 17:44:57
class hoge{
const int m_n;
public:
hoge(int n):m_n(n){};
private:
void operator=(const hoge &);
};

定義どころか宣言だけで出なくなるね。
これでインスタンスも生成できたしリンクエラーも出ない。
ってことは何処からも参照されていないってことで...
ん〜、なんで警告が出るんだろ?
16デフォルトの名無しさん:2007/12/08(土) 17:49:51
デフォルトの代入演算子は各メンバのoperator=を呼ぶが、メンバがconstなので代入できない。
17デフォルトの名無しさん:2007/12/08(土) 17:55:42
文字通りデフォルトの代入を定義できないという警告だろ。
当然実体化したインスタンスを代入しようとすればコンパイルエラーにはなるが、
代入演算子もインタフェースの一部だから後で宣言したヘッダに
簡単には手を入れられないということも有り得る。
必ずしも代入不可能というのがクラス設計者の意図ではないかもしれないし、
そういう時のうっかり忘れ防止としては宣言の時点で警告が出たほうが良いだろう。
18デフォルトの名無しさん:2007/12/08(土) 17:56:44
>>13
確かにその通りですね。
C++/CLIスレの方に移動します。
ありがとうございました。
19デフォルトの名無しさん:2007/12/08(土) 22:29:22
ここで聞いていいのかわからないんですけど、
C とPerl の対照表みたいなページってありませんか?
20デフォルトの名無しさん:2007/12/08(土) 22:37:39
ローカル関数内で使う、ローカル変数の初期化を、プロトタイプで宣言しなかった場合(ヘッダーファイル内で宣言しないってこと)
即ちコンストラクタの初期化子やデフォルトコンストラクタの関数内で初期化せずに
ローカル関数内でコンストラクタの初期化子で初期化したように、初期化する方法はありませんか?
多分日本語でOKといわれそうですがww理解できる方お願いします。

21デフォルトの名無しさん:2007/12/08(土) 22:48:13
>>20 日本語でおk
22デフォルトの名無しさん:2007/12/08(土) 23:07:46
>>20
日本語でおk
コンストラクタ、と言っているんだからC++だと思うけど
まず根本的にローカル関数が定義出来ない。gccとかは出来た気もする。
ローカル関数って関数内で定義する関数よ?

次に、ローカル変数はプロトタイプ宣言に出てこない。
仮引数のことか?

>即ちコンストラクタの初期化子や・・・
全然「即ち」になってない
23デフォルトの名無しさん:2007/12/08(土) 23:09:11
ローカルをメンバに置き換えるんだ!
24デフォルトの名無しさん:2007/12/08(土) 23:22:30
定義と宣言の違いがよくわからないのですが、どう違うのですか?
25デフォルトの名無しさん:2007/12/08(土) 23:37:06
>>24
定義は宣言の一種だから、「違い」って言う時点でおかしな話。
2624:2007/12/08(土) 23:42:09
int a; <= これはどっち?
int main(){
int b; <= これはどっち?
}
27デフォルトの名無しさん:2007/12/08(土) 23:44:07
>>26
どっちも定義、且つ宣言。
28デフォルトの名無しさん:2007/12/08(土) 23:45:41
>>26
宣言と実体化の問題を言いたいの? int ならそこで実体化してるから
わかりにくい。例えば配列とかなら

int a[]; とか int *a;

とかしたら、実体化はさらにしなきゃいかん。
2924:2007/12/08(土) 23:47:01
http://www.geocities.jp/ky_webid/c/004.html
を見ると、宣言みたいな感じなんですが
3024:2007/12/08(土) 23:52:07
知りたいのは、本を読んで、定義と宣言という言葉がが出てくるのですが、
イマイチ、両者をどのように区別しているのか理解できないからです。
31デフォルトの名無しさん:2007/12/09(日) 00:00:44
宣言は変数で、定義は構造体とかtypedefだろ?
32デフォルトの名無しさん:2007/12/09(日) 00:14:56
C++におけるキャストの概念がいまいち理解できないんですが、
dynamic_cast以外は、
C形式のキャストを用途ごとに分けて機能を分割することで不正と思われるキャストをコンパイル時に弾けるようにしよう、
てことで合ってますか?
33デフォルトの名無しさん:2007/12/09(日) 00:16:05
>>30 >>25,27
>>31 ちがうよ。
34デフォルトの名無しさん:2007/12/09(日) 00:16:37
>>32 合ってるよ。
35デフォルトの名無しさん:2007/12/09(日) 00:17:36
>>31
それは違うような気がする

グローバル変数ではexternつけたのとかは定義でなく宣言

関数で言うところのプロトタイプ宣言と処理内容の定義の違いと考えればいいかもしれない
36デフォルトの名無しさん:2007/12/09(日) 00:19:02
>>34
ありがとうございます
ずっとそれぞれに何か特殊な機能があるんだと思ってました……
37デフォルトの名無しさん:2007/12/09(日) 00:19:24
typedef int INT; // 宣言

extern int i; // 宣言
int i; // 定義

void func(); // 宣言
void func() { /* 〜 */ } // 定義

class A; // 宣言
// クラスAの定義
class A {
 void func(); // メンバ関数の宣言
};
void A::func() { /* 〜 */ } // メンバ関数の定義
38デフォルトの名無しさん:2007/12/09(日) 00:21:24
便乗質問だが、仮引数は定義でなく宣言になるのか?
39デフォルトの名無しさん:2007/12/09(日) 00:23:23
>>38 うん。
40デフォルトの名無しさん:2007/12/09(日) 00:28:44
>>39
ありがとう

要するに実体生成が伴うのが定義って感じか
ということはクラスのメンバ変数は全部定義でなく宣言?
41デフォルトの名無しさん:2007/12/09(日) 00:37:34
>>40
CとC++では、「何が定義になるのか」が違うんだよ。
>要するに実体生成が伴うのが定義って感じか
これはC言語の話。

マ板の某クソスレから引っ張ってきた。
http://pc11.2ch.net/test/read.cgi/prog/1192703383/593

CはC99なんで、普及してるC89では若干違うのかも知れない。

スレ違いなんで、あっちで引っ張らないように。
42デフォルトの名無しさん:2007/12/09(日) 00:45:24
概念的には
宣言というのはコンパイラに名前の存在を知らせること。
定義というのはある名前の実体を作成すること。
43デフォルトの名無しさん:2007/12/09(日) 00:45:41
>>41
ありがとう
何か分かったような分からないようなだが
44デフォルトの名無しさん:2007/12/09(日) 00:50:15
>>43
どの辺が分からん?
45デフォルトの名無しさん:2007/12/09(日) 01:03:10
>>44
いや、かたや定義の例が書いてあってかたや宣言の例が書いてあるから、
俺の貧弱な頭じゃ違いがぱっと理解できんw
とりあえずメンバ変数については分かったが

あと「結合指定」「型定義宣言」て言葉が分からんかった
前者はぐぐっても出てけえひんし、
後者はtypedefのことか?
46デフォルトの名無しさん:2007/12/09(日) 01:18:43
>結合指定
「extern "C"」とかそういうヤツ。

>後者はtypedefのことか?
それであってる。
47デフォルトの名無しさん:2007/12/09(日) 01:20:42
>>46
わざわざサンクス
ぐぐり不足ですた
4824:2007/12/09(日) 01:26:42
まとめて、皆様、有難うございました。
CとC++では、意味が違うなんて。

49デフォルトの名無しさん:2007/12/09(日) 02:45:29
STLの使い方についての質問です。
例えばpair<int, string>の要素を持つvector Vecがあったとき、
iteratorでintがiXYであった時に、pairの片割れのstringを返す場合、
下のコードではコンパイルエラーが出ます。

vector<pair< int, string > >::iterator it;
for ( it = Vec.begin(); it != Vec.end(); ++it )
{
if( *it->first == iXY ) return *it->second;
}
return NULL;

iteratorで間接参照は、*をつけるといろんなところに書いてあったので
上のようにしたのですが、*を取ると、正常に動きました。
でもなんで*を取るのかがわかりません。だれかおしえてください。
50デフォルトの名無しさん:2007/12/09(日) 02:54:00
iteratorは要素を指すポインタのようなモノだと考えれば、
ポインタに*をつけると実体pair<>を指すことになる。
んで、pairに->演算子はオーバーロードされてないからエラーになるわけだ。

大体あってる?
51デフォルトの名無しさん:2007/12/09(日) 02:55:38
(*it).second
it->second

こういうことじゃなくて?
52デフォルトの名無しさん:2007/12/09(日) 02:59:32
この場合*をつけると演算子の優先順位の関係で

if( *(it->first) == iXY ) return *(it->second);
と同じになり、イテレータの参照剥がしではなく、firstおよびsecondメンバつまりint,stringの参照剥がしになる。
int,stringはポインタやイテレータではないのでエラー。

*を使いたければ、こう
if( (*it).first) == iXY ) return (*it).second);
5350:2007/12/09(日) 03:01:00
優先順位間違ってた/(^o^)\
5449:2007/12/09(日) 03:15:00
みなさん、ありがとう!
もっと精進しまっす!
55デフォルトの名無しさん:2007/12/09(日) 04:40:48
vector<string> str; str.resize(10000);
はメモリは少しも食わないんでしょうか?
stringって作った時点ではメモリー確保しないですから、配列でも一緒ですか?
56デフォルトの名無しさん:2007/12/09(日) 04:57:19
>>55
string自身にだってサイズはあるよ。
俺の環境だと、string型は28バイトもある。
57デフォルトの名無しさん:2007/12/09(日) 05:05:11
サンクス
58デフォルトの名無しさん:2007/12/09(日) 09:43:27
スレ違うかもしれないがfloat除算を間違えるって言うのは、間違えていた
アクセスできない配列にアクセスしていただけだった
5958:2007/12/09(日) 10:09:23
floatのエラーではなくてvectorのバク(解放のタイミング)だった
何度も配列を短時間で生成繰り返したとき、前のが解放される前に次の確保がくると駄目らしい
グローバルに一度確保にしたら良くなった
60デフォルトの名無しさん:2007/12/09(日) 10:10:31
>>59
何の話かわからんがkwsk
6158:2007/12/09(日) 10:14:33
こんな感じのやつ 再現するかは不明 確保するサイズを大きくするほどしやすい可能性あり

double fnc(void) {
vector <double> x(100000,1);
return x[0];
}

main(){
double sum=0;
for(i=0;i<10000;i++)sum+=fnc();
cout<<sum;
}
6258:2007/12/09(日) 10:16:05
解放が追いつかず、次から次へと確保が来ると駄目らしい
63デフォルトの名無しさん:2007/12/09(日) 10:18:58
>>58
環境は?普通は seg fault とかエラーで落ちると思うんだけど。
そうじゃなければ vector の bug ということなのかな。
64デフォルトの名無しさん:2007/12/09(日) 10:28:37
>>61
手元のVC2005EE, bcc5.82, gcc3.4.4で問題なかった。
>>58の環境が知りたい。
6558:2007/12/09(日) 10:34:04
bcc5.5.1です

あと確保する数は、実際には違います
#define N 2678400 
として
vector<int> date(N,0);
vector<double> x(N,0);
をサブルーチンで何度か確保して
dateとxの前半(1/3くらい)をアクセスしてリターンすると毎回違う回数で落ちます
6658:2007/12/09(日) 10:35:31
いま計算したところ一回ごとに確保する容量は32M程度です
67デフォルトの名無しさん:2007/12/09(日) 10:38:51
「落ちる」で済ませる奴は信用できない。
68デフォルトの名無しさん:2007/12/09(日) 10:39:22
>>66
> dateとxの前半(1/3くらい)をアクセスして

↑このへんにバグがあるかもしれんので最小限のソースをくれるとありがたい。
あと、落ちるというのは例外を吐くのか、問答無用で落ちるのかも知りたい。
6958:2007/12/09(日) 10:46:17
>>68
グローバルに定義して何度も繰り返して使ったら全く落ちなくなりましたよ
70デフォルトの名無しさん:2007/12/09(日) 10:48:00
>>65
「落ちる」って seg fault とかでプログラムがクラッシュするの?
それだったらメモリが足りないなら正常な動きだと思う。

もしも、出力して正常に終わったように見えて違う答だというのならば大問題。
7158:2007/12/09(日) 10:51:44
>>70
DOSプロンプトからエラーを言われ停止しますよ 終了後ごとにvectorは解放されるはずなのでメモリ不足にはならないはずですよ
72デフォルトの名無しさん:2007/12/09(日) 10:53:33
>>69
そういうアドホックな対処ではなくて、もっと具体的な原因が知りたいなあと。
そもそもコンパイラ(vector)のバグと見なしてるようだけど、それも疑わしいしね。

コンパイラのバグ → ここを見た人に役立つ
>>58の書いたコードのバグ → 同じ過ちを繰り返さずに済む
73デフォルトの名無しさん:2007/12/09(日) 10:57:09
この時まだ>>58は知らなかった>>67が真実だということを。
74デフォルトの名無しさん:2007/12/09(日) 11:00:14
>>71
>>58 の書き方だと結果が出て間違っているように読める。
最後まで走って結果が出て、違ったという場合はあったの?
75デフォルトの名無しさん:2007/12/09(日) 11:02:05
再現性のあるソースを出せば一発なのに端折って小出しにする奴の多いこと
76デフォルトの名無しさん:2007/12/09(日) 11:03:55
エラーメッセージはコピペ。
コレ常識ネ。
77wolf ◆8VH3XAqjlU :2007/12/09(日) 11:31:49
>>24
>>26

int a; <= これはどっち? <--- declaration with simple-type-name
int main(){
int b; <= これはどっち? <--- declaration with simple-type-name
}

Grammar of C++ Declarations
http://msdn.microsoft.com/library/ja/vclang/html/_pluslang_Grammar_of_C.2b2b_.Declarations.asp?frame=true
78デフォルトの名無しさん:2007/12/09(日) 11:44:47
>>26
> int a; <= これはどっち?
> int b; <= これはどっち?
C++ なら、どっちも定義だ。
79デフォルトの名無しさん:2007/12/09(日) 12:04:27
>>77
なんだコイツ?
何が言いたいのかさっぱり分からないんだが、77はアホの子か?
80デフォルトの名無しさん:2007/12/09(日) 12:07:20
>>58こないのか。残念。
81デフォルトの名無しさん:2007/12/09(日) 14:54:22
VCです
class Foo {
 char szBuff[MAX_PATH];
 ZeroMemory( szBuff, MAX_PATH );
pubulic:
 Foo();
 ~Foo();
};
szBuffをコンストラクタの初期化子で初期化するにはどの様に書いたらいいですか?
82デフォルトの名無しさん:2007/12/09(日) 15:20:07
int a; <= これはどっち?
int main(){
int b; <= これはどっち?
}
両方とも宣言定義です。
略して、宣言、定義、または、宣定という人もいます。
83デフォルトの名無しさん:2007/12/09(日) 15:20:46
>>81
できません。 vector にすれば初期化できます。この場合は本体の中で
ZeroMemory() しても同じ結果になります。
84デフォルトの名無しさん:2007/12/09(日) 15:32:20
>>83そうですか、ではあきらめます
85デフォルトの名無しさん:2007/12/09(日) 17:37:11
クラスとかはヘッダに書くと思いますが
コンパイルしてオブジェクトにしておくことはできないのでしょうか。
毎回コンパイルするのは非効率だと思います。
86デフォルトの名無しさん:2007/12/09(日) 17:45:50
>>85
C/C++ ではヘッダでは定義なしの宣言だけにしておいて、対応するソースファイルで
定義を与えるという方法で重複コンパイルを避けるのが一般的。

C++ のテンプレートによってこの方法がうまく機能しにくい状況になっているので、
コンパイラによってはプリコンパイルドヘッダとか、あらかじめヘッダをコンパイルして
保存しておく機能を持っているものもある。
87デフォルトの名無しさん:2007/12/09(日) 17:57:13
>>86
そのあたりの「一般的」な作法がまとめてある書籍はありますか?
VC++では無い本がいいけど、独習C++とかになるんですかね?
88デフォルトの名無しさん:2007/12/09(日) 19:20:51
お作法のまとめだったら Effective シリーズとかがいいんじゃないの。
89デフォルトの名無しさん:2007/12/09(日) 20:43:11
>>61
ちょっと遅レスだが
BCCの最新バージョンBCC5.9.2(C++Builder2007付属)では落ちない
90wolf ◆8VH3XAqjlU :2007/12/09(日) 21:11:03
>>82
Sure, the following may not be accepted in the school.

Declaration:
However, many declarations serve as definitions.

Definition
A definition provides information that allows the compiler to allocate memory for objects or generate code for functions.

Object
An object is an instance (a data item) of a user-defined type (a class type).

C++ terms used in this book are defined in the following table:
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/vclang/html/_pluslang_terms.asp
91デフォルトの名無しさん:2007/12/09(日) 21:36:31
>>90
基地外スレにお帰りください
92デフォルトの名無しさん:2007/12/09(日) 21:58:13
お勧めなエディタ教えて
93デフォルトの名無しさん:2007/12/09(日) 21:59:25
c言語って数学で言うところの中括弧{}と同じ機能を持つ演算子って有る?
それとも、変数を使って一時的に値を記憶させないと駄目?
94デフォルトの名無しさん:2007/12/09(日) 21:59:56
>>92
cat
95デフォルトの名無しさん:2007/12/09(日) 22:00:46
>>92
すれ違い。いちおう誘導しとくけど、その聞き方じゃどこでもまともな答えは
期待できないと思われ。せめて今使ってるやつのどこが不満なのか書かないと。

【エディタ】ソース何で書いてる? 1スレ目
http://pc11.2ch.net/test/read.cgi/tech/1164154920/

テキストエディタをまた〜り語ろう ver.24
http://pc11.2ch.net/test/read.cgi/software/1194361643/
96デフォルトの名無しさん:2007/12/09(日) 22:02:15
>>93
数学で言うところの中括弧ってなんだ?式の優先順位を決めるための括弧なら、
何重だろうと全部丸括弧を使うんだけど。
97デフォルトの名無しさん:2007/12/09(日) 22:12:44
>>96
そうなんですか!
それなら、
数学で
{(5)(176) - (26)^2}{(5)(145) - (25)^2}のルートって、
C言語なら、
sqrt(((5)*(176) - (26)*(26))*((5)*(145) - (25)*(25)))
でOKですか?
98デフォルトの名無しさん:2007/12/09(日) 22:21:53
>>97
演算子の優先順位を調べたらわかると思うけど、
乗除算の方が加減算より優先されるので括弧を減らせるよ
99デフォルトの名無しさん:2007/12/09(日) 22:24:45
>>98
なるほど!
だったら、
sqrt((5*176 - 26*26)*(5*145 - 25*25))
でおkですね!
100デフォルトの名無しさん:2007/12/10(月) 02:08:00
ハッシュテーブル作るときなんですけど・・・

vector< myclass >型の固定長配列を用意して、それを例えばTBL[n]として
衝突が起こったらTBL[n].resize(2)して別のデータを格納していけば実装できそうですけど
一次元に自分で登録先を見つけてくる方法より効率悪いですか? 衝突は頻繁に起こらないとします
101デフォルトの名無しさん:2007/12/10(月) 02:42:27
>>100
効率って言っても空間効率と速度効率がある。速度にしても、実際の比較が
ハッシュ関数に比べてどんだけ思いかで変わるでしょ。そこらへんの情報無しには
答えようがない。効率は実測が基本。
102デフォルトの名無しさん:2007/12/10(月) 02:53:22
メモリ効率は動的確保の方が上ですけど、メモリ解放と確保にかかる時間なんですよね
実測してみます
10393:2007/12/10(月) 04:46:38
質問です。
hoge = (26 * 176 - 25 * 24) / sqrt((26 * 23 - 5 * 5) * (26 * 6 - 7 * 10));
というプログラムを書いて正しい結果が出力されたのですが、
これはどうしてでしょうか?
sqrtは戻り値として、平方根を返す関数ですが、この場合戻り値を受け取っていませんよね。
まるで、sqrt((26 * 23 - 5 * 5) * (26 * 6 - 7 * 10)がこの式の計算結果そのもののように感じるのですが、これはC言語の機能なのでしょうか?
104デフォルトの名無しさん:2007/12/10(月) 04:52:09
>>103
戻り値はちゃんと / 演算子が受け取っています。
10593:2007/12/10(月) 05:02:22
>>104
ええっ、そうなんですか?
演算子にそんな機能が有ったとは知らなかったです。
どこか詳しく説明している本やサイトは無いでしょうか?
106デフォルトの名無しさん:2007/12/10(月) 05:04:46
無い
10793:2007/12/10(月) 05:10:40
無いのにどうして分かったんですか!
どうして戻り値を受け取らないのにちゃんと計算できたのがとても不思議なんですけれど。
108デフォルトの名無しさん:2007/12/10(月) 05:12:39
戻り値は除算演算子が「受け取っている」
109デフォルトの名無しさん:2007/12/10(月) 05:13:08
何が戻値を「受け取ってない」んだい
110デフォルトの名無しさん:2007/12/10(月) 05:13:11
二項演算子の意味をちゃんと調べてみ。
111デフォルトの名無しさん:2007/12/10(月) 05:13:18
>>103
戻り値は受け取らなくてもいい

sqrt(10);
という文だけでもエラーにならない

返却される数値がdoubleならば数字を直接かくのと同じ

2.5 * 8

という計算は

x=2.5 ; y= 8;
x * y としなくても計算できる
112デフォルトの名無しさん:2007/12/10(月) 08:23:00
>>107
君が何を不思議がっているのかとても不思議なんですけど
113デフォルトの名無しさん:2007/12/10(月) 08:28:44
>>103
>sqrt((26 * 23 - 5 * 5) * (26 * 6 - 7 * 10)がこの式の計算結果そのもののよう
その通り
ちゃんと分かってんじゃん
114デフォルトの名無しさん:2007/12/10(月) 08:28:51
そもそも
a = func(5);
で、aに代入できるのは、右辺が値を持ってることを推測できそうなものだけど
115デフォルトの名無しさん:2007/12/10(月) 08:30:02
あ、日本語になってねぇorz
116デフォルトの名無しさん:2007/12/10(月) 08:30:42
>>114
きっと、
変数名=関数名(引数);
て形自体が一つの構文だと思ってるんだろうな
戻り値を受け取る構文
117デフォルトの名無しさん:2007/12/10(月) 08:34:31
>>93

数学で、

hoge = (26 × 176 - 25 × 24) / √((26 × 23 - 5 × 5) × (26 × 6 - 7 × 10))

と書いても、計算の仕方のルールがあるから、正しい結果を出せるでしょ。
それと同じで、sqrt()を先に計算して、その戻り値を使って / を計算するルールがあるから。
118デフォルトの名無しさん:2007/12/10(月) 08:36:06
int func(int z) { return z * 2; }
a = 8 + func(5);
って文があるとコンパイラは
a = 8 + 10;
a = 18;
って感じで処理する
119デフォルトの名無しさん:2007/12/10(月) 08:43:37
断定口調かよ
120デフォルトの名無しさん:2007/12/10(月) 09:00:02
ディレクトリ構造をメモリに保存するにはどうしたらいいですか?
ファイルに連番を付けてファイルのはパスがわかるようにしたいです
121デフォルトの名無しさん:2007/12/10(月) 09:01:47
多分木がいいとおもうのですが簡潔な方法有りますか
122デフォルトの名無しさん:2007/12/10(月) 09:45:50
>>120-121 とりあえず自分でやれよ。具体的にわかんないところがあったら相談してもいいからさ。
123デフォルトの名無しさん:2007/12/10(月) 09:46:43
前スレの一人用チャットです。
┌──┐
│   │←出力用子ウィンドウ    入力ウィンドウに文字を打ち、エンターキーが押されたら
└──┘                  出力ウィンドウに文字が表示されるようにしたい。
┌──┐←入力用子ウィンドウ
└──┘
ソースttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5461.txt

winspectorでチェックしたところ、そもそもエンターキーが押された信号が出ていなかったので、
子ウィンドウのウィンドウプロシージャも作ったんですが、今度は入力用子ウィンドウが表示されなくなりました。

プログラムを開始してすぐにエンターキーを押すとメッセージボックスが出るので、入力用子ウィンドウ自体は
どこかに作られていると思うんですが、自分の設置した場所には見当たりません。
猫でも〜を読んでもどこが間違っているのか分からないんですが、どうしたら子ウィンドウが表示されますか。

あと、まだ中身を作っていないのに、GUI?だけでやたら手こずってるんですが、こんなもんですか?
124デフォルトの名無しさん:2007/12/10(月) 09:50:44
特警しか思い出せなかった orz
125デフォルトの名無しさん:2007/12/10(月) 10:27:15
動的確保の変数って

int *n=new int;
と定義するんですか?
なんかいつも*nとして使えなくて不便なんですが
配列の場合は静的と同じですが なんとかなりますか
126デフォルトの名無しさん:2007/12/10(月) 10:33:35
>>123 C/C++でGUIはめんどい。そんなもん。

>>125
それであってる。deleteを忘れるなよ。
最後の行がよくわからない。
127デフォルトの名無しさん:2007/12/10(月) 10:37:26
int a[10]; としたものとint *a=new int [10];
の使い方は同じなのに
変数だと違います
128デフォルトの名無しさん:2007/12/10(月) 10:48:13
>>123
SetWindowLongをやめればとりあえず表示された
129デフォルトの名無しさん:2007/12/10(月) 10:57:45
>>123
130行目の引数がおかしいお
エディットコントロールのデフォルトウィンドウプロシージャが呼ばれてない
130デフォルトの名無しさん:2007/12/10(月) 10:58:54
int **p; としたとき
p[100]は、領域確保しなくてもつねにアクセスできますか?
アドレスの配列を作りたいのですが
131デフォルトの名無しさん:2007/12/10(月) 11:01:28
これはエラーになります どうすればいいですか?
int **p,n=100;
p[10000]=&n;
cout<<*p[10000];
132デフォルトの名無しさん:2007/12/10(月) 11:03:56
これはエラーになりません ポインタ配列も動的確保などしないと使えませんか?

int* *p= new int* [20000];
int n=100;
p[10000]=&n;
cout<<*p[10000];
133123:2007/12/10(月) 11:04:25
>>129
うあああああ!!DefProcにしたらできました!!
ありがとうございます!!
134デフォルトの名無しさん:2007/12/10(月) 11:15:44
多分木構造出来ましたよ

#include <iostream>
#include <string>
#include <vector>
using namespace std;

class tree{ public: string data; vector< tree* > p; };

tree* create(string data){
tree *node=new tree; node->data=data; return node; }

void insert(tree *node, string data ){
node->p.push_back( create(data) );}
135デフォルトの名無しさん:2007/12/10(月) 12:08:55
自分のIPアドレスを取得するにはどうしたらいいのでしょうか?
C言語、Windowsでお願いします。
136デフォルトの名無しさん:2007/12/10(月) 12:30:48
>>135
ipconfia
137デフォルトの名無しさん:2007/12/10(月) 13:28:58
複数のIP持ってる場合もあるしなあ
138デフォルトの名無しさん:2007/12/10(月) 13:31:42
NICを全部あげるんだ
139デフォルトの名無しさん:2007/12/10(月) 13:32:17
>>135
gethostbyname("")で取得

ipconfigの結果を解析
140135:2007/12/10(月) 13:44:23
プログラムの中でipconfigを実行するにはどのようにすれば
いいのでしょうか?
参考になるようなサイトを教えていただけると嬉しいです。
141デフォルトの名無しさん:2007/12/10(月) 13:56:44
system()
CreateProcess()
あとはパイプとか適当にぐぐれ
142135:2007/12/10(月) 14:03:05
>>141
ありがとうございます。
早速調べてみます
143デフォルトの名無しさん:2007/12/10(月) 14:29:09
>>131-132
int *a;
ポインタはアドレスを入れるための変数と考えるんだ。

int *a[100];
ポインタ配列は、アドレスを入れるための変数からなる配列

int **a;
ポインタのポインタは、ややこしいが
(アドレスを入れるための変数の)アドレスを入れるための変数

きちんと整理して理解しておいた方が良いよ。
144デフォルトの名無しさん:2007/12/10(月) 20:15:27
クラスのコンストラクタ呼び出しや初期化リスト以外で、変数を
int x(0); のように初期化するのってキモイですか?
145デフォルトの名無しさん:2007/12/10(月) 20:35:11
かなり初歩的な質問だけど、ボタンのCaptionをプログラム内で変えるのってどうやるの?
146デフォルトの名無しさん:2007/12/10(月) 21:12:53
SetWindowText()
Win32APIスレへ
147デフォルトの名無しさん:2007/12/10(月) 22:41:06
unsigned long a ,b;
int N;
とします。
Nは大きいです。


printf(" time=%f[s]\n", (a-b)/N);
 だとうまく表示されるんですが、

cout<<"time= "<<(a-b)/N<<"\n";だと0になってしまいます。

coutを使って書きたいのでアドバイスお願いします
148デフォルトの名無しさん:2007/12/10(月) 22:43:54
>>147
どちらもうまく表示されない
double N; としろ。
149デフォルトの名無しさん:2007/12/10(月) 22:45:31
>>148
ああ!わかりました
150デフォルトの名無しさん:2007/12/10(月) 23:45:42
>>144
そんなのキモイなんて言ってたら引数付きコンストラクタしかないクラスで
変数が作れないだろ。
151デフォルトの名無しさん:2007/12/10(月) 23:54:39
いや、だから彼はPOD型に使うのはキモいかと言ってるんだと思うよ
152デフォルトの名無しさん:2007/12/10(月) 23:58:49
書き方が統一できていいじゃないか
153デフォルトの名無しさん:2007/12/11(火) 00:01:56
一歩間違えると関数宣言になって意味不明なエラー出るから、っていうかそうなったことがあるから、
ちょっと怖いかな。

C からやってる人のこと考えても、あからさまな利点が無い限りやめといたほうがいいと思う。
154デフォルトの名無しさん:2007/12/11(火) 00:13:54
>>150-153
皆様ご意見ありがとうございます。
関数と間違えられたので止めといたほうがよさそうですね。
155デフォルトの名無しさん:2007/12/11(火) 04:57:40
VCです
クラスのメンバー変数を、コンストラクタの初期化子で、初期化する事はできますし、
推奨もされていますが、クラスのメンバー関数は、コンストラクターの
初期化子で初期化するのは、できませんよね?
ていうか、メンバー関数に初期化という、概念は無いですよね?
156デフォルトの名無しさん:2007/12/11(火) 04:58:30
>>155
関数を初期化?
関数ポインタではなくて?
157デフォルトの名無しさん:2007/12/11(火) 05:04:48
>>156
>>関数を初期化?
そこを迷っているんです、メンバー関数の持つ変数は初期化できても
メンバー関数に初期化なんて、概念は無いですよねやっぱり
>関数ポインタではなくて?
関数ポインタなら初期化できるんでしょうか?

158デフォルトの名無しさん:2007/12/11(火) 05:08:44
>>157
そもそも何を実現したいのかわからない。
具体的にどのような記述でどういう動作になるのを期待してるの?
159デフォルトの名無しさん:2007/12/11(火) 05:17:59
>そもそも何を実現したいのかわからない。
今Effective C++読んでいて、Cしか知らないので、
目新しいことが多くて、C++の作法というか、スタイルに戸惑っているところです
具体的に何を期待するとかという意味はありません、ふと思ったまでです。

160デフォルトの名無しさん:2007/12/11(火) 05:25:14
159ですが、具体的な質問をさせてください
class Foo {
  typedef struct st_data {
    st_data( int n, string s, double db : yymmdd( n ), code( s ), value( db ){} //@
    int yymmdd;
    string code;
    double value;
    //st_data() : yymmdd( 0 ), code(""), value( 0.0 ){} //A
  } st_data;

public:
  Foo();
  ~Foo();
}:
ただ、この様な構造体をは@、Aの方法で初期化できると思うのですが
実装で@の方法で初期化した変数にアクセスすると
error C2512: 'st_data' : クラス、構造体、共用体に既定のコンストラクタがありません。
となります、組み込み型の変数はやはり、Aの方法でインスタンスを与えないといけないのでしょうか?
@とAの違いは、なんなんでしょうか?
161デフォルトの名無しさん:2007/12/11(火) 05:26:29
すんません
×ただ、この様な構造体をは@、Aの方法で初期化できると思うのですが
○この様な構造体をは@、Aの方法で初期化できると思うのですが
162デフォルトの名無しさん:2007/12/11(火) 05:41:17
>>160
いまいちわからん
まだ関数の初期化などという話が続いてるのかな?

class Fooで包んでる意味がわからないけど、
とりあえず括弧の対応など幾つか修正した
#include <string>
using namespace std;
class Foo {
public:
struct st_data {
st_data(int n, string s, double db) : yymmdd( n ), code( s ), value( db ){} //@
int yymmdd;
string code;
double value;
//st_data() : yymmdd( 0 ), code(""), value( 0.0 ){} //A
};

Foo();
~Foo();
};
int main() {
Foo::st_data(0, "", 0);
return 0;
}
これで1の方法で初期化できるけど…何を求めてるかがわからんので適当だ
163デフォルトの名無しさん:2007/12/11(火) 09:07:45
FindNextFileの読み込み順序は制御できますか?
164デフォルトの名無しさん:2007/12/11(火) 09:12:44
>>160
Cは分かるという話だから、何か簡単な勘違いをしているのだと思うけど、
そのエラーの原因はtypedef
C言語でも、typedefしただけじゃ使えないでしょ?
変数を宣言しないと。

今回はそもそも再利用しないのでtypedefしなくてもいいから
struct hoge {
...
} hage;
て形でいいと思うけど。
165デフォルトの名無しさん:2007/12/11(火) 09:31:12
>>160
>error C2512: 'st_data' : クラス、構造体、共用体に既定のコンストラクタがありません。
コレって、引数を持つコンストラクタしかないクラス(等)に対して、
引数をつけずにコンストラクタを呼んだ時に見かける。

Foo::st_data data;
とかで変数定義すると、引数の無いコンストラクタ呼び出そうとするけど、
どっかにそんな記述してない?
166デフォルトの名無しさん:2007/12/11(火) 09:44:01
ソートのアルゴリズムなのですが、
for(sorted=0; sorted < N-1; sorted++){
insert = sort[sorted+1];
for(i=0; i<=sorted; i++)
if(sort[i]>insert)
break;
while(i<=sorted+1){
temp=sort[i];
sort[i]=insert;
insert=temp;
i++;
}}}


for(i=0; i<=sorted; i++)
if(sort[i]>insert)
break;
の部分が理解できません。
これは、if(sort[i]>insert)をfor(i=0; i<=sorted; i++)で繰り返すのはよしとして、
if(sort[i]>insert)が真の時にbreakして、whileに処理が飛ぶのでしょうか?
そして、ifが偽のときはどこに処理が飛ぶのでしょうか?


167デフォルトの名無しさん:2007/12/11(火) 10:01:41
sort配列の中で、insertよりも大きい値の位置「i」を探している
繰り返し中一度も真にならなければ「i」はsorted+1(最後)になる
168デフォルトの名無しさん:2007/12/11(火) 12:08:25
>>163
ttp://msdn2.microsoft.com/en-us/library/aa364428.aspx
>The order in which the search returns the files, such as alphabetical order, is not guaranteed, and is dependent on the file system.
>You cannot depend on any specific ordering behavior.
>If the data must be sorted, you must do the ordering yourself after obtaining all the results.
169164:2007/12/11(火) 12:23:53
すまん俺のは忘れてくれ
170デフォルトの名無しさん:2007/12/11(火) 13:20:32
vector <string> str;
をディスクに保存したいのですがどの用にしたら良いんでしょうか?
171デフォルトの名無しさん:2007/12/11(火) 13:31:24
どうにでも出来すぎて、どう答えたもんかわからんな。何か制約はあるの?
たとえば、stringの中身に改行が無いことがわかっているなら、大雑把に一行一要素ずつ出力していって
読み出すときはこれまた大雑把にstd::getline()で読み出していけばいいし、
そうでないなら、stringのサイズと中身を順に詰めていって、読み出す時は
サイズを読む→その分だけデータを読む、を繰り返していけばいい。

ファイルの開き方がわからないとか、そういうレベルなら「ファイルストリーム」とかで検索して勉強しる。
172デフォルトの名無しさん:2007/12/11(火) 13:33:12
すみません
string型にバイナリデータは読み込めませんか?

char buf[1000];として bufに100バイト読み込んだとして、(string)bufと変換するしか無いですか?

vector <string> str;の構造自体をバイナリで記録できれば変換必要ないと思うんですが・・・無理ですよね?
173デフォルトの名無しさん:2007/12/11(火) 13:35:54
>>171
すみません
なるべ読み書きの速度を上げたいんですが・・・
行単位での書き込みは、もし1000万行とかになったら時間コストがかかりすぎますよね
バイナリで一度に5メガずつとか読み込んで速度を上げたいです
174デフォルトの名無しさん:2007/12/11(火) 13:39:49
stringのアドレスからどの様にデータが配置されているか判れば、直接バイナリで読み書きできそうですが・・・
size()以外の情報データは何ビットか判りますか?
175デフォルトの名無しさん:2007/12/11(火) 13:44:33
>>173
>>171
>stringのサイズと中身を順に詰めていって、読み出す時は
>サイズを読む→その分だけデータを読む、を繰り返していけばいい。
と書いてるじゃないか
176デフォルトの名無しさん:2007/12/11(火) 13:45:33
>>174
stringは可変長領域へのポインタを持っているだけだろうからその方法じゃ無理
177デフォルトの名無しさん:2007/12/11(火) 13:46:29
char配列経由しないでstringに格納する方法は有りますか?
178デフォルトの名無しさん:2007/12/11(火) 13:49:08
>>177
何をどこから格納するの?
179177:2007/12/11(火) 14:04:14
たとえばdoubleならIEEE型のバイナリを8バイトずつディスクに書き込めるじゃないですか
stringもバイナリで読み書きできない物かと
180デフォルトの名無しさん:2007/12/11(火) 14:06:13
>>179
c_str()を使うといいよ
181デフォルトの名無しさん:2007/12/11(火) 14:06:27
自前でchar配列を管理した方が読み書きは速そうですね
182179:2007/12/11(火) 14:07:46
書き込むときは良いんですけど、読みこみがchar配列から変換する必要がでてしまいます
183180:2007/12/11(火) 14:08:12
ごめん間違えた忘れて
184デフォルトの名無しさん:2007/12/11(火) 14:08:32
あらかじめresizeしてから格納すればよいのでは?
185デフォルトの名無しさん:2007/12/11(火) 14:10:06
リサイズで領域確保すればバイナリで読み込めますか?
186デフォルトの名無しさん:2007/12/11(火) 14:12:11
試せ
187デフォルトの名無しさん:2007/12/11(火) 14:14:06
速度を気にしてるようだけど、実測した上で言ってるの?
そもそもデータ構造はvector<string>でいいの?
要求を満たす代替案は考えてないの?
188デフォルトの名無しさん:2007/12/11(火) 14:15:57
質問をまとめるとですね・・・
string型を直接ディスクに書き込んだり直接読んだり出来るかという事です
189デフォルトの名無しさん:2007/12/11(火) 14:21:56
>>188
「直接」が曖昧

string s;
ofstream f(filename);
f << s;

fwrite(&s, sizeof(string), 1, fp);
190デフォルトの名無しさん:2007/12/11(火) 14:23:43
>>189
その方法で読み書き出来るんですか?試してみます
stringは読み込むときにresizeしておかなくても読み込めるんですか?
確保していないところに書き込まれないですか?
191デフォルトの名無しさん:2007/12/11(火) 14:24:31
>>188
boost::serialization
192デフォルトの名無しさん:2007/12/11(火) 14:30:45
サンクス 出来ました
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

main(){
string s="this a pan.", t;
fstream fp;
fp.open("stringdat", ios::out | ios::binary );
fp.write( (char*) &s, sizeof(s));
fp.close();

fp.open("stringdat", ios::in | ios::binary );
fp.read( (char*) &t, sizeof(s));;
fp.close();
cout<<t;}
193デフォルトの名無しさん:2007/12/11(火) 14:32:32
string sを長くしたら表示中にエラーが出ました やはり確保しておかないと駄目ですか
194デフォルトの名無しさん:2007/12/11(火) 14:36:48
ありがとうございました 確保しておいたらエラー出ませんでした 
195デフォルトの名無しさん:2007/12/11(火) 14:39:32
>>192
これは良いコードw
196デフォルトの名無しさん:2007/12/11(火) 14:50:57
でも確保するサイズがなぜか2倍以下だとエラーになります なんか不安定だしメモリ食うので安全にcharにしようと思います
197デフォルトの名無しさん:2007/12/11(火) 14:55:50
YUV422に関して、ど素人なのですが
再生用YUV422のサンプルファイルと、
再生用サンプルプログラム等を
ダウンロード出来るサイトご存じの方いませんでしょうか?
198デフォルトの名無しさん:2007/12/11(火) 14:59:22
>>192
うわぁ…
199デフォルトの名無しさん:2007/12/11(火) 15:17:07
すみません
vector<string>なんですけど、既に10Mバイトくらい使用していたとして、確保されている領域も無いとき
新たにstring型を追加するときは、別の空き領域を探してきて元のデータをコピーするんでしょうか? 手間かかりますよね?
また、vector<string> str;
str.resize(100000);
と十分に確保してあれば各str[n]がどんなにメモリ食っても再配置されませんか?
200デフォルトの名無しさん:2007/12/11(火) 15:18:39
再配置されているかどうか調べるにはどうすればいいですか? 意図的に再配置を起こさせるような実験プログラムは判りますか?
201デフォルトの名無しさん:2007/12/11(火) 15:31:39
>>199
きっと意図しているのは str.reserve() なのではないかと思うけど、ふ
つうの実装だったらたくさんリザーブしておけばそこまでは再配置され
ないんじゃないかねえ。規格は手元にないので知らない。

メモリへの要件が厳しいようなら、自分で vector 相当のものを書いた
ほうが柔軟に対応できるかもしれない。

202デフォルトの名無しさん:2007/12/11(火) 15:43:51
int main(){
void *p[10000];
string str;
str="This is a pan.";
p[0]=&str;
cout<< *((string*)(p[0]));
}

とやれば出来ますけど、サブルーチンでstringを追加するにはstatic 付けたらいいですか?
newで確保してもメモリから消えないんですけど値はつねに保証されますか?
203デフォルトの名無しさん:2007/12/11(火) 15:46:45
自前で作るならstring使わないでchar配列を動的確保した方が安定しそうですね 
でもサブルーチンで確保しても値は保証されますか?
204デフォルトの名無しさん:2007/12/11(火) 15:49:12
そもそも、メンバ関数を初期化という概念がどこから来たのか知りたいぜ。
205デフォルトの名無しさん:2007/12/11(火) 15:54:00
>>202の場合、pを引数で渡しても、strは消滅の可能性がありますよね だから読み込めない場合がありますよね
staticやnewで確保すればpを引数にしてデータアクセスはつねにできますか
206デフォルトの名無しさん:2007/12/11(火) 15:57:34
>>199
全体のデータサイズよりも、文字列の個数によって方法論が決まってくるんじゃないかな。

stringの実装には色んなやり方があるけど、いずれの場合も、サイズの大きな中身はポインタで持ってる。
だから、10MB使用している状態でvectorが要素を再配置したからといって、その10MBのすべてが
せっせと大移動を繰り広げるわけではない。
たとえばvector<string>の要素数が10で、それぞれのstringサイズが1MB、合計10MBのとき、
そのあとpush_back()で再配置が起きても、移動するのは「string型そのもの」だけ。
string型自体のサイズは、せいぜい数バイトから多くても20バイト台で、これが10個コピーされるだけってことになる。

でも、「平均10バイトの文字列が100万個で10MB」となると、これの再配置は確かにコストが高いわけで、
つまりこの辺は、君がイジろうとしているデータの性質次第で、アプローチが変わってくる部分だと思う。
207デフォルトの名無しさん:2007/12/11(火) 16:03:23
>>206 ありがとう
208デフォルトの名無しさん:2007/12/11(火) 16:09:55
>>202,203,205
どうも基本的なC++の知識が欠如しているように見えますよ。C++の入門
書を一冊読んでみたらいかが? メモリ効率を気にするのはまだ早いんじゃ
ない?

もちろん、
void add_item(string** array, int capacity, int size) {
if (size >= capacity) return;
string str = "...";
array[size++] = &str;
}
という風にすると、array[]に入れた値は関数から抜けた時点で無効です。
static にしたら汎用性がなくなりそうなので、new でしょうね。
209デフォルトの名無しさん:2007/12/11(火) 18:28:51
>>206
>>stringの実装には色んなやり方があるけど、いずれの場合も、サイズの大きな中身はポインタで持ってる。
>>だから、10MB使用している状態でvectorが要素を再配置したからといって、その10MBのすべてが
>>せっせと大移動を繰り広げるわけではない。
では、vector型データの参照渡しは無意味ってこと?
例えば
vector<int>& Foo(){ return hoge; }; //@
vector<int> Foo(){ return hoge; }; //A
この場合、@もAも関数を引き渡すコストは同じなの?
210デフォルトの名無しさん:2007/12/11(火) 18:37:26
お前は何を言ってるんだ
211デフォルトの名無しさん:2007/12/11(火) 18:40:16
>206
でもさ、vectorの再配置は、コピーコンストラクタで行うんだから、
stringの性質によっては、どっちも10MBすべて大移動になるでそ?
特に最近は、スレッドの絡みで、COWしないのが流行りだし。
212デフォルトの名無しさん:2007/12/11(火) 19:25:24
なんか話が噛み合ってないおかーん
213デフォルトの名無しさん:2007/12/11(火) 19:58:08
rope使えよ
214デフォルトの名無しさん:2007/12/11(火) 21:42:35
struct point{int x,y;};
を<algonithm>でソートしたいんですが、
キーがxの順とyの順を切り替えて使いたいです
切り替えないなら
bool operator< (const node& left, const node& right){return (left.x
< right.x);}
でいいんですが、切り替える時はどういう風にオペレータを定義すればいいんでしょうか?
どちらの順にするかは各クラスによって決まっているので出来ればメンバ関数化したいです
環境はg++です
215デフォルトの名無しさん:2007/12/11(火) 21:51:05
x, yそれぞれの比較関数作ってsortに渡せばいいじゃん
216デフォルトの名無しさん:2007/12/11(火) 22:04:16
>>215
クラス内に書くと
operator<(const point&, const point&)' must take exactly one argument
と怒られるので仕方なくグローバル関数にしています、
上と同じ内容のオペレータをメンバ関数にするにはどうしたらいいのかサッパリでorz
217デフォルトの名無しさん:2007/12/11(火) 22:08:54
bool operator < (const point& rhs) { return (this->x < rhs.x); }
218デフォルトの名無しさん:2007/12/11(火) 22:50:00
age
219デフォルトの名無しさん:2007/12/11(火) 23:37:46
>>217
'class Hoge' has no member named 'x'
オペレータ全然わかんねorz
220デフォルトの名無しさん:2007/12/11(火) 23:41:39
pointをメンバで持ってるクラスについて、そのpointで比較したいなら、
当然、rhsの型をそのクラスにして、比較したいpoint型のメンバ変数名を
差し挟まなくちゃあいけませんよ。
221デフォルトの名無しさん:2007/12/12(水) 00:12:25
現在、60kbyte分のメモリをmallocしてmemsetで60kbyteのサイズ分文字を格納しています。
これを、ソケット通信すると、MTUごとにフラグメント化され60kbyteの一つのデータとして
ではなく、MTUサイズ分の複数の異なるデータになってしまいます。
(途中の経路でパケットキャプチャしてオフセットフラグを確認しすべて0だった)

そこで、60kbyteのデータを一つのデータとして作成する方法を教えていただけませんか?

222デフォルトの名無しさん:2007/12/12(水) 00:14:03
TCPは?
223221:2007/12/12(水) 00:22:01
>>222
TCP通信かUDP通信かってことですか?
TCP通信でオプション等は何も設定していません。
質問の意図を取り違えていたらすみません。
224デフォルトの名無しさん:2007/12/12(水) 00:47:36
64bit毎のlongの配列のデータを12bit毎に処理をして64bitの配列に戻したいのですが、
どのようにすればいいでしょうか?
環境は、windowsでcygwinのgccのC++です。

配列の数は上から与えられます。12bit毎にデータの加工をして上に返します。
一応、途中まで考えたのですが、力技しか思いつかず、凄く長くなってしまいます。
関数は以下のような形です。
bool CLASS::exe(std::vector<signed long>&din, std::vector<signed long>&dout)
{
long in_data[3];
int data_12b[16];
long size = din.size();

for(int i=0; i<size; i+=3){
data[0] = din[i];
data[1] = din[i+1];
data[2] = din[i]+2;

// ここで12bitのデータにする

// ここで12bitのデータの処理

// ここでlong3つの変数に入れる
}
225デフォルトの名無しさん:2007/12/12(水) 00:57:22
なんで12bitなんだろう
力業しかないんじゃない?
226デフォルトの名無しさん:2007/12/12(水) 01:04:43
>>224
signed だとシフトが安全に使えないから無理な予感。符号はどうなってんの?
227デフォルトの名無しさん:2007/12/12(水) 01:06:41
>>216
なんでメンバ関数にしたいの?関連のあるコードだからってことなら static メンバ関数に
すればよさそうだけど。
228デフォルトの名無しさん:2007/12/12(水) 01:21:38
>>225
よく分からないのですが、16ビット×16コのデータをまいびいて圧縮して、
12ビット×16コにしてるみたいです。
力技だと
data_12b[0] = (data[0] >> 52) & 0x0FFF;
data_12b[1] = (data[0] >> 40) & 0x0FFF;
・・・
みたいな感じになるんでしょうか?

>>226
12bitのデータに符号はないです。なので符号のbitは符号として使ってません。
関数の呼び出し部分はunsignedにできるのでそっちにしてみます。
229デフォルトの名無しさん:2007/12/12(水) 01:34:13

12bit + パディング4bt × 16コ にしてもらえ
230デフォルトの名無しさん:2007/12/12(水) 01:49:20
>>229
天才現る!その考えはなかったわ。
うん、そうしよう。
ありがとうございました。
231デフォルトの名無しさん:2007/12/12(水) 02:30:00
すいませんCの質問かどうか微妙なんですが、
同じ数字を繰り返す式例えば
while(){
int num++;
a = num % 3;
}であれば012012012とaの値が変化しますよね、
これと別に0121012101210って感じで変化する数字を作り出すやり方ってありますかね?
232デフォルトの名無しさん:2007/12/12(水) 02:34:06
>>231
3行目、aじゃなくてnumな。あとnumのスコープが狭すぎ。

int num=0;
static int array[] = { 0, 1, 2, 1 };
while() {
int a = array[ num ];
num = ( num + 1 ) % 4;
}

テーブルで変換とかどう?
1の次が0になる場合と2になる場合があるから単純なステートマシンじゃ無理かと。
233デフォルトの名無しさん:2007/12/12(水) 02:39:43
>>232

なるほど。おっしゃるとおりテーブル使ったほうがよさげですね。
実はこれ今作ってるゲームのアニメパターンの変化部分で使うんですよ。
グラデーションみたいなアニメなんで012012みたいな循環数字(?)じゃ気に入らなくて、、、

ありがとでした!!
234デフォルトの名無しさん:2007/12/12(水) 02:53:15
>>221
TCPなら順序制御があるけど、何が問題なの?
少なくともトランスポート層以上では正しい
データになってるだろ。
アプリ層で60kByte取得するまで待てばいいんでは?
235デフォルトの名無しさん:2007/12/12(水) 02:58:13
>>233
三角関数使うといいんじゃね?
236デフォルトの名無しさん:2007/12/12(水) 03:39:42
int main(){

const int C = 100;
const double PI=3.1415f;
const double K = 10.0f;

double i=0.0f;

for(int r =0;r<C;r++){
double t=0;

for(double x=1.0f;x<K ; x=x+1.0f){
t = t + sin((x* PI )/2.0f ) * (sin( x * i))/(x*x);
}
cout << static_cast<int>(round(fabs(t*(8.0f/(PI*PI))) * 2)) << endl;;

r%4==0 ? i=0.0f:i=i+PI/4.0f;
}



return 0;
}
237デフォルトの名無しさん:2007/12/12(水) 05:07:14
>>224
どうしてunion使わないの?
238デフォルトの名無しさん:2007/12/12(水) 07:25:38
struct Foo {
double value;
char *name;
};

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

int i;
for(i = 1;i < argc; i = i + 2)
struct Foo test[i] = {atof(argv[i]), argv[1+i]};

とやると、
.c:13: error: parse error before 'struct'
.c:17: error: 'test' undeclared (first use in this function)
.c:17: error: (Each undeclared identifier is reported only once
.c:17: error: for each function it appears in.)

ってコンパイルエラーが出てコンパイルできないんですけれど、
どうやれば構造体を宣言できるのか分からないので教えていただけないでしょうか?
239デフォルトの名無しさん:2007/12/12(水) 07:44:39
>>238

for(i = 1;i < argc; i = i + 2)
struct Foo test[i] = {atof(argv[i]), argv[1+i]};

↑こんなことできん。
いったい何をしたいんだ?

240デフォルトの名無しさん:2007/12/12(水) 08:10:40
>>239
できないんですか〜。
残念。
正確にやりたいことを書くと、引数に「100,りんご,200,みかん,150,バナナ」みたいなものがあります。
でも引数の数は「100,りんご,200,みかん」かもしれないし、「100,りんご」かもしれないし、もしかしたら引数がないかもしれません、
で、まず構造体を作って、
struct Foo {
double value;
char *name;
};

int i;
for(i = 1;i < argc; i = i + 2)
struct Foo test[i/0] = {atof(argv[i]), argv[1+i]};

ってできないかなぁと思って。
241240:2007/12/12(水) 08:12:12
struct Foo test[i/2] = {atof(argv[i]), argv[1+i]};
の間違いです。
242デフォルトの名無しさん:2007/12/12(水) 10:06:49
>>236
それはやりすぎwww
243デフォルトの名無しさん:2007/12/12(水) 10:31:57
i/0ってw
244デフォルトの名無しさん:2007/12/12(水) 10:44:43
>>224
要素が12bitのように振舞うvector<signed long>のラッパー
vector<signed long>に12bitずつ格納するラッパー
イテレータも実装すればいろいろ応用できるだろう
245デフォルトの名無しさん:2007/12/12(水) 11:12:50
>>240
造体の要素ごとに入れていくか、
コンストラクタつきの構造体(クラス)にして、引数にするとかじゃね?
っていうか、やりたい事を見ると、簡単な構文解析が必要なんじゃね?

246デフォルトの名無しさん:2007/12/12(水) 11:51:50
>>221
MTU (最大転送単位)なんだから、MTUより大きなパケットは使えません。
なんで分割されると困るの?
247デフォルトの名無しさん:2007/12/12(水) 13:23:24
if(!a)printf("hello world");
だとaが偽(0の時)の時printfを実行するという意味でしょうか
248デフォルトの名無しさん:2007/12/12(水) 13:31:10
そうですよ。
249デフォルトの名無しさん:2007/12/12(水) 13:34:02
>>247の質問をエスパーするとだな

真が0以外なのに正常終了が0なのはどうしてですか

ってことだと思う
250デフォルトの名無しさん:2007/12/12(水) 13:42:26
#include <vector>
#include <sstream>
#include <algorithm>
struct Foo {
double value;
std::string name;
};
int main (int argc, char *argv[]){
{
std::vector<Foo> FooArray;
if (argc > 1) {
std::vector<char> str(argv[1], argv[1] + strlen(argv[1]) + 1);
std::replace(str.begin(), str.end(), ',', ' ');
std::stringstream buf(&str[0]);
Foo data;
while (buf >> data.value >> data.name)
FooArray.push_back(data);
}
return 0;
}
251デフォルトの名無しさん:2007/12/12(水) 13:44:05
>>250>>240へのレスね。ちなみにマルチバイト文字列だとバグるかも
252デフォルトの名無しさん:2007/12/12(水) 13:50:44
>>250
240 を見る限り、実際にカンマ区切りのテキストを入力するわけじゃなくて
argv に2つずつ並んでるみたいだよ。そんなめんどくさいことしなくていいみたい。
253デフォルトの名無しさん:2007/12/12(水) 14:01:09
#include <vector>
#include <string>

int main(int argc, char ** argv)
{
struct valname {
double value;
std::string name;
};
std::vector<valname> valnames;
for (int ic = 1; ic < argc; ic += 2) {
valname data = {atof(argv[ic]), argv[ic + 1]};
valnames.push_back(data);
}
for (std::vector<valname>::const_iterator it = valnames.begin(); it != valnames.end(); ++it) {
std::cout << it->value << ' ' << it->name << '\n';
}
return 0;
}
254デフォルトの名無しさん:2007/12/12(水) 15:08:21
ポインタ配列は、一つ当たり32bit使いますか?
255デフォルトの名無しさん:2007/12/12(水) 15:12:56
>>254
環境によります。
printf("%u\n", sizeof(void *))とでもしてバイト数を割り出してみてください。
大抵の環境では、その8倍がビット数になります。
256デフォルトの名無しさん:2007/12/12(水) 15:14:39
サンクス
257デフォルトの名無しさん:2007/12/12(水) 15:29:40
int ch;
while((ch=getchar())!=EOF){
if(if(isalpha(ch)) analysis(ch);
}

ってなってるところで11Fってやったらanalysis(ch)に11回Fをいれるようにしたいんですどどうすればいいですか?
analysis(ch)は他の関数です。
258デフォルトの名無しさん:2007/12/12(水) 15:38:14
>>257
ループの外で count という変数を宣言して、0で初期化
ループの中で、isdigit() だったら count = count * 10 + ch-'0'
analysis() を呼ぶところで、count の回数だけ繰り返し
259デフォルトの名無しさん:2007/12/12(水) 15:39:51
>>257
日本語とCでOK。
260デフォルトの名無しさん:2007/12/12(水) 16:09:33
>>258
有難うございます、やってみます。
261デフォルトの名無しさん:2007/12/12(水) 16:59:20
const int num = 5;
int a[num];

って、C++では、配列を宣言ってできるの?
これが出来たら、配列が動的に宣言できちゃうことにならない?
262デフォルトの名無しさん:2007/12/12(水) 17:02:34
>>261
numはコンパイル時に確定しているから静的でないといけないC++でも問題ない。
Cの場合は、ローカル変数なら同じ方法で動的に宣言できる。
263デフォルトの名無しさん:2007/12/12(水) 17:45:57
>>261
const は動的に書き換えられないので問題ない。
264デフォルトの名無しさん:2007/12/12(水) 17:46:57
>>262
それはC99だろ
265デフォルトの名無しさん:2007/12/12(水) 17:49:24
>>263
でも、変数の初期化時に動的な値で初期化できないかい?

const int num = f();

みたいな感じで
266デフォルトの名無しさん:2007/12/12(水) 17:59:55
>>265
やってみろ。話はそれからだ。

>>264
C99はCではないとでも?
267デフォルトの名無しさん:2007/12/12(水) 19:29:48
>>266
C99はCの一つ。だから、Cの場合は云々行った場合、
それがC99だろうと、C89だろうとかまわない内容でないとまずいだろ。

ちゃんとC99である事を明記するべきだといっているんだ
268デフォルトの名無しさん:2007/12/12(水) 19:42:03
なに、じゃあいまさらK&R形式でやれと?
構造体の直接代入は禁止かい?
269デフォルトの名無しさん:2007/12/12(水) 19:53:47
頭の悪い絡み方だが、本人的には鋭い突き上げなんだろうね。
270266:2007/12/12(水) 20:19:43
いや、>268は私じゃないし。
271デフォルトの名無しさん:2007/12/12(水) 20:21:03
いまの32bitx86用商用コンパイラってだいたいC++コンパイラだろ
C99をサポートした上記用Cコンパイラって何かある?
272デフォルトの名無しさん:2007/12/12(水) 20:27:39
取り敢えず、icc, sun studioはc99だね。
273デフォルトの名無しさん:2007/12/12(水) 20:52:11
そもそも32bit x86用商用コンパイラ、というカテゴリそのものがアレだなー。
274デフォルトの名無しさん:2007/12/12(水) 21:26:35
まぁC99、あんま流行ってないしな。
275デフォルトの名無しさん:2007/12/12(水) 22:02:47
>>274
まーね、C++のCの部分だけで十分なんだけどって感じかな。
俺としては、C99サポートよりC++TR1のサポートを要求するって感じだ。

>>272
やっぱ、銭にならん、あるいは、対応要求が強くないからかなサポートしないってことかな。
276デフォルトの名無しさん:2007/12/12(水) 22:07:35
というか、「いまの32bitx86商用Cコンパイラ」をC99対応に関わらず
列挙してみろってば。
277デフォルトの名無しさん:2007/12/12(水) 22:19:19
ググレカス
278デフォルトの名無しさん:2007/12/12(水) 22:49:57
C++で typedef は何の為にあるんでしょうか。
自己満足以外の使い方を教えてください。
279デフォルトの名無しさん:2007/12/12(水) 22:54:20
移植性と書きやすさ
280デフォルトの名無しさん:2007/12/12(水) 23:06:02
>>275
>まーね、C++のCの部分だけで十分なんだけどって感じかな。
つーか、C89から使ってる人間からすると、C99でどうしても欲しい機能って無いのよ。
むしろC99に対応するより、ISOやらJISやらにC89の規格を閲覧出来るようにしろと要求したい。
281デフォルトの名無しさん:2007/12/12(水) 23:11:36
>>278
traitsの表現
というか自己満足してるのはお前だけ
282デフォルトの名無しさん:2007/12/12(水) 23:27:42
typedef無かったらめっちゃ不便やん?
テンプレート使うときとか後で変更される可能性のある型使うときとか
283デフォルトの名無しさん:2007/12/12(水) 23:31:06 BE:335659853-2BP(35)
コードコンプリート第2版とModernC++Designまじおすすめ
284デフォルトの名無しさん:2007/12/13(木) 00:13:25
VCのうにコードな時、TEXT("もじれつ")でWSTR[]が作れるけど、
文字からWCHARを作るにはどうすればいいの?
285デフォルトの名無しさん:2007/12/13(木) 00:24:05
おまえらC#も使えるよな?
286デフォルトの名無しさん:2007/12/13(木) 00:24:24
TEXT('も');
_T('じ');
287デフォルトの名無しさん:2007/12/13(木) 00:35:32
VCのうにコードな時、TEXT("もじれつ")でWSTR[]が作れるけど、

いや無理だろ
288デフォルトの名無しさん:2007/12/13(木) 00:45:21
>>284
C/C++言語で文字列をどうこう言う前に、自然言語で正しい(意味が伝わる)文字列を
扱えるようにするのが先だとは思わないかね?
289デフォルトの名無しさん:2007/12/13(木) 19:15:14
vector配列の解放はどうやるんですか? resizeとかで縮めるしかないですか
290デフォルトの名無しさん:2007/12/13(木) 19:17:53
自己解決しました clear();というのがありました
291デフォルトの名無しさん:2007/12/13(木) 19:25:20
だめだ
解放されていない
292デフォルトの名無しさん:2007/12/13(木) 19:26:46
reserve(0);でも解放されないよ どうしたら良いんですか
293デフォルトの名無しさん:2007/12/13(木) 19:30:50
vectorの解放ってあんましピンとこないなー。

std::vector<T>( hoge ).swap( hoge )
でシュリンクできる、ってEffectiveSTLにあったけど、
そういう話?
294デフォルトの名無しさん:2007/12/13(木) 19:34:25
解放できましたよ 標準でついてないのが良くないですね
main(){
int n;
vector<double> a(10000000,1);
vector<double>().swap(a);
scanf("%d",&n);
}
295デフォルトの名無しさん:2007/12/13(木) 19:37:39
>>293
作業領域でたとえば100M使っていたとして、そのあとにもプログラムが続く場合
作業領域は消したいですよね 多分サブルーチンで確保したものは戻るときに消えていると思うのですが
そうでないと消したいわけなんですが・・標準でついてないです
296デフォルトの名無しさん:2007/12/13(木) 19:44:52
そういう意味なら、スコープ抜けたら消えるでしょ。
vectorの定義から消したい場所までをブロックで囲めば。
297デフォルトの名無しさん:2007/12/13(木) 19:47:29
万能解放命令できたよ

template<typename T>
void clear(T& t){ T().swap(t);}

main(){
int n;
string a; a.resize(100000000);
clear(a);

vector<double> b(10000000,1);
clear(b);
scanf("%d",&n);}
298デフォルトの名無しさん:2007/12/13(木) 19:50:30
>>296
実験してみました ちゃんと解放しますね 勉強になりました

main(){
{vector<double> b(10000000,1); Sleep(1000);}
int n; scanf("%d",&n);
}
299デフォルトの名無しさん:2007/12/13(木) 20:00:26
でも有効範囲を括弧で括るのは紛らわしいですね 他にも適用範囲の別の物がまじっていたら困ります
明示的に解放するほうが良さそうですね 
300デフォルトの名無しさん:2007/12/13(木) 21:00:51
vcはclearで解放しなかったかな
301デフォルトの名無しさん:2007/12/13(木) 21:23:11
C99の複合リテラルに対応しているコンパイラって何がありますか?
302デフォルトの名無しさん:2007/12/13(木) 21:40:38
gccって更新はやいんじやないの?
303デフォルトの名無しさん:2007/12/14(金) 00:36:56
>>299
まともにスコープ切ってれば明示的な解放(ブロック作成)が要るようになることなんて
無いと思うよ。そうとう特殊な場合でしょ。
304デフォルトの名無しさん:2007/12/14(金) 02:17:40
ImpersonateLoggedOnUser関数による偽装ログオンについて教えてください
アドミン権限で動いてるプログラムのうち、ユーザHOGEに偽装ログオンして
動かしたいA()という関数と、アドミン権限で動かしたいB()という関数があります。

このとき、
LogonUser(..., &hToken);
ImpersonateLoggedOnUser(hToken);
A();
B();
RevertToSelf();
CloseHandle(hToken);
としてしまうと、B()までHOGE権限で動いてしまうと思っています。ので、
LogonUser(..., &hToken);
ImpersonateLoggedOnUser(hToken);  A();  RevertToSelf();
CloseHandle(hToken);
LogonUser(..., &hToken);
ImpersonateLoggedOnUser(hToken);  A();  RevertToSelf();
CloseHandle(hToken);
B();
とするか、
LogonUser(..., &hToken);
ImpersonateLoggedOnUser(hToken);  A();  RevertToSelf();
ImpersonateLoggedOnUser(hToken);  A();  RevertToSelf();
B();
CloseHandle(hToken);
とするかだと思うのですが、A()、B()が何回か繰り返し呼び出されるとき、後者のように
LogonUser()を呼ぶのは一回だけにして、LogonUser()とCloseHandle()の間に複数回の
偽装・偽装解除・A()・B()を呼び出すのは問題ないでしょうか。
多分大丈夫なんじゃとは思うのですが、そういうサンプルコードが見あたらなかったので
決めかねている次第です。どなたか教えていただけると助かります。
305デフォルトの名無しさん:2007/12/14(金) 11:44:17
文字列リテラルにスコープってある?

char *func(){
return "Hello,World!!!";
}
てあり?
306デフォルトの名無しさん:2007/12/14(金) 11:56:07
>>305
大蟻。
つーか、常套手段。但し、const char *を返すべき。
307306:2007/12/14(金) 11:58:04
>>305
書き忘れた。文字列リテラル自体の生存期間はstaticと同じく、プログラム開始時から終了時まで。
308デフォルトの名無しさん:2007/12/14(金) 12:47:11
>>306-307
サンクス
そうかconstだったな
309デフォルトの名無しさん:2007/12/14(金) 15:35:34
スコープ(名前の有効範囲。コンパイル時にチェックされる)と
寿命(変数を置く場所がその変数のための場所である期間。実行時の話)は
別の話だぞー。
310デフォルトの名無しさん:2007/12/14(金) 22:33:52
参考書を見ながら独学でやっているプログラミング初心者です。
どうにもわからないことがあるので質問します。

#include<stdio.h>

int main(void){

int a = 1;
int b = 0;


printf("short int型のサイズは%dバイトです。\n",sizeof(short int));
printf("int型のサイズは%dバイトです。\n",sizeof(int));
printf("long int型のサイズは%dバイトです。\n",sizeof(long int));

printf("float型のサイズは%dバイトです。\n",sizeof(float));
printf("double型のサイズは%dバイトです。\n",sizeof(double));
printf("long double型のサイズは%dバイトです。\n",sizeof(long double));

printf("変数aのサイズは%dバイトです。\n",sizeof(a));
printf("式a+bのサイズは%dバイトです。\n",sizeof(a+b));


return 0;
}

でコンパイルするとlong doublのところが10バイトになるのですが
私の持っている参考書の{やさしいC}では8バイト表記になっています。
何度も見直していますが間違いがわかりませんでした。
よろしくお願いします
311310:2007/12/14(金) 22:40:24
動作環境はWinXP
使用コンパイラはCpadというものです。
312デフォルトの名無しさん:2007/12/14(金) 22:41:38
型のサイズは環境によって違う。
long double は 8, 10, 16 バイトの3種類くらい見たことがある。
313310:2007/12/14(金) 22:57:54
>型のサイズは環境によって違う。
long double は 8, 10, 16 バイトの3種類くらい見たことがある。

環境の違いがあるということも頭に入れて勉強を進めたいと思います。
ありがとうございました。
314デフォルトの名無しさん:2007/12/14(金) 23:39:03
GCCとVCくらいしか使わん身としては
10バイトってのは珍しいね
315デフォルトの名無しさん:2007/12/14(金) 23:52:31
コンソールで画面整形というか画面操作というか、正しい呼称はわからないのですが
例えば複数行に渡って
1111111
2222222
3333333
4444444
などと表示した後、それに被せる、ないしは消して同じ位置に出力というのは不可能でしょうか?

自分で調べてみて大量の\r\bを並べてみてもうまくいかなく今は大量の\nでごまかしごまかしやっています
316デフォルトの名無しさん:2007/12/15(土) 00:08:05
そんなあなたに ncurses

でもwin用ってあったけ?
317デフォルトの名無しさん:2007/12/15(土) 00:12:19
調べてみると
利用可能OS
AIX
BeOS
Cygwin
Digital Unix (aka OSF1)
FreeBSD
GNU/Linux
HPUX
IRIX
OS/2
SCO OpenServer
Solaris
SunOS

あばばば、Cygwinか、いやしかし・・
318デフォルトの名無しさん:2007/12/15(土) 00:14:37
PDCursesってのもあるでよ。
319デフォルトの名無しさん:2007/12/15(土) 00:15:09
cursesならある。
VCか何かだったかな・・・。

でもそれよか、そのぐらいならエスケープシーケンス有功にした方が早いかもよ。
320デフォルトの名無しさん:2007/12/15(土) 00:21:51
エスケープシーケンスっていうと自分のところでしか結局動かないことになっちゃうような・・?

PDCurses、なかなかいいページがみつからないのでちょっと試行錯誤してきてみます
321デフォルトの名無しさん:2007/12/15(土) 00:33:06
fseek的なのほしかぁ、ありがとう
322デフォルトの名無しさん:2007/12/15(土) 00:43:58
enum Foo { a = 0, b = 10, };
int main()
{
Foo x = Foo(3);
}

VC71ではこれがコンパイル出来るんだけど、
Foo xが列挙型Fooにない値を取り得るというのは正しい動作?
323デフォルトの名無しさん:2007/12/15(土) 00:46:46
結局windows.hが入ってきましたとさ
324デフォルトの名無しさん:2007/12/15(土) 01:29:51
>>322
xは11になったろ?
325デフォルトの名無しさん:2007/12/15(土) 02:23:22
>>324
いや、int(x) == 3だった。
326デフォルトの名無しさん:2007/12/15(土) 07:52:18
>>314
Intel 系の CPU は浮動小数点を 10 バイトで扱ってるから別に珍しくはない。
Intel 系の環境なら、16 バイトになってても 6 バイトはパディングが入ってるだけ。普通なら。
昔は Turbo C++ とか 10 バイトだったような。

>>315
Win ならコンソール系の関数があるのは知っている。
使った事無いから目的の操作ができるかどうかは知らんが。
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpfileio/html/Toppage_Console.asp
327デフォルトの名無しさん:2007/12/15(土) 10:06:17
>>322
列挙Fooの値の範囲は
下限が0で上限が15になる。
xがその範囲の値ならFoo(x)
はOK。
328デフォルトの名無しさん:2007/12/15(土) 14:17:34
DLLでdosコマンドを呼び出すとき、ms-dosの標準ではないアプリなどですが
全くdos画面を出さずに呼び出すにはどうしたらいいですか? エラーが出るとdos画面が出てきてしまいます
329デフォルトの名無しさん:2007/12/15(土) 14:23:54
>>328
SetStdHandle
330デフォルトの名無しさん:2007/12/15(土) 14:43:49
>>329
サンクス
日本語サイト検索してもヒットが少ないんですけどどうやってその知識を得たんですが? 物知りさんですね
331デフォルトの名無しさん:2007/12/15(土) 16:57:51
ソースの行数とかクラスの数とかを計測したいのですが
何かいいソフトはないでしょうか? Linuxです
332デフォルトの名無しさん:2007/12/15(土) 17:10:37
>>331
行数は wc でいけるでしょ。クラスの数は grep でだいたいいけそうだけど、
doxygen とか使ったほうがいいかもね。
333デフォルトの名無しさん:2007/12/15(土) 17:11:37
最近プログラミングをはじめたのですがWindowsXP+VC2005環境でexeファイルにtxtファイルをドラッグ&ドロップして
fstreamでファイル操作する簡単なプログラムを作ろうと思ったのですが

ifstream file;
file.open(argv[1]);

こんな感じでargv[1]からファイルパスを受け取ろうとしてるのですが
平仮名片仮名がフルパスやファイル名に含まれているとエラーが出て開けません
argv[1]からフルパス受け取ると2バイト文字は扱えないのでしょうか?

ユニコード文字、マルチバイト文字の二つのコンパイルを試しましたが駄目でした。
334デフォルトの名無しさん:2007/12/15(土) 17:17:06
受け取れる
ドラックや入力する時点で空白で分離されているのでは
335デフォルトの名無しさん:2007/12/15(土) 17:18:51
>>332
空行やコメントのみの行を除外したり、
関数の中身のみの行数を数えたり、とか、
いろいろしたいとなると wc だけじゃ辛いかもね。
336デフォルトの名無しさん:2007/12/15(土) 17:19:58
>>333
VC2005 の fstream には日本語ファイル開けないバグがある。
http://www.google.co.jp/search?q=vc2005+fstream+setlocale
337333:2007/12/15(土) 17:23:09
>>334 >>336
回答ありがとうございます。

VC2005特有の症状ってことですかね、検索しても全然わからないで困り果てていたので助かりました。
338331:2007/12/15(土) 17:29:46
>>332>>335
ありがとう。なんとかなった
339デフォルトの名無しさん:2007/12/15(土) 17:30:57
>>327
200でも-1でも0x7fffffffでもint n;Foo(n);でもコンパイル通ったよ。
ちなみにsizeof(Foo) == 4だった。

やっぱ列挙型引数でも範囲外チェックしなければいかんのかね…
340デフォルトの名無しさん:2007/12/15(土) 18:28:20
>>339
>>327で書いたのは規格の話。
コンパイルが通ろうが実行できようが、規格上はは未定義。
つまり0〜15以外の値については実装依存。
341デフォルトの名無しさん:2007/12/15(土) 18:50:13
列挙子って、少なくとも int 以上のサイズになるんじゃなかったっけ? 規格上は。
342デフォルトの名無しさん:2007/12/15(土) 18:51:31
規格の話してるんなら C か C++ か、章番号とか、ちゃんと示してくれ。
343デフォルトの名無しさん:2007/12/15(土) 19:05:39
それを言うなら >340 だって
344デフォルトの名無しさん:2007/12/15(土) 19:07:00
>>343
文盲乙
345デフォルトの名無しさん:2007/12/15(土) 19:09:23
アンカを付けないなら誤解される事は覚悟しなきゃダメだ。
346デフォルトの名無しさん:2007/12/15(土) 19:10:15
まあ>>342は規格の話してるんなら、って明言してるわけだし文盲乙は適当だな
347デフォルトの名無しさん:2007/12/15(土) 19:17:16
そもそも >341 のみに対するレスか >340-341 の両方に対するレスかが不明
348デフォルトの名無しさん:2007/12/15(土) 19:19:51
規格の話って言ってるじゃん

両方というかすべてに対してとるべきだし、本人はとられることに文句は言えないと
349デフォルトの名無しさん:2007/12/15(土) 19:27:34
VC2005でwcoutに出力しています。
全角などが含まれているとそれ以降wcoutが動作しなくなる問題があって
>>333さんの問題と同じ原因かと思うのですが、
特定のスレッドのみC++ロケールを変更するにはどうしたらよいのでしょうか?
  std::locale::global(std::locale(""));
すると全スレッドに適用されてしまうので今回は使えません
350デフォルトの名無しさん:2007/12/15(土) 19:32:13
wcoutを使わずcoutで処理する
351デフォルトの名無しさん:2007/12/15(土) 19:32:50
locale 関連ってホンマ実装がいい加減なコンパイラが多くて困る。
352デフォルトの名無しさん:2007/12/15(土) 19:33:36
外国人が作っているからな゜
353339:2007/12/15(土) 19:35:14
>>340
VCが規格違反しているわけではないってことでいいのかな?
まあどちらにしてもコンパイル通る以上対策はせなあかんということだが…
ともかくサンクス。
354デフォルトの名無しさん:2007/12/15(土) 19:36:24
strがワイド文字のときの出力法


int n=WideCharToMultiByte(CP_ACP, 0, str, -1,NULL,0,NULL,NULL);
char *putf = new char[n+1];
n=WideCharToMultiByte(CP_ACP,0,str,-1,putf,n,NULL,NULL);
cout<<putf<<endl;
355デフォルトの名無しさん:2007/12/15(土) 19:40:56
シャンピーとどいたー\(^o^)/
356デフォルトの名無しさん:2007/12/15(土) 19:41:28
ごばくー/(^o^)\
357349:2007/12/15(土) 19:53:53
cout << "うはwwwおkww";

ありがとうございます orz
358デフォルトの名無しさん:2007/12/15(土) 20:09:37
初心者ですお願いします
何も入力されてないの(エンターーのみ)をデータとして扱うにはどうしたらいいでしょうか?
初歩的ですいません
359デフォルトの名無しさん:2007/12/15(土) 20:15:00
>>358
scanf("%d",・・・); みたいにしてるとか?
360デフォルトの名無しさん:2007/12/15(土) 20:26:53
getch()の戻り値はエンターの時どうなんだろ
361デフォルトの名無しさん:2007/12/15(土) 20:32:50
シャンピーとどいたー\(^o^)/
362デフォルトの名無しさん:2007/12/15(土) 20:33:44
ごばくー/(^o^)\
363デフォルトの名無しさん:2007/12/15(土) 20:41:01
>>359
yes
364デフォルトの名無しさん:2007/12/15(土) 20:45:02
エンターいれっと普通に13返ってくるな
365デフォルトの名無しさん:2007/12/15(土) 20:45:45
>>363
int n;
char line[100];
fgets(line, sizeof(line), stdin);
if (line[0] == '\n') {
  // エンターだけ
}
else {
  sscanf(line, "%d", &n)
}
366デフォルトの名無しさん:2007/12/15(土) 21:14:43
>>365
thanx
367デフォルトの名無しさん:2007/12/15(土) 22:59:08
>>353
規格違反ではないね。実装依存だから何でもアリ。
VCの実装がそういうふうに対応しているという
だけのことだね。
368デフォルトの名無しさん:2007/12/16(日) 05:51:11
質問です。
OSはMacOS X 104.11です。
#include <stdio.h>

int main (int argc, char *argv[]){
fprintf(stdout, "%s¥n", argv[1]);

return;
}
というプログラムを書いたのですが、
いざ実行させるときに、引数に
桜木 花道とやると、桜木 花道
桜木 花道とやると、桜木
しか出力されません。
なんとか回避したいのですが、どのようにすれば良いでしょうか?
369デフォルトの名無しさん:2007/12/16(日) 05:55:25
半角空白は区切られる
あきらめろ
370デフォルトの名無しさん:2007/12/16(日) 05:56:15
argv[2]
も出力する
371デフォルトの名無しさん:2007/12/16(日) 05:59:50
ああ、マジですかorz
それって、OSのバグとかじゃなくて
C言語の文字列の表現の仕様ですかね?
半角を入れると
桜木'¥0' 花道'¥0'
ってなるんでしょうか?
372デフォルトの名無しさん:2007/12/16(日) 06:15:23
そういうことだな
373デフォルトの名無しさん:2007/12/16(日) 06:19:36
うはー、せっかくここまでプログラム書いて、バグつぶししていたときに、
こんな問題に出会うとは!
どうしよう。鬱だ。寝よう。
374デフォルトの名無しさん:2007/12/16(日) 08:13:42
>>368
program "桜木 花道"
375デフォルトの名無しさん:2007/12/16(日) 08:47:55
>>371
C言語の文字列の表現の問題というよりは、コンソールの仕様(コマンドラインに入力した文字列を
半角で引数を区切る)かな。
自分でシェルを作って、引数の区切りを半角文字以外で指示できれば argv[1] = "桜木 花道" も可能だよ。

argv[]にどういう文字列が渡されるかもC言語の規格の範疇だっけ?
376デフォルトの名無しさん:2007/12/16(日) 09:09:48
>>375

JIS規格見てみたが、「文字列へのポインタでなければならない」としか書いてないな。

377375:2007/12/16(日) 09:20:01
>>374に書いてあるように、わざわざ自前シェルを作らなくても
たいていのプラットフォームでは "" で囲めば事足りるね。なぜか忘れてたorz
378デフォルトの名無しさん:2007/12/16(日) 09:40:06
>>373
program "安西 先生"
379デフォルトの名無しさん:2007/12/16(日) 10:06:12
#include <stdio.h>
#include <string.h>

int main (int argc, char *argv[]){
 if (strcmp("安西 先生", argv[1]) == 0) {
  fprintf(stdout, "あきらめたら?\n");
 } else {
  fprintf(stdout, "%s\n", argv[1]);
 }
 return 0; //mainの戻り値をint指定したら戻り値返さないとコンパイルエラー
}
380デフォルトの名無しさん:2007/12/16(日) 10:19:34
今時のコンパイラはエラーになるのか
381デフォルトの名無しさん:2007/12/16(日) 10:23:58
>>373
> うはー、せっかくここまでプログラム書いて、バグつぶししていたときに、
> こんな問題に出会うとは!
> どうしよう。鬱だ。寝よう。
>
>>368 のプログラムでそれは大げさだろ。>>370 がまっとうな解答だと思うが。
argc に情報あるんだし。
382デフォルトの名無しさん:2007/12/16(日) 11:42:47
VS2005MFCですが、OnKeyDown()関数で受け取ったint型のアスキーコードを、
元の文字に変換してstd::string型の変数に代入するにはどうしたらいいですか?
int n = 0x30; //キーボードの0を押下して得られるアスキーコード
nをstring型の0に変換したい
intからCString型の例は結構あちこちで、散見してるんですが・・・・
383デフォルトの名無しさん:2007/12/16(日) 11:57:01
382です自己解決しましたがもっといい方法があったら教えてください
#include <iostream>
#include "stdio.h"
#include <string>

int main()
{
 int n = 0x30;
 std::string str;
 str = ( char )n;
 std::cout << str << std::endl;
 return 0;
}
384デフォルトの名無しさん:2007/12/16(日) 11:58:44
>>382
代入: s.assign(1, static_cast<char>(n))
変換: std::string(1, static_cast<char>(n))
385デフォルトの名無しさん:2007/12/16(日) 12:00:25
str = static_cast<char>(n) が正解だね。これに何か不満でもあるの?
386デフォルトの名無しさん:2007/12/16(日) 12:05:56
>>384
>>385
サンクス
387デフォルトの名無しさん:2007/12/16(日) 16:24:32
C一通りやったつもりでいるし解説も読んだんだけど未だよくわからない、その過程過程が載っているとこでもないだろうか

int main (int argc, char *argv[]){←こいつなんですが

エントリポイントの引数ってことは解説サイト等見たところでもプログラムが実行させる時に渡されるものだというのはわかりました。
また、形態が文字列で、スペースで区切られ、argv[]の要素数がargcに入るのもわかりました。

でもその、プログラムが実行するときに渡される、という意味がさっぱりわかりません
例えばなんらかのソフトウェアをダウンロードし、自身で使うとき(ブラウザでもマルチメディアプレーヤでもなんでも)
.exeのファイルをクリックした際何かが渡っているんでしょうか?
ダブルクリックをして起動するだけですし、だとすると明示的にint argc, char *argv[]と書かなくてもいいことになってしまいそうで

すんごいこんがらがってます

int main (int argc, char *argv[]){でぐぐると解説が結構出るのですがもうさっぱりです
388デフォルトの名無しさん:2007/12/16(日) 16:42:53
>>387
例えばアイコンにファイルをD&Dして起動した場合、
argvにはそのファイルのパスが渡される。

コマンドプロンプトから起動する場合は、
任意のオプションを文字列として渡すことができる。
389デフォルトの名無しさん:2007/12/16(日) 16:48:55
コマンドプロンプトやファイル名を指定して実行では、
hege.exe /x /yのように実行ファイルの後に文字列(コマンドライン引数)を指定できる。
これがCのプログラムでは、mainの引数で受け取れるということ。
Windowsでは関連付け起動、実行ファイルへのドロップ&ドロップ起動などでもコマンドライン引数が使われる。
390デフォルトの名無しさん:2007/12/16(日) 16:59:43
>>388-389
早々にありがとうございます。

つまり先ほど例に出したものだと
WebブラウザならばそいつにhtmlファイルをD&Dするとそのhtmlファイルのパスが渡り、ブラウザが起動し、そのhtmlの内容を表示するとか
マルチメディアプレーヤなら音楽ファイルをD&Dするとその音楽ファイルのパスが渡り、プレーヤが起動し、その音楽が再生されるとか
といった具合でしょうか
391デフォルトの名無しさん:2007/12/16(日) 17:14:11
そういうこと。
ただし、ウインドウへのD&Dは全く別の仕組みなんで混同しないでね。
392デフォルトの名無しさん:2007/12/16(日) 17:50:31
UNIX使うと良くわかる。
#include <stdio.h>
int main (int argc, char *argv[]){
int i;
printf("argc = %d¥n",argc);
for(i = 0; i < argc;i++)
printf("argv[%d]=%s¥n",i,argv[i]);
}
exit(0);
}

ちなみにここ最近でargv[]で何が出来ないこれが出来ないと質問してるのは俺!
みんなありがとう!
393デフォルトの名無しさん:2007/12/16(日) 17:53:31
returnいらないの?exitの定義知らないんであれだけど
394デフォルトの名無しさん:2007/12/16(日) 18:04:39
exit()使ってるのにstdlib.hをインクルードしてないな。
ってか普通は return 0; だろ。
395デフォルトの名無しさん:2007/12/16(日) 18:06:46
つかエスケープ文字が全角だったり
396デフォルトの名無しさん:2007/12/16(日) 19:49:45
C++の入門書をやり終えました。
ですがいまいち、クラスの利点がわかりません。
部品化して便利になるというイメージはあるのですが。
まだC言語っぽい書き方をしてしまいます(C++っぽい書き方もいまいちわかりませんが)。
クラスの利点やC++の書き方について書かれた書籍ってありますか?
397デフォルトの名無しさん:2007/12/16(日) 20:14:03
>>396
>クラスの利点がわかりません。
まずは標準ライブラリを使いこなすところから始めたら?
そうしてクラスの利点が分かれば、自分で作ろうという気にもなるだろう
398デフォルトの名無しさん:2007/12/16(日) 20:14:27
>>396
適切な本を薦められなくて申し訳ないけど、まずは本で勉強するだけでなく
実際に書いてみて試行錯誤することが大切だと思うよ。

基本文法さえ分かったなら、あとはとりあえず自分であれこれ書いてみて、
まずいクラス設計をして使いにくいと感じたり、エラーが起きて原因を解決したり、
こういうことをしたいけどどう書いていいか分からないと悩んだり、
そういうことを経験したほうが深く理解できるよ。

そのうち、こういうことをするとうまくまとめて書きやすい、分かりやすい、などの利点が見えてくるはず。

本に載っている「正しいやり方」だけを学んでそれをなぞるだけだと、
理解したつもりになっていて実は分かっていない、ということになりがち。

仕事なら早く身につける必要があるだろうけど、学生や趣味でやるなら時間をかけてもいいんじゃない?
399デフォルトの名無しさん:2007/12/16(日) 20:28:34
クラスの勉強と思って簡単なゲームを作ってみたんだけれども、クラス間のやり取りが面倒すぎてやめた

あるAクラス内の配列をBクラスのメンバ関数から参照したいとき、とか
friendってのもあったがそんなこというと全部のクラスにfriendつける必要でるし、
クラスのうまい利用の仕方とか載ってる本探すべきっぽいなぁ
400デフォルトの名無しさん:2007/12/16(日) 20:43:17
C++でnewしたヤツをdeleteする時、
newした時の型のままのポインタをdeleteしないとダメ?

キャストされて別の型になってるポインタをdeleteしても
大丈夫?
401デフォルトの名無しさん:2007/12/16(日) 20:44:45
>>400
virtual
402デフォルトの名無しさん:2007/12/16(日) 20:57:41
>>400
new したときのクラスの基底クラスにキャストされてるポインタは、その基底クラスが
virtual なデストラクタを持っていれば delete できる。
403デフォルトの名無しさん:2007/12/17(月) 00:14:23
>>399
何がやりたかったのかわからんが、多分それはクラス設計ミス。
404デフォルトの名無しさん:2007/12/17(月) 00:16:01
>>399
参照するだけなら、クラスAの配列の要素にアクセスするメンバ関数をinlineで作るとか
405デフォルトの名無しさん:2007/12/17(月) 03:59:03
クラスの設計って難しいよねぇ。
PDO(PHPね)とか使うと、オブジェクト指向すげぇ!って感動するけれど、
自分でいざ、クラス設計してねって言われると、Orz。
何かコツがあるのかしらん?
Cのライブラリでも、構造体使ってうまくオブジェクト指向っぽいもの?を実現しているのを見ると、
感激する!
406デフォルトの名無しさん:2007/12/17(月) 06:07:46
もっとレベルの高い環境に触れないとわからんよ
407399:2007/12/17(月) 09:21:57
クラス設計、やっぱそういう本探してこよう・・

一応やってたのは、配列にフィールドというかマップのフラグみたいなものを格納したいた。
配列の要素内には数値が入っていて、それによってその1マスがどういう状態なのか示すように。

で、よくわからずクラスをマップごとに分けてたんだ、例えばドラクエでいうと宿屋の中と町の中が別クラス
そんな状態で宿屋で休むと町の様子が変化したりetcをやろうとして爆発した
408デフォルトの名無しさん:2007/12/17(月) 11:46:43
>>396
個人的には398に同意だけど、初学者向けの本であれば
「ゼロから学ぶ C++」(日経BP)って本に、CからC++への
移行時の要点ということで、クラスや継承を使うと便利な
ケースと使わない方がいいケースとか、is-a、has-a関係
とかの基本的な話が簡潔に載ってた気がするので、
立ち読みしてみてもいいかも。
ただかなり平易なので、ネットで効率よく検索できれば
不必要(または物足りない)かもしれないけど。
409デフォルトの名無しさん:2007/12/17(月) 11:47:57
長文失礼、ちょっとC++プログラムのコーディングでいい方法があれば誰か教えて下さい。

今、簡単なライブラリ的なクラスを作りました。それは継承されることを前提として
います。仮にそれをKihonとしておきます。

今、Kihonの派生クラスHaseiを作りました。HaseiからKihonを使う方法ですがまず、Kihonの
メンバ関数を通じて必要なパラメータ(privateな変数)を設定します。次にHaseiに
double func(double x)なメンバ関数を定義します。これはKihonクラスでvirtual関数として
宣言されているものです。その後、Kihonのrunを実行するとHaseiのfuncが利用されて
処理が行われるというものです。一回のrunでfuncは何度も呼ばれます。

問題なのはHaseiで異なる二つの処理をKihonのrunにさせるにはどうしたらいいものかということ
です。つまり、異なる相異なる2関数に対してKihonのrunを実行するにはどうすればいいのかと
いうことです。しかも後に実行されるrunが前に実行されたrunの結果を使う必要があります。

初心者なりに考えた方法ですと・・・
0, Haseiのオブジェクトh0を作る。
1, Haseiのfunc関数を作る。この関数内で別のクラス、__Haseiのオブジェクトh1を作る。__Haseiは
Kihonを継承している。
2, 最初のrunで必要なメンバ関数funcを__Haseiで定義する。
3, Haseiのfunc関数からh1.runとして最初のrunを行う。
4, h0.runとして二度目のrunを行う。
(メンバ変数の設定に関しては説明略)。

実際、この方法だととりあえずは動作するのですが次のような問題点があります。
・__HaseiからHaseiのプライベートメンバにアクセスできない。(friendでは次項が解決不能…)
・実はHasei自体もライブラリ的に実装を隠蔽してしまいたいため、__Haseiのfuncを変更
出来るようにしたい。(ちなみにHaseiのfuncは固定。)

多重継承をうまく使うと解決できそうにも思えるのですが賢い、実装方法はないでしょうか。
お力をいただけると幸いです。根本的にKihonの設計に対する指摘でもお願いします。
410デフォルトの名無しさん:2007/12/17(月) 11:59:51
>>409
いろいろわからん。コード書け。あと __ は使うな。
411デフォルトの名無しさん:2007/12/17(月) 12:25:04
>>409
適当に思い浮かんだ単語

スレッド
static メンバー
boost
412デフォルトの名無しさん:2007/12/17(月) 12:54:23
「初心者なりに考えた方法ですと・・・」の部分、ただしコードを全部書くとさらに長大になってしまうので
掻い摘んで。(409のHasei→Hasei0、__Hasei→Hasei1とした)

class Kihon{
virtual double func(double x){return 0.0;} /* =0としてしまってもよい */
public:
double run()
{
... /* runの実装部分 */
for (j = 1; j <= n; j++)
func (x); /* funcは何度も呼ばれる */
return ret; /* 計算結果を返す */
}
};

class Hasei1: public Kihon
{
double y;
double func(double x){return x*sin(x+y);} /* 計算対象 */
public:
void set_y(double y){this->y = y;}
};
413デフォルトの名無しさん:2007/12/17(月) 12:54:54
class Hasei0: public Kihon
{
double func(double x){
Hasei1 h1;
h1.set_y(x);
... /* h1のprivate変数を設定など */
return 1.0 - h1.run();
}
};

int main()
{
Hasei0 h0;
.....
cout << h0.run();
.....
}

例えばx*sin(x+y)の多重積分を想定している感じです。実際にはこれ以外にもたくさんありますが。
本来ですと計算対象は(例えば別のクラスを宣言することや、関数へのポインタでもいいですが)自由に変更出来ること、
そもそもHasei0も1も実装は隠蔽してしまいたい、計算対象はパラメータを含んでいるので本当はクラスとして実装
したいというのがありますが恐らく、これでは無理でしょうからいいアイディアはあるでしょうかという意味です。
よろしくお願いします。
414デフォルトの名無しさん:2007/12/17(月) 13:01:11
boostって知りませんでした。ちょっと調べてみます。
415デフォルトの名無しさん:2007/12/17(月) 13:01:37
>>409
多重継承だけは使うな。
あとでワケわかんなくなる。
416デフォルトの名無しさん:2007/12/17(月) 15:15:36
>>413
ようわからんがtemplateとかboost::bind(std::bind1st, std::bind2nd)使えばよさそうな気がする。ファンクタも調べた方がいいかも。
試しに同じような事するの書いてみた。

template<typename Func> double kihon(Func func)
{
 for (j = 1; j <= n; j++)
  func(x);
 return ret;
}
double hasei1(double x, double y) { return return x*sin(x+y); }
double hasei0(double x) { return 1.0 - kihon(boost::bind(&hasei1, _1, x)); }

int main()
{
 kihon(&hasei0);
}
417デフォルトの名無しさん:2007/12/17(月) 16:17:11
>>416
本当にどうもありがとうございます。まだ、自分のプログラムでは解決していませんが言わんとしていることが
よくわかります。たしかにテンプレートを関数のポインターに使えば解決しそうです。C++は初めてなので
参考になります。重ね重ね、ありがとうございます。
418デフォルトの名無しさん:2007/12/17(月) 18:05:37
あるライブラリ(A)をラップした、全く同一のインターフェイスが使えるDLL(B)を作りたいのです。
つまり、DLL(B)はライブラリ(A)のすべての関数をエクスポートします。

これを実現するために(とりあえずwin32環境限定の話)
ライブラリ(A)をDLL(B)にスタティックリンクさせ、ライブラリ(A)の各関数宣言に
__declspec(dllexport)をつけたファイルをDLL(B)からインクルードさせたのですが、
どうもこれでは上手くいかないようで、DLL(B)からライブラリ(A)の関数がエクスポートされていませんでした。
そこで質問なのですが、DLLからライブラリを直接エクスポートすることは可能なのでしょうか?
もし可能ならやり方を教えていただけるとありがたいです。

(ライブラリ(A)をDLLにするという方法はとりあえず却下でお願いします。
今は別の方法としてライブラリ(A)のソースファイルを直接DLL(B)に追加しています)
419デフォルトの名無しさん:2007/12/17(月) 18:48:06
VC++2005StandardでMFC使おうとしてるんですが
ウェブで調べてもVC6.0系の使い方ばかりで全然分かりません
2005のMFCの入門的なサイトってないですか?
できればopengl を絡めたところがいいんですが
420デフォルトの名無しさん:2007/12/17(月) 18:55:07
MFCはマイクロソフトファンダメンタルクラスだろ? バージョンによって言語(クラス)の使い方が変わるかよ
6用でも関係ないだろ
421デフォルトの名無しさん:2007/12/17(月) 19:05:27
クラスウィザードとかを使うのに、IDEのどこのボタン押して、どの選択肢を選べばいいのか?
・・・ってのを知りたいのじゃね?
422デフォルトの名無しさん:2007/12/17(月) 19:53:19
そういやVC2008EEが来るな
423デフォルトの名無しさん:2007/12/17(月) 20:02:56
VC2005でもういいです
424デフォルトの名無しさん:2007/12/17(月) 21:09:24
Hoge hoge1;
Hoge *hoge2 = new Hoge();

の違いがよくわからないのですが
newした場合、普通に宣言するより良いことがあったりしますか?
425デフォルトの名無しさん:2007/12/17(月) 21:15:06
>>424
絵に描いたような初心者か、釣りか、のどっちかだな
426デフォルトの名無しさん:2007/12/17(月) 21:17:47
ヒープ領域は量が多い (ハードディスクもメモリ代わりになる)
自分で変数の領域を開放できる
ヒープに確保すれば、高速な動作が必要な変数をスタック領域、レジスタ領域に割り当てられやすくなる
427デフォルトの名無しさん:2007/12/17(月) 21:19:40
大量にメモリ食うやつは全部newとかにしておけばよい 
実メモリを多く空けておくことが大事
428デフォルトの名無しさん:2007/12/17(月) 21:21:41
STL 頼ってるから最近 new 使ってないな…
429デフォルトの名無しさん:2007/12/17(月) 21:27:03
メモリどうこうより、初心者には寿命の違いを説明した方がいいのではなかろうか
430デフォルトの名無しさん:2007/12/17(月) 21:27:30
調べてきたけど、スタック領域はコンパイル時に決定されるらしい
メモリ食うやつは、動的に確保しないとプログラム終了までスタック領域として確保されっぱなしってことだ
他のプログラムや自分のプログラム内でもメモリ確保が難しくなるということだ
431デフォルトの名無しさん:2007/12/17(月) 21:31:08
30バイト以上の確保は動的確保にしようぜ newやvectorやstringを使おう
432デフォルトの名無しさん:2007/12/17(月) 21:31:23
>>424
Hoge hoge1; 
の場合、hoge1の寿命がその関数(あるいはブロック)に縛られる。
関数を抜けた後もhoge1を維持することは出来ないし、関数を抜ける前にhoge1を消すことも出来ない。

Hoge *hoge2 = new Hoge();
の場合、hoge2の寿命は自分でコントロールできる。
関数を抜けようが抜けなかろうが、deleteするまでは消えないし、deleteすればいつでも消せる。
433デフォルトの名無しさん:2007/12/17(月) 21:35:35
配列は動的確保、自動開放するvectorがあるけど 変数は動的確保、自動開放する命令ってないよね?
Hogeクラスが5Mとか使うとは想像していないのだろうか?
434デフォルトの名無しさん:2007/12/17(月) 21:36:37
auto_ptrのことか?ちょっと違うか?
435デフォルトの名無しさん:2007/12/17(月) 21:57:06
class Hoge{ char x[10000]; };

auto_ptr< Hoge > hog(new Hoge);

こうやって使うのか 勉強になった でもアクセスが*付けないと駄目で不便だよね
436デフォルトの名無しさん:2007/12/17(月) 22:02:26
そんなあなたに
boost::scoped_array
boost::shared_array
437424:2007/12/17(月) 22:06:21
しょうもない質問に答えてくれてありがとうございます

とりあえず普通に宣言しておけば大丈夫だ
なんて思ってた自分が馬鹿でした・・・
しっかりdeleteする必要がありますが、
なるべく動的確保にしておいた方が良いんですね

もうすこし自分でも調べてみようと思います
ありがとうございました
438デフォルトの名無しさん:2007/12/17(月) 22:10:48
int型やchar型やdouble型の変数を動的確保するのは止めよう
あとループの変数も動的確保するのは止めよう
判断基準は、メモリを消費するかどうかだろう
439!=438:2007/12/17(月) 22:27:09
>>438
判断基準に「(ループ内など)速度が必要か否か」も加えるといいかも。
10万回、100万回のループになると毎回newするのも…

まぁ、その場合は最初にnewして使いまわせ、って話になるわけだが。
440デフォルトの名無しさん:2007/12/17(月) 22:30:32
ループ内で毎回な別領域の確保が必要な場合はあるけどね・・・
流用できるなら内部でしたらだめだな
441デフォルトの名無しさん:2007/12/17(月) 22:38:19
基本的にループの変数は直前に確保した方が良いのかなあ
以前から使っている変数だと、レジスタにのっている可能性は低いし、ループで使うからと言って移動はしないよね?
for( int )だと最適化されそう
442デフォルトの名無しさん:2007/12/17(月) 23:12:40
>>441
変数の用途が明確な方が最適化対象になりやすい。
443デフォルトの名無しさん:2007/12/17(月) 23:42:33
別のスレッドで返答がもらえなかったのでこちらで。

なぜcallocは2引数関数なのでしょうか。ゼロクリアするだけならmallocのように1引数でも可能だとおもいます。
2引数のほうが最適化しやすいからだときいたことがありますが、具体的にはどのような最適化が考えられるでしょうか?
444デフォルトの名無しさん:2007/12/17(月) 23:51:31
callocのcて何て意味?
445デフォルトの名無しさん:2007/12/17(月) 23:52:34
>>443
例えば80486以降のインテル系CPUはSTOSB STOSW STOSDという三つの命令があり、
それぞれバイト、ワード、ダブルバイト単位でレジスタから転送を行う。
他のCPUでもサイズに応じた専用のインストラクションを持っていることはよくある。
そのどれを使うかとかいったヒントになる可能性があると思う。
446デフォルトの名無しさん:2007/12/17(月) 23:53:00
clear?
447445:2007/12/17(月) 23:53:15
ダブルバイトってなんだよ。ダブルワードの間違いな。
448デフォルトの名無しさん:2007/12/17(月) 23:56:16
>>445
なるほど。ありがとうございます。
しかしその程度なら、要求されたサイズの下位数ビットを見れば判断できる気もするが・・・。
449デフォルトの名無しさん:2007/12/18(火) 00:05:43
>>443

callocは一応「配列を確保する関数」だからじゃない?

最適化に関しては↓がヒントになるかも。
http://www.bohyoh.com/CandCPP/FAQ/FAQ00096.html
450デフォルトの名無しさん:2007/12/18(火) 00:09:54
>>449
最適化については何も解説していないような・・・
451デフォルトの名無しさん:2007/12/18(火) 01:03:49
>>420
ファンダメンタルかよ
452デフォルトの名無しさん:2007/12/18(火) 02:16:52
signed型へ<<や>>演算したときの結果の符号ビットや符号拡張有無って
規格で決まっていますか?
453デフォルトの名無しさん:2007/12/18(火) 02:32:06
>>452 いいえ。
454デフォルトの名無しさん:2007/12/18(火) 09:57:37
C++ 初心者です。C++ でこんなコードを見かけたのですが、 struct S { S( int x ) : x_( x ) {} int x() { return x_; } int x_; }; 2 行目の意味がわかりません。とくに x_( x ) {} の部分が頭の中でパーズできないんですが、これは何を定義しているの?
455デフォルトの名無しさん:2007/12/18(火) 09:59:38
: x_( x ) だな
x_をxで初期化している

コンストラクタ初期化子とかでぐぐると幸せになるかも
456デフォルトの名無しさん:2007/12/18(火) 10:37:10
この書き方で「2行目の意味が」ってのも凄いな
ナチュラルな喧嘩の売り方するなぁと感心したw
457デフォルトの名無しさん:2007/12/18(火) 10:42:22
コンストラクタの初期化子で配列の初期化ってできる?
458デフォルトの名無しさん:2007/12/18(火) 11:07:46
>>457
組み込み配列についてはできません。 std::vector ならできます。
459デフォルトの名無しさん:2007/12/18(火) 11:26:54
>>458
ありがとう
じゃあコンストラクタ内で普通に代入するか


もう一つ質問
固定長配列にvectorを使う意味ってある?
あるとしたら何?
460デフォルトの名無しさん:2007/12/18(火) 11:34:14
>>459
サイズの管理も一緒にしてくれる。
未来永劫何があってもサイズが変わらない場合を除けば、この利点は小さくない。
461デフォルトの名無しさん:2007/12/18(火) 11:35:23
>>459
多くの実装では assert() などでデバッグ用の範囲チェックが入っている。
begin(), end() があるので標準アルゴリズムが使いやすい。
要素の比較に基づく比較演算子が定義されている。
安全で軽い swap() が使える。
462デフォルトの名無しさん:2007/12/18(火) 12:02:09
C言語でvoid型の関数を任意の場所で終了させるにはどうすればいいのでしょうか?
何か値を返せる関数ならreturnすればいいと思うのですが
voidなのでreturnをすると怒られてしまいました
463デフォルトの名無しさん:2007/12/18(火) 12:04:39
return;
464デフォルトの名無しさん:2007/12/18(火) 12:05:52
>>462
void func(){
return;
}
465デフォルトの名無しさん:2007/12/18(火) 12:09:42
>>462
void func()
{
...;
goto end;
...;
end:
}
or
void func()
{
...;
if (0) {
...;
}
}
466デフォルトの名無しさん:2007/12/18(火) 12:15:41
>>460-461
サンクス
467デフォルトの名無しさん:2007/12/18(火) 12:16:11
ああ、なるほど
値さえ返さなきゃ怒られないんですね
0を返しておりました
468デフォルトの名無しさん:2007/12/18(火) 12:20:25
>>460
static const int foo[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
みたいな固定長配列なら、sizeof(foo) / sizeof(* foo)でsize()相当だと思うが、それでもメリットだと?
469デフォルトの名無しさん:2007/12/18(火) 12:23:26
STLのコンテナとして使える
470デフォルトの名無しさん:2007/12/18(火) 12:26:16
boost::array
471デフォルトの名無しさん:2007/12/18(火) 12:50:19
じゃあそれポートして使いまする
472デフォルトの名無しさん:2007/12/18(火) 12:51:25
固定長配列テンプレートはいいよね
余分な領域取らないし
473デフォルトの名無しさん:2007/12/18(火) 12:59:15
boost::checked_deleteってそんなに役に立つか?
474デフォルトの名無しさん:2007/12/18(火) 13:03:58
初心者でも何か作れる物はないだろうか?
475デフォルトの名無しさん:2007/12/18(火) 13:05:18
>>474
アドレス帳
ノベルゲーム
etc
476デフォルトの名無しさん:2007/12/18(火) 13:07:47
>>475
ノベルゲームを作れるお勧めのwindows上で動く
アプリとかありませんかね。
477デフォルトの名無しさん:2007/12/18(火) 13:20:59
C言語でいいじゃん
printfとscanfで作れるぞ
478デフォルトの名無しさん:2007/12/18(火) 13:25:14
おまえらって何が目的でC言語使ってんの?
479デフォルトの名無しさん:2007/12/18(火) 13:29:21
>>473
なんで役に立たないと思うの?
あと、 boost スレに行ったほうがいいかもね。
480デフォルトの名無しさん:2007/12/18(火) 13:45:48
>>478
プログラミングするのが楽しいから
481デフォルトの名無しさん:2007/12/18(火) 15:18:50
まともに仕事で使おうとすると、
boostなんてフリーのライブラリは、
使用許可がおりない件について

誰が責任もてるの、って怒られるぜよ
482デフォルトの名無しさん:2007/12/18(火) 15:34:04
boostからポートした自作ライブラリを使うんだよ
483デフォルトの名無しさん:2007/12/18(火) 15:36:43
それを言い出すと、gccや下手すればLinuxそのものも使えなくなる罠。
484デフォルトの名無しさん:2007/12/18(火) 15:41:40
>>483
プロジェクトの種類や客の流儀とかなんとかで、
そのとおりな制約がつく仕事も実際、けっこうある。

・・・いや、あった。もう地獄から永久に開放されて
こんな時間に2chしてる俺にはどうでもいい話
485デフォルトの名無しさん:2007/12/18(火) 15:46:46
参照のつかいかたがよくわからないので教えてください。POCO::Loggerというライブラリをつかっています。
hasがLoggerのポインタを返して、getが参照を返します。createで作ります。
POCO::Logger* buff = POCO::Logger::has("hoge");
if (buff == NULL) {
  // 無いから作る
  POCO::Logger& logger = POCO::Logger::create("hoge");
  logger.information("@@@@@");
} else {
  // あるから使う
  POCO:Logger& logger = POCO::Logger:get("hoge");
  logger.information("@@@@@");
}
// @ほんとはここでlogger.information("@@@@@")にして、↑の@@@@@出力部分は消して共通化したい
というコードは動くんですが、最終行で出力する処理を入れて
共通化したいんですけど、参照ってポインタみたいにいれないでおくとかができないと思っています。
このような実装はみなさんどのようにされていますか?
486デフォルトの名無しさん:2007/12/18(火) 15:51:11
>>481
フリーとは言っても誰が作ってると思う?
使用許可を出さない奴本人に
『おまえが判断できる程のレベルかよ?』
って言い返す。
487デフォルトの名無しさん:2007/12/18(火) 15:52:29
>>479
不完全型のチェックにしか使えないよね。
全く役に立たないとは思わないけど、あえて使う意味はあるのかと。
488デフォルトの名無しさん:2007/12/18(火) 16:13:45
>>485
POCO::Logger & logger = buff == NULL ? POCO::Logger::create() : POCO::Logger::get();
logger.information();
489デフォルトの名無しさん:2007/12/18(火) 16:22:40
>>488
ぉぉすばらしい。ありがとうございます。そのような発想はありませんでした。
ちょっとトリッキーな気がするのですが、C++で参照を使うときは常識ですか?
490デフォルトの名無しさん:2007/12/18(火) 16:45:28
C++と言わず参照と言わず、割と使うけど。
Cでもこんなのとか。
FILE * fp = fileName == NULL ? stdin : fopen(fileName, "r");
491デフォルトの名無しさん:2007/12/18(火) 17:52:49
>>490 の
FILE * fp = fileName == NULL ? stdin : fopen(fileName, "r");
って どのように分解(解釈)されるの?
492デフォルトの名無しさん:2007/12/18(火) 17:57:10
>>491
fileNameがNULLだったらstdin、そうでなければfileNameをfopen()した結果をfpに代入。
493デフォルトの名無しさん:2007/12/18(火) 18:05:23
>>492
有難うございます。日本語ではそうなるのですか。
すみません、この1行をC言語に1行ごと(ステップ)に分解して書いたらどうなるのですか?
494デフォルトの名無しさん:2007/12/18(火) 18:11:18
FILE *fp ;
if( fileName == NULL )
{
fp = stdin ;
}
else
{
fp = fopen(fileName,"r");
}
495デフォルトの名無しさん:2007/12/18(火) 18:12:19
まあ、参照は初期化必須だから、>>488を分割して書く事は出来ないがな。
496デフォルトの名無しさん:2007/12/18(火) 18:12:26
FILE * fp =
fileName == NULL
? stdin
: fopen(fileName, "r");
497デフォルトの名無しさん:2007/12/18(火) 18:13:39
boost::optionalをパクればいい
498デフォルトの名無しさん:2007/12/18(火) 18:23:44
>>494
有難うございました
そうなるのですか、なんか>>490だと読みにくいですね

>>495
となると、参照のときは読みにくい構文使うしかないということですね
499デフォルトの名無しさん:2007/12/18(火) 18:56:32
>>498
俺が三項演算子を使うときは、条件部を必ず(単項式であっても)括弧で括ってる。
>>490の例の場合は、
FILE * fp = (fileName == NULL) ? stdin : fopen(fileName, "r");
まぁ、この辺は各々のスタイルの問題。

読みにくさについては内容の複雑さによりけりで、たとえば
int n = (hoge) ? 10 : 20;
程度の内容をif-else文で書くと、俺の感覚だと「無駄に物々しい」感じがして、逆にわかりにくいかな。
500デフォルトの名無しさん:2007/12/18(火) 19:12:34
三項演算子は禁止、
って、けっこうコーディングルールにされることが多い
501デフォルトの名無しさん:2007/12/18(火) 19:18:45
生粋の三項演算子erな漏れには辛い職場だ
502デフォルトの名無しさん:2007/12/18(火) 19:29:24
>>498
こんなんでもいんじゃね?

POCO::Logger* buff = POCO::Logger::has("hoge"), *logger;
if (buff == NULL) {
  // 無いから作る
  logger = &POCO::Logger::create("hoge");
} else {
  // あるから使う
  logger = &POCO::Logger:get("hoge");
}
logger->information("@@@@@");

というかhas()が返すアドレスの実体はgetで得られるインスタンスとは別物なん?
同一ならそのまま使えるだろうけど
503デフォルトの名無しさん:2007/12/18(火) 19:29:27
ff
504デフォルトの名無しさん:2007/12/18(火) 19:36:13
例外処理のthrowのメリットは?
普通に関数にとばすのはだめなのかい
505デフォルトの名無しさん:2007/12/18(火) 20:21:22
普通に関数に飛ばすとは、どういうやり方?
throwは関数の呼び出し元の呼び出し元の呼び出し元の・・・にずーっと遡っていけるところに意味がある
506デフォルトの名無しさん:2007/12/18(火) 20:23:41
昔のCのように、abort()を呼ぶとかそういう話?
507デフォルトの名無しさん:2007/12/18(火) 20:53:58
>>504の考える例外的な事態というのは、その場でプログラムを終了するタイプ「のみ」なんじゃないかな。
確かに、すぐ終了するのであれば、例外処理の存在意義である「簡潔かつ強力に特定の段取りまで戻る」
能力は要らないからね。

>>504
でも、例外発生後もまだプログラムを続行させる場合、「関数に飛ばして」例外処理を実現しようとすると、
結構面倒というか、入り組んでしまうことがある。
f1()から呼んだf2()から呼んだf3()から呼んだf4()の中で何か「例外的な状態」になった場合、f4()内に
if (失敗したという証拠) {
  例外処理();
  return 失敗したという合図;
}
を書くだけでなく、場合によってはf2()やf3()も、その「合図」がちゃんとf1()のもとへ帰っていけるよう、
バケツリレーのような構造の実現に協力しなくちゃならなくなったりするわけだ。
その例外は、自分とは直接関係ないことなのにね。
508デフォルトの名無しさん:2007/12/18(火) 21:01:10
ただやっぱり、Joelもいってるように、例外はきちんと
ハンドリング出来ているかが、コード面を眺めたくらいでは
すぐには判らないという弱点があるね。

戻り値ベース:
fp = fopen(filename, "w");
fwrite( var, 1,len,fp );     //ププ。エラー処理忘れやがんの。

例外ベース:
fs = new FileStream( filename, WRITE );
fs.Write( var ); //ファイル無かったら例外投げるから、
                   //呼ぶ側で対処しろと言うことかな〜?
509デフォルトの名無しさん:2007/12/18(火) 21:07:30
>>420
インターフェースが結構違うのでわからないんです

参考に見た6.0の解説を上げてみると
〜〜〜
左フレームのFileメタブをクリックして、Source FileのGlSampleView.cppファイルを開く
右のフレームに現れるソースファイル上で、右クリック。表示メニューのClassWizardを選択する←この時点で分からない
ここでViewクラスのメッセージ処理をカスタマイズする。
メッセージ欄から「WM_CREATE」を選択して関数追加ボタンをクリックする。
するとOnCreate()関数がGlSampleView.cppファイルに自動的に追加される。
〜〜〜

クラスウィザードのようなものは別の方法で見つけたんですがすると4行目のWM_CREATEが無い
といったように前に進みません
510339:2007/12/18(火) 22:32:05
1>index.obj : error LNK2019: 未解決の外部シンボル "public: __thiscall std::ios_base::Init::Init(void)" (??0Init@ios_base@std@@QAE@XZ) が
関数 "void __cdecl std::`dynamic initializer for '_Ios_init''(void)" (??__E_Ios_init@std@@YAXXZ) で参照されました。
1>index.obj : error LNK2019: 未解決の外部シンボル "public: __thiscall std::ios_base::Init::~Init(void)" (??1Init@ios_base@std@@QAE@XZ) が
関数 "void __cdecl std::`dynamic atexit destructor for '_Ios_init''(void)" (??__F_Ios_init@std@@YAXXZ) で参照されました。
1>D:\ta\c\works\online\Debug\dos.exe : fatal error LNK1120: 外部参照 2 が未解決です。


===index.cpp====
#include <iostream>

int main() {
std::cout << "Kitty on your lap";
return 0;
}
===============

/O2 /D "_MBCS" /FD /EHsc /MT /Fo"Debug\\" /Fd"Debug\vc80.pdb" /nologo /c /TP /errorReport:prompt

/OUT:"D:\ta\c\works\online\Debug\dos.exe" /NOLOGO /MANIFEST /MANIFESTFILE:"Debug\dos.exe.intermediate.manifest"
/SUBSYSTEM:CONSOLE /ERRORREPORT:PROMPT kernel32.lib


リンクがうまくいってないってことかな?
ちゃんとライブラリフォルダをC:\Program Files\Microsoft Platform SDK\Libに設定しているのだが・・。
511デフォルトの名無しさん:2007/12/18(火) 23:00:25
たまに見かけるけとKitty on your lapて何なん?
調べてみたらゲームみたいだけどあれが元ネタ?
512デフォルトの名無しさん:2007/12/18(火) 23:35:44
>>510

iostreamってSDKじゃないだろ。
513デフォルトの名無しさん:2007/12/18(火) 23:36:20
猫でも分かるの人がサンプル文字列に使ってたな。
さらなる元ネタはよくわからないが。
514デフォルトの名無しさん:2007/12/19(水) 00:07:13
古いギャルゲーのタイトル
515デフォルトの名無しさん:2007/12/19(水) 01:29:06
問題分が
以下の手順を従い、経路選択アルゴリズムを評価せよ。

通信の発生:ランダムに送受信ノードを決定する。
通信の確定:与えられた送受信ノードの経路を決定し、その経路上のリンクの空き容量を1Mbpsだけ減少させる。
         ただし、空き容量のないリンクが存在する場合、この通信は確立しなかったものとして、何も行わない。
通信の終了:n回前に発生した通信の経路上の空き容量を1Mbpsだけ増加させる。ただし、その通信が確立していなかった場合には何も行わない。
評価:10000回の通信を発生させ、そのうちで確立できなかった通信の割合を求める。
試行の繰り返し:nの値を変えながら、上記の試行を繰り返す


プログラム自体(http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5554.txt)は拾ってこれたのですが
どこにグラフを入力していいのか分からなく困っています。
ちなみにグラフは以下に書きます
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5555.txt
左と中央がノードで右がそれをつなぐリンクの容量です。
516デフォルトの名無しさん:2007/12/19(水) 01:38:58
宿題スレへ
517デフォルトの名無しさん:2007/12/19(水) 02:08:39
>>508
戻り値だってコード面見てエラー処理の抜けは気づきにくい。

Joel とかが言ってるのは、エラー処理に問題のあるコードと
適切なコードとの違いが微妙すぎるって言う問題。まぁこっちの問題も
一緒といえば一緒なんだけどな。処理の順番とか。
518デフォルトの名無しさん:2007/12/19(水) 09:00:37
VC++ 2005での関数インライン化について教えてください。
通常、インライン関数は定義をヘッダに書かないとコンパイル
できませんが、/LTCGオプションでリンク時のモジュール間
インラインを指定すると以下のようなコードがビルド可能
だと思ったのですが、実際はリンクエラーとなります。
もちろんinlineキーワードを外すとビルドできます。
/LTCGを指定してもinlineキーワードを付けるとインライン
対象関数の定義は呼び出しソースファイルから可視でなくて
はいけないのでしょうか?/LTCGのリンク時モジュール間
インラインの正しい使用法を教えてください。

//aaa.hヘッダーファイル
double MySquare(double);

//aaa.cppソースファイル
inline double MySquare(double d)
{
 return d * d;
}

//bbb.cppソースファイル
#include "aaa.h"

int main()
{
 double d = MySqiare(3.14);
}
519デフォルトの名無しさん:2007/12/19(水) 09:15:43
よく空間的局所性の高いコードは速いとかいいますけど、最近のx86で
あるアドレスの値を読み込むと、その先何バイト位がキャッシュに載るんですか?
520デフォルトの名無しさん:2007/12/19(水) 09:46:40
VC8(VC2005)で

template<class T>
std::list<T>::iterator MoveListItr(std::list<T> *pLst)
〜略〜

というSTLのイテレータを返すテンプレートが、イテレータの記述部分
(std::list<T>::iterator)で「型ではない」とエラーが出ます。

VC7まではこれで通ったのですが、文法に問題があるのでしょうか?
それともVCの問題なのでしょうか?
521デフォルトの名無しさん:2007/12/19(水) 09:53:01
template<class T>
      typename std::list<T>::iterator MoveListItr(std::list<T> *pLst)
522デフォルトの名無しさん:2007/12/19(水) 10:00:51
>>520
typename std::list<T>::iterator MoveListItr(std::list<T> *pLst)
って書けばいいんじゃないかな。

いわゆる特殊化ってやつがあるせいで、classname<T>::hogeという記述だけでは、
hogeが値なのか型名なのか断定できない。
そういう場合、「これは型名ですよ」というのをコンパイラに教えるために、typenameを書く。

今回のVC7と8の違いは、「ここは関数の戻り値の型を書く場所だから、型名に決まってるよな」
とコンパイラが判断したか否か、の違いだと思うんだけど、
VC7の気が利いているのか、VC8が「VC7が無視した何らかの可能性」を見て断定を避けたのか、
どっちなのかは俺にはわからないや。
523デフォルトの名無しさん:2007/12/19(水) 10:03:56
単に規格に準拠するようにしただけじゃねえの?
524デフォルトの名無しさん:2007/12/19(水) 10:12:15
>いわゆる特殊化ってやつがあるせいで
特殊化は無関係
525デフォルトの名無しさん:2007/12/19(水) 10:13:50
>>521-523
なるほど、そうだったんですか。
おかげで解決しました、ありがとうございます。
526りょう ◆RyOrlro88Q :2007/12/19(水) 10:46:02
ループが止まりません><

#include<stdio.h>

#define N 20

main(){
char ch[N],a,word='^';
int num,i,j;

j=0;
printf("Input your name.(When the input is finished,type ^.)\n");

for(num=0;ch[num]!=word;num++){
printf("ch[%d]=",num);
scanf(" %s",&ch[num]);
}
printf("target:");
scanf(" %c",&a);

for(i=0;i<num;i++){
if(ch[i]==a){
j++;
}
printf("%c=%d\n",a,j);
}
}
527デフォルトの名無しさん:2007/12/19(水) 11:04:06
>>526
最初のループの終了条件がおかしい。
528りょう ◆RyOrlro88Q :2007/12/19(水) 11:09:43
ループは自己解決><

次は判定に問題が…><
529りょう ◆RyOrlro88Q :2007/12/19(水) 11:30:49
jが増えない><

#include<stdio.h>

#define N 20

main(){
char ch[N],a,word='^';
int num,i,j;

j=0;
printf("Input your name.(When the input is finished,type ^.)\n");

for(num=0;ch[num]!=word;num++){
printf("ch[%d]=",num);
scanf(" %s",&ch[num]);

if(ch[num]==word){
break;
}
}
printf("target:");
scanf(" %c",&a);

for(i=0;i<num;i++){
if(ch[i]==a){
j++;
}
}
printf("%c=%d\n",a,j);
}
530デフォルトの名無しさん:2007/12/19(水) 11:34:56
ちったあ自分で考えないと成長しないぜ
531りょう ◆RyOrlro88Q :2007/12/19(水) 11:40:58
考えてるけどわからないんです><
532デフォルトの名無しさん:2007/12/19(水) 11:43:39
>>528
他にも色色問題が。scanf()で一文字ずつ入力なんて阿呆なことしないで、
fgets()で1行分まるっと入力してしまえばいいじゃん。
あと、'^'による終了判定も無意味。
533デフォルトの名無しさん:2007/12/19(水) 11:45:26
つーか、>529ではループの判定条件がバグったままじゃんw
534デフォルトの名無しさん:2007/12/19(水) 11:46:26
何故増えないんだと思う?
具体的な場所はともかく、どの辺が間違ってそうな気がする?

本当はデバッガを使うのが良いんだろうが、printfデバッグっていう手法だってある。
それっぽい箇所にprintfを挿入するだけで見えてくるかもよ。
535デフォルトの名無しさん:2007/12/19(水) 11:47:57
ブロックの前後や中で満たすべき条件を式のかたちで書き出してみてはどうか
536デフォルトの名無しさん:2007/12/19(水) 11:51:01
紙と鉛筆使って机上でプログラムを実行してみるのもいい。
どこで意図しない動作になっているかすぐ分かる。
537デフォルトの名無しさん:2007/12/19(水) 11:53:22
>>518について詳しい人いませんか?
538りょう ◆RyOrlro88Q :2007/12/19(水) 11:57:29
解決できました><

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

>>532
それが指定なんですよ><

>>534
そんな方法なんて知りませんでした><
539デフォルトの名無しさん:2007/12/19(水) 12:01:09
ほほぉ。それじゃ、スレよごしの罰として完成したソースを貼ってもらおうか。
540デフォルトの名無しさん:2007/12/19(水) 12:06:58
541デフォルトの名無しさん:2007/12/19(水) 12:07:22
>>537
inline指定無しでも最適化でインライン展開してくれるんじゃないの?
明示的にinline指定したい積極的な理由でもあるなら兎も角、そうでないならコンパイラに任せたら?
つーか、iccだとinline指定をつけると却ってコンパイラが混乱するみたいだ。
542デフォルトの名無しさん:2007/12/19(水) 12:11:03
>>540
番号間違ってる。
しかし、そのリンク先のエピたんの弁によれば、
inline指定してある関数を別の翻訳単位から見つけてくるiccはおかしなことになるね。
543デフォルトの名無しさん:2007/12/19(水) 12:22:09
7.1.2.4を見てextern inlineにしたら通った
544デフォルトの名無しさん:2007/12/19(水) 13:00:43
// aaa.h
extern inline double MySquare(double);

// aaa.cpp
double MySquare(double d){...}

// main.cpp
#include "aaa.h"

int main() {
 double d = MySquare(3.14);
}

一応gcc3.4とvc8でいけた
external linkageなinline指定つきの関数宣言がどうたらこうたら書いてあるけど理屈はよくわかんね
545デフォルトの名無しさん:2007/12/19(水) 13:28:11
>>540
>>541
>>542
>>543
ストラップ本にはinline定義とあるので、おそらく
無理なんでしょうね。
extern inline定義にしたらVC 2005では実行できましたが、
g++ v4では無理でした。移植性考えたらやはり素直にヘッダーに
定義を書いたほうが無難ですね。
546デフォルトの名無しさん:2007/12/19(水) 13:30:36
>>544
extern inlineを宣言につけるんですか。
試して見ます。
547デフォルトの名無しさん:2007/12/19(水) 13:37:55
>>544
g++ v4でもリンクできましたが、
定義にinlineつけないとインライン展開されて
ないかもしれないですね。
548デフォルトの名無しさん:2007/12/19(水) 13:55:07
VC++ 2008でもテンプレートのexport定義はサポート
されてないんだな
549デフォルトの名無しさん:2007/12/19(水) 13:58:09
>>548
別に規格に違反してないからね
550デフォルトの名無しさん:2007/12/19(水) 14:35:53
kernel: pid xxxx (a.out), uid yyyy: exited on signal 11 (core dumped)
というメッセージがログに残っている場合は何を調べればいいのでしょうか?
551デフォルトの名無しさん:2007/12/19(水) 14:38:34
VCEEにMFCついてないかー/(^o^)\
552デフォルトの名無しさん:2007/12/19(水) 14:52:40
>>50
coreファイルを調べるのが王道
553デフォルトの名無しさん:2007/12/19(水) 14:58:45
>>550
signal 11はSEGVだから、要はセグメンテーションフォルトを起こしたってこった。
まぁ、メモリアクセス周りでバグってるんだろ。
554デフォルトの名無しさん:2007/12/19(水) 15:02:26
>>551
TurboC++ExpressだったらMFC付いてたかもしれん。
555デフォルトの名無しさん:2007/12/19(水) 15:32:15
>>554
把握した、WinAPI直接とか死にそうだからVB.NETかC#いじってくる
556デフォルトの名無しさん:2007/12/19(水) 15:36:26
どっちもとか正規表現あるから戻ってこれなくなりそう
557デフォルトの名無しさん:2007/12/19(水) 16:20:06
bitsetよりvector<bool>のほうが性能が上のことが判明した

#include <iostream>
#include <vector>
#include <bitset>
#include <time.h>
using namespace std;
main(){
#define N 8200000

int n,m,cl;

cl=clock();
bitset<N> a;
for(m=0;m<10;m++)for(n=0;n<N;n++)a[n]=1;
cl=clock()-cl;cout<<cl<<endl;

cl=clock();
vector<bool> b(N);
for(m=0;m<10;m++)for(n=0;n<N;n++)b[n]=1;
cl=clock()-cl;cout<<cl<<endl;
}
558デフォルトの名無しさん:2007/12/19(水) 16:30:20
自前の関数のほうが断トツで早かった

#include <iostream>
#include <vector>
#include "crc.h"
#include <bitset>
#include <time.h>
using namespace std;
main(){
#define N 8200000
int n,m,cl;
char *rnd =new char[N];
for(n=0;n<N;n++)rnd[n]=rand()&1;

cl=clock();
bitset<N> a;
for(m=0;m<10;m++)for(n=0;n<N;n++)a[n]=rnd[n];
cl=clock()-cl;cout<<cl<<endl;

cl=clock();
vector<bool> b(N);
for(m=0;m<10;m++)for(n=0;n<N;n++)b[n]=rnd[n];
cl=clock()-cl;cout<<cl<<endl;

cl=clock();
unsigned int k,l, *c=new unsigned int [1+(N>>5)];
for(n=0;n<(N>>5);n++)c[0]=0;
for(m=0;m<10;m++)for(n=0;n<N;n++){
k=n>>5; l=n&31; c[k] |= (rnd[n]<<l);}
cl=clock()-cl;cout<<cl<<endl;
}
559デフォルトの名無しさん:2007/12/19(水) 16:30:52
>>557
うちの環境ではbitsetの方が5倍速いんだが
bitset -> 143
vector -> 890
VC2005, C2D E6850
560デフォルトの名無しさん:2007/12/19(水) 16:37:09
>>559
MinGWやVCCで計ってみたけど、環境によって変わるらしいね でも自前のビット演算が最速だった
558のcrc.hはいりません
561デフォルトの名無しさん:2007/12/19(水) 16:41:06
>>560
gcc 3.4.4(cygming special)でもbitsetのほうが早かった
bitset -> 171
vector -> 687
自作は知らん
562デフォルトの名無しさん:2007/12/19(水) 16:42:41
>>558のほうでやってくれ 最適化されてループしていない可能性がある 初めのやつでは 
563デフォルトの名無しさん:2007/12/19(水) 16:45:57
VC2005
bitset -> 460
vector -> 1876
自前 -> 137
やはりbitsetaのが早い
564デフォルトの名無しさん:2007/12/19(水) 16:49:50
でも、どの環境でも自前でビット演算するのが一番みたいだね
565デフォルトの名無しさん:2007/12/19(水) 16:58:54
まあ問題領域によるだろう
早さだけを求めるならbitsetに限らず自分で書いた方がことが多いだろうね
566デフォルトの名無しさん:2007/12/19(水) 16:59:00
>>557
./a.gcc.O3
220000
400000
./a.gcc.O3.msse2
150000
390000
./a.gcc.O3.msse2.funroll-loops
150000
420000
./a.icc.xT.O3.ipo
140000
260000
./a.icc.fast
140000
250000
567566:2007/12/19(水) 17:03:18
おっと、書き忘れた。[email protected]ね。
で、>558のほう。
--
./a.gcc.O3
440000
1010000
120000
./a.gcc.O3.msse2
410000
1010000
120000
./a.gcc.O3.msse2.funroll-loops
400000
1010000
130000
./a.icc.fast
420000
570000
130000
./a.icc.xT.O3.ipo
420000
570000
130000
568デフォルトの名無しさん:2007/12/19(水) 20:17:10
ポインタのアドレス計算について質問です。
#include <stdio.h>

int main(int argc, char *argv[]){
int *ptr;
int ary[] = {1, 2, 3, 4, 5, 0};
ptr = ary;

while(*ptr != 0){
printf("%d address = %u\n", *ptr, ptr);
++ptr;
}

return 0;
}

上記のプログラムを実行すると、アドレスは4番地ずつ進みます。
使っている参考書ではint型データは2番地ずつ進んでいますが、これは環境によって確保される記憶領域が違うということで宜しいでしょうか?
またfloat型の場合、使っている参考書ではint型の2倍、4バイト長ですが当方の環境だとint型と同じ4バイト長でした。
これも環境によって違うのでしょうか?
569デフォルトの名無しさん:2007/12/19(水) 20:21:58
ふつうはintは32bit 64bitパソコンは64鴨しれない
570デフォルトの名無しさん:2007/12/19(水) 20:23:26
その昔の参考書を投げ捨てろ。
16ビット環境主流の時代に書かれた本じゃないかい?

intのサイズは基本的に環境依存。16bitコンパイラは16bit、32bitコンパイラは32bit。
571568:2007/12/19(水) 20:32:30
>>569-570
有り難うございます。
環境によって違うのですね。
今、使っている本は
http://www.amazon.co.jp/dp/4756102700/
です。
難関と言われているポインタの説明がとてもわかりやすかったし、中盤まできたのでこのまま使っていきたいです。
さすがに捨てるのは勿体無いと思うので。
572デフォルトの名無しさん:2007/12/19(水) 20:36:13
intはサイズが環境依存だから、longを使え、

・・・って、その昔、仕様をカン違いしてるヤツが偉そうに
コーディングルールを決めることがよくあった。
573デフォルトの名無しさん:2007/12/19(水) 20:37:32
参考までにDOSコンパイラ(Turbo C++ 1.01)でのsizeof(int)とsizeof(long)実行結果
http://up.mugitya.com/img/Lv.1_up43982.png

32bitコンパイラだと両方とも4になる。
574デフォルトの名無しさん:2007/12/19(水) 20:42:47
575デフォルトの名無しさん:2007/12/19(水) 22:09:32
IntelのCPU(x86)で、doubleとlong doubleはどうちがいますか?
576デフォルトの名無しさん:2007/12/19(水) 22:47:06
doubleは64ビット(IEEE 754倍精度)、
long doubleは80ビット(IEEE 754拡張倍精度)のことが多い。
Visual C++ 32ビット(どっちも64ビット)のように例外もある。
577デフォルトの名無しさん:2007/12/19(水) 22:51:46
失礼します。
どこで質問していいか判らず、何でも知ってそうなここに来ました。

ブーンスタジオをインストールしようとすると
DllRegisterServerへの呼び出しはエラーコード0x80070005により失敗しました。

と出るんですがどういう意味ですか?
当方PC歴1ヶ月で、全く解りません。
エラーコードググっても???です。
どうか、教えてください。


578デフォルトの名無しさん:2007/12/19(水) 22:58:12
>>576
ありがとうございます。拡張倍精度というのがあるんですね。
579デフォルトの名無しさん:2007/12/19(水) 23:07:38

以下のファイルを構造体の配列に取り込みたいです。
-------------
a_yumi, 9, f
m_mana, 4, f
h_ryohko, 10, f
m_konomi, 12, f
m_kana, 4, f
。。。
-------------

struct data{
  char name[10];
  char age[10];
  char sex[10];
} g_data[NUM];

int main( void ){
 。。。
}

ファイルは開いてみないと大きさが分からないものとします。
"NUM"を可変に(ファイルのデータ数ピッタリに)取り込むことはできないでしょうか?
できればC++は使わずに、Cのみでやりたいです。お願いします。
580デフォルトの名無しさん:2007/12/19(水) 23:10:37
>>577
PC初心者板かソフトウェア板へいけ
581デフォルトの名無しさん:2007/12/19(水) 23:14:12
>>580
すみませんでした。
行ってきます
582デフォルトの名無しさん:2007/12/19(水) 23:14:33
>>577 半年ROMれバカ野郎
583デフォルトの名無しさん:2007/12/19(水) 23:14:41
>>577
この辺で聞いてみるとか?


【ニコニコ】BOON SUTAZIO Part4【ブラウザ】
http://pc11.2ch.net/test/read.cgi/software/1197298402/
584デフォルトの名無しさん:2007/12/19(水) 23:15:13
>>579
realloc()を使うとか、
リンクリストにするとか
で可能。

585デフォルトの名無しさん:2007/12/19(水) 23:16:45
>584
どもありがとうございます。
ググってきます。
586デフォルトの名無しさん:2007/12/20(木) 00:05:26
言語 C++
質問内容
 1.struct SHoge { char a; short b; int c; };と定義する。
 2.SHoge obj; と実体を作成する。
 上記の場合、objのアライメント(?)はいつも同じでしょうか?
質問の背景
 1.struct SHogeBase { char a; short b; int c; };と定義する。
 2.struct SHoge :public SHogeBase { void Save(FILE *f){fwrite(this, sizeof(SHogeBase),1,f); void Load(FILE* f){略}; }
 見たいに、メンバ変数のセーブ、ロードを行っており、タマタマ動作しているのですが、これがタマタマなのか、
 それともあらゆるC++環境で正常動作が保障されているのか、が知りたい。
足りない情報等あれば指摘お願いします。
587デフォルトの名無しさん:2007/12/20(木) 00:08:39
>>586
OSが変わったりCPUが変わったらレイアウトも変わる罠。
588デフォルトの名無しさん:2007/12/20(木) 00:10:37
詰め物が幾ら入るかは処理系定義のお話なのです。
589586:2007/12/20(木) 00:14:48
>>587
OS・CPU(コンパチ品除く)が変わる場合、再コンパイルリンクコンパイルが入り、実行ファイルが新たに作成されますよね。
その実行ファイルは同じOS・CPUでは確実に正常動作するのでしょうか?
正常動作するならば、>>586 見たいなソースはありなんですかね?
590デフォルトの名無しさん:2007/12/20(木) 00:14:50
>>586
同じコンパイラの同じバージョンを使って同じオプションを指定してる限りは、いつも同じでいいかと思うけど
コンパイラが変わったりコンパイルオプションを変えたりすると変わることがある
591デフォルトの名無しさん:2007/12/20(木) 00:17:20
>>589
OSやCPUまでも変わる可能性があるなら、かなり厳しい
intのサイズも変わるしエンディアンも変わるし
592デフォルトの名無しさん:2007/12/20(木) 00:38:27
んやー・・・同じ実行バイナリで実行出来る環境なら概ね正しく動くだろ。
593デフォルトの名無しさん:2007/12/20(木) 01:24:56
>>586
メンバーアクセスしてればアラインメントの影響は
考えなくていいだろ。基本的にメモリレイアウトに
依存するようなコードは回避すべきじゃないのかね。
594デフォルトの名無しさん:2007/12/20(木) 01:28:16
unionとかは回避すべきなのか
595デフォルトの名無しさん:2007/12/20(木) 01:30:24
それはまた話が別でしょう。
596デフォルトの名無しさん:2007/12/20(木) 02:13:15
int型の変数aに50のいう数字が入っています。
これをchar型の配列b[]に5, 0と格納するのはどうすればいいですか?
597デフォルトの名無しさん:2007/12/20(木) 02:17:19
b[1] = a/10;
b[0] = a%10;
598デフォルトの名無しさん:2007/12/20(木) 02:18:41
b[0] = '0'+a/10;
b[1] = '0'+a%10;
599デフォルトの名無しさん:2007/12/20(木) 02:27:43
sprintf(b,"%d",a);
600デフォルトの名無しさん:2007/12/20(木) 02:37:30
>>599
KY
601デフォルトの名無しさん:2007/12/20(木) 02:38:51
すまん、そういう場面だったのか……
602デフォルトの名無しさん:2007/12/20(木) 02:39:15
黙れカス
603596:2007/12/20(木) 03:18:09
ありがとうございました。
604デフォルトの名無しさん:2007/12/20(木) 14:28:02
すみません、printf関数のフォーマットに関する質問があります。


今、

printf("%20s%20s%20s", "hoge", "huga", "piyo");

という風に出力幅を20に指定したいんですが、
一箇所一箇所に20と書くのが不恰好のような気がしています。

もう少しスマートな書き方はありませんか?
605デフォルトの名無しさん:2007/12/20(木) 14:36:35
>>604
20を変数にして、動的に与えてやることはできる。
606デフォルトの名無しさん:2007/12/20(木) 14:42:09
>>604
静的にやるとしてもこんなもん↓

#define COLUMN_WIDTH "20"
printf("%" COLUMN_WIDTH "s%" COLUMN_WIDTH "s%" COLUMN_WIDTH "s",
"hoge", "huga", "piyo");

607デフォルトの名無しさん:2007/12/20(木) 14:45:25
#define prints(s) printf("%20s",s)

prints("hoge");
prints("huga");
608デフォルトの名無しさん:2007/12/20(木) 14:47:21
むしろこうだな

int i;
char *str[] = {"hoge", "huga", "piyo"};
for(i=0; i<sizeof(str); ++i)
printf("%20s", str[i]);
609デフォルトの名無しさん:2007/12/20(木) 16:04:02
int width = 20;
printf("%*s%*s%*s", width,"hoge", width, "huga", width,"piyo");
610デフォルトの名無しさん:2007/12/20(木) 16:10:51
C++でtrim関数の使い方わかる人います?
#include <boost/algorithm/string.hpp>
をincludeすると、エラーがでて
c:\program files\microsoft visual studio\vc98\include\boost\algorithm\string\yes_no_type.hpp(22) : error C2265: '<Unknown>' : reference to a zero-sized array is illegal
c:\program files\microsoft visual studio\vc98\include\boost\algorithm\string\yes_no_type.hpp(23) : see reference to class template instantiation 'boost::algorithm::size_descriptor<I>' being compiled
c:\program files\microsoft visual studio\vc98\include\boost\range\detail\common.hpp(114) : fatal error C1506: unrecoverable block scoping error
っておっしゃるのですが?別にboost使わない方法があればいいのですが・・・。
611デフォルトの名無しさん:2007/12/20(木) 16:21:27
とりあえずVC6をなんとかしろと
612610:2007/12/20(木) 16:37:22
>>611
どういう事でしょうか?
613デフォルトの名無しさん:2007/12/20(木) 16:39:32
>>612
VC6は古すぎて実用に耐えないので、捨てろ
ということ。
614デフォルトの名無しさん:2007/12/20(木) 16:49:22
VC6は2004はアップデートで出ている
VC2003toolkitより新しい
615デフォルトの名無しさん:2007/12/20(木) 17:04:48
for ( std::vector<unsigned char>::iterator it = array.begin(); it != array.end(); it++ )
{
  *it = (*it >= threshold ) ? 1 : 0;
}

この処理をstd::for_each()を使って書くにはどうすればいいでしょうか?
616デフォルトの名無しさん:2007/12/20(木) 17:08:49
できれば別関数に書かず、for_each()に収めたいです。
617デフォルトの名無しさん:2007/12/20(木) 17:14:04
void f(unsigned char& r)
{
 r = (r >= threshold) ? : 1 : 0;
}

foreach(array.begin(), array.end(), f);

ダメかもしれんが。
618デフォルトの名無しさん:2007/12/20(木) 17:15:06
foreach ×
for_each ○
619デフォルトの名無しさん:2007/12/20(木) 17:16:26
自分の力だけで解け。

英語を自分の力だけで解けと言われれば、辞書等の使用は厳禁であるが
プログラミングでは全く正反対である、むしろ人に聞くのさえ認められる
620デフォルトの名無しさん:2007/12/20(木) 17:16:57
ぎゃあああああ、スレってか板違い失礼orz
621デフォルトの名無しさん:2007/12/20(木) 17:31:49
aが0ではない または bが0ではない または c==d
という文は
if ( (a|b) or (c==d) )
if( a|b| (c xor d) )
と書けると思いますがどっちのほうがはやいでしょうか?
622デフォルトの名無しさん:2007/12/20(木) 17:38:50
>>621
なんで xor になるのか理解不能だが、コンパイラが適切に最適化してく
れるので、細かい表記の差は気にしないで理解し易く書くべし。

if (a || b || c == d)
623デフォルトの名無しさん:2007/12/20(木) 17:41:34
計算してみたところa==b と、!(a^b)の計算速度は同じみたいです
624デフォルトの名無しさん:2007/12/20(木) 17:44:33
>>622
c=dならば、c xor dは0になります 
正しくはその否定でした
625デフォルトの名無しさん:2007/12/20(木) 17:57:44
フラグのgirlfriendがずっと0のままで1になりません。
また、sexというポインタを参照するとセグメンテーションフェイルドになります。
どうすればいいですか?
626デフォルトの名無しさん:2007/12/20(木) 17:58:50
>>625
マ板へ逝け
627デフォルトの名無しさん:2007/12/20(木) 18:05:18
FILE **fp;
fp[i] = fopen(filename,"w");

みたいな使い方はでき・・・ませんよね
628デフォルトの名無しさん:2007/12/20(木) 18:11:16
FILE* fp[NUM]
629デフォルトの名無しさん:2007/12/20(木) 18:11:32
630615:2007/12/20(木) 18:14:16
すみません。for_each()でなくてもいいです。
>>615のfor文の処理を、標準C++のファンクタやboostを使って書くにはどうすればいいですか?
難しければ>>617さんのように書こうと思います。
631615:2007/12/20(木) 18:33:26
自己解決しました。以下で期待した動作が得られました。
std::transform(array.begin(), array.end(), array.begin(), std::bind2nd(std::greater_equal<unsigned char>(), threshold));
スレ汚し失礼しました。>>617さんありがとうございました。
632デフォルトの名無しさん:2007/12/20(木) 18:49:12
>>627
領域確保すればできる
633デフォルトの名無しさん:2007/12/20(木) 19:02:50
fopenはやめたほうがいい
winAPIなら1500個同時に開ける fopenはエラー起こす
634デフォルトの名無しさん:2007/12/20(木) 23:01:05
>>631
using namespace boost::lambda;
std::for_each(array.begin(),array.end(),if_then_else(_1>threshold,_1=xxx,_1=yyy));

でもいいのかしらん。xxx, yyy は何か入れ替えるとして。
635デフォルトの名無しさん:2007/12/21(金) 00:09:36
class B
{
protected:
 class BI {};
};
class D : public B
{
 class DI : public BI {}; // (1)
};

VC++6では、(1)のところでBIが定義されていないと言われます。
class DI : public B::BI {};
とすればBIは見つかりますが、今度はprotectedにはアクセスできないと言われます。
BIをpublicにすると、コンパイルできます。
これって合法だと思うのですが、標準規格ではどうなのでしょうか。VCがおバカなだけ?
636デフォルトの名無しさん:2007/12/21(金) 00:09:40
>>633
Windows環境だと判断した理由は?
637デフォルトの名無しさん:2007/12/21(金) 00:28:06
`void' expected `pointer to unsigned char'
すいません、このような質問で申し訳ないのですがお答えください。
上のようなエラーが出たのですが、
これはどのように解釈すればいいのでしょうか?

voidが符号なしchar型へのポインターを予期した???

ちょっと意味がわからないです・・・・
638デフォルトの名無しさん:2007/12/21(金) 00:28:15
>>635
俺もいいと思うけどどうなんだろう。少なくとも g++ は warning 無しで通るね。
639デフォルトの名無しさん:2007/12/21(金) 00:31:22
VC++6の時点で
あらゆることが起こりうるのでバカバカしい
640デフォルトの名無しさん:2007/12/21(金) 00:35:26
VC++2005が最強
641デフォルトの名無しさん:2007/12/21(金) 00:36:15
>>637
unsigned char* を期待したのに void が渡された

関数コールで引数指定し忘れたとかそういうオチ?
642デフォルトの名無しさん:2007/12/21(金) 00:46:13
>>641
UART_1_PutString(itoa(line,iData,10));

ここでエラーが出ています。引数指定し忘れというのは??
すいません、勉強不足で・・・・
643デフォルトの名無しさん:2007/12/21(金) 00:57:45
>>635
VC++ 2008 でも問題ない。
644635:2007/12/21(金) 00:59:50
>>638-639
自分もバカバカしいと思いながらも、完全には自信がなくて・・・。
でもg++でOKなら、それが正しそうですね。
どうやらVC++6は、内部クラスは外側のクラスにとっての
暗黙のfriendにはならないようです。
ありがとうございました。
645デフォルトの名無しさん:2007/12/21(金) 08:12:04
>>642

>UART_1_PutString(itoa(line,iData,10));

UART_1_PutString()の宣言はどうなってる?

>引数指定し忘れというのは??

関数の引数が足りないんじゃないか、と言うこと。
646デフォルトの名無しさん:2007/12/21(金) 11:17:26
>>645
UART_1_PutString()の宣言は・・・・されていません。


関数の引数が足りないっていうのはitoa関数のって事ですか??


647デフォルトの名無しさん:2007/12/21(金) 11:27:04
>>645
連投すいません。

UART_1_PutString()の宣言はvoidです。

648デフォルトの名無しさん:2007/12/21(金) 11:29:28
>>647
ちゃんと書こうよ。その書き方じゃ
void UART_1_PutString(?)
? UART_1_PutString(void)
void UART_1_PutString(void)
のどれかわからない。
649デフォルトの名無しさん:2007/12/21(金) 11:32:44
すいません・・・
void UART_1_PutString()です。
650デフォルトの名無しさん:2007/12/21(金) 11:40:49
>>649
#include <PSoCAPI.h> しないで自分で宣言を書いたりしてないよね?
651デフォルトの名無しさん:2007/12/21(金) 11:47:39
>>650
#include <PSoCAPI.h>はしています。

UART_1_PutString(itoa(line,iData,10)); で

`UART_1_PutString'; found `void' expected `pointer to unsigned char'
というエラーが出てくるという事は、itoa関数に問題があるのでしょうか?
652デフォルトの名無しさん:2007/12/21(金) 12:56:12
itoaの戻り値は文字列なの?
653デフォルトの名無しさん:2007/12/21(金) 12:58:56
>>651
UART_1_PutString() と itoa() の宣言をコピーして見せるべし。
654デフォルトの名無しさん:2007/12/21(金) 13:07:31
>>651
UART_1_PutStringが引数を取らない関数なのに
unsigned char * 型の引数(itoa(line,iData,10))を渡すからエラーなんだろ。
UART_1_PutStringの使い方が間違ってるから確認しろ。
655651:2007/12/21(金) 14:06:00
>>652-654
void main()
{
int iData;
char line[10];

M8C_EnableGInt;

ADCINCVR_2_Start(ADCINCVR_2_HIGHPOWER);
ADCINCVR_2_SetResolution(8);
ADCINCVR_2_GetSamples(0);

UART_1_CmdReset();
UART_1_Start(UART_1_PARITY_NONE);

for(;;)
{
while(ADCINCVR_2_fIsDataAvailable() == 0);

iData = ADCINCVR_2_iGetData();
ADCINCVR_2_ClearFlag();

char line[10];
UART_1_CmdReset();
UART_1_PutString(itoa(line,iData,10));

UART_1_PutChar('\n');
}
}

このようなプログラムです。。。
656デフォルトの名無しさん:2007/12/21(金) 14:35:59
>>655
>653
657651:2007/12/21(金) 14:43:06
あとはvoid main()の上に
#include <m8c.h>
#include "PSoCAPI.h"
#include <stdlib.h>
が記述してあるだけで、全てなのですが・・・

658デフォルトの名無しさん:2007/12/21(金) 14:50:52
もしかして、C用のインクルードファイルをC++から直にインクルードしているって落ち?
659651:2007/12/21(金) 15:01:44
ちょっとわかんないです・・・・
660デフォルトの名無しさん:2007/12/21(金) 15:14:42
えい面倒だ。コマンドライン若しくはコンパイラの出力を全部晒せ。
661デフォルトの名無しさん:2007/12/21(金) 15:35:56
>>657
stdlib.h や PSoCAPI.h の中に atoi() や UART_1_PutString() の宣言
があるはずだから、それをここに示して欲しい。

それらがないと、ここで見ている人は正しい仕様がわからないのでアド
バイスしにくい。コンパイラの種類なども示してくれるとベター。
662651:2007/12/21(金) 15:38:00
>>660
改行多すぎエラーが出るため分割します。


#include <m8c.h>
#include "PSoCAPI.h"
#include <stdlib.h>

void main()
{
int iData;
char line[10];

M8C_EnableGInt;

ADCINCVR_2_Start(ADCINCVR_2_HIGHPOWER);
ADCINCVR_2_SetResolution(8);
ADCINCVR_2_GetSamples(0);

UART_1_CmdReset();
UART_1_Start(UART_1_PARITY_NONE);
663651:2007/12/21(金) 15:41:05
>>660

for(;;)
{
while(ADCINCVR_2_fIsDataAvailable() == 0);

iData = ADCINCVR_2_iGetData();
ADCINCVR_2_ClearFlag();

UART_1_CmdReset();

UART_1_PutString(itoa(line,iData,10));
UART_1_PutChar('\n');
}

}

664651:2007/12/21(金) 15:41:28
出力
Starting MAKE...
creating project.mk
lib/adcincvr_2.asm
lib/adcincvr_2int.asm
lib/dac8_2.asm
lib/psocconfig.asm
lib/psocconfigtbl.asm
lib/uart_1.asm
lib/uart_1int.asm
lib/uart_1plus.asm
./boot.asm
./main.c
!E ./main.c(32): type error in argument 1 to `UART_1_PutString'; found `void' expected `pointer to unsigned char'
!E ./main.c(32): can't recover from syntax error.


adconv1_vup_usart - 2 error(s) 0 warning(s) 15:39:51
665651:2007/12/21(金) 15:45:27
>>661
stdlib.hの中身@。。これも分割します。

#ifndef __STDLIB_H
#define __STDLIB_H
#include <_const.h>

#define EXIT_SUCCESS 0
#define EXIT_FAILURE 1
#ifndef NULL
#define NULL 0
#endif
#include <limits.h>
#define RAND_MAX INT_MAX

#ifndef __SIZE_T
#define __SIZE_T
typedef unsigned int size_t;
#endif

#if defined(_HC12)
#pragma nonpaged_function atof exit
#endif
666デフォルトの名無しさん:2007/12/21(金) 15:46:00
情報が欠けているので確信はないけど、

たぶん itoa() が値を返さない仕様で、UART_1_PutString(char*)
に渡せない。
itoa(line, iData, 10);
UART_1_PutString(line);
にすればokかもしれない。

667651:2007/12/21(金) 15:46:06
>>661
stdlib.hの中身A。。

char *ftoa(float f, int *status);

int abs(int);
double atof(CONST char *);
int atoi(CONST char *);
long atol(CONST char *);
void itoa(char *string, unsigned int value, int base);
void ltoa(char *string, unsigned long value, int base);
int rand(void);
void srand(unsigned);
long strtol(CONST char *, char **, int);
unsigned long strtoul(CONST char *, char **, int);

#if !defined(_M8C)
void abort(void);
void *calloc(size_t, size_t);
void exit(int);
void free(void *);
void *malloc(size_t);
void _NewHeap(void *start, void *end);
void *realloc(void *, size_t);
#endif

#endif
668デフォルトの名無しさん:2007/12/21(金) 16:01:38
VC++2008を使っているのですが、ソースファイル変更を施していない上に、ソースファイルが存在しているのに、逆アセンブリ表示でしかデバッグができません。
これは何か知らないうちに変な設定をしてしまったからなんでしょうか?

どなたかご存知の方いらっしゃいましたらご教授ください。
669デフォルトの名無しさん:2007/12/21(金) 16:02:08
はい、ダミアンが正解だったようです。
670668:2007/12/21(金) 16:03:13
ちなみにビルドの際にも、ソースファイルはプロジェクト中に存在しています。
671デフォルトの名無しさん:2007/12/21(金) 16:03:24
>>668
VisualStudio専用スレがあるからそちらでどうぞ。
672668:2007/12/21(金) 16:05:07
はい。
673デフォルトの名無しさん:2007/12/21(金) 17:39:14
>>666
ありがとうございました。解決できました。
674デフォルトの名無しさん:2007/12/21(金) 18:30:39
WinXP,VC++2005について質問です.
DOSコマンドのassoとftypeのように,特定の拡張子に関連付けされた
アプリケーションをできればフルパスで取得したいのですが,
VC++で可能でしょうか?
675デフォルトの名無しさん:2007/12/21(金) 21:04:40
関連付けならレジストリのHKEY_CLASSES_ROOT以下を見ればいい。
676デフォルトの名無しさん:2007/12/21(金) 22:22:15
HDD片方だけぶっ壊れたせいで復旧作業泣ける、嫌になってレジストリ削除とエントリ削除結構適当だから不安

あー、もうしにたい
677デフォルトの名無しさん:2007/12/21(金) 22:37:01
ごばくだうわあああorz
678デフォルトの名無しさん:2007/12/22(土) 01:32:45
初めて見たんだけど、’あっそ’ってどんなコマンドなん?
679デフォルトの名無しさん:2007/12/22(土) 07:10:49
>>678
assocの間違いだと思う。
680デフォルトの名無しさん:2007/12/22(土) 10:03:06
>>485です
回答くださったみなさん、ありがとうございます。
三項演算子は勉強になりました。
>>502の参照からポインタとって操作するのがわかりやすかったので、
この方法でいこうと思います。
has()が返すアドレスの実態はgetで得られるインスタンスと一緒です。
681674:2007/12/22(土) 10:24:21
>>678,679

すみません.assocの間違えです.
c++でできるコマンドがありましたらお願いします.
682デフォルトの名無しさん:2007/12/22(土) 10:34:14
>>674 >>681
それは OS 無しで知りえない情報だから system (みたいなもの)
使うしかないんじゃないの?
683デフォルトの名無しさん:2007/12/22(土) 14:02:30
クラス配列の要素数の求め方を教えてください。

class_array = new Class[10]();
sizeof( class_array ) / sizeof( class_array[0]);

てやっても0になってしまいます。
sizeof( class_array ) ってすると4になるんですが、
この4が何かが分かりません。
例えば普通の10個の要素を持つ配列をsizeofすると、配列のサイズが返りますよね。
クラス配列にsizeofすると、また別の意味の値を返すのでしょうか。
684デフォルトの名無しさん:2007/12/22(土) 14:04:52
>>683
sizeof(class_array)/sizeof(class)じゃ無理?
685デフォルトの名無しさん:2007/12/22(土) 14:13:35
>>684
レスありがとうございます。
できないです…。結果は0になりました。
sizeof( class_array ) が 4
sizeof( CLASS ) が 16
になっていました。

普通の配列にsizeofすると配列のサイズが返ってくるのに、
クラス配列にsizeofした時、配列は16*10=160のサイズを持っている
はずなのに、4しか返ってこないということは、、、
どういう事なんですか??
686デフォルトの名無しさん:2007/12/22(土) 14:13:56
>>683
class_array はただのポインタだろ。そうじゃなきゃ new [] の結果は受け取れないはず。
687デフォルトの名無しさん:2007/12/22(土) 14:16:27
ああ、new
688デフォルトの名無しさん:2007/12/22(土) 14:20:27
>>686
なるほど、sizeof( class_array ) では、ただのポインタのサイズを返しているわけですね。
sizeof(またはそれ以外)を使用してクラス配列全体のサイズを調べるにはどのようにすればよいでしょうか。
689デフォルトの名無しさん:2007/12/22(土) 14:23:34
>>688
sizeof にこだわらなければ 10 に決まってんだろ。
即値を繰り返すのが嫌なら定数なり変数なりに入れとけ。
配列と別の変数でサイズを持ってるのが嫌なら std::vector にしとけ。
690デフォルトの名無しさん:2007/12/22(土) 14:23:59
new[]したもので、要素数を後から知る方法はない。
std::vectorでも使っておけ。
691デフォルトの名無しさん:2007/12/22(土) 14:29:13
恐らくだけど、newに拘る必要はないんじゃないか?

newを知らずに使っているように見受けられる
692デフォルトの名無しさん:2007/12/22(土) 14:30:42
vectorを調べてきました。
こんな便利なものがあったなんて、、
std::vectorを使います!
答えてくださった方々ありがとうございました!
693デフォルトの名無しさん:2007/12/22(土) 14:34:17
>>691
クラス配列の要素を動的に増やしたり、減らしたりしたかったのです。
mallocはコンストラクタが動かないと聞いたんで、newを使っていました。
その結果sizeofで要素数を求めようと頑張っていたのですが、
vectorでなんとかなりそうな気がします。
ありがとうございました。
694デフォルトの名無しさん:2007/12/22(土) 14:37:49
CやC++でGUIなユーティリティを作る場合何を使うのがベターなんでしょうか?
先日本職さんの知り合いに聞いたところMFCだと言っていました
それと同時にCやC++で作るならゲームかなぁみたいなことも言っていました

やはりCやC++でGUIというのはあんまりベターじゃないんでしょうか?
API直接だとかデザイナついたやつだとか、もしくははなからCは使わないだとか
695デフォルトの名無しさん:2007/12/22(土) 14:41:20
趣味でやるのか、仕事でやるのか
自分だけで使うのか、人に売るのか
これからも続けていきたいのか、今回作ったら終わりなのか

もろもろの事情による
696デフォルトの名無しさん:2007/12/22(土) 14:43:00
>>695
一応趣味で、これからも使っていく予定です
人に売る気はないですが、良さそうなものが出来たら公開してみたりしたいなぁくらいには考えています
697デフォルトの名無しさん:2007/12/22(土) 14:45:58
C++Builderかね。
698デフォルトの名無しさん:2007/12/22(土) 14:46:29
MFC WTL ATL ボーランドC++
699デフォルトの名無しさん:2007/12/22(土) 14:50:00
趣味ならCやC++だけと言わずC#にも手を伸ばしてみるのはどうだろうか
700デフォルトの名無しさん:2007/12/22(土) 14:52:30
売るつもりが無いならC#は楽でいいな
701デフォルトの名無しさん:2007/12/22(土) 15:02:48
C#は一応手を出したことがあるんですが、デザイナがあるだけでどうもそれに頼り切ってしまって
そのせいかどうも感覚を掴めない
まだWinAPIで試行錯誤していた時の方が気が楽でしたorz

とりあえず今Turbo++Explorerとやらをダウンロード中です。
最終的にはVC++を買うことになりそうだなぁ
702デフォルトの名無しさん:2007/12/22(土) 15:09:11
プログラミング勉強中なのですが質問させて下さい。
あるファイルから内容を読み取ってデータを抽出して別のファイルに書き出すプログラムを作りたいのですが
#include "fstream"

using namespace std;
void main(int argc, char *argv[]){
ifstream f1;
f1.open(argv[1],ios::in);
中略
f1.close();

ofstream f2;
f2.open("data.txt",ios::out);
中略
f2.close();
}
このようなプログラムを実行するとD&Dしてプログラムを実行した時ofstream f2;以降の書き込み動作が出来ていないようなのです。
何がいけないかいろいろ試してみたのですが、ファイルを読み込む部分をソースから消して書き込む場所だけにしてみても
D&Dして実行すると駄目で、D&Dしないで実行すると普通に書き込めるみたいなのですが
これはどういう理由からなんでしょうか。
703デフォルトの名無しさん:2007/12/22(土) 15:35:07
>>702
>D&Dして実行する

って、何をどうやって実行してるの?
その場合って、argvに対象のファイル名がちゃんと渡ってくるものなの?
704デフォルトの名無しさん:2007/12/22(土) 15:39:35
>>703
上記のプログラムをコンパイルしてできたexeに読み込ませたいtxtをD&Dで実行ということです。
途中にcout << argv[1]を入れてみたところD&Dしたtxtはフルパスで格納されていました。
ですが ofstream f2("data.txt",ios::out);のdata.txtへの書き込みが出来ない状態です。

追記ですがコンパイルはVC++2005です。
705デフォルトの名無しさん:2007/12/22(土) 15:47:27
いや、きっとdata.txtは出力されている。
PCの中を検索すればどこかにあるはずだ。

argv[1]が絶対パスだったら、f2で書き込むファイルも
argv[1]のファイルと同じフォルダになるよう絶対パスで指定するという風にすればいい。
706デフォルトの名無しさん:2007/12/22(土) 16:10:01
printfで\の半角は表示できませんか?
707デフォルトの名無しさん:2007/12/22(土) 16:10:51
>>705
argv[1]で絶対パス渡すと後のファイルオープンのパスに影響与えてしまうってことですかね?
確かに絶対パスを渡したら指定のフォルダにきちんと出力されました。
ありがとうございます。
708デフォルトの名無しさん:2007/12/22(土) 16:19:16
>>706
printf("\\");で出力されるのが、半角円記号だというのなら、
それはそういう風にフォントが出来ているから。

日本では、歴史的経緯で半角バックスラッシュが用いられるべきところに半角円記号が使われる。
今更、円記号とバックスラッシュに分離しようとしてもおそらく極めて困難。
709デフォルトの名無しさん:2007/12/22(土) 16:39:52
>>706
フォントに依存するんじゃないかと
710デフォルトの名無しさん:2007/12/22(土) 17:03:42
turboC++Explorer落としに行ったけどあれでよかったのだろうか
711デフォルトの名無しさん:2007/12/22(土) 18:31:41
>>707
もう解決したようだけど、
D&Dでは作業フォルダに注意ね
712デフォルトの名無しさん:2007/12/22(土) 20:18:03
std::vector<unsigned char> buffer( 100, 0 )

buffer[100][0]という意味ですか?
713デフォルトの名無しさん:2007/12/22(土) 20:19:14
100個確保して0が入っているという意味
buffer[100]=0
714デフォルトの名無しさん:2007/12/22(土) 20:25:09
std::vectorでは二次配列は確保できないのですか?
715デフォルトの名無しさん:2007/12/22(土) 20:25:43
あ、、こうやればいいいのか
std::vector<unsigned char> buffer[a][b];
716デフォルトの名無しさん:2007/12/22(土) 20:28:45
>>715
vectorをa×b個作るの?

vector<vector<unsigned char> >では?
717デフォルトの名無しさん:2007/12/22(土) 20:29:55
>>714
std::vector<std::vector<unsigned char> > vec(100, std::vector<unsigned char>(10));
718デフォルトの名無しさん:2007/12/22(土) 20:31:39
thx!
719デフォルトの名無しさん:2007/12/22(土) 20:36:02
>>713
1行目と2行目が違うのだが・・・
720デフォルトの名無しさん:2007/12/22(土) 21:11:53
Cのdouble型で表せる最大の数と最小の数はなんですか?
721デフォルトの名無しさん:2007/12/22(土) 21:12:57
環境による
64ビットが普通だけど
722デフォルトの名無しさん:2007/12/22(土) 21:14:05
>>721
計算した値がdouble型の精度を超えてたらエラーとするにはどうしたらいいですか?
723デフォルトの名無しさん:2007/12/22(土) 21:16:00
代入前に比較
724デフォルトの名無しさん:2007/12/22(土) 21:16:30
具体的にどうやるんですか?
725デフォルトの名無しさん:2007/12/22(土) 21:16:48
代入前に比較
726デフォルトの名無しさん:2007/12/22(土) 21:20:26
演算できる上限はどうなってるんだろうな、代入時に分割して代入するとか意味はあるんだろうか
727デフォルトの名無しさん:2007/12/22(土) 21:22:16
BCBだとlong doubleは10バイトなのに、なんでVC++だとdoubleと変わらない8バイトなんですか
728デフォルトの名無しさん:2007/12/22(土) 21:24:18
>>727
俺の自作コンパイラでは9バイトだぜ
729デフォルトの名無しさん:2007/12/22(土) 21:26:01
unsigned long long int=unsigned long long int*unsigned long long int
これで溢れる時
unsigned long long int=(unsigned long long int*unsigned long long int)/2
実際の何割とか決めてって話か
730デフォルトの名無しさん:2007/12/22(土) 21:32:25
double型の演算が大きすぎてコンパイラが停止するのを制御できますか?
731デフォルトの名無しさん:2007/12/22(土) 21:44:53
>>727
MSのも16bit用のコンパイラは10バイトだった。最終はVC++1.5だったか。
10 byte realがIntel x87の内部形式で他と互換が無いこと、
Intel自身も将来的に実数のSMIDを予定してたので10 byte realを
データ型として扱うのは非推奨だったことから廃止した。
732デフォルトの名無しさん:2007/12/22(土) 21:47:21
これはどこが駄目ですか? 実行中にエラーになります

for(n=0;n<1000;n++){
try {x=x*x;}
catch (...) {break;}
}
733デフォルトの名無しさん:2007/12/22(土) 21:47:50
int n; double x=3;が入ります
734デフォルトの名無しさん:2007/12/22(土) 21:53:59
>>732
まずエラーメッセージ嫁。意味が分からなければコピペして見せろ。
ソース貼るならコンパイルできるようにしてくれ。
n や x の宣言が無いのでなんともいえない。
735デフォルトの名無しさん:2007/12/22(土) 21:55:52
xが凄まじい勢いで増えるから
736デフォルトの名無しさん:2007/12/22(土) 21:55:54
>>732
double でも確実にオーバーフローするだろ。何がしたいんだ?
737デフォルトの名無しさん:2007/12/22(土) 22:01:26
オーバーフローを起こしたらbreakするにはどうしたらいいんですか
738デフォルトの名無しさん:2007/12/22(土) 22:09:38
>>737
演算前に比較。
739デフォルトの名無しさん:2007/12/22(土) 22:10:34
それはどうやるんですか
740デフォルトの名無しさん:2007/12/22(土) 22:12:48
演算する前に、演算後にオーバフローするかを比較する。
741デフォルトの名無しさん:2007/12/22(土) 22:13:19
それはどうやるんですか
742デフォルトの名無しさん:2007/12/22(土) 22:16:45
オーバーフローしないように式変形する。
743デフォルトの名無しさん:2007/12/22(土) 22:17:22
オーバーフローの例外は察知できませんか
744デフォルトの名無しさん:2007/12/22(土) 22:19:36
例外なんて起こらない。
745デフォルトの名無しさん:2007/12/22(土) 22:37:39
POD型(intとかcharとか)の演算で例外は投げられない。

このようなプリミティブな型の演算が例外を投げるようにすると
実行速度及びCとの互換性に影響がある、と、びよよーん先生はお考えになった。
いや、知らんけど。
746デフォルトの名無しさん:2007/12/22(土) 22:49:51
では最大値をしるにはどうしたらいいんですか?
#define とかは使わない方法ありますか
747デフォルトの名無しさん:2007/12/22(土) 22:50:52
float.h に定義されている
748デフォルトの名無しさん:2007/12/22(土) 22:52:36
#define で定義されている値を使わずに求める方法はありますか
749デフォルトの名無しさん:2007/12/22(土) 22:52:58
C++ なら std::numeric_limits<double> でどうぞ。
750デフォルトの名無しさん:2007/12/22(土) 22:53:54
std::numeric_limit<double>::max()
751デフォルトの名無しさん:2007/12/22(土) 22:54:26
ごめん。numeric_limits が正しい。
752デフォルトの名無しさん:2007/12/22(土) 23:05:55
たとえばunsigned int型なら足す続けると0に戻って最大値が判明するけど
そういうのはできないですか
753デフォルトの名無しさん:2007/12/22(土) 23:07:25
>>752
>足す続けると
日本語を母国語としない方ですか?

それはさておき、double値はそういうわけにはいきません。
754デフォルトの名無しさん:2007/12/22(土) 23:08:00
>>752
符号無し整数型以外は、演算で値が範囲外になると未定義動作。
755デフォルトの名無しさん:2007/12/22(土) 23:08:57
なんでそんな事をやりたいのかが分からんが、
double でそういう事をやる場合は、かなり難しい。
小数のフォーマット(環境依存)に依存するし、
非正規化数というのがまた状況をややこしく・・・。
756754:2007/12/22(土) 23:09:01
ん?符号付き整数は未定義動作だけど、不動小数点数型は実装依存で
可能かもしれないな。
757754:2007/12/22(土) 23:09:48
ごめん。 s/不動/浮動/
758デフォルトの名無しさん:2007/12/22(土) 23:09:49
でも限度を超えたら増え続けないから
n < n+1が成り立たなくなるよね
759デフォルトの名無しさん:2007/12/22(土) 23:11:11
>>756
環境依存でいいのなら方法はそりゃあるけども。
760デフォルトの名無しさん:2007/12/22(土) 23:12:23
>>758 だから何?
761デフォルトの名無しさん:2007/12/22(土) 23:13:16
何に対して「でも」なんだろう?
762デフォルトの名無しさん:2007/12/22(土) 23:22:03
ここは一問一答スレですか?
763デフォルトの名無しさん:2007/12/22(土) 23:35:54
>>727
BCBの場合はDelphiのExtended型との互換性のほうが大きいかも
764デフォルトの名無しさん:2007/12/23(日) 00:55:55
void MsgBox( int a )
{

char s[20];
sprintf(s, "%d", a);
MessageBox(NULL, s , NULL , MB_OK );

};

直接数字を表示したいのだが、一回文字列に変換しないといけないのかな?
765デフォルトの名無しさん:2007/12/23(日) 01:03:39
直接数字を表示できるMessageBoxを作ったらいいじゃないか
766デフォルトの名無しさん:2007/12/23(日) 01:12:22
標準ライブラリとかで見かける名前空間の名前がついてない
「::operator new」 とか「::operator delete」ってなぜ
「std::operator new」とか「std::operator delete」じゃないんですか?
767デフォルトの名無しさん:2007/12/23(日) 01:20:26
クラスのデータメンバに配列があって、この配列にコンストラクタ時に初期値入れたいのですがどうすればいいんですかね・・・?
class DATA
{
private:
int t;
public:
DATA(int x=5)
{
t=x;
}
};
であればコンパイルは通るのですが、
class DATA
{
private:
int t[2];
public:
DATA(int x[]=5)←???
{
for(int i=0;i<2;i++)t[i]=x[i];
}
};
だとできないんです・・・
768デフォルトの名無しさん:2007/12/23(日) 01:29:27
DATA()
{
t[0]=t[1]=5;
}

でいいだろ なぜ()内にいれるのか不明
769デフォルトの名無しさん:2007/12/23(日) 01:35:00
まず、配列のそものは引数にとれない
ポインタで渡す。
参照は。。どうだっけ?
770デフォルトの名無しさん:2007/12/23(日) 01:41:33
>>764
WindowsのMessageBoxのことだと思うけど、文字列に直さないとダメ。

MessageBox(NULL, (boost::lexical_cast<std::string>(a)).c_str(),NULL , MB_OK);
とか

>>766
::newはstd::のnewじゃないから。
実体はどうだか知らんけど。
771デフォルトの名無しさん:2007/12/23(日) 01:55:39
>>767
配列はポインタ渡しがいいと思う。
やりたいことは、コンストラクタのオーバーロードで出来ると思う。

DATA(int* x) {
for (int i = 0; i < 2; i++) {
t[i] = x[i]; // xの要素数が2以上ないと未定義
}
}
DATA( ) {
for (int i = 0; i < 2; i++) {
t[i] = 5;
}
}

要素数をマジックナンバにするのはよくないので、
適当にコンスタント宣言しときましょう。
const int T_ARRAY_MAX = 2; とか、センスないな。
772デフォルトの名無しさん:2007/12/23(日) 02:07:22
>>768
>>769
>>771
お蔭様で問題解決できました!
どうもありがとうございました。。
773デフォルトの名無しさん:2007/12/23(日) 02:17:27
>>766
Koenig自動照合ができないからジャマイカ?
operator new(size_t)では引数の型からstdを見に行くと
いう判断ができない気がする。
774デフォルトの名無しさん:2007/12/23(日) 03:33:13
あるブログで見かけた記事。
C++では共用体の代わりにreinterpret_castを用いるらしい。

1: int main( void )
2: {
3: int x = 0x01234567;
4: char *c = new char[4];
5:
6: c = reinterpret_cast<char*>( &x );
7:
8: return 0;
9: }

だからC++は安全で便利なんだね!!
775デフォルトの名無しさん:2007/12/23(日) 04:20:54
・・・どこからつっこめばいいんだ
776デフォルトの名無しさん:2007/12/23(日) 04:24:47
アナル
777デフォルトの名無しさん:2007/12/23(日) 08:57:29
anonymous 共用体が導入されたりと、
C++ では共用体はより強化されてるんだがな。

#include <iostream>

int main()
{
union {
int x;
char c[sizeof(int)];
};

x = 0x01234567;
for(int i = 0; i < sizeof(int); ++i) {
std::cout << static_cast<int>(c[i]) << std::endl;
}
}
778デフォルトの名無しさん:2007/12/23(日) 09:42:24
>>766
名前探索の都合上。
クラス型をnewするとき、クラス自身、基底クラス、大域名前空間という
自然な順にoperator newを探せるようになっている
779デフォルトの名無しさん:2007/12/23(日) 11:37:22
名前検索の順序だけど、Koenig照合は考えないとして、
Effective C++第三版の166ページのとおりだと以下になるけど
クラス自身と基底クラスが異なる名前空間にある場合は
4.は間違いですよね?

1.ローカルスコープ
2.クラス自身
3.基底クラス
4.基底クラスを含む名前空間(間違いと思う)
5.大域名前空間

VC++ 2008で試したところ、

1.クラス自身
2.基底クラス
3.クラス自身を含む名前空間
4.クラス自身を含む名前空間を含む名前空間

(外側の名前空間へ向かって繰り返し)

5.大域名前空間

でした。
780デフォルトの名無しさん:2007/12/23(日) 11:38:14
ローカルスコープが抜けていました。訂正します。

VC++ 2008で試したところ、

1.ローカルスコープ
2.クラス自身
3.基底クラス
4.クラス自身を含む名前空間
5.クラス自身を含む名前空間を含む名前空間

(外側の名前空間へ向かって繰り返し)

6.大域名前空間

でした。
781デフォルトの名無しさん:2007/12/23(日) 11:45:06
すいません。
非常に悩んだのですが、多分ここが一番知っている方がいらっしゃると思って質問させて頂きます。
cc `Wand-config --cflags --cppflags` wand.c `Wand-config --ldflags --libs`
というコンパイルオプションをmakefileにしたいんですが、
どうやればこれ、makeの文法に直せるんでしょうか?
Wand-configというのはアプリケーションの名前で、/opt/local/binにインストールしてあります。
782デフォルトの名無しさん:2007/12/23(日) 14:03:27
>>781
Wand-config … の出力を CFLAGS に入れときゃいいんじゃないの?
ImageMagick か。
783デフォルトの名無しさん:2007/12/23(日) 14:44:43
質問です。

C++からCの関数を呼び出すためにヘッダをincludeしたのですが
ヘッダにC++の予約語(new)が構造体のメンバ変数として定義されていて
コンパイルが通りません。

ヘッダファイルを変更せずに対応する方法はありますか?

環境はRedHatでGCC(G++)でコンパイルしようとしています。
最悪、個別にextern "C"で再定義すればよいのかなと思いますが
それはやりたくないので。。。
784デフォルトの名無しさん:2007/12/23(日) 14:46:27
>>783
> 最悪、個別にextern "C"で再定義すればよいのかなと思いますが

それは多分通らないと思う。extern "C" はそういうのじゃないから。

多分ヘッダファイルを変更するしかないと思うんだよなぁ
785デフォルトの名無しさん:2007/12/23(日) 14:56:07
>>783
#define new new_hoge
#include "header.h"
#undef new

とか駄目かね
786デフォルトの名無しさん:2007/12/23(日) 14:58:58
>>782
なるほど!
助かりました。
しかしなんでこんなややっこしい方法をImageMagickはとってるんだ。
おまけに全然日本語の情報ないし。
そこそこ歴史あるアプリなのに。
787デフォルトの名無しさん:2007/12/23(日) 15:07:52
>>784
そうなんですか。
こまりましたね

>>785
newだけだったらよいのですが、なんかあるたびにそれをやるのは
ちょっと辛いです

普通に問題になりそうだしなんか回避策ないんですかね
ググってもそれっぽいのは出てこないし
788デフォルトの名無しさん:2007/12/23(日) 15:10:03
C++固有のキーワードで、変数名に使いそうなものってそれほどなさそうだけどなあ
789デフォルトの名無しさん:2007/12/23(日) 15:15:24
>>786
むしろ合理的とも言えると思うけど。つまり、option は変わる可能性
がある(時代、OS, architecture 等によって)わけだから、自身に
compile/load option を聞いてやるというだけ。特に大量に画像処理する
可能性を考えると細かいオプションも重要になってくることもありうるし。

俺は Magick++ 使ってるけど、多機能過ぎる程多機能で大変便利。
あと、使い易い。
790デフォルトの名無しさん:2007/12/23(日) 15:18:04
>>787
素直にヘッダ書き換えるのが一番じゃないのかな。特によく使うなら。
単にコピーして直したバージョン作ればいいだけでしょ。
791デフォルトの名無しさん:2007/12/23(日) 15:23:56
または>>785の内容のヘッダファイルを作成して、
それをincludeすればいい。
792デフォルトの名無しさん:2007/12/23(日) 15:25:05
>>790
いや、触れないヘッダなんですよね
ほかのパッケージだから
なんでC++からCを呼び出したいってのもあるんだけど

なんで知ってる人いたら教えてくださいな
793デフォルトの名無しさん:2007/12/23(日) 15:28:47
>>792
そのヘッダで宣言されている関数を呼ぶ、Cのソースを一つはさめばいいだろ。
794デフォルトの名無しさん:2007/12/23(日) 16:42:52
型と順番があってれば問題ないはずだから
ライブラリ利用側だけヘッダを書き換えて使うとか。
795デフォルトの名無しさん:2007/12/23(日) 20:08:08
CP932なマルチバイト文字列をCP932なワイド文字列に変換する簡単な方法ってないですか?
Windows上でgcc 3.4.5(Mingw)を使ってます。
796デフォルトの名無しさん:2007/12/23(日) 20:48:04
ああ、筋トレ気持ちいい
797デフォルトの名無しさん:2007/12/23(日) 20:48:36
ごめん
798デフォルトの名無しさん:2007/12/23(日) 20:49:35
>>796
スジトレ?どこのスジだよ。裏スジか?
799デフォルトの名無しさん:2007/12/23(日) 21:00:47
柔道部出身がマになっちゃう時代なんだよ・・・
800デフォルトの名無しさん:2007/12/23(日) 22:09:56
うちにも短髪でえらくがたい良いのいるな
801デフォルトの名無しさん:2007/12/23(日) 23:18:13
うちには男子校上がりのいい男がいる
のんけでも平気で食っちゃうらしくておそれられてる
802デフォルトの名無しさん:2007/12/23(日) 23:23:47
なんだ?クリスマスに備えて職場のイイ男自慢大会か?悪くないな
803デフォルトの名無しさん:2007/12/24(月) 01:13:34
>CP932なワイド文字列
って何?
804デフォルトの名無しさん:2007/12/24(月) 01:19:10
>>803
間違えました。正しくは「ワイルドな文字」です。申し訳ありません。
805デフォルトの名無しさん:2007/12/24(月) 02:52:11
liboctaveを使って行列演算しようと思っているのですが、構造体内で行列の宣言をすることはできるのですか?
806デフォルトの名無しさん:2007/12/24(月) 05:44:10
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5574.zip

以上のzipファイル内Cプログラムを組んでいるのですが、どうにもうまくいかず立ち往生してしまいました。
同梱のテキストファイルに大よその概要を入れておいたので、何とか力になってもらえないでしょうか。
807デフォルトの名無しさん:2007/12/24(月) 08:15:06
>>806

*p = next(p);
だと、pが指し示す先の中身を書き換えるからおかしくなってんじゃないか?
next() は構造体へのポインタを返すようにしたほうが良くないか。
808デフォルトの名無しさん:2007/12/24(月) 09:52:36
ワイルドな文字って何だよw

文字コードを変換したいならとりあえず iconv 使えばいい。
809806:2007/12/24(月) 10:11:12
正直なところ言わんとしていることは理解できましたが、
結局どこをどう手直しすればいいのかわかりませんでした。
申し訳ないですがプログラム自体の手直しをしていただけると幸いです(;´д⊂)
810デフォルトの名無しさん:2007/12/24(月) 10:35:19
VC2008EEのなんですけど。
ヘッダの一部分を特定の.CPPからインクルードされたときだけ
有効にするにはどうすればいいんでしょうか?
811デフォルトの名無しさん:2007/12/24(月) 10:38:55
>>810
#if
とか
#ifdef
812デフォルトの名無しさん:2007/12/24(月) 10:42:12
>>808
WindowsのAPIだとワイド文字=UNICODEな扱いで、
それ以外のワイド文字に出来ないので…
iconvも素でワイド文字を扱おうとすると難しいようなカンジです。
結局自前で書いても20行くらいに収まったのでそれでなんとかしました。
813デフォルトの名無しさん:2007/12/24(月) 11:59:01
VC2005でSSE使ってLONGLONGを足したり引いたりするにはどうしますか?
814デフォルトの名無しさん:2007/12/24(月) 14:36:00
__FUNCTION__ マクロって標準なんでしょうか?
それとも Visual C++ でしか使えないのでしょうか?
デバッグ用のコードの中で多用しているのですが,
いいのかなぁ,と思って.
815デフォルトの名無しさん:2007/12/24(月) 14:46:36
BOOST_CURRENT_FUNCTIONの定義見てみるといいよ。
816デフォルトの名無しさん:2007/12/24(月) 17:19:37
クリスマスに彼女が居ないんですがどうすればいいですか?
817デフォルトの名無しさん:2007/12/24(月) 17:26:49
クリスマスに彼女が居ないんですがで2ちゃれ
腐るほど同じような書き込みがあるから
818デフォルトの名無しさん:2007/12/24(月) 18:51:08
さっきからC/C++と3Pしようとしてるんですが、
C++が「Cとはもうそりが合わなくなった」とか言って3Pに応じてくれません。
どうしたらいいですか?
819デフォルトの名無しさん:2007/12/24(月) 18:52:53
吉利支丹の祝いらしいが幕府がおそろしゅうてかなわんわ
820デフォルトの名無しさん:2007/12/24(月) 18:58:27
>>818
extern "C" かな?
821デフォルトの名無しさん:2007/12/24(月) 19:02:32
>>818
そりゃ論理的に無理だな。
822デフォルトの名無しさん:2007/12/24(月) 19:09:10
99年から仲が悪くなったんだろうな
823デフォルトの名無しさん:2007/12/24(月) 19:44:03
>>818
delete from C where standard = 1999;
824デフォルトの名無しさん:2007/12/24(月) 19:47:59
こうじゃないのか。
delete standard from C where year = 1999
825デフォルトの名無しさん:2007/12/24(月) 19:49:20
delete standard C where = 1999;
826デフォルトの名無しさん:2007/12/24(月) 19:51:30
C/C++で書けよw
827デフォルトの名無しさん:2007/12/24(月) 19:52:16
std::string と strsafe.h は 共存できないですか?
828デフォルトの名無しさん:2007/12/24(月) 20:28:43
IBSQL *sql = new TIBSQL();
sql->SQL->Add("DELETE standard FROM C WHERE year = 1999");
sql->Close();
sql->Prepare();
sql->ExecQuery();
delete sql;
829デフォルトの名無しさん:2007/12/24(月) 22:05:26
>>809

↓こういうこと。全部はやんないよ。

struct LIST *next(struct LIST *next_p)
{
  struct LIST *p = next_p;
  …
p = next_p->next;
  …
  return p;
}

ポイントは以下の二つ。
 ・引数の next_p に代入するのは止める。見通しが悪くなる。
 ・戻り値はポインタに。
830デフォルトの名無しさん:2007/12/24(月) 23:44:12
>>827
できないと思う理由は?
831デフォルトの名無しさん:2007/12/25(火) 00:17:03
<string>の中が警告だらけになる気がするね。
そこでは安全に文字列関数を使っていると仮定して良いのだけど。

strsafe.hの関数は使うけど、既存関数の使用で警告を出さないようにする方法があると思う。
832デフォルトの名無しさん:2007/12/25(火) 00:28:12
そういや未だstrcpyで警告出る理由わからないや
833デフォルトの名無しさん:2007/12/25(火) 00:43:01
>>832
char tmp[10];
strcpy( tmp, "abcdefghij" );
文字列リテラルなら分かりやすいけど、
これが argv[1] だったりすると?
834806:2007/12/25(火) 01:27:12
>>829
丁寧にありがとうございます。

http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5579.c

こんな感じになりました。が、やっぱりループから抜け出せなくなりました。
一応一周できてるので辿る値、順序は間違っていないと思うのですが、何が悪いのかやはりわかりません…
835デフォルトの名無しさん:2007/12/25(火) 09:26:13
>>834

 *p = *next(p);

↑これは

 p = next(p);

じゃないのか?
でないと p が示している先の値を書き換える。
836デフォルトの名無しさん:2007/12/25(火) 10:36:02
テスト
837デフォルトの名無しさん:2007/12/25(火) 13:16:42
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5581.c
惑星の公転を例にN体問題のシミュレーションをするプログラムを↑のようにして作って
実行したのですが、
datファイルをみると振り子の運動のような形になっていて円(楕円)軌道を周回していないです。

どの辺を修正すればよいのでしょうか?
838デフォルトの名無しさん:2007/12/25(火) 13:57:04
デバッグは自分でやれ
839836:2007/12/25(火) 15:31:48
>>838
まあ、やってもわからないから聞いてるんですけどね。
やってわかるなら最初から聞きにきませんよ。

どっかの計算結果がおかしいのは明白でしょうけど・・・
840デフォルトの名無しさん:2007/12/25(火) 15:34:14
class Hoge{
public:
 Hoge();
private:
 int m;
};

みたいなクラスがあったとして。

Hoge::Hoge()
: m(0)
{}



Hoge::Hoge(){
 m = 0;
}

ではどこが違うの?
841デフォルトの名無しさん:2007/12/25(火) 15:39:25
逆切れktkr

プログラムとは関係ない周辺専門知識を要するんだから、
最低限、座標算出式の数式とかを書いてくれないと、正直ソース読む気にもならんな。
842デフォルトの名無しさん:2007/12/25(火) 15:42:53
>839
実はさっきからいろいろ見てはいるんだけど、いまいちわかんない。
とりあえずdistの挙動が怪しげなので、見てみるといいかも。
あと、new_xはいいけど、new_vって必要?
843デフォルトの名無しさん:2007/12/25(火) 15:48:20
const int m;

に換えてみれば分かる。
844デフォルトの名無しさん:2007/12/25(火) 15:54:26
RGBからYUV2に変換したいんですがどこか参考になるサイトありませんか?
845デフォルトの名無しさん:2007/12/25(火) 16:02:06
逆数
846デフォルトの名無しさん:2007/12/25(火) 16:03:52
1秒間に60回ピッタリと処理を繰り返すにはどうすればいいですか?
847デフォルトの名無しさん:2007/12/25(火) 16:07:11
60回やる→次の秒まで待つ
848デフォルトの名無しさん:2007/12/25(火) 16:18:37
>>840
上はmを0で初期化してる。
下はmに0を代入してる。
849デフォルトの名無しさん:2007/12/25(火) 17:00:04
C言語とC++の違いって何かあるんですか。
850デフォルトの名無しさん:2007/12/25(火) 17:06:29
Cに機能が加わったのがC++
851デフォルトの名無しさん:2007/12/25(火) 17:18:24
C言語とC++だと、細かいところで微妙に文法に互換がなくて、
それが混乱のもとになったりするよな。

C言語のプログラムといいつつ、だいたいC++コンパイラ
でコンパイルして使うから、C言語とC++の文法が
ゴチャゴチャになったプログラムが現実にいっぱい存在する。

C++にベターCの要素なんて入れないほうが、スッキリした気がする。
852デフォルトの名無しさん:2007/12/25(火) 17:27:50
C++にベターCの要素を入れたとか根本から間違ってるぞ
853842:2007/12/25(火) 17:51:46
>839
すまん、ずっと悩んでたの、単にgnuplotの使い方でこっちが大ポカやらかしてただけだった。
plot "Point2.dat" usi 4,6
              ~
orz...

答えは>842であってる。new_vがいらない。
前のvじゃなく、できたてほやほやのaから計算したvを使って位置を出してください。
854デフォルトの名無しさん:2007/12/25(火) 17:57:22
逆ギレするだけのことはありますね
855842:2007/12/25(火) 18:00:03
ちょっとまて、俺は逆ギレした奴じゃない。
856デフォルトの名無しさん:2007/12/25(火) 18:32:20
>>855
なんで逆ギレしてないんだよ、キレろよ
857806:2007/12/25(火) 18:39:14
うおおおおお動いた(⊃д⊂)
ありがとうございます…もっかい集中的にポインタ勉強せにゃぁ…
858デフォルトの名無しさん:2007/12/25(火) 19:00:09
>>858
死ね
859デフォルトの名無しさん:2007/12/25(火) 19:00:33
Ctrl+C
860デフォルトの名無しさん:2007/12/25(火) 19:48:33
>>851
あまり汚いプロクラムは嫌われるんですかね。
とりあえず簡単な文法とか紹介してくれませんか?
861デフォルトの名無しさん:2007/12/25(火) 19:56:02
そんくらい調べろよ・・・
862デフォルトの名無しさん:2007/12/25(火) 20:06:53
糞すぎワロタ
遠慮せずに死ね
863デフォルトの名無しさん:2007/12/25(火) 20:15:45
自殺するくらいなら会社やめろよ。
マジで
864デフォルトの名無しさん:2007/12/25(火) 20:38:20
あと人いるとこで飛び降りもな・・
865デフォルトの名無しさん:2007/12/26(水) 01:38:36
演算子delete [] で質問です。
下のように書いて実行するとdeleteのところで落ちるのですが、
これはdelete []が配列の各要素に演算子delete を実行した後に
スタック領域にあるオブジェクトをdeleteしようとするから落ちるということで正しいでしょうか?
またdeleteはヒープ領域にあるオブジェクトにしか実行できないのでしょうか?

int main()
{
int *x[10] ;
for( int i = 0 ; i < 10 ; ++i )
{
x[i] = new int(i) ;
}
delete [] x ;
}
866デフォルトの名無しさん:2007/12/26(水) 01:54:13
>これはdelete []が配列の各要素に演算子delete を実行した後に
実行しません。

newしたものをdeleteしてください。
867デフォルトの名無しさん:2007/12/26(水) 07:54:04
new を10回呼び出したなら delete を10回呼ぼう。
new [] を1回呼び出したなら delete [] を1回呼ぼう。
868デフォルトの名無しさん:2007/12/26(水) 09:19:21
基底クラスをインターフェイスとしてサブクラスに機能を実装しているクラスがあります

今回、新しくサブクラスを用意することになりました。
しかし、今まであるメソッドに3つパラメーターを渡してあげてたのですが
新しいサブクラスのみ5つパラメーターを渡さないといけないようになってしまいました
他の部分に出来るだけ変更を少なく、今回の仕様を適応する良い方法あるのでしょうか?

恐らく元の設計も良くなかったのでしょうが
設計の段階でパラメーター数の変化に影響されにくい作り込みというのは可能なのでしょうか?
869865:2007/12/26(水) 09:38:56
>866,867
ありがとうございます。deleteについてもう一度勉強しなおします。
870デフォルトの名無しさん:2007/12/26(水) 09:53:33
>>868
そのクラスの目的も分からないし、
サブクラスを使ってる側を見ないと何ともいえないが。

>他の部分に出来るだけ変更を少なく、今回の仕様を適応する良い方法あるのでしょうか?
新しいサブクラスで該当のメソッドだけオーバーロード。

>設計の段階でパラメーター数の変化に影響されにくい作り込みというのは可能なのでしょうか?
引数にオブジェクト(クラス)を取るようなモジュール構成を考える、とか。
871デフォルトの名無しさん:2007/12/26(水) 09:57:22
Win32APIなんかはパラメータは構造体で取って最初のメンバに構造体サイズ入れさせてそれでバージョン分けとかしてるな
872デフォルトの名無しさん:2007/12/26(水) 10:38:19
>>870
研究用に使う測定器を管理するプログラムなんですが
今回の測定器だけ微妙に仕様がことなってまして扱えるパラメータが増えてますorz

>新しいサブクラスで該当のメソッドだけオーバーロード。
基底クラスのポインタでサブクラスを示した場合、オーバーロードした関数は見えないのでは?

やはり構造体で受けた方が良いのかなぁ
873デフォルトの名無しさん:2007/12/26(水) 11:31:19
動けばいいだけなら、unionなstruct作る
間違えてパラメータが来る可能性があるなら、
そのstructに区別がつくようなパラメータを追加する。

オブジェクト指向的には、基底パラメータクラス作って
その派生オブジェクトを渡すのがいいんだろうけど
そこまでするほどのものかは開発規模や環境による。
874デフォルトの名無しさん:2007/12/26(水) 12:14:13
>>873
基底クラスの仮想関数の引数では基底パラメータクラスのポインタを受けて
サブクラスで内部的に引数を派生パラメータクラスのポインタに移し直して処理する
というのはありでしょうか?

大分日本語でOKにな文章ですが察してやってくださいorz
875デフォルトの名無しさん:2007/12/26(水) 12:56:25
>>874
必然的にそうなる。
キャストはちゃんとdynamic_castでcast失敗したときのコードもちゃんと書いておく。

あとパラメータオブジェクトの生存期間をよくよく考えて実装すればOK
テストプログラムではスタックから確保したオブジェクトをポインタ渡しにしたが
実際のプログラムではポインタのオブジェクトが開放されてしまい、
不正なメモリ参照で落ちることは容易に推測できる。

newして渡してやって、開放は受け取ったほうが、終了したら行うようにすればいいと思う。
876デフォルトの名無しさん:2007/12/26(水) 16:43:51
ウィンドウをクラスにする意味ってあるの?
877デフォルトの名無しさん:2007/12/26(水) 18:10:53
>>876
あるよ
878デフォルトの名無しさん:2007/12/26(水) 18:15:59
VS2005 VC
文字列char*型から、double型への変換は
atof( char* 何某);でいいけど
float型への変換はどうしたらいい?
879デフォルトの名無しさん:2007/12/26(水) 18:16:15
>>877
あるの?
880デフォルトの名無しさん:2007/12/26(水) 18:16:38
>>879
おまえは有無を聞いた
881デフォルトの名無しさん:2007/12/26(水) 18:18:59
>>879
やっぱり無いかも
882デフォルトの名無しさん:2007/12/26(水) 18:20:27
>>878
atofの結果をfloatでキャスト
883デフォルトの名無しさん:2007/12/26(水) 18:27:06
>>882サンクス
882ですが、今手元に、コンパイラ無いけど
char* str;
double n;
n = atof( str );
static_cast<fioat>( n );
これでOK?
884デフォルトの名無しさん:2007/12/26(水) 18:28:03
↑スマン
878デツ
885デフォルトの名無しさん:2007/12/26(水) 18:32:39
あらゆるウィンドウは多重継承されていくんだ・・・!
886デフォルトの名無しさん:2007/12/26(水) 18:38:07
>>883
float n = atof(str);
これで十分
887デフォルトの名無しさん:2007/12/26(水) 18:57:49
>>886
サンクス
>>878=883ですが
その変換して、警告が出たんで聞いたんですが・・・
警告無視していいの?
888デフォルトの名無しさん:2007/12/26(水) 19:12:57
>>887
安全なキャストではないからね
889デフォルトの名無しさん:2007/12/26(水) 19:13:59
趣味グラマだけど警告は大目に見てるけど本職さんはそうはいかないんだろうな
890デフォルトの名無しさん:2007/12/26(水) 19:14:31
×趣味グラマだけど
○趣味グラマだから
891デフォルトの名無しさん:2007/12/26(水) 19:24:49
>>878=883ですが
趣味とか本職さんの問題ではないと思うんだけど
char型1バイト=8ビット
float型は4バイト=32ビット
double 型は 8バイト=64ビット
結論は、C99では、
char型文字列からfloat型
この変換をサポートする、関数は準備されてないってことですね。
892デフォルトの名無しさん:2007/12/26(水) 19:27:36
static_castなら警告はでないけど
893デフォルトの名無しさん:2007/12/26(水) 19:36:19
>>889
うーむ、そんなもんなのかなぁ。
俺はいつも警告レベルを最大にして、それを全部潰さないと気が済まないんだけど、
これは「俺が趣味グラマだから」こだわれることなのかな、と思ってた。
894デフォルトの名無しさん:2007/12/26(水) 19:40:08
趣味グラマだから、本職より入念に危うい場所を潰してもいいしその逆でもいいんだろ?
895デフォルトの名無しさん:2007/12/26(水) 19:40:17
msvcのWallは最凶
896デフォルトの名無しさん:2007/12/26(水) 19:41:12
>>893

Warningは、実はバグのことがあるので、基本は全部潰したほうが良い。
あまり時間がなくて、どうでもいいwarning(「使ってない変数があるよ」とか)の
場合はスルーすることもある。

あと、昔作られたコードでは、「動いているから直さない」と言うことが結構ある。
897デフォルトの名無しさん:2007/12/26(水) 19:41:51
アドベンチャーゲームの作り方を教えてくれる人いませんか?
898デフォルトの名無しさん:2007/12/26(水) 19:43:37
ゲーム製作技術板にGO
ttp://pc11.2ch.net/gamedev/
899デフォルトの名無しさん:2007/12/26(水) 19:45:48
プロンプトで牧場物語やってた時期がありました、あれは習作向けだな
900デフォルトの名無しさん:2007/12/26(水) 19:47:36
double→floatで警告出るのは桁が切りつめられて精度が下がるから。
浮動小数点型なら精度下がるだけだから、再度倍精度にキャストとかしない限りは問題なす。

int→shortだと危険だけど。
901デフォルトの名無しさん:2007/12/26(水) 19:48:10
アドベンチャーゲームならバッチファイルで作った記憶が‥‥
902デフォルトの名無しさん:2007/12/26(水) 20:40:34
スパゲッティコード生成してくれるスクリプトあったよな、なんていったっけ
903デフォルトの名無しさん:2007/12/26(水) 20:49:42
俺俺
904デフォルトの名無しさん:2007/12/26(水) 20:52:55
俺俺がポインタのポインタみたく見える
905デフォルトの名無しさん:2007/12/26(水) 20:53:54
そりゃ病気だ
906デフォルトの名無しさん:2007/12/26(水) 20:58:56
浮動小数点型は「上から」数桁を保存する。
整数型「下から」数桁を保存する。
だな。
907デフォルトの名無しさん:2007/12/26(水) 21:05:00
俺がポインタだ
908デフォルトの名無しさん:2007/12/26(水) 21:06:01
俺がポインタだとすると実体は何処にあるんだ
909デフォルトの名無しさん:2007/12/26(水) 21:07:04
俺が実体だ
910デフォルトの名無しさん:2007/12/26(水) 21:09:04
俺って実体がないんじゃね・・・?あれ?うわああああああああ


っていうホラーだったんだよ!
911デフォルトの名無しさん:2007/12/26(水) 21:12:10
感感俺俺
912デフォルトの名無しさん:2007/12/26(水) 21:13:31
>>907-911
そこらの講座よりポインタについて理解できました
ありがとうございます
913デフォルトの名無しさん:2007/12/26(水) 21:14:16
>>908
ポインタだって実体だ、つまりポインタという役割を持って生まれたお前という存在が
確かにここに居るということだ、自信を持て。

とか、仄かに学習効果のあるネタ書くべきかな、初心者スレ的には。
914デフォルトの名無しさん:2007/12/26(水) 21:17:53
CASLをちょっと習ってポインタを理解した俺はおかしかったのか

今回の例で書くと連想配列になりそうで困る
915デフォルトの名無しさん:2007/12/26(水) 21:18:09
>>913
ポインタみたいな奴って結構多いよな
916デフォルトの名無しさん:2007/12/26(水) 21:20:03
安価とかのがわかりやすかろう
917デフォルトの名無しさん:2007/12/26(水) 21:20:12
嫌な役割だなw
918デフォルトの名無しさん:2007/12/26(水) 21:20:47
実体俺へのポインタの実体って親の子供みたいな
919デフォルトの名無しさん:2007/12/26(水) 21:22:26
>>916
よくアンカだけ書き込む奴がいるけど、あれが俺ポインタか
920デフォルトの名無しさん:2007/12/26(水) 21:22:37
実体俺へのポインタの実体は子供で実体が子供のポインタ変数名が親か
921デフォルトの名無しさん:2007/12/26(水) 21:22:54
>>914
MASM やってポインタを理解した俺もいる。
922デフォルトの名無しさん:2007/12/26(水) 21:23:30
俺はC#やってポインタを理解した
923デフォルトの名無しさん:2007/12/26(水) 21:23:37
ポインタ変数俺の実体が>>922だとすると*俺==&俺に
924デフォルトの名無しさん:2007/12/26(水) 21:24:14
>>923>>922>>923にしてくださいorz
925デフォルトの名無しさん:2007/12/26(水) 21:24:44
ちげーよ*いらねえようわあああ
926デフォルトの名無しさん:2007/12/26(水) 21:25:18
*の使い方が複数あるのが混乱の元かもな
927デフォルトの名無しさん:2007/12/26(水) 21:25:44
>>923-924
それはきっとthisポインタだ
928デフォルトの名無しさん:2007/12/26(水) 21:26:54
そこの説明したかったわけじゃなかろう
929デフォルトの名無しさん:2007/12/26(水) 21:30:33
俺ポインタってthisポインタのことだったのか
930デフォルトの名無しさん:2007/12/26(水) 21:31:12
thisポインタだとすると俺俺はどうなる
931デフォルトの名無しさん:2007/12/26(水) 21:32:04
誰彼10円
932デフォルトの名無しさん:2007/12/26(水) 21:36:48
WindowsAPI関係の質問はダメですか?
933デフォルトの名無しさん:2007/12/26(水) 21:38:00
APIスレあるだろう
934デフォルトの名無しさん:2007/12/26(水) 21:38:35
>>932
こういうスレもあるけど
http://pc11.2ch.net/test/read.cgi/tech/1196874830/
935デフォルトの名無しさん:2007/12/26(水) 21:46:08
質問なんですが、標準のnewって本当にそんなに遅いのでしょうか?
下のようにpoolを作ってnewの実行時間と比較してみたのですが差が出ません
#include <boost/pool/pool.hpp>
#include <boost/pool/object_pool.hpp>
#include <iostream>
#include <time.h>
using namespace std;
struct Abc{
int x;
int y;};
int main(){
clock_t start1,end1,start2,end2 ;
boost::object_pool<Abc> p;
start1 = clock() ;
for( int i = 0 ; i < 0xffffff ; ++i ) {
Abc* x = p.construct();
}
end1 = clock() ;
printf("%.10f\n",(end1-start1)/CLOCKS_PER_SEC ) ;
start2 = clock() ;
for( int i = 0 ; i < 0xffffff ; ++i ) {
Abc* x = new Abc();
}
end2 = clock() ;
printf("%.10f\n",(end2-start2)/CLOCKS_PER_SEC ) ;
return 0;}
936デフォルトの名無しさん:2007/12/26(水) 21:46:17
>>933-934
どうもありがとうございます
937デフォルトの名無しさん:2007/12/26(水) 21:48:55
>>935
newの実装次第じゃ?
同じWindows用コンパイラでもVCとBCBじゃメモリマネージャの振るまい全然違うし
938デフォルトの名無しさん:2007/12/26(水) 21:49:45
newを連続して呼ぶだけではダメ。ベンチにならない。
途中でdeleteしたり、サイズの違う連中もnew-deleteしたりしないと。
939デフォルトの名無しさん:2007/12/26(水) 21:50:49
940デフォルトの名無しさん:2007/12/26(水) 21:56:48
時間の計り方間違ってね?
windowsのquerryperformancecounterを使ったprogress_timerで測定したら
0xffff回でもpool使った方が20倍くらい速いんだけど
941デフォルトの名無しさん:2007/12/26(水) 21:59:45
>>935
趣味でちまちまと俺Lispを作ってて、型はすべてスマートポインタで扱ってるんだけど、
自分でメモリプール作って標準newと取り替えたら、スクリプトの実行速度が確か5割増しくらいになった。
開発環境はBCB6(これでCUIプログラム作ってるのって変かもしれんけど、そこはスルーしてw)。
942デフォルトの名無しさん:2007/12/26(水) 22:01:44
>>941
FsstMM+標準newのテストもきぼんぬ
943デフォルトの名無しさん:2007/12/26(水) 22:06:01
mallocはMT用ライブラリをリンクすると中でロックしてたりするしなー
944デフォルトの名無しさん:2007/12/26(水) 22:17:36
クラス設計について詳しく書いてあるサイトとか本とかないだろうか?

C一通り終えてC++に移ったんだけれども、一先ず手元の本でテンプレートに入る前辺りまで進んだ
そこでおさらいも兼ねて適当なプログラムでも組もうと思ったんだけど、実際に組んでみると
クラス設計すんごい死ねる
945デフォルトの名無しさん:2007/12/26(水) 22:19:30
向き不向きがあるから注意な、ゲームとかCのが良かったり
946デフォルトの名無しさん:2007/12/26(水) 22:25:21
UNIX環境でC言語を利用して音声ファイルを利用したいと思っています。
キーボードを入力したら音声が再生できるようになればよいのですが
検索したところWindows環境でのplaysound()という関数は見つかったのですが
UNIX環境で使う関数が見つかりませんでした。
どなたか教えていただけないでしょうか?
947デフォルトの名無しさん:2007/12/26(水) 22:31:25
>>944
クラス設計はオブジェクト指向のスキルが必要だから、
オブジェクト指向の本を読むといいよ

クラスは、似たようなオブジェクトに共通する特性を表現したものだから、
まずはクラスとして表したい対象の共通的な特性が何かを考えて、
その対象がどういったデータと動作を持っているかを考えればいい。

例えば、おまいと俺の共通特性として、うんこする ってのを抽出したとするよ

そうするとPersonクラスにはputOutUnko()なんてメンバ関数が定義されるわけだよ
腹の中にはうんこが溜まってるんだから、うんこがどれぐらい溜まってるかっていうデータを持ってるわけだ
そうなると、volumeOfUnko なんていうメンバ変数が必要だよね

class Person
{
public:
  void putOutUnko() {
    if(volumeOfUnko > 0) {
      volumeOfUnko--;
    }
    return;
  }
private:
  int volumeOfUnko;
};
948デフォルトの名無しさん:2007/12/26(水) 22:31:52
「UNIXでは」、と一言ですませられる関数・APIは「無い」
/dev/dspに書き込んだり、KDEのライブラリ叩いたり、
gstreamを叩いたり、環境によって全然別
949デフォルトの名無しさん
>>948を翻訳すると、UNIXには標準の音声ライブラリがありません、ということ
だからライブラリを探す旅に出なさい、と