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

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。
※sageは禁止です。
【前スレ】
【初心者歓迎】C/C++室 Ver.28【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1149815331/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
2デフォルトの名無しさん:2006/07/08(土) 23:08:21
2?
3デフォルトの名無しさん:2006/07/08(土) 23:11:13
>1
4デフォルトの名無しさん:2006/07/10(月) 19:48:50
問題集でどうしても解けないとこが...orz
図書館で借りたため答えがついてないorz


$ ./calc 9 - 8 + 7 - 6 + 5 - 4 + 3 - 2 + 1
9 - 8 + 7 - 6 + 5 - 4 + 3 - 2 + 1 = 5
$

●入力した数式とその計算結果を表示してください
●演算は加算(+)と減算(−)をサポートして下さい
●数式の数値の入力個数には制限がないものとしてください

本当に初心者の質問なんですが・・・どうか御協力お願いします・・・
5デフォルトの名無しさん:2006/07/10(月) 19:52:33
学生なら自分でやらないと後で損するよ
65:2006/07/10(月) 19:57:52
>>4
そうですよね。甘えてた自分が恥ずかしいです。
もうちょっと自力で考えてみます!ありがとうございます!
7デフォルトの名無しさん:2006/07/10(月) 21:29:02
宿題スレというあまり本人の為にならないスレがあるよ!
8デフォルトの名無しさん:2006/07/10(月) 21:58:30
質問者から考える力を吸い取って回答者の糧とするスレだな
9デフォルトの名無しさん:2006/07/10(月) 22:19:37
10デフォルトの名無しさん:2006/07/11(火) 04:32:10
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/2317.txt
上記ソースはVisualStudio2005でfor_eachを使ったサンプルソースなんですが
ソース内のvoid operator()(int elem) \ の\が何を意味するのかがわかりません。
どなたかわかる人、教えてください。お願いします。
11デフォルトの名無しさん:2006/07/11(火) 04:52:59
>>10
行末のバックスラッシュは改行文字をエスケープするわけだけど、
その例では何の役にも立ってない気がする。
12デフォルトの名無しさん:2006/07/11(火) 09:16:31
>>11さん
確かに意味が無いようで、消してもエラーにはなりませんでした
ただ、何か意図があって、\を付加したと思うので、気になってしまいます。
13デフォルトの名無しさん:2006/07/11(火) 09:24:50
元は次の行があったのをコピペミスしたんだと思われ
14デフォルトの名無しさん:2006/07/11(火) 13:51:56
Cで、配列の長さを変える(伸ばす)事って出来ませんよね?
a[100]と宣言したのを、後でa[500]まで伸ばすっていう。
配列じゃなくてポインタを使って、
int *p;
p = (int *) malloc(sizeof(int) * 100);
...
p = (int *) realloc(p, sizeof(int) * 500);

とすれば配列を伸ばすのとほぼ同じようなことが出来るのかな
15デフォルトの名無しさん:2006/07/11(火) 14:03:12
その通り。
16デフォルトの名無しさん:2006/07/11(火) 14:32:41
>>14
realloc が失敗した時に悲しくなるから
一度別のポインタに入れてヌルチェックしてから
p に入れたほうがいいよ。
17デフォルトの名無しさん:2006/07/11(火) 14:59:52
>>16
18デフォルトの名無しさん:2006/07/11(火) 15:10:00
>>17
reallocに失敗した場合、元の領域は解放されない。
上の場合問答無用でpに上書きしてるので、失敗した場合元の領域のポインタを失ってしまう。
19デフォルトの名無しさん:2006/07/11(火) 19:38:38
Linux上でCのプログラムをgccで普通にコンパイルした時と-Oオプションをつけて最適化してコンパイルしたとき、
実行後のプログラムの動作が異なる場合、どんなミスを疑ったらいいんでしょうか?
2週間ほど悩んでおります
20デフォルトの名無しさん:2006/07/11(火) 19:41:28
自分が入れたバグ
21デフォルトの名無しさん:2006/07/11(火) 20:14:50
単なる初期化忘れだろ。
22デフォルトの名無しさん:2006/07/11(火) 20:35:51
class A{
 string m;
public:
 string &x(){
  return m;
 }
};

int main(){
 A a;
 a.x()="aaa";
 cout << a.x() << endl;
 return 0;
}

このようなコードがあるとき、mainを変えずに、a.x()で値を取得するときと、a.x()=で値を代入
するときとで挙動を変えることはできるのでしょうか。
x()の返り値を別なクラスにして、operator=とoperator string()などを使えばできそうで
もうすこし簡単にやる方法はありますか?
23デフォルトの名無しさん:2006/07/11(火) 20:41:36
>>22
> x()の返り値を別なクラスにして、operator=とoperator string()などを使えばできそうで
普通はこうする
24デフォルトの名無しさん:2006/07/11(火) 20:54:09
普通はそもそも値を得る方と設定する方を別の関数にするという設計にする。
25デフォルトの名無しさん:2006/07/11(火) 21:02:43
参照をそのまま返すのではpublicと変わんない。
つか意味あるのって感じ
2619:2006/07/11(火) 21:27:42
>>20
そうだとは思っているのですがいかんせん原因が全くつかめません

>>21
2次元配列の初期化をfor文の2重ループでしていますが、
コンパイルによっては初期化が正しくなされていなかったりしているような状態にはなります
27デフォルトの名無しさん:2006/07/11(火) 21:31:40
>26
まずは症状が再現する最小限のソースをうp
2819:2006/07/11(火) 21:43:17
>>27
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/2325.txt
2次元配列を使った○×ゲームのプログラムです
以前宿題解決スレのほうにも書いたものとほぼ同じですが結局回答が得られないままです
29デフォルトの名無しさん:2006/07/11(火) 21:50:07
配列の添字は0から
30デフォルトの名無しさん:2006/07/12(水) 12:39:39
C++の質問です。

class C {
  size_t b_size;
  struct {
    int a;
    int b[];
    int c;
    ...
  } st;
};
↑のようなクラスを作りたいのですが、st の中身をバイトストリームから直に読み込むので
a, b[0], b[1], ... b[b_size-1], c ... が連続した領域に確保されるようにしたいです。
b_size の値はコンストラクタが呼ばれたときにはまだ分かりません。こういうのを作ることは可能ですか?

int *data メンバを作って
int a() { return data[0]; }
int b(int i) { return data[1 + i]; }
int c() { return data[b_size + 1]; }
とかしこしこ書いていったほうがいいですか?
31デフォルトの名無しさん:2006/07/12(水) 12:58:20
>>30
各メンバが連続して配置されなくてもいいように、
バイトストリームから読み込むべき。

読み込むときに連続して読み込むことと、
読み込んだデータを格納しておく時に連続させることは別問題。
32デフォルトの名無しさん:2006/07/12(水) 22:35:41

const char* について質問です。

const char* hoge = "Hello";
char* foo = hoge;

をすると、「error C2440: '初期化中' : 'const char *' から 'char *' に変換できません。変換で修飾子が失われます。」
とエラーが出ます。
どうしたらいいんですか?

環境
Visual C++ 2005 EE
WindowsXP + SP2

33デフォルトの名無しさん:2006/07/12(水) 22:43:02
const_castでconst外せるが何がしたいんだ?
その状況でやると危険だぞ。
34デフォルトの名無しさん:2006/07/12(水) 22:45:25
レガシーAPIが本来const char*を要求するところでchar*を要求しているとか
35デフォルトの名無しさん:2006/07/12(水) 22:48:46

初心者には何が危険かちゃんといってあげなきゃわかんないよ。
とかいってる私もわかんないんだけど。
36デフォルトの名無しさん:2006/07/12(水) 22:53:32
>>32
foo を削除して、かわりに hoge を使えばいいよ。
37デフォルトの名無しさん:2006/07/12(水) 22:56:36
>>35
文字列リテラルを変更する危険がある。
文字列リテラルを変更した場合は未定義動作。
38デフォルトの名無しさん:2006/07/12(水) 23:16:31
鼻から悪魔が出てくる可能性がある
39デフォルトの名無しさん:2006/07/13(木) 00:45:05
class CLASS
{
private:
enum { A=0, B, C };
const char str[][32] = {"A","B","C"};
};
こんなのってダメでした?
40コンパイラが変?:2006/07/13(木) 00:55:15
class A
{
public:
A(){};
operator=(A &other){};
operator<<(A &other){};
};
class B : public A
{
public:
B(){};
};
int main(void)
{
A aa ; B bb ;
// bb = aa ; こっちはコンパイルエラーになります。
bb << aa ;//こっちはOK。
return 0;
}
41デフォルトの名無しさん:2006/07/13(木) 00:56:43
>>40
operator=もoperator<<も戻り値の型が指定されていない。
メンバ関数の定義の終わりにセミコロンは要らない。
42デフォルトの名無しさん:2006/07/13(木) 00:57:58
>>39
strが静的メンバでも良ければ対処のしようがある。
43デフォルトの名無しさん:2006/07/13(木) 01:00:47
>>40
基底クラスのメンバは派生クラスの同名のメンバによって隠される。
operator= はユーザーが宣言しない場合もコンパイラがデフォルトの宣言を
追加してしまうので、常に宣言されることになり、常に隠される。

あと >>41 ね。
4440:2006/07/13(木) 01:01:29
>>41
サンクス。直した。
class A
{
public:
A(){};
void operator=(A &other){}
void operator<<(A &other){}
};
class B : public A
{
public:
B(){};
};
int main(void)
{
A aa ; B bb ;
bb = aa ;
bb << aa ;
return 0;
}
4540:2006/07/13(木) 01:03:21
>>43
回答ありがと。むずそうだがなんとなくわかった。
46デフォルトの名無しさん:2006/07/13(木) 01:52:02
コンストラクタのセミコロン残ってるよ。
47デフォルトの名無しさん:2006/07/13(木) 02:22:05
定積分の近似計算をするプログラムです。
n = 5,10,15,…,50のときの近似値を表示させるプログラムなのですが、
↓のプログラムだとエラーが出てしまいます。どこをどう直せば動作するのか教えてください。

http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/2338.txt
48デフォルトの名無しさん:2006/07/13(木) 02:32:37
普通に動いたよ
4947:2006/07/13(木) 02:35:48
Visual Windows for BC++ を使っているのですが、それだとエラーが出てしまうんです…
50デフォルトの名無しさん:2006/07/13(木) 02:38:51
>>47
配列は固定長で確保
double y1[101];

可変長配列のサポートはC99から
5147:2006/07/13(木) 02:46:02
>>50
あ、配列の長さを固定したら動作しました。
夜遅くにわざわざありがとうございます(´▽`)
52デフォルトの名無しさん:2006/07/13(木) 11:11:18
linuxのiconv関数とかが引数にポインタのポインタを
とりますが
関数の引数としてポインタのポインタを渡す理由は
なんでしょうか?
大きな構造体を渡す際のメモリコピーを避けるためなら
ポインタのポインタでなくてポインタだけで十分だと
思うのですが

53デフォルトの名無しさん:2006/07/13(木) 11:23:58
iconv関数は、呼び出し元が渡したポインタを変更する仕様だから。
5452:2006/07/13(木) 11:40:12
>>53
ありがとうございます
後もう一個質問させて下さい

ポインタのポインタって
ポインタのアドレスのことですよね?
55デフォルトの名無しさん:2006/07/13(木) 12:00:36

* ビットマップ用のメモリ確保
* ピクセルから値の取得
* ピクセルに値を設定
* 画像のファイルからの読み込み
* 画像のファイルへの書きだし

ぐらいのことをやりたいのですが、適切なライブラリを教えてください。
画像のフォーマットは一般的なものならなんでもいいです。 pnm とかでも可。
多機能でなくていいので、なるべく小さなライブラリを探しています。
開発環境は linux + gcc です。
56デフォルトの名無しさん:2006/07/13(木) 12:10:41
>>54
typede char* CharPtr;

と置き換えれば多少は分かりやすかろう。

CharPtr p; // ポインタ
CharPtr* pp = &p; // ポインタのポインタ
5754:2006/07/13(木) 12:16:25
>>56
ありがとうです
ということは
ポインタのポインタ=ポインタのアドレス
でOKてことですね

>>55
libjpegってそのものずばりなのがあるが
58デフォルトの名無しさん:2006/07/13(木) 12:23:17
>>55
単体のフォーマットでよければlibpng, libjpeg, libgifなどなど
色々扱いたければDevILとか
ライセンスに緩い物であればFreeImageあたりか
59デフォルトの名無しさん:2006/07/13(木) 13:58:13
C++でクラスから作ったオブジェクトのメモリ構造に関する質問です。
クラスのオブジェクトでは、メンバ変数はクラスで記述した順番にメ
モリ配置されますか?

class A {
  int m;
  int n;
};

とするとAのオブジェクトtempのメモリ構造は|m用の領域|n用の領域|
の様になるのでしょうか?それとも環境に依存するのでしょうか?
60デフォルトの名無しさん:2006/07/13(木) 13:59:03
>>57
そもそも変数の型の名前としてアドレスという言葉を使うのは間違い。

CharPtr p; // アドレス
CharPtr* pp = &p; // アドレスのアドレス

と言ったら違和感が伝わるだろうか
6157:2006/07/13(木) 14:32:19
>>60
あ、わかってきました
ppはポインタのアドレスを指すポインタですね
62デフォルトの名無しさん:2006/07/13(木) 16:11:59
うぁはは、何この嫌がらせ。
折角ポインタのポインタって教えてるのに強硬にアドレスアドレスってw
63デフォルトの名無しさん:2006/07/13(木) 17:57:15
アドレスって言葉の方が理解しやすい人もいるってことでは

>>59
ドット演算子やアロー演算子を利用したアクセスは保証される。
メモリ上の配置が宣言通りの順で格納されている保証はない。
64デフォルトの名無しさん:2006/07/13(木) 18:46:16
>>61
ppはキャラ変数のアドレスを指すポインタのアドレスを指すポインタです。

・・・素直にポインタのポインタで納得していただけんだろうか
65デフォルトの名無しさん:2006/07/13(木) 18:53:05
>>64
お前、ポインタのこと良く分かってないだろ
66デフォルトの名無しさん:2006/07/13(木) 18:55:02
>>63
intの並びでも保障されないの?
67デフォルトの名無しさん:2006/07/13(木) 19:18:16
いろはにほへと
ちりぬるを
わかよたれそ
つねならむ
うゐのおくやま
けふこえて
あさきゆめみし
ゑひもせす

外部ファイルにこのような文字列が登録されています。
指定した行にある文字列を指定した配列に書き出したいのですが、どうしたらよいのでしょうか?
68デフォルトの名無しさん:2006/07/13(木) 19:19:31
> (共用体ではない)クラスの非静的メンバがアクセス指定子が間に入らずに宣言された場合、
> 後で宣言されたデータメンバの方が、クラスオブジェクト内でより高位のアドレスになるように
> 割り当てられる。
> アクセス指定子で分離された非静的メンバの割り当て順序は、未規定とする。
> 処理系によっては、境界調整の必要性から、二つの連続するメンバの一方を
> 他方の直後に割り付けないことも起こりうる。
69デフォルトの名無しさん:2006/07/13(木) 20:00:08
>>68
つまり、どういうこと?
70デフォルトの名無しさん:2006/07/13(木) 20:20:34
>>65
どこが?
71デフォルトの名無しさん:2006/07/13(木) 20:32:08
1000ページくらいのC++の本を買ってきました。
(プログラミング言語C++第三版)
これ、半分以上〜全部覚えていかないと、C++ってものにならないんですか?
72デフォルトの名無しさん:2006/07/13(木) 20:34:31
>>68-69
>>59の例に限れば保証される。

これは保証されない。
class B {
public:
 int o;
private:
 int p;
};
73デフォルトの名無しさん:2006/07/13(木) 20:40:08
保障したい場合は構造体にしといたら?
74デフォルトの名無しさん:2006/07/13(木) 20:41:12
>>70
どこもかしこも
75デフォルトの名無しさん:2006/07/13(木) 20:42:33
>>71
読む必要があるか?    No
読んだ方がいいか?    Yes
覚えないといけないか?  No
理解する必要があるか? Yes
>半分以上〜全部覚えていかないと、C++ってものにならないんですか?
 それはあなた次第
76デフォルトの名無しさん:2006/07/13(木) 20:44:13
>>75
ありがとう。
あきらめますorz
77デフォルトの名無しさん:2006/07/13(木) 20:44:20
>>71
そうだよ。まあでもよく使うことは自然と実に付くし、あまり使わないことは当然知らなくても困らない。
それに、ほかの言語はもっと覚えることが少ないかというとそうでもない。どれも似たようなもの。
78デフォルトの名無しさん:2006/07/13(木) 20:45:32
>>77
ほかの言語でも同じですか。
やっぱり、がんばります。
ありがとうございました。
79デフォルトの名無しさん:2006/07/13(木) 20:54:25
ポインタってどんなときに役に立つんですか?
80デフォルトの名無しさん:2006/07/13(木) 20:59:50
ちょっと質問。

仕事で書いてるプログラムに3000行のswitch文があるんだが、
これを短く圧縮する場合にifにするのは馬鹿げてるよね?
81デフォルトの名無しさん:2006/07/13(木) 21:00:45
メモリの上でかけっこするとき
82デフォルトの名無しさん:2006/07/13(木) 21:00:59
>>79
文字列操作とか。
83デフォルトの名無しさん:2006/07/13(木) 21:07:02
>>80
書き換えるとハマる悪寒。
switch..case はそのままで
中身の処理をサブルーチンとして抜き出すぐらいにしとけば?
84デフォルトの名無しさん:2006/07/14(金) 06:01:03
switch(x){

case 1:
case 2:
case 3:
処理
break;

case 4:
case 5:
case 6:
処理
break;

.....

case 32765:
case 32766:
case 32768:
処理
break;

default:
処理
}

みたいにマヌケな状況になってるなら if 使う意味はあるね
85デフォルトの名無しさん:2006/07/14(金) 06:04:30
規則的なら関数テーブルで飛ばしたら?
86デフォルトの名無しさん:2006/07/14(金) 08:38:40
すみません

>>85の関数テーブルで飛ばす
とは具体的にどういうコードなんでしょうか?
87デフォルトの名無しさん:2006/07/14(金) 09:37:01
ふつーのコンパイラはcaseが多くてある程度連続していれば、
switch文を関数テーブルに直してくれるよ。
88デフォルトの名無しさん:2006/07/14(金) 10:32:38
>>74
こいつのほうがわかってなさそう
89デフォルトの名無しさん:2006/07/14(金) 11:07:12
>>88
「ppはポインタのアドレスを指すポインタですね」と相手が納得しているのに
わざわざ言い換えるところが間抜け
90デフォルトの名無しさん:2006/07/14(金) 11:09:53
C++のクラスの実装の仕方について質問です。
sizeof() でインスタンスのサイズを調べると、メンバ変数の分しかメモリ領域が
確保されていないようなのですが、メンバ関数はどう言う風に実装されているんですか?

今までは、すべてのインスタンスでメンバ関数は共有されていて、呼び出されたときに
インスタンスの情報も一緒に渡されて、メンバ変数の参照が出来るのかなと思っていたのですが
関数にstatic指定子を付けたらメンバ変数にアクセスできなくなったので
もしかしたら違うのかなと。
91デフォルトの名無しさん:2006/07/14(金) 11:15:26
>今までは、すべてのインスタンスでメンバ関数は共有されていて、呼び出されたときに
>インスタンスの情報も一緒に渡されて、メンバ変数の参照が出来るのかなと思っていたのですが

コンパイラ依存だと思うが、VC++の場合はこういう実装になっている。

>関数にstatic指定子を付けたらメンバ変数にアクセスできなくなった

staticメンバ関数として当然の挙動です。
92デフォルトの名無しさん:2006/07/14(金) 11:20:13
>>90
仮想関数がある場合は'vtbl'というものが追加されて、そのポインタ分だけ
sizeofが大きくなる。
仮想関数がない場合は'vtbl'はないので、構造体と同じしくみでsizeが決定される。
メンバ関数内でメンバ変数が参照できるのは、各メンバ変数にthisが渡されるため。
93デフォルトの名無しさん:2006/07/14(金) 11:21:10
各メンバ変数にthisが渡されるため

各メンバ関数にthisが渡されるため
94デフォルトの名無しさん:2006/07/14(金) 11:26:50
>>91
レスどうも。おかげですっきりしました。
staticメンバのことも了解しました。
仕様上そう設計しているということですね。
95デフォルトの名無しさん:2006/07/14(金) 11:42:42
>>92
リロードしないで書き込んでしまったので、入れ違いになってしまいましたが
とても参考になりました。
今BCCで試してみましたが、仮想関数があると先頭に4byte分
なんか付いているみたいでした。
96デフォルトの名無しさん:2006/07/14(金) 11:58:39
>>95
その4byteが'vtbl'へのポインタ。
vtblが何者であるかはググって
97デフォルトの名無しさん:2006/07/14(金) 12:44:59
ポインタ≠アドレス
98デフォルトの名無しさん:2006/07/14(金) 12:49:21
ポインタ=アドレスを格納する変数
99デフォルトの名無しさん:2006/07/14(金) 12:52:26
>>89
おまえが間抜け。その解釈が合っていると思ってるのか?

型名にアドレスなんて使っちゃダメ。
自分の中で納得するのは勝手だが、「ポインタのアドレスを指すポインタ」なんて
他人に言ったら間違いなく伝わらない。「ああ、ポインタのポインタの事ね」って呆れ顔で訂正されるだけ。
中途半端な知識で初心者に嘘教えるなよ。
100デフォルトの名無しさん:2006/07/14(金) 12:55:08
>>99
じゃ、ポインタって何?説明して
101デフォルトの名無しさん:2006/07/14(金) 12:59:11
何が「じゃ」なのか全く分からんが
Wikipediaでも見とけアホ
ttp://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8
102デフォルトの名無しさん:2006/07/14(金) 13:01:10
つまり、自分の言葉で説明できないということですね。
やっぱりポインタのことわかってなかったんだ。
103デフォルトの名無しさん:2006/07/14(金) 13:01:22
特定の型のインスタンスを指し示すもの。
実装上、多くの場合はそのインスタンスの存在するアドレスが格納されている。
従って、ポインタのポインタは単に対象となるインスタンスがポインタであると言うだけのポインタである。
104デフォルトの名無しさん:2006/07/14(金) 13:03:05
>>103
インスタンスって何?
105デフォルトの名無しさん:2006/07/14(金) 13:03:51
>>103
で、「ppはポインタのアドレスを指すポインタ」のどこが間違ってると?
106103:2006/07/14(金) 13:07:16
>>105
実装に踏み入る必要はない。ポインタにアドレスが格納されている必然性がないのだから。
敢えて踏み入るなら、はじめからポインタと言わなければいい。
107デフォルトの名無しさん:2006/07/14(金) 13:09:10
>>106
段々苦しくなってきましたねぇ。
C/C++の話ですよ?
108デフォルトの名無しさん:2006/07/14(金) 13:09:54
109デフォルトの名無しさん:2006/07/14(金) 13:10:42
間違った
>>105
>>64
110デフォルトの名無しさん:2006/07/14(金) 13:11:57
あのねぇ、質問者は「ポインタのポインタ」って何ですかって質問してるんですよ。
111103:2006/07/14(金) 13:13:10
>>107
それがなにか?
例えばMS-DOSのラージデータモデルでは一般のポインタで想像されるような、
連続したメモリ空間を指さないセグメント:アドレスモデルでしたが。
また、ある実装では全てのポインタがハンドルなので、その中身はインスタンスのアドレスじゃありませんが。
寧ろ私は>107が何故アドレスと言いたいのか知りたく思いますね。
112デフォルトの名無しさん:2006/07/14(金) 13:14:01
>>110
嘘こくなよ
>>54
>ポインタのポインタって
>ポインタのアドレスのことですよね?
113デフォルトの名無しさん:2006/07/14(金) 13:15:33
>>111
さぁ?何故でしょうね。Cには'&'があるからでしょうか。
114デフォルトの名無しさん:2006/07/14(金) 13:16:32
>>112
で、「ppはポインタのアドレスを指すポインタ」のどこが間違ってると?
115デフォルトの名無しさん:2006/07/14(金) 13:18:13
116デフォルトの名無しさん:2006/07/14(金) 13:19:46
>>115
じゃ、ポインタって何?説明して
117デフォルトの名無しさん:2006/07/14(金) 13:21:47
118デフォルトの名無しさん:2006/07/14(金) 13:22:00
なんなの?この人たち。
119デフォルトの名無しさん:2006/07/14(金) 13:23:34
>>117
「ポインタ アドレス」でググると数多くのページがHitしますが、
それに関してはどう思いますか?
120デフォルトの名無しさん:2006/07/14(金) 13:23:57
>>116
何が「じゃ」なのか全く分からんが
Wikipediaでも見とけアホ
ttp://ja.wikipedia.org/w/index.php?title=%E3%81%8A%E3%81%A3%E3%81%B1%E3%81%84&redirect=no
121デフォルトの名無しさん:2006/07/14(金) 13:24:56
>>120
間抜け
122デフォルトの名無しさん:2006/07/14(金) 13:29:22
>>111
いや、それでもアドレスでしょ。
アドレスじゃないと言い張る?
123デフォルトの名無しさん:2006/07/14(金) 13:30:40
質問さしてください。
簡単なtemplateのclassを作ったソースを書いたのですが
(operator,destractor,copyconstractorの実装は、はぶいてます)
ソース↓
#include <iostream> #include <string> namespace Mine{ template <typename T1, typename T2> class Testclass{
private:
T1 Data_like_T1;T2 Data_like_T2;
public:
Testclass():Data_like_T1(T1()),Data_like_T2(T2()){} Testclass(T1 inidata1, T2 inidata2)
{ Data_like_T1 = inidata1; Data_like_T2 = inidata2; } void CoutPvateMember()
{ std::cout << Data_like_T1 << ' ' << Data_like_T2 << '\n'; } }; } int main()
{ using namespace std; using namespace Mine;
Testclass<int, double> Tobj1; Tobj1.CoutPvateMember(); Testclass<int, double> Tobj2(5, 1.5);
Tobj2.CoutPvateMember(); Testclass<int, string> Tobj3; Tobj3.CoutPvateMember();
Testclass<int, string> Tobj4(1, "abc"); Tobj4.CoutPvateMember(); return 0; }

上記のソースでのdefault_costractorでのTestclass():Data_like_T1(T1()),Data_like_T2(T2()){}
の部分で、[Data_like_T1(T1()),Data_like_T2(T2())]の(T1())T2(T2())の部分で
T1がintならint()という形になりますしstringならstring()となりますが
このT1()のような書き方は、いったい、どんな書籍、もしくわサイトで解説してるんでしょうか
たまたま買った、C++効率的最速学習という本で、この使い方が載っていたんですが
この本には、例えばint()のような書き方をサンプルソースで使われてるんですが
この書き方の詳細は載ってませんでした。int型クラスがあるとも思えないし、EffectiveC++だと
constractorでint型のmemberがあったなら、明示的に(0)を渡しているようですし
この書き方の詳細については、いったい何の参考文献を見ればいいのでしょうか
稚拙な質問かもしれませんが、どなたか教えていただきたいです。
124デフォルトの名無しさん:2006/07/14(金) 13:33:40
不毛な言い合いをしてるな…

>>122
横槍だけど、ポインタの中身は「実体を参照できるもの」かつ「intに変換できるもの」ならば何でもいい。
事実、アドレスではない、ただのIDを参照としてポインタに格納している処理系もある。
(そういう環境があるからこそ、規格でアドレスだと限定していないわけだが)
一般的なPC環境ではアドレスが格納されるのが普通だけどな。
125デフォルトの名無しさん:2006/07/14(金) 13:35:52
>>124
処理系ごとの実装はともかく、アドレス演算子の結果を保存するのが
ポインタ変数でしょ?
この処理系は、実際はメモリ上のアドレスじゃないから、というのは
それこそ実装に踏み込んでるよ。
126デフォルトの名無しさん:2006/07/14(金) 13:38:53
>>125
アドレス演算子の結果はアドレスじゃないと言いたいんだよ。
127デフォルトの名無しさん:2006/07/14(金) 13:40:03
「おい、あの女見ろよ、乳でけー!」←ボインだ
「ちょwwその2人横の方がすごくね?!」←ボインだのボインだ

128デフォルトの名無しさん:2006/07/14(金) 13:40:07
>>126
ハァ、そうですか。
129デフォルトの名無しさん:2006/07/14(金) 13:41:07
>>124
また初心者スレでデマを。
intに変換できるものってなんだよ一体。
おまえの脳は20年前で止まってるだろ。
130デフォルトの名無しさん:2006/07/14(金) 13:43:36
>>119への返答がありませんが、リロードは止めたということでしょうか。
131デフォルトの名無しさん:2006/07/14(金) 13:48:04
何が問題なのかさっぱりわからん。
ポインタは、それが指し示す変数へのアドレスであり、
ポインタのポインタは、それが指し示すポインタへのアドレスじゃないのか?
俺は今までそう理解してきたが。
132デフォルトの名無しさん:2006/07/14(金) 13:48:47
>>129
これのことだろ

6.3.2.3
任意のポインタ型は整数型に型変換できる。
133デフォルトの名無しさん:2006/07/14(金) 13:49:32
>>131
「アドレス」という言葉は使っちゃいけないらしいです
134デフォルトの名無しさん:2006/07/14(金) 13:54:30
>>132
俺、規格に全然詳しくないけど、それってLP64が規格に反してるってことか?
135デフォルトの名無しさん:2006/07/14(金) 13:55:39
>>132
int型と整数型というのは違うよ。
charもlongも整数型だ。

そして、intとポインタのサイズが違う処理系はいくらでもある。
136デフォルトの名無しさん:2006/07/14(金) 13:58:02
>>134
結果は処理系定義で、サイズをオーバーしても知らんってことになってるから
変換をエラーにしなければ規格には適合してることになるね
137134:2006/07/14(金) 14:00:25
>>136
>>124=>>132かと思った。
>>135を読む限りは「int型云々」は嘘みたいだから、それで納得したよ。
138134:2006/07/14(金) 14:05:47
みんなこの話に飽きたみたいだなw
139デフォルトの名無しさん:2006/07/14(金) 14:07:03
int型ではないが整数型に変換できる&変換しても元に戻せるってのが条件じゃなかったっけ?
140デフォルトの名無しさん:2006/07/14(金) 14:10:18
まあ実際、intptr_tとかUINT_PTRとか
「ポインタと相互変換できる整数型」というのを
最近の処理系(&C99)は用意している。
141デフォルトの名無しさん:2006/07/14(金) 14:57:35
>>131
俺漏れも。

というか>>99>>103,>>106で言ってる事ちがくね?
>99ではポインタのアドレスを指すポインタという表現そのものが間違いであると言ってるけど
>103>106では、特定の実装上ではポインタはアドレスを指すこともあるって…。
142デフォルトの名無しさん:2006/07/14(金) 15:38:17
>>88 == >>89

本人乙
143デフォルトの名無しさん:2006/07/14(金) 15:54:19
>>138
正しい知識のある奴が結局一人もいなかったからなw
144デフォルトの名無しさん:2006/07/14(金) 16:54:32
>>141
別人なんでしょ
145デフォルトの名無しさん:2006/07/14(金) 16:56:52
>>123
C++の入門レベル本になら大抵書いてあるはずだと思うが、それはそこでだけ有効な一時オブジェクトを作る式。
括弧の中はコンストラクタ引数を書く。(intなど)組み込み型の場合、型変換(キャスト)として扱われる。
引数がない場合は当然デフォルトコンストラクタが呼ばれる。組み込み型の場合、0初期化される。

ちなみにその例では単にData_like_T1(), Data_like_T2()と書いてよいはず。
146デフォルトの名無しさん:2006/07/14(金) 17:44:53
誰も型名なんて聞いてないのに、これだから知識自慢厨は・・・
147デフォルトの名無しさん:2006/07/14(金) 17:48:13
知識自慢厨は無能の証だから生暖かく見守るべし
148デフォルトの名無しさん:2006/07/14(金) 19:33:22
void call(void(*)(int,int,int))
という型の関数にstaticでないメンバ関数へのポインタをそのインスタンスといっしょに
渡すにはどうしたらいいのでしょうか。教えてください。

callfuncでエラーが出ちゃうサンプル

#include <iostream>
using namespace std;
void call(void(*func)(int,int,int)){
 func(1,2,3);
}
void func1(int a,int b,int c){
 cout << "func1(" << a << "," << b << "," << c << ")" << endl;
}
class A{
public:
 void func2(int a,int b,int c){
  cout << "func2(" << a << "," << b << "," << c << ")" << endl;
 }
 void callfunc(){
  typedef void(A::*Afunction)(int,int,int);
  Afunction af=&A::func2;
  call(&(this->*af));
 }
};
int main(){
 call(&func1);
 A a;
 a.callfunc();
}
149デフォルトの名無しさん:2006/07/14(金) 19:42:13
#include <iostream>
using namespace std;

class A;
void call(A* a, void (A::*func)(int, int, int));

class A{
public:
void func2(int a,int b,int c) {
cout << "func2(" << a << "," << b << "," << c << ")" << endl;
}
void callfunc() {
typedef void(A::*Afunction)(int, int, int);
Afunction af = &A::func2;
call(this, af);
}
};

void call(A* a, void (A::*func2)(int, int, int))
{
a->func2(1,2,3);
}
void func1(int a,int b,int c)
{
cout << "func1(" << a << "," << b << "," << c << ")" << endl;
}
int main(){
// call(func1);
A a;
a.callfunc();
}
150デフォルトの名無しさん:2006/07/14(金) 19:49:27
>>149
回答ありがとうございます。
callは、Cで書かれた別のライブラリの関数で、書き換えることができないんです。
151デフォルトの名無しさん:2006/07/14(金) 20:24:15
>>150
じゃ、諦めな。メンバ関数へのポインタは、通常の関数へのポインタとは
全然違うから。
152デフォルトの名無しさん:2006/07/14(金) 20:24:45
その3つの引数のうち、1つはこっちですくに使わせてくれるのなら楽。でもたぶんそうでないのだろう。
マルチスレッドを考慮しなくてよければグローバル変数を使え。考慮する必要があるならTLSを使え。
テンプレートを使えばもっと汎用的にできる。
class Hoge {
public:
  void func(int, int, int);
};

namespace {
  void* ptr;
  void (Hoge::*mem_ptr)(int, int, int);

  void callEntry(int a, int b, int c) {
    (ptr->*mem_ptr)(a, b, c);
}

void call(Hoge& hoge, void (Hoge::*fn)(int, int, int)) {
  ptr = hoge;
}

int main(){
  Hoge hoge;
  call(hoge, &Hoge::func);
}

或いはメンバ関数を呼び出すための「サンク」を作る方法もある。
153デフォルトの名無しさん:2006/07/14(金) 20:25:37
間違えた。正しくはこう。
void call(Hoge& hoge, void (Hoge::*fn)(int, int, int)) {
  ptr = hoge;
  call(callEntry);
}
154123:2006/07/14(金) 20:33:49
>>145さん
それがですね・・・・
俺が買った入門書が、やっぱ駄目駄目なようで
ついでにSTLについての本も買ったんですが・・・・・
2つともハーバート・シルト著で[独習C++]と[STL標準講座]でっす!!

ただ、疑問に思うのは、独習C++もSTL標準講座も、本当に原著
通りのサンプルソースを載せてるのか?とも思う点です。
特に[STL標準講座]は、サンプルソースに間違いがあったり
<algorithm>のlower_bound()の解説が「一致する最初の要素を返す」
となってるけど、実際のreturn value は "greater than or equal"
だと、googleで検索してようやくわかったぐらいで、あとremove()とかも・・・
ま、結局思うのは、翻訳と監修してる人は、本当にちゃんと翻訳監修をしては
いないんだろうと、「わかんねーから省いちゃえ」ってな感じで翻訳監修作業を
してるんだろうと思うところです。

(しっかし、[STL標準講座]のソースは、一貫性がなさすぎて訳がわからん
あっちのソースではstd::cout文の後に"\n"つかって、こっちのソースではendl使って
キャストはc言語タイプのキャストしてるし、そりゃc言語タイプのキャストでも良いけど
こっちはc++勉強してんだからstatic_cast<>()使うのが筋ってなもんだろって思ったり・・・
入門書の内容を疑いながら読まなきゃならない入門書って、いったいなんなんだよ)
以上、独り言の愚痴でした
155デフォルトの名無しさん:2006/07/14(金) 21:50:05
俺は「標準C++の基礎知識」、「標準C++STLの基礎知識」、「極めるVC++」、という怪しげな本とwebで一通りC++の仕組みは。
さらに突っ込んだ内容は、もっと分厚い本を読んだけど。
あとなんか、図書館で買ったiostreamの本も役に立ったな。一冊丸ごとiostreamの本。
156148:2006/07/14(金) 21:52:04
関数呼び出し規約的には、最後にインスタンス(this)をpushするようなので、
インスタンスとメンバ関数で、staticなメンバ関数を作れるかとおもったら、そうもいかないみたいですね。
マルチスレッドは考慮しなくていいので、callの宣言がかわらないように、>>152さんの方法を書き換えて
使うことにします。ありがとうございました。

class A{
private:
 static A *p;
 static void (A::*p2)(int,int,int);
public:
 void func2(int a,int b,int c){
  cout << "func2(" << a << "," << b << "," << c << ")" << endl;
 }
 void callfunc(){
  A::p=this;
  A::p2=&A::func2;
  call(&callfunc2);
 }
 static void callfunc2(int a,int b,int c){
  (p->*p2)(a,b,c);
 }
};
A *A::p;
void (A::*A::p2)(int,int,int);
157デフォルトの名無しさん:2006/07/14(金) 21:58:16
ひどいプログラムだな。
158デフォルトの名無しさん:2006/07/14(金) 22:12:05
>callの宣言がかわらないように
( ゚д゚)ポカーン
159デフォルトの名無しさん:2006/07/14(金) 22:13:53
初心者は無茶するなあ。
160デフォルトの名無しさん:2006/07/14(金) 22:15:56
>>158
>>150
callはそのままにせざるを得ないようだが。
161デフォルトの名無しさん:2006/07/14(金) 22:37:03
>という型の関数にstaticでないメンバ関数へのポインタをそのインスタンスといっしょに
>渡すにはどうしたらいいのでしょうか。教えてください。
>callは、Cで書かれた別のライブラリの関数で、書き換えることができないんです。

CのライブラリにC++クラスのインスタンスを渡すのか?
無茶言うね。

というか
>void call(void(*)(int,int,int))
この関数の宣言を買えずに、どうやってインスタンスが渡せるんだ?
162デフォルトの名無しさん:2006/07/14(金) 22:50:51
>>160
C++の基本からやり直すべきじゃないかい?
163148:2006/07/15(土) 01:06:55
glutというCで書かれたライブラリがあって、
void glutMouseFunc(void (*func)(int button, int state, int x, int y));
みたいな形でコールバック関数を登録するようになっていて、そこにstaticでない
自作のメンバ関数を登録したかったのです。Cでオブジェクトの概念を使っている
gtkみたいに、インスタンスとメンバ関数ポインタをくっつけて、普通の関数ポインタとして、
渡したかったわけなのですが、綺麗に書く方法がないということは、
やはりちょっと無茶だったのかもしれません。
164デフォルトの名無しさん:2006/07/15(土) 03:29:35
>>154

K&R の原著と、その訳書の 石田晴久 の本との違いもそんな感じだよ
165デフォルトの名無しさん:2006/07/15(土) 04:14:31
>gtkみたいに、インスタンスとメンバ関数ポインタをくっつけて

GTKってこんな機能あったっけ?
GTKだって、シグナルコネクト関数でコールバック登録するときは、第一パラメータがwidgetのポインタだったと思うが。
インスタンスとコールバック関数をくっつけるのではなく、インスタンス(へのポインタ)とコールバックを、別々の引数と
して渡して、関連付けを行うんだと思ったが。
166デフォルトの名無しさん:2006/07/15(土) 08:49:43
もうこうなったらサンクしかない
167デフォルトの名無しさん:2006/07/15(土) 16:19:07
引数を持たないコンストラクタが存在しないクラスの配列を作るのはどうしたらいいですか。
test t=new test[4]; とかやるとコンストラクタがないというエラーになってしまいます。。
168デフォルトの名無しさん:2006/07/15(土) 16:26:29
test *t=new test[4];
のまちがいです
169デフォルトの名無しさん:2006/07/15(土) 16:33:08
for (int i=0; i<4; ++i) t[i] = new test(hoge);
170デフォルトの名無しさん:2006/07/15(土) 16:44:46
>>167
いまのところできない。
169のようにポインタの配列を持つようにするか、std::vectorか何かを使うしかない。
171デフォルトの名無しさん:2006/07/15(土) 16:45:19
>>169
それだと delete[] が使えないね。まあ仕方ないだろうが
172デフォルトの名無しさん:2006/07/15(土) 17:05:19
test * p = reinterpret_cast<test *> ( new char[sizeof(test) * 4] ) ;
std::uninitialized_fill( &p[0], &p[4], test("hoge") ) ;
173デフォルトの名無しさん:2006/07/15(土) 20:21:16
最近趣味でCの勉強を始めて、今UNIXのコマンドラインみたいなものを作ってみようと頑張っているのですが、TABで補完させることと、入力間違いをBSで消去することの両方をするところがうまく書けません。

良いアイデアはないでしょうか?
174デフォルトの名無しさん:2006/07/15(土) 20:34:47
readlineライブラリを使う
175デフォルトの名無しさん:2006/07/15(土) 20:46:52
ありがとうございます!!!!
ポインタの配列か、vectorのどっちかを使おうとおもいます!!
176デフォルトの名無しさん:2006/07/15(土) 20:53:03
>>175にはptr_vectorを使うのが一番安全で分かりやすいいんでないかい?
177173:2006/07/15(土) 21:42:25
readlineライブラリですね。
ネットでしばらく情報探してみましたが、他言語のreadlineがひっかかるようですので、
明日にでも書店・図書館で調べてみます。
ありがとうございました。
178デフォルトの名無しさん:2006/07/15(土) 21:56:53
>>173
開発環境は?
179173:2006/07/15(土) 22:08:06
WindowsXPでMinGW使ってます。
これで答えになってますでしょうか?
180デフォルトの名無しさん:2006/07/15(土) 23:30:06
void kakuho(int *p)
{
p = malloc(sizeof(int) * 10);
}

void kaihou(int *p)
181180:2006/07/15(土) 23:31:29
ごめんなさいまちがえました
182デフォルトの名無しさん:2006/07/15(土) 23:34:24
>>179
じゃここから落とせる。
ttp://jarp.does.notwork.org/win32/
凝ったことするんじゃなければ、readline.hをインクルードして
char *p;
p = readline("> ");
とかするだけでいい。
srcパッケージのほうにはmanファイルが入ってるかも(未確認)。
183デフォルトの名無しさん:2006/07/16(日) 10:11:05
#define C_TBL_MAX(TYPE)\
class C_MAX_##TYPE \

この##って何?連結?
184デフォルトの名無しさん:2006/07/16(日) 10:42:50
そう
プリプロセッサだけ走らせればわかるよ

あとは#で引数の文字列評価とか
185183:2006/07/16(日) 11:24:40
>>184thx!!

でもプリプロセッサだけ走らせるってどうやるの?
VC++6.0SP6なんですが。
186デフォルトの名無しさん:2006/07/16(日) 11:31:58
/P
187173:2006/07/16(日) 13:20:17
>>182
さっそくreadline-4.3-2-mingw32.zipの中身をコピーして試してみたのですが、
C:\(パス)\Temp/ccaYbaaa.o(.text+0x57c):command_test.c: undefined reference to `_imp__readline'
collect2: ld returned 1 exit status
という警告が出てしまいます。

おそらくどこかでreadlineの追加分の定義が必要なのかなとは思うのですが。。。
188デフォルトの名無しさん:2006/07/16(日) 13:25:15
MinGWインスコしてないから試せないんだけど、-lreadlineは付けてるよね?
189173:2006/07/16(日) 13:57:40
いえ、付けてませんでした。
gcc -lreadlineを試してみると、
/mingw/lib/libmingw32.a(main.o)(.text+0x106):main.c: undefined reference to `WinMain@16'
collect2: ld returned 1 exit status
とメッセージ内容は変わりましたが、やっぱり警告が出てしまいます。
190デフォルトの名無しさん:2006/07/16(日) 14:03:39
え?WinMain?
どんなコードをコンパイルしようとしてるの?
ちなみにhistoryも使える最小限のコードは以下。-lreadline付けてコンパイルしてみて。
#include <stdio.h>
#include <readline/readline.h>
#include <readline/history.h>

int main()
{
char *p;

using_history();

while (1) {
p = readline("$ ");
add_history(p);
}

return 0;
}
191173:2006/07/16(日) 14:20:02
C:\(パス)\Temp/cckPaaaa.o(.text+0x2b):test.c: undefined reference to `_imp__using_history'
C:\(パス)\Temp/cckPaaaa.o(.text+0x39):test.c: undefined reference to `_imp__readline'
C:\(パス)\Temp/cckPaaaa.o(.text+0x49):test.c: undefined reference to `_imp__add_history'
collect2: ld returned 1 exit status
の警告が出ました。

ちなみにCの入門書を2冊やり終えたくらいのレベルです。
で、UNIXのコマンドラインのようなものを作ってみようとチャレンジ中だったのですが、
TAB補完と入力間違いしたときのBSで消すことを両方させるところで壁に当たってしまいました。

とりあえずTAB補完だけ・BSだけならgetcheやfgets,getcharあたりでできたのですが。

このレベルじゃまだしんどそうなら、さらに勉強してからチャレンジしてみます。
192デフォルトの名無しさん:2006/07/16(日) 14:21:21
警告とエラーは違う。
193デフォルトの名無しさん:2006/07/16(日) 14:22:58
それライブラリへのパスが通ってないよ。
readlineのlib*を他のライブラリが入ってるディレクトリにコピーしてみて。
194デフォルトの名無しさん:2006/07/16(日) 14:23:14
入門書をいくら勉強しても、ライブラリの導入は覚えられないんだよね。
で、ライブラリがないと結局たいしたことはできないと。
195デフォルトの名無しさん:2006/07/16(日) 14:29:13
普通は、make; make installでインストールできちゃうから、誰でも
インストールできるんだけどね。
readlineもsrc packageならそうなってるかもしれん。
196173:2006/07/16(日) 14:48:37
182さんのところから落としてきたreadline-4.3-2-mingw32の中にある
bin,doc,include,libをそれぞれMinGW内の同じところへコピーしてみた
(し直してみた)けどダメでした。
さっきと同じエラー(でいいですよね?192さん)が出てしまいます。

これができたら、次はオライリーのC実践プログラミングで勉強しようと
思ってたのですが(評判よさそうなので)、ライブラリの勉強とでしたら
どちらが先の方がいいでしょうか?
197デフォルトの名無しさん:2006/07/16(日) 14:55:13
>>196
俺回線が細くて、今すぐMinGWインストールできないから、これ以上の
アドバイスは出来ん。
今すぐreadlineを使ったアプリを作りたいってわけじゃなさそうだから、
勉強のほうを進めれば?
198デフォルトの名無しさん:2006/07/16(日) 14:55:55
ちなみにCygwinなら確実にreadlineを使える。
199173:2006/07/16(日) 15:01:44
そうですね、いい目標ができたのでそれに向けてとりあえず勉強進めます。
Cygwinは今いれると目標への熱意が冷めてしまいそうなので、今回の件を
ちゃんと理解できるようになってから試してみることにします。

たくさんのアドバイスありがとうございました。
200デフォルトの名無しさん:2006/07/16(日) 17:33:51
出遅れちゃったけど>182のreadlineを試してみた。

ディレクトリ構成
解凍パス/bin
解凍パス/doc
解凍パス/include
解凍パス/lib
解凍パス/test.c (>190さんのサンプル)
解凍パス/readline.dll (binから移動)

コンパイル
gcc -Iinclude -Llib test.c -lreadline

結果
問題無し。-lreadline をつける場所を間違えたんじゃね?
201デフォルトの名無しさん:2006/07/16(日) 18:37:38
ビットマップ読み込み用クラスを作成しているのですが、

typedef struct {
unsigned short file_type;
unsigned int file_size;
unsigned short reserved1;
unsigned short reserved2;
unsigned int offset;
}BmpFileHeader;

という、サイズが14バイトのつもりのヘッダ構造体を作ったのですが、

sizeof (BmpFileHeader);

としてやると16という値が出てしまいます。
何かプログラム間違ってるでしょうか?
202デフォルトの名無しさん:2006/07/16(日) 18:39:05
つ パディング
203デフォルトの名無しさん:2006/07/16(日) 18:43:33
ttp://lists.boost.org/Archives/boost/2003/04/47008.php
のコードの一部の引用です

#define OP_ASSERT(x) do { \
std::stringstream out_str; \
bool bTestOk = true; \
(x); \
if ( !bTestOk) std::cout << "Assertion failed: \n'" << #x << "'\n" <<
out_str.str() << std::endl; \
} while(0)

こういうマクロを見かけたんですがこのマクロはどうして
do { } while(0)
なんてことをしているのでしょうか?
単純に{ } とブロックで囲むのとはどこか違うのでしょうか?
そもそもどうしてブロックで囲んでいるのでしょうか?



204デフォルトの名無しさん:2006/07/16(日) 18:49:00
>>203
{} で囲むのは、中で使う変数のためのスコープを作るため。
do while(0) するのは、マクロ呼び出しの後のセミコロンを必須にするため。
205デフォルトの名無しさん:2006/07/16(日) 18:56:36
>>203
if (...) OP_ASSERT(...);
としたときのための深謀遠慮。
206204:2006/07/16(日) 19:03:36
>>205
あーなんか忘れてると思ったらそれだ。 else が。
207デフォルトの名無しさん:2006/07/16(日) 19:05:22
>>201
もしWindowsならPlatform SDKのBITMAPFILEHEADERを使うべきだよ。
そうでないなら自分で定義するしかないけど。
208203:2006/07/16(日) 19:19:47
お二方ありがとうございます。
ちょっと理解するのに時間かかりそうです

>>204
変数のスコープ作成のためというのは理解できました
マクロ記述以前の部分で同名変数あったらまずいですものね

マクロ呼出し後のセミコロンを必須とするためというのも理解できました
文の最後に;がないのは気持ち悪いですものね
do {} while(0)で囲むことによって
OP_ASSERT(3)
とか;が抜かった場合ちゃんとコンパイルエラーになってくれますね

で、>>205が理解できてません
頭をひねっていますあと30分考えれば理解できるだろうか・・・やってみます
209デフォルトの名無しさん:2006/07/16(日) 19:44:08
if()
{};
else{}

if()
do{}while(0);
else{}

上だとelseが浮いてエラーでしょ?
210デフォルトの名無しさん:2006/07/16(日) 19:49:54
>>202
ありがとうございます。ググってみてなんとなく理解しました。
>>207
最終的にはそうするかもです。
211203:2006/07/16(日) 19:49:55
elseがどう関係するんだろうと思ってたんですが、
やっと理解できました

if (...) OP_ASSERT(...);
else printf("else");

としたときにマクロをdo { } while (0) で囲ってないと
elseとifが対応しないというコンパイルエラーになるんですね

これで合ってますか?
212203:2006/07/16(日) 20:02:24
>>209
あ、先に答え書いてくれてたんですね。
ありがとうございます

ただ、どうしてdo {} while(0);だとコンパイルエラーにならないのかが
わかりません

if ()
{};
else{};
だと二行目の{};でif文の終わりと解釈されてエラー

if()
do{}while(0);
else{};
だと二行目は
if() 文;
else 文;
の形式として解釈されて問題なし

ということですかね
213デフォルトの名無しさん:2006/07/16(日) 21:35:09
class cBase {
virtual void Init();
};
class cData : public cBase {
void Init(){ /*初期化処理*/ };
};
main() {
static char *works=(char*)malloc(1000);
cData *data;
data=(cData*)&(works[50]);
data->Init();
}
こういった感じで別途確保した領域をクラスとして使いたいのですが、->Init()実行時にエラーが出てしまいます。
コンストラクタが実行されていない為に仮想関数のテーブルが作成されていない、と予想しているのですが、
この予想で正しいでしょうか。また、解決法はありますでしょうか。
知恵を貸してください。
214デフォルトの名無しさん:2006/07/16(日) 21:44:43
>>213
アラインメントの問題がなければ、<new>をインクルードして、
data = new(&works[50]) cData;などとする。

それで&works[50]にコンストラクタが呼ばれcDataのオブジェクトが作られる。

逆は、data->~cData();のように自分でデストラクタを呼んでからfree()すればよい。
215デフォルトの名無しさん:2006/07/16(日) 22:04:15
operator new, operator deleteをオーバーロードすればいいじゃん
216デフォルトの名無しさん:2006/07/16(日) 22:11:56
>>213
cData *data = new cData();
217デフォルトの名無しさん:2006/07/16(日) 22:15:30
何か壮大な勘違いをしている予感。
218216:2006/07/16(日) 22:15:31
「別途確保した領域を〜」を読み飛ばして意味不明な書き込みをしてしまった。ごめんよ。

+50 はアライメントの問題が発生しそうだな。
219デフォルトの名無しさん:2006/07/16(日) 22:22:33
>>214
ご教示いただけた手法で解決いたしました。
new の使い方や、ヘッダの存在自体しらなかったりと勉強不足を思い知らされました。
ありがとうございました。

data->cData();
これでコンストラクタが呼べても良いと思うんですけどねぇ・・
220213,219:2006/07/16(日) 22:32:25
>>215,218
+50は例としてあげるのは不味かったですね・・
実際はローカルなメモリ管理クラスが返す領域で、16byteにアラインが調整されています。

大人の事情というか、管理上の都合なんですがオーバーロードすると特定の領域からの
割り当てしか出来なくなってしまいそうなので今回は別の手段を、と考えました。

ありがとうございました。
221デフォルトの名無しさん:2006/07/16(日) 22:37:40
基本的なこととは思いますが、質問させてください。
printf, puts, putcharやscanf, getcharの使い分けがよくわかりません。
1文字ならputchar, getcharが良いとか、
エスケープシーケンスを使うならprintf、使わないならputsが良いということでしょうか?
今まではprintfとscanfしか使っていなかったのですが、使い分けるべきでしょうか?
実行効率や、エラー時に違いがあるのでしょうか?
ご教授お願いします。
222デフォルトの名無しさん:2006/07/16(日) 22:51:50
好きにしたらいい。
効率は実装依存。
エラー時の違いはヘルプ読め。
223デフォルトの名無しさん:2006/07/16(日) 22:55:10
>>221
やっぱりprintfは書式文字の解釈をする分、
単純に文字列を書くだけなら余計な手間がかかることになる。
だから、どちらかというとputs/putcharで済むならそっちを使うと言う傾向にあることはある。

世の中、printfをputsやputcharに置き換えられるときには
置き換えるという最適化をする変わり者のコンパイラもあるけどね。

入力の方も事情は大体同じ。
ただしscanfはまともに使うのが恐ろしく面倒で、getsはまず間違いなく安全に使えない。
そこで、たとえばfgetsとsscanfを使う。
(getcharはOK)
224デフォルトの名無しさん:2006/07/16(日) 23:04:32
>>223
標準ライブラリ関数の最適化による挿げ替えをするのは変わり者なのですか?
それじゃ、最適化による関数のインライン展開は?
標準ライブラリ関数より高速な関数への挿げ替えは?
225デフォルトの名無しさん:2006/07/16(日) 23:27:06
>>224
変わり者で良いだろ
226デフォルトの名無しさん:2006/07/16(日) 23:31:14
gccは変わり者だといいたいらしいな。
227デフォルトの名無しさん:2006/07/16(日) 23:37:04
いやだってそんな最適化をするのはgcc以外聞いたことがない。
よい意味で変わり者だと思う。
228デフォルトの名無しさん:2006/07/17(月) 01:28:27
プリプロセッサについて質問があるんだけど、

#define PUTWS(wtes) (wprintf(L"%s\n", #wtes)

ってしようとすると、ポインタの型が合いませんって
コンパイラさんが怒ってます。
何かいい回避方法はないでしょうか?
229デフォルトの名無しさん:2006/07/17(月) 01:33:11
>>228 L#wtes でどうかね?
230228:2006/07/17(月) 01:41:41
すんなり解決しました。
229さんありがとうございます。

#xxx

って、"xxx"に展開されるだけだったんですね。
勉強になりました。
231228:2006/07/17(月) 01:56:38
VCだと229さんの方法でうまくいったけど、gccだとコンパイルエラーが出た。
んで、

#define PUTWS(wtes); wprintf(L"%s\n", L ## #wtes);

としたら両方で解決しました。
んでは。
232229:2006/07/17(月) 02:14:55
あー、くっついてないと駄目か。ありがとう、俺も覚えとく。
233デフォルトの名無しさん:2006/07/17(月) 04:44:01
>>227
iccもやるよ。MSもmemcpy()をインライン展開するくらいしたと思ったが。
234デフォルトの名無しさん:2006/07/17(月) 12:05:04
>>233
printfに渡されている文字列定数の中身までみるようなコンパイラはないだろ。
235デフォルトの名無しさん:2006/07/17(月) 12:06:20
>>234
VCもgccも文字列定数を見て型の不一致の警告を出したりしたと思ったが
236デフォルトの名無しさん:2006/07/17(月) 12:18:22
>>235
VC8だと出すんだな。
printfのようなものなんて久しく使ってないから気づかなかった。
237デフォルトの名無しさん:2006/07/17(月) 12:18:52
>>234
printf("%s\n", foo);をputs(foo);に置き換えるくらいは平気でやる。
printf("%c", '\n');がputchar('\n');に置き換えるくらいもやったと思った。
238デフォルトの名無しさん:2006/07/17(月) 16:12:36
#include<stdio.h>
int main(){
FILE *fp;
fp=fopen("test.txt","a+");
return 0;
}

このプログラムを実行してもtest.txtというファイルが作成されません。
何か勘違いがあるのでしょうか?
239デフォルトの名無しさん:2006/07/17(月) 16:17:20
>>238
戻り値調べて、ヌルが返ってきてたら perror() してみろ。
240デフォルトの名無しさん:2006/07/17(月) 16:25:23
if文等で試行錯誤してみましたが、どうやらNULLは返ってきてはいないようです。
241エスパー:2006/07/17(月) 16:29:16
>>238
カレントディレクトリが違うんだろ。
242デフォルトの名無しさん:2006/07/17(月) 16:33:40
exeをコマンドプロンプトから実行していたものを、ファイルをダブルクリックすることで実行するようにしたらファイルが作成されました。
理由はよくわかりませんがアドバイスをくださった皆さん、どうもありがとうございました。
243デフォルトの名無しさん:2006/07/17(月) 16:37:35
なんで実行形式の違いで結果が違うんだ?
質問に便乗する形になってすまんが、誰か詳しく教えてくれんか?
244デフォルトの名無しさん:2006/07/17(月) 16:41:24
>>243
>>241

環境も何もわからんのにわかるかボケ。
245デフォルトの名無しさん:2006/07/17(月) 16:58:01
>>241、243
カレンディレクトリについて勉強して出直してこい。
246笹井奈琴:2006/07/17(月) 18:44:36
>>245
ttp://puchi15.hp.infoseek.co.jp/karen/karen3.html
こうですか?!わかりません!
247デフォルトの名無しさん:2006/07/17(月) 19:39:43
ゴミをばら撒いてる悪寒
248デフォルトの名無しさん:2006/07/17(月) 21:34:33
Cの関数で、戻り値がTRUEかFALSEの場合、
戻り値の型はintよりBOOLの方が真偽であると分かりいいと思うが、
<windows.h>をBOOL以外に使う必要が無い場合、
インクルードしたくない。boolはc++でしか使えない。
他にいい方法がありましたら教えてください。
249デフォルトの名無しさん:2006/07/17(月) 21:40:37
typedef int BOOL;
250デフォルトの名無しさん:2006/07/17(月) 21:44:49
>>248
C99の<stdint.h>
251デフォルトの名無しさん:2006/07/17(月) 21:45:07
C言語に関しての質問です。
ある関数と、その関数から呼ばれた関数と、さらにその呼ばれた関数から呼ばれた関数と・・・
という関数群でのみ通用する、ローカル変数とグローバル変数の中間の変数みたいなものってありませんか?
何も考えずにグローバルに詰め込んでたら何がなんだかわからなくなってしまって・・・
252デフォルトの名無しさん:2006/07/17(月) 21:47:29
static
253デフォルトの名無しさん:2006/07/17(月) 21:57:30
>>251
そういう変数をまとめた構造体へのポインタを引数にしろ。
それが C++ でのクラスに相当するコードになる。
254デフォルトの名無しさん:2006/07/17(月) 21:58:02
>>250 stdbool.h だろ。
255248:2006/07/17(月) 22:01:40
みなさまありがとうございます。
使ってみます。
256デフォルトの名無しさん:2006/07/17(月) 23:19:11
BOOLとboolが混在してくるとイライラするよな
257デフォルトの名無しさん:2006/07/17(月) 23:57:58
大きい配列はどうやったら確保できますか?下のコードを走らせると
「セグメンテーション違反です」と怒られます。環境は Linux です。

#include <stdio.h>

int main(void)
{
double aa[100000][11] = {0.0};
return 0;
}
258デフォルトの名無しさん:2006/07/18(火) 00:00:40
newやmalloc等で動的に確保するか、オプションでスタックサイズを大きくする。
259デフォルトの名無しさん:2006/07/18(火) 00:08:43
>>258 ありがとうございます。
よくわかってませんが、スタックサイズを大きくする方は ulimit でよいですか?
260257:2006/07/18(火) 00:18:35
自己。よくわかってませんが、
ulimit -Ss 大きな値
で上手くいくようです。257 だと大きな値 = 8600 がギリギリ可能な値でした。
なんで 8600 になるのかわからないですが…
261デフォルトの名無しさん:2006/07/18(火) 00:37:16
>>257
static double aa[100000][11] = {0.0};
とする手もある
ただし257は再現する最低限のコードってことだろうから
文脈によってはこの手は使えない
262デフォルトの名無しさん:2006/07/18(火) 11:54:39
>>260
double aa[100000][11] ってことは
doubleが8byteなら8,800,000byteをスタックに要求しているのでしょう?
Linuxは使ったことないし、ulimitのことも知らないけれど、
スタックサイズに8600を指定して上手く行くと言うのは
(8600 * 1024) == 8,806,400byteを確保しているからだと思いますよ。
263デフォルトの名無しさん:2006/07/18(火) 15:22:01
だれか、クイックソートってポインタと配列使わないで書けるかな?
マジ課題がピンチなんだ。
264デフォルトの名無しさん:2006/07/18(火) 15:22:54
何をソートするんだよ。
配列は使わないんだよな?
265デフォルトの名無しさん:2006/07/18(火) 15:36:46
配列もポインタもなしで、一体何をソートするんだ?
266デフォルトの名無しさん:2006/07/18(火) 15:42:22
int value_1, value_2, value_3, value_4, value_5;
をソートしたいとか。
267デフォルトの名無しさん:2006/07/18(火) 15:43:28
>>263
そんだけで分かるかカスが
268デフォルトの名無しさん:2006/07/18(火) 15:49:53
>>266 のだと
template 記述の再帰型 qsort モドキになるのか?
269デフォルトの名無しさん:2006/07/18(火) 15:51:10
>>266
配列に代入し直してからソートして戻すか、
ポインタの配列を作ってからソートするか、か?
あるいは、泥臭く分岐するか?

どれにしろ、その程度の個数ならクイックソートは
かなり無駄っぽいが。
270デフォルトの名無しさん:2006/07/18(火) 15:54:58
>>269
配列は使わないんだよ。
271デフォルトの名無しさん:2006/07/18(火) 15:56:25
>>269がボケすぎて笑える
5個かどうかも分からないのに
272デフォルトの名無しさん:2006/07/18(火) 15:59:24
value_1, value2, value_3, ... なんてのが何十個もあるわけが・・・
いや、初心者ならありうるか。
273デフォルトの名無しさん:2006/07/18(火) 15:59:24
ポインタも封じられるとなると値の交換に難儀するな
C++ の参照渡しもNGなんだろうねぇ…

多少工夫するにしても マクロでやれ っつーことか?
# >>269 の素で分岐するのが最終解だと思うけどね
274デフォルトの名無しさん:2006/07/18(火) 16:36:03
MASM の REPT〜ENDM 相当のやつがプリプロセッサにないからお手上げだな
275デフォルトの名無しさん:2006/07/18(火) 16:40:19
ど素人の質問なんですが、
コンパイル済みのアプリを
他のプログラムから(出来ればVB)操作することは出来るんでしょうか。
ボタンにフォーカスを持っていって押す、とか。
276デフォルトの名無しさん:2006/07/18(火) 16:43:02
Q. 〜は出来るんでしょうか
A. 技術的に出来るがお前には無理
277デフォルトの名無しさん:2006/07/18(火) 18:44:18
すみません、STLってJavaみたいなもんすか?
278デフォルトの名無しさん:2006/07/18(火) 18:52:21
>>277
たぶん227が考えているものとはだいぶ違うような気がする。

STLはジェネリックなコンテナ(コレクション)と、その要素を舐めるためのイテレータと、
それに対して操作を施すアルゴリズム(関数)のあつまり。
279デフォルトの名無しさん:2006/07/18(火) 18:58:45
今、両方(どっちかというとJavaの方がわかります)勉強してるんですが、
C++のSTLはJavaにすごく似てると思うんです。
コレクションもイテレータもあるし。
280デフォルトの名無しさん:2006/07/18(火) 19:06:34
java の主要な機能がコンテナじゃない言語処理系だろ?
言語処理系 と コンテナ概念(およびその実装) を等価に評価するなんてナンセンスだぜ
281デフォルトの名無しさん:2006/07/18(火) 19:09:02
>>279
その言い方だと、四則演算なんかもっとそっくりだぞ。
例えばFortranとBasicともそっくりだ。
282デフォルトの名無しさん:2006/07/18(火) 19:10:34
Javaだってコレクションとイテレータ以外にもライブラリはてんこ盛りのはずだろというつもりだった。

それはともかく、どんなプログラミング言語でも結局そういうコレクションにはお世話になるんだし、
その実装も大したことはないから結局どんな言語でも似たようなものになるのは当然だと思う。
283デフォルトの名無しさん:2006/07/18(火) 19:23:53
Cだと低水準のインラインアセンブラとかいろいろ出来ると思うんですが、
STLだとなんかビジネスロジックみたく(VBやACESSのスクリプト)みたいに
システムを楽に量産するような感じなんでしょうか。
日本語変ですいません。
284デフォルトの名無しさん:2006/07/18(火) 21:23:33
STL、というよりデータ構造(コンテナ・コレクション)はそんな具象的でなく、もっと抽象的な存在。
うまく生かしてやるように使うのが大事。
285デフォルトの名無しさん:2006/07/18(火) 23:01:26
たぶん頭の中でアプリケーションのレイヤーの高低の切り方が斜めっているんだと思う
286デフォルトの名無しさん:2006/07/19(水) 02:15:05
次は、JavaとglibとWindowsと2chって似てますね。スレッドとかあるし。
とか言いかねないな。
287デフォルトの名無しさん:2006/07/19(水) 02:21:00
俯瞰してみれば、どれも同じだと言って差し支えない。
288デフォルトの名無しさん:2006/07/20(木) 02:00:50
char* concatenate(char* str1, char* str2)
{
char *str;
sprintf(str, "%s%s", str1, str2);
return str;
}
str1とstr2を連結した文字列strのポインタを返す関数を作りました。
このコードでもうまく動くのですが、strは初期化されていないのに
なぜ、正常に動くのでしょうか?
289デフォルトの名無しさん:2006/07/20(木) 02:04:17
たまたま
290デフォルトの名無しさん:2006/07/20(木) 02:10:43
>289

そうなんですか?
正しくは
char* concatenate(char* str1, char* str2)
{
char *str;
str = (char*)malloc(strlen(str1) + strlen(str2) - 1);
sprintf(str, "%s%s", str1, str2);
return str;
}
こうするべきですか?
291デフォルトの名無しさん:2006/07/20(木) 02:11:57
うん(細かいことは抜きにして)
292デフォルトの名無しさん:2006/07/20(木) 02:25:39
-1じゃなくて、+1じゃね?
293デフォルトの名無しさん:2006/07/20(木) 14:27:03
両方に\0があるから-1なんでしょ。
それより、freeしなくていいの?
294デフォルトの名無しさん:2006/07/20(木) 14:28:20
とおもったが\0ってstrlenじゃ計算されないんだったスマソ
+1じゃないといけんね。
295デフォルトの名無しさん:2006/07/20(木) 15:16:49
>>293
本人ですか?

関数内でfreeしちゃったらそもそも・・・


本家の strcat は呼び出し側の方で malloc して
strcat(dst, src1, src2) してるね
296デフォルトの名無しさん:2006/07/20(木) 15:23:46
strcatは2引数
297デフォルトの名無しさん:2006/07/20(木) 15:34:25
お初です
今日からCをはじめよめた者です
猫でもわかる〜と言う本を買ってそれで学ぼうと思ったのですが・・・。
いきなり大きな障害が C++Builder 5を使おうと思っているのですか
うまく動いてくれないんです メモ帳で

#include <stdio.h>

int main()
{
printf("Hello World\n");

return 0;
}

これを.cで保存してコマンドプロントで実行したら

HelloWorld

と出るはずなのですが

Borlanb C++ 5.5.1 for win32 Copyright (c) 1933,2000 Borland
HelloWorld.c;
Turbo Incremental Link 5.00 Copyright (c) 1997,2000 Borland

C:\work>

と出るのです
これは何が悪いのでしょうか? 助言よろしくお願いします
298デフォルトの名無しさん:2006/07/20(木) 16:11:59
>>297
ソースの名前が hello.c としたら hello.exe というファイルが出来てない?
それを実行すると Hello World とでる。
299デフォルトの名無しさん:2006/07/20(木) 16:14:33
>297
そりゃ単にソースコードをコンパイルして実行ファイルを作っただけだ。
実行したいなら、C:\work内にHelloWorld.exeが生成されてるだろうからそれをそのまま(コマンドプロンプトから)実行。


あと、メッセージはちゃんとコピー&ペーストしようね(プロンプトからならドラッグして範囲選択後、左クリック)
300デフォルトの名無しさん:2006/07/20(木) 16:53:37
301デフォルトの名無しさん:2006/07/20(木) 17:02:59
初心者宣言するやつはろくなやつは居ない。
302デフォルトの名無しさん:2006/07/20(木) 17:05:53
C:\work>bcc32 HelloWorld.exe
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
HelloWorld.exe:
エラー E2206 HelloWorld.exe 1: 不正な文字 '' (0x0)
エラー E2206 HelloWorld.exe 1: 不正な文字 '' (0x2)
エラー E2206 HelloWorld.exe 1: 不正な文字 '' (0x0)
エラー E2206 HelloWorld.exe 1: 不正な文字 '' (0x0)
エラー E2206 HelloWorld.exe 1: 不正な文字 '' (0x0)
エラー E2206 HelloWorld.exe 1: 不正な文字 '' (0x4)
エラー E2206 HelloWorld.exe 1: 不正な文字 '' (0x0)
エラー E2206 HelloWorld.exe 1: 不正な文字 '' (0xf)
エラー E2206 HelloWorld.exe 1: 不正な文字 '' (0x0)
エラー E2206 HelloWorld.exe 1: 不正な文字 '�' (0xff)
エラー E2206 HelloWorld.exe 1: 不正な文字 '�' (0xff)
エラー E2206 HelloWorld.exe 1: 不正な文字 '' (0x0)
エラー E2206 HelloWorld.exe 1: 不正な文字 '' (0x0)
エラー E2206 HelloWorld.exe 1: 不正な文字 'ク' (0xb8)
エラー E2206 HelloWorld.exe 1: 不正な文字 '' (0x0)
エラー E2206 HelloWorld.exe 1: 不正な文字 '' (0x0)
エラー E2206 HelloWorld.exe 1: 不正な文字 '' (0x0)
エラー E2206 HelloWorld.exe 1: 不正な文字 '' (0x0)
エラー E2206 HelloWorld.exe 1: 不正な文字 '' (0x0)
エラー E2206 HelloWorld.exe 1: 不正な文字 '' (0x0)
エラー E2206 HelloWorld.exe 1: 不正な文字 '' (0x0)
エラー E2206 HelloWorld.exe 1: 不正な文字 '@' (0x40)
エラー E2206 HelloWorld.exe 1: 不正な文字 '' (0x0)
エラー E2141 HelloWorld.exe 1: 宣言の構文エラー
*** 24 errors in Compile ***
303デフォルトの名無しさん:2006/07/20(木) 17:07:13
exeファイルをコンパイルするなよ。
304デフォルトの名無しさん:2006/07/20(木) 17:08:43
Javaのコマンドインタプリタに毒されてる?
305デフォルトの名無しさん:2006/07/20(木) 17:10:49
>298-299
出来ました
アレがコピペできるなんて思いませんでした
やってみると出来ました

色々情報サンクスです
何かあったらまたきますのでそのときよろしくお願いします
306299:2006/07/20(木) 17:19:47
なんか今更ですまんが左クリックじゃなくて右クリックだった。
307デフォルトの名無しさん:2006/07/20(木) 17:23:08
>>301
上級者宣言する奴には、もっとろくな奴がいない。
308デフォルトの名無しさん:2006/07/20(木) 17:33:47
じゃあ、中級者宣言します!
309デフォルトの名無しさん:2006/07/20(木) 17:48:17
>>302-303
大笑いwwwww
310デフォルトの名無しさん:2006/07/20(木) 18:19:22
>>299 = >>306

漏れはうっかり右クリックを2回(コピーしてペーストも)してしまうことがあるので
コピーのときは「範囲選択+Enter」でペーストのときだけ右クリックするようにしてる
311デフォルトの名無しさん:2006/07/20(木) 19:06:39
動きました 皆様助言アリガトウございます
312290:2006/07/21(金) 02:32:58
>291->296

本人です。
どうもありがとうございました。
これからもよろしくお願いします。

313デフォルトの名無しさん:2006/07/21(金) 06:51:15
教えて下さい。猫でもわかる〜と言う本を見て勉強しています。
Borland C++ compiler 5.5を使っています。
本の中で次のような練習問題があるのですが、
#include <stdio.h>
int main()
{
  int a = 10;
  size_t s;
  s = sizeof ++a;
  printf("a = %d\n", a);
  return 0;
}
これをコンパイルしようとすると、
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
0409.c:警告 W8004 0409.c 14: 's' に代入した値は使われていない(関数 main )
と警告が出てコンパイル出来ません。
この本には上記のようなサンプルコードと、それをコンパイルした
実行ファイルが付いていて、ファイルを実行する事は出来ます。実行すると、
a = 10 となります。なぜ上記のコードがコンパイル出来るのでしょうか?
他にも本と同じように組んでもコンパイル出来ない事が何度かありました。
これは私の環境が良くないのでしょうか?助言宜しくお願いします。


314デフォルトの名無しさん:2006/07/21(金) 06:53:50
警告とエラーの見分けもつかねーのかよカス
315デフォルトの名無しさん:2006/07/21(金) 07:24:00
>s = sizeof ++a;

これは何を意図しているんだ?
316デフォルトの名無しさん:2006/07/21(金) 07:29:42
本には警告について載っていなかったのでわかりませんでした。
フォルダの中を確認したら実行ファイルがありました。
警告文とエラーメッセージが出たらコンパイル出来ていないと
思い込んでいました。カスです。ごめんなさい。
317デフォルトの名無しさん:2006/07/21(金) 07:35:33
s = sizeof ++a;
は変数 a がインクリメントで11になるはず!
しかし、sizeof 式;としても式は評価されないから
変数 a の値は10のまま。という練習問題みたいです。
318デフォルトの名無しさん:2006/07/21(金) 07:37:25
>>315
sizeof 式
sizeofで式が評価されないことの実証だと思う。評価されるとすると a = 11になるよな。
319デフォルトの名無しさん:2006/07/21(金) 07:40:08
どこかに警告レベルを調整する設定があるはずだから、そのレベルを落とせば出なくなると思う。
320デフォルトの名無しさん:2006/07/21(金) 07:45:44
ありがとうございます。調べてみます。
他の問題も全て出来ました。御助力ありがとうございました。
321デフォルトの名無しさん:2006/07/21(金) 08:55:14
HPを読み込んで内容を検索しようと思ったのですが、InternetOpen、InternetOpenUrl、InternetReadFileの順序でコードを書いたのですが、InternetReadFileを何回呼び出しても、最初の部分しか取得できない状態です。
 どのサンプルをみてもInternetReadFileを数回読み込むだけで全部取得できているのですが、どこが悪いのかわかりません。
322デフォルトの名無しさん:2006/07/21(金) 09:49:41
マルチか…
323デフォルトの名無しさん:2006/07/21(金) 22:36:30
はわわ〜
324デフォルトの名無しさん:2006/07/22(土) 16:41:20
C#が不安になってきてC++勉強しだしたんですが
C++はnewで初期化とかしなくていいんですか?
325デフォルトの名無しさん:2006/07/22(土) 16:48:03
しなくて済むんだったらしないほうが楽。
必要なところではしましょ。
326デフォルトの名無しさん:2006/07/22(土) 17:33:30
>>325
C++はC#と違ってコンストラクタが勝手に呼ばれるということでいいんでしょうか?
327デフォルトの名無しさん:2006/07/22(土) 19:06:04
>>326
int x = 5;のようなことはC++でもC#でも書けるでしょ。
その考えをクラスにも拡張したと捉えてみてはどうでしょう。
328デフォルトの名無しさん:2006/07/22(土) 19:08:30
>>327
大体こんな感じっていうのはわかりました。
ありがとうございました。
329デフォルトの名無しさん:2006/07/22(土) 19:19:27
C++では全てが原則値型相当だと書こうと思ったら、
C#って構造体でもコンストラクタ呼ぶにはnew使うのか、説明には面倒な仕組みだ。
330デフォルトの名無しさん:2006/07/22(土) 21:02:47
WMP10のSDKについてるサンプル (\WMSDK\WMPSDK10\samples\cpp\WMPHost)
をいじってたんですが CWMPEventDispatch.cpp の各メソッド
( OpenStateChange 〜)からWMPのコントロールを持っている
ウィンドウのハンドルを取得したいんですがどうやったらいいでしょう?
331デフォルトの名無しさん:2006/07/23(日) 04:54:58
MFCを使わずにC++で窓プログラミングする場合、
クラスのインスタンスはどこで作るべきでしょーか?
グローバルに作るとまだゲットしてないウィンドウハンドルが受け取れないので
初期化処理ができないしWinMainとかプロシージャ内で作るのも・・・?
もしかしてとんでもない考え間違いですかねぇ・・・
332デフォルトの名無しさん:2006/07/23(日) 04:58:05
>>331
そんな情報だけじゃ何も言えない。
333デフォルトの名無しさん:2006/07/23(日) 05:04:38
>>332
クラスの詳細でしょうか?
メインウィンドウに張り付いて描画されたビットマップを表示する
カスタムコントロールのクラスです
MFCでいうCWndクラスのようなものは継承してませんし作れませんので
どうしたもんかと思いまして・・・
334デフォルトの名無しさん:2006/07/23(日) 05:11:44
>>333
グローバルなポインタを置いてウィンドウ作成時に new すればいいんじゃね?
335デフォルトの名無しさん:2006/07/23(日) 05:20:45
>>334
な、なるほど!
ウインドウ作成時とはコントロールの張り付け先のメインウィンドウ作成時
ということでよろしいでしょうか?
336デフォルトの名無しさん:2006/07/23(日) 05:25:28
>>335
他に何のウィンドウがあるか、こっちはシラネーんだ。好きにしろ。
337デフォルトの名無しさん:2006/07/23(日) 05:30:11
>>336
すみません確かにそうですね!
なにはともあれ、ありがとうございます!
338デフォルトの名無しさん:2006/07/23(日) 15:15:28
変数の初期化で質問なんだけど、宣言時なら
POINT ptHoge = { 640, 480 };
みたいに初期化できるんだけど、初期化したいのがクラス変数の場合は
どうすればいい?

コンストラクタ内で、ptHoge.x = 640; ptHoge.y = 480; ってやるしかない?
339デフォルトの名無しさん:2006/07/23(日) 15:18:58
>>338 うん。
340デフォルトの名無しさん:2006/07/23(日) 15:39:27
>>338
単にメンバの初期化なら初期化リストを使うのがいいかも。
こんなカンジで定義しておいて、

class POINT {
private:
int x, y;
public:
POINT(int x, int y) : x(x), y(y) {}
};

こんなカンジで初期化。

POINT ptHoge(640, 480);
341デフォルトの名無しさん:2006/07/23(日) 15:42:34
>>340
いや、たぶん class T { POINT ptHoge; T(); }; の T::T() の話だろ。
342デフォルトの名無しさん:2006/07/23(日) 16:46:53
class T { POINT ptHoge; T() : ptHoge(640, 480) { hogehoge; } };
343デフォルトの名無しさん:2006/07/23(日) 17:33:09
>>342
バカをさらけ出さなくてもよい
344デフォルトの名無しさん:2006/07/23(日) 18:06:50
>>342
こういうアホほど答えたがるのはどうにかならんものか
345デフォルトの名無しさん:2006/07/23(日) 18:29:48

なんか問題ある?
346デフォルトの名無しさん:2006/07/23(日) 18:48:42
単に頓珍漢なだけだろ。
347デフォルトの名無しさん:2006/07/23(日) 21:37:48
あまりにあっさり答えられてしまったのが悔しかったのかな
348デフォルトの名無しさん:2006/07/24(月) 01:03:53
整数型から符号情報を取り出す関数
int sign(int n)
{
if (n>0) return 1;
if (n<0) return -1;
return 0;
}
をifも三項演算子も使わないで実装する方法があったと思うのですが
どなたか知りませんか?
349デフォルトの名無しさん:2006/07/24(月) 01:19:41
>>348
((n > 0) - (n < 0))
こんなの?お勧めはしない。
350デフォルトの名無しさん:2006/07/24(月) 01:36:44
>>348
なぜ三項演算子を使わない?
351デフォルトの名無しさん:2006/07/24(月) 01:43:48
あとMSBで見るとか
移植性消えるけど
352デフォルトの名無しさん:2006/07/24(月) 02:40:50
>>348 どうもです試してみます。boolからintの部分もビット演算か何かで確実にできると嬉しいのですが。
>>350 if文と同じだと聞いたもので...秒間1000万回近く呼ばれるので条件分岐を無くせば高速化できるかなと期待しているのです。
>>351 同じような事を考えたのですが0と正を算出する方法が思い付きませんで。intel以外で使う予定はないので移植性には目をつむります...
353デフォルトの名無しさん:2006/07/24(月) 02:53:25
>>348 考えてみたらこの式で十分な気がしてきました.ありがとうございます
354デフォルトの名無しさん:2006/07/24(月) 03:59:17
むしろ遅くなる気がするが…。
355デフォルトの名無しさん:2006/07/24(月) 04:37:39
intel だけで使うならインラインアセンブラ使え
356デフォルトの名無しさん:2006/07/24(月) 06:56:15
取り出した符号を後でどう使うのか知りたい気がする。
357デフォルトの名無しさん:2006/07/24(月) 07:39:50
348と349で、g++ -O3 -Sとして吐かれるアセンブラのコードを見てみたが、
349のほうは条件分岐がなくなって速そうに見えた。
あと、どちらもシフト命令でMSBを見てるようだ。
ちょっと意外。
358デフォルトの名無しさん:2006/07/24(月) 07:47:16
実測もせずコレじゃ効率悪いよなぁと悩んでプログラム作成が進まないのは罠
359デフォルトの名無しさん:2006/07/24(月) 14:30:35
何も考えなくても、実測してみりゃいいのにな。
コンパイラの最適化でどうなるかなんて
どうせ考えたって埒があかないんだから。
360デフォルトの名無しさん:2006/07/24(月) 18:32:45
実測しないでアセンブリ出力を較べてみた。
static int sign0(int n) {if (n > 0) return 1;if (n < 0) return -1;return 0;}
static int sign1(int n) {if (n < 0) return -1;if (n > 0) return 1;return 0;}
static int sign2(int n) {return ((n > 0) - (n < 0));}
static int sign3(int n) {return n < 0 ? -1 : n > 0;}
・gcc3.4.4@cygwin
sign1とsign3で全く同じコードを吐く。それらは条件ジャンプ1回と条件セットでシフトはなし。
sign2はシフトと条件セットを駆使している。sign0は無駄なジャンプあり。
・gcc3.2.3@linux
cygwin版とほぼ同じ。こちらの方が積極的にインライン展開しようとする。一部無駄なジャンプあり。
sign0とsign2でシフトを使う。
・icc(32)9.0@linux
sign2以外はジャンプし捲くりのほぼ同じコード。
プロファイリングでジャンプしない条件を探すことが前提か。
・icc(64)9.0@linux
sign2以外ではシフトは使わない。ジャンプはするが、32ビット版ほどではない。
sign2以外は同じロジックになり、条件ジャンプ1回無条件ジャンプ1回、条件つきコピー1回。
・総括
インライン展開しないとどっち道関数呼び出しが遅いと思われ。
インライン展開するならロジックによる速度差が出るだろうけれど、
iccの場合はジャンプの可能性をプロファイリングで正しく見積もるべきだろう。
#詳細は割愛。
361デフォルトの名無しさん:2006/07/24(月) 22:00:04
357ですが、-Oオプション使いました?
sign0とsign2しかやってないけど、
sign0の-Oなしでジャンプ2個、-O3でジャンプ1個だったけども。
うちもgcc (GCC) 3.4.4 (cygming special)
362デフォルトの名無しさん:2006/07/24(月) 22:41:02
>>361
returnを数えてないとか? インライン展開しちゃうと判断難しそうだが。
363デフォルトの名無しさん:2006/07/24(月) 23:49:12
>>356
俺も知りたい。結局、if 文で判定していたら大笑い。
364デフォルトの名無しさん:2006/07/25(火) 11:28:08
>>348 です.
>>360 詳細な分析ありがとうございます.inlineでやってます.プロファイリングの方法が今ひとつ分かってないので今後の課題です.
>>356 >>363 実はオセロの勝敗累積?に使ってます.うまいこと書けませんが
sum = 0;
for(i=0; i<10000; i++) sum += sim();
でsimが何度か再帰するのですが最後に石の数の差から勝敗をsignで取り出して加算してゆく感じです.アルゴリズムがうまくいってないのでよわよわですが
365デフォルトの名無しさん:2006/07/25(火) 11:30:50
>>352>>353のアンカー間違ってました 384でなくて>>349です
366デフォルトの名無しさん:2006/07/25(火) 11:48:39
質問と関係ないけどアドバイスしとく

オセロの勝敗は石の数の差だけど

途中の有利不利は石の数の差じゃないから

よあよあになるのは当たり前
367デフォルトの名無しさん:2006/07/25(火) 11:50:23
ついでに言うと

自分の着手出来る場所の数 - 相手の着手出来る場所の数

が大きくなるようにするのがミソ
368デフォルトの名無しさん:2006/07/25(火) 14:15:39
>>366 確かにそうなんですがsimは64マス全て埋め尽くしてみてその勝敗を返す関数なので
最後にsignを使っているところは問題なさそうです.
最近囲碁で流行っている手法だそうなので試してみてますがあんまりうまくいってません...
369デフォルトの名無しさん:2006/07/25(火) 17:03:48
VC++6.0を使っているものです、質問させてください。

ttp://www.vector.co.jp/soft/win95/prog/se251850.html
上のアドレスから落とせる、
amediousという、3層ニューラルネットワークを作成するプログラムを使って
入力層2中間層4出力層3のネットワークをBPで学習させて使いたいのですが
amediousに付いてくるhtmの説明を見てもよく分かりませんでした。

結局これは、自分でこの説明を参考にしてプログラムを組め、
ということなのでしょうか・・・?

上でVC++6.0を使っています、と書きましたが、
持っているというだけで、プログラムの知識がまったくないので、困っています。

良かったら、どなたかアドバイスをお願いします・・・。
370デフォルトの名無しさん:2006/07/25(火) 19:39:30
>>369
それは、クラスライブラリだから、自分でプログラムするんだよ。
プログラムの知識がまったくないなら無理。
371デフォルトの名無しさん:2006/07/25(火) 19:41:57
デバッグ中、クラスメソッド内でメンバ変数のポインタがNULLってありえない
class CLASS
{
private:
char m_string[1024];
public:
void method() {
strcpy( m_string, "TEST" ); // ここでNULL
}
};
どう思いますか
372デフォルトの名無しさん:2006/07/25(火) 19:45:24
>>371が糞だと思います。
373デフォルトの名無しさん:2006/07/25(火) 21:32:12
これが偶然動くことは多いよ。
CLASS *p = 0;
p->method();
ところでC++ではメソッドという言葉を使わない。
374デフォルトの名無しさん:2006/07/25(火) 22:12:33
メンバ関数内でメンバ変数に触れないなら大丈夫かと
375デフォルトの名無しさん:2006/07/25(火) 23:25:15
そういうのって素人考えでは設計が間違ってるんじゃないかって
思ったりするんですが、実際のところはどうなんでしょうか?
静的でないメンバ変数に触れないなら
その関数は静的にした方がいいと思うのですが。
376デフォルトの名無しさん:2006/07/26(水) 00:41:22
>>375
分っちゃいるが便利なんでやっちまうことも多い。

特にすでに書いちゃったメンバ関数の特殊な状況で
this無しで呼びたいってのは、後から出てくるもんだ。

もちろんタコなのは言うまでも無いが。
377デフォルトの名無しさん:2006/07/26(水) 00:50:47
thisがヌルだなんて状況は絶対に有り得ないとするのは当然。
376のようなことはちっとも一般的でないから勘違いしないように、一応ね。
いくら秘密兵器だとしても程がある。
378デフォルトの名無しさん:2006/07/26(水) 04:41:15
ぬるぽに -> 使った時点で未定義動作。
379デフォルトの名無しさん:2006/07/26(水) 04:53:12
  ∧_∧
  ( ・∀・)   | | ガッ
 と    )    | |
   Y /ノ     人
    / )    <  >__Λ∩
  _/し' //. V`Д´)/ ←>>378
 (_フ彡
380デフォルトの名無しさん:2006/07/27(木) 13:57:02
C++のSTLとその例外についてです。
C++の大抵の本では「vectorやstringを使えばメモリ関連の苦労ともオサラバです」とありますが、

(1)
その理由は「生ポインタと違い、意図せぬメモリ領域にアクセスすることがない(その前に
例外が飛んでくる)から」という理解でいいのでしょうか?

(2)
stringなどで、不正?アクセスは防げても、メモリ不足による各種操作の失敗の可能性は依然残ります。
そんな時は例外が飛んでくるのでしょうが、これの対処としてはどんなのが正統派なのでしょう?
サンプルコードなんかは何もしてないものが多かったのですが、こういうもんなんでしょうか?
それとも念のため、string使う所は常にcatch(...){ /*エラーメッセージ*/ } とかしておく方が
良いスタイルだったりするのでしょうか?
381デフォルトの名無しさん:2006/07/27(木) 14:26:08
>>380
basic_stringの場合
§21.3.4
4 The functions described in this clause can report two kinds of errors, each associated with a distinct exception:
? a length error is associated with exceptions of type length_error (19.1.4);
? an out-of-range error is associated with exceptions of type out_of_range (19.1.5).
4a For any string operation, if as a result of the operation, size() would exceed max_size() then the
operation throws length_error.
382デフォルトの名無しさん:2006/07/27(木) 15:08:19
>>380
(1)
どういう文脈で「メモリ関連の苦労ともオサラバです」なのか
よくわかんないけどサイズが自動的に拡張されるから、
cの文字列操作関数につきもののバッファオーバーランを防げる...
とかでは?

(2)
全くケースバイケース。
例えばCGIだったら、500 Server Internal Errorでも返すべきかもしれないし、
そんなに重要じゃないアプリケーションなら
キャッチもせずにそのままアプリケーションを落としてもいいだろうし。
あなたがサムソンの社員だったら、メモリモジュールの通販サイトへ
ユーザを案内してもよいでしょう。
383デフォルトの名無しさん:2006/07/27(木) 16:07:24
(1)
確かに領域のサイズをあまり気にしなくて良いという点もあるが
もっと大きいのは、リーク(解放しわすれ)を気にしなくてすむことだろう。
誰が確保して、どの段階で誰が責任を持って解放するのか、考えることが無くなる。

(2)
必要ならば使う前後でtryを使うこともあるだろうが
「メモリ不足」は極めて深刻な、回復不能のエラーなため
アプリケーション全体でcatchして、そのまま終了するケースも多い。
もちろん、サービス等の終了してはいけないものは丁寧に管理する必要があるし
データの保存を必要とする場合もあるが。
それでも、普通は「常に前後でtry&catch」という形は採らない。
384デフォルトの名無しさん:2006/07/27(木) 20:59:54
(1)の最大の理由はいちいちfreeすることを考えなくてよいということだと思う。
途中でreturnするような関数で、returnの数だけfreeが書いてあるような醜いコードも結構見かける。
vectorやstringでは、デストラクタでメモリを解放してくれるから、そういうようなコードは起こり得ないということ。
スマートポインタと同じ発想だな。
385デフォルトの名無しさん:2006/07/27(木) 23:31:00
このプログラムでtest1とtest2の違いは何ですか?
test1だとt[500]の配列が新たにスタックに作られるという
違いだけですか?

#include<stdio.h>
#include<stdlib.h>
void test1(int t[500]){
 printf("%d ",t[500-1]+1);
}
void test2(int *t){
 printf("%d ",t[500-1]+1);
}
void main(){
 int *t,i;
 t=(int *)malloc(sizeof(int)*500);
 for(i=0;i<500;i++)t[i]=i;
 test1(t);
 test2(t);
 free(t);
}
386デフォルトの名無しさん:2006/07/28(金) 00:00:01
387デフォルトの名無しさん:2006/07/28(金) 00:02:51
>>385
違いはない。同じ。
関数の仮引数の大きさは無視される。
388デフォルトの名無しさん:2006/07/28(金) 00:24:04
void test3(int t[]){
 printf("%d ",t[500-1]+1);
}
389デフォルトの名無しさん:2006/07/28(金) 00:27:22
#include<stdio.h>
#include<stdlib.h>
void test4(int (*t)[500]){
 printf("%d ",(*t)[500-1]+1);
}
void test5(int **t){
 printf("%d ",(*t)[500-1]+1);
}
void test6(int *t[]){
 printf("%d ",(*t)[500-1]+1);
}
void main(){
 int *t,i;
 t=(int *)malloc(sizeof(int)*500);
 for(i=0;i<500;i++)t[i]=i;
 test4(&t);
 test5(&t);
 test6(&t);
 free(t);
}
390デフォルトの名無しさん:2006/07/28(金) 00:30:20
#include<stdio.h>
#include<stdlib.h>
void test7(int (*t)[500]){
 printf("%d ",t[0][500-1]+1);
}
void test8(int **t){
 printf("%d ",t[0][500-1]+1);
}
void test9(int *t[]){
 printf("%d ",t[0][500-1]+1);
}
void main(){
 int *t,i;
 t=(int *)malloc(sizeof(int)*500);
 for(i=0;i<500;i++)t[i]=i;
 test7(&t);
 test8(&t);
 test9(&t);
 free(t);
}
391デフォルトの名無しさん:2006/07/28(金) 00:35:33
#include<stdio.h>
#include<stdlib.h>
void testA(int (*t)[500]){
 printf("%d ",(*(t+1))[500-1]+1);
}
void testB(int **t){
 printf("%d ",(*(t+1))[500-1]+1);
}
void testC(int *t[]){
 printf("%d ",(*(t+1))[500-1]+1);
}
void main(){
 int (*t)[500],i;
 t=(int (*)[500])malloc(sizeof(int [500])*2);
 for(i=0;i<500;i++){t[0][i]=i;t[1][i]=i+500;}
 testA(t);
 testB(t);
 testC(t);
 free(t);
}
392デフォルトの名無しさん:2006/07/28(金) 02:45:43
>>386-391
ありがとうです。
どういう書き方でも動作は同じなのですね。
393380:2006/07/28(金) 03:01:24
皆様、お返事ありがとうございました。

>>381
これはISOの文書でしょうか?非常に参考になります。
大きめの書店なんかで入手できるもんでしょうか?

>>382
オサラバ云々は、イントロで述べられているようなものです。
で、「オーバーフロー関連のことは忘れられても、メモリ不足の状況なんかは依然
考える必要が残ってそうだから、完全にオサラバつうわけじゃないじゃん」と思ったわけです。
(2)で、そのまま落とすとの御意見も大変参考になりました。

>>383
(2)について、例えばアプリケーション全体をcatchするこんなのもアリということでしょうか。
int main(void){
try{ MakeMainWindow(); }
catch (...){ /*エラーメッセージ、ギブアップ宣言、最低限の後始末*/ }
}

>>383
>>384
(1)について納得しました。確かに解放さえきちんとやれれば、被害(リーク)なんてありませんもんね。

394デフォルトの名無しさん:2006/07/28(金) 03:04:38
>>393
規格が見たけりゃ↓の一番下のリンクを。
http://pc8.2ch.net/test/read.cgi/tech/1153079297/5
395デフォルトの名無しさん:2006/07/28(金) 07:52:36
void foo() {
    std::vector<std::string*> v;
    v.push_back( new std::string() );
    call_exceptional_function();
}
とか書いて、
fooを抜けるときに new string() で作ったオブジェクトが解放されなくて苦しめ
396デフォルトの名無しさん:2006/07/28(金) 08:54:06
バカ降臨
397デフォルトの名無しさん:2006/07/28(金) 10:18:43
C言語をはじめようと思うんですが、何を使えばいいんですか?
VisualBasic2005でできますか?
398デフォルトの名無しさん:2006/07/28(金) 10:30:30
mallocで取得したメモリをfreeで解放しようとした時、解放できたかを
確認することはできますか?
399デフォルトの名無しさん:2006/07/28(金) 10:40:17
できない。
400デフォルトの名無しさん:2006/07/28(金) 10:42:18
hint: return value
401デフォルトの名無しさん:2006/07/28(金) 10:42:23
おっと!環境依存可スレか。
環境によっては可能かも。
402デフォルトの名無しさん:2006/07/28(金) 10:43:35
VC2005ならerrno
403デフォルトの名無しさん:2006/07/28(金) 10:44:30
>>400
void free(void *memblock);
404デフォルトの名無しさん:2006/07/28(金) 10:51:17
>>398
できないし、確認する必要が無い。
405デフォルトの名無しさん:2006/07/28(金) 10:57:39
実際に解放されるタイミングは
関数呼び出し時かもしれないし
しばらくあとかもしれないし
OSによってはあえて解放しないかもしれない

解放後どうなるかを確認することには意味が無い

確保するときに成功したか失敗したかを知ることの方が重要
406デフォルトの名無しさん:2006/07/28(金) 11:41:19
いまさらですがどこかでVC++6.0を買えませんか?

VB6.0を持っていて、VisualStudioのヘルプが充実しているので
VCもそれでいまさら勉強したいのですが
407デフォルトの名無しさん:2006/07/28(金) 11:44:22
Visual C++ 2005 Expressの使用方法になるのですが、

ttp://www.kumei.ne.jp/c_lang/sdk/sdk_00.htm
を実行する場合、どのテンプレートを使用したらよいのでしょうか?
空のテンプレートで作成すると、windows.hへのパスが通ってないらしく
そこでエラーになります。
パスを通そうとして、includeフォルダの位置を探したのですが、
そのフォルダの中にwindows.,hがありませんでした。
(C:\Program Files\Microsoft Visual Studio 8\VC\include)
そのままじゃコンパイルできないということなのでしょうか?
408407:2006/07/28(金) 11:45:49
補足 因みにSDKについてはマイクロソフトのHP通りにインストールしています。
連投すいません。
409デフォルトの名無しさん:2006/07/28(金) 12:03:20
大佐、ディスクリプタをiostreamで扱いたいんだが
どうすればいい?
410デフォルトの名無しさん:2006/07/28(金) 12:05:46
>>407
2005スレのテンプレ読んで恋
411393:2006/07/28(金) 12:11:25
>>394
どうもありがとうございます。ドラフト見れました
412デフォルトの名無しさん:2006/07/28(金) 13:07:57
>>409 環境依存
413デフォルトの名無しさん:2006/07/28(金) 13:57:33
環境依存OK
414デフォルトの名無しさん:2006/07/28(金) 14:20:31
環境を書け、って意味かと。
415409:2006/07/28(金) 14:27:33
環境依存なのか・・・
環境依存なソースはあんまり書きたくないので
C風な書き方で妥協しとくことにします・・・。

俺は負け犬だぁぁぁぁ
416デフォルトの名無しさん:2006/07/28(金) 17:11:37
すいません、質問なんですが、ANSI g++でメンバ関数内でオブジェクト自身のアドレス
を扱う方法を教えていただきたいのですが、どなたかわかる方いらっしゃいますか?
417デフォルトの名無しさん:2006/07/28(金) 17:14:20
this?
418デフォルトの名無しさん:2006/07/28(金) 17:18:04
>>416
thisに&をつけてみたのですが、non-value unary '&'というエラーが出ました。
419デフォルトの名無しさん:2006/07/28(金) 17:18:55
thisがポインタだもん
&いらないよ
420デフォルトの名無しさん:2006/07/28(金) 17:29:39
>>419
仰るとおりにやったら動きました。
すいません、こんな基本的なことを知らなくて。

本当に助かりました。
ありがとうございました。
421デフォルトの名無しさん:2006/07/28(金) 18:00:37
ファイル名に使える文字数の長さが定義されているマクロとかありますか?
422デフォルトの名無しさん:2006/07/28(金) 18:04:40
#include <dir.h>

MAXPATH
423デフォルトの名無しさん:2006/07/28(金) 18:09:57
#include <stdlib.h>

MAX_PATH
424デフォルトの名無しさん:2006/07/28(金) 18:19:27
WindowsでNT系+NTFSなら
W系APIを使えば、MAX_PATHよりずっと長いファイル名が作れたりする。

一応、予備知識として。
425デフォルトの名無しさん:2006/07/28(金) 18:55:50
>>406
Visual Studio Professional Edition with MSDN Professional Subscription
を手に入れれば、VC++6.0もついてくるよ
426デフォルトの名無しさん:2006/07/28(金) 20:34:56
>>423
stdlib.hのは _MAX_PATH だよ。
MAX_PATH はSDK。
427デフォルトの名無しさん:2006/07/28(金) 23:03:02
>>425
教えていただいて有難うございます。

http://www.microsoft.com/japan/msdn/howtobuy/vs2005/subscriptions/ 
の 通常パッケージ 158,000 円  
アップグレード パッケージ [対象] 94,800 円

っていう奴のことでしょうか?

前からMicrosoftのwebは見ていましたが、何回見ても製品の内容物とかが
全然わからず、たまりかねて今回質問してみました。各パッケージの内容
物がわかるようなサイトってどこかにありませんでしょうか?
428デフォルトの名無しさん:2006/07/28(金) 23:12:21
MSに直接訊けばいいじゃん
429デフォルトの名無しさん:2006/07/28(金) 23:38:46
>>426
どっちも言語の標準規格には無い。
430デフォルトの名無しさん:2006/07/29(土) 01:43:02
static const int N = 100;

みたいなコンパイル時定数があるとして、これをコンパイル時に文字列定数化する方法ってありますか?
マクロでも何でもいいです。いろいろ考えたけど、どうも思いつかない。

イメージとしてはこんな感じで

static const char str[] = "N = " TO_STRING(N);

この時の「定数」っていうのは、const 定数や enum 値であって、
以下のようなものは不可とします。

#define N 100
431デフォルトの名無しさん:2006/07/29(土) 02:05:50
>>430
template meta programing を駆使すればなんとかなるかもしれない。

こんな感じ?
template<int N> struct formated_int { static char const value[]; };

もしかしたら boost に混ざってるかもしれない。
432デフォルトの名無しさん:2006/07/29(土) 03:58:27
どなたかお知恵をお貸し下さい。
VB6にて作成したActiveX DLLをVC++2003で参照したいのですが、
スマートポインタを使用する方法(#importする方法)ではなく、
win32APIの"LordLibrary"のように明示的にリンクさせる方法を
ご存知ないでしょうか?
質問をする背景を簡単に書きますと以下のようになります。

・複数のActiveX DLLを呼び出し側(VC)のプログラム実行中にロードしなければならない
・DLLの名称、数ともに不定であり、#importでは対応できない
・DLLのPATH、ロードトリガは別モジュールから共有メモリを介して呼び出し側(VC)へ通知する
・全DLL内には公開されている同一名称のクラスとメソッドが存在している

以上、よろしくお願い致します。
433デフォルトの名無しさん:2006/07/29(土) 04:47:18
>>430
逆にすれば、boost::lexical_castが使えるんでないかい
434デフォルトの名無しさん:2006/07/29(土) 08:49:37
HeapAlloc
GlobalAlloc
malloc
new

メモリ確保がいろいろあるんですけど、どれが一番いいのでしょうか?

↓調べてみた。
すべて最終的にはHeapAllocで確保する
newでは一回使うとフリーメモリリストに登録され二度目では高速に確保できる、しかし、断片化しやすい。
速度ではHeapAllocが爆速。
小さい奴はnewででかい奴はHeapAllocで。
mallocはクラスに向かない、ごみ。
435デフォルトの名無しさん:2006/07/29(土) 09:06:39
つか、クラスの場合はnewしかないだろ
436デフォルトの名無しさん:2006/07/29(土) 09:18:07
newだなあ。
いざとなったらoperator newをオーバーロードすればいいんだし。
437デフォルトの名無しさん:2006/07/29(土) 09:25:48
なるほどね。
newでおkってことですか。

今使ってる
サンプルがHeapAlloc とか使っていて気になったけど
newに直しとくか。
438デフォルトの名無しさん:2006/07/29(土) 10:18:20
ちんちーん
439デフォルトの名無しさん:2006/07/29(土) 10:19:55
全部使うよ
440デフォルトの名無しさん:2006/07/29(土) 13:41:57
CopyMemory
後ろからコピーしたいのですが、一個一個後ろからしていくのしか方法はないのでしょうか!?
441デフォルトの名無しさん:2006/07/29(土) 13:58:19
後ろからしたい理由はなんだ?
442デフォルトの名無しさん:2006/07/29(土) 14:12:20
データを逆に&コピーしたいだけですよ。
443デフォルトの名無しさん:2006/07/29(土) 14:18:18
std::reverse_copy
444デフォルトの名無しさん:2006/07/29(土) 14:23:30
rbegin()、rend()
445M:2006/07/29(土) 15:02:33
1.duble型変数へのポインタ変数dPtrを宣言する。
2.float型ポイント変数aにfloat型変数numberのアドレスを代入する。
3.ポインタ変数aが指すオブジェクトの値を1インクリメントする。
4.文字型配列aに格納されてる文字列をプリントする。
C言語でどうやってプログラムするんですか?(><)
446デフォルトの名無しさん:2006/07/29(土) 15:14:36
1. double *dPtr;
2. flat *a = &number;
3. a++;
4. printf("%s", a);
447デフォルトの名無しさん:2006/07/29(土) 15:15:33
2.
×flat *a
○float *a

3.
×a++;
○(*a)++;
448デフォルトの名無しさん:2006/07/29(土) 15:15:59
>>445
1. double *dPtr;
2. a = &number;
3. (*a)++;
4. printf("%s", a);

あとポイントじゃなくてポインタな
449デフォルトの名無しさん:2006/07/29(土) 15:33:59
そいつマルチだよ
450デフォルトの名無しさん:2006/07/29(土) 15:34:42
>>445
マルチすなや。
>>446>>448
あんたらは重大なミスを犯している。>445では「duble型」とあるぞ。
451デフォルトの名無しさん:2006/07/29(土) 15:37:00
>>446もflat型
452デフォルトの名無しさん:2006/07/29(土) 15:38:23
453デフォルトの名無しさん:2006/07/29(土) 15:40:17
float型で++はだめ?
454デフォルトの名無しさん:2006/07/29(土) 15:41:03
duble *a か!それは気づかなかった。

いやーこれはどういう働きをするんだろうね?
455デフォルトの名無しさん:2006/07/29(土) 15:42:17
>>454
ほんとだ!何のことかと思った!
456デフォルトの名無しさん:2006/07/29(土) 15:48:43
初めて見る型だドゥーブル
せっかくだからお茶にするドゥーブル
457デフォルトの名無しさん:2006/07/29(土) 17:51:22
template<typename T> と template<class T> って、どのように違うのでしょうか。
458デフォルトの名無しさん:2006/07/29(土) 17:57:17
どのようにも違わない。
459デフォルトの名無しさん:2006/07/29(土) 18:12:32
typenameの方を使わないとコンパイルできない時がある
460デフォルトの名無しさん:2006/07/29(土) 18:14:59
>>459
例えばどんな場合ですか?

<>内にtypenameを使う場合に限る。
461デフォルトの名無しさん:2006/07/29(土) 18:19:21
テンプレートパラメータにネストした型をとる時とか?

そもそもそんな事できたっけ
462デフォルトの名無しさん:2006/07/29(土) 18:32:26
>>460
>>459は何かを勘違いしていると思われ。
で、>>457>>458の言うとおり同じ意味。
463デフォルトの名無しさん:2006/07/29(土) 18:43:58
テンプレート使用時のときと勘違いしてた、すまん
464デフォルトの名無しさん:2006/07/29(土) 21:32:22
関数ポインタのポインタを戻り値にする関数はどのように宣言するのがいいのでしょうか
たとえば、関数ポインタを登録する関数
long EntryCallBack(voiid (_stdcall *pCallBackFunc) (char* pSolidRefer));
は正しいのに,、登録した関数ポインタを取得する関数は
voiid (_stdcall *) (char* pSolidRefer)) Function();
エラーになってしまいます。
465デフォルトの名無しさん:2006/07/29(土) 21:34:01
困った時はtypedef
466デフォルトの名無しさん:2006/07/29(土) 21:39:42
voiid が気になるw

void (_stdcall *Function())(char* pSolidRefer);

だけど、素直に typedef した方がいい。
467464:2006/07/29(土) 22:37:06
typedefにしたらうまく行ったよ、サンキュ
468デフォルトの名無しさん:2006/07/30(日) 15:18:55
ABC.h で
template<class T> class ABC { 宣言 };
typedef ABC<long> ABC32;
としていて、

DEF.h で ABC32 のポインタだけを使用しているので、
ABC.h をインクルードせず、前方宣言だけで、
class ABC32;
void Func1(ABC32* abc);
とした。

次に、Func1 の実装をするために DEF.cpp で
#include "DEF.h"
#include "ABC.h"
void Func1(ABC32* abc) { 実装 }

としてコンパイルしたところ、コンパイラ (VC2003) が、
ABC32 を再定義した、というエラーを吐いた。
どうしたら意図どおりのことをできるでしょうか。
469デフォルトの名無しさん:2006/07/30(日) 15:39:20
ABC.hで
//typedef ABC<long> ABC32;
class ABC32 : public ABC<long> {
};
470デフォルトの名無しさん:2006/07/30(日) 15:59:06
>469
これだと、コンストラクタや代入演算子を再定義しないといけないのでは。
471デフォルトの名無しさん:2006/07/30(日) 16:08:38
>>468
class ABC32;
という前方宣言がおかしい。
ABC32はクラスじゃない。

template<typename T> class ABC; //ABCの前方宣言
typedef ABC<long> ABC32; //ABC32の別名定義
472デフォルトの名無しさん:2006/07/30(日) 16:21:16
>>470
ABC32をクラスとしたいなら>>469
ABC<long>の別名としたいならDEF.hで
//class ABC32;
template <class T> class ABC;
typedef ABC<int> ABC32;
void Func1(ABC32* abc);
473468:2006/07/30(日) 16:24:21
>>471,472
ありがとうございます。できました! m(_ _)m
474デフォルトの名無しさん:2006/07/30(日) 17:00:37
初心者の俺が実況用のブラウザ作る!1!!11!
http://ex16.2ch.net/test/read.cgi/news4vip/1154167137/
まとめ
http://vanbl.blog.shinobi.jp/


現在新しい専ブラを開発中ですプログラミングに詳しい方
>>1にアドバイスをお願いします
475デフォルトの名無しさん:2006/07/30(日) 18:36:23
C++ で例外使うと遅くなるってほんと?
例外が発生したときの処理が遅いだけで、
例外が滅多にスローされなければ、遅くならないよね?
476デフォルトの名無しさん:2006/07/30(日) 18:47:21
try 節に入る部分と出る部分に処理が入る筈。
どこまで遅くなるかは実測してみれ。
477デフォルトの名無しさん:2006/07/30(日) 18:51:45
>>475
速度は実測が基本。

>>476
try の出入りで処理を入れない実装もある。
478デフォルトの名無しさん:2006/07/30(日) 18:59:45
>>477
実測するまでもなく遅くなる。
479デフォルトの名無しさん:2006/07/30(日) 19:05:07
>>478
君は人のレスを読んでいるのだろうか・・・
480デフォルトの名無しさん:2006/07/30(日) 19:21:44
>>479
読みましたが何か
481デフォルトの名無しさん:2006/07/30(日) 19:29:05
>>477
なんて処理系?
482デフォルトの名無しさん:2006/07/30(日) 20:17:20
シュレディンガーの例外処理。
483デフォルトの名無しさん:2006/07/30(日) 20:35:05
>>481 gcc とか。
484デフォルトの名無しさん:2006/07/30(日) 22:04:02
Cを学ばないでC++を学んでも大丈夫ですよね?
485デフォルトの名無しさん:2006/07/30(日) 22:05:43
>>484
大丈夫。
486デフォルトの名無しさん:2006/07/30(日) 22:06:51
ありがとうございます!
487デフォルトの名無しさん:2006/07/30(日) 22:40:19
>>483
デマを流さないように。
488デフォルトの名無しさん:2006/07/31(月) 00:42:39
>>487
何を根拠にデマだと言うの?
http://gcc.gnu.org/ml/java/2004-08/msg00028.html
489デフォルトの名無しさん:2006/07/31(月) 00:45:18
あれ、ここ何のスレだっけ?
490デフォルトの名無しさん:2006/07/31(月) 02:52:30
ほう、gccは例外を投げても遅くならないと言うのか。
491デフォルトの名無しさん:2006/07/31(月) 02:54:26
>>490 だれもそんなこと言ってない。
492デフォルトの名無しさん:2006/07/31(月) 03:39:16
>>490
投げなくても遅くなるのかどうか、が問題になっている。
493デフォルトの名無しさん:2006/07/31(月) 03:58:54
そりゃどんな実装でも”少しは”遅くなるだろ。CMP命令が一つ入るとか。
割り込みでも使わない限り、ソフトウェア的にオーバーヘッドゼロというのは
絶対に無理だ。
494デフォルトの名無しさん:2006/07/31(月) 04:26:50
何も命令が入らなければゼロだよw
495デフォルトの名無しさん:2006/07/31(月) 04:28:08
まあそうだけど。
496デフォルトの名無しさん:2006/07/31(月) 04:30:55
そういうわけで、何も命令が入らない実装があるかないかという話になるわけだ。
まあ、ないだろうけども。
497デフォルトの名無しさん:2006/07/31(月) 04:44:14
関数中にthrow文が一つもなければ、最適化によって、
スタックの巻き戻しをカットしてしまう事はあるかもしれん。
関数の入り口にスタッククリーンアップの準備を置くのも、
throw文の有無によってカットできるかもしれんし。
498デフォルトの名無しさん:2006/07/31(月) 05:15:58
throw がなかったら try-catch 書く意味が無いから、
条件によって例外が投げられうる状況を
仮定したので構わないと思う。
ただ、実測してみようとテストしてみるときには
そのあたりを注意する必要はありそうだ。
499デフォルトの名無しさん:2006/07/31(月) 05:36:38
指定したプロセスIDが存在するかどうか確認できるAPIってありますか?
自分で実行中のプロセスと比較しないといけないのかな。
500デフォルトの名無しさん:2006/07/31(月) 05:59:41
EnumProcesses()
501デフォルトの名無しさん:2006/07/31(月) 07:47:47
誰もWindowsとは書いていないわけだが。
502デフォルトの名無しさん:2006/07/31(月) 07:58:04
>>499-501
>>499-501
>>499-501
>>499-501
>>499-501

>501 名前:デフォルトの名無しさん[sage] 投稿日:2006/07/31(月) 07:47:47
>誰もWindowsとは書いていないわけだが。
>501 名前:デフォルトの名無しさん[sage] 投稿日:2006/07/31(月) 07:47:47
>誰もWindowsとは書いていないわけだが。
>501 名前:デフォルトの名無しさん[sage] 投稿日:2006/07/31(月) 07:47:47
>誰もWindowsとは書いていないわけだが。
>501 名前:デフォルトの名無しさん[sage] 投稿日:2006/07/31(月) 07:47:47
>誰もWindowsとは書いていないわけだが。
>501 名前:デフォルトの名無しさん[sage] 投稿日:2006/07/31(月) 07:47:47
>誰もWindowsとは書いていないわけだが。

池沼はプログラミングなどしないほうが良い
503デフォルトの名無しさん:2006/07/31(月) 09:48:00
>>500
ありがとうございます。まさにピンポイントで欲しいAPIでした。
>>501
すいません、Windowsの事です。
>>502
えと、なんというかすいません。501さんは499に書き込みした私ではないです。
504デフォルトの名無しさん:2006/07/31(月) 11:04:23
>>502
もしあんたが>500なら、それこそレスなどしない方がいいぞ。
505デフォルトの名無しさん:2006/07/31(月) 11:24:17
callocってなんの略でしたっけ?ド忘れした(´・ω・`)
506デフォルトの名無しさん:2006/07/31(月) 11:36:35
clear-allocation ?
507デフォルトの名無しさん:2006/07/31(月) 11:40:48
そういえばそんなのもあったなあと思いつつ
ttp://www.bohyoh.com/CandCPP/FAQ/FAQ00096.html
508デフォルトの名無しさん:2006/07/31(月) 12:08:28
>>488
g++ -Sの結果が根拠。
509デフォルトの名無しさん:2006/07/31(月) 12:35:58
>>508
Windows だよね?
510デフォルトの名無しさん:2006/07/31(月) 13:15:21
>>509
Linuxだけど、Windowsかどうかなんて関係あんのか?
511デフォルトの名無しさん:2006/07/31(月) 13:55:37
今Cを独学で勉強しています。

#include <stdio.h>
int main(void) {
  int *p, q;
  q=199;
  p=&q;
  printf("%d\n", *p);
  return 0;
}
上記のプログラムで、
ポインタの説明をしているところを勉強中なのですが、
なぜ、int pと定義せずに、int *pと定義するのかが分かりません。
*が演算子なら、int pで宣言し、プログラム中で*pという
演算をすれば良いのでは?と思うのですが。

また、なぜ、int *p で定義すれば、プログラム中で、
pが変数宣言も無しで使用可能なのでしょうか?
512デフォルトの名無しさん:2006/07/31(月) 13:59:53
ポインタだから
513デフォルトの名無しさん:2006/07/31(月) 14:19:06
int* p;
こう書けばわかりやすいか
でも
int* p, q;
とか書くと勘違いするよな
514デフォルトの名無しさん:2006/07/31(月) 14:36:30
>>513
早速のお返事ありがとうございます。

>int* p;
>こう書けばわかりやすいか

しかし、正直分かるようで、分かりません。
演算子が変数宣言のところに登場するのが、納得できないのです。
加算演算子とポインタ演算子が、
性質が異なっているのを分かった上で
誤解を恐れずに書くと、
int -p や、int /p みたいなことをやっているのはどうしてだろうと考えてしまうのです。

とにかく、今はこういうもんだという風な覚え方をしておきます。
Cの全体を把握した上で、再度考えますね。
515デフォルトの名無しさん:2006/07/31(月) 14:46:29
>>514
ポインタ演算子というか、関節演算子は、四則演算子とは質がまるっきり
違うとだけ書いておくね。
516デフォルトの名無しさん:2006/07/31(月) 14:46:56
×関節
○間接

馬鹿な変換してしもた・・・
517デフォルトの名無しさん:2006/07/31(月) 14:55:14
#include <stdio.h>

typedef int *int_ptr;

int main(void){
int_ptr p;
int q;
q = 199;
p = &q;
printf("%d\n", *p);
return 0;
}
518デフォルトの名無しさん:2006/07/31(月) 15:05:39
>>517
おおっ、よく分かりました。
ありがとうございます。
519デフォルトの名無しさん:2006/07/31(月) 15:18:18
まじかよ
520デフォルトの名無しさん:2006/07/31(月) 15:22:55
typedefってすげぇなぁ
521デフォルトの名無しさん:2006/07/31(月) 15:50:53
飢餓で苦しんでる子供をtypedefで救えるんじゃなかろうか
522デフォルトの名無しさん:2006/07/31(月) 16:02:49
テポドン何発飛んで来ても怖くないな
523デフォルトの名無しさん:2006/07/31(月) 18:39:00
巨大隕石が落ちてきてもtypedefでなんとかなるな
524デフォルトの名無しさん:2006/07/31(月) 19:11:28
typedefで僕にも彼女ができました
525デフォルトの名無しさん:2006/07/31(月) 20:55:54
typedef 教に入信しました。
526デフォルトの名無しさん:2006/07/31(月) 22:24:49
タイプデス
527デフォルトの名無しさん:2006/07/31(月) 22:42:56
唯一神 typedef 様を崇め奉るが良い
528デフォルトの名無しさん:2006/07/31(月) 22:57:13
typedefでガンが治りました
529デフォルトの名無しさん:2006/07/31(月) 22:58:52
3次元ベクトルを表すクラスまたは構造体の名前として何がいいか悩んでいます。
STL に vector があるので、これは使いたくありません。
class XYZ とか class Coord3 とかどうかなと思っていますが、
何かいい名前はありませんか?
530デフォルトの名無しさん:2006/07/31(月) 23:00:18
531デフォルトの名無しさん:2006/07/31(月) 23:07:18
> 530
ありがとう。そっちに移動するよ。
532デフォルトの名無しさん:2006/08/01(火) 00:18:31
>>511
int *p; の * は、演算子じゃない。
p が「int オブジェクトを指すポインタ型」である事を表す記号だ。
533デフォルトの名無しさん:2006/08/01(火) 00:53:22
>>510
http://gcc.gnu.org/ml/java/2004-08/msg00050.html
(リンク先は Java の ML だけど、言語間で共通な例外処理部分についての話)

まぁ Windows が除かれる時点で「 try の出入りで処理を入れない実装」の例として
「 gcc とか」というのはマズイな。訂正しよう。

>>481
gcc のうち、 Windows を含む一部のターゲット環境を除いたもの。
534デフォルトの名無しさん:2006/08/01(火) 01:45:02
大抵の環境で遅くなる以上、「tryを書くと遅くなる」と考えてほぼ間違いないというこで。
535デフォルトの名無しさん:2006/08/01(火) 02:00:00
>>534
速度は実測が基本。
536デフォルトの名無しさん:2006/08/01(火) 02:00:24
「大抵の環境」の定義は個人の考え、経験等に依存しますが何か?
537デフォルトの名無しさん:2006/08/01(火) 02:04:34
>>535
バカの一つ覚えかよ

>>536
はいはい。具体的な環境挙げられるようになってから言ってね。
538デフォルトの名無しさん:2006/08/01(火) 02:04:52
>>536
客観的に定義できると思うけど、思わないのなら別にいい。
539デフォルトの名無しさん:2006/08/01(火) 02:07:04
すいません、c++って言うよりldの問題なんですけど、
環境はAIX 5.2
gccは
Using built-in specs.
Target: powerpc-ibm-aix5.2.0.0
Configured with: ../configure --with-as=/usr/bin/as
--with-ld=/usr/bin/ld --disable-nls --enable-languages=c,c++
--prefix=/opt/freeware --enable-threads
--enable-version-specific-runtime-libs --host=powerpc-ibm-aix5.2.0.0
Thread model: aix
gcc version 4.0.0
でbochsをコンパイルしています。
aix標準の/usr/ccs/binのldでコンパイルすると
g++ -o bochs -g -O2 -D_LARGE_FILES -DBX_SHARE_PATH=\"/usr/local/share/bochs\"
logio.o main.o config.o load32bitOShack.o pc_system.o osdep.o plugin.o crc.o
iodev/libiodev.a cpu/libcpu.a memory/libmemory.a gui/libgui.a disasm/libdisasm.a
fpu/libfpu.a -lSM -lICE -lX11 -lXpm -lm
ld: 0711-317 ERROR: Undefined symbol: vtable for __cxxabiv1::__si_class_type_info
ld: 0711-317 ERROR: Undefined symbol: vtable for __cxxabiv1::__vmi_class_type_info
ld: 0711-317 ERROR: Undefined symbol: vtable for __cxxabiv1::__class_type_info
ld: 0711-345 Use the -bloadmap or -bnoquiet option to obtain more information.
collect2: ld returned 8 exit status
gmake: *** [bochs] Error 1
と出てエラーになります。
540デフォルトの名無しさん:2006/08/01(火) 02:10:53
そこでgnuのldを使おうとおもって
コンパイルしたのですが、今度も
/bin/sh ./libtool --mode=link g++ -o bochs -g -O2 -D_LARGE_FILES
-DBX_SHARE_PATH='"/usr/local/share/bochs"' -export-dynamic logio.o
main.o config.o load32bitOShack.o pc_system.o osdep.o plugin.o
crc.o iodev/libiodev.a cpu/libcpu.a memory/libmemory.a gui/libgui.a disasm/libdisasm.a
fpu/libfpu.a -lSM -lICE -lX11 -lXpm -lm
g++ -o bochs -g -O2 -D_LARGE_FILES -DBX_SHARE_PATH=\"/usr/local/share/bochs\" logio.o
main.o config.o load32bitOShack.o pc_system.o osdep.o plugin.o crc.o
-Wl,--export-dynamic iodev/libiodev.a cpu/libcpu.a memory/libmemory.a
gui/libgui.a disasm/libdisasm.a fpu/libfpu.a -lSM -lICE -lX11 -lXpm -lm
/usr/bin/ld: config.o: reloc .data:0 not in csect
config.o: could not read symbols: Bad value
collect2: ld returned 1 exit status
make: The error code from the last command is 1.
と出ます。
これはどんなエラーで、ソースちょっとソースをいじればコンパイルできるようなものなんでしょうか?
541デフォルトの名無しさん:2006/08/01(火) 10:44:41
>>532
JIS X 3012:2003 8. 宣言子 第2パラグラフ
> 宣言子は,*(へのポインタ)及び()(を返す関数)などの演算子を含めることで
> 指定子の型を変更することができる。
542デフォルトの名無しさん:2006/08/01(火) 12:10:59
つまり、宣言中に現れる演算子は指定子の型を変更するために使われる。
と言うことで宜しいか。
543デフォルトの名無しさん:2006/08/01(火) 13:04:39
ポインタの加算で質問です。
#include <stdio.h>;
int main(void)
{
char *cp, ch;
int *ip, i;
float *fp, f;
double *dp, d;

cp=&ch;
ip=&i;
fp=&f;
dp=&d;

printf("%p %p %p %p\n", cp, ip, fp, dp);

cp++;
ip++;
fp++;
dp++;

printf("%p %p %p %p\n", cp, ip, fp, dp);

return 0;
}
を実行すると、
0013FF57 0013FF3C 0013FF24 0013FF08
0013FF58 0013FF40 0013FF28 0013FF10
続行するには何かキーを押してください . . .
となるんですが、doubleの値がおかしいのは何故でしょうか?
いくらプログラムを見直してもミスが見つけられません。
544デフォルトの名無しさん:2006/08/01(火) 13:06:51
どうしておかしいと思ったのか教えてくれ
545デフォルトの名無しさん:2006/08/01(火) 13:10:27
何をもっておかしい と結論に至ったのかを説明汁

sizeof(type) と (int)((char *)((type*)1) - (char *)((type *)0)) が食い違うのか?
546デフォルトの名無しさん:2006/08/01(火) 13:35:54
>>545
そう言うことです。
本には加算すると型のバイト数が加算されるとあったので、
0013FF08からdp++すると、0013FF12にならなければいけないんじゃないかと思いました。
547デフォルトの名無しさん:2006/08/01(火) 13:39:22
すいません
543,546の質問は忘れて下さい。
16進数だということを忘れてましたorz
548デフォルトの名無しさん:2006/08/01(火) 13:39:50
>>546
sizeof(double) を見てから考えなさい。
549デフォルトの名無しさん:2006/08/01(火) 14:32:26
>>547
なんか、癒されるなぁ…。 こういうミスは、ほのぼのしてていいw
550デフォルトの名無しさん:2006/08/01(火) 18:09:20
ファイルの入出力って何がいいのでしょうか、大容量ファイル読み込む時
551デフォルトの名無しさん:2006/08/01(火) 18:29:03 BE:139752498-2BP(200)
メモリマップトファイル
552デフォルトの名無しさん:2006/08/01(火) 19:02:25
RubyのイテレータみたいなことをC++のイテレータ使って
実現したいんだけどどうすればいいでしょう。

たとえば、aryを適当な配列だとして、その順列すべてを表示するのを
for(it = ary.permutaion_start(); it != ary.permutaion_end(); it++) {
cout << *it << endl;
}
のように書きたいんです。
it++ の実装をどう言うふうにしたらいいかがさっぱり。

参考になるサイトがあったら教えてください。
553デフォルトの名無しさん:2006/08/01(火) 19:40:32
>>552
で、その「配列」とやらはどういう実装になってんだね?
それがわからんと何とも言えん
554デフォルトの名無しさん:2006/08/01(火) 20:26:49
>>552
それSTLコンテナと何が違うの?
555デフォルトの名無しさん:2006/08/01(火) 21:05:04
シェル : tcsh
コンパイラ : gcc-4.0.1

上の環境で、Cでプログラム作っているのですが、
シェルの外部コマンドを exec 等で実行する様に
組み込みコマンドもプログラム中で実行したいのですが、
調べてみても求める物を見つけられませんでした。
よければどなたか教えていただけないでしょうか?
556デフォルトの名無しさん:2006/08/01(火) 21:37:41
>>555
#include <stdlib.h>
int system(const char *string);
で何とかならないかな?
557555:2006/08/01(火) 21:43:15
>>556
system も試してみましたが、
結局 exec("sh", 〜〜〜〜)と同じ結果で
無理でした…
558デフォルトの名無しさん:2006/08/01(火) 22:15:02
bashならbash -c internal_command
559デフォルトの名無しさん:2006/08/01(火) 22:38:56
>>553
> で、その「配列」とやらはどういう実装になってんだね?
具体的に直面している問題では、aryに対応するのは自作クラスだし
permtationに関してももっと難しい処理になります。
できるだけ汎用性のある方法が知りたいし、シンプルなものがいいと思って、
あのような例を挙げました。

>>554
STLで与えられる標準的なコンテナクラスは、it から it++ が求めやすいような
ものばかりだと思うのですが、私がやりたいのは
ttp://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%86%E3%83%AC%E3%83%BC%E3%82%BF
のPythonのところにある、「ジェネレータ関数によって内部イテレータを作成」というのと
似たようなことです。
560デフォルトの名無しさん:2006/08/01(火) 22:53:58
template<typename Containee>
class myArray{
public:
typedef Containee *iterator;

// ...
};
561デフォルトの名無しさん:2006/08/01(火) 22:56:31
>>559
C++でジェネレータを書く簡単な方法はないと思う。
問題に特化した書き方を工夫するか(たとえば順列はstd::next_permutationで列挙できる)、
「次に何をするか」を示す関数オブジェクトをイテレータ内部に保存するとかの方法が一応ある。
562デフォルトの名無しさん:2006/08/01(火) 22:58:30
>>559
>のPythonのところにある、「ジェネレータ関数によって内部イテレータを作成」というのと
>似たようなことです。

リンク先を読んでみたけど552の例は全然似てなくないかい?
563デフォルトの名無しさん:2006/08/01(火) 23:02:44
>>562
例えば
for(...) for(..) std::cout << p << "\n";
というような順列を列挙するアルゴリズムがあったとして、yield文があればこれをそのまま
for(...) for(...) yield p;
と書き換えることで順列を列挙するイテレータが出来上がるって事だろ。
564デフォルトの名無しさん:2006/08/01(火) 23:36:37
Cを学び始めたばかりのものなのですが、
シェーカーソート法というのを本で読んでやろうとして
以下のように書いたところコンパイルしたけど上手く動きません。
ダメな所をどなたか教えてください。
ちなみに要素数6の配列を受け取る関数です。

void sort(int x[])
{
  int i,tmp;
  int lp,rp;
  lp=0;rp=5;
  do{
    for(i=lp;i<rp;i++)
    if(x[i]>x[i+1]){tmp=x[i];x[i]=x[i+1];x[i+1]=tmp;}
    rp=i;
   
    for(i=rp;i>lp;i--)
     if(x[j-1]>x[j]){tmp=x[j-1];x[j-1]=x[j];x[j]=tmp;}
     lp=i;
         }while(lp<rp);
 }
565デフォルトの名無しさん:2006/08/01(火) 23:39:50
書き間違えました><
>>564を訂正です。


void sort(int x[])
{
  int i,tmp;
  int lp,rp;
  lp=0;rp=5;
  do{
    for(i=lp;i<rp;i++)
    if(x[i]>x[i+1]){tmp=x[i];x[i]=x[i+1];x[i+1]=tmp;}
    rp=i;
   
    for(i=rp;i>lp;i--)
     if(x[i-1]>x[i]){tmp=x[i-1];x[i-1]=x[i];x[i]=tmp;}
     lp=i;
         }while(lp<rp);
 }
566552:2006/08/01(火) 23:47:56
>>561
なるほど。一般的な方法となると難しいようですね。
std::next_permutaionは読んでみます。

>>562
説明下手で、本意が伝わらなくてすみません。
>>563が説明されているようなのが、まさに私が欲しているものです。

皆さん、レスありがとうございました。
567デフォルトの名無しさん:2006/08/01(火) 23:57:19
>>564
デバッガ使ったりprintfを埋め込んでコードを追いかけろ。
デバッグはプログラマにとってコードを書くのと同じかそれ以上に重要な仕事だ。
あと「上手く動きません」じゃなくて、具体的にどうなったのか書け。
現象は原因を探る重要な手掛かりだ。
568デフォルトの名無しさん:2006/08/02(水) 00:16:02
>>567
mainも含めて書くと

void sort(int x[])
{
  int i,tmp;
  int lp,rp;
  lp=0;rp=5;
  do{
    for(i=lp;i<rp;i++)if(x[i]>x[i+1]){tmp=x[i];x[i]=x[i+1];x[i+1]=tmp;}
    rp=i;
    for(i=rp;i>lp;i--)if(x[i-1]>x[i]){tmp=x[i-1];x[i-1]=x[i];x[i]=tmp;}
    lp=i;
                    }while(lp<rp);
 }

int main()
{
  int i;
  int a[6]={12,53,22,64,11,9};
  printf("並び替えを行います。");
  sort(a);
  printf("並び替えました\n");
  for(i=0;i<6;i++)
  printf("%d番目に小さい数は%d\n",i+1,a[i]);
  return 0;
}


こうなのですが、実行すると「並び替えを行います」で止まります。エラーで終了とかでなく、sort関数が終わらないのかな?って感じでその後は表示されません。
あとホントに学び初めなのでデバッグとかはよく分からないです;
569デフォルトの名無しさん:2006/08/02(水) 00:22:16
>>568
rp=i と lp=i に意味が無い。
570デフォルトの名無しさん:2006/08/02(水) 00:32:38
>>569
直りましたっ!
i++とi--の働くタイミングを勘違いしていました><;
ホントにありがとうございます!!
571デフォルトの名無しさん:2006/08/02(水) 00:34:02
>>568
要所要所でprintfで変数の値を表示させるなりして
意図通り動いているか・どこでおかしくなっているのか確認する。
572デフォルトの名無しさん:2006/08/02(水) 10:06:03
int i[20];


こうすると
i[0]〜i[19]
まで確保されるんですよね?

i[20]で動かしても正常・・・なんでやろ
573デフォルトの名無しさん:2006/08/02(水) 10:10:19
>>572
C言語ではそういうのを「未定義動作」としていて、
何が起こっても文句は言えないプログラムとしている。

チェックしてエラーを発生させたりしてくれない。
自分の身は自分で守れということ。
574デフォルトの名無しさん:2006/08/02(水) 10:35:02
一般的なCPUに配列の添え字チェックの命令なんてないからねぇ。
ゆえにC言語でもそんなことしない。
575デフォルトの名無しさん:2006/08/02(水) 10:54:18
>>574
x86ならbound命令がある。使われた試しはないようだが。
>>574
一般的なCPUにローテート命令なんてのがあるわけですが、
C言語にないのはなぜですか?
一般的なCPUに参考演算子相当の命令なんてないのに
C言語にあるのはなぜですか?
577デフォルトの名無しさん:2006/08/02(水) 10:58:58
>>576
言語仕様を定めた人間達がそれを含めないと決めたからです。
そんなことも知らないのですか?
578デフォルトの名無しさん:2006/08/02(水) 11:00:37
ローテートどころかキャリーフラグすらないぞ
579デフォルトの名無しさん:2006/08/02(水) 11:06:16
ヤバいw初心者系のスレかと思って覗いたら何の話してるんだかサッパリ分からない。
とりあえずこのスレの人を何故か尊敬したw
580デフォルトの名無しさん:2006/08/02(水) 11:08:41
つまり >>574 はCPUの仕様制限がCの仕様を決めたとおっしゃりたいのですね
581デフォルトの名無しさん:2006/08/02(水) 11:11:04
普段話す相手がいないから
ここ2ちゃんで自分の知識を語りたいんだね
でも知識を人と比較する機会が無いから内容は
頓珍漢なんだね。  

君の知識はすばらしいからあまり公開せず大事に自分の中に
しまっておくのがいいよ。
582デフォルトの名無しさん:2006/08/02(水) 11:19:47
機械語でコンピュータと会話するんだ!
583デフォルトの名無しさん:2006/08/02(水) 11:36:50
>>581
そんなムキにならなくても。君だっていつかは物知りになれるさ。たぶん。あるいは。もしかしたら。
584デフォルトの名無しさん:2006/08/02(水) 12:07:08
やばい、参考演算子って何だ?わからない。
ググッてみよう。
トップで表示されるのは…

JavaA2Z【三項演算子とは】

違うんだよ、参考演算子を知りたいんだよ!
んっ?待てよ…。


三項演算子かい!!
585デフォルトの名無しさん:2006/08/02(水) 12:16:07
興奮状態のお子ちゃまを下手にいじると
休みが終わるまでの間ずっと馬鹿丸出しの屁理屈で粘着されるから
そういうのはやめたほうがいいよ。
586デフォルトの名無しさん:2006/08/02(水) 15:17:30
C++にオペレーターオーバーライドってあるじゃないですか
あれでポインタ演算子*の置き換えって出来るんでしょうか
587デフォルトの名無しさん:2006/08/02(水) 15:37:48
できる
588デフォルトの名無しさん:2006/08/02(水) 15:58:00
むしろ多重定義できない演算子のほうが例外的な存在。
589デフォルトの名無しさん:2006/08/02(水) 20:43:07
前田に放課後体育館裏に来いと言われた。

「佳代とうとう運命の時が来たね☆」

「なにが運命の時よ。」

友人のめぐみの前では素っ気ないそぶりをしてたけど私の胸の鼓動は高まっていた。

前田は小さいころからの幼なじみ。

ぼーっとしてて私がいつも面倒を見ていた。

でもやっぱし私は前田が好きなんだ・・・。

放課後がやってきた。

「なによ?こんなところに呼んで?何の用?」





「おっ・・お前をバブルソート!」

「きゃっ!」
590デフォルトの名無しさん:2006/08/02(水) 21:06:50
ごめん

オチがわからん
591デフォルトの名無しさん:2006/08/02(水) 21:14:10
>>590
一般的なレスにオチをつけろ命令なんてないからねぇ。
ゆえに>>589のレスでもそんなことしない。
592デフォルトの名無しさん:2006/08/02(水) 21:27:12
このネタは"as is"で提供されます。
593デフォルトの名無しさん:2006/08/02(水) 22:05:19
むしろオチのあるレスのほうが例外的な存在。
594デフォルトの名無しさん:2006/08/03(木) 02:45:51
>586
そもそもオペレーターオーバーライドなどというモノはC++には存在しない。
595デフォルトの名無しさん:2006/08/03(木) 08:58:19
バブルマンの間違いじゃ…
596デフォルトの名無しさん:2006/08/03(木) 22:18:30
>>589
ワロタ
597デフォルトの名無しさん:2006/08/04(金) 02:53:31
598デフォルトの名無しさん:2006/08/04(金) 10:29:13
暗黙の型変換、例えば
int a=3;
double b=0.1415;
double sum= a+ b;
ってのがあったとき、
doubole sum= (double)a+ b;
みたいに型キャストを明示した方がよいのでしょうか?
こんな簡単なプログラムではどっちでもいいような気がしますが、
明示した方が煩雑なプログラムを組むのにはメリットがあるというのであれば、
今のうちから癖をつけときたいのです。
まだ、煩雑なプログラムを書けないので
暗黙で変換したときのメリットデメリット、
明示的に変換したときのメリットデメリットが分からないので、
変な質問をさせて頂きました。
よろしくお願いします。
599デフォルトの名無しさん:2006/08/04(金) 11:14:26
>>598
その例だとメリットもデメリットもない。
intはdoubleに変換せざるを得ないしその変換自体は安全に行なわれるから。
仮にsumがfloatだったらfloat sum = (float)(a + b);のように明示したほうがいい。
#敢えて書かずにコンパイラに警告を出させると言う選択もある。
600598:2006/08/04(金) 14:33:22
回答ありがとうございます。
確かに、この例ではメリット、デメリットもないですね。
ただ、今後大きなプログラムを書く場合、
どうなのかなと思ったのですが。

メリットデメリットを見極めるためにも、面倒ではありますが、
当分明示して様子みます。
601デフォルトの名無しさん:2006/08/04(金) 15:17:36
省略に慣れてしまうとそのうち

int a = 2;
double b = 3.5;
double c = 1 / a + b;

みたいなことを平気でするようになるから
明示する癖つけといた方がいいよ。

602デフォルトの名無しさん:2006/08/04(金) 16:43:11
また、微妙な式を書くなw
603デフォルトの名無しさん:2006/08/04(金) 17:14:50
これは明らかにアウトだろ
604デフォルトの名無しさん:2006/08/04(金) 17:57:33
void hoge(int *values, int n) {
 int sum = 0;
 int i;

 for(i = 0; i < n; ++i) {
  sum += values[i];
 }

 printf("合計: %d, 平均: %f", sum, sum / n);
}

とか。
605デフォルトの名無しさん:2006/08/04(金) 18:20:10
>>601
おっちょこちょいな俺でも、さすがにそれは無い。
606デフォルトの名無しさん:2006/08/04(金) 19:04:56
int kahenko(int kazu, ...) {
set_kahenko(kazu, ...);
}

可変個仮引数の...を可変個実引数に使いたいのですが、
当然エラーになります。
なので、今はいろんな関数で使いたい、
可変個引数の加工の処理をマクロで行っていますが、
通常の関数でやる方法がありましたら教えてください。
607デフォルトの名無しさん:2006/08/04(金) 19:12:40
>606
stdarg.hでぐぐれ
608606:2006/08/04(金) 19:13:35
>>607
ありがとうございます。ぐぐってみます。
609606:2006/08/04(金) 19:40:49
ありがとうございました。できました。
va_start化したmarkerを渡せばいいわけですね。
610デフォルトの名無しさん:2006/08/04(金) 20:40:49
ファイル位置指示子について質問です。あるwhileループの中で
fseek(before, 2L, SEEK_CUR);
fgetpos(before, pos);

while( (c=fgetc(before)) != '<' ) count++;
fsetpos(before, pos);

fread(score, 1, count, before);
printf("%s\n", score);

としたところファイル位置指示子が戻ってこず、'<'の後の内容が出力されます。
何がいけないのでしょうか?
611デフォルトの名無しさん:2006/08/04(金) 21:14:15

exeファイルに画像(データ)をいけたいのですがどうすればいいでしょうか??
612デフォルトの名無しさん:2006/08/04(金) 21:17:30
>>611
WindowsのEXEならリソースとしてくっつけろ。
613デフォルトの名無しさん:2006/08/04(金) 21:18:39
>>610
pos の定義は?
614610:2006/08/04(金) 21:34:14
すいません。613さんの指摘で解決しました。
定義でポインタとして宣言していたためにうまく働かなかったようです。



615あばよ:2006/08/04(金) 22:34:57
どう書けばいいのかわからないプログラムあるんだけど
修正求めていいですか?
616デフォルトの名無しさん:2006/08/04(金) 22:37:04
NET、C,C++、C#とかあるのですがどれが一番いいでしょうか

C#>C++>C なんですかね?
NETが分からん、、、新しい言語ってことでしょうか?
617デフォルトの名無しさん:2006/08/04(金) 22:40:36
VCでExcelのファイルを読み書きするプログラムを作りたいけど、
ActiveXというのを使えばいいのですか?

何かお薦めの書籍やサイトあります?
618デフォルトの名無しさん:2006/08/04(金) 22:44:06
コマンドプロンプトで、
・・・>実行ファイル名 コマンドライン引数(処理するビットマップファイル)
というふうに実行するプログラムを作ったのですが、あるパソコンでは、
処理するビットマップを実行ファイルのアイコンにドラッグ&ドロップして実行することができます。
しかし、同じことをしても無反応のパソコンもあります。
一体何が違うのでしょうか?
ドラッグ&ドロップのほうが快適なので、できるようにしたいです。
619618:2006/08/04(金) 22:45:16
できるパソコンはXPのプロフィッショナルで
できないパソコンはXPのホームエディションです。
この違いでしょうか??
620デフォルトの名無しさん:2006/08/04(金) 22:49:47
んなわけねーだろ。
621デフォルトの名無しさん:2006/08/04(金) 23:24:25
>>618
ショートカットかそうでないか、渡すファイルの個数 などを見てみよう。
622デフォルトの名無しさん:2006/08/04(金) 23:35:38
>>616
お前の言うNETとは.NET Frameworkのことだろうが、
.NET FrameworkはMSが提唱したプログラムを動かす基盤的な環境のこと。
ランタイムやクラスライブラリの巨大な集合体と言ったところか。

C#で書いたプログラムや、.NET Frameworkの機能を使って書いたC++のプログラムは
ユーザが.NET Frameworkをインストールしてあるコンピュータでしか実行できない。
(逆に.NET FrameworkさえあればOSがWindowsでなくとも実行できると言うのが建前)

C#>C++>Cは正しくない。
それぞれ得意・不得意なことがあるから、どれが良いかは一概に決められない。
ただし俺に言わせれば、その3つの中では良くも悪くもC++が一番万能だ。
623デフォルトの名無しさん:2006/08/04(金) 23:38:04
>>616 ぐぐれ
624デフォルトの名無しさん:2006/08/04(金) 23:39:53
言語比較の質問にまじめに答えてるやつって何なの?
625デフォルトの名無しさん:2006/08/05(土) 01:29:32
C言語の標準関数って誰が作ったんですか?
scanfとかstrtokとか、クソ仕様なのが多杉なんですけど。
626デフォルトの名無しさん:2006/08/05(土) 01:34:22
reallocとかもな
でもどんな言語にも糞仕様は存在するもんさ
627デフォルトの名無しさん:2006/08/05(土) 01:39:51
scanfとかstrtokはそーでもないと思うが・・・。
とりあえずcreat,gets,sprintfとかあげとく。
628デフォルトの名無しさん:2006/08/05(土) 01:53:59
セキュリティホールになるやら
割り込みやマルチスレッドと相性悪いやらってことだろ
>scanf, strtok
629デフォルトの名無しさん:2006/08/05(土) 01:56:36
時代に合ってない、つーか今どきんなもん使ってる奴が馬鹿ってことだろ
630デフォルトの名無しさん:2006/08/05(土) 03:38:38
( ・д・) ?
631デフォルトの名無しさん:2006/08/05(土) 06:55:54
Cプログラマーが存在しないスレはここですか
632デフォルトの名無しさん:2006/08/05(土) 08:38:25
>>625
お前より頭いいやつが作った。これはガチ
633デフォルトの名無しさん:2006/08/05(土) 09:06:19
なんか、指を怪我したのは包丁の仕様がクソだからで、
いまどき包丁を使ってる奴は馬鹿って事みたいな・・・
634デフォルトの名無しさん:2006/08/05(土) 10:21:31
まぁ確かに、料理用の鋏も随分よくなったから鋏で済ませることも多いがな。
635デフォルトの名無しさん:2006/08/05(土) 12:06:37
ostream.h ddraw.hがインクルードできません、というエラーが出るんですが
これを直すにはどうすればいいのでしょうか?

すいませんがよろしくお願いします。
636デフォルトの名無しさん:2006/08/05(土) 12:22:40
>>635
<ostream.h>は現在のC++には存在しない。今は<ostream>だ。
<ddraw.h>はDirectX SDKをインストールしろ。
637618:2006/08/05(土) 12:54:10
>>621
ありがとうございました。
638デフォルトの名無しさん:2006/08/05(土) 13:36:47
strtokってマルチスレッドと相性悪いのか?
639デフォルトの名無しさん:2006/08/05(土) 13:43:23
>strtok() 関数は文字列の解析に静的バッファを用いるので、スレッドセーフでない。
>これが問題になる場合は strtok_r() を用いること。
640デフォルトの名無しさん:2006/08/05(土) 13:48:00
ああそうか、二つめ以降のトークンはバッファ指定せずに取り出してるな。
641デフォルトの名無しさん:2006/08/05(土) 14:18:36
strtokは入力文字列を破壊するわ、内部で外部変数使ってるわで、
使い方間違えると危ない。
ま、それなりに便利だと思うけどね。
642デフォルトの名無しさん:2006/08/05(土) 15:15:43
>>624
現実世界でも居るだろ、「この壷は〜」とか「xxx様のいう事は正しい」とか「絵を買いませんか?」とか
643デフォルトの名無しさん:2006/08/05(土) 16:50:59
本人の脳内でしか繋がってない、摩訶不思議な例を持ち出す奴とかな。
644デフォルトの名無しさん:2006/08/05(土) 17:21:16
strtokはシングルスレッドだったら普通に使えるし、マルチスレッドがない時代もあったし、
代用関数だって簡単に作れるけど、
sprintfは危険性高いし、sprintfからsnprintfを作れないし、自分で作ると複雑だし、
sprintfの仕様って欠陥じゃね?
645デフォルトの名無しさん:2006/08/05(土) 17:24:02
%s 使わなきゃ最大サイズは決まるけど、まあ欠陥関数っちゃー欠陥関数だ。
だから、大抵の環境ではサイズ指定できるものとか、
サイズを取得するだけの関数とか、そういうのが用意されている。
646デフォルトの名無しさん:2006/08/05(土) 17:32:56
%.*s
647デフォルトの名無しさん:2006/08/05(土) 20:40:47
そーいやこんなのが落ちてた

824 名前: 仕様書無しさん [sage] 投稿日: 2006/08/04(金) 22:35:26
au W42CA とW42Hに恥ずかしいバグ
ttp://japanese.engadget.com/2006/08/04/au-w42ca-w42h/
648デフォルトの名無しさん:2006/08/05(土) 20:56:10
アホすwww
649デフォルトの名無しさん:2006/08/05(土) 22:01:25
650デフォルトの名無しさん:2006/08/05(土) 22:46:40
うぁはは、やってくれるよ
651デフォルトの名無しさん:2006/08/06(日) 01:31:25
652デフォルトの名無しさん:2006/08/06(日) 04:02:03
C言語の教科書って古い奴でも大丈夫?
90年代の。
今Java少し学んでて次にC→C++と学びたいんだ。
古い物でも仕様の変更とかはありませんか?
653デフォルトの名無しさん:2006/08/06(日) 04:03:52
>>652
良書を読め。
書籍スレを見ること
654デフォルトの名無しさん:2006/08/06(日) 04:12:35
>>653
今書籍スレ覗いてるところ。
ブックオフで250円とかで投売りだったから
使えそうなら買おうと思ってたんだよね。
現時点では基礎くらいわかるようになればいいので。

使うかもわからないし仕事はじめて必要になったら
楽に身に付けれるように基礎を押さえるだけでいいかなって。
655デフォルトの名無しさん:2006/08/06(日) 05:35:51
質問です。
あんまり言語関係ないですけれど。
例えばWindowsのアプリケーションがMacで動かないのは
極論すればAPIが違うからと理解して良いですか?
そして、JAVAがプラットフォームに依存しないのは、
全てのOSで共通したAPIを提供しているからですか?
656デフォルトの名無しさん:2006/08/06(日) 06:40:54
CPUが違う
JavaはVMで動作している
657デフォルトの名無しさん:2006/08/06(日) 06:49:55
>>655
言語関係ないなら、こっちかな。
すれ立てるまでもない質問はここで 第77刷
http://pc8.2ch.net/test/read.cgi/tech/1152856899/

>>656
つIntel Mac
658デフォルトの名無しさん:2006/08/06(日) 19:45:19
Sample* pSample = new Sample();

Sample* pSample = new Sample;
の違いって何?
659デフォルトの名無しさん:2006/08/06(日) 19:53:09
>>658
Sample が POD 型であるとき、前者は一通り値が初期化される。
後者は初期化されない。 Sample が POD でなければ同じ。
660659:2006/08/06(日) 20:02:41
> Sample が POD でなければ同じ。

ごめん。これ嘘。

Sample が POD 型じゃなくても、明示的に宣言したコンストラクタが
無い場合は前者は一通り値が初期化される。後者は暗黙に定義される
コンストラクタが実行される。後者の場合、メンバに POD と非 POD が
混ざってると POD は初期化されない。

ややこしいんで、いちおう規格の関連箇所は 5.3.4.15 と 8.5.5 ね。
661デフォルトの名無しさん:2006/08/06(日) 20:05:33
規格厨は説明が下手だなぁ
662デフォルトの名無しさん:2006/08/06(日) 20:13:20
説明せずに規格の原文そのまま貼れよ。痛すぎる。
663デフォルトの名無しさん:2006/08/06(日) 20:29:16
規格を解釈する能力がない香具師が適当な説明を書くなよ
664659:2006/08/06(日) 20:41:19
>>661-663
ごめんよ。最初は >>659 ぐらいで終わるかと思ったんだ。
でも、 >>660 の内容まで続けて書いたら、自分でもうまく書けた気がしなかったんで
関連箇所を上げたんだ。怪しいと思ったらそっちを見てくれ。原文コピペは意味無いよね?
665デフォルトの名無しさん:2006/08/06(日) 21:42:32
まとめればこういうことだろ。

Sampleにコンストラクタがあれば、どちらも省略時コンストラクタ(引数無しで呼べるコンストラクタ)を呼ぶ。(無ければエラー)
Sampleが組み込み型の場合、前者はゼロ初期化され、後者は不定(初期化されない)。
Sampleにコンストラクタが無い場合または配列型の場合、上記の規則を基底クラスとメンバまたは各要素に対して再帰的に適用する。
666デフォルトの名無しさん:2006/08/06(日) 22:13:59
惜しい。
667デフォルトの名無しさん:2006/08/06(日) 23:26:12
C++にJavaのObjectにあたるものってありますか?
668デフォルトの名無しさん:2006/08/06(日) 23:28:28
すいません
質問させてください

strcpyを使おうとしたら、VS2005から「古いバージョン」だとワーニングが出ました
strcpyを使うことに問題はないと思うのですが
なぜ古いと警告がでるのでしょうか?

下記の画像をご参照ください
http://f42.aaa.livedoor.jp/~imawaka/imgboardphp/src/1154874364731.jpg
669デフォルトの名無しさん:2006/08/06(日) 23:33:21
>>668
全部メッセージに出てる。嫁。

あと、次からは画像じゃなくてテキストのコピペを使え。
670デフォルトの名無しさん:2006/08/06(日) 23:35:09
>>667
ない。
C++に標準で用意されているクラスはstring関係と、stream関係と、STL関係だけ。
671デフォルトの名無しさん:2006/08/06(日) 23:37:18
>>668
日本語訳がタコだから。
672デフォルトの名無しさん:2006/08/06(日) 23:38:47
>>670
exception とか type_info とか locale とか全部無視か?
673668:2006/08/06(日) 23:39:20
>>669
すいませんでした

strcpy_sを使えってことですかね?
strcpyって一般的に今でも使われていると思ったんですが。
・・・。
674デフォルトの名無しさん:2006/08/06(日) 23:40:09
>>673
全部メッセージに出てる。嫁。
675デフォルトの名無しさん:2006/08/06(日) 23:40:53
>>673
全部メッセージに出てる。嫁。
676デフォルトの名無しさん:2006/08/06(日) 23:41:21
>>673
使われてる。むしろ可搬性の低い_sなぞ窓から捨てろといいたいところだが
実際注意しないと安全じゃないのも確かなんだよなぁ。まあプログラマの技量しだいか。
677デフォルトの名無しさん:2006/08/06(日) 23:41:51
Cの文字列系の関数はアレなのでmicrosoftが独自拡張してます
678668:2006/08/06(日) 23:43:55
独自拡張も結構ですけど、
strcpyを普通に使いたいなと思っただけです。
679668:2006/08/06(日) 23:46:07
ここに詳しく載っていました
http://wind-master.dip.jp/soft-info/item/61

いろいろ調べてみます
ありがとうございました
680668:2006/08/07(月) 00:11:16
すいません
もう一点質問させてください

コンストラクタがないと言われるのですが
コンストラクタは定義されているんです。
なぜ無いと言われるのでしょうか?

error C2512: 'std::basic_ostream<_Elem,_Traits>' : クラス、構造体、共用体に既定のコンストラクタがありません。
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]




class debuglog : public ostream
{
public:
debuglog()
{
#ifdef DEBUG_MONO
mono.clear();
#endif
#ifdef DEBUG_FILE
if(!open_debug_file())
throw "error opening debug log";
#endif
}
681デフォルトの名無しさん:2006/08/07(月) 00:16:48
std::basic_ostreamにデフォルトコンストラクタが無いから
682デフォルトの名無しさん:2006/08/07(月) 00:20:36
>>680
何度も言うが、エラーメッセージをよく読め。
エラーの対象となっているクラスは std::basic_ostream<_Elem,_Traits> だ。
そして、そこで言う「既定のコンストラクタ」とはデフォルトコンストラクタの糞訳だ。
つまり >>681

あとは継承した場合のコンストラクタの呼ばれ方を調べろ。
683デフォルトの名無しさん:2006/08/07(月) 01:04:51
それにしても、そのdebuglogは一体どんな使い方をするのだろうか気になる……。
684668:2006/08/07(月) 01:06:13
debuglogの対処法がわからいのでプロジェクトから削除しました
685デフォルトの名無しさん:2006/08/07(月) 19:22:55
fp=fopen("test.txt","rt");
で読み込むと文字化けします。
どうやらtest.txtがUTF-8な様子。
これをちゃんとUTF-8として読み込むにはどうしたら良いでしょうか?
686デフォルトの名無しさん:2006/08/07(月) 19:26:51
charに読み込まないでwchar_tに読み込めばOK。
fopen()/fclose()には関係なし。
687デフォルトの名無しさん:2006/08/07(月) 19:31:11
wchar_tだとunicode LEにならんかな?
688デフォルトの名無しさん:2006/08/07(月) 19:32:23
>>687
windows前提で答えてしまった。環境は書いてないね。
689デフォルトの名無しさん:2006/08/07(月) 19:34:33
ていうか、普通にfreadでUTF-8として読み込めるだろ。
690デフォルトの名無しさん:2006/08/07(月) 21:34:50
質問させて下さい。

VC++6.0で動作する、全く別物のプログラムA,Bがあるとします。
そのA,Bを合体させたい(A上でボタンを押すことでBを呼び出して実行させたい)のですが、
何か方法は無いでしょうか。

環境はVC++6.0で、プログラムは初心者です。
よろしくお願いします。
691デフォルトの名無しさん:2006/08/07(月) 21:44:33
スレ違いだったとはいえ何もいわずにマルチかよ。いい根性してんな。
692デフォルトの名無しさん:2006/08/07(月) 21:56:12
>>690
CreateProcess()
693デフォルトの名無しさん:2006/08/07(月) 22:06:01
>>686
お前アホすぎ
694デフォルトの名無しさん:2006/08/08(火) 03:35:14
fp=fopen("test.txt","rb");
695デフォルトの名無しさん:2006/08/08(火) 14:20:32
お願いします。

int a[5] = {20, 33, 41, 3, 80};
のような配列があって、
int order[5];
にaの要素が大きい順の添字を入れたいのです。
どうすればよいでしょうか。

この例だと
order[5] = {5, 3, 2, 1, 4};
のようになります。
696デフォルトの名無しさん:2006/08/08(火) 14:30:20
ソートすればいいんじゃない?
てか添字は0から
697695:2006/08/08(火) 14:32:23
>>695ですが、一応。

order[5] = {4, 2, 1, 0, 3};
こうでした。
どうすればいいのでしょうか。
698695:2006/08/08(火) 14:37:50
>>696
a[]をソートしてしまうと、その例えば一番大きい値が何番目にあったのかが
わからなくなってしまうような気がするのですが。
699デフォルトの名無しさん:2006/08/08(火) 14:42:53
order[ ]をa[ ]の値を使ってソートすればいい。
700695:2006/08/08(火) 15:29:04
>>699
な、なんとかできました。

order[5] = {0, 1, 2, 3, 4};
と初期化をして、
a[]の値をソートしながら、一緒にorder[]もソートすることでできました。

ありがとうございます。
701デフォルトの名無しさん:2006/08/08(火) 15:33:11
おめでとう。
でもaはソートしなくてもいいんだよ〜
702デフォルトの名無しさん:2006/08/09(水) 00:40:50
Cの勉強始めようと思うんだけど環境って何がいいんですか?
今はEclipseでJavaをかじってる程度。
コンパイラとか総合開発環境?でお勧めってあったら是非教えてください。
お願いします。
703デフォルトの名無しさん:2006/08/09(水) 00:44:43
>>702
つ[Cygwin]
704デフォルトの名無しさん:2006/08/09(水) 00:47:48
>>702
Linux丸ごと、まじお奨め
705702:2006/08/09(水) 00:50:13
>>703
Cygwinはコンパイラって入ってるの?
前使ってたけど使い難かった。

>>704
Vine3.2はVMwareで入ってる。
でも重い。
インスコディスク消えたからインスコできない。
確かにLinuxが環境としてはやりやすい。
706デフォルトの名無しさん:2006/08/09(水) 00:51:13
Cygwinにはgccが標準で入っている。
707デフォルトの名無しさん:2006/08/09(水) 00:52:44
>>706
CはわからないんだけどgccはCのコンパイラ?
CygwinはEmacsとかViは使えないでしょ?
MeadowとCygwinでいいの?
708デフォルトの名無しさん:2006/08/09(水) 00:57:25
>>707
gccはCコンパイラ。(他言語のコンパイラでもあるが)
emacsもviも使える。
ちなみにgccは標準では入ってない。
709デフォルトの名無しさん:2006/08/09(水) 00:58:06
>>707
大抵のものはCygwinに揃っている。
標準でインストールされるかどうかはともかく、EmacsもViもきっとあるはず。
710707:2006/08/09(水) 00:59:29
>>708,709
コマンドプロンプトよりは確実に使いやすいはずだよね。
とりあえず入れてみるありがとう!
711デフォルトの名無しさん:2006/08/09(水) 01:02:23
cygwinのエディタは日本語使えるようにするのが大変だから、
xyaayxなり、meadowなりをつかった方がいいよ。
712デフォルトの名無しさん:2006/08/09(水) 01:07:31
gccもemacsもvi(vim)も、cygwinのセットアップツールで一括インストールできるね。

>>711
xyzzy?
713707:2006/08/09(水) 01:10:34
>>711
meadowってemacsに近いけど少し違うよね?
Java作ってる時にTab押した時のインデントが気に食わなかった。
設定できるのかな?

>>712
とりあえずHP見てAll Installにしたから入ったと思う。
まだインスコ中だけど。
714デフォルトの名無しさん:2006/08/09(水) 01:12:19
All Installとは、また剛毅な。
想像を超える数のファイルがインストールされるから覚悟しておくようにw
715707:2006/08/09(水) 01:20:24
>>714
10分経っても3%だったからやり直したwwwwwwww
gccとemacs、vimだけ入れてみた。
がんばるぞっと!
716デフォルトの名無しさん:2006/08/09(水) 01:30:52
Cygwin入れたんだけど何もできない。
パス通したし作業フォルダもC:\Cにした。
lsもdirでも使えないぞ?
再起動してないからな?
それとも入れないといけないものでもあったのかな…。
717デフォルトの名無しさん:2006/08/09(水) 01:32:49
>>716
質問はCygwinスレでどうぞ。
718デフォルトの名無しさん:2006/08/09(水) 01:33:04
c:\cygwin\bin
719デフォルトの名無しさん:2006/08/09(水) 02:26:49
すみません、質問させてください。

http://xxxxx.dyndns.tv/~nadesiko/up/upload.php

ここにアップしたVC++6.0で作成してあるプログラムを、
どうしてもコマンドプロンプトで実行したいのですが
よくわからないエラーが出て実行出来ません。
このプログラムは、引数としてdata1、data2というファイルが必要なのですが
それが関係しているのでしょうか・・・。

少しスレ違いかもしれませんが、
宜しければどなたかアドバイスを下さらないでしょうか。
720719:2006/08/09(水) 02:46:00
すみません、どのファイルなのかを書き忘れました。
上のアドレスのupupup5164.zipです。
コメントにも分かり易く書いておきました。

重ね重ね、宜しくお願いします。
721デフォルトの名無しさん:2006/08/09(水) 04:19:40
>>702
せっかくEclipse持っているのになぜそれを使わないんだ。
C/C++プラグインあるぞ。
722デフォルトの名無しさん:2006/08/09(水) 13:26:14
int main(int argc ,char *argv[]);
              ~~~~~~~ ←この部分に関する質問です
argv[1]に文字列を追加した場合、領域破壊が発生しますか?
723デフォルトの名無しさん:2006/08/09(水) 13:28:59
します
724デフォルトの名無しさん:2006/08/09(水) 14:06:45
ありがとうございます
725デフォルトの名無しさん:2006/08/09(水) 14:21:37
なんらかのプロセスが新しく作成された瞬間を捕らえるAPI関数または手法はありますか?
あれば教えてください。
726デフォルトの名無しさん:2006/08/09(水) 15:51:00
BCCで作っておりますが、
<windows.h>をインクルードせずに、
コマンドラインオンリーのプログラムで、
新しいフォルダ若しくはディレクトリを
作るのは無理なのですか?

出力ファイルが大量に出来るプログラムを作っておりますが
出力ファイルを一定数ごとに新たなフォルダに分けて出力したいと思い
質問した次第です

ファイル名をディレクトリ名のようにしてみましたが、上手く動きませんでした
727デフォルトの名無しさん:2006/08/09(水) 16:08:16
>>726
system("command /c hoge");
hogeには当然作りたいディレクトリの名前かパス。
728デフォルトの名無しさん:2006/08/09(水) 16:09:20
間違えた、こうだ。
system("command /c md hoge");
729デフォルトの名無しさん:2006/08/09(水) 18:01:53
>>726
mkdir
730デフォルトの名無しさん:2006/08/09(水) 18:48:03
>>729
それ非標準だから先頭にアンダーバーが付いてないかい
731デフォルトの名無しさん:2006/08/09(水) 19:14:01
Windows限定のようだし、非標準だろうがどうでもいいことだな
732デフォルトの名無しさん:2006/08/09(水) 19:17:56
有難うございます
それを手がかりにやってみます
733デフォルトの名無しさん:2006/08/09(水) 21:34:54
>>730
ANSI C標準じゃないけどWindows環境やPOSIX環境だとライブラリに含まれてる。POSIXだとモード指定の引数が追加されてるけど。
734デフォルトの名無しさん:2006/08/09(水) 22:11:02
神経衰弱つくってるんですけど、画像処理のやり方詳しく乗ってるホームページって何処かありませんか?
735デフォルトの名無しさん:2006/08/09(水) 22:54:51
>>734
可愛そうに。DelphiかBCBでも使うべきだな。C#でもイイ
736デフォルトの名無しさん:2006/08/09(水) 22:56:04
HSPにしておけ。
737デフォルトの名無しさん:2006/08/09(水) 23:02:50
いや、それならActiveBasicの方が(ry
738デフォルトの名無しさん:2006/08/09(水) 23:03:43
猫でもわかる(tbsでも一から熟読すればいいだろ。
739デフォルトの名無しさん:2006/08/10(木) 01:52:00
ここはいっそDirectXで。
740デフォルトの名無しさん:2006/08/10(木) 16:16:19
初心者質問で失礼します。
visualc++2005 Expressを落としてform系のサンプル見てみたんですけど
リテラルって L"label1"とか書かないといけないんでしょうか。。。
741デフォルトの名無しさん:2006/08/10(木) 16:23:46
>>740
Unicodeなら、プレフィクスのLをつける。
742デフォルトの名無しさん:2006/08/10(木) 16:38:22
>>741
おお、素早いレスありがとうございます
ということは、無理に付けなくても大丈夫な感じでしょうか。
なんか謎です。
743デフォルトの名無しさん:2006/08/10(木) 17:03:29
>>742
つけない場合は、マルチバイト文字になる(シフトJISもこれ)
NTはネイティブでUnicodeなので(マルチバイト文字は、Unicodeに変換されてAPIに渡される)
もうそろそろいい加減にUnicodeにしろや、というMSの意向かな。
VS2005のIDEでは、デフォルトでUnicodeだし。

Win32 APIを学ばないと、この辺はあまり実感できないと思うけど。

Cでいえば、たとえばprintf()に文字列リテラルを渡す場合は、Lをつけてはいけない。
printf()はchar const *型を引数に取るから。

Lをつけた文字列(Unicode)を渡したい場合は、wprintf()を使う。
744デフォルトの名無しさん:2006/08/10(木) 17:06:49
tchar.h と _T() マクロ と対応する関数群 (_tprintf とかね) で一貫してれば…
745デフォルトの名無しさん:2006/08/10(木) 22:54:04
>>740
もしかしてC++/CLI (CLRアプリケーションなど)使っている?
System::Stringは文字列をUnicodeとして保持しているから、それに対してはL付ける派が多い。
しかし文字列リテラルの場合は、コンパイラが面倒を見てSystem::String型のリテラルにするので、
Lの有無はどちらでも良くなっている。
746デフォルトの名無しさん:2006/08/10(木) 22:58:33
managed C++の時には System::Stringには専用のS"...."という書き方があったね。
C++/CLIで使おうとしたらレガシーだって怒られた。
747デフォルトの名無しさん:2006/08/10(木) 23:18:20
Boehm GC と smartPtr 使うならどっちがいいですか?
748デフォルトの名無しさん:2006/08/11(金) 00:01:59
>>747 条件による。
749デフォルトの名無しさん:2006/08/11(金) 07:36:26
複数ウインドウを開くツールを作っていたら、WindowsXPのタスクバーにグループ化されて、
exe名がタスクバーのボタン名になってしまいました。
Officeとかは、Microsoft Office Excelとか表示されているから
なにか方法があるとおもうんですが、やり方のヒントもらえませんか。
「hoge.exe」から、「美しいウインドウ1」、「美しいウインドウ2」、「美しいウインドウ3」、
と開いていくと、「美しいウインドウ4」、をあけたときにグループ化されて「hoge」になってしまうっす。
750デフォルトの名無しさん:2006/08/11(金) 10:34:27
>>743-746
レス遅れてすいませんでした。いろいろな場合があるんですね。
勉強になります。ありがとうございました。
751デフォルトの名無しさん:2006/08/11(金) 17:30:32
VC2003 のデバッガで、関数から戻る直前の位置で停止しているとき、
関数の戻り値を表示させるには、どうしたらよいですか?
752デフォルトの名無しさん:2006/08/11(金) 17:46:24
cout
753デフォルトの名無しさん:2006/08/11(金) 19:20:42
ソースはいじらないで、デバッガ上で表示したいんです。
754デフォルトの名無しさん:2006/08/11(金) 19:26:20
retrunの後ろにマウスカーソルを移動
755デフォルトの名無しさん:2006/08/11(金) 19:32:14
初心者の者なのですが、
本を読みながら勉強してたら

if ((s->stk = calloc(max, sizeof(int))) == NULL)

本に書かれていた通り↑のように書いたところ
>'void *' 型は 'int *' 型に変換できない
という警告が出ました。

if ((s->stk = (int*)calloc(max, sizeof(int))) == NULL)

で、このように書いたら正常にコンパイルできたのですが、
これは本のミスなのでしょうか?
756デフォルトの名無しさん:2006/08/11(金) 19:35:51
>>755
コンパイラは?
757デフォルトの名無しさん:2006/08/11(金) 19:37:40
自分のEXEを消す

スーパーハッカーの方法を教えて九台!
758デフォルトの名無しさん:2006/08/11(金) 19:42:21
>>756
borland C++です。
759デフォルトの名無しさん:2006/08/11(金) 19:44:57
標準C++ライブラリ <string>

ちょー簡単ならいぶらりあったんじゃねーかl−−ああpさ

なんで教えてくれなかったんだよ!!
初心者C++講座;あ;あ;あ;あ;;あ;あ;あ;!!
760デフォルトの名無しさん:2006/08/11(金) 19:56:23
>>755
横からだけど
void*型とint* 型が暗黙的にキャストされるのは危ないから普通はエラーになるよ。
761デフォルトの名無しさん:2006/08/11(金) 20:04:39
>>755
Cではvoid*から他のポインタに暗黙キャストが言語仕様としてあるから、本のミスではない。

C++としてコンパイルしたアナタのミス
762デフォルトの名無しさん:2006/08/11(金) 20:10:46
クラスについて躓いているので、質問させてください。
現在CTaskというクラス、またはそれを継承したクラスでリスト構造を作りたく、
クラスのメンバ変数に
static std::list<CTask*> LTask と
static std::list<CTask*>::iterator itr を宣言しています。
これを初期化しないといけないので

std::list<CTask*>::iterator CTask::itr = LTask.begin();

としてもリンク時にエラーが出てしまいます。
書き方が間違っテいるのでしょうか。

エラーは、
CTask.obj : error LNK2001: 外部シンボル
""public: static class std::list<class CTask *,class std::allocator<class CTask *> > CTask::LTask" (?LTask@CTask@@2V?$list@PAVCTask@@V?$allocator@PAVCTask@@@std@@@std@@A)" は未解決です。
libcpmtd.lib(stdthrow.obj) : error LNK2019: 未解決の外部シンボル __CrtDbgReportW が関数 "void __cdecl std::_Debug_message(wchar_t const *,wchar_t const *,unsigned int)" (?_Debug_message@std@@YAXPB_W0I@Z) で参照されました。
Debug/007_Direct3D最小コード.exe : fatal error LNK1120: 外部参照 2 が未解決です。
と出ています。

VC++ 2005EEを使っています。
どうかご教授いただけると嬉しいです。
763デフォルトの名無しさん:2006/08/11(金) 20:11:56
>>760-761
なるほど、やっと悪いところが把握できました><
HC_Editorというエディタで作成したらダメで、
winのメモ帳で作成したらOKだったので何がいけないんだろうと思ったら、HC_Editorで新規作成すると自動的にcppでファイルが作られてたのがいけなかったのか。
c++はcでできること全部できると思ってたからそのまま気にしないでやってましたorz
本当にありがとうございました><

764デフォルトの名無しさん:2006/08/11(金) 20:43:35
>>762
再現する最小限のコードを書いてみ
765デフォルトの名無しさん:2006/08/11(金) 20:53:26
>>762
ヘッダファイルでは
static std::list<CTask*>::iterator itr;
と宣言するだけにし、実装ファイルで
std::list<CTask*>::iterator CTask::itr = LTask.begin();
と書く
766デフォルトの名無しさん:2006/08/11(金) 21:07:12
まさかとはおもうが、LTaskの実装は書いてるよね
767デフォルトの名無しさん:2006/08/11(金) 21:31:51
>>764さん
CTask.h-------------------------------------
static std::list<CTask*> LTask;
static std::list<CTask*>::iterator itr;

以下メソッドなど。
--------------------------------------------

CTask.cpp-----------------------------------

#include <list>
#include "CTask.h"

std::list<CTask*> CTask::LTask.clear();
std::list<CTask*>::iterator CTask::itr = LTask.begin();

以下メソッドなど。
--------------------------------------------
こんな感じになっています。

>>765さんの言うとおり、ヘッダとソースはそのようにしているのですが・・・

>>766さん
LTaskの初期化も必要なのですか。
初期化の仕方(書き方?)が分からないのでCTask.cppに
std::list<CTask*> CTask::LTask.clear();
とは書いているのですが、間違っているようです・・・
LTaskはCTask*型のリストなのですが、実装とは何なのでしょうか。
768デフォルトの名無しさん:2006/08/11(金) 21:52:48
>>759
結構な人が知らずに車輪の再発明みたいなことしてると思うw
これ以上後悔しない為にも
STLとついでにBoostについてググっておくのを薦める。
769デフォルトの名無しさん:2006/08/11(金) 22:07:29
学習目的ならstringを実装してみるのは非常に勉強になると思うけどね
770デフォルトの名無しさん:2006/08/11(金) 23:38:17
>>767
リンクエラーどころかそのコードではコンパイルは通らない

CTask.hの内容が
class CTask
{
static std::list<CTask*> LTask;
static std::list<CTask*>::iterator itr;
};
であると予想してCTask.cppを

-std::list<CTask*> CTask::LTask.clear();
+std::list<CTask*> CTask::LTask;

と変更
これが766が書いているLTaskの実装ね
771767:2006/08/11(金) 23:51:56
>>770さん、ありがとうございます!
どうにかリンカまで通ることが出来ました。

LTaskの実装だけでイテレータの初期化が入らなかったとは orz

本当にありがとうございました。
もっと勉強してきます。
772767:2006/08/12(土) 00:10:39
早とちりでした。
>>765さんはstd::list<CTask*>::iterator CTask::itr = LTask.begin(); と書く
とおっしゃっていますので、イテレータの初期化もちゃんと書くと、やはりリンカでエラーが出るようになりました。

libcpmtd.lib(stdthrow.obj) : error LNK2019: 未解決の外部シンボル __CrtDbgReportW が関数 "void __cdecl std::_Debug_message(wchar_t const *,wchar_t const *,unsigned int)" (?_Debug_message@std@@YAXPB_W0I@Z) で参照されました。
Debug/007_Direct3D最小コード.exe : fatal error LNK1120: 外部参照 1 が未解決です。

と、このような風にです。
イテレータの初期化を書かなければコンパイルもリンクもきちんと出来ているようですが、
やはりイテレータが使えないと意味がないですよね。
一歩進んで半歩下がった感じでしょうか・・・
773デフォルトの名無しさん:2006/08/12(土) 00:12:25
>>770-771
これは「 LTask の定義」と言うのが正しい。
実装ってのは関数の場合に定義の中の {} の部分を指して使うもんだと思う。
774デフォルトの名無しさん:2006/08/12(土) 00:19:23
775デフォルトの名無しさん:2006/08/12(土) 18:55:50
visual c++使って
ttp://www.plustarnet.com/aspil/Programming/Skeleton.htm
このページにあるスケルトンプログラムをビルドしてみたんですが
かなりたくさんエラーが出てしまいました。↓
ttp://tool-ya.ddo.jp/webfs/~enigma/log.txt

どなたか対処法教えていただけないでしょうか?
776デフォルトの名無しさん:2006/08/12(土) 21:21:01
>>775
ヘルプでC2383を調べろよ
777デフォルトの名無しさん:2006/08/12(土) 21:23:39
778デフォルトの名無しさん:2006/08/13(日) 00:55:34
C言語を勉強するのにお勧めの本ってありますか?
全くの初心者〜ってのと、それなりに勉強した奴が使うようなもの2冊ほど。
779デフォルトの名無しさん:2006/08/13(日) 01:11:55
>>778

まったくの初心者用
 何冊も読んでみるといい。自分が知る限り、これ一冊でOKという万能本はない。

それなりに勉強した奴用
 K&R

というかスレ違い
780デフォルトの名無しさん:2006/08/13(日) 04:35:48
関数ポインタの中身って、何が入ってるんですか?
%pで表示させてみた限り、int形などのポインタと大差ないように見えますが?
781デフォルトの名無しさん:2006/08/13(日) 04:52:02
ポインタの中身はメモリ上のアドレス情報だから
int型変数の格納されたアドレスだろうが
関数の格納されたアドレスだろうが
見た目には見分けつきませんよ

複数のワードを占有するデータの場合、その先頭のワードのアドレスを指すだけでしょうから
782デフォルトの名無しさん:2006/08/13(日) 04:58:43
>>780
そりゃぁ、%pはポインタの持つ「アドレス」という属性を表示しているだけだからね。
ポインタの持つ「型」という属性はC++でtypeidでも使えば見ることができるよ。
783772:2006/08/14(月) 00:36:55
LTaskの定義を済ませてデバッグモードでビルドしたところ、リンカも通りました。
イテレータの初期化はいらないとどこかで見て(失念)、コメントアウトしています。
ここまではいいのですが、関数の中で、

void CTask::MoveTasks()
{
std::list<CTask*>::iterator itr = LTask.begin();
while(itr != LTask.end())
{
(*itr)->Move();
++itr;
}
}

とすると、
CTask.obj : error LNK2019: 未解決の外部シンボル __CrtDbgReportW が関数
"public: class CTask * const & __thiscall std::list<class CTask *,class std::allocator<class CTask *> >::_Const_iterator<1>::operator*(void)const
" (??D?$_Const_iterator@$00@?$list@PAVCTask@@V?$allocator@PAVCTask@@@std@@@std@@QBEABQAVCTask@@XZ) で参照されました。
libcpmtd.lib(stdthrow.obj) : error LNK2001: 外部シンボル "__CrtDbgReportW" は未解決です。
Debug/007_Direct3D最小コード.exe : fatal error LNK1120: 外部参照 1 が未解決です。
と出て困っています。
ちなみにリリースモードではこのエラーは出ません。
少し調べた結果 "__CrtDbgReport" というのが "libcmtd.lib" のリンクに失敗しているのではと考え、

#ifdef _DEBUG
#pragma comment(lib, "libcmtd.lib")
#endif

という風に一時しのぎをしているのですが、これでは根本的な解決になってない気がして気持ち悪いです。
どのようにしたらこのエラーは出なくなるのでしょうか?
何度も質問申し訳ないです orz
784デフォルトの名無しさん:2006/08/14(月) 00:40:06
VC++でBasicのChrみたいにアスキーコードから文字取得するのってどうするんですか?
785デフォルトの名無しさん:2006/08/14(月) 00:43:30
>>784
char型へキャストするだけ。
786デフォルトの名無しさん:2006/08/14(月) 01:01:44
>>785
できました!ありがとうございます!!
787デフォルトの名無しさん:2006/08/14(月) 09:58:51
>>749
Win32API質問箱できいてみます。読んでくれた人、ありがとう。
788デフォルトの名無しさん:2006/08/14(月) 14:23:37
VC8でstrtokに変わる関数はありますか?
789デフォルトの名無しさん:2006/08/14(月) 14:37:43
_mbstok_sとか?
790デフォルトの名無しさん:2006/08/14(月) 14:55:19
>>789
ごめんなさい、strtok自体C++でも使えるんですよね?
VS2005のHELPを検索したら出てこなかったので、てっきりCだけの関数かと
思い込んでました。
791デフォルトの名無しさん:2006/08/14(月) 16:00:31
(Point.h)

#ifndef POINT_H
#define POINT_H
class Point
{
...
};

#endif

(TwoPoint.h)

#ifndef TWOPOINT_H
#define TWOPOINT_H

#include"Point.h"

class TwoPoint : Public Point
{
...
};

#endif

というように、TwoPointのスーパークラスを別のファイルに書こうとしたんですが、
エラーがでます。(エラー文:定義されていない基本クラスが宣言されています。)
PointクラスとTwoPointクラスを一つのファイルにまとめて書けば問題は無いんですが、
別のファイルに分けて書く方法、もしくは上のソースで間違ってるところありませんか?
792デフォルトの名無しさん:2006/08/14(月) 16:02:03
> Public
793デフォルトの名無しさん:2006/08/14(月) 16:16:33
>>792
すいません、大文字になってましたね。
でも、小文字にしても今のところ同じようにエラーが出ます。
794デフォルトの名無しさん:2006/08/14(月) 16:20:29
エラー文を略しちゃ分からんがな
795デフォルトの名無しさん:2006/08/14(月) 16:22:19
小文字にしたけど保存してませんでしたオチは・・・・・・まあさすがにないか
796デフォルトの名無しさん:2006/08/14(月) 16:48:46
>>790
Cの関数は当然C++でも使える。

そして、一体どこを探したんだ?
http://msdn2.microsoft.com/ja-JP/library/2c8d19sb.aspx

797791:2006/08/14(月) 17:02:57
>>794
error C2504:'Point' 定義されていない基本クラスが宣言されています

>>795
ビルドしましたがダメでした。
798デフォルトの名無しさん:2006/08/14(月) 17:15:45
#include"Point.h"の前にPOINT_Hが定義されてるくらいしか思いつかない。
799デフォルトの名無しさん:2006/08/14(月) 17:46:46
>>798 なら
#include"Point.h"
の直前で
#undef POINT_H
で通るはず。あとはがんばって探す。
800デフォルトの名無しさん:2006/08/14(月) 17:59:03
>>796
サンクス、あれ?
MSDNにstrtokの解説っでてますね??
VS2005のVC8でコード書きながら、F1押してstrtok入力したら出てこなかったのに・・・・
途中、色々調べていたら、.NETではSplitなる関数も準備されていることも分かりました
いろんな方法でコーディングしてみます。
801791:2006/08/14(月) 18:11:53
>>799
error C2011:'Point': 'class'型の再定義になってしまいました・・・。
802783:2006/08/14(月) 18:17:52
すみません、自己解決しました。
プロジェクトのコード生成を、マルチスレッド(/MT)からマルチスレッドデバッグ(/MTd)に変更するだけだったんですね。

次の質問です、
staticなメンバ変数list LTaskを持っているクラスCTaskのnew演算子をオーバーロードしようと思うのですが、
他の例えばWinMain関数で
new CTask;
とすると、CTaskが自身で自身ををlist LTaskにpush_buck()する方法はありませんか?
803デフォルトの名無しさん:2006/08/14(月) 18:31:53
さあ、次ぎの質問ですよッw
804デフォルトの名無しさん:2006/08/14(月) 18:35:22
禿は今何歳なんですか?
805デフォルトの名無しさん:2006/08/14(月) 18:38:48
56歳
806デフォルトの名無しさん:2006/08/14(月) 18:43:21
禿はいつから禿てるんですか?
807デフォルトの名無しさん:2006/08/14(月) 18:46:23
>>801
class Pointは読んでるぽいね

class TwoPoint : public Point
の前で
Point HagePoint;
してみると?
808デフォルトの名無しさん:2006/08/14(月) 18:46:23
>>802
コンストラクタでpush_backしろ。
809デフォルトの名無しさん:2006/08/14(月) 18:48:28
>>801
(Point.h)
#ifndef POINT_H
#define POINT_H
class Point {
};
#endif
(TwoPint.h)
#ifndef TWOPOINT_H
#define TWOPOINT_H
#include "Point.h"
class TwoPoint : public Point {
};
#endif
(main.cpp)
#include "TwoPoint.h"
int main(int argc, char *argv[]) {
TwoPoint tp;
return 0;
}

で何のエラーもでないぞ、ほかに別のヘッダインクルードしてるとかじゃね?
810802:2006/08/14(月) 18:57:58
>>808さんレスありがとうございます。
コンストラクタで
LTask.push_back(this);
としてみました。
間違いありませんか?

時に、自分はまだ禿げてませんが、母方の父が禿げているので
20代後半からは頭皮の環境に気をつけたいと思います。
811デフォルトの名無しさん:2006/08/14(月) 20:42:18
.NETで構造体のデータを扱う場合、
structで定義した、こてこてのANSI Cを使うのは邪道ですか?
やはり、ref classで定義した書き方をするのが正道なのでしょうか
ケースバイケースなのでしょうが、漏れにはどっちも同じ様に感じてしまいます
概念的な質問になってしまいましたが、根本的な違いがよく分かりません。
教えてくださいエロイヒト
812デフォルトの名無しさん:2006/08/14(月) 20:57:25
>>811
そこをどっちでも好きなほうを選べるのが長所。
どっちにするか決めかねるのが短所。

コードが書きやすくなる方を使えばいいと思うよ。
あと、value structという手もあるよ。
813デフォルトの名無しさん:2006/08/14(月) 21:04:23
#endif忘れるとか、#ifndefが#ifdefになってた、とかしょーもないミスをする俺のような
人間もいるので、>>801のソースに書き加えて、だんだんもとのソースに戻していくと
わかるかも。
814デフォルトの名無しさん:2006/08/14(月) 21:04:54
すまん。>>809だった。
815デフォルトの名無しさん:2006/08/14(月) 21:07:25
#pragma onceのようなのを言語規格に入れるべきなんじゃないの?
816デフォルトの名無しさん:2006/08/14(月) 21:14:30
>>812さんどうもです
最近「改定 新 C言語入門 シニア編」を読終え、今まで曖昧だった構造体や
ポインタの使用方法が大体理解できました。また、日経BP出版の
「ひと目でわかる Microsoft Visual C++2005 アプリケーション開発入門」の
データとクラスを読み、それまで漠然としかイメージできなかったオブジェクト指向の
概念がリアルに理解できてきました、と同時に先程の>>811疑問が沸いてきた次第です
>>812さんの意見を踏まえ、使いまわしを考えれば、クラスを外部で定義した方に
一石の長があるような気がします。
817デフォルトの名無しさん:2006/08/14(月) 21:19:59
>>815
いれるべきだよなぁ。ifndef使うのは常識だけど、よく考えるとバッドノウハウ?
818デフォルトの名無しさん:2006/08/14(月) 21:25:43
そもそも、#includeの代わりになるものを、
言語仕様として入れるべきだと思う。

というか禿の言うとおり、プリプロセッサ嫌い。
819デフォルトの名無しさん:2006/08/14(月) 21:41:13
どうせ変更するならインターフェースと実装を
完全に分離して書ける様にしてほしいもんだ
820デフォルトの名無しさん:2006/08/14(月) 21:45:09
私はVineLinux3.2を使ってるんですが、コマンドラインで
gcc -o sample sample.c
と打ってコンパイルして、sampleというファイルをつくったんですが
コマンドライン上で sample と打っても
sample:コマンドが見つかりません. と出て実行できません。
どこが悪いのかご教授お願いします。
821デフォルトの名無しさん:2006/08/14(月) 21:46:22
./sample
とかで動いたとかいったら、ぬっ殺す。
822デフォルトの名無しさん:2006/08/14(月) 21:54:47
./sample
とかで動きました^^;
ありがとうございました。そして殺さないでください><
823デフォルトの名無しさん:2006/08/14(月) 23:23:16
>>822
↓の行を実行しておけばsampleだけで動くよ。
export PATH=.
824デフォルトの名無しさん:2006/08/14(月) 23:56:43
>>823
その方法は色々問題があるから初心者にはおすすめしないけどね
825デフォルトの名無しさん:2006/08/15(火) 08:50:26
vectorのassign()の使い方についての質問です。

2次元配列array2dに要素nx、nyを割り当てるとき
array2d.assign(nx, vector<double>(ny));
3次元配列array3dに要素nx、ny、nzを割り当てるとき
array3d.assign(nx, vector< vector<double> >(ny, nz);

というところまでは出来たのですが‥
4次元配列で同じことをやるにはどうしたら良いでしょうか?
array4d.assign(nx, vector< vector< vector<double> > >(ny,(nz,t)));
としても要素が割り当てられませんでした。

どうかご教授をお願いします。
826デフォルトの名無しさん:2006/08/15(火) 09:07:45
>>825
間違ってるじゃん。

3次元は
array3d.assign(nx, vector<vector<double> >(ny, vector<double>(nz)))
4次元は
array4d.assign(nx, vector<vector<vector<double> > >(ny, vector<vector<double> >(nz, vector<double>(t))))
827825:2006/08/15(火) 10:21:53
>>826
すみません、間違ってました。そして解決しました。
ありがとうございました!
828デフォルトの名無しさん:2006/08/15(火) 12:05:57
>>824
そもそも>823ではmakeさえ通らなくなるからただのネタだろ。
#lsできなくなると書こうとして、補完があるから必要ないと突っ込まれそうな気がしてやめた。
829デフォルトの名無しさん:2006/08/15(火) 13:11:21
このプログラムなのですが、バイナリ→テキスト変換です。
一番目のデータはちゃんと読みますが、
二番目以降のtxtデータを開いてみると
一番目のデータのまま書き込まれてしまいます。
どこをどうなおせば良いでしょうか?お教えください。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/2604.txt
830デフォルトの名無しさん:2006/08/15(火) 13:12:26
コンソールアプリケーションで
特定のフォルダにファイルを出力する場合
どんな関数を使い、パスはどう書くべきなのですか?
fprintfではダメなので、あれこれ悩んでおりました

プログラムがあるのと同じフォルダ内に出力するのではなく、
フォルダ内に作った子フォルダに出力するのが
上手く行かずに困っております
831デフォルトの名無しさん:2006/08/15(火) 13:17:10
>>829
自分でデバッグしろよ
832デフォルトの名無しさん:2006/08/15(火) 13:22:32
>>830
標準にディレクトリやフォルダの概念は無いので、どんな関数を使うかは環境依存。
fprintfではダメな理由とは?
どう上手くいかないのか書かないと何も分からない。
833デフォルトの名無しさん:2006/08/15(火) 13:27:12
>>831
何回もやってみたのですが・・。
コンパイルはできるけど、
データがおかしくって。
834デフォルトの名無しさん:2006/08/15(火) 13:29:08
>>833
本当かよ
ステップ実行してnの値をみてみろ
835デフォルトの名無しさん:2006/08/15(火) 13:32:45
>>830
もしや、fopen("directory\file.dat", "w")なんて落ちか?
・fopen()はファイルを作るがディレクトリは作らない。
・バックスラッシュはエスケープしないとリテラルに使えない。
836791:2006/08/15(火) 15:27:41
先日はたくさんのご意見ありがとうございました。
どうやら、(Point.h)で、#include "TwoPoint.h"をしていたのが誤りだったようです。
(ここに書き込んだソースではしていませんでしたが)
>>809さんの「ほかに別のヘッダインクルードしてるとかじゃね?」が正しかったみたいです。
#includeは「とりあえず関係ありそうなものはなんでもしとけばいいや」みたいに思ってたので、
それが原因だったみたいです。

しょうもない理由で混乱させて申し訳ありませんでした。
でも、おかげ様ですごく助かりましたm(_ _)m
837デフォルトの名無しさん:2006/08/15(火) 16:47:34
PointはTwoPointを知る必要がないのだからインクルードは不要。
インクルードはただのおまじないではないので、
それを書くことで、または、書かないことで、どういうことになるのか
考えながらコーディングする必要がある。
838デフォルトの名無しさん:2006/08/15(火) 18:49:47
>>835
ありがとうございます。
その方針で試して見ます
839デフォルトの名無しさん:2006/08/15(火) 19:24:03
>>835
ステップ実行
調べてやってみましたが、step入れたらコンパイル
それ自体がうまく行きません。

840デフォルトの名無しさん:2006/08/15(火) 21:47:41
>>839
> step入れたら
どこで調べたらこうなるんだ?
841デフォルトの名無しさん:2006/08/15(火) 23:23:50
spawnlp(P_NOWAIT,"ファイル名","",NULL);
で実行したプロセスから、spawnlpを実行したプロセスに
何かメッセージを送って、それを受信したいのですが、
どんな方法がありますか?
842デフォルトの名無しさん:2006/08/15(火) 23:24:26
自分でクラス定義して実装してみたいのですが、よいテーマが浮かびません
皆さんが最初に自分で作ったクラスはどんなものだったでしょうか?
もしくは、実用的で入門向けのテーマを与えて頂けないでしょうか、
因みに会社ではVC8またはBCCで簡単なファイル処理のプログラムを書いています。
843デフォルトの名無しさん:2006/08/15(火) 23:28:25
void func1(void);
この最初のvoidと()内のvoidがワケワカメなんだが、
誰か解説してくれない?
844デフォルトの名無しさん:2006/08/15(火) 23:35:03
>>841
パイプとか共有メモリとか。
845デフォルトの名無しさん:2006/08/15(火) 23:36:03
>>842
FILE* を private メンバに持ったファイルクラスでも作るといいんじゃない?
846デフォルトの名無しさん:2006/08/15(火) 23:38:25
>>843
最初の void は関数の戻り値の型。
括弧の中の void は引数を受け取らない関数として宣言するために必要。
847デフォルトの名無しさん:2006/08/15(火) 23:40:42
>>845
サンクスです、ファイル入出力のクラス化というイメージでしょうか?
もしそうならば、やってみます。
848デフォルトの名無しさん:2006/08/15(火) 23:49:56
>>847
ファイルのクラス化と考えるほうが自然だと思う。おぶじぇくとしこうってこういうこと?
849デフォルトの名無しさん:2006/08/15(火) 23:49:56
>>844
ちょっと調べてみます。
850デフォルトの名無しさん:2006/08/15(火) 23:58:08
>>848
すみませんが、もう少し具体的にファイルのクラス化とは何か説明して
頂けないでしょうか、与えられた仕事はこなせるのですが、
想像力に乏しいものでして・・・申し訳ござません_(--)_
851デフォルトの名無しさん:2006/08/16(水) 00:13:06
>>850
クラスになるのは「ファイル」。 class file; となって file input("path/to/file"); なんて使う。
そのクラスのメンバ関数になるのが「ファイル出入力」。 read() とか write() とかあって
input.read() とかして使う。そんなイメージ。

「ファイル出入力をクラス化」すると class file_read; class file_write; となるんだろうけど
不自然だと思うし、実際使いにくそう。
852デフォルトの名無しさん:2006/08/16(水) 00:23:29
ファイルを1つのオブジェクトとして考える。
コンストラクタでファイル名を引数に取り、そのファイルをfopen()して、*FILE型のメンバに代入する。
メンバ関数として、1文字読んで返す、1行読んで返す、改行文字の数を返すとか、オブジェクトに対して操作する関数を自由に作る。
デストラクタでfcloseする。
できあがり。

まあC++のifstreamのFileの車輪の再発明だが。
853デフォルトの名無しさん:2006/08/16(水) 00:35:02
>>851
ありがとう
なるほど、イメージが沸いてきました出来そうなものから作っていきます。
>>「ファイル出入力をクラス化」すると class file_read; class file_write; となるん
>>だろうけど
>>不自然だと思うし、実際使いにくそう。
確かにそうですね、入出力の関数がすでに用意されているのに、それを呼び出す関数を
作るのも確かにおかしいですね。
854デフォルトの名無しさん:2006/08/16(水) 00:43:27
>853
>入出力の関数がすでに用意されているのに、それを呼び出す関数を
>作るのも確かにおかしいですね。

つ「ラッパークラス」

まあ、万人が使いそうなのは標準にもあったりするけども。
855デフォルトの名無しさん:2006/08/16(水) 02:41:31
>851
設計の問題だが、個人的には入力と出力は別クラスにするべき。
(ファイル)入出力というインターフェイスをクラス化するイメージ。
856デフォルトの名無しさん:2006/08/16(水) 02:46:41
>>855
まぁその場合でもクラス化するのはファイルで出入力をメンバ関数にするのが自然だろ。
class readable_file; class writable_file; ってな。
857デフォルトの名無しさん:2006/08/16(水) 02:57:57
>856
rとwをクラス名に使うのなら
file_reader file_writerとかかな。
858デフォルトの名無しさん:2006/08/16(水) 04:27:13
YAGNI
859デフォルトの名無しさん:2006/08/16(水) 07:05:01
で、読み書き両方に対応するクラスも作ろうとして、悪夢のダイヤモンド継承が発生と。
860791:2006/08/16(水) 07:30:20
連投でスイマセン。(長くなるので#include、#ifndef等は省略)

(Point.h)
class Point
{
private:
Point()
{
x = 100;
}
public:
int GetX(); //xの値を返す
};

(TwoPoint.h)
class TwoPoint : public Point { ...};

(TwoPoint.cpp)
x = Point::GetX();

(Main.cpp)
int main(int argc, char *argv[]) {
Point p;
TwoPoint tp;
p.時間経過でxが移動、pとtpを描画();   //ループ
return 0;
}

こんなコードで、Pointクラスのxが時間経過などで移動したとき、
TwoPointクラスのPoint::GetX():で、xの値がなぜか100(コンストラクタの時の値)になってしまいます。
最新のxの値をTwoPointクラスが受け取るにはどうすればいいんでしょう?
861デフォルトの名無しさん:2006/08/16(水) 08:16:52
そもそもその「移動」のコードがないからよく判らんが、
まさか別のインスタンスを見ていると言うことはないだろうな。
862デフォルトの名無しさん:2006/08/16(水) 08:32:45
>>860
>(TwoPoint.cpp)
>x = Point::GetX();
なにこれ?

コンパイル可能な最低限のコードを貼れよ
省略過程で大体の場合は自ずと原因が分かるんだからさ
863デフォルトの名無しさん:2006/08/16(水) 10:16:17
>>860
クラスとインスタンス、及び継承について勉強しなおした方がいい。
そもそもPointとTwoPointをクラスにする必要があるのかとか、
x座標の情報のみで描画する関数をTwoPoint内に作ってしまえば
Pointはいらないんじゃないか(こうすれば問題も解決)とか、色々疑問が沸いてくる。
864デフォルトの名無しさん:2006/08/16(水) 10:21:41
>>842
今更だけど、初めてクラスを作るなら
動的配列やスタック、キューなんてどうかな?
STLで既にあるけど割と簡単に作れると思うよ。
865デフォルトの名無しさん:2006/08/16(水) 11:06:10
リナックスのシスログに出力したいのですがうまくいきません。

syslog.confに
test.*   /var/log/test.log

って追加して再起動して、
openlog("test" , LOG_PID , LOG_NOTICE);

syslog(LOG_INFO , "test write");


ってしているのですが書き込まれません。
何か間違っているのでしょうか?
ご指摘お願いいたします。
866デフォルトの名無しさん:2006/08/16(水) 11:24:10
>>865
openlog()の第三引き数はそれで宜しいか? facilityの指定だったと思うのだが。
867デフォルトの名無しさん:2006/08/16(水) 12:02:43
void test(char *hoge)
{
  char c[] = "piyo";

  hoge = malloc(sizeof(char) * 5);
  strcpy(hoge, c);
  printf("%s\n", hoge);
}

int main(void)
{
  char *c;

  test(c);
  printf("%s\n", c);

  return 0;
}

↑で、関数testのprintfでは、ちゃんとpiyoが表示されるのに
mainのprintfでは表示されないのですが、どうしてでしょうか?
868デフォルトの名無しさん:2006/08/16(水) 12:06:13
void test(int i)
{
i = 5;
}

int main(void)
{
int i;
test(i);
printf("%d\n", i);
return 0;
}

これと同じ事
869デフォルトの名無しさん:2006/08/16(水) 12:22:40
868さん、早速の回答ありがとうございます。

868さんが示してくれたのは良くわかっているつもりなのですが、
じゃあ何故↓は普通に表示されるのかが良くわからないのです。

void test(char **hoge)
{
  int i;

  for (i = 0; i < 3; i++)
    hoge[i] = malloc(sizeof(char) * 5);

  strcpy(hoge[0], "piyo");
  strcpy(hoge[1], "hoge");
  strcpy(hoge[2], "foo");
}

int main(void)
{
  int i;
  char *c[3];

  test(c);
  for (i = 0; i < 3; i++)
    printf("%s\n", c[i]);

  return 0;
}
870デフォルトの名無しさん:2006/08/16(水) 12:28:57
>>867
ヒント:mainのポインタを配列にしてみる
871865:2006/08/16(水) 12:32:01
>>866
てことは追加したtestのfacilityを指定しなきゃいけないってことですか?
型がintなのでどこかにtestのfacilityを定義しなきゃいけないってことですか?
872デフォルトの名無しさん:2006/08/16(水) 12:45:09
>>869
typedef char* CharPtr;
とすれば分かりやすくなるかな?

void test(CharPtr *hoge)
{
  int i;

  for (i = 0; i < 3; i++)
    hoge[i] = malloc(sizeof(char) * 5);

  strcpy(hoge[0], "piyo");
  strcpy(hoge[1], "hoge");
  strcpy(hoge[2], "foo");
}

int main(void)
{
  int i;
  CharPtr c[3];

  test(c);
  for (i = 0; i < 3; i++)
    printf("%s\n", c[i]);

  return 0;
}
873867:2006/08/16(水) 13:00:51
皆様いろいろとレスありがとうございます。
いまいち納得できないので、
皆様のレスを手掛りに自分でいろいろとやってみます。
ありがとうございました。
874デフォルトの名無しさん:2006/08/16(水) 13:14:22
>>871
マニュアルページを読め。
875865:2006/08/16(水) 14:46:39
>>874
manは読んだのですがよくわかりませんでした。
どうか教えてください。よろしくお願いします。
876デフォルトの名無しさん:2006/08/16(水) 15:11:16
>>875
マニュアルページ(http://www.linux.or.jp/JM/html/LDP_man-pages/man3/openlog.3.html)によると、
>facility 引き数は、後で syslog() を呼び出す際に facility が指定されなかった場合に使用されるデフォルト値を決定する。
とある。更にその先に、
>facility
>facility 引き数はメッセージに記録されるプログラムのタイプを指定するために使われる。これによって異なるタイプの
>プログラムからのメッセージは異なる扱いをするように設定ファイル( syslog.conf(5) )に定義できる。
とあるな。そして更に、
>LOG_USER (デフォルト)
>一般的なユーザレベルメッセージ
とあるわけだ。
どこからLOG_NOTICEが出て来たのかと思えばその先のlevelの項じゃないか。
この程度の日本語が判らないのなら、小学生位から遣り直した方がいいぞ。
877デフォルトの名無しさん:2006/08/16(水) 15:27:09
>>867
main関数中のtest(c)による呼び出しでvoid test(char *hoge)のhogeにcの値がコピーされる。
test関数の中でhogeの値が変更される。
main関数中のcの値が変更されるわけではない。
test関数から戻ってもcの値は変更されていない。

>>869
main関数中のtest(c)による呼び出しでvoid test(char **hoge)のhogeにcの値がコピーされる。
test関数の中でhoge[0]からhoge[2]の値が変更される。
main関数中のcの値が変更されるわけではないが、main関数中のc[0]からc[2]の値は変更される。
なぜなら、test関数の中hogeとmain関数中のcは同じ値なので、
hoge[0]を変更することはc[0]を変更することに等しい。インデックス1,2も同様。
test関数から戻ってもcの値は変更されていない。
しかし、c[0]からc[2]の値は変更されているので、test関数の中での操作が反映される。
878デフォルトの名無しさん:2006/08/16(水) 16:13:20
ポインタが何を指しているのか、1つ1つprintfすれば分かるはず。特にmalloc前後。
879865:2006/08/16(水) 16:13:47
>>876
うーん、ちょっとわからないんですが、
syslog.confに
test.*   /var/log/test.log
って追加して、アプリからtest.logにログが出力されるようにするにはどうすればいいんでしょうか?
880デフォルトの名無しさん:2006/08/16(水) 18:35:59
>>877
867じゃないが便乗して質問
>main関数中のtest(c)
この部分で、関数にポインタを渡してるんじゃないの?
881デフォルトの名無しさん:2006/08/16(水) 18:49:25
引数で渡したポインタ変数 c と、
mallocで取得して値を代入したポインタ変数 hoge は別物
後者はコピーされたヤツ

これでおk?
882デフォルトの名無しさん:2006/08/16(水) 19:32:25
申し訳ないがおkじゃない

>後者はコピーされたヤツ
これがよくわからない。

hogeとcのアドレスは同じ
で、同じアドレスを指す変数のうちの片方の値を変更したら、もう片方も変更されてる(ように見える)
従って、hogeの値を変更したらcの値も変化する

どこが間違ってるの?
883デフォルトの名無しさん:2006/08/16(水) 19:46:29
test中のhogeとmain中のcのアドレスは違う。
test(c)でtestに制御が渡った時点で、
cの内容がhogeにコピーされてhogeの内容とcの内容が同じになるだけ。
だから、test中でhogeの内容を変更してもcの内容とは無関係になる。
884デフォルトの名無しさん:2006/08/16(水) 19:56:28
hogeとcは同じアドレスを指す変数ではあるが、違うところに格納された変数
片方の変数の値を変えてももう一方の値が変わるわけではない
ポインタ変数の値とポインタ変数そのもののアドレスとを混同しないように
885デフォルトの名無しさん:2006/08/16(水) 20:06:14
hogeのアドレスは関数に入った時点ではcと=だが、mallocで確保したメモリを指すアドレスを代入した時点で≠になる
886デフォルトの名無しさん:2006/08/16(水) 20:15:37
>>884
自身の読解力のなさが情けない・・・
int *ptr; と宣言したとき、 &ptr が違う場合は ptr が同じであっても *ptr が違う可能性がある
ということですか?
887デフォルトの名無しさん:2006/08/16(水) 20:17:44
困ったときのtypedef
888デフォルトの名無しさん:2006/08/16(水) 20:21:12
>>886
同じとか違うとかいうときは「何と何が」って言わないと駄目だろ。
日本語しっかりな。
889デフォルトの名無しさん:2006/08/16(水) 20:34:13
int *ptr1,*ptr2;
と宣言したとき
&ptr1!=&ptr2
であれば
ptr1==ptr2
であっても
*ptr1!=*ptr2
となる可能性がある、ということですか?

・・・すみません、C言語の前に日本語から勉強してきます λ...
890デフォルトの名無しさん:2006/08/16(水) 20:35:19
住所(アドレス)を書いたメモ(ポインタ変数)をコピーして渡して(関数引数)
コピーしたメモを書き換えても元のメモの内容は変わらない。
891デフォルトの名無しさん:2006/08/16(水) 20:40:44
ここまでの流れでひとつ気になってることがあるんだが、867は値渡しじゃなくて参照渡しだよな?
868とか877とか読むと値渡しの様に書かれているから ? と思っている次第。
892デフォルトの名無しさん:2006/08/16(水) 20:43:56
>>891
値渡しだよ。参照渡しなら
void test(char *&hoge)
となる。
893デフォルトの名無しさん:2006/08/16(水) 20:45:20
main関数でtest(c);を呼び出したときにcのアドレス(例えば100とする)が
void test(char *hoge)のhogeにコピーされる

つまりこの時点でcとhogeのアドレスは同じ100となっているが指しているアドレスが同じなだけで実際には全く別の変数
だからtest関数でhoge=malloc(sizeof(char) * 5);(mallocで確保したメモリのアドレスを400とする)を実行すると
cの指しているアドレスは100のままだが
hogeはmallocで確保された400というメモリのアドレスが代入されるのでcとhogeの指すアドレスが変わる

だからこの状態でhogeの指す400番地の中身を変更してもcの指す100番地の値は変更されない


不自由な日本語で書いてみたけど
書いた後にこんなの理解できるわけがないということに気づいた
894デフォルトの名無しさん:2006/08/16(水) 21:01:01
つまりは>>885
895デフォルトの名無しさん:2006/08/16(水) 21:50:36
   [hoge]
    ↓
 [c]→5

ここで、*hoge = 3 とすると・・・

   [hoge]
    ↓
 [c]→3

-------------------------------
上の図のように、*hoge を書き換えると、*c の値も変わる。
が、今回は、*hoge ではなく hoge の値を変更している。
-------------------------------

hoge = malloc (略 とすると・・・

   [hoge]→□

 [c]→5

*hoge = 3 とすると・・・

   [hoge]→3

 [c]→5

-------------------------------
*c の値は変わっていない。
896デフォルトの名無しさん:2006/08/16(水) 22:32:40
一度アセンブラやってみるといいかもネ
897デフォルトの名無しさん:2006/08/16(水) 22:37:12
while(1){
  Sleep(500);
  if(stat("a.txt", &st)==0)break;
}
こういうa.txtがあるかどうかをチェックし続けるプログラムは
HDDに負荷がかなりあるものなんですか?
898デフォルトの名無しさん:2006/08/16(水) 22:40:24
>>897
人手によるポーリングや OS からのイベントなどを使うのに比べたら
負荷が高いだろうね。
899デフォルトの名無しさん:2006/08/16(水) 22:47:34
>>897
やってみりゃわかる。
900デフォルトの名無しさん:2006/08/17(木) 00:05:07
stdinから入力を受け取ってメモリ上に保持する方法で悩んでいます。
メールデーモンからstdin経由で次のようなメッセージがわたってくるのですが、これをなんとかメモリ上に格納して
加工したいというのが趣旨です。一行の文字数がよくわからないので
行・列ともに動的にメモリを確保したいのですが、なかなかうまくいきません
入力値はこんな感じです。
 可変の文字数(横)x 可変の行数(縦)
最初は一行の横の長さをfgetcで改行文字までの文字数をカウントして
同じ行を、その長さ分mallocしたポインタに格納してfgetsすればいいだろう・・と思ってたのですが、
fgetcする時点でstdinの現在位置が変わってしまうようで、続けてfgetsすると次の行をgetしてきてしまいます。
rewindとかfseekしてstdinの位置がファイルのように戻るかなと思ったのですがだめでした。
こういう場合は、リストで横と縦を作ったほうがいいのでしょうか?
#include <stdio.h>
#include <stdlib.h>
int main(){
int i = 0;
char ch;
char *line_p;
/* 一行の長さを数える */
while(ch = fgetc(stdin)){
i++;
if(ch == '\n'){
break;
}
printf("%c",ch);
}
printf("%i",i);
/* 一行の文字数をmallocで確保してその行をポインタの先に格納する。*/
line_p = malloc(i+1);
fgets(line_p,i+1,stdin);
printf("%s",line_p);
return (0);
}
901デフォルトの名無しさん:2006/08/17(木) 00:09:10
>>900
最初に malloc() したのより長くなったら realloc() などを使って
バッファを取り直せばいい。
902デフォルトの名無しさん:2006/08/17(木) 00:20:34
まったくの初心者で申し訳ないですが

10
20
30
40
50

のようになっているファイルがあるとして
3行目の30を60に書き換えるにはどんな方法でやればいいんでしょうか?
書き込むことは出来たんですけど、5行全てが消えて60になってしまったりして
うまく出来ません
903デフォルトの名無しさん:2006/08/17(木) 00:26:30
>>902
簡単な方法
ファイルを1行ずつ読んで行って、30なら60を他のファイルに
一行書く。その他ならそのまま一行書く。
読んだファイルを削除して、書いた方のファイル名を変える。
904デフォルトの名無しさん:2006/08/17(木) 01:04:52
>>903
fgetsとfputsでやってみましたがうまく出来ません。
上の二つで問題ないでしょうか?
905デフォルトの名無しさん:2006/08/17(木) 01:08:18
まぁ、コードを晒せ。
906デフォルトの名無しさん:2006/08/17(木) 01:15:00

FILE *f1;
FILE *f2;
if((fold = fopen("a.txt","w"))==NULL)return 0;
if((fnew = fopen("b.txt","w"))==NULL)return 0;
for(int i=0;i<4;i++)
{
fgets(buf,256,f1);
fputs(buf,f2);
}
fclose(f1);
fclose(f2);

こんな感じなんですけど、どうでしょうか
907デフォルトの名無しさん:2006/08/17(木) 01:17:31
>>906
で、なにがうまく出来なかったの?
一見しておかしいのは buf の宣言が見えないことと
fold のモードが "r" じゃないことぐらいかな。
908デフォルトの名無しさん:2006/08/17(木) 01:20:46
>>907
出来たファイルが・・・・・・・・
になってました。一応bufは前で宣言してあります
909デフォルトの名無しさん:2006/08/17(木) 01:21:54
>>906
fgets() と fputs() にもエラーチェック入れろよ。
fclose() は、微妙だけどうまく動かないんなら入れてみるのがいいだろう。
んでエラーが発生したら perror() とかするといいよ。
910デフォルトの名無しさん:2006/08/17(木) 01:22:36
>>909
分かりました やってみます
911デフォルトの名無しさん:2006/08/17(木) 01:35:09
>>909
読み込みのfclose()は事実上不要、書き出しのfclose()はfputs()と同様に。
#前者は安全にクローズするだけ、後者はバッファのフラッシュ(=実際の書き出し)が行なわれる。
912デフォルトの名無しさん:2006/08/17(木) 01:45:29
出来ました。他の変数がbufのところまで使ってたみたいです。
教えていただいてありがとうございました
913デフォルトの名無しさん:2006/08/17(木) 23:04:16
class Testclass{
private :
int x;
public :
void show();
void change(Testclass *target);
Testclass(int a);
};

Testclass::Testclass(int a){
x = a;
}

void Testclass::change(Testclass *target){
target->x = 3;
}

int main(){
Testclass t1(1);
Testclass t2(2);
t1.change(&t2);
}

上記のコードがコンパイルできてt2.xが3になるんですが、
privateメンバーのt2.xがt1.change()から書き換えられる理由がわかりません。
クラスに属さない関数や他クラスのメンバ関数で同じ事するとコンパイルエラーだったんですが。
914デフォルトの名無しさん:2006/08/17(木) 23:06:00
>>913
クラスに属した関数で、同クラスのメンバ関数だから。
915デフォルトの名無しさん:2006/08/17(木) 23:13:02
同じクラスのメンバなら、別のインスタンスであってもprivateにアクセスできるってことだな。


……こう書くとなんだかアレな内容に聞こえる。
916デフォルトの名無しさん:2006/08/17(木) 23:22:10
多重継承のサンプルソースです、メインプログラムの部分の
b o;
この記述は何を意味するのでしょうか?
class a1
{
public:
void foo()
{
System::Console::WriteLine("a1.foo");
}
};
class a2
{
public:
void bar()
{
System::Console::WriteLine("a2.bar");
}
};

class b : public a1, public a2
{
};

int main(array<System::String ^> ^args)
{
b o;
o.foo();
o.bar();
return 0;
}
917913:2006/08/17(木) 23:23:49
どうも納得行かなかったんで質問してしまったんですが、
「そういう仕様だから」で済むような話だったんですね。すいませんでした。
918デフォルトの名無しさん:2006/08/17(木) 23:26:24
>>916
class b 型の変数 o の定義。
919デフォルトの名無しさん:2006/08/17(木) 23:45:02
>>918サンクス
oはclass b 型のインスタンス(実態)と解釈してもいいですよね?

920デフォルトの名無しさん:2006/08/17(木) 23:47:46
>>918 いいよ
921デフォルトの名無しさん:2006/08/17(木) 23:57:12
>>919
実体だよな?
という突っ込みは置いといて、インスタンスはふつーインスタンスと言うからな。
922デフォルトの名無しさん:2006/08/18(金) 12:31:12
>>916
> int main(array<System::String ^> ^args)

これ、ほんとにC/C++か?
923デフォルトの名無しさん:2006/08/18(金) 12:35:47
C++/CLI臭いな
924デフォルトの名無しさん:2006/08/18(金) 13:20:04
しかし肝心の質問はC++の範囲だな。
925デフォルトの名無しさん:2006/08/18(金) 14:07:04
ref class だと多重継承は出来んからね。
強制はしないけど、C++とC#(かVB)を理解してからC++/CLIに手を出したほうがいいと思うよ。
926デフォルトの名無しさん:2006/08/18(金) 14:24:26
C++/CLI C/C++プログラマ向け
C# Javaプログラマ、初心者向け
VB.NET VBプログラマ向け
J#、J++ うんこ
927デフォルトの名無しさん:2006/08/18(金) 17:57:05
もしかしたら、916はC++の勉強をするつもりでVC++を使っているが、
VC++のプロジェクトを作るときに、Win32コンソールプロジェクトを選ばなかった(知らなかった)だけ
ということかもしれないと思う。
928デフォルトの名無しさん:2006/08/19(土) 02:52:40
その勢いでC++/CLIの勉強を進めてった方が高収入に繋がるのかもしれんなー。

いや、わかんないけど。
929デフォルトの名無しさん:2006/08/19(土) 19:59:27
紹介されて着ました


C言語で
float a;
a=5.0/4.0;



float a;
a=5/4;

に差があると聞いたのですが、理由が分かりません
どなたか教えてください
930デフォルトの名無しさん:2006/08/19(土) 20:06:07
>>929
5.0 や 4.0 の型は double 。 double/double の型は double 。なので
5.0/4.0 は小数点以下も double の精度で結果が得られる。
つまり a = (float)1.25 になる。

5 や 4 の型は int 。 int/int の型は int 。なので
5/4 は結果の小数点以下が切り捨てられて 1 になる。
つまり a = (float)1 になる。
931929:2006/08/19(土) 20:48:22
>>930
返答有難う御座いました
intが整数型なのは分かるのですが、doubleとfloatの違いが分かりません
そこも教えていただけますでしょうか?
932デフォルトの名無しさん:2006/08/19(土) 20:55:22
>>931 ちょっとは調べてから聞こうな。
933916:2006/08/20(日) 07:09:25
すみませんでした、白状しちゃいます
実は只今、Native C++も正確に理解できてないのにC++/CLIの勉強を始めてしまいました
今読んでいる本が、C++、C++マネージ拡張、C++/CLIのソースを対比させながら、
書いてあるのでこんなサンプルが載っていました、
>925の指摘通り
変更前
o.foo();
o.bar();
変更後
((a1*)&o)->foo();
((a2*)&o)->foo();
このように、a2クラスのbarメソッドをfooメソッドに名前を変更したとたんバッティングが
生じることも確認しました。やはり、C++をしっかり習得してから向かった方が身に付くし
C++/CLIも結果早く習得できるんでしょうね、C++お勧めの本がありましたら教えてください。

934デフォルトの名無しさん:2006/08/20(日) 11:19:03
実に稚拙な質問でスマソ
C/C++の文献等で、キャストという言葉がよく使われますが
「変換」と理解したらいいでしょうか?

935デフォルトの名無しさん:2006/08/20(日) 11:38:00
>>934
変換だけだと、ちょっと意味が会わない。
プログラマが(自らの責任で)明示的に指定する変換と覚えておくといい。
936デフォルトの名無しさん:2006/08/20(日) 12:16:09
日本では、型変換全般をキャストって言うね。「暗黙のキャスト」なんていう使われ方もする。
英語では、implicit type conversionのことは、普通coercionと言う。(implicit castという人もいる)
937デフォルトの名無しさん:2006/08/20(日) 12:29:43
>>934
>>935
サンクス、
だからcastを直訳してもそれらしき意味ではなかったんだ、納得シマスタ。
938デフォルトの名無しさん:2006/08/20(日) 15:37:42
cast を「(計算して、狙って)投げる」っつー意味で、
ある型から狙って別の型に変換するという感じ。
939デフォルトの名無しさん:2006/08/20(日) 15:38:22
typo った。

×cast を
○cast は
940デフォルトの名無しさん:2006/08/20(日) 15:50:35
>>938
そりゃ無茶だ。元は「鋳造」の意味からきてるんだろう。
941デフォルトの名無しさん:2006/08/20(日) 15:59:35
鋳造も結局は狙って作るっつーことだと思うが。
942デフォルトの名無しさん:2006/08/20(日) 16:14:51
「狙って投げる」と言うよりは「型に嵌める」ってこった。
943デフォルトの名無しさん:2006/08/20(日) 16:24:58
>>938
どうみても簡易辞書を引いて出てきた訳をこじつけただけだろ。
覚え方として使えんわけではないが、人に教えるのは恥ずかしいことだ。
944デフォルトの名無しさん:2006/08/20(日) 16:29:39
cast
1.a <物>を投げる、ほうる(throw)

つまり、キャストとスローは同じ意味だ!!!
945デフォルトの名無しさん:2006/08/20(日) 16:38:09
>>943
ある単語の意味ってのは連想で広がって行くもので、
複数意味があるように見えても、根っこは同じなのが普通だ。
全く関連性のない意味が1つの単語に押し込められてるっつー事態の方が
異常な事だとは思わないか?
946デフォルトの名無しさん:2006/08/20(日) 16:49:41
castってtypecastから来てるんですけど
947デフォルトの名無しさん:2006/08/20(日) 16:55:04
>>945
cast も根っこは同じなんだろう。なんにせよ >>938 を正当化することにはならん。
948デフォルトの名無しさん:2006/08/20(日) 17:35:24
だから、「型に嵌める」だろ。
949デフォルトの名無しさん:2006/08/20(日) 18:18:01
cast new NullPointerException();
投げてないから桶だよな?
950デフォルトの名無しさん:2006/08/20(日) 19:06:00
細かいことを考えたらきりがないだろうけど、俺はcastを型変換と言っている。
それが通じる限り基本的に言葉は日本語訳されたものを使いたいので。
951デフォルトの名無しさん:2006/08/20(日) 20:58:11
>>950
しかし文脈によっては暗黙の型変換と紛らわしいからなぁ。型適用とでも言うか?
自分はC++者なんで最初からスタティックキャスト、コンストキャストと言うけど。
952デフォルトの名無しさん:2006/08/20(日) 21:20:47
cin.getline(buf,200)は、fgets(buf, 200, stdin)
と同じような感じだと思いますが、
cin.getlineの戻り値でどういう時がエラー
とかありましたら教えてください。
953デフォルトの名無しさん:2006/08/20(日) 21:50:53
すみません。今、CUIオセロのゲーム作っているんですが躓いてしまいました。
一応交互にゲームは出来るんですが、すでに石を置いてあるところにも置けてしまうし、
ひっくり返せないところに置くこともできてしまいます。
上のような場合はwhileかdoで繰り返したら出来るかなと思ってやってるんですがなかなかうまく出来ません。
もしここに汚いソースですが載せたらご教示いただけますか?
954デフォルトの名無しさん:2006/08/20(日) 21:51:02
>>947
cast の最も基本的な意味は計算して投げるって意味なんだから、
他の意味はそこからの派生と考えるのが自然だろ。
そこまで違うと言うからには、何か根拠でもあるのか?
955デフォルトの名無しさん:2006/08/20(日) 21:53:50
英単語の基本的な意味なんかどうでもいい。
956デフォルトの名無しさん:2006/08/20(日) 22:18:40
>>953
難しいだろうね。一通りうごくんならソースもそれなりの量だろうし。見るのは面倒。
スレにだらだらソース貼るのは超迷惑。

ソースをアップローダに置いて、リンク貼るだけならあんまり迷惑じゃないし、
やってみてもいいんじゃないかな。ただし、返答が無くてもあたりまえなんだから、
文句は言わないこと。あと、汚いと自覚してるんだったら、礼儀として
すぐ出来る整形ぐらいはしとくことだ。多少は見てもらえる可能性が上がるだろう。
957デフォルトの名無しさん:2006/08/20(日) 22:26:10
>>952
iostream のエラーはストリームオブジェクトの中に記録されている。
で、 good() とか fail() とか、いろいろテスト方法がある。
cin.getline() の戻り値は istream& だから。そいつらを使う。
958デフォルトの名無しさん:2006/08/20(日) 22:30:20
ttp://up2.viploader.net/mini/src/viploader62329.zip
出来るだけ綺麗にしました。
わかる方よろしくお願いします。
959953:2006/08/20(日) 22:32:23
続けてすみません。
>>958>>953のソースです。お願いします。
960デフォルトの名無しさん:2006/08/20(日) 22:35:05
>>957
分かりました。ありがとうございました。
961デフォルトの名無しさん:2006/08/20(日) 22:50:54
>>953
入力を受け付ける前に、全64マスの評価(石を置いた場合、いくつ取れるかを計算)して、評価値が0のマスが指定されたら再入力
…とかかな。
で、その評価値は後でCPU思考につかう。


というか、コードそのものよりアルゴリズムが汚い。
962デフォルトの名無しさん:2006/08/20(日) 23:00:05
ぱっとみなのでまちがってるかもしれんが。
hantei() という関数が画面出力を受け持ってるのは信じがたい。
hantei2() は書き直し。 struct vec { int x, y } vectors[8] = {-1,-1},{0,-1},{1,-1},{-1,0},{1,0},{-1,1},...
てのをくるくるすれば8種類書かなくていいでしょ。
すでに石があるとこに置けるとか置けないとかはうpされたソースからはわからん。
963デフォルトの名無しさん:2006/08/20(日) 23:06:09
>うpされたソースからはわからん。
と書いたが、これで全ソースなんだったら言い直す。hantei2()が読む気しないのでわからん。
964デフォルトの名無しさん:2006/08/20(日) 23:12:29
hantei()がhentai()に見えて仕方がない
965デフォルトの名無しさん:2006/08/20(日) 23:19:44
>>958
俺も読む気になれなかった。
966デフォルトの名無しさん:2006/08/20(日) 23:33:42
>>964
俺書き込んだっけ?
967デフォルトの名無しさん:2006/08/20(日) 23:36:24
cout.putline(""); みたいな、
cin.getlineとは反対に1行出力できるのはないでしょうか。
968デフォルトの名無しさん:2006/08/20(日) 23:38:25
puts
969デフォルトの名無しさん:2006/08/20(日) 23:40:34
cout << "" << '\n';
970953:2006/08/20(日) 23:52:56
みなさん回答ありがとうございます。
hantei2は石を置いてその石(黒)から上下右・・右下、左下と順番に見て行ってもし
間にひっくり返せる石があったら色を白にするというものを黒石用と白石用で分けているだけです。
あとこれで全ソースです。
971デフォルトの名無しさん:2006/08/20(日) 23:58:56
黒番と白番を別々に書くのもやめろ。who = !who で0,1を切り替えるんだ。
宿題とかでなく、自主的にオセロ作ってるのならおまえには見込みがある。
ソースはむちゃくちゃだがな。
972デフォルトの名無しさん:2006/08/21(月) 00:01:09
デバッグも出来ない奴に見込みなんて無いよ
973953:2006/08/21(月) 00:04:36
>>971
昨日から作っているんですが、なかなかうまく行かないものなんですね・・・
まだまだ私の知らない表現方法がある見たいですし>>961さんが仰る方法で作れるような気もしますが、
もうちょっと汎用性に優れたのを作って見ます。
宿題ではないんでゆっくり頑張ります。
他にもご指摘ありましたら是非ご教示下さい。お願いします。
974デフォルトの名無しさん:2006/08/21(月) 00:10:14
>>972
【初心者歓迎】 ソース見れば初心者は明らか。
初心者がなにかやろうと思ってとにもかくにもあそこまで書いたなら素質はじゅうぶんだと思うね。
975967:2006/08/21(月) 00:15:09
ありがとうございます。

>>968
コンパイラはbccですが、
putsはofstreamのメンバではないとでます。

>>969
<< >>は使いたくなくて、それに変わるのを探していました。
976デフォルトの名無しさん:2006/08/21(月) 00:15:57
GUIライブラリを作ってみたいのですが、どう作っていいのかわかりません。
何か参考になるものは無いでしょうか?


環境はVC2005EEです。
977デフォルトの名無しさん:2006/08/21(月) 00:17:27
初心者は途中で投げ出す人が多いからね。
978デフォルトの名無しさん:2006/08/21(月) 00:19:41
>>975
<<, >> の替わりは無いよ。使いたくないなら iostream 系自体を使わないほうがいいよ。
979デフォルトの名無しさん:2006/08/21(月) 00:19:45
>975
<cstring>のputs()グローバル関数
980デフォルトの名無しさん:2006/08/21(月) 00:35:03
>>976
GUIライブラリって何だ?
981975:2006/08/21(月) 00:36:15
ありがとうございます。
.writeというのはあって、一応代用できそうです。

>>978
ホントそうかもしれません。Cの感覚が抜けなくて。

>>979
調べてみます。
982デフォルトの名無しさん:2006/08/21(月) 00:41:24
>>953
masu[8][8] は外部変数にしてしまえ。関数に分けやすくなる。
ほんとは struct board { int masu[8][8]; }; みたいなの作ってこれを引数渡しに
するのがベストだけど今はどっちでもいいと思う。
983デフォルトの名無しさん:2006/08/21(月) 01:16:10
途中で投げ出さないことはいいことだ。
だが、それを考慮しても>>953はオセロ投げて
勉強しなおした方がいい気がする。
984デフォルトの名無しさん:2006/08/21(月) 02:44:48
>>958のソースが独創的で俺には読めないから修正を加えてみた。
ついでに置石のチェックも入れといた

一応参考程度に
http://up2.viploader.net/mini/src/viploader62429.zip
985デフォルトの名無しさん:2006/08/21(月) 02:53:29
文句のないソースだが953のやる気を激しく削ぎ落としたに違いないw
986デフォルトの名無しさん:2006/08/21(月) 03:09:29
初心者歓迎と書かれたスレタイに安心してやってきた>>953
ケチョンケチョンに言われて泣きながら去っていきました。
987デフォルトの名無しさん:2006/08/21(月) 03:13:19
>>986
いやいや、俺たちなりの愛のある歓迎なんだぜ。
ソースへの批判というのは、その人の能力を引き上げる最大の要因と思うしな。
988デフォルトの名無しさん:2006/08/21(月) 05:08:48
oseroって何だよw
リア厨か?
989デフォルトの名無しさん:2006/08/21(月) 09:12:46
riba-shiにすべきだよな
990デフォルトの名無しさん:2006/08/21(月) 10:41:14
ttp://up2.viploader.net/mini/src/viploader62535.zip
出力がうまくいかないんですが原因は何でしょうか?
VC++でc++で作ってます。
991デフォルトの名無しさん:2006/08/21(月) 10:50:15
>>990
オセロ以上の汚いソースで見る気がしない。
992953:2006/08/21(月) 10:54:50
>>984
ありがとうございます。
こんなに短く作れるんですね。私もこういうの作れるように頑張りたいと思います。
993デフォルトの名無しさん:2006/08/21(月) 14:41:30
>>990
汚いというより、設計がヘタすぎて見てらんない。
この程度だとやりたいこと聞いて、自分で書いたほうが早そうだ。
994デフォルトの名無しさん:2006/08/21(月) 15:38:09
ポインタ変数同士の引き算は許されると習ったのですが、

float f,g,h,*x,*y,*z;
x=&f;
y=&g;

でz=x-yが誤りなのが分かりません。どなたか教えてください
995デフォルトの名無しさん:2006/08/21(月) 15:47:48
俺もわからん。
996デフォルトの名無しさん:2006/08/21(月) 15:52:58
>>994
その場合ポインタ同士の引き算はポインタ間の距離になるので、ポインタ変数には代入できません。
詳細は改めて次スレででも聞き直してくれ。
997デフォルトの名無しさん:2006/08/21(月) 15:56:14
>>994
ポインタ型同士の演算結果はポインタ型じゃないからだ
ポインタ型の演算結果がポインタ型になるのはポイント型に序数の加算か減算をした時だよ
998デフォルトの名無しさん:2006/08/21(月) 15:57:24
ポインタ ± 要素数 → ポインタ
ポインタ ± ポインタ → 要素数
999デフォルトの名無しさん:2006/08/21(月) 16:21:32
>>998
おいこら、ポインタ同士の加算はねぇぞ。
1000デフォルトの名無しさん:2006/08/21(月) 16:32:56
【初心者歓迎】C/C++室 Ver.30【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1156145524/
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。