スレを勃てるまでもないC/C++の質問はここでat TECH
スレを勃てるまでもないC/C++の質問はここで - 暇つぶし2ch1:デフォルトの名無しさん
06/12/30 20:07:25
スレを勃てるまでもない低俗なC/C++の質問はここでお願いします。

2:デフォルトの名無しさん
06/12/30 20:41:52
入門スレじゃいかんのか?

3:デフォルトの名無しさん
06/12/30 22:24:21
早速質問なのですが
#define size 1000000

typedef struct SELL{
 int xp;
 int yp;
}SELL;

void main(void){
 SELL el[size];
}

見たいな事すると例えどんなにメインメモリが足りていたとしても動かないっぽいんですよ。
そこでmallocを使って必要な個数分だけメモリを確保したいと考えたのです。
構造体を
typedef struct SELL{
 int xp;
 int yp;
 int *next_p;
}
見たいに変更してnext_pに次のSELLを確保するようにしたらいいのではないかと思いました。

と思ったのはいいのですが実際にどのように記述したらいいのか分かりません。
mallocに関してはまったくの初心者ですがどうかボクに教えてくださいご主人様!!

4:3
06/12/30 22:31:42
早く教えてくださいです。

5:3
06/12/30 22:32:48
早く教えてくださいです。

6:デフォルトの名無しさん
06/12/31 00:59:08
・・・。

7:デフォルトの名無しさん
06/12/31 13:00:43
早く・・・早くぅ・・・。

8:デフォルトの名無しさん
06/12/31 13:30:13
            ,ィ^i^iヽ
           '´レ´ ̄ `ヽ
           f iyl ノノノリ)))〉       / ̄ ̄ ̄ ̄ ̄
           ! iYl (i_[ [l |(        |
          i.lメjゝ" lフ/ ヽ        < ご主人様。早く教えてくださいです。
            ,イノ/ヽゝ/}、ヾ i       .|
         fド〈  }jlー》 〉ノリ         \_____
         i水i/ / 〉、_|ヽ \ __
          __ く_ゝ7i`ート、 くノ_ァ}
           {i_ュノ゙//   \
            , '´,/ i     __ヽ
        / /!  ` ー-‐' , -‐〉
        ,'   ,.-‐ ァ‐ -‐' \´
        ! !   / / |  ヽ ヽ
        i l   ,' /! !    )ノ
        ヽ^  , / .l l
             /`f《 !‐il
           ヽ ヽL `__、

9:デフォルトの名無しさん
06/12/31 17:21:57
C/C++の質問スレ多すぎ

10:デフォルトの名無しさん
06/12/31 20:46:24
C++の本を見ると、defineの代わりにconstを使えと書かれているのに、
コンパイラのヘッダファイルなどに大量のdefineが使われているのは何故ですか?

11:デフォルトの名無しさん
06/12/31 22:22:48
>>10
見~た~な~

あれほど見ないでくださいと言いましたのに~。
今あなたの後ろに立っています・・・。
フフフフフ・・・・・・。

12:デフォルトの名無しさん
07/01/02 09:44:52
C言語って何のヘッダもインクルードしなくても 
printf()とか使えるじゃないですか。 
それってコンパイラが暗黙の了解で何かしてるからなんですか? 

13:デフォルトの名無しさん
07/01/02 09:51:45
>>12
??
printfは定義しなきゃ使えないでしょ?

ヘッダファイルってのはその定義を収めているに過ぎない。


14:デフォルトの名無しさん
07/01/02 13:51:29
>>13
URLリンク(ysserve.int-univ.com)


15:デフォルトの名無しさん
07/01/02 14:01:24
>>13
ところが"C言語"では宣言しなくても printf が使えるんだな。
未宣言の関数コールは暗黙で int を返す引数チェックなしの関数とされるのな。
"C++言語"だと文法エラーではじかれるが...
まぁあまりいい習慣でないことは確かだ。

16:13
07/01/02 15:13:33
>>15
ほんとだ。うちのgcc(cygwin)でも警告も出さずに通った。

これって処理系依存ではなく、Cの仕様?
だとしたら、今まで全然知らんかった。


17:デフォルトの名無しさん
07/01/02 18:53:45
>>10
教科書的にはどれもこれも手放しで const マンセーしてるけど
実用的には define のほうが都合がいい場面があるのは確か。
例えば

#ifndef hoge
#define hoge ...
#endif

みたいなことをしておけばソースコードを変更せずに
コンパイル時にマクロを指定して動作を変更できる。

18:デフォルトの名無しさん
07/01/03 00:28:59
>>17
それは正当な #define ディレクティブの使い方じゃない?

・defineの定数は、コンパイル時にリソースが無駄になる可能性がある (たぶんないけど)
・constの方が厳密な定義ができる。

ってことだと思うけど。


19:デフォルトの名無しさん
07/01/03 00:31:11
printfの書式に対するデータって数値でもアドレスでもどっちでもOK?

20:デフォルトの名無しさん
07/01/03 00:51:16
分かった
%dは数値だな
%Sはアドレス
か?

21:のいまんさん
07/01/03 01:30:05
MFCで画像をウインドウの右側に移動させたいんですけど、どういうコード書けば良いですかね?


22:デフォルトの名無しさん
07/01/03 04:05:02
char vp[sizeof(short)*10];
int i;
for(i=2;i<12;++i){
((short*)vp)[i-2]=i*i+i;
}
for(i=0;i<10;++i){
printf("((short*)vp)[%d] : %d\n",i,((short*)vp)[i]);
ポインタの粘土細工 by 冬房

23:デフォルトの名無しさん
07/01/03 07:54:30
#define BUFFER_SIZE 256

static void Write(const char* comment, ...)const{
  char buf[BUFFER_SIZE];
  va_list ap;
  FILE* pFile;

  va_start(ap, comment);
  if(vsnprintf(buf, BUFFER_SIZE, comment, ap) < 0){
    return;
  }
  va_end(ap);

  pFile = fopen(LOG_FILE_NAME, "at");
  fprintf(pFile, "%s\n", buf);
  fclose(pFile);
}

こんなかんじのフォーマットを指定して書き込む関数があるのですが、
これをC++的に変更するとどうなるでしょう?
ofstreamを使うのかと思うのですが、引数リストの扱いがわからず困っています

24:デフォルトの名無しさん
07/01/03 09:51:34
>>23
C++使うならファイルの書き込みと、コメント生成部分は別クラスにするべき

25:デフォルトの名無しさん
07/01/03 10:00:58
すいません、上のはあくまで適当な例という事で。。。
質問の意図は「fopenと引数リストを使ったファイルへの書き込みを
C++チックに書くとどうなるのか?」ということなんです
曖昧な書き方をして申し訳ありません。

26:デフォルトの名無しさん
07/01/03 10:27:27
可変長引数の部分はC++でも同じ。
ファイル出力部分をofstreamにすればよいと思います。

27:デフォルトの名無しさん
07/01/03 10:28:48
>>25

つ「壊れていないものを直すな(弄るな)」

別になんか困ってることでもなきゃ無理に修正せんでもそのままでいんじゃね?

28:デフォルトの名無しさん
07/01/03 12:57:28
そうですか…特に困ってはいないのでファイル出力部分だけ書き換えることにします

>>26-27ありがとうございました

29:デフォルトの名無しさん
07/01/03 15:07:41
#include <fstream>
class Hoge {
public:
static std::ofstream Write;
};
static std::ofstream Hoge::Write(LOGFILE, std::ios::ate);
ateは追加出力を意味し、"a"相当、binaryを指定しなければテキストモードになる。textなどといった指定は無い。

前: Hoge::Write("Hoge: %d\n", 1);
後: Hoge::Write << "Hoge: " << 1 << std::endl;


30:15
07/01/04 18:59:12
>>16
C言語の仕様。
ただ宣言はみんな明示的にしようということでC++では禁止になった。

31:デフォルトの名無しさん
07/01/05 17:32:37
>>30
C++はCのスーパーセットだから、やっぱりOKなのですか?

32:デフォルトの名無しさん
07/01/05 17:43:37
単に拡張しただけであってスーパーセットではない。

33:デフォルトの名無しさん
07/01/05 17:45:15
31には30の3行目が見えないのだろうか。

34:デフォルトの名無しさん
07/01/05 18:20:51
このまえC++のスレで15が嵐をしていたので、あぼーんせっていしてあります

35:デフォルトの名無しさん
07/01/05 19:15:16
質問です。大学の後期の授業の後半でいきなりC++の話題になって、
その課題を冬休み中に解かなければならなくなりました。(プログラム
の知識ゼロ)それで、C++とSDKをインストして、設定後に
とりあえず先生自作のサンプルを実行させようとしたら、下の画像の
ような表示になってしまい、動きませんでした。
URLリンク(bebe.run.buttobi.net)
また、先生の授業でのスライドでは、新しいプロジェクト作成時に
win32プロジェクトと出るはずなのに、出ませんでした↓
URLリンク(bebe.run.buttobi.net)
何が原因かわからないのですが、どなたか教えて頂けませんでしょうか?


36:デフォルトの名無しさん
07/01/05 19:45:09
先生に聞けばいいんじゃないかな

37:デフォルトの名無しさん
07/01/05 20:02:45
>>36
冬休みは、あと三日です。
ちなみに、nwg.hというのは標準では入ってないんですよね?

38:デフォルトの名無しさん
07/01/05 20:17:36
標準では無いと思うよ。
nwg.hって先生自作のファイルでしょ?
持ってないなら無理でしょ。
サンプルなんか放っておいて課題やれば?

39:デフォルトの名無しさん
07/01/05 20:35:47
Cで√の入った計算式立てるときってどうしたらいいの?

40:デフォルトの名無しさん
07/01/05 20:37:19
>>39
√の中を計算してからsqrt()関数でその平方根を計算
URLリンク(www.bohyoh.com)

41:デフォルトの名無しさん
07/01/05 20:46:05
>>40
√2
とかはどうやって扱ったらいいですか?

42:デフォルトの名無しさん
07/01/05 21:01:52
>>41
double sqr2 = sqrt( 2.0f );

43:デフォルトの名無しさん
07/01/05 21:10:39
>>42
ありがとうございます。
それヒントにがんばってみます

44:ただ
07/01/05 21:20:36
Visual C++6.0 でアクセスに接続する方法が載っているサイトを教えてください。お願いします。

45:デフォルトの名無しさん
07/01/05 21:57:29
>>44
マルチはやめてください。お願いします。

46:デフォルトの名無しさん
07/01/06 09:45:14
>>42
×2.0f
○2.0

47:デフォルトの名無しさん
07/01/06 11:37:47
exp(ix)を取り扱いたいんだけど、虚数単位を定義して~てのはできないの?
いちいちsin,cosで書かなきゃ行けないの?

48:デフォルトの名無しさん
07/01/06 11:41:18
URLリンク(72.14.235.104)
等を参考にして、別々に書きだしてやれば行けそうですが、冗長で好ましくないと思います。

49:デフォルトの名無しさん
07/01/06 11:44:22
連レスすまない。
最初の疑問はComplex環境下でexp(0,3)とすればexp3iになるのかな?

50:デフォルトの名無しさん
07/01/06 13:40:43
>49
complex<double> A(0,3)
exp(A)
でおk。

51:デフォルトの名無しさん
07/01/06 14:27:28
こんにちは。
フラグ処理のコードを書いています。
wire_ack_acquirememt_bus[object_numb][wire_wsr_num]
はwire_wsr_num行の中で一つだけアサートすることになっています。
ack_sender = flag_pick(wire_ack_acquirememt_bus[object_numb][wire_wsr_num], 1, SEND_ON_BUS);
で送信者がアサートさせているフラグを拾い、列番号object_numbをピックアップします。
後半コードでその列から若い列、古い列へフラグを埋めていきます(flag_fill(fill_data, fill_target, fill_width, fill_start_bit))。
VC++8でトレースして追ってみているのですが、挙動がおかしく、その問題点を探しているのですが、私には見つけることが出来ませんでした。
flag_pick()、flag_fill()も公開する必要があると思いますが、まずは下記のコードで分かることを教えていただけないでしょうか。
ff_event_check()はソースのアサートとネゲートイベントで1を返し続けます。

52:デフォルトの名無しさん
07/01/06 14:28:37
>>51
/* ACKNOWLEDGE for ACQUIREMENT*/
i = 0;
sender_no_ack_acq_bus[wire_wsr_num] = 0;
for (wire_wsr_num=0; wire_wsr_num<WSRF_SIZE; wire_wsr_num++)
{
prev_sender_no_ack_acq_bus[wire_wsr_num] = sender_no_ack_acq_bus[wire_wsr_num];
for (object_numb=0; object_numb<SPACE_SIZE; object_numb++)
{
ack_sender = flag_pick(wire_ack_acquirememt_bus[object_numb][wire_wsr_num], 1, SEND_ON_BUS);
if (ack_sender == ASSERT)
{
sender_no_ack_acq_bus[wire_wsr_num] = object_numb;
i = i | ASSERT;
}
}

if (object_numb == SPACE_SIZE && i == NEGATE)
{
wire_reset = NEGATE;
sender_no_ack_acq_bus[wire_wsr_num] = prev_sender_no_ack_acq_bus[wire_wsr_num];
}
else
wire_reset = ASSERT;

53:デフォルトの名無しさん
07/01/06 14:29:29
>>51続き
wire_temp_ack_acq_bus = flag_pick(wire_ack_acquirememt_bus[sender_no_ack_acq_bus[wire_wsr_num]][wire_wsr_num], 1, SEND_ON_BUS);
wire_event_temp_ack_acq_bus = ff_event_check(&ff_event_temp_ack_acq_bus, 0, &ff_event_holder_temp_ack_acq_bus, 0, wire_temp_ack_acq_bus, 0);
wire_event_temp_ack_bus_assert = wire_event_temp_ack_acq_bus & wire_temp_ack_acq_bus & 1;
wire_event_temp_ack_bus_negate = wire_event_temp_ack_acq_bus & ~wire_temp_ack_acq_bus & 1;

for (object_numb=sender_no_ack_acq_bus[wire_wsr_num]; object_numb>0; object_numb--)
{
wire_ack_acquirememt_bus[object_numb -1][wire_wsr_num] = flag_fill(wire_temp_ack_acq_bus & ~wire_event_temp_ack_bus_negate & wire_reset & 1, wire_ack_acquirememt_bus[object_numb][wire_wsr_num -1], 1, 0);
}

for (object_numb=sender_no_ack_acq_bus[wire_wsr_num]; object_numb<SPACE_SIZE-1; object_numb++)
{
wire_ack_acquirememt_bus[object_numb +1][wire_wsr_num] = flag_fill(wire_temp_ack_acq_bus & ~wire_event_temp_ack_bus_negate & wire_reset & 1, wire_ack_acquirememt_bus[object_numb][wire_wsr_num +1], 1, 0);
}
}

54:デフォルトの名無しさん
07/01/06 15:10:15
>>49
exp(complex<double>(0, 3))

55:49
07/01/06 18:38:24
>50
あほかwそんな長ったらしい書き方するかよw

>54
できた。ありがと。

56:デフォルトの名無しさん
07/01/08 06:03:06
【ネガティブ派遣根性チェック】

3つ以上、思い当たる点があればアナタの性格はひん曲がっており、ネガティブ負け組人生を歩んでいます。

□偽装派遣先の社員の意見にはたとえ間違っていても反対しない
□偽装派遣先から「いつまでもここで仕事してくださいね」と言われるようになりたい
□自社に仕事を持ち帰れるように言われるとムカつく
□自社で仕事なんてできるわけがない
□派遣/受託の差異を指摘する人間はムカつく
□偽装派遣先には仕事だけでなく自分のプライベートについても指示して欲しい
□自分の月額金額を知らない
□偽装派遣先社員より自分の生涯収入が低いのは当然だ
□偽装派遣先に尻尾を振り、いつまでも一緒に仕事をすることが大切だ
□今のプロジェクトが終わっても同じ偽装派遣先に常駐したい


57:デフォルトの名無しさん
07/01/08 06:46:39
はい、俺負け組決定!!
きっと本当の人生は来世!!
いや、人間じゃなくて鯨あたりになって、海を悠々自適にすごすのも良いな~
ってことは、グリーンピース応援しなきゃ。
ビフィズス菌で、胃腸で大活躍ってのも悪くないな。

あー早くポックリいかねぇかな。
親が死んだ後、雷あたりにぶち当たっておっちぬのがベストなんだけどな~・・・

58:デフォルトの名無しさん
07/01/08 12:07:01
なんで「偽装」なの?

59:デフォルトの名無しさん
07/01/08 12:29:15
>>58
派遣元は「うちはプロです」と言っておきながら現実には昨日今日入社したばかりの
偽装派遣先に常駐させ、派遣先社員の指示の下で働かせる実質アルバイト派遣業だから


60:デフォルトの名無しさん
07/01/08 12:41:10
>>59
あんた馬鹿でしょw

61:デフォルトの名無しさん
07/01/08 17:33:41
ワロタ

62:デフォルトの名無しさん
07/01/08 19:59:00
すれ立てるまでもない質問はここでスレが無いのでここで聞きますが
オープンソースのSNSって何がありますかね?
開発言語別で教えて頂けませんでしょうか?
でも、失礼なのでC++でのオープンソースSNSだけでも教えて頂ければと思います

63:デフォルトの名無しさん
07/01/08 20:01:56
webprog逝ったほうがいいよ

64:デフォルトの名無しさん
07/01/08 21:15:49
黄色い「独習C」って本やったことある人いますか?
あの本をマスターするとどれくらいのソフトが作れるようになるんですか?


65:デフォルトの名無しさん
07/01/08 21:20:54
>>64
3つくらい

66:デフォルトの名無しさん
07/01/09 11:38:54
MAME32をジョイスティックで動かすことをしたいのですが
keybd_eventをつかっても動きません
メモ帳で試してみたら、動きました

何か他の方法があるのでしょうか

67:デフォルトの名無しさん
07/01/09 13:05:08
constとstatic constの違いを教えてください

68:デフォルトの名無しさん
07/01/09 13:23:27
>>67
staticがつくかつかないかです。

69:デフォルトの名無しさん
07/01/09 13:24:44
>>67
それが何を修飾しているかによって異なります。

70:デフォルトの名無しさん
07/01/09 13:25:27
>>67
Cですか? それともC++ですか?

71:デフォルトの名無しさん
07/01/09 13:31:14
C++です。修飾しているのはintやdoubleです。

72:デフォルトの名無しさん
07/01/09 13:41:45
前者は定数で後者は静的な定数です。

73:デフォルトの名無しさん
07/01/09 16:40:21
整数リテラル0が何故、8進リテラルになるのかが分かりません。教えて下さい。

74:デフォルトの名無しさん
07/01/09 16:51:00
スレタイがエロ過ぎると思います。どうにかしてください。

75:デフォルトの名無しさん
07/01/09 16:57:09
>>73
0で始まる数値は8進リテラルと決められているからです。
従って、10進リテラルで0を表現することは(事実上)できません。

76:デフォルトの名無しさん
07/01/09 20:00:12
じゃ1-1で

77:デフォルトの名無しさん
07/01/10 04:38:30
>>73
0でも
00でも
0x0でも
意味は一緒だから気にすんな

78:デフォルトの名無しさん
07/01/10 05:34:56
0AUと0nmは同じ長さ

79:デフォルトの名無しさん
07/01/10 07:32:12
>>77
意味は違います。同じように使えるだけです。

>>78
工学屋から言わせれば、精度が違う。

80:デフォルトの名無しさん
07/01/10 17:57:07
int _tmain()
{
for(int n=0;n<=10;n++){
for(int i=0;i<=10;i++){
cout<<n<<" "<<i<<endl;}
cout<<n<<" "<<i<<endl;}
}

とするとiが0から11まで出力されます。10じゃないのかな?なんでだろ。

81:デフォルトの名無しさん
07/01/10 18:00:31
あげわすれました。よろしくお願いいたします。

82:デフォルトの名無しさん
07/01/10 18:02:24
>>80
<=以下
<未満

83:デフォルトの名無しさん
07/01/10 18:09:20
それは大丈夫です。>80式を動かすとnについては0-10までなのですがiが0-11となってしまいます。
for構文だからi=10のときはi<=10を満たすので「cout<<n<<" "<<i<<endl;」を実行しこのときiは10となります。
その次にiを++するのでi=11となりi<=10を満たさなくなるので、i=11が出力されるはずがないと思ったのです。
なんでなんでしょうか。

84:デフォルトの名無しさん
07/01/10 18:11:51
n  i
0  1
0  2
・・・
0  9
0  10
0  11

・・・

10  1
・・・
10  10
10  11

となります。変だと思うのです。

85:デフォルトの名無しさん
07/01/10 18:19:16
>>84
2行目の
>cout<<n<<" "<<i<<endl;} 
が余計だろう。ここのi は既に内側のforのスコープから外れてるぞ。

86:デフォルトの名無しさん
07/01/10 18:21:13
>>80式を動かすとnについては0-10までなのですがiが0-11となってしまいます。
>>84の実行例はiは1-11になってるように見えるが?
>>80で書いたコードと>>84で実行してるコードは違うだろ?

87:デフォルトの名無しさん
07/01/10 18:31:57
[完成]
int _tmain()
{
for(n=0;n<=10;n++){
for(i=0;i<=10;i++){
cout<<n<<" "<<i<<endl;}
//cout<<n<<" "<<endl;
}
}

[原因]
指摘をもとに2行目を削除したところ正しく出力されました。ありがとうございました。

[謝辞]
>85
ご指摘の通りでした。2行目が必要だと思っていましたが、実際には不要なものだったのですね。
>86
申し訳ないです。慌てていて>84でiが0の場合が抜けています。

みなさま迅速なご指導ありがとうございました。これで数時間悩んでいてほとほと困っていましたが
解決することが出来ました。

[結果]
n  i
0  0
・・・
0  9
0  10
・・・
10  1
・・・
10  10

88:デフォルトの名無しさん
07/01/11 19:05:47
Cのprintfにて文字色を変えて表示させたいのですが
\033[31m のような指定では無く
RGB指定で細かくして表示させたいのですが
そのようなことは可能でしょうか?

89:デフォルトの名無しさん
07/01/11 19:38:08
世の中そういうことができる環境があるかもしれない。
或いは自分で作ればそういうことだってできるだろう。

90:よろおね
07/01/11 22:27:20
知人からソースを貰いました。
コンパイルしようとしたら

$ gcc main.c
main.c:6:19: stdio.h: No such file or directory
main.c:7:20: string.h: No such file or directory
main.c:8:20: stdlib.h: No such file or directory

となりました。
「stdio.h, string.h stdlib.h も寄越せ ゴルラ!」と言って一週間。
未だに貰えません。
どうしたらいいでしょう?


91:デフォルトの名無しさん
07/01/11 23:03:48
明らかにあなたのビルド環境が異常です

92:デフォルトの名無しさん
07/01/11 23:07:36
>>90
stdio.h, string.h stdlib.hは知人から貰うようなものじゃない。
コンパイラをダウンロード・インストールすれば付いてくるもの。
環境さえまともに整えられないのか?

93:デフォルトの名無しさん
07/01/11 23:14:02
知人も在る場所知らない希瓦斯

94:デフォルトの名無しさん
07/01/11 23:16:11
ワロス.なんでgccがあってstdio.hがねーんだよ(w
ホラヨ(w
つ URLリンク(ftp.gnu.org)

95:デフォルトの名無しさん
07/01/11 23:18:11
どうせ
#include "stdio.h"
とか書いちゃってるオチだろ。

96:デフォルトの名無しさん
07/01/11 23:20:47
>>95
その場合も、見付からなければ<stdio.h>と書いたのと同じ方法でヘッダを探すことになっており、
gccもそれに則っているから問題ない。

97:デフォルトの名無しさん
07/01/12 11:35:58
↓このあと、>95 の「釣れた」宣言

98:偽95
07/01/12 15:21:42
Fish On!!
かかったかかったーー!!
ん?あっれぇ~
根掛かりだ~

99:デフォルトの名無しさん
07/01/12 16:08:14
わらたw

100:デフォルトの名無しさん
07/01/12 16:58:50
>>98=99
かわいそす

101:デフォルトの名無しさん
07/01/13 14:28:22
Microsoft Visual C++ 2005
で.cppのファイル開いてもビルトがでない。
どーやってコンパイルすればいいの!!

102:デフォルトの名無しさん
07/01/13 16:07:57
                ∥
           ___  ∥
       /    `ヽ∥
      ,:'      、ゑ
     ,'    ;  i  八、
     |,! 、 ,! |  ,' ,〃ヽ!;、
      |!| l川 l リへ'==二二ト、
     リ川 !| i′  ゙、    ', ',
     lルl ||,レ′   ヽ   ,ノ ,〉
       |川'、  ,,.,.r'"    ,,ン゙
        `T"  ! ,/ '.ノ,/|
         /   ,!´ !゙ヾ{ |
          /   ,'   i ゙ ! ,l゙
      ,r‐'ヽ-、!   ',  l|
      {    `ヽ   !  「゙フ
      ,>┬―/   ;  i,`{
     / /リ川'        ', ゙、
    / ,/            ゙、 ゙、
   ノ  /           ', `、
   \_/   ;          ゙、ヽ、
    l__   !        ___〕 ,、l
       ̄`‐┬―r┬‐r'´ `'‐'′
           |  .! |  |
           |  | .|  |

103:偽95
07/01/13 16:09:17
新規作成→新しいプロジェクト→特にソリューションディレクトリが必要なければチェック消す
→プロジェクト名(好きな名前で結構)[OKを押せば勝手に指定した場所の所にプロジェクトフォルダが出来る]
→OKを押して次を押す→windowsアプリケーションじゃないならプリコンパイル済みヘッダーのチェックを消す
→コンソールアプリケーションチェック、空のプロジェクトチェック、そんで完了押す
→左のソースファイルフォルダ右クリック新しい項目追加
→C++ファイルを選んで名前を付けて追加(C言語なら拡張子を.cにする)
→ソース書いてコンパイルしてビルドしてデバッグなしで開始(デバッグするならデバッグで)

104:デフォルトの名無しさん
07/01/13 21:06:16
C++で文字列の先頭から、途中までの文字列が一致するか否かを判定する関数は
ありますか?
EX:
比較文字列  2ch

比較対象文字列(一致)
2ch close

比較対象文字列(不一致)
3ch open
こんな感じで判定できるような関数なのですが・・・・・?

Windows2000
VS2005 SDK

105:デフォルトの名無しさん
07/01/13 22:03:36
string

106:デフォルトの名無しさん
07/01/13 22:52:02
不可解なエラーに悩まされています。
原因はどの辺りにあるかわかりますか?

たとえば、グローバルで定義したint a、int bがあるとして、
プログラム中でa++したときに、なぜかbも一緒に++されてしまう。
aをaaaに変更してみたりその他の関係のない変数の変数名を変更してみたり、
int a=0;と定義するとエラーが出なくなることもある。
しばらくコーディングを進めると今度は違う変数同士が干渉し始める。

どの辺りに起因して同じ領域に違う変数が割り当てられてしまうのか、見当もつきません。

WinXP
gcc(cygwin)

107:デフォルトの名無しさん
07/01/13 23:27:22
>>106
gccなんてクソコンパイラ使ってるからだよ。m9(^Д^) プギャー

108:デフォルトの名無しさん
07/01/13 23:36:02
>>106
m9(^Д^) プギャー

109:デフォルトの名無しさん
07/01/13 23:37:55
>>106
よくわからんで作ってることが原因だな

110:106
07/01/13 23:48:16
>>109
わかりました。基本から出直してきます。
ご返答ありがとうございました。

111:デフォルトの名無しさん
07/01/14 00:00:46
&b(a);
とか?

112:デフォルトの名無しさん
07/01/14 13:25:42
doubleの要素型で、要素数が5の配列の全要素に0.0を代入して表示するプログラムが分かりません。教えて下さい。C++です。

113:デフォルトの名無しさん
07/01/14 14:06:06
#include <iostream>

int main()
{
  double d[5] = {0.0};
  for(int i = 0; i < 5; i++)
    std::cout << i << " : " << d[i] << std::endl;
  return 0;
}

114:デフォルトの名無しさん
07/01/14 15:00:16
>>113
ありがとうございます!けど実行すると、0が表示されてしまいます....


115:デフォルトの名無しさん
07/01/14 15:06:08
確認のために0を表示するように書かれているからだ。

116:デフォルトの名無しさん
07/01/14 15:06:50
0というより、0になった配列の各要素と言うべきだな。

117:デフォルトの名無しさん
07/01/14 16:12:23
0 じゃなくて 0.0 を表示したいのではないかと esp

118:デフォルトの名無しさん
07/01/14 16:15:03
ほれ

#include <stdio.h>

int main()
{
double d[5] = {0.0};
for(int i = 0; i < 5; i++){
printf("%.1lf\n", d);
}
return 0;
}


119:デフォルトの名無しさん
07/01/14 16:52:50
>>117
そうです。

>>118
すいません。それはC++の場合はどうすればいいんでしょうか?

120:デフォルトの名無しさん
07/01/14 16:57:39
#include <cstdio> 

int main() 
{ 
double d[5] = {0.0}; 
for(int i = 0; i < 5; i++){ 
printf("%.1lf\n", d); 
} 
return 0; 
} 



121:デフォルトの名無しさん
07/01/14 16:58:12
>>120
ありがとうございます。

122:デフォルトの名無しさん
07/01/14 17:08:17
d[i]

123:デフォルトの名無しさん
07/01/14 17:44:48
Cプラプラで0.0から1.0まで0.001おきに、その値と、その値の2乗を表示するプログラムって、どう作ればいいんですか?

124:デフォルトの名無しさん
07/01/14 17:48:56
>>123
まずはC++のコンパイラを入手し、お前が使ってるPCにインストールする。

125:デフォルトの名無しさん
07/01/14 20:08:02
C++なら_asmが使えるからアセンブリで書いてやろうと思ったけどやめた

126:デフォルトの名無しさん
07/01/14 22:47:07
int data[10]={0};//dataの中身を全部0で初期化
これをクラスで記述する方法ってあるんでしょうか
struct a{
int data[10];
a():??{}
};

127:デフォルトの名無しさん
07/01/14 23:44:50
a() : data() {}でできない?
できないならおとなしく、コンストラクタのブロックの中でstd::fillでもするしかないな。

128:デフォルトの名無しさん
07/01/15 00:37:06
>>127
出来ました!こんな書き方があったとは
ありがとう

129:デフォルトの名無しさん
07/01/15 04:20:32
画像のピクセルサイズを取得したいのですが
どうすれば取得できますか?

130:デフォルトの名無しさん
07/01/15 09:05:21
画像ファイルの構造を知る

131:デフォルトの名無しさん
07/01/15 15:38:57
男ならwaveだろうがbmpだろうが黙ってバイナリfstream

132:デフォルトの名無しさん
07/01/15 18:29:29
>>129
BITMAPINFOを足がかりに

133:Cはできた(過去形)人
07/01/15 18:29:34
BorandC++を使ってるんですが・・・        <iostream>ファイルをオープンできません      とでてコンパイルできません・・・          いったいどうすれば・・・

134:デフォルトの名無しさん
07/01/15 18:34:02
>>133
お前じゃどうしようもないから諦めろ

135:デフォルトの名無しさん
07/01/15 18:46:29
>>133
普通にググったら見落としに気づくかもよ。

136:デフォルトの名無しさん
07/01/15 18:54:30
分割コンパイルしたオブジェクトファイルをmain.oも含めて静的ライブラリに
まとめた場合、一般にそのライブラリのみで実行ファイルをビルドすることは
できるのでしょうか?
GCCだとできたのですがVCやBCCだとどうなんでしょう?
libfoo.aがmain.o, hoge.oで構成されている場合、GCCの例だと
gcc -o exefile libfoo.a
でexefileという実行形式を作成できました。

137:デフォルトの名無しさん
07/01/15 18:57:51
256*256の二次元配列を作りたいのですが、実行するとStack overflowとでてしまいます。
どうにか回避する方法はないでしょうか?

138:デフォルトの名無しさん
07/01/15 19:06:23
>>137
ヒープに割り当てる


139:デフォルトの名無しさん
07/01/15 19:10:57
mainを含んだ静的ライブラリってのは、
Win32のスクリーンセーバライブラリがそんな感じだな。

140:137
07/01/15 19:36:29
>>138
すみません。
ヒープに割り当てる方法を教えてください。

141:136
07/01/15 19:39:26
今vc8で試してみたのですができませんでした。
具体的には
cl /EHsc /c main.cpp lib.cpp
lib /out:library.lib main.obj lib.obj
cl /Feout library.lib
out.objが開けないとエラーがでてしまいます。

142:デフォルトの名無しさん
07/01/15 19:46:55
>>140
ヒープに割り当てるというのはmalloc(Cの場合)やnew(C++)などで
動的にメモリを確保することです。
あとは調べればわかるかと思います。

143:デフォルトの名無しさん
07/01/15 21:39:29
>>141
できたぞ。
cl /EHsc /Zl /c test.cpp
lib /out:hoge.lib test.obj
link /machine:x86 /entry:mainCRTStartup /out:HOGE.EXE msvcrt.lib hoge.lib
/entryの代わりに/subsystem:consoleでもうまくいった。
またcl経由でリンカを呼び出してもできる。
cl /MD hoge.lib /link msvcrt.lib /machine:x86 /subsystem:console
いずれにしてもLNK4001(オブジェクトファイルがない)という警告が出る。

144:デフォルトの名無しさん
07/01/16 15:11:25
URLリンク(home.hiroshima-u.ac.jp)
どこでなにやってるか全然ワカランので、中盤以降に説明つけてください!
あともう少し素人が作ったっぽくなりませんか?

145:デフォルトの名無しさん
07/01/16 16:04:06
>>144
それだけ素人丸出しなら充分だと思うが。

146:デフォルトの名無しさん
07/01/16 22:33:51
Windows上で動くプログラムには仮想メモリが割り当てられてて
プログラムからは仮想メモリしか見えないんだよね?
じゃあメモリエディタってどうやってんの?

147:デフォルトの名無しさん
07/01/16 22:50:39
適切な権限さえあればよそのプロセスのメモリだって読み書きできる(真っ先に思い浮かぶのはデバッグ用途)。
大抵は権限の設定なんてやっていないから、同じユーザのプロセスならだいたい読み書きできると思っていい。

148:デフォルトの名無しさん
07/01/17 00:14:54
Windowsカーネルは全部の仮想メモリを知ってるから、
API叩いて教えてもらうんだよ。

149:デフォルトの名無しさん
07/01/17 11:27:50
実際に物理的なメモリを書き換えているとは限らない
ひょっとするとあなたの書き換えた場所はディスク上の一部かも知れない



150:デフォルトの名無しさん
07/01/21 00:10:28
質問なんですが、C++の問題集でお勧めなのはないでしょうか?
参考にしたいのでお願いします。


151:デフォルトの名無しさん
07/01/21 03:22:51
>>150
C/C++問題集スレ
スレリンク(tech板)

152:デフォルトの名無しさん
07/01/21 13:53:15
>>151
ワロタ

153:デフォルトの名無しさん
07/01/22 12:08:48
Cの経験が少しあってC++をはじめた者です。
憂鬱なプログラマのためのオブジェクト指向開発講座(第2部第5章p116)で、
「コンストラクタを使って、定数メンバの初期化を行うことができます」
と書いてありました。定数の初期化って、定数はあらかじめ
定義されているものだと思うんですけど、
どういうことでしょう?


154:デフォルトの名無しさん
07/01/22 12:21:08
定数メンバと定数は違うだろ

155:デフォルトの名無しさん
07/01/22 15:25:31
static const double a=1;
じゃだめなのですか?

156:デフォルトの名無しさん
07/01/22 16:04:03
153は非静的メンバの話だと思う。

157:デフォルトの名無しさん
07/01/22 17:09:46
>>154
>定数メンバと定数は違うだろ
定数って
const int a;
とかですか?



158:デフォルトの名無しさん
07/01/22 17:29:36
憂鬱本↓

メンバ初期化の方法はLIST6のように考えるのが普通でしょう.
確かにこのように書くことは可能です.・・・しかし,これは進められる書き方ではありません.なぜならば,これでは定数のデータメンバを初期化することができないからです.
クラスのメンバデータには定数も使用することができます.その初期化を行うのも当然コンストラクタということになるでしょう.しかし,コンストラクタとはいえ,やはり関数です.その中で定数を書き換えることはやはりできません.
さてそれでは,別の方法で定数メンバを初期化することは出来るのでしょうか.そのような特別な方法が用意されているのでしょうか.
これはそのような方法が存在します.C++では,コンストラクタがメンバを初期化するために新しい構文が設けられています.メンバの初期化はLIST7のように行います.



159:デフォルトの名無しさん
07/01/22 17:31:59
LIST6:データメンバの初期化

Person :: Person () // コンストラクタの実装部
{
age = 0 ; // 年齢の初期化
name = NULL ; // ポインタの初期化
} // しかしこの方法は薦められない!

LIST7:コンストラクタでのメンバ初期化

Person :: Person ()
: age ( 0 ) , name ( NULL ) // 正しい方法
{
// 何もしない
}


160:デフォルトの名無しさん
07/01/22 18:25:26
  _, ._
(;゚ Д゚) …?

161:デフォルトの名無しさん
07/01/22 18:38:24
新版も出たことだし、Effective C++ くらい買いなさい。

162:デフォルトの名無しさん
07/01/22 19:07:38
>>158
>これはそのような方法が存在します
日本語でおk

163:デフォルトの名無しさん
07/01/24 12:09:24
(これ、Visual C++のスレで質問するべきなのかもしれませんが)
標準C++というのでしょうか、windowsコンソールアプリケーションの
文法で、Visual C++のよなwindowsプログラミング(ファイル[メニュー]や
ボタンを付けたいだけですが)をすることってできるでしょうか?
やはりそれはVisual C++でしかできないのでしょうか?

環境はVisual C++ 2005 Express Edition使っています。


164:デフォルトの名無しさん
07/01/24 12:26:27
>>163
Visualという単語で勘違いしたのかな?VC++でコンソールアプリも書けます。
VC++でコンソールアプリを書いてもWindowsアプリを書いても、VC++の文法は同じです。
Windowsアプリの開発環境はVC++だけではありません。VB、Delphi等々色々あります。

165:デフォルトの名無しさん
07/01/24 12:53:02
>>164
返信感謝します。
(私があまり理解していないので、言葉がうまく見つかりません)
普通(?)のC++(コンソールアプリ)は、やったことがあるんですが、
windowsアプリケーションのソースを見たところ、
“ハンドル”という言葉が出てきたりして、
私が今まで勉強したC++と少し違うと思いました。
文字列に関しても、宣言が下のように違うようです。
string word  ①
   ↓
string^ word;  ②
winwosアプリをする場合は、新たに②のような文法を勉強しなければ
ならないんですよね?

166:デフォルトの名無しさん
07/01/24 15:42:41
ないない

167:デフォルトの名無しさん
07/01/24 16:20:59
ルンゲ・クッタ法を用いてX-Y軸上に楕円運動の軌道を描く際の、各点においてのX軸Y軸方向への速度をV,Uとして時間T毎にファイルに書き込みたいのですが、どういった書き方ならば綺麗に描けますか?

168:デフォルトの名無しさん
07/01/24 16:28:14
>>166
どっちでしか?

169:デフォルトの名無しさん
07/01/24 17:54:33
>>165
「string^ word;」がエラーにならないとはちょっと思えない。

“ハンドル”はHANDLEのこと?ならそれはWindowsが定義してる型。typedef void *HANDLE;。
それともメッセージハンドラ?なら、イベント駆動という考え方を知る必要がある。
まぁ、まずはWinアプリの入門書か解説ページを読んで。

170:165
07/01/24 18:11:36
返信ありがとうございました。

>“ハンドル”はHANDLEのこと?ならそれはWindowsが定義してる型。typedef void *HANDLE;。
>それともメッセージハンドラ?なら、イベント駆動という考え方を知る必要がある。

前者だと思います。
↓のように使用されていて、
文字列型のハンドル、オブジェクト方のハンドルがあると書いてありました。


private: System::Void buttonAdd_Click(System::Object^ sender, System::EventArgs^ e) {
Debug::WriteLine("追加ボタンをクリックしました");
// 品名、分類、金額を取得する
String^ name = textName->Text;
String^ kind = comboKind->Text;
String^ money = textMoney->Text;
String^ out;
out = String::Format("品名:{0} 分類:{1} 金額:{2}", name, kind, money );
Debug::WriteLine( out );
}

>まぁ、まずはWinアプリの入門書か解説ページを読んで。
普通のC++を知っているだけでは、windowsプログラミングは無理のようですね。
じっくりやってみようと思います。



171:デフォルトの名無しさん
07/01/24 19:03:37
>>170
あぁぁ、C++/CLIですね。だと文法も拡張されてるそうです。
新しいことをあまり知らないくせにレスつけました。すいません。

でもWinアプリを書くのにC++/CLIじゃないとダメってことはないですよ。

172:デフォルトの名無しさん
07/01/24 20:38:23
>>151
とりあえず、参考にしてみます。

173:デフォルトの名無しさん
07/01/24 22:12:01
>>170
そのハンドルは169の言っているものとは違う。
171も言っているが、それは.NET Frameworkを使って動くプログラムを書くために作られたC++/CLIという言語のプログラム。
普通のCもしくはC++を使ったWindowsプログラムはまた別物。


174:デフォルトの名無しさん
07/01/24 22:38:23
>>171,173
指摘していただき感謝します。
C++/CLIは別なんですね。知りませんでした。
私はC++/CLIでない普通のWindowsプログラミングをしたいのですが、
その場合は、普通のC++と同じ文法でやれるのでしょうか?

VC++2005Express使っているんですけど、
その場合、プロジェクトの作成の仕方は、
[ファイル]→[新規作成]→[プロジェクト]
から、[新しいプロジェクト]ダイアログで、
[プロジェクトの種類]で、[win32]で選ぶのかと思うんですが、
この時[テンプレート]で選択できるのが[win32コンソールアプリケーション]
だけになってしまいます。
やり方が違うと思うんですが、
教えていただけますか?


175:デフォルトの名無しさん
07/01/24 23:13:41
>>174
VC++2005ExpressEditionでwin32アプリケーションを作るには
URLリンク(www.microsoft.com)
↑で環境をもうちょっと追加しなければならない。

ちなみに
.NETアプリってのはCLRとか書いてるやつね

win32のウインドウアプリも、コンソールアプリもC++でかけるんだけど、
window.hをインクルードしたり、スタートが WinMain関数だったり、ちとちがう。
URLリンク(www.kumei.ne.jp)
↑のWindowsSDK編ってとこ読むといい。長いしめんどくさいけどね。
VC++2005ExpressEditionではちょっとメニューのエディタないからよけい大変

WindowsSDKでの開発がめんどくさいから
MFCだとか、VisualBasicとかもっと簡単にウインドウ出せるアプリ作れるものが出来てきたんだよ。
.NETアプリならVC++2005でも視覚的にウインドウアプリ作れるんだけどね。

176:174
07/01/24 23:45:24
>>175
丁寧な説明ありがとうございます。

>VC++2005ExpressEditionでwin32アプリケーションを作るには
>URLリンク(www.microsoft.com)
>↑で環境をもうちょっと追加しなければならない。
早速入れました。

>win32のウインドウアプリも、コンソールアプリもC++でかけるんだけど、
>window.hをインクルードしたり、スタートが WinMain関数だったり、ちとちがう。
>URLリンク(www.kumei.ne.jp)
>↑のWindowsSDK編ってとこ読むといい。長いしめんどくさいけどね。
>VC++2005ExpressEditionではちょっとメニューのエディタないからよけい大変
>

やってみようと思います。

>WindowsSDKでの開発がめんどくさいから
>MFCだとか、VisualBasicとかもっと簡単にウインドウ出せるアプリ作れるものが出来てきたんだよ。
>.NETアプリならVC++2005でも視覚的にウインドウアプリ作れるんだけどね。
>

わかりました。
CLRも考えようかと思います。


177:デフォルトの名無しさん
07/01/25 00:46:29
質問です、以下の構造体があったとします↓
struct Test{
int nMem;
char strMem[20];
};
上記の構造体に、関数をひとつ追加します。
struct Test{
int nMem;
char strMem[20];
void Clear(){
nMem = 0;
strcpy(strMem, "");
}
};
そして両者のsizeofをとってみたのですが、両者とも24バイトとなりメンバ関数によるサイズの増大が見られません。
これは、コンパイラがTest::Clear()の呼び出しを該当するメモリアドレスに置換しているからなのでしょうか?
多分そうだと思うのですが、参考となるようなものが無く………詳しい方、宜しくお願い致します。

178:177
07/01/25 00:47:31
追記です、実行環境はVS2003、VS2005、BCCです。

179:デフォルトの名無しさん
07/01/25 02:54:53
>>177
メンバ関数も、機械語のレベルにすれば単なる関数であることに変わりはない。
Cで擬似的に書けばこんな感じになる。
struct Test {
  int nMem;
  char strMem[20];
};
void Test_Clear(Test* this) {
  nMem = 0;
  strcpy(strMem, "");
}

180:デフォルトの名無しさん
07/01/25 11:58:29
C++の例外の使い方を解説した参考書で、オススメのものを教えてください。

文法自体の解説ではなく、使いこなしのテクニックなどについてです。


181:デフォルトの名無しさん
07/01/26 01:00:56
>>180
例外の落とし穴的なことなら Exceptional C++ にあるよ。

# もし持ってないんだったら C++ 使いとして C++ in-Depth Series は
# 揃えておくことをオススメするですよ。

182:デフォルトの名無しさん
07/01/26 14:17:33
>>181
ありがとうございます。

洋書には、知っておくべきノウハウの本があるのに、
和書には、言語仕様の解説本しかないんですよね。
洋書で足りてるから書く必要がないのかもしれないけど。

183:177
07/01/26 15:34:18
遅れてしまいました、179さんありがとうございます。

184:デフォルトの名無しさん
07/01/28 03:25:47
メインで作ったポインタをオリジナル関数内で配列領域を宣言するときはどう関数を受け渡せばいいのでしょうか。

void o(int **mem)
{
int i;
mem=(int **)calloc(10, sizeof(int));
for(i=0; i<10; i++)
mem[i]=(int **)calloc(10, sizeof(int));
}

int main()
{
int **mem;
o( );//この部分
}

185:デフォルトの名無しさん
07/01/28 04:06:30
>>184
void o(int ***mem)
{
int i;
*mem=(int **)calloc(10, sizeof(int));
for(i=0; i<10; i++)
(*mem)[i]=(int **)calloc(10, sizeof(int));
}

int main()
{
int **mem;
o(&mem);//この部分
}

186:デフォルトの名無しさん
07/01/28 04:11:30
>>185
それはやったのですが、
o内で数値を代入して、
メイン側でその数値を使おうとすると反映されていないみたいでエラーが・・・。

187:デフォルトの名無しさん
07/01/28 04:15:23
>>185
後コンパイル時に引数が異なるというエラーが。

間接参照のレベルが 'int ***' と 'int ****__w64 ' で異なっています。
仮引数および実引数と異なります。

188:デフォルトの名無しさん
07/01/28 04:16:17
>>186
だったらここだろ

void o(int ***mem)
{
int i;
*mem=(int **)calloc(10, sizeof(int *));
for(i=0; i<10; i++)
(*mem)[i]=(int *)calloc(10, sizeof(int));
}

ちなみにどんなエラーが出たのか明記しないとわからん

189:デフォルトの名無しさん
07/01/28 04:17:31
>>187
メインで int ***mem; とやってるんじゃないか?

190:デフォルトの名無しさん
07/01/28 04:22:36
>>188
完走しました。
ありがとうございました。

>>189
それはなかったです。

191:デフォルトの名無しさん
07/01/28 06:52:30
フリーウェアで、
クラス図を作れるものってありますか?

192:デフォルトの名無しさん
07/01/28 08:24:55
C/C++の質問しろよ
umlmemo

193:デフォルトの名無しさん
07/01/28 08:29:20
doxygen

194:デフォルトの名無しさん
07/01/28 09:07:10
JUDE Community

195:デフォルトの名無しさん
07/01/28 11:33:04
>>192-194
ありがとうございました。

>C/C++の質問しろよ
はい、すみません。

196:デフォルトの名無しさん
07/01/28 17:09:42
void qsort ( void* base , size_t nmemb , size_t size, int(*compar)(const void *, const void *) )

↑のを自作で作りたいのですが、誰かサンプルを作っていただけないでしょうか?
初心者でスマソorz

197:デフォルトの名無しさん
07/01/28 17:14:38
URLリンク(www.google.co.jp)
好きなのを持ってけ

198:デフォルトの名無しさん
07/01/28 17:20:36
C++でゲーム制作プログラミング勉強しようと思ってるのですが
おススメの参考書を教えていただきたいです。
本屋に行ったのですが、何を買えばいいかわからずに退散してきましたorz
要望を挙げれば実際にゲーム制作しながら学べるような参考書。
RPGではなくアクションゲーに重きを置いた参考書を望んでいます。
プログラミング経験はJAVAを2年ほど、Perlを授業でかじった程度です。
よろしくお願いします

199:デフォルトの名無しさん
07/01/28 17:21:54
>>197
どれが自作のやつかよく分かんないですorz
ほんと無知でスマソ

200:デフォルトの名無しさん
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
そのままの意味です。英語の意味が判らないと言うのであれば、鼬害です。


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