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

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
エスケープシーケンスや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
>>1
C#がわからないかわいそうな人たちのスレ
>>1
dクス
>>1
乙かれ〜
9デフォルトの名無しさん:04/06/05 12:10
void hoge(int &num, ...);
try{} catch(...) {}

引数の「...」には何か意味があるのでしょうか?
書籍とかで調べたのですがのってないです。
>9
「C C++ 可変個 引数」とかで検索してみな
>>9
catch(...)ですべての例外を補足することになる。
C++で不定引数を使う場面はこのcatchぐらい。
>>9
...は、放っておくとコンパイラが勝手に3文字入れて補完してくれます。
「まんこ」なんて文字が当てはめられる事も。
>>12 ウソはよくないね
これは throw ... を捕捉するためのものね
BMPからRGB値を取り出して表示させる物が作りたいのですが
どうすればいいでしょうか?
>>14
RGB値の定義が不明だが、BMPを走査してRGBを取り出して表示すればいいんじゃないの?
その走査のやり方が分からない初心者なんです
どこか簡単な解説サイトか何かありませんか?
int (1), (2), (3);
(1) = 1*hoge;
(2) = 2*hoge;
:

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

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

C++で宣言が通るのは int(x)ってのができるから
int(1), (2), (3); → 1, 2, 3;
になるからなんじゃないかな。
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に戻す方法をおしえていただけませんか?
2220: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
としかられて困ってるんです。
#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;
}
スレ誘導してくださった方ご迷惑をおかけしてすいません。
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
というエラーが出ますが、どうしてでしょう?
初歩的な質問ですがよろしくおねがいします。
そりゃ出来ないだろう。
#include <stdio.h>
int main()
{
  printf("釣られた?\n");
  return 0;
}
>>27
それでできました。
main()の前にintが必要だったんですね
C言語を無料で公開してるサイト教えれ
>>25
>スレ誘導してくださった方ご迷惑をおかけしてすいません。
いや漏れが悪い。たらいまわしのようにしてしまってスマン...orz

Windows下では単純に
  BOOL bRtn = ::CreateDirectory("C:\\test\\test", 0);
なのだが...
#include<stadio.h>
int main()
{
  printf("こんにちは\n");
  return 0;
}

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

int nRtn = _mkdir("C:\\test\\test");
>31
二段構えの釣りかよ
3631: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氏ね");
}
}
3831:04/06/06 21:01
何で1000回と一定回数にするんだろう? while(1)使えよ低脳w
39デフォルトの名無しさん:04/06/06 21:02
>>30さま
>>32さま
>>34さま
ヒントどうもです。
これからいろいろ調べてみようと思います。
どうもお世話になりました。
あ、あの…
PCを去年の6月に初めて購入した者ですが
プログラミングって何から始めればよいのでしょうか…
>>39
力になれなくて申し訳ないでつ
気を落とさずにまた来てくださいでつ
>>40
プログラムの文法よりも
アルゴリズムを学べ
>>41
まずは、自分がどうしてプログラミングを勉強したいのか、
(あるいは、本当に勉強したいのか) よく考えてみるところから
始めてみてはどうでしょうか。
4443:04/06/06 22:31
>>41 でなくて >>40 でした。
失礼しました。
>>39
最初にスレ違いと言った手前、一応補足。
Unixにはmkdir()がある。Windowsでも_mkdir()が使えるはずなので、それを使うのも手。
いずれにしても、両OSで共通のソースにしたいなら喩え中身が
CreateDirectory()やmkdir()だけでもそれだけで関数にしておくことをお勧めする。
いっそ、その他のOS依存関数もまとめておくと尚いいかと。
>>40
このスレ的にはC/C++を学びたいと思っていることを前提にすべきかもしれんが、
もし貴方がExcel使いならマクロを登録してVBAから始めるのがいいかも。
>>45
MkDir系の関数はなんで処理系依存になって、
言語実装されなかったんですかね。
そんな抽象化の難しいもんじゃないような気がするんですが...
MkDir系がダメならOpen系(fopen)もダメだと思うんですが。
全てのファイルシステムが階層ディレクトリをサポートしているわけじゃないから。
参りますた。逝ってきます・゚・(ノД`)・゚・
どうでもいいんだが、size_t 型の t って何だ?
typoだろ
size_tanasin
VisualStudio.Netです。
MFC C++でダイアログベースでアプリを作ってるのですが、
CStirngに格納されたデータ(\r\n入り)を印刷するときに、
DrawTextを使って印刷してるのですが、
複数枚にわたる印刷が出来ません。
どうしたらいいのでしょうか?
54デフォルトの名無しさん:04/06/08 14:27
他のとこでも聞いてますがここでも教えて下さい。

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

と言う問題なんですが厨房のオレにはさっぱりで
数値や変数の型などは自由で良いみたいなので模範解答みたいのをお願いします。
よろしくお願いします。
(´ι _` )アッソ
>>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]);
}}}
>>56
出席番号は?(w
>>53
EndPage
StartPage
5953:04/06/08 16:44
>>58 さん
もうちょっとヒントください
ちっとは検索するとか、自分で頭ひねって考えるとか
してみようとは思わんのかね、まったく・・
趣味グラマにしても、これから勉強始める素人にしても
駄目すぎだろ、それじゃ・・
MFCはスレ違いだから
6253:04/06/08 17:11
>>60
MSDNひっくり返してみてるんですがね、、、
検索も試したんですが、いいのが当たらなくて
"VC++" 印刷
でいいんですよね?
>>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)
となるのでしょうか?
>>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型に作り変え、同じように
添え字を省略して、一度に表示できるのでは?と
したのですがうまくいきません。
どうしてなんでしょうか。よろしくお願いします。
>>66
そんないい加減な本は使うな。
>>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");
}
}
}
6968:04/06/08 19:26
アスキーコードでは無いな
>>68
setlocaleつかうんですか。
もう、初心者向けの本だけじゃダメですね。
リファレンス買わなきゃ。

LSI-C試食版じゃ動かないので、まだ確認はできませんが、
どうもありがとうございました。
71デフォルトの名無しさん:04/06/08 20:09
windowsのLightCっての使ってるんですけど、
これってコマンドプロンプトでCのプログラムが実行されちゃうんですけど
不便なんで
メモ帳かどっかに実行結果が出るようになりません?
コピペできる方法でも結構です。
コマンドプロンプトからコピペ汁
>hello.exe > out.txt
74デフォルトの名無しさん:04/06/09 00:10
>>68
>>69
ひらがなじゃないですよね?
>>74
文字コードの勉強をし直せ
76デフォルトの名無しさん:04/06/09 00:57
>>75
ごめんなさい。勉強します。
コンストラクタをオブジェクト生成時以外に呼び出して
初期化をするって方法が、あったような気がしたのですが
なかったでしょうか?

検索して手持ちの本も探してみましたが見つからなくて
javaをちょっとかじってたので勘違いかもしれないのですが
79デフォルトの名無しさん:04/06/09 01:50
今手元にパソコンがないので調べられないのですが、
int a;
a=5;
1/2*a;
と、
int a;
a=5;
1/2.0*a;
では計算結果は異なるのでしょうか?
>>79
上はint型下はdouble型
8179:04/06/09 01:58
>>80
ということは計算結果は、2と2.5になるという事ですね!
ありがとうございました!
>>79
さらにいうと

上  int型  0

下 double型 2.5

1/2=0

1/2.0=0.5
8379:04/06/09 02:06
ただの1/2やっただけでも、計算結果は0.5じゃなくて0になるんですね……(汗
うーむわかりにくいですねぇ(笑
式の評価を優先的にする括弧()の事をなんて言うんですか?
本で調べた所、演算子では無さそうなんですが。
あと、()の中は他の演算子よりも最優先に評価されるのでしょうか?
例えば、
*(pDest++)=*(pSrc++);
のような場合、どの順で評価されるのですか?
よくある勘違いだが () は結合順位を指定するもので評価順を変えるものじゃないぞ
86デフォルトの名無しさん:04/06/09 03:04
素朴な質問を書かせていただきます…
int x;
x=5;
0.5*x;
この場合は計算結果はどのようになるのでしょうか?
>>86
やってみればいいじゃん。
88デフォルトの名無しさん:04/06/09 03:19
>>86
手元にパソコンがないのでできないんですよ(汗
解答よろしくお願いします…
8988:04/06/09 03:20
>>86 ×
>>87
keyword 算術変換
float * int → float * (float)int = float
0.5 * 5 → 0.5 * 5.0 = 2.5
9188: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言語始めたばかりの俺にはさっぱりです。良い例をください。
お願いします。
>>90
doubleだろ。
94デフォルトの名無しさん:04/06/09 10:37
>>92
int a[3][3]とint b[3][3]を用意して、そいつに初期値を定義。
あとは普通に行列の計算。
>>92
すっとぼけた回答をするなら、
まずはHello worldからはじめて、徐々にステップアップしようよ。
マジレスするなら、
宿題スレへ逝け。

「さっぱり(わからない)」なんてキーワード使う奴は、叩かれて当然。
「初心者です」、「いまいち」も叩きたくなる。
>>92に言ってるわけじゃないよ)
>>24さん
返事が遅くなりましたがありがとうございました。
とっても助かりました
感謝感謝です
86>この場合は計算結果はどのようになるのでしょうか?
計算結果は捨てられます。
>>85
結合性のことすっかり頭に無かったです。。。
レスありがとうございました!
結合性というとまた別の意味に。。。
質問です。
unixでCかC++で文字コードを変換(SJIS<->EUC)したいんですけど)
どうすればいいですか?
nkf使ってsystemで動かすのもナンセンスっぽいし・・・
いいライブラリとかありませんか?
man 3 iconv
>>102
あっさり解決しました。
感謝です。
printf("%0X",hex_value);
に相当する処理をiostreamを使ってやりたいんだけどどうしたらいいですか?
(0x0F -> 0f, 0xFF -> FFみたいに表示させたい)

std::cout << 他の出力 << 16進表示
のように使いたいんでprintfは使いたくないので…
>>104
int n = 0xff;
std::cout << std::hex << n;
以下のプログラムを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;
}
>>106
C> time /?
>>107さん
なにもかわりませんが・・・
>>108
あー、もしかしてtime.exeって名前にしてない?
>>109さん
そうですが・・・なにかあるんですか?
>>110
timeはWindows標準のコマンドなんでtimeって打ってもtime.exeは実行されない
>>111さんありがとうございます
time.exeからtimer.exeに名前を変えたらうまくいきました
dくすです
113104:04/06/12 01:14
>>105
それだと n = 0x0fの時に 0f ではなく f と表示されちゃうんで困ってます。
%02x
>>113
<< std::setw(2) << std::setfill('0')

とりあえず表示されるようにはなるだろうけど、たぶん罠に嵌るだろう。
>>113
とりあえず、マニピュレータ/処理子を使って書式を指定するってことさえ分かれば、
あとは開発環境のマニュアル読むなりC++の教科書見るなり、いくらでも調べられるやん。
当然、桁揃えを指定するマニピュレータもあるわな。
>>104
boost::formatとかがお勧め
vc .net 2003で
stlPort-4.6.2をnmake -f vc71.makでビルドするとき、
_STLP_NO_OWN_IOSTREAMSのコメントを外しているとエラーが出てビルド完了しません。
なんとかする方法ありませんか?
>>118
そのエラーってのが何かわからないと誰も答えようがないだろ?
120118: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*)' はすでに実体を持っています。
・・・のようなものがたくさん出てきます

121109:04/06/12 08:13
ちっ、指摘しただけじゃ感謝されないかw
同一人物だと思っていると思われ。
(かといって同一人物のとき両方にレスされると
全部漏れなワケだが...となるワケだが)
>>122さんのいうとおりです
同じ方だと思っていました
>>109さん>>111さんありがとうございました。
俺も今読んでて同一人物だと思ってた。
125デフォルトの名無しさん:04/06/12 15:35
MFCで初めてプログラミングしているのですが、
超初心者的な質問をさせてください。

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

それと、ボタン押下でアプリケーションを終了させるときは、
DestroyWindowでよいのでしょうか?
最近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試食版を使用しています。
>>127
int a;
>>127
インタ君
つーか、標準入力のバッファリングの話だろ?
131127:04/06/12 22:50
>>128さん >>129さん
ソースではちゃんと int a; になってました;;

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

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

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

本当にありがとうございました。
int32型って
printf 出力するとき
%d で良いのでしょうか?
>>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]と書きそうなものですがこっちだとエラーが出ました。
136デフォルトの名無しさん:04/06/14 15:24
あれ?
fib[20]と宣言したときの要素はfib[0]...fib[19]までだよな?
なんかあぶなっかしいな。
137デフォルトの名無しさん:04/06/14 15:27
char型の配列(char str[256]とか)をstd::stringに変換するにはどうしたらいいのでしょうか?
string(str)
139デフォルトの名無しさん:04/06/14 15:43
>>138
char str1[256]を string str2にコピーしたいとき、どうすればよいのでしょうか。
string(str)というのがstr2(str1)という意味かと思いやってみましたができませんでした。
140139:04/06/14 15:52
ごめんなさい!できました。ありがとうございました。
141デフォルトの名無しさん:04/06/14 16:46
ところで条件とか指定しないループ書くとき
for (;;)
って書く奴と
while (1)
って書く奴といるけど違いは何?
好みの問題?
>>141
うん。
>>142
なんだやっぱそっかー。
thx
while(1) だと条件式が定数なので、賢いコンパイラだと警告されることがある。
>>144
それって賢いのか?(w
147141:04/06/14 20:09
>>144
へーそうなんだ。レスアリガトサン。

>>145
あーあったのか

>>146
初心者がドヂったの注意してくれる点では賢い罠。
確かにそんなの警告出されちゃおせっかいっちゃおせっかいだが。
ま、for(;;)でいっか。
for(;;)はOKでwhile(1)はNGってなんか変な仕様ですね。
クラスについてよく分からんのです。
(LPSTR) CHoge::Hoge
という感じにするとHogeの文字列が戻るとして
MessageBox(NULL,CHoge::Hoge,"hoge",MB_OK);
と確認するとしっかり文字列が表示されるんですが、
もう一度
MessageBox(NULL,CHoge::Hoge,"hoge",MB_OK);
とやると、何も表示されないか全く別の文字が出てきます。

何で続けて呼び出すと文字列が出てこないんでそか。
>>149
>(LPSTR) CHoge::Hoge
>という感じにするとHogeの文字列が戻るとして
ここが怪しい。ソース晒せ。でないと誰にも分からん。
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を使ってやってるのすが、すっきりしません。
こういう場合、普通は(オブジェクト指向的に?)どのように作るものなのでしょうか?
Statusを監視するだけのクラスを作る
そいつにStatusのポインタを持たせる

以上
これか。http://pc5.2ch.net/test/read.cgi/tech/1086185282/254
「あまり相手にされなかった」って、お前、レスもらっといて無視してんじゃねぇか。
154デフォルトの名無しさん:04/06/15 01:13
確かにレスは頂いて、ちょっとソースを書いて貰うように再度お願いしたのですが
その後何も音沙汰なかったので。加えて周りの方の話題が私にとって
ちょっと高度なので場違いなのかと思いまして・・・
>>151
> 現状ではfriendを使ってやってる
とりあえずこいつをコンパイルできる状態で晒せ。
あと、どうすればお前が「すっきり」するのかも明記しる。
>>154
ソース書いてと言われて素直に応じる奴はここにはいないと思う。
そーっすね
>とりあえずこいつをコンパイルできる状態で晒せ。
今手元にコンパイルできる環境がないのでソースは晒せません。
申し訳ないです。要はset()関数を呼ぶクラスに対してfriend宣言してるだけです。

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

void Status::set(const ACertainClass& ある物, int i)
{
  if (ある物.状態())  // == true は嫌 (CのFAQ参照)
    dat = i;
}
>>151 >>158
なんかイマイチやりたいことがわからんが、
>いくつかのクラスで共有したいデータがあ
るんだったらデータを管理するクラス一個作ってほか「いくつかのクラス」とやらは継承したら?
そゆことじゃなくて?
>>159 もいいと思う

・・・っていうかやっぱ漠然としすぎてて良く分からん
もうちょっとでいいから具体的なソース晒せ
162160:04/06/15 03:01
ちょっと補足。

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

メイン関数は
  Status st;
  // 監視側
  st.set(ある物, 1);  // set_if()って名前にした方が良かったかな
  // 表示側
  if (st.is() == 1) {
    表示;
  }
ってなります。
#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言語です。
>>163 Cでは配列型の代入はできない。
>i.name=buf;
多分
strcpy(i.name,buf);
でしょ!?
>>165
char buf[] = "abc";
ならそれでもいいんだけどな。
167165:04/06/15 03:20
>char buf[] = "abc";
>ならそれでもいいんだけどな。

へ?何が違うの?:(*゚Д゚)
'\0'忘れてるからでわ
>>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 * に変換できないんでしょうか?
>>174
できるけど多分君は危険な事やろうとしてるから教えない。
176デフォルトの名無しさん:04/06/15 10:34
いきなりすみません;

二次元配列のメモリの確保のしかたを教えて欲しいんですが…
178初心者:04/06/15 11:28
>>175
初心者なので、なぜ危険なのかもわかりません。
よろしくお願いします。
>>178
なぜconstが付いてるかよーく考えろ
>>175
const char*x="ABC";
char*y=x;
これだとコンパイルエラー(当たり前だが)
でも、
const char*x="ABC";
char*y=(char*)x;//キャストね。
これだとコンパイルエラーにならないし実行も出来る。
だけどむしろ、んなことする意味がない。
だってconstで宣言したってことは最初から

変 更 し た く な い か ら だ ろ !
↑おっと>>175っつーか>>178だった(汗
175と179はいいこと言ってる。
>175 まぁちょっとしたアドヴァイスだが、いぢって欲しくないんだconstにした意味
constはずしちゃうと警告とかされずにいぢれちゃうだろ?
183初心者:04/06/15 13:07
調べたら初期化は出来ても代入は出来ないということみたいなんですが。
184182:04/06/15 13:08
おっと>175っつーか>178だった(W
>>183
だから何?
186初心者:04/06/15 13:11
弄れる方法はあるんですよね?
あるよ
でも弄ったら高確率でバグの元になるぞ
>>184
オモロイ(W
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はできるのですが・・。
>>193
std::string ⇒ char* なら
std::string::c_str()
そうだね。いっかいchar*に変換すればあとは煮るなり焼くなり好きにできるね。
CとC++の勉強をしたいのですが…
ボーランドCとビジュアルCでは構文が違いますか?

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

なわけだが。
203デフォルトの名無しさん:04/06/15 19:37
へ〜そうなんだ。
Cしか使えない状況に陥ったこと無かったから知らなかった。
ん?ってかC99っていったい何すか?
>>196
金がないならフリー版の前者。
金があるなら後者。
おいらは金がないのでVC++はもってない&よくわからん。
が、知人はVC++でプログラム作ってると謎のエラーが多いと言っていた。
いやコンパイルエラーとかランタイムエラーじゃなくて、
VC++自体が固まっちゃうとか・・・。
どうもM$の製品は時に我われの期待を裏切る挙動をするらしい。
>>196
文法は基本的に同じ。
固有の拡張もあるが、これからはじめる奴が気にする必要は無いだろう。
207デフォルトの名無しさん:04/06/15 20:35
すいません、部活全員で悩んだんですが知識0でわからず・・・
サイト検索してもその意味がわからず・・・・。。
「VineLinux2.6r4(i386)の環境」ってかいてあったんですが、
これはCPUがインテル386ということなのでしょうか・・・
それとも全く関係ないのでしょうか・・・とつぜん申し訳ありません、
VineLinuxというの自体がわからず、とりあえずプログラミング関係の
サイトだったのでここにこさせていただきました。。
CPUがインテル386ということ
VineLinuxというのはOS

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

こっちに逝く
ぼるじょあがC/C++の宿題を片づけますYO! 24代目
ttp://pc5.2ch.net/test/read.cgi/tech/1086612317/l50
>>208
普通はインテル386「以降」って言うよな
>>207
とりあえずLinux板がある
212sage:04/06/15 22:52
207です。。申し訳ありません。。そちらのほうへ行ってきます
CreateWindowExで作ったウィンドウにフォームビューダイアログを貼り付けたいんですが、
ウィンドウのwidth/heightとフォームビューリソースのwidth/heightが合いません。
どうやって合わせたら良いんでしょうか。
>>213
フォームビューをCreateするときnIDに AFX_IDW_PANE_FIRST を
指定するとMFCが勝手にリサイズ処理をしてくれまつ
215151: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;
216151: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;
}
}
};
217151: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;
}
>>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() を呼び出せないようにしたいと解釈したんだけど。
↑オーバーライドだった
鍵はconstのような希ガス。
>>214
サンクス
んでもスンマソ、現状MFC使わずにやってるんで、このまま使わずにやってみたいんですわ。
オーバーライダー
224デフォルトの名無しさん:04/06/16 03:21
>>172
ポリモフィズム・・・。ポリモーフィズムって覚えてたよボク・・・。
なんかコンピュータ用語って「−」をryすけど、これってどうゆうこと?
>219のオーバーロードなんてオバロドじゃん。
あ、英語のスペルで書いたときrのせいで伸びちゃうやつだけryすの?
そういやコンピュータはコンピュタじゃないな。
とふと思ってぐぐってみたよ。
ポリモフィズム の検索結果 約 856 件中 1 - 10 件目 (0.20 秒)
ポリモーフィズム の検索結果 約 1,930 件中 1 - 10 件目 (0.24 秒)
ポリモーフィズムのが多いね・・・。
この辺の事情に詳しい人いますかぁ?
ポリモルフィズムって勢力もあるよ。

あとはこの辺
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を呼べなくなってしまいます
解決法をご教授願います
>>227
Hogeのなかで

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

でちゃんと呼べたけど…(gcc 3.3.1 cygwin)
他のところで間違ってるんじゃない?
229デフォルトの名無しさん:04/06/16 10:15
linuxとgccを使ってプログラムを作っているのですが、プログラムの中から自分自身が置かれているディレクトリのフルパスを取る方法を教えてください。

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

簡単なのかも知れませんが本当に困っているのでよろしくお願いします。
システムコールにあるのかもしれないが、
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
みんなコンパイラ何使ってる?
236227:04/06/16 17:55
>>228さんありがとうございます。
他のところも一応調べてみたのですが
どうも間違ってるようには感じられませんでした。
あいまいな聞き方かもしれませんが
vfptrがNULLになってしまう、考えられる要因を
教えていただけませんでしょうか。
後、遅れましたが環境はVC++6.0です。
一回、同様の現象が起こるはずのミニマムなソースを書けば?
それで起こらなかったら確実に元ソースが悪い。デバッグで追っていくか差異を調べる。
もし起こったらおそらくどっちのソースも悪い。そのソースをここに貼って指摘を待つ。
238デフォルトの名無しさん:04/06/16 18:06
ターゲットが95の場合、ビルドも95じゃないとダメ?
239227:04/06/16 18:44
すいません、解決しました。
クラスの初期化の方法に問題があったようです。
string型をchar*に変換するには何をつかえばいいんですか?
>>240
おそらくあなたが望んでいるのは c_str()でしょう。
もちろん入門書の類は持ってますよね。
あとは索引からc_strのページを見つけて、読んでください。
C言語でコンソールアプリを作っているのですが、
ディレクトリの存在を確認する方法ってありますか?
OSはXPです。system関数などでDOSのコマンド使っても
いいのですが。batファイルなんかだとif exist ....
ってのがありますが、これはsystem関数からは使えない
ようです。C言語の標準にも確認する関数はないですよねぇ?
できるんでしょうか。
chdir
244242:04/06/16 20:40
mkdirやchdirで、在る無いにかかわらず無理やりやる
方法もあると思いますが、その場合、存在しないと
エラーでシステムからメッセージが表示されちゃうん
ですよね・・・。エラーださないで、チェックだけを
する方法ってないもんですかねぇ。
245デフォルトの名無しさん:04/06/16 20:49
VC++スタンダード使っているけど、空のデフォルトコンストラクタが律儀に呼ばれてしまいます。
オプティマイザの付いているVC++Professionalだとちゃんと抑制されるんでしょうか?
その他、あまりにバカなコード生成に泣きたい思いです。
>>245
タダで使えるVisual C++ $2
http://pc5.2ch.net/test/read.cgi/tech/1086287039/l50
最適化付Pro版が手に入る
>>244
漏れなら、標準にこだわらず素直にWin32 API使う。そもそもchdirも
nkdirも標準じゃないんだし。

>>245
VS2003だと、debugだと呼ばれて、releaseはきれいになくなったよ。
>>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;
}
249242:04/06/16 21:48
みなさんレスどうもです。
やはりファイルシステムは処理系依存だから標準では
どうにもならんですか。素直にAPIとか使うしかないですね。
ちなみに
system("mkdir");
system("cls");
で、もしディレクトリ既存のエラーがでても一瞬出てすぐ消せますね(w。

余談ですが、C++のBoostにfilesystemってのがあるようですが、あれだと
チェックができてなおかつ移植性があったりするんですかね・・・。
ディレクトリも扱えないコンパイラってどんなの?
見たことないな
>>242
バッチコマンド使いたかったらcmd.exe経由で動かせばsystem()からでも使えなくはないけど…
APIで事足りるならそのほうがいいと思います。
つーか、system()使うとそれだけでDOS窓開くしねぇ。
>>249
エラー出力のリダイレクト
http://homepage2.nifty.com/winfaq/c/hints.html#548
system("mkdir 〜 2> NUL")
でも俺のWin98では無理だった……
他には一時的に文字の色を背景色と同じ色に変更してmkdirを使うとかw
* 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" );
}
unixのc++でスレッド書いてるんだけど
windowsのWaitForSingleObject
みたいに休止できるできるやつってありますか?
pthread_cond_waitとかはなんか違うっぽいし・・・
オススメはpollかなあ
256151:04/06/17 00:01
レスが遅くてすいません。

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

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

>要は Disp で set() を呼び出せないようにしたいと解釈したんだけど
その通りです。
257229:04/06/17 00:27
家に帰ってから>>230の中にあったシステムコールというキーワードで調べたら
http://x68000.startshop.co.jp/~68user/unix/pickup?realpath
という所が見つかって無事に目的を達成できました。

皆さんどうもありがとうございました。
>>257
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/realpath.3.html
↑ここには、「この関数は決して使わないこと。」なんて書かれてるな。
>>234
Windowsなら、GetModuleFileName(NULL,... でいける。
260234:04/06/17 02:14
>>259
ありがとうございます!
実は密かにけっこう前から謎だったんで助かりました!!
261219: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の方法じゃ納得いかないの?
結局アクセス制御の点では似たようなことになると思うんだけど。
262218:04/06/17 03:23
>>256
> 確かにそうですが、まぁ例と言うことで。

突っ込まれて「例と言うことで」で済むようなソース晒しても意味無いだろうが。
何で「ソース晒せ」と言われたかわかってんの?
263160 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()の引数が同じだけど本物でもそうなの?
264263: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
ほ、ほんとだ・・・
寝ぼけてました。
すみません。
出直してきます。
かなり恥ずかしいですね・・・
glibc2ならrealpathは使っても大丈夫なんじゃない
269151: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()は呼べなくなるという事ですか?
>>269
>class Watch : public Dat
>class Disp : public Dat
>と継承するという事ですよね?
そうそう。

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

>>>264
>コンパイルできる環境がないので試せないのですが
>constを付けるとDisp::exec()でdat.set()は呼べなくなるという事ですか?
そうだよ。まー>264はキレイな回答だとおもうしこれで
>すっきり
したらいいんじゃない?ダメなら継承も考えてみるけど。
271270:04/06/18 02:55
あ、今思ったけど純粋仮想関数ってオーバーライドしなきゃいけないんだったっけ。
そうすると Disp::set() も書かなきゃいけないから、定義のしかたで書き換えできないようには出来るけどかなり微妙だな・・・。
こりゃすっきりしないかもね。すっきりするにはコーディングの変更が多そうだ。やっぱ264にしといたら?
>>271
>あ、今思ったけど純粋仮想関数ってオーバーライドしなきゃいけないんだったっけ。
をい、んなこと当たり前じゃない毛。おまえレベル低すぎ。
273151:04/06/18 03:02
>>270
>そうだよ。まー>264はキレイな回答だとおもうしこれで
これが本当ならかなりビックリです。
コンパイラがメンバ関数の中身まで見てるとは思えないのですが・・・
明日試してみます。 

>あ、今思ったけど純粋仮想関数ってオーバーライドしなきゃいけないんだったっけ。
了解です。そもそもDatをWatchに継承するのはfriendを使うより抵抗があります・・・
>コンパイラがメンバ関数の中身まで見てるとは思えないのですが・・・
コンパイラはメンバ関数の宣言を見ている。
char is() const ←これ
void set(char c) ←こっちは const がない
そうすると Disp::exec の引数 const Dat& のインスタンスは is を呼べても set を呼べない。
>>269
> 実際はDATにシングルトンパターンを使っているので

アクセス許可の観点からは、externと同レベルだと思うんだけど。
276264:04/06/18 06:35
>>273
>>そうだよ。まー>264はキレイな回答だとおもうしこれで
>これが本当ならかなりビックリです。

もしかしてネタで書いたコードだと思われてたのか?
そうか、だからスルーされ続けてたのか。
277151:04/06/19 01:28
>>275
それはその通りですね。

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

>>276
無視してたわけじゃなくて、正直理解できなかったんです。申し訳ない。
ただ実際にはexec()の引数にはできないので
もうちょっと工夫してみます。
ありがとうございました。
以下のようなプログラムを組みました。
-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
???
なんのこっちゃ?
>>280
20 ÷ 7 = 2 あまり 6
あってんじゃん
-20/7=-2 あまり 1だけど?

マイナス20なんですけど・・・
余りの定義って、常に正数なの?
正数で割った時はそうだす
だから困ってんです。
Cでもあまりは正で出力されるとばかり思ってたから・・・
>>282
-20 = 7*(-3) + 1
だから -3 余り 1 じゃね?

余りは常に正と言うんなら(t+7)%7で求まると思うが。
すまんかった
-20=7*-3 + 1だ
-2じゃ、なかたよ
いちいちif文書くのめんどくさっておもったんだ
cの規格に何とかする方法があればそっち使いたいなーって
整数除算
ttp://seclan.dll.jp/c99d/c99d05.htm#dt19990607

俺の環境では、非C99の場合 -20 % 7 == 6
>>281-282
お前らちゃんとCの勉強してから文句言え
こいつらすげーあほだ・・・。
< おれもおまえもなああああぁぁぁぁぁ!!

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


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

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

自分としては、AにBがそのまま乗るような動作を期待してるんですが、どうもうまくいきません。
この場合、どうしたらいいんでしょうか。
>>292
スレ違い。
WinAPIスレあたりで聞いてみたら。
294デフォルトの名無しさん:04/06/20 10:23
LinuxでSIGSEGVやSIGFPEなどのエラーシグナルが発生した場合に、C++の例外を送出したいのですが、どうしたらいいでしょう?
シグナルハンドラの中から例外を出してもうまくいきませんでした。。。

Red Hat Linux 9でプログラムをしているのですが(C言語)
cc test.c
gcc test.c
とするのではなにが違うのでしょうか?
296109:04/06/20 12:21
>>295
コンパイラが違う。
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を持つのに似ている。
というか、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;
>>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
omaemona-
普通にシングルトンだな。
手っ取り早くCManの中にstaticでCGod詰め込んどけ。
神は己の中に居る。
叔父減算
>>306
>CManが一人も居なくなるとCGodは勝手に消滅する
ヒトの都合で神が消滅するとはこれいかに?
ヒトが神を作り出すから、ヒトが消滅すれば神も消滅する。
ナルヘソーヽ(´ー`)ノフワーア
でも言えてるな・・・。
313デフォルトの名無しさん:04/06/21 10:01
ある負の数をprintf関数で16進数や8進数として出力しようとすると、
でたらめな値が出てくるんだけれど、なぜだろう?
>>313 ソース見なきゃわからん。
315デフォルトの名無しさん:04/06/21 10:13
>>313
%x,%X,%o、それにlやhをつけたものは符号無し整数を相手にする。要するに%uの16,8進数版。
316294:04/06/21 11:03
317デフォルトの名無しさん:04/06/21 12:33
>>315
負の値として出力することはできない?
>>317
「2の補数」で検索するといいかもしれない。
文字列(CSVデータ)をカンマ区切りに分解して、配列にコピーしようと考えています。
とりあえず、文字列の先頭から1文字ずつ","か"\n"をチェックして文字数分だけループさせるソースを書いたのですが、
もっと簡単な方法は無いでしょうか。

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

320デフォルトの名無しさん:04/06/21 17:17
>>319
strtok()
>>319
boost::tokenizer使えばあっちゅーまだよ?
インストールがめんどくさいだけだが
ちょっとスレ違いかもしれませんが質問
Linux+Intel compilerとWinXP+VC6でコンパイルしたオブジェクトファイルを組み合わせてリンクすることは可能でしょうか?
対応したリンカならできるかもな
そんなのが存在するか知らんが。
下記のクラスの定義でエラーが出ました。何かがまずいようなのですが、何がまずいのか分からないのです。
コンストラクタで、文字列を解析するつもりです。
lpszBuffには、文字列のアドレスを受け渡してるつもりです。

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

DbCardBase::DbCardBase(LPSTR lpszBuff){
char *szBuff;
szBuff = lpszBuff;
};
出ないけど。
最近CとC++を始めました。
ポインタはなんとなく理解出来始めたのですが
文字列の扱いに未だ疑問があります。

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

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

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

cout << &("abcde") << endl;
私の理解ではこれで文字列"abcde"を指すポインタのアドレスが出ると思ったのですが
文字列がそのまま出てしまいます。
私の理解の仕方がおかしいのでしょうか?
>325
出ないんですか _| ̄|○
となるとエラー箇所が他なのですね。研究します。
CかC++でURLエンコードできるやつってないですか?
329324:04/06/21 22:58
すみません、もう1つ。構造体やクラスのポインタを、
関数の引数として受け渡しするとき、受け側の型は何にすればよいのでしょうか?
const T&
>>326
ポインタが理解できているなら文字列も理解できるはず。
逆をいうと・・・(ry
>>326
うちの環境はアドレス出すなぁ。
>>332
失礼しました。
私はVC++6.0を使っているのですが、
お手数でなければ貴方の環境を教えて頂けないでしょうか?
334デフォルトの名無しさん:04/06/21 23:56
>>303
> _pgod は static じゃなくていいの?
ほんとだ。すたてぃっくじゃなきゃだめです。
間違い。
>>333
俺も初心者なんだけどprintf使ってやってたらアドレス出た。つーかポインタに&ってどうなの?エロイ人
>>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;
}
クラスの内部で宣言された構造体変数はいつまで有効ですか?
たとえば

class test{
kouzoutai a;
}

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

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

はできますでしょうか?
>>337
クラスと同じ
339337:04/06/22 09:19
>338
ありがとうございます。クラスが解放されるまでは参照可能ということでしょうか?
あと、構造体のアドレスの渡し方って、>337で大丈夫でしょうか??
>>339
コンパイルできないだろ?
341デフォルトの名無しさん:04/06/22 14:16
char a[3][3];
で宣言して
a++;
ってしたらアドレスが3つすすんだんだけど常識?
>>337
そもそも、クラスメンバの非constな参照/ポインタを返すのはやめとけ。
激しく推奨されない。
>>342
理由は?
>>341 a は char[3] を1つの要素とする配列だから。
a++なんてできないだろ。
typedefで循環参照やりたいんだけど
どうやって宣言したらいいのですか?
これではおこられます・・・
先行宣言みたいなことできますか?
typedef struct
{
 int n;
 HogeHoge* pHogeHoge;
} Hoge;

typedef struct
{
 int n;
 Hoge Hoge;
} HogeHoge;
文字列の中の改行の個数を数えるのってどうしたらよいでしょう?
348デフォルトの名無しさん:04/06/22 16:45
DOS窓上で、タイマーを作りたいのですが、その場で時・分・秒を変化させることはできないんですか?
デスクトップの向かって右の時計みたいに。
>>346
typedef struct
{
 int n;
 struct tag_HogeHoge* pHogeHoge;
} Hoge;

typedef struct tag_HogeHoge
{
 int n;
 Hoge Hoge;
} HogeHoge;
>>348
バックスペースの'\b'を出力するか、
Win32コンソールプログラムならSetConsoleCursorPosition
本当のDOSプログラムならANSIエスケープシーケンスで位置を動すとか
>>348
改行の代わりに'\r'を出力してみれ。
352デフォルトの名無しさん:04/06/22 17:51
クラスの宣言の中で、
char abc!=(クラス名 aaa) const
となっているのは、どういう意味ですか?。
abcになにか入れる?。constは定数にするとの意味ですよね。
うろ覚えで書かないで、ただしく引用して来い
>>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と表示される。
すみません。ついでになんですが
ポインタでなければエラーになるみたいなんですが
実態を持つにはどうすればいいのですか?
これだと怒られちゃいます
typedef struct
{
 int n;
 struct tag_HogeHoge HogeHoge;
} Hoge;

typedef struct tag_HogeHoge
{
 int n;
 Hoge Hoge;
} HogeHoge;
>>355
お前は無限個のint変数を使いたいのか?
>>350
>>351
おお!\rでできた!
どうありがとうございました。
>>354
bool operator!=(const test &t) const {return _i != t._i;}
の方がいいんじゃない?
XP Home のDOSだと、エスケープシーケンスはうまく動作しないですね。
DOSじゃないもん。
>>360
そういえばそうでしたね。
>>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のサンプルは配布元にあるのですが、、、

よろしくお願いします。
>>355
Hoge
├int n
└struct tag_HogeHoge HogeHoge;
  ├int n;
  └Hoge(また?)
    ├int n
    └struct tag_HogeHoge HogeHoge;(これもまた?)
      ├int n
      └Hoge(あれ???)
        ├ …
って具合に実態を直接持つと永遠に続いて構造体の大きさを決定できないから無理。
しかし、クラス(構造体)間の循環参照ってFAQだな。
それこそFAQだからな。
>>359
当然,ANSI.SYSは組み込んであるんだろうな?
関数内で宣言したクラスを、他の関数からも参照するにはどうしたらいいでしょうか。
>>368
関数外へ移動。
>369
移動というと、宣言してる行を動かせば良いのでしょうか??
>>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;
}
14行を書き換え
++s;} → ++s; a=2;}
374372:04/06/23 18:59
>>373
なるほど、初期値に戻すのを忘れてたんですね。
ありがとうございました。
CとかC+で関数のことをメソッドって呼んでいる人がいますけど、
メソッドというのは正式な呼び方なんですか?
正式な呼び方って決まってるの?
メソッドとは言わない。
メソッドを使うのはVBあがりとかだろう。
378デフォルトの名無しさん:04/06/23 20:04
複数のファイルのドロップソースになりたいのですが、
フルパスのITEMIDLISTから、デスクトップのIShellFolderを使い
GetUIObjectOfをすればいいんですか?
それとも、やっぱりIDataObjectを実装しないとならないのでしょうか?
失礼しました、誤爆です。
380デフォルトの名無しさん:04/06/23 20:06
複数のファイルのドロップソースになりたいのですが、
フルパスのITEMIDLISTから、デスクトップのIShellFolderを使い
GetUIObjectOfをすればいいんですか?
それとも、やっぱりIDataObjectを実装しないとならないのでしょうか?
381378=379=380:04/06/23 20:07
、、、
ホントごめんなさい。なんでこんなやっちゃうんだろorz
>>378-381
ドンマイ
今までCOBOLをやってたのですが、この度Cを始めました。
そこで、構造体・クラス・ポインタ・引数というような壁にぶつかりました。
本当に基礎的な部分は入門書のような本を読んだのですが、
ちょっと難しい使い方されてるようなものになるとさっぱりです。
クラスについてはさっぱりで、ポインタ・引数は無駄なくできているのか分かりません。
初心者でもある程度できるような、良い勉強法等合ったら教えてください。
CUIばっかりじゃつまらんのでWindowsプログラミングってのをちょっと見てみた

訳分からん型いっぱい・・・
>>383
俺はポインタは絵に描いて覚えた
大き目の紙をメモリ領域だと想定して
線引いたりしてポインタの働きを視覚的に学んでみた
>>385
絵に描いて、ですか。
確かに、分からない時には良さそうですね、ありがとうございます。

しかし、構造体の中に構造体へのポインタをいれるような
リンクリスト(うろ覚え)のようなものになると、イメージも曖昧に…
>>386
その程度のことをイメージできないようじゃこの先つらいぞ。
>>386
データ構造も絵に描いて覚えましたが何か?


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

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

俺はかなりパーなんでこんなことしながら覚えたけど他の人はもっと上手くやってると思う。
>>383
>クラスについてはさっぱりで

Cにクラスはない
クラスがあるのはC++
390385:04/06/23 23:39
>>387-388
かなり危機的な状態っぽいですが、
絵に描くなりして、分かるまで色々やってみます。
意見ありがとうございます。
391383=385:04/06/23 23:43
>>389
一応Cから入って、C++もやるつもりだったので…
説明不足でした、すいません。
>>377
メソッドはオブジェクト指向の用語だよ。
だからC++のメンバ関数のことを普通にメソッドという。
馬鹿だね。
C++のスペックではメソッドなんて言い方は使っていないよ。
だからC++では「関数」が正しい言い方。
だからオブジェクト指向の用語って言ってるやん。
C++におけるメンバ関数はオブジェクト指向言語一般の用語では
メソッドにあたるってこと。
>>383
猫でものサンプルとかいろいろいじると感覚つかめるよ。
ちなみに漏れもCOBOLやってたけど
いまだに判定の比較間違うときあるよ・・
COBOLとCの判定は逆だからきをつけな。
多角形の内外判定のCのプログラムサンプルありませんかぁ?
理論はわかるんですが、プログラムが;;

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

理論がわかるなら、
その理論を紙などに日本語で書いて、
それを C のプログラムに翻訳するだけだろ?
>>397
ここは言語のスレなんで、実装する上で言語上の疑問点が出てきたら
ここで聞いても良いが、宿題丸投げなら宿題スレに逝け。

つか、ちょこっとググっただけで参考になりそうなサイトがいくつか出てきたぞ。
コンストラクタから呼び出しちゃいけないメンバ関数は、
自身のクラスの仮想関数だけだったっけ?
親クラスのは呼び出してもいいんだよな
プログラムを起動すると、システムに常駐して
どこかでファイルがクローズされると、その旨をメッセージで表示するような
ものをC言語で作りたいのですが、難しいでしょうか。
環境はRed Hat Linux9 + gcc-3.2.2です。
相当難しいようならば、もうちょっとLinuxの知識をつけてから作りたいと思います。
Cだけじゃむり
つーか、「もうちょっと」じゃ絶対無理。
closeシステムコールの中に書き込む。
>>401
まずviおぼえれ
>>400
そんなルールは無い。
>>406
コンストラクタが完走するまでvtblの構築って終了しないんじゃなかったっけ?
ctor
vtbl-make
vtbl-dele
dtor
って順番なのかなーと
あるクラスのコンストラクタが実行されるときには、そのクラスの基底クラスの構築は完了している。
×そのクラスの基底クラスの
○そのクラスの

>>407
基底クラスの初期化リストの後なら問題なく呼び出せる。
ただしコンストラクタ自身のクラスよりも派生したクラスでオーバーライドされたものは呼ばれない。
カスタムアロケータってのを書いてみたいのですが
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)を呼び出せとあるので
コンストラクタの実行はしなくてもいいのかなって思ったりもしてるんですが。
>>411
コンストラクタの実行はしちゃいけない。
413デフォルトの名無しさん:04/06/26 17:48
>>412
そうみたいですね、ありがとうございました。

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

自作のアロケータでも、ここのでも同じエラーがでてるので、
VC6じゃカスタムアロケータ対応できないのかなとは思っているのですが。
書き忘れました、コピーコンストラクタはもちろん修正して、です。

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)' のコンパイル中

こういうエラーがてるんです。
この度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 を待つために,どのように待たせればいいのかが
わからないのです.


何かヒントでもいいので頂けないでしょうか?
>>415
デバッガ使えばわかるだろ
>>415
最低限、コンパイルが通るソース貼れや
>>418
通らないか?
まぁ、<がhtmlで不等号に化けてるからそのままコピペしたら通らないが。
>>419も化けてますねw
何かと思ったら、&lt という変数のアドレスだったのか。
スレ違いだったらスマソ
g++でコンパイルしてarでまとめた静的ライブラリが複数あるんだけど
これを1つの静的ライブラリにまとめるにはどうやったらいい?
>>422
arで展開して、纏めなおし。
やり方はman arしろ。
#tarに似ていると言えば見当つくかな?
>>423
展開してからやらなきゃ駄目なのかぁ。
やってみます。ありがとう。
425415:04/06/29 09:39
>>421
そうなんです。そのまま貼り付けたら文字が変換されてました。
ソース全部は長いのでおかしな部分(ここをはずすと正常にCGIが動きます)
のみ貼り付けました。
コンパイルはエラー無く通るのでTime関数のバグかな?と思ったんですが。。
apacheのバージョンが原因なのか、gccのバージョンが原因なのか検討つきません。
>>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型の変数に変換する*/
/*時刻形式へ*/
>>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とかならなんとなく納得できたのですが・・・)
スタックが足りてないだけじゃないの?
432430:04/06/29 17:59
最後の}が余計でした。
printf("%6d", i);
}
---------------------------
で実行した場合です
433デフォルトの名無しさん:04/06/29 18:05
ファイルにデータをバイナリーとして書き込むにはどうすれば良いでしょうか?

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

見たいな感じで出きるんでしょうか? よろしくお願いします。
>>430
オプションに-lS:200000をたしてみたらどう?
数値はsizeof(一番でかい変数)を16進法にしたもの+αぐらいに
435デフォルトの名無しさん:04/06/29 18:40
>>429
に加えて、

tm_now->tm_year+1900
の部分について
現地時間をtm構造体に定義されている各要素に参照渡ししている
というのはわかるのですが、なぜ値(2004)が得られるのかがわかりません。
tm_yearはただの変数ですよね?
>>435
localtimeがtm_nowのメンバをnowを元にセットしているんだ。
そのnowにはtime(NULL);のところで現在の日付・時刻が入っている。
localtimeはtm_yearには1900年からの経過年数を入れるようになっていて、
今は2004年だから104が入ることになる。
だからtm_now->tm_year+1900で2004が得られる。
>>436
nowが日本時間であったら、localtimeは日本時間をセットするってことですよね?
>>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;を実行しないという命令ですよね?
この部分が無いことで、なぜカーソルの動きがおかしくなるのかがわかりません。
>>439
continueの意味を理解してる?
その3行をコメントアウトすると、ループが回るたびにprintfを実行するようになる。
カーソルが常に移動してるから、ちらついて見える。
>>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
なくても特に動作は変わらないような……。
>>442
初期化が最初お一回しか行われないからだろ。
>>444
×最初お一回
○最初の一回
>>442
static const char * const week[] = { /* ... */ };
にしておきたいところだね。
で、staticにしないとmain()の実行時に無駄なコピー作業が発生する。
>>428から>>446で質問に答えてくださった皆さん。
どうもありがとうございました。
とりあえず、一段落つけます。
まだ疑問が残ってますが、そちらは自分で考えてみます。

>無駄なコピー

気にするな(w
449デフォルトの名無しさん:04/06/30 13:25
>>446
何回も呼ばれる関数ならまだしも、mainなら別に問題はないような。
>>448
これはたまたまmainだからだろ。
質問への回答は446で良いし、448は単なる厨発言じゃねぇかよ。
>>442はmainなのになぜ?という意味で聞いているのでは。
>>451
そうかもしれないが、「mainなのに」とは一言も書いてない。
おまえはなぜそう思ったんだ?
コンソールアプリケーションからやれと言われて、やってる漏れは手遅れか?
別に。
すみません。
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しておかなければならないのでしょうか?
456455:04/06/30 20:11
あ、libc_p.aとかとリンクしないとだめっぽいですか?
glibcを入れようとして構築できなかった気が。
すくなくともgcc-2.95とか使ってたときはgprofは使えてました。
出力した文字列を一行だけ消す方法はありますか?
C++です
出した=画面に表示した なら、ない。
\rとスペースとか、^Hを出力した文字数分とか出力すると
消えたように「見える」端末もあるかもしれないけど、
根本的に出したものは消せない。
>>459
できないのですか・・・
コンソールアプリで作るのは諦めるべきですか?
なにをだよ
>>461
タイマー(´・ω・`)
boost:progress_displayのソースでも見たら?
>>463
おお!それだ!と思ったらちゃんとうごかない
printf("\x1b[12;10H");
cout << "\x1b[12;10H";
どっちも同じ
\x1bは┘みたいなのになって
その先が普通に表示されます
>>465
Windows2000以降はANSIエスケープシーケンスは働きません。
boost:progress_displayのソースのようにやりましょう。
>>466
なんですか?それ
boost::progress_displayは戻ってないよ。
469458:04/07/01 19:13
boost::progress_displayはわかったのですがよくわかりませんでした
>>468
*を追加していってるだけってことですか?
そうだよ
以下のようなプログラムを組みました
コンパイルはできるのですが実行すると

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;
}
>>471
for(i=0;i<=9;i++){
mpz_init(array[i]);
}


for(i=0;i<=9;i++){
mpz_clear(array[i]);
}
>>472さん
ありがとうございます
無事に実行できました

gmpで配列を使う時は要素一つ一つについて
初期化・クリアーをしてやらないといけなかったんですね。
勉強になりました。
>473
そもそも定義、宣言でない array[配列の数] が明らかにあり得ないと気づけ。
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)

これを使うとは思うのですが使い方がわからなかったので
何とか他の方法でできないかと思っていました。
>>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てしまった・・・。
スマソ。
>>474さん>>476さん

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

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

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

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

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

>>475
>mpz_array_init (mpz t integer_array[], size t array_size, mp size t fixed_num_bits)
見れば gmpとやらを知らない俺でも

mpz_array_init(array, 10, 初期値);
って使うのかなという想像は出来るわけだが
>>480を読んで自分の頭が凝り固まってることを思い知った。
>>497
ありがd
あれ?478でsageて
入れたはずなのに
ageてる?
そろそろ>>480氏には
「入門書きっちり読んでから出直して来い」
って言っていいかな?
>>484
「Cの入門書」って言わないとgmp周りを漁りそうな希ガス
486デフォルトの名無しさん:04/07/03 17:53
今日その「Cの入門書」を探して紀伊国屋に行って来たんですが、参考書大杉で
どれが良いのかワカリマセンでした。 
幾つか見た感じだとこれ↓がヨサゲだったんですけど、どうですか?

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

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

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

初心者が知る必要のないことかも知れませんが
疑問に思い始めるとポインタの基本の章にも身が入りません
誰か教えてください
>>487
printfなどであれば、OSにホゲホゲという文字を出力してくれ、という風な事となる
その先は画面かプリンタかファイルかはどうでもいい事なので、OSまかせ。
ウインドウのプログラムのほうは、違ってるかもしれないし、同じかもしれない。
どのOSか等でしぼると答えやすいんだが。
>>488
ウィンドウズを使ってるのでウィンドウズの場合というこになります
OSによって違うのならそれも知りたいような気もしますが

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

それはC言語に OSにホゲホゲという文字を出力してくれ という命令が関数としてではなく
コマンド?として存在しているということですか?
printfを例にすると、
まず、Cの規格で、printf関数は標準出力に文字列を出力する機能を持つことになっている。
なので、printf関数を書く人間は、その機能を満たすようにプログラミングするわけだが、
具体的にどのようにすれば出力できるか、というのは、OSやコンピュータによって千差万別なので、
その具体的な方法までは決められていない。

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

具体的に、文字を表示するのにOSの機能を利用するのかハードウェアを直接操作するのかは環境次第。
Windowsの場合、Windowsがそういった機能を持つシステムの関数を持っているので、
それを利用しているだろう。
>>489
文字だけなら
ttp://kasai86.ld.infoseek.co.jp/asm/asm2.htm
を見てごらん。ふいんき(<なぜか変換できない)は味わえるよ
>>490
ダウト。
「ふいんき」
不陰気、腑陰気、婦陰気
>>492
ダウト
printf()は仕様通りに動けば中身は問われないというのは分かりますが
OSのシステムの関数を使ったりハードウェアを直接操作したりするというのであれば
例えばウィンドウズではシステムの関数を使うということですが
ならハードウェアと直接操作することは出来ないのかそれともしないだけなのか

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

今日は休んで疑問を整理します
>>495
>えーハードウェアを直接操作するという機能は
>C言語の仕様外の機能で

インラインアセンブラ
あほか
>>495
なんのためにOSがあるんだ?
OSの存在意義を考えろ
総資産を数兆円にするため
>>495
あとOSをどういう言語で書いたかも考えろ
> なんのためにOSがあるんだ?
> OSの存在意義を考えろ
綱引きする時に使う
502デフォルトの名無しさん:04/07/04 23:09
今日Visual C++.netを買ってきたんですがうまくいきません
。一緒に入ってる入門書の
コードを入力してビルドするまではできてるんですが、デバッグしても
ウィンドウになにも表示されないんです。
シンボルが読み込まれていませんとでてるんですがどうゆうことなんでしょうか?
超初心者ですいません。
>>502
どういう質問なの?
デバッグが死体の?
ブレークポイント張った?
デバッグ実行した?
>501
掛け声は「そいや、そいや」でしたが?
>>504
ありがと。>>501の意味がやっとわかったw
506デフォルトの名無しさん:04/07/05 10:05
同じclassでコンストラクタが複数あるばあい基本以外のコンストラクタにはvirtualを付けたほうがいいのでしょうか?
コンストラクタはvirtual宣言できまへん。
(デストラクタはできますが)
なぜならコンストラクトする時点で型が確定しているから。
(deleteは基底クラスのポインタ経由でできるからデストラクタ
はvirtual宣言できるが、new時には new CBase、new CDerived
と型を明示するからあいまいになりようがない)
508デフォルトの名無しさん:04/07/05 10:28
>>507
お答えありがとうございます

class aaa{
public:
  aaa();
  virtual aaa(int bbb);
};
この場合もvirtualは必要ないということですよね?
>>508
いらないYO!
コンストラクタは特殊な関数なので、派生クラス
のインスタンスを初期化するとき、C++は
基底クラスのコンストラクタ→派生クラスのそれ
と順にコンストラクタをcallしてくれる。
>508
必要ないではなく、付けられない。
というか、何でおまえはvirtualを付けたがっているんだ?

複数のコンストラクタは単なる関数のオーバーロード。
つけられないことは無い
>>511
g++ 3.3.4だと
>error: コンストラクタは virtual 宣言できません
ってエラーになるけど?
513デフォルトの名無しさん:04/07/05 13:29
C++Builderではエラーがでなくて普通にアレされるので・・
エラーが出ない=付けられる って考えはどうかと・・・。
よく関数にしてコールするとオーバーヘッドが気になる
と言う人がいますが、そんなに気になるほどの
オーバーヘッドってあるんですか?
どういう時に重要になるんでしょう?
>>515
アセンブラ勉強しろよ
汗ブラ
ハァハァ
>>516
要するにおまえは知らないから答えられないということだなw
>>515
>どういう時に重要になるんでしょう?
その関数の中身が十分小さく、呼出回数が多い時。
プロファイルしてみるとシステム全体に占めるコストが分かる。
Cの勉強をしようとして、「新訂新C言語入門」とかいうのかってみたんですけど
ものすごくわかりにくいんで、ほかになんかいい入門書ありませんか?
>>521
分かりやすさは人それぞれ。
本屋に言って片っ端から立ち読みしろ。
>>521
推薦図書/必読書のためのスレッド PART 18
http://pc5.2ch.net/test/read.cgi/tech/1083665944/l50
524デフォルトの名無しさん:04/07/05 22:16
すいません。質問させてください。
今、処理時間の表示できるCのフリーのコンパイラを探しています。
現在、使っている「Cmachine」では、処理時間の表示が
どうやらできなそうなのですが、
皆さんが使っているコンパイラで、処理時間表示ができるものがありましたら、
お教えいただけると嬉しいです。お願いします。


>>524
処理時間ってのはコンパイルする時間を表示させたいの?
それとも実行ファイルにある処理をさせてその処理時間を表示させたいの?
後者ならclock()またはdifftime()でできるけど?
>>525
質問内容が不十分ですみません。
実行ファイルの処理時間のことです。早々と回答いただきありがとう御座います。
ただ、clock()の使い方を、今ネットで勉強しています。
どのように書けば良いのかまだわかりませんが、勉強してみます。
本当にありがとう御座いました。
会話になってないな
今日は暑かったからな。
>>526
プロファイルでググレ
530デフォルトの名無しさん:04/07/06 07:30
質問です。
WindowsのAPIで任意のアプリケーション(任意のウィンドウ?)のカレントディレクトリを取得する関数ってご存知の方いらっしゃいますか?
GetCurrentDirectoryだと自分自身のプロセスのカレントディレクトリしか取得できないみたいで、どうしていいのかわかりません。
方針としてはGetActiveWindowかGetForegroundWindowで取得したハンドルをもとに、そのアプリケーションのカレントディレクトリを取得してファイル操作などをしたいと考えています。
よろしくお願いします。
>>530
スレ違い。こっち
Win32API質問箱 Build20
ttp://pc5.2ch.net/test/read.cgi/tech/1088140233/l50
>>530
フックしてフックプロシージャで取得し、
アプリケーションにプロセス間通信で送るとか
>>531
1読め。
ここは言語と環境の問題を切り分けられなかったり
判断のつかない人(や、面倒な人)用のスレだろ。
C++の話題限定なら相談室と統合してるよ。
>>533
>>1のどこに
>ここは言語と環境の問題を切り分けられなかったり
>判断のつかない人(や、面倒な人)用のスレだろ。
と書いてあるのだろうか?
そもそもここはC/C++言語の相談室で、特定の開発環境やライブラリの
操作に関しては専用スレに誘導するというスタンスが以前から続いているが?
Win32APIなどの環境依存な物でもOK。
環境依存なものでもOKだが、APIそのものの質問(C/C++とはなんの関係もない)は
より適切な場所で行う方がいいでしょ。
537530:04/07/06 14:09
>>532
プロセス間通信に関してわかってないので、調べてみました。
すぐには理解できなさそうですが、フックプロシージャの中でなら情報をチラ見できるっていうイメージでしょうか?(ちょっと言葉が悪いですね・・・)
ただ、今まではインスタンスハンドルかウィンドウハンドルあたりを使ってAPI関数一発かなぁとか想像していたので、そう簡単にはうまくいかないということがわかっただけでも収穫です。
ありがとうございます。
>>531さんをはじめレスくれた方々も、気を悪くしないでください。失礼しました。
>>536
次スレのテンプレにはこれを明確にしておきましょ。
>>537
フックプロシージャは、フックを注入した各プロセス空間で動作することになる。

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

それは確かだけど、スレ違いというわけではない。
C/C++の初心者はとりあえずここに来い、ってすれでいいと思うが・・
スレタイトルに環境依存OKって思いっきり書いてありますが
542デフォルトの名無しさん:04/07/06 21:47
C++のお勧めの本教えてください。
すぐにでも一通り使えるようになりたいので簡単なので良いのありませんか?
一応Cは分かります。
>>542
推薦図書/必読書のためのスレッド PART 18
http://pc5.2ch.net/test/read.cgi/tech/1083665944/
>>541
環境依存OKなC/C++の質問ね。
言語に関係しない質問はスレ違いだよ。
初心者は自分ではその区別がつかないことも多々あるが、
その場合、専用スレがあればそっちに誘導するということで
ずっとやってきているのに、いまさら蒸し返してどうする。
>>530
よく分からないけどShellExecuteでカレントを指定して立ち上げればいいのでは?
exeの場所が知りたいのならGetModuleFileName辺りを調べるといいかも。
546デフォルトの名無しさん:04/07/06 22:19
>>543
ありがと、
テンプレ参考になりました。
>>542
ここ辺りから1冊どうぞ。
ttp://www.data-house.co.jp/seriestoppc.html
>>547
頭悪そうな本ばっかりだな
>>548
そんなに言うのなら頭悪そうじゃない本を薦めたら?
おいおい548は正論だろ
>>547
書籍名だけでも十分アレだが、
著者名も負けず劣らずだな。
まぁ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
>>553
ようかんマンがC/C++の宿題を片付けて見せます 26棹
http://pc5.2ch.net/test/read.cgi/tech/1088860889/
555カメソライダー:04/07/06 23:43
推薦図書のスレから飛んでまいりました。
C++の超初心者です。
どなたかアドバイスお願いします。

あるデータをFFT処理をし、その結果が
メモ帳のテキストデータとして表示されるようになっています。
一行目に周波数、二行目にパワースペクトルが表示されるようになっているんですが、
このデータを周波数、スペクトルと分けてプログラムの中に読み込みたいのですが、
どうしたらよいのでしょうか?
>>556
このスレでも怪しいが・・・
fscanfで検索を。
>>556
初心者を超えたのなら甘えるなよ。
>>556
周波数、パワースペクトルは組込型(doubleなど)でいいなら
std::basic_ifstream使えばすむけど。
詳しいアドバイスが欲しければ、もっと具体的に質問すべし。
課題作成で作ってる自作プログラムで問題が起きたので質問です・・・。
拡張機能を入れたメモ帖を作成しているのですが、そこでかなーり困ってます。
具体的な処理として行いたいのが

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

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

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

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

簡潔に言うと、外部アプリケーションで範囲指定した文字列をクリップボードに貼り付けて自分のメモ帖プログラムに貼り付けたいのです。
課題提出期限が明後日・・・誰か力貸して下さい_| ̄|○
561560:04/07/07 00:58
作成環境書き忘れてましたorz
環境はWinXP/2000
使用ソフトはVC++6.0です
>>560
宿題スレに逝け。
563560:04/07/07 01:36
>>562
激しくスレ違いスマンカッタ_| ̄|○
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 でコンパイルすると
「初期化の一部だけにカッコがついている」と警告を受けるのですが、
もっと正しい記述の仕方があるのでしょうか?
{ 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言語未対応になったんですかね?
(´-`).。oO(何が釣れるかな……)
         \   ∩─ー、    ====
           \/ ● 、_ `ヽ   ======
           / \( ●  ● |つ
           |   X_入__ノ   ミ   そんなエサで俺様がクマ――!!
            、 (_/   ノ /⌒l
            /\___ノ゙_/  /  =====
            〈         __ノ  ====
            \ \_    \
             \___)     \   ======   (´⌒
                \   ___ \__  (´⌒;;(´⌒;;
                  \___)___)(´;;⌒  (´⌒;;  ズザザザ
                               (´⌒; (´⌒;;;
>>566
.NETからは全く新しい言語体系に変わりました
今までの知識は全く役に立ちません。
         \   ∩─ー、    ====       普通のC
           \/ ● 、_ `ヽ   ======     #include <stdio.h>
           / \( ●  ● |つ           int main(void) /* 返却値の型を省略するとint */
           |   X_入__ノ   ミ   =======   {
            、 (_/   ノ /⌒l            printf("Hello World");
            /\___ノ゙_/  /  =====      return 0; /* C99では不要 */
            〈         __ノ  ====     }
            \ \_    \
             \___)     \   ======   (´⌒
                \   ___ \__  (´⌒;;(´⌒;;
                  \___)___)(´;;⌒  (´⌒;;  ズザザザ
                               (´⌒; (´⌒;;;
(´-`).。oO(エラーメッセージ読めば解決するのに……)
cout でdouble型を表示させると小数点5桁までしか表示されません、任意の桁数まで表示させることは出来ないのでしょうか?
printfの場合は%18.15fなどで出来たのですが・・・初心者質問で申し訳ありません。
cout 桁数 マニピュレータ
でググってみ
>>573
precisionですね、ありがとうございます。
Javaみたくヘッダで全ての関数定義しちゃだめなん?
別にダメじゃないよ
好きなだけヘッダに書きな
ふふふ
inlineをつければ平気かな
ふふふ
>>575
全てインライン関数指定になるからプログラムサイズがすごいことになってマジオススメ
>>578
インライン指定しても、実際にインラインになるかどうかはコンパイラにお任せ。
>>579
んなことくらい知ってるけど、それが何か???
>>578
んなことくらいわかるけど、それが何か???
>>581=575 なの?

じゃああなたは一体何が聞きたかったの?
583575:04/07/08 00:52
>>578-579
自分で分けたほうが小さく出来るんだよね?
ヘッダで定義するのは雪駄下駄くらいにしとけてことでOK?

>>582
>>581はオレじゃないよ。
単に2ファイルにわけると保守がメンドイなと。
>>583
開発用、公開用とヘッダファイルを使い分けることができるのがミソなのな。
>>578
> 全てインライン関数指定になるから
またこういう大嘘をつくんだから ;-)
>>585
Javaみたくヘッダで全ての関数定義した場合で
インライン指定にならないケースを教えて貰えないかい?

結果的にインラインにならないとしてもインライン指定はインライン指定だよ。
>>586
class Hoge {
public:
void hoge() const;
};
void Hoge::hoge() const { std::cout << "hoge\n"; }
>>587
おまいさんそれをヘッダに書く気か?

本当に関数定義をヘッダに書きたいなら全部templateにするのがお勧め。
>>588
とりあえず、おまいはこれまでの流れを読み直してこい。
>>589
>>575-を読んでレスをつけたんだが、見当違いな事言ってるか?
良かったらどこがおかしいか指摘してくれるとありがたい。
>>587
はぁ・・・

ついでにもう一つ教えてもらいたいんだが、「Javaみたく」って字は読めないの?
>>591
> ついでにもう一つ教えてもらいたいんだが、「Javaみたく」って字は読めないの?
みんな読めてますね。
あなただけは、読んだ上でその文章の意味を間違えているようですが ;-)
>>592
読めてないじゃん。;-)

Javaは>>587のような記述が出来るようになってたのか? 


あと「みんな」だって。お前だけだよアホくさ。
>>593
> 読めてないじゃん。;-)
読めていないと書けないレスに向かってこんなこと書いても、
馬鹿を晒す結果になるだけですね :-P

> あと「みんな」だって。お前だけだよアホくさ。
いえ、俺だけ読めているわけではありません。みんな読めています。あなた以外 ;-)
(とか書くとまた馬鹿を晒してきそう)
>>594
バカ晒してるのはお前「も」だよ :-P

で、Javaは>>587のような記述が出来るようになってたのか?
>>595
> バカ晒してるのはお前「も」だよ :-P
いえ、あなたですね :-P

> で、Javaは>>587のような記述が出来るようになってたのか?
とか言ってるから「読めてない」という話になるわけです ;-)
597デフォルトの名無しさん:04/07/08 22:10
age
>>596
はいはい、書けないでしょ。

つまり>>587は「Javaみたく」を満たしていない記述。


あと
>いえ、あなたですね :-P
ワザワザ「」を付けてあげたのに「も」が読めなかったの?
やっぱ読めてないのお前ジャンw
俺はバカ晒しているのを自覚してるよw
お前もちったぁ自覚しろ :-)
599587:04/07/08 22:14
俺の知らないところで無益な争いが...
正直
>Javaみたく
の部分は読んでなかった。
「ヘッダで」じゃなくて「クラス定義の中で」って書いてくれれば
こんなことにはならなかった。

>>598
> つまり>>587は「Javaみたく」を満たしていない記述。
あなたの誤読の範疇の話をいくらしても意味無いですね ;-)

> ワザワザ「」を付けてあげたのに「も」が読めなかったの?
読めるのは当たり前では

> やっぱ読めてないのお前ジャンw
と、ここでも思い込みで頑張るわけですね :-P

> 俺はバカ晒しているのを自覚してるよw
なるほど。自覚しているわけですか。それなら、
> お前もちったぁ自覚しろ :-)
これが荒唐無稽な馬鹿発言なのもちゃんと理解しましょう ;-)
>>600
面白いw 
晒し上げられたから他のギャラリーがもっと乱入してきてグダグダになるまで頑張るかw


>>599 を見る限り、「みんな」じゃないなw

やっぱ読めてないのはお前だよ :-)
602デフォルトの名無しさん:04/07/08 22:26
>>583の「単に2ファイルにわけると保守がメンドイなと。」を読めば、
575の「Javaみたく」は、「Javaみたく全てクラス定義の中に〜」ではなく
単にファイル分けの話、つまり「Javaみたく、ヘッダファイル一つに〜」という
意味であると解釈するのが自然だし、より厳密な態度をとるなら
「はっきりと言っていないから断定できない」とするのが適切なのは明白なんだけどね。

ここを読まず&考えずに、勝手にクラス定義に全部書くって話に解釈して、
そこから一歩も出ようとしないのが約一名いる。
>>601
> >>599 を見る限り、「みんな」じゃないなw
あなたと>>599、二名になりましたね ;-)

> やっぱ読めてないのはお前だよ :-)
いえ、あなたです :-P
>>602
エーw

「Javaみたく、ヘッダファイル一つに〜」

Javaってヘッダファイルないじゃんw
>>602
「単に」がポイントですね。
>>604
C++の話でしょ?
>>606
Javaにヘッダが無いってことは
Javaみたく、ってのは「ヘッダで全ての関数定義」にかかるわけじゃなくて
「全ての関数定義」にかかるだろ。かかんない?もうどっちでもいいよw


>>602
>そこから一歩も出ようとしないのが約一名いる。
そこから一歩出ると何に話が広がるのw?
608デフォルトの名無しさん:04/07/08 22:33
>>604
言葉の使い方は575に突っ込んでくれ。俺としては、

575は要するに「hとcppに分けるのマンドクセ。hに全部書いちゃダメなん?」
って訊きたいだけだろう

ってのが言いたいことなんで。
>>607
> もうどっちでもいいよw
もう、というか、最初から絡みたかっただけでは? ;-)
>>608
保守がメンドイって言ってるんだから
宣言と定義を分けて、二箇所変更が起きるようなやり方はしないだろw

>>609
俺にはお前が絡みたかっただけに思えるんだがw :-)
611デフォルトの名無しさん:04/07/08 22:39
>>610
でも、彼(彼女?)は「2ファイルにわける面倒さ」しか言ってないし。
>>610
> 宣言と定義を分けて、二箇所変更が起きるようなやり方はしないだろw
>>575がそれをするかしないか、の問題ではないですね ;-)
>>611
そこは>>575の意図がどうのという話ではないわけです ;-)
>>611
確かに、勝手に「Java出身なら宣言と定義を分けることにメンドクサさを感じるだろう」と勝手に思い込んでたってのはあるなw

本当はどうなのか>>575が出てきて言ってくれないかなw

>>612-613
じゃあ、どういう話だったのw?
お前の脳内ストーリーを書き込んでくれないかなw
>>614
> じゃあ、どういう話だったのw?
あとから出てきた人達の脳内の議題に関する話なわけですね ;-)

> お前の脳内ストーリーを書き込んでくれないかなw
ログを読めばいいのでは?
(俺の解釈はログと同じなので)
>>615
お前具体的には何も言ってないねw いや言えないんでしょw?  :-)
>>616
それが断末魔ですか ;-)
>>617
あはは そっくりお返ししようw 

「それが断末魔ですか ;-)」が断末魔ですか ;-)
いい加減もうヤメレ
HSPスレでやれ
 う わ ら ば 
そんなことより>587だと、
複数のコンパイル単位にインクルードされた場合、
リンク時に多重定義エラーが出ないか?

586じゃないけど、やっぱinline指定が必要な気が。
623デフォルトの名無しさん:04/07/09 01:13
&はアドレス演算子とポインタの説明の所で書いてありますが、
int x=10;
scanf("%d",&x)の&xは、xは10をさしてる訳じゃなくて、
xのアドレスをさしていると言うことですか?それとも
ポインタの&とscanfで使う&は別物なんでしょうか?
>>623
別物ではない。
>>623
xの値は10だが、&xはxのアドレスを指す。
>>624>>625
ちゃんと分かりやすく説明しろや
馬鹿か!?おめーら(プッ
627626:04/07/09 10:20
釣れないなぁ
628デフォルトの名無しさん:04/07/09 10:27
1,2,3・・・10,20,30・・・100,200,300・・・って増やす方法教えてください。
int n = 1;
for(;;)
{
 n += (int)pow(10, floor(log10(n));
 printf("%d,", n);
}
#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
エラーばっかりなんだけど
>>631
アルゴリズムは自分で考えたのか?
その実装方法をここで聞くくらいならいいが

自分で考える癖をつけないと使えない人間になるぞ
>>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);
}
>>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;
}
VC6で関数テンプレート+即値はバグもち
>>636
635はそれ以前のような....
>>635
どうなって欲しいのですか?
>>637
hoge< count +1 >();これかw
>>635
真っ当なコンパイラなら、そのコードはエラーになるはず。
hoge<n>がhoge<n+1>を実体化しようとして、決して終らないからね。
C++でプロパティクラスが欲しいんですが、
プロパティクラスのインスタンスにsetter/getter/objの3つの値が必要で、
プリミティブ型ひとつひとつをプロパティ化すると、
オブジェクトのサイズが数倍に膨れ上がっちまいます。

なにか綺麗な解決方法ないですか?
642635: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を出力したいんです。
よろしくお願いします。
>>642
ifの条件判定は実行時に行われる(たとえコンパイル時に真偽が確定していても)。
だから>>642の様に特殊化で対処しないといけない。
g++3.3では、>>642の特殊化の定義の前にtemplate<>を付け加える事でうまく動作したから、
出力が「10」になるのはバグだと思われる。
645デフォルトの名無しさん:04/07/09 18:02
>>644
了解しました、ありがとうございました。
また、ちなみにこういったことが可能な環境または言語ってあるんでしょうか?
>>644
642ではif( count < 10)をはずしているので,
>出力が「10」になるのはバグだと思われる。
は違うよ.出力が「10」になるのは正しい.

それはそうと,
関数テンプレートは規格上,特殊化できないんじゃなかったっけ?
私の勘違いだったら申し訳ない.
647646:04/07/09 18:07
>>646
自己レス.
>関数テンプレートは規格上,特殊化できないんじゃなかったっけ?
これは部分的な特殊化の話だったようだ.
因みにModern C++の30ページ辺り.
>>646
いえ、スタートが

int main(int argc, char* argv[])
{
hoge< 0 >();

return 0;
}

ですので「10」では間違いです。

VC6だとクラステンプレートで正常動作を確認しました。
クラステンプレートが無難みたいですね。
>>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)
の部分です。
651646:04/07/09 18:51
>>648
何か分からなくなってきた.
642で,うしろの方に書いてある
void hoge<10>()
{
printf("%d\n", 10);
};
は呼ばれないということでしょうか?
これでテンプレートの実体化がストップするのではないですか?

それはそうと,特殊化ってこうですよね.
template <> void hoge<10>()
{
printf("%d\n", 10);
};
652646:04/07/09 18:57
>>650
すみません.何言いたいのか伝わってないので,
650で言いたい内容を書き直してもらえませんか?
よろしく.
2次元配列 a[8][5], b[8][10]があるとしてこれをある関数の引数として渡すときどのように仮引数を書けばいいのでしょうか
655646:04/07/09 19:32
653みて分かった.646の
>>出力が「10」になるのはバグだと思われる。
>は違うよ.出力が「10」になるのは正しい.
は撤回.本当は
出力は「012345678910」になるのが正しい
とのつもりで書いたのだけど.
>>654
a[][5], b[][10]
>>656
すいません、説明不足でした。
a[8][5], b[8][10]だとして

hoge(a);
hoge(b);

と渡したいときのことでした。
>>657
Cではaとbを同じ関数に渡すのはむり。
C++なら
void hoge(int a[][5]) { ... } (型は適当に仮定)
void hoge(int b[][10]) { ... }
ってオーバーロード。
C99ならvoid hoge(unsigned size, int a[][size])
だけどむりだよな
>>650
C++の範囲内なら、無理。
>>656>>658-659
ありがとうございます。
クラステンプレートをテンプレートの引数として取るとき、どうやって書けば委員でしょうか

template<?>
class data
{
public:
?<int> get1() const;
?<float> get2() const;
}

data<std::vector> data1;
data<std::list> data2;

みたいにしたいのですが
とりあえずいくつか
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ではだめだったが)
質問です。
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;
};

>>664
if (intanceHuman.Age() == 10)
>>665 ありがとうございました。
なるほど、()を忘れてました・・・
これだと、関数から返される値ではなく、関数自体と定数を比較している・・・
という感じに解釈されそうですね・・・

ありがとうございました=]
intanceHuman.Age にカッコをつけないとメンバ関数のポインタ(関数の先頭のアドレス)になっちゃうよ。
ところでインタンスって・・・。
668664:04/07/10 00:02
ありがとうございます=]

インタンス...orz
>>666
>関数から返される値ではなく、関数自体と定数を比較している・・・
>という感じに解釈されそうですね・・・
そんな馬鹿なことを考えるのはオマだけだ。もっと勉強しろ。
>>669
それは正しい考えじゃないの?
馬鹿なことだとしたら、正しくはどうなのさ?
>>670
関数自体って何?
関数ポインタなら分かるんだが。
>>672
関数への参照がそんな感じかな。
メンバ関数への参照はC++には無いが。
674664:04/07/10 00:59
>>669 & >>672
"関数自体"としたのは、参照される値が、ポインタなのか、関数オブジェクト(C++にあるのか否かは知りません)なのか、はっきりしなかったためです。
あと、勉強中です。
>>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)){
    //...
}
void hoge(int count)
{
if( count < 10)
{
printf("%d", count);
hoge(count + 1);
}
};

int main(int argc, char* argv[])
{
hoge(0);

return 0;
}
677664:04/07/10 01:36
>>675
Boostの関数型プログラミング系はあくまで、脇役なのかなと思っていたのですが、
なるほど、ワンライナーっぽく書けると、見通しもよくなりそうですね。
ありがとうございます:)
>>677
1つだけ注意する点があるとするならライブラリで無名関数をサポートしているのであって言語レベルでサポートしているわけではないこと。
そのためにコンパイルエラーメッセージがとても読めないものとなる(boost::lambdaは)。
その代わり言語の影響が少ないせいかクロージャをboost::lambda::valを使って実現できたりもする、もっとも変数の寿命はC/C++の規則に従うが。
679678:04/07/10 02:00
>boost::lambda::val
boost::lambda::varだ。
int型の変数をMessageBoxで文字として表示したいのですが、
Basic環境のようにString型にキャストして表示するにはどうすればいいのでしょうか?

MessageBox(NULL,(CString)strNumber,"Test",0);

としてもキャストできませんでした
>>680
CString::Format
char mes[22];
sprintf("%d",num);
>>680
intからCStringへはキャストできない。
MessageBox(NULL, CString().Format("%d", strNumber), "Test", 0);
ところでstrNumberがintならプレフィックスおかしくないか?
なるほど、ありがとうございます
今までBasicかPerlしか触ったことが無かったので、
文字列の変換についても同じように考えていました。

ところで、プレフィックスがおかしいというのはどういう意味なのでしょうか?

>>684
strはCStringとかstd::string用でintならiとかnのはず
ハンガリアンの概念捨てろ
♪1・2・ハンガリアン
プログラム初心者です。質問なんですが、
たとえば毎日20040710.datとかファイルをバッチで取得してて、トラブルで取れなかった場合に、
その日を自動的に取得するっていう感じのプログラムってどんな感じですればいいですか?
アドバイスをお願いします。
>>688
毎日20040710.datとかファイルを取得してて、トラブルで取れなかった場合に、
その日を自動的に取得するプログラムを作ればいいです。
>>688
>>689の一言に尽きます。
ってか全く同じこと書こうとしてた
危うくケコーンするとこだった
>>688
こんな考え方はどうかな?
1、ディレクトリにあるファイルを全部取る
2,、取ったファイルはどこか別の場所へ移動
こんな考え方じゃだめ? 非常にシンプル・・・
>>688
あなたが自力でプログラミングするにはかなりの勉強が必要のようだ。
プログラミングの勉強が目的でないならオンラインソフトを探したほうが早い。
>>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;
}
こんなコードが通ってくれやがります。
どうしましょう?
>>694
VC6捨てる
>>694
何か問題が?
>>696
少なくともprivateメンバにアクセスはできないはずですね。
そうですね
>>694
VC.NETならゴラァって言ってくれるの?
700697:04/07/12 22:42
gccならエラーと警告が出るんだけどねぇ。
VC6のnamespaceおよびtemplateのへボサは言うまでもないと思ってたんだが。
702702: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;
// }
}
703702:04/07/12 23:59
入れ子のforを使ってa2とa3を求めるにはどうすればよいのですか?
入れ子があるとa1が上手く求まりません。
あと、coutですが、エクセルみたいにa1、a2、a3をテキストファイルに
縦表示させたいです。よろしくお願いします。
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;
}
>>702 はマルチなので放置
>>705
最初に書き込んだスレで答えてやれよ
>>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つも埋まらない状態です。
お願いします。
#include <standio.h>
sage
@@@@
711デフォルトの名無しさん:04/07/13 13:36
>>709
書き忘れていましたが、いくつかの間違いを含んだままになってます。
そっちに修正はしないでいいので、ifのあとの空欄をお願いします。
712デフォルトの名無しさん:04/07/13 13:39
ヘ_ヘ
ミ・・ ミ ということにしたいのですね?
( ° )〜
>>708
if ( value % 2 == 0 )

しかし、間違いがあるのを承知で、しかも断り無く質問するのはどうかと思うぞ。
>>708
Cとか関係ないし%
宿題スレいけよ2
>>712
>>713
>>714
すいませんでした。ちょっと急いでいたもので。
以後気をつけます。
どうもありがとうございました。
for (i=0; i<teki; i++){
cout << kekka1[i] << " " << endl;
}
for (j=0; j<tekiteki; j++){
cout << kekka2[j] << " " << endl;
}
だと、以下のようにできません。
kekka1 kekka2
○   ×
○   ×
:   ;
このように表示するにはどうすればいいのですか?
coutかprintfでお願いします。
○とか×ってなんだよ
>>716
折角答えてやったのに、マルチかよ・・・
しね
研究室のPCに入ってるVisualStudio.NET2003のC++でプログラム組もうと思ったんだけど…
iostream.hをincludeしようとしたらiostream.hが無いし、
iostreamをincludeして、cout使おうとしたら、std::coutじゃないと使えないし…(´・ω・`)

C++の仕様って変わった?
>>719
うらしまさん?
何年前の知識なの?
【初心者歓迎】C/C++室 Ver.7【環境依存OK】
723719:04/07/14 17:23
大学入学前だから…4〜6年前の知識(しかも古本)かな?(´・ω・`)
大学入学後はロクに組んでなかったし、
たまに組んだときも、古いコンパイラ使ってたから問題なかったし…

1から勉強し直した方が良さそうやね…
ダイテルのC++プログラミング2版の邦訳、vol.3 を立ち読みすれば、なんとなくわかるかも。
725719:04/07/14 18:19
サンクス。立ち読みしてみます。
AllocConsole()で作ったコンソールウィンドウをシステムメニューから閉じると、
GUIのメインウィンドウまで閉じて、プロセスが終了してしまうのを防止したいのですが。
どなたか、方法を御存知ないでしょうか。
WIN_APIの、SetConsoleCtrlHandler() や、HandlerRoutine() が関係しているところまでは msdn で調べたのですが、
具体的なサンプルコードのあるページが見つからず、理解できません。

>>723
普通にstd::coutじゃだめなのか?
using namespace std;
入れればいいだろ
#include <iostream>
using namespace std;
これでいいだろ
>>730
あちこちで聞きまくってるようだが、荒らしのつもりか?
某プログラム言語担当が配った資料が
#include <iostream.h>
だった。実行できねぇって文句言う奴多発。

VC6のときはファイルが存在してたんだっけ?
Hoge a, b, c; があるとして、

And(Hoge& a, Hoge& b, Hoge& c)
{
  a = b & c; //※メンバは省略しています
}
のように処理していました。

operatorを使って、operator= (a=b)とoperator&= (a&=c) の組み合わせで
同等なものは作成できましたが、
これを一度に処理することは出来ないのでしょうか?
734733:04/07/15 07:25
最後の文を、
>これを同等の速度で一度に処理することは出来ないのでしょうか?
に、修正させてください。
>>733
「一度に処理」の意味がわからん。
>>733
スレ違い。

こちらにどうぞ。
http://pc5.2ch.net/test/read.cgi/tech/1085915001/
737733: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;
}
では、一時的にコピーを作ってしまうので、それを避けたいというのが理由です。
738733:04/07/15 10:25
Hoge& operator & (Hoge& b, Hoge&c)

訂正
Hoge operator & (Hoge& b, Hoge&c)
739733:04/07/15 10:39
色々やってみて、勘違い(メンバ関数でやっていたり)していることに気が付きました。
お騒がせしました。
だからスレ違いだと書いたのに……
741733:04/07/15 12:18
>>740
すんまそ。

if (b & c) のような書き方は出来ないんですね…
>>741
なぜできないと考えるのかが分からない。
>>737,741
解決したみたいだけど一応。この方が少し良いかも。
Hoge operator & (Hoge& b, Hoge&c)
{
  return Hoge(b) &= c;
}
741のはbool(かその他制御式に直接置ける型)へのキャストをオーバーロードすればいい。
>>743
ありがとうございます。

>>742
えーと、a=b&c と if (b&c) は、戻り値が異なるだけなので
両立出来ないと思っているのですが...
>>744
>えーと、a=b&c と if (b&c) は、戻り値が異なるだけなので
>両立出来ないと思っているのですが...

>>743氏も言ってるけどHoge -> bool のキャストをオーバーロードすればいいだろ
>>744
operator bool() const { return true; };
こんなのをメンバ関数に追加するべし。
747733: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)) など)しなさい、
ということですね。
>>747 ちがいます。
>>747
普通キャスト演算子のオーバーロードは暗黙的変換でも有効。
つまり>>746のようなキャスト演算子のオーバーロードの関数を作った場合、if (b&c)ってのができる。(boolへの明示的キャストはいらない)
その場合、
1, まずb&c(operator &(Hoge&, Hoge&))をやる。
2, b&cの戻り値はHoge&なんで条件判断はできない。
3, そこでHoge型を引数にとるoperator bool()が自動で呼び出される。(boolなら条件判断ができる)
4, その結果をifが見る。
って流れになる。
const参照になってないのが気になってしょうがない
>>750に従うと
operator &(const Hoge& b, const Hoge& c)だ
752733: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,以降の処理が必要になるということでいいんですよね?
>>752
普段1と4だけ意識させるための(キャストの)オペレータオーバーロードだぞ
はじめまして。
初心者から質問させてください。
ここ
ttp://www.kopropo.co.jp/html/KONDO/KHR1_Support.html
にあるRCB-1というコントローラボードについてです。

このボードはRS232で通信するものです。
付属のアプリケーションがあるのですが、
それだと条件分岐が出来ないので、
条件分岐できるようなプログラムをC言語で組んでみたいと思ってます。

しかし、RS232を扱うような書籍が見つけられず困っています。
何か良い書籍、もしくはソースコードがないでしょうか。
>>754
お前が何のOSやコンパイラを使ってるのか知らないのに何を薦めろと言うんだ?
>>755
すっかり忘れておりました
OSはWindows2000、コンパイラはVC++です
>>754
よくわからんが、こんなんじゃだめ?
ttp://members.jcom.home.ne.jp/0434383301/vc10.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です。
>>759
int main()
{
int rand;
srand((unsigned int)time(NULL));
rand=getrand(256);
rand=getrand(256);
printf("%d\n",rand);
return 0;
}
>>762
それだと逆に小さくなってくぞ
素直にMT使えって
>>759

int getrand(max)
{
return((int)((double)rand() / ((double)RAND_MAX + 1) * max));
}
766754: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でトレースすることもできそうにありません。)
>>767
int* p = malloc( sizeof(int)*100 );
とか。C++の方が、全般に型チェックがうるさくなってる。
>>768
cygwin + mingwn + gcc 相談室
http://pc5.2ch.net/test/read.cgi/tech/1058134693/
にいったほうがいいと思う
771768:04/07/18 13:53
>770
ありがとうございます。行ってみます。
772デフォルトの名無しさん:04/07/18 14:12
>>759
乱数の種がほぼ1づつしか変わらないのが原因だね。
1秒ごとというのが手動ならμ秒やミリ秒を返すAPIがあればそれを使う。
gettimeofday()とかtimeGetTime()とか。環境依存だけど。
linuxとかなら/dev/rand使う。
>>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です。
超初心者の質問ですがよろしくお願いします。

Sleep
776デフォルトの名無しさん:04/07/18 14:44
>>774
Sleep()
>>773
精度の問題じゃないってば。
種の問題。
>>777
標準関数のrandを使ってるのが問題。
779774:04/07/18 14:55
>>775,776
ありがとうございます。

cout << "三秒後に「三秒経ちました。」と出力します。" << endl;
Sleep(3000);
cout << "三秒経ちました。" << endl;

しかし上記のようにSleepを使ってみたところ
『error C2065: 'Sleep' : 定義されていない識別子です。』
とエラーが出てしまいました。
なにかincludeしなくてはいけないのでしょうか??
>>779
#include <windows.h>
その前にまずはチュートリアルあたりを嫁。
781774:04/07/18 16:15
>>775,776,780
できました!
ありがとうございます。
今度からはチュートリアルを熟読してから質問します^^;
782759: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
どうもすいませんでした。
myProg.hbrBackground =GetStockObject(WHITE_BRUSH);
の部分を消したらできました。
char *a と char *a[] って何か違いはあるの?
int i と int i[] くらい違う
788デフォルトの名無しさん:04/07/19 07:05
一から学びたいんですが、オススメのサイトはありますか?
インライン関数を使おうと思ってるのですが。
”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:が出てしまいます。
これはインライン関数の使い方が間違ってるのでしょうか?
>>790
inline指定子はインライン展開を強制するものではないので、
指定しない場合と同様にhoge.cppだけでなくfunc.cppもリンクする必要がある。
つーか、それ以前にコンパイル単位が違う段階でインライン展開しようがないんだけど。
>>790
> ”func.cpp”
#include "func.h"
void func(double)
{

}
792は忘れて
忘れたくても忘れられません
>>791
なるほど、コンパイル単位が違うと駄目なんですね・・・考えてみればそりゃそうか・・・
796モモカ:04/07/19 18:53
はじめまして!!
大学生の研究でC++を使うことになってオブジェクト指向がわからなくって困ってるの
C言語でいうメイン関数とサブルーチンの関係とオブジェクト同士のデータと手続きの
関係って何が違うの?メイン関数からサブルーチンにデータを渡して、サブルーチンで
計算してメイン関数に関数に返すっていう流れをみるとオブジェクト指向じゃないかって
思うの。どうなんですか?教えてくださーい。ペコリ
夏か
798デフォルトの名無しさん:04/07/19 22:36
ABC.libというファイルをa.objとb.objから作りたいのですが
コマンドが調べてもわかりません。
誰か助けて。
普段コンパイルはlcc a.cで通ってます
799デフォルトの名無しさん:04/07/19 22:53
>>798
まずはマニュアル嫁、マルチ。
>>799
マルチではなく俺が誘導してきた
>>800
なら回答よろしく
>>801
ごめん
俺に解ってたらこっちに連れてこない

誰か解答よろ
とりあえず俺はBcc32のバージョンは解答してみた

>>798
lib作成 LCCとかでググってみ
>>798
lcc ってこれ?
http://www.cs.virginia.edu/~lcc-win32/
↑にマニュアルある。

けど、なんか読んでもよくわからん。
コンパイラオプションにはなさそう。
リンカオプション説明もあるけど、lib作るってのは見当たらないな。

がんばってくれ。
LSI-Cだったりして。。。
LSI-Cならライブラリアンが付属していたはずだよ。
確か妙な名前だったはず。
コンパイラドライバ(lcc)からは作れなかったと思う。
ライブラリアンと聞くと
口から酸性の液を吐く凶暴な生物を思い出す。
807デフォルトの名無しさん:04/07/20 01:28
LSICです
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
負担の軽減
コンパイラに数えさせたら楽だし間違わないから。
入れてもいいよ♥
>>810
むしろ、あとの[12]は要素数を指定しないとならないってのがミソなんだが。
815デフォルトの名無しさん:04/07/20 02:07
わかりました。
ありがとうございます。
>>810
「配列のポインタ」

「ポインタの配列」
の違いについて述べよ
>>812
コンパイラは何も数えてないぞ
>>808
あー、そういえばObjectARchiverって言ってた気がする。
>>810
コンパイラがあとの〜〜〜〜〜〜〜〜で要素数を決定できるから
質問すいません、時系列のデータファイルがあったときに
例えばそのファイルのデータの中の5の倍数番目のデータだけからなる
データファイルを新たにつくるCプログラムはどうしたらよいですか?
>>817
数えないでどうやって決定するの?
適当に
>>821
実際のところ、データのサイズだけ計算すれば十分だから。
824デフォルトの名無しさん:04/07/20 17:00
質問させて下さい。 学校の休み期間で、PCクラスタに挑戦してみたいのですが、参考文献とか教えていただけないでしょうか。
演算させるのは、スカラー計算です。
OSは、やはりリナックスになるのでしょうか?
できれば、Windowsでしたいのですが・・・
すいませんsage忘れました
>>824
>OSは、やはりリナックスになるのでしょうか?
でしょねぇ。
>>824
UNIX系OSの知識がないと,いきなりはちょっと辛いかもしれません.
参考文献は...
PVM
MPI
OpenMP
Mosix
SCore
このへんのキーワードでぐぐって知識を体系化させて下さい.
MPIの実装の一つmpichはWin版があったような気はします.
mpichなら制限付試用版があるかな、昔は完全フリーだったんだけどねぇ
>>821
数えないし決定もしない。sizeofの利用を除いて。
相談したいのですが、
過去ログ【初心者歓迎】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 でブロッキングされたまま止まってしまいます。
知恵を貸していただけないでしょうか?
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);
始めてWideCharToMultiByte関数を使用する事になったのですが、
ちょっと疑問が出来てしまいました。
WindowsXp、VC++6.0 SP6.0 の環境では
CP_ACP と CP_OEMCP の結果が同じに見えます。
これって日本語版Windows以外やWindows9x等では結果が違うのでしょうか?
(ページコード というのは地域の事?)
ご存じの方いらっしゃいましたら御願いします。
>>832
日本語版Windowsではどちらも同じです。
英語版では異なってます。

「OEMコードページ」なんかで検索してみれば基礎的な知識が得られると思います。
834832:04/07/21 13:47
>>833
なるほど大体分かりました。ありがとうございました。
835デフォルトの名無しさん:04/07/21 13:47
C + Win32API + BCCでプログラムを作っているのですが、
それのビットマップについての質問です。

始めに、外部ビットマップは、一つの要素に一つのビットマップを使うタイプです。
ツクール2000みたいに、ひとつにいろんなのを載せるタイプではありません。


ビットマップを表示するときは、表示するたびに外部ビットマップを開くか、
使う全ての外部ビットマップを、プログラムの始めに
メモリビットマップに書いておくのか、どちらがいいのでしょうか。


透過の為のマスクビットマップは、外部に用意しておくか、
プログラムの始めに元のビットマップから製作するか、どちらがいいのでしょうか。
>>835
自分が作りたいアプリケーションに合わせて仕様を決めましょう。
例えば、格闘ゲームなんかの場合は

1.登場キャラで足りない分のデータだけをメモリに読み込む。
2.マスク作成
3.ゲーム部分
4.次ステージに登場しないキャラの部分のメモリ解放
5. 1.に戻る

といった感じ。
必要無いデータは必要になる前の違和感を感じない所で読めば良い。
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 ) を評価したいのです。

色々と検索したところ、テンプレート関数の実体がないため(?)らしいというあたりまではわかったのですが、
具体的にどうすれば解決できるのか教えていただけないでしょうか。
>>835

1.
頻繁に同じ画像を描画するのであればメモリ上に置いておく必要があるし、
不特定多数の画像の切り替えが必要な場合は、表示させるときにだけ読み込めばいい。

2.
特に問題なければ読み込み後でのマスク作成でいいと思う。
839835:04/07/21 14:21
>>836
ありがとうございます。

僕が作ろうとしているのは、FE等のターン制SRPGです。

基本的には、1は後者の方で、2も後者のようですが、
さらに、メモリっとくビットマップの種類を
できるだけ小さくしておく工夫が必要なんですね。
分かりました。
840835:04/07/21 14:29
>>838
ありがとうございます。

>1
SRPGなので頻繁ではないタイプだと思います。

透過をマスクを使わずSetPixelVでやっていたので、
キャラを選択して移動範囲を表示するとき、
薄く青描けるのがあると思いますが、あれが激遅でした。

>2
1で読み込んだ時、その分のマスクをその時に作ればいいのですね。
分かりました。
841835:04/07/21 14:32
>>838
>1
ここの部分は、同じSRPGでも、ゲーム進行の仕方によって
微妙に違ってくると思うので、いろんな方法を試して見ます。
>>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;
}

を実行しても終了しないんですが、どうやったら終了できるようにできますか?
>>843
終わりたい時に電源切ればいい
845843: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どっちでも)
848843:04/07/21 17:29
>>846
どうしたら、偽になるんですか?
>>848
そのように振舞うgetcharを自分で作る。
850デフォルトの名無しさん:04/07/21 17:34
>>848
Ctrl+DとかCtrl+Zとか
851843: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が実行されてないみたいです。
なぜ?
>>852
目を凝らしてよ〜く見てみろ
854デフォルトの名無しさん:04/07/21 18:00
&d
>>852
Shift6→Shift5
ん? '&'はShift+7じゃないの?
>>856
俺のキーボードではShift+6だよ
>>855-857
(・∀・)ソレダ!
プログラムは思った通りには動かない。作った通りに動く。
860デフォルトの名無しさん:04/07/22 14:41
つまり、思った通りに作れば
思った通りに動くわけですね。
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);
符も計算してくれ
864862続き: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);}}}
865862続き: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"); }}
866862: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;
}

上手くいかなかったんですがどうすればいいですか
>>867
せ め て 、 希 望 す る 結 果 ぐ ら い は 書け!
>>868
内定
>>867
こうすればコンパイルは通る。
cout << str[0] << str[1] << endl;
C++相談室にまで書くなよ
>>869
ワロタ
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
メールチェックなどのプログラムを書くのに
参考になるページなどあれば教えて下さいませんか?
一応ググッたのですが見つからなかったので。
operator delete(void*, std::nothrow_t const &)
ってどうやって呼び出すんですか?
>>876
operator delete(p,std::nothrow);

一応聞いとくが、何がしたいんだ?
Win32の質問です。HeapAlloc()で割り当てられるメモリの最大容量はCOFFの拡張ヘッダに
あるSizeOfHeapCommitの値までなんでしょうか?デフォルトでは0x1000(64KB)となっている
ようなんですが・・・。
>>877
new(std::nothrow) obj;で確保した領域は
operator delete(void*, std::nothrow_t const &)で開放せにゃなんないと聞いたもので。
>>879
基本的な考え方は正しいけど、例外的に、nothrowを取るnew/deleteは
普通のnew/deleteと混用できる。
881デフォルトの名無しさん
ちょいと質問。
lcc-win32 Ver.3.8での話なんですが、
変数を特定のセクションに割り当てる方法ってあるんですかね?
VCだと
#pragma data_seg (".hoge")
とかでなんとかなりますが、
lcc-win32ではググっても資料があまりないみたいで…