【初心者歓迎】C/C++室 Ver.45【環境依存OK】
at TECH
1:デフォルトの名無しさん
07/12/08 14:09:22
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.44【環境依存OK】
スレリンク(tech板)
【アップローダー】(質問が長い時はココ使うと便利)
URLリンク(kansai2channeler.hp.infoseek.co.jp)
2:デフォルトの名無しさん
07/12/08 15:30:01
スレ建て乙
3:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/12/08 16:28:03
>>3
引数に小数をとるには〜って変な質問だな。
それぞれの引数(argv)は文字列なのだから、文字列を整数や少数に変換するには?と質問するところだ。
atof
6:デフォルトの名無しさん
07/12/08 16:31:58
>>5
引数が文字列ってのをわかってないんだろ
7:デフォルトの名無しさん
07/12/08 17:01:51
>>6
いや、もちろんわかってますよ。
charへのポインタの配列ぐらい。
で、こんなことしたことないから、どうしようかなと。
>>5
なるほど。そうやればよいですね。
試してみよう。
8:デフォルトの名無しさん
07/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配列使え!って怒られてしまうんですよね・・・)
9:8
07/12/08 17:09:13
>>8
環境書き忘れました・・・おわっとる・・・
Visual Studio 2005でC++/CLIです。
よろしくお願いいたします。
10:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/12/08 17:27:40
>>10
エラーじゃなくて警告(warning)ね
それはそうとVC++2005EEで試したけど、警告でないけどなあ
12:デフォルトの名無しさん
07/12/08 17:31:56
うちのVC2005だとwarningは出ないよ。
上のコードをコピーして、int main(){ return 0;}を下に付けただけ。
13:デフォルトの名無しさん
07/12/08 17:37:26
>>8
C++/CLIは専用スレの方がいいんじゃない?
発展系とはいえ別言語なんだし。
14:デフォルトの名無しさん
07/12/08 17:39:30
C4512は警告レベル4なので、/W4つけてコンパイルすると出るね
代入演算子を定義すれば出なくなる
生成できませんって表現が良くわからないが、暗黙の代入演算子を生成できないってことなのかな
15:デフォルトの名無しさん
07/12/08 17:44:57
class hoge{
const int m_n;
public:
hoge(int n):m_n(n){};
private:
void operator=(const hoge &);
};
定義どころか宣言だけで出なくなるね。
これでインスタンスも生成できたしリンクエラーも出ない。
ってことは何処からも参照されていないってことで...
ん〜、なんで警告が出るんだろ?
16:デフォルトの名無しさん
07/12/08 17:49:51
デフォルトの代入演算子は各メンバのoperator=を呼ぶが、メンバがconstなので代入できない。
17:デフォルトの名無しさん
07/12/08 17:55:42
文字通りデフォルトの代入を定義できないという警告だろ。
当然実体化したインスタンスを代入しようとすればコンパイルエラーにはなるが、
代入演算子もインタフェースの一部だから後で宣言したヘッダに
簡単には手を入れられないということも有り得る。
必ずしも代入不可能というのがクラス設計者の意図ではないかもしれないし、
そういう時のうっかり忘れ防止としては宣言の時点で警告が出たほうが良いだろう。
18:デフォルトの名無しさん
07/12/08 17:56:44
>>13
確かにその通りですね。
C++/CLIスレの方に移動します。
ありがとうございました。
19:デフォルトの名無しさん
07/12/08 22:29:22
ここで聞いていいのかわからないんですけど、
C とPerl の対照表みたいなページってありませんか?
20:デフォルトの名無しさん
07/12/08 22:37:39
ローカル関数内で使う、ローカル変数の初期化を、プロトタイプで宣言しなかった場合(ヘッダーファイル内で宣言しないってこと)
即ちコンストラクタの初期化子やデフォルトコンストラクタの関数内で初期化せずに
ローカル関数内でコンストラクタの初期化子で初期化したように、初期化する方法はありませんか?
多分日本語でOKといわれそうですがww理解できる方お願いします。
21:デフォルトの名無しさん
07/12/08 22:48:13
>>20 日本語でおk
22:デフォルトの名無しさん
07/12/08 23:07:46
>>20
日本語でおk
コンストラクタ、と言っているんだからC++だと思うけど
まず根本的にローカル関数が定義出来ない。gccとかは出来た気もする。
ローカル関数って関数内で定義する関数よ?
次に、ローカル変数はプロトタイプ宣言に出てこない。
仮引数のことか?
>即ちコンストラクタの初期化子や・・・
全然「即ち」になってない
23:デフォルトの名無しさん
07/12/08 23:09:11
ローカルをメンバに置き換えるんだ!
24:デフォルトの名無しさん
07/12/08 23:22:30
定義と宣言の違いがよくわからないのですが、どう違うのですか?
25:デフォルトの名無しさん
07/12/08 23:37:06
>>24
定義は宣言の一種だから、「違い」って言う時点でおかしな話。
26:24
07/12/08 23:42:09
int a; <= これはどっち?
int main(){
int b; <= これはどっち?
}
27:デフォルトの名無しさん
07/12/08 23:44:07
>>26
どっちも定義、且つ宣言。
28:デフォルトの名無しさん
07/12/08 23:45:41
>>26
宣言と実体化の問題を言いたいの? int ならそこで実体化してるから
わかりにくい。例えば配列とかなら
int a[]; とか int *a;
とかしたら、実体化はさらにしなきゃいかん。
29:24
07/12/08 23:47:01
URLリンク(www.geocities.jp)
を見ると、宣言みたいな感じなんですが
30:24
07/12/08 23:52:07
知りたいのは、本を読んで、定義と宣言という言葉がが出てくるのですが、
イマイチ、両者をどのように区別しているのか理解できないからです。
31:デフォルトの名無しさん
07/12/09 00:00:44
宣言は変数で、定義は構造体とかtypedefだろ?
32:デフォルトの名無しさん
07/12/09 00:14:56
C++におけるキャストの概念がいまいち理解できないんですが、
dynamic_cast以外は、
C形式のキャストを用途ごとに分けて機能を分割することで不正と思われるキャストをコンパイル時に弾けるようにしよう、
てことで合ってますか?
33:デフォルトの名無しさん
07/12/09 00:16:05
>>30 >>25,27
>>31 ちがうよ。
34:デフォルトの名無しさん
07/12/09 00:16:37
>>32 合ってるよ。
35:デフォルトの名無しさん
07/12/09 00:17:36
>>31
それは違うような気がする
グローバル変数ではexternつけたのとかは定義でなく宣言
関数で言うところのプロトタイプ宣言と処理内容の定義の違いと考えればいいかもしれない
36:デフォルトの名無しさん
07/12/09 00:19:02
>>34
ありがとうございます
ずっとそれぞれに何か特殊な機能があるんだと思ってました……
37:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/12/09 00:21:24
便乗質問だが、仮引数は定義でなく宣言になるのか?
39:デフォルトの名無しさん
07/12/09 00:23:23
>>38 うん。
40:デフォルトの名無しさん
07/12/09 00:28:44
>>39
ありがとう
要するに実体生成が伴うのが定義って感じか
ということはクラスのメンバ変数は全部定義でなく宣言?
41:デフォルトの名無しさん
07/12/09 00:37:34
>>40
CとC++では、「何が定義になるのか」が違うんだよ。
>要するに実体生成が伴うのが定義って感じか
これはC言語の話。
マ板の某クソスレから引っ張ってきた。
スレリンク(prog板:593番)
CはC99なんで、普及してるC89では若干違うのかも知れない。
スレ違いなんで、あっちで引っ張らないように。
42:デフォルトの名無しさん
07/12/09 00:45:24
概念的には
宣言というのはコンパイラに名前の存在を知らせること。
定義というのはある名前の実体を作成すること。
43:デフォルトの名無しさん
07/12/09 00:45:41
>>41
ありがとう
何か分かったような分からないようなだが
44:デフォルトの名無しさん
07/12/09 00:50:15
>>43
どの辺が分からん?
45:デフォルトの名無しさん
07/12/09 01:03:10
>>44
いや、かたや定義の例が書いてあってかたや宣言の例が書いてあるから、
俺の貧弱な頭じゃ違いがぱっと理解できんw
とりあえずメンバ変数については分かったが
あと「結合指定」「型定義宣言」て言葉が分からんかった
前者はぐぐっても出てけえひんし、
後者はtypedefのことか?
46:デフォルトの名無しさん
07/12/09 01:18:43
>結合指定
「extern "C"」とかそういうヤツ。
>後者はtypedefのことか?
それであってる。
47:デフォルトの名無しさん
07/12/09 01:20:42
>>46
わざわざサンクス
ぐぐり不足ですた
48:24
07/12/09 01:26:42
まとめて、皆様、有難うございました。
CとC++では、意味が違うなんて。
49:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/12/09 02:54:00
iteratorは要素を指すポインタのようなモノだと考えれば、
ポインタに*をつけると実体pair<>を指すことになる。
んで、pairに->演算子はオーバーロードされてないからエラーになるわけだ。
大体あってる?
51:デフォルトの名無しさん
07/12/09 02:55:38
(*it).second
it->second
こういうことじゃなくて?
52:デフォルトの名無しさん
07/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);
53:50
07/12/09 03:01:00
優先順位間違ってた/(^o^)\
54:49
07/12/09 03:15:00
みなさん、ありがとう!
もっと精進しまっす!
55:デフォルトの名無しさん
07/12/09 04:40:48
vector<string> str; str.resize(10000);
はメモリは少しも食わないんでしょうか?
stringって作った時点ではメモリー確保しないですから、配列でも一緒ですか?
56:デフォルトの名無しさん
07/12/09 04:57:19
>>55
string自身にだってサイズはあるよ。
俺の環境だと、string型は28バイトもある。
57:デフォルトの名無しさん
07/12/09 05:05:11
サンクス
58:デフォルトの名無しさん
07/12/09 09:43:27
スレ違うかもしれないがfloat除算を間違えるって言うのは、間違えていた
アクセスできない配列にアクセスしていただけだった
59:58
07/12/09 10:09:23
floatのエラーではなくてvectorのバク(解放のタイミング)だった
何度も配列を短時間で生成繰り返したとき、前のが解放される前に次の確保がくると駄目らしい
グローバルに一度確保にしたら良くなった
60:デフォルトの名無しさん
07/12/09 10:10:31
>>59
何の話かわからんがkwsk
61:58
07/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;
}
62:58
07/12/09 10:16:05
解放が追いつかず、次から次へと確保が来ると駄目らしい
63:デフォルトの名無しさん
07/12/09 10:18:58
>>58
環境は?普通は seg fault とかエラーで落ちると思うんだけど。
そうじゃなければ vector の bug ということなのかな。
64:デフォルトの名無しさん
07/12/09 10:28:37
>>61
手元のVC2005EE, bcc5.82, gcc3.4.4で問題なかった。
>>58の環境が知りたい。
65:58
07/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くらい)をアクセスしてリターンすると毎回違う回数で落ちます
66:58
07/12/09 10:35:31
いま計算したところ一回ごとに確保する容量は32M程度です
67:デフォルトの名無しさん
07/12/09 10:38:51
「落ちる」で済ませる奴は信用できない。
68:デフォルトの名無しさん
07/12/09 10:39:22
>>66
> dateとxの前半(1/3くらい)をアクセスして
↑このへんにバグがあるかもしれんので最小限のソースをくれるとありがたい。
あと、落ちるというのは例外を吐くのか、問答無用で落ちるのかも知りたい。
69:58
07/12/09 10:46:17
>>68
グローバルに定義して何度も繰り返して使ったら全く落ちなくなりましたよ
70:デフォルトの名無しさん
07/12/09 10:48:00
>>65
「落ちる」って seg fault とかでプログラムがクラッシュするの?
それだったらメモリが足りないなら正常な動きだと思う。
もしも、出力して正常に終わったように見えて違う答だというのならば大問題。
71:58
07/12/09 10:51:44
>>70
DOSプロンプトからエラーを言われ停止しますよ 終了後ごとにvectorは解放されるはずなのでメモリ不足にはならないはずですよ
72:デフォルトの名無しさん
07/12/09 10:53:33
>>69
そういうアドホックな対処ではなくて、もっと具体的な原因が知りたいなあと。
そもそもコンパイラ(vector)のバグと見なしてるようだけど、それも疑わしいしね。
コンパイラのバグ → ここを見た人に役立つ
>>58の書いたコードのバグ → 同じ過ちを繰り返さずに済む
73:デフォルトの名無しさん
07/12/09 10:57:09
この時まだ>>58は知らなかった>>67が真実だということを。
74:デフォルトの名無しさん
07/12/09 11:00:14
>>71
>>58 の書き方だと結果が出て間違っているように読める。
最後まで走って結果が出て、違ったという場合はあったの?
75:デフォルトの名無しさん
07/12/09 11:02:05
再現性のあるソースを出せば一発なのに端折って小出しにする奴の多いこと
76:デフォルトの名無しさん
07/12/09 11:03:55
エラーメッセージはコピペ。
コレ常識ネ。
77:wolf ◆8VH3XAqjlU
07/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
URLリンク(msdn.microsoft.com)
78:デフォルトの名無しさん
07/12/09 11:44:47
>>26
> int a; <= これはどっち?
> int b; <= これはどっち?
C++ なら、どっちも定義だ。
79:デフォルトの名無しさん
07/12/09 12:04:27
>>77
なんだコイツ?
何が言いたいのかさっぱり分からないんだが、77はアホの子か?
80:デフォルトの名無しさん
07/12/09 12:07:20
>>58こないのか。残念。
81:デフォルトの名無しさん
07/12/09 14:54:22
VCです
class Foo {
char szBuff[MAX_PATH];
ZeroMemory( szBuff, MAX_PATH );
pubulic:
Foo();
~Foo();
};
szBuffをコンストラクタの初期化子で初期化するにはどの様に書いたらいいですか?
82:デフォルトの名無しさん
07/12/09 15:20:07
int a; <= これはどっち?
int main(){
int b; <= これはどっち?
}
両方とも宣言定義です。
略して、宣言、定義、または、宣定という人もいます。
83:デフォルトの名無しさん
07/12/09 15:20:46
>>81
できません。 vector にすれば初期化できます。この場合は本体の中で
ZeroMemory() しても同じ結果になります。
84:デフォルトの名無しさん
07/12/09 15:32:20
>>83そうですか、ではあきらめます
85:デフォルトの名無しさん
07/12/09 17:37:11
クラスとかはヘッダに書くと思いますが
コンパイルしてオブジェクトにしておくことはできないのでしょうか。
毎回コンパイルするのは非効率だと思います。
86:デフォルトの名無しさん
07/12/09 17:45:50
>>85
C/C++ ではヘッダでは定義なしの宣言だけにしておいて、対応するソースファイルで
定義を与えるという方法で重複コンパイルを避けるのが一般的。
C++ のテンプレートによってこの方法がうまく機能しにくい状況になっているので、
コンパイラによってはプリコンパイルドヘッダとか、あらかじめヘッダをコンパイルして
保存しておく機能を持っているものもある。
87:デフォルトの名無しさん
07/12/09 17:57:13
>>86
そのあたりの「一般的」な作法がまとめてある書籍はありますか?
VC++では無い本がいいけど、独習C++とかになるんですかね?
88:デフォルトの名無しさん
07/12/09 19:20:51
お作法のまとめだったら Effective シリーズとかがいいんじゃないの。
89:デフォルトの名無しさん
07/12/09 20:43:11
>>61
ちょっと遅レスだが
BCCの最新バージョンBCC5.9.2(C++Builder2007付属)では落ちない
90:wolf ◆8VH3XAqjlU
07/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:
URLリンク(msdn.microsoft.com)
91:デフォルトの名無しさん
07/12/09 21:36:31
>>90
基地外スレにお帰りください
92:デフォルトの名無しさん
07/12/09 21:58:13
お勧めなエディタ教えて
93:デフォルトの名無しさん
07/12/09 21:59:25
c言語って数学で言うところの中括弧{}と同じ機能を持つ演算子って有る?
それとも、変数を使って一時的に値を記憶させないと駄目?
94:デフォルトの名無しさん
07/12/09 21:59:56
>>92
cat
95:デフォルトの名無しさん
07/12/09 22:00:46
>>92
すれ違い。いちおう誘導しとくけど、その聞き方じゃどこでもまともな答えは
期待できないと思われ。せめて今使ってるやつのどこが不満なのか書かないと。
【エディタ】ソース何で書いてる? 1スレ目
スレリンク(tech板)
テキストエディタをまた〜り語ろう ver.24
スレリンク(software板)
96:デフォルトの名無しさん
07/12/09 22:02:15
>>93
数学で言うところの中括弧ってなんだ?式の優先順位を決めるための括弧なら、
何重だろうと全部丸括弧を使うんだけど。
97:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/12/09 22:21:53
>>97
演算子の優先順位を調べたらわかると思うけど、
乗除算の方が加減算より優先されるので括弧を減らせるよ
99:デフォルトの名無しさん
07/12/09 22:24:45
>>98
なるほど!
だったら、
sqrt((5*176 - 26*26)*(5*145 - 25*25))
でおkですね!
100:デフォルトの名無しさん
07/12/10 02:08:00
ハッシュテーブル作るときなんですけど・・・
vector< myclass >型の固定長配列を用意して、それを例えばTBL[n]として
衝突が起こったらTBL[n].resize(2)して別のデータを格納していけば実装できそうですけど
一次元に自分で登録先を見つけてくる方法より効率悪いですか? 衝突は頻繁に起こらないとします
101:デフォルトの名無しさん
07/12/10 02:42:27
>>100
効率って言っても空間効率と速度効率がある。速度にしても、実際の比較が
ハッシュ関数に比べてどんだけ思いかで変わるでしょ。そこらへんの情報無しには
答えようがない。効率は実測が基本。
102:デフォルトの名無しさん
07/12/10 02:53:22
メモリ効率は動的確保の方が上ですけど、メモリ解放と確保にかかる時間なんですよね
実測してみます
103:93
07/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:デフォルトの名無しさん
07/12/10 04:52:09
>>103
戻り値はちゃんと / 演算子が受け取っています。
105:93
07/12/10 05:02:22
>>104
ええっ、そうなんですか?
演算子にそんな機能が有ったとは知らなかったです。
どこか詳しく説明している本やサイトは無いでしょうか?
106:デフォルトの名無しさん
07/12/10 05:04:46
無い
107:93
07/12/10 05:10:40
無いのにどうして分かったんですか!
どうして戻り値を受け取らないのにちゃんと計算できたのがとても不思議なんですけれど。
108:デフォルトの名無しさん
07/12/10 05:12:39
戻り値は除算演算子が「受け取っている」
109:デフォルトの名無しさん
07/12/10 05:13:08
何が戻値を「受け取ってない」んだい
110:デフォルトの名無しさん
07/12/10 05:13:11
二項演算子の意味をちゃんと調べてみ。
111:デフォルトの名無しさん
07/12/10 05:13:18
>>103
戻り値は受け取らなくてもいい
sqrt(10);
という文だけでもエラーにならない
返却される数値がdoubleならば数字を直接かくのと同じ
2.5 * 8
という計算は
x=2.5 ; y= 8;
x * y としなくても計算できる
112:デフォルトの名無しさん
07/12/10 08:23:00
>>107
君が何を不思議がっているのかとても不思議なんですけど
113:デフォルトの名無しさん
07/12/10 08:28:44
>>103
>sqrt((26 * 23 - 5 * 5) * (26 * 6 - 7 * 10)がこの式の計算結果そのもののよう
その通り
ちゃんと分かってんじゃん
114:デフォルトの名無しさん
07/12/10 08:28:51
そもそも
a = func(5);
で、aに代入できるのは、右辺が値を持ってることを推測できそうなものだけど
115:デフォルトの名無しさん
07/12/10 08:30:02
あ、日本語になってねぇorz
116:デフォルトの名無しさん
07/12/10 08:30:42
>>114
きっと、
変数名=関数名(引数);
て形自体が一つの構文だと思ってるんだろうな
戻り値を受け取る構文
117:デフォルトの名無しさん
07/12/10 08:34:31
>>93
数学で、
hoge = (26 × 176 - 25 × 24) / √((26 × 23 - 5 × 5) × (26 × 6 - 7 × 10))
と書いても、計算の仕方のルールがあるから、正しい結果を出せるでしょ。
それと同じで、sqrt()を先に計算して、その戻り値を使って / を計算するルールがあるから。
118:デフォルトの名無しさん
07/12/10 08:36:06
int func(int z) { return z * 2; }
a = 8 + func(5);
って文があるとコンパイラは
a = 8 + 10;
a = 18;
って感じで処理する
119:デフォルトの名無しさん
07/12/10 08:43:37
断定口調かよ
120:デフォルトの名無しさん
07/12/10 09:00:02
ディレクトリ構造をメモリに保存するにはどうしたらいいですか?
ファイルに連番を付けてファイルのはパスがわかるようにしたいです
121:デフォルトの名無しさん
07/12/10 09:01:47
多分木がいいとおもうのですが簡潔な方法有りますか
122:デフォルトの名無しさん
07/12/10 09:45:50
>>120-121 とりあえず自分でやれよ。具体的にわかんないところがあったら相談してもいいからさ。
123:デフォルトの名無しさん
07/12/10 09:46:43
前スレの一人用チャットです。
┌─┐
│ │←出力用子ウィンドウ 入力ウィンドウに文字を打ち、エンターキーが押されたら
└─┘ 出力ウィンドウに文字が表示されるようにしたい。
┌─┐←入力用子ウィンドウ
└─┘
ソースURLリンク(kansai2channeler.hp.infoseek.co.jp)
winspectorでチェックしたところ、そもそもエンターキーが押された信号が出ていなかったので、
子ウィンドウのウィンドウプロシージャも作ったんですが、今度は入力用子ウィンドウが表示されなくなりました。
プログラムを開始してすぐにエンターキーを押すとメッセージボックスが出るので、入力用子ウィンドウ自体は
どこかに作られていると思うんですが、自分の設置した場所には見当たりません。
猫でも〜を読んでもどこが間違っているのか分からないんですが、どうしたら子ウィンドウが表示されますか。
あと、まだ中身を作っていないのに、GUI?だけでやたら手こずってるんですが、こんなもんですか?
124:デフォルトの名無しさん
07/12/10 09:50:44
特警しか思い出せなかった orz
125:デフォルトの名無しさん
07/12/10 10:27:15
動的確保の変数って
int *n=new int;
と定義するんですか?
なんかいつも*nとして使えなくて不便なんですが
配列の場合は静的と同じですが なんとかなりますか
126:デフォルトの名無しさん
07/12/10 10:33:35
>>123 C/C++でGUIはめんどい。そんなもん。
>>125
それであってる。deleteを忘れるなよ。
最後の行がよくわからない。
127:デフォルトの名無しさん
07/12/10 10:37:26
int a[10]; としたものとint *a=new int [10];
の使い方は同じなのに
変数だと違います
128:デフォルトの名無しさん
07/12/10 10:48:13
>>123
SetWindowLongをやめればとりあえず表示された
129:デフォルトの名無しさん
07/12/10 10:57:45
>>123
130行目の引数がおかしいお
エディットコントロールのデフォルトウィンドウプロシージャが呼ばれてない
130:デフォルトの名無しさん
07/12/10 10:58:54
int **p; としたとき
p[100]は、領域確保しなくてもつねにアクセスできますか?
アドレスの配列を作りたいのですが
131:デフォルトの名無しさん
07/12/10 11:01:28
これはエラーになります どうすればいいですか?
int **p,n=100;
p[10000]=&n;
cout<<*p[10000];
132:デフォルトの名無しさん
07/12/10 11:03:56
これはエラーになりません ポインタ配列も動的確保などしないと使えませんか?
int* *p= new int* [20000];
int n=100;
p[10000]=&n;
cout<<*p[10000];
133:123
07/12/10 11:04:25
>>129
うあああああ!!DefProcにしたらできました!!
ありがとうございます!!
134:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/12/10 12:08:55
自分のIPアドレスを取得するにはどうしたらいいのでしょうか?
C言語、Windowsでお願いします。
136:デフォルトの名無しさん
07/12/10 12:30:48
>>135
ipconfia
137:デフォルトの名無しさん
07/12/10 13:28:58
複数のIP持ってる場合もあるしなあ
138:デフォルトの名無しさん
07/12/10 13:31:42
NICを全部あげるんだ
139:デフォルトの名無しさん
07/12/10 13:32:17
>>135
gethostbyname("")で取得
ipconfigの結果を解析
140:135
07/12/10 13:44:23
プログラムの中でipconfigを実行するにはどのようにすれば
いいのでしょうか?
参考になるようなサイトを教えていただけると嬉しいです。
141:デフォルトの名無しさん
07/12/10 13:56:44
system()
CreateProcess()
あとはパイプとか適当にぐぐれ
142:135
07/12/10 14:03:05
>>141
ありがとうございます。
早速調べてみます
143:デフォルトの名無しさん
07/12/10 14:29:09
>>131-132
int *a;
ポインタはアドレスを入れるための変数と考えるんだ。
int *a[100];
ポインタ配列は、アドレスを入れるための変数からなる配列
int **a;
ポインタのポインタは、ややこしいが
(アドレスを入れるための変数の)アドレスを入れるための変数
きちんと整理して理解しておいた方が良いよ。
144:デフォルトの名無しさん
07/12/10 20:15:27
クラスのコンストラクタ呼び出しや初期化リスト以外で、変数を
int x(0); のように初期化するのってキモイですか?
145:デフォルトの名無しさん
07/12/10 20:35:11
かなり初歩的な質問だけど、ボタンのCaptionをプログラム内で変えるのってどうやるの?
146:デフォルトの名無しさん
07/12/10 21:12:53
SetWindowText()
Win32APIスレへ
147:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/12/10 22:43:54
>>147
どちらもうまく表示されない
double N; としろ。
149:デフォルトの名無しさん
07/12/10 22:45:31
>>148
ああ!わかりました
150:デフォルトの名無しさん
07/12/10 23:45:42
>>144
そんなのキモイなんて言ってたら引数付きコンストラクタしかないクラスで
変数が作れないだろ。
151:デフォルトの名無しさん
07/12/10 23:54:39
いや、だから彼はPOD型に使うのはキモいかと言ってるんだと思うよ
152:デフォルトの名無しさん
07/12/10 23:58:49
書き方が統一できていいじゃないか
153:デフォルトの名無しさん
07/12/11 00:01:56
一歩間違えると関数宣言になって意味不明なエラー出るから、っていうかそうなったことがあるから、
ちょっと怖いかな。
C からやってる人のこと考えても、あからさまな利点が無い限りやめといたほうがいいと思う。
154:デフォルトの名無しさん
07/12/11 00:13:54
>>150-153
皆様ご意見ありがとうございます。
関数と間違えられたので止めといたほうがよさそうですね。
155:デフォルトの名無しさん
07/12/11 04:57:40
VCです
クラスのメンバー変数を、コンストラクタの初期化子で、初期化する事はできますし、
推奨もされていますが、クラスのメンバー関数は、コンストラクターの
初期化子で初期化するのは、できませんよね?
ていうか、メンバー関数に初期化という、概念は無いですよね?
156:デフォルトの名無しさん
07/12/11 04:58:30
>>155
関数を初期化?
関数ポインタではなくて?
157:デフォルトの名無しさん
07/12/11 05:04:48
>>156
>>関数を初期化?
そこを迷っているんです、メンバー関数の持つ変数は初期化できても
メンバー関数に初期化なんて、概念は無いですよねやっぱり
>関数ポインタではなくて?
関数ポインタなら初期化できるんでしょうか?
158:デフォルトの名無しさん
07/12/11 05:08:44
>>157
そもそも何を実現したいのかわからない。
具体的にどのような記述でどういう動作になるのを期待してるの?
159:デフォルトの名無しさん
07/12/11 05:17:59
>そもそも何を実現したいのかわからない。
今Effective C++読んでいて、Cしか知らないので、
目新しいことが多くて、C++の作法というか、スタイルに戸惑っているところです
具体的に何を期待するとかという意味はありません、ふと思ったまでです。
160:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/12/11 05:26:29
すんません
×ただ、この様な構造体をは@、Aの方法で初期化できると思うのですが
○この様な構造体をは@、Aの方法で初期化できると思うのですが
162:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/12/11 09:07:45
FindNextFileの読み込み順序は制御できますか?
164:デフォルトの名無しさん
07/12/11 09:12:44
>>160
Cは分かるという話だから、何か簡単な勘違いをしているのだと思うけど、
そのエラーの原因はtypedef
C言語でも、typedefしただけじゃ使えないでしょ?
変数を宣言しないと。
今回はそもそも再利用しないのでtypedefしなくてもいいから
struct hoge {
...
} hage;
て形でいいと思うけど。
165:デフォルトの名無しさん
07/12/11 09:31:12
>>160
>error C2512: 'st_data' : クラス、構造体、共用体に既定のコンストラクタがありません。
コレって、引数を持つコンストラクタしかないクラス(等)に対して、
引数をつけずにコンストラクタを呼んだ時に見かける。
Foo::st_data data;
とかで変数定義すると、引数の無いコンストラクタ呼び出そうとするけど、
どっかにそんな記述してない?
166:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/12/11 10:01:41
sort配列の中で、insertよりも大きい値の位置「i」を探している
繰り返し中一度も真にならなければ「i」はsorted+1(最後)になる
168:デフォルトの名無しさん
07/12/11 12:08:25
>>163
URLリンク(msdn2.microsoft.com)
>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.
169:164
07/12/11 12:23:53
すまん俺のは忘れてくれ
170:デフォルトの名無しさん
07/12/11 13:20:32
vector <string> str;
をディスクに保存したいのですがどの用にしたら良いんでしょうか?
171:デフォルトの名無しさん
07/12/11 13:31:24
どうにでも出来すぎて、どう答えたもんかわからんな。何か制約はあるの?
たとえば、stringの中身に改行が無いことがわかっているなら、大雑把に一行一要素ずつ出力していって
読み出すときはこれまた大雑把にstd::getline()で読み出していけばいいし、
そうでないなら、stringのサイズと中身を順に詰めていって、読み出す時は
サイズを読む→その分だけデータを読む、を繰り返していけばいい。
ファイルの開き方がわからないとか、そういうレベルなら「ファイルストリーム」とかで検索して勉強しる。
172:デフォルトの名無しさん
07/12/11 13:33:12
すみません
string型にバイナリデータは読み込めませんか?
char buf[1000];として bufに100バイト読み込んだとして、(string)bufと変換するしか無いですか?
vector <string> str;の構造自体をバイナリで記録できれば変換必要ないと思うんですが・・・無理ですよね?
173:デフォルトの名無しさん
07/12/11 13:35:54
>>171
すみません
なるべ読み書きの速度を上げたいんですが・・・
行単位での書き込みは、もし1000万行とかになったら時間コストがかかりすぎますよね
バイナリで一度に5メガずつとか読み込んで速度を上げたいです
174:デフォルトの名無しさん
07/12/11 13:39:49
stringのアドレスからどの様にデータが配置されているか判れば、直接バイナリで読み書きできそうですが・・・
size()以外の情報データは何ビットか判りますか?
175:デフォルトの名無しさん
07/12/11 13:44:33
>>173
>>171が
>stringのサイズと中身を順に詰めていって、読み出す時は
>サイズを読む→その分だけデータを読む、を繰り返していけばいい。
と書いてるじゃないか
176:デフォルトの名無しさん
07/12/11 13:45:33
>>174
stringは可変長領域へのポインタを持っているだけだろうからその方法じゃ無理
177:デフォルトの名無しさん
07/12/11 13:46:29
char配列経由しないでstringに格納する方法は有りますか?
178:デフォルトの名無しさん
07/12/11 13:49:08
>>177
何をどこから格納するの?
179:177
07/12/11 14:04:14
たとえばdoubleならIEEE型のバイナリを8バイトずつディスクに書き込めるじゃないですか
stringもバイナリで読み書きできない物かと
180:デフォルトの名無しさん
07/12/11 14:06:13
>>179
c_str()を使うといいよ
181:デフォルトの名無しさん
07/12/11 14:06:27
自前でchar配列を管理した方が読み書きは速そうですね
182:179
07/12/11 14:07:46
書き込むときは良いんですけど、読みこみがchar配列から変換する必要がでてしまいます
183:180
07/12/11 14:08:12
ごめん間違えた忘れて
184:デフォルトの名無しさん
07/12/11 14:08:32
あらかじめresizeしてから格納すればよいのでは?
185:デフォルトの名無しさん
07/12/11 14:10:06
リサイズで領域確保すればバイナリで読み込めますか?
186:デフォルトの名無しさん
07/12/11 14:12:11
試せ
187:デフォルトの名無しさん
07/12/11 14:14:06
速度を気にしてるようだけど、実測した上で言ってるの?
そもそもデータ構造はvector<string>でいいの?
要求を満たす代替案は考えてないの?
188:デフォルトの名無しさん
07/12/11 14:15:57
質問をまとめるとですね・・・
string型を直接ディスクに書き込んだり直接読んだり出来るかという事です
189:デフォルトの名無しさん
07/12/11 14:21:56
>>188
「直接」が曖昧
string s;
ofstream f(filename);
f << s;
fwrite(&s, sizeof(string), 1, fp);
190:デフォルトの名無しさん
07/12/11 14:23:43
>>189
その方法で読み書き出来るんですか?試してみます
stringは読み込むときにresizeしておかなくても読み込めるんですか?
確保していないところに書き込まれないですか?
191:デフォルトの名無しさん
07/12/11 14:24:31
>>188
boost::serialization
192:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/12/11 14:32:32
string sを長くしたら表示中にエラーが出ました やはり確保しておかないと駄目ですか
194:デフォルトの名無しさん
07/12/11 14:36:48
ありがとうございました 確保しておいたらエラー出ませんでした
195:デフォルトの名無しさん
07/12/11 14:39:32
>>192
これは良いコードw
196:デフォルトの名無しさん
07/12/11 14:50:57
でも確保するサイズがなぜか2倍以下だとエラーになります なんか不安定だしメモリ食うので安全にcharにしようと思います
197:デフォルトの名無しさん
07/12/11 14:55:50
YUV422に関して、ど素人なのですが
再生用YUV422のサンプルファイルと、
再生用サンプルプログラム等を
ダウンロード出来るサイトご存じの方いませんでしょうか?
198:デフォルトの名無しさん
07/12/11 14:59:22
>>192
うわぁ…
199:デフォルトの名無しさん
07/12/11 15:17:07
すみません
vector<string>なんですけど、既に10Mバイトくらい使用していたとして、確保されている領域も無いとき
新たにstring型を追加するときは、別の空き領域を探してきて元のデータをコピーするんでしょうか? 手間かかりますよね?
また、vector<string> str;
str.resize(100000);
と十分に確保してあれば各str[n]がどんなにメモリ食っても再配置されませんか?
200:デフォルトの名無しさん
07/12/11 15:18:39
再配置されているかどうか調べるにはどうすればいいですか? 意図的に再配置を起こさせるような実験プログラムは判りますか?
201:デフォルトの名無しさん
07/12/11 15:31:39
>>199
きっと意図しているのは str.reserve() なのではないかと思うけど、ふ
つうの実装だったらたくさんリザーブしておけばそこまでは再配置され
ないんじゃないかねえ。規格は手元にないので知らない。
メモリへの要件が厳しいようなら、自分で vector 相当のものを書いた
ほうが柔軟に対応できるかもしれない。
202:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/12/11 15:46:45
自前で作るならstring使わないでchar配列を動的確保した方が安定しそうですね
でもサブルーチンで確保しても値は保証されますか?
204:デフォルトの名無しさん
07/12/11 15:49:12
そもそも、メンバ関数を初期化という概念がどこから来たのか知りたいぜ。
205:デフォルトの名無しさん
07/12/11 15:54:00
>>202の場合、pを引数で渡しても、strは消滅の可能性がありますよね だから読み込めない場合がありますよね
staticやnewで確保すればpを引数にしてデータアクセスはつねにできますか
206:デフォルトの名無しさん
07/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」となると、これの再配置は確かにコストが高いわけで、
つまりこの辺は、君がイジろうとしているデータの性質次第で、アプローチが変わってくる部分だと思う。
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
4989日前に更新/246 KB
担当:undef