5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

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

1 :デフォルトの名無しさん:04/10/10 22:49:47
エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。

【歴代スレ】
1:http://pc5.2ch.net/tech/kako/1059/10590/1059041347.html
2:http://pc5.2ch.net/tech/kako/1067/10671/1067189450.html
3:http://pc2.2ch.net/test/read.cgi/tech/1069719929/ (消滅?)
4:http://pc2.2ch.net/test/read.cgi/tech/1073473867/ (消滅?)
5:http://pc5.2ch.net/test/read.cgi/tech/1077102238/ (dat落ち)
6:http://pc5.2ch.net/test/read.cgi/tech/1082182233/(dat落ち)
7:http://pc5.2ch.net/test/read.cgi/tech/1086373839/(dat落ち)
8:http://pc5.2ch.net/test/read.cgi/tech/1091264964/(dat落ち)
9:http://pc5.2ch.net/test/read.cgi/tech/1094494997/l50

【ラウンジ】質問、回答が長い時はココを使うと見やすい
http://do.sakura.ne.jp/%7Ejunkroom/cgi-bin/megabbs/lounge/index.html

関連スレは>>2-5ぐらい


2 :デフォルトの名無しさん:04/10/10 22:50:14

【関連スレ(処理系別)】
★初心者にVisual C++を教えるスレ★ Part14
http://pc5.2ch.net/test/read.cgi/tech/1093672937/l50

■MFC相談室 mfc11.dll■
http://pc5.2ch.net/test/read.cgi/tech/1088084875/l50

C++Builder相談室 Part11
http://pc5.2ch.net/test/read.cgi/tech/1094749339/

GCCについて part4
http://pc5.2ch.net/test/read.cgi/tech/1090062751/l50

cygwin + mingwn + gcc 相談室
http://pc5.2ch.net/test/read.cgi/tech/1058134693/

タダで使えるBorland C++ Part4
http://pc5.2ch.net/test/read.cgi/tech/1091066805/l50

タダで使えるVisual C++ $2
http://pc5.2ch.net/test/read.cgi/tech/1086287039/l50

Borland C++ BuilderX
http://pc5.2ch.net/test/read.cgi/tech/1065260556/l50

Turbo C++ 5.0 プログラミング
http://pc5.2ch.net/test/read.cgi/tech/1030878794/l50


3 :デフォルトの名無しさん:04/10/10 22:50:27
【関連スレ(その他)】
C言語なら俺に聞け! Part 92
http://pc5.2ch.net/test/read.cgi/tech/1096696253/

C++相談室 part36
http://pc5.2ch.net/test/read.cgi/tech/1096304546/

ぼるじょあがC/C++の宿題を片づけますYO! 31代目
http://pc5.2ch.net/test/read.cgi/tech/1095075678/

【C++】template 統合スレ -- Part5
http://pc5.2ch.net/test/read.cgi/tech/1091522597/l50

C++は難しすぎ 難易度:2
http://pc5.2ch.net/test/read.cgi/tech/1071697977/l50

C言語の第一歩
http://pc5.2ch.net/test/read.cgi/tech/1031374980/l50


4 :デフォルトの名無しさん:04/10/10 22:50:47
【関連スレ(その他)】
★C言語で遊ぼう!★
http://pc5.2ch.net/test/read.cgi/tech/1028269762/l50

プリプロセッサについて熱く語るスレ。
http://pc5.2ch.net/test/read.cgi/tech/1058203590/l50

C統合・質問スレッド
http://pc5.2ch.net/test/read.cgi/tech/1068359871/l50

フリーコンパイラー使えよ。
http://pc5.2ch.net/test/read.cgi/tech/1061384369/l50

C、C++の最適化について語るスレ
http://pc5.2ch.net/test/read.cgi/tech/1084676298/l50

ラウンジでC言語
http://etc3.2ch.net/test/read.cgi/entrance/1093006298/l50


5 :デフォルトの名無しさん:04/10/10 22:52:34
次スレ立ってないみたいなので勝手にスレ立て。
一応関連スレも最新に更新したつもりだけど抜けがあったらスマソ。

6 :デフォルトの名無しさん:04/10/10 23:00:26
スレ勃て乙

7 :デフォルトの名無しさん:04/10/10 23:33:01
MFCスレはここが最新でした。_| ̄|○

■ MFC相談室 MFC12.dll■
http://pc5.2ch.net/test/read.cgi/tech/1096848771/



8 :デフォルトの名無しさん:04/10/10 23:43:10
>>1
早いな。オツカレ。

9 :デフォルトの名無しさん:04/10/11 01:39:10
ウワァァァァァァン。・゚・(ノД`)・゚・。
オーバーロードとオーバーライドがワケワカラン!
なんでこいつらこんな名前似てるの?

10 :デフォルトの名無しさん:04/10/11 02:24:34
カタカナデカンガエルカラワケワカンナクナルンダヨ

11 :デフォルトの名無しさん:04/10/11 03:01:19
>9
とりあえず俺はオーバーライドの「ライド」という部分の意味で識別してる。

12 :デフォルトの名無しさん:04/10/11 03:12:07
そっか、オーバーロードは多重定義
オーバーライドは・・・漢字で何て書くんだろ
ライドはrideだから乗る・・・上乗り。よし、覚えたぜ!!!

13 :デフォルトの名無しさん:04/10/11 03:38:33
いや・・・普通に英語で。
overload - 荷を積み過ぎる
override - 優先する
だっけか?

14 :デフォルトの名無しさん:04/10/11 04:25:22
overload 腎虚
override 騎乗位

15 :デフォルトの名無しさん:04/10/11 05:27:42
>>13
ダメじゃん

16 :デフォルトの名無しさん:04/10/11 05:45:11
VC6はひょっとして#include <iostream> using namespace std;に対応してない?
clに-gxでやれゴルァといわれちゃうんですけど

17 :デフォルトの名無しさん:04/10/11 05:48:54
/* sample16.c */
#include <stdio.h>
int main(void)
{
int a, x;
int *pa; /* ポインタ変数の宣言 */
a = 100;
pa = &a; /* 変数aのアドレスを代入する */
printf("address=%x\n",pa); /* 変数aのアドレスを表示 */
x = *pa; /* 変数aのアドレスの内容をxに代入 */
printf("data:a=%d x=%d\n",a,x);
}

を実行すると一瞬だけウインドウが表示されてすぐに消えてしまって
結果が確認できません
どうすれば結果が表示されたままになるのでしょうか?

18 :デフォルトの名無しさん:04/10/11 06:03:40
>>17
どのように実行したのですか?

19 :17:04/10/11 06:06:05
>>18
f5を押しました

20 :デフォルトの名無しさん:04/10/11 06:09:18
>>17
終わりにgetchar();

21 :デフォルトの名無しさん:04/10/11 06:12:33
>>18
>>20
うまいこといきました

ありがとうございました

22 :デフォルトの名無しさん:04/10/11 06:17:06
>>19
f5は何かのショートカットですか?

23 :デフォルトの名無しさん:04/10/11 06:27:21
デバッグ実行 by vc6
>>21
その前にCtl+F5ですよ。

24 :デフォルトの名無しさん:04/10/11 06:36:09
#include <stdio.h>
int main(void)
{
int a, x;
int *pa; /* ポインタ変数の宣言 */
a = 100;
pa = &a; /* 変数aのアドレスを代入する */
printf("address=%x\n",pa); /* 変数aのアドレスを表示 */
}
↑の時はpaでアドレスが表示されるのに

#include <stdio.h>
int main(void)
{
char *pa;
pa = "abcd";
printf("%s\n",pa);
}
↑の時はアドレスが表示されないで文字のabcdが表示されるのですか?


25 :デフォルトの名無しさん:04/10/11 06:38:07
>>23
ありがとうございます

ちゃんと表示されたままになりました

26 :デフォルトの名無しさん:04/10/11 06:40:22
>>24
だって文字列表示と指示してんじゃん。

27 :デフォルトの名無しさん:04/10/11 06:42:01
>>24
出力書式でググッてみな

28 :デフォルトの名無しさん:04/10/11 06:53:53
>>26
>>27
>printf("%s\n",pa);
調べてみました

でフォーマット指定子が%sの時はpaのアドレスにはいっているabcdが表示されて
%dにするとなんか数字が表示されたんですけどabcdが入ってるアドレスが表示されたんですか?

paはアドレスしか示さないと思ってたのにびっくりです



29 :デフォルトの名無しさん:04/10/11 10:18:46
%dと%xの違いは10進数か16進数かということ。
っていうか聞く前に自分で調べろや。

30 :デフォルトの名無しさん:04/10/11 10:42:15
>>24
%p が使える環境ならそれを使うべき。
%x,%d で代用するならキャストが要る。


31 :デフォルトの名無しさん:04/10/11 12:35:48
OpenFileMappingに失敗します。OpenFileMappingの戻り値はNULL、エラーコードは2(指定されたファイルが見つからない)です。
オブジェクト名は何度も確認したので間違いありません。CreateFileMappingには成功し、オブジェクトに書き込んだデータを
OutputDebugStringで表示することができました。失敗の原因として、オブジェクト名以外に何が考えられますか?
使用しているコンパイラはBCCです。猫でもわかるの123章のプログラムを実行しました。

32 :デフォルトの名無しさん:04/10/11 13:27:35
#include <stdio.h>

struct teststruct
{
int x,y,z;
};
void func(struct teststruct *test[]);
int main()
{
struct teststruct test[8];
test[1].x=8;
func(&test[1]);


}
void func(struct teststruct *test[])
{
printf("%d" , test[1]->x);
}

何度もすいませんけど
メイン関数内のtest[1]の内容を関数func()の中で見たいんですけど
どうしたらいいのでしょうか?
上の様にすると実行中に
test1.exe の 0x00411af4 でハンドルされていない例外が発生しました
: 0xC0000005: 場所 0xcccccccc を読み込み中にアクセス違反が発生しました。 。
と出てきます

33 :デフォルトの名無しさん:04/10/11 13:44:23
× func(&test[1]);
○ func(test);

34 :デフォルトの名無しさん:04/10/11 13:45:23
ん?
× void func(struct teststruct *test[])
○ void func(struct teststruct test[])

× printf("%d" , test[1]->x);
○ printf("%d" , test[1].x);


35 :デフォルトの名無しさん:04/10/11 13:46:01
>>32
なんでそれで正しく動くと思うの?

36 :デフォルトの名無しさん:04/10/11 13:52:15
無意味な質問キタ━━━━━━(゚∀゚)━━━━━━!!

37 :デフォルトの名無しさん:04/10/11 13:52:25
>>33
>>34
>>35
レスありがとうございます
ご指摘の通り修正したらエラーは出なくなったんですけど
8じゃない別のすごい大きな数字が表示されます
test[1].x=8;
で8を代入したはずなのになんでなんですか?

いろいろ調べて例とか見て改良を加えてみたのですが
正しく動くかどうかまでは判断できなかったので聞いてみました

38 :デフォルトの名無しさん:04/10/11 13:54:13
>>37
少なくとも自分で正しく動くと思うものを持ってきてくれ。

39 :デフォルトの名無しさん:04/10/11 13:59:19
>32
よくわからんので、オレ流に書き直してみた。

#include <stdio.h>

typedef struct
{
  int x;
  int y;
  int z;
} teststruct;

void func(teststruct* pTest);

int main()
{
  teststruct test[8];

  test[1].x=8;
  func(&test[1]);
}

void func(teststruct* pTest)
{
  printf("%d\n" , pTest->x);
}

40 :デフォルトの名無しさん:04/10/11 14:13:03
>>39
うまくいきました
おかげさまで解決しました
ありがとうございました


41 :デフォルトの名無しさん:04/10/11 15:01:07
>>40
なぜ>>39でうまくいくのかよく考えてくれよ。
このスレは初心者歓迎って書いてあるから質問にはそれなりに回答するけど、
かわりにやってやるスレじゃないからな。


42 :デフォルトの名無しさん:04/10/11 16:09:57
要するに配列とポインターをいまいち理解しきれてない模様

43 :デフォルトの名無しさん:04/10/11 21:01:22
メモリマップ書きながらお勉強すると割りと簡単に理解できるよね

44 :デフォルトの名無しさん:04/10/11 23:45:34
MFCアプリケーションからコンソールアプリケーションの標準出力結果を取得するプログラムを作成中です。
OSはWindowsXP,コンパイラは.NET2003です。

("test.exe"での標準出力をbufにセットする処理)

http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1060403548&res=122

以上の処理までは作成できましたが、
このとき、"test.exe"で'\n'や'\t'などの空白文字を標準出力しているのに
ReadFileしたときにはそれらの空白文字が飛ばされてbufにセットされています。
どこが間違いでこうなるのかがわからないのでお教え願います。

45 :デフォルトの名無しさん:04/10/12 00:48:06
bufの表示か書き出しの仕方のほうがまずいかんじ

46 :デフォルトの名無しさん:04/10/12 06:54:02
#include <stdio.h>
#include <math.h>
struct teststruct
{
int x,y,z;
};
struct teststruct func(void);
int main()
{
struct teststruct test[8];
test=func();
printf("%d" , test[0].x);
printf("%d" , test[1].x);
printf("%d" , test[2].x);
}
struct teststruct func(void)
{
struct teststruct test[8];
  test[0].x=7;
test[1].x=1;
test[2].x=3;
return test;
}
func内のtest[0]〜test[7]をそっくりそのままmainに渡したいのですけど
上のプログラムだと
error C2440: '=' : 'teststruct' から 'teststruct [8]' に変換できません。
error C2440: 'return' : 'teststruct [8]' から 'teststruct' に変換できません。
とエラーがでますどうすればいいのでしょうか?




47 :デフォルトの名無しさん:04/10/12 08:32:32
>>46
まず配列のコピーは代入したからといってコピーしてくれるわけではありません。
次に関数の返却値はコンパイルエラーそのままです。
だからC++では
const teststruct (&f())[8]{....} こんなことやって配列の同じ型なら返せますけど・・・だれもやらない。と、思う。
で、言いたい事は最初に言ったことを覚えればいいです。
最後に
ttp://www9.plala.or.jp/sgwr-t/
こんなところで勉強した方がいいかも。
内容は読んでないからよくわからないけど見出しではいろいろそろってる感じだし
なんか、本も出版してるみたい。

48 :デフォルトの名無しさん:04/10/12 08:34:41
>46
漏れならこう書く

#include <stdio.h>

struct teststruct
{
  int x,y,z;
};

void func(struct teststruct* pTest);

int main()
{
  struct teststruct test[8];

  func(test);
  printf("%d\n" , test[0].x);
  printf("%d\n" , test[1].x);
  printf("%d\n" , test[2].x);
}

void func(struct teststruct* pTest)
{
  pTest[0].x=7;
  pTest[1].x=1;
  pTest[2].x=3;
}

49 :デフォルトの名無しさん:04/10/12 09:28:29
>>47
わかり易そうな解説のサイトですね
お気に入りに登録しました
>>48
なるほど、リターンで返さないでもこうすればできるんですね

おかげさまで解決しました
お返事ありがとうございました





50 :デフォルトの名無しさん:04/10/12 09:49:46
>>49
>なるほど、リターンで返さないでもこうすればできるんですね
お前もう一度一から勉強し直せ・・・。

51 :デフォルトの名無しさん:04/10/12 09:56:03
似たような質問ですいませんが
下のプログラムは不完全なんですけど
やりたいことはわかってもらえると思うんですけど
#include <stdio.h>
#include <math.h>
struct teststruct
{
int x,y,z;
};
struct teststruct func(void);
int main()
{
struct teststruct test[];
test=func();
printf("%d" , test[0].x);
printf("%d" , test[1].x);
printf("%d" , test[2].x);
}
struct teststruct func(void)
{
a=5;
std::vector<struct teststruct> test(a);
test[0].x=7;
test[1].x=1;
test[2].x=3;
return test;
}
配列の要素数aの値はfunc内で求めなければいけないので今度は>>48の方法が使えなくなりました
func内のtest[0]〜test[a]をそっくりそのままmainに渡したいのですけど
どうすればいいのでしょうか?
c言語使ってます

52 :デフォルトの名無しさん:04/10/12 10:13:53
>>51
c言語でvectorは使えない。これはc++のライブラリ。

あと君はポインタの勉強がまだのようですね。
ポインタが分からないと配列は扱えないので
まずそちらをきちんと勉強しましょう。

53 :デフォルトの名無しさん:04/10/12 11:57:00
.NETでC++で開発してます。
MFCアプリケーションでダイアログベースで作ってます。
ある程度コントロールを配置してイベントを書いたところで、
ダイアログのIDを変更したところ、
なぜかリソースビューのダイアログエディタでボタン等をダブルクリックしたら、
MFCクラスウイザードが立ち上がり、今までのソースファイルとは別のソースファイルのクラスの作成を促されます。
ダイアログのIDの変更を生かしつつ新しいクラスを作成せずに今まで作ったソースを利用するにはどうすればいいのでしょうか?

54 :デフォルトの名無しさん:04/10/12 12:34:54
>>53
1行目と2行目の間にそこはかとなく矛盾があるがそれは置いておくとして、
ダイアログクラスのなかに enum{ IDD = HOGE }; の形でダイアログテンプレートのIDが記憶されてる。
それと実際のテンプレートのIDが合ってないとウィザードが新しいクラスを作ると言い出す。

55 :53:04/10/12 13:03:34
ありがとうございます。
目的通り動きました。

56 :デフォルトの名無しさん:04/10/12 13:38:16
mallocで確保されるメモリー領域は必ず連続した領域として
確保されているんですか?
幾つかに分割されていることもあるんでしょうか?

57 :デフォルトの名無しさん:04/10/12 13:39:52
>>46
ポインタについてよく理解できていないようですね。私の分かる範囲で指摘しておきます。
まず、test=func();という記述は明らかにおかしいです。配列名は配列の基底アドレスを示す定数のポインタです。
従って、配列名を左辺に置くことはできません。
次に、return test;という記述がおかしいです。関数funcの戻り値はteststruct型の構造体ですが、
testはteststruct型の構造体へのポインタです。戻り値の型が一致していません。
このような場合一般的には、関数の引数として、teststruct型の構造体へのポインタを渡します。
そうすれば、main関数で宣言されたteststruct型の変数testの内容を、間接的に別の関数で書き換えることができます。

58 :デフォルトの名無しさん:04/10/12 13:47:58
>>56
実体はシランがプルグラマからは連続した領域に見えるから(・ε・)キニシナイ!!

59 :デフォルトの名無しさん:04/10/12 15:14:34
class A{

public:
  A(){};
  B* bobj;
  void funcB(B*);
};
//A.h

class B{

public:
  B(){};
  A* aobj;
  void funcA(A*);
};
endif//B.h

このような2つのヘッダファイルを
コンパイルすると、エラーになってしまいます。
AとBの間で通信を行おうとしているのですが、具体的にはAとBはウィンドウで
Aのボタンを押したら結果をBに反映させ、Bのボタンを押したら、結果を
Aに反映させようとしております。何か良い方法が無いでしょうか?
宜しくお願いいたします。


60 :デフォルトの名無しさん:04/10/12 15:26:11
ヘッダ分けずにclass A の定義の前でclass Bを宣言だけする。


61 :デフォルトの名無しさん:04/10/12 15:27:10
>>59
mediatorパターン

62 :59:04/10/12 15:47:19
>>60>>61
ありがとうございます。A=プロパティシートB=子MDIチャイルドです。
>>60
多分先頭でclass B;と書くのですね?
今まで、こういうソースを見ても良くわからず、理解に苦しんでおりました。

>>61
共通の基底クラスを作ってそこからABを派生させるという事で宜しいでしょうか?
とりあえず、「AはA、BはB」と分けるのがスジと思っておりますので、「家系図」を
考えてみます。

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


63 :デフォルトの名無しさん:04/10/12 15:51:08
失礼しまつ
http://pc5.2ch.net/test/read.cgi/tech/1095075678/669
・アルゴリズム・データ構造の説明(少なくていいです)
・スピードやメモリの効率向上のためなど工夫した点
を聞きたいのですが、おねがいします

64 :デフォルトの名無しさん:04/10/12 15:51:56
>>63はマルチなのでスルー

65 :デフォルトの名無しさん:04/10/12 15:53:49
>>64
マルチですんませんがマジで困ってるんです
助けてください

66 :デフォルトの名無しさん:04/10/12 15:54:40
>>65
むしろ荒らしだろ
マルチするにも程がある

67 :デフォルトの名無しさん:04/10/12 16:09:40
実行速度が速すぎてキャラの移動が早すぎるので
ウエイトかけたいんですけど簡潔で効率的なウエイトのかけ方を
教えてくださいC言語でおねがいします

68 :デフォルトの名無しさん:04/10/12 16:11:31
>>67
DirectDraw/Direct3D

69 :デフォルトの名無しさん:04/10/12 16:13:32
>>68
そっちで聞いてみます
誘導サンクス

70 :デフォルトの名無しさん:04/10/12 17:45:28
自分でアーカイブしたファイル(無圧縮)を読み込んでいるのだけど、

BOOL LoadFile(short nNum){ //ファイルを読み込む関数
HANDLE handle=0; //ファイルハンドル
CFileAercaiver cFa; //アーカイブファイルから読み込むための自作クラス。

if (!cFa.Open("アーカイブファイル名"nNum)) //成功したら、指定したアーカイブのnNum番目のファイルの情報とファイルハンドルを、cFaオブジェクトが保有します
 handle = cFa.GetHandle(); //アーカイブファイルのハンドルを取得

/*cFa.Open()内では、
 ※m_hFileは、privateのメンバ変数
 m_hFile = CreateFile("アーカイブファイル名", GENERIC_READ, FILE_SHARE_READ, NULL,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

 //処理を省略)アーカイブファイルのヘッダーを読み、nNum番号のファイルへのファイルポインタ(dwFPont)を取得する。

 SetFilePointer(m_hFile,dwFPont,NULL,FILE_BEGIN); //nNum番号のファイルの先頭にファイルポインタを移動
*/
//指定ファイルのヘッダーを読む
LoadHeder(handle);
}
------------------
BOOL LoadHeader(HANDLE &hFile){
 RIFFHEAD riffhead; //自作の構造体 ※20byte
 DWORD readed;

 ReadFile( hFile, &riffhead, sizeof(RIFFHEAD), &readed, NULL );
}
このLoadHeader関数内のReadFileが問題で、ReadFileは1を返して、readedもちゃんと20になっているのだけど、
riffhead構造体のメンバがすべて0になってしまいます。なぜ読み込めないのか、ヒントだけでもお願いします。


71 :デフォルトの名無しさん:04/10/12 17:47:33
読んだファイルの内容が全部0x0というオチ

72 :70:04/10/12 18:16:36
>>71
スミマセン、マジでそんなオチがつくかもしれません OTL
読み込もうとしてるファイルは、wavファイルのアーカイブなんですが、
その元のwavファイルには、ちゃんとヘッダー情報が保存されているのに…。

同じアーカイバのルーチンでbmpも扱っているけど、これは正常に読めてたので、
アーカイバには問題無いと思ってましたが、もう一度見直してみます。


73 :44:04/10/12 22:39:24
>>45さん、ご解答ありがとうございました。
調べてみたら、bufはちゃんと改行文字を取得していて、
それを表示する際に間違えていました。
どうも、お手間をかけさせてすみませんでした。

74 :デフォルトの名無しさん:04/10/12 23:40:01
typeid( anInstance ).name()で取り出せる型情報を示す文字列が
minGWでコンパイルしたものとVCでコンパイルしたものとで違うんですがコンパイラ依存なんですか?
具体的にはminGWの方が
  St16runtime_error
とかよくわからないプレフィックスが付いてるっす。


75 :70:04/10/12 23:40:45
>>71
ホントにそういったオチでした… OTL ハズカシイ…
アーカイバをちょっと変更したとき、アーカイブファイルも更新してやるべきでした。

2日も悩んでたことが解決しました。ありがとうございました。

76 :デフォルトの名無しさん:04/10/12 23:56:17
>>74
コンパイラ依存です。

77 :74:04/10/13 01:50:01
>>76
なるほど。ありがとう。
JAVAの教本か何かで例外には意味のある名前を付けようみたいな事が
書いてあってC++でも型名取得する方法あるかな・・・と思ったのですが、name()で
常に意味のある文字列を返すと思って使わない方がよさげですね。

78 :デフォルトの名無しさん:04/10/13 09:53:20
クラスの中に静的なポインタと、そのポインタを初期化する静的な関数を作ったのですが、
"error LNK2001: 外部シンボル ""private: static int * a::ptr" (?ptr@a@@0PAHA)" は未解決です。"
というエラーが出て、リンクの時点で失敗します。
ソースは以下です。
ポインタが、普通の変数なら上手くいくんですが、原因が分かりません。
分かる方いらっしゃいましたら、ご教授お願いします。

//----------------------------
#include <stdio.h>

class a{
static int *ptr;
static void func(void);
};
int a::*ptr;

void a::func(void)
{
ptr = NULL;
}

void main(void)
{
}
//----------------------------

79 :デフォルトの名無しさん:04/10/13 09:58:34
>>78
#include <cstdio>
class a{
static int *ptr;
static int *func(void);
};
int a::*ptr (a::func ());
int *a::func(void)
{
return NULL;
}

int a::*ptr (NULL);


80 :デフォルトの名無しさん:04/10/13 09:59:19
int *a::ptr;

81 :79:04/10/13 10:00:08
いけね
-int a::*ptr (a::func ());
+int *a::ptr (a::func ());

-int a::*ptr (NULL);
+int *a::ptr (NULL);


82 :デフォルトの名無しさん:04/10/13 12:52:28
最近Cを勉強して見ようと思い、簡単なサンプルコードなどをコンパイルしていますが
拾ったものをコピペすればきちんと実行されるが、
自分で全く同じものを書いてもエラーがでてしまいます。
わけがわかりません。例えば、
#include <stadio.h>
int main()
{
printf("Hello World\n");
return 0;
}
で、インクルードファイルをオープンできない
  プロトタイプ宣言のない関数printfのよびだし
とでてコンパイルできません。初心者以下の質問のような気がしますが、
どうかどなたか何が悪いのか教えてください。
コンパイラはBCCです。

83 :デフォルトの名無しさん:04/10/13 12:57:32
>82
#include <stadio.h>
よく嫁

84 :デフォルトの名無しさん:04/10/13 13:01:20
#include <stdio.h>
#include <stdio.h>
#include <stdio.h>
(゜∀゜)

85 :82:04/10/13 13:18:10
本当に申し訳ないorz
みなさんどうもありがとうございました。

86 :デフォルトの名無しさん:04/10/13 15:37:20
>>85
どんまい。

87 :デフォルトの名無しさん:04/10/13 19:49:12
#include <studio.h>ならまだ気持ちは理解できたかも。

88 :78:04/10/14 00:26:24
>>79,81
レスが遅くなりました。
int *a::ptr (a::func ())
はつまり、func の戻り値を入れているということですよね?
確かに、試してみたらうまくいきました。

が、なぜfunc関数内でptrに直接入れられないのでしょうか?
ともあれ、もう少しいろいろいじってみます。
教えてくださってありがとうございました。

89 :デフォルトの名無しさん:04/10/14 00:38:28
>>88
class a { static int *ptr; };
int a::*ptr;
これら二つの変数が別物だということは理解できていますか?

90 :78:04/10/14 01:24:59
>>89
えーと、いろいろ調べてみたのですが、
int a::*ptr;
は、つまりメンバポインタというやつでしょうか?

78のソースの
int a::*ptr;
を、
int *a::ptr;
に変えただけで上手くビルドできたので、
普通のポインタを宣言するところを、間違ってメンバポインタを宣言してしまっていた
という解釈でいいんでしょうか?

うーむ、なんかトンチンカンなことをいっている気がします。
まだまだ修行が足りませんね。

91 :デフォルトの名無しさん:04/10/14 01:34:31
C++専用のヘッダファイルの拡張子は*.h(ほとんど), *.hpp(それなりに), *.hxx(みたことがない)
とかがありますけど、「好きに選べ」以外の選択材料はありますか?

92 :デフォルトの名無しさん:04/10/14 01:44:18
>90
概ねあってますが、この場合、宣言というよりも定義という方が正しいと思います。

93 :デフォルトの名無しさん:04/10/14 01:46:17
>>90
int *a::ptr;はint*型でclass aのメンバptr。
int a::*ptr;はint型のclass aのメンバへのポインタptr。

【その他】
・こういう時はint* a::ptr;と書いた方が分かりやすい。
・宣言と定義はきちんと使い分けること。
・C++で関数の引数がないときに普通voidは書かない。(void func()で十分)
・void main()は規格にない。int main()にすること。

94 :78:04/10/14 02:10:56
>>92,93
大変勉強になりました。
ありがとうございました。

95 :デフォルトの名無しさん:04/10/14 09:13:45
>・C++で関数の引数がないときに普通voidは書かない。(void func()で十分)
どこの普通よ

96 :デフォルトの名無しさん:04/10/14 10:28:05
>>95
はCとC++の区別のつかない低脳ぶり

97 :デフォルトの名無しさん:04/10/14 10:34:13
>>91
c  ⇔h
cpp⇔hpp
cxx⇔hxx

98 :デフォルトの名無しさん:04/10/14 16:53:18
コピーコンストラクタについて質問です。

class Hoge{
priavte:
 int hage;
public:
 Hoge(){ hage = 0; }
 Hoge( const Hoge &src ){ this->hage = src.GetHage(); }
 ~Hoge(){}

 int GetHage(){ return hage; }
};

大抵のHPで書かれている方法が、上記のようなことなのですが
error C2662: 'Hoge::GetHage' : 'const Hoge' から 'Hoge &' へ 'this' ポインタを変換できません。
とエラーが出てしまいます。const を外せばエラーは消えますが…
環境はVC7ですが、VC7の仕様で他のコンパイラでは正常なのでしょうか?
また、仕様であれば、現在はどのような方法が主流なのでしょうか?
ご教授お願いします。

99 :デフォルトの名無しさん:04/10/14 16:56:56
って、書いた後猫でもわかるHPのconstオブジェクトにて解決しました^^;
スレ汚しすみませんでした

100 :デフォルトの名無しさん:04/10/14 17:25:26
>>88
>なぜfunc関数内でptrに直接入れられないのでしょうか?
入れれないことはないです
ちゃんとa::funcを呼び出せばOK
#include <cstdio>
class a{
public:
static int *ptr;
static void func(void);
};
int *a::ptr;
void a::func(void) {ptr = NULL;}
int main(void) {
a::func ();
return 0;
}


101 :デフォルトの名無しさん:04/10/15 07:14:05
ちょいと疑問に思ったんで。愚痴(?)聞いてください。
ふつーWindowsならshift_jis, Unix系ならeuc-jpでソースを書く
やないですか。

 cout << "Hello, 世界";

文字列リテラルにマルチバイト文字含みますわね。

FDIS召還したらば:

  string-literal とは
    s-char-sequence を "" または L"" で囲ったもの

  s-char-sequence とは
    s-char または
    s-char-sequense s-char (←つまり s-charの並び)

  s-char とは
    任意の source character set (" \ 改行 を除く) または
    escape-sequence または
    universal-character-name (← \u... \U... のことらしい)

となってます。source character set はいわゆる ASCII文字。

とすると、文字列リテラルの中に(いわゆる)'漢字'をじか書き
してはイケナイってことなんでしょか? 漢字を文字列リテラル内に
埋め込みたいなら excape-sequence 使わにゃならんのでしょうかホントは

102 :デフォルトの名無しさん:04/10/15 11:08:08
神様は仰っしゃいました。
自分が正しいと思うことをやりなさい。

103 :デフォルトの名無しさん:04/10/15 15:32:00
ちょっとお聞きしたいのですが、
ファイルの中が 00 00 00 01 をfreadでintに読み込むと
printfで"%#x"を表示させたとき0x1000000になるんですが
こうなるのが普通なんでしょうか?0x1になると思ってたんですが…
どういう理屈なんでしょう?fwriteで0x1を書き込んでも01 00 00 00になるし

環境はMinGW gcc3.2.3でやってます。


104 :デフォルトの名無しさん:04/10/15 15:34:18
>>103
タマゴを割る時、太い方と細い方のどっちで割る?
おれっちは細い方から割るかな。

105 :デフォルトの名無しさん:04/10/15 15:40:41
>>103
リトルエンディアン ビッグエンディアン
で検索汁

106 :デフォルトの名無しさん:04/10/15 15:55:17
>>104、105
即レスどうもです。

CPUによって違いがあるのですね。
勉強になりました。ありがとうございました。


107 :104:04/10/15 16:10:08
あ、ぽこたんまで礼言われちゃったお

108 :デフォルトの名無しさん:04/10/15 16:23:46
>>106
ネットワークに流すデータの場合はリトルエンディアンのCPUであっても
ビッグエンディアンに変換してから送出しないといけない場合があるよ

109 :デフォルトの名無しさん:04/10/15 17:44:04
次から次へとバグが出てくる
疲れました
さようなら…

110 :デフォルトの名無しさん:04/10/15 21:53:46
化けて出るなよ、R.I.P.

111 :デフォルトの名無しさん:04/10/15 22:40:47
>>109
設計か君の頭にバグがあるからだと思う

112 :デフォルトの名無しさん:04/10/16 01:04:23
>>101
翻訳フェーズのはじめあたりで、 basic source character set 以外の文字をすべて
universal-character-name に置き換える処理が入ることになっている。
この置き換え方法は処理系定義とされていて、
さらに同じ結果が得られるなら独自の変換を使用してもよい事になっている。
ttp://www.kuzbass.ru/docs/isocpp/lex.html#lex.phases

あまり初心者歓迎スレでやる話じゃないな。

113 :デフォルトの名無しさん:04/10/16 10:22:24
exeファイルを逆アセンブルすれば
どこらへんまでプログラムを解析できるんでしょうか?
ソースくらいまでわかってしまうんでしょうか?

114 :デフォルトの名無しさん:04/10/16 10:44:42
>>113
ソースはどうやっても無理。情報が残ってないから。
同じようなソースを復元するのなら、スキル・想像力・忍耐力・時間があれば可能だろうが…

115 :デフォルトの名無しさん:04/10/16 10:56:34
>113
元の変数名はわからないから用途も不明。
定数なんかも即値で埋め込まれるからマジックナンバーだらけ。
条件文やループ文もJUMP命令の嵐。
そんな汚いソースでよければ解析してくれたまい。

116 :デフォルトの名無しさん:04/10/16 12:19:08
構造体も消滅しちゃうしな。

117 :デフォルトの名無しさん:04/10/16 12:27:20
exeを解析すると元のソースがC++だったとかJavaだったとかは分かるのかなぁ

118 :デフォルトの名無しさん:04/10/16 13:01:31
>>115
俺が最初に就職した会社で最初に振られた仕事がモロにそれだった
objファイルとexeファイルだけ渡されて、ソースの復元を(構造体も含めて)しろって
ソース読む能力を付けさせるための仕事だったんだろうとは思うが、泣きそうになりながら
復元した記憶がある

119 :デフォルトの名無しさん:04/10/16 13:24:22
>>117
分かるよ


120 :デフォルトの名無しさん:04/10/16 13:27:53
>>118
それ、いわゆる新人イジメだと思う。

121 :デフォルトの名無しさん:04/10/16 13:32:05
C99に対応してるコンパイラってある?

122 :デフォルトの名無しさん:04/10/16 13:44:31
部分対応とかばっかりじゃないかな

123 :デフォルトの名無しさん:04/10/16 14:04:29
>>121
意外なことにVCの適合率がかなり高い
でもオススメはやっぱgcc

124 :デフォルトの名無しさん:04/10/16 14:16:11
C++BuilderX にC99準拠コンパイラのプレビュー版とかあるみたい

125 :デフォルトの名無しさん:04/10/16 14:40:48
友人にC勉強中はgccで-Wall -Werror -g付けておけと言われたのですが外しても良いですか?

126 :デフォルトの名無しさん:04/10/16 14:43:08
dame

127 :デフォルトの名無しさん:04/10/16 22:10:19
変数のスコープでどうしてもわからないところがあるのですが
forやif分で宣言した変数はそのブロック内に限られると書籍には書いてあったのですがVC++6.0で試してもどうもそうはないってないと思うのです。
下のソースをコンパイルしたときにスコープ外での使用でエラーが出るはずだと思うのですがエラーにならないのはなぜなのでしょうか?
#include <iostream>
using namespace std;
void loop()
{
    for(int i=0; i<10; i++){cout << "ループ" << i+1 << "回目です。\n";}
    cout << i << endl;//forブロックの外でiを使用。ここでエラーが出るはずなのでは??
}
int main()
{
    loop();
    return 0;
}

128 :デフォルトの名無しさん:04/10/16 22:12:13
VCがクソだから
VC 2005でも未だに直ってない
嫌ならオプションで消せるが…

129 :デフォルトの名無しさん:04/10/16 22:28:00
>>127
かつてARMと呼ばれる書籍でそのように決められていたから。
現在では規格で君が言ったように決められているから、コンパイラの
挙動が間違っている。コードの移植性が下がるから、自分で規格通りに
なるように気を付けよ。

130 :デフォルトの名無しさん:04/10/16 22:29:38
>>127
マクロ無かったっけ?
#define for(arg) if (false); else for (arg)
こんな感じでforのスコープを規格通りにさせるやつ


131 :デフォルトの名無しさん:04/10/16 22:35:36
>>130
そんなマクロ最悪

132 :デフォルトの名無しさん:04/10/16 22:43:17
>>131
VC使ってないので記憶が曖昧なんだけど
結構そのたくましさに感心したんだけどな
最悪な理由を解説よろしく


133 :デフォルトの名無しさん:04/10/16 22:45:17
>>128
オプションで直せるんですか?
VC++6.0でも直せればぜひぜひ方法をば・・

134 :デフォルトの名無しさん:04/10/16 22:47:19
>>133
ってかC++使いたいんならVC6なんか使うなよ
.NETに移行すれ

135 :デフォルトの名無しさん:04/10/16 22:51:06
>>133
C/C++→カスタマイズ→Microsoft言語拡張機能を無効にする
にチェック。
でもMFCとか使えなくなるんじゃないかな。

136 :130:04/10/16 22:56:01
な〜んだ直せるのか


137 :デフォルトの名無しさん:04/10/16 23:14:47
>>135
MFCが使えなくなる・・・さりげなく厄介ですね。
コンソールで動くプログラム限定で使用が望ましい気配。。。

138 :デフォルトの名無しさん:04/10/16 23:20:08
いや、正確な所は確認してね
最近はVC++使ってないからシラネ

139 :137:04/10/16 23:25:36
なんかエラーが出なかったコードまでエラーが出るようになった。。
VC++6.0がすでに時代遅れなのか。。やっぱり.netを検討するべきか。。。

140 :デフォルトの名無しさん:04/10/16 23:35:41
VC++Toolkit2003タダだし使えば?

141 :デフォルトの名無しさん:04/10/17 00:03:24
MFCじゃなくてwindows.hまで使えなくなる。

あと、例のマクロは
#define for if(0);else for
だな

142 :デフォルトの名無しさん:04/10/17 01:13:20
C++で、クラス定義をヘッダファイルに書いて、メソッドをcppファイルに
分けて書くのって何故ですか?
1つのファイルに書いた方が分かりやすいように思うんですが。

143 :デフォルトの名無しさん:04/10/17 01:16:06
>>142
分割コンパイルのため。

144 :デフォルトの名無しさん:04/10/17 01:20:15
>>142
クラスを使うだけの人にクラスの内部処理の詳細を見せないため。

145 :デフォルトの名無しさん:04/10/17 01:21:25
>>142
一度コンパイルすれば修正するまでコンパイルし直さなくて済む。

146 :デフォルトの名無しさん:04/10/17 01:25:42
単に技術的問題。
当時はJavaみたいに一つのファイルから
定義だけを抜き出す方法を作れなかった。

147 :デフォルトの名無しさん:04/10/17 01:56:04
>>145
分けても修正すればコンパイル必要じゃん。

148 :デフォルトの名無しさん:04/10/17 02:10:38
printf()のような、可変長引数を取る関数にパラメータを渡したいのです。
下のような例の場合はどうすればよいのでしょうか?

void foo (const char *format, ...) { /* xxx */ }
/* void vfoo (const char *format, va_list ap) { } */

void bar(int numargs, char *argv[]) /*ここは自分で変えられない*/
{
    /*foo()かvfoo()を呼びたい*/
    /*vfoo(args[0], args[1:]); のようなことがしたい。*/
    /*つまりfoo(args[0], args[1]、args[2], args[3], ...args[numargs -1]); のようなことがしたい。*/
}

numargsとargsからva_listを作ることはできますか?

149 :デフォルトの名無しさん:04/10/17 04:37:21
>>148
va_listそのものを作ることは出来ない。

ただし処理系に依存しても良い(移植を考えない)のなら、
適当にスタックに積んでから関数を呼べば実現出来る。


150 :デフォルトの名無しさん:04/10/17 11:01:07
プログラマーの人って一日何行くらいプログラム書いてるんですか?

151 :デフォルトの名無しさん:04/10/17 11:19:30
if (a==0)
{
  if(b==0)
  {
   .......
  }
}
これを
if (c==0)
{
  if (a==0)
  {
    if(b==0)
    {
     .......
    }
  }
}
という風に新たにc==0の条件文を外側につけた時に
プログラムを見やすくするためにa==0とb==0の条件文を右に
ずらさなければならないのですが
この例だとたった数行分をずらすだけでいいのですが
もっと入れ子になった条件分をかたっぱしから右にずらすのは
骨が折れます
一度に複数行を右に平行移動させることはできないのでしょうか?

152 :デフォルトの名無しさん:04/10/17 11:24:07
エディタの使い方を勉強してくれ。

153 :vim:04/10/17 11:28:15
>>

154 :デフォルトの名無しさん:04/10/17 11:29:24
>>151
ずらしたい行を選択してTAB。左にずらすときはShift+TAB。

155 :デフォルトの名無しさん:04/10/17 11:34:21
>>152
>>154
お返事ありがとうございます
うまいこといきました

156 :デフォルトの名無しさん:04/10/17 11:53:30
if(〜){
}else{
}

みたいに最初の { を if() の右側に書いてしまうのは
エディタのことを考えると良くない書き方なんでしょうか?

157 :デフォルトの名無しさん:04/10/17 11:58:24
>>156
if文はいつもそんな感じで書きますが。

158 :デフォルトの名無しさん:04/10/17 12:23:06
class c
{
};

f()
{
}

if (x) {
}
else {
}

try {
} catch (a) {
} catch (...) {
}

これ以外は認めない。

159 :デフォルトの名無しさん:04/10/17 12:42:54
if( x )
{
}
else
{
}


try
{
}
catch( a )
{
}
catch(...)
{
}

だな、俺は。

160 :デフォルトの名無しさん:04/10/17 13:55:07
>>147
だから修正するまでと書いただろう。読めないのか?

161 :デフォルトの名無しさん:04/10/17 15:29:11
ifstreamのある位置からある位置までのバイナリデータを
ofstreamへコピーしたいのですが簡単に書く方法はありますでしょうか?

// ifsの[offset, pos)をofsへコピーしたい
size_t offset, pos;
ifstream ifs;
ofstream ofs;
.....
ifs.seekg(offset);
// ofs << ifs.rdbuf(); <-ifsを最後まで読むだけならこれで良いんですが・・・

大きなデータなのでバッファをちゃんと扱わないとマズイです。よろしくお願いします。

162 :161:04/10/17 17:07:45
自己解決しました。すいません。

163 :デフォルトの名無しさん:04/10/17 17:09:22
>>162
どう解決したのか教えてください。

164 :161:04/10/17 17:33:08
istreambuf_iterator<char> iit(ifs);
ostreambuf_iterator<char> oit(ofs);
for(size_t i = 0; i < pos - offset; ++i, ++iit, ++oit){
*oit = *iit;
}

か,もしくは

int meta;
streambuf *isb = ifs.rdbuf();
streambuf *osb = ofs.rdbuf();
meta = isb->sgetc();
osb->sputc((char)meta);
for(size_t i = 0; i < pos - offset - 1; ++i){
meta = isb->snextc();
osb->sputc((char)meta);
}

としました.問題があるとか,もっと良い方法があるとかあったら指摘お願いします.

165 :デフォルトの名無しさん:04/10/17 17:56:37
>>164
俺もいろいろ考えたけど、たぶんその前者が最適解でしょうな

166 :デフォルトの名無しさん:04/10/17 18:00:50
>>161
std::copy使えよ

167 :デフォルトの名無しさん:04/10/17 18:03:16
>>166
どうやるの?

168 :デフォルトの名無しさん:04/10/17 18:44:54
istreambuf_iterator end = iit;
advance(iit, pos - offset);
copy(iit, end, oit);

かな

169 :デフォルトの名無しさん:04/10/17 18:48:54
>>168
それ動く?


170 :デフォルトの名無しさん:04/10/17 18:54:18
さあ。
動かないならcopy_n関数テンプレート作ればいいし

171 :デフォルトの名無しさん:04/10/17 19:14:04
>>164
iit は終了チェックしなくていいの?

172 :デフォルトの名無しさん:04/10/17 19:51:57
>>168は動かない。

ISO/IEC 14882:1998
24.5.3 Template class istreambuf_iterator
-3
Note that in the input iterators, ++ operators are not equality preserving,
that is, i == j does not guarantee at all that ++i == ++j. Every time ++ is
evaluated a new value is used.

24.5.3.5 istreambuf_iterator::equal
-1
Returns: true if and only if both iterators are at endofstream, or neither is
at endofstream, regardless of what streambuf object they use.

173 :デフォルトの名無しさん:04/10/17 19:54:17
バッファを使いまわして
readとwriteで繰り返して操作した方が効率がいい。

174 :164:04/10/17 19:56:35
アドバイスありがとうございます.

>168
istreambuf_iteratorはInputIteratorで入力を一度しかトラバースできないので
advanceは使えないかと思います.

>170
実は作ってたんですが171さんの言うように終了判定を考えると
copy_nの利用は危なそうだなと思ってやめました.

>171
省略してました.実際やるとしたら
for(size_t i = 0; i < pos - offset && iit != istreambuf_iterator<char>(); ++i, ++iit, ++oit){
...
な感じでしょうか?

>173
試してみます.

175 :デフォルトの名無しさん:04/10/17 20:27:52
プログラミングを初めて、いろいろな本を読んだのですが、どうしても分からないので聞きます。
完全な独学で勉強したのでかなりトンチンカンなことを言っているかも知れませんが、自分なりに努力をしたのでお願いします。

前にシューティングアルゴリズムマニアックスという本を買ったのですが、

http://www.amazon.co.jp/exec/obidos/ASIN/4797327316/249-0856311-3939535

この本についてくるプログラムソースは弾、自機、背景、などを違う.cppファイルに記述しています。
しかし、コンパイルすると一つのゲームとしてビルドされます。
ヘッダーファイルであればincludeの記述を行うことでインクルードされることは分かるのですが、cppファイル同士、それも種類ごとに分けて記述したcppファイルを一つにするにはどのようにすれば良いのでしょうか?
一つのファイルに記述されたプログラムを順番に分割するのであれば、分かるのですが、このようにプログラムを並べたのでは同時にプログラムが処理されてしまうのではないのでしょうか?

多分かなりとんちんかんのことを言っていると思います。
どうしても一つのプログラムをいくつものファイルに分割して記述する方法が分かりません。


176 :デフォルトの名無しさん:04/10/17 21:00:40
>>175
まず、ソースファイルは必ずしも分割して書く必要はない。しかしながら、あまりにも
1つ1つのソースファイルが大きくなると、コンパイルに時間がかかるし、少し変更した
だけでも全体をコンパイルしなおさなければならなくなる。それに、大きなファイルの
内容を管理するにしても、人間の頭にも限界があるし、普通は1人ですべてのコードを
書くわけでもない。だから、ソースを分けるという考え方が出てくる。さて、当然複数の
ソースをコンパイルすると複数のオブジェクトファイルが出来るわけだが、これらは
そのまま実行されるのではなく、リンカという別のプログラムに通され、結合される。
すると、ここでやっと1つのプログラムファイルが出来上がる訳だが、複数のオブジェクト
ファイルに対して複数の同時実行が行われるわけではない。たとえば、a.objという
オブジェクトファイルにfoo()という関数があり、これをb.objの中から呼び出していると
する。複数のオブジェクトファイルがあるから当然直接呼び出せない。これを解決する
役割を担うのがリンカ。こういう複数のオブジェクトファイル間の関数等の呼び出しを
解決するのが仕事。すると、結果的にファイルは1つになる(ダイナミックリンクは除く)
でしょう?

177 :デフォルトの名無しさん:04/10/17 21:04:26
というか、色々な本を読むのはいいが、
いきなりゲーム開発の本なぞ読まずに
まずC/C++の入門書をきっちり仕上げろよ。
それをやってれば>>175の質問は出てこない。

ルールもろくに覚えてないうちに定石集買って
読んでも、そら分からんだろう。

178 :デフォルトの名無しさん:04/10/17 21:36:30
Ruby最強!

179 :デフォルトの名無しさん:04/10/17 21:41:07
全く初歩的なことだけど…
GUI環境って何のこと?ネタじゃないよ。。

180 :デフォルトの名無しさん:04/10/17 21:44:13
ぐらふぃかるゆーざーいんたーふぇいすかんきょう

181 :Ruby!!!!!!!!:04/10/17 21:46:28
READ THE FUCKING ARTICLE, YOU LAZY MOTHER FUCKER.

182 :デフォルトの名無しさん:04/10/17 21:54:25
>>180
で、GUI環境はどこが重要なの??

183 :デフォルトの名無しさん:04/10/17 22:25:16
>>182
鼠が画面上で動き回ることが出来る。

184 :デフォルトの名無しさん:04/10/17 22:27:16
>>183
無かったら、動き回れない…っていうこと?

185 :175:04/10/17 22:33:36
どこか、リンカについて分かりやすく解説してあるサイトはないですか?
家にある本ではさらりとしか解説されてなくよく分からないです。
MSDNも見ましたが余計にさっぱり分かりません。

186 :デフォルトの名無しさん:04/10/17 22:35:36
スレ違いですけど聞きたいんでよろしくネ。(´◕ω◕`)
>>172
>Every time ++ is evaluated a new value is used.
この文ってTYPOですか?
おれっちの脳内じゃ
Every time ++ evaluated, a new value is used.
こちらの方が正しいような気がするんだけど。どう?

187 :デフォルトの名無しさん:04/10/17 22:38:34
>>182
エロDVDが見れる。ヌケル。そして、彼女要らず。

188 :デフォルトの名無しさん:04/10/17 22:47:58
javaのパスの設定が上手くいきません……
j2sdk-1_4_1-windowsi586をインストールし、パスの設定を行った後に、サンプルアプリを動かそうとしたのですが、ダメでした……
「%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;C:\Program Files\ATI Technologies\ATI Control Panel;C:\Program Files\pcdNavi\bin;C:\Program Files\Fujitsu\sa\dll;;C:\Program Files\Sonic\MyDVD」
がパスの変数値の最初の設定でした。
この末尾に「C:\j2sdk1.4.0_01\bin」と付け足したのですが、サンプルは動かないんです……

189 :188:04/10/17 22:48:40
誤爆です……

190 :デフォルトの名無しさん:04/10/17 22:49:57
>>186
evaluateするのは誰?

191 :186:04/10/17 22:55:54
>>190
もち、++です。

192 :186:04/10/17 22:57:44
>>191
あ゛。まちがった。
streambufの使用者。かな?

193 :デフォルトの名無しさん:04/10/17 22:59:56
>>175
リンカについては知らんけど、>>177が言うように、C/C++の入門書で、基本をきっちりしたほうがいいよ。
俺も完全独学で、最初いきなりDirectXから入って、参考書のサンプルいじくって一応は動いてたど、
やっぱ不安なので猫さんのとこで基本勉強したら解るようになった。

いや、俺も昔分割コンパイルに疑問持ってたから、人事に思えなくてw


194 :デフォルトの名無しさん:04/10/17 23:26:05
>>186
Every time ++ is evaluated, a new value is used.
のコンマが省略されたんだと思われ。

195 :186:04/10/17 23:59:55
>>194
うん。その方が自然ですね。
分詞構文にもっていって副詞句として扱うのは無理がありましたね。
どうもありがとうございました。

196 :デフォルトの名無しさん:04/10/18 00:23:00
void文を書いたのですが、「型の前に";"がありません」とエラーが出てしまいます、

//行列の表示
#include <stdio.h>
void show(int s[][3],int row);
void main(){
int a[][3]={10,20,30,40,50,60};
int i,j,row;
show(a,2);
void show(int s[][3],int row);
for(i=0;i<row;i++){
printf("| ");
for(j=0;j<3;j++){
printf("%d ",a[i][j]);}
printf("|\n");}}

色々試したのですができませんでした、原因をお教えいただけませんか。


197 :デフォルトの名無しさん:04/10/18 00:34:11
>>196
void文って何?
一見めちゃくちゃなコードに見えるけどvoid文が何なのかわからないのでうかつにつっ込めない・・・。

198 :デフォルトの名無しさん:04/10/18 00:35:35
int文とかprintf文とか

199 :196:04/10/18 00:37:51
voidは値をreturnで返さない関数の文?
とかって聞いたのですが。

・・・滅茶苦茶なのかorz

200 :デフォルトの名無しさん:04/10/18 00:45:57
>>196
もうむちゃくちゃすぎ。
想像で補って書いてみたが、
こういうことをしたかったのか?

#include <stdio.h>

void show(int s[][3],int row)
{
 for(int i=0; i<row; i++)
 {
  printf("| ");
  for(int j=0; j<3; j++)
   printf("%d ", s[i][j]);
  printf("|\n");
 }
}

int main(void)
{
 int a[][3] = {10,20,30,40,50,60};
 show(a, 2);

 return 0;
}


201 :デフォルトの名無しさん:04/10/18 00:46:53
動かすだけなら↓でいいが。
関数をラベルのように定義するその書き方は何かのコンパイラの拡張?
#include <stdio.h>
void show(int s[][3],int row);
void main()
{
int a[][3]={10,20,30,40,50,60};
show(a,2);
}
void show(int s[][3],int row)
{
int i,j;
for(i=0;i<row;i++)
{
printf("| ");
for(j=0;j<3;j++)
{
printf("%d ",s[i][j]);
}
printf("|\n");
}
}

void文って、
void()
のこと?

202 :デフォルトの名無しさん:04/10/18 00:47:48
>>196
ヒント:以下はごく自然なCのコード。

$include <stdio.h>

void show_string (const char *str);

int main (int argc, char *argv[]) {
  show_string("hello.");
  return 0;
}

void show_string (const char *str) {
  puts(str);
}

203 :デフォルトの名無しさん:04/10/18 00:48:33
>>196
そういうエラーって{}がちゃんとなってなかったりしても出る
ガンガレ!


204 :デフォルトの名無しさん:04/10/18 00:50:41
>>203
どうみても>>196はそれ以前の問題だろ

205 :デフォルトの名無しさん:04/10/18 00:52:00
そういや,Metaware の High-C っていうコンパイラは
関数内関数を使えてたね。
# あと,よくわかんない反復子の仕組みもあったし。
# 今で言う「イテレータ」とはなんかちょっと違う概念だった気もするけど。

206 :デフォルトの名無しさん:04/10/18 00:52:29
>>202
> $include <stdio.h>

(´ι_`)

あげあしでスマソ。
マジでこれで悩む初心者とかいたらいけないので念のため指摘。

207 :デフォルトの名無しさん:04/10/18 00:53:25
>>205
関数内関数ってPASCALみたいな感じ?

208 :デフォルトの名無しさん:04/10/18 00:54:12
>199
「文」という言葉の使い方が変。
式と文と関数はそれぞれ別の概念だ。
「戻り値 void の関数を書いたのですが」あたりじゃないかと思われ。
で、関数の定義の仕方が滅茶苦茶。
・関数の中で関数の定義はできない(独自拡張で可能な処理系もあるが)。
・2回目の void show(int s[][3],int row); ←のセミコロンは何よ?

209 :デフォルトの名無しさん:04/10/18 00:55:29
>>206
自分でやっといてワラタ
っていうかもう寝ようw

>>207
うん。細かい仕様は忘れたけど,便利だった。
High-C は C コンパイラのくせに,C++ みたいに変数をどこででも
宣言できたりしてた。

210 :196:04/10/18 00:56:09
voidの使い方自体が間違ってた?と言う事でしょうか。
ありがとうございます、もう一度一からやってみます。

211 :デフォルトの名無しさん:04/10/18 00:58:16
voidの使い方は合ってるが・・・。
ほかのところが間違いまくってる。

212 :デフォルトの名無しさん:04/10/18 01:00:47
>>210
引数なんかC99風の最新規格を使っときながら
なんでそんなに滅茶苦茶で異常なコードを書いてしまうのかわからん。

213 :デフォルトの名無しさん:04/10/18 01:00:52
プログラムとか全然知らないんだけど
EXEの設定を弄くることは出来ますか?
例えばあるEXEが起動するとき「開始します」とかの表示を「開始するぞゴルァ」
みたいなのは出来るんですか?
またEXEを弄くるソフトは何ですか?

214 :デフォルトの名無しさん:04/10/18 01:01:50
Windowsのマウスカーソルってどのプログラム(モジュール?)が制御してるんでしょうか?


215 :デフォルトの名無しさん:04/10/18 01:02:16
とりあえず普通に丁寧に書いたら>>200みたいになる。

216 :デフォルトの名無しさん:04/10/18 01:04:14
>>213
板違い。
そういうソフトを作りたいのならこの板でかまわんけど。

217 :デフォルトの名無しさん:04/10/18 01:04:37
>>213
文字列がリソースとして定義されているならResource Hackerかな。
でなけりゃ資料を見ながらバイナリエディタで書き換えるかOllyDBGとかのデバッガつかうか。
しかし素人にはオススメできない。

218 :デフォルトの名無しさん:04/10/18 01:10:05
Resource Hackerとバイナリエディタを検索してみて色々やってみたいと思います
ありがとうございました

219 :196:04/10/18 01:18:21
>200
実行してみたら、やりたい通りになってました、ありがとうございます
>201
voidを使って行列を書いてみる、というのが課題でして・・・
voidの使い方とか、webで調べたんですが、何か勘違いしたヨウで・・・
>202
charというのはまだちょっと分らないので、あとで調べてみます
>208
セミコロンは間違えて付けてしまったものです、すいません

220 :デフォルトの名無しさん:04/10/18 02:29:35
new delete について質問です。

new で確保したメモリ領域は、delete で開放しろと、
いろいろな解説ページで見たのですが、
開放しないままプログラムが終了すると、どうなるのでしょうか?

簡単なプログラムを作って試してみたところ、
プログラムが終了した時点で、メモリは開放されているようなのですが、
プログラム終了時にわざわざ delete でメモリを開放する処理を入れる必要はあるのでしょうか?

221 :デフォルトの名無しさん:04/10/18 02:53:50
>>220
開放しないと、メモリリークが起こる。
そうなるとフリーズしたり、いろいろ障害がでる、と聞いてる。

newだけがメモリを確保するのではなく、グローバル変数などもメモリを確保している。
プログラムが終了したときに開放されたのは、そういった変数だと思う。
って、俺もちょっと曖昧なので他の人、修正・補足お願い。


222 :デフォルトの名無しさん:04/10/18 03:37:39
>220
「malloc()して(プログラム終了時に)free()しない」、なら、百歩譲って許せなくもないが、
deleteはメモリの開放だけでなく、デストラクタの実行も担っているから、
絶対に省略はあり得ない。

223 :デフォルトの名無しさん:04/10/18 03:40:43
まあ (常識的な OS なら) メモリくらいはプログラム終了時に
自動で解放してくれるけどね。

でもいちいち
「このオブジェクトは delete しなきゃいけない。
 このオブジェクトはただのメモリの塊だから delete しない。
 こっちのは……どうだっけ?」
とか考えるの('A`)マンドクセ

224 :233:04/10/18 03:45:19
おっと、誤解されそうな予感。
要するに、delete が必要か不要かを考えたり
あまつさえ省略しようと企んだりするのは
激しく徒な遠回りだよって事。

225 :223=224:04/10/18 03:48:07
あーもう。漏れ>233じゃねーし。
つーか盛れが抱えてる問題が解決しねーし。イラつく。もう寝ようっと。

226 :デフォルトの名無しさん:04/10/18 09:10:01
>>220
デストラクタの実行を無視すれば、
小規模なプログラムなら終了時にまとめてメモリ解放
でもなんとかなると思うが、ある程度の規模になると
いらないデータがメモリを占有しつづけるのは非効率的
になってくる。

GCが信頼できる環境でないかぎりは解放するのが無難。
普通のプログラマなら「開けたら閉める」
ってのは普通の感性じゃないかなぁ。

227 :デフォルトの名無しさん:04/10/18 09:18:16
>>219
>voidを使って行列を書いてみる、というのが課題

行列(を格納した配列)をvoidポインタで渡すようにして
ルーチンを汎用化するって意味ではないかと思った。
だとすると >>196 はまったく的外れ。
行列の幅を固定しちゃってるし。

おそらく課題はC言語で書くことだと思うけど、
念のため補足しておくとCとC++では作法が結構違う。
C++ならそれの実現のためにvoidポインタを使うべきではない。

228 :220:04/10/18 10:02:50
>>221 222 223 226
なるほど、やはりDeleteした方が、
無難…、というかDeleteするのが常識かもしれませんね。
ご返答ありがとうございました。

229 :デフォルトの名無しさん:04/10/18 11:32:53
ったくど素人が何いってんだか...

終了時のdeleteなんか時間のムダ

もし省略するとシステムにダメージを与えるような
処理をデストラクタ内で行なっているならば、それは設計ミス

そういうたぐいの後始末は専用の関数かなんかにして
シグナルハンドラで呼び出すのが正しい

だから必要なdeleteなどなく、何も考えずに終われって事だ



230 :デフォルトの名無しさん:04/10/18 11:42:04
フレーム論争やりたいならnewsにでも逝け

231 :デフォルトの名無しさん:04/10/18 11:43:30
floatの定数を、バイナリーデータとしてそのままint型に代入したいのですが、どうしたらよいでしょうか。

float a = 1.23456f;
int b;
b = *((int*)&a);

みたいなことを、変数aを使わずに b = ... のように行いたいのです。
int は float とデータサイズは同じと考えていただいて結構です。


232 :デフォルトの名無しさん:04/10/18 11:56:09
*(float*)&b=1.23456f


233 :186:04/10/18 12:00:02
>>231
union {
float f;
int n;
}fton;

234 :186:04/10/18 12:01:00
やべっ。
186そのままだった。はずかしいーーー。

235 :231:04/10/18 12:16:07
>>232-233
ありがとうございます。

すみませんが、もう一つ質問がありまして、

struct {
int type;
union {
int idata;
float fdata;
} data;
} tdata;

tdata sample_data[] = {
{ 1, 20 },
{ 2, 3.456f },
{ 1, 123 },
:
};

のように初期化したいのです。
メンバ"type"は、メンバ"data" の型を表し( 1ならint、2ならfloat など)、
メンバ"data"には int あるいは float の値が入ります。

union を使用すると、初期化時には最初の型(この場合、idataの型=int)で初期化せねばならないようで、
上のリストのように初期化することができず、また、>>232 のような方法でも書くことができません。

どうしたらよいのでしょうか。


236 :デフォルトの名無しさん:04/10/18 12:31:03
全部整数として書け
値は int i; *(float*)&i=,3.456f; printf("%d",i) ってやって調べろ


237 :デフォルトの名無しさん:04/10/18 13:17:33
文字列の分割をしたいのですが、strtokの挙動が今ひとつよく分かりません。

#include <stdio.h>
#include <string.h>
int main(){
    char str[]="信長<><>2004/10/18 12:42:45<><>はじめまして<><>カッコイイHPですね。\nこれからちょくちょく遊びに来ますんで。\nよろしく。";
    char sp[]="<><>";
    char *r=NULL;
    r=strtok(str,sp);
    while(r != NULL){
        printf(">>%s\n",r);
        r=strtok(NULL,sp);
    }
    return 0;
}

char sp[]="<><>"の部分を
char sp[]="<>"にしても、char sp[]="k<>"にしても、同じ結果になります。
どうしてでしょうか?

238 :デフォルトの名無しさん:04/10/18 13:19:37
excel形式でファイルを出力したいんですがどうしたらよいでしょうか

239 :235:04/10/18 13:29:26
>>236
やはりそうするしかないですかねー。そういうマクロでもあれば良いんですけど…。

あるいは、逆に全部 float で書いて、使うときに int にキャストとか。
(辻褄はあうけど、明らかに曲がったやり方だと思う)

printfするにはデータ量が膨大なので、とりあえず、前処理するツールを作って
それを通して吐き出させようかと思います。
(といっても、ホントに *.*f を 0x???????? に書き換えるだけなので、
そのために一段階増えるなんてもったいない気がしてなりませんが)

なにか他に方法があれば教えてください。



240 :デフォルトの名無しさん:04/10/18 13:31:13
>>237
char sp[]="<><>\n";
こーゆーこと?

241 :デフォルトの名無しさん:04/10/18 13:33:17
>>237
manなりhelpなりでstrtokをちゃんと調べれー
第二引数は「デリミタ文字群」だ

242 :デフォルトの名無しさん:04/10/18 13:34:56
>>239
リダレクト使えば

243 :デフォルトの名無しさん:04/10/18 13:54:44
char str[]の文字列の中にkが無いから

244 :デフォルトの名無しさん:04/10/18 14:03:08
プログラムの量が多くなってくるとデバッグが大変だね
バグを単離して同定することすら難しくなってきた
デバッグするときのこつを教えてください

再現性のあるバグなら予想はつくんだけど
なかなか再現性が見いだせないバグはやっかいだね…

245 :デフォルトの名無しさん:04/10/18 14:07:43
VC++5.0 WindowsNTWS4.0でWin32 dllのプログラムを
作成していますが、その内部で、

printf("%I64d\n", i64);

が表示できず、そのままI64dと表示されます。
i64は「__int64」で定義しています。
これを64bit値で正しく表示するにはどうすればいいですか?

あと、演算結果を__int64の型の変数に入れたにもかかわらず、
2の31乗を越えた値がマイナスになります。これはどうしてですか?

246 :デフォルトの名無しさん:04/10/18 14:32:37
std::auto_ptr<int> p(new int);
std::auto_ptr<int> p2(p);
std::auto_ptr<int> p3(new int);
std::auto_ptr<int> p4(p3.release());

VC6付属のSTLではp2, p4に所有権が移動するだけでポインタ値は残るのですが
STLPortではp, p3のポインタ値が空になります。
どちらの振る舞いが正しいのでしょうか…

247 :デフォルトの名無しさん:04/10/18 14:37:46
>>245
>あと、演算結果を__int64の型の変数に入れたにもかかわらず、
>2の31乗を越えた値がマイナスになります。これはどうしてですか?

intで計算してるんだろ。__int64に格上げしてやれ。

248 :デフォルトの名無しさん:04/10/18 14:53:06
>>246
auto_ptrの仕様でもよみな。
ちなみVC6のC++の挙動を正しいと思わんことだ。

249 :246:04/10/18 14:55:26
どうやらVCの方の振る舞いは古い仕様のようです。
ttp://www.hey-to.net/ML-archive/vcppML/2000/msg07069.html

250 :デフォルトの名無しさん:04/10/18 14:55:27
仕様に規定されてる?

251 :245:04/10/18 15:39:02
>>247
明確に(__int64)でキャストは行っているのですが・・・。

おそらく__int64で定義されているにもかかわらず、32bit
という扱いにされていると思うのですが・・・。

252 :デフォルトの名無しさん:04/10/18 15:49:14
環境疑う前にソース晒せ
I64の所も含めて、小細工せずにコピペで

253 :デフォルトの名無しさん:04/10/18 15:59:52
Visual C++ .Netで開発しています。
可変引数を持つ関数hoge(char * szBuf, ...)があります。
hoge内からさらに可変引数を持つサブルーチンhogehoge(int iCnt, ...)をコールします。
hogeに渡された可変引数すべてをそのままhogehogeに渡すにはどのように記述すれば
よいのでしょうか?
ちなみにhoge内では可変引数の個数や型などはわかりません。hogehoge内で判明します。

hoge内でva_list型としてva_arg()で値を取得すればいいかと思い以下のように記述
してみましたが、可変引数の個数が複数になると2個目以上が取得できませんでした。

hoge(char * szBuf, ...)
{
va_listargs, args2;
va_start( args, szBuf );
args2 = (va_list)va_arg( args, va_list );
//中略
hogehoge( iCnt, args2 );
va_end();
}


254 :デフォルトの名無しさん:04/10/18 16:08:21
>>253
hogehoge(int iCnt, va_list); を作る
しか思いつかないなぁ。
つかhogeで可変引数の詳細がわからないと
hogehogeにどれだけ引数を積めばいいかわからないと思うんだけど。

255 :デフォルトの名無しさん:04/10/18 16:48:48
>>239
union初期化でintが必要でfloatは使えないと言うなら、
別にfloatの配列を置いてそこから引っぺがしたら?
こんな感じかな?
static const float sF[] = {3.456f, 3.2f};
struct {
int t;
union {
int i;
float f;
} u;
} sS[] = {
{1, 20},
{2, *(int *) & sF[0]},
{1, 123},
};

256 :245:04/10/18 17:05:42
>>252
こんな感じになります。

CUR_SP = (__int64)hlen + rlen * (RecNo - 1);
#ifdef DBG
wsprintf(DBG_BUF, "(%I64d)\n", CUR_SP);
DbaDebugWrite(DBG_BUF);
#endif

CUR_SP自体が2の31乗を越えた場合には、
CUR_SPを31bit右シフトした結果を表示させたら
-1になりました。


257 :デフォルトの名無しさん:04/10/18 17:18:14
>>256
rlenとRecNoがintというオチだと予想

258 :デフォルトの名無しさん:04/10/18 17:23:10
wsprintfはI64対応してんのか?

259 :237:04/10/18 17:27:16
ありがとうございます。

>>240
えっと、すいません、よく分かりません。

>>241
tp://www.linux.or.jp/JM/html/LDP_man-pages/man3/strtok.3.html
tp://www.shibu.jp/cppreference/stdstring_details.html#strtok
を参考にしてみたのですが、"デリミタ"というのがよく分かりません。

>>243
kがないのになぜ分割されるのでしょうか?

260 :デフォルトの名無しさん:04/10/18 17:37:54
>>259
辞書引け: delimiter

第二引数で指定した「文字列」で分割するのではなく、
第二引数で指定した「文字のいずれか」で分割する。
つまり char sp[]="k<>" なら 'k' か '<' か '>' で分割。

261 :デフォルトの名無しさん:04/10/18 17:51:48
とりあえず
char * section = new char[strlen(str)];
unsigned position;
sscanf(str, "%[^<>]%n", section, & position);
とでもしとけ。

262 :デフォルトの名無しさん:04/10/18 18:07:09
>>237
('A`)マンドクセ
boostのsplitでも使っとけよ。

263 :デフォルトの名無しさん:04/10/18 18:21:49
>>262
はなし飛びすぎYO!!

264 :デフォルトの名無しさん:04/10/18 19:24:53
条件分岐の入れ子が多すぎて流れが理解できないようになってきました
こんな場合はどうすればわかりやすくなるんでしょうか?

265 :デフォルトの名無しさん:04/10/18 19:35:16
Ruby!!!!!!!

266 :デフォルトの名無しさん:04/10/18 19:38:29
>>264
そのコードを捨てる。

2ch に問題をうpする。

暇人が美しいコードに変換してくれる

ウマー!


267 :デフォルトの名無しさん:04/10/18 19:42:33
>>264
swich文を使う

268 :デフォルトの名無しさん:04/10/18 19:56:18
>>264
状態遷移テーブルを作る。

269 :デフォルトの名無しさん:04/10/18 20:07:50
>>266
それはちょっとできないですw
>>267
いままでifとforしか使ったことなかったので
swich文も使ってみます
>>268
難し用語ですね
検索してみましたけどなかなかわかりやすく解説してくれてるところがないみたいです

アドバイスありがとうございました

270 :デフォルトの名無しさん:04/10/18 21:14:17
>>269
条件を洗い出すと、単純な表に書ける場合がある。
その場合はその表を配列として実装すれば複雑な条件を緩和できるかもしれない。

271 :デフォルトの名無しさん:04/10/18 21:35:59
bit を反転させる関数って標準でないですか?

272 :デフォルトの名無しさん:04/10/18 21:42:36
>>271
演算子じゃダメなの?

273 :デフォルトの名無しさん:04/10/18 22:01:34
ちぇきちゃとこへ10時の爆撃行ったーーーーーーーーーーー!!ksk

274 :デフォルトの名無しさん:04/10/18 22:07:02
>>272
左右反転なんですが

275 :デフォルトの名無しさん:04/10/18 22:13:12
>>258
正解。wsprintfはI64非対応。245はsprintf(か_stprintf)にしろ。

276 :デフォルトの名無しさん:04/10/18 22:25:46
>>271
はよそういえや。で、標準関数にはそんなもんない。

277 :デフォルトの名無しさん:04/10/18 22:49:17
>>274
久々にカルノーマップかいてたら吐き気がしてきた。
スパッとできるトリッキーなコードとかありそうなんだけどなぁ

278 :デフォルトの名無しさん:04/10/18 22:56:51
>>277
そんなの、表引きでええやん。


279 :デフォルトの名無しさん:04/10/18 23:00:46
>>278
1バイトとは限らないぞ32ビットだったりした日には…

280 :デフォルトの名無しさん:04/10/18 23:03:45
>>279
4回に分ければいいだろ。


281 :279:04/10/18 23:07:26
>>280
そりゃそうだ。スマソ

282 :デフォルトの名無しさん:04/10/18 23:08:43
テンポラリを使わずswapするコードってどうやんだっけ?
xor使ったと思ったんだけど。

283 :デフォルトの名無しさん:04/10/18 23:27:10
>>282
swap( int *a, int *b )
{
*a ^= *b;
*b ^= *a;
*a ^= *b;
}

284 :デフォルトの名無しさん:04/10/18 23:29:12
要素数0の配列をnewしたときの振る舞いについて教えてください。
例えばこんな感じ

int* p = new int[0];

VC6SP6ではNULL以外の値が返ってきましたが
本当に正しいのかどうか…

285 :デフォルトの名無しさん:04/10/18 23:46:51
>>284
A zero-sized array is legal only when the array is the last field in a struct or union


286 :デフォルトの名無しさん:04/10/19 00:00:31
>>284
5.3.4 - New
-7- When the value of the expression in a direct-new-declarator is zero,
the allocation function is called to allocate an array with no elements.
The pointer returned by the new-expression is non-null.
[Note: If the library allocation function is called, the pointer returned is distinct from the pointer to any other object. ]

287 :237:04/10/19 00:16:43
ありがとうございます。

>>260
それでやっとstrtokの結果が理解できました。
その中のどれかの文字と一致するということは、
Perlでの正規表現だと、

   [k<>]

みたいな感じですよね。
Perlでいうsplitのような処理をするにはどうプログラムを組んだらいいのでしょうか?
splitのような処理をしようとして検索していたらstrtokにたどり着いたのですが。

>>261
strtokの処理の代わりにそれを入れてみましたが、何も表示されませんでした。

>>262
boostを検索してみたのですが何かダウンロードしなきゃいけないみたいですね。
boostのをダウンロードしてやるのが一般的なんでしょうか。

288 :デフォルトの名無しさん:04/10/19 00:24:29
boost使いたくないんなら、strstr()とか使って自前でやったら?

289 :284:04/10/19 00:47:11
>>285
それは
struct A
{
char hoge;
int hage[0];
};
とかそんな状況の事じゃないでしょうか?

>>286
「library allocation function」が何を指しているのかわかりませんが大丈夫そうですね。
ありがとうございました。

290 :デフォルトの名無しさん:04/10/19 00:53:50
>>284
More Exceptional C++ Item 29に載ってるぞ。

291 :デフォルトの名無しさん:04/10/19 00:54:51
More Exceptional C++ っていつになったら訳本が出るんだろうね

292 :262:04/10/19 00:59:38
>>287
どちらかというとジョークっぽいニュアンスの発言ですた。
boostを使うのはちょっと大げさすぎる。
やっつけ仕事としてならsplitを使うのもアリだと思うけど、
普通は >>288 の言うように strstr でループさせる。

293 :284:04/10/19 01:00:59
>>290
それ持ってません…3500円もするんですね…

294 :デフォルトの名無しさん:04/10/19 01:01:58
本代なんかケチんなよ
自分への投資を惜しむな

295 :デフォルトの名無しさん:04/10/19 01:03:26
\3,500でビビってたら技術書、専門書は買えない

296 :デフォルトの名無しさん:04/10/19 01:13:03
ネットで見つからなくて本でのみ見つかる情報で元が取れるとは思わない。

297 :デフォルトの名無しさん:04/10/19 01:27:36
なら買うな、それで終了

298 :( _ 。。) _ バタ。 ◆eJlUd9keO2 :04/10/19 03:08:39
C(cc) + OCI8を利用してストアドプロシージャを呼び出す上で
OCIBindByNameを利用して
OUT引数から文字列の結果を受け取ろうとしているのですが
SP側でそのOUTの変数がNULLの状態になっていると
OCIExecuteに失敗してしまいます。
(もちろん、何かしらの値を代入すれば正しい結果を取得できています)

それと確認を取っていないのですが
オールスペースの文字列がORACLEではNULL扱いになるとかならないとか
(これはココじゃなくて ORACLEかDB関係のスレを探すべきかな)

C言語からのOCI関係の参考書・参考ページを1週間程探してみたのですが
ヴァージョンが低かったり、本家PDFのコピペだったりと目的の情報にあたりません。
上記、どなたかお力添え願います。


299 :デフォルトの名無しさん:04/10/19 03:18:39
#defineの値をコンパイル時に与えることはできますか?

300 :デフォルトの名無しさん:04/10/19 03:46:12
>>299 はい、できますよ。

301 :デフォルトの名無しさん:04/10/19 03:52:19
なんでそういう回答しかしないの?
それで>>299が分かる人だったら
こんな質問しないでしょ?
もうちょっと考えろよ

302 :デフォルトの名無しさん:04/10/19 03:54:39
なんでそういう回答しかしないの?
それで>>877が分かる人だったら
こんな質問しないでしょ?
もうちょっと考えろよ

303 :デフォルトの名無しさん:04/10/19 07:04:24
>>299
大抵のコンパイラはDオプションで指定できる。

304 :デフォルトの名無しさん:04/10/19 08:22:07
なんでそういう質問しかしないの?
それで>>300が分かる人だったら
こんな回答しないでしょ?
もうちょっと考えろよ

305 :デフォルトの名無しさん:04/10/19 09:54:37
つか、妙な回答だと思えば自分が答えればいいだけなんだが。

306 :デフォルトの名無しさん:04/10/19 10:06:31
質問です。

クラス CSuper を親クラスに持つ2つのクラス CChildA, CChildB があったとして、
イメージとしては、以下

CSuper* array[2];
array[0] = new(CChildA);
array[1] = new(CChildB);

のように、同じ基本クラスを持つ複数の型の要素を持つ配列を作成したいのですが、
もちろんこれでは、CChildA のメソッド m を
array[0]->m のように呼び出すことはできませんし、
環境によるとコンパイルエラーになるかもしれません。

このような構造を実現できる方法はないでしょうか?

307 :デフォルトの名無しさん:04/10/19 10:10:56
それがAとBで共通のメソッドなら、CSuperでインターフェースを定義しとく。
AだけでBには持たせたくないのなら、諦めてdynamic_cast。

でなきゃboostにそんな構造があったような。

308 :237:04/10/19 10:30:25
ありがとうございます。

>>288,>>292
それをヒントに頑張ってみます。

309 :デフォルトの名無しさん:04/10/19 10:30:47
operator = で入れちゃえば?

310 :デフォルトの名無しさん:04/10/19 11:38:35
>>307
ありがとうございます。
boost って言葉が初耳でしたので調べてみます。
もし無理なら諦めてキャスト……。

311 :235:04/10/19 14:56:10
>>255
それだと、floatデータ一つにつきsizeof(int*)バイト分のデータが増えることになってしまいますよねー。

理想としては、一つの配列を、先頭からバイナリーで別ファイルにしたいので、
配列内にポインタが含まれたり、別の配列が必要になったりすることは避けたいのです。

結局 >>239 の方法でやってますが、やっぱり面倒…。


312 :デフォルトの名無しさん:04/10/19 15:32:08
テキストファイルの任意の行を編集したいのですが
サンプルってありませんでしょうか。

313 :デフォルトの名無しさん:04/10/19 17:29:42
>>312
何がしたいのか具体的に書かないと誰もまともに応えられないよ。
編集処理のプログラムのサンプルなら、探せばあると思う。

314 :デフォルトの名無しさん:04/10/19 18:19:30
fgets関数を使った後にstdinをクリアしなさいといわれ、
fflush関数を使ったのですが、fflus関数はダメと言われました。

他にstdinをクリアする方法を教えてください。

315 :デフォルトの名無しさん:04/10/19 18:32:45
何も考えずに言われた通りにするな!
断れ!

316 :デフォルトの名無しさん:04/10/19 19:26:24
>>314
読めなくなるまで空読み。

317 :デフォルトの名無しさん:04/10/19 19:47:52
いわゆる 空気読め! って奴ですね

318 :デフォルトの名無しさん:04/10/19 20:14:48
    _、_
  ヽ( ,_ノ`)ノ 残念 おいなりさんだ
 へノ   /
  ω ノ
     >

319 :245:04/10/19 20:47:45
>>257-258
>>275
ありがとうございます。確かにsprintfに変更したら成功しました。
あと、64bit型の変数に入れる場合の演算は、変数ごとにキャストを
かけないとダメってことですかね?
通常のようにあとからまとめてキャストというのは失敗するようで。

320 :デフォルトの名無しさん:04/10/19 21:04:32
>>319
コード書け。
言ってる意味がわからん

321 :デフォルトの名無しさん:04/10/19 21:05:01
>>319
>CUR_SP = (__int64)hlen + rlen * (RecNo - 1);
RecNo, rlen, hlenがintだとすると
演算の優先順位の関係で rlen * (RecNo - 1) はint同士の減算・乗算が行われ
hlen との加算で初めて__int64に格上げされる。
全部__int64で計算したければ
CUR_SP = hlen + rlen * ((__int64)RecNo - 1);
とする。

322 :デフォルトの名無しさん:04/10/20 02:09:45
C++についてちょっと質問です。

 class A   //継承元
 {
   (略)
 };
 class B:A  //継承先
 {
   (略)
 };
という関係のクラスがあるとします。
また、これとは別に
 void Function(A *a);
といったような、Aクラスを引数にする関数があります。

このとき、Aから派生したBクラスのオブジェクトを
Function関数に渡す方法はありませんでしょうか?
#チラっと見た限りでは、Javaではできるっぽい

とりあえず、ちょっぴぃ脳みそで考えてみたところ、
 ・Bクラスの中にAを含める(継承ではなく)
 ・Function関数をAクラスのメンバ関数にする
くらいかなぁ?と。
諸先輩方、何かアドバイス等あればお願いします。

323 :デフォルトの名無しさん:04/10/20 02:14:32
class B: public A
{
};

324 :デフォルトの名無しさん:04/10/20 02:14:33
>このとき、Aから派生したBクラスのオブジェクトを
>Function関数に渡す方法はありませんでしょうか?
これが普通に出来なきゃ大惨事だろうが

325 :デフォルトの名無しさん:04/10/20 10:14:46
質問なのですが
d3dxof.lib
というリンクライブラリは何処でダウンロードできますか?
d3dxof.libを検索にかけて探してみたのですが
見つかりませんでした。

326 :デフォルトの名無しさん:04/10/20 10:18:05
d3dって事はDirectXじゃないの?
DirectX SDKではないか

327 :325:04/10/20 10:20:57
DirectX SDK ですね。
ありがとうございました。
さっそくダウンロードしてみます。

328 :デフォルトの名無しさん:04/10/20 10:25:10
>>327
自分で何を作ってるのか把握できてるのか…?

329 :デフォルトの名無しさん:04/10/20 11:45:36
沢山データクラスを作って
管理クラスでそれらをvectorで管理しようと思ってるんですが
管理の仕方ってポインタをvecterで管理するのと
実態で管理するのとどっちがカッコいいの?

あと、メンバ変数でクラスを持ちたいときも
ポインタで持ってるのと
実態で持っているのどっちがカッコいいの?

C++な人おせーて



330 :デフォルトの名無しさん:04/10/20 11:50:42
上段については、データクラス←→管理クラスが継承の関係なら、
ポインタでやるしかないんでは?
貴方の「カッコいい」の基準が分からないのでなんとも。
ポインタだとdeleteとかの手間があれこれあるから、
auto_ptr、スマートポインタ使うとか。

331 :デフォルトの名無しさん:04/10/20 11:58:45
>>330
管理クラスって言い方が悪かった(´Д`;)

データクラスをvecterで持つ場合、ポインタがいいのか実態がいいのか?
って事です

どっちがカッコイイ?←C++で一般的にはどっち?


332 :デフォルトの名無しさん:04/10/20 12:07:17
インスタンスの作成、コピーにかかるコストがでかいなら別だが、
vector内のポインタにnewして追加時もnewして要素取り除く時はdeleteして…
って手間を考えればインスタンスを突っ込んどく。

333 :デフォルトの名無しさん:04/10/20 13:04:18
>>332
作成時に new は仕方ないけど、
vector が消えたときに自動的に delete してくれるような方法ってないの?

334 :デフォルトの名無しさん:04/10/20 13:11:57
>>330

335 :デフォルトの名無しさん:04/10/20 13:24:31
auto_ptrは使えないぞ

336 :デフォルトの名無しさん:04/10/20 14:17:22
適当なスマートポインタ使え


337 :デフォルトの名無しさん:04/10/20 14:30:20
↓boost::shared_ptrは遅いという話

338 :デフォルトの名無しさん:04/10/20 14:33:50
素直に実体持たせとけ。

339 :322:04/10/20 14:46:34
>>323
簡潔かつ的確なアドバイスありがとうございます。

>>324
ごもっともです。


…今まで、継承するときに何で識別子つけるのか良く分かってなかったです。

340 :デフォルトの名無しさん:04/10/20 14:48:34
メンバでクラスを持っておきたいときも実体のほうがいい?
それともコンストラクタでnewしてポインタ持つほうがいいかね?

どっちがカッコいい?C++な人おせーて

341 :デフォルトの名無しさん:04/10/20 14:50:23
同じ事だ、目的・状況で使い分けろ。

342 :デフォルトの名無しさん:04/10/20 14:52:40
>>341
使い分けはどのように?

ってかどのように使い分けてます?

343 :デフォルトの名無しさん:04/10/20 14:57:13
普段は要らないが必要になった時にだけnewしたいとかか。
デメリット思い付かないなら全部実体で持ってろ。

344 :デフォルトの名無しさん:04/10/20 15:17:59
漏れはJavaな人が使ったクラスを使うときと必要ないときに実体持ちたくないクラスを使うときくらいだな。

345 :デフォルトの名無しさん:04/10/20 16:30:46
あと、ポインタなら前方宣言するだけで使えるからヘッダの依存性を軽減するのにも使える。

346 :デフォルトの名無しさん:04/10/20 17:12:49
eVC++3.0での開発で質問があります。
テキストファイルを更新する関数を作りたいと思います。
この関数は、3行目という数値と、更新文字列を引数としてを与えると、
オープンしたテキストファイルの3行目を更新文字列で置換え=更新する
という仕組みです。

この時、fopen(),fgets(),fputs()を使用して上記の処理を行うとして、
3行目を更新するという時には、"r+"モードでファイルをオープンし、
3行目までfgetsで読み込んでから、fputs()でおもむろに更新するという
手法でよろしいのでしょうか?

任意の行を更新するという手法がいまひとつ理解できません。
よろしければ教えていただきたいのです。すみません。

347 :デフォルトの名無しさん:04/10/20 17:15:16
Turbo C++4でDOSプログラムを組んでいるんですが
ビットマップのロードの仕方がわかりません
何か良い方法は無いでしょうか?

348 :デフォルトの名無しさん:04/10/20 17:41:34
ポインタなら共有できる。実体だと複製になっちゃう。

349 :デフォルトの名無しさん:04/10/20 17:46:17
>>346
置き換え後もサイズが変わらないのならそれでいいと思うけど。

350 :デフォルトの名無しさん:04/10/20 17:51:08
>>347 どこにロードする方法がしりたいのですか?

351 :347:04/10/20 18:09:33
>>350
メモリ上にです。

352 :デフォルトの名無しさん:04/10/20 18:13:44
>>351
ファイル開く→ファイルサイズ分のメモリ確保→ファイルサイズ分読み込む→ファイル閉じる

353 :デフォルトの名無しさん:04/10/20 18:14:45
メモリといってもいろいろあるけど

354 :デフォルトの名無しさん:04/10/20 18:23:53
BMPといってもいろんな種類があるよな

355 :デフォルトの名無しさん:04/10/20 18:27:29
ロードといってもいろいろあるし

356 :デフォルトの名無しさん:04/10/20 18:36:24
コーディングだっていろいろあるよね

357 :デフォルトの名無しさん :04/10/20 19:15:31
ttp://www.stat.phys.kyushu-u.ac.jp/~ryokawa/cbegin2_3/html4/cbegin_c1_s4.html#s_calculate
の一番したのをやっているのですが、ビルドするとファイルを開けませんと出てしまいます。
どうすればいいのでしょうか?
ソフトはVisual C++.net2003です。
初歩的ですみませんorz

358 :デフォルトの名無しさん:04/10/20 19:19:37
>>357
>#include <iostream.h>
#include <iostream>に変更

359 :デフォルトの名無しさん:04/10/20 19:24:43
ついか
using namespace std;
をmain関数の中に入れるかグローバル空間に記入しといて。

360 :デフォルトの名無しさん:04/10/20 20:22:43
>>349
大嘘を書くな、大嘘を。

361 :デフォルトの名無しさん:04/10/20 20:32:54
>>360
根拠は?

362 :デフォルトの名無しさん:04/10/20 22:06:00
32Bitコンパイラで「int 10h」
のシステムコールを使うとバグるんですが
32bitコンパイラでDOSのビデオモードの
変更とかどうやってやるんですか?
教えてください、お願いします。

363 :デフォルトの名無しさん:04/10/20 22:09:47
>>361
>346をよく読め。3行目までを読み込んでから3行目を書けるわけが無いだろう。

364 :デフォルトの名無しさん:04/10/20 23:32:18
クラスのオブジェクトを配列で宣言したとき、
構造体のような初期設定リストによる初期化は出来ないと聞きました。
このような場合、どのように初期化するのがスマートでしょうか。

クラスとは別に代入用テーブルを作って、for文なり何なりで1個ずつ代入?


365 :デフォルトの名無しさん:04/10/20 23:45:17
確かにできません。こんな方法はどうでしょう?
【std::vector<>を使って1つずつ追加していく。】
std::vector<foo> bar;
for(int i = 0; i < N; ++i) bar.push_back(foo(hoge(i)));
とか。

366 :デフォルトの名無しさん:04/10/21 00:04:10
#define INT 10

main()
{
printf("INT");
}

結果は10でなくINTになってしまいます。

このように、""で囲まれたマクロを展開する方法を教えてください。

367 :デフォルトの名無しさん:04/10/21 00:09:26
>>366
""で囲まれた部分は文字列リテラルなのでマクロ展開の対象になりません。

368 :364:04/10/21 00:10:11
実はC++の標準ライブラリってよくわかってなかったり(こそこそ)

* * * 「猫でもわかる」を読んでいます。しばらくお待ちください * * *

なるほど。
引数に対応した番号の、foo型のオブジェクトを返す(正確にはキャストですが)
関数hogeをどこかで用意しておいて、
それをvectorで順番に格納していくってことでしょうか。

どちらにせよ、別に用意しておいて代入するのが初心者には一番分かりやすそうです。
ありがとうございました。

#のちのちのことを考えると、ソースに直接書かないで
#外部テキストファイルでも読み込もうかしら…?

369 :364:04/10/21 00:12:22
>>366
sprintfとかで地道に展開してはいかがでしょうか。

最初から文字列って分かってるなら
#define HOGE "foo"
でも良さそうですが。

370 :デフォルトの名無しさん:04/10/21 00:12:35
>>366
""で囲まれたマクロを展開する方法は無いです。
ですが、マクロ展開の結果を""で囲むことはできます。

371 :デフォルトの名無しさん:04/10/21 00:13:10
>>367
不可能ということですね。
わかりました。
ありがとうございました。

372 :デフォルトの名無しさん:04/10/21 00:13:53
>>366
#define STR2(x)    #x
#define STR(x)    STR2(x)
#define INT    10

main()
{
    printf(STR(INT));
}

一応、これで代用できるけどスマートじゃない気がする。

373 :デフォルトの名無しさん:04/10/21 00:16:55
>>369,370,372
printfのフォーマット指定をするところに数字を使いたかったのですが、
どうも数字を直接書くよりはマクロで定義していつでも簡単に直せるようにしたほうがいい、
というのを見かけたもので、そうしたかっただけです。
わざわざありがとうございました。

374 :365:04/10/21 00:19:17
>>368
意図したところはそれとは少し違ったんだけれども、その方がスマートかな。

そっちが書いた通りのコードは
foo hoge(int); // foo型のオブジェクトを返す関数hoge

std::vector<foo> bar;
for(int i = 0; i < N; ++i) bar.push_back(hoge(i));

ちなみにfoo(hoge(i))はキャストとは違う。同じように見えるかもしれないけれども、
これはiに対応してhogeが返した何かをコンストラクタ引数にして構築したfooの
一時オブジェクト。

375 :デフォルトの名無しさん:04/10/21 00:25:38
>>367
こういうことがしたいんじゃないのか?

#define INT 10

printf("hogehogeINTfugafuga");

printf("hogehoge"INT"fugafuga");


376 :デフォルトの名無しさん:04/10/21 00:27:53
>>375
こういうことがしたいです。
int i = 100;
printf("%10d\n", i); → printf("%INTd\n", i);

377 :デフォルトの名無しさん:04/10/21 00:28:05
VisualStudio.netでConsoleプロジェクトを立ち上げ、最初から付いてくるstdafxファイルを削除するとEOFのエラーが出てコンパイル出来なくなりますよね?
これを消したい場合どこの設定を弄ればstdafxファイルなしでコンパイル出来るようになるのでしょうか?

378 :デフォルトの名無しさん:04/10/21 00:30:38
>>376
printf("%*d\n", INT, i);
だったか?たしか。

379 :デフォルトの名無しさん:04/10/21 00:31:29
>>377
プロジェクトのプロパティ→C/C++→プリコンパイル済みヘッダー
→プリコンパイル済みヘッダーの作成/使用 : プリコンパイル済みヘッダーを使用しない

380 :デフォルトの名無しさん:04/10/21 00:33:01
>>378
できました。
ありがとうございました。

381 :364:04/10/21 00:34:44
>>374
ああ、再度なるほどです。
なんとなくではありますが(多分)理解しました。
でもコンストラクタの引数の数が増えると、hoge関数も比例して……(汗)


382 :デフォルトの名無しさん:04/10/21 00:38:36
>>381
何を心配してるのか知らないけど、この際hogeはまったく関係ない。
# 単に説明をややこしくしてるだけ

383 :377:04/10/21 00:48:43
有り難うございます。分かりました。
ところで、プログラムの最後でプリコンパイル済みヘッダーがあるとgetch()などをはさまない限り一瞬でプログラムが終了してしまいます。
プリコンパイル済みヘッダーがなれば、そんなことはないのですが。なぜなのでしょうか?

384 :デフォルトの名無しさん:04/10/21 00:57:57
>>383
んなこたーない。プリコンパイル済みヘッダが無くても終わるときは終わる。

385 :377:04/10/21 01:19:50
猫さんのページの
http://www.kumei.ne.jp/c_lang/intro/no_24.htm
をコンパイルしたところプリコンパイル済みヘッダをありでプロジェクトを作ると、「もうお金がありません! それではやめましょう」のところがほとんど表示されずに表示されてしまったのでそう思ったのですが。
どう弄ればプリコンパイル済みヘッダありでも最後に止まってくれるのでしょう?

386 :デフォルトの名無しさん:04/10/21 01:46:07
>>385
大丈夫、プリコンパイル済みヘッダありでもなしでも普通は止まらない。

387 :デフォルトの名無しさん:04/10/21 01:57:30
>>385
止まるかどうかは、デバッグ付き実行(F5)してるかデバッグ無し実行(Ctrl+F5)してるかの違い。


388 :235:04/10/21 10:55:58
#defineマクロ中に改行コードを埋め込むことはできますか?

例えば、
#define HOGE(name)
というマクロを、

#define name (__LINE__)
int line_ ##name = (__LINE__)+1;

という2行分に定義したいのです。


389 :デフォルトの名無しさん:04/10/21 11:51:43
1行目とそれ以降の繋がりがよくわからん漏れはイッテヨシ?

390 :デフォルトの名無しさん:04/10/21 11:54:45
漏れもサパーリ

#define name (__LINE__)\
int line_ ##name = (__LINE__)+1;

こういうこと???

391 :388:04/10/21 12:30:16
すみません、たとえが悪かったです。

ようするに、#define によるシンボル定義と、それ以外の処理(なんでもいいです)を、
マクロ一つで済ませたいのです。

int now_line[] = {
#define FOO1 __LINE__
FOO1,
#define FOO2 __LINE__
FOO2,
#define FOO3 __LINE__
FOO3,
:
};

というようなこととかを、マクロでやりたいなと。


392 :デフォルトの名無しさん:04/10/21 13:09:05
つまり#defineの中に#defineを書けるか、ということか?

393 :388:04/10/21 13:22:37
>>392
調べたところ #define の中で #define は無理みたいですね…。
別の方法を考えます。

394 :デフォルトの名無しさん:04/10/21 14:04:24
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1060403548&res=126

うえのリンク先のプログラムはL x M 行列 A と M x N 行列 B の積 C(Cは L x N 行列)
を求めるプログラムですが、これを
「行列Bを、行列Bの転置行列DとしてAとDの積を求める」プログラムにするには
どうしたらいいいか回答をお願いします。

395 :デフォルトの名無しさん:04/10/21 14:16:36
宿題丸投げはそれ専用スレへ

396 :デフォルトの名無しさん:04/10/21 14:50:35
c++ について質問です。

class ClassA
{
 ClassB b;
};

class ClassB
{
 ClassA a;
};

のように、2つのクラスが互いに相手クラスのインスタンスを持つとき、
この場合だと class A の定義の前に class B の存在を知らせる必要がありますが、
記述方法を忘れてしまいました。
調べようと思っても検索ワードが思いつかず……。ご指導お願いします。

397 :デフォルトの名無しさん:04/10/21 14:54:11
class ClassB;


398 :デフォルトの名無しさん:04/10/21 14:55:55
つーか無理

399 :デフォルトの名無しさん:04/10/21 14:59:43
なんで?
って、ポインタじゃなくインスタンスか
またまた釣られちゃったぜー

400 :デフォルトの名無しさん:04/10/21 15:00:27
>>397
ありがとうございます。

その定義を入れると、ClassB b; の行で
Error: field 'b' has incomplete type
と言われました。

あれ……

401 :396=400:04/10/21 15:01:11
……無理?(;´Д`)

402 :396=400:04/10/21 15:03:18
……当たり前だということに気づきました。ご迷惑をおかけしました……。

403 :デフォルトの名無しさん:04/10/21 15:07:20
まずAの中にはBがあって
そのBの中にはAがあって
更にAの中にはBがあって(無限再帰)

C++は良く分からないけど、無理だと思う、流石に。


ただ、Aの中にBそのものを入れないで、Bを示すポインタを含めるとかだけなら
特に矛盾は起きないと思う。

404 :デフォルトの名無しさん:04/10/21 15:25:02
質問テンプレ】
[1] 授業単元:C言語
[2] 問題文(含コード&リンク):
[3] 環境
 [3.1] OS:winXP
 [3.2] コンパイラ(バージョン):
 [3.3] 言語:C
[4] 期限:今日中
[5] その他の制限:特に無し

C言語初心者です。課題で迷っています。
strcmp関数(文字列の比較する関数)と同じ働きをする関数αを作りたいですがどのように作れば良いのか分かりません。教えて下さい。
ちなみに関数の作り方の構文は知っています。

405 :デフォルトの名無しさん:04/10/21 15:30:21
>>404
こぴぺがはげしいな。
int scmp(const char* l, const char* r)
{
 if(*l==*r){
  return *l=='\0' ? 0 : scmp(++l, ++r);
 }else{
  return *l - *r ? 1 : -1;
 }
}

406 :デフォルトの名無しさん:04/10/21 15:31:05
宿題スレで回答されてるがな、嫌がらせ?

407 :デフォルトの名無しさん:04/10/21 15:31:56
>>405
return (*l - *r)>0 ? 1 : -1;
こうか

408 :デフォルトの名無しさん:04/10/21 16:39:18
if (条件文A)
{
}
みたいな文で条件文Aがすごく長い時に2行にわたって条件文Aを書きたい時はどうすればいいのでしょうか?

409 :デフォルトの名無しさん:04/10/21 16:41:03
>>408
改行すればいい

if(ab==cd&&
ef!=gh){
ijk;
}

410 :デフォルトの名無しさん:04/10/21 16:44:02
>>409
即レスありがとうございます

411 :デフォルトの名無しさん:04/10/21 16:53:55
>>408
何度も似たような条件文が出てくるなら
条件文を切り出して関数化しておくのも手だぞ。
(マクロでもいいけどその場合は副作用に注意。)


412 :デフォルトの名無しさん:04/10/21 20:55:20
バッファ(*buff←ポインタ)に入っている文字列の最後に改行コードがあるのですが
改行コードだけを削除する方法がありましたらお教え願います。

413 :デフォルトの名無しさん:04/10/21 20:56:25
終端ならNULL(0x0)に置き換えたら?

414 :デフォルトの名無しさん:04/10/21 21:53:48
buff[strlen(buff) - 1] = '\0'

415 :デフォルトの名無しさん:04/10/21 21:56:19
改行コードがCrLfやLfCrだったらどうすんだ

416 :デフォルトの名無しさん:04/10/21 22:05:53
'\r' か '\n'

417 :デフォルトの名無しさん:04/10/21 22:16:49
fgetsで読み込め。

418 :デフォルトの名無しさん:04/10/21 23:17:32
int a
a=1

error C2501: 'a' : 識別名を宣言するのに、型が指定されていません。

というエラーがでるんですけどなんでですか?

419 :デフォルトの名無しさん:04/10/21 23:18:47
;

420 :418:04/10/21 23:23:17
>>419
訂正
nt a;
a=1;

error C2501: 'a' : 識別名を宣言するのに、型が指定されていません。
というエラーがでるんですけどなんでですか?

と質問したかったんです、すいません

421 :デフォルトの名無しさん:04/10/21 23:26:32
i

422 :デフォルトの名無しさん:04/10/21 23:27:26
期待通りの展開にワロタ

423 :デフォルトの名無しさん:04/10/21 23:27:31
int a;
a=1;
でしょ。他の部分で間違ってるんじゃ無い?

424 :418:04/10/21 23:31:07
上の行で”{”が抜けていたからでした
解決しました

425 :418:04/10/21 23:32:11
>>419
>>421
>>423
レスありがとうございました

426 :デフォルトの名無しさん:04/10/22 00:39:49
使えそうなクラスができたのでライブラリを作ってみたんですが
ライブラリの使い方がわかりません。(win32 static library プロジェクト)
ヘッダファイルにクラス定義、ソースファイルにメンバ関数を分けて書きました。
使うときに必要なのはどのファイルで、どこに置けばよいですか?
コンソールアプリしか作りません。環境はMS-Visual C++6.0です。

427 :デフォルトの名無しさん:04/10/22 00:49:59
教えてください
DELETEDIRでフォルダの中にある全てのファイルを削除したいのですが
その中のファイルが読み取り専用のファイルがあると削除できないようです

これに対応するためにディレクトリの中にあるファイルの
全てのファイルを一度に属性をクリアさせてから実行したいのですが
フォルダ内のファイルを取得(リスト化)してまわすやり方がいまいちよくわかりません、どうすればいいのでしょうか?
すいませんが教えてください

428 :デフォルトの名無しさん:04/10/22 00:57:19
>>427
環境は?

429 :デフォルトの名無しさん:04/10/22 00:58:52
CかC++です

430 :デフォルトの名無しさん:04/10/22 01:00:01
>>428
C++です

431 :デフォルトの名無しさん:04/10/22 01:01:10
じゃなきゃスレ違いだ罠
で、何を聞かれてるのかわからないか?

と思ったら釣りか?

432 :デフォルトの名無しさん:04/10/22 01:07:39
>>431
わかりません
教えてください

433 :デフォルトの名無しさん:04/10/22 01:10:38
>>426
必要なのは、libファイルとヘッダーファイル。
libはプロジェクトと同じ位置が無難かな。
ヘッダーは普通にincludeすればいい。
後は#pragma commentでlib追加してやる。
こんなカンジかな。



434 :デフォルトの名無しさん:04/10/22 01:26:38
vc++でプログラミングしています。
インタプリタっぽいのを作っていて
その言語内で例えば
str test[3]="asfd","fdsa","qwer";(strは文字列変数のことをさす)
のような宣言をされたときに
void* value=new char*[3];
のようにして
(char**)value[0]=new char[4+1];strcpy((char**)value[0],"asdf");
(char**)value[1]=new char[4+1];strcpy((char**)value[0],"fdsa");
(char**)value[2]=new char[4+1];strcpy((char**)value[0],"qwer");
みたいなことをやっています。
ここまではうまく行くのですが
・このあとどれかを削除してそこに新しい文字列を追加する
という作業を行うとアサーションとかいうダイアログがでてきてしまいます。
Debugモードでは駄目でReleaseモードだと難なく動くのです。
手順は
例えば真ん中の"fdsa"を削除して新しく"zxcv"という文字列を追加する場合は
delete [] value[1];
(char**)value[1] = new char[4+1];strcpy((char**)value[0],"zxcv");
という具合に最初とまったく同じなのですが駄目みたいなんです。
このアサーションというのはどういうものなのでしょうか?
他の変数を壊している可能性があるのでしょうか?

435 :デフォルトの名無しさん:04/10/22 02:35:50
>>434
書き間違いの可能性が高いけど、ダメダメじゃん。
どれもみんなvalue[0]にコピーしている。
それから、アサーションはDebugビルドのみ有効でReleaseビルドでは起きない。
つまり、Debugビルドでアサーションを起こさないように充分デバッグしてからリリースしろと言うこと。
で、value[1]をdeleteしているのが恐らくアサーションの原因。
void *じゃなくてはじめからchar **にしておいたら?

436 :デフォルトの名無しさん:04/10/22 03:28:31
FitzHugh-Nagumo方程式の解軌跡を求めるプログラムを書き、興奮性を示すx,yの初期値を一組探しグラフで結果を示せ。ただし、a=0.7,b=0.8,c=20.0,z=1.0を初期値とし、これらの値を変更しても構わない。
dx/dt=c(x-x?/3+y+z)
dy/dt=(a-x-by)/c

よくわからないんです><

437 :デフォルトの名無しさん:04/10/22 05:55:11
>>436
式の意味がよくわからんが t を少しずつ変化させながら、(x,y)を求めて
書いていけばいいんじゃまいか
興奮性ってのは良くわからんのでパス

438 :426:04/10/22 08:20:35
>>433
ありがとうございます。これだとソースを書くたびに
数行追加することになると思うのですが
標準ライブラリのように、#include<hoge.h>だけで
済むような方法はないのでしょうか?あればご教授ください。

たとえば猫Cではこのようにmainを書いているようですが・・・。
ttp://www.kumei.ne.jp/c_lang/intro/no_54.htm

439 :デフォルトの名無しさん:04/10/22 10:03:39
質問です。
簡単のため、インスタンスは全て public とします。
また、クラス定義の順番がバラバラでコンパイルエラーが出るのは、ここでは気にしないとします。

class CParent
{
 CChildA a;
 CChildB b;
 void func() { a.func(this); }
};

CChildA
{
 void func(CParent* p) { p->b.hoge=3 }
};

CChildB
{
 int hoge;
};

のように記述すると、a が b のインスタンスにアクセスすることが出来ますが、
これはオブジェクト指向の概念からはずれてる気がします。
goto 文を避けるのが暗黙の了解になっているように、このような記述も避けるべきでしょうか?
それとも、このような記述は普通に行なわれているのでしょうか?

440 :デフォルトの名無しさん:04/10/22 10:05:23
ならpublicにするなよ
自分で公開して何言ってんだ

441 :デフォルトの名無しさん:04/10/22 10:26:21
>>439
そのような記述はできません

442 :デフォルトの名無しさん:04/10/22 10:29:56
>>438
プロジェクト>設定>リンクタブを開く
カテゴリ「一般」>オブジェクト/ライブラリモジュール内に、使用するlibファイルを追加。


443 :c:04/10/22 13:35:45
char型に数字が格納されているのですが
char型同士で足したり引いたりできるでしょうか?
また方法がありましたらお教えください。

444 :デフォルトの名無しさん:04/10/22 13:40:33
>>443
普通にできる。
無論表現できる値の範囲は小さいけど。

445 :デフォルトの名無しさん:04/10/22 13:55:04
>>439
鮮やかな矛盾っぷりに藁田

446 :デフォルトの名無しさん:04/10/22 15:13:37
a[1]=b[1];

で調べると
a[1]の値が−83634454
b[1]の値が999
みたいな感じだったんですけど
なんで右辺と左辺の値が違うんですか?

447 :デフォルトの名無しさん:04/10/22 15:15:33
>>446
もう少し詳しく

448 :デフォルトの名無しさん:04/10/22 15:16:06
>>446
printf()か何かで表示させたのだろうが、その行も書いてみろ。

449 :デフォルトの名無しさん:04/10/22 15:17:06
知らん

450 :デフォルトの名無しさん:04/10/22 15:23:00
a[1]=b[1];
HDC hdc;
TCHAR szBuf[32];
hdc = GetDC(hWnd);
sprintf(szBuf, "%d", a[1]);
TextOut(hdc, 10, 10, szBuf, lstrlen(szBuf));
ReleaseDC(hWnd , hdc);
みたいな感じです

451 :デフォルトの名無しさん:04/10/22 15:24:40
いや、全然わからん

452 :デフォルトの名無しさん:04/10/22 15:28:56
>>450
そのプログラムでは>>446のようになるわけがない。

453 :デフォルトの名無しさん:04/10/22 15:34:53
for (i=0;i<9;i++)
b[1]=999
a[i]=b[i];
HDC hdc;
TCHAR szBuf[32];
hdc = GetDC(hWnd);
sprintf(szBuf, "%d", a[1]);
TextOut(hdc, 10, 10, szBuf, lstrlen(szBuf));
sprintf(szBuf, "%d", b[1]);
TextOut(hdc, 20, 20, szBuf, lstrlen(szBuf));
ReleaseDC(hWnd , hdc);

もっと詳しく書くとこんなかんじです

454 :デフォルトの名無しさん:04/10/22 15:47:13
> for (i=0;i<9;i++)
> b[1]=999
> a[i]=b[i];

999の後にセミコロンがないんで、コピペミスってるとしても、
b[1]な時点でアホチン

455 :デフォルトの名無しさん:04/10/22 15:48:29
>>453
a[], b[]の定義部分はどうなってる?
それからCHAR_BITとSCHAR_MAXとUCHAR_MAXの値は?

456 :デフォルトの名無しさん:04/10/22 15:48:45
>>454
b[1]=999;
ですすいません

457 :デフォルトの名無しさん:04/10/22 15:50:19
>>456
じゃなく、forループでひたすらb[ 1 ]に代入してどうするのと。

458 :デフォルトの名無しさん:04/10/22 15:57:29
int b[20];
hoge(b);
struct z hoge(int b[])
{
int a[20];
for (i=0;i<9;i++)
b[1]=999;
a[i]=b[i];
}
こんな感じです

あと
nt b[20];
hoge(b);
struct z hoge(int b[])
{
int a[20];
for (i=0;i<9;i++)
b[1]=999;
a[1]=b[1];
}
にすると両方とも999になりました

459 :デフォルトの名無しさん:04/10/22 15:59:29
for (i=0;i<9;i++)
b[1]=999;
a[i]=b[i];
}



for (i=0;i<9;i++)
b[i]=999;     // b[1]→b[i]にしる
a[i]=b[i];
}

これで満足?

460 :デフォルトの名無しさん:04/10/22 16:00:47
>>457
プログラムを簡略化して書くとこうなっちゃったんです

461 :デフォルトの名無しさん:04/10/22 16:03:22
>>458
あー、>>443と同じ人かと勘違いしていたよ。
原因はもうわかったろう?

462 :デフォルトの名無しさん:04/10/22 16:05:14
>>459
for (i=0;i<9;i++)
b[i]=999;     
a[i]=b[i];
HDC hdc;
TCHAR szBuf[32];
hdc = GetDC(hWnd);
sprintf(szBuf, "%d", a[1]);
TextOut(hdc, 10, 10, szBuf, lstrlen(szBuf));
sprintf(szBuf, "%d", b[1]);
TextOut(hdc, 20, 20, szBuf, lstrlen(szBuf));
ReleaseDC(hWnd , hdc);

にしても
a[1]とb[1]の値が違います

463 :デフォルトの名無しさん:04/10/22 16:05:54
>>461
すいません、まだわかりません

464 :デフォルトの名無しさん:04/10/22 16:07:42
>462
かっこつけろ

465 :デフォルトの名無しさん:04/10/22 16:09:04
>>463

for (i=0;i<9;i++) {
 b[i]=999;     
 a[i]=b[i];
}

これでやってみろ。


466 :デフォルトの名無しさん:04/10/22 16:10:32
for (i=0;i<9;i++)
{
b[i]=999;     
a[i]=b[i];
}
HDC hdc;
TCHAR szBuf[32];
hdc = GetDC(hWnd);
sprintf(szBuf, "%d", a[1]);
TextOut(hdc, 10, 10, szBuf, lstrlen(szBuf));
sprintf(szBuf, "%d", b[1]);
TextOut(hdc, 20, 20, szBuf, lstrlen(szBuf));
ReleaseDC(hWnd , hdc);

こうですね
なんか焦って書き間違いが多くてすいません

467 :デフォルトの名無しさん:04/10/22 16:12:32
ttp://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/lounge/index.html
↑ここに最低限症状が再現するソースを貼り付けてくれ。わけわからん

468 :デフォルトの名無しさん:04/10/22 16:13:57
yuoiukiu

469 :デフォルトの名無しさん:04/10/22 16:34:32
>>467
再現できるような例ができないのでいったん諦めます

みなさんレスありがとうございました

470 :デフォルトの名無しさん:04/10/22 17:36:20
周りを振り回した挙句勝手にあきらめてさってくやつが一番迷惑。
他人を巻き込んだんだから最後まで責任持ってがんがれ。

471 :デフォルトの名無しさん:04/10/22 17:47:24
お前も変な奴だな、forループから外れてたから、
b[1]とa[9]、b[9]以外は値が代入されていない。

472 :デフォルトの名無しさん:04/10/22 17:52:54
あ、うそだ
b[9]も代入されてない、当然a[9]も

473 :デフォルトの名無しさん:04/10/22 17:54:24
これからC言語勉強しようと思ってるんですが
どういうのを使えば勉強できますか?

今のところ、Borland C++ Compiler 5.5を使おうと思ってるんですがどうですか?

474 :デフォルトの名無しさん:04/10/22 17:55:35
どうだろうね?

475 :473:04/10/22 17:57:19
ダメ?

476 :デフォルトの名無しさん:04/10/22 18:05:10
>>473
うん

477 :デフォルトの名無しさん:04/10/22 18:08:02
ダメではないけれど、Windowsでは有料の環境でないと、いろいろ不便ですよ。
もし、プログラミングを勉強するのであればVisualStudioなどを買うか、
Linuxでのフリーソフトウェアずくしの環境にするか、
どちらかでしょうね。
Linuxは慣れるとわりと便利な環境で、しかも無料で本格的な環境をそろえる
事ができますので、学生さんでしたら移行をお薦めします。
お金が有ればいろいろパッケージを買って環境をそろえるのも良いかもしれませんが。

478 :473:04/10/22 18:19:15
これからC言語が学校の勉強で取り入れられるので
作業が遅い自分は家で先に予習した方がいいのかな?と思ったんです。
で、家でC言語を勉強するにはどうすればいいのかさっぱりだったんで質問してみました。

基本的にパソコンさっぱりの学生なんで、設定とか複雑なのは頭混乱するんですが
超ド級初心者が一番手を出しやすいのはVisualStudioなんですか?

C++も後から手を出すと思うんですが、やっぱりC言語をやるなら
C→C++の順に勉強したほうがいいのでしょうか?

479 :デフォルトの名無しさん:04/10/22 18:25:39
>>478
学生なら安く買えるよ。
ttp://www.microsoft.com/japan/msdn/student/premium/default.aspx

480 :デフォルトの名無しさん:04/10/22 18:26:22
Cは構文理解程度
さっさとC++へ移行した方が無難

まぁ授業があるのなら,
平行でC++(というよりオブジェクト指向)の概念を学ぶのがベストかな

481 :デフォルトの名無しさん:04/10/22 18:27:41
パソコンさっぱりわからんつってるやつにVSなんか渡すなよ・・・

482 :デフォルトの名無しさん:04/10/22 18:32:19
Win環境で,CまたはC++を使い
「NetMeetingのようなものを作る」
というのが最終課題なのですが

画像と音声を扱うなら,どういう勉強をすればいいでしょう?
資料などお勧めがありましたら教えてください.
(ググってはみましたが,いまいち要領を得なくて)
現在,チャット程度のものができている状態です.

483 :デフォルトの名無しさん:04/10/22 18:32:47
確かに

プログラム組むなら最低限のPCの知識を得てからだ罠
ある程度自分でトラブルシュートできるようになってからじゃないと
先生にこうしろといわれたからこういうソース書いた
とか言うPGが出てきそうだ

484 :デフォルトの名無しさん:04/10/22 18:36:04
勉強はBCCで十分だと思うが。
ちなみにこういうのもある。
ttp://www.microsoft.com/japan/msdn/vstudio/2005/express/visualc/

485 :デフォルトの名無しさん:04/10/22 18:50:15
実は(それなりの知識があるなら)Cygwinが一番楽だと思うけどね。
Linuxと違ってシームレスに扱えるのが魅力。
#インストールも楽だし。

486 :デフォルトの名無しさん:04/10/22 18:51:42
makeファイル万度草

とはいえ覚えておきたいのでどっか紹介ヨロ

487 :デフォルトの名無しさん:04/10/22 18:55:26
>>486
Autoconf/Automakeで作ればいいやん

488 :デフォルトの名無しさん:04/10/22 18:56:11
Makefileを直書きする人の方がまれだし。

489 :デフォルトの名無しさん:04/10/22 19:11:16
激安で買えるVisual Stdio.NET theSpoke Disc.8 4850円
http://pc5.2ch.net/test/read.cgi/tech/1095325802/

490 :デフォルトの名無しさん:04/10/22 20:56:14
>486
漏れこれ読んだ
http://www.ecoop.net/coop/translated/GNUMake3.77/make_toc.jp.html

もれのmingwにはAutoconfとかAutomakeとかなくてよ。
makeを憶えとくのは無駄にはなんねー。
つかglutとかSDLとか何だとか、有名どころのライブラリすら
makefileをちょっといじらないと、コンパイルやリンクが通らない場合もあるしよ。
# つーかもれglut使用アプリのリンクが通らなくて悪戦苦闘しててよorz

491 :デフォルトの名無しさん:04/10/22 21:09:27
>439
「デメテルの法則」かな。
ここで CChildA::func メソッドがアクセスしていいのは
CParent のメンバだけ。
"b.hoge = 3;" の部分で、CParent を超えて
CChildB のメンバにアクセスしている事になるが、
これがデメテルの法則を破っている。

って事でいいのかなあ?
あの法則を最初に知った時、要するに「触れるものは
何でも触っていいぞ」としか読めなくて難儀した(;´Д`)
つか今もよく分かってないし(;´Д`)

492 :デフォルトの名無しさん:04/10/22 21:15:46
>>490
SDLってGTK+に比べたら特殊だと思うけれどね…

493 :デフォルトの名無しさん:04/10/22 21:20:17
#include <stdio.h>

int main(void)
{
int i;

for(i=0; i<9; i++){
printf("error\n");
}

printf("予想は i=9\n");
printf("i=%d\n", i);

return 0;
}

上記のプログラムをコンパイルすると
jikken.c:11:16: warning: unknown escape sequence: '\221'
と出て

予想はi=9
と出るべきところが
卵zはi=9
と出てしまいます。

予想 という漢字は使えないのでしょうか?

コンパイル環境は
gcc version 3.3.1 (cygming special)
cygwinのバージョンは分かりませんでした。

494 :デフォルトの名無しさん:04/10/22 21:39:11
>>493
文字コードがCygwinと君のエディタの出力が違うため。

495 :デフォルトの名無しさん:04/10/22 22:29:12
>493
「予想」の文字コードの並びが 0x97 0x5c 0x91 0x7a だ。
コンパイラは 0x5c を見つけると、特別なモノに置き換えるか、無視をする。
この場合は無視されて、0x97 0x91 0x7a と解釈される。
0x97 0x91 は「卵」だ。0x7a は "z" だ。

解決するには、「予\想」とする。

496 :デフォルトの名無しさん:04/10/22 22:46:21
char *str
に16進数の文字列が入っていて、それを10進数のint型に
変換するにはどうすれば出来ますか?

497 :デフォルトの名無しさん:04/10/22 22:47:55
>>496
>10進数のint型

詳細キボン


498 :デフォルトの名無しさん:04/10/22 22:51:55
>>497
例えば、char *strに003Aが入っているとすると、int iに58を
代入したいということです。

499 :デフォルトの名無しさん:04/10/22 22:59:21
int i に 0x3A を代入では駄目なのか?


500 :デフォルトの名無しさん:04/10/22 23:00:56
>>499
毎回違う16進数を変換したいのです。

501 :デフォルトの名無しさん:04/10/22 23:01:12
>>499
よく見ろ
>>498は char * だから文字列 "003A" のことを言ってるに違いない!

502 :デフォルトの名無しさん:04/10/22 23:01:20
strtolとか。
あとintに入るのは値であって、10進とか16進は関係ない。
*進数は値を文字で表現する手段の一つに過ぎない。

503 :デフォルトの名無しさん:04/10/22 23:10:53
strtolですか。
ちょっとやってみます。

504 :デフォルトの名無しさん:04/10/22 23:11:27
int Ret_hex(char *pBuff){
int retNum=0, last=strlen(pBuff)-1;
for(i=last; i>=0; i++){
retNum += pBuff[i]*pow(10,last-i);
}
return retNum;
}

505 :デフォルトの名無しさん:04/10/22 23:13:23
ぐはぁ。まちがいた。
retNum += pBuff[i]*(16,last-i)

506 :デフォルトの名無しさん:04/10/22 23:15:31
こんな感じでできました。ありがとうございます。
#include<stdio.h>
#include<stdlib.h>
main(){
int a[10],i,j;char *str,*tep;
for(j=0;j<10;j++){
sprintf(str,"%p",&a[j]);
printf("%s\n",str);
i=strtol(str,&tep,16);
printf("%d\n",i);
}
}

507 :デフォルトの名無しさん:04/10/22 23:20:12
>>504-505
どうもです。
見てみます。

508 :デフォルトの名無しさん:04/10/22 23:31:49
>>495さん
ありがとうございます。
\ を足していきたいと思います。

509 :504:04/10/22 23:34:23
int Ret_ChrHex(char theChr){
int chr=toupper(theChr);
if('A' <= chr && chr <= 'F') return chr-'A'+10;
else if('0' <= chr && chr <= '9') return chr-'0';
return 0;
}
int Ret_hex(char *pBuff){
int i,retNum=0, last=strlen(pBuff)-1;

for(i=last; i>=0; i--){
retNum += Ret_ChrHex(pBuff[i])*pow(16,last-i);
}
return retNum;
}
コンパイルせずに書いたから間違えまくり。激しくゴメン。

510 :デフォルトの名無しさん:04/10/22 23:35:05
今でも多いのかな、エスケープ文字と日本語がぶつかるコンパイラ。

511 :デフォルトの名無しさん:04/10/22 23:36:22
>>506
ダメダメじゃん。

512 :デフォルトの名無しさん:04/10/22 23:52:18
配列初期化してないし。

513 :デフォルトの名無しさん:04/10/23 04:11:28
初心者のぶしつけな質問でもうしわけないのがですが、
bccを使った場合ソースのコンパイルはどのように行えばよろしいのでしょうか?

514 :デフォルトの名無しさん:04/10/23 04:15:05
つttp://www.google.com/search?q=bcc+%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB&btnG=Google+%E6%A4%9C%E7%B4%A2&hl=ja&safe=off

後,複数のソースにまたがるなら
「分割コンパイル」「makefile」がキーワード

515 :デフォルトの名無しさん:04/10/23 04:23:04
あー後>>2からbcc専用の方へ行った方がいいかもな

516 :デフォルトの名無しさん:04/10/23 04:47:22
>>514-515
時間的にもこんなに早くレスをもらえるとは思いませんでした。
参考させていただきます。ありがとうございます。

517 :デフォルトの名無しさん:04/10/23 12:15:43
なるべくグローバル変数にしないほうがいいと聞いたので
いちいち関数に引数として渡したり戻り値として返したりしながら
変数をたらい回しにしてるのですが
複数の関数間にまたがる変数はグローバル変数にしたほうがいいような
気がするんですが
グローバル変数にする時のおおまかな基準とか教えてください

518 :デフォルトの名無しさん:04/10/23 12:18:10
>>517
基本的になにもグローバル変数にはしません。
関数間をたらいまわしにするのが正しいです。
もしそれが不自然に感じるのなら、関数の設計やたらいまわしの仕方がおかしいです。

structやclassで関連性の強い変数をまとめるなどしてみるとすっきりするかもしれません。

519 :デフォルトの名無しさん:04/10/23 12:22:30
>>518
structでまとめれそうなのがたくさんあるのでまとめてみます
グローバル変数化しないでがんばろうと思います

アドバイスありがとうございました

520 :デフォルトの名無しさん:04/10/23 13:50:18
グローバル変数にしたほうがいいような

521 :デフォルトの名無しさん:04/10/23 13:52:50
↑定年間近のPG,もしくは昨日今日プログラム覚えたど素人

522 :デフォルトの名無しさん:04/10/23 13:56:01
>>521
まあまあ
>>520
なんでそう思うの?

523 :デフォルトの名無しさん:04/10/23 14:03:38
>>521
必死だなw

524 :デフォルトの名無しさん:04/10/23 14:18:24
>なるべくグローバル変数にしないほうがいいと聞いたので
そうです。グローバル変数だと名前の衝突が起こりやすくなるので
たくさんあると使いにくくなります。しかし、プログラムが
どういうモードで動いているかとか、全体のエラーの個数などは
グローバル変数の方が良いかもしれません。


525 :デフォルトの名無しさん:04/10/23 14:34:54
>グローバル変数にする時のおおまかな基準とか教えてください
漢かどうか

526 :デフォルトの名無しさん:04/10/23 14:38:35
グローバルにしたらどの変数がどこで使われてるか把握しにくくなるじゃない。
1000行程度の個人で作るプログラムならまだしも。

527 :デフォルトの名無しさん:04/10/23 14:44:02
別のところで一度質問をしたのですが、
こちらのスレの方が私の質問のレベルにあってそうなので
改めて質問させていただきます。

文字列の変数a,b,cにSeven,Six,Fiveの文字列をscanf文を用いて読み込み、
Seven
Six
Five
というように表示せよ。

とあるのですが、どのようにプログラムを組めばいいのかわかりません。
よろしければ教えてください。

528 :デフォルトの名無しさん:04/10/23 14:47:21
宿題丸投げだろ?

悪いがここも適当ではない
ttp://pc5.2ch.net/test/read.cgi/tech/1097592876/l50

529 :デフォルトの名無しさん:04/10/23 14:47:36
文字列の変数a,b,cにSeven,Six,Fiveの文字列をscanf文を用いて読み込み、
Seven
Six
Five
というように表示すればいい。


530 :デフォルトの名無しさん:04/10/23 14:50:47
昨日からずっとやっていてわからなくて・・・
できればヒントだけでもと思ったのですが。

531 :デフォルトの名無しさん:04/10/23 14:56:56
宿題なら教科書見ろ。

532 :デフォルトの名無しさん:04/10/23 14:58:23
黙って移動するやつに教える義理はない

533 :デフォルトの名無しさん:04/10/23 17:18:19
>文字列の変数a,b,cに

本当にこのまま問題が出てるとしたらCだと解けない気がする。


534 :デフォルトの名無しさん:04/10/23 21:51:08
全体の流れを制御するためにの変数はグローバル変数でもいいんだよね

535 :デフォルトの名無しさん:04/10/23 21:59:57
>>534
機能ごとに構造体にまとめて、
その構造体のグローバル インスタンスを作るほうがよい。

536 :デフォルトの名無しさん:04/10/23 22:03:25
グローバル変数を一個作ると考えただけでじんましんが出そうな漏れは逝って良しですか?

537 :デフォルトの名無しさん:04/10/23 22:08:34
>>536
そこまでひどくはないですけど、私もそんな感じです。
でもグローバル変数をなくすことはできませんよね。
(なくそうと思えばなくせますけど、逆にプログラムの複雑度が上がる)

538 :デフォルトの名無しさん:04/10/23 22:08:46
>>536
うん。

539 :デフォルトの名無しさん:04/10/23 22:52:31
>>537
グローバル変数なんか無くても困らんと思うけど?

540 :デフォルトの名無しさん:04/10/23 22:54:36
実験プログラムだったら何ら問題無いと思うけど。グローバル変数

541 :デフォルトの名無しさん:04/10/23 22:55:28
すげぇ初心者な質問なんですが、
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/249-1209347-0897963
↑のP20の
#include<stdio.h>

main()
{
int c;

c = getchar();
while (c != EOF){
putchar(c);
c = getchar();
}
}
ってプログラムをやっても延々と続くんですが、EOFを打ち込めば終了ってワケじゃないんでしょうか?
ソフトはVC++使ってます、誰か教えて_| ̄|○

542 :デフォルトの名無しさん:04/10/23 23:06:11
>>541
その本もってないから良く分かんないけど、おまいがちゃんと読んでないだけなんじゃないのか?
ってかその本訳にかなり問題があるみたいだな

543 :デフォルトの名無しさん:04/10/23 23:09:34
K&Rかよorz・・・んな門窓から投げ捨てろ

544 :デフォルトの名無しさん:04/10/23 23:14:53
>>541
ttp://www9.plala.or.jp/sgwr-t/c/sec08.html
をEOFで検索


545 :デフォルトの名無しさん:04/10/23 23:16:55
Ctrl+Zを押して改行したら終了するよ。
K&Rの本って皆持ってるらしいけど、必要感じた事無い。。。

546 :545:04/10/23 23:17:41
処理系依存だた。他の処理系は知らない。

547 :デフォルトの名無しさん:04/10/23 23:20:26
>>545
お布施みたいなもんだからね


548 :デフォルトの名無しさん:04/10/24 12:34:15
>>539
>グローバル変数なんか無くても困らんと思うけど?

そうすか?
ある程度大きなプログラムになるとどうしても必要になると思いますが、
どうやって グローバル変数をなくしてます?

549 :デフォルトの名無しさん:04/10/24 12:36:20
大きなプログラムほどグローバル使わないと思うが。
グローバルを使わざるを得ないとしたら、むしろ設計に問題がある。

550 :デフォルトの名無しさん:04/10/24 12:39:49
設計厨ハケーン

551 :デフォルトの名無しさん:04/10/24 12:43:24
static const T = x;
もグローバル扱いですか?

552 :デフォルトの名無しさん:04/10/24 12:48:20
>>548
Cだと関数毎にコンテキストを渡すのは面倒極まりないが、
C++だと上位オブジェクトが、自分で作る下位オブジェクトに自分を知らせれば自然に
葉から幹にさかのぼれるツリー構造が出来上がる。

もしどうしても面倒なら static 変数 + 取得・設定用関数を作ればいい。
グローバル変数を生で晒しとくよりは断然マシ。

553 :デフォルトの名無しさん:04/10/24 12:49:56
グローバル変数を否定したがる香具師は
gotoを否定したがる香具師と同じようなもんだ

気にしないで使いたまえ!

554 :デフォルトの名無しさん:04/10/24 12:53:16
プログラム実行中にずーっと保持する必要のある変数はやっぱグローバル変数ですよね?
グローバル変数化以外にずーっと保持できる方法ってあるんでしょうか?

555 :デフォルトの名無しさん:04/10/24 12:57:02
554は以降放置

556 :デフォルトの名無しさん:04/10/24 13:00:33
>>554
私はグローバル変数を使いたくないので寿命の長い値はファイルに格納していますよ。

557 :デフォルトの名無しさん:04/10/24 13:06:03
所属を明確にする為にクラスのスタティックメンバにしてる。
でクラスのスタティックメンバがら取得する。

558 :デフォルトの名無しさん:04/10/24 13:11:37
555は放置されてしまいました

559 :デフォルトの名無しさん:04/10/24 13:24:38
>>552
>Cだと関数毎にコンテキストを渡すのは面倒極まりないが、
>C++だと上位オブジェクトが、自分で作る下位オブジェクトに自分を知らせれば自然に
>葉から幹にさかのぼれるツリー構造が出来上がる。

これだとクラス間の関連性が無用に増えてしまうのでは?
たとえば、Compiler クラスが Preprocessor クラスを所有している場合、
Preprocessor 単体で使えるにも関わらず Compiler との関係をもつということに
なりますよね?

> もしどうしても面倒なら static 変数 + 取得・設定用関数を作ればいい。
> グローバル変数を生で晒しとくよりは断然マシ。

これは分かります。
このような使い方も含めてグローバル変数といいたいわけですけど。。。

560 :デフォルトの名無しさん:04/10/24 13:26:24
>>551
グローバル データはとりあえず議論から除外ということでお願いします。

561 :デフォルトの名無しさん:04/10/24 13:36:42
>>559
Preprocessor が Compiler に依存しないなら、
Preprocessor が依存する情報だけを渡してやればいい。
もし Preprocessor が勝手に static 変数やグローバル変数を使ってしまうと
マルチスレッドで動かしたときなどに悲惨な結果になる。

それとグローバル変数と、static変数、さらに間に一枚関数を噛ますのでは弊害の次元が違う。
同列に扱う無かれ。

562 :デフォルトの名無しさん:04/10/24 14:13:15
ある一連の操作をする関数群が一つのソースファイルにあるとして、その関数群に一度だけ渡せば
いいような種類のデータを受け渡すことを考えてみる。
・グローバル変数
実体を呼び出し側で持つか関数群側で持つかは兎も角、グローバル変数なら呼び出し側で書いておけばいい。
但し、値を設定し忘れて呼び出した場合のトラブルが予想されるし、仕様変更の影響を受けやすい。
・関数群内グローバル変数(静的変数)
関数群にinit()のような初期化関数を用意し、そのパラメータで必要なデータを渡してもいい。
その場合、初期化関数で静的変数に書けばいいのだが、やはり初期化忘れの影響は出る。
・パラメータ
毎回関数呼び出しごとにパラメータで渡しても共有できる。
しかし、毎回渡さなければならないので呼び出し側でそのデータを維持しておく必要が出てくる。
・クラス化
その関数群を一つのクラスのメンバ関数とし、必要なデータもメンバ変数として実装する。
そうすればコンストラクタのパラメータでデータを渡せる。

まぁ、既存のライブラリの実装を見れば、グローバル変数に頼っているものが殆どないと思うが。
#それでも例えばVCのファイルモード(バイナリ/アスキー)はグローバル変数だったりするが。
##突っ込まれ防止に補足すると、fopen()のパラメータでも渡せるからちょっと事情は違うね。

563 :デフォルトの名無しさん:04/10/24 15:38:23
go to文使えばプログラムの量減らせるんだけどな…
go to使わないでしようとすると同じようなプログラムを何回も使わないといけない
量増えても使わない方がいいのでしょうか?

564 :デフォルトの名無しさん:04/10/24 15:55:22
>>563
理解が足りていないようだが、必要なら使えばいい。

565 :デフォルトの名無しさん:04/10/24 16:46:33
ソフト開発の際にライバル会社の実行ファイルを逆コンパイルして解析してプログラム技術を盗むって
普通に行われてるんですか?
0から開発するより手っ取り早いから絶対やってるよね

566 :r ◆r/etvCKR2A :04/10/24 16:50:45
>>565
0から作った方がらくちん。保守しやすい。
ディスコンパイルして得られたコードなんて、
設計意図が全く存在しないから、保守できないと思われ。


567 :デフォルトの名無しさん:04/10/24 16:53:29
さあ、どうかな。解析してまで欲しい技術があるのかどうか。

568 :泣いてばかり子猫ちゃん:04/10/24 17:53:19
ああああ〜〜(泣)
誰か教えてくだせえ、お願いしまんこ。
環境については、今回は割愛させてください。
フローチャートや概念的なものだけを教えていただければ十分でございます。
XMLデータファイルを「つりひも」で取得したいのですが、
どのような手順にすればよいのでしょうか?
まず対象タグの属性値を、なんかの変数に取得して、
そこからプログラムでコントロールすれば包茎なのか?


569 :泣いてばかり子猫ちゃん:04/10/24 18:02:10
下記のようなXMLデータが存在したとしますよね。
<root>
<list>
<li1>1</li>
<li2>2</li>
<li3>3</li>
<param ref=1>
<param ref=2>
</root>
ここで <param1 ref=1> ならば <list> の <li1> の値 1 が取得できる
というようなプログラムです。 どんなカンジのフローチャートなのよ、
あたしわかないよ〜
誰か助けてぇ〜〜!!!

570 :泣いてばかり子猫ちゃん:04/10/24 18:05:11
すいません、XMLが少し見た目が悪いですね、訂正します。
<root>
   <list>
   <li1>1</li>
   <li2>2</li>
   <li3>3</li>
   </list>
   <param ref=1>
   </param>
   <param ref=2>
   </param>
</root>

571 :泣いてばかり子猫ちゃん:04/10/24 18:10:52
ええっと、Iteratorで<root>を指して、それでなんとかしてparam ref=?の
値をゲットするようなコードを書く、おそらくX.compare("1") == 0なら
<list>の<li1>の値を取得する…こんなカンジのコードでいいのかな?
もうわけがわかんないよ・・・ううう、
当方、C++のドシロウトですよ、奥さん。

572 :デフォルトの名無しさん:04/10/24 18:12:16
本物のXMLを処理したいならDOMとSAX勉強してから出直して来い

サンプルだけでいいならyaccとlexでがんがれ

↑上のが意味わかんなかったら scanfとループでがんがれ


573 :デフォルトの名無しさん:04/10/24 18:14:20
go toで飛んで変数も渡したいんですけどどうすればいいのでしょうか?

574 :泣いてばかり子猫ちゃん:04/10/24 18:16:16
あたし、明日の朝までこのエラーと対峙しますわ、誰かよかったら
お付き合いください、もし、協力をしていただけたのなら
協力者が幸せになれるように神社に行ってきてお祈りしてきますわ。

<上記の質問の続き>
vectorに取得したデータを入れたいなぁ…
そんで出力してと…はぁ・・・・デスマはつらいなぁ

575 :デフォルトの名無しさん:04/10/24 18:56:49
定数をマクロで定義するのか、変数に値を代入しておくことで定義するのか
どっちがいいのでしょうか?

576 :デフォルトの名無しさん:04/10/24 19:00:26
変わらない数はマクロで。

ただし、利用頻度が少なく翻訳単位に跨がる定数であれば、
静的な変数として持つことを考えても良いのでは。


577 :デフォルトの名無しさん:04/10/24 19:00:39
当然後者

578 :デフォルトの名無しさん:04/10/24 19:01:50
文からしてガキだと思ってたが
ただのセクハラおやじか…^^;

579 :デフォルトの名無しさん:04/10/24 19:01:50
>>575

EffectiveC++によれば、
#define NUM 100
はコンパイラのエラーやデバッガで「NUM」と表示されず「100」という数字で表示されてしまうため、
その値が何を表しているか分からなくなってしまう可能性がある。そこで、
const int NUM=100;
としておけばデバッガでも「NUM」と確実に表示され、可読性が上がる。

という理由を挙げて変数での定義を推奨している。

580 :デフォルトの名無しさん:04/10/24 19:07:38
>>579
const はグローバル変数が生成されてしまって
無駄ではありませんか?
マクロか enum にすべきでは?

581 :デフォルトの名無しさん:04/10/24 19:37:21
>>580
enum ならいいが何でマクロなの?
理由は?

582 :デフォルトの名無しさん:04/10/24 19:39:28
>>580
そんなもん心配すんな。
C++ならコンパイル時に消滅するし。


583 :デフォルトの名無しさん:04/10/24 19:44:46
俺もconst使う派だが、まぁ、名前空間とかいろいろあるからだけど、
実際使うときは#defineしてもらったほうがうれしい。
const だと定義されてなかったときと合ったときで処理を分けることが出来ない。
結構困ることがある。
型定義もだけどさ。
言語ベースのifdefが欲しいよ。

584 :デフォルトの名無しさん:04/10/24 20:05:07
>>582
C++ならっつ〜かコンパイラや最適化レベルによるけどな。

585 :デフォルトの名無しさん:04/10/24 20:09:17
>>582
ほんとに消える〜?
VC6 とかでも?

586 :デフォルトの名無しさん:04/10/24 20:14:32
>>584-585
C++では const int は定数扱い。消える。
最適化は関係ない。

587 :デフォルトの名無しさん:04/10/24 20:39:24
>>585
そもそもVC6は論外。

588 :デフォルトの名無しさん:04/10/24 20:40:22
気になるんだったらバイナリ見てみればいい
定数に置き換わってるから

589 :デフォルトの名無しさん:04/10/24 21:00:20
--------------------------- main.cpp
extern const int xxx;

int main(void)
{
return xxx;
}
---------------------------

--------------------------- data.cpp
extern const int xxx = 100;
---------------------------

こうすると、次のようなコードが吐かれる。
VC6 の Release モードね。

.text:00401000 mov eax, ds:dword_4050A0
.text:00401005 retn


590 :デフォルトの名無しさん:04/10/24 21:02:32
externかよ。
次は &xxx でアドレス取ったらとか言い出しそうだなw

591 :デフォルトの名無しさん:04/10/24 23:36:30
プログラム書く時はコピペ多様して自分でタイピングすることが少ないんで
なかなか覚えられないんですけどはじめはこんなもんでいいんでしょうか?

592 :デフォルトの名無しさん:04/10/24 23:37:46
超初歩的な質問ですみません

ttp://data.uploda.net/anonymous/etc2/dat6/upload21258.jpg

lcc-win32を使っているのですが、どんなプログラムを打っても
画像のようなillegal return typeという警告が出てしまいます
大学のPCで打ったときはなんともないんですが、自分のPCでは全部こうなります
なにか問題があるんでしょうか・・・?

593 :デフォルトの名無しさん:04/10/24 23:41:39
>591
はじめは ね。

594 :デフォルトの名無しさん:04/10/24 23:55:21
クラスの包含を行うときの話で、包含されるクラスが単体でインスタンスを生成できないように
するにはどのようにしたらよいのでしょうか?
クラスを継承するときならば、継承される側のクラス(基底クラス)が単体でインスタンスを生成できないように
したければ抽象クラスにすればよいと思っているのですが、包含の時はどうなのでしょう?

初心者な質問ですみませんが、もしお答えいただければ助かります m(_ _)m

595 :デフォルトの名無しさん:04/10/25 00:00:26
>>594 できないんじゃね?

596 :デフォルトの名無しさん:04/10/25 00:02:05
>>592
あなたのコードに問題があります

597 :デフォルトの名無しさん:04/10/25 00:04:04
>>594
コンストラクタをprotectedとかprivateにして
包含されるクラスに対するfriendでfactoryを作りそれを使って生成する

598 :デフォルトの名無しさん:04/10/25 00:08:30
>>594
基底クラスを抽象クラスにした上で
その派生クラスを包含するクラス内で定義する。
class hoge { /*インターフェースを純粋仮想関数として定義*/ };
class owner {
 class conclete_hoge : public hoge { /*実装*/ };
 conclete_hoge my_hoge;
};


599 :592:04/10/25 00:12:59
>>59
教本どおりにタイプしたんですが・・・

ttp://data.uploda.net/anonymous/etc2/dat6/upload21266.jpg

600 :592:04/10/25 00:13:30
>>596さんへの間違いです

601 :594:04/10/25 00:21:40
>>597-598
お答えありがとうございます。そうですね、こうすればできるようでした。本当にありがとうございます

もしよろしければ、どちらの書き方がより一般的に使われるのかも教えていただけないでしょうか?
それともこのような形で包含を使おうとすること自体あまり一般的ではなく、するべきではないのでしょうか?

たびたびすみませんがよろしくお願いします


602 :泣いてばかり子猫ちゃん:04/10/25 00:26:05
vectorにString型の値を10個入れるのって、どう書くのかな?
どうか教えてください

603 :デフォルトの名無しさん:04/10/25 00:26:53
>>601
包含されることはできるが単体ではインスタンス化できないクラスとは、
すなわち包含しているクラスが一緒に持っているメンバが必須と言うことではないか?
そうなら、そいつらまとめて一つのクラスにすればよし。

そうでないなら、インスタンス化を禁止することでどんな利点があるのか教えてください。

604 :デフォルトの名無しさん:04/10/25 00:27:38
>>602 std::vector<String> v(10);

605 :泣いてばかり子猫ちゃん:04/10/25 00:39:18
>>604
サンクス!!

606 :デフォルトの名無しさん:04/10/25 00:44:15
#include <stdio.h>
int main(void)
{
〜〜〜〜〜〜〜
〜〜〜〜〜〜〜
〜〜〜〜〜〜〜
〜〜〜〜〜〜〜
printf("tesu=%d\n, a+b);
return 0;
]

>>592
これでやってみ
\nは\nと同じ意味だから。

607 :601:04/10/25 00:46:00
>>603
全くそのとおりで、最初から一つのクラスにすれば問題はないのです。
ただ、そうやってまとめていくと一つのクラスが大きくなりすぎて見にくくなりそうだったので何か別の方法はないかと思って
質問させてもらったのですが、こんなやり方は間違っているようですね
皆様ありがとうございました

608 :デフォルトの名無しさん:04/10/25 00:54:08
>>607
間違ってないと思うが。
クラスを極力小さくしたいと思うのは正しい。
解決策はすでに出てるし。

609 :601:04/10/25 01:07:04
>>608
そういってもらえるとうれしいです。でもあまり一般的手法ではないのですよね?(w
とりあえず今回は上に出た方法で乗り切って、次回からはクラス構造をもう少し考えて作るようにします。

610 :592:04/10/25 01:11:21
>>606
成功しました!ありがとうございます
明日大学のPCでやりくらべてみます

611 :デフォルトの名無しさん:04/10/25 01:15:37
>>609
単にクラスを大きくしたくないというだけで
>>597-598みたいな事をするのはどうかと思うが、
インターフェースは共通だが実装はそのインスタンスを
保有するクラスごとに異なる&隠蔽されているなんて
ケースは別に珍しくはない。

612 :デフォルトの名無しさん:04/10/25 01:21:48
暗号化の参考にしたいのですが簡単な暗号化プログラムのサンプルが乗っているページってないでしょうか。

すぐに解読できてもいいのです・・・。

613 :デフォルトの名無しさん:04/10/25 01:24:22
>>612
http://pc5.2ch.net/test/read.cgi/tech/1097034002/758
この辺とか

614 :デフォルトの名無しさん:04/10/25 01:33:57
unsigned char code;
fread(&code, 1, 1, fp_read);
code ^= 0xff;
fwrite(&code, 1, 1, fp_write);
とか
int len;
unsigned int buf = 0;
do {
for (counter = 0; counter < 4; counter++){
len = fread(&code, 1, 1, fp_read);
buf |= (code << (8 * counter));
}
fwrite(&buf, 4, 1, fp_write);
} while (len != 0);
とか。

615 :泣いてばかり子猫ちゃん:04/10/25 02:42:56
スレ違いのような気もしますがどなたかご教授くださいませ。

XMLで属性値の取得ってのは可能なのかな。
<Vallist>
  <val1>10</val>
  <val2>20</val>
</Vallist>
 <data countid=1 ref=1>
 </data countid=1 ref=1>
 <data countid=2 ref=2>
 </data countid=2 ref=2>


これで「つりひも」の操作を行うために
<data countid=1 ref=1> の 「 ref=1 」 をDOMを介して取得したいのだが
(なんとかNode…とかっていうコードを書けばいいんだよね?)
それでref=1なら<Vallist>の<Val1>のタグの値10をゲットする…
そんなプログラムを書いているんだけど、
タグの値ならともかく、タグの属性値の値なんて取得できるのかな〜
誰かご存知ですか、知っていたら教えてください。



616 :デフォルトの名無しさん:04/10/25 03:59:16
>>615
前スレには移動する旨伝えてきたのか?
んで、まずそのめちゃくちゃなシンタックスエラーは無視するとして、XPathで一発でいける。
もっとも、val1/val2なんて気色の悪い書きかたしないで val id="1" とかにしろ。

617 :デフォルトの名無しさん:04/10/25 07:42:28
>615
キミの書いてるそれはXMLじゃない

618 :ぼるじょあ ◆yBEncckFOU :04/10/25 08:45:00
>>615
(・3・)アルェー 閉じタグはタグ名だけでいいYo

619 :デフォルトの名無しさん:04/10/25 08:58:24
<Vallist>
  <val id=1>10</val>
  <val id=2>20</val>
</Vallist>
 <data countid=1 ref=1/>
 <data countid=2 ref=2/>


620 :デフォルトの名無しさん:04/10/25 09:04:51
Microsoft Visual C++ .NET
MySQL 5.0.0

SQLデータベースから次のようにレコードを取得しようとすると
CRecordset::Open(CRecordset::snapshot, command , CRecordset::none);

条件にあうレコードが0件だと
Openを読んだ時点でエラーが起きるのですがこれを回避する方法はどんなものでしょうか?


621 :デフォルトの名無しさん:04/10/25 09:35:24
SQLは知らんが、0件でOpenできないのなら先に件数を取得して分岐すればいいのでは?

622 :デフォルトの名無しさん:04/10/25 09:41:16
class A{

const static int a = 5;
};

は、できますが

class A{

const static int a[2] = {0, 1};
};

は、エラーがでます

配列は初期化できないのですか

623 :デフォルトの名無しさん:04/10/25 09:46:24
>>620
どんなエラーだよ、発行してるSQLはどんなだよ

624 :デフォルトの名無しさん:04/10/25 10:47:25
>>622
メンバ変数である配列は初期化できない。
但し、ローカルな配列は初期化できるのでこういうことはできる。
class A {
// 厳密に言えばポインタを返す
const int * a() {
static const int b[] = {4, 5, 6,};
return b;
}
typedef int ta[3];
// こちらは配列への参照を返す
const ta & aa() {
static const int b[] = {4, 5, 6,};
return b;
}
};


625 :デフォルトの名無しさん:04/10/25 10:51:49
利用例書くの忘れたよ。
class A {
public:
void print() {std::cout << a()[1] << ' ' << aa()[2] << std::endl;}
};
但し、最適化してもconst intと違って実体があることに注意。

626 :デフォルトの名無しさん:04/10/25 11:50:28
テキスト形式の行を一行読み込んだバッファ分だけのメモリを確保したいのですが
方法ありますでしょうか

627 :デフォルトの名無しさん:04/10/25 11:52:37
>>626
効率無視していいなら、最初に read() で読んで改行コードが出てきたら
行頭に seek() して 、一行分 read() でいいでしょう。

628 :622:04/10/25 11:53:58
ありがとうございます
利用例のおかけで理解できました

static const int でもよいみたいですね

629 :620:04/10/25 12:52:58
SQLコマンドは select column1-comlumn2,... from テーブル where ....
というような複雑なやつです。
sqlクライアントのほうから直接実行してみるとちゃんと期待通りの結果が得られます。

Open時のエラーではありませんでした。
IsBOF()かIsEOF()を呼ぼうとすると
Debug Assertion Failedがでます。

IsBOF()IsEOF()が実行できない条件なんてあるんでしょうか?


630 :デフォルトの名無しさん:04/10/25 14:05:13
0.54e-10  (eは自然対数の底)
のような式を読み込んで数式の計算をしたいのですが
どうすればいいですか?

631 :デフォルトの名無しさん:04/10/25 14:06:59
>>630
構文解析とか、lex とか yacc とか (flex, bison) そういう用語で調べるといいよ。

632 :デフォルトの名無しさん:04/10/25 14:08:58
>>629
Openの戻り値は?

633 :デフォルトの名無しさん:04/10/25 14:10:17
char型の配列い256文字以上の文字列を格納したいのですが
できますでしょうか?

char test[256]←256を1000にしたいのです。

634 :デフォルトの名無しさん:04/10/25 14:11:57
>>633
コンパイラ依存だと思うが、
VC とか BCB とかならできると思うぞ。

635 :デフォルトの名無しさん:04/10/25 14:12:59
やってみればいいじゃない

636 :デフォルトの名無しさん:04/10/25 14:20:56
char test[1000]

637 :デフォルトの名無しさん:04/10/25 14:29:48
>>630
c++ならistringstreamとかboost::lexical_castでできる
#include <iostream>
#include <boost/lexical_cast.hpp>
#include <sstream>
using namespace std;
int main () {
string s0 ("0.54e-10");
istringstream iss (s0);
double d0; iss >> d0;
double d1 (boost::lexical_cast <double> (s0));
cout << d0 << " " << d1 << endl;
return 0;
}


638 :デフォルトの名無しさん:04/10/25 15:07:48
>>637
その解釈は0.54掛ける10の-10乗だが、>630を読む限り、0.54掛けるeの-10乗だ。

639 :デフォルトの名無しさん:04/10/25 15:12:17
ねぇ、ものすごく初歩的なことを聞いても怒らない・・・?

640 :637:04/10/25 15:13:52
>>638
あっ本当だ
これは失礼


641 :デフォルトの名無しさん:04/10/25 15:16:00
>>639
怒らないが、必ずしも答えるとは限らない。

642 :620:04/10/25 15:16:45
Openの戻り値は0x00407af0とかです


643 :デフォルトの名無しさん:04/10/25 15:16:54
>>638
いや、0.54掛けるe引く10に読めるが。

644 :デフォルトの名無しさん:04/10/25 15:21:25
>>641
答えなくてもいいから優しくしてね・・・。
C++でクラスをソースファイルとヘッダーファイルに分けるにはどうすればいいのでしょうか?
かれこれ一週間ほど悩んでいます。
馬鹿でごめんね、あはは・・・。

645 :sage:04/10/25 15:25:23
>>644
「C++」じゃなくて環境書いた方がいいよ


646 :デフォルトの名無しさん:04/10/25 15:27:48
>>644
ヘッダ CHoge.h:
#pragma once //VC用

class CHoge {
public:
  CHoge();
  ~CHoge();

  int foo(int f);
private:
  ...
};

ソース CHoge.cpp:
#include "CHoge.h"

CHoge::CHoge()
{
  ほげ
}

CHoge::~CHoge()
{
  禿
}

int CHoge::foo(int f)
{
  ( ´_ゝ`)
}

647 :デフォルトの名無しさん:04/10/25 15:28:31
>>643
むぅ、そうかもしれん。

>>644
概ねこんな感じに、宣言と定義を分ければいいのでは?

<< foo.h >>
class foo {
int member;
public:
foo(); // ディフォルトコンストラクタ
int getMember() {return member;} // こんなのは中に書いてしまってもいいかと
void setMember(int bar); // こっちは敢えて外に書くので宣言のみ
};

<< foo.cpp >>
#include "foo.h"
foo::foo()
{
// ディフォルトコンストラクタは要らなきゃ省略で
}

// 宣言と定義を分けた例
void foo::setMember(int bar)
{
member = bar;
}


648 :デフォルトの名無しさん:04/10/25 15:30:49
皆優しいね・・・。
ありがとう。
これで少し賢くなれそうです。

649 :630:04/10/25 16:51:04
0.54e-10は
0.54かけるeひく10です

650 :デフォルトの名無しさん:04/10/25 19:44:19
class str{
char str[256];
public:
void set(char *s){
strcpy(str, s);
}
};

print(char *s){
cout << s;
}

int main(){
class str moziretu;
moziretu.set("文字列");
print(moziretu); // *
}

みたいなのを作りたいんですけど
print関数の第1引数にstrクラスを指定したときにstrクラス内のstrのポインタを渡す方法はないでしょうか?
operatorでいけるかなと思い試してみたのですがわかりませんでした・・・やっぱりclass strを渡したとしか認識しないのでしょうか



651 :デフォルトの名無しさん:04/10/25 19:50:06
>>650
class strに
const char* get() const { return str; }
を作って、print関数を
print(const char *s)
にする。

652 :デフォルトの名無しさん:04/10/25 19:59:01
>>650
どうしても、言うに言われぬ理由でそのまま使いたいなら
print(const char *s) にした上で
strクラスに
operator const char*() const { return str; }

を追加する。おすすめはしない。
普通は >>651 のようにやるべき

653 :デフォルトの名無しさん:04/10/25 20:11:19
>>651-652
お返事ありがとうございます
652さんので自分のしたいことができました

654 :デフォルトの名無しさん:04/10/25 20:43:56
>>653
おいおい、判ってる?

655 :デフォルトの名無しさん:04/10/25 20:43:58
explicit も付けろよな

656 :デフォルトの名無しさん:04/10/25 20:52:24
C++でoperatorにexplicit使えたっけか

657 :デフォルトの名無しさん:04/10/25 20:56:55
>>656
使えない。
なんで用意されていないのか不思議。
あると便利だよね。

658 :デフォルトの名無しさん:04/10/25 21:03:49
禿がoperatorはimplicitであるべきだと考えたのかな。
キャストを明示するぐらいならアクセッサを書け、と。。

659 :デフォルトの名無しさん:04/10/25 21:05:14
operator const char*() const { return str; }
               ~~~~~
このconstってどうゆう意味ですか?

660 :デフォルトの名無しさん:04/10/25 21:10:45
mutableのような例外をのぞき、そのメンバ内でオブジェクトを変更しないという事。
cnost参照やらでも呼び出せる。

661 :デフォルトの名無しさん:04/10/25 21:34:54
Visual C++でdoubleでも有効桁が足りないときや固定小数点を使いたいときはどうすればいいのでしょうか?
.NETやJAVAだとdecimal型等があるようなのですが・・
自分で作るしか無いのでしょうか?

662 :デフォルトの名無しさん:04/10/25 21:38:50
ごめんなさい
661はlong doubleでもの間違いです

663 :659:04/10/25 21:41:16
>>660
ありがとう、なんとなくわかった

664 :デフォルトの名無しさん:04/10/25 21:44:44
>>661
自作するかライブラリを探すのがよいかと。
C/C++ の言語や標準ライブラリでは用意されていないからね。

665 :デフォルトの名無しさん:04/10/25 21:47:05
>>664
ありがとうございます

666 :デフォルトの名無しさん:04/10/25 21:52:50
>>660
mutableってなんですか?


667 :デフォルトの名無しさん:04/10/25 21:55:19
>>666
constメンバ関数からはメンバ変数の変更ができないが、例外として変更できるようにするキーワード。

mutable int num_;

void set(int n) const {
  num_ = n; //変更できる
}

あとstaticな変数もconstメンバ関数から変更可能

668 :デフォルトの名無しさん:04/10/25 21:58:11
>>667
サンクス!!

669 :デフォルトの名無しさん:04/10/25 22:13:05
プログラム実行中に
hoge.exe の 0x0044d409 で初回の例外が発生しました : 0xC00000FD: Stack overflow
hoge.exe の 0x0044d409 でハンドルされていない例外が発生しました : 0xC00000FD: Stack overflow。
というエラーが出て
   void func(void)
→ {
   ・・・・・・・・・
   }
func関数の”{”しかない行に黄色い矢印が現れます
何が原因なのでしょうか?
VC.netです

670 :デフォルトの名無しさん:04/10/25 22:16:11
>>669
スタックがオーバーフローしたからです。

671 :デフォルトの名無しさん:04/10/25 22:17:08
>>669 原因はいくつか考えられるけど、ソース見るほうが早いから見せて。

672 :デフォルトの名無しさん:04/10/25 22:19:03
でかい配列でもローカルに定義してるのかな。

673 :デフォルトの名無しさん:04/10/25 22:22:01
>>670
オーバーフローの原因がわかりません…
>>671
ソースは多すぎて無理だと思います、すいません
いくつか考えられる原因を教えてください

674 :デフォルトの名無しさん:04/10/25 22:24:31
>>673
その関数だけでいいよ。
それも巨大なら最初のほうだけでいい。

675 :デフォルトの名無しさん:04/10/25 22:27:01
>>672
黄色い矢印が指している関数内にa[30]くらいの配列があります

676 :デフォルトの名無しさん:04/10/25 22:29:08
再帰呼び出しが止まらないとか

677 :デフォルトの名無しさん:04/10/25 22:30:13
データ型は?独自の構造体で確保しているならメンバを確かめてみてね。

678 :デフォルトの名無しさん:04/10/25 22:31:46
void swap(int &a,int &b) {
a = b - a;
b -= a;
a += b;
}
この関数、VC++6.0でコンパイル通るんですが、
gcc&bccだと
parse error before '&' token.
となり、何回も見直してもさっぱり原因がつかめません。
原因分かる方いませんか?


679 :デフォルトの名無しさん:04/10/25 22:32:47
>>678
gccじゃなくg++を使え

680 :678:04/10/25 22:34:40
>>679
解決しました。有難うございます!

681 :デフォルトの名無しさん:04/10/25 22:38:32
>>674
最初の方は100個くらいの変数宣言と値の代入が占めてます
見せるのは無理そうですすいません
>>676
bという関数からbを含むような関数を呼び出してるんですけど
再帰呼び出しってそれのことなんですか?
>>677
int型です

682 :デフォルトの名無しさん:04/10/25 22:43:03
>>681
bという関数が自分自身(b関数)を呼び出しているならその通り。
bからbを呼び出している関数を呼びだした場合も問題は起こりうる。

683 :デフォルトの名無しさん:04/10/25 22:44:25
>>681
100個もねー。そりゃやっぱその関数でスタックオーバーでしょうね。

コードの質がよくわからんから失礼なアドバイスかもしれないけど、
ローカルにしなくてよい変数はグローバルとか static とかにしてる?
速度が重要でないならローカル変数じゃなくてヒープ上にメモリを確保するといい。
その関数はちゃんんと再帰が終了するようになってる?
無限に再帰したりしてちゃだめだよ。

684 :デフォルトの名無しさん:04/10/25 22:45:00
>>682
再帰呼び出しが起こらない条件で実行するとエラーが起きなくなったみたいです
もう一回再帰呼び出しを見直してみます
再帰呼び出しが有限回数で終わるようにすればいいんですよね?

685 :デフォルトの名無しさん:04/10/25 22:46:46
再帰周辺が原因だなこりゃ。
再帰周辺の汗晒せ。そしたら大体分かる。

686 :デフォルトの名無しさん:04/10/25 22:47:20
>>683
アドバイスもらえるだけでもありがたいです
無限に再帰してないか調べてみます

お返事くださった方々ありがとうございました

687 :デフォルトの名無しさん:04/10/25 22:48:32
>>685
晒すのは勘弁してください、すいません

688 :デフォルトの名無しさん:04/10/25 23:04:53
>>661
gmpおすすめ


689 :デフォルトの名無しさん:04/10/25 23:09:46
>>683
正しそうで微妙に間違ってるなぁ。

690 :592:04/10/25 23:40:09
lcc-win32を使っていて、同じソースを打っても、
関数を途中で付け足したりするとエラーが出るのですが、最初から書きなおすと
大丈夫だったりします

途中でintの後に関数を付け足すとまずいんでしょうか?



あと、.cのプログラムに日本語を挿入することは出来ますか?

691 :デフォルトの名無しさん:04/10/25 23:43:11
>>690
言っていることがまったく理解不能だが

> 途中でintの後に関数を付け足すとまずいんでしょうか?

まぁ常識的に考えてまずいだろうなぁ。

692 :デフォルトの名無しさん:04/10/25 23:53:51
>>688
VC+でgmpって問題あるのでは?

693 :592:04/10/25 23:54:27
>>691
すみません、初心者なので上手く説明できなくて・・・


{}の中に

int a,b;

と関数を入れて、そのあと10行ほど関数cを含んだソースを書いているうちに、
cを定義していないことに気づいて

int a,b,c;

と書きなおしたんですが、コンパイルするとよくわからないエラーが出ました
一から書きなおすと大丈夫でした

694 :デフォルトの名無しさん:04/10/25 23:56:13
>>693
 まずは>>592の誤りについて指摘します。
 main関数の戻り値の型はintが処理系共通であり、その他の形式の
main関数は処理系に依存すると定義されています。可搬性がなくなる
ので、できるだけ使わないようにしましょう。
(ISO/IEC 9899:1999 5.1.2.2.1 Program startupより)
 また、戻り値がint型のmain関数のreturnを省略した場合、return 0;が
末尾に書かれているのと同等であることが決められています。
(ISO/IEC 9899:1999 5.1.2.2.3 Program termination -1より)
よってこの場合、戻り値の型と(暗黙のうちに返された)戻り値0の型が
一致せず、エラーが起きているのです。

 次に、「.cのプログラムに日本語を挿入することは出来るか」との疑問
ですが、これは処理系が対応しているかどうかによりますので、lcc-win32
ならばその解説を読むしかありません。残念ながらこちらにはありません
ので、確認できません。

695 :694:04/10/26 00:08:50
>>693
調べてみましたら、ソースファイルを、Weditではなく例えばメモ帳などで編集
するようにすれば、日本語も入力できるとの事です。
(ttp://www.forest.impress.co.jp/article/1999/11/16/lcc_win32.htmlによる)
ただ、外国製のソフトでローカライゼーションを行っていない以上、おそらく
エスケープシーケンスとの衝突は避けられないでしょう。C初心者との事です
のでこれについてはそのうち文字が化けるなどの問題として悩むことになる
でしょうから、「エスケープシーケンス(またはエスケープ文字)」という言葉を
キーワードとして覚えておいていただくとよろしいかと思います。

696 :デフォルトの名無しさん:04/10/26 00:35:00
>>694
すみません、戻り値の型というのはよくわかりませんが
void main(void)
よりも
int main(void)
のほうが汎用性があるということでしょうか
>>606さんに教えてもらった通りに書くと成功しましたが、教本はvoid main(void)で最初統一してあったので・・・


>>695
はい、たしかにlcc-winで入力すると文字化けが出ます
日本語入力は当面避けておきます





回答くださった方、ありがとうございました

697 :デフォルトの名無しさん:04/10/26 00:47:04
>>695
間違った用語を使わないように。エスケープ文字はエスケープシーケンスとは言わない。

698 :デフォルトの名無しさん:04/10/26 00:47:37
>>696
本当にプログラミングを始めたばかりの人のようですが
たぶん、その教本ではまだ引数や戻り値について説明してないため void main(void) にしてあったのでしょう
もう少しその教本を読みすすめましょう
どんなに初心者向けの本でも最初の方10分の1も読めば書いてある内容です

699 :デフォルトの名無しさん:04/10/26 00:48:09
>>696
main()の戻り値の型は、intが正しいのであって汎用性云々は関係ない。
今ではその教本が間違いと言うことになる。

700 :694:04/10/26 00:48:18
>>696
 その教本の中でvoid main(void)になっているのは、著者がきちんと規格を確認して
いないからでしょう。C言語にはANSI(もしくはISO)の規格というものがあって、その
中でC言語に関するすべてのことが決められているのです。「(ISO/IEC 9899:1999
5.1.2.2.1 Program startupより)」などと書いてあるのは、その規格のどこに定められて
いるかの根拠を示したものです。申し訳ありませんが、その著者はこれを調べることを
「サボって」いるわけですから、あまりいい本とは言い難いですね。
 今の時点では「汎用性があるから」という理由で納得していただいてかまいませんが、
後々関数について詳しく勉強するときに「戻り値」の意義を確認し直してみてください。
これからはint main(void)を使うようにしてくださいね。


701 :694:04/10/26 00:50:53
>>696-697
申し訳ありません。間違いました。「エスケープ文字」を意図しておりました。

702 :デフォルトの名無しさん:04/10/26 00:52:10
>>700
>今の時点では「汎用性があるから」という理由で納得していただいてかまいませんが
全くよくない。
汎用性が問題なのではなく、正しいか正しくないかが問題。
つーか、この場合の汎用性とは何?

703 :デフォルトの名無しさん:04/10/26 00:53:59
初心者用の方便にそんなにつっこまなくても。
初心者本のミッッションはいかにすばやく習得させるかであってさ、
正確さなんてのは二の次でいいじゃぁありませんか。

704 :デフォルトの名無しさん:04/10/26 00:58:56
>>699-700
それ以前に696は戻り値という言葉の意味、返し方、宣言の仕方を知らないのだと思われ


705 :デフォルトの名無しさん:04/10/26 00:58:56
>>703
まあそれを完璧に鵜呑みにされて
「動くからいいじゃないですか!」
と意地を張られた日にゃたまらないわけだが。

706 :700:04/10/26 00:59:23
>>702
上に書いた通り、main関数の戻り値はintでなければ可搬性がなく、ほかは処理系依存であり、
規格上間違いとはいえない(5.1.2.2.1 Program startup -1の末尾にin some other
implementation-defined mannerという記述があることから)までも、可搬性の面からよいとは
言えず、避けるべきであると認識しております。なぜ戻り値が必要かという意味で、「プロセスの
終了状態をプロセス作成元に渡す」という意義を以て、「voidにするよりも」汎用性があると書いた
つもりでした。紛らわしくて申し訳ありません。

707 :デフォルトの名無しさん:04/10/26 01:21:26
>>661
gmpライブラリを使ってなんかプログラムを組んで公開する場合には
ソースを全部さらす必要があるけど、
個人的に使う場合には全く問題にならんよ。

詳しくは GPL でぐぐってみるのがよろし。
と、visualスレでマルチするのやめれ
向こうになんか断りしてこい。

708 :デフォルトの名無しさん:04/10/26 01:25:05
>>661
long longとか使えない?

709 :592:04/10/26 01:30:02
>>698
大学の授業と平行してやっていますが、
本の最後のほうまで、 void main(void)がちょくちょく使われています

>>700
void main(void)が「ANSI Cに準拠した書き方」として紹介されているんですが、
これは間違いということでしょうか
関数の型や引数についてはまだ習っていないので、とりあえずintに直しておきます





710 :デフォルトの名無しさん:04/10/26 01:35:12
>>709
確かANSI-Cではmainの返却値はintでなければならない と明記されていた気がするが

711 :デフォルトの名無しさん:04/10/26 01:36:02
初心者のためのポイント学習C言語
http://www9.plala.or.jp/sgwr-t/index.html

>>709
お前さんの持っている本よりこっちの方がやくにたつ

712 :700:04/10/26 01:42:46
>>709
 ANSI Cは、普通C89と言って1989年に定められた規格を指します。実際には
もっと新しいC99と呼ばれる規格があるのですが、完全にこの規格にある機能を
実装したコンパイラが少ないので、未だC89が用いられることが多いのが現状です。
ところが何故か私の手元にはC99(ISO/IEC 9899:1999)しかないので、それから説明
します。5.1.2.2.1 Program startup -1には、main関数の形式は、int main(void)、
int main(int argc, char *argv[])またはこれと同等のもの、または処理系定義の
形式のいずれかとされています。処理系定義とは、「処理系(≒開発環境)が勝手に
決めた形式」のことで、この場合void main(void)はこれに該当すると考えられます。
だから、規格上間違いと言い切ることはできません。
 しかし、処理系が勝手に決めていると言うことは、他の環境では動かない可能性が
高いと言うことです。それでは役に立ちませんし、規格の意味もありませんので、
普通はint main(void)とint main(int argc, char *argv[])またはこれと同等のもの以外は
使わないのが(事実上)正しいとするわけです。

【原文】ISO/IEC 9899:1999 5.1.2.2.1 Program startup -1
The function called at program startup is named main. The implementation declares
no prototype for this function. It shall be defined with a return type of int and with
no parameters: int main(void) { /* ... */ } or with two parameters (referred to here as
argc and argv, though any names may be used, as they are local to the function
in which they are declared): int main(int argc, char *argv[]) { /* ... */ } or equivalent;
or in some other implementation-defined manner.

713 :デフォルトの名無しさん:04/10/26 02:26:47
ちと出遅れたレスだけど。

普通に頭のいい著者なら入門書では
戻値の解説の前は戻値を省略して、
ただ main()と書いてるものだが。

714 :デフォルトの名無しさん:04/10/26 02:36:58
>>713
それって C99 でも許されるんだっけ?

715 :デフォルトの名無しさん:04/10/26 04:45:48
.net2003を使っています。
http://wisdom.sakura.ne.jp/system/winapi/win32/index.html
を一通り読んだぐらいのレベルです。

Bitmap表示をするときに、
WM_PAINT内に全て記述せず
関数で表示しようとするときは

HDC hdc;
HBITMAP hBitmap1, hBitmap2, hBitmap3;
switch (message)
{
case WM_CREATE:
hBitmap1 = LoadBitmap(hInst, (LPCTSTR)IDB_BITMAP1);
hBitmap2 = LoadBitmap(hInst, (LPCTSTR)IDB_BITMAP2);
hBitmap3 = LoadBitmap(hInst, (LPCTSTR)IDB_BITMAP3);

case WM_PAINT:
 hdc = BeginPaint(hWnd, &ps);
 Hoge.Show(hInst, hdc, hBitmap1, hBitmap2, hBitmap3);   ← ここ
 EndPaint(hWnd, &ps);
 break;
}

のように、引数にインスタンス、デバイスコンテキストハンドル、ビットマップと
ずらずら渡していくしかないのでしょうか。

716 :デフォルトの名無しさん:04/10/26 05:21:24
>>715
Hogeが何らかのクラスのインスタンスなら、
そのクラスにBITMAPを読み込むLoadを定義しておくと良いんじゃないでしょうか…?

case WM_CREATE:
Hoge.Load((LPCTSTR)IDB_BITMAP1);
Hoge.Load((LPCTSTR)IDB_BITMAP2);
Hoge.Load((LPCTSTR)IDB_BITMAP3);
break;

case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
Hoge.Show(hdc);
EndPaint(hWnd, &ps);
break;

質問の主旨にそぐわなかったらスマソ

717 :デフォルトの名無しさん:04/10/26 11:51:59
ウィンドウズプログラミングがしたいのですが言語はどれがいいでしようか
大学ではCをやってるのですが、++も入門書は一読しました。
VBが手っ取り早いと聞きますが。Cでプログラムするのとそんなに差があるんでしょうか。

作ってみたいツールがありまして…

718 :デフォルトの名無しさん:04/10/26 11:53:59
class A:public B{

};
staticな変数を持つ基底クラスBを継承し、
}コンストラクタで、
ZeroMemory(this,sizeof(this));
すると、Bのもつstatic変数も0クリアしてしまいます。
イメージ的に、
ZeroMemory(this,sizeof(this) - sizeof(B) );
みたいなことをしたいのですが、何か方法はありますか?
やっぱりAのメンバを一つ一つ初期化するしかないのでしょうか…。

719 :デフォルトの名無しさん:04/10/26 11:55:52
> ZeroMemory(this,sizeof(this)); 
(((( ;゚д゚)))アワワワワ

面倒ならデータメンバをクラスなり構造体にまとめてゼロクリアしたら?

720 :620:04/10/26 12:04:25
まだ原因もわからない...
何かヒントというか考えられる可能性なんかはご存知ないでしょか


721 :718:04/10/26 12:18:19
>>719
即レスありがとうございます。
ただ、すでに大量にコード書いて、コード修正する方がが時間かかりそうなので、
今回はメンバ一つ一つ初期化することにします。

お手数かけました。即レス、指摘ともども感謝です!

722 :デフォルトの名無しさん:04/10/26 12:55:12
C++です。
int* fu(void){
 int intarray[30][30];
 int *p;
 (中略)
 p = &intarray[0][0];
 return p;
}
int main(void){
 int *pp;
 pp = fu();

 (ここでppを用いてfu()のintarrayの値を使いたい)
}

↑のような感じで。
関数の中で配列を宣言して、その配列の値を呼び出し元で使いたいのですよ。
もしかして宣言した関数が終わっちゃったら、配列の頭を覚えたポインタは何の役にも立たなくなっちゃいます?

723 :デフォルトの名無しさん:04/10/26 12:57:16
そんなの基本ですよ

724 :デフォルトの名無しさん:04/10/26 12:57:58
自動変数へのポインタは関数抜けると無効
やるならmalloc等でヒープに確保するか、static変数にするか

725 :デフォルトの名無しさん:04/10/26 13:00:21
>722
関数内の自動変数はスタックに積まれますので、
その関数から出ると値は保障されません。
そういうことがやりたいのであれば、以下のようにします。
1.呼び出し元の関数で変数定義し、アドレスを引数で渡す
2.変数そのものを外部変数にする
3.呼び出し先の関数でstatic宣言する

726 :デフォルトの名無しさん:04/10/26 13:03:56
>>722
関数内で定義した通常の自動変数は関数から抜ける時点で破棄される。
静的な変数はキープされるので、この例の場合はstatic int intarray[30][30]とすれば大丈夫。
後はこちらも参考に。
http://pc5.2ch.net/test/read.cgi/tech/1097416187/624-625

727 :722:04/10/26 13:05:22
>723-725
ありがとうございます。
class変数一つ増やして対処しますわ。

728 :デフォルトの名無しさん:04/10/26 13:05:24
お前等、レスする前にリロードしろよw

729 :717:04/10/26 13:06:47
スレ違いすんませんでした

730 :デフォルトの名無しさん:04/10/26 13:15:17
まあ全てオレなんだけどな。

731 :デフォルトの名無しさん:04/10/26 14:26:48
カンマ区切りのデータを区切るのに
strtok()を使っています

1,2,4,5,6
のようなカンマ間にデータが入っていれば問題ないのですが

1,,,5,6
のようなデータだと、1、NULL、NULL、5、6と区切ってほしいのですが
実際に取得する値は1,5,6となってしまいます。

カンマが連続した場合、カンマ間の値をNULLとして取得してくれるいいアイデアはないでしょうか。


732 :デフォルトの名無しさん:04/10/26 14:37:27
自前で作れ
空文字列じゃなくNULLポインターが欲しいのか

733 :デフォルトの名無しさん:04/10/26 15:31:11
sscanf()で…と思ったがあれも空フィールド読めないな。
sscanf()で1フィールドずつ剥がしたらどうだろう。
#"%[^,]%n"かなんかで。

734 :デフォルトの名無しさん:04/10/26 15:47:24
boost::regexで出来なかったっけか

735 :688:04/10/26 15:54:00
>>692
私は試してないんだけど
ググったらVCで動かしてるひとはいるみたい
だから書いてみた


736 :デフォルトの名無しさん:04/10/26 16:12:28
>>735
レスありがとうございます
こちらでも調べてみたのですが、問題が多そうでした。
>>707
マルチしてました。すみません
gmpに詳しいようなのでお聞きしたいのですが、ライセンス関係の話ではなく、VC++でビルトできるのかという意味で、
かなり問題が多そうなのですが、そちらの環境では使えているのでしょうか?



737 :デフォルトの名無しさん:04/10/26 18:29:01
すみません。C++のソースをコンパイルすると
hoge.cpp:186: no matching function for call to 'class::hoge () const'
とでてコンパイルできません。
たしかに、このclass::hoge()メソッドは存在するんですが。
このエラーはどういうエラーなんでしょうか

738 :デフォルトの名無しさん:04/10/26 18:31:18
hoge()にはちゃんとconst付いてっか?

739 :デフォルトの名無しさん:04/10/26 18:54:04
#include<stdio.h>
int main(void)
{
int a = -1;
unsigned int b = 100;
int c = a > b;
printf("変数cの値は%dです。\n", c);
return 0;
}

実行すると、
変数cの値は1です。
と表示されます。
a > b はこの場合真になるのですか?

740 :デフォルトの名無しさん:04/10/26 18:56:25
>>739
うん

741 :739:04/10/26 19:08:50
>>740
異なる型の変数を関係演算子で
結んだ式はいつでも真ですか?

742 :737:04/10/26 19:12:44
>>738
string class::hoge() const { ... }
とやってます。これでだいじょうぶですよね。

743 :デフォルトの名無しさん:04/10/26 19:13:18
>>741
- int c = a > b;
+ int c = b > a;
するとどうなる?


744 :デフォルトの名無しさん:04/10/26 19:13:24
そうではなくて、異なる型どうしは演算できないから、
int と unsigned int を演算しようとすると
int が unsigned int に変換される。

intでの-1はunsigned intでは4294967295になるから、
a > bが真になる。

試しにint a=10とunsigned int b=100で比較してみれ

745 :デフォルトの名無しさん:04/10/26 19:14:49
>>742
そのメンバ関数を持っているクラスの名前はなんですか?


746 :デフォルトの名無しさん:04/10/26 19:15:14
>>742
何をやりたいのか分からないほどにめちゃくちゃ

747 :743:04/10/26 19:17:43
743取り消す
失敬


748 :739:04/10/26 19:23:09
>>743
コンパイルできません。

>>744
明解な説明をありがとうございます。

749 :デフォルトの名無しさん:04/10/26 19:55:23
classって名前のclassは作れません。

750 :739:04/10/26 20:02:02
>>744
異なる型の値が関係演算子で結ばれるとき、
どちらかの型にそろえるかと思いますが、
型の選択に規則はありますか?

751 :デフォルトの名無しさん:04/10/26 20:14:53
>>750
int < unsigned int < long int < unsigned long int < float < double < long double
の優先度で、サイズが大きい方に変換される。
int以下は全てintに変換される。

752 :デフォルトの名無しさん:04/10/26 20:21:01
同じサイズのsigned vs unsignedがunsignedになるのはCの最大の汚点。

753 :739:04/10/26 20:26:59
>>751
多謝。
>>752
なるほど。

754 :デフォルトの名無しさん:04/10/26 20:38:13
質問させてください。

とあるヘッダで
#include <vector>
class CA {
int m_hoge;
};
typedef std::vector<CA> VA;
class CB {
private:
VA m_hoge2(10);
};

としようとすると、
VA m_hoge2(10);
の行で syntax error : 'constant'となります。
VA m_hoge2;
は通るのですが、動的配列の大きさを予め決めたいのです。
どのようにすれば通るか教えて下さい。VC++.Net2003が環境です。


755 :デフォルトの名無しさん:04/10/26 20:41:18
>>754
無理です。CB : m_hoge2(10){}とでもするしかありません。

756 :デフォルトの名無しさん:04/10/26 20:49:50
コロン演算子は何をしているのでしょうか、
CB : m_hoge2(10){}
とはどういう意味でしょうか。
なお、実際にはVA m_hoge2(10);の他にもメンバ変数・関数があります。

また、申し訳ありませんが、>754ができない理由をお教え頂ければ幸いです。
よくこういう形で大きさを決めているソースを読むのですが……。
宜しくお願いします。

757 :デフォルトの名無しさん:04/10/26 20:55:01
>>756
ttp://www.nitoyon.com/vc/reference/cxx/init_value.htm


758 :755:04/10/26 21:04:06
分かりました!
クラスのメンバの初期化ですか。引っかかっちゃったなぁ…… orz
なお、>>755 はコンストラクタでやってね、という発言ですよね。

ありがとうございました。STL(・∀・)ガンガル!

759 :755:04/10/26 21:04:52
上記訂正、>>755>>757です、すみません。

760 :755:04/10/26 21:08:17
何を血迷ってるんだ……。>>755で合っていますね。
デスマ]λ... ワカッテルンダツカレテイルノハ...


761 :デフォルトの名無しさん:04/10/26 21:37:28
スイマセン質問なのですがVC++を使って開発を始めたいと思っているのですが、
自分はCでAPIは何とか理解できてるのですがC++はサッパリです。
なのでC++から勉強を始めようと思うのですが良い本はありませんでしょうか?
なんだかCの本とは違ってどれも小難しそうで…

762 :デフォルトの名無しさん:04/10/26 21:39:50
>>761
簡単な入門ならウェブで解説しているところがあるよ。
↓こことか。
http://wisdom.sakura.ne.jp/programming/cpp/index.html

763 :デフォルトの名無しさん:04/10/26 21:40:18
>>761
あきらめたら?

764 :デフォルトの名無しさん:04/10/26 21:52:45
762のサイトはやめておけ

765 :デフォルトの名無しさん:04/10/26 21:53:36
>>764 どして?

766 :デフォルトの名無しさん:04/10/26 22:38:24
○一○理での会話シミュレーターです。

#include <stdio.h>

int main(int argc, char** argv)
{
char buf[1000];
while (1) {
printf("You>");
fgets(buf, sizeof(buf), stdin);
printf("Genri>すごいね。\n");
}
return 0;
}


767 :≠764:04/10/26 23:16:05
>>765
例えばこんなことが書いてある。
--
ただし、綺麗で保守的なプログラムを書きたいのであれば
適当な位置で変数を宣言するのではなく、ブロックの先頭でまとめて宣言するべきです
--
こんなアナクロニズムな…

768 :デフォルトの名無しさん:04/10/26 23:17:51
保守しやすいんじゃなくて、まさに「保守的」なんだろうな。
C++やC99の記法は認めないと。

769 :デフォルトの名無しさん:04/10/26 23:19:27
>>767
まぁ、それは好みの相違という気がしますし、
読者がそのとおりに習慣づけても悪いことないと思うけどな。

770 :デフォルトの名無しさん:04/10/26 23:24:42
1つのサイトや本ではなく、色々な知識を得よ
と、後輩には口をすっぱく。

771 :デフォルトの名無しさん:04/10/26 23:26:42
>>769
ブロックの先頭でまとめるくらいなら
適当な位置でブロックないし関数に分けたほうがまし。

772 :デフォルトの名無しさん:04/10/26 23:28:42
>>771
まぁそれはそれでいいとして、
>>762 のページの問題点ってそんな些細なことなの?
その程度なら初心者に勧めてもいいのではないかな。

773 :デフォルトの名無しさん:04/10/26 23:30:55
>>772
> C++とはオブジェクト指向型プログラミングのために生まれたC言語です
一行目からヤヴァイと思う

774 :デフォルトの名無しさん:04/10/26 23:32:15
>>773
なぜそれがダメ?

775 :デフォルトの名無しさん:04/10/26 23:32:20
>>769
例えばブロックの中間で決定される値を利用してオブジェクトを生成する場合、
先頭で定義する手法は使えない。
つまり、 先頭で定義したり中間で定義したりと統一性が失われることになる。

それよりもなによりも、必要なものは必要なときに準備する方が判り易いと思うが。

776 :デフォルトの名無しさん :04/10/26 23:33:56
普通のChar型の文字列をバイナリに変換する(およびその逆も)には
どうしたらよいのでしょうか。
変換する便利な関数などはないのでしょうか?

777 :デフォルトの名無しさん:04/10/26 23:34:38
>>776
そんなものいらない

778 :デフォルトの名無しさん:04/10/26 23:35:05
Char型なんて知りません

779 :デフォルトの名無しさん:04/10/26 23:35:22
>>776
char型配列はそのままバイナリだよ。
バイナリを文字列とみなせば文字列だってだけ。

780 :デフォルトの名無しさん:04/10/26 23:35:53
>>776
中身はバイナリだけど…

781 :デフォルトの名無しさん:04/10/26 23:36:13
>>776
二進のコンピュータ上で動いてる限りどんなデータもはじめからバイナリだと思います。

782 :761:04/10/26 23:37:15
orz…
お騒がせしました…
自力で探します…

783 :デフォルトの名無しさん:04/10/26 23:42:09
>>782=761
そもそもすれ違いかもねw
EffectiveC++でも読んだら?

784 :デフォルトの名無しさん:04/10/26 23:48:22
宣言と定義と初期化を混同するなかれ
好みとポリシーを混同するなかれ

785 :776:04/10/27 00:10:46
>>777-781
そうですよね…どうもすいません、ありがとうございました。

786 :デフォルトの名無しさん:04/10/27 16:04:44
バッファ(cha buff[])に取得した日付などをファイル名にしたいのですが
バッファの中身をファイル名として落とす方法ってりますでしょうか。

787 :デフォルトの名無しさん:04/10/27 16:24:17
while(fgets(buff,500,fl_rd) != NULL)
{
bunkatustr = strtok(buff, ",");
id=bunkatustr;


if(id == id_temp)
{
fputs(buff, fl_wr);

break;
}
}//while_end


あるカンマ区切りのデータについて読み込んでIDが一致したら
その行だけを書き込もうと思うのですが
fputs(buff, fl_wr)で一行ファイルに書き込む際、
一行全てではなくidの値しか書き込まれません。

対策でなにかいい方法がございましたらお教え願います。

788 :デフォルトの名無しさん:04/10/27 16:50:52
>>787
strtok()は領域を破壊する。
切り出す手段として、sscanf()を"%[^,]s"で使うか別の領域にコピーしてからstrtok()を使う。

789 :デフォルトの名無しさん:04/10/27 17:11:22
以下のコードはなぜコンパイルエラーなのでしょうか・・・。

struct Test{
  short x;
  short y;
};

vector<Test> structData;

1時間くらい嵌ってる・・・。

790 :デフォルトの名無しさん:04/10/27 17:13:20
>>789
エラーメッセージは?

791 :デフォルトの名無しさん:04/10/27 17:13:37
>>789
どんなエラーメッセージでしょうか


792 :789:04/10/27 17:14:27
すみません。

vector-test.cpp: In function `int main ()':
vector-test.cpp:10: template-argument `main ()::Test' uses local type
`main ()::Test'
vector-test.cpp:10: template argument 1 is invalid
vector-test.cpp:10: template argument 2 is invalid
vector-test.cpp:10: ISO C++ forbids declaration of `structData' with no
type

こういうエラーメッセージです。

793 :デフォルトの名無しさん:04/10/27 17:21:11
その前後のコード書けー
「uses local type `main ()::Test' 」って、
main関数内でTestを宣言しようとしてる?


794 :デフォルトの名無しさん:04/10/27 17:21:17
>>792
mainの中でローカルクラスを定義してない?

795 :デフォルトの名無しさん:04/10/27 17:32:57
MS-Visual C++6.0で単なる変数宣言なのに
ブレークポイントが設定できないということはありますか?
どうやらその行は実行すらされていないようなのですが
コンパイル、ビルドは通るんです。
もう何がなにやら・・・。わかる方お願いします。

796 :789:04/10/27 17:33:39
情報が足りなくてすみません。

#include<vector>

int main(){
struct Test{
short x;
short y;
};

std::vector<Test> structData;

return 0;

}
という、ただ単に構造体のvectorを宣言しているだけです。
なぜローカルクラスを定義していけないのか、がわかりません。


797 :デフォルトの名無しさん:04/10/27 17:36:58
ローカルクラスを定義してはいけないのではなく、
templateの引数に使えないだけだろー

798 :デフォルトの名無しさん:04/10/27 17:40:24
>>796
std::vector<Test>のメンバ関数の中でインライン展開できない物が出たときにTestがローカルだと困るから、
C++ではテンプレートにはローカルの構造体・クラスを指定できない仕様になっている。
なのでmain()の外でtestを宣言しろ。

799 :789:04/10/27 17:42:19
はぁ〜、なるほど、しっかり理由を説明していただけると
わかりやすいですね。

main()外でstructを定義したら、ちゃんとコンパイルできました。

以後、気をつけます。
ありがとうございました。


800 :795:04/10/27 17:57:31
すまん、原因がわかりました。

801 :795:04/10/27 18:24:33
自作クラスを単独で宣言しても問題ないのに
配列で宣言してaccess violationなのは
やっぱりクラスの中身が悪いんでしょうか?

802 :デフォルトの名無しさん:04/10/27 18:28:27
面倒くさいからコード晒せ

803 :デフォルトの名無しさん:04/10/27 18:33:31
うっさい黙れキチガイ

804 :デフォルトの名無しさん:04/10/27 18:34:39
いや、ソースないと判断しようが無いと思うが

805 :デフォルトの名無しさん:04/10/27 18:37:43
コンパイルの際に以下のエラーがでるのですが、これは
インクルードファイルが破損しているのでしょうか?
それともDirectX9.0 SDKのdsound.hがもとからおかしいのでしょうか?
どうしてこのようなエラーがでるのか分かりません。
教えてください。おねがいします

C:\Program Files\Microsoft DirectX 9.0 SDK (October 2004)\Include\dsound.h(305) : error C2146: 構文エラー : ';' が、識別子 'dwReserved1' の前に必要です。
C:\Program Files\Microsoft DirectX 9.0 SDK (October 2004)\Include\dsound.h(305) : error C2501: 'DWORD_PTR' : 識別名を宣言するのに、型が指定されていません。
C:\Program Files\Microsoft DirectX 9.0 SDK (October 2004)\Include\dsound.h(305) : error C2501: 'dwReserved1' : 識別名を宣言するのに、型が指定されていません。
C:\Program Files\Microsoft DirectX 9.0 SDK (October 2004)\Include\dsound.h(306) : error C2146: 構文エラー : ';' が、識別子 'dwReserved2' の前に必要です。
C:\Program Files\Microsoft DirectX 9.0 SDK (October 2004)\Include\dsound.h(306) : error C2501: 'DWORD_PTR' : 識別名を宣言するのに、型が指定されていません。
C:\Program Files\Microsoft DirectX 9.0 SDK (October 2004)\Include\dsound.h(306) : error C2501: 'dwReserved2' : 識別名を宣言するのに、型が指定されていません。


806 :デフォルトの名無しさん:04/10/27 18:44:34
>>805
破損してるんなら自分で読めばわかるだろ?

807 :デフォルトの名無しさん:04/10/27 18:46:44
このエラーメッセージみても理解出来ないお前の頭が破損してる

808 :デフォルトの名無しさん:04/10/27 18:48:41
>>805
必要なファイルを先にincludeしてないんじゃないか?

809 :デフォルトの名無しさん:04/10/27 18:50:06
305行目とその周辺を確認するのが手っ取り早いと思うが

810 :デフォルトの名無しさん:04/10/27 18:52:17
>>799
ワロタ!!

811 :805:04/10/27 19:01:01
typedef struct _DSEFFECTDESC
{
DWORD dwSize;
DWORD dwFlags;
GUID guidDSFXClass;
DWORD_PTR dwReserved1;  ←305行目
DWORD_PTR dwReserved2;
} DSEFFECTDESC, *LPDSEFFECTDESC;

これをみても私には何処が間違っているのか分かりません。

812 :デフォルトの名無しさん:04/10/27 19:01:45
DWORD_PTRが定義されてないのかな

813 :デフォルトの名無しさん:04/10/27 19:02:55
DWORD_PTR
という型はどのインクルードファイルを読み込めばよいのでしょうか?
そうすればOKですか?

814 :デフォルトの名無しさん:04/10/27 19:06:42
ここまで分かってて何でそれすら自分で出来ないんだ?

815 :デフォルトの名無しさん:04/10/27 19:09:14
困った初心者さんの条件
・調べない
・試さない
・情報を小出しにする

816 :デフォルトの名無しさん:04/10/27 19:10:18
定義がないなら別のエラーになりそうだが

817 :デフォルトの名無しさん:04/10/27 19:11:04
>>813
それぐらいgrepなりなんなりで検索しろよ…
basetsd.h

818 :デフォルトの名無しさん:04/10/27 19:54:29
文句を言いつつも親切に回答するこのスレの中の人のやさしさに感動した。

819 :デフォルトの名無しさん:04/10/27 19:56:17
>>818
追っ払うには質問に答えればいいからな

820 :デフォルトの名無しさん:04/10/27 21:09:17
バグのために2〜3日まったく進まないことなんてあります?
もう疲れました

821 :デフォルトの名無しさん:04/10/27 21:13:38
/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
| バグで2〜3日まったく進んでません。もう疲れました。

   ̄ ̄ ̄|/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
  ∧_∧       / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
  ( ・∀・)  ∧ ∧ < おめーのバグだろ、ゴルァ!!
 (  ⊃ )  (゚Д゚;)  \____________
 ̄ ̄ ̄ ̄ ̄ (つ_つ__
 ̄ ̄ ̄日∇ ̄\| BIBLO |\
       ̄   =======  \

822 :デフォルトの名無しさん:04/10/27 23:01:54
>>819
その謙虚さがカッコいいな。

823 :デフォルトの名無しさん:04/10/28 00:08:55
ただ悩んでいないで発想の転換も必要だ。
バグ回避とは逃げではなくて、賢い回り道だ。


824 :デフォルトの名無しさん:04/10/28 01:09:43
バグから逃げないで立ち向かえ

825 :デフォルトの名無しさん:04/10/28 01:11:41
自分自身のバグのために2〜3日まったく進まないことなんてあります?
もう疲れました

826 :デフォルトの名無しさん:04/10/28 02:02:06
820 825
そんなにその質問の答えが聞きたいのか?

827 :デフォルトの名無しさん:04/10/28 02:04:10
typedef struct _STest
{
std::string strTest;
int nTest;
} STest;

とういような構造体を定義しておいて、

STest sTest;
::memset(&sTest, 0, sizeof(STest));
sTest.strTest = "test";

のように、memsetで初期化した後に、strTestに入力を
行ってもいいんでしょうか?
個人的には、非常に気持ち悪いのですが、VC6では、
きちんと動作しているように見えます。

初期化だけが目的ならコンストラクタでやれと言われそうですが、
宜しくお願い致します。

828 :デフォルトの名無しさん:04/10/28 02:06:52
memsetすること自体がヤバい。std::stringが自分のコンストラクタで初期化しているのを
壊している恐れがある。

829 ::04/10/28 02:27:07
正気の沙汰じゃないな

830 :627:04/10/28 02:29:00
>>628
お返事ありがとうございます。

そう言われて見るとそうですね。やっぱり危険ですよね。
sTest.strTestがNULLなのに、入力できているので不思議です。
どうして、動いてるんでしょう?

STLに詳しくないため、std::stringが中でどういうことを
やってるのか分かりませんが、危険な感じはしますね。

831 :デフォルトの名無しさん:04/10/28 03:28:17
Independent JPEG Group
http://www.ijg.org/
JPEGライブラリをインクルードして使いたいのですがライブラリの構築がうまくいきません。
configureってどうすればよいのですか?

832 ::04/10/28 03:33:47
./configure

833 :デフォルトの名無しさん:04/10/28 03:53:33
memset や realloc や 可変引数は事故の元
C++ では使わない

834 :デフォルトの名無しさん:04/10/28 04:19:11
Windowsのコマンドプロンプトで実行しようとすると

'configure' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

'./configure' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

ってなってしまうんですm(_ _)m

835 :831=834:04/10/28 04:29:58
間違いました、./configureとすると

'.' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

でしたm(_ _)m

836 :デフォルトの名無しさん:04/10/28 04:32:13
>ってなってしまうんですm(_ _)m
>でしたm(_ _)m
だから何?

無能にも程がある

837 :831=834:04/10/28 04:41:17
失礼しました。意味の無い書き込みでした。頭整理します。

スレ違いになってしまいそうですが、Windowsのコマンドプロンプトで
exe拡張子の無いこのconfigureを実行するにはどうしたらよいのでしょうか。

838 :デフォルトの名無しさん:04/10/28 04:58:04
gcc

今後質問するときは環境とか小出しにしないように
というか、テンプレをよく読むように

839 :デフォルトの名無しさん:04/10/28 04:58:29
自分の頭は自分で整理してくれ

840 :デフォルトの名無しさん:04/10/28 07:29:05
>>837
Windowsでやりたいならどちらか選べ
(1) cygwin環境を入れてconfigure
(2) MSVC入れてmakefile.vc をnmake

841 :838:04/10/28 08:32:00
スマソ素で間違えた
漏れが言いたかったのは>>840(1)の方ね

842 :デフォルトの名無しさん:04/10/28 09:13:30
cygwin環境作るならjpgeも(ソース、バイナリとも)一緒にインストールできる罠。

843 :デフォルトの名無しさん:04/10/28 10:22:34
0x000A0015って文字列をDWORDの値に直す簡単な方法ありますか?

844 :デフォルトの名無しさん:04/10/28 11:32:13
DWORD a=(DWORD)0x000A0015

845 :デフォルトの名無しさん:04/10/28 11:38:02
>>844
オイオイ。 >>843 は文字列って言ってるだろが。

DWORD a;
sfscanf("0x000A0015", "%i", a);

846 :845:04/10/28 11:38:26
まちごた。
sscanfだた。

847 :デフォルトの名無しさん:04/10/28 12:00:38
>>843
ちなみにWindowsでiniファイルとして扱える書式ならGetPrivateProfileIntでも読める

848 :デフォルトの名無しさん:04/10/28 14:34:24
    /,,;,,,,,  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  ,,,,,,,;:::丶
   / :::::::::;;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,;:::::::::::::::ヽ
   i゙:::;:::::||::::::ii:::::::::::||::::::::::::::::::;:::::::::::::::::::::::::::゙i
  i゙::::|;;;;| |;;;;| |::::::::::| |:::::::::::::::::||:::::::::::::::::::::::::::::|
 . i゙::::::i     ''''''''''' '───' |;;;;;;;;;;::::::::::::::::::::|
  .|:::::::|,-====-´  ゙ヽ,,,,,,,,,,,,、    |:::::::::::::::::::|
  |;::::::::|,-----、    ~ニニ,,_`    |:::::::::::::::::::|  二次元配列は
  `ヽ、i (、i´ノ     ´い,, ノ '    |;;;::::::::::::::/   なんで、ポインタのポインタで渡せられへんの?
  .   i ^~~~ー==--  ー'-+、     / ゙-、;;;;/
     {      ヽゝ          '-'~ノ
    λ   ''゙゙゙'''-''---、       /-'^
     ヽ,    ^~^         (
     /  `丶 、     , -   /^l
     |   /( ノ `''''''´~  __, - '  ゙i、

849 :デフォルトの名無しさん:04/10/28 14:35:34
             L -‐ '´  ̄ `ヽ- 、   〉
          /           ヽ\ /
        //  /  /      ヽヽ ヽ〈
        ヽ、レ! {  ム-t ハ li 、 i i  }ト、
         ハN | lヽ八l ヽjハVヽ、i j/ l !
         /ハ. l ヽk== , r= 、ノルl lL」
        ヽN、ハ l   ┌‐┐   ゙l ノl l
           ヽトjヽ、 ヽ_ノ   ノ//レ′
    r777777777tノ` ー r ´フ/′
   j´ニゝ        l|ヽ  _/`\
   〈 ‐ 知っているがlト、 /   〃ゝ、
   〈、ネ..         .lF V=="/ イl.
   ト |お前の態度がとニヽ二/  l
   ヽ.|l.        〈ー-   ! `ヽ.
      |l気に食わない lトニ、_ノ    ヾ、
      |l__________l|   \    ソ

850 :デフォルトの名無しさん:04/10/28 14:40:17
再帰って流れを読むのが難しいね
bugの修正が困難だよ
どうしよう

なんかいい方法ないですか?

851 :デフォルトの名無しさん:04/10/28 14:40:54
>>850
アルゴリズムを根本から見直す

852 :848:04/10/28 14:55:42
切実な感じを出そう表そうとした結果、
ふざけた感じになってしまいました。
すいませんでした。

できたら教えていただけませんでしょうか
渡せるのですか?

853 :デフォルトの名無しさん:04/10/28 14:58:47
渡せる

854 :デフォルトの名無しさん:04/10/28 15:01:47
ライブラリを作るときって、デバッグどうやってます?
完全に別のプロジェクト立ち上げて、ためしに組んでから
別のライブラリ専用のプロジェクト立ち上げて作ってます?
どうも使う段階になってエラーが発覚したときの
ライブラリデバッグのスマートな方法がわかりません。

855 :848:04/10/28 15:04:47
試してみてもやっぱりうまくいかないのですが・・・
なにか特別なことする必要があるんですか?
アフォなので詳しく教えてください!

856 :デフォルトの名無しさん:04/10/28 15:07:45
>>850
再帰が深くならなくてすむような
再現データを食わせてみる。


都合のよい小さな再現環境がすぐに
作れなければ
再帰が深くなるたびにデータは狭まるか
答えに近づくかするはずだろうから
おかしくなるデータの範囲を
デバッガやログで絞り込む。



857 :デフォルトの名無しさん:04/10/28 15:15:32
>>855
本読んで一から勉強したほうが早いっぽ。

858 :デフォルトの名無しさん:04/10/28 15:18:03
>>854
好きなデータを突っ込める
テスト用のメインプログラムを作る。

絶対作れ。

特に
間違った呼び出し方をしたときに
ちゃんとエラーコードや例外を返せるかとかのテストは
本物の呼び出し元プログラムじゃ
すげー面倒っつーかほとんど不可能。

最近はJUnit VBUnit CppUnittとか便利なのがある。

859 :デフォルトの名無しさん:04/10/28 15:39:45
質問です。
Rubyで言う、attr_accessor、つまりprivateのメンバ変数に対して
publicのset、get関数を作ってくれるようなシステムが
何かしらのテンプレートを介して使えたりするのでしょうか。
(標準ヘッダを使うではなく、プロジェクトの共通ヘッダとして手書き実装でも可です)
アクセッサを作るのが非常にマンドいんで、何とかしたいと思い
色々検索してみたのですが見つからず……。
宜しくお願いいたします。

860 :デフォルトの名無しさん:04/10/28 16:06:50
>>859
BCCでいうところのこんなやつか?

class hoge {
public:
 __property int moge = { read=_moge, write=set_moge };
private:
 int _moge;
 void set_moge(int v){ _moge = v; }
};


861 :デフォルトの名無しさん:04/10/28 16:21:26
使ってるエディタでマクロ組むのが良いんではないかね?

862 :デフォルトの名無しさん:04/10/28 16:30:30
>>859
多少違うがこんな感じか?
template <typename T>
class value_with_accessor
{
    T value;
public:
    T operator()() const {return value;}
    void operator()(const T &t){value = t;}
};

class Test
{
public:
    value_with_accessor<int> m;
};

Test t;
t.m(4);
std::cout << t.m();

863 :859:04/10/28 16:33:58
>>860
私の手元はC++BuilderでなくVC++なので……。
なお、VC++では__propertyを使うと変数をいじっているようで
実は関数を介しているっていう奴が実装できるらしいですね、
使った事ないんですが……。

諦めて地道に作れやって事なのかな…… orz

864 :デフォルトの名無しさん:04/10/28 16:45:14
friendの意味って何?
publicだけじゃダメなの?
不用意に参照されないようにするため?

865 :デフォルトの名無しさん:04/10/28 16:47:58
>>864
うん。

866 :859:04/10/28 17:03:48
>>862
ありがとうございます。
さらに修正を加え(readonlyとか)、自分のものに使わせて頂きました。
激しく便利!
(・Д・)こ、これがテンプレートの力なのかっ……!


867 :859:04/10/28 18:25:46
……と思ったんですが、上記の例でクラスないし構造体のような
ものに適用しようと思ったとき、そのメンバへのアクセスを指定したい時は
どのようにしたら良いでしょうか。
>>862ソースで言うところの
value_with_accessor<int> m;
のintがクラスや構造体の時、mのメンバへのアクセスということです。
そういう時専用のテンプレートを作る事は
止むを得ないとは思うんですが、さらのそのメンバのメンバとかになると
気が遠くなってきます。ダメなのかなぁ……。


868 :デフォルトの名無しさん:04/10/28 18:34:14
>>867
>>862を改造してもread-onlyにはできない。
きめ細かなアクセス制限を施したいならアクセス関数を書けばいい。
setter/getterを用意するなら、メンバへのアクセスを制限する理由はないんじゃないか?

869 :デフォルトの名無しさん:04/10/28 18:44:57
つーか、setter/getter作るのが億劫なら公開しちゃえばいいのに。
#私ゃエディタのマクロで作ってるけど。

870 :859:04/10/28 19:28:19
そうですね、書き込み用の関数をなくすと、誰も書き込めなくなりますしね。
やはりエディタですか。WZにがんばってもらおう……。

デスマ]λ... ドウセオレハマケグミダ...

でもテンプレートたのすぃ事は判明しましたw

871 :デフォルトの名無しさん:04/10/28 22:30:44


872 :デフォルトの名無しさん:04/10/28 23:10:33
プログラムが進むにつれて
流れがつかみにくくなりバグフィックスも難しくなる
もう疲れました
たかだか1000行程度なのにバグばっか
この先もっとバグが増えていくとなると気が遠くなります

プログラマーのみなさんの大変さがわかりました

873 :デフォルトの名無しさん:04/10/28 23:13:29
C++ではなくてCに関する質問なのですが、
関数の引数についてどうしてもよく分からない点があります。

下の関数の引数の渡し方は、どう違うのでしょうか?

void funcTest( char* chrArg ) { ... };

void funcTest( char[] chrArg ) { ... };



874 :デフォルトの名無しさん:04/10/28 23:18:50
>>872
細かい機能ごとなりの関数に分けるといいよ
>>873
配列とポインタの違い?それ以外何?

875 :デフォルトの名無しさん:04/10/28 23:23:59
関数の中で chrArg を変更出来るか出来ないか


876 :デフォルトの名無しさん:04/10/28 23:27:28
>>873
下の書き方はCでもC++でも許可されていません。

877 :デフォルトの名無しさん:04/10/28 23:28:13
>>872
そら全体の設計が悪いんだよ。
C++を使ってるならオブジェクト指向や
デザパタの入門書を読んでごらん。
一度頭を打ってから読むと有難味が
よく判るよw

878 :デフォルトの名無しさん:04/10/29 00:56:54
>>873
char[] chrArg なんて形は無いのでは?char chrArg[] ならあると思うけれど。
確か、関数の仮引数の最後のものだけはchrArg[]としてもポインタとして働くはず
だったので、引数が一つならどちらもポインタになると思うけれど、ポインタの方で
書くのが一般的だと思う。

>>875
本当ですか?


879 :デフォルトの名無しさん:04/10/29 01:20:24
ごめんなさい、878間違っていたので自己レスです

>> 関数の仮引数の最後のものだけはchrArg[]としてもポインタとして働くはずだったので、
引数が一つならどちらもポインタになると思うけれど
上は全部間違いです

関数の仮引数としてのchrarg[]の最後の[]だけはポインタとして働くはずだったので、
[]が一つならどちらもポインタになると思うけれど
が正しいです

自分で読み返して何書いてるんだかって感じでした

880 :デフォルトの名無しさん:04/10/29 01:22:46
http://www.kouno.jp/home/c_faq/c6.html

881 :デフォルトの名無しさん:04/10/29 01:39:04
>>879
どっちにしろ間違いです

882 :デフォルトの名無しさん:04/10/29 01:56:17
>>879
一から勉強しなおせ。

883 :デフォルトの名無しさん:04/10/29 07:20:06
Java出身ですか?

884 :デフォルトの名無しさん:04/10/29 11:13:27
ソートについて質問です
名前、国語の点数、。数学の点数、英語の点数が書いてあるテキストを読み込んで
点数を合計して トップ10を表示するプログラムを作りたいのですが
点数を読む方法が解りません お手数かけますがよろしくお願いします

[テキスト]
ななしさん  30 40 50
ななしさん2 20 50 60
:::
200人まで続きます

885 :デフォルトの名無しさん:04/10/29 11:57:56
>>884
何が分からないのですか?
ファイルの読み込み?


886 :デフォルトの名無しさん:04/10/29 12:01:38
>>884
宿題スレ行ったほうがいいぞ。
宿題ならscanfで充分だと思うけど、
ここだと小難しく考える連中が多いからな。

887 :デフォルトの名無しさん:04/10/29 12:44:46
>>886
scanf()ですか……
小難しいも何も、阿呆につける薬はないな。

888 :デフォルトの名無しさん:04/10/29 14:55:06
buffのreturnについてアドレスではなく、データを先頭だけでなくすべてのデータを戻り値として
戻すことはできないのでしょうか。
というのもperlでsystem関数でCのモジュールを呼んでいるのですが
その戻り値にバッファのデータを返したいのです。
現状では、アドレスが返ってしまっているようです。

889 :デフォルトの名無しさん:04/10/29 14:58:22
標準出力やファイルに書き出して、それを読んだら?

890 :デフォルトの名無しさん:04/10/29 15:02:50
>>858
ありがと。CppUnit挑戦してみます。

891 :デフォルトの名無しさん:04/10/29 15:08:43
VC++7.0で開発しています。
ごくまれにTRACE()を使用すると、
atltracemodulemanager.hののCAtlTraceProcessクラスのModuleCount()という関数で例外が発生してしまいます。
再現方法もまだわかっていないのですが、とにかくTRACE()をやめることで回避できるようです。
しかしこれが原因でTRACE()で落ちる、という理由がわかりません。
どなたかご存じでしょうか?

892 :デフォルトの名無しさん:04/10/29 15:08:48
perlにもパイプあったっしょ?
#awkにもあるんだからないとは思わないけど。
Cで標準出力に出させてそれをパイプで取得するか、>889の言うようにファイル経由か。

893 :デフォルトの名無しさん:04/10/29 16:28:29
>>888
>データを先頭だけでなくすべてのデータを戻り値として

perlはよく知らないが、構造体を使えば出来なくはない。
でもperlのモジュールがそんなアホな仕様になってるわけがない。
もう一度よく仕様読んだほうがいいぞ。

894 :デフォルトの名無しさん:04/10/29 16:31:57
system関数は外部プロセスを起動するもの
perlモジュールをCで書くXSじゃないよ

895 :デフォルトの名無しさん:04/10/29 21:46:32
>>892
VC7はよくわからんが、TRACE()の文字上限こえたんじゃない?



896 :デフォルトの名無しさん:04/10/29 22:12:41
C++で質問なんですが、
friend class
ってのは、

class A{
friend classB;
public:
・・・・・
private:
・・・・・
}
class B{
・・・・・
・・・・・
}
としたら、BからAのpublic, privateを問わずあらゆるメンバを使用可能になるのではないのですか?
GCCを使っているのですが、BのメンバからAの変数やら関数を使おうとしたのですが、
undefine 〜
とエラーが出ます。
なにかヒントになるようなサイトとか助言ありませんか?

897 :デフォルトの名無しさん:04/10/29 22:18:00
>>896
BでAを触ってるとき
ちゃんとAのクラス定義はincludeしてる?


898 :デフォルトの名無しさん:04/10/29 22:18:20
classとB;の間にスペースが空いていないぞ。

899 :デフォルトの名無しさん:04/10/29 22:19:16
y-x>=0で点(0,0)と(1,1)を含まないという条件式は
(y-x>=0)&&((x!=0)&&(y!=0))&&((x!=1)&&(y!=1))
でいいんでしょうか?

900 :デフォルトの名無しさん:04/10/29 22:28:50
>>899
反例 (1,2)

(y-x>=0) && !((x==0&&y==0)||(x==1&&y==1))
じゃね?


901 :デフォルトの名無しさん:04/10/29 22:40:47
>>900
ありがとうがざいます
うまくいきました

902 :892:04/10/30 00:33:55
>>895
はい? TRACE()が何か?

903 :デフォルトの名無しさん:04/10/30 00:44:40
>>902
アンカーが1個ずれてると思割れ目

904 :デフォルトの名無しさん:04/10/30 01:40:14
2ch専用ブラウザ厨にそういうミスをする人が多いね。

905 :デフォルトの名無しさん:04/10/30 04:11:19
>897
はい、てかむしろ同じヘッダーファイルなのですが。
前方宣言?ってのをしてみても駄目でした・・・
いっそソース晒したほうがはやいですかね?

906 :デフォルトの名無しさん:04/10/30 07:01:13
>>905
ttp://www.tcp-ip.or.jp/~ikken/cpp/txt/t12.C.txt
これと比較しる

907 :デフォルトの名無しさん:04/10/30 10:45:39
くだ質ですが

ifstream::getline 用のバッファは
char* 型ではなく string 型で代用できないのでしょうか?

動的にメモリを確保する分では常に確保していなくてはいけないし、
確保できる上限も心もとないんです
他に、代用できる方法もあればその方法も伝授お願いします

908 :デフォルトの名無しさん:04/10/30 10:56:04
std::getline使え

909 :デフォルトの名無しさん:04/10/30 11:13:41
CPPファイルを機能単位に分割していたのですが
error LNK2005: "struct a b" (...............) は既に WinMain.obj で定義されています。
というエラーが出ました
struct a bの構造体宣言はWinMain.cppとgame.cppの両方でしています
その宣言は
struct a
{
int x,y;
}b;
です
どこがいけないのでしょうか?

910 :909:04/10/30 11:25:12
game.cppの方の宣言を
extern struct a
{
int x,y;
}b;
にしたら解決しました
変数だけじゃなくて構造体にもexternをつけれるんですね
かいけつしました

911 :デフォルトの名無しさん:04/10/30 11:26:36
>>909
そりゃ両方で定義したらまずいに決まってるだろ。
externしる。

912 :911:04/10/30 11:27:07
一足遅かった orz

913 :デフォルトの名無しさん:04/10/30 11:28:45
>>910
構造体でも変数には違いないからな
っていうかそんなのヘッダファイルに書けYo

914 :デフォルトの名無しさん:04/10/30 12:31:20
>>908
解決しますた。dxです

915 :909:04/10/30 13:08:27
気がついたら9000行近いプログラム書いてた
俺って天才かも

916 :デフォルトの名無しさん:04/10/30 13:27:47
お世話になります。
ラウンジに質問のソースを上げました。
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1060403548&res=129&fi=no

2次元配列の中身を表示する単純なプログラムを、少しややこしく書いたものです。
テストは2回行っており、1回目は for loop 内で、2回目はべた打ちで、
まったく同じコードを書いているつもりなのですが出力結果は異なります。
これらのどこに違いがあるのか、時間のあります方はどうかご教示願います。

環境は winXP、コンパイラは bcc5.5 と g++3.3.1(cygwin) で試しました。
宜しくお願い致します。

917 :デフォルトの名無しさん:04/10/30 14:01:25
for (int i=0; i<N; i++) {
p[i].reset(new Tester<double*>(x[i], n));
の次に、
for(int j=0; j<=i; j++)
{
cout << "Tester[" << j << "]: ";
p[j]->disp();
}
を追加してみれば分かると思うよ

918 :916:04/10/30 14:33:00
>>917
早速のご回答をありがとうございます。
なるほどおっしゃるコードで、どうやら Tester内の const参照が
for loop で初期化したときのみ、全インスタンスで共有されてしまって
いるという状況を知ることができました。

しかし未だに原因がわかりません。試しに示された j に関するループを、
元のコード同様べたべたに展開してみましたが、やはり結果が異なって
出力されます。この原因について、もう少しヒントを頂ければ幸いです。

919 :916:04/10/30 14:55:05
連投すみません。
さらに試行錯誤したみたところ、以下の事実がわかりました。

元のコードのベタ打ち部分を、次のように書き換えます。
//----------------------------------
// テスター初期化(2回目)
do { // do loop は必ず1回のみ実行される
  int i=0;
  // if(i<N) break; // この文の有無により挙動が変化
  p[i].reset(new Tester<double*>(x[i], n));
  i++;
  p[i].reset(new Tester<double*>(x[i], n));
  i++;
  p[i].reset(new Tester<double*>(x[i], n));
} while (0);

すると、「この文の有無により」で示された行のコメントを外した瞬間、
for loop と同じ挙動を示しました。条件に用いている比較は常に偽です。
ますます訳がわかりません。ご存知の方はお助け頂けませんでしょうか。

920 :916:04/10/30 15:00:16
ごめんなさいごめんなさい!
>>919 は当たり前でした!!本当にすみません。さっくり無視してください。
>>918 に対するご回答が頂ければ幸いです。

921 :デフォルトの名無しさん:04/10/30 15:01:20
EnumWindowsでウィンドウハンドルを取得して、
そこからキャプションのリストを作りたいのですが、
キャプションを\nで区切ろうとすると改行にならずに「↑」みたいなものに文字化けします。

キャプションを取得してからの処理は、
リストとして確保したバッファにキャプションと「\0」を追加していくというやり方をしています。

文字化けを解決する方法をお教えください。

922 :デフォルトの名無しさん:04/10/30 15:24:20
>>919
for (int i=0; i<N; i++) {
p[i].reset(new Tester<double*>(x[i], n));

for(int j=0; j<=i; j++)
{
cout << "Tester[" << j << "]: ";
p[j]->disp();
}

の間に、

switch(i)
{
case 0: p[i].reset(new Tester<double*>(x[i], n)); break;
case 1: p[i].reset(new Tester<double*>(x[i], n)); break;
case 2: p[i].reset(new Tester<double*>(x[i], n)); break;
}
を追加してみると多分分かるよ


923 :916:04/10/30 15:41:03
>>922
ご回答ありがとうございます。
早速試してみました。
残念ながら私には、switch文の挿入にどのような意味があるのか
よくわかりませんでした。単に、
p[i].reset(new Tester<double*>(x[i], n));
をもう一度行っているだけに思われます。不勉強ですみません。

結果はやはり、for loop とべた展開とで異なりました。
重ね重ね申し訳ありませんが、もう少しお付き合いくださると嬉しいです。

924 :921:04/10/30 16:14:03
すいません、なんとか解決致しました。
以降>>921はスルーよろしくお願いします。

925 :デフォルトの名無しさん:04/10/30 17:44:26
引数がvoidでないコンストラクタを持つクラスはなぜ許されないんでしょうか?
厳密には現クラスでvoidでないコンストラクタのみでもいけるようですが,
そのクラスを継承した子クラスではエラーが出てますます意味不明です.

理不尽な制約のように思うのですが・・・

926 :925:04/10/30 17:45:12
間違えました

> 引数がvoidでないコンストラクタ「のみ」を持つクラスはなぜ許されないんでしょうか?

927 :デフォルトの名無しさん:04/10/30 17:54:56
>>926
具体的にどんなコードよ。簡単なのをはつけてみれ。

928 :デフォルトの名無しさん:04/10/30 17:58:29
>>925
子クラスは親クラスのコンストラクタ引数を供給しなければならない。
struct Base
{
Base(int n){}
};

struct Derived : public Base
{
Derived(): Base(4){}
};

929 :デフォルトの名無しさん:04/10/30 18:03:16
子クラスのコンストラクタで基底クラスのコンストラクタに引数を渡してないと予想。
class Base {
public:
 Base(int i) {}
};

class Derived {
public:
 Derived(void)
  : Base(0) /*←これ*/{
 }
};
を書いてないんじゃない?
もしそうならもう一度入門書読み直してまいれ。

930 :929:04/10/30 18:06:14
: public Base忘れた。ハズカシイ……
さらに既に回答が来てて尚恥ずかしくて死ぬ。


931 :デフォルトの名無しさん:04/10/30 18:08:43
>>905
エラーでもいいかも
>undefine 〜
だけじゃさすがにわからんです


932 :925:04/10/30 18:35:16
>>927-928

なるほど!そういう構文があったんですね.
DelphiやらRubyやらはよく使ってるんですが,
C++はあまり深入りしてなかったので細かいしきたりを知りませんでした.
ありがとうございます.
C++本を読んで勉強しなきゃいけませんね.

933 :デフォルトの名無しさん:04/10/30 19:04:32
構文って・・・

934 :デフォルトの名無しさん:04/10/30 19:22:47
超初心者ですが、
atoi関数の逆(int形の整数を文字列に変換)の関数はありますか?
ないならこのような処理はどうすればいいですか?

935 :デフォルトの名無しさん:04/10/30 19:27:46
snprintf

936 :デフォルトの名無しさん:04/10/30 19:32:08
>>934
環境依存でいいなら_itoa

937 :デフォルトの名無しさん:04/10/30 19:33:46
>>934
boost::lexical_cast<>(推奨)
std::stringstream
std::strstream(非推奨)
snprintf(C99では規格に入っている。C89・C++では規格外)
sprintf(規格内。ただしかなり慎重に使わないと危険)

938 :デフォルトの名無しさん:04/10/30 19:38:56
>>934
Ruby!!!!!!!!!

939 :934:04/10/30 19:43:29
>>935->>937

ありがとうございます。

>>937

boost::lexical_cast<>

というのはどこに文字列を入れるんですか?

940 :デフォルトの名無しさん:04/10/30 19:46:03
boost::lexical_cast<string>(i)

941 :Ruby >>>>>>>>>>> C++:04/10/30 19:47:14
int value = lexical_cast<int>(hogehoge);

942 :デフォルトの名無しさん:04/10/30 19:47:50
ぎゃくだろおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおお

943 :デフォルトの名無しさん:04/10/30 20:06:57
>>941-942
自作自演乙

944 :デフォルトの名無しさん:04/10/30 20:10:35
Ruby!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

945 :デフォルトの名無しさん:04/10/30 20:12:45
Ruby Ruby Ruby

946 :デフォルトの名無しさん:04/10/30 20:51:31
C++ で realloc() 相当の構文がないのはどうしてでしょうか?
みなさん realloc() したいときはどうしてますか?

947 :デフォルトの名無しさん:04/10/30 20:52:06
ruby

948 :デフォルトの名無しさん:04/10/30 20:55:45
>>946
realloc つかう

949 :デフォルトの名無しさん:04/10/30 21:01:18
>>946
realloc()とか言ってる時点でまだC++の初心者だって事がバレバレ。
コンテナ使えばいいし、そもそもデストラクタ処理が重すぎる。

950 :デフォルトの名無しさん:04/10/30 21:02:30
>>946
std::vector

951 :マイク ◆yrBrqfF1Ew :04/10/30 21:06:04
>>946
std::reallocを使いたいと思ったことは無いが
必要があればそれを使うだろう。

952 :デフォルトの名無しさん:04/10/30 21:10:53
でも realloc() って new/delete と互換性がありませんよね。
そこが不便なんですよねぇ。

↓こんなことやったらあかんでしょ?
int* p = new kint[10];
p = realloc(p, sizeof(int) * 20); // 20 個分確保しているつもり
delete[] p;

953 :デフォルトの名無しさん:04/10/30 21:12:38
そもそもmalloc/free/reallocの類はレガシー。
ポインタですらなるべく使わないでおこうというのが流行でしょ。

954 :952:04/10/30 21:18:28
>>953
私の中ではリファレンスはできるだけ使わないという方針なんですが。。
C++ を「C をちょっと便利にしたもの」という程度でしか使いたくないんです。

955 :デフォルトの名無しさん:04/10/30 21:23:29
そんなところにプライドを設定するなよ

956 :デフォルトの名無しさん:04/10/30 21:26:30
>>954
可変長配列はstd::vector<>を使うのがセオリー。これを使うだけでも
十分にC++を使うだけの価値があると思うが。

957 :デフォルトの名無しさん:04/10/30 21:27:05
>>955
プライドというか、C++ に溺れないための対策なんです。

958 :デフォルトの名無しさん:04/10/30 21:27:56
>>954
それはつまり、なるべく発展的なことはしないということかな?

959 :デフォルトの名無しさん:04/10/30 21:28:38
>>956
vector はよく使うんですが、それ以外にも方法はないものかと思って。
vector ってどうやって動的にメモリを変更しているんでしょうね。
やっぱり realloc() 使ってるんでしょうね。

960 :デフォルトの名無しさん:04/10/30 21:30:24
>>957
C++に溺れると何か不都合でもあるの??

961 :デフォルトの名無しさん:04/10/30 21:30:49
>>958
そんな感じです。
リファレンスやら const やら template は、限定的に使える限りは使いますが、
他のクラス設計に伝播的に影響を及ぼすと考えられる場合は、できるだけ使わないですね。
特にリファレンスは、関数の const & 引数でしか使わなくて、
クラス メンバに リファレンスをもたせたくはないです。

962 :デフォルトの名無しさん:04/10/30 21:31:36
>>959
君ね、C云々C++云々言う前にCの勉強やってるの?
まずはmallocと同じ物を自分で実装してみたらどう?

963 :デフォルトの名無しさん:04/10/30 21:31:55
>>961
もういいから二度とC++は使うな。

964 :デフォルトの名無しさん:04/10/30 21:32:11
>>954
じゃnew/deleteじゃなくてmalloc/realloc/free使えば?


965 :デフォルトの名無しさん:04/10/30 21:32:14
>>960
設計やコードの見通しが悪くなると思っています。
もちろん C++ を完璧に使いこなせる人がたくさんいれば問題ないですが、
現実にはそうではないですし。
シンプルな設計やコードがベストという意味で、「C 的 C++」にこだわりたいんです。

966 :デフォルトの名無しさん:04/10/30 21:33:24
>>962
malloc/realloc/free の実装はやったことありますよ。
WinAPI の Heap*() API を使えばすぐできます。

967 :デフォルトの名無しさん:04/10/30 21:34:24
>>946
newの配置構文使えばそれらしいことができる。

new(ポインタ変数名) クラス名;

968 :デフォルトの名無しさん:04/10/30 21:35:14
>>963
何かまずいこといいましたか?
C++ の使い方として悪いポリシーでしょうか。

969 :デフォルトの名無しさん:04/10/30 21:36:29
>>967
これはやったことがあるんですが、C++ 標準で用意されていないですよね。
オペレータを定義するしかないですよね。
その実装はやはり realloc() で、となるのか。。。

970 :デフォルトの名無しさん:04/10/30 21:38:47
>>964
現在の私の使い方としては、クラスは new/delete で、
動的にサイズが変化するバッファの場合は malloc()/realloc()/free() で、
という使い方をしています。
やはり C++ から完全に malloc()/realloc()/free() を排除しないほうがよいかと。

971 :デフォルトの名無しさん:04/10/30 21:38:51
>>968
newは解禁しておいてvectorは解禁しないそのポリシー
その基準は?


972 :デフォルトの名無しさん:04/10/30 21:39:52
>>969
Bjarne Stroustrupのプログラミング言語C++ 第3版に書いてたが、
標準じゃないの?

973 :デフォルトの名無しさん:04/10/30 21:40:41
>>959
vector含めSTLコンテナはデフォルトではstd::allocatorを使ってメモリ割り当てを行っている。
http://www.microsoft.com/japan/developer/library/vclang/memory_allocator.htm
(コンテナのテンプレート引数で指定するので自作のクラスで置き換えることもできる。)

そのstd::allocatorにもrealloc相当の物は(残念ながら)無い。
コンテナでは予めやや大きくバッファを取り、必要に応じてコンストラクタ・デストラクタを起動させ、
バッファの空きが無いときには新たに広いメモリを割り当てて、そこにコンストラクト済みのデータを移動させる、
なんてことをやっている。

974 :デフォルトの名無しさん:04/10/30 21:43:40
>>971
つまり、動的バッファがほしいときは、常に vector を使え、それで十分だ、
ということですか?

975 :デフォルトの名無しさん:04/10/30 21:49:02
>>972
あ、標準でしたか。
次のコードは VC6 ではとおらなくて、VC7.1 ではとおりました。

int main(void)
{
 int* p = new int[10];
 p = new(p) int[20];
 delete p;
 return 0;
}

976 :デフォルトの名無しさん:04/10/30 21:49:48
教えないといけないことがたくさんありそうだ。

977 :デフォルトの名無しさん:04/10/30 21:50:54
>>973
そうですね。VC6 の STL を見るとそんな実装になってる。
これは(ある程度)無駄ですね。
まぁ、realloc() の実装を考えてみると、同じようなことをやってると思うので、
たいしたオーバーヘッドではないのかな。

978 :デフォルトの名無しさん:04/10/30 21:51:34
というわけで、realloc騒動はこれにて一件落着。

979 :デフォルトの名無しさん:04/10/30 21:52:11
>>976
すいません、教えてください。 m(_ _)m
お願いします。

980 :デフォルトの名無しさん:04/10/30 21:52:56
>> 975
あ、delete[] の間違いです。
これは知ってますんで。

981 :デフォルトの名無しさん:04/10/30 22:18:21
まぁ、恐ろしくレベルの低い人間の集まった職場ってのは
なんの分野でもあるわけだ。


お払いしとこ。
南無阿弥陀仏南無阿弥陀仏。

982 :デフォルトの名無しさん:04/10/30 22:51:13
>>975
何か使い方が間違ってる気がするんだけどなあ

コンパイルは通ったよ

983 :デフォルトの名無しさん:04/10/30 23:02:05
delete[]でわ?

984 :デフォルトの名無しさん:04/10/30 23:38:14
>>975
使い方がおかしい。
allocateがp = ::operator new(n * sizeof(T));
constructが::new((void*)p) T();
destroyがp->~T();
deallocateが::operator delete((void*)p);

985 :916:04/10/31 05:19:00
どなたか >>916 にヘルプぷりーず

986 :デフォルトの名無しさん:04/10/31 06:57:28
>>985
Tester<double[n]>


987 :916:04/10/31 07:30:34
>>986 ご回答ありがとうございます。
それは一応試し済みでして、関数に配列を渡そうとすると実際には
ポインタが渡されるため、bcc5.5 で以下のエラーが得られました。
エラー E2285 main.cpp 32:
'Tester<double[20]>::Tester(double *,enum)'
に一致するものが見つからない(関数 main() )

988 :デフォルトの名無しさん:04/10/31 07:40:33
>>987
const Container& mc;

const Container mc;
にしてみれ

989 :916:04/10/31 07:42:22
(続きです、連投すみません)
g++ 3.3.1 (cygwin) ですとコンパイルできて、且つ期待する動作が
得られました。どちらのコンパイラの解釈が標準準拠なのでしょうか。
両方で同じように記述する書き方はないでしょうか。

そして、for loop にしないで直接展開したコードを書いた場合に
コンパイルできてしまうのは一体何故なのでしょうか。最適化による
バグとか……?

いずれにせよ、朝早くのご回答を有り難うございました。
引き続き、情報をお持ちの方は宜しくお願い致します。

990 :916:04/10/31 07:55:42
>>988
ご回答ありがとうございます。
解決策の一つとして考えさせて頂きますが、その方法は、
(vectorなどを引数にした場合など)コンテナ全体のコピーを取ってしまうため
テスタークラスの振る舞いとパフォーマンスが大幅に変わることになります。

デフォルトコンストラクタにアクセスできないために無理やり auto_ptr
を用いている(直接 vector のテンプレート引数にしない) ことからも
わかるように、このテスタークラスは「なるべく変更を加えたくないクラス」
を想定しています。

しかし、貴重な意見に感謝いたします。
スレも残りわずかですが、さらに情報を頂ければ幸いです。

991 :デフォルトの名無しさん:04/10/31 10:35:24
>>990
じゃ、言い出しっぺの法則で次スレ宜しく。切りもいいことだしね。

992 :デフォルトの名無しさん:04/10/31 15:02:09
(a!=b)&&(c!=d)と!((a==b)&&(c==d))は同じなんでしょうか?

993 :デフォルトの名無しさん:04/10/31 15:02:36
>>992
違う

994 :デフォルトの名無しさん:04/10/31 15:07:27
>>992
どう違うんですか?

995 :デフォルトの名無しさん:04/10/31 15:10:25
(a!=b)&&(c!=d)
a!=b かつ c!=d

!((a==b)&&(c==d))
(a==b かつ c==d) ではない
つまり a!=b または c!=d

さらにC++だと呼ばれる演算子がオーバーロードされてたりして・・・。

996 :デフォルトの名無しさん:04/10/31 15:12:14
ドモルガンって今習わないの?


997 :デフォルトの名無しさん:04/10/31 15:13:21
高校で習うよ

998 :デフォルトの名無しさん:04/10/31 15:18:06
>>992
一番簡単な方法は真理値表を書く方法。
例外が一つでもあれば両式は等価とはいえない。
s := (a!=b)&&(c!=d)
s':= !((a==b)&&(c==d))
a b c d s s'
0 0 0 1 0 1
0 0 1 0 0 1
0 0 1 1 0 0
...

両式は等価ではない。

999 :デフォルトの名無しさん:04/10/31 15:29:31
>>990
あなたのコードがやろうとしてることはこういうことじゃない?
#include <iostream>
using namespace std;
template<class Container>
class Tester {
const Container &mc;
Tester();
Tester(const Tester &p);
Tester &operator = (const Tester &p);
public:
Tester(const Container &c): mc(c) {}
void disp() {cout << mc << endl;}
};
void init (Tester <int> *&p) {
int tmp (10);
p = new Tester <int> (tmp);
}
int main () {
Tester <int> *tester;
init (tester);
tester->disp ();
return 0;
}


1000 :デフォルトの名無しさん:04/10/31 15:30:16
>>995
説明ありがとうございました
わかりました
>>996
ドモルガン勉強してみます

1001 :1001:Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。

256 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)