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

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

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

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

【初心者歓迎】C/C++室【環境依存OK】
http://pc5.2ch.net/tech/kako/1059/10590/1059041347.html
【初心者歓迎】C/C++室 Ver.2【環境依存OK】
http://pc5.2ch.net/tech/kako/1067/10671/1067189450.html
【初心者歓迎】C/C++室 Ver.3【環境依存OK】
http://pc2.2ch.net/test/read.cgi/tech/1069719929/ (消滅?)
【初心者歓迎】C/C++室 Ver.4【環境依存OK】
http://pc2.2ch.net/test/read.cgi/tech/1073473867/ (消滅?)
【初心者歓迎】C/C++室 Ver.5【環境依存OK】
http://pc5.2ch.net/test/read.cgi/tech/1077102238/ (html化待ち)
【初心者歓迎】C/C++室 Ver.6【環境依存OK】
http://pc5.2ch.net/test/read.cgi/tech/1082182233/l50

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

2 :デフォルトの名無しさん:04/06/05 03:31
2

3 :デフォルトの名無しさん:04/06/05 03:31
【関連スレ(処理系別)】
★初心者にVisual C++を教えるスレ★ Part12
http://pc5.2ch.net/test/read.cgi/tech/1083585833/l50
C++Builder相談室 Part9
http://pc5.2ch.net/test/read.cgi/tech/1080541814/l50
GCCについて part3
http://pc5.2ch.net/test/read.cgi/tech/1072484422/l50
Turbo C++ 5.0 プログラミング
http://pc5.2ch.net/test/read.cgi/tech/1030878794/l50
タダで使えるBorland C++ Part3
http://pc5.2ch.net/test/read.cgi/tech/1054390397/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
■ VisualC++(MFC限定)相談室 MFC10.dll■
http://pc5.2ch.net/test/read.cgi/tech/1074104008/l50

4 :デフォルトの名無しさん:04/06/05 03:31
【関連スレ(その他)】
C言語なら俺に聞け! Part 81
http://pc5.2ch.net/test/read.cgi/tech/1085806791/l50
C++相談室 part31
http://pc5.2ch.net/test/read.cgi/tech/1086185282/l50
C/C++の宿題は私におまかせくださいませ 23代目
http://pc5.2ch.net/test/read.cgi/tech/1085149383/l50
【C++】template 統合スレ -- Part4
http://pc5.2ch.net/test/read.cgi/tech/1083550483/l50
プリプロセッサについて熱く語るスレ。
http://pc5.2ch.net/test/read.cgi/tech/1058203590/l50
タダで最強!フリーC/C++コンパイラ
http://pc5.2ch.net/test/read.cgi/tech/1035882599/l50
C統合・質問スレッド
http://pc5.2ch.net/test/read.cgi/tech/1068359871/l50
くだらない質問でもべっちょ偉そうに聞いていいスレ
http://pc5.2ch.net/test/read.cgi/tech/1069530956/l50

5 :デフォルトの名無しさん:04/06/05 04:51
>>1


6 :デフォルトの名無しさん:04/06/05 05:42
C#がわからないかわいそうな人たちのスレ

7 :デフォルトの名無しさん:04/06/05 08:26
>>1
dクス

8 :デフォルトの名無しさん:04/06/05 08:37
>>1
乙かれ〜

9 :デフォルトの名無しさん:04/06/05 12:10
void hoge(int &num, ...);
try{} catch(...) {}

引数の「...」には何か意味があるのでしょうか?
書籍とかで調べたのですがのってないです。

10 :デフォルトの名無しさん:04/06/05 12:40
>9
「C C++ 可変個 引数」とかで検索してみな

11 :デフォルトの名無しさん:04/06/05 13:47
>>9
catch(...)ですべての例外を補足することになる。
C++で不定引数を使う場面はこのcatchぐらい。

12 :デフォルトの名無しさん:04/06/05 19:14
>>9
...は、放っておくとコンパイラが勝手に3文字入れて補完してくれます。
「まんこ」なんて文字が当てはめられる事も。

13 :デフォルトの名無しさん:04/06/05 20:13
>>12 ウソはよくないね
これは throw ... を捕捉するためのものね

14 :デフォルトの名無しさん:04/06/05 23:58
BMPからRGB値を取り出して表示させる物が作りたいのですが
どうすればいいでしょうか?

15 :デフォルトの名無しさん:04/06/06 00:00
>>14
RGB値の定義が不明だが、BMPを走査してRGBを取り出して表示すればいいんじゃないの?

16 :デフォルトの名無しさん:04/06/06 00:06
その走査のやり方が分からない初心者なんです
どこか簡単な解説サイトか何かありませんか?

17 :デフォルトの名無しさん:04/06/06 00:31
ここはどうだろう
ttp://black.sakura.ne.jp/~third/system/winapi/win117.html

18 :デフォルトの名無しさん:04/06/06 00:49
int (1), (2), (3);
(1) = 1*hoge;
(2) = 2*hoge;
:

という、ふつー通らないだろと思うコードがあったんだが
これ通るコンパイラって存在したりする?
とりあえず手持ちの、C for AIX(版不明)とgcc 2.95/3.3、VC6(SP6)で
通らなかった。

#だがC++でコンパイルすると宣言だけは通るっぽい。なーぜーだー



19 :デフォルトの名無しさん:04/06/06 01:55
C++で宣言が通るのは int(x)ってのができるから
int(1), (2), (3); → 1, 2, 3;
になるからなんじゃないかな。

20 :デフォルトの名無しさん:04/06/06 15:43
gmpライブラリを使っての質問なのですが、
base expともにgmp数でbase^expを計算させたいとき
expがgmp数のままでbase^expを計算する方法はありませんか?
expがgmp数のままでbase^expを計算しようとすると
warning: passing arg 3 of `__gmpz_pow_ui' makes integer from pointer without a cast
と叱られてしまいます。

もしくは、gmp数をunsigned intに戻す方法をおしえていただけませんか?

21 :デフォルトの名無しさん:04/06/06 15:56
http://www.swox.com/gmp/manual/

22 :20:04/06/06 16:16
unsigned long int mpz_get_ui (mpz_t op)
Return the value of op as an unsigned long.

に書いてあるのだろうということは分かっているんですが、
どう使ったらいいのかわからないんです。

unsigned long int mpz_get_ui (mpz_t amari);
としても、
warning: passing arg 3 of `__gmpz_pow_ui' makes integer from pointer without a cast
としかられて困ってるんです。


23 :デフォルトの名無しさん:04/06/06 17:22
http://www.swox.com/gmp/manual/Integer-Exponentiation.html

24 :デフォルトの名無しさん:04/06/06 17:45
#include <stdio.h>
#include "gmp.h"
int main()
{
mpz_t a, b, c;

mpz_init_set_ui(a, 2UL);
mpz_init_set_ui(b, 128UL);
mpz_init(c);

mpz_pow_ui(c, a, mpz_get_ui (b));
mpz_out_str(stdout, 10, c);
printf("\n");

mpz_clear(a);
mpz_clear(b);
mpz_clear(c);
return 0;
}


25 :デフォルトの名無しさん:04/06/06 19:33
スレ誘導してくださった方ご迷惑をおかけしてすいません。
2回もスレ違いな質問してしまってまたここで質問するのも恐縮なのですが、

C言語で ファイルにカキコミを行う際、
c:\\test\\test.txt
のようにするとTESTというフォルダがある場合はうまくいくのですが、
もともとTESTというフォルダがない場合の書式はどのようにすればよろしいのでしょうか?
当方BCC++を利用しております。
できればUNIXの環境での書式も教えていただけたら幸いです。

あ〜マルチのようで本当に申し訳ない。

26 :デフォルトの名無しさん:04/06/06 19:34
#include<stadio.h>
main()
{
  printf("Hello World\n");
  return 0;
}

ビルドできません
fatal error C1083: インクルード ファイルがオープンできません。'stadio.h': No such file or directory
というエラーが出ますが、どうしてでしょう?
初歩的な質問ですがよろしくおねがいします。

27 :デフォルトの名無しさん:04/06/06 19:36
そりゃ出来ないだろう。
#include <stdio.h>
int main()
{
  printf("釣られた?\n");
  return 0;
}

28 :デフォルトの名無しさん:04/06/06 19:38
>>27
それでできました。
main()の前にintが必要だったんですね

29 :デフォルトの名無しさん:04/06/06 19:39
C言語を無料で公開してるサイト教えれ

30 :デフォルトの名無しさん:04/06/06 19:44
>>25
>スレ誘導してくださった方ご迷惑をおかけしてすいません。
いや漏れが悪い。たらいまわしのようにしてしまってスマン...orz

Windows下では単純に
  BOOL bRtn = ::CreateDirectory("C:\\test\\test", 0);
なのだが...


31 :デフォルトの名無しさん:04/06/06 19:54
#include<stadio.h>
int main()
{
  printf("こんにちは\n");
  return 0;
}

中の文字を変えてやってみたらさっきとおんなじエラーが出ました。
fatal error C1083: インクルード ファイルがオープンできません。'stadio.h': No such file or directory
今度はmain() の前にintをつけているのにどうしてでしょうか?

32 :デフォルトの名無しさん:04/06/06 19:55
>>25
boost::filesystem で出来ると思う

33 :デフォルトの名無しさん:04/06/06 19:55
>>31
さようなら。

34 :デフォルトの名無しさん:04/06/06 20:01
>25
_mkdirってダメだっけ?

int nRtn = _mkdir("C:\\test\\test");

35 :デフォルトの名無しさん:04/06/06 20:01
>31
二段構えの釣りかよ

36 :31:04/06/06 20:05
自己解決しました

satadio.h→stdio.hのところでした

なんか非常にばかな間違えでした
これじゃ釣りに見えても不思議じゃない

37 :デフォルトの名無しさん:04/06/06 20:57
include <stdio.h>
void main()
{
int i;
for(i=0;i<1000;i++)
{
printf(">>31氏ね");
}
}


38 :31:04/06/06 21:01
何で1000回と一定回数にするんだろう? while(1)使えよ低脳w

39 :デフォルトの名無しさん:04/06/06 21:02
>>30さま
>>32さま
>>34さま
ヒントどうもです。
これからいろいろ調べてみようと思います。
どうもお世話になりました。

40 :デフォルトの名無しさん:04/06/06 21:20
あ、あの…
PCを去年の6月に初めて購入した者ですが
プログラミングって何から始めればよいのでしょうか…

41 :デフォルトの名無しさん:04/06/06 21:34
>>39
力になれなくて申し訳ないでつ
気を落とさずにまた来てくださいでつ

42 :デフォルトの名無しさん:04/06/06 22:21
>>40
プログラムの文法よりも
アルゴリズムを学べ

43 :デフォルトの名無しさん:04/06/06 22:29
>>41
まずは、自分がどうしてプログラミングを勉強したいのか、
(あるいは、本当に勉強したいのか) よく考えてみるところから
始めてみてはどうでしょうか。


44 :43:04/06/06 22:31
>>41 でなくて >>40 でした。
失礼しました。


45 :デフォルトの名無しさん:04/06/06 23:10
>>39
最初にスレ違いと言った手前、一応補足。
Unixにはmkdir()がある。Windowsでも_mkdir()が使えるはずなので、それを使うのも手。
いずれにしても、両OSで共通のソースにしたいなら喩え中身が
CreateDirectory()やmkdir()だけでもそれだけで関数にしておくことをお勧めする。
いっそ、その他のOS依存関数もまとめておくと尚いいかと。

46 :デフォルトの名無しさん:04/06/06 23:11
>>40
このスレ的にはC/C++を学びたいと思っていることを前提にすべきかもしれんが、
もし貴方がExcel使いならマクロを登録してVBAから始めるのがいいかも。

47 :デフォルトの名無しさん:04/06/06 23:30
>>45
MkDir系の関数はなんで処理系依存になって、
言語実装されなかったんですかね。
そんな抽象化の難しいもんじゃないような気がするんですが...
MkDir系がダメならOpen系(fopen)もダメだと思うんですが。

48 :デフォルトの名無しさん:04/06/06 23:36
全てのファイルシステムが階層ディレクトリをサポートしているわけじゃないから。

49 :デフォルトの名無しさん:04/06/06 23:47
参りますた。逝ってきます・゚・(ノД`)・゚・

50 :デフォルトの名無しさん:04/06/07 22:24
どうでもいいんだが、size_t 型の t って何だ?

51 :デフォルトの名無しさん:04/06/07 22:27
typoだろ

52 :デフォルトの名無しさん:04/06/07 22:48
size_tanasin

53 :デフォルトの名無しさん:04/06/08 13:58
VisualStudio.Netです。
MFC C++でダイアログベースでアプリを作ってるのですが、
CStirngに格納されたデータ(\r\n入り)を印刷するときに、
DrawTextを使って印刷してるのですが、
複数枚にわたる印刷が出来ません。
どうしたらいいのでしょうか?


54 :デフォルトの名無しさん:04/06/08 14:27
他のとこでも聞いてますがここでも教えて下さい。

キーボードから5人分の年齢身長および体重を繰り返し構文を用いて年齢は1次元配列(age)身長と体重は2次元配列(date)
に読み込み以下の二つの条件を同時に満足するもののデータ(出席番号・年齢・身長・体重)と人数を画面に表示するプログラム
を作成せよ。
条件
1 身長が全員の平均値よりも高い。
2 体重が全員の平均値以下である。

と言う問題なんですが厨房のオレにはさっぱりで
数値や変数の型などは自由で良いみたいなので模範解答みたいのをお願いします。
よろしくお願いします。

55 :デフォルトの名無しさん:04/06/08 14:40
(´ι _` )アッソ

56 :デフォルトの名無しさん:04/06/08 14:47
>>54
#define SUTADIO <stdio.h>
#include SUTADIO
#define mein main
#define mosi if
#define boid void
#define faibu 5
#define wan 1
#define tuu 2
boid mein(){
float caunto;
float age[faibu];
float date[faibu][tuu];
int tincyo_heikin;
int taijuuu_heikin;
for(caunto=0; caunto<faibu; caunto=caunto=caunto+=wan){
printf("年齢 身長 体重? ");
scanf("%f %f %f",&age[(int)(char)(int)caunto],&date[(int)(char)(int)caunto][0],&date[(int)(char)(int)caunto][1]);
}

tincyo_heikin=taijuuu_heikin=tincyo_heikin=taijuuu_heikin=0;
for(caunto=0; caunto<faibu; caunto=caunto=caunto+=wan){
taijuuu_heikin+=date[(int)(char)(int)caunto][1];
tincyo_heikin+=date[(int)(char)(int)caunto][0];
}
taijuuu_heikin=tincyo_heikin=taijuuu_heikin/faibu;
tincyo_heikin=tincyo_heikin=tincyo_heikin/faibu;

for(caunto=0; caunto<faibu; caunto=caunto=caunto+=wan){
mosi(tincyo_heikin<date[(int)(char)(int)caunto][0] && taijuuu_heikin>date[(int)(char)(int)caunto][1]){
printf("年齢%f 身長%f 体重%f\n",*&age[(int)(char)(int)caunto],*&date[(int)(char)(int)caunto][0],*&date[(int)(char)(int)caunto][1]);
}}}

57 :デフォルトの名無しさん:04/06/08 14:52
>>56
出席番号は?(w

58 :デフォルトの名無しさん:04/06/08 15:26
>>53
EndPage
StartPage

59 :53:04/06/08 16:44
>>58 さん
もうちょっとヒントください

60 :デフォルトの名無しさん:04/06/08 16:55
ちっとは検索するとか、自分で頭ひねって考えるとか
してみようとは思わんのかね、まったく・・
趣味グラマにしても、これから勉強始める素人にしても
駄目すぎだろ、それじゃ・・

61 :デフォルトの名無しさん:04/06/08 17:10
MFCはスレ違いだから

62 :53:04/06/08 17:11
>>60
MSDNひっくり返してみてるんですがね、、、
検索も試したんですが、いいのが当たらなくて
"VC++" 印刷
でいいんですよね?

63 :デフォルトの名無しさん:04/06/08 17:53
>>62
だから、スレ違いだって。
VCスレか、MFCスレに逝け。>>3

64 :デフォルトの名無しさん:04/06/08 18:31
#include <stdio.h>

int main(void)
{
int i=32,n=0;
printf("ASCIIコード 10進数 16進数 の順に表示します\n");
while(i<=126)
{printf("%c %-3d (0x%x) ", i, i, i);
i+=1;
n++;
 
  if (n>=5)
{printf("\n");
  }
 }


これを改造して、ひらがなのASCIIコード

http://www.unicode.org/charts/PDF/U3040.pdf

をだしたいのですが、
int i=12353
while(i<=12447)
でやってもうまくいきません。
どうすればいいのでしょうか?
それと、アルファベットのASCIIコードと、ひらがなのASCIIコードを一緒に表示したい場合、
int i=32
while(i<=12447)
となるのでしょうか?

65 :デフォルトの名無しさん:04/06/08 19:18
>>64
>ひらがなのASCIIコード

そんなものはない

66 :デフォルトの名無しさん:04/06/08 19:18
Cの初心者向けの本で勉強しています。

#include <stdio.h>
int main(void)
{
char shimei[] = "Tarou";
printf("%s\n",shimei);

return (0);
}

「printf関数の中の配列shimeiは、全要素を一度に
扱うので、添え字は不要」となっており、
これはなんとなく分かるのですが、
では、このプログラムを

#include <stdio.h>
int main(void)
{
int shimei[] = {1,9,3};
printf("%d\n",shimei);

return (0);
}

と、配列をint型に作り変え、同じように
添え字を省略して、一度に表示できるのでは?と
したのですがうまくいきません。
どうしてなんでしょうか。よろしくお願いします。


67 :デフォルトの名無しさん:04/06/08 19:22
>>66
そんないい加減な本は使うな。


68 :デフォルトの名無しさん:04/06/08 19:25
>>64
int main(void)
{
int i=12353,n=0;
setlocale( LC_ALL, "Japanese");
wprintf(L"ASCIIコード 10進数 16進数 の順に表示します\n");
while(i<=12447)
{
wprintf(L"%c %-3d (0x%x) ", (wchar_t)i, i, i);
i+=1;
n++;
if((n%5)==0)
{
wprintf(L"\n");
}
}
}

69 :68:04/06/08 19:26
アスキーコードでは無いな

70 :デフォルトの名無しさん:04/06/08 19:34
>>68
setlocaleつかうんですか。
もう、初心者向けの本だけじゃダメですね。
リファレンス買わなきゃ。

LSI-C試食版じゃ動かないので、まだ確認はできませんが、
どうもありがとうございました。

71 :デフォルトの名無しさん:04/06/08 20:09
windowsのLightCっての使ってるんですけど、
これってコマンドプロンプトでCのプログラムが実行されちゃうんですけど
不便なんで
メモ帳かどっかに実行結果が出るようになりません?
コピペできる方法でも結構です。

72 :デフォルトの名無しさん:04/06/08 20:42
コマンドプロンプトからコピペ汁

73 :デフォルトの名無しさん:04/06/08 20:48
>hello.exe > out.txt

74 :デフォルトの名無しさん:04/06/09 00:10
>>68
>>69
ひらがなじゃないですよね?

75 :デフォルトの名無しさん:04/06/09 00:18
>>74
文字コードの勉強をし直せ

76 :デフォルトの名無しさん:04/06/09 00:57


77 :デフォルトの名無しさん:04/06/09 01:03
>>75
ごめんなさい。勉強します。

78 :デフォルトの名無しさん:04/06/09 01:26
コンストラクタをオブジェクト生成時以外に呼び出して
初期化をするって方法が、あったような気がしたのですが
なかったでしょうか?

検索して手持ちの本も探してみましたが見つからなくて
javaをちょっとかじってたので勘違いかもしれないのですが

79 :デフォルトの名無しさん:04/06/09 01:50
今手元にパソコンがないので調べられないのですが、
int a;
a=5;
1/2*a;
と、
int a;
a=5;
1/2.0*a;
では計算結果は異なるのでしょうか?

80 :デフォルトの名無しさん:04/06/09 01:53
>>79
上はint型下はdouble型

81 :79:04/06/09 01:58
>>80
ということは計算結果は、2と2.5になるという事ですね!
ありがとうございました!

82 :デフォルトの名無しさん:04/06/09 02:00
>>79
さらにいうと

上  int型  0

下 double型 2.5

1/2=0

1/2.0=0.5

83 :79:04/06/09 02:06
ただの1/2やっただけでも、計算結果は0.5じゃなくて0になるんですね……(汗
うーむわかりにくいですねぇ(笑

84 :デフォルトの名無しさん:04/06/09 02:49
式の評価を優先的にする括弧()の事をなんて言うんですか?
本で調べた所、演算子では無さそうなんですが。
あと、()の中は他の演算子よりも最優先に評価されるのでしょうか?
例えば、
*(pDest++)=*(pSrc++);
のような場合、どの順で評価されるのですか?


85 :デフォルトの名無しさん:04/06/09 02:56
よくある勘違いだが () は結合順位を指定するもので評価順を変えるものじゃないぞ

86 :デフォルトの名無しさん:04/06/09 03:04
素朴な質問を書かせていただきます…
int x;
x=5;
0.5*x;
この場合は計算結果はどのようになるのでしょうか?

87 :デフォルトの名無しさん:04/06/09 03:16
>>86
やってみればいいじゃん。

88 :デフォルトの名無しさん:04/06/09 03:19
>>86
手元にパソコンがないのでできないんですよ(汗
解答よろしくお願いします…

89 :88:04/06/09 03:20
>>86 ×
>>87

90 :デフォルトの名無しさん:04/06/09 03:31
keyword 算術変換
float * int → float * (float)int = float
0.5 * 5 → 0.5 * 5.0 = 2.5

91 :88:04/06/09 03:36
>>90
ありがとうございました!

92 :デフォルトの名無しさん:04/06/09 04:07
適当な初期値を代入した整数型3行3列の行列A,Bに対して、
A+B、A-B,AB、BAを求めよ。
ただし、A、Bの初期値を変えた場合も利用できるプログラムであること。
という問題なんですが・・・
C言語始めたばかりの俺にはさっぱりです。良い例をください。
お願いします。


93 :デフォルトの名無しさん:04/06/09 07:24
>>90
doubleだろ。

94 :デフォルトの名無しさん:04/06/09 10:37
>>92
int a[3][3]とint b[3][3]を用意して、そいつに初期値を定義。
あとは普通に行列の計算。

95 :デフォルトの名無しさん:04/06/09 13:28
>>92
すっとぼけた回答をするなら、
まずはHello worldからはじめて、徐々にステップアップしようよ。
マジレスするなら、
宿題スレへ逝け。

「さっぱり(わからない)」なんてキーワード使う奴は、叩かれて当然。

96 :デフォルトの名無しさん:04/06/09 19:29
「初心者です」、「いまいち」も叩きたくなる。
>>92に言ってるわけじゃないよ)

97 :デフォルトの名無しさん:04/06/09 21:18
>>24さん
返事が遅くなりましたがありがとうございました。
とっても助かりました
感謝感謝です

98 :デフォルトの名無しさん:04/06/09 21:49
86>この場合は計算結果はどのようになるのでしょうか?
計算結果は捨てられます。


99 :デフォルトの名無しさん:04/06/09 22:53
>>85
結合性のことすっかり頭に無かったです。。。
レスありがとうございました!

100 :デフォルトの名無しさん:04/06/09 23:32
結合性というとまた別の意味に。。。

101 :デフォルトの名無しさん:04/06/11 16:45
質問です。
unixでCかC++で文字コードを変換(SJIS<->EUC)したいんですけど)
どうすればいいですか?
nkf使ってsystemで動かすのもナンセンスっぽいし・・・
いいライブラリとかありませんか?


102 :デフォルトの名無しさん:04/06/11 17:00
man 3 iconv

103 :デフォルトの名無しさん:04/06/11 17:27
>>102
あっさり解決しました。
感謝です。

104 :デフォルトの名無しさん:04/06/11 18:19
printf("%0X",hex_value);
に相当する処理をiostreamを使ってやりたいんだけどどうしたらいいですか?
(0x0F -> 0f, 0xFF -> FFみたいに表示させたい)

std::cout << 他の出力 << 16進表示
のように使いたいんでprintfは使いたくないので…


105 :デフォルトの名無しさん:04/06/11 18:35
>>104
int n = 0xff;
std::cout << std::hex << n;

106 :デフォルトの名無しさん:04/06/11 22:15
以下のプログラムをbcc32でコンパイルして
コマンドプロンプトで実行したのですが、
現在の時刻 22:02:45.36
新しい時刻を入力してください :
と出てきます。なぜでしょうか?

同じソースをgccでコンパイルした場合は
きちんと実行できました。

#include <time.h>
#include <stdio.h>
int main(void)
{
time_t time1, time2;
long l;
time(&time1);
for (l=0; l<100000000; l++);
time(&time2);
printf("空ループ1億回の時間: %f秒\n", difftime(time2,time1));
return 0;
}

107 :デフォルトの名無しさん:04/06/11 22:32
>>106
C> time /?

108 :デフォルトの名無しさん:04/06/11 22:43
>>107さん
なにもかわりませんが・・・

109 :デフォルトの名無しさん:04/06/11 22:56
>>108
あー、もしかしてtime.exeって名前にしてない?

110 :デフォルトの名無しさん:04/06/11 23:19
>>109さん
そうですが・・・なにかあるんですか?

111 :デフォルトの名無しさん:04/06/11 23:25
>>110
timeはWindows標準のコマンドなんでtimeって打ってもtime.exeは実行されない

112 :デフォルトの名無しさん:04/06/11 23:35
>>111さんありがとうございます
time.exeからtimer.exeに名前を変えたらうまくいきました
dくすです

113 :104:04/06/12 01:14
>>105
それだと n = 0x0fの時に 0f ではなく f と表示されちゃうんで困ってます。

114 :デフォルトの名無しさん:04/06/12 01:19
%02x

115 :デフォルトの名無しさん:04/06/12 01:22
>>113
<< std::setw(2) << std::setfill('0')

とりあえず表示されるようにはなるだろうけど、たぶん罠に嵌るだろう。

116 :デフォルトの名無しさん:04/06/12 01:23
>>113
とりあえず、マニピュレータ/処理子を使って書式を指定するってことさえ分かれば、
あとは開発環境のマニュアル読むなりC++の教科書見るなり、いくらでも調べられるやん。
当然、桁揃えを指定するマニピュレータもあるわな。

117 :デフォルトの名無しさん:04/06/12 05:37
>>104
boost::formatとかがお勧め


118 :デフォルトの名無しさん:04/06/12 05:45
vc .net 2003で
stlPort-4.6.2をnmake -f vc71.makでビルドするとき、
_STLP_NO_OWN_IOSTREAMSのコメントを外しているとエラーが出てビルド完了しません。
なんとかする方法ありませんか?


119 :デフォルトの名無しさん:04/06/12 05:59
>>118
そのエラーってのが何かわからないと誰も答えようがないだろ?

120 :118:04/06/12 07:30
エラーとは
.\dll_main.cpp(86) : error C2084: 関数 'void __cdecl _STL::__stl_throw_range_erroor(const char*)' はすでに実体を持っています。
.\dll_main.cpp(86) : error C2084: 関数 'void __cdecl _STL::__stl_throw_out_of_range_erroor(const char*)' はすでに実体を持っています。
・・・のようなものがたくさん出てきます



121 :109:04/06/12 08:13
ちっ、指摘しただけじゃ感謝されないかw

122 :デフォルトの名無しさん:04/06/12 08:39
同一人物だと思っていると思われ。
(かといって同一人物のとき両方にレスされると
全部漏れなワケだが...となるワケだが)

123 :デフォルトの名無しさん:04/06/12 13:32
>>122さんのいうとおりです
同じ方だと思っていました
>>109さん>>111さんありがとうございました。

124 :デフォルトの名無しさん:04/06/12 13:47
俺も今読んでて同一人物だと思ってた。

125 :デフォルトの名無しさん:04/06/12 15:35
MFCで初めてプログラミングしているのですが、
超初心者的な質問をさせてください。

ダイアログベースでウインドウを作っているのですが、
もうひとつのダイアログを呼び出すにはどうしたらいいのでしょう?

それと、ボタン押下でアプリケーションを終了させるときは、
DestroyWindowでよいのでしょうか?

126 :デフォルトの名無しさん:04/06/12 19:07
>>125
>>61-63

127 :デフォルトの名無しさん:04/06/12 19:18
最近Cの勉強をはじめました。
本を買って、一つ一つ例題を解いているのですが、scanfの例題をやった所、
本に書いてあるようにはなりません。

#include <stdio.h>
int main(void)
{
inta;

printf("整数を入力してください\n");
scanf("%d\n",&a);
printf("%dが入力されました\n",a);
return 0;
}

にした所、整数を入力した後「○○が入力されました」が表示されません。
なにかまたキーを押すとやっと表示されます。
「scanf」でググったりもしたのですが、要領を得ません。
なぜでしょうか?ご回答いただけたらありがたいのですが。
環境はXPHome LSI-C試食版を使用しています。

128 :デフォルトの名無しさん:04/06/12 19:56
>>127
int a;

129 :デフォルトの名無しさん:04/06/12 19:58
>>127
インタ君

130 :デフォルトの名無しさん:04/06/12 21:19
つーか、標準入力のバッファリングの話だろ?


131 :127:04/06/12 22:50
>>128さん >>129さん
ソースではちゃんと int a; になってました;;

>>130さん
「標準入力 バッファリング」で検索をかけて調べた所、回答がでました!

>scanf() では、正しく入力しても最後の改行文字はバッファの中に残るため、おかしな動作になるときがあります。

とあったので、 scanf("%d",a); と改行を外したら上手く行きました!

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

132 :デフォルトの名無しさん:04/06/12 23:07
int32型って
printf 出力するとき
%d で良いのでしょうか?

133 :デフォルトの名無しさん:04/06/13 10:26
>>132
VCの__int32なら正式には%I32dらしいけど、大きさが同じなんだからただの%dでいいんじゃないの。

134 :デフォルトの名無しさん:04/06/14 01:12
main()
{
int fib[20],i; /*・・・・☆*/

fib[1] = 0; fib[2] = 1;
for (i = 3; i < 21; i++){
fib[i] = fib[i-1] + fib[i-2];
}

for (i = 1; i <21; i++){
printf("fib[%d]=%d\n", i, fib[i]);
}
}

上記☆のfib[20]がどういった効果を持つのか良く分かりません
なぜ20だけで良いのでしょうか?fib[i]と書きそうなものですがこっちだとエラーが出ました。

135 :デフォルトの名無しさん:04/06/14 01:18
ここあたりでも
http://homepage1.nifty.com/toshio-k/prog/c/

136 :デフォルトの名無しさん:04/06/14 15:24
あれ?
fib[20]と宣言したときの要素はfib[0]...fib[19]までだよな?
なんかあぶなっかしいな。

137 :デフォルトの名無しさん:04/06/14 15:27
char型の配列(char str[256]とか)をstd::stringに変換するにはどうしたらいいのでしょうか?

138 :デフォルトの名無しさん:04/06/14 15:30
string(str)

139 :デフォルトの名無しさん:04/06/14 15:43
>>138
char str1[256]を string str2にコピーしたいとき、どうすればよいのでしょうか。
string(str)というのがstr2(str1)という意味かと思いやってみましたができませんでした。

140 :139:04/06/14 15:52
ごめんなさい!できました。ありがとうございました。

141 :デフォルトの名無しさん:04/06/14 16:46
ところで条件とか指定しないループ書くとき
for (;;)
って書く奴と
while (1)
って書く奴といるけど違いは何?
好みの問題?


142 :デフォルトの名無しさん:04/06/14 16:48
>>141
うん。

143 :デフォルトの名無しさん:04/06/14 16:58
>>142
なんだやっぱそっかー。
thx

144 :デフォルトの名無しさん:04/06/14 17:02
while(1) だと条件式が定数なので、賢いコンパイラだと警告されることがある。

145 :デフォルトの名無しさん:04/06/14 17:06
>>141
http://pc5.2ch.net/test/read.cgi/tech/1085806791/889-


146 :デフォルトの名無しさん:04/06/14 18:16
>>144
それって賢いのか?(w

147 :141:04/06/14 20:09
>>144
へーそうなんだ。レスアリガトサン。

>>145
あーあったのか

>>146
初心者がドヂったの注意してくれる点では賢い罠。
確かにそんなの警告出されちゃおせっかいっちゃおせっかいだが。
ま、for(;;)でいっか。


148 :デフォルトの名無しさん:04/06/14 20:33
for(;;)はOKでwhile(1)はNGってなんか変な仕様ですね。

149 :デフォルトの名無しさん:04/06/14 20:52
クラスについてよく分からんのです。
(LPSTR) CHoge::Hoge
という感じにするとHogeの文字列が戻るとして
MessageBox(NULL,CHoge::Hoge,"hoge",MB_OK);
と確認するとしっかり文字列が表示されるんですが、
もう一度
MessageBox(NULL,CHoge::Hoge,"hoge",MB_OK);
とやると、何も表示されないか全く別の文字が出てきます。

何で続けて呼び出すと文字列が出てこないんでそか。

150 :デフォルトの名無しさん:04/06/14 21:09
>>149
>(LPSTR) CHoge::Hoge
>という感じにするとHogeの文字列が戻るとして
ここが怪しい。ソース晒せ。でないと誰にも分からん。


151 :デフォルトの名無しさん:04/06/15 00:45
C++相談室から来ました。向こうであまり相手にされなかったので
こちらにきました。その時の質問をコピペしますが、許してください。
誰か簡単なサンプルソースを作ってもらえないでしょうか?

・ある物の状態を監視
・その状態を表示
といった単純な事がやりたいのですが、その状態を表すクラスを↓のように定義して
class Status{
public:
Status() : dat(0){};
virtual ~Status(){};
void set(int i) { dat=i; }
int is() { return(dat); }
private:
int dat;
};
メイン関数では↓のように作りました。
Status st;
// 監視側
if(ある物の状態==true){
st.set(1);
}
// 表示側
if(st.is()==1){
表示;
}
が、これだと表示側からもdat.set()が呼べてしまうので危険です。
現状ではfriendを使ってやってるのすが、すっきりしません。
こういう場合、普通は(オブジェクト指向的に?)どのように作るものなのでしょうか?

152 :デフォルトの名無しさん:04/06/15 00:57
Statusを監視するだけのクラスを作る
そいつにStatusのポインタを持たせる

以上

153 :デフォルトの名無しさん:04/06/15 01:06
これか。http://pc5.2ch.net/test/read.cgi/tech/1086185282/254
「あまり相手にされなかった」って、お前、レスもらっといて無視してんじゃねぇか。

154 :デフォルトの名無しさん:04/06/15 01:13
確かにレスは頂いて、ちょっとソースを書いて貰うように再度お願いしたのですが
その後何も音沙汰なかったので。加えて周りの方の話題が私にとって
ちょっと高度なので場違いなのかと思いまして・・・

155 :デフォルトの名無しさん:04/06/15 01:16
>>151
> 現状ではfriendを使ってやってる
とりあえずこいつをコンパイルできる状態で晒せ。
あと、どうすればお前が「すっきり」するのかも明記しる。

156 :デフォルトの名無しさん:04/06/15 01:35
>>154
ソース書いてと言われて素直に応じる奴はここにはいないと思う。

157 :デフォルトの名無しさん:04/06/15 01:52
そーっすね

158 :デフォルトの名無しさん:04/06/15 01:59
>とりあえずこいつをコンパイルできる状態で晒せ。
今手元にコンパイルできる環境がないのでソースは晒せません。
申し訳ないです。要はset()関数を呼ぶクラスに対してfriend宣言してるだけです。

>あと、どうすればお前が「すっきり」するのかも明記しる。
いくつかのクラスで共有したいデータがあって、そのデータを管理するクラスを作りました。
そのクラスを使って外にデータを公開したいのですが
単純にis()とかset()とか作るだけでは、ライトを許可したくない
クラスからもライトされる可能性があるので、それを禁止するような作りにしたいのです。
friendを使いたくないのは、ライトするクラスが変わったりすると修正が必要だし
公開したくないメンバまで公開してしまうのに抵抗があり、すっきりしないのです。


159 :デフォルトの名無しさん:04/06/15 02:11
>>158
C++ならconstで万事解決するんじゃね?

160 :デフォルトの名無しさん:04/06/15 02:47
>>151
Status::set()をこんなふうにしてみては?

void Status::set(const ACertainClass& ある物, int i)
{
  if (ある物.状態())  // == true は嫌 (CのFAQ参照)
    dat = i;
}


161 :デフォルトの名無しさん:04/06/15 02:55
>>151 >>158
なんかイマイチやりたいことがわからんが、
>いくつかのクラスで共有したいデータがあ
るんだったらデータを管理するクラス一個作ってほか「いくつかのクラス」とやらは継承したら?
そゆことじゃなくて?
>>159 もいいと思う

・・・っていうかやっぱ漠然としすぎてて良く分からん
もうちょっとでいいから具体的なソース晒せ


162 :160:04/06/15 03:01
ちょっと補足。

>>160だとsetterを呼ぶのは勝手だけど「ある物の状態」がtrueじゃないと
Status::datの値は変更できなくなるでしょ?

メイン関数は
  Status st;
  // 監視側
  st.set(ある物, 1);  // set_if()って名前にした方が良かったかな
  // 表示側
  if (st.is() == 1) {
    表示;
  }
ってなります。

163 :デフォルトの名無しさん:04/06/15 03:03
#include<stdio.h>

struct test{
char name[100];
};

int main(){
struct test i;
char buf[]={'a','b','c'};
i.name=buf;
}

test.c: 関数 `main' 内:
test.c:8: error: incompatible types in 代入

とエラーが出るのですが8行目のどこがいけないんでしょうか?
C言語です。

164 :デフォルトの名無しさん:04/06/15 03:08
>>163 Cでは配列型の代入はできない。

165 :デフォルトの名無しさん:04/06/15 03:12
>i.name=buf;
多分
strcpy(i.name,buf);
でしょ!?

166 :デフォルトの名無しさん:04/06/15 03:13
>>165
char buf[] = "abc";
ならそれでもいいんだけどな。

167 :165:04/06/15 03:20
>char buf[] = "abc";
>ならそれでもいいんだけどな。

へ?何が違うの?:(*゚Д゚)


168 :デフォルトの名無しさん:04/06/15 03:40
'\0'忘れてるからでわ

169 :デフォルトの名無しさん:04/06/15 03:45
>>168
本当だ!こりゃ大変だ!!


170 :デフォルトの名無しさん:04/06/15 06:12
>>163
ネタだな。

171 :デフォルトの名無しさん:04/06/15 09:19
クラスの継承って意味はあるんでしょうか?,
親クラスを変更したくない時、仮想関数を使うとき、MFCで作るとき、くらいしか意味のある使い方が思い付かないんですが…,
わざわざ継承しなくても、同じクラスに機能を追加すればいいんじゃないかと思うんですが、どうなんでしょう?


172 :デフォルトの名無しさん:04/06/15 10:15
>>171
君はクラスの多様性(ポリモフィズム)を知らないの?
クラスAを継承したクラスABは、クラスAとしても使用できる。

ゲームで利用するなら
スプライトを扱うクラスSPRがあり、それを継承した2Dキャラクラを扱うクラスCHARACTER2Dと
ポリゴンで構成された3Dキャラクタを扱うクラスCHARACTER3Dの二つがあるとする。
親クラスであるクラスSPRにはDrawとMove等のメソッドが用意されている。
もうお分かりだが、継承した二つのクラスをSPRクラスとして使用すれば2Dキャラクタと3Dキャラクタの
違いを吸収してくれるため、双方ともただのスプライトとして扱える。

173 :初心者:04/06/15 10:20
const char * から char に変換できないんでしょうか?

174 :初心者:04/06/15 10:21
const char * から char * に変換できないんでしょうか?

175 :デフォルトの名無しさん:04/06/15 10:32
>>174
できるけど多分君は危険な事やろうとしてるから教えない。

176 :デフォルトの名無しさん:04/06/15 10:34
いきなりすみません;

二次元配列のメモリの確保のしかたを教えて欲しいんですが…


177 :デフォルトの名無しさん:04/06/15 10:39
>>171
http://mikata.curiocube.com/oop/index.php

178 :初心者:04/06/15 11:28
>>175
初心者なので、なぜ危険なのかもわかりません。
よろしくお願いします。

179 :デフォルトの名無しさん:04/06/15 11:39
>>178
なぜconstが付いてるかよーく考えろ

180 :デフォルトの名無しさん:04/06/15 13:04
>>175
const char*x="ABC";
char*y=x;
これだとコンパイルエラー(当たり前だが)
でも、
const char*x="ABC";
char*y=(char*)x;//キャストね。
これだとコンパイルエラーにならないし実行も出来る。
だけどむしろ、んなことする意味がない。
だってconstで宣言したってことは最初から

変 更 し た く な い か ら だ ろ !


181 :デフォルトの名無しさん:04/06/15 13:06
↑おっと>>175っつーか>>178だった(汗
175と179はいいこと言ってる。

182 :デフォルトの名無しさん:04/06/15 13:06
>175 まぁちょっとしたアドヴァイスだが、いぢって欲しくないんだconstにした意味
constはずしちゃうと警告とかされずにいぢれちゃうだろ?

183 :初心者:04/06/15 13:07
調べたら初期化は出来ても代入は出来ないということみたいなんですが。


184 :182:04/06/15 13:08
おっと>175っつーか>178だった(W

185 :デフォルトの名無しさん:04/06/15 13:09
>>183
だから何?

186 :初心者:04/06/15 13:11
弄れる方法はあるんですよね?

187 :デフォルトの名無しさん:04/06/15 13:13
あるよ

188 :デフォルトの名無しさん:04/06/15 13:14
でも弄ったら高確率でバグの元になるぞ

189 :デフォルトの名無しさん:04/06/15 13:21
>>184
オモロイ(W


190 :デフォルトの名無しさん:04/06/15 13:22
constなものに代入するな。
代入したくなったら、それは間違っている。
なぜなら、代入されたくないからconstなのだ。
そう肝に銘じとけ>初心者

191 :初心者:04/06/15 13:23
わかりました。諦めます。

192 :デフォルトの名無しさん:04/06/15 16:56
むしろ174でconst char*からchar*に変換したくなって191で諦めた初心者さんが
いったいどういうシチュエーションでそんなことをしたくなったのかが知りたい。

気まぐれでage

193 :デフォルトの名無しさん:04/06/15 17:03
std::stringからCStringに変換するにはどうしたらいいですか?
CString⇒stringはできるのですが・・。

194 :デフォルトの名無しさん:04/06/15 17:31
>>193
std::string ⇒ char* なら
std::string::c_str()

195 :デフォルトの名無しさん:04/06/15 17:41
そうだね。いっかいchar*に変換すればあとは煮るなり焼くなり好きにできるね。

196 :デフォルトの名無しさん:04/06/15 18:10
CとC++の勉強をしたいのですが…
ボーランドCとビジュアルCでは構文が違いますか?

読んだほうがいい本も教えてください。

197 :デフォルトの名無しさん:04/06/15 18:46
>>196
コメントの書き方
VC ---> /*コメント*/ あるいは //コメント
他 ---> /*コメント*/ のみ

198 :デフォルトの名無しさん:04/06/15 19:08
( ゚д゚)…

199 :デフォルトの名無しさん:04/06/15 19:18
VC++6.0、WinMeにて。
ソースコードを修正中、デバッグしようとしたら
'C:\WINDOWS\SYSTEM\KERNEL32.DLL' をロードしました、合致するシンボル情報は見つかりませんでした。
例外処理 (初回) は bt_hoge.exe にあります: 0xC0000005: Access Violation。
というエラーが出ました。
ブレークポイントを挿入すると、どうやらただのforループで止まってしまっているの
ですが、何か思いつく原因はありますでしょうか。

200 :デフォルトの名無しさん:04/06/15 19:19
>>197
bcc でも gcc でも
//コメント
書いてますが何か?

201 :デフォルトの名無しさん:04/06/15 19:23
>>199
ソースさらしてーーーーー!!!!

202 :デフォルトの名無しさん:04/06/15 19:25
/* C/C++のコメント */
// C++とC99のコメント

なわけだが。

203 :デフォルトの名無しさん:04/06/15 19:37
へ〜そうなんだ。
Cしか使えない状況に陥ったこと無かったから知らなかった。
ん?ってかC99っていったい何すか?


204 :デフォルトの名無しさん:04/06/15 19:48
>>196
金がないならフリー版の前者。
金があるなら後者。
おいらは金がないのでVC++はもってない&よくわからん。
が、知人はVC++でプログラム作ってると謎のエラーが多いと言っていた。
いやコンパイルエラーとかランタイムエラーじゃなくて、
VC++自体が固まっちゃうとか・・・。
どうもM$の製品は時に我われの期待を裏切る挙動をするらしい。


205 :デフォルトの名無しさん:04/06/15 20:01
>>196
文法は基本的に同じ。
固有の拡張もあるが、これからはじめる奴が気にする必要は無いだろう。

206 :デフォルトの名無しさん:04/06/15 20:07
>>203
ttp://www.google.co.jp/search?q=C99&ie=UTF-8&hl=ja&lr=

207 :デフォルトの名無しさん:04/06/15 20:35
すいません、部活全員で悩んだんですが知識0でわからず・・・
サイト検索してもその意味がわからず・・・・。。
「VineLinux2.6r4(i386)の環境」ってかいてあったんですが、
これはCPUがインテル386ということなのでしょうか・・・
それとも全く関係ないのでしょうか・・・とつぜん申し訳ありません、
VineLinuxというの自体がわからず、とりあえずプログラミング関係の
サイトだったのでここにこさせていただきました。。

208 :デフォルトの名無しさん:04/06/15 20:40
CPUがインテル386ということ
VineLinuxというのはOS

スレ違い

209 :デフォルトの名無しさん:04/06/15 21:07
Cなんですが宿題をやってもらえませんか?

210 :デフォルトの名無しさん:04/06/15 21:16
>>209
嫌です。

こっちに逝く
ぼるじょあがC/C++の宿題を片づけますYO! 24代目
ttp://pc5.2ch.net/test/read.cgi/tech/1086612317/l50

211 :デフォルトの名無しさん:04/06/15 22:11
>>208
普通はインテル386「以降」って言うよな
>>207
とりあえずLinux板がある

212 :sage:04/06/15 22:52
207です。。申し訳ありません。。そちらのほうへ行ってきます

213 :デフォルトの名無しさん:04/06/16 00:20
CreateWindowExで作ったウィンドウにフォームビューダイアログを貼り付けたいんですが、
ウィンドウのwidth/heightとフォームビューリソースのwidth/heightが合いません。
どうやって合わせたら良いんでしょうか。


214 :デフォルトの名無しさん:04/06/16 00:31
>>213
フォームビューをCreateするときnIDに AFX_IDW_PANE_FIRST を
指定するとMFCが勝手にリサイズ処理をしてくれまつ

215 :151:04/06/16 00:46
具体的な例で話をすると
・キーボードからの入力を監視するクラス
・入力されたデータを管理/保持するクラス(インスタンスは1つとする)
・そのデータを表示するクラス
みたいな物を作りたいとします。

問題はデータを管理するクラスの設計で
setterをコールできるクラスを制限したいのですが・・・
setするクラスを別に定義するのが普通なのかなぁ。

↓晒せと言われたので一応(擬似)ソースです。長くてすんません。

#include <iostream>
using namespace std;

//----- dat.h -----
class Dat
{
public:
char is(){return(key);}
void set(char c){key=c;}
private:
char key;
};
extern Dat DAT;


216 :151:04/06/16 00:47
//----- main.cc -----
#include "dat.h"
class Watch
{
public:
void exec()
{
char key=キーボードからの入力をみる();
if(key){
DAT.set(key);
}
}
};

class Disp
{
public:
void exec()
{
if(DAT.is()){
cout << DAT.is() << endl;
}
}
};


217 :151:04/06/16 00:47
Dat DAT;
main()
{
Watch *w = new Watch;
Disp *d = new Disp;
while(1)
{
w->exec();
d->exec();
}
delete w;
delete d;
}


218 :デフォルトの名無しさん:04/06/16 01:07
>>215
> extern Dat DAT;
これが元凶。こんなのあったらアクセス制御のしようが無い。

219 :デフォルトの名無しさん:04/06/16 02:03
>>151etc.
>218の言うとおり。
そして>160で解決でしょう。
あともし継承つかうなら、
1. class Dat の中の set() を virtual にする
2. class Dat の中の key を static にする
3. class Watch と class Disp は Dat を継承
4. class Watch の中で set をオーバーロード
でどうでしょう?
要は Disp で set() を呼び出せないようにしたいと解釈したんだけど。


220 :デフォルトの名無しさん:04/06/16 02:06
↑オーバーライドだった

221 :デフォルトの名無しさん:04/06/16 02:35
鍵はconstのような希ガス。

222 :デフォルトの名無しさん:04/06/16 02:45
>>214
サンクス
んでもスンマソ、現状MFC使わずにやってるんで、このまま使わずにやってみたいんですわ。

223 :デフォルトの名無しさん:04/06/16 03:13
オーバーライダー

224 :デフォルトの名無しさん:04/06/16 03:21
>>172
ポリモフィズム・・・。ポリモーフィズムって覚えてたよボク・・・。
なんかコンピュータ用語って「−」をryすけど、これってどうゆうこと?
>219のオーバーロードなんてオバロドじゃん。
あ、英語のスペルで書いたときrのせいで伸びちゃうやつだけryすの?
そういやコンピュータはコンピュタじゃないな。
とふと思ってぐぐってみたよ。
ポリモフィズム の検索結果 約 856 件中 1 - 10 件目 (0.20 秒)
ポリモーフィズム の検索結果 約 1,930 件中 1 - 10 件目 (0.24 秒)
ポリモーフィズムのが多いね・・・。
この辺の事情に詳しい人いますかぁ?

225 :デフォルトの名無しさん:04/06/16 03:29
ポリモルフィズムって勢力もあるよ。

あとはこの辺
http://www2u.biglobe.ne.jp/~standard/faq/faq505.htm

226 :デフォルトの名無しさん:04/06/16 04:03
>>225
勉強さすていただきましたー!!


227 :デフォルトの名無しさん:04/06/16 04:23
少し長いので大分省略して書きますが、
class Base{
friend class Hoge;
protected:
virtual void Draw(引数);
};

class A:public Base{
friend class Hoge;
private:
void Draw(引数);
あといくつかの関数と変数
};

class Hoge{
public:
A a[64];
Base *base[256];
};

みたいなかんじで書いて
Hogeのなかで

base[0]=&a[0];

と、したときに
base[0]のvfptrがNULLになってしまい
Drawを呼べなくなってしまいます
解決法をご教授願います

228 :デフォルトの名無しさん:04/06/16 08:39
>>227
Hogeのなかで

base[0]->Draw(引数);

でちゃんと呼べたけど…(gcc 3.3.1 cygwin)
他のところで間違ってるんじゃない?


229 :デフォルトの名無しさん:04/06/16 10:15
linuxとgccを使ってプログラムを作っているのですが、プログラムの中から自分自身が置かれているディレクトリのフルパスを取る方法を教えてください。

実行する時のカレントディレクトリは実行ファイルが置かれているディレクトリではないです。

簡単なのかも知れませんが本当に困っているのでよろしくお願いします。

230 :デフォルトの名無しさん:04/06/16 10:29
システムコールにあるのかもしれないが、
popen("type -p argv[0]","r");
こんなアプローチでどうだろう?

231 :デフォルトの名無しさん:04/06/16 10:38
>>229
シンボリックリンクを通して実行した場合はどうするの?
やっぱりシンボリックリンクが示す本体の場所が知りたいの?

232 :デフォルトの名無しさん:04/06/16 11:05
>>231
今のところシンボリックリンクから呼び出されることはない予定です。

233 :デフォルトの名無しさん:04/06/16 11:08
>>232
じゃあ>>230でいいんじゃないかな。
ただしargv[0]は置き換えて。

234 :デフォルトの名無しさん:04/06/16 16:35
>>230-233
Windowsで229とおんなじことしたい場合も同様にできるんですか?
それともAPIがあるんでしょうか?

235 :デフォルトの名無しさん:04/06/16 17:26
みんなコンパイラ何使ってる?

236 :227:04/06/16 17:55
>>228さんありがとうございます。
他のところも一応調べてみたのですが
どうも間違ってるようには感じられませんでした。
あいまいな聞き方かもしれませんが
vfptrがNULLになってしまう、考えられる要因を
教えていただけませんでしょうか。
後、遅れましたが環境はVC++6.0です。


237 :デフォルトの名無しさん:04/06/16 18:03
一回、同様の現象が起こるはずのミニマムなソースを書けば?
それで起こらなかったら確実に元ソースが悪い。デバッグで追っていくか差異を調べる。
もし起こったらおそらくどっちのソースも悪い。そのソースをここに貼って指摘を待つ。

238 :デフォルトの名無しさん:04/06/16 18:06
ターゲットが95の場合、ビルドも95じゃないとダメ?

239 :227:04/06/16 18:44
すいません、解決しました。
クラスの初期化の方法に問題があったようです。

240 :デフォルトの名無しさん:04/06/16 19:15
string型をchar*に変換するには何をつかえばいいんですか?

241 :デフォルトの名無しさん:04/06/16 19:22
>>240
おそらくあなたが望んでいるのは c_str()でしょう。
もちろん入門書の類は持ってますよね。
あとは索引からc_strのページを見つけて、読んでください。

242 :デフォルトの名無しさん:04/06/16 19:31
C言語でコンソールアプリを作っているのですが、
ディレクトリの存在を確認する方法ってありますか?
OSはXPです。system関数などでDOSのコマンド使っても
いいのですが。batファイルなんかだとif exist ....
ってのがありますが、これはsystem関数からは使えない
ようです。C言語の標準にも確認する関数はないですよねぇ?
できるんでしょうか。

243 :デフォルトの名無しさん:04/06/16 19:37
chdir

244 :242:04/06/16 20:40
mkdirやchdirで、在る無いにかかわらず無理やりやる
方法もあると思いますが、その場合、存在しないと
エラーでシステムからメッセージが表示されちゃうん
ですよね・・・。エラーださないで、チェックだけを
する方法ってないもんですかねぇ。

245 :デフォルトの名無しさん:04/06/16 20:49
VC++スタンダード使っているけど、空のデフォルトコンストラクタが律儀に呼ばれてしまいます。
オプティマイザの付いているVC++Professionalだとちゃんと抑制されるんでしょうか?
その他、あまりにバカなコード生成に泣きたい思いです。


246 :デフォルトの名無しさん:04/06/16 20:57
>>245
タダで使えるVisual C++ $2
http://pc5.2ch.net/test/read.cgi/tech/1086287039/l50
最適化付Pro版が手に入る

247 :デフォルトの名無しさん:04/06/16 21:13
>>244
漏れなら、標準にこだわらず素直にWin32 API使う。そもそもchdirも
nkdirも標準じゃないんだし。

>>245
VS2003だと、debugだと呼ばれて、releaseはきれいになくなったよ。

248 :デフォルトの名無しさん:04/06/16 21:13
>>242
GetFileAttributesはどう?
ファイル名を指定して失敗したら-1を返す。ただし符号なしのDWORD型w

#include <windows.h>
#include <stdio.h>
int main(int argc, char **argv)
{
  if (GetFileAttributes(argv[1]) == (DWORD)-1)
    printf("ファイルはない");
  else
    printf("ファイルはある");
  return 0;
}

249 :242:04/06/16 21:48
みなさんレスどうもです。
やはりファイルシステムは処理系依存だから標準では
どうにもならんですか。素直にAPIとか使うしかないですね。
ちなみに
system("mkdir");
system("cls");
で、もしディレクトリ既存のエラーがでても一瞬出てすぐ消せますね(w。

余談ですが、C++のBoostにfilesystemってのがあるようですが、あれだと
チェックができてなおかつ移植性があったりするんですかね・・・。

250 :デフォルトの名無しさん:04/06/16 22:01
ディレクトリも扱えないコンパイラってどんなの?
見たことないな

251 :デフォルトの名無しさん:04/06/16 22:14
>>242
バッチコマンド使いたかったらcmd.exe経由で動かせばsystem()からでも使えなくはないけど…
APIで事足りるならそのほうがいいと思います。
つーか、system()使うとそれだけでDOS窓開くしねぇ。

252 :デフォルトの名無しさん:04/06/16 22:31
>>249
エラー出力のリダイレクト
http://homepage2.nifty.com/winfaq/c/hints.html#548
system("mkdir 〜 2> NUL")
でも俺のWin98では無理だった……
他には一時的に文字の色を背景色と同じ色に変更してmkdirを使うとかw

253 :デフォルトの名無しさん:04/06/16 22:38
* MAKEDIR.C: _mkdir 関数を使用して、ディレクトリを作成後、
 * _rmdir 関数を使用して、ディレクトリを削除します。*/

#include <direct.h>
#include <stdlib.h>
#include <stdio.h>

void main( void )
{
   if( _mkdir( "\\testtmp" ) == 0 )
   {
      printf( "ディレクトリ '\\testtmp' が正常に作成されました。\n" );
      system( "dir \\testtmp" );
      if( _rmdir( "\\testtmp" ) == 0 )
         printf( "ディレクトリ '\\testtmp' が正常に削除されました。\n"  );
      else
         printf( "ディレクトリ '\\testtmp' が削除できません。\n" );
   }
   else
      printf( "ディレクトリ '\\testtmp' が作成できません。\n" );
}

254 :デフォルトの名無しさん:04/06/16 23:26
unixのc++でスレッド書いてるんだけど
windowsのWaitForSingleObject
みたいに休止できるできるやつってありますか?
pthread_cond_waitとかはなんか違うっぽいし・・・

255 :デフォルトの名無しさん:04/06/16 23:37
オススメはpollかなあ

256 :151:04/06/17 00:01
レスが遅くてすいません。

>>218
確かにそうですが、まぁ例と言うことで。

>>219
>4. class Watch の中で set をオーバーロード
は 「class Dispの中で」での間違いでしょうか?
Watchの中でオーバーライドするとDAT.set()が呼べないと思うのですが・・・

>要は Disp で set() を呼び出せないようにしたいと解釈したんだけど
その通りです。

257 :229:04/06/17 00:27
家に帰ってから>>230の中にあったシステムコールというキーワードで調べたら
http://x68000.startshop.co.jp/~68user/unix/pickup?realpath
という所が見つかって無事に目的を達成できました。

皆さんどうもありがとうございました。

258 :デフォルトの名無しさん:04/06/17 01:04
>>257
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/realpath.3.html
↑ここには、「この関数は決して使わないこと。」なんて書かれてるな。

259 :デフォルトの名無しさん:04/06/17 01:05
>>234
Windowsなら、GetModuleFileName(NULL,... でいける。

260 :234:04/06/17 02:14
>>259
ありがとうございます!
実は密かにけっこう前から謎だったんで助かりました!!

261 :219:04/06/17 02:39
>>256
>Watchの中でオーバーライドするとDAT.set()が呼べないと思うのですが・・・
えーと、いちおう Dat DAT; ていう変数自体使わない方向性で継承の手順書いて見たんだなぁ。
ちょっと言葉がたりなかったかな?(反省)
set 呼ぶときは Watch::exec() のなかで
>DAT.set(key);
の部分をただ単に
set(key);
って書く感じ。(オーバーライドしてあれば書けるでしょ?)
そうすると、set は Watch の中で「敢えて」オーバーライドしない限り使えない。
→つまり Disp の中では使えない。
っていうのが実現されるかなぁと。

もし Watch クラスの方は逆に Dat の key を読めないようにしたいなら、継承するとき private にするなり、Dat::is() を virtual にして Disp でオーバーライドするなり微調整してみては?

だいたい継承使わなくても>160+>162の方法じゃ納得いかないの?
結局アクセス制御の点では似たようなことになると思うんだけど。

262 :218:04/06/17 03:23
>>256
> 確かにそうですが、まぁ例と言うことで。

突っ込まれて「例と言うことで」で済むようなソース晒しても意味無いだろうが。
何で「ソース晒せ」と言われたかわかってんの?

263 :160 and 162:04/06/17 04:33
>>215-217の例だと該当部分はこうなるのかな。

//----- dat.h -----
class Dat {
public:
  char is() const { return key; }
  void set(char c) { if (c) key = c; }
private:
  char key;
};

//----- main.cc -----
#include "dat.h"
class Watch {
public:
  void exec()
  {
    char key = キーボードからの入力をみる();
    dat_.set(key);
  }
private:
  Dat dat_;
};


ちなみに>>215-217だと>>151でいう「ある物の状態」の「ある物」と
Dat::set()の引数が同じだけど本物でもそうなの?


264 :263:04/06/17 05:50
ちょっと訂正&追加

//----- main.cc -----
#include "dat.h"
class Watch {
public:
  void exec(Dat& dat)
  {
    char key = キーボードからの入力をみる();
    dat.set(key);
  }
};
class Disp {
public:
  void exec(const Dat& dat) const { if (dat.is()) std::cout << dat.is() << std::endl; }
};

int main() {
  Watch w;
  Disp d;
  Dat dat;
  while(1) {
    w.exec(dat);
    d.exec(dat);
  }
  return 0;
}



265 :デフォルトの名無しさん:04/06/17 06:42
VC++ .net 2003です。
switch文のラベルにマクロを使うと、
「error C2143: 構文エラー : ':' が ';' の前にありません。」
となりコンパイルが通りません。

例)
#define UM_TEST (WM_USER+1);
(中略)
switch(message)
{
case WM_COMMAND:
break;
case WM_CLOSE:
case UM_TEST: ←この行でエラー
default:
return ....
}

なお、ラベルのUM_TESTをWM_USER+1と記述すると正しく動きます。

266 :デフォルトの名無しさん:04/06/17 06:47
>>265
ネタ?

> #define UM_TEST (WM_USER+1);
↑の末尾のセミコロンを取り除け。

267 :デフォルトの名無しさん:04/06/17 06:54
>>266
ほ、ほんとだ・・・
寝ぼけてました。
すみません。
出直してきます。
かなり恥ずかしいですね・・・

268 :デフォルトの名無しさん:04/06/17 22:22
glibc2ならrealpathは使っても大丈夫なんじゃない

269 :151:04/06/18 01:07
>>261
class Watch : public Dat
class Disp : public Dat
と継承するという事ですよね?

>そうすると、set は Watch の中で「敢えて」オーバーライドしない限り使えない。
>→つまり Disp の中では使えない。
ここが意味が分からないのですが・・・
継承してるならオーバーライド「しない」状態でDat::set()が使えると思うのですが。

>Dat::is() を virtual にして Disp でオーバーライドする
同様に↑もよくわかりません。
私が何か勘違いしてるんでしょうか。

>>262
実際はDATにシングルトンパターンを使っているので
それ程大きな問題にはならないと思っています。
(#define DAT Dat::instance()とかしてる)

>>264
コンパイルできる環境がないので試せないのですが
constを付けるとDisp::exec()でdat.set()は呼べなくなるという事ですか?


270 :デフォルトの名無しさん:04/06/18 02:44
>>269
>class Watch : public Dat
>class Disp : public Dat
>と継承するという事ですよね?
そうそう。

>継承してるならオーバーライド「しない」状態でDat::set()が使えると思うのですが。
また説明足らなかった・・・。混乱さしてスマソ。
virtual にして =0 つけないと意味無かったね。
純粋仮想関数っていうんだっけ?オーバーライドしないと使えない奴。
まあ継承ってのはちょっとした思い付きで言っただけだから、
>すっきり
は組めないかもね。

>>>264
>コンパイルできる環境がないので試せないのですが
>constを付けるとDisp::exec()でdat.set()は呼べなくなるという事ですか?
そうだよ。まー>264はキレイな回答だとおもうしこれで
>すっきり
したらいいんじゃない?ダメなら継承も考えてみるけど。

271 :270:04/06/18 02:55
あ、今思ったけど純粋仮想関数ってオーバーライドしなきゃいけないんだったっけ。
そうすると Disp::set() も書かなきゃいけないから、定義のしかたで書き換えできないようには出来るけどかなり微妙だな・・・。
こりゃすっきりしないかもね。すっきりするにはコーディングの変更が多そうだ。やっぱ264にしといたら?

272 :デフォルトの名無しさん:04/06/18 03:01
>>271
>あ、今思ったけど純粋仮想関数ってオーバーライドしなきゃいけないんだったっけ。
をい、んなこと当たり前じゃない毛。おまえレベル低すぎ。

273 :151:04/06/18 03:02
>>270
>そうだよ。まー>264はキレイな回答だとおもうしこれで
これが本当ならかなりビックリです。
コンパイラがメンバ関数の中身まで見てるとは思えないのですが・・・
明日試してみます。 

>あ、今思ったけど純粋仮想関数ってオーバーライドしなきゃいけないんだったっけ。
了解です。そもそもDatをWatchに継承するのはfriendを使うより抵抗があります・・・

274 :デフォルトの名無しさん:04/06/18 03:22
>コンパイラがメンバ関数の中身まで見てるとは思えないのですが・・・
コンパイラはメンバ関数の宣言を見ている。
char is() const ←これ
void set(char c) ←こっちは const がない
そうすると Disp::exec の引数 const Dat& のインスタンスは is を呼べても set を呼べない。

275 :デフォルトの名無しさん:04/06/18 06:19
>>269
> 実際はDATにシングルトンパターンを使っているので

アクセス許可の観点からは、externと同レベルだと思うんだけど。

276 :264:04/06/18 06:35
>>273
>>そうだよ。まー>264はキレイな回答だとおもうしこれで
>これが本当ならかなりビックリです。

もしかしてネタで書いたコードだと思われてたのか?
そうか、だからスルーされ続けてたのか。

277 :151:04/06/19 01:28
>>275
それはその通りですね。

>>274
なるほど!謎が解けました。
実際やってみましたが、set()を呼ぶとエラーになりました。

>>276
無視してたわけじゃなくて、正直理解できなかったんです。申し訳ない。
ただ実際にはexec()の引数にはできないので
もうちょっと工夫してみます。
ありがとうございました。


278 :デフォルトの名無しさん:04/06/19 11:01
以下のようなプログラムを組みました。
-20%7の出力結果を1にしたいのですが
どうやったらいいのでしょうか?

#include <stdio.h>
int main(void)
{
int t;
unsigned int s;
t = -20%7;
s = -20%7;
printf(" signed unsigned\n");
printf("-20%%7=%d -20%%7=%d\n",t ,s);
t = 20%7;
s = 20%7;
printf(" 20%%7=%d 20%%7=%d\n",t ,s);
return 0;
}

279 :デフォルトの名無しさん:04/06/19 12:17
わりざんできますか?

280 :デフォルトの名無しさん:04/06/19 12:38
>>279
???
なんのこっちゃ?

281 :デフォルトの名無しさん:04/06/19 12:51
>>280
20 ÷ 7 = 2 あまり 6

282 :デフォルトの名無しさん:04/06/19 12:57
あってんじゃん
-20/7=-2 あまり 1だけど?

マイナス20なんですけど・・・

283 :デフォルトの名無しさん:04/06/19 13:16
余りの定義って、常に正数なの?

284 :デフォルトの名無しさん:04/06/19 13:19
正数で割った時はそうだす
だから困ってんです。
Cでもあまりは正で出力されるとばかり思ってたから・・・


285 :デフォルトの名無しさん:04/06/19 13:36
>>282
-20 = 7*(-3) + 1
だから -3 余り 1 じゃね?

余りは常に正と言うんなら(t+7)%7で求まると思うが。

286 :デフォルトの名無しさん:04/06/19 13:50
すまんかった
-20=7*-3 + 1だ
-2じゃ、なかたよ
いちいちif文書くのめんどくさっておもったんだ
cの規格に何とかする方法があればそっち使いたいなーって

287 :デフォルトの名無しさん:04/06/19 14:15
整数除算
ttp://seclan.dll.jp/c99d/c99d05.htm#dt19990607

俺の環境では、非C99の場合 -20 % 7 == 6

288 :デフォルトの名無しさん:04/06/19 14:17
>>281-282
お前らちゃんとCの勉強してから文句言え

289 :デフォルトの名無しさん:04/06/19 14:37
こいつらすげーあほだ・・・。

290 :デフォルトの名無しさん:04/06/19 16:34
< おれもおまえもなああああぁぁぁぁぁ!!

  ∨∨∨∨∨∨∨∨∨∨∨∨∨∨∨∨∨∨∨∨∨


         |:\             |:\
         |::: \           |:::: \
         |::::  ヽ          |::::::: │
         |:::::::  丶――⌒゙゙^ ̄ ̄    │
        /:::::::      _,,,,__,_,  U  , , ,,,丶
      /::::::::::::   z-/^   丶  // ̄ ̄\|
     /:::::::::::::::::: ..彡│   ● |l ‖   ● |
   /::::::::::::::::::::  人i‖      》  |      |
  {:::::::::::\\J     .\_,,,,,u= ⌒ \_,,,,,__/\
  |::::::::::::::::::)  (          ⌒        |
  |::::::::::::::::/ /∩ // ̄ ̄\,,,,,____,,,\.  |
  {:::::::::::::::    |  |\/┘┘┘┘┘┘|/| .│ .|
  |:::::::::::::::      |lllllllllllllllllllllllllllllllllllllllllllll| |    |
  |:::::::::::::::      | ⌒\⌒\llllllllllllllllllll| |    |
  {:::::::::::::::      |.    \    |lllllllllll| |   |
   |:::::::::::::::  |   |     ヽ   |lllllllll| |   |
   \::::::::::::::: │   |     │   |lllllll| |  |
    \:::::::::::::: \  |∧    │   |lllllll| |  |
    /:::::::::::::::  \ \\       \∧.  |
  /::::::::::::::    :::\ \\┐┐┐┐┐ \ \
/:::::::::::::::     ::::::::::::\  ゙゙^^¨゙゙^^¨^゙゙¨¨゙゙¨^゙) \



291 :デフォルトの名無しさん:04/06/19 22:30
div()

292 :デフォルトの名無しさん:04/06/20 00:34
フォームビューを複数作ってそれらを複数一緒にメインウィンドウに貼り付けるのは無謀な行為でしょうか。
ウィンドウ全体にかかるフォームAと
その一部がその他のフォームでも使用されるフォームB.
両方ともWinMainでCreateDialogすると、CreateDialogの順番によって動作が変わり、
Aが表示されてBが見えずAB両方にアクセスできる場合と、
ABともに表示されてBにアクセスできない場合とに分かれます。
(BはAやその他で使うカラーテーブルのフォームで、Bの操作でAの動作が変わるように考えてます)

自分としては、AにBがそのまま乗るような動作を期待してるんですが、どうもうまくいきません。
この場合、どうしたらいいんでしょうか。

293 :デフォルトの名無しさん:04/06/20 02:37
>>292
スレ違い。
WinAPIスレあたりで聞いてみたら。

294 :デフォルトの名無しさん:04/06/20 10:23
LinuxでSIGSEGVやSIGFPEなどのエラーシグナルが発生した場合に、C++の例外を送出したいのですが、どうしたらいいでしょう?
シグナルハンドラの中から例外を出してもうまくいきませんでした。。。



295 :デフォルトの名無しさん:04/06/20 11:46
Red Hat Linux 9でプログラムをしているのですが(C言語)
cc test.c
gcc test.c
とするのではなにが違うのでしょうか?

296 :109:04/06/20 12:21
>>295
コンパイラが違う。

297 :デフォルトの名無しさん:04/06/20 12:29
ccはgccへのリンクだろ

298 :デフォルトの名無しさん:04/06/20 18:05
public継承ばかり使っています。
protected/private継承の使い分けを教えてください



299 :デフォルトの名無しさん:04/06/20 18:18
>>298
既存のクラスを実装に利用したい時に使える。
class deck : private deque<card> {...}; // デッキ(トランプの)を実装するのにdequeを利用する。
これとほぼ同じ事が、privateメンバ変数としてそのクラスの
員ん洲箪笥をを持つ事によって実現できるから、あまり使われない。
protected継承は基本的にprivate継承と同じ使い方をするが、この場合deckからさらにクラスを派生させたくて、
そこからもdequeを利用できるようにしたい時に使える。
これはdeckのprotectedメンバ変数としてdequeを持つのに似ている。

300 :デフォルトの名無しさん:04/06/21 00:44
というか、Effective C++とMore Effective C++位読もうや>>Public/Private継承

301 :デフォルトの名無しさん:04/06/21 01:23
CGod //1つしかインスタンスを作れないクラス
CMan //沢山のインスタンスを作れるクラス、かつ全員が同じCGodにアクセスできる
CMan a;
とやるだけでどこかにCGodが1人作られる
その後はCManが何人作られようがCGodは一人
CGodはCManを介さないとアクセスできない
CManが一人も居なくなるとCGodは勝手に消滅する
グローバルオブジェクトを使わずに、こんなことをクラスで構築可能ですか?

302 :デフォルトの名無しさん:04/06/21 01:51
class CMan {
public:
CMan() {
if(!_godref) {
_pgod = new CGod();
}
_godref++;
}
~CMan() {
_godref--;
if(!_godref) {
delete _pgod;
}
}
private:
CGod* _pgod;
static int _godref;
};
int CMan::_godref = 0;


303 :デフォルトの名無しさん:04/06/21 02:19
>>302
_pgod は static じゃなくていいの?
だってさー、

int main() {
CMan * saishonohito = new CMan;
CMan * tsuginohito = new CMan;
delete saishonohito;
delete tsuginohito;
return 0;
}

のとき tsuginohito のデストラクタは何を delete するんだ?
っていうか>>301の言う CGod はどうやって定義するつもり?
>1つしかインスタンスを作れないクラス
っての無茶じゃね?

304 :デフォルトの名無しさん:04/06/21 02:26
叔母加算

305 :デフォルトの名無しさん:04/06/21 02:56
>>304
omaemona-

306 :デフォルトの名無しさん:04/06/21 03:21
普通にシングルトンだな。
手っ取り早くCManの中にstaticでCGod詰め込んどけ。

307 :デフォルトの名無しさん:04/06/21 03:27
神は己の中に居る。

308 :デフォルトの名無しさん:04/06/21 03:41
叔父減算

309 :デフォルトの名無しさん:04/06/21 04:36
>>306
>CManが一人も居なくなるとCGodは勝手に消滅する

310 :デフォルトの名無しさん:04/06/21 04:40
ヒトの都合で神が消滅するとはこれいかに?

311 :デフォルトの名無しさん:04/06/21 04:41
ヒトが神を作り出すから、ヒトが消滅すれば神も消滅する。

312 :デフォルトの名無しさん:04/06/21 04:46
ナルヘソーヽ(´ー`)ノフワーア
でも言えてるな・・・。

313 :デフォルトの名無しさん:04/06/21 10:01
ある負の数をprintf関数で16進数や8進数として出力しようとすると、
でたらめな値が出てくるんだけれど、なぜだろう?

314 :デフォルトの名無しさん:04/06/21 10:03
>>313 ソース見なきゃわからん。

315 :デフォルトの名無しさん:04/06/21 10:13
>>313
%x,%X,%o、それにlやhをつけたものは符号無し整数を相手にする。要するに%uの16,8進数版。

316 :294:04/06/21 11:03
>>294

317 :デフォルトの名無しさん:04/06/21 12:33
>>315
負の値として出力することはできない?

318 :デフォルトの名無しさん:04/06/21 13:26
>>317
「2の補数」で検索するといいかもしれない。

319 :デフォルトの名無しさん:04/06/21 13:43
文字列(CSVデータ)をカンマ区切りに分解して、配列にコピーしようと考えています。
とりあえず、文字列の先頭から1文字ずつ","か"\n"をチェックして文字数分だけループさせるソースを書いたのですが、
もっと簡単な方法は無いでしょうか。

環境はVC++で、MFCは使っていません。



320 :デフォルトの名無しさん:04/06/21 17:17
>>319
strtok()

321 :デフォルトの名無しさん:04/06/21 17:27
>>319
boost::tokenizer使えばあっちゅーまだよ?
インストールがめんどくさいだけだが

322 :デフォルトの名無しさん:04/06/21 21:41
ちょっとスレ違いかもしれませんが質問
Linux+Intel compilerとWinXP+VC6でコンパイルしたオブジェクトファイルを組み合わせてリンクすることは可能でしょうか?

323 :デフォルトの名無しさん:04/06/21 21:50
対応したリンカならできるかもな
そんなのが存在するか知らんが。

324 :デフォルトの名無しさん:04/06/21 22:19
下記のクラスの定義でエラーが出ました。何かがまずいようなのですが、何がまずいのか分からないのです。
コンストラクタで、文字列を解析するつもりです。
lpszBuffには、文字列のアドレスを受け渡してるつもりです。

class DbCardBase{
public:
DbCardBase(LPSTR lpszBuff);
};

DbCardBase::DbCardBase(LPSTR lpszBuff){
char *szBuff;
szBuff = lpszBuff;
};

325 :デフォルトの名無しさん:04/06/21 22:23
出ないけど。

326 :デフォルトの名無しさん:04/06/21 22:40
最近CとC++を始めました。
ポインタはなんとなく理解出来始めたのですが
文字列の扱いに未だ疑問があります。

文字列("abcde")はchar*の変数と同じような働きをしている?というような解説をどこかで見たので、
自分でも色々と試してみました。

cout << *("abcde") << endl;
この実行結果は a になりました(理解しました。)

cout << "abcde"[3] << endl;
この実行結果は d になりました(理解しました。)

cout << &("abcde") << endl;
私の理解ではこれで文字列"abcde"を指すポインタのアドレスが出ると思ったのですが
文字列がそのまま出てしまいます。
私の理解の仕方がおかしいのでしょうか?

327 :デフォルトの名無しさん:04/06/21 22:55
>325
出ないんですか _| ̄|○
となるとエラー箇所が他なのですね。研究します。

328 :デフォルトの名無しさん:04/06/21 22:55
CかC++でURLエンコードできるやつってないですか?

329 :324:04/06/21 22:58
すみません、もう1つ。構造体やクラスのポインタを、
関数の引数として受け渡しするとき、受け側の型は何にすればよいのでしょうか?


330 :デフォルトの名無しさん:04/06/21 23:07
const T&

331 :デフォルトの名無しさん:04/06/21 23:07
>>326
ポインタが理解できているなら文字列も理解できるはず。
逆をいうと・・・(ry

332 :デフォルトの名無しさん:04/06/21 23:35
>>326
うちの環境はアドレス出すなぁ。

333 :デフォルトの名無しさん:04/06/21 23:49
>>332
失礼しました。
私はVC++6.0を使っているのですが、
お手数でなければ貴方の環境を教えて頂けないでしょうか?

334 :デフォルトの名無しさん:04/06/21 23:56
>>303
> _pgod は static じゃなくていいの?
ほんとだ。すたてぃっくじゃなきゃだめです。
間違い。

335 :デフォルトの名無しさん:04/06/22 00:02
>>333
俺も初心者なんだけどprintf使ってやってたらアドレス出た。つーかポインタに&ってどうなの?エロイ人

336 :デフォルトの名無しさん:04/06/22 05:28
>>335
こんなのどうよ?

#include <iostream>

void f(char *buf) {
std::cout << buf << " f-1\n";
}

void f(const char (*buf)[5]) {
std::cout << *buf << " f-2\n";
}

int main() {
f("abcd");
f(&"abcd");
return 0;
}

337 :デフォルトの名無しさん:04/06/22 09:12
クラスの内部で宣言された構造体変数はいつまで有効ですか?
たとえば

class test{
kouzoutai a;
}

int test::pointer{
return(&kouzoutai);
}

int main{
kouzoutai *a;
test test1;
a = test1.pointer;
}

はできますでしょうか?

338 :デフォルトの名無しさん:04/06/22 09:15
>>337
クラスと同じ

339 :337:04/06/22 09:19
>338
ありがとうございます。クラスが解放されるまでは参照可能ということでしょうか?
あと、構造体のアドレスの渡し方って、>337で大丈夫でしょうか??


340 :デフォルトの名無しさん:04/06/22 09:25
>>339
コンパイルできないだろ?

341 :デフォルトの名無しさん:04/06/22 14:16
char a[3][3];
で宣言して
a++;
ってしたらアドレスが3つすすんだんだけど常識?

342 :デフォルトの名無しさん:04/06/22 14:26
>>337
そもそも、クラスメンバの非constな参照/ポインタを返すのはやめとけ。
激しく推奨されない。

343 :デフォルトの名無しさん:04/06/22 14:28
>>342
理由は?

344 :デフォルトの名無しさん:04/06/22 14:37
>>341 a は char[3] を1つの要素とする配列だから。

345 :デフォルトの名無しさん:04/06/22 14:46
a++なんてできないだろ。

346 :デフォルトの名無しさん:04/06/22 14:50
typedefで循環参照やりたいんだけど
どうやって宣言したらいいのですか?
これではおこられます・・・
先行宣言みたいなことできますか?
typedef struct
{
 int n;
 HogeHoge* pHogeHoge;
} Hoge;

typedef struct
{
 int n;
 Hoge Hoge;
} HogeHoge;


347 :デフォルトの名無しさん:04/06/22 16:23
文字列の中の改行の個数を数えるのってどうしたらよいでしょう?

348 :デフォルトの名無しさん:04/06/22 16:45
DOS窓上で、タイマーを作りたいのですが、その場で時・分・秒を変化させることはできないんですか?
デスクトップの向かって右の時計みたいに。


349 :デフォルトの名無しさん:04/06/22 16:59
>>346
typedef struct
{
 int n;
 struct tag_HogeHoge* pHogeHoge;
} Hoge;

typedef struct tag_HogeHoge
{
 int n;
 Hoge Hoge;
} HogeHoge;

350 :デフォルトの名無しさん:04/06/22 17:11
>>348
バックスペースの'\b'を出力するか、
Win32コンソールプログラムならSetConsoleCursorPosition
本当のDOSプログラムならANSIエスケープシーケンスで位置を動すとか

351 :デフォルトの名無しさん:04/06/22 17:37
>>348
改行の代わりに'\r'を出力してみれ。

352 :デフォルトの名無しさん:04/06/22 17:51
クラスの宣言の中で、
char abc!=(クラス名 aaa) const
となっているのは、どういう意味ですか?。
abcになにか入れる?。constは定数にするとの意味ですよね。


353 :デフォルトの名無しさん:04/06/22 18:01
うろ覚えで書かないで、ただしく引用して来い

354 :デフォルトの名無しさん:04/06/22 18:27
>>352
abcには'operator'が入るとしたら、演算子!=の意味を規定する関数。
class test{
int _i;
public:
test(int i) : _i(i) {}
char operator!=(const test &t){return _i != t._i ? 't': 'f';}
};

test a(0), b(1), c(0);
std::cout << a != b << a != c << b != c << '\n'; // tftと表示される。

355 :デフォルトの名無しさん:04/06/22 18:31
すみません。ついでになんですが
ポインタでなければエラーになるみたいなんですが
実態を持つにはどうすればいいのですか?
これだと怒られちゃいます
typedef struct
{
 int n;
 struct tag_HogeHoge HogeHoge;
} Hoge;

typedef struct tag_HogeHoge
{
 int n;
 Hoge Hoge;
} HogeHoge;

356 :デフォルトの名無しさん:04/06/22 18:34
>>355
お前は無限個のint変数を使いたいのか?

357 :デフォルトの名無しさん:04/06/22 18:46
>>350
>>351
おお!\rでできた!
どうありがとうございました。

358 :デフォルトの名無しさん:04/06/22 18:52
>>354
bool operator!=(const test &t) const {return _i != t._i;}
の方がいいんじゃない?

359 :デフォルトの名無しさん:04/06/22 18:55
XP Home のDOSだと、エスケープシーケンスはうまく動作しないですね。

360 :デフォルトの名無しさん:04/06/22 18:56
DOSじゃないもん。

361 :デフォルトの名無しさん:04/06/22 19:00
>>360
そういえばそうでしたね。

362 :デフォルトの名無しさん:04/06/22 19:14
>>355
不可能。
struct a; struct b;
struct a { int n; b _b; };
struct b { int n; a _a; };
これで a, bのサイズがいくつになるかよーく考えてみ。

363 :へろへろ ◆Md2683u98. :04/06/22 21:00
教えて欲しいんですが、IRCのCHOCOAのCCAPIを使いたいのですが、
C/C++のサンプルってありますでしょうか?

VBのサンプルは配布元にあるのですが、、、

よろしくお願いします。

364 :デフォルトの名無しさん:04/06/22 21:05
>>355
Hoge
├int n
└struct tag_HogeHoge HogeHoge;
  ├int n;
  └Hoge(また?)
    ├int n
    └struct tag_HogeHoge HogeHoge;(これもまた?)
      ├int n
      └Hoge(あれ???)
        ├ …
って具合に実態を直接持つと永遠に続いて構造体の大きさを決定できないから無理。

365 :デフォルトの名無しさん:04/06/22 21:23
しかし、クラス(構造体)間の循環参照ってFAQだな。

366 :デフォルトの名無しさん:04/06/23 00:25
それこそFAQだからな。

367 :デフォルトの名無しさん:04/06/23 09:48
>>359
当然,ANSI.SYSは組み込んであるんだろうな?


368 :デフォルトの名無しさん:04/06/23 11:32
関数内で宣言したクラスを、他の関数からも参照するにはどうしたらいいでしょうか。


369 :デフォルトの名無しさん:04/06/23 11:44
>>368
関数外へ移動。

370 :デフォルトの名無しさん:04/06/23 11:51
>369
移動というと、宣言してる行を動かせば良いのでしょうか??


371 :デフォルトの名無しさん:04/06/23 12:39
>>370=368
他の関数からも使いたいなら関数外で宣言しろって事だ。
スコープを考えろ。

372 :デフォルトの名無しさん:04/06/23 17:47
超初心者です。
素数を求めていくプログラムを作ったのですが、
素数じゃない数も吐き出してしまいます。
何が悪いのかわからないので教えてください。

#include <stdio.h>
main()
{
int s,a,b,c;
printf("何個まで求めますか?\n");
scanf("%d",&c);
s=1;a=1;b=0;
while(1){

if(b==c){break;}
else if(s==a){printf("%d・",s);
++s;a=2;++b;}
else if(s%a==0){
++s;}
else if(s%a!=0){
++a;}}
printf("\n\n何か入力すると終了します");
scanf("%d",&c);
return 0;
}

373 :デフォルトの名無しさん:04/06/23 18:24
14行を書き換え
++s;} → ++s; a=2;}

374 :372:04/06/23 18:59
>>373
なるほど、初期値に戻すのを忘れてたんですね。
ありがとうございました。

375 :デフォルトの名無しさん:04/06/23 19:22
CとかC+で関数のことをメソッドって呼んでいる人がいますけど、
メソッドというのは正式な呼び方なんですか?


376 :デフォルトの名無しさん:04/06/23 19:23
正式な呼び方って決まってるの?

377 :デフォルトの名無しさん:04/06/23 19:49
メソッドとは言わない。
メソッドを使うのはVBあがりとかだろう。

378 :デフォルトの名無しさん:04/06/23 20:04
複数のファイルのドロップソースになりたいのですが、
フルパスのITEMIDLISTから、デスクトップのIShellFolderを使い
GetUIObjectOfをすればいいんですか?
それとも、やっぱりIDataObjectを実装しないとならないのでしょうか?

379 :デフォルトの名無しさん:04/06/23 20:05
失礼しました、誤爆です。

380 :デフォルトの名無しさん:04/06/23 20:06
複数のファイルのドロップソースになりたいのですが、
フルパスのITEMIDLISTから、デスクトップのIShellFolderを使い
GetUIObjectOfをすればいいんですか?
それとも、やっぱりIDataObjectを実装しないとならないのでしょうか?

381 :378=379=380:04/06/23 20:07
、、、
ホントごめんなさい。なんでこんなやっちゃうんだろorz

382 :デフォルトの名無しさん:04/06/23 20:09
>>378-381
ドンマイ

383 :デフォルトの名無しさん:04/06/23 20:34
今までCOBOLをやってたのですが、この度Cを始めました。
そこで、構造体・クラス・ポインタ・引数というような壁にぶつかりました。
本当に基礎的な部分は入門書のような本を読んだのですが、
ちょっと難しい使い方されてるようなものになるとさっぱりです。
クラスについてはさっぱりで、ポインタ・引数は無駄なくできているのか分かりません。
初心者でもある程度できるような、良い勉強法等合ったら教えてください。

384 :デフォルトの名無しさん:04/06/23 20:43
CUIばっかりじゃつまらんのでWindowsプログラミングってのをちょっと見てみた

訳分からん型いっぱい・・・

385 :デフォルトの名無しさん:04/06/23 21:52
>>383
俺はポインタは絵に描いて覚えた
大き目の紙をメモリ領域だと想定して
線引いたりしてポインタの働きを視覚的に学んでみた

386 :デフォルトの名無しさん:04/06/23 22:25
>>385
絵に描いて、ですか。
確かに、分からない時には良さそうですね、ありがとうございます。

しかし、構造体の中に構造体へのポインタをいれるような
リンクリスト(うろ覚え)のようなものになると、イメージも曖昧に…

387 :デフォルトの名無しさん:04/06/23 22:56
>>386
その程度のことをイメージできないようじゃこの先つらいぞ。

388 :デフォルトの名無しさん:04/06/23 22:57
>>386
データ構造も絵に描いて覚えましたが何か?


ポインタは頭の中でだけで考えるとまとまりつかない(少なくとも俺は)んで
エクセルの図表使ったりもした
他人には見せられない幼稚な学習法だけどなー

俺の友達なんかは本屋でポインタの解説本、
フィーリングがあったのにぶつかるまで片っ端から立ち読みしてたけど

俺はかなりパーなんでこんなことしながら覚えたけど他の人はもっと上手くやってると思う。

389 :デフォルトの名無しさん:04/06/23 23:36
>>383
>クラスについてはさっぱりで

Cにクラスはない
クラスがあるのはC++

390 :385:04/06/23 23:39
>>387-388
かなり危機的な状態っぽいですが、
絵に描くなりして、分かるまで色々やってみます。
意見ありがとうございます。

391 :383=385:04/06/23 23:43
>>389
一応Cから入って、C++もやるつもりだったので…
説明不足でした、すいません。

392 :デフォルトの名無しさん:04/06/24 00:45
>>377
メソッドはオブジェクト指向の用語だよ。
だからC++のメンバ関数のことを普通にメソッドという。

393 :デフォルトの名無しさん:04/06/24 01:28
馬鹿だね。
C++のスペックではメソッドなんて言い方は使っていないよ。
だからC++では「関数」が正しい言い方。

394 :デフォルトの名無しさん:04/06/24 01:36
だからオブジェクト指向の用語って言ってるやん。
C++におけるメンバ関数はオブジェクト指向言語一般の用語では
メソッドにあたるってこと。

395 :デフォルトの名無しさん:04/06/24 01:42
ttp://www.itmedia.co.jp/dict/programming/object/03629.html

396 :デフォルトの名無しさん:04/06/24 11:10
>>383
猫でものサンプルとかいろいろいじると感覚つかめるよ。
ちなみに漏れもCOBOLやってたけど
いまだに判定の比較間違うときあるよ・・
COBOLとCの判定は逆だからきをつけな。

397 :デフォルトの名無しさん:04/06/24 16:20
多角形の内外判定のCのプログラムサンプルありませんかぁ?
理論はわかるんですが、プログラムが;;

線分の交差判定でやるやつです。

398 :デフォルトの名無しさん:04/06/24 18:40
>>397

理論がわかるなら、
その理論を紙などに日本語で書いて、
それを C のプログラムに翻訳するだけだろ?


399 :デフォルトの名無しさん:04/06/25 00:21
>>397
ここは言語のスレなんで、実装する上で言語上の疑問点が出てきたら
ここで聞いても良いが、宿題丸投げなら宿題スレに逝け。

つか、ちょこっとググっただけで参考になりそうなサイトがいくつか出てきたぞ。

400 :デフォルトの名無しさん:04/06/25 14:19
コンストラクタから呼び出しちゃいけないメンバ関数は、
自身のクラスの仮想関数だけだったっけ?
親クラスのは呼び出してもいいんだよな

401 :デフォルトの名無しさん:04/06/25 16:16
プログラムを起動すると、システムに常駐して
どこかでファイルがクローズされると、その旨をメッセージで表示するような
ものをC言語で作りたいのですが、難しいでしょうか。
環境はRed Hat Linux9 + gcc-3.2.2です。
相当難しいようならば、もうちょっとLinuxの知識をつけてから作りたいと思います。

402 :デフォルトの名無しさん:04/06/25 17:02
Cだけじゃむり

403 :デフォルトの名無しさん:04/06/25 17:06
つーか、「もうちょっと」じゃ絶対無理。

404 :デフォルトの名無しさん:04/06/25 17:54
closeシステムコールの中に書き込む。

405 :デフォルトの名無しさん:04/06/25 18:11
>>401
まずviおぼえれ

406 :デフォルトの名無しさん:04/06/25 23:37
>>400
そんなルールは無い。

407 :デフォルトの名無しさん:04/06/26 00:06
>>406
コンストラクタが完走するまでvtblの構築って終了しないんじゃなかったっけ?
ctor
vtbl-make
vtbl-dele
dtor
って順番なのかなーと

408 :デフォルトの名無しさん:04/06/26 00:47
あるクラスのコンストラクタが実行されるときには、そのクラスの基底クラスの構築は完了している。

409 :デフォルトの名無しさん:04/06/26 00:59
×そのクラスの基底クラスの
○そのクラスの



410 :デフォルトの名無しさん:04/06/26 01:48
>>407
基底クラスの初期化リストの後なら問題なく呼び出せる。
ただしコンストラクタ自身のクラスよりも派生したクラスでオーバーライドされたものは呼ばれない。

411 :デフォルトの名無しさん:04/06/26 17:04
カスタムアロケータってのを書いてみたいのですが
allocator::allocateは以下のように書けばいいのでしょうか?

pointer allocate(size_type n, const void *hint)
{pointer p = malloc(sizeof(T) * n);
for (size_type i = 0; i < n; i++)
new(p+i) T;
return p;
}

MSDNを見たところ、operator new(n)を呼び出せとあるので
コンストラクタの実行はしなくてもいいのかなって思ったりもしてるんですが。

412 :デフォルトの名無しさん:04/06/26 17:11
>>411
コンストラクタの実行はしちゃいけない。

413 :デフォルトの名無しさん:04/06/26 17:48
>>412
そうみたいですね、ありがとうございました。

しかし、コンパイルが通らないのでどこが悪いか分からずサンプルを検索して
http://www.josuttis.com/cppcode/allocator.html
このサイトに行き当たったのですが、
どなたかVC6+STLPortでこのサンプルコンパイルできているひと居ませんか?

自作のアロケータでも、ここのでも同じエラーがでてるので、
VC6じゃカスタムアロケータ対応できないのかなとは思っているのですが。

414 :デフォルトの名無しさん:04/06/26 18:01
書き忘れました、コピーコンストラクタはもちろん修正して、です。

C:\Program Files\Microsoft Visual Studio\VC98\Include\stlport\stl/_alloc.h(503) : error C2784: 'class _STL::allocator<_T
p2> &__cdecl _STL::__stl_alloc_rebind(class _STL::allocator<_Tp1> &,const _Tp2 *)' : 'class _STL::allocator<_Tp> & 用のテ
ンプレート引数を 'class MyLib::MyAlloc<int>' から減少できませんでした。
C:\Program Files\Microsoft Visual Studio\VC98\Include\stlport\stl/_alloc.h(502): クラス テンプレートのメンバ関数 'int *__t
hiscall _STL::_STLP_alloc_proxy<int *,int,class MyLib::MyAlloc<int> >::allocate(unsigned int)' のコンパイル中
C:\Program Files\Microsoft Visual Studio\VC98\Include\stlport\stl/_alloc.h(503) : error C2228: '.allocate' : 左側がクラス、
構造体、共用体ではありません。
C:\Program Files\Microsoft Visual Studio\VC98\Include\stlport\stl/_alloc.h(502): クラス テンプレートのメンバ関数 'int *__t
hiscall _STL::_STLP_alloc_proxy<int *,int,class MyLib::MyAlloc<int> >::allocate(unsigned int)' のコンパイル中

こういうエラーがてるんです。

415 :デフォルトの名無しさん:04/06/28 12:13
この度RedHat7.3(@)からRedHat9(A)へ移行したのですが、
@で問題なく動作していたCGIがAの環境で一部動作しなくなりました。

//環境
@RedHat7.3
gcc-2.96-113
apache-1.3.27-2

ARedHat9
gcc-3.2-2-5
httpd-2.0.40-21.9

原因を調べていくとどうも日付計算部分がエラーを起こしているようです。
一般的な日付計算ですが何が問題なのか検討もつきません。
(ググッたのですが・・わかりませんでした。。gccが原因??)
どなたか教えていただけないでしょうか?よろしくお願いいたします!!

/*-----ソース一部抜粋------*/
#include <stdio.h>
#include <time.h>

struct tm*ptr;
time_tlt;
intNowYY, NowMM, NowDD;

lt = time(NULL);
ptr = localtime(<);
NowYY = ptr->tm_year + 1900;
NowMM =ptr->tm_mon + 1;
NowDD = ptr->tm_mday;

/*----------------------*/

416 :デフォルトの名無しさん:04/06/28 20:53
Visual C++ で DLL を作成しています.
MFC は使っていません.

元は C プログラマではないのに,C で DLL を作っているので
頓珍漢な事を聞いているのかもしれませんが,お願いします.

やりたい事は,ある関数のコールバックを待つ,という事なのですが
どのように待てばいいのかがわかりません.
コールバック関数は,

//set end callback
DLL_SetEndCallback(stream, endcallback, 0);
DLL_Stream_Play(stream);
// ここで待ちたい
// コールバックが発生したら,
// 終了処理にいきたい.

といった感じになるのですが,

ここで endcallback を待つために,どのように待たせればいいのかが
わからないのです.


何かヒントでもいいので頂けないでしょうか?

417 :デフォルトの名無しさん:04/06/28 21:01
>>415
デバッガ使えばわかるだろ

418 :デフォルトの名無しさん:04/06/28 23:19
>>415
最低限、コンパイルが通るソース貼れや

419 :デフォルトの名無しさん:04/06/28 23:44
>>418
通らないか?
まぁ、<がhtmlで不等号に化けてるからそのままコピペしたら通らないが。

420 :デフォルトの名無しさん:04/06/29 00:07
>>419も化けてますねw


421 :デフォルトの名無しさん:04/06/29 00:18
何かと思ったら、&lt という変数のアドレスだったのか。

422 :デフォルトの名無しさん:04/06/29 01:03
スレ違いだったらスマソ
g++でコンパイルしてarでまとめた静的ライブラリが複数あるんだけど
これを1つの静的ライブラリにまとめるにはどうやったらいい?


423 :デフォルトの名無しさん:04/06/29 02:49
>>422
arで展開して、纏めなおし。
やり方はman arしろ。
#tarに似ていると言えば見当つくかな?

424 :デフォルトの名無しさん:04/06/29 09:28
>>423
展開してからやらなきゃ駄目なのかぁ。
やってみます。ありがとう。

425 :415:04/06/29 09:39
>>421
そうなんです。そのまま貼り付けたら文字が変換されてました。
ソース全部は長いのでおかしな部分(ここをはずすと正常にCGIが動きます)
のみ貼り付けました。
コンパイルはエラー無く通るのでTime関数のバグかな?と思ったんですが。。
apacheのバージョンが原因なのか、gccのバージョンが原因なのか検討つきません。


426 :デフォルトの名無しさん:04/06/29 11:37
>>416
何を待ちたいのか書け 

427 :デフォルトの名無しさん:04/06/29 16:15
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1060403548&res=102

にソースを貼りました。

コメント部分が正しいかどうかの判定をお願いします。

それと、いくつかわからないところがあります。

struct tm *tm_now;
は何のために宣言?

now = time(NULL);
は以下のどっちが正しいのですか?
/* 現在時刻を取得 */
/*秒数形式の時刻*/

tm_now = localtime(&now);
は以下のどっちが正しいのですか?
/*now を構造体 tm型の変数に変換する*/
/*時刻形式へ*/

428 :デフォルトの名無しさん:04/06/29 16:37
>>427
> struct tm *tm_now;
> は何のために宣言?

tm_now = localtime(&now);
この関数で使ってるじゃん

now = time(NULL);
/*万国標準時(UCT)の1970年1月1日の00:00:00からの経過時間(秒単位)*/

tm_now = localtime(&now);
/*環境変数TZにより現地時刻に変換(UTC秒→tm型構造体)*/

429 :デフォルトの名無しさん:04/06/29 16:59
>>428
ありがとうございます。

>tm_now = localtime(&now);
>この関数で使ってるじゃん

そうでした。暑さのせいでおかしくなってます・・・



tm_now = localtime(&now);

time関数が返す形式の時刻が代入されたnowから、値を読み出し、
ローカルの時間に変換する。

で良いんですよね?

430 :デフォルトの名無しさん:04/06/29 17:57
環境依存なのか何なのかまったくわからないのですが
windows2000 bccの環境で
-----------------------------
#include <stdio.h>
main(){
int a[100000], i, j, jmax,n;
n = 100000;
for (i = 2; i < n; i++)
printf("%6d", i);
}
}
---------------------------
として実行すると問題なく動くにも関わらず
a[500000] と宣言すると何も出てきません
配列に何か制限でもあるのでしょうか?
(65535とかならなんとなく納得できたのですが・・・)

431 :デフォルトの名無しさん:04/06/29 17:58
スタックが足りてないだけじゃないの?

432 :430:04/06/29 17:59
最後の}が余計でした。
printf("%6d", i);
}
---------------------------
で実行した場合です

433 :デフォルトの名無しさん:04/06/29 18:05
ファイルにデータをバイナリーとして書き込むにはどうすれば良いでしょうか?

ofstraam outClientFile ( "MyFile.dat", io::****);
while ( cin >> Mydata ) { outClientFile << Mydata; }

見たいな感じで出きるんでしょうか? よろしくお願いします。

434 :デフォルトの名無しさん:04/06/29 18:39
>>430
オプションに-lS:200000をたしてみたらどう?
数値はsizeof(一番でかい変数)を16進法にしたもの+αぐらいに

435 :デフォルトの名無しさん:04/06/29 18:40
>>429
に加えて、

tm_now->tm_year+1900
の部分について
現地時間をtm構造体に定義されている各要素に参照渡ししている
というのはわかるのですが、なぜ値(2004)が得られるのかがわかりません。
tm_yearはただの変数ですよね?

436 :デフォルトの名無しさん:04/06/29 18:47
>>435
localtimeがtm_nowのメンバをnowを元にセットしているんだ。
そのnowにはtime(NULL);のところで現在の日付・時刻が入っている。
localtimeはtm_yearには1900年からの経過年数を入れるようになっていて、
今は2004年だから104が入ることになる。
だからtm_now->tm_year+1900で2004が得られる。

437 :デフォルトの名無しさん:04/06/29 19:12
>>436
nowが日本時間であったら、localtimeは日本時間をセットするってことですよね?


438 :デフォルトの名無しさん:04/06/29 19:37
>>437
>>428を声に出して10回読むべし

439 :デフォルトの名無しさん:04/06/29 19:38
>>427
で、時刻を表示するところについての質問です。

for(;;){
if(kbhit()){
break;
}

now = time(NULL);

if(prev == now) /* */
continue; /* */
prev = now; /* */

tm_now = localtime(&now);
printf("現在の時刻は %2d時%2d分%2d秒\r", tm_now->tm_hour, tm_now->tm_min, tm_now->tm_sec);


/* */の3行部分が無くても表示できるのですが、カーソルの動きがちょっとおかしくなります。
この部分は、prev(初期値-1)とnowが同じならば、prev = now;を実行しないという命令ですよね?
この部分が無いことで、なぜカーソルの動きがおかしくなるのかがわかりません。

440 :デフォルトの名無しさん:04/06/29 20:30
>>439
continueの意味を理解してる?
その3行をコメントアウトすると、ループが回るたびにprintfを実行するようになる。
カーソルが常に移動してるから、ちらついて見える。

441 :デフォルトの名無しさん:04/06/29 22:33
>>440
直下の処理のみをスキップするのではなく、
continue以降の処理全てをスキップするんですね。
やっとわかりました。

442 :何度も質問してすいません。:04/06/29 23:19
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1060403548&res=106

>>427
のコメント抜きです。

staticを使うのはなぜでしょうか?

443 :デフォルトの名無しさん:04/06/29 23:46
なくても特に動作は変わらないような……。

444 :デフォルトの名無しさん:04/06/29 23:51
>>442
初期化が最初お一回しか行われないからだろ。

445 :デフォルトの名無しさん:04/06/29 23:53
>>444
×最初お一回
○最初の一回

446 :デフォルトの名無しさん:04/06/29 23:59
>>442
static const char * const week[] = { /* ... */ };
にしておきたいところだね。
で、staticにしないとmain()の実行時に無駄なコピー作業が発生する。

447 :デフォルトの名無しさん:04/06/30 00:25
>>428から>>446で質問に答えてくださった皆さん。
どうもありがとうございました。
とりあえず、一段落つけます。
まだ疑問が残ってますが、そちらは自分で考えてみます。



448 :デフォルトの名無しさん:04/06/30 01:19
>無駄なコピー

気にするな(w

449 :デフォルトの名無しさん:04/06/30 13:25
>>446
何回も呼ばれる関数ならまだしも、mainなら別に問題はないような。

450 :デフォルトの名無しさん:04/06/30 13:39
>>448
これはたまたまmainだからだろ。
質問への回答は446で良いし、448は単なる厨発言じゃねぇかよ。

451 :デフォルトの名無しさん:04/06/30 13:47
>>442はmainなのになぜ?という意味で聞いているのでは。

452 :デフォルトの名無しさん:04/06/30 14:15
>>451
そうかもしれないが、「mainなのに」とは一言も書いてない。
おまえはなぜそう思ったんだ?

453 :デフォルトの名無しさん:04/06/30 15:43
コンソールアプリケーションからやれと言われて、やってる漏れは手遅れか?

454 :デフォルトの名無しさん:04/06/30 17:34
別に。

455 :デフォルトの名無しさん:04/06/30 19:54
すみません。
gcc3.4とgprof-2.15(binutils-2.15)を入れて、実行ファイルのプロファイルを
取ろうとしました。gcc hoge.c -pgとしてa.outを実行すると、
gmon.outが生成されました。もちろんexit()で抜けています。

そこで、gprofを実行すると、
gprof: gmon.out file is missing call-graph data
といって刎ねられます。何が不味いのでしょうか。gccあるいは
binutilsをインストールする時に、なにか特別なライブラリとかを
configureしておかなければならないのでしょうか?

456 :455:04/06/30 20:11
あ、libc_p.aとかとリンクしないとだめっぽいですか?
glibcを入れようとして構築できなかった気が。
すくなくともgcc-2.95とか使ってたときはgprofは使えてました。

457 :デフォルトの名無しさん:04/06/30 22:49
>>455
これは違う?
http://sources.redhat.com/binutils/docs-2.15/gprof/Compiling.html

458 :デフォルトの名無しさん:04/07/01 15:58
出力した文字列を一行だけ消す方法はありますか?
C++です

459 :デフォルトの名無しさん:04/07/01 16:37
出した=画面に表示した なら、ない。
\rとスペースとか、^Hを出力した文字数分とか出力すると
消えたように「見える」端末もあるかもしれないけど、
根本的に出したものは消せない。

460 :デフォルトの名無しさん:04/07/01 16:40
>>459
できないのですか・・・
コンソールアプリで作るのは諦めるべきですか?

461 :デフォルトの名無しさん:04/07/01 18:15
なにをだよ

462 :デフォルトの名無しさん:04/07/01 18:17
>>461
タイマー(´・ω・`)

463 :デフォルトの名無しさん:04/07/01 18:24
ttp://www.kumei.ne.jp/c_lang/intro/no_26.htm
こんなの?


464 :デフォルトの名無しさん:04/07/01 18:24
boost:progress_displayのソースでも見たら?

465 :デフォルトの名無しさん:04/07/01 18:40
>>463
おお!それだ!と思ったらちゃんとうごかない
printf("\x1b[12;10H");
cout << "\x1b[12;10H";
どっちも同じ
\x1bは┘みたいなのになって
その先が普通に表示されます

466 :デフォルトの名無しさん:04/07/01 18:42
>>465
Windows2000以降はANSIエスケープシーケンスは働きません。
boost:progress_displayのソースのようにやりましょう。

467 :デフォルトの名無しさん:04/07/01 18:47
>>466
なんですか?それ

468 :デフォルトの名無しさん:04/07/01 18:51
boost::progress_displayは戻ってないよ。

469 :458:04/07/01 19:13
boost::progress_displayはわかったのですがよくわかりませんでした
>>468
*を追加していってるだけってことですか?

470 :デフォルトの名無しさん:04/07/01 19:20
そうだよ

471 :デフォルトの名無しさん:04/07/03 11:01
以下のようなプログラムを組みました
コンパイルはできるのですが実行すると

Segmentation fault (Core dumped)

と出てしまいます。なぜなんでしょうか?

#include <stdio.h>
#include <gmp.h>

int main(void)
{
unsigned int i;
mpz_t array[10];
mpz_init(array[10]);
for(i=0;i<=9;i++){
mpz_set_ui(array[i], 10);
}
for(i=0;i<=9;i++){
mpz_out_str(stdout, 10, array[i]);
putchar('\n');
}
mpz_clear(array[10]);
return 0;
}

472 :デフォルトの名無しさん:04/07/03 11:16
>>471
for(i=0;i<=9;i++){
mpz_init(array[i]);
}


for(i=0;i<=9;i++){
mpz_clear(array[i]);
}

473 :デフォルトの名無しさん:04/07/03 11:57
>>472さん
ありがとうございます
無事に実行できました

gmpで配列を使う時は要素一つ一つについて
初期化・クリアーをしてやらないといけなかったんですね。
勉強になりました。

474 :デフォルトの名無しさん:04/07/03 12:05
>473
そもそも定義、宣言でない array[配列の数] が明らかにあり得ないと気づけ。

475 :デフォルトの名無しさん:04/07/03 12:31
gmpの説明の16ページ目に
mpz_t sum;
struct foo { mpz_t x, y; };
mpz_t vec[20];

という記述があったので大丈夫かと思いました

mpz_array_init (mpz t integer_array[], size t array_size,
mp size t fixed_num_bits)

これを使うとは思うのですが使い方がわからなかったので
何とか他の方法でできないかと思っていました。

476 :デフォルトの名無しさん:04/07/03 14:48
>>474氏が言ってるのは
>mpz_t array[10];
>mpz_init(array[10]);
           ~↑~
         これのことでは?



477 :デフォルトの名無しさん:04/07/03 15:29
あの、
class A
{
static long ID;
public:
・・・
};

 やった事がなかったもんで、試しにstaticのメンバー変数
作ってみたんですけど、コンパイルエラーになります。
どう使うんですか。
というか使えないんですか?
 入門書調べたけど載っていないもんですから。

478 :デフォルトの名無しさん:04/07/03 15:32
まちがえてageてしまった・・・。
スマソ。

479 :デフォルトの名無しさん:04/07/03 15:36
静的メンバ
http://black.sakura.ne.jp/~third/programming/cpp/cpp41.html

480 :デフォルトの名無しさん:04/07/03 16:12
>>474さん>>476さん

最初に
mpz_t array[10]:
と宣言しましたから

mpz_init(array[10]);
で、arrayの要素がすべて初期化されると思ったんです。

>>そもそも定義、宣言でない array[配列の数] が明らかにあり得ないと気づけ

mpz_init(array[10])で
array[10]を初期化しようとしたわけではないです。

初期化・クリアーをするにはforをつかって一個一個してやるしかないんですか?



481 :デフォルトの名無しさん:04/07/03 16:15
>>475
>mpz_array_init (mpz t integer_array[], size t array_size, mp size t fixed_num_bits)
見れば gmpとやらを知らない俺でも

mpz_array_init(array, 10, 初期値);
って使うのかなという想像は出来るわけだが

482 :デフォルトの名無しさん:04/07/03 16:18
>>480を読んで自分の頭が凝り固まってることを思い知った。

483 :デフォルトの名無しさん:04/07/03 16:20
>>497
ありがd
あれ?478でsageて
入れたはずなのに
ageてる?

484 :デフォルトの名無しさん:04/07/03 17:01
そろそろ>>480氏には
「入門書きっちり読んでから出直して来い」
って言っていいかな?


485 :デフォルトの名無しさん:04/07/03 17:21
>>484
「Cの入門書」って言わないとgmp周りを漁りそうな希ガス

486 :デフォルトの名無しさん:04/07/03 17:53
今日その「Cの入門書」を探して紀伊国屋に行って来たんですが、参考書大杉で
どれが良いのかワカリマセンでした。 
幾つか見た感じだとこれ↓がヨサゲだったんですけど、どうですか?

http://page5.auctions.yahoo.co.jp/jp/auction/e38806429


487 :デフォルトの名無しさん:04/07/04 00:42
C というかプログラム自体最近学び始めたんですけど
今読んでる入門書のサンプルプログラムにはprintf()という関数が頻繁に出てきます
どうやらこれはstdio.hとかいうファイルかその先にソースがあるようですけど
それには画面の右から何ドット目上から何ドット目*nを光らせて文字のようなものを
画面に表示させるとかいう根本的なコードが書かれてるんでしょうか
それとも画面に文字を表示させるというのはコンパイラに標準で備わった機能なのか
OSに標準で備わった機能なのかどうなんでしょう

それと似たような疑問ですが
コマンドプロントで動作するプログラムと
ウィンドウやダイアログにhello worldと表示させるプログラムとでは
根本的な違いというものはあるんでしょうか

ウィンドウやダイアログを表示するプログラムは
コマンドプロントで動作するプログラムを滅茶苦茶複雑にしたもの
と考えていいんでしょうか
それともコンパイラにはこれはコマンドプロント用 これはウィンドウ・ダイアログ用のソフト
と指示を与えてコンパイラはそれぞれ区別してコンパイルしているんでしょうか

初心者が知る必要のないことかも知れませんが
疑問に思い始めるとポインタの基本の章にも身が入りません
誰か教えてください

488 :デフォルトの名無しさん:04/07/04 01:00
>>487
printfなどであれば、OSにホゲホゲという文字を出力してくれ、という風な事となる
その先は画面かプリンタかファイルかはどうでもいい事なので、OSまかせ。
ウインドウのプログラムのほうは、違ってるかもしれないし、同じかもしれない。
どのOSか等でしぼると答えやすいんだが。

489 :デフォルトの名無しさん:04/07/04 01:21
>>488
ウィンドウズを使ってるのでウィンドウズの場合というこになります
OSによって違うのならそれも知りたいような気もしますが

>printfなどであれば、OSにホゲホゲという文字を出力してくれ、という風な事となる
>その先は画面かプリンタかファイルかはどうでもいい事なので、OSまかせ。

それはC言語に OSにホゲホゲという文字を出力してくれ という命令が関数としてではなく
コマンド?として存在しているということですか?


490 :デフォルトの名無しさん:04/07/04 01:30
printfを例にすると、
まず、Cの規格で、printf関数は標準出力に文字列を出力する機能を持つことになっている。
なので、printf関数を書く人間は、その機能を満たすようにプログラミングするわけだが、
具体的にどのようにすれば出力できるか、というのは、OSやコンピュータによって千差万別なので、
その具体的な方法までは決められていない。

printf関数を書く人間は、そのコンパイラが動作する環境でprintfの仕様を満たす方法を調査し、
その方法をもとに関数を書く。

具体的に、文字を表示するのにOSの機能を利用するのかハードウェアを直接操作するのかは環境次第。
Windowsの場合、Windowsがそういった機能を持つシステムの関数を持っているので、
それを利用しているだろう。

491 :デフォルトの名無しさん:04/07/04 01:40
>>489
文字だけなら
ttp://kasai86.ld.infoseek.co.jp/asm/asm2.htm
を見てごらん。ふいんき(<なぜか変換できない)は味わえるよ

492 :デフォルトの名無しさん:04/07/04 01:42
>>490
ダウト。

493 :デフォルトの名無しさん:04/07/04 01:51
「ふいんき」
不陰気、腑陰気、婦陰気


494 :デフォルトの名無しさん:04/07/04 02:03
>>492
ダウト

495 :デフォルトの名無しさん:04/07/04 02:15
printf()は仕様通りに動けば中身は問われないというのは分かりますが
OSのシステムの関数を使ったりハードウェアを直接操作したりするというのであれば
例えばウィンドウズではシステムの関数を使うということですが
ならハードウェアと直接操作することは出来ないのかそれともしないだけなのか

あーなんだろ その
printf()を書く人はC言語の仕様通りになるようにC言語で書くということになるわけで
えーハードウェアを直接操作するという機能は
C言語の仕様外の機能で
ということはC言語じゃないということないなるのかならないのか
頭が混乱してきましたね

今日は休んで疑問を整理します

496 :デフォルトの名無しさん:04/07/04 10:27
>>495
>えーハードウェアを直接操作するという機能は
>C言語の仕様外の機能で

インラインアセンブラ

497 :デフォルトの名無しさん:04/07/04 10:43
あほか

498 :デフォルトの名無しさん:04/07/04 10:50
>>495
なんのためにOSがあるんだ?
OSの存在意義を考えろ

499 :デフォルトの名無しさん:04/07/04 10:51
総資産を数兆円にするため

500 :デフォルトの名無しさん:04/07/04 10:51
>>495
あとOSをどういう言語で書いたかも考えろ

501 :デフォルトの名無しさん:04/07/04 12:37
> なんのためにOSがあるんだ?
> OSの存在意義を考えろ
綱引きする時に使う

502 :デフォルトの名無しさん:04/07/04 23:09
今日Visual C++.netを買ってきたんですがうまくいきません
。一緒に入ってる入門書の
コードを入力してビルドするまではできてるんですが、デバッグしても
ウィンドウになにも表示されないんです。
シンボルが読み込まれていませんとでてるんですがどうゆうことなんでしょうか?
超初心者ですいません。

503 :デフォルトの名無しさん:04/07/04 23:26
>>502
どういう質問なの?
デバッグが死体の?
ブレークポイント張った?
デバッグ実行した?

504 :デフォルトの名無しさん:04/07/04 23:39
>501
掛け声は「そいや、そいや」でしたが?

505 :デフォルトの名無しさん:04/07/04 23:43
>>504
ありがと。>>501の意味がやっとわかったw

506 :デフォルトの名無しさん:04/07/05 10:05
同じclassでコンストラクタが複数あるばあい基本以外のコンストラクタにはvirtualを付けたほうがいいのでしょうか?

507 :デフォルトの名無しさん:04/07/05 10:11
コンストラクタはvirtual宣言できまへん。
(デストラクタはできますが)
なぜならコンストラクトする時点で型が確定しているから。
(deleteは基底クラスのポインタ経由でできるからデストラクタ
はvirtual宣言できるが、new時には new CBase、new CDerived
と型を明示するからあいまいになりようがない)

508 :デフォルトの名無しさん:04/07/05 10:28
>>507
お答えありがとうございます

class aaa{
public:
  aaa();
  virtual aaa(int bbb);
};
この場合もvirtualは必要ないということですよね?


509 :デフォルトの名無しさん:04/07/05 11:20
>>508
いらないYO!
コンストラクタは特殊な関数なので、派生クラス
のインスタンスを初期化するとき、C++は
基底クラスのコンストラクタ→派生クラスのそれ
と順にコンストラクタをcallしてくれる。


510 :デフォルトの名無しさん:04/07/05 11:48
>508
必要ないではなく、付けられない。
というか、何でおまえはvirtualを付けたがっているんだ?

複数のコンストラクタは単なる関数のオーバーロード。

511 :デフォルトの名無しさん:04/07/05 11:51
つけられないことは無い

512 :デフォルトの名無しさん:04/07/05 11:56
>>511
g++ 3.3.4だと
>error: コンストラクタは virtual 宣言できません
ってエラーになるけど?


513 :デフォルトの名無しさん:04/07/05 13:29
C++Builderではエラーがでなくて普通にアレされるので・・

514 :デフォルトの名無しさん:04/07/05 13:44
エラーが出ない=付けられる って考えはどうかと・・・。

515 :デフォルトの名無しさん:04/07/05 13:51
よく関数にしてコールするとオーバーヘッドが気になる
と言う人がいますが、そんなに気になるほどの
オーバーヘッドってあるんですか?
どういう時に重要になるんでしょう?

516 :デフォルトの名無しさん:04/07/05 13:52
>>515
アセンブラ勉強しろよ

517 :デフォルトの名無しさん:04/07/05 13:54
汗ブラ
ハァハァ


518 :デフォルトの名無しさん:04/07/05 14:04
>>516
要するにおまえは知らないから答えられないということだなw

519 :デフォルトの名無しさん:04/07/05 14:14
http://tt.sakura.ne.jp/~suzu/asm/8.html

520 :デフォルトの名無しさん:04/07/05 14:22
>>515
>どういう時に重要になるんでしょう?
その関数の中身が十分小さく、呼出回数が多い時。
プロファイルしてみるとシステム全体に占めるコストが分かる。


521 :デフォルトの名無しさん:04/07/05 14:58
Cの勉強をしようとして、「新訂新C言語入門」とかいうのかってみたんですけど
ものすごくわかりにくいんで、ほかになんかいい入門書ありませんか?

522 :デフォルトの名無しさん:04/07/05 14:59
>>521
分かりやすさは人それぞれ。
本屋に言って片っ端から立ち読みしろ。


523 :デフォルトの名無しさん:04/07/05 16:42
>>521
推薦図書/必読書のためのスレッド PART 18
http://pc5.2ch.net/test/read.cgi/tech/1083665944/l50

524 :デフォルトの名無しさん:04/07/05 22:16
すいません。質問させてください。
今、処理時間の表示できるCのフリーのコンパイラを探しています。
現在、使っている「Cmachine」では、処理時間の表示が
どうやらできなそうなのですが、
皆さんが使っているコンパイラで、処理時間表示ができるものがありましたら、
お教えいただけると嬉しいです。お願いします。




525 :デフォルトの名無しさん:04/07/05 22:24
>>524
処理時間ってのはコンパイルする時間を表示させたいの?
それとも実行ファイルにある処理をさせてその処理時間を表示させたいの?
後者ならclock()またはdifftime()でできるけど?

526 :デフォルトの名無しさん:04/07/05 22:33
>>525
質問内容が不十分ですみません。
実行ファイルの処理時間のことです。早々と回答いただきありがとう御座います。
ただ、clock()の使い方を、今ネットで勉強しています。
どのように書けば良いのかまだわかりませんが、勉強してみます。
本当にありがとう御座いました。

527 :デフォルトの名無しさん:04/07/05 22:50
会話になってないな

528 :デフォルトの名無しさん:04/07/05 22:55
今日は暑かったからな。

529 :デフォルトの名無しさん:04/07/05 23:20
>>526
プロファイルでググレ

530 :デフォルトの名無しさん:04/07/06 07:30
質問です。
WindowsのAPIで任意のアプリケーション(任意のウィンドウ?)のカレントディレクトリを取得する関数ってご存知の方いらっしゃいますか?
GetCurrentDirectoryだと自分自身のプロセスのカレントディレクトリしか取得できないみたいで、どうしていいのかわかりません。
方針としてはGetActiveWindowかGetForegroundWindowで取得したハンドルをもとに、そのアプリケーションのカレントディレクトリを取得してファイル操作などをしたいと考えています。
よろしくお願いします。


531 :デフォルトの名無しさん:04/07/06 10:30
>>530
スレ違い。こっち
Win32API質問箱 Build20
ttp://pc5.2ch.net/test/read.cgi/tech/1088140233/l50

532 :デフォルトの名無しさん:04/07/06 13:15
>>530
フックしてフックプロシージャで取得し、
アプリケーションにプロセス間通信で送るとか

533 :デフォルトの名無しさん:04/07/06 13:26
>>531
1読め。
ここは言語と環境の問題を切り分けられなかったり
判断のつかない人(や、面倒な人)用のスレだろ。
C++の話題限定なら相談室と統合してるよ。


534 :デフォルトの名無しさん:04/07/06 13:52
>>533
>>1のどこに
>ここは言語と環境の問題を切り分けられなかったり
>判断のつかない人(や、面倒な人)用のスレだろ。
と書いてあるのだろうか?
そもそもここはC/C++言語の相談室で、特定の開発環境やライブラリの
操作に関しては専用スレに誘導するというスタンスが以前から続いているが?

535 :デフォルトの名無しさん:04/07/06 14:04
Win32APIなどの環境依存な物でもOK。

536 :デフォルトの名無しさん:04/07/06 14:08
環境依存なものでもOKだが、APIそのものの質問(C/C++とはなんの関係もない)は
より適切な場所で行う方がいいでしょ。

537 :530:04/07/06 14:09
>>532
プロセス間通信に関してわかってないので、調べてみました。
すぐには理解できなさそうですが、フックプロシージャの中でなら情報をチラ見できるっていうイメージでしょうか?(ちょっと言葉が悪いですね・・・)
ただ、今まではインスタンスハンドルかウィンドウハンドルあたりを使ってAPI関数一発かなぁとか想像していたので、そう簡単にはうまくいかないということがわかっただけでも収穫です。
ありがとうございます。
>>531さんをはじめレスくれた方々も、気を悪くしないでください。失礼しました。

538 :デフォルトの名無しさん:04/07/06 14:14
>>536
次スレのテンプレにはこれを明確にしておきましょ。

539 :デフォルトの名無しさん:04/07/06 14:15
>>537
フックプロシージャは、フックを注入した各プロセス空間で動作することになる。

>>536 より適切な場所で行う方がいいでしょ

それは確かだけど、スレ違いというわけではない。

540 :デフォルトの名無しさん:04/07/06 15:57
C/C++の初心者はとりあえずここに来い、ってすれでいいと思うが・・

541 :デフォルトの名無しさん:04/07/06 21:35
スレタイトルに環境依存OKって思いっきり書いてありますが

542 :デフォルトの名無しさん:04/07/06 21:47
C++のお勧めの本教えてください。
すぐにでも一通り使えるようになりたいので簡単なので良いのありませんか?
一応Cは分かります。

543 :デフォルトの名無しさん:04/07/06 21:49
>>542
推薦図書/必読書のためのスレッド PART 18
http://pc5.2ch.net/test/read.cgi/tech/1083665944/

544 :デフォルトの名無しさん:04/07/06 22:01
>>541
環境依存OKなC/C++の質問ね。
言語に関係しない質問はスレ違いだよ。
初心者は自分ではその区別がつかないことも多々あるが、
その場合、専用スレがあればそっちに誘導するということで
ずっとやってきているのに、いまさら蒸し返してどうする。

545 :デフォルトの名無しさん:04/07/06 22:13
>>530
よく分からないけどShellExecuteでカレントを指定して立ち上げればいいのでは?
exeの場所が知りたいのならGetModuleFileName辺りを調べるといいかも。

546 :デフォルトの名無しさん:04/07/06 22:19
>>543
ありがと、
テンプレ参考になりました。

547 :デフォルトの名無しさん:04/07/06 22:24
>>542
ここ辺りから1冊どうぞ。
ttp://www.data-house.co.jp/seriestoppc.html

548 :デフォルトの名無しさん:04/07/06 22:29
>>547
頭悪そうな本ばっかりだな

549 :デフォルトの名無しさん:04/07/06 22:30
>>548
そんなに言うのなら頭悪そうじゃない本を薦めたら?

550 :デフォルトの名無しさん:04/07/06 22:34
おいおい548は正論だろ

551 :デフォルトの名無しさん:04/07/06 22:38
>>547
書籍名だけでも十分アレだが、
著者名も負けず劣らずだな。

552 :デフォルトの名無しさん:04/07/06 22:44
まぁ542はすぐにでも分かりたいらしいから、
10分でわかる マンガハッカー 入門
かなぁ。C++かどうかは知らんが・・・

553 :デフォルトの名無しさん:04/07/06 23:32
下記の実行結果になるプログラムを作成してください。
-9999を読み込むまで次々と整数値を読み込んでいき、合計値および
平均値を表示するプログラム。なお、最後に読み込んだ
-9999は合計には加えない。注)do while文を使用すること。
変数は下記を使用すること。
int i; int n; int sum;
<実行結果>
どんどん整数を入力してください。(ただし、-9999で終わります)
1個目:15
2個目:65
3個目:84
4個目:96
5個目:23
6個目:45
7個目:85
8個目:-9
9個目:57
10個目:-9999

合計:461
平均:51.22

554 :デフォルトの名無しさん:04/07/06 23:32
>>553
ようかんマンがC/C++の宿題を片付けて見せます 26棹
http://pc5.2ch.net/test/read.cgi/tech/1088860889/

555 :カメソライダー:04/07/06 23:43


556 :デフォルトの名無しさん:04/07/06 23:56
推薦図書のスレから飛んでまいりました。
C++の超初心者です。
どなたかアドバイスお願いします。

あるデータをFFT処理をし、その結果が
メモ帳のテキストデータとして表示されるようになっています。
一行目に周波数、二行目にパワースペクトルが表示されるようになっているんですが、
このデータを周波数、スペクトルと分けてプログラムの中に読み込みたいのですが、
どうしたらよいのでしょうか?


557 :デフォルトの名無しさん:04/07/07 00:11
>>556
このスレでも怪しいが・・・
fscanfで検索を。

558 :デフォルトの名無しさん:04/07/07 00:21
>>556
初心者を超えたのなら甘えるなよ。

559 :デフォルトの名無しさん:04/07/07 00:25
>>556
周波数、パワースペクトルは組込型(doubleなど)でいいなら
std::basic_ifstream使えばすむけど。
詳しいアドバイスが欲しければ、もっと具体的に質問すべし。

560 :デフォルトの名無しさん :04/07/07 00:53
課題作成で作ってる自作プログラムで問題が起きたので質問です・・・。
拡張機能を入れたメモ帖を作成しているのですが、そこでかなーり困ってます。
具体的な処理として行いたいのが

スレッド特異的ホットキーを使いホットキー登録。
WM_HOTKEYが実行されたら以下の動作を実行

1.現在アクティブになっているウィンドウのハンドルを取得(これはGetActiveWindowを使う事で解決しています)
2.取られてきたハンドルを元に範囲指定してる文字列をクリップボードにコピー
3.クリップボードに保存されている文字列をメモ帖に張り付け(ここは自分のメモ帖のEDITコントロールにSendMessageでWM_PASTEを実行する事で出来ている)

2番目の処理がどうもうまく行きません・・と、言うよりもどの関数を利用するのか手持ちの資料じゃさっぱり・・・(TT
今の方式でもしハンドルを元に文字列を取ろうとすると、アプリケーションの種類で上手くいかない可能性もありますし。
例としてやってみたいアプリケーションでの処理を上げておきます

・IEで範囲指定した文字列を自作メモ帖で指定したホットキーを押した時にメモ帖に張り付け
・MSワードで範囲指定した文字列を自作メモ帖で(以下略

簡潔に言うと、外部アプリケーションで範囲指定した文字列をクリップボードに貼り付けて自分のメモ帖プログラムに貼り付けたいのです。
課題提出期限が明後日・・・誰か力貸して下さい_| ̄|○

561 :560:04/07/07 00:58
作成環境書き忘れてましたorz
環境はWinXP/2000
使用ソフトはVC++6.0です

562 :デフォルトの名無しさん:04/07/07 01:03
>>560
宿題スレに逝け。

563 :560:04/07/07 01:36
>>562
激しくスレ違いスマンカッタ_| ̄|○

564 :デフォルトの名無しさん:04/07/07 10:14
Windows のツールバーを作るために

TBBUTTON tbb[] = {
{ 0 , IDM_UME , TBSTATE_ENABLED , TBSTYLE_BUTTON , 0 , 0 , 0} ,
{ 1 , IDM_MOMO , TBSTATE_ENABLED , TBSTYLE_BUTTON , 0 , 0 , 0},
{ 1 , IDM_SAKURA , TBSTATE_ENABLED , TBSTYLE_BUTTON , 0 , 0 , 0}
} ;

と宣言、初期化して BCC でコンパイルすると
「初期化の一部だけにカッコがついている」と警告を受けるのですが、
もっと正しい記述の仕方があるのでしょうか?

565 :デフォルトの名無しさん:04/07/07 11:55
{ 0 , IDM_UME , TBSTATE_ENABLED , TBSTYLE_BUTTON , {0} , 0 , 0} ,

566 :デフォルトの名無しさん:04/07/07 12:08
VC++.net2003ゲットしたんですけど VC++6.0で普通にコンパイルできる
#include <stdio.h>
main()
{
printf("hello world");
}
が2003ではコンパイルできません 
普通のC言語未対応になったんですかね?

567 :デフォルトの名無しさん:04/07/07 12:16
(´-`).。oO(何が釣れるかな……)

568 :デフォルトの名無しさん:04/07/07 12:18
         \   ∩─ー、    ====
           \/ ● 、_ `ヽ   ======
           / \( ●  ● |つ
           |   X_入__ノ   ミ   そんなエサで俺様がクマ――!!
            、 (_/   ノ /⌒l
            /\___ノ゙_/  /  =====
            〈         __ノ  ====
            \ \_    \
             \___)     \   ======   (´⌒
                \   ___ \__  (´⌒;;(´⌒;;
                  \___)___)(´;;⌒  (´⌒;;  ズザザザ
                               (´⌒; (´⌒;;;

569 :デフォルトの名無しさん:04/07/07 12:20
>>566
.NETからは全く新しい言語体系に変わりました
今までの知識は全く役に立ちません。

570 :デフォルトの名無しさん:04/07/07 12:24
         \   ∩─ー、    ====       普通のC
           \/ ● 、_ `ヽ   ======     #include <stdio.h>
           / \( ●  ● |つ           int main(void) /* 返却値の型を省略するとint */
           |   X_入__ノ   ミ   =======   {
            、 (_/   ノ /⌒l            printf("Hello World");
            /\___ノ゙_/  /  =====      return 0; /* C99では不要 */
            〈         __ノ  ====     }
            \ \_    \
             \___)     \   ======   (´⌒
                \   ___ \__  (´⌒;;(´⌒;;
                  \___)___)(´;;⌒  (´⌒;;  ズザザザ
                               (´⌒; (´⌒;;;

571 :デフォルトの名無しさん:04/07/07 13:27
(´-`).。oO(エラーメッセージ読めば解決するのに……)

572 :デフォルトの名無しさん:04/07/07 20:11
cout でdouble型を表示させると小数点5桁までしか表示されません、任意の桁数まで表示させることは出来ないのでしょうか?
printfの場合は%18.15fなどで出来たのですが・・・初心者質問で申し訳ありません。

573 :デフォルトの名無しさん:04/07/07 20:13
cout 桁数 マニピュレータ
でググってみ

574 :デフォルトの名無しさん:04/07/07 20:23
>>573
precisionですね、ありがとうございます。

575 :デフォルトの名無しさん:04/07/07 22:32
Javaみたくヘッダで全ての関数定義しちゃだめなん?

576 :デフォルトの名無しさん:04/07/07 22:44
別にダメじゃないよ
好きなだけヘッダに書きな
ふふふ

577 :デフォルトの名無しさん:04/07/07 22:49
inlineをつければ平気かな
ふふふ

578 :デフォルトの名無しさん:04/07/07 22:51
>>575
全てインライン関数指定になるからプログラムサイズがすごいことになってマジオススメ

579 :デフォルトの名無しさん:04/07/07 23:39
>>578
インライン指定しても、実際にインラインになるかどうかはコンパイラにお任せ。

580 :デフォルトの名無しさん:04/07/08 00:28
>>579
んなことくらい知ってるけど、それが何か???

581 :デフォルトの名無しさん:04/07/08 00:30
>>578
んなことくらいわかるけど、それが何か???

582 :デフォルトの名無しさん:04/07/08 00:35
>>581=575 なの?

じゃああなたは一体何が聞きたかったの?

583 :575:04/07/08 00:52
>>578-579
自分で分けたほうが小さく出来るんだよね?
ヘッダで定義するのは雪駄下駄くらいにしとけてことでOK?

>>582
>>581はオレじゃないよ。
単に2ファイルにわけると保守がメンドイなと。

584 :デフォルトの名無しさん:04/07/08 01:49
>>583
開発用、公開用とヘッダファイルを使い分けることができるのがミソなのな。

585 :デフォルトの名無しさん:04/07/08 02:39
>>578
> 全てインライン関数指定になるから
またこういう大嘘をつくんだから ;-)

586 :デフォルトの名無しさん:04/07/08 08:11
>>585
Javaみたくヘッダで全ての関数定義した場合で
インライン指定にならないケースを教えて貰えないかい?

結果的にインラインにならないとしてもインライン指定はインライン指定だよ。

587 :デフォルトの名無しさん:04/07/08 09:01
>>586
class Hoge {
public:
void hoge() const;
};
void Hoge::hoge() const { std::cout << "hoge\n"; }


588 :デフォルトの名無しさん:04/07/08 15:16
>>587
おまいさんそれをヘッダに書く気か?

本当に関数定義をヘッダに書きたいなら全部templateにするのがお勧め。

589 :デフォルトの名無しさん:04/07/08 15:30
>>588
とりあえず、おまいはこれまでの流れを読み直してこい。

590 :デフォルトの名無しさん:04/07/08 15:45
>>589
>>575-を読んでレスをつけたんだが、見当違いな事言ってるか?
良かったらどこがおかしいか指摘してくれるとありがたい。

591 :デフォルトの名無しさん:04/07/08 21:43
>>587
はぁ・・・

ついでにもう一つ教えてもらいたいんだが、「Javaみたく」って字は読めないの?

592 :デフォルトの名無しさん:04/07/08 21:51
>>591
> ついでにもう一つ教えてもらいたいんだが、「Javaみたく」って字は読めないの?
みんな読めてますね。
あなただけは、読んだ上でその文章の意味を間違えているようですが ;-)

593 :デフォルトの名無しさん:04/07/08 21:55
>>592
読めてないじゃん。;-)

Javaは>>587のような記述が出来るようになってたのか? 


あと「みんな」だって。お前だけだよアホくさ。

594 :デフォルトの名無しさん:04/07/08 22:01
>>593
> 読めてないじゃん。;-)
読めていないと書けないレスに向かってこんなこと書いても、
馬鹿を晒す結果になるだけですね :-P

> あと「みんな」だって。お前だけだよアホくさ。
いえ、俺だけ読めているわけではありません。みんな読めています。あなた以外 ;-)
(とか書くとまた馬鹿を晒してきそう)

595 :デフォルトの名無しさん:04/07/08 22:05
>>594
バカ晒してるのはお前「も」だよ :-P

で、Javaは>>587のような記述が出来るようになってたのか?

596 :デフォルトの名無しさん:04/07/08 22:10
>>595
> バカ晒してるのはお前「も」だよ :-P
いえ、あなたですね :-P

> で、Javaは>>587のような記述が出来るようになってたのか?
とか言ってるから「読めてない」という話になるわけです ;-)

597 :デフォルトの名無しさん:04/07/08 22:10
age

598 :デフォルトの名無しさん:04/07/08 22:14
>>596
はいはい、書けないでしょ。

つまり>>587は「Javaみたく」を満たしていない記述。


あと
>いえ、あなたですね :-P
ワザワザ「」を付けてあげたのに「も」が読めなかったの?
やっぱ読めてないのお前ジャンw
俺はバカ晒しているのを自覚してるよw
お前もちったぁ自覚しろ :-)

599 :587:04/07/08 22:14
俺の知らないところで無益な争いが...
正直
>Javaみたく
の部分は読んでなかった。
「ヘッダで」じゃなくて「クラス定義の中で」って書いてくれれば
こんなことにはならなかった。



600 :デフォルトの名無しさん:04/07/08 22:18
>>598
> つまり>>587は「Javaみたく」を満たしていない記述。
あなたの誤読の範疇の話をいくらしても意味無いですね ;-)

> ワザワザ「」を付けてあげたのに「も」が読めなかったの?
読めるのは当たり前では

> やっぱ読めてないのお前ジャンw
と、ここでも思い込みで頑張るわけですね :-P

> 俺はバカ晒しているのを自覚してるよw
なるほど。自覚しているわけですか。それなら、
> お前もちったぁ自覚しろ :-)
これが荒唐無稽な馬鹿発言なのもちゃんと理解しましょう ;-)

601 :デフォルトの名無しさん:04/07/08 22:23
>>600
面白いw 
晒し上げられたから他のギャラリーがもっと乱入してきてグダグダになるまで頑張るかw


>>599 を見る限り、「みんな」じゃないなw

やっぱ読めてないのはお前だよ :-)

602 :デフォルトの名無しさん:04/07/08 22:26
>>583の「単に2ファイルにわけると保守がメンドイなと。」を読めば、
575の「Javaみたく」は、「Javaみたく全てクラス定義の中に〜」ではなく
単にファイル分けの話、つまり「Javaみたく、ヘッダファイル一つに〜」という
意味であると解釈するのが自然だし、より厳密な態度をとるなら
「はっきりと言っていないから断定できない」とするのが適切なのは明白なんだけどね。

ここを読まず&考えずに、勝手にクラス定義に全部書くって話に解釈して、
そこから一歩も出ようとしないのが約一名いる。

603 :デフォルトの名無しさん:04/07/08 22:27
>>601
> >>599 を見る限り、「みんな」じゃないなw
あなたと>>599、二名になりましたね ;-)

> やっぱ読めてないのはお前だよ :-)
いえ、あなたです :-P

604 :デフォルトの名無しさん:04/07/08 22:28
>>602
エーw

「Javaみたく、ヘッダファイル一つに〜」

Javaってヘッダファイルないじゃんw

605 :デフォルトの名無しさん:04/07/08 22:28
>>602
「単に」がポイントですね。

606 :デフォルトの名無しさん:04/07/08 22:29
>>604
C++の話でしょ?

607 :デフォルトの名無しさん:04/07/08 22:33
>>606
Javaにヘッダが無いってことは
Javaみたく、ってのは「ヘッダで全ての関数定義」にかかるわけじゃなくて
「全ての関数定義」にかかるだろ。かかんない?もうどっちでもいいよw


>>602
>そこから一歩も出ようとしないのが約一名いる。
そこから一歩出ると何に話が広がるのw?

608 :デフォルトの名無しさん:04/07/08 22:33
>>604
言葉の使い方は575に突っ込んでくれ。俺としては、

575は要するに「hとcppに分けるのマンドクセ。hに全部書いちゃダメなん?」
って訊きたいだけだろう

ってのが言いたいことなんで。

609 :デフォルトの名無しさん:04/07/08 22:35
>>607
> もうどっちでもいいよw
もう、というか、最初から絡みたかっただけでは? ;-)

610 :デフォルトの名無しさん:04/07/08 22:37
>>608
保守がメンドイって言ってるんだから
宣言と定義を分けて、二箇所変更が起きるようなやり方はしないだろw

>>609
俺にはお前が絡みたかっただけに思えるんだがw :-)

611 :デフォルトの名無しさん:04/07/08 22:39
>>610
でも、彼(彼女?)は「2ファイルにわける面倒さ」しか言ってないし。

612 :デフォルトの名無しさん:04/07/08 22:41
>>610
> 宣言と定義を分けて、二箇所変更が起きるようなやり方はしないだろw
>>575がそれをするかしないか、の問題ではないですね ;-)

613 :デフォルトの名無しさん:04/07/08 22:41
>>611
そこは>>575の意図がどうのという話ではないわけです ;-)

614 :デフォルトの名無しさん:04/07/08 22:43
>>611
確かに、勝手に「Java出身なら宣言と定義を分けることにメンドクサさを感じるだろう」と勝手に思い込んでたってのはあるなw

本当はどうなのか>>575が出てきて言ってくれないかなw

>>612-613
じゃあ、どういう話だったのw?
お前の脳内ストーリーを書き込んでくれないかなw

615 :デフォルトの名無しさん:04/07/08 22:46
>>614
> じゃあ、どういう話だったのw?
あとから出てきた人達の脳内の議題に関する話なわけですね ;-)

> お前の脳内ストーリーを書き込んでくれないかなw
ログを読めばいいのでは?
(俺の解釈はログと同じなので)

616 :デフォルトの名無しさん:04/07/08 22:47
>>615
お前具体的には何も言ってないねw いや言えないんでしょw?  :-)

617 :デフォルトの名無しさん:04/07/08 23:04
>>616
それが断末魔ですか ;-)

618 :デフォルトの名無しさん:04/07/08 23:05
>>617
あはは そっくりお返ししようw 

「それが断末魔ですか ;-)」が断末魔ですか ;-)

619 :デフォルトの名無しさん:04/07/08 23:09
いい加減もうヤメレ

620 :デフォルトの名無しさん:04/07/08 23:10
HSPスレでやれ

621 :デフォルトの名無しさん:04/07/09 00:00
 う わ ら ば 

622 :デフォルトの名無しさん:04/07/09 00:24
そんなことより>587だと、
複数のコンパイル単位にインクルードされた場合、
リンク時に多重定義エラーが出ないか?

586じゃないけど、やっぱinline指定が必要な気が。

623 :デフォルトの名無しさん:04/07/09 01:13
&はアドレス演算子とポインタの説明の所で書いてありますが、
int x=10;
scanf("%d",&x)の&xは、xは10をさしてる訳じゃなくて、
xのアドレスをさしていると言うことですか?それとも
ポインタの&とscanfで使う&は別物なんでしょうか?


624 :デフォルトの名無しさん:04/07/09 01:14
>>623
別物ではない。

625 :デフォルトの名無しさん:04/07/09 01:34
>>623
xの値は10だが、&xはxのアドレスを指す。

626 :デフォルトの名無しさん:04/07/09 08:35
>>624>>625
ちゃんと分かりやすく説明しろや
馬鹿か!?おめーら(プッ

627 :626:04/07/09 10:20
釣れないなぁ

628 :デフォルトの名無しさん:04/07/09 10:27
1,2,3・・・10,20,30・・・100,200,300・・・って増やす方法教えてください。

629 :デフォルトの名無しさん:04/07/09 10:33
int n = 1;
for(;;)
{
 n += (int)pow(10, floor(log10(n));
 printf("%d,", n);
}

630 :デフォルトの名無しさん:04/07/09 10:54
#include <stdio.h>
int main()
{
int i,j;
for (j=1; j<=10000; j=j*10)
{
for (i=1; i<10;i++)
printf("%d,",i*j);
}
return 0;
}

631 :デフォルトの名無しさん:04/07/09 11:00
>>629
エラーばっかりなんだけど

632 :デフォルトの名無しさん:04/07/09 11:15
>>631
アルゴリズムは自分で考えたのか?
その実装方法をここで聞くくらいならいいが

自分で考える癖をつけないと使えない人間になるぞ

633 :デフォルトの名無しさん:04/07/09 11:32
>>628
#include <stdio.h>

int main(void)
{
int hoge;
int moge;

for (hoge = 1; hoge <= 100; hoge *= 10)
{
for (moge = 1; moge <= 3; moge++)
{
printf("%d", hoge * moge);
if (moge < 3)
printf(",");
if (moge == 3)
printf("・・・");
}
}

puts("って増やす方法教えてください。");

return (0);
}

634 :デフォルトの名無しさん:04/07/09 13:49
>>628
俺でも不恰好ながら出来た、がんがれ

635 :デフォルトの名無しさん:04/07/09 16:55
このコードなんですが、出力が
0000000000000000000000・・・
になってしまいます。
なぜでしょうか?
VC6です。

#include "stdafx.h"

template< int count >
void hoge()
{
if( count < 10)
{
printf("%d", count);
hoge< count +1 >();
}
};

int main(int argc, char* argv[])
{
hoge< 0 >();

return 0;
}

636 :デフォルトの名無しさん:04/07/09 16:59
VC6で関数テンプレート+即値はバグもち

637 :デフォルトの名無しさん:04/07/09 17:01
>>636
635はそれ以前のような....


638 :デフォルトの名無しさん:04/07/09 17:03
>>635
どうなって欲しいのですか?


639 :デフォルトの名無しさん:04/07/09 17:06
>>637
hoge< count +1 >();これかw

640 :デフォルトの名無しさん:04/07/09 17:06
>>635
真っ当なコンパイラなら、そのコードはエラーになるはず。
hoge<n>がhoge<n+1>を実体化しようとして、決して終らないからね。

641 :デフォルトの名無しさん:04/07/09 17:20
C++でプロパティクラスが欲しいんですが、
プロパティクラスのインスタンスにsetter/getter/objの3つの値が必要で、
プリミティブ型ひとつひとつをプロパティ化すると、
オブジェクトのサイズが数倍に膨れ上がっちまいます。

なにか綺麗な解決方法ないですか?

642 :635:04/07/09 17:42
すいません
なぜ駄目なのか全然わかりませ〜ん

>>if( count < 10)
これがストッパーになってhoge<9>以上は作られないんじゃないんでしょうか?


また、
template< int count >
void hoge()
{
printf("%d\n", count);
hoge< count +1 >();
};

void hoge<10>()
{
printf("%d\n", 10);
};

こうしたら出力が「10」になってしまいました。
訳がわかりません、バグでしょうか?


643 :デフォルトの名無しさん:04/07/09 17:50
>>638
hoge< 0 >()から
hoge< 9 >()まで生成して0〜9を出力したいんです。
よろしくお願いします。

644 :デフォルトの名無しさん:04/07/09 17:51
>>642
ifの条件判定は実行時に行われる(たとえコンパイル時に真偽が確定していても)。
だから>>642の様に特殊化で対処しないといけない。
g++3.3では、>>642の特殊化の定義の前にtemplate<>を付け加える事でうまく動作したから、
出力が「10」になるのはバグだと思われる。

645 :デフォルトの名無しさん:04/07/09 18:02
>>644
了解しました、ありがとうございました。
また、ちなみにこういったことが可能な環境または言語ってあるんでしょうか?


646 :デフォルトの名無しさん:04/07/09 18:03
>>644
642ではif( count < 10)をはずしているので,
>出力が「10」になるのはバグだと思われる。
は違うよ.出力が「10」になるのは正しい.

それはそうと,
関数テンプレートは規格上,特殊化できないんじゃなかったっけ?
私の勘違いだったら申し訳ない.


647 :646:04/07/09 18:07
>>646
自己レス.
>関数テンプレートは規格上,特殊化できないんじゃなかったっけ?
これは部分的な特殊化の話だったようだ.
因みにModern C++の30ページ辺り.


648 :デフォルトの名無しさん:04/07/09 18:37
>>646
いえ、スタートが

int main(int argc, char* argv[])
{
hoge< 0 >();

return 0;
}

ですので「10」では間違いです。

VC6だとクラステンプレートで正常動作を確認しました。
クラステンプレートが無難みたいですね。


649 :デフォルトの名無しさん:04/07/09 18:43
>>645
>また、ちなみにこういったことが可能な環境または言語ってあるんでしょうか?
「こういったこと」と言うのが>>642のコードを動作させる事なら、
VC7.1かg++2.95(うろ覚え)以降を使うべし。

>>646
>642ではif( count < 10)をはずしているので,
>>出力が「10」になるのはバグだと思われる。
>は違うよ.出力が「10」になるのは正しい.
>>642でhoge<0>();を呼んだら出力は「0\n1\n2\n...10\n」になるはずだし、実際そうなった。(g++3.3)

650 :デフォルトの名無しさん:04/07/09 18:45
>>649
いえ、
if( count < 10)
の部分です。

651 :646:04/07/09 18:51
>>648
何か分からなくなってきた.
642で,うしろの方に書いてある
void hoge<10>()
{
printf("%d\n", 10);
};
は呼ばれないということでしょうか?
これでテンプレートの実体化がストップするのではないですか?

それはそうと,特殊化ってこうですよね.
template <> void hoge<10>()
{
printf("%d\n", 10);
};


652 :646:04/07/09 18:57
>>650
すみません.何言いたいのか伝わってないので,
650で言いたい内容を書き直してもらえませんか?
よろしく.


653 :デフォルトの名無しさん:04/07/09 19:13
http://www.fides.dti.ne.jp/~oka-t/cpplab-vc6-func-template-bug.html
これか?

654 :デフォルトの名無しさん:04/07/09 19:32
2次元配列 a[8][5], b[8][10]があるとしてこれをある関数の引数として渡すときどのように仮引数を書けばいいのでしょうか

655 :646:04/07/09 19:32
653みて分かった.646の
>>出力が「10」になるのはバグだと思われる。
>は違うよ.出力が「10」になるのは正しい.
は撤回.本当は
出力は「012345678910」になるのが正しい
とのつもりで書いたのだけど.


656 :デフォルトの名無しさん:04/07/09 19:37
>>654
a[][5], b[][10]

657 :デフォルトの名無しさん:04/07/09 19:49
>>656
すいません、説明不足でした。
a[8][5], b[8][10]だとして

hoge(a);
hoge(b);

と渡したいときのことでした。

658 :デフォルトの名無しさん:04/07/09 19:57
>>657
Cではaとbを同じ関数に渡すのはむり。
C++なら
void hoge(int a[][5]) { ... } (型は適当に仮定)
void hoge(int b[][10]) { ... }
ってオーバーロード。

659 :デフォルトの名無しさん:04/07/09 19:59
C99ならvoid hoge(unsigned size, int a[][size])
だけどむりだよな

660 :デフォルトの名無しさん:04/07/09 20:16
>>650
C++の範囲内なら、無理。

661 :デフォルトの名無しさん:04/07/09 20:20
>>656>>658-659
ありがとうございます。

662 :デフォルトの名無しさん:04/07/09 21:29
クラステンプレートをテンプレートの引数として取るとき、どうやって書けば委員でしょうか

template<?>
class data
{
public:
?<int> get1() const;
?<float> get2() const;
}

data<std::vector> data1;
data<std::list> data2;

みたいにしたいのですが

663 :デフォルトの名無しさん:04/07/09 22:18
とりあえずいくつか
template<template <typename,typename> class Cont>
struct Data1

    Cont<int,std::allocator<int> > get1() const; 
    Cont<float,std::allocator<float> > get2() const; 
};
template <typename T>
struct Data2{
    typename T::template apply<int> get1() const; 
    typename T::template apply<float>::type get1() const; 
};

struct Data2arg{
    template <typename T>
    struct apply{
        typedef std::vector<T> type;
    };
};

Data1<std::vector> data1
Data2<Data2arg> data2;

2つ目はboost::mplなんかで使われている方法。
1つ目は引数の数が少しでも違ってると動かない(デフォルト引数のことは考慮されない)。
つまり
template <template <typename> class Cont>
struct Data1{};
ではstd::vectorを受け取れない(vectorは2つの型を受け取るテンプレートクラスだから、2つ目は省略可能だけども)
・・・と思ったらMinGWでは動いた(VC7.1ではだめだったが)


664 :デフォルトの名無しさん:04/07/09 23:26
質問です。
ttp://mikata.curiocube.com/oop/part3/ch02_encapsulation.html
でC++入門してるのですが、C++では、アクセッサを経由したメンバ変数の比較はできないのでしょうか。
上記サイトに記載されていた、Humanクラス(下記)をインスタンス化し、メンバ変数のAgeを、
if (intanceHuman.Age == 10)
というコードで比較しようとしたところ、
" error C2446: '==' : 'int (__thiscall Human::*)(void)' 型から 'const int' 型への変換ができません。"
というビルドエラーが出てしまいます。
アクセッサを経由しないで比較を行うとうまくいくのですが・・・
コードとしては、直感的なので、このコードが通らないのが不思議というか・・・

// class 宣言
class Human {
public:
// コンストラクタ
Human(int nAge=0 );
// 属性の取得:「年齢」
int Age() { return m_nAge; }
private:
// メンバ変数:「年齢」
int m_nAge;
};



665 :デフォルトの名無しさん:04/07/09 23:28
>>664
if (intanceHuman.Age() == 10)

666 :デフォルトの名無しさん:04/07/09 23:35
>>665 ありがとうございました。
なるほど、()を忘れてました・・・
これだと、関数から返される値ではなく、関数自体と定数を比較している・・・
という感じに解釈されそうですね・・・

ありがとうございました=]

667 :デフォルトの名無しさん:04/07/09 23:38
intanceHuman.Age にカッコをつけないとメンバ関数のポインタ(関数の先頭のアドレス)になっちゃうよ。
ところでインタンスって・・・。

668 :664:04/07/10 00:02
ありがとうございます=]

インタンス...orz

669 :デフォルトの名無しさん:04/07/10 00:27
>>666
>関数から返される値ではなく、関数自体と定数を比較している・・・
>という感じに解釈されそうですね・・・
そんな馬鹿なことを考えるのはオマだけだ。もっと勉強しろ。


670 :デフォルトの名無しさん:04/07/10 00:35
>>669
それは正しい考えじゃないの?
馬鹿なことだとしたら、正しくはどうなのさ?

671 :デフォルトの名無しさん:04/07/10 00:37
>>670
>>667

672 :デフォルトの名無しさん:04/07/10 00:38
>>670
関数自体って何?
関数ポインタなら分かるんだが。

673 :デフォルトの名無しさん:04/07/10 00:57
>>672
関数への参照がそんな感じかな。
メンバ関数への参照はC++には無いが。

674 :664:04/07/10 00:59
>>669 & >>672
"関数自体"としたのは、参照される値が、ポインタなのか、関数オブジェクト(C++にあるのか否かは知りません)なのか、はっきりしなかったためです。
あと、勉強中です。

675 :デフォルトの名無しさん:04/07/10 01:20
>>674
関数オブジェクト使いたければboostをお勧め〜
基本のboost::function、boost::bindからboost::lambdaまで〜
ttp://www.kmonos.net/alang/boost/classes/lambda.html
というかboost入れないとSTLがのアルゴリズムかなり使いにくい気が・・・
あとC++だと関数自体の参照も受け取れる。

template <typename Ret,typename Arg1T>
void func(Ret (&arg)(Arg1T)){
    //...
}


676 :デフォルトの名無しさん:04/07/10 01:31
void hoge(int count)
{
if( count < 10)
{
printf("%d", count);
hoge(count + 1);
}
};

int main(int argc, char* argv[])
{
hoge(0);

return 0;
}

677 :664:04/07/10 01:36
>>675
Boostの関数型プログラミング系はあくまで、脇役なのかなと思っていたのですが、
なるほど、ワンライナーっぽく書けると、見通しもよくなりそうですね。
ありがとうございます:)

678 :デフォルトの名無しさん:04/07/10 01:50
>>677
1つだけ注意する点があるとするならライブラリで無名関数をサポートしているのであって言語レベルでサポートしているわけではないこと。
そのためにコンパイルエラーメッセージがとても読めないものとなる(boost::lambdaは)。
その代わり言語の影響が少ないせいかクロージャをboost::lambda::valを使って実現できたりもする、もっとも変数の寿命はC/C++の規則に従うが。


679 :678:04/07/10 02:00
>boost::lambda::val
boost::lambda::varだ。


680 :デフォルトの名無しさん:04/07/10 11:20
int型の変数をMessageBoxで文字として表示したいのですが、
Basic環境のようにString型にキャストして表示するにはどうすればいいのでしょうか?

MessageBox(NULL,(CString)strNumber,"Test",0);

としてもキャストできませんでした

681 :デフォルトの名無しさん:04/07/10 11:27
>>680
CString::Format

682 :デフォルトの名無しさん:04/07/10 11:28
char mes[22];
sprintf("%d",num);

683 :デフォルトの名無しさん:04/07/10 11:35
>>680
intからCStringへはキャストできない。
MessageBox(NULL, CString().Format("%d", strNumber), "Test", 0);
ところでstrNumberがintならプレフィックスおかしくないか?

684 :デフォルトの名無しさん:04/07/10 11:49
なるほど、ありがとうございます
今までBasicかPerlしか触ったことが無かったので、
文字列の変換についても同じように考えていました。

ところで、プレフィックスがおかしいというのはどういう意味なのでしょうか?



685 :デフォルトの名無しさん:04/07/10 12:12
>>684
strはCStringとかstd::string用でintならiとかnのはず

686 :デフォルトの名無しさん:04/07/10 12:50
ハンガリアンの概念捨てろ

687 :デフォルトの名無しさん:04/07/10 14:56
♪1・2・ハンガリアン

688 :デフォルトの名無しさん:04/07/10 15:39
プログラム初心者です。質問なんですが、
たとえば毎日20040710.datとかファイルをバッチで取得してて、トラブルで取れなかった場合に、
その日を自動的に取得するっていう感じのプログラムってどんな感じですればいいですか?
アドバイスをお願いします。

689 :デフォルトの名無しさん:04/07/10 15:44
>>688
毎日20040710.datとかファイルを取得してて、トラブルで取れなかった場合に、
その日を自動的に取得するプログラムを作ればいいです。

690 :デフォルトの名無しさん:04/07/10 15:52
>>688
>>689の一言に尽きます。
ってか全く同じこと書こうとしてた
危うくケコーンするとこだった

691 :デフォルトの名無しさん:04/07/10 22:55
>>688
こんな考え方はどうかな?
1、ディレクトリにあるファイルを全部取る
2,、取ったファイルはどこか別の場所へ移動
こんな考え方じゃだめ? 非常にシンプル・・・

692 :デフォルトの名無しさん:04/07/10 23:29
>>688
あなたが自力でプログラミングするにはかなりの勉強が必要のようだ。
プログラミングの勉強が目的でないならオンラインソフトを探したほうが早い。

693 :名無しさん@そうだ選挙に行こう:04/07/11 07:28
>>688
ファイルが取得成功したときとしなかったときで何が違うのか?
その日をどうやって取得するのか

そのあたりをハッキリしてみ

694 :デフォルトの名無しさん:04/07/12 16:41
そんなことよりちょっと聞いてくれよ
金がないので未だVC6なんだが
namespace Name {
class A
{
static void X(void);
};
}//namespace Name

int main(void)
{
Name::A::X();
//using namespace Name;
//A::X();
return 0;
}
こんなコードが通ってくれやがります。
どうしましょう?

695 :デフォルトの名無しさん:04/07/12 16:48
>>694
VC6捨てる


696 :デフォルトの名無しさん:04/07/12 17:03
>>694
何か問題が?

697 :デフォルトの名無しさん:04/07/12 17:13
>>696
少なくともprivateメンバにアクセスはできないはずですね。

698 :デフォルトの名無しさん:04/07/12 17:17
そうですね

699 :デフォルトの名無しさん:04/07/12 21:55
>>694
VC.NETならゴラァって言ってくれるの?

700 :697:04/07/12 22:42
gccならエラーと警告が出るんだけどねぇ。

701 :デフォルトの名無しさん:04/07/12 23:04
VC6のnamespaceおよびtemplateのへボサは言うまでもないと思ってたんだが。

702 :702:04/07/12 23:57
int main()
{
double a1,a2;
int i,Nparameter,nsteps;
Nparameter=5;
nsteps=4;
double result_a1[100];
double result_a2[100];
double result_a3[100];

for(i=0; i<Nparameter; i++){
a1=3+0.1*i;
result_a1[i]=a1;

// for(i=0; i<nsteps; i++){
// a2=4+0.2*i;
// a3=5+0.8*i;
// result_a2[i];
// result_a3[i];
// }
}

for(i=0; i<Nparameter; i++){
cout << result_a1[i] << " " << endl;
}
// for(i=0; i<nsteps; i++){
// cout << result_a2[i] << " " << result_a3[i] << " " << endl;
// }
}

703 :702:04/07/12 23:59
入れ子のforを使ってa2とa3を求めるにはどうすればよいのですか?
入れ子があるとa1が上手く求まりません。
あと、coutですが、エクセルみたいにa1、a2、a3をテキストファイルに
縦表示させたいです。よろしくお願いします。

704 :デフォルトの名無しさん:04/07/13 00:00
int j;

for(j=0; j<nsteps; j++){
a2=4+0.2*j;
a3=5+0.8*j;
result_a2[j]=a2;
result_a3[j]=a3;
}


705 :デフォルトの名無しさん:04/07/13 00:09
>>702 はマルチなので放置

706 :デフォルトの名無しさん:04/07/13 01:46
>>705
最初に書き込んだスレで答えてやれよ

707 :デフォルトの名無しさん:04/07/13 01:55
>>706
どこにあるかわからない最初の書き込みなんて追っていけるわけねえだろうがお前が見つけて答えてやれよ

708 :デフォルトの名無しさん:04/07/13 13:00
#include <standio.h>
int main(void)
{
int value;
printf("整数の値を入力してください。=");
scanf("%d",value);
if( )
{
if( )
printf("%5dは正の偶数ですね。\n",value);
else printf("%5dは負の偶数ですね。\n",value);
}
else
{
if( ) printf("%5dは正の奇数ですね。\n",value);
else printf("%5dは負の奇数ですね。\n",value);
}
}

空欄部分を埋めたいんですが、最初のifに何を入れて良いかが分からないので、
あとの2つも埋まらない状態です。
お願いします。


709 :デフォルトの名無しさん:04/07/13 13:02
#include <standio.h>


710 :デフォルトの名無しさん:04/07/13 13:31
sage
@@@@

711 :デフォルトの名無しさん:04/07/13 13:36
>>709
書き忘れていましたが、いくつかの間違いを含んだままになってます。
そっちに修正はしないでいいので、ifのあとの空欄をお願いします。

712 :デフォルトの名無しさん:04/07/13 13:39
ヘ_ヘ
ミ・・ ミ ということにしたいのですね?
( ° )〜

713 :デフォルトの名無しさん:04/07/13 13:40
>>708
if ( value % 2 == 0 )

しかし、間違いがあるのを承知で、しかも断り無く質問するのはどうかと思うぞ。

714 :デフォルトの名無しさん:04/07/13 13:41
>>708
Cとか関係ないし%
宿題スレいけよ2

715 :デフォルトの名無しさん:04/07/13 14:02
>>712
>>713
>>714
すいませんでした。ちょっと急いでいたもので。
以後気をつけます。
どうもありがとうございました。

716 :デフォルトの名無しさん:04/07/13 23:21
for (i=0; i<teki; i++){
cout << kekka1[i] << " " << endl;
}
for (j=0; j<tekiteki; j++){
cout << kekka2[j] << " " << endl;
}
だと、以下のようにできません。
kekka1 kekka2
○   ×
○   ×
:   ;
このように表示するにはどうすればいいのですか?
coutかprintfでお願いします。

717 :デフォルトの名無しさん:04/07/13 23:47
○とか×ってなんだよ

718 :デフォルトの名無しさん:04/07/13 23:48
>>716
折角答えてやったのに、マルチかよ・・・
しね

719 :デフォルトの名無しさん:04/07/14 16:11
研究室のPCに入ってるVisualStudio.NET2003のC++でプログラム組もうと思ったんだけど…
iostream.hをincludeしようとしたらiostream.hが無いし、
iostreamをincludeして、cout使おうとしたら、std::coutじゃないと使えないし…(´・ω・`)

C++の仕様って変わった?

720 :デフォルトの名無しさん:04/07/14 16:19
>>719
うらしまさん?


721 :デフォルトの名無しさん:04/07/14 16:46
何年前の知識なの?

722 :デフォルトの名無しさん:04/07/14 17:21
【初心者歓迎】C/C++室 Ver.7【環境依存OK】


723 :719:04/07/14 17:23
大学入学前だから…4〜6年前の知識(しかも古本)かな?(´・ω・`)
大学入学後はロクに組んでなかったし、
たまに組んだときも、古いコンパイラ使ってたから問題なかったし…

1から勉強し直した方が良さそうやね…

724 :デフォルトの名無しさん:04/07/14 17:53
ダイテルのC++プログラミング2版の邦訳、vol.3 を立ち読みすれば、なんとなくわかるかも。

725 :719:04/07/14 18:19
サンクス。立ち読みしてみます。

726 :デフォルトの名無しさん:04/07/14 21:14
AllocConsole()で作ったコンソールウィンドウをシステムメニューから閉じると、
GUIのメインウィンドウまで閉じて、プロセスが終了してしまうのを防止したいのですが。
どなたか、方法を御存知ないでしょうか。
WIN_APIの、SetConsoleCtrlHandler() や、HandlerRoutine() が関係しているところまでは msdn で調べたのですが、
具体的なサンプルコードのあるページが見つからず、理解できません。



727 :デフォルトの名無しさん:04/07/14 22:56
>>723
普通にstd::coutじゃだめなのか?

728 :デフォルトの名無しさん:04/07/14 23:09
using namespace std;
入れればいいだろ

729 :デフォルトの名無しさん:04/07/14 23:11
#include <iostream>
using namespace std;
これでいいだろ

730 :デフォルトの名無しさん:04/07/15 02:05
お願いします
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1089824455

731 :デフォルトの名無しさん:04/07/15 02:13
>>730
あちこちで聞きまくってるようだが、荒らしのつもりか?

732 :デフォルトの名無しさん:04/07/15 02:24
某プログラム言語担当が配った資料が
#include <iostream.h>
だった。実行できねぇって文句言う奴多発。

VC6のときはファイルが存在してたんだっけ?

733 :デフォルトの名無しさん:04/07/15 07:14
Hoge a, b, c; があるとして、

And(Hoge& a, Hoge& b, Hoge& c)
{
  a = b & c; //※メンバは省略しています
}
のように処理していました。

operatorを使って、operator= (a=b)とoperator&= (a&=c) の組み合わせで
同等なものは作成できましたが、
これを一度に処理することは出来ないのでしょうか?


734 :733:04/07/15 07:25
最後の文を、
>これを同等の速度で一度に処理することは出来ないのでしょうか?
に、修正させてください。


735 :デフォルトの名無しさん:04/07/15 08:12
>>733
「一度に処理」の意味がわからん。

736 :デフォルトの名無しさん:04/07/15 08:53
>>733
スレ違い。

こちらにどうぞ。
http://pc5.2ch.net/test/read.cgi/tech/1085915001/

737 :733:04/07/15 10:11
>>735
言葉足らずですみませんでした。

operatorで実現した場合、
a=b&cは、a=bと、a&=cの2回呼び出しを行う必要がある(思い込んでいる?)のですが、
それを1回の呼び出しでと言うことです。

Hoge& operator & (Hoge& b, Hoge&c)
{
  Hoge a = b; //コピーが必要
  a &= c; //直接メンバ同士を演算しているものとして
  return a;
}
では、一時的にコピーを作ってしまうので、それを避けたいというのが理由です。


738 :733:04/07/15 10:25
Hoge& operator & (Hoge& b, Hoge&c)

訂正
Hoge operator & (Hoge& b, Hoge&c)

739 :733:04/07/15 10:39
色々やってみて、勘違い(メンバ関数でやっていたり)していることに気が付きました。
お騒がせしました。


740 :デフォルトの名無しさん:04/07/15 11:17
だからスレ違いだと書いたのに……

741 :733:04/07/15 12:18
>>740
すんまそ。

if (b & c) のような書き方は出来ないんですね…


742 :デフォルトの名無しさん:04/07/15 13:21
>>741
なぜできないと考えるのかが分からない。

743 :デフォルトの名無しさん:04/07/15 14:27
>>737,741
解決したみたいだけど一応。この方が少し良いかも。
Hoge operator & (Hoge& b, Hoge&c)
{
  return Hoge(b) &= c;
}
741のはbool(かその他制御式に直接置ける型)へのキャストをオーバーロードすればいい。


744 :デフォルトの名無しさん:04/07/15 15:40
>>743
ありがとうございます。

>>742
えーと、a=b&c と if (b&c) は、戻り値が異なるだけなので
両立出来ないと思っているのですが...


745 :デフォルトの名無しさん:04/07/15 15:48
>>744
>えーと、a=b&c と if (b&c) は、戻り値が異なるだけなので
>両立出来ないと思っているのですが...

>>743氏も言ってるけどHoge -> bool のキャストをオーバーロードすればいいだろ

746 :デフォルトの名無しさん:04/07/15 17:11
>>744
operator bool() const { return true; };
こんなのをメンバ関数に追加するべし。

747 :733:04/07/15 18:35
>>745
>>746
ありがとうございます。

ここでいうキャストの意味がようやく解かりました。
Hoge operator & (Hoge& b, Hoge& c)と
bool operator & (Hoge& b, Hoge& c)は
両立(同時に定義)できないので、

operator & を使うのであれば、
戻り値Hoge以外はキャスト(if ((bool)(b&c)) など)しなさい、
ということですね。


748 :デフォルトの名無しさん:04/07/15 19:57
>>747 ちがいます。

749 :デフォルトの名無しさん:04/07/15 20:32
>>747
普通キャスト演算子のオーバーロードは暗黙的変換でも有効。
つまり>>746のようなキャスト演算子のオーバーロードの関数を作った場合、if (b&c)ってのができる。(boolへの明示的キャストはいらない)
その場合、
1, まずb&c(operator &(Hoge&, Hoge&))をやる。
2, b&cの戻り値はHoge&なんで条件判断はできない。
3, そこでHoge型を引数にとるoperator bool()が自動で呼び出される。(boolなら条件判断ができる)
4, その結果をifが見る。
って流れになる。

750 :デフォルトの名無しさん:04/07/15 20:42
const参照になってないのが気になってしょうがない

751 :デフォルトの名無しさん:04/07/15 21:01
>>750に従うと
operator &(const Hoge& b, const Hoge& c)だ

752 :733:04/07/15 21:34
自分の理解不足と説明不足です。申し訳ありません。

自分が質問したかったことは、
>>749の1,の時点で
処理を終わらせること(Hogeとboolの区別)が出来ないのでしょうか?ということです。

それぞれ下記のように別々の関数を用意すれば、
Hoge AndHoge(Hoge& b, Hoge& c)
bool AndBool(Hoge& b, Hoge& c)
それぞれが、1,までの処理で済むのですが、
operator&を使った場合、戻り値を2種類以上実現しようすると、
2,以降の処理が必要になるということでいいんですよね?

753 :デフォルトの名無しさん:04/07/15 21:59
>>752
普段1と4だけ意識させるための(キャストの)オペレータオーバーロードだぞ

754 :デフォルトの名無しさん:04/07/16 13:44
はじめまして。
初心者から質問させてください。
ここ
ttp://www.kopropo.co.jp/html/KONDO/KHR1_Support.html
にあるRCB-1というコントローラボードについてです。

このボードはRS232で通信するものです。
付属のアプリケーションがあるのですが、
それだと条件分岐が出来ないので、
条件分岐できるようなプログラムをC言語で組んでみたいと思ってます。

しかし、RS232を扱うような書籍が見つけられず困っています。
何か良い書籍、もしくはソースコードがないでしょうか。

755 :デフォルトの名無しさん:04/07/16 14:40
>>754
お前が何のOSやコンパイラを使ってるのか知らないのに何を薦めろと言うんだ?

756 :デフォルトの名無しさん:04/07/16 17:19
>>755
すっかり忘れておりました
OSはWindows2000、コンパイラはVC++です

757 :デフォルトの名無しさん:04/07/16 18:24
>>754
よくわからんが、こんなんじゃだめ?
ttp://members.jcom.home.ne.jp/0434383301/vc10.htm

758 :デフォルトの名無しさん:04/07/16 20:08
ttp://e-realize.com/softlib/comport/comport.htm

759 :デフォルトの名無しさん:04/07/17 18:33
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int getrand(max)
{
int ransu;
ransu=rand() % max;
return(ransu);
}

int main()
{
int rand;
srand((unsigned int)time(NULL));
rand=getrand(256);
printf("%d\n",rand);
return 0;
}

↑このプログラムを1秒おきに実行すると、
必ず前の乱数より大きな値が出て数字がばらけないんですが
(25→35→40→56→… というように)
timeを種にしてる限りどうしようもないですか?

760 :デフォルトの名無しさん:04/07/17 18:37
すいません、コンパイラはgccです。

761 :デフォルトの名無しさん:04/07/17 18:39
>>759 ttp://www.catnet.ne.jp/kouno/c_faq/c13.html#16

762 :デフォルトの名無しさん:04/07/17 18:43
>>759
int main()
{
int rand;
srand((unsigned int)time(NULL));
rand=getrand(256);
rand=getrand(256);
printf("%d\n",rand);
return 0;
}

763 :デフォルトの名無しさん:04/07/17 18:51
>>762
それだと逆に小さくなってくぞ

764 :デフォルトの名無しさん:04/07/17 19:15
素直にMT使えって

765 :デフォルトの名無しさん:04/07/17 19:19
>>759

int getrand(max)
{
return((int)((double)rand() / ((double)RAND_MAX + 1) * max));
}

766 :754:04/07/18 01:16
>>757
>>758
情報ありがとうございます
これを参考に四苦八苦してみます

767 :デフォルトの名無しさん:04/07/18 12:31
Cとしては正しいけどC++としては正しくない(エラーでコンパイルできないなど)
ソースってのもあるらしいのですが例えばどんなものなんでしょうか?

768 :デフォルトの名無しさん:04/07/18 12:36
割り込んですみません。
gcc/linux で使える、メモリ管理上のバグを検出するツール
を探しています。今組んでいるプログラムで、何も効果がな
いはずのコード(同じ初期化処理を何度も繰り返すコード等)
を挿入すると、結果が変わるというバグが取れなくて困って
います。一応ネット上で調べて、memwatchというのを使って
チェックしてみたところ、メモリリークは検出できて、debugし
たのですが、最初の問題は解決しません。memwatchの開
発者も、全ての問題が検出出来るわけでは無いと書いてい
ます。どなたか、この種の問題をdebugするのに良いツール
をご存知でしたら、お教えください。
(ちなみに、最適化オプションによって現象が出たり出なかっ
たりします。debugモードでコンパイルすると出なくなるので、
gdbでトレースすることもできそうにありません。)


769 :デフォルトの名無しさん:04/07/18 13:13
>>767
int* p = malloc( sizeof(int)*100 );
とか。C++の方が、全般に型チェックがうるさくなってる。

770 :デフォルトの名無しさん:04/07/18 13:49
>>768
cygwin + mingwn + gcc 相談室
http://pc5.2ch.net/test/read.cgi/tech/1058134693/
にいったほうがいいと思う

771 :768:04/07/18 13:53
>770
ありがとうございます。行ってみます。

772 :デフォルトの名無しさん:04/07/18 14:12
>>759
乱数の種がほぼ1づつしか変わらないのが原因だね。
1秒ごとというのが手動ならμ秒やミリ秒を返すAPIがあればそれを使う。
gettimeofday()とかtimeGetTime()とか。環境依存だけど。
linuxとかなら/dev/rand使う。

773 :デフォルトの名無しさん:04/07/18 14:26
>>759
乱数の精度を求めるなら標準関数のrandは使わないほうがいいみたいよ。
右シフトして3ビットぐらい捨てるとまだマシになるらしい。
それでもだめなら
ttp://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/mt.html
これが定番みたい。

774 :デフォルトの名無しさん:04/07/18 14:38
「Aの動作をした何秒後かにBの動作をさせる」というのはどうやったらよいのでしょうか?
例えば
#include<iostream.h>
using namespace std;

int main ()
{
cout << "三秒後に「三秒経ちました。」と出力します。" << endl;

//次のcoutを表示するまで三秒の間をもちたい。

cout << "三秒経ちました。" << endl;
return 0;
}

環境はVC++6.0です。
超初心者の質問ですがよろしくお願いします。



775 :デフォルトの名無しさん:04/07/18 14:44
Sleep

776 :デフォルトの名無しさん:04/07/18 14:44
>>774
Sleep()

777 :デフォルトの名無しさん:04/07/18 14:46
>>773
精度の問題じゃないってば。
種の問題。

778 :デフォルトの名無しさん:04/07/18 14:48
>>777
標準関数のrandを使ってるのが問題。

779 :774:04/07/18 14:55
>>775,776
ありがとうございます。

cout << "三秒後に「三秒経ちました。」と出力します。" << endl;
Sleep(3000);
cout << "三秒経ちました。" << endl;

しかし上記のようにSleepを使ってみたところ
『error C2065: 'Sleep' : 定義されていない識別子です。』
とエラーが出てしまいました。
なにかincludeしなくてはいけないのでしょうか??

780 :デフォルトの名無しさん:04/07/18 15:22
>>779
#include <windows.h>
その前にまずはチュートリアルあたりを嫁。


781 :774:04/07/18 16:15
>>775,776,780
できました!
ありがとうございます。
今度からはチュートリアルを熟読してから質問します^^;

782 :759:04/07/18 23:15
標準rand関数ってダメダメですね。
MTを使って解決しました。どうもありがとうございます。

783 :デフォルトの名無しさん:04/07/19 00:57
猫でもわかるのwindows SDK編のイントロダクションのソースを入力したのですが
error C2440: '=' : 'HGDIOBJ' から 'HBRUSH' に変換できません。
warning C4244: 'return' : 'WPARAM' から 'int' に変換しました。データが失われているかもしれません。
というエラーが出てしまいます。
まんまコピペしても結果は同じでした。
どうすればいいか教えてください。
環境はVC++.netです。

猫でもわかるのwidows SDK編イントロダクション
ttp://www.kumei.ne.jp/c_lang/sdk/sdk_00.htm


784 :デフォルトの名無しさん:04/07/19 01:06
>>783
http://www.kumei.ne.jp/c_lang/setvc.htm

785 :デフォルトの名無しさん:04/07/19 01:13
>>784
どうもすいませんでした。
myProg.hbrBackground =GetStockObject(WHITE_BRUSH);
の部分を消したらできました。

786 :デフォルトの名無しさん:04/07/19 02:08
char *a と char *a[] って何か違いはあるの?

787 :デフォルトの名無しさん:04/07/19 02:20
int i と int i[] くらい違う

788 :デフォルトの名無しさん:04/07/19 07:05
一から学びたいんですが、オススメのサイトはありますか?

789 :デフォルトの名無しさん:04/07/19 08:31
>>788
http://www9.plala.or.jp/sgwr-t/index.html

790 :デフォルトの名無しさん:04/07/19 16:03
インライン関数を使おうと思ってるのですが。
”hoge.cpp”
#include "func.h"

void hoge[
double a;
func(a);
}

”func.cpp”
#include "func.h"

inline void func(double)
{

}

”func.h”
inline void func(double);

このようにしリンクしようとするとerror LNK2001:が出てしまいます。
これはインライン関数の使い方が間違ってるのでしょうか?

791 :デフォルトの名無しさん:04/07/19 16:33
>>790
inline指定子はインライン展開を強制するものではないので、
指定しない場合と同様にhoge.cppだけでなくfunc.cppもリンクする必要がある。
つーか、それ以前にコンパイル単位が違う段階でインライン展開しようがないんだけど。

792 :デフォルトの名無しさん:04/07/19 16:35
>>790
> ”func.cpp”
#include "func.h"
void func(double)
{

}


793 :デフォルトの名無しさん:04/07/19 16:36
792は忘れて


794 :デフォルトの名無しさん:04/07/19 16:44
忘れたくても忘れられません

795 :デフォルトの名無しさん:04/07/19 16:46
>>791
なるほど、コンパイル単位が違うと駄目なんですね・・・考えてみればそりゃそうか・・・

796 :モモカ:04/07/19 18:53
はじめまして!!
大学生の研究でC++を使うことになってオブジェクト指向がわからなくって困ってるの
C言語でいうメイン関数とサブルーチンの関係とオブジェクト同士のデータと手続きの
関係って何が違うの?メイン関数からサブルーチンにデータを渡して、サブルーチンで
計算してメイン関数に関数に返すっていう流れをみるとオブジェクト指向じゃないかって
思うの。どうなんですか?教えてくださーい。ペコリ

797 :デフォルトの名無しさん:04/07/19 21:06
夏か

798 :デフォルトの名無しさん:04/07/19 22:36
ABC.libというファイルをa.objとb.objから作りたいのですが
コマンドが調べてもわかりません。
誰か助けて。
普段コンパイルはlcc a.cで通ってます

799 :デフォルトの名無しさん:04/07/19 22:53
>>798
まずはマニュアル嫁、マルチ。

800 :デフォルトの名無しさん:04/07/19 22:55
>>799
マルチではなく俺が誘導してきた

801 :デフォルトの名無しさん:04/07/19 22:57
>>800
なら回答よろしく

802 :デフォルトの名無しさん:04/07/19 22:58
>>801
ごめん
俺に解ってたらこっちに連れてこない

誰か解答よろ
とりあえず俺はBcc32のバージョンは解答してみた

>>798
lib作成 LCCとかでググってみ

803 :デフォルトの名無しさん:04/07/19 23:06
>>798
lcc ってこれ?
http://www.cs.virginia.edu/~lcc-win32/
↑にマニュアルある。

けど、なんか読んでもよくわからん。
コンパイラオプションにはなさそう。
リンカオプション説明もあるけど、lib作るってのは見当たらないな。

がんばってくれ。

804 :デフォルトの名無しさん:04/07/19 23:11
LSI-Cだったりして。。。

805 :デフォルトの名無しさん:04/07/19 23:56
LSI-Cならライブラリアンが付属していたはずだよ。
確か妙な名前だったはず。
コンパイラドライバ(lcc)からは作れなかったと思う。

806 :デフォルトの名無しさん:04/07/20 01:01
ライブラリアンと聞くと
口から酸性の液を吐く凶暴な生物を思い出す。

807 :デフォルトの名無しさん:04/07/20 01:28
LSICです

808 :デフォルトの名無しさん:04/07/20 01:33
LSI-Cのライブラリアンはoarだな。
oar [-]d|q|r|t|x[cuv] [g N] library member-file...

つーかマニュアルはかなり詳しく書いてあるので、ちゃんと読め。

809 :デフォルトの名無しさん:04/07/20 01:46
すいませんでした。
何も知らない小学生で


810 :デフォルトの名無しさん:04/07/20 01:50
二次元配列で

[ ] [12]=〜〜〜〜〜〜〜〜

などのプログラムで[ ]内に数字を入れない理由を
分かる人教えてください

811 :デフォルトの名無しさん:04/07/20 01:51
負担の軽減

812 :デフォルトの名無しさん:04/07/20 01:57
コンパイラに数えさせたら楽だし間違わないから。

813 :デフォルトの名無しさん:04/07/20 02:00
入れてもいいよ♥

814 :デフォルトの名無しさん:04/07/20 02:07
>>810
むしろ、あとの[12]は要素数を指定しないとならないってのがミソなんだが。

815 :デフォルトの名無しさん:04/07/20 02:07
わかりました。
ありがとうございます。

816 :デフォルトの名無しさん:04/07/20 04:43
>>810
「配列のポインタ」

「ポインタの配列」
の違いについて述べよ


817 :デフォルトの名無しさん:04/07/20 04:44
>>812
コンパイラは何も数えてないぞ

818 :デフォルトの名無しさん:04/07/20 08:08
>>808
あー、そういえばObjectARchiverって言ってた気がする。

819 :デフォルトの名無しさん:04/07/20 14:13
>>810
コンパイラがあとの〜〜〜〜〜〜〜〜で要素数を決定できるから

820 :デフォルトの名無しさん:04/07/20 14:51
質問すいません、時系列のデータファイルがあったときに
例えばそのファイルのデータの中の5の倍数番目のデータだけからなる
データファイルを新たにつくるCプログラムはどうしたらよいですか?

821 :デフォルトの名無しさん:04/07/20 14:57
>>817
数えないでどうやって決定するの?

822 :デフォルトの名無しさん:04/07/20 15:52
適当に

823 :デフォルトの名無しさん:04/07/20 16:26
>>821
実際のところ、データのサイズだけ計算すれば十分だから。

824 :デフォルトの名無しさん:04/07/20 17:00
質問させて下さい。 学校の休み期間で、PCクラスタに挑戦してみたいのですが、参考文献とか教えていただけないでしょうか。
演算させるのは、スカラー計算です。
OSは、やはりリナックスになるのでしょうか?
できれば、Windowsでしたいのですが・・・

825 :デフォルトの名無しさん:04/07/20 17:00
すいませんsage忘れました

826 :デフォルトの名無しさん:04/07/20 19:55
>>824
>OSは、やはりリナックスになるのでしょうか?
でしょねぇ。


827 :デフォルトの名無しさん:04/07/20 20:20
>>824
UNIX系OSの知識がないと,いきなりはちょっと辛いかもしれません.
参考文献は...
PVM
MPI
OpenMP
Mosix
SCore
このへんのキーワードでぐぐって知識を体系化させて下さい.
MPIの実装の一つmpichはWin版があったような気はします.


828 :デフォルトの名無しさん:04/07/20 22:25
mpichなら制限付試用版があるかな、昔は完全フリーだったんだけどねぇ

829 :デフォルトの名無しさん:04/07/20 22:26
>>821
数えないし決定もしない。sizeofの利用を除いて。

830 :デフォルトの名無しさん:04/07/20 23:11
相談したいのですが、
過去ログ【初心者歓迎】C/C++室【環境依存OK】
>>http://pc5.2ch.net/tech/kako/1059/10590/1059041347.html
の205番目のレスで、見つけたコードを応用して以下のようにしてみました。

AllocConsole();
HANDLE hRead, hWrite;
CreatePipe(&hRead, &hWrite, 0, 0);
_dup2(_open_osfhandle((long)hWrite, _O_TEXT), 1);
cout << "test" << endl;
char sz[100];
DWORD dw;
ReadFile(hRead, sz, sizeof sz, &dw, 0);
sz[dw] = '\0';
MessageBox(hwnd, sz, "test", MB_OK);

要するに自プロセスの標準出力を横取りして、GUIウィンドウに出力したいのですが。
CUI環境では、205番のやり方でOKなんですが、GUIではうまくいきません。
ReadFile でブロッキングされたまま止まってしまいます。
知恵を貸していただけないでしょうか?

831 :デフォルトの名無しさん:04/07/20 23:37
830番を投稿した者ですが、以下のように変えてみました。
が、やっぱりだめです。
ReadFile関数が標準出力を横取りしてくれない。。。
AllocConsoleとの併用はできないんだろうか。

AllocConsole();
HANDLE hWrite = GetStdHandle(STD_OUTPUT_HANDLE);
int dFile = _open_osfhandle((long)hWrite, _O_TEXT);
FILE* hFile = _fdopen(dFile, "w");
*stdout = *hFile;

HANDLE hRead, hWrite;
CreatePipe(&hRead, &hWrite, 0, 0);
_dup2(_open_osfhandle((long)hWrite, _O_TEXT), 1);
cout << "test" << endl;
char sz[100];
DWORD dw;
ReadFile(hRead, sz, sizeof sz, &dw, 0);
sz[dw] = '\0';
MessageBox(hwnd, sz, "Message", MB_OK);


832 :デフォルトの名無しさん:04/07/21 11:03
始めてWideCharToMultiByte関数を使用する事になったのですが、
ちょっと疑問が出来てしまいました。
WindowsXp、VC++6.0 SP6.0 の環境では
CP_ACP と CP_OEMCP の結果が同じに見えます。
これって日本語版Windows以外やWindows9x等では結果が違うのでしょうか?
(ページコード というのは地域の事?)
ご存じの方いらっしゃいましたら御願いします。

833 :デフォルトの名無しさん:04/07/21 13:03
>>832
日本語版Windowsではどちらも同じです。
英語版では異なってます。

「OEMコードページ」なんかで検索してみれば基礎的な知識が得られると思います。

834 :832:04/07/21 13:47
>>833
なるほど大体分かりました。ありがとうございました。

835 :デフォルトの名無しさん:04/07/21 13:47
C + Win32API + BCCでプログラムを作っているのですが、
それのビットマップについての質問です。

始めに、外部ビットマップは、一つの要素に一つのビットマップを使うタイプです。
ツクール2000みたいに、ひとつにいろんなのを載せるタイプではありません。


ビットマップを表示するときは、表示するたびに外部ビットマップを開くか、
使う全ての外部ビットマップを、プログラムの始めに
メモリビットマップに書いておくのか、どちらがいいのでしょうか。


透過の為のマスクビットマップは、外部に用意しておくか、
プログラムの始めに元のビットマップから製作するか、どちらがいいのでしょうか。

836 :デフォルトの名無しさん:04/07/21 14:04
>>835
自分が作りたいアプリケーションに合わせて仕様を決めましょう。
例えば、格闘ゲームなんかの場合は

1.登場キャラで足りない分のデータだけをメモリに読み込む。
2.マスク作成
3.ゲーム部分
4.次ステージに登場しないキャラの部分のメモリ解放
5. 1.に戻る

といった感じ。
必要無いデータは必要になる前の違和感を感じない所で読めば良い。

837 :デフォルトの名無しさん:04/07/21 14:08
C++でフレンドクラスからテンプレート関数を呼びたいのですが、リンクエラーになってしまいます。

class A {
private:
...
template <typename T> int compare( T a1, T a2 ) { return ( a1 > a2 ? 1 : 0 ); }
friend class B;
};
class B {
...
};

の状態で、クラスBの内部で compare( 1, 2 ) とか compare( 3.0f, 4.0f ) を評価したいのです。

色々と検索したところ、テンプレート関数の実体がないため(?)らしいというあたりまではわかったのですが、
具体的にどうすれば解決できるのか教えていただけないでしょうか。


838 :デフォルトの名無しさん:04/07/21 14:13
>>835

1.
頻繁に同じ画像を描画するのであればメモリ上に置いておく必要があるし、
不特定多数の画像の切り替えが必要な場合は、表示させるときにだけ読み込めばいい。

2.
特に問題なければ読み込み後でのマスク作成でいいと思う。

839 :835:04/07/21 14:21
>>836
ありがとうございます。

僕が作ろうとしているのは、FE等のターン制SRPGです。

基本的には、1は後者の方で、2も後者のようですが、
さらに、メモリっとくビットマップの種類を
できるだけ小さくしておく工夫が必要なんですね。
分かりました。

840 :835:04/07/21 14:29
>>838
ありがとうございます。

>1
SRPGなので頻繁ではないタイプだと思います。

透過をマスクを使わずSetPixelVでやっていたので、
キャラを選択して移動範囲を表示するとき、
薄く青描けるのがあると思いますが、あれが激遅でした。

>2
1で読み込んだ時、その分のマスクをその時に作ればいいのですね。
分かりました。

841 :835:04/07/21 14:32
>>838
>1
ここの部分は、同じSRPGでも、ゲーム進行の仕方によって
微妙に違ってくると思うので、いろんな方法を試して見ます。

842 :デフォルトの名無しさん:04/07/21 14:35
>>837
普通に↓のように書けばいいのでは。

class A {
template <typename T> int compare( T a1, T a2 ) { return ( a1 > a2 ? 1 : 0 ); }
friend class B;
};

class B {
void test( A& a ) {
a.compare<int>( 1, 2 );
a.compare<float>( 3.0f, 4.0f );
}
};

ただ、VC++ 6.0では問題あったような・・・

843 :デフォルトの名無しさん:04/07/21 17:15
#include<stdio.h>

int main()
{
int c;
while((c = getchar()) != EOF)
putchar(c);
return 0;
}

を実行しても終了しないんですが、どうやったら終了できるようにできますか?

844 :デフォルトの名無しさん:04/07/21 17:20
>>843
終わりたい時に電源切ればいい

845 :843:04/07/21 17:22
>>844
なるほど。
っていうか、whileの中身が偽になっても何で終了しないんですか?

846 :デフォルトの名無しさん:04/07/21 17:25
>>845
偽になれば終了します。
終了しないのは偽にならないからです。

847 :デフォルトの名無しさん:04/07/21 17:29
>>843
Ctrl+Cで終了したけど(LSI CとBCCどっちでも)

848 :843:04/07/21 17:29
>>846
どうしたら、偽になるんですか?

849 :デフォルトの名無しさん:04/07/21 17:32
>>848
そのように振舞うgetcharを自分で作る。


850 :デフォルトの名無しさん:04/07/21 17:34
>>848
Ctrl+DとかCtrl+Zとか

851 :843:04/07/21 17:38
みなさん、ありがとうございます。
やってみます

852 :デフォルトの名無しさん:04/07/21 17:48
#include <stdio.h>
int min(int x,int y);

int main(void) {
  int x,y,ans;
  printf("1番目の整数を入力してください。\n");
  scanf("&d",&x);
  printf("2番目の整数を入力してください。\n");
  scanf("%d",&y);
  printf("\n\nx=%d,y=%d\n\n",x,y);
  ans = min(x,y);
  printf("最小値は%dです",ans);
  return 0;
}

int min(int x,int y) {
  if(x>y) {
    return y;
  } else {
    return x;
  }
}

が期待通りに動きません。最初のscanfが実行されてないみたいです。
なぜ?

853 :デフォルトの名無しさん:04/07/21 17:52
>>852
目を凝らしてよ〜く見てみろ

854 :デフォルトの名無しさん:04/07/21 18:00
&d

855 :デフォルトの名無しさん:04/07/21 18:01
>>852
Shift6→Shift5

856 :デフォルトの名無しさん:04/07/21 21:28
ん? '&'はShift+7じゃないの?

857 :デフォルトの名無しさん:04/07/21 21:34
>>856
俺のキーボードではShift+6だよ

858 :デフォルトの名無しさん:04/07/22 09:07
>>855-857
(・∀・)ソレダ!

859 :デフォルトの名無しさん:04/07/22 14:26
プログラムは思った通りには動かない。作った通りに動く。

860 :デフォルトの名無しさん:04/07/22 14:41
つまり、思った通りに作れば
思った通りに動くわけですね。

861 :デフォルトの名無しさん:04/07/22 15:12
m9(  `Д´ )ソレダ!!

862 :デフォルトの名無しさん:04/07/22 15:37
#include <stdio.h>
double func(double tensuu){
int k;
double kekka;
printf("親なら1を子なら0を入力してください\n");
scanf("%d",&k);
if(k==1){kekka=tensuu*1.5;}
else if(k==0){kekka=tensuu;}
return(kekka);}
double kiriage(double kekka) {
int i,j,k;
i=kekka;
if(i%100==0){k=kekka;}
else{
j=100-i%100;
k=kekka+j;}
return(k);}
void main(){
int tokuten[7][4]={0,1300,2600,5200,1000,2000,3900,7700,1300,2600,5200,8000
,1600,3200,6400,8000,2000,3900,7700,8000,2300,4500,8000,8000,2600,5200,8000,8000};
int toitu[3]={1600,3200,6400};
int k,hansuu,fusuu,hansuu2,bai,n;
doubletensuu,kekka;
tensuu=0;
kekka=0;
hansuu=0;
n=0;
while(1){
printf("飜数を入力してください\n七対子で4飜以下の場合は0を入力してください\n");
printf("役満は一種類に付き13飜で換算して入力してください\n");
scanf("%d",&hansuu);

863 :デフォルトの名無しさん:04/07/22 15:40
符も計算してくれ

864 :862続き:04/07/22 15:53
if(hansuu<=12){
if(hansuu<=10){
if(hansuu<=7){
if(hansuu<=5){
if(hansuu<=4){
if(hansuu==0){
if(hansuu<=-1)
{printf("不正な値です、正しい数値を入力してください\n");}
else {
printf("飜数を入力してください\n");
scanf("%d",&hansuu2);
tensuu=toitu[hansuu2-2];
kekka=func(tensuu);
kekka=kiriage(kekka);
printf("得点は%lfです\n",kekka);}}
else {
printf("符数を入力してください\n");
scanf("%d",&fusuu);
tensuu=tokuten[(fusuu/10)-2][hansuu-1];
printf("親なら1を子なら0を入力してください\n");
scanf("%d",&k);
if(k==1){
kekka=tensuu*1.5;
kekka=kiriage(kekka);
printf("得点は%lfです\n",kekka);}
else if(k==0){
kekka=tensuu;
printf("得点は%lfです\n",kekka);}}}

865 :862続き:04/07/22 15:53
else {
kekka=func(8000);
printf("得点は%lfです\n",kekka);}}
else {
kekka=func(12000);
printf("得点は%lfです\n",kekka);}}
else{
kekka=func(16000);
printf("得点は%lfです\n",kekka);}}
else {
kekka=func(24000);
printf("得点は%lfです\n",kekka);}}
else{
if(hansuu%13==0){
bai=hansuu/13;
tensuu=(double)bai*32000.0;}
else if(hansuu%13!=0){tensuu=32000;}
kekka=func(tensuu);
printf("得点は%lfです\n",kekka);}
printf("終了する場合は0、継続する場合は1を入力してください\n");
scanf("%d",&n);
if(n==0) break;
else printf("処理を継続します\n"); }}

866 :862:04/07/22 15:55
俺がC使い初めの頃に組んだ麻雀得点計算プログラム。
ソースが汚くて死ぬほど分かりづらい。

867 :デフォルトの名無しさん:04/07/22 16:03
#include <iostream>
#include <string>
using namespace std;

int main()
{
string str[2][2];

str[0][0] = "就職 ";
str[0][1] = "活動 ";

str[1][0] = "会社 ";
str[1][1] = "訪問 ";

cout << str[0] + str[1] << endl;

return 0;
}

上手くいかなかったんですがどうすればいいですか

868 :デフォルトの名無しさん:04/07/22 16:10
>>867
せ め て 、 希 望 す る 結 果 ぐ ら い は 書け!

869 :デフォルトの名無しさん:04/07/22 16:22
>>868
内定


870 :デフォルトの名無しさん:04/07/22 16:55
>>867
こうすればコンパイルは通る。
cout << str[0] << str[1] << endl;

871 :デフォルトの名無しさん:04/07/22 17:03
C++相談室にまで書くなよ

872 :デフォルトの名無しさん:04/07/22 18:47
>>869
ワロタ

873 :デフォルトの名無しさん:04/07/23 14:11
VB等で利用可能な COM DLL を VC++ 6.0 で作成しています。
DLLは問題無く完成したのですが、VBのプロジェクトにインポートして
オブジェクトブラウザを開いた時にメゾッドやプロパティの説明文が出るようにしたいのです。
*.odlファイルが怪しいような気はするのですが、調べても分かりませんでした。

※現状のVBオブジェクトブラウザの表示
Baudrate As Long
TotalCom.RS232C のメンバ


※理想的なVBオブジェクトブラウザの表示
Baudrate As Long
TotalCom.RS232C のメンバ

RS232C通信のボーレートを設定します。

環境
Winowd Xp
Microsoft Visual Studio 6.0 Enterprise SP6
 Visual C++
 Visual Basic

知っている方いらっしゃったらよろしく御願い致します。m(_ _ )m

874 :デフォルトの名無しさん:04/07/25 00:52
メールチェックなどのプログラムを書くのに
参考になるページなどあれば教えて下さいませんか?
一応ググッたのですが見つからなかったので。

875 :デフォルトの名無しさん:04/07/25 01:06
>>874
http://www.faqs.org/rfcs/rfc1939.html

876 :デフォルトの名無しさん:04/07/25 14:33
operator delete(void*, std::nothrow_t const &)
ってどうやって呼び出すんですか?

877 :デフォルトの名無しさん:04/07/25 14:35
>>876
operator delete(p,std::nothrow);

一応聞いとくが、何がしたいんだ?

878 :デフォルトの名無しさん:04/07/25 18:06
Win32の質問です。HeapAlloc()で割り当てられるメモリの最大容量はCOFFの拡張ヘッダに
あるSizeOfHeapCommitの値までなんでしょうか?デフォルトでは0x1000(64KB)となっている
ようなんですが・・・。

879 :デフォルトの名無しさん:04/07/25 18:11
>>877
new(std::nothrow) obj;で確保した領域は
operator delete(void*, std::nothrow_t const &)で開放せにゃなんないと聞いたもので。


880 :デフォルトの名無しさん:04/07/25 18:20
>>879
基本的な考え方は正しいけど、例外的に、nothrowを取るnew/deleteは
普通のnew/deleteと混用できる。

881 :デフォルトの名無しさん:04/07/26 21:10
ちょいと質問。
lcc-win32 Ver.3.8での話なんですが、
変数を特定のセクションに割り当てる方法ってあるんですかね?
VCだと
#pragma data_seg (".hoge")
とかでなんとかなりますが、
lcc-win32ではググっても資料があまりないみたいで…

882 :デフォルトの名無しさん:04/07/28 19:34
1行エディットコントロールを作成したのですが、
入力してRETURNキーを押すたびに警告音がします。
うるさいので、無くす方法はないでしょうか?


883 :デフォルトの名無しさん:04/07/28 20:09
>>882
もちろんありますよ

884 :デフォルトの名無しさん:04/07/28 20:51
その方法を教えるのがこのスレ

885 :デフォルトの名無しさん:04/07/28 20:55
違います。質問に答えたり、情報交換してるだけです。

886 :デフォルトの名無しさん:04/07/28 20:56
質問に過不足無く答えたつもりだが?

887 :デフォルトの名無しさん:04/07/28 20:58
質問者も、開発言語すら書いてないしなぁ

888 :デフォルトの名無しさん:04/07/28 21:14
template<class T, T V = T()>
class A
{
};

A<HANDLE, INVALID_HANDLE_VALUE> a; // <--ここ

上記のように書いたのですが、コメントの行で
error C2964: テンプレート パラメータの式が不正です。
と出ます。
試しに

A<HANDLE, (HANDLE)INVALID_HANDLE_VALUE> a;

としても同様のエラーが出ます。
なぜエラーになるのでしょうか?理由がわかりません。
VC++6.0SP6 Win2k

889 :888:04/07/28 22:17
試しに

A<HANDLE, NULL> a;

としたらコンパイルが通りました。
NULLは良くてINVALID_HANDLE_VALUE(#define (HANDLE)-1)が駄目な理由がさっぱりわかりません。


890 :デフォルトの名無しさん:04/07/28 23:24
質問ですがWINAPIとCのランタイムで同じ処理ができる場合、
何を根拠にして使い分ければ、よいのでしょうか?

891 :デフォルトの名無しさん:04/07/28 23:26
>>890
たとえば何?

892 :デフォルトの名無しさん:04/07/28 23:29
memset とZeroMemory の違いや
fopen と CreateFile 等です

893 :デフォルトの名無しさん:04/07/28 23:31
別物やん

894 :デフォルトの名無しさん:04/07/28 23:36
char a[100];
memset( a, '\0', sizeof(a) ) と 
ZeroMemory(a, sizeof(a) ) は同じでないの?

895 :デフォルトの名無しさん:04/07/28 23:41
>>894
じゃあ同じ物なら
memset( a, 1, sizeof(a) ); を ZeroMemoryにやらせてみろよ

896 :デフォルトの名無しさん:04/07/28 23:44
>>889
テンプレートがキャストまで解釈してくれると思ってるのか?

897 :デフォルトの名無しさん:04/07/28 23:49
やってみました。全然、結果が違いました・・・・。
根本的に勉強がたりないみたいです・・・・。
もう一個だけ質問ですが
strcpy と lstrcpy も全然別のものですか?

898 :デフォルトの名無しさん:04/07/28 23:51
>>897
お前は人に聞く前にやる事があるだろ?

899 :888:04/07/29 01:38
>>896
キャストが駄目だとするとどうすればいいのでしょうか?
そのまま-1と書くと

error C2440: 'specialization' : 'const int' から 'void *' に変換することはできません。(新しい動作 ; ヘルプを参照)
整数型からポインタ型への変換には reinterpret_cast、C スタイル キャストまたは関数スタイル キャストが必要です。

が出て駄目ですし、こういうことは不可能なのでしょうか?


900 :デフォルトの名無しさん:04/07/29 02:13
外部クラスの読み込みとクラスの継承関連で質問なのですが、2重インクルードというものがまだいまいち理解できません。
問題のソースです → http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/lounge/file/1074774948_26/class.txt

上のソースの場合、CarをmainとRacingCar.cppで2回読んでいるようでいけないのかなと思うのですがどうなんでしょうか。。
あとcppファイル全部で#include <iostream>をしているのも無駄にインクルードしているような気がするのですが。。

901 :900:04/07/29 02:15
使用しているのはVC++6.0です。

902 :デフォルトの名無しさん:04/07/29 02:16
>>900
ヘッダファイルの中身を見たことがあるか?
中身の#のついた行が何を行っているか考えてみれ。

903 :デフォルトの名無しさん:04/07/29 05:00
>>894に対して>>895のようなレスをするのは何か違う気がするんだが。

904 :デフォルトの名無しさん:04/07/29 05:06
>>903
元の質問は、どのように使い分けるか、という質問だからあんな返答でもいいんじゃねえ?

905 :デフォルトの名無しさん:04/07/29 05:11
>>903
じゃあお前が答えてみろよ

906 :デフォルトの名無しさん:04/07/29 06:06
>>888
HANDLEはおそらくポインタ型のtypedefだろう。
テンプレート引数に渡すポインタの値は、
外部リンケージを持つオブジェクトを指さなければならない。
規格ではNULLもダメ。

907 :デフォルトの名無しさん:04/07/29 07:17
>>897
さっきから話に出てくるのはWin32のAPIなので
Win32APIをやってから質問に来てみたらどうでしょうか?

>>900
分割コンパイルというのをご存知ですか?

908 :デフォルトの名無しさん:04/07/29 08:15
>>892
ZeroMemoryは#undefしない限りマクロでmemsetにされる罠

909 :デフォルトの名無しさん:04/07/29 08:39
つまりZeroMemoryは
fprintfのprintf版のようにある特定の特別な条件について
良く使うので別の名前で再定義に近い形になってるだけですね

910 :デフォルトの名無しさん:04/07/29 08:44
ゼロで埋めたいとき−>ZeroMemory
メモリにセットしたいとき−>memset
でも実装は2ついらない

911 :888:04/07/29 09:12
>>906
「外部リンケージ テンプレート 引数」でググってみたら
ttp://www.tietew.jp/cppll/archive/9458
が見つかりました。
すごく面倒臭そうなので別の方法を考えたいと思います。
勉強になりました。ありがとうございました。

912 :デフォルトの名無しさん:04/07/29 10:38
>>895=>>905みたいな頭の悪い回答者は
鬱陶しいだけだからあんまり頑張らないでね(^_^;

913 :デフォルトの名無しさん:04/07/29 11:02
VC++6.0SP6 Win2000

template<class T, bool f = true> struct A
{ bool func(T) const { return f; } };

こんなテンプレートクラスがあり、例えばTがcharの場合特殊化したいと思ったとすると

template<> struct A<char>
{ bool func(char) { return f; } };

と書いたのですがA<char, true>の特殊化と判断されるようです。
ttp://www.fides.dti.ne.jp/~oka-t/cpplab-template-2.html
ここを参考に

template<bool f> struct A<char, f>
{ bool func(char) { return f; } };

としてみましたが
error C2989: 'A<char,f>' : このテンプレート クラスはすでに非テンプレート クラスとして定義されています。
error C2988: 認識できないテンプレートの宣言または定義です。
と出ます。
A<char, true>とA<char, false>それぞれ書くしかないんでしょうか?

914 :デフォルトの名無しさん:04/07/29 11:52
>>900
> 上のソースの場合、CarをmainとRacingCar.cppで2回読んでいるようでいけないのかなと思うのですがどうなんでしょうか。。
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/lounge/file/1074774948_26/class.txt
で示されてるコードは2重インクルードしてません.(コンパイル通るでしょう?)
なぜなら,900さんが(2重インクルードしないで)コンパイルが通るように巧妙に#includeを使ってるからです.(笑)
2重インクルードとは,同じコンパイル単位(1cppあたり1コンパイル単位)で
インクルードガードが施されてない同一のヘッダファイルを2回以上インクルードしてしまう状態です.

900さんはヘッダファイルではincludeしないように心掛けてるんではないでしょうか?
ヘッダファイルでincludeを減らすのは良い心掛けとは思いますが,例えば,
RacingCarクラスはCarクラスを継承してるので,RacingCar.hの先頭で#include "Car.h"するのが普通です.
RacingCarクラスの構築にはCarクラスの定義が必須だからです.
そして,main.cppとRacingCar.cppの#include "Car.h"を外します.
もう少しプロジェクトの規模が大きくなると,このようなヘッダファイルでの#includeのために
上記2重インクルードの状態が発生するので,ヘッダファイルではインクルードガードを施す必要があります.
900さんのコードにはないですね.インクルードガードについては
http://www.02.246.ne.jp/~torutk/cxx/file/includeguard.html
ここで説明されてる内部インクルードガードを参考にして下さい.

> あとcppファイル全部で#include <iostream>をしているのも無駄にインクルードしているような気がするのですが。。
分割コンパイルの利点を享受するためには仕方のないことです.それと,main.cppではいらないですね.


915 :デフォルトの名無しさん:04/07/29 11:57
>>910
心配するな。実装は一つだ。


916 :デフォルトの名無しさん:04/07/29 12:01
>>914
うだうだ言ってないでもっと手短に説明出来ないか?


917 :デフォルトの名無しさん:04/07/29 12:04
>>916
>907を読め
分割コンパイルと答えが出てるだろ

918 :914:04/07/29 12:13
>>916
じゃ,まとめると,907の分割コンパイルってのに加えて,
- 2重インクルードを誤解している可能性がある.(900のコードは2重インクルードしてない.)
- ヘッダにインクルードガードがない.(2重インクルードしてないので必要性を理解してないかも.)
を指摘致します.


919 :デフォルトの名無しさん:04/07/29 12:16
こういう場合は2重インクルードがどういうものかを云った方が楽
「こうじゃない」ではなく「こうだ」の方が理解しやすい

920 :914:04/07/29 12:19
>>919
じゃ隗さんどうぞ.


921 :デフォルトの名無しさん:04/07/29 12:33
>>913
テンプレートの部分的特殊化ってVC++6.0はサポートしてたっけ?


922 :913:04/07/29 13:09
>>921
そういえばそんなようなこと聞いたような…
コンパイラのせいだったらどうしようもないですね…
別の実装方法考えることにします。

923 :デフォルトの名無しさん:04/07/29 15:08
VC++7.1ならOKだよ。
タダで使えるVisual C++ $2
http://pc5.2ch.net/test/read.cgi/tech/1086287039/
これでもOK。

924 :900:04/07/29 19:22
丁寧に解説していただきありがとうございます。


925 :デフォルトの名無しさん:04/07/29 19:28
お礼直後の質問で申し訳ないのですが参考サイト先の #ifndef INCLUDED_DATE(Date.h内の記述)というものがありますが
#ifndef INCLUDED_のあとにはヘッダファイルの名前を大文字で入れなくてはいけない決まりなのでしょうか。
レベルの低い質問でスミマセン。。

926 :デフォルトの名無しさん:04/07/29 19:42
よく読んでないけど
何回も読み込むと型を何回も定義するから
それを避ける為に一度読んだヘッダーファイルならば再度読まないようにしてんじゃね?

927 :デフォルトの名無しさん:04/07/29 19:55
別に決まっているワケではない。暗黙の了解的になっているだけ。実際の動作としては、
// common.h
#include <date.h>
...
// source.c
#include <date.h>
#include "common.h"
...
例えば上の様にソフトが組まれていた場合、コンパイラは2回 date.h を組み込むワケだけど

#ifndef INCLUDED_DATE
#define INCLUDED_DATE
// INCLUDED_DATEが宣言されてないので有効
...
#endif
#ifndef INCLUDED_DATE
#define INCLUDED_DATE
// INCLUDED_DATEが宣言されているので無効
...
#endif
という様に無駄が出ない(名前がぶつかってエラーになる等を発生させない)ようにしているだけ。

928 :デフォルトの名無しさん:04/07/29 21:21
コピーコンストラクタを利用するとポインタ値がコピーされないため、
デストラクタによってポインターを削除されないのですが、
関数内での演算の結果は元の配列に反映されませんよね。
で、この関数内での演算の値を元の配列に返したいのですがどのようにすればよろしいのでしょうか?
例えば下のプログラムでfugaの値の変更を反映させるにはどのようにすればよいのでしょうか?

class hoge{
public:
int* a;
hoge(){a = new int[10];};
hoge(hoge& other){a = new int[10]; for(int i = 0; i < 10; i++){a[i] = hoge.a[i]};
~hoge(){delete [] a;};
}

void main(){
hoge fuga;
for(int i = 0; i < 10; i++){
fuga.a[i] = i;
}

fuga(hoge& fuga);

}

fuga(hoge& fuga){
for(int i = 0; i < 10; i++){
fuga.a[i] = fuga.a[i] + 10;
}}


929 :デフォルトの名無しさん:04/07/29 21:32
>>928
もう少し落ち着いてせめてコンパイルが通るコードを(笑)


930 :デフォルトの名無しさん:04/07/30 00:40
MSDOSプロンプトなるものを使ってて、この矢印が
 ↑
← →
 ↓
こうなってるのはナンダ?と思って押したら全画面表示になってしまったんですけど、
これってどうやって戻すんでしょうか…?

もう1つ申し訳ないのですが、
C――WINDOWS
 ┠―sample
同じ階層のWINDOWSディレクトリからsampleディレクトリに
カレントディレクトリを変更したいのですが、これはどのように命令したらよいのでしょうか。

C以前の、大変くだらない質問だとは思うのですが、どなたか助けてください。。


931 :デフォルトの名無しさん:04/07/30 00:44
>>930
板違い

932 :デフォルトの名無しさん:04/07/30 01:15
>>914
アドバイスを受けて自分なりにインクルードガードを使用したソースにしてみました。
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/lounge/file/1074774948_27/teisei.txt
こんなかんじでいいのでしょうか。

933 :デフォルトの名無しさん:04/07/30 02:17
>>930
>DOS
自分もやり方がわからないけど、
ウィンマークのキーを押して、タクスバーが出てくるから、
そこで右クリックして閉じる。また開いても元に戻っている。

>ディレクトリ
WINDOWSディレクトリの中にsampleがあるなら、cd sample (Enter)、
違うなら、cd .. (Enter) の後、cd sample (Enter)。

934 :デフォルトの名無しさん:04/07/30 02:59
>>930
Alt+Enter

935 :デフォルトの名無しさん:04/07/30 03:41
>933、934さん
Cを今日から本を読みながら始めたものの、説明すらないような箇所で詰まる有り様で。。
親切に教えてくださいまして大変助かりました。

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



936 :デフォルトの名無しさん:04/07/30 07:51
>>935
全画面表示はEXITコマンドでDOSプロンプトごと終了させる方法もある

937 :デフォルトの名無しさん:04/07/30 12:25
>>935
つーか本が良くないし足りない

938 :デフォルトの名無しさん:04/07/30 13:54
>>935
まずはvi覚えましょう。
話はそれから・・・

書籍の参考サイト
http://www.1point.jp/~book_2ch/


939 :デフォルトの名無しさん:04/07/30 18:00
DLL を作る利点ってあるのか?


940 :デフォルトの名無しさん:04/07/30 18:41
>>939
あります

941 :914:04/07/30 20:01
>>932
Good!


942 :デフォルトの名無しさん:04/07/30 23:03
>>939
DLL を使わないと書けない実装もある

943 :デフォルトの名無しさん:04/07/30 23:08
フックでコードインジェクションする場合とか

944 :デフォルトの名無しさん:04/07/31 00:01
>>942
良い回答

>>940
…('A`)

945 :デフォルトの名無しさん:04/07/31 00:20
>>936-938さん
皆様、助言や忠告をありがとうございます。m(_ _)m

946 :デフォルトの名無しさん:04/07/31 04:36
a,b,2つの変数で、
#define max(a,b)(((a) > (b)) ? (a) : (b))
となる場合、max(a,b,c)はどんな風に書けば良いのでしょうか?

947 :デフォルトの名無しさん:04/07/31 04:47
max(max(a,b),c)

948 :デフォルトの名無しさん:04/07/31 04:57
>>947
ありがとうございます。ですが、知りたかったのは右側の方で、
max(a,b)が、(((a) > (b)) ? (a) : (b))ならば、
max(max(a,b),c)は、どう書けば良いのでしょうか。
((((a) > (b)) ? (a) : (b)) > (c)) ? (((a) > (b)) ? (a) : (b)) :(c))
になるんでしょうか?

949 :デフォルトの名無しさん:04/07/31 05:09
#define max(a,b)(((a) > (b)) ? (a) : (b))
#define max3(x,y,z) (max((x),max(y,z)))

950 :デフォルトの名無しさん:04/07/31 05:22
>>949
そうか、定義したものをそのまま使えば良かったんですね。
ありがとうございました。

951 :デフォルトの名無しさん:04/07/31 05:26
向いてないかもな

952 :デフォルトの名無しさん:04/07/31 05:32
fooって何?

953 :デフォルトの名無しさん:04/07/31 05:43
>>952
hoge


954 :デフォルトの名無しさん:04/07/31 09:54
>>952
どーでもいーとき用
barなんてのもあるな

955 :デフォルトの名無しさん:04/07/31 13:28
>>954
foo = hoge
bar = fuga


956 :デフォルトの名無しさん:04/07/31 15:10
char *p;
p = "あいうえお";
はOKで
*p = "あいうえお";
がダメなのはわかるんですが、

char *p = "あいうえお";
はなんでOKなんでしょうか?


957 :デフォルトの名無しさん:04/07/31 15:18
>>956
char *p;
char型のポインタpを宣言する。

char *p = "あいうえお";
char型のポインタpを宣言し、"あいうえお"で初期化する。

958 :デフォルトの名無しさん:04/07/31 15:21
>>956
「*」の二義性


959 :デフォルトの名無しさん:04/07/31 15:25
char*          p = "あいうえお";
とでもしてみるか?

960 :デフォルトの名無しさん:04/07/31 15:26
>>959
それだけは勘弁!


961 :デフォルトの名無しさん:04/07/31 15:29
そのあたりに躓いて
char* p = "あいうえお";
って感じにコーディングする人も多かったりする。

962 :デフォルトの名無しさん:04/07/31 15:30
お、リロードしてなかった。
959とかぶっちまったぃ。

963 :956:04/07/31 15:36
>>957>>958
すいませんさっぱり分かりませんorzと思ったのですが、
>>959で何となく分かりました。
char *p = "あいうえお";というのは
*(p = "あいうえお");と同じことなのかなと。
でも>>961を見るとchar*とかint*という感じで理解したらだめなんでしょうか?
コンパイル時のエラーでvoid *からint *に云々〜なんてのを見たりするので。

964 :デフォルトの名無しさん:04/07/31 15:40
>>963
>*(p = "あいうえお");と同じことなのかなと。
違う違う違う。
変数の宣言時の * は、ポインタの逆参照の意味は持たない。

965 :961:04/07/31 15:47
う〜ん。
つまりは>958氏の言っていることなんだけどね・・・

char *pの*は、pの型がcharへのポインタだと言っている訳で、
ポインタの指す実態を表す*とは違うということ。

変数を宣言している場所と、その変数を使用している場所では、
*の意味が違うってことを理解しないといけない。

966 :デフォルトの名無しさん:04/07/31 15:49
const付けろよデコ助ヤロウ

967 :デフォルトの名無しさん:04/07/31 15:53
char* p = "あいうえお";
でコンパイルエラーにならないのは何故だろう(VC++6,0)
const char* な値を char* に代入しようとしてるんじゃないの?

968 :956:04/07/31 15:56
なるほど・・・そういうもんだって覚えるしかない文法ってことでしょうか。
そういう理由で>>957>>958の説明になるわけですね。
1週間くらい悩んでたのですっきりしました。本当にありがとうございます。
>>966
すいませんconst調べてきます。



969 :デフォルトの名無しさん:04/07/31 16:00
>>963
>でも>>961を見るとchar*とかint*という感じで理解したらだめなんでしょうか?
僕のお勧めは
char *p /* 「*p」がcharであるような変数pを定義して… */
= "あいうえお"; /* 初期化 */
と見る方法。
これだと、int (*(*p)(void))[3];のような複雑な宣言もそのまま読める。
但し、普通に出会うのは単純なポインタが圧倒的なので、
char*を一塊としてみるのが悪いわけではない。

>コンパイル時のエラーでvoid *からint *に云々〜なんてのを見たりするので。
型に言及する時は、宣言の構文から名前を省いたものを使う。

>>967
文字列リテラルは特例

970 :デフォルトの名無しさん:04/07/31 16:01
>967
負の遺産

971 :デフォルトの名無しさん:04/07/31 16:16
もっともVCは文字列リテラルの書き換えもできるという罠。

972 :デフォルトの名無しさん:04/07/31 16:49
この流れを見るとVC6だけがおかしいみたいに見えるけど、そうじゃない。

973 :デフォルトの名無しさん:04/07/31 17:00
>>969
先生〜、まだポインタを理解できてないんで教えてください。
int (*p)(void);
だと int function(void) のような関数名を表すpて意味だと。
(ここの解釈がそもそもコレで合っているのか不安。関数名を格納しているワケではないし。)
int (*(*p)(void))[3];
って 関数へのポインタの配列(要素数 3)p という意味で良いんですか?

974 :デフォルトの名無しさん:04/07/31 17:12
>>973
関数のアドレスを格納し、関数を指し示すポインタ

975 :デフォルトの名無しさん:04/07/31 17:37
>>973
>って 関数へのポインタの配列(要素数 3)p という意味で良いんですか?
良くない。
(*(*p)()))[2]がintだと言う意味を良く考えろ。
まずpを間接参照し、呼び出し、間接参照し、要素アクセスしているんだから、
pはポインタで、何を指すかと言うと関数で、何を返すかと言うとポインタで、何を指すかと言うと配列で、要素は何かと言うとint
と読む。
まとめると、intの配列(要素数3)へのポインタを返す関数(無引数)へのポインタ

976 :デフォルトの名無しさん:04/07/31 18:10
しんすれ
http://pc5.2ch.net/test/read.cgi/tech/1091264964/

977 :973:04/07/31 18:20
>>974,975
なるほど、目から鱗ですよ。
ありがとうございました。

978 :デフォルトの名無しさん:04/07/31 19:37
class A() { };

A func() {
 A a;
 a.(ry
 return a;
}

const A& a = func();

これでfunc::aの寿命が延びるのは保証されてますか?

979 :デフォルトの名無しさん:04/07/31 20:00
まず、func::aなどない。
それと、保証もなにも、aが有効なのは、関数内のみです。

980 :デフォルトの名無しさん:04/07/31 20:14
const referenceで受け取った戻り値の一時オブジェクトの寿命が延ばせるって聞いたのですが。
あと、後のaと区別するためのfunc::aは適切な書き方が思いつかないのでそう書いただけです。

981 :デフォルトの名無しさん:04/07/31 20:24
>>978
とりあえずコンストラクタ、デストラクタ、コピーコンストラクタに
メッセージ出力させるようなprintf等書いて、どう動作してるか確かめてみ

982 :デフォルトの名無しさん:04/07/31 21:45
C言語の質問です。
staticというものが本に出ていたのですが、”静的に・・”と書いてあるだけで
いまいちよくわかりません。
1.一応理解したと考えているもの
void hoge(){
static a=0;
 :
}
上記は関数を抜けても値を忘れない変数と理解しました。
(関数内でしか使用できないグローバル変数みたいなもの?)

2.理解できないもの。下記のbがaとどう違うのか?
int a=0;
static int b=0;
void hoge(){
 :
}

3.理解できないもの。関数の前に付くstaticは普通の関数とどう違うのか?
static void hoge(){
 :
}

よろしくお願いします。

983 :デフォルトの名無しさん:04/07/31 21:57
>>982
2のint aはそのソースファイル以外でも使えるグローバル変数。
static int bはそのソースファイル以外からは使えない変数。

3もそのソースファイル以外からは使えない関数となる。

984 :デフォルトの名無しさん:04/07/31 22:15
>>982
スコープを勉強ちぅですか

まず、記憶クラス指定子を書かないとautoになる事を前もって抑えておきます。

1.
ソースファイル一つを関数一つと考えるとその通りです。
ただ関数内のグローバル変数という時点でグローバルでは無いわけですが
”変数の範囲”としてはそう考えていいでしょう。

2.
外部変数(グローバル変数)になった時だけ、両方の意味が同じになります。
少しの違いといえばintなら0で初期化されるかされないかの違いぐらいで、
staticを使ったからといって通用範囲が狭くなるわけでもありません。

3.
通常で関数はexternで宣言をされている為
前もってプロトタイプを宣言しておけば外部から参照可能ですが、
static関数はそのファイル単体でしか使えません。

985 :デフォルトの名無しさん:04/07/31 22:15
>>982
3に関しては、
static void hoge(void);

void hoge(void)
{
}
でもファイルスコープになるので要注意。

986 :984:04/07/31 22:16
少し調べてみたければ
・スコープ、もしくは適用範囲
・外部変数、グローバル変数
などで調べれば色々見つかるでしょう

987 :デフォルトの名無しさん:04/07/31 22:32
>>978
const A& a=A(); はヲケ。一時オブジェクトはaがスコープを抜けるまで保持される。
以下はうろ覚え。
const A& a=func(); これだと保持されるのはfuncの戻値のコピーである一時オブジェクト。

988 :982:04/07/31 22:40
>>983-986
確認してみたところ、皆さんのおっしゃる動作となりました。
3の日本語がかなり変でしたが返答くれてありがとう。

989 :デフォルトの名無しさん:04/07/31 23:56
staticの二義性が混乱をまた呼んでいるな
externを同時に勉強しなさい

990 :デフォルトの名無しさん:04/07/31 23:58
>>984
嘘を教えちゃいかん

991 :デフォルトの名無しさん:04/08/01 00:04
>>959 >>961
char*      p = "あいうえお", q = "かきくけこ";
と書くヤシが出て来そうだ


992 :デフォルトの名無しさん:04/08/01 00:05
992

993 :デフォルトの名無しさん:04/08/01 00:05
993

994 :デフォルトの名無しさん:04/08/01 00:12
994

995 :デフォルトの名無しさん:04/08/01 00:12
995

996 :デフォルトの名無しさん:04/08/01 00:14
996

997 :デフォルトの名無しさん:04/08/01 00:15
997

998 :デフォルトの名無しさん:04/08/01 00:16
998

999 :デフォルトの名無しさん:04/08/01 00:16
1000

1000 :デフォルトの名無しさん:04/08/01 00:17
1000

1001 :1001:Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。

254 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.02 2018/11/22 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)