[表示 : 全て 最新50 1-99 101- 201- 301- 401- 2chのread.cgiへ]
Update time : 01/28 12:32 / Filesize : 120 KB / Number-of Response : 460
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


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

スレを勃てるまでもないC/C++の質問はここで



1 名前:デフォルトの名無しさん mailto:sage [2006/12/30(土) 20:07:25 ]
スレを勃てるまでもない低俗なC/C++の質問はここでお願いします。

252 名前:デフォルトの名無しさん mailto:sage [2007/01/30(火) 21:58:00 ]
>>248
自然言語で読みやすいように書かない香具師はカス。
Ex.
if (NULL = fp) ...

253 名前:デフォルトの名無しさん mailto:sage [2007/01/31(水) 07:54:30 ]
>>252
それはコンパイルエラーだろ…常識で考えて。
if(NULL == fp)って書きたかったんだろうけどさ。

俺はいっつも右辺にリテラルを入れる派。

254 名前:デフォルトの名無しさん mailto:sage [2007/01/31(水) 08:41:40 ]
>>253

252の挙げている例は、

==を間違って=にしてしまっても、コンパイラがエラーを出してくれるので安全だから、定数は左辺に書け

という、コンパイラが警告を出さなかった時代の人達のクソッタレなコーディングルールを、
今だに実践しているダメな人のことを言っているのだと思うよ。

255 名前:デフォルトの名無しさん [2007/02/01(木) 22:04:13 ]
C++勉強始めて一週間ほどの超初心者なんですが、
定数(const)ってしっかり覚えた方が良いでしょうか?
それとも あ〜そんなのあったね。くらいで良いでしょうか?
そりゃ覚えるにこした事は無いと思いますが、なんかイマイチ頭に入らなくて

256 名前:デフォルトの名無しさん mailto:sage [2007/02/01(木) 22:05:31 ]
constごときでそんなに苦労するの?

257 名前:デフォルトの名無しさん mailto:sage [2007/02/01(木) 22:08:10 ]
覚えられなければ参考書とかグーグルで
すぐ答を引っ張り出せるようにはしておけ

258 名前:デフォルトの名無しさん mailto:sage [2007/02/01(木) 22:18:30 ]
ややこしいのもあるから
const char * const s = "ssssss";
とか
class M {
    int i;
  public:
    void setInt(int i) { this->i = i; }
    int getInt() const { return i; }
};
こういうのは後回しでもいいかもしれんね。

259 名前:デフォルトの名無しさん mailto:sage [2007/02/01(木) 22:31:54 ]
>>255
まだ、勉強始めて一週間ってことだったら、いますぐじゃなくてもいいとは思うけど。
でも、後からでもいいから const は絶対に覚えておけ。

260 名前:255 [2007/02/01(木) 23:01:13 ]
親切にお答えいただきありがとうございます。
定数は絶対に変えられない!程度に覚えておき、追々勉強していこうと思います



261 名前:デフォルトの名無しさん [2007/02/02(金) 00:20:10 ]
c++でグローバル領域において
const double TEISU = 0.05;
とかにして,VS2005でTEISUにマウスカーソルを合わせると
「static const double TEISU」
って表示されるんだけど,勝手にstaticを付けられてるってこと?

int型だとこうはならないんですけど

262 名前:デフォルトの名無しさん mailto:sage [2007/02/02(金) 01:09:58 ]
そんな感じ。
C++の名前空間内(含グローバル空間)でのconstはexternを付けない限りstaticと同じ内部リンケージを持つ。
(特に整数型において)ヘッダで初期化して定数として使えるようにするため。

263 名前:デフォルトの名無しさん [2007/02/02(金) 11:26:29 ]
あるn次元空間において、全ての点から遠くなるような点(最遠点)の効率のよい計算方法を探してます。
ただし、最遠点の範囲はそれぞれの軸で決まっていて、

例えば下図のような2次元空間上でこのように点があった場合、
赤点の位置を算出したいのです。

ttp://kjm.kir.jp/pc/?p=29115.gif
ttp://kjm.kir.jp/pc/?p=29117.gif

上の場合は、点が偏っているために範囲ぎりぎりの点が選択されてる様子で、
下は周囲に点が偏っているので中央が選択されてる状態です。

このような点を探索する場合は、
全ての座標において点までの距離を計算し、最も遠くなるような座標を求める、
みたいな総当たりで調べていくしかないのでしょうか。
それともなにか効率のよいアルゴリズムはありますか?

264 名前:デフォルトの名無しさん mailto:sage [2007/02/02(金) 13:42:23 ]
>>263
点に接する円の径を最大化するように円の中心点を範囲内にとればいいのかな?
最急上昇法を使うのはどう?
ローカルマキシマムに気をつけないといけないけど

265 名前:263 [2007/02/02(金) 15:24:35 ]
>>264
つまりこういうことでしょうか?

ttp://kjm.kir.jp/pc/?p=29123.gif
ttp://kjm.kir.jp/pc/?p=29124.gif

3次元以上に使えるのかが分からないのですが、ひとまず調べてみようと思います。
回答本当にありがとうございます。

266 名前:デフォルトの名無しさん mailto:sage [2007/02/02(金) 15:50:57 ]
点が疎な領域で風船(円)を膨らましていくイメージじゃないの?
3次元以上でも使える。

267 名前:デフォルトの名無しさん mailto:sage [2007/02/02(金) 16:02:02 ]
>>255
constがらみの文法は、わかりにくいですね。
他の人も言っているように、アンチョコを作りましょう。

頭の中に記憶しておく必要はないのです。
あやふやな記憶に頼ってコーディングをするのは、とても愚かな行為です。
(セキュリティのために、裸一貫でしか入退場できない場所での仕事は別だが・・・)

constはちゃんと理解して使えるようにならないと、
他者の書いたコードやライブラリを使うことができません。

>>258
自分はtypedefを使って、なるべくわかりやすくするよ。
typedefを勝手にやるな! というルールのところもあるけどね。



268 名前:264 mailto:sage [2007/02/02(金) 16:56:55 ]
>>265
言いたかった事は>>266
kjm.kir.jp/pc/?p=29126.gif
kjm.kir.jp/pc/?p=29127.gif
これはローカルマキシマムにはまった例
kjm.kir.jp/pc/?p=29128.gif

269 名前:デフォルトの名無しさん mailto:sage [2007/02/02(金) 21:09:52 ]
とりあえず適切に荒くマス目に区切って総当たりし、
その中から有望そうな部分についてマス目を細かくして総当たりし、
さらにその中から・・・

という具合に、ニュートン法みたいに繰り返していくのが無難そうよ。


270 名前:デフォルトの名無しさん mailto:sage [2007/02/02(金) 22:21:45 ]
配列の宣言において、要素数にキーボードから入力した値を用いるにはどうすればよいでしょうか?



271 名前:デフォルトの名無しさん mailto:sage [2007/02/02(金) 22:30:36 ]
配列は静的に確保しなきゃいけないから無理
vector使え

272 名前:デフォルトの名無しさん mailto:sage [2007/02/02(金) 22:51:59 ]
>>270

int int_array[
#include "CON"
];

これでおk。

273 名前:デフォルトの名無しさん mailto:sage [2007/02/03(土) 00:04:54 ]
>>270
// for C(99)
int num = キーボードから入力する関数();
AnyType_t array[num];
// for C++
// use std::vector.
// for (regacy)C
// try malloc() / free().

274 名前:270 mailto:sage [2007/02/03(土) 00:09:48 ]
>>271,272
ありがとうございます。
説明不足で申し訳なかったのですが、
C++ではなく、Cで実現させたいのですが、
>>271のおっしゃる通り不可能なのでしょうか?

275 名前:デフォルトの名無しさん mailto:sage [2007/02/03(土) 00:11:11 ]
>>274
>273

276 名前:デフォルトの名無しさん mailto:sage [2007/02/03(土) 00:22:00 ]
>>273,275
ありがとうございます。

初心者なもので、具体的に教えていただきたいのですが、
float型で変数nを要素数とするxという配列を作りたいときは

scanf("%d",&n);
float x[n];

でよろしいのでしょうか?
やってみたところ、

ここでは宣言はできない(関数 main )
定数式が必要(関数 main )

とのエラーが  float x[n];  の行に出てしまいました。
ご教授願います。

277 名前:デフォルトの名無しさん mailto:sage [2007/02/03(土) 00:33:06 ]
>>276
今時、8年も前の規格も満たせないような半端モノのCコンパイラではなく、真っ当なCコンパイラを使ってください。
それがいやなら、C++でも使ってください。

278 名前:デフォルトの名無しさん mailto:sage [2007/02/03(土) 00:53:05 ]
>277
すみません、フリーのBorland C++Compiler 5.5です。
月曜日に学校のVisual C++コンパイラでやってみます。

279 名前:デフォルトの名無しさん mailto:sage [2007/02/03(土) 00:55:42 ]
いや、一緒だから。

280 名前:デフォルトの名無しさん mailto:sage [2007/02/03(土) 01:03:41 ]
C99がまともにコンパイルできるコンパイラで身近なものはiccしかない。
部分的にサポートならgccでもよいが完全ではない。

こういう状態だから「C99は死んだ規格」と呼ばれる。



281 名前:デフォルトの名無しさん mailto:sage [2007/02/03(土) 01:34:13 ]
>>277
まともなコンパイラを教えてください

282 名前:デフォルトの名無しさん mailto:sage [2007/02/03(土) 03:47:23 ]
>>281
>280

283 名前:デフォルトの名無しさん mailto:sage [2007/02/03(土) 13:17:31 ]
>>280
>こういう状態だから「C99は死んだ規格」と呼ばれる。

でも、決して無駄にはならないハズ。
なぜならその屍をC++0xが乗り越えてくれるから。

284 名前:デフォルトの名無しさん mailto:sage [2007/02/03(土) 13:50:00 ]
なーんだ結局C++に乗っかかるつもりかよ。やめてくれ。
ただでさえ複雑怪奇なC++の言語仕様をさらに複雑にする気か。

まあC++0xは文法を複雑にするというより、足りない部分を補う
だけで、今の文法でも出来る事を焼き直すわけではないからな。

285 名前:263 [2007/02/03(土) 14:32:19 ]
>>266-269
回答ありがとうございます。
ローカルマキシマムも図で説明しただいてよく分かりました。
ひとまず269の方法で試してみたいと思います。

286 名前:デフォルトの名無しさん mailto:sage [2007/02/03(土) 19:03:10 ]
C++で他のアプリケーションの画面の色を取得したり、クリックしたりできますか?
できないなら言語は何がオススメですか?

287 名前:デフォルトの名無しさん mailto:sage [2007/02/03(土) 19:25:09 ]
それはC++かどうかよりもGUIのAPIもしくはライブラリの問題。

288 名前:デフォルトの名無しさん mailto:sage [2007/02/03(土) 20:31:25 ]
はいはい、HSPHSP

289 名前:デフォルトの名無しさん mailto:sage [2007/02/04(日) 14:53:13 ]
↓ですが、@がAとして認識されるということですが、
  私はAがどういう場合に使われるのかがわかりません。
  externで定義ってどういうことでしょうか?

大きな非互換項目の一つにconst型修飾子の取り扱いの違いがある。
C言語では記憶域クラス指定子を持たず、const型修飾されたファイル
有効範囲の識別子は、外部結合の識別子として取り扱われる。
一方、C++言語では内部結合の識別子として取り扱われる。
つまりC言語ではexternが補完されるのに対し、C++言語ではstaticが
補完されると考えればわかりやすい。多くのプログラマは、C言語での
プログラミングにおいて、extern型修飾子は、変数の外部参照宣言を行
なう時にのみ使用し、変数の定義においては使用していない。
この問題は、const型修飾子を使用している多くのプログラムで発生する
と予想される。

const int a=10;            @
(C言語で認識される型)
extern const int a=10;        A
(C++言語で認識される型)
static const int a=10;         B

290 名前:デフォルトの名無しさん mailto:sage [2007/02/04(日) 15:28:27 ]
>>289
どういうこともそういうことも、Cには昔const修飾子がなかったので
const int a = 10はint a = 10と同じスコープを持つしかなかっただけなんだが。



291 名前:デフォルトの名無しさん mailto:sage [2007/02/04(日) 15:48:37 ]
>>289
CでもC++でもグローバル変数の定義にはexternを付けてもいいんだよ。
/* hoge.h */
extern int foo; /* グローバル変数fooの宣言 */
extern int bar; /* グローバル変数barの宣言 */

/* hoge.c */
int foo = 4; /* グローバル変数fooの定義 */
extern int bar = 2; /* グローバル変数barの定義 */

292 名前:デフォルトの名無しさん mailto:sage [2007/02/04(日) 16:00:40 ]
定義に「付けてもいい」ってところがミソだな

293 名前:デフォルトの名無しさん mailto:sage [2007/02/04(日) 19:11:39 ]
>>290>>291
ご回答感謝します。
よくわかりました(助かりました)。

294 名前:デフォルトの名無しさん mailto:sage [2007/02/04(日) 19:12:09 ]
>>292
>定義に「付けてもいい」ってところがミソだな
どういうことでしょうか?

295 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 00:04:19 ]
>>289
> 私はAがどういう場合に使われるのかがわかりません。
C言語では(1)と(2)は同じだから、どっち使うか自由なので
(2)を使わなければいけない場面なんてないんじゃないのかな。

C++だと(1)は(3)の意味になる。
(3)では複数のファイルに同じものがあって無駄に感じるが
そんなの気にしないで(2)を使わず(1)を使うようだね。


296 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 00:10:04 ]
>>295
生半可な知識しかないなら回答しないでください。

>(3)では複数のファイルに同じものがあって無駄に感じるが
全くの思い違いです。

297 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 00:12:40 ]
>>296
そうでしたか。
ごめんなさい。

298 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 00:36:07 ]
C++で
複数のファイルに
const int a=10;
などがあっても
変数aというより値10が直接使われる。

複数のファイルに
const int a=10;
const int *p=a;
とした場合はそれぞれのファイルで異なるポインタのaが存在るんじゃないの。

299 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 00:37:44 ]
>>296
>無駄に感じる
どう感じるかは自由だ

300 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 01:09:35 ]
同じ定義を複数のファイルに書いたりしない。一個をインクルードするだろ。常識的に考えて。



301 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 02:02:43 ]
>>300
そういうこといっているんじゃないと思うが。

その通り実際にはヘッダファイルに書くけど
ヘッダファイルにstatic const int a=10;を書いて複数のファイルからインクルードするのと
複数のファイルにstatic const int a=10;を書きのとで
staticやexternの動作は変わらないでしょ。

それとも別の話?

302 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 14:30:40 ]
質問です、class Aを継承したclass Bが存在したとします。
class Aに仮想デストラクタが存在しない場合、class Bのデストラクタが呼ばれないと聞きました。
これは、常に真なのでしょうか? B Obj;などと動的に生成しなくても、デストラクタはやはり呼ばれないのでしょうか?

303 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 14:55:20 ]
>>302
A *obj = new B;
みたいな使い方した場合。
Aに仮想関数が存在しなければobjはすべてAとして動作するから、
デストラクタもAのデストラクタが動けばいいけど
仮想関数が存在した場合、objはBとして動作することがある。
そのときBの動作してAのデストラクタしか動かなかった場合、危険でそ?

B *obj = new B;
のように宣言するならちゃんとobjが破棄されたときにBのデストラクタが動くはず。
でもそんなリスキーなこと考えず、仮想メンバ関数のあるクラスには
virtualなデストラクタを置くのが常識。


304 名前:デフォルトの名無しさん mailto:sage [2007/02/06(火) 00:48:51 ]
>>300に同意
ま、スレの題名通りの流れだから良いけど。

305 名前:デフォルトの名無しさん mailto:sage [2007/02/06(火) 02:03:28 ]
>>300
そもそも、
複数のファイルに書かれた
static const int a=10;
が、同じ定義かどうかは、わからないぞ。

ファイル内のローカルスコープなわけで、
ファイルによって aの値は違うかもしれないし、
今は同じでも今後変るかもしれない。

306 名前:デフォルトの名無しさん [2007/02/06(火) 11:36:10 ]
blowfishをやろうと思っているのですけど、暗号化できません
#include <stdio.h>
#include "blowfish.h"
#include "blowfish.h2"
#define FilePath "text.txt"
#define Key "keyword"
#define BUF_SIZE 256

FILE *fp;
char buffer[] = "asdfghjk";
char newbuffer[255];

CBlowFish *blow = new CBlowFish;

blow->Initialize( Key, strlen(Key));
blow->Encode( buffer, newbuffer, BUF_SIZE);
delete blow;

fp = fopen(FilePath,"w");
fprintf(fp,newbuffer);
fclose(fp);
どこが間違っているのでしょうか?

307 名前:デフォルトの名無しさん [2007/02/06(火) 11:40:52 ]
質問です
メインで使うクラスにデストラクタの中で
終了時にメンバ変数の領域をdeleteにより手動で開放する
意味はあるのですか?

308 名前:306 mailto:sage [2007/02/06(火) 11:55:53 ]
すみませんけど、自己解決しました

309 名前:デフォルトの名無しさん mailto:sage [2007/02/06(火) 14:56:08 ]
>>307
確保したものは解放するのが当然。まして、「メインで使う」ことが何度もあるなら。

310 名前:デフォルトの名無しさん [2007/02/06(火) 15:11:02 ]
ではもう使わないんなら解放しなくてもいいですね



311 名前:デフォルトの名無しさん mailto:sage [2007/02/06(火) 16:15:41 ]
デバッガでメモリリークを検出するようにしてるような場合、
そういうことを適当にしてるとせっかく検出したリークを
見落とすようなことになる。
それに限らず、「もう使わないから」って理由で開放漏れを
容認しだしたら、本当に深刻なリークが発生したとき
あちこちに疑わしい箇所が散逸してて泣くことになると思うぞ。
一人で責任持てるなら良いかもしれんがチームのときは迷惑極まりない。

312 名前:デフォルトの名無しさん mailto:sage [2007/02/06(火) 17:23:21 ]
>>307
いや、さすがに冗談だよな……?

313 名前:デフォルトの名無しさん mailto:sage [2007/02/06(火) 17:28:58 ]
どうせOSが後始末をしてくれるし、終了処理してたら重くなるから
リリースバージョンではabortで終了する。という人もいるみたい。

314 名前:デフォルトの名無しさん mailto:sage [2007/02/06(火) 17:29:37 ]
free論争は秋田

315 名前:デフォルトの名無しさん mailto:sage [2007/02/06(火) 17:29:55 ]
まさか307はこういうことを言いたいのか?
class Hoge
{
public:
  ~Hoge() {delete &x;}
private:
  int x;
};

316 名前:デフォルトの名無しさん mailto:sage [2007/02/06(火) 17:42:06 ]
>>315
なんかおかしな事になりそうだから試したくないけど
それしたらどうなるの?


317 名前:デフォルトの名無しさん mailto:sage [2007/02/06(火) 17:49:39 ]
おそらく未定義の動作。どうなろうと標準規格の関与するところではない。
鼻から悪魔が(ryとよく言われるやつ。

318 名前:デフォルトの名無しさん mailto:sage [2007/02/06(火) 18:57:47 ]
同じオブジェクトを二回破壊しようとしたら実行時エラーでないか?

319 名前:デフォルトの名無しさん mailto:sage [2007/02/06(火) 19:34:00 ]
>>307じゃないけどデストラクタでdeleteするのってダメなんですか?
デストラクタって破棄される直前に呼ばれるんですよね?

320 名前:デフォルトの名無しさん mailto:sage [2007/02/06(火) 19:44:22 ]
メンバ変数がnewで確保されたものなら、デストラクタでdeleteするのは当然だが。



321 名前:デフォルトの名無しさん mailto:sage [2007/02/06(火) 19:52:51 ]
ああ、>>315をよく見て無かっただけですた
びっくりしたぜ、サーセン

322 名前:デフォルトの名無しさん mailto:sage [2007/02/07(水) 03:11:03 ]
>>316
おそらく何も起きない。

というのも、スタック上にあればdeleteは、
んなポインタ知らないよとスルーするし、
ヒープ上にあっても、
んなポインタ知らないよとスルーするから。

デバッグ版なら、変なポインタをdeleteするな、って叫ぶかもしれない。

だがしかし、実装依存であり、何が起きても泣かない覚悟が必要だ。

323 名前:デフォルトの名無しさん mailto:sage [2007/02/07(水) 03:59:03 ]
へ?最近のdeleteはそんな親切設計というか過保護設計というかになってるの?

324 名前:デフォルトの名無しさん mailto:sage [2007/02/07(水) 06:49:00 ]
というか、そういう過保護な実装が存在するのか?だな。

325 名前:デフォルトの名無しさん mailto:sage [2007/02/07(水) 07:55:33 ]
しないだろ。

326 名前:デフォルトの名無しさん [2007/02/07(水) 10:30:05 ]
クラスのメンバ変数についての質問です
グローバル変数としてビュークラスの外で宣言したクラスの
メンバ変数は0や空文字で初期化されてるんですが

そのクラスをビュークラスのメンバとして宣言するとそのクラスの
メンバ変数が初期化されないのはどうしてですか?


327 名前:デフォルトの名無しさん mailto:sage [2007/02/07(水) 10:43:10 ]
c++ 変数 初期化 の検索結果 約 145,000 件中 1 - 10 件目 (0.19 秒)

ぐぐったら見つかるだろ

328 名前:デフォルトの名無しさん [2007/02/07(水) 10:46:50 ]
>>327
わからないんなら答えなくていいよ

329 名前:デフォルトの名無しさん mailto:sage [2007/02/07(水) 10:58:04 ]
>>326
仕様です

330 名前:デフォルトの名無しさん mailto:sage [2007/02/07(水) 11:13:14 ]
>>326
向こうにちょっと書いたが・・・
グローバル変数はコンパイル時に場所を決定して0で初期化したブロックにできるが
ヒープの場合実行時に割り当てられるので、わざわざ0クリアするコードを入れるわけ
ではないので初期化はされない。

しかし期待した答えをもらえないからって文句言うな



331 名前:デフォルトの名無しさん mailto:sage [2007/02/07(水) 11:13:54 ]
ヒープの場合

ヒープやスタックの場合


332 名前:デフォルトの名無しさん [2007/02/07(水) 11:14:54 ]
すいませんありがとうございます

333 名前:デフォルトの名無しさん [2007/02/07(水) 19:07:36 ]
C++の勉強したいんですけど、
ゲーム作りしながら学べるような本はありませんか?
持ってるのはVisualC++の6.0なんですけど…。

334 名前:デフォルトの名無しさん mailto:sage [2007/02/07(水) 19:13:30 ]
www.kohgakusha.co.jp/books/detail/978-4-87593-295-6
ゲーム作りではじめるMFC

335 名前:デフォルトの名無しさん [2007/02/07(水) 19:28:10 ]
mallcoを使って二次元配列の領域を確保したんですけど,
その配列の値を他の関数に渡すにはどうしたらいいんでしょうか?

336 名前:デフォルトの名無しさん mailto:sage [2007/02/07(水) 19:43:56 ]
値で渡す場合は値渡しだね

337 名前:デフォルトの名無しさん [2007/02/07(水) 19:49:31 ]
>>335
たとえばintなら

int (*array)[10]; // int[10]型のポインタ変数array
array = (int (*)[10])malloc(sizeof(int) * 10 * 5); // int [5][10]
func(array[0][0]); // call

良く使うならint[10]型をtypdedef汁


338 名前:デフォルトの名無しさん mailto:sage [2007/02/07(水) 19:58:36 ]
337はfuncの引数がint*となっている場合だね。
void func(int [][10]);などと宣言されていれば、func(array)と呼べる。

339 名前:337 mailto:sage [2007/02/07(水) 20:11:41 ]
>>338
array[0][0]でちゃんと値を渡してるよ。
コンパイル通してみたから間違いないかと。

340 名前:デフォルトの名無しさん mailto:sage [2007/02/07(水) 20:28:09 ]
typedef版。要は配列の基底となる要素数を[10]です、と明示的に
宣言してやらないと領域だけあっても2元配列としては使えない。

typedef int ArrayType[10];
ArrayType *array;
array = (ArrayType *)malloc(sizeof(ArrayType) * 5); // int [10]を5個分
func(array[0][0]);




341 名前:デフォルトの名無しさん mailto:sage [2007/02/07(水) 20:53:06 ]
>>323
WindowsのVC++のdeleteは、不正なポインタを渡すとint 3してくれたと思う。

342 名前:デフォルトの名無しさん mailto:sage [2007/02/07(水) 20:55:49 ]
>>333
2つのことを同時にやろうとするのは無駄が多いよ。
C++とゲーム作りと、別々に勉強することをお勧めする。

C++の良い参考書はいくつもあるが、
↑と同レベルの、ゲームを作りながらC++を学ぶという本はないから。



343 名前:338 mailto:sage [2007/02/07(水) 21:31:32 ]
>>339
ごめん。337ではfunc(&array[0][0])と書いてあるかと勘違いした。

344 名前:デフォルトの名無しさん [2007/02/07(水) 23:52:01 ]
構造体をヘッダファイルに定義して適当にインクルードしたら
二重定義ということで怒られてしまいました。

#pragma once を使用することで解決しましたが、今まで
C言語をやっていて気になったことはありません。
コンパイルエラーになったのはC++ですが、C++でエラーになる
ようになったのでしょうか?
それともエラーにならなかったコンパイラが寛容だったということでしょうか?

345 名前:デフォルトの名無しさん mailto:sage [2007/02/07(水) 23:52:48 ]
お前がまともな規模のコードを書いてこなかっただけ

346 名前:344 mailto:sage [2007/02/07(水) 23:56:13 ]
>>345
規模と何の関係があるんですか?

347 名前:デフォルトの名無しさん mailto:sage [2007/02/07(水) 23:59:42 ]
>>344
C言語でもまともなコンパイラならエラーになる。
大きな規模のプロジェクトならば名前の衝突は経験することがあるはず。

348 名前:デフォルトの名無しさん mailto:sage [2007/02/08(木) 00:05:11 ]
>>344
Cでも「構造体をヘッダファイルに定義して適当にインクルードしたら二重定義ということで怒られ」ます。

349 名前:デフォルトの名無しさん [2007/02/08(木) 00:20:11 ]
>>348
今Borland C++ 5.5.1をダウンロードして試してみましたが全く
エラーになりません。

<struct.h>
typedef struct test_st
{ int a;
int b; }TEST_ST;

<main.c>
#include"struct.h"
void testFunc(void);
int main(void)
{testFunc();
return 0; }

<sub.c>
#include<stdio.h>
#include"struct.h"
void testFunc()
{ printf("Hello\n"); }

main.cとsub.cで2回構造体の定義(struct.h)をインクルード
していますがエラーにならずに実行できます。
ちなみにエラーになったのはVC++でC++を使ったときでした。
これはエラーにならないコンパイラが甘いということでしょうか?


350 名前:344 mailto:sage [2007/02/08(木) 00:21:08 ]
どうもVC++のバージョンを上げてから弾かれるようになったように
記憶しているのですが・・・



351 名前:デフォルトの名無しさん mailto:sage [2007/02/08(木) 00:24:54 ]
>>344
"piyo.h"というヘッダを作ったとします
そしたらヘッダ内に
#ifndef INC_PIYO_H
#define INC_PIYO_H
 ・
 ・
#endif /* INC_PIYO_H */
のような形の文を必ず書きなさい
そうすればと二重インクルードガードとなる

352 名前:344 mailto:sage [2007/02/08(木) 00:32:02 ]
>>351
いや、それは知っています。
それの代わりに#pragma onceでもいいってことも。

気になっているのはなぜ今までエラーにならなかったのかと
いうことです。
実際、さきほどbccで試したらエラーにならなかったし。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<120KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef