スレを勃てるまでもないC/C++の質問はここでat TECH
スレを勃てるまでもないC/C++の質問はここで - 暇つぶし2ch200:デフォルトの名無しさん
07/01/28 17:40:28
ちみの云う「自作」の概念がよく分からないな。
チミが作ったわけじゃねーから、みんな他作だろう?

201:デフォルトの名無しさん
07/01/28 17:47:16
ワロタ

202:デフォルトの名無しさん
07/01/28 18:08:28
>>184
なんか見ていてクラクラしてくるコードだなぁ。
サイズが固定なら配列を使ったほうがいいんじゃないか。

>>196
正しい日本語で。
qsortの使用例 と qsortの実装例 のどっちが欲しいの?

>>198
問題をしっかり切り分けよう。

ざっと乱暴に分けただけでも、
□ C++
□ OSのAPIのうち、ゲームで使うものについて
□ ゲーム特有のアルゴリズム
という3つに分けられる。

それぞれ独立した話なので、それぞれ別々に学んだほうがいい。

このスレで質問すべきなのは、
「Javaをある程度やった人にオススメのC++の教科書を教えてください」
ということだよ。

で、Javaを2年もやったのであれば、入門書的なのは無駄が多い。
まずは、↓のような簡単なものでいいので、CとC++の文法の概要を、軽く読む。
URLリンク(www5c.biglobe.ne.jp)
URLリンク(www5c.biglobe.ne.jp)
その上で、C++の有名な参考書群を読めば習得は速い。


203:196
07/01/28 18:21:24
>>202
すみません。実装例の方です

204:198
07/01/28 21:01:49
>>202
色々と詳しく教えていただきありがとうございます
とりあえず教えていただいたサイトを見て基本的な所を理解してから
参考書を購入して勉強しようと思います。
ありがとうございました

205:デフォルトの名無しさん
07/01/28 21:02:45
>>203
GNUのglibcとか、
マイクロソフトならVC++に付属のCランタイムのソースコードとか。


206:デフォルトの名無しさん
07/01/28 21:23:48
#include "DxLib.h"

struct CharaData{
int x;
int y;
int mae,hidari,migi,tama;
};

struct CharaData jikidata;

int jikinomuki=0;
int statusboard=LoadGraph("StatusBoard.png");

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow )
{
ChangeWindowMode(TRUE);// ウインドウモードに変更
SetGraphMode(600,480,16);//ウィンドウの大きさ
if(DxLib_Init()==-1) return(-1);//DXライブラリ初期化

WaitKey();
DxLib_End();//DXライブラリ終了
return(0);//終了
}


エラーがでてないのにウィンドウが表示されません。
PCの動作が重くなっているので実行はされてると思うのですが・・・
誰かわかる人いましたら解決策を教えてください OTL

207:デフォルトの名無しさん
07/01/28 23:37:23
ChangeWindowMode(TRUE);
SetGraphMode(600,480,16);
はDXライブラリの関数だろ?だったら
if(DxLib_Init()==-1) return(-1);//DXライブラリ初期化
の後に書くんじゃないか?
順序立てて考えて問題箇所を洗い出せ

208:デフォルトの名無しさん
07/01/28 23:41:39
int statusboard=LoadGraph("StatusBoard.png");

これはヤバいんじゃないか?
WinMainよりも前に実行されるぞ。

209:デフォルトの名無しさん
07/01/29 08:50:37
Choge hoge = new Choge();



Choge hoge;

は何が違うんでしょうか?

ヒープ領域とスタック領域の違いでしょうか?
どう使い分けたらいいでしょうか?

210:デフォルトの名無しさん
07/01/29 10:55:12
>>209
前者はdeleteする必要がある。
そのクラスが巨大でないのなら、後者で充分。
巨大であるとかクラスの特性上必要があるとかで前者を使うのなら、auto_ptrの使用を検討したほうがよりよい。

211:デフォルトの名無しさん
07/01/29 12:10:01
Choge* hoge = new Choge();

ではなくて

Choge hoge = new Choge();

なのであれば、それはメモリリークしている可能性があるよ。
Choge hoge ;
Choge* p = new Choge() ;
hoge = p ;
ただし、Choge::operator=(const Choge* p) が存在する、気持ち悪いクラスの場合だが。

212:デフォルトの名無しさん
07/01/29 13:14:13
>>211

>Choge hoge = new Choge();
>
>なのであれば、それはメモリリークしている可能性があるよ。

そもそもコンパイル通らないんじゃないか?


213:デフォルトの名無しさん
07/01/29 15:27:32
Cについて質問です。
double型変数をfprintfで小数点以下の有効数字全てを表示したいのですが、
どのようにすればよいでしょうか。

今は%.20leとか適当な数字で表示させています。
できれば%lfの形式で表示したいのですが。


214:デフォルトの名無しさん
07/01/29 16:30:09
>>213
%.20gじゃダメ? 値が適当な範囲ならf形式で出るけど。

215:デフォルトの名無しさん
07/01/29 17:53:53
#define isupper(c) ( (c) >= 'A' && (c) <= 'Z' )

↑これ、パラメータが2箇所で評価しているんですけど、
 問題ですか?普通に使えるような気がボクはするんですが...



216:デフォルトの名無しさん
07/01/29 18:05:21
>>215
ASCIIのようにアルファベットがリニアに並んでいる環境なら使えますね。
評価の副作用がある点に関しては、関数の引き数に副作用の起きるようなコードを書く香具師が阿呆なので
ドキュメントに明示してあれば問題ないでしょう。

217:デフォルトの名無しさん
07/01/29 18:15:26
>>216

>ASCIIのようにアルファベットがリニアに並んでいる環境なら使えますね。
>評価の副作用がある点に関しては、関数の引き数に副作用の起きるようなコードを書く香具師が阿呆なので
>ドキュメントに明示してあれば問題ないでしょう。

はい。ありがとうございます。
ついでで恐縮ですが、
副作用の起こる使い方ってどんな風な使い方ですか?

218:215
07/01/29 18:18:40
>>216-217
自己レスですみません。
isupper(c = getchar())
↑こういうことですね?


219:デフォルトの名無しさん
07/01/29 18:25:15
>>218
こういうのもです。
isupper(c++);

220:デフォルトの名無しさん
07/01/29 19:21:07
>>219
そういうことですか。
ありがとうございました。

221:デフォルトの名無しさん
07/01/29 20:31:59
まったくどうでもいことだが、範囲比較は想定される数直線的に並べるべきだと思う。
具体的には 'A' <= (c) && (c) <='Z'

222:デフォルトの名無しさん
07/01/29 20:51:30
>>221
全くどうでもいいことだが、比較対象を左辺に置くのが一般的だと思う。
#いや、どちらでもいいけどさ。

223:デフォルトの名無しさん
07/01/29 21:00:33
>>216
> 評価の副作用がある点に関しては、関数の引き数に副作用の起きるようなコードを書く香具師が阿呆なので

違う!

こういうのをマクロでやるのがアホ。
今時のコンパイラはインライン関数でも最適化されるので、副作用とか型チェックのないマクロを使う必要性はない。

224:デフォルトの名無しさん
07/01/29 21:26:36
>>223
↓こういったのはどうですか?

arrは配列のポインタを設定。
#define ARR_SIZE(arr) ( sizeof(arr) / sizeof(arr[0]) )


225:213
07/01/29 21:30:24
>>214
上手く表示できました。
ありがとうございます。


226:デフォルトの名無しさん
07/01/29 21:35:04
>224
それはポインタ突っ込んでドツボにはまる香具師が必ず出てくるので有名なマクロだな。
しかし、コンパイル可能な副作用のある式を突っ込むのは難しくないか?

まー、おいらはstd::vector使うからいーけどさ。

227:デフォルトの名無しさん
07/01/29 21:54:10
>>223
違う!

#define isupper('A'<=((c)%220%156%91))

こうするのが正しいやり方だ!

228:デフォルトの名無しさん
07/01/29 21:56:37
>>224
template でゴニョゴニョすれば代わりになるものが作れるけど、
これに関しては移植性の高いマクロのほうが好きだな。

229:デフォルトの名無しさん
07/01/29 21:58:56
>>227
('A'<=

頬に突き刺さってて痛そうだよな

230:デフォルトの名無しさん
07/01/29 22:03:09
これじゃ、アッパーじゃなくてフックだな。

231:デフォルトの名無しさん
07/01/29 22:27:09
>>224>>227
C++ならboost::sizeはだめか?<boost/range/size.hpp>

232:デフォルトの名無しさん
07/01/29 22:32:38
>>231
boost::size じゃ、>>227 の速度性能には及ばんだろ、多分。

# メンテナンス性は最悪だけど。

233:デフォルトの名無しさん
07/01/29 22:36:08
boost::sizeもO2あたりの最適化を書けてやれば定数に収束するんでねーの、たぶん。

234:デフォルトの名無しさん
07/01/29 22:46:13
>>233
一回しか比較を実施しないロジックに対し速度で対抗しようとしたら
あとはもうテーブルでも用意するぐらいしかないぞ。

235:デフォルトの名無しさん
07/01/29 22:56:53
比較と剰余のどちらのコストが高いかは議論たり得る。

236:デフォルトの名無しさん
07/01/29 23:03:11
じゃ、おいらは 
#define isupper(c) ((unsigned)((c)-'A')<26U))
で対抗しちゃる。

237:デフォルトの名無しさん
07/01/29 23:03:26
そうだな。一般的には剰余のほうが速いだろうけど、そうじゃない環境もあるかもね。

238:デフォルトの名無しさん
07/01/29 23:06:15
>>236
お、これなら環境を問わずに最速なんじゃね?

239:デフォルトの名無しさん
07/01/30 00:53:05
fgetcで読み込んだファイル(c)の文字を判定して印刷可能文字ならそのまま出力
それ以外なら空白を表示するプログラムを作っていたのですが
while((c = fgetc(fp)) != EOF){
if(isprint(c) != 0){
buf[n] = c;
n++;
            }
else{
buf[n] = ' ';
n++;
}
if(n % 16 == 0){
puts(buf);
for(n = 16;i >= 0;n--){
buf[n] = ' ';
}
n = 0;
}
}
この状態で出力すると16文字目の後にバグのような文字がでてきてしまいます。
いろいろ考えてみたのですが原因がわかりませんでした。どうにかしてこのバグを消す方法はないでしょうか?
Win XPでBorlandを使用しています。

240:デフォルトの名無しさん
07/01/30 00:55:43
連投失礼します。
for(n = 16;i >= 0;n--)ではなく for(n = 16;n >= 0;n--)
でした。よろしくお願いしますm(--)m

241:デフォルトの名無しさん
07/01/30 01:01:38
文字列の終端はナル文字をうめましょう。●4点

242:デフォルトの名無しさん
07/01/30 07:34:48
ぬるぽ

243:がっ
07/01/30 07:39:54
ちんぽ

244:デフォルトの名無しさん
07/01/30 09:00:18
                    _,ィ、  ,r、__
                ,.ヘー'´  i `´/  `i_
            /ヾ、 ヽ、 i /   /ヽ
              _ィ、〉   > ´ ̄  ̄ ` く  ,ゝ、
          }、 ,>'´        、  ヽ./`ヽ
          ┌! /    /  i 「`i   ヽヽ ヽ   }
            Y     !   | |  l i i   l i  ',__,.ゝ
          ,'     |  | |   !l l   | l  l !
           i   !   |   | |   | j___j |  |i i!
           |i!  l  ,.|‐T丁i!   ハlj, --!`トlノ、||
           | !  !  レ'i´ミj    "i´ミ iヽ, i ||  _
           | l  |i   iバ__ソ     L__ソ /.ノ |! _ヽ)
           | |  |l  |、//// '  ///// |! |i ヽ)
           !ハ |!  |,ゝ' ´ ̄ ̄ ` く  レy'|!
          __,ノ レ'ヽiハ /             \}'´ ̄ `ヽ、
    ィ´ ̄/    ,べY                   Y`i__    \
    〉/    / , 、ヽ             /_`ヽ\    \
   ,ィ'ん、  / ! '´__ ヽ             /´__,.` ', \   ァ'`
   `ヽ、/ー'   /!   __`ヾ!           レ'´ _,.  !   \ i
    /ー-ィ、 ィ__!  ___`フ         /  ヽ二  /7  _i弋
   /    辷j  !   ヽ      / /    /  / }  j´  〉
    ヽ、   冫 ヽ__ュ_y\    /   /     /ヽヘ/え´   /



245:デフォルトの名無しさん
07/01/30 12:19:11
>>239
・putsの仕様を確認すべし。
・下手な小細工しないでputcharとかfputcを使ったほうがいいぞ。
・そのコードだと16文字に満たない分が出力されないぞ

246:デフォルトの名無しさん
07/01/30 16:13:41
>>239
> for(n = 16;n >= 0;n--)
17 回実行されるよね。

247:デフォルトの名無しさん
07/01/30 16:31:01
>>221-222
そのような「べき」も「一般的」もありません。

>>230
感服しました。

248:デフォルトの名無しさん
07/01/30 17:09:56
数直線を意識しない奴は、素養がない。

249:239
07/01/30 19:23:13
>>241,245,246
助言ありがとうございます。
いろいろと試してみたらどうにか動きました。
お手数かけました。

250:デフォルトの名無しさん
07/01/30 19:23:52
なんか不安w

251:デフォルトの名無しさん
07/01/30 19:34:31
適当に試行錯誤して動いたらOKという人は、C言語を使うべきではないね。

たまたま偶然、自分が見た範囲内で問題なく動いているように見えるだけ、というのは勘弁して欲しい。

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

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

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

254:デフォルトの名無しさん
07/01/31 08:41:40
>>253

252の挙げている例は、

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

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

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

256:デフォルトの名無しさん
07/02/01 22:05:31
constごときでそんなに苦労するの?

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

258:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/02/01 22:31:54
>>255
まだ、勉強始めて一週間ってことだったら、いますぐじゃなくてもいいとは思うけど。
でも、後からでもいいから const は絶対に覚えておけ。

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

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

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

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

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

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

URLリンク(kjm.kir.jp)
URLリンク(kjm.kir.jp)

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

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

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

265:263
07/02/02 15:24:35
>>264
つまりこういうことでしょうか?

URLリンク(kjm.kir.jp)
URLリンク(kjm.kir.jp)

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

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

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

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

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

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



268:264
07/02/02 16:56:55
>>265
言いたかった事は>>266
URLリンク(kjm.kir.jp)
URLリンク(kjm.kir.jp)
これはローカルマキシマムにはまった例
URLリンク(kjm.kir.jp)

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

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


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

271:デフォルトの名無しさん
07/02/02 22:30:36
配列は静的に確保しなきゃいけないから無理
vector使え

272:デフォルトの名無しさん
07/02/02 22:51:59
>>270

int int_array[
#include "CON"
];

これでおk。

273:デフォルトの名無しさん
07/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
07/02/03 00:09:48
>>271,272
ありがとうございます。
説明不足で申し訳なかったのですが、
C++ではなく、Cで実現させたいのですが、
>>271のおっしゃる通り不可能なのでしょうか?

275:デフォルトの名無しさん
07/02/03 00:11:11
>>274
>273

276:デフォルトの名無しさん
07/02/03 00:22:00
>>273,275
ありがとうございます。

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

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

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

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

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

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

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

279:デフォルトの名無しさん
07/02/03 00:55:42
いや、一緒だから。

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

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

281:デフォルトの名無しさん
07/02/03 01:34:13
>>277
まともなコンパイラを教えてください

282:デフォルトの名無しさん
07/02/03 03:47:23
>>281
>280

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

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

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

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

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

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

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

288:デフォルトの名無しさん
07/02/03 20:31:25
はいはい、HSPHSP

289:デフォルトの名無しさん
07/02/04 14:53:13
↓ですが、①が②として認識されるということですが、
  私は②がどういう場合に使われるのかがわかりません。
  externで定義ってどういうことでしょうか?

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

const int a=10;            ①
(C言語で認識される型)
extern const int a=10;        ②
(C++言語で認識される型)
static const int a=10;         ③

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

291:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/02/04 16:00:40
定義に「付けてもいい」ってところがミソだな

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

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

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

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


296:デフォルトの名無しさん
07/02/05 00:10:04
>>295
生半可な知識しかないなら回答しないでください。

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

297:デフォルトの名無しさん
07/02/05 00:12:40
>>296
そうでしたか。
ごめんなさい。

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

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

299:デフォルトの名無しさん
07/02/05 00:37:44
>>296
>無駄に感じる
どう感じるかは自由だ

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

301:デフォルトの名無しさん
07/02/05 02:02:43
>>300
そういうこといっているんじゃないと思うが。

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

それとも別の話?

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

303:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/02/06 00:48:51
>>300に同意
ま、スレの題名通りの流れだから良いけど。

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

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

306:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/02/06 11:40:52
質問です
メインで使うクラスにデストラクタの中で
終了時にメンバ変数の領域をdeleteにより手動で開放する
意味はあるのですか?

308:306
07/02/06 11:55:53
すみませんけど、自己解決しました

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

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

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

312:デフォルトの名無しさん
07/02/06 17:23:21
>>307
いや、さすがに冗談だよな……?

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

314:デフォルトの名無しさん
07/02/06 17:29:37
free論争は秋田

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

316:デフォルトの名無しさん
07/02/06 17:42:06
>>315
なんかおかしな事になりそうだから試したくないけど
それしたらどうなるの?


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

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

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

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

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

322:デフォルトの名無しさん
07/02/07 03:11:03
>>316
おそらく何も起きない。

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

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

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

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

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

325:デフォルトの名無しさん
07/02/07 07:55:33
しないだろ。

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

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


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

ぐぐったら見つかるだろ

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

329:デフォルトの名無しさん
07/02/07 10:58:04
>>326
仕様です

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

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

331:デフォルトの名無しさん
07/02/07 11:13:54
ヒープの場合

ヒープやスタックの場合


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

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

334:デフォルトの名無しさん
07/02/07 19:13:30
URLリンク(www.kohgakusha.co.jp)
ゲーム作りではじめるMFC

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

336:デフォルトの名無しさん
07/02/07 19:43:56
値で渡す場合は値渡しだね

337:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/02/07 19:58:36
337はfuncの引数がint*となっている場合だね。
void func(int [][10]);などと宣言されていれば、func(array)と呼べる。

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

340:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/02/07 20:53:06
>>323
WindowsのVC++のdeleteは、不正なポインタを渡すとint 3してくれたと思う。

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

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



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

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

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

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

346:344
07/02/07 23:56:13
>>345
規模と何の関係があるんですか?

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

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

349:デフォルトの名無しさん
07/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
07/02/08 00:21:08
どうもVC++のバージョンを上げてから弾かれるようになったように
記憶しているのですが・・・

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

352:344
07/02/08 00:32:02
>>351
いや、それは知っています。
それの代わりに#pragma onceでもいいってことも。

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

353:デフォルトの名無しさん
07/02/08 00:44:43
struct.h
をインクルードする
struct2.hを作って

main.cから

#include "struct.h"
#include "struct2.h"

ってしてみれ

規模が大きくなるとそういう事が多くなる


354:344
07/02/08 00:54:32
>>353
ありがとうございます。
なんとなく分かった気がします。

同一ファイル内で1回なら問題ないということですね。

Cで自分で意識してインクルードした場合は、1ファイルにつき
1回しかインクルードしないので問題がなかったのですが、VC++で
MFCを使うと勝手にインクルードとかされてエラーになるように
なったんじゃないかと思います。

355:デフォルトの名無しさん
07/02/08 01:03:19
どんな名前になるのかわからないファイルを勝手にインクルードなどできるはずがない。

356:デフォルトの名無しさん
07/02/08 01:03:41
だからそれはCとかC++とかの問題ではなくて
お前の書くプログラムの規模が小さかったから現れてこなかっただけだ。

ところで分割コンパイルと二重インクルード防止は基礎中の基礎だと思うんだが
最近の入門書じゃ教えてないっぽいな。
嘆かわしいなあ…

357:デフォルトの名無しさん
07/02/08 01:57:01
>>356
まともな入門書には書かれてるよ。

まともじゃない入門書でも、説明しているものがあるけどね。


358:デフォルトの名無しさん
07/02/08 02:35:10
質問です。以下のように、変数を自作クラスを使うベクタを使って作成する場合
どのようにして作成していけばよいのでしょうか。push_backメンバが使えると思うのですが
いまいち自作クラスを使ったベクタでの使い方がわかりません。よろしくお願いします。

class A {
 int a;
 int b;
public:
 void set_a(int seta) { a = seta; }
 void set_b(int setb) { b = setb; }
 int get_a() { return a; }
 int get_b() { return b; }
};

int main() {
 vector<A> vec_a;

 /* vec_aに要素を追加する */

 return 0;
}

359:358
07/02/08 02:38:02
訂正します。
どのようにして要素を作成していけばよいのでしょうか。

360:デフォルトの名無しさん
07/02/08 02:48:54
>>358-359
vec_a.push_back(A());

361:デフォルトの名無しさん
07/02/08 03:12:35
>>358
class Aに引き数をとるコンストラクタを用意した方が何かと便利かもね。
仮に、A(int seta, int setb);というコンストラクタがあるなら、
vec_a.push_back(A(0, 0));って感じで設定も同時に行なえる。

362:デフォルトの名無しさん
07/02/08 03:44:42
>>361
セッターの戻り値を *this にして
vec_a.push_back(A().set_a(0).set_b(0));
なんてやるのもいいと思うけどね。
コンストラクタでやるのに比べるとちょっと冗長だけど、
このスタイルのほうがいろいろと都合がいいことってあるし。

363:デフォルトの名無しさん
07/02/08 07:36:19
それマジ?

364:358
07/02/08 10:19:30
>>360-362
ありがとうございます。
勉強になりました。

365:デフォルトの名無しさん
07/02/08 10:24:34
>>362面白い
それは応用が利きそうだな。

366:デフォルトの名無しさん
07/02/08 11:48:25
setterでthisポインタ返すのは常識だろ

367:デフォルトの名無しさん
07/02/08 13:59:43
質問です
cout << false;
cout << true;
の出力結果は 0 1 ですが、これは環境によって違うのでしょうか?

368:デフォルトの名無しさん
07/02/08 15:19:39
>>367違わない。

369:デフォルトの名無しさん
07/02/08 17:20:28
プリコンパイル済みヘッダに関する質問です、
VC++2003やVC++2005では各cppに#include "stdafx.h"でプリコンパイル済みヘッダが使えます。
ところがそのソースをBCCに移植すると、(ディレクトリの関係で)一部#include "../stdafx.h"にしなければなりません。

VCはディレクトリ関係を気にせず一様に指定出来ますが、BCCで同じことは行えないのでしょうか?

370:デフォルトの名無しさん
07/02/08 17:25:30
>>369
BCCはstdafx.hは必要ありません。

371:デフォルトの名無しさん
07/02/09 01:09:27
>>366
はて、>362は実体を返しているようだが。

372:デフォルトの名無しさん
07/02/09 01:32:40
>>371
僕は参照だと脳内補完した。

373:デフォルトの名無しさん
07/02/09 03:02:01
とりあえずゲッターはconstつけようや

374:デフォルトの名無しさん
07/02/09 19:17:43
C++のソースからクラス図を自動生成してくれるようなツールはないでしょうか・・・?

375:デフォルトの名無しさん
07/02/09 19:19:06
>>369
インクルードパスに..を追加できないの?
""で括ったヘッダ名が見付からなければ、
<>で括ったのと同じようにヘッダを探すことになっている。

だからインクルードパスの指定は""で括ったものにも有効。

376:デフォルトの名無しさん
07/02/09 20:59:55
>>374
Doxygenを含めて色々在ると思う。

377:デフォルトの名無しさん
07/02/14 13:38:46
class A{
static const double a;
static const double b;
static const double c;
};

const double A::a=5;         
const double A::b=10;
const double A::c=a/b;

と書いた場合、cは必ずa=5とb=10が実行された後に実行されるのでしょうか?

378:デフォルトの名無しさん
07/02/14 17:02:17
CTypedPtrListのSeqValueListを
CTypedPtrArrayにする時ってどうすればいいんでしょうか?
下のがソースなんですが、やり方が良くわからない。。。orz
CItemInfo::~CItemInfo(){
int iCount;
POSITION pos;
VALUE *pValue;
m_pValueList = &m_SeqValueList;
iCount = (int)m_pValueList->GetCount( );
pos = m_pValueList->GetHeadPosition( );
for( int i=0; i<iCount; i++ ){
pValue = m_pValueList->GetNext( pos );
delete pValue;
}
m_pValueList->RemoveAll();
m_pValueList = &m_ParValueList;
iCount = (int)m_pValueList->GetCount( );
pos = m_pValueList->GetHeadPosition( );
for( int i=0; i<iCount; i++ ){
pValue = m_pValueList->GetNext( pos );
delete pValue;
}
m_pValueList->RemoveAll();
}


379:デフォルトの名無しさん
07/02/14 18:28:32
なんだマルチか

380:コンパイルとおらねぇもん
07/02/15 01:23:57
>>377
いいえ。実行されることはありません。

381:デフォルトの名無しさん
07/02/15 14:39:13
MFC実行したら
Warning: calling DestroyWindow in CWnd::~CWnd; OnDestroy or
PostNcDestroy in derived class will not be called.
って言われたんだけど、どういう意味なの?

382:デフォルトの名無しさん
07/02/15 14:45:37
そのままの意味です。英語の意味が判らないと言うのであれば、鼬害です。

383:デフォルトの名無しさん
07/02/15 22:56:15
>>381
ウィンドウを正しく終了せず
プログラムの変数(インスタンス)が消されたことにより
正しい手順ではなくCWndのデストラクタが呼ばれたんじゃないの(推測)。

384:377
07/02/16 07:39:55
そうするとcの値は何になるのでしょうか?

385:デフォルトの名無しさん
07/02/16 08:19:55
0.5でしょ。コンパイルタイムに確定するから。

386:デフォルトの名無しさん
07/02/16 12:56:06
>>385
この手の順序依存は規格的には未定義じゃなかったっけ?

387:デフォルトの名無しさん
07/02/16 13:13:40
BCCでインデントするとemacsでやってたのと違ってかなり
スペース空くのですが、こんなもんなんですか?

388:デフォルトの名無しさん
07/02/16 13:22:19
BCCでインデント の意味がわからない。

389:デフォルトの名無しさん
07/02/16 16:54:28
class A{ 
static const double a; 
static const double b; 
static const double c; 
}; 

const double A::a=5;          
const double A::b=c/a; 
const double A::c=a/b; 

じつはこれもコンパイルできてしまったりする。

390:デフォルトの名無しさん
07/02/17 12:40:16
>>389
順序は規定されていないけどコンパイルされる以上、値は決まるわけだね。
その例だとa, b, cの順序に評価される可能性が高そうだから、bは(cが暗黙の初期化で0だから)0、cは∞か。
const double A::c=a+b;
const double A::b=c+a;
const double A::a=5;
こうなってたとすると、a, b, cがそれぞれ(acbの順序で評価して)5, 0, 0なのか(cbaの順序で評価して)5, 10, 5なのか悩ましいところだ。
まして複数のコンパイル単位に分かれていたらリンク順序にも依存してしまうのかな。

結論:
評価順序に依存した初期化は鼻から悪魔。constにしないでシングルトンにすべきか。

391:デフォルトの名無しさん
07/02/17 12:41:58
一部訂正:
×こうなってたとすると、a, b, cがそれぞれ(acbの順序で評価して)5, 0, 0なのか(cbaの順序で評価して)5, 10, 5なのか悩ましいところだ。
○こうなってたとすると、a, b, cがそれぞれ(cbaの順序で評価して)5, 0, 0なのか(acbの順序で評価して)5, 10, 5なのか悩ましいところだ。



392:デフォルトの名無しさん
07/02/17 23:13:18
gccは確か制御できた様な

393:デフォルトの名無しさん
07/02/19 12:03:31
C言語なんですがwaveを再生させるにはどうすればよいでしょうか?
プログラムが完了したら鳴らしたいのですが・・・。

394:デフォルトの名無しさん
07/02/19 12:18:16
Beep()
…言ってみただけ

395:デフォルトの名無しさん
07/02/19 12:19:02 BE:672138566-2BP(1050)
てst

396:デフォルトの名無しさん
07/02/19 12:19:46
ビープ音鳴らすだけならputchar('\a');
処理系依存だけど

397:デフォルトの名無しさん
07/02/19 14:44:15
演算子の多重定義って使う機会ありますか?

398:デフォルトの名無しさん
07/02/19 15:11:16
自分で使うかどうかはともかく、人が作ったものはよく使う。
一番よく使うのがイテレータに対する操作。
後はstd::basic_stringの比較・連結もよく使う。

399:デフォルトの名無しさん
07/02/19 15:31:16
ビープ音ではなくwavのようなPC内部で鳴る種類が良いです・・・

400:デフォルトの名無しさん
07/02/19 16:00:23
>>399
「wave API」でググれ。

401:デフォルトの名無しさん
07/02/19 16:15:44
waveを再生するってのは結構面倒なのでしょうか?

402:デフォルトの名無しさん
07/02/19 16:32:39
君の面倒なレベルがわからないから回答不能

403:デフォルトの名無しさん
07/02/19 19:12:31
WindowsならMCIかwaveoutかDirectX
質問のレベルからしてMCIがお勧め

404:397
07/02/19 22:35:33
>>398
ありがとうございました。m(_ _)m

405:デフォルトの名無しさん
07/02/20 02:13:35
質問です。
typedef std::map<mykey_t,myval_t> mymap_t;
void hoge(mykey_t k, const mymap_t &m){
 mymap_t::iterator p = m.find(k); // コンパイラエラー
}
constが付いたmapのイテレータを造りたいんですけど、
どうすればいいのですか?

406:デフォルトの名無しさん
07/02/20 03:03:39
>>405
mymap_t::const_iterator p = m.find(k);


407:デフォルトの名無しさん
07/02/22 13:38:18
>>381
今さらながらマジレス
Warning: calling DestroyWindow in CWnd::~CWnd;
OnDestroy or PostNcDestroy in derived class will not be called.
[翻訳]
CWndから派生クラスのウィンドウを使っているときに、
規定クラスのCWnd::~CWndデストラクタが呼ばれているので
派生クラス側のOnDestroyやPostNcDestroyハンドラが呼ばれませんですのよ。うふ

ウィンドウ破棄するときに派生クラス->DestroyWindowを呼んでない悪寒です。

408:デフォルトの名無しさん
07/02/23 11:42:39
文字と数字が入力された時に、数字だけを消して
文字だけ表示したいんですけど、どうやればいいのでしょうか?

void del_digit(char *str){
while(*str)
/*ここでどうすれば?*/
putchar(*str++);
}
int main(void){
char str[100];
printf("mojinyu-ryoku:"); scanf("%s",str);
printf("DelDigit:");
del_digit(str);
putchar('\n');
return(0);
}

409:デフォルトの名無しさん
07/02/23 12:22:44
if (isdigit(*str))

410:408
07/02/23 13:05:39
>409

ありがとうございました。解決できました。

411:デフォルトの名無しさん
07/02/23 16:03:53
注:私の有意義な発言に対し、自分の理解不足を棚に上げ煽り、1行レス
で返す方が多いようですが、そのような方はスレの皆様を混乱させるだけでなく
スレの雰囲気を崩しかねないのでお黙り下さい。
また質問者は回答者に知識を披露する場を与える貴重な存在なので、
質問者を見下した回答、あまりにも儀礼を欠いた回答も厳重に禁止いたします。
忙しい中、少ない時間の合間を縫って質問しに来てるわけですので、
その辺ご承知下さい。なお、当方が質問に対して有意義な答えであると
判断した方には評価いたしますので各自よく調べ、よく考え正確な回答をするように。

412:デフォルトの名無しさん
07/02/23 21:26:09
>>411
そうか

413:デフォルトの名無しさん
07/02/25 19:10:07
ユーザー一人一人に別々のシリアルナンバーを割り当てたいのですが、
どのように生成し、ソフト側ではどのようにそれをチェックすればよいのでしょうか?

414:デフォルトの名無しさん
07/02/25 19:45:45
ユーザー特有情報(メールアドレスとか)を秘密鍵で暗号化して、
ソフトに内蔵の公開鍵で復号できたらOK、とか?

415:デフォルトの名無しさん
07/02/25 19:56:51
うんにゃ、クラックから守るにはクラッカーの手口を知る必要がある。
リバースエンジニアリングの本でも買って読んだ方が良いぞ。相手は『強力なデバッガ』使いだからな。
ロジックの流れなんか直ぐに分かってしまう。まずは低水準なレベルで防御しなければならん。
認証用の関数はプログラム処理の流れから完全に分離、関数のアドレスを入れているポインタのconst変数には定数NULLを入れておき、
ifで関数ポインタ変数がNULLじゃなかったらアドレス先の認証関数を実行、とすると良いかもしれん。
これなら認証用関数の手がかりはほとんど無いからな。ダミーの関数でラップしておけば更に頑丈になる。
NULL定数を正常な認証用関数アドレスに書き換えるパッチをユーザーに配る必要があるが、
ユーザー名をキーに若干絡ませて暗号化とかしておけ。

416:デフォルトの名無しさん
07/02/25 20:03:43
なにいってるの?

417:デフォルトの名無しさん
07/02/25 20:20:15
>>415はアレだ。
物事を最初だけ聞いて「みなまで言わずとも分かった」と暴走するタイプだ。

418:デフォルトの名無しさん
07/02/25 22:50:20
単にWizardBibleとか読んでわかった気になってるだけだろ

419:デフォルトの名無しさん
07/02/25 23:34:20
江戸っ子は気が短いんでい!

420:デフォルトの名無しさん
07/02/26 01:25:29
>>415 の言ってるようにクラック対策なら、↓こっちのスレで相談しなさい。

クラッキングの勉強の仕方を教えてください
スレリンク(tech板)


421:デフォルトの名無しさん
07/02/26 20:35:33
VC++自体よくわからんが
ゲーム制作で俗に言うC++ってVC++のこと?
ゲーム制作の参考書買いに行ったがVC++ばっかりで混乱・・・
ちなみにC++の基礎はマスターした。

422:デフォルトの名無しさん
07/02/26 20:41:19
まあ、Windows対象のC++本ならほとんどはVC++を想定して書かれてると思ってもいいんじゃないかな。

423:デフォルトの名無しさん
07/02/26 20:47:30
趣味と実益(基本情報技術者の試験)を兼ねてc言語を勉強しようと思います。
フリーコンパイラ使おうと思うんですがどれがいいでしょうか?
VisualStudio Expressで問題ないですか?

424:デフォルトの名無しさん
07/02/26 20:53:55
趣味ならIDEも付いてるし、VC++でいいんじゃね?

425:デフォルトの名無しさん
07/02/26 21:23:33
夢を壊すようで悪いけど
基本情報は何の実益にもなりません

426:デフォルトの名無しさん
07/02/26 21:29:22
おいらのところは資格手当がでるよ

427:デフォルトの名無しさん
07/02/26 21:33:03
実益というか「そんなのも取ってねぇのかよ」
といわれる会社もあるにはある

428:デフォルトの名無しさん
07/02/26 22:43:59
>>442
サンクス
やっぱりVC++も頭に入れながらやってみる。

429:デフォルトの名無しさん
07/02/26 23:06:02
WindowsならVC++かgccの二択だわな

430:デフォルトの名無しさん
07/02/27 00:46:54
>>429
それを言うならVCかICCの二択だろ。
この期に及んでgcc使うヤツなんていないって。

431:デフォルトの名無しさん
07/02/27 01:02:56
icc高すぎ

432:デフォルトの名無しさん
07/02/27 01:13:14
>>431
じゃ、VCで我慢汁。

433:デフォルトの名無しさん
07/02/27 16:50:30
>> 430

BCC + BCC Developer は?
もしかして却下?

Turbo Debbuger まで全部タダでそろうが…。

BCC Develoer のクラスでSTL使えたか忘れたが…。

434:デフォルトの名無しさん
07/02/27 16:54:18
>>433
STLも使えたはず。


435:デフォルトの名無しさん
07/02/27 17:00:16
>> 434

そうですか!情報提供ありがとうございます。
VCのMFCでは文字列クラスがSTLと共存できない使用だったはず…
最新バージョンでは使えるようになったのかな??
使えないなら BCC の方がよさそうに思いますが…。

436:デフォルトの名無しさん
07/02/27 17:19:16
Borland C++よりVC++ (7.1以上)の方がテンプレートがまともに使える。
STLを使えるかどうか気にするなら、それだけでVC++を選ぶには十分。
MFCとの相性が悪いなら、むしろMFCなんて捨ててしまえ。

437:デフォルトの名無しさん
07/02/27 17:21:18
Cコンパイラとして使うならbccよかgccのほうがマシだろ

438:デフォルトの名無しさん
07/02/27 17:31:37
>> 436

たしかに自分使ってない。

>> 437

gcc は使ったこと無くて…

439:デフォルトの名無しさん
07/02/27 17:44:30
BCCはいまだにC++コンパイラではない
Boostの些細なライブラリが通らないので
C++を知っている人間なら薦めない
(某サイトは特集していたが)
MFCがBoostやSTLやだれそれと共存できないなんてことはない

440:デフォルトの名無しさん
07/02/27 17:47:44
>> 439

いえ自分が言っていたのは MFC内で使われている 文字列クラスと
STL の string クラスの互換性の話…。

MFCをポイすれば悩むこと無いでしたが…

441:デフォルトの名無しさん
07/02/27 17:55:10
>>440
MFCの文字列クラスとSTLのそれを混在させなきゃいいだけの話じゃないの

442:デフォルトの名無しさん
07/02/27 18:10:26
>>440
文字列に限らずコンテナ類も互換性がないが、それより
「互換性がない」と「共存できない」じゃまるで意味が違うだろが。

443:デフォルトの名無しさん
07/02/27 18:14:12
たしかにMFCのCStringTとstd::basic_stringは別物だが、
相互に変換できないわけではないし、
Boost.Range(或いはイテレータ)では統一的に扱えるんだから、
そこまで気にすることは無いと思う。

444:デフォルトの名無しさん
07/02/27 19:00:22
>> 443

参考になりました。ありがとうございます。


445:デフォルトの名無しさん
07/02/27 19:33:39
template<class T>class A{
 private: T na;
 public: A(T a):na(a){};
 friend A<T> operator + <T>(A<T>&,const A<T>&);
};
template<class T>class B{
 private: T nb;
 public: B(T b):nb(b){};
  friend B<T> operator + <T>(B<T>&,const B<T>&);
};

template<class T>A<T> operator +(A<T> a1,const A<T>& a2){a1.na=a1.na+a2.na;return a1;}
template<class T>B<T> operator +(B<T> b1,const B<T>& b2){b1.nb=b1.nb+b2.nb;return b1;}
でBのメンバ変数にアクセスできないのはなぜ--??

446:デフォルトの名無しさん
07/02/27 20:23:37
>> 445

template<class T>A<T> operator +(A<T> a1,const A<T>& a2){a1.na=a1.na+a2.na;return a1;}
template<class T>B<T> operator +(B<T> b1,const B<T>& b2){b1.nb=b1.nb+b2.nb;return b1;}

template<class T>A<T> A<T>::operator +(A<T> a1,const A<T>& a2){a1.na=a1.na+a2.na;return a1;}
template<class T>B<T> B<T>::operator +(B<T> b1,const B<T>& b2){b1.nb=b1.nb+b2.nb;return b1;}

とすればいいのでは?

447:デフォルトの名無しさん
07/02/27 21:03:12
friend関数なのでそれでも無理っぽいです。

448:デフォルトの名無しさん
07/02/27 23:08:00
int x;
int &rx = x;

これおかしくね?
&rx = x; 何でアドレスにint型の変数を代入するの

449:デフォルトの名無しさん
07/02/27 23:08:45
「参照」を知らない香具師は基礎からC++やり直せ

450:デフォルトの名無しさん
07/02/27 23:45:33
(int &)rx=x;
rはreferenceのr
宣言時に型の直後に&をつけたものは参照型になる
嘘です

451:デフォルトの名無しさん
07/02/28 13:09:55
ネットで落としてきたcppファイルとdefファイルを使ってdllを作成したいんだけど、
やり方がよくわかりません。

ぐぐって見たところ、
ファイル→新規作成→プロジェクトタブ→win32 Dynamic-Link Library or MFC Appwizard(dll) を選んで
もにょもにょするって書いてあったんですが、↑の時点で2種類のやり方があってどっちが正解かわからないですし、
そもそも貰ったファイルをdll化することが目的なので新規作成からやるのは何か間違っている気がします。

とりあえずcppファイルを開いてコンパイルして、、、defファイルをプロジェクトに追加。
そして再度コンパイルをしてみても・・・無理でしたorz

どなたか助言をお願いします…

環境はvisual V++ 6.0 Standard Editionです。
よろしくお願いします。

452:デフォルトの名無しさん
07/02/28 13:14:23
>>451
dllを新規作成するからあってるのでは?
そのdllプロジェクトにソースを追加してモニョモニョするんだと思うんだけど。

453:451
07/02/28 13:35:42
うは…なるほど、そういう解釈ですか…

とりあえず
ファイル→新規作成→プロジェクトタブ→win32 Dynamic-Link Library
を選んで空のDllオブジェクトを選択して(この時点で意味不明ですが…他選ぶとどうなるの…?)

プロジェクトの追加でcppを選んでビルドしてみたら何故かdllファイルが出来上がっていました
個人的にはキタ━━(゚∀゚)━━!!!!
でもどうなってんのか全然だ(ノ∀`)

dllにもフォーマットがあって、cppファイルに則したやり方じゃないとうまく生成されないのだろうか。
ちなみにMFC Appwizard(dll)の方で作ろうとしたら、エラーがでて生成されませんでした。なんでやねん(;´Д`)

それ以前に先ほどDllを作成したときには、プロジェクトの追加でcppファイルを追加したわけですが、
defファイルは追加しなくてもいいんでしょうか?
勝手に追加されるから特に選択する必要はないということでしょうかね・・・(ソースによりけりなのかもしれないけれど)

454:デフォルトの名無しさん
07/02/28 14:19:10
def ファイルは関数のエクスポートに必要
__declspec(__dllexport) を関数につけてないのなら
def無しで作った場合、出来上がったDLLはどこからも呼べないものになってると思うが
depends.exe 持ってないか?

455:451
07/02/28 15:00:26
depends.exeとはDependency Walkerのことなのかな…?

とりあえず、defファイルを追加せずにdll化するとまずそうなので、先ほどの手順で
プロジェクトの追加からcppファイルとdefファイルの両方を追加して見ました。
すると…エラーなしでdll化キタ━━(゚∀゚)━━!!!!

これで関数もエクスポートできるようなまともなdllになったのかな…

とりあえずDependency Walkerを起動してみて調べたところ、左のツリー状のところに
TEST.dll
  l
  -KERNE32.dll
     l
     -NTDLL.dll

ってなってました。自分にはさっぱりですが、正常にdll化できたと思ってよいのでしょうか(;´Д`)?

456:デフォルトの名無しさん
07/02/28 15:13:48
DLLの関数のエクスポートのやり方は2種類あるのよ
・関数に__dllexportを付ける
・.defファイルに纏めてエクスポートする関数を書く。
どっちでもおk。俺は見やすいからdefの方でやる。

457:451
07/02/28 15:41:47
なるほど…
まだまだ不勉強なようですね。
でも、ねんがんのdllをてにいれることができたので、レスを下さった方々にはお礼を言いたいと思います。

どうもありがとうでした・゜・(ノA`)・゜・

458:デフォルトの名無しさん
07/02/28 16:58:10
>>455
そのTest.dll にカーソルあわせたら
右の下のFunction に一覧出るべ
それがエクスポートされたやつね。

459:デフォルトの名無しさん
07/02/28 17:29:16
今日からマイクロソフトのVisualC++2003をし始めたんですが、どこかのサイトで
見つけた同じC++の例文とか書いてみても実行したとたん画面が消えるのはなぜですか?

printf とか cout っていうのとかって一緒に使えますか?

460:デフォルトの名無しさん
07/02/28 21:40:45
終了したらウィンドウが消えるのは当たり前だろ…

461:デフォルトの名無しさん
07/02/28 22:54:40
Cのポインタについてなのですが
int c;
int *p; /* ポインタの宣言 */
c = 1;
p = &a;
とすると、pにaのアドレスを代入
*p = 1;
ならpの中のアドレスのさす変数aに1を代入
ですよね?

*がない場合はアドレスを入れるものだと思ってたのですが
文字列を扱うときには
char *p = "ABC";
宣言時だろ*があったのですが
後から代入するときには
char *p;
p = "ABC";
という風に*がありませんでした
アドレスの代わりにABCが入ってるのですか?
どのような解釈をすればよろしいのでしょうか
教えてください



462:デフォルトの名無しさん
07/02/28 23:02:30
char *p = "ABC";は「char *」という型の変数pを宣言していると考えろ。
*をcharではなくpのほうへにくっつけて書くのは慣習的な理由。

こう書いても同じ意味になる。
typedef char * pchar_t;

pchar_t p = "ABC";

463:デフォルトの名無しさん
07/02/28 23:35:19
宣言時代入と、後から代入が同じということはわかりました、ありがとうございます

では
*p = 1でaに代入されるのはどういうことでしょうか?
*とpを書いているのは、アドレスの指す変数に代入と考えていいのでしょうか?

それと
p = "ABC";
の場合はアドレスの代わりにABCが入っていると考えていいのでしょうか?

464:デフォルトの名無しさん
07/02/28 23:39:11
OS:Windows XP Professional Version 2002 Service Pack 2
開発環境:Microsoft Visual C++ 6.0

===やりたいこと===
ChemDrawという化学構造を描画するソフトウェアのファイルフォーマットであるcdx形式のファイル(バイナリ)を読み込みたい

===これまでに実施した内容===
まず、CDXファイルフォーマットに関しては以下のページに書かれています。(英語)
 URLリンク(www.cambridgesoft.com)
その内、バイナリファイルを読み込む際に事前に定義されたヘッダーファイルが以下のページのファイルです
 URLリンク(www.cambridgesoft.com)
のリンクにある
 URLリンク(www.cambridgesoft.com)
のファイルがcdxファイルフォーマットを読み込む際に使用するヘッダーファイルです。この中で
 typedef UINT16 CDXTag;
 typedef INT32 CDXObjectID; // signed for now, due to mac compiler bug?
という行があるのですが、私の開発環境ではUINT16とINT32という型が存在しないため、コンパイルをしても
 c:\hogehoge\cdxconstants.h(54) : error C2146: 構文エラー : ';' が、識別子 'CDXTag' の前に必要です。
とエラーが出てしまいます。そこでUINT16ってなんだ?ってことを調べ始めて、
 ・UINT16は16bitのUINT
 ・「.NET Framework クラス ライブラリ」 においてUINT16は定義されているらしい
  URLリンク(msdn2.microsoft.com)(VS.80).aspx
ってところまでは分かったのですが、何をしたらいいのかお手上げ状態になってしまいました。
とりあえず、このヘッダーファイルがコンパイルで通るようにしたいです。よろしくおねがいします。

465:デフォルトの名無しさん
07/02/28 23:42:32
UINT16は最近のPlatform SDKに入っている
<windows.h>(の中でインクルードされているファイル)の中で宣言されている。
今回のものと.NET Frameworkのは関係ない。

手っ取り早く対処するなら、
そのヘッダをインクルードするより先に自分で宣言してしまえばよい。
typedef unsigned __int16 UINT16;
typedef __int32 INT32;

466:デフォルトの名無しさん
07/02/28 23:45:54
>>463

> int * pa; // (A)
変数paはintへのポインタであることを示す。

> *pa = 1; // (B)
> b = *pa; // (B)
*paの*は、ポインタpaが指す場所に対して代入したり値を取り出したりする。

俺の推測だが
(A)と(B)の*を無理やり同じ意味にしようとしているのか。


467:デフォルトの名無しさん
07/02/28 23:50:01
>>463

char *p; と宣言している以上は、
ポインタpに入れられるのは(char *)だよ。

"ABC"だってどこかのメモリに存在するわけで
アドレスがあるよ。



468:デフォルトの名無しさん
07/02/28 23:52:21
>>461

> p = &a; 
> とすると、pにaのアドレスを代入 
> *p = 1; 
> ならpの中のアドレスのさす変数aに1を代入 
> ですよね? 

そうだね

469:464
07/02/28 23:55:46
>>465
おおお動きました^^;

最終的に
typedef unsigned __int16 UINT16;
typedef unsigned __int32 UINT32;
typedef __int32 INT32;
の3行追加で何とか認識できました。

ありがとうございました!!

470:463 461
07/03/01 00:04:47
>>466
同じ意味かと思ってました
理解できました
ありがとうございました

>>467
納得できました、ありがとうございました

>>468
ありがとうございます


皆さん本当にありがとうございました

471:471
07/03/01 00:12:14

/************************************************************************/
/* 機能 : port5のLEDを交互に点滅させる。 */
/* */
/* 作成日 : 2007/2/27 */
/* 作成者 : 佐々木 */
/************************************************************************/

作ったプログラムソースをメモリーステックに保存して、別のパソコンでソースを
開いたら、
こんなにレイアウトが崩れてしまいます。
使っているコンパイラはBCCとGCCなのですが、
どうしたらいいですか?

472:デフォルトの名無しさん
07/03/01 00:18:21
>>466
> (A)と(B)の*を無理やり同じ意味にしようとしているのか。
そういうこと。「『*pがchar型になる』と読める」というような説明はよく見かける気がする。

URLリンク(kmaebashi.com)
> K&Rによれば、Cの宣言は、「変数が現われ得る式の構文を真似た(P.114)」そうである。
> しかし、本質的に全く異なるものを無理に似せようとしたため、
> 結局わけのわからない構文になってしまっている。

473:デフォルトの名無しさん
07/03/01 00:21:10
>>471
ソースは同一でパソコンを変えただけなんだね。
使用しているエディタが違うとかフォントが違うとかじゃないの。

474:471
07/03/01 00:30:18
フォントをいじればいいのですね。
スペースとかTabで崩れてると思うし。

475:デフォルトの名無しさん
07/03/01 00:37:01
>>474
タブがスペース何文字分なのかは迷惑な話だよね。

476:471
07/03/01 00:51:51
文字サイズをいじっても良くはなりませんでした。
そのTabがスペース何文字分かを設定するのはどこからですか?

477:471
07/03/01 00:59:41
漏れ的には、
関数の紹介文は
/*************/
/*___________*/
こんな感じでアスタリスク埋めして正確な文字数が出てるし、
TABは避けるべきだったかなと思いますた。
文頭はいいとは思うけど。
  char *NEET;
みたいに。

478:デフォルトの名無しさん
07/03/01 02:32:22
deleting Debugって出てメイクできないんですが、イミフです
ググったら全角スペースが原因とかプロジェクト設定をwinにすれば良いとか
出てたのですが、何やってもダメです。
ちなみにReleaseだと実行できます。

何が原因なのでしょう・・・?
コンパイラはbccです。

479:デフォルトの名無しさん
07/03/01 05:01:02
>>478
bccを捨てるのはどうでしょう。

>>477
囲う手間の割りに見栄えがよくないので、左側だけにすることをお勧めします。
ついでにDoxygenコメントを埋めてこんな感じ。
////////////////////////////////////////////////////////////////
/// \brief あーたら処理
///
/// なにやら処理するらしい。
/// \param[in] para パラメータ構造体
/// \return 処理結果
/// \author だれそれ
/// \date いついつ
//
説明を書き換えるだけで右側の桁を揃え直す手間を掛けるなんてナンセンスですよ。

480:デフォルトの名無しさん
07/03/01 09:19:13
class classname
{
classname(): root(0) {....}
}
とあったんですが、この書式って正しいんですか?正しければ意味とか説明があるサイトを紹介してくださいませ。
僕の持ってる本にはこのような書き方が載ってないです。。
(標準講座C++)


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