【初心者歓迎】C/C++室 Ver.45【環境依存OK】at TECH
【初心者歓迎】C/C++室 Ver.45【環境依存OK】 - 暇つぶし2ch1:デフォルトの名無しさん
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 ){} //②
  } st_data;

public:
  Foo();
  ~Foo();
}:
ただ、この様な構造体をは①、②の方法で初期化できると思うのですが
実装で①の方法で初期化した変数にアクセスすると
error C2512: 'st_data' : クラス、構造体、共用体に既定のコンストラクタがありません。
となります、組み込み型の変数はやはり、②の方法でインスタンスを与えないといけないのでしょうか?
①と②の違いは、なんなんでしょうか?


161:デフォルトの名無しさん
07/12/11 05:26:29
すんません
×ただ、この様な構造体をは①、②の方法で初期化できると思うのですが
○この様な構造体をは①、②の方法で初期化できると思うのですが


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 ){} //②
};

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」となると、これの再配置は確かにコストが高いわけで、
つまりこの辺は、君がイジろうとしているデータの性質次第で、アプローチが変わってくる部分だと思う。

207:デフォルトの名無しさん
07/12/11 16:03:23
>>206 ありがとう

208:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/12/11 18:28:51
>>206
>>stringの実装には色んなやり方があるけど、いずれの場合も、サイズの大きな中身はポインタで持ってる。
>>だから、10MB使用している状態でvectorが要素を再配置したからといって、その10MBのすべてが
>>せっせと大移動を繰り広げるわけではない。
では、vector型データの参照渡しは無意味ってこと?
例えば
vector<int>& Foo(){ return hoge; }; //①
vector<int> Foo(){ return hoge; }; //②
この場合、①も②も関数を引き渡すコストは同じなの?


210:デフォルトの名無しさん
07/12/11 18:37:26
お前は何を言ってるんだ

211:デフォルトの名無しさん
07/12/11 18:40:16
>206
でもさ、vectorの再配置は、コピーコンストラクタで行うんだから、
stringの性質によっては、どっちも10MBすべて大移動になるでそ?
特に最近は、スレッドの絡みで、COWしないのが流行りだし。

212:デフォルトの名無しさん
07/12/11 19:25:24
なんか話が噛み合ってないおかーん

213:デフォルトの名無しさん
07/12/11 19:58:08
rope使えよ

214:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/12/11 21:51:05
x, yそれぞれの比較関数作ってsortに渡せばいいじゃん

216:デフォルトの名無しさん
07/12/11 22:04:16
>>215
クラス内に書くと
operator<(const point&, const point&)' must take exactly one argument
と怒られるので仕方なくグローバル関数にしています、
上と同じ内容のオペレータをメンバ関数にするにはどうしたらいいのかサッパリでorz

217:デフォルトの名無しさん
07/12/11 22:08:54
bool operator < (const point& rhs) { return (this->x < rhs.x); }

218:デフォルトの名無しさん
07/12/11 22:50:00
age

219:デフォルトの名無しさん
07/12/11 23:37:46
>>217
'class Hoge' has no member named 'x'
オペレータ全然わかんねorz

220:デフォルトの名無しさん
07/12/11 23:41:39
pointをメンバで持ってるクラスについて、そのpointで比較したいなら、
当然、rhsの型をそのクラスにして、比較したいpoint型のメンバ変数名を
差し挟まなくちゃあいけませんよ。

221:デフォルトの名無しさん
07/12/12 00:12:25
現在、60kbyte分のメモリをmallocしてmemsetで60kbyteのサイズ分文字を格納しています。
これを、ソケット通信すると、MTUごとにフラグメント化され60kbyteの一つのデータとして
ではなく、MTUサイズ分の複数の異なるデータになってしまいます。
(途中の経路でパケットキャプチャしてオフセットフラグを確認しすべて0だった)

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



222:デフォルトの名無しさん
07/12/12 00:14:03
TCPは?

223:221
07/12/12 00:22:01
>>222
TCP通信かUDP通信かってことですか?
TCP通信でオプション等は何も設定していません。
質問の意図を取り違えていたらすみません。

224:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/12/12 00:57:22
なんで12bitなんだろう
力業しかないんじゃない?

226:デフォルトの名無しさん
07/12/12 01:04:43
>>224
signed だとシフトが安全に使えないから無理な予感。符号はどうなってんの?

227:デフォルトの名無しさん
07/12/12 01:06:41
>>216
なんでメンバ関数にしたいの?関連のあるコードだからってことなら static メンバ関数に
すればよさそうだけど。

228:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/12/12 01:34:13

12bit + パディング4bt × 16コ にしてもらえ

230:デフォルトの名無しさん
07/12/12 01:49:20
>>229
天才現る!その考えはなかったわ。
うん、そうしよう。
ありがとうございました。

231:デフォルトの名無しさん
07/12/12 02:30:00
すいませんCの質問かどうか微妙なんですが、
同じ数字を繰り返す式例えば
while(){
int num++;
a = num % 3;
}であれば012012012とaの値が変化しますよね、
これと別に0121012101210って感じで変化する数字を作り出すやり方ってありますかね?

232:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/12/12 02:39:43
>>232

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

ありがとでした!!

234:デフォルトの名無しさん
07/12/12 02:53:15
>>221
TCPなら順序制御があるけど、何が問題なの?
少なくともトランスポート層以上では正しい
データになってるだろ。
アプリ層で60kByte取得するまで待てばいいんでは?


235:デフォルトの名無しさん
07/12/12 02:58:13
>>233
三角関数使うといいんじゃね?

236:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/12/12 05:07:14
>>224
どうしてunion使わないの?

238:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/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]};

ってできないかなぁと思って。

241:240
07/12/12 08:12:12
struct Foo test[i/2] = {atof(argv[i]), argv[1+i]};
の間違いです。

242:デフォルトの名無しさん
07/12/12 10:06:49
>>236
それはやりすぎwww

243:デフォルトの名無しさん
07/12/12 10:31:57
i/0ってw

244:デフォルトの名無しさん
07/12/12 10:44:43
>>224
要素が12bitのように振舞うvector<signed long>のラッパー
vector<signed long>に12bitずつ格納するラッパー
イテレータも実装すればいろいろ応用できるだろう

245:デフォルトの名無しさん
07/12/12 11:12:50
>>240
造体の要素ごとに入れていくか、
コンストラクタつきの構造体(クラス)にして、引数にするとかじゃね?
っていうか、やりたい事を見ると、簡単な構文解析が必要なんじゃね?



246:デフォルトの名無しさん
07/12/12 11:51:50
>>221
MTU (最大転送単位)なんだから、MTUより大きなパケットは使えません。
なんで分割されると困るの?


247:デフォルトの名無しさん
07/12/12 13:23:24
if(!a)printf("hello world");
だとaが偽(0の時)の時printfを実行するという意味でしょうか


248:デフォルトの名無しさん
07/12/12 13:31:10
そうですよ。

249:デフォルトの名無しさん
07/12/12 13:34:02
>>247の質問をエスパーするとだな

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

ってことだと思う

250:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/12/12 13:44:05
>>250>>240へのレスね。ちなみにマルチバイト文字列だとバグるかも

252:デフォルトの名無しさん
07/12/12 13:50:44
>>250
240 を見る限り、実際にカンマ区切りのテキストを入力するわけじゃなくて
argv に2つずつ並んでるみたいだよ。そんなめんどくさいことしなくていいみたい。

253:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/12/12 15:08:21
ポインタ配列は、一つ当たり32bit使いますか?


255:デフォルトの名無しさん
07/12/12 15:12:56
>>254
環境によります。
printf("%u\n", sizeof(void *))とでもしてバイト数を割り出してみてください。
大抵の環境では、その8倍がビット数になります。

256:デフォルトの名無しさん
07/12/12 15:14:39
サンクス

257:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/12/12 15:38:14
>>257
ループの外で count という変数を宣言して、0で初期化
ループの中で、isdigit() だったら count = count * 10 + ch-'0'
analysis() を呼ぶところで、count の回数だけ繰り返し


259:デフォルトの名無しさん
07/12/12 15:39:51
>>257
日本語とCでOK。

260:デフォルトの名無しさん
07/12/12 16:09:33
>>258
有難うございます、やってみます。

261:デフォルトの名無しさん
07/12/12 16:59:20
const int num = 5;
int a[num];

って、C++では、配列を宣言ってできるの?
これが出来たら、配列が動的に宣言できちゃうことにならない?

262:デフォルトの名無しさん
07/12/12 17:02:34
>>261
numはコンパイル時に確定しているから静的でないといけないC++でも問題ない。
Cの場合は、ローカル変数なら同じ方法で動的に宣言できる。

263:デフォルトの名無しさん
07/12/12 17:45:57
>>261
const は動的に書き換えられないので問題ない。

264:デフォルトの名無しさん
07/12/12 17:46:57
>>262
それはC99だろ

265:デフォルトの名無しさん
07/12/12 17:49:24
>>263
でも、変数の初期化時に動的な値で初期化できないかい?

const int num = f();

みたいな感じで

266:デフォルトの名無しさん
07/12/12 17:59:55
>>265
やってみろ。話はそれからだ。

>>264
C99はCではないとでも?

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

ちゃんとC99である事を明記するべきだといっているんだ

268:デフォルトの名無しさん
07/12/12 19:42:03
なに、じゃあいまさらK&R形式でやれと?
構造体の直接代入は禁止かい?

269:デフォルトの名無しさん
07/12/12 19:53:47
頭の悪い絡み方だが、本人的には鋭い突き上げなんだろうね。

270:266
07/12/12 20:19:43
いや、>268は私じゃないし。

271:デフォルトの名無しさん
07/12/12 20:21:03
いまの32bitx86用商用コンパイラってだいたいC++コンパイラだろ
C99をサポートした上記用Cコンパイラって何かある?

272:デフォルトの名無しさん
07/12/12 20:27:39
取り敢えず、icc, sun studioはc99だね。

273:デフォルトの名無しさん
07/12/12 20:52:11
そもそも32bit x86用商用コンパイラ、というカテゴリそのものがアレだなー。

274:デフォルトの名無しさん
07/12/12 21:26:35
まぁC99、あんま流行ってないしな。

275:デフォルトの名無しさん
07/12/12 22:02:47
>>274
まーね、C++のCの部分だけで十分なんだけどって感じかな。
俺としては、C99サポートよりC++TR1のサポートを要求するって感じだ。

>>272
やっぱ、銭にならん、あるいは、対応要求が強くないからかなサポートしないってことかな。


276:デフォルトの名無しさん
07/12/12 22:07:35
というか、「いまの32bitx86商用Cコンパイラ」をC99対応に関わらず
列挙してみろってば。

277:デフォルトの名無しさん
07/12/12 22:19:19
ググレカス

278:デフォルトの名無しさん
07/12/12 22:49:57
C++で typedef は何の為にあるんでしょうか。
自己満足以外の使い方を教えてください。

279:デフォルトの名無しさん
07/12/12 22:54:20
移植性と書きやすさ

280:デフォルトの名無しさん
07/12/12 23:06:02
>>275
>まーね、C++のCの部分だけで十分なんだけどって感じかな。
つーか、C89から使ってる人間からすると、C99でどうしても欲しい機能って無いのよ。
むしろC99に対応するより、ISOやらJISやらにC89の規格を閲覧出来るようにしろと要求したい。

281:デフォルトの名無しさん
07/12/12 23:11:36
>>278
traitsの表現
というか自己満足してるのはお前だけ

282:デフォルトの名無しさん
07/12/12 23:27:42
typedef無かったらめっちゃ不便やん?
テンプレート使うときとか後で変更される可能性のある型使うときとか

283:デフォルトの名無しさん
07/12/12 23:31:06 BE:335659853-2BP(35)
コードコンプリート第2版とModernC++Designまじおすすめ

284:デフォルトの名無しさん
07/12/13 00:13:25
VCのうにコードな時、TEXT("もじれつ")でWSTR[]が作れるけど、
文字からWCHARを作るにはどうすればいいの?

285:デフォルトの名無しさん
07/12/13 00:24:05
おまえらC#も使えるよな?

286:デフォルトの名無しさん
07/12/13 00:24:24
TEXT('も');
_T('じ');

287:デフォルトの名無しさん
07/12/13 00:35:32
VCのうにコードな時、TEXT("もじれつ")でWSTR[]が作れるけど、

いや無理だろ

288:デフォルトの名無しさん
07/12/13 00:45:21
>>284
C/C++言語で文字列をどうこう言う前に、自然言語で正しい(意味が伝わる)文字列を
扱えるようにするのが先だとは思わないかね?

289:デフォルトの名無しさん
07/12/13 19:15:14
vector配列の解放はどうやるんですか? resizeとかで縮めるしかないですか

290:デフォルトの名無しさん
07/12/13 19:17:53
自己解決しました clear();というのがありました

291:デフォルトの名無しさん
07/12/13 19:25:20
だめだ
解放されていない

292:デフォルトの名無しさん
07/12/13 19:26:46
reserve(0);でも解放されないよ どうしたら良いんですか

293:デフォルトの名無しさん
07/12/13 19:30:50
vectorの解放ってあんましピンとこないなー。

std::vector<T>( hoge ).swap( hoge )
でシュリンクできる、ってEffectiveSTLにあったけど、
そういう話?

294:デフォルトの名無しさん
07/12/13 19:34:25
解放できましたよ 標準でついてないのが良くないですね
main(){
int n;
vector<double> a(10000000,1);
vector<double>().swap(a);
scanf("%d",&n);
}


295:デフォルトの名無しさん
07/12/13 19:37:39
>>293
作業領域でたとえば100M使っていたとして、そのあとにもプログラムが続く場合
作業領域は消したいですよね 多分サブルーチンで確保したものは戻るときに消えていると思うのですが
そうでないと消したいわけなんですが・・標準でついてないです

296:デフォルトの名無しさん
07/12/13 19:44:52
そういう意味なら、スコープ抜けたら消えるでしょ。
vectorの定義から消したい場所までをブロックで囲めば。

297:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/12/13 19:50:30
>>296
実験してみました ちゃんと解放しますね 勉強になりました

main(){
{vector<double> b(10000000,1); Sleep(1000);}
int n; scanf("%d",&n);
}

299:デフォルトの名無しさん
07/12/13 20:00:26
でも有効範囲を括弧で括るのは紛らわしいですね 他にも適用範囲の別の物がまじっていたら困ります
明示的に解放するほうが良さそうですね 


300:デフォルトの名無しさん
07/12/13 21:00:51
vcはclearで解放しなかったかな

301:デフォルトの名無しさん
07/12/13 21:23:11
C99の複合リテラルに対応しているコンパイラって何がありますか?

302:デフォルトの名無しさん
07/12/13 21:40:38
gccって更新はやいんじやないの?

303:デフォルトの名無しさん
07/12/14 00:36:56
>>299
まともにスコープ切ってれば明示的な解放(ブロック作成)が要るようになることなんて
無いと思うよ。そうとう特殊な場合でしょ。

304:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/12/14 11:44:17
文字列リテラルにスコープってある?

char *func(){
return "Hello,World!!!";
}
てあり?

306:デフォルトの名無しさん
07/12/14 11:56:07
>>305
大蟻。
つーか、常套手段。但し、const char *を返すべき。

307:306
07/12/14 11:58:04
>>305
書き忘れた。文字列リテラル自体の生存期間はstaticと同じく、プログラム開始時から終了時まで。

308:デフォルトの名無しさん
07/12/14 12:47:11
>>306-307
サンクス
そうかconstだったな

309:デフォルトの名無しさん
07/12/14 15:35:34
スコープ(名前の有効範囲。コンパイル時にチェックされる)と
寿命(変数を置く場所がその変数のための場所である期間。実行時の話)は
別の話だぞー。

310:デフォルトの名無しさん
07/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バイト表記になっています。
何度も見直していますが間違いがわかりませんでした。
よろしくお願いします

311:310
07/12/14 22:40:24
動作環境はWinXP
使用コンパイラはCpadというものです。

312:デフォルトの名無しさん
07/12/14 22:41:38
型のサイズは環境によって違う。
long double は 8, 10, 16 バイトの3種類くらい見たことがある。

313:310
07/12/14 22:57:54
>型のサイズは環境によって違う。
long double は 8, 10, 16 バイトの3種類くらい見たことがある。

環境の違いがあるということも頭に入れて勉強を進めたいと思います。
ありがとうございました。

314:デフォルトの名無しさん
07/12/14 23:39:03
GCCとVCくらいしか使わん身としては
10バイトってのは珍しいね

315:デフォルトの名無しさん
07/12/14 23:52:31
コンソールで画面整形というか画面操作というか、正しい呼称はわからないのですが
例えば複数行に渡って
1111111
2222222
3333333
4444444
などと表示した後、それに被せる、ないしは消して同じ位置に出力というのは不可能でしょうか?

自分で調べてみて大量の\r\bを並べてみてもうまくいかなく今は大量の\nでごまかしごまかしやっています

316:デフォルトの名無しさん
07/12/15 00:08:05
そんなあなたに ncurses

でもwin用ってあったけ?

317:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/12/15 00:14:37
PDCursesってのもあるでよ。

319:デフォルトの名無しさん
07/12/15 00:15:09
cursesならある。
VCか何かだったかな・・・。

でもそれよか、そのぐらいならエスケープシーケンス有功にした方が早いかもよ。

320:デフォルトの名無しさん
07/12/15 00:21:51
エスケープシーケンスっていうと自分のところでしか結局動かないことになっちゃうような・・?

PDCurses、なかなかいいページがみつからないのでちょっと試行錯誤してきてみます

321:デフォルトの名無しさん
07/12/15 00:33:06
fseek的なのほしかぁ、ありがとう

322:デフォルトの名無しさん
07/12/15 00:43:58
enum Foo { a = 0, b = 10, };
int main()
{
Foo x = Foo(3);
}

VC71ではこれがコンパイル出来るんだけど、
Foo xが列挙型Fooにない値を取り得るというのは正しい動作?

323:デフォルトの名無しさん
07/12/15 00:46:46
結局windows.hが入ってきましたとさ

324:デフォルトの名無しさん
07/12/15 01:29:51
>>322
xは11になったろ?

325:デフォルトの名無しさん
07/12/15 02:23:22
>>324
いや、int(x) == 3だった。

326:デフォルトの名無しさん
07/12/15 07:52:18
>>314
Intel 系の CPU は浮動小数点を 10 バイトで扱ってるから別に珍しくはない。
Intel 系の環境なら、16 バイトになってても 6 バイトはパディングが入ってるだけ。普通なら。
昔は Turbo C++ とか 10 バイトだったような。

>>315
Win ならコンソール系の関数があるのは知っている。
使った事無いから目的の操作ができるかどうかは知らんが。
URLリンク(msdn.microsoft.com)

327:デフォルトの名無しさん
07/12/15 10:06:17
>>322
列挙Fooの値の範囲は
下限が0で上限が15になる。
xがその範囲の値ならFoo(x)
はOK。

328:デフォルトの名無しさん
07/12/15 14:17:34
DLLでdosコマンドを呼び出すとき、ms-dosの標準ではないアプリなどですが
全くdos画面を出さずに呼び出すにはどうしたらいいですか? エラーが出るとdos画面が出てきてしまいます

329:デフォルトの名無しさん
07/12/15 14:23:54
>>328
SetStdHandle

330:デフォルトの名無しさん
07/12/15 14:43:49
>>329
サンクス
日本語サイト検索してもヒットが少ないんですけどどうやってその知識を得たんですが? 物知りさんですね

331:デフォルトの名無しさん
07/12/15 16:57:51
ソースの行数とかクラスの数とかを計測したいのですが
何かいいソフトはないでしょうか? Linuxです

332:デフォルトの名無しさん
07/12/15 17:10:37
>>331
行数は wc でいけるでしょ。クラスの数は grep でだいたいいけそうだけど、
doxygen とか使ったほうがいいかもね。

333:デフォルトの名無しさん
07/12/15 17:11:37
最近プログラミングをはじめたのですがWindowsXP+VC2005環境でexeファイルにtxtファイルをドラッグ&ドロップして
fstreamでファイル操作する簡単なプログラムを作ろうと思ったのですが

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

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

ユニコード文字、マルチバイト文字の二つのコンパイルを試しましたが駄目でした。

334:デフォルトの名無しさん
07/12/15 17:17:06
受け取れる
ドラックや入力する時点で空白で分離されているのでは

335:デフォルトの名無しさん
07/12/15 17:18:51
>>332
空行やコメントのみの行を除外したり、
関数の中身のみの行数を数えたり、とか、
いろいろしたいとなると wc だけじゃ辛いかもね。

336:デフォルトの名無しさん
07/12/15 17:19:58
>>333
VC2005 の fstream には日本語ファイル開けないバグがある。
URLリンク(www.google.co.jp)

337:333
07/12/15 17:23:09
>>334 >>336
回答ありがとうございます。

VC2005特有の症状ってことですかね、検索しても全然わからないで困り果てていたので助かりました。

338:331
07/12/15 17:29:46
>>332>>335
ありがとう。なんとかなった

339:デフォルトの名無しさん
07/12/15 17:30:57
>>327
200でも-1でも0x7fffffffでもint n;Foo(n);でもコンパイル通ったよ。
ちなみにsizeof(Foo) == 4だった。

やっぱ列挙型引数でも範囲外チェックしなければいかんのかね…

340:デフォルトの名無しさん
07/12/15 18:28:20
>>339
>>327で書いたのは規格の話。
コンパイルが通ろうが実行できようが、規格上はは未定義。
つまり0~15以外の値については実装依存。

341:デフォルトの名無しさん
07/12/15 18:50:13
列挙子って、少なくとも int 以上のサイズになるんじゃなかったっけ? 規格上は。

342:デフォルトの名無しさん
07/12/15 18:51:31
規格の話してるんなら C か C++ か、章番号とか、ちゃんと示してくれ。

343:デフォルトの名無しさん
07/12/15 19:05:39
それを言うなら >340 だって

344:デフォルトの名無しさん
07/12/15 19:07:00
>>343
文盲乙

345:デフォルトの名無しさん
07/12/15 19:09:23
アンカを付けないなら誤解される事は覚悟しなきゃダメだ。

346:デフォルトの名無しさん
07/12/15 19:10:15
まあ>>342は規格の話してるんなら、って明言してるわけだし文盲乙は適当だな

347:デフォルトの名無しさん
07/12/15 19:17:16
そもそも >341 のみに対するレスか >340-341 の両方に対するレスかが不明

348:デフォルトの名無しさん
07/12/15 19:19:51
規格の話って言ってるじゃん

両方というかすべてに対してとるべきだし、本人はとられることに文句は言えないと

349:デフォルトの名無しさん
07/12/15 19:27:34
VC2005でwcoutに出力しています。
全角などが含まれているとそれ以降wcoutが動作しなくなる問題があって
>>333さんの問題と同じ原因かと思うのですが、
特定のスレッドのみC++ロケールを変更するにはどうしたらよいのでしょうか?
  std::locale::global(std::locale(""));
すると全スレッドに適用されてしまうので今回は使えません

350:デフォルトの名無しさん
07/12/15 19:32:13
wcoutを使わずcoutで処理する

351:デフォルトの名無しさん
07/12/15 19:32:50
locale 関連ってホンマ実装がいい加減なコンパイラが多くて困る。

352:デフォルトの名無しさん
07/12/15 19:33:36
外国人が作っているからな゜

353:339
07/12/15 19:35:14
>>340
VCが規格違反しているわけではないってことでいいのかな?
まあどちらにしてもコンパイル通る以上対策はせなあかんということだが…
ともかくサンクス。

354:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/12/15 19:40:56
シャンピーとどいたー\(^o^)/

356:デフォルトの名無しさん
07/12/15 19:41:28
ごばくー/(^o^)\

357:349
07/12/15 19:53:53
cout << "うはwwwおkww";

ありがとうございます orz

358:デフォルトの名無しさん
07/12/15 20:09:37
初心者ですお願いします
何も入力されてないの(エンターーのみ)をデータとして扱うにはどうしたらいいでしょうか?
初歩的ですいません

359:デフォルトの名無しさん
07/12/15 20:15:00
>>358
scanf("%d",・・・); みたいにしてるとか?


360:デフォルトの名無しさん
07/12/15 20:26:53
getch()の戻り値はエンターの時どうなんだろ

361:デフォルトの名無しさん
07/12/15 20:32:50
シャンピーとどいたー\(^o^)/

362:デフォルトの名無しさん
07/12/15 20:33:44
ごばくー/(^o^)\

363:デフォルトの名無しさん
07/12/15 20:41:01
>>359
yes

364:デフォルトの名無しさん
07/12/15 20:45:02
エンターいれっと普通に13返ってくるな

365:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/12/15 21:14:43
>>365
thanx

367:デフォルトの名無しさん
07/12/15 22:59:08
>>353
規格違反ではないね。実装依存だから何でもアリ。
VCの実装がそういうふうに対応しているという
だけのことだね。

368:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/12/16 05:55:25
半角空白は区切られる
あきらめろ

370:デフォルトの名無しさん
07/12/16 05:56:15
argv[2]
も出力する

371:デフォルトの名無しさん
07/12/16 05:59:50
ああ、マジですかorz
それって、OSのバグとかじゃなくて
C言語の文字列の表現の仕様ですかね?
半角を入れると
桜木'¥0' 花道'¥0'
ってなるんでしょうか?

372:デフォルトの名無しさん
07/12/16 06:15:23
そういうことだな

373:デフォルトの名無しさん
07/12/16 06:19:36
うはー、せっかくここまでプログラム書いて、バグつぶししていたときに、
こんな問題に出会うとは!
どうしよう。鬱だ。寝よう。

374:デフォルトの名無しさん
07/12/16 08:13:42
>>368
program "桜木 花道"

375:デフォルトの名無しさん
07/12/16 08:47:55
>>371
C言語の文字列の表現の問題というよりは、コンソールの仕様(コマンドラインに入力した文字列を
半角で引数を区切る)かな。
自分でシェルを作って、引数の区切りを半角文字以外で指示できれば argv[1] = "桜木 花道" も可能だよ。

argv[]にどういう文字列が渡されるかもC言語の規格の範疇だっけ?


376:デフォルトの名無しさん
07/12/16 09:09:48
>>375

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



377:375
07/12/16 09:20:01
>>374に書いてあるように、わざわざ自前シェルを作らなくても
たいていのプラットフォームでは "" で囲めば事足りるね。なぜか忘れてたorz


378:デフォルトの名無しさん
07/12/16 09:40:06
>>373
program "安西 先生"

379:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/12/16 10:19:34
今時のコンパイラはエラーになるのか

381:デフォルトの名無しさん
07/12/16 10:23:58
>>373
> うはー、せっかくここまでプログラム書いて、バグつぶししていたときに、
> こんな問題に出会うとは!
> どうしよう。鬱だ。寝よう。
>
>>368 のプログラムでそれは大げさだろ。>>370 がまっとうな解答だと思うが。
argc に情報あるんだし。

382:デフォルトの名無しさん
07/12/16 11:42:47
VS2005MFCですが、OnKeyDown()関数で受け取ったint型のアスキーコードを、
元の文字に変換してstd::string型の変数に代入するにはどうしたらいいですか?
int n = 0x30; //キーボードの0を押下して得られるアスキーコード
nをstring型の0に変換したい
intからCString型の例は結構あちこちで、散見してるんですが・・・・


383:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/12/16 11:58:44
>>382
代入: s.assign(1, static_cast<char>(n))
変換: std::string(1, static_cast<char>(n))

385:デフォルトの名無しさん
07/12/16 12:00:25
str = static_cast<char>(n) が正解だね。これに何か不満でもあるの?

386:デフォルトの名無しさん
07/12/16 12:05:56
>>384
>>385
サンクス

387:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/12/16 16:42:53
>>387
例えばアイコンにファイルをD&Dして起動した場合、
argvにはそのファイルのパスが渡される。

コマンドプロンプトから起動する場合は、
任意のオプションを文字列として渡すことができる。


389:デフォルトの名無しさん
07/12/16 16:48:55
コマンドプロンプトやファイル名を指定して実行では、
hege.exe /x /yのように実行ファイルの後に文字列(コマンドライン引数)を指定できる。
これがCのプログラムでは、mainの引数で受け取れるということ。
Windowsでは関連付け起動、実行ファイルへのドロップ&ドロップ起動などでもコマンドライン引数が使われる。

390:デフォルトの名無しさん
07/12/16 16:59:43
>>388-389
早々にありがとうございます。

つまり先ほど例に出したものだと
WebブラウザならばそいつにhtmlファイルをD&Dするとそのhtmlファイルのパスが渡り、ブラウザが起動し、そのhtmlの内容を表示するとか
マルチメディアプレーヤなら音楽ファイルをD&Dするとその音楽ファイルのパスが渡り、プレーヤが起動し、その音楽が再生されるとか
といった具合でしょうか


391:デフォルトの名無しさん
07/12/16 17:14:11
そういうこと。
ただし、ウインドウへのD&Dは全く別の仕組みなんで混同しないでね。

392:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/12/16 17:53:31
returnいらないの?exitの定義知らないんであれだけど

394:デフォルトの名無しさん
07/12/16 18:04:39
exit()使ってるのにstdlib.hをインクルードしてないな。
ってか普通は return 0; だろ。


395:デフォルトの名無しさん
07/12/16 18:06:46
つかエスケープ文字が全角だったり

396:デフォルトの名無しさん
07/12/16 19:49:45
C++の入門書をやり終えました。
ですがいまいち、クラスの利点がわかりません。
部品化して便利になるというイメージはあるのですが。
まだC言語っぽい書き方をしてしまいます(C++っぽい書き方もいまいちわかりませんが)。
クラスの利点やC++の書き方について書かれた書籍ってありますか?

397:デフォルトの名無しさん
07/12/16 20:14:03
>>396
>クラスの利点がわかりません。
まずは標準ライブラリを使いこなすところから始めたら?
そうしてクラスの利点が分かれば、自分で作ろうという気にもなるだろう

398:デフォルトの名無しさん
07/12/16 20:14:27
>>396
適切な本を薦められなくて申し訳ないけど、まずは本で勉強するだけでなく
実際に書いてみて試行錯誤することが大切だと思うよ。

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

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

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

仕事なら早く身につける必要があるだろうけど、学生や趣味でやるなら時間をかけてもいいんじゃない?

399:デフォルトの名無しさん
07/12/16 20:28:34
クラスの勉強と思って簡単なゲームを作ってみたんだけれども、クラス間のやり取りが面倒すぎてやめた

あるAクラス内の配列をBクラスのメンバ関数から参照したいとき、とか
friendってのもあったがそんなこというと全部のクラスにfriendつける必要でるし、
クラスのうまい利用の仕方とか載ってる本探すべきっぽいなぁ

400:デフォルトの名無しさん
07/12/16 20:43:17
C++でnewしたヤツをdeleteする時、
newした時の型のままのポインタをdeleteしないとダメ?

キャストされて別の型になってるポインタをdeleteしても
大丈夫?

401:デフォルトの名無しさん
07/12/16 20:44:45
>>400
virtual

402:デフォルトの名無しさん
07/12/16 20:57:41
>>400
new したときのクラスの基底クラスにキャストされてるポインタは、その基底クラスが
virtual なデストラクタを持っていれば delete できる。

403:デフォルトの名無しさん
07/12/17 00:14:23
>>399
何がやりたかったのかわからんが、多分それはクラス設計ミス。

404:デフォルトの名無しさん
07/12/17 00:16:01
>>399
参照するだけなら、クラスAの配列の要素にアクセスするメンバ関数をinlineで作るとか

405:デフォルトの名無しさん
07/12/17 03:59:03
クラスの設計って難しいよねぇ。
PDO(PHPね)とか使うと、オブジェクト指向すげぇ!って感動するけれど、
自分でいざ、クラス設計してねって言われると、Orz。
何かコツがあるのかしらん?
Cのライブラリでも、構造体使ってうまくオブジェクト指向っぽいもの?を実現しているのを見ると、
感激する!

406:デフォルトの名無しさん
07/12/17 06:07:46
もっとレベルの高い環境に触れないとわからんよ

407:399
07/12/17 09:21:57
クラス設計、やっぱそういう本探してこよう・・

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

で、よくわからずクラスをマップごとに分けてたんだ、例えばドラクエでいうと宿屋の中と町の中が別クラス
そんな状態で宿屋で休むと町の様子が変化したりetcをやろうとして爆発した

408:デフォルトの名無しさん
07/12/17 11:46:43
>>396
個人的には398に同意だけど、初学者向けの本であれば
「ゼロから学ぶ C++」(日経BP)って本に、CからC++への
移行時の要点ということで、クラスや継承を使うと便利な
ケースと使わない方がいいケースとか、is-a、has-a関係
とかの基本的な話が簡潔に載ってた気がするので、
立ち読みしてみてもいいかも。
ただかなり平易なので、ネットで効率よく検索できれば
不必要(または物足りない)かもしれないけど。


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch