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

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。
※sageは禁止です。
【前スレ】
http://pc8.2ch.net/test/read.cgi/tech/1113139986/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
2デフォルトの名無しさん:2005/05/13(金) 13:32:14
急速にスレの質が低下してまいりました
3デフォルトの名無しさん:2005/05/13(金) 13:53:11
もうかよ!
4デフォルトの名無しさん:2005/05/13(金) 14:00:10
Cよ!ありがとう!そして
さよなら…
return 0;
5デフォルトの名無しさん:2005/05/13(金) 15:05:49
>>1
otu
6デフォルトの名無しさん:2005/05/13(金) 16:00:36
前スレ続きの質問なんですが、
関数の引数に定数を渡し、その関数内で常に同じ値になるときは、
どうなりますか

Func( 256, 4 );

void Func(int a, int b)
{
float fa = a / 256;
float fb = b / 256;
return fa + fb;
}
ちょっと、極端ですけど。
7デフォルトの名無しさん:2005/05/13(金) 16:06:10
voidですが?
8デフォルトの名無しさん:2005/05/13(金) 16:06:56
>>6
オプチマイズをOFFにしてればどもならん
ONならコンパイラによる
9デフォルトの名無しさん:2005/05/13(金) 16:07:38
訂正
return fa+fb; -> g_val = fa+fb;
10デフォルトの名無しさん:2005/05/13(金) 16:08:30
でもobj吐いた段階じゃよそから呼ばれ無いことがわからんから
やっぱどもならんか
11デフォルトの名無しさん:2005/05/13(金) 16:09:42
>>6
いくら続きだからと言って、説明端折り過ぎ。
Func()内の演算が実際に行なわれるかという質問と考えていいのかな?
だとしたら、関数の実装においてどんな引き数で呼ばれるかは予測不可能なので
演算が行なわれなくなるようなことは有り得ない。
但し、C++でinline指定した場合は呼び出し側で最適化される。
#ついでに言えば、値を返さない関数だと意味ないな。

Ex.
inline double Func(int a, int b)
{
float fa = a / 256;
float fb = b / 256;
return fa + fb;
}
double anyFunction()
{
return Func(256, 4);
}
は、
double anyFunction()
{
return 1.015625;
}
と同じコードになることは十分有り得る。
1211:2005/05/13(金) 16:11:31
おっと、遅かったか。
g_val = fa + fb;
となると、inlineをつけてもinline化されることは期待できなくなってくるね。
136:2005/05/13(金) 16:17:24
勉強になりました
14デフォルトの名無しさん:2005/05/13(金) 16:23:05
>>11
絶対ありえない。
あるとしたらreturn 1.;
15デフォルトの名無しさん:2005/05/13(金) 16:34:13
あ、ほんとだ、整数演算になってら。
16デフォルトの名無しさん:2005/05/13(金) 16:46:21
超初心者なんですが、・・・・・質問していいでしょうか?
二次方程式の解をcで作ってみたんですが
#include <stdio.h>
#include <math.h>
main(){
double a,b,c,D,re,im,x1,x2;
printf("a,b,cを入力してください:");
scanf("%lf %lf %lf",&a,&b,&c);
D=(b*b-4*a*c);
if(D>0){
re=-b/(2*a);
im=-sqrt(D)/(2*a);
x1=re+im;
x2=re-im;
printf("x=%f,%f\n",x1,x2);
}
else if(D==0){
re=-b/(2*a);
printf("x=%f(重解)\n",re);
}else{
re=-b/(2*a);
im=sqrt(-D)/(2*a);
printf("x=%f+%fi,%f-%fi\n",re,im,re,im);
}
・・・・・動かないんですよね;何が違うかわかりません?
それと、係数をファイルから読み込んで方程式を解かせるには
どうしたらいいんでしょうか?
プログラムって難しくって・・・、頭あんまり良くないからなぁ・・・
アドバイスだけでもお願いします。
17デフォルトの名無しさん:2005/05/13(金) 16:57:10
>>16
'{' と '}' の関係を見直してみ。
18デフォルトの名無しさん:2005/05/13(金) 17:05:58
>>16
動かないというのは、何がどう動かないのか
19デフォルトの名無しさん:2005/05/13(金) 17:19:05
>>16
係数をファイルから云々はfopen使っとけ。
20デフォルトの名無しさん:2005/05/13(金) 20:14:50
C++の参照のことで質問です。
class baseと継承関係にある二つのクラスをbaseの参照で持ち替えたいのですが。
意図どおりに動きませんでした。
どうしてでしょうか??というか、考え方が根本的に間違ってますか??
環境はvc7.1です。
int main(int argc, char* argv[])
{
    Base& B = TheA();//BはBaseのB。
    B.Func();
    B = TheB();//TheBを突っ込みたいのに、ここでなぜ初期化されたTheAが入るのか??
    B.Func();


    return 0;
}
フルソースは以下
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/382.txt
21デフォルトの名無しさん:2005/05/13(金) 20:18:09
>>16
> 何が違うかわかりません?

1.質問の仕方
2.勉強の順序
3.質問に至るまでの調査の仕方・時間
4.あなたの考え方
22デフォルトの名無しさん:2005/05/13(金) 20:37:39
>>20
参照は初期化したあとには参照先を変えられない。
23デフォルトの名無しさん:2005/05/13(金) 20:41:44
>>22
やっぱそうなんですかね。
残念。new無しプログラミングができると思ったのに。
ま、いいか。レスThx。
24デフォルトの名無しさん:2005/05/13(金) 21:40:41
Cで質問があるのです。学校の課題で「引数prefixで与えられる括弧つきの
前置記法の式を後置記法に変換し、引数postfixが示すキューに格納する関数
を作成せよ」という問題でプロトタイプ宣言が
void getexp(char *prefix,strut queue *postfix);
となっているのです。char *prefixはメイン関数の前置記法の式を代入するこ
とは分かっているんですけどstrut queue *postfixはいったいどういう意味な
のでしょうか?postfixのままポインタとして使えないし、それ以前にメイン
関数でポインタを作成して代入しなきゃならないのか?スレ違いかも知れませ
んがよろしくお願いします。
25デフォルトの名無しさん:2005/05/13(金) 21:48:19
26デフォルトの名無しさん:2005/05/13(金) 21:55:00
C言語で質問です。
メモリの任意のアドレスにある値を取り出したいんですが、どうしたらいいのでしょう?

具体的には
0x75DCD3というアドレスにある値を取り出して変数に渡したいんです。
27デフォルトの名無しさん:2005/05/13(金) 21:56:58
>>26
type val = *(type *)0x75dcd3
28デフォルトの名無しさん:2005/05/13(金) 22:01:16
>>27
どうもありがとうございました。ちょっと試してみます
29デフォルトの名無しさん:2005/05/13(金) 23:01:33
VisualStudio.Net 2003のVC++で開発しています。

アプリケーション間で文字列を送受信する方法で、
SendMessage+COPYDATA以外の方法はあるのでしょうか?
SendMessageで送受信自体は実現できたのですが、
受信側の処理終了まで待つのが引っかかっています。

PostMessageの様に、送信側が待機状態にならずに
文字列の送信も行えるのが理想なのですが
30デフォルトの名無しさん:2005/05/13(金) 23:12:47
DDE、OLE、パイプ、クリップボード、メールスロット、メモリマップトファイル・・・
31デフォルトの名無しさん:2005/05/13(金) 23:29:20
むう、やっぱりそういう方法になりますか。

現状では、15桁数字を分割してPostMessage送信していたのですが
今回15桁数字*2の送信が必要になりまして。
文字列とは言っても数字のみで、あとほんの少しの桁数だから
PostMessageみたいな簡易的な方法があればよかったのですが・・・

ありがとうございました
32デフォルトの名無しさん:2005/05/14(土) 02:07:36
>>31
>>30の何が気に入らない?

ソケット通信を始め、プロセス間通信の方法は多々あるぞ。
33デフォルトの名無しさん:2005/05/14(土) 02:09:38
>>32
お節介なお前の態度が気に入らない。
34デフォルトの名無しさん:2005/05/14(土) 03:02:40
親切すぎるのも考え物か…?
35デフォルトの名無しさん:2005/05/14(土) 06:05:40
最新のC++の規格に対応した入門書を教えてください。(規格書以外でおねがいします)
3635:2005/05/14(土) 06:08:28
理由は柴田望洋のプログラミング講義C++を買ったのですが、
どうも書き方が古いということなので、古い書きかたが身につかないうちに、
最新のもので学んでおきたいのです

37デフォルトの名無しさん:2005/05/14(土) 07:07:02
>>35
書籍スレ池よ。
38デフォルトの名無しさん:2005/05/14(土) 21:18:34
グローバルで、クラスhogeへのポインタ型のvectorを作って、
どっかの関数内でhogeのインスタンスをnewで生成してポインタをvectorに入れたとき、
その関数を出て、別の関数内でvectorのポインタからインスタンスを使ったりしたら
まずい事になりますか?
関数内で宣言された普通の変数とかは、そこを出ると消えちゃうんですよね?
39デフォルトの名無しさん:2005/05/14(土) 21:23:14
>>38
言っている意味がよくわからないから、短いコード例を示してくれないか?
40デフォルトの名無しさん:2005/05/14(土) 21:23:32
>>38
newで作成したインスタンスは、ローカルとかグローバルに関係ない。以上。
41デフォルトの名無しさん:2005/05/14(土) 21:28:57
>>38
何の問題もない。
#include <vector>

class hoge {};

void sub();
std::vector<hoge*> phoge;

int main()
{
 sub();
 delete phoge[0];
}

void sub()
{
 phoge.push_back(new hoge);
}
42デフォルトの名無しさん:2005/05/14(土) 21:31:30
>>39>>40
ありがとうございました。
43デフォルトの名無しさん:2005/05/14(土) 21:34:11
>>41
はい。わざわざすいません。ありがとうございました。
44デフォルトの名無しさん:2005/05/14(土) 21:40:42
NULL代入して二回deleteを防止しとくのをわすれずに

//vector<hoge*> p;
vector<hoge*>::iterator it=p.begin();
for(;it!=p.end();++it)
{
delete it;
it=0; //これ
}
p.erase(p.begin(),p.end());
45デフォルトの名無しさん:2005/05/14(土) 21:52:32
>>44
直後で要素を消すなら要らんだろ。
46デフォルトの名無しさん:2005/05/14(土) 22:01:12
>>44
delete it;

delete *it;
じゃね?
47デフォルトの名無しさん:2005/05/14(土) 22:07:00
部分消去は以下のように
delete p[i]; // i < p.size()
p[i]=0;
p.erase(remove(p.begin(),p.end(),static_cast<hoge*>(0)),p.end());
4838:2005/05/14(土) 22:26:42
>>44-47
後で多分必要になると思うので参考にします。ありがとうございます。
ところでまた質問なんですが、、

「動物クラス」を継承した「犬クラス」と「猫クラス」、
そして、「動物クラスへのポインタ型」のvectorがあるとします。

適当な順番で何個かの犬クラスや猫クラスをnewで生成し、
動物クラスへのポインタ型変数に入れ、vectorに挿入していきます。
このあと、vectorから適当な要素を取り出して、
そのポインタが犬のインスタンスを指しているのか、
猫のインスタンスを指しているのかを判別するにはどういう方法があるでしょうか?

例えば識別の為のメンバ変数とかメソッドを作っておき、
1が帰ってきたら犬、2が帰ってきたら猫、のようにチェックしてもいいと思うのですが、
本来そのクラス自体が種類を表しているはずなのに、
内部に自分自身の種類の識別のためのメンバ変数を持たせるというのはなんだか気持ちが悪いです。
他にもう少しましな方法というのはないでしょうか。
こういったとき、どうやるのが普通でしょうか。
49デフォルトの名無しさん:2005/05/14(土) 22:34:01
dynamic_cast
50デフォルトの名無しさん:2005/05/14(土) 22:47:06
>>48
プログラムで判別すると、継承したクラスの種類が増えるにつれ、if文の
羅列になってしまい、好ましくない。だから普通は判別の必要がないように、
仮想関数にする。
5138:2005/05/14(土) 23:21:22
>>49>>50
ある種類だけ取り出したいときにはどうすればよいのだろうと思って質問したのですが
dynamic_castというのがまさに探していたものという感じでした。
でもそれが必要になる事自体、設計がよくないみたいですね。見直してみます。
ありがとうございました。
52デフォルトの名無しさん:2005/05/14(土) 23:26:39
>>51
dynamic_castが必ずしも悪いわけではなく、ダウンキャストが必須の場面では
使わざるを得ない。しかし継承関係を調べるのに使うのは、設計が間違っている
可能性があるって事を指摘しただけで、学習の過程でいろいろ試してみられる
のは全く問題ないですよ♪
53デフォルトの名無しさん:2005/05/14(土) 23:29:06
typeof演算子
54デフォルトの名無しさん:2005/05/14(土) 23:34:06
環境はWindowsXP。DOS窓で動くC言語プログラム。
テキストファイルに改ページを入れるにはどうすればいいですか?
昔のDOSだったら、
改ページコードを書き込んで、テキストファイルはプリンタへリダイレクト。
でよかったののですが、WindowsXPの場合、エスケープシーケンスが使えないので困っています。
よろしくお願いします。
55デフォルトの名無しさん:2005/05/14(土) 23:44:53
下記の所は廃墟みたいなので、
ここでC#の質問はダメでしょうか?
C#の質問で最適な場所が無いんですが。


ミスターサタンのC#相談室
http://pc8.2ch.net/test/read.cgi/tech/1092656075/l50

56デフォルトの名無しさん:2005/05/15(日) 00:23:20
>>55
だめです。
57デフォルトの名無しさん:2005/05/15(日) 01:11:08
ポインタは変数の開始位置アドレスを表しますが、
変数の終端位置アドレスを指定しなくてもその開始位置から何バイトまでがその変数なのか、
という事は勝手に判断してくれるのでしょうか。
例えば標準関数などに変数の開始位置アドレスを使うものがありますが終端位置を使っていません。
OS等がよろしくやってくれるんでしょうか?
58デフォルトの名無しさん:2005/05/15(日) 01:13:38
>>57
そのために型情報を使う。或いは配列として扱うならナル文字などのSentinelを置く。
#尤も、後者の場合も型情報を使っているわけだが。

いずれにしても、この場合はOS云々は関係がない。
59デフォルトの名無しさん:2005/05/15(日) 01:14:50
>>57
T* p があれば、 (char*)p + sizeof(T) でオブジェクトの占めているメモリの終端は得られる。
しかし、ほとんどの処理は「変数の終端位置」なんて考慮しない。
その「変数の終端位置」っていうのは何に使えると思うんだ?
60デフォルトの名無しさん:2005/05/15(日) 01:51:53
>>57
sprintfやstrcatの事を言ってるのだと予想。
6160:2005/05/15(日) 01:57:05
ということなら、
これらの関数は格納先のサイズを知る術は無いのでバッファオーバーランの危険がある。
6257:2005/05/15(日) 01:57:22
レスありがとうございました。
>>59 メモリの読み取り開始位置と読み取り終了位置の判別をどうやっているのだろうという事でした。
63デフォルトの名無しさん:2005/05/15(日) 02:16:19
>>62 やっぱり意味わからん。配列の先頭をポインタで渡すときの話か?
6457:2005/05/15(日) 04:42:31
>>63
配列に限らずですが、先頭アドレスの情報だけではその変数は扱えないはずでは、と思ったのです。
変数の型から計算しているという事に納得しました。
65デフォルトの名無しさん:2005/05/15(日) 06:12:30
以下のようなクラスで、aをx[0]への参照にしたいのですが、
a(x[0])の設定をnewでメモリを確保した後に、実行させるにはどうしたらよいのでしょうか?

class foo 

public: 
int &a; 
int *x; 
};
 
foo::foo() : a(x[0])
{
    x = new int[10];

66デフォルトの名無しさん:2005/05/15(日) 06:33:32
CのCGIで、
HTMLのフォームからPOSTメソッドで行われた標準入力は、
そのHTMLフォームの順番通りになっている事が保証されるのでしょうか?
例えば、題名・名前・本文という内容のデータを受け取った時、
標準入力には必ず題名・名前・本文という順番で格納されているのでしょうか。
67デフォルトの名無しさん:2005/05/15(日) 07:17:08
>>65
foo::foo() : x(new int[10]), a(x[0])
{
}
68デフォルトの名無しさん:2005/05/15(日) 08:15:44
>>65 >>67
メンバの初期化は宣言順だから、クラス定義も書き換えなきゃダメ

class foo
{
public:
    int* x;
    ;int& a;

    foo();
};
69デフォルトの名無しさん:2005/05/15(日) 10:10:18
すいません、C++のiostreamのマニピュレーターを自作したいのですが
どこかのWebで解説されていませんか?
もしくはこの本に乗っているでもいいので教えてください。
マニピュレーターが関数である、という知識しかありません。
70デフォルトの名無しさん:2005/05/15(日) 10:30:15
>>66
普通は順不同でも動作する様に作る。
71デフォルトの名無しさん:2005/05/15(日) 10:45:18
>>69
マニピュレータが関数である、ということがわかっていれば、
それ以上の解説なんか要らないことがほとんどなんで、たぶん無いだろうな。
72デフォルトの名無しさん:2005/05/15(日) 10:50:42
>>69
「出力以外の何か」をするように<<演算子を定義するだけだが。
それから、マニピュレータは関数であるとは限らない。
ostream &(&)(ostream &)型に対してあらかじめ<<演算子が定義されているだけ。
73デフォルトの名無しさん:2005/05/15(日) 11:59:35
#include <stdio.h>
int testfunc(char *s_in[],int *size)
{
int i=0;
while(i<*size){
if(s_in[i++] == "="){
printf("%d文字目に=があった。\n",i);
}
}
return 0;
}
main()
{
int size=10;
char s_in[size]="=";
testfunc(s_in,&size);
return 0;
}
これをコンパイルしても「定数式が必要(main関数)」というエラーが出て通りません。
何がダメなんでしょう?
それと、testfunc内でsizeは*を使わないとエラーになるのに、s_in[i]は*をつけるとエラーになります。
これは何故ですか?
74デフォルトの名無しさん:2005/05/15(日) 12:08:06
>>73
> これをコンパイルしても「定数式が必要(main関数)」というエラーが出て通りません。
>何がダメなんでしょう?
古いCだと、配列の大きさは定数でなければならない。
#define SIZE 10
char s_in[SIZE] = "=";
とでもするべし。
>それと、testfunc内でsizeは*を使わないとエラーになるのに、s_in[i]は*をつけるとエラーになります。
>これは何故ですか?
s_in[i]は、*(s + i)と同じ意味を持つ。
75デフォルトの名無しさん:2005/05/15(日) 12:26:08
>>74
ありがとうございます。
新しいCならば、変数でも可能なのでしょうか?
その行に来たときに動的に配列を作成してくれるということなのでしょうか?
76デフォルトの名無しさん:2005/05/15(日) 12:26:46
レスありがとうございます。
以下のように修正したところ、「互換性のないポインタ変換」というエラーが出ました。
これは何故でしょうか?
#include <stdio.h>
#define size 10
int testfunc(char *s_in[],int size_)
{
int i=0;
while(i<size_){
if(s_in[i++] == "="){
printf("%d文字目に=があった。\n",i);
}
}
return 0;
}
main()
{
char s_in[size]="=";
testfunc(s_in,size);
return 0;
}
7773&76:2005/05/15(日) 12:27:55
75は私ではないです。
78デフォルトの名無しさん:2005/05/15(日) 12:28:08
>>75
うん。
79デフォルトの名無しさん:2005/05/15(日) 12:37:49
>>76
testfuncの仮引数で、
char *s_in[]
とあるけど、これは「char *の配列」を指定している。
一方mainではcharの配列(これはchar *に変換される)を渡している。
8069:2005/05/15(日) 12:58:22
>>70-71
ありがとうございました。できました。

ostream& test ( ostream& out )
{
out << " " << setw(2) << setfill('0');
return out;
}

しかしどうやったらこういう知識を得られるのでしょうか?
ある日突然朝起きたら閃くわけじゃないよね?
81デフォルトの名無しさん:2005/05/15(日) 13:02:15
いやそういう君はどうやって得たのさw
82デフォルトの名無しさん:2005/05/15(日) 13:06:28
>>80
・俺は「プログラミング言語C++第三版」で読んだ。
・「マニピュレータ c++」でググると9番目に出てくる。
・知識はなくとも、自分で<<を定義できることを知っていれば考え出せる。
struct test_t{} test;
std::ostream &operator<<(std::ostream &out, const test_t &)
{
out << " " << setw(2) << setfill('0');
return out;
}
8369:2005/05/15(日) 13:13:34
>>81
(すでに転職して消えてしまった)先輩がちょろっと、「マニピュレーターは単なる関数だから」って言ってたのを覚えていたから。
いなくなって初めてわかる「できる先輩」のありがたさ。もっと教わっておくんだった。

>>82
Stroup先生の本は翻訳が読みづらい…
プログラマーには向いてないんですかね  orz
84デフォルトの名無しさん:2005/05/15(日) 13:21:55
>>83
"Stroustrup"な。翻訳が読みづらいと思うなら、原書を読むのはどうかね?
85デフォルトの名無しさん:2005/05/15(日) 13:26:35
全然読めない罠
86デフォルトの名無しさん:2005/05/15(日) 14:17:14
winsock使う簡単なプログラムの練習をしてるんですが、何をするにも

WSADATA wsadata;
WSAStartup(MAKEWORD(1,1),&wsadata);

が必要なのでしょうか?
wsadataなんて使わないプログラムなんですが、これがないとエラーになってしまいます。
87デフォルトの名無しさん:2005/05/15(日) 14:22:00
>>86
ttp://msdn.microsoft.com/library/en-us/winsock/winsock/wsastartup_2.asp
"The WSAStartup function must be the first Windows Sockets function called by an application or DLL."
88デフォルトの名無しさん:2005/05/15(日) 14:26:31
>>87
あ、WSAstartupが必要らしいってことはわかるんです。
でも、wsadataなんて使わない構造体を宣言するのにどうも違和感が…。
89デフォルトの名無しさん:2005/05/15(日) 14:29:39
>>88
要らないならローカルに定義してすぐ捨てればいいだろ。
90デフォルトの名無しさん:2005/05/15(日) 14:34:56
>>89
やっぱり一回は必要なんですね。
どこかで初期化したら、他の関数ではもう意識しなくていいということですか。
ありがとうございましたー
91デフォルトの名無しさん:2005/05/15(日) 14:40:39
>>90
あんたが必要なくてもライブラリが必要とするわけだ。
92デフォルトの名無しさん:2005/05/15(日) 23:52:36
char m_hoge[256];
みたいな文字列のメンバに、コンストラクタの初期化リストで適当な文字を入れて
初期化したいときはどうやって書けばよいのでしょうか。
93デフォルトの名無しさん:2005/05/15(日) 23:56:54
>>92 std::string m_hoge;
94デフォルトの名無しさん:2005/05/16(月) 00:04:02
for( ; ; )
上記のようにすべて省略した場合、無限ループになるのでしょうか?
また、この省略は文法的に認められているのでしょうか?

for( i=0 ; ;i++ )
また上記のようにエンドのみを終了した場合も無限ループとなるのでしょうか?
95デフォルトの名無しさん:2005/05/16(月) 00:06:38
>>93
ありがとうございます。
char型の文字列だと無理なんでしょうか?
例えば名前を入れたい文字列だとして、
初期値として"名無し"と初期化したりしたいのですが。
96デフォルトの名無しさん:2005/05/16(月) 00:09:50
>>95
無理です。
同様に、配列の {} による初期化もできません。
97デフォルトの名無しさん:2005/05/16(月) 00:10:58
>>94
全部省略したら無限ループになります。
;(セミコロン)は省略できませんが、その他は省略できます。

次の奴も無限ループになります。
98デフォルトの名無しさん:2005/05/16(月) 00:12:28
>>95
初期化を諦めて代入にすればどう?
まあ、初期化リストに書けない事で、継承していた場合の基本クラスの
コンストラクタ呼び出しが出来なくなるが・・・・・
99デフォルトの名無しさん:2005/05/16(月) 00:16:04
>>95
メンバをポインタ変数にし、"奈々氏"を返す関数で初期化する。
100デフォルトの名無しさん:2005/05/16(月) 00:21:03
>>98
char[] ひとつを代入にしたところで
基本クラスのコンストラクタ呼び出しには影響しないんじゃないか?

>>99
ポインタの指す先の寿命について厳しい注意が必要。
101デフォルトの名無しさん:2005/05/16(月) 00:22:51
>>100
いや、初期化リストの所に書きたいと言っているので、もしかしたら
親クラスのコンストラクタでも呼び出す可能性があるのかと思って。
気にしないでくだされ。
102デフォルトの名無しさん:2005/05/16(月) 00:28:07
>>101
やっぱり何が関係あるのかわからん。まあ気にしないでおくかな。
103デフォルトの名無しさん:2005/05/16(月) 00:41:48
static inline const char * r774() {return "名無し";}
104デフォルトの名無しさん:2005/05/16(月) 00:53:51
LinuxでCPU使用率と物理メモリの空き容量を取得するにはどのようにしたらよいのでしょうか?
105デフォルトの名無しさん:2005/05/16(月) 01:07:14
>>104
そんな時は逆転の発想が必要です
CPUを無意味に使って、メモリも不必要に使い倒します
そうすれば、両方とも100%使用状態
特に取得する必要もありません
106デフォルトの名無しさん:2005/05/16(月) 01:19:52
>105
あおどのくらい使用できるかを知りたいのですが・・・
つまりその、100%じゃないかどうかをしりたいのです
107デフォルトの名無しさん:2005/05/16(月) 02:40:00
>>106
負荷を徐々にかけていけば、どのへんが限界かわかるでしょう。
108デフォルトの名無しさん:2005/05/16(月) 02:41:00
>>107
どうやって?
109デフォルトの名無しさん:2005/05/16(月) 02:44:19
メモリの場合だったら、1メガバイトずつ確保していってだな。
110デフォルトの名無しさん:2005/05/16(月) 03:08:46
>>109

しかしその場合、仮想メモリがあったらエラーをかえさないのでは?
111デフォルトの名無しさん:2005/05/16(月) 03:14:21
仮想メモリも無限にあるわけではないのでな、
112デフォルトの名無しさん:2005/05/16(月) 04:08:19
物理メモリのって書いてあるわけだがな、
113デフォルトの名無しさん:2005/05/16(月) 04:09:22
以下のプログラムをコンパイルしようとすると7行目で「移植性のないポインタ変換」と言うエラーが出ます。
配列は変数と違い関数内で書き換えると呼び出し元の値も変わるとあるサイトで解説されていたのですが、
この書き方では何がダメなんでしょうか。
それと、何故配列と普通の変数でこんなにポインタまわりの仕様が違うんですか?
#include <stdio.h>
void test(char hairetu[],int *var)
{
printf("%d\n",*var);
printf("%d\n",var);
printf("%d\n",hairetu);
hairetu[1] = "z";
}
main()
{
char data[6] = "aiueo";
int data2 = 10;
printf("%c\n",data[1]);
test(data,&data2);
printf("%c\n",data[1]);
return 0;
}
114デフォルトの名無しさん:2005/05/16(月) 04:38:02
> hairetu[1] = "z";

hairetu[1] = 'z';
115デフォルトの名無しさん:2005/05/16(月) 04:39:00
> 移植性のないポインタ変換
わけのわからんメッセージだな。どこのコンパイラだ?

hairetu[1] = "z";

これがまずい。charにchar*を代入しようとしてる。
116デフォルトの名無しさん:2005/05/16(月) 04:43:39
>>114-115
コンパイル出来ました。
ありがとうございます。
"と'で意味違うんですね。
コンパイラはborland c++ compilerです。
117デフォルトの名無しさん:2005/05/16(月) 10:55:36
0が偽で0以外が真なのに、mainでは正常終了の場合にreturn 0;を実行するのは何故ですか?
main以外の自作関数などでは成功時return 1;で失敗時return 0;とするほうが便利ですけど
自作関数ではこういう使い方でいいんですよね?
118デフォルトの名無しさん:2005/05/16(月) 11:12:25
>>117
DOSの頃、プログラム終了値は「エラーレベル(ERRORLEVEL)」とも言われてました。
その頃の名残ですね。DOSでIF ERRORLEVEL 〜 を使用して
BATファイルを組んだ事がある人ならピンとくるんですけどね。
自作関数は勿論自由に組んでOK。
戻り値はポインタの場合、0(=NULL)を返す事がざらですし。
119デフォルトの名無しさん:2005/05/16(月) 11:12:51
>>117
return 時の値は場合によって選択する
main() で成功時に 0 を返すのは、その方が都合がいいシェルでもあるのだろう。
120デフォルトの名無しさん:2005/05/16(月) 11:15:33
成功か失敗としか返さないならboolean、失敗時に失敗の内容を返す場合は成功時0、失敗時は内容に応じた数値。ケースバイケース。

WindowsのAPIも成功時に0返すのが多い。
121117:2005/05/16(月) 11:19:54
レスありがとうございました。
122デフォルトの名無しさん:2005/05/16(月) 11:34:34
> WindowsのAPIも成功時に0返すのが多い。

そうか?
あまり無い気がするが
123デフォルトの名無しさん:2005/05/16(月) 11:46:23
OLE/COM関係とかでHRESULTを返す場合は成功時にNOERROR(==0)を返す場合があるな。
124デフォルトの名無しさん:2005/05/16(月) 11:55:49
char str[10] = {"a","b","c"};
cout << str << endl;
とするとabcと出ますが、これはstr[3]にNULLが入っているからその手前まで出力しているのですよね。
という事はcoutは出力文字数回の比較(その文字がNULLかどうか)をしていると言う事でしょうか。
つまり、
i=0;
while(str[i] != NULL){
str[i]を出力;
i++;
}else{ return }
という様に内部ではなっているのでしょうか?
しかしこれでは文字列が長いほど無駄が多くなります。
予め何バイトを出力すればいいのかが分かっている場合、
この様な比較処理無しに指定バイト数だけ出力したいのですが、何か方法はあるでしょうか?
125デフォルトの名無しさん:2005/05/16(月) 12:03:59
i=0;
while(str[i] != NULL){
str[i]を出力;
i++;
}else{ return }

to

for(i=0;i<Length;i++;){
str[i]を出力;
}else{ return }
126デフォルトの名無しさん:2005/05/16(月) 12:07:23
>>124
> char str[10] = {"a","b","c"};

そのような初期化はエラーになる。

> while(str[i] != NULL){
> 〜
> }else{

そのような構文は無い。
127124:2005/05/16(月) 12:09:00
>>125
その場合、i<lengthの比較を出力文字数回行っているのでは?
str[i]を出力; の部分も具体的にどう書けばいいのか自分には良く分かりません。
coutの内部を予想するのにcoutを使うわけにもいかなかったのでそう書きましたけど。
1文字だけならcoutを使っても無駄無く出来るのか、余計な処理が入ってしまうのか・・前者なら良いのだけど。
128デフォルトの名無しさん:2005/05/16(月) 12:09:21
>>124
つまらねぇことを気にするな。
一般的に出力処理はそれ自体がコストが掛かるから、枝葉末節はどうでもいい。
129124:2005/05/16(月) 12:13:37
あぁ!すみません。
>>124は今書いているプログラムをデフォルメしたものですが、投稿したプログラムはデバッグしてませんでした。
str[]は末尾にヌル文字の入った適当な文字列
while〜elseと書いたのはstr[i]がNULL文字でない間出力処理をして、NULL文字が来たら終了という意図です。
130デフォルトの名無しさん:2005/05/16(月) 14:29:17
string型で宣言と同時にサイズだけ指定することってできますか?
131デフォルトの名無しさん:2005/05/16(月) 14:33:00
>>130
string s(len, '\0');
意味あるかは知らないけど
132デフォルトの名無しさん:2005/05/16(月) 15:28:54
char a[] = "あいうえお";

if(a == "あいうえお") printf("%s" , a);
「もし右辺と同じ文字列が含まれているなら」という風に
したいのですが、教えてください。
133デフォルトの名無しさん:2005/05/16(月) 15:30:54
if(strcmp(a, "あいうえお") == 0)
134デフォルトの名無しさん:2005/05/16(月) 15:34:07
>>130
何をしたいのか具体的に。
>131じゃ余りに意味がない。
135デフォルトの名無しさん:2005/05/16(月) 15:35:24
>>133
>132をよく読め。
全体一致じゃなくて部分一致だぞ。

>>132
ということで、strstr()を使って味噌。
136デフォルトの名無しさん:2005/05/16(月) 15:38:03
これって問題なし?

int main()
{
  int test = 1;
  {
    int test;
    test = 100;
    printf("%d\n", test);
  }
  printf("%d\n", test);
  return 0;
}
137デフォルトの名無しさん:2005/05/16(月) 15:41:12
>133>135
ありがとうございます
今のところ全体一致でも結構ですた。
13860:2005/05/16(月) 15:41:18
>>136
何を心配してるの?
139デフォルトの名無しさん:2005/05/16(月) 15:41:57
>>136
問題なし
140デフォルトの名無しさん:2005/05/16(月) 15:42:39
>>136
何を持って問題とするかの定義がないので何とも言えないが、
言語規約的には問題なし。
但し、ロジック的には余り意味がないという点で、問題あり。
141デフォルトの名無しさん:2005/05/16(月) 15:48:49
動作結果も載せないと問題がなんなのかわからんな
142デフォルトの名無しさん:2005/05/16(月) 16:00:01
>>132
ワイド文字は wchar.h を利用した方が良い。

#include <wchar.h>
int main(int argc, char* argv[])
{
wchar_t a[] = L"あいうえお";
wchar_t b[] = L"かきくけこ";
wchar_t c[] = L"うえお";
if ( wcsstr( a, c ) != NULL ) {
printf( "Found\n" );
} else {
printf( "Not found\n" );
}
if ( wcsstr( b, c ) != NULL ) {
printf( "Found\n" );
} else {
printf( "Not found\n" );
}
return ( 0 );
}
143デフォルトの名無しさん:2005/05/16(月) 16:13:16
>>122
最たるものがWinProcだろ
144デフォルトの名無しさん:2005/05/16(月) 16:17:16
MFC関連なのかなと思いましたが、
あまりに初心者な質問なので一応ここで。

ウィンドウにテキストを表示させようと思っているんですが、
// テキスト表示
CClientDC DC(this);
TEXTMETRIC tm;
CSize size;
// テキストの色を黒に設定
DC.SetTextColor(RGB(0, 0, 0));
DC.GetTextMetrics(&tm);
wsprintf(mm_str, "th=%f, Ae=%f, Be=%f", th,ae,be);
DC.TextOut(10, 450, mm_str, strlen(mm_str));

とやった場合、
error C2673: 'Grab_Thread' : グローバル関数にアクセスするための 'this' ポインタがありません。
といわれました。
これってどうすればいいんでしょうか。

C#だとthisって定義しなくてもいけたんで戸惑っております。。
ちなみにコードは本を見て書きました。というか変数以外は写しました。
145デフォルトの名無しさん:2005/05/16(月) 16:26:38
staticメンバ関数やグローバル関数でthis使ってるんだろ。
つーか提示されたコードにGrab_Threadなんて見当たらないんだが。
146デフォルトの名無しさん:2005/05/16(月) 16:26:57
>>144
それをどの関数に書いたのかが重要
147デフォルトの名無しさん:2005/05/16(月) 16:29:20
>>144
質問とは関係無いが、
mm_str がマルチバイトなのかシングルバイトなのか・・・。
int swprintf( wchar_t *buffer, const wchar_t *format [, argument] ... );
size_t strlen( const char *string );
148デフォルトの名無しさん:2005/05/16(月) 16:31:56
>>147
よく見ろ。swprintfじゃなくてwsprintfだぞ。
149デフォルトの名無しさん:2005/05/16(月) 16:34:01
問題なさそうなとこだけ切り取って
どこがおかしいでしょうかって聞いてるのか
150147:2005/05/16(月) 16:34:47
おっと、こいつぁすまねぇ。
151デフォルトの名無しさん:2005/05/16(月) 16:48:38
>>143
そういうのは 「多い」 とは言わん。
152デフォルトの名無しさん:2005/05/16(月) 16:50:04
まぁ挙げればきりが無いな
153151:2005/05/16(月) 16:50:57
API とも言わんな
154144:2005/05/16(月) 16:52:40
すいません。いろいろ足りなかったようですね。
よくわからないもので。

UINT Grab_Thread(LPVOID WinObjPtr)
{
CApp *theapp=(CApp*)AfxGetApp();
HIFCGRAB grabID;
int ring_frames = 3;
DWORD frame_count;
BYTE *pHostBuffFrame;
int iSeqNum;
WORD sum;
int i,j;
DWORD t[2048], nbuf, dwWritten;
HANDLE hFile3;
char mm_str[255];
    while(g_ThreadFlg){
       さっきの中身
}
}
といった感じです。
155デフォルトの名無しさん:2005/05/16(月) 16:56:37
>>154
クラスのメンバ関数じゃないとthisは無いぞ
156デフォルトの名無しさん:2005/05/16(月) 16:56:50
その関数の宣言を見せろ。
157144:2005/05/16(月) 17:00:02
うぅ

#include <stdio.h>
#include <math.h>
#include <string.h>
〜中略〜

int g_ThreadFlg;

UINT Grab_Thread(LPVOID WinObjPtr);

//メインウィンドウ構築
CMainWin::CMainWin(LPCSTR ClassName)
{
と続きますが。。
158デフォルトの名無しさん:2005/05/16(月) 17:04:20
WinObjPtrがthisなんじゃないの?
キャストして使うのでは
159デフォルトの名無しさん:2005/05/16(月) 17:10:17
グローバル関数でthisが使えたとしたら、それは何を指してるんだろうな?
160デフォルトの名無しさん:2005/05/16(月) 17:15:24
>>158がいいこといった。
CClientDC DC(this);を
CClientDC DC(static_cast<CWnd *>(WinObjPtr));にしたらどうなる?
161デフォルトの名無しさん:2005/05/16(月) 17:17:59
>>159
C++に限定しないなら、プログラム全体のグローバル変数・関数をメンバに持つ実行コンテキストクラスのインスタンスだろうな。
162144:2005/05/16(月) 17:49:01
すいません。
なんかテキストクラスというのがあって、
そこをいじっていたらできました。
ほかにCClientDC DC(this)を宣言してるとこがあったみたいです。。

お手数おかけしました。
ありがとうございます。
163デフォルトの名無しさん:2005/05/16(月) 18:39:29
プログラム全体で共有したいグローバル変数はどうインプリメントしてますか?
構造体か何かで定義して、そのアドレス(ポインタ?)をextern宣言?
164デフォルトの名無しさん:2005/05/16(月) 18:47:48
グローバル変数なんてほとんど使わないので、使うとしたら素直に生。
165デフォルトの名無しさん:2005/05/16(月) 18:50:16
クラス化する。
166デフォルトの名無しさん:2005/05/16(月) 18:57:22
なんでわざわざ構造体で定義すんのかが謎
構造体定義するくらいならクラスにする
167デフォルトの名無しさん:2005/05/16(月) 19:43:32
>>166
お前わかってないな〜
class と struct はぜんぜん違うよ
168デフォルトの名無しさん:2005/05/16(月) 19:53:34
当然だろ?w
169デフォルトの名無しさん:2005/05/16(月) 19:54:06
>>167
デフォルトがパブリックかプライベートかだけの差でしょ?
170デフォルトの名無しさん:2005/05/16(月) 20:03:54
( д ) ゚ ゚
171デフォルトの名無しさん:2005/05/16(月) 20:04:14
>>167どう全然違うのか教えてくれ
172デフォルトの名無しさん:2005/05/16(月) 20:11:15
>>171
class と struct の言語仕様上の違いは、デフォルトが private か public だけだ。
しかし、struct のイメージは、「データ構造」であり、
class のイメージは「オブジェクト」なんだ。
これを分かっていないで何でもかんでも class にしたがるやつがいるが、
イメージは大事にせにゃあかんぞ。それで可読性も変わる。
173デフォルトの名無しさん:2005/05/16(月) 20:16:49
いいやん。自分でわかりにくいプログラムをわざと書いて、悦ぶ
被虐体質(マゾ)な香具師なんだろ。
174デフォルトの名無しさん:2005/05/16(月) 20:22:26
>>172
コンストラクタと operator= だけを持つ struct なんてぇモノを
タマに作るんですが、邪道でつか?
175デフォルトの名無しさん:2005/05/16(月) 20:22:30
じゃあclassもmemsetでゼロクリアできるの?
176デフォルトの名無しさん:2005/05/16(月) 21:24:11
>>175
中身がPODならできる。
177デフォルトの名無しさん:2005/05/16(月) 21:29:24
PODでなくとも仮想関数テーブル含んで泣けりゃ桶なんじゃない?
178デフォルトの名無しさん:2005/05/16(月) 21:42:39
>>177
浮動小数点数やポインタを含んでいると不具合が出る処理系もある。
179デフォルトの名無しさん:2005/05/16(月) 21:51:42
あまりにも初心者的な質問なのでこちらに。
延べ約44時間コードとにらめっこしてもワカリマセンorz
ご指南よろしくお願いします・・・
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/397.txt
180デフォルトの名無しさん:2005/05/16(月) 21:59:10
宣言の順番が逆なのはキノセイか?
181デフォルトの名無しさん:2005/05/16(月) 22:04:01
いろいろ問題はあるけどまずheadの中身がない
…って書くと馬鹿にしてるみたいだな
182デフォルトの名無しさん:2005/05/16(月) 22:18:43
>>180,181
headの宣言の場所がおかしいみたいですね・・・
他にも問題は山積みっぽいですがもうちょい頑張って考えてみます。
有難うございました。
183デフォルトの名無しさん:2005/05/16(月) 22:21:23
>>182
動的確保って意味わかる?
184デフォルトの名無しさん:2005/05/16(月) 22:21:27
>>167
で、グローバル変数がいくつか必要なときはあんたならclassにしないでstructにするということか?
#だとしたら呆れたもんだ。
185デフォルトの名無しさん:2005/05/16(月) 22:27:10
宣言の場所っていうかポインタしか作ってないから中身がないんだ
readnumの頭にhead = newdigit();でも突っ込んどけばとりあえず動きはする
あと p->value = c - '0';
それにgetcharした文字が数字かどうか判別しないと題意に沿わない希ガス

>1行に1個のデータを
っていうのも考慮されてないし確かに問題山積み
186デフォルトの名無しさん:2005/05/16(月) 22:28:42
struct list{
int value;
Digit *prev;
Digit *next;
};

typedef struct list Digit;

普通この順番だろ?
187デフォルトの名無しさん:2005/05/16(月) 22:30:22
でも、すべてのモジュールから参照したい変数っていうか
データってあるでしょ?
そんなのはどうすればいいにょ?
188デフォルトの名無しさん:2005/05/16(月) 22:30:30
189デフォルトの名無しさん:2005/05/16(月) 22:31:21
struct Digit{
int value;
Digit *prev;
Digit *next;
};
190デフォルトの名無しさん:2005/05/16(月) 22:32:22
>>187
グローバル変数にすれば?
191デフォルトの名無しさん:2005/05/16(月) 22:33:08
まあ、好みの問題だろ >>186
文法的に問題ない
192デフォルトの名無しさん:2005/05/16(月) 22:37:55
>>186でエラー吐くのは俺のコンパイラだけですか。
193191:2005/05/16(月) 22:39:15
あ、ごめん
186だと問題大有りw
194191:2005/05/16(月) 22:40:16
宣言内の Digit が struct list だと思ってた
195デフォルトの名無しさん:2005/05/16(月) 22:55:09
>>163
namespace Global で包む。
196デフォルトの名無しさん:2005/05/16(月) 23:00:31
ヌルポ
197デフォルトの名無しさん:2005/05/16(月) 23:35:08
>>196
ガッ
198デフォルトの名無しさん:2005/05/17(火) 00:29:54
Visual C++ Express Edition Beta 2 日本語版ってフリー?
199デフォルトの名無しさん:2005/05/17(火) 00:32:39
無料
200デフォルトの名無しさん:2005/05/17(火) 00:38:59
>>199
マジだすか?
( ゚д゚)ポカーン
201デフォルトの名無しさん:2005/05/17(火) 00:48:58
へー。とりあえずインスコしてみよ。
b が取れたら有料ものになるのかしらん。
202デフォルトの名無しさん:2005/05/17(火) 01:41:44
Windows(.net以前)でのクライアント、サーバー間の通信方式でよく使われるのは何でしょう?
独自プロトコル、DCOM、SOAP、その他?
203デフォルトの名無しさん:2005/05/17(火) 02:08:05
独自
204デフォルトの名無しさん:2005/05/17(火) 02:26:35
NetBIOS
NetBEUI
205デフォルトの名無しさん:2005/05/17(火) 04:01:51
ベンチマークプログラムの為にマイクロ秒を取得する関数が欲しいのですが
その様な関数があれば名前を教えてもらえませんか。
206デフォルトの名無しさん:2005/05/17(火) 05:57:41
>>205
環境書かないとわからんぞ。
Pentium以降のx86ならインラインアセンブラなりでRDTSC命令呼べばいいんじゃないか?
WindowsならQueryPerformanceCounter
207デフォルトの名無しさん:2005/05/17(火) 09:56:06
仮想関数を派生クラスで実装する時、
戻り値とか引数の型が一致してないといけませんか?
208デフォルトの名無しさん:2005/05/17(火) 09:57:54
はい。
209デフォルトの名無しさん:2005/05/17(火) 10:42:32
ありがとうございました。
210デフォルトの名無しさん:2005/05/17(火) 15:38:39
戻り値は違っててもいい
211208:2005/05/17(火) 17:11:18
え?本当に?
212デフォルトの名無しさん:2005/05/17(火) 18:17:30
少しだけね。
共変の戻り値でググれ。
213デフォルトの名無しさん:2005/05/17(火) 18:18:16
>>210
class A
{
public:
virtual int Test(int i) { cout << "A::Test(" << i << ")" << endl; return i; }
};

class B: public A
{
public:
long Test(int i) { cout << "B::Test(" << i << ")" << endl; return i; }
};

コンパイル通らなかったよ。
214デフォルトの名無しさん:2005/05/17(火) 18:38:53
class Base
{
public:
    Base* Clone();
};

class Derived : public Base
{
public:
    Derived* Clone();
};
215デフォルトの名無しさん:2005/05/17(火) 18:57:52
>>214
コンパイル通らなかったよ。





VC6 で。
216デフォルトの名無しさん:2005/05/17(火) 19:21:30
おいおい、戻り値が違ってもいい仮想関数なんて聞いたことねぇぞ
217デフォルトの名無しさん:2005/05/17(火) 19:22:45
戻り値がBase*でDerived*を返せるっていう当たり前の
話だったりして
218デフォルトの名無しさん:2005/05/17(火) 19:22:56
>>216
勉強不足
219デフォルトの名無しさん:2005/05/17(火) 19:47:05
>>217
Derived型だと分かっているときにClone()を呼ぶと戻り値がDerived型なのでアップキャストしなくていいというのが肝。
220デフォルトの名無しさん:2005/05/17(火) 20:04:29
なるほど
221デフォルトの名無しさん:2005/05/17(火) 22:18:56
教えてください。
javaで言うabstruct、interface は、C++だとどういう記述になるのでしょうか?
作成方法と継承方法をお願いします。
また、c++にあるvirtualという予約語は、オーバーライドさせるためにあるのでしょうか?
でもこの記述がなくてもできますよね?

以上!
222デフォルトの名無しさん:2005/05/17(火) 22:30:53
>>221
C++の入門書でも買って読め。
以上
223デフォルトの名無しさん:2005/05/17(火) 22:36:30
>>221
バカはJavaでもやってろ
以上!
224デフォルトの名無しさん:2005/05/17(火) 22:51:44
>>221
共に通常のclassとして宣言し、interfaceのメソッドとabstractメソッドをC++ではvirtualメンバ関数にすればよい。
virtualでないメンバ関数は、派生クラスのオブジェクトを基底クラスのポインタ・参照から使うと、基底クラスのメンバ関数が呼ばれる。
#include <iostream>
using namespace std;
class A {
public:
  f() {cout << "A::f()" << endl;}
  virtual g() {cout << "A::g()" << endl;}
};
class B : public A{
public:
  f() {cout << "B::f()" << endl;}
  virtual g() {cout << "A::g()" << endl;}
};
int main() {
  A *p = new B;
  p->f(); //A::fが呼ばれる。
  p->g(); //B::fが呼ばれる。
  delete p;
}
225デフォルトの名無しさん:2005/05/17(火) 23:38:40
>>222-223
ひでぇ(⊃д⊂)
>>224
ありがとうございます。無事できました。
226デフォルトの名無しさん:2005/05/17(火) 23:51:16
コンストラクタの違いについて教えてください。

class CTest {
public:
int _1;
int _2;
    CTest(void) :i_1(3){}
    CTest(const int n) :i_1(n){}
    CTest(const int n, const int d) :i_1(n){ this->_2 = d;}
    void test() { std::cout << _1 << _2 << std::endl; }
};

というクラスがあります。
引数一つだけのコンストラクタの書き方と
引数二つのコンストラクタの書き方は、動きが違うと聞きました。

理由を教えてください。可能なら詳細に
227デフォルトの名無しさん:2005/05/18(水) 00:15:28
最近VBからCを勉強し始めたんだけど
関数に複数の戻り値をもたせることって可能ですか?
VBはできなったんだけどCではできるのかな???
228デフォルトの名無しさん:2005/05/18(水) 00:16:51
>>226
explicit指定のない一引数のコンストラクタは暗黙の型変換を導入する。その例だと、
CTest x = 3; /* CTest x(3);と同じ。 */
の様に使える。
229デフォルトの名無しさん:2005/05/18(水) 00:16:58
下のようなコードを書こうとして詰まりました。cin >> で改行を
読み込んだかどうかを調べたいのですが、どうすればいいのでしょう。

やりたいことは改行までに現れる不定個の整数を読み込んで処理することなんですが……。

while (1) {
 while (1) {
  cin >> c;
  // もし改行なら break;
  ...
 }
}

230デフォルトの名無しさん:2005/05/18(水) 00:18:00
>>227
直接はできない。普通は代わりにポインタを渡したり構造体を返したりする。
231デフォルトの名無しさん:2005/05/18(水) 00:19:03
>>229
cはcharか?もしそうならc = cin.get()とすると、空白を読み飛ばさない
232227:2005/05/18(水) 00:47:53
>>230
THX!やっぱりできないのか〜
構造体を返すってのはわかるけどポインタを渡す???
ポインタを戻り値にしても一つしかあらわせないんじゃないのかな?
233デフォルトの名無しさん:2005/05/18(水) 00:49:51
>複数の戻り値
配列
234デフォルトの名無しさん:2005/05/18(水) 00:52:16
間接的にincludeするとリンクエラーが出るようになってしまったんですが、こういっった情况でやってそうなポカってないでしょうか。

---foo.h----
#include "bar.h"

----main.cc-----
#include "foo.h"//n.g
#include "bar.h"//o.k

int main(){
Bar baka;
baka.getBaka();//link error
}

こんな感じなんですが。。
235デフォルトの名無しさん:2005/05/18(水) 00:54:59
>>234
「エラーが出る」と相談するときにはエラーメッセージをコピペしよう。
236デフォルトの名無しさん:2005/05/18(水) 00:59:21
>>232
横レスになるけど、230の書いたのは
ポインタを戻り値にするんじゃなくて引数として渡すってこと。
VBでいうByRefみたいなもの。

C++では参照渡しという方法もある
237227:2005/05/18(水) 01:11:56
>>236
ありがとう〜
なるほどよくわかったよ、参照渡しのことか!!!
複数の戻り値を次の行でまた違う関数の引数にしようとおもってたから
構造体はちょっとめんどくさそうだったんだよね、ByRef(゚Д゚ )ウマー
238デフォルトの名無しさん:2005/05/18(水) 01:13:49
>ポインタを戻り値
配列
239デフォルトの名無しさん:2005/05/18(水) 01:21:46
>>235
morio.o(.text+0x45): In function `main':
: undefined reference to `bkl::Random::Random()'
えーっと、こんな感じの参照先が見つからないってエラーがいっぱい出ます。
無いと言われる物のオブジェクトファイルはちゃんと引数に渡しているんですが。。
240デフォルトの名無しさん:2005/05/18(水) 01:40:58
>>235
gccだな。
ほんとうに #include の書き方だけで何か変わるんなら、
gcc -E main.cc をそれぞれの状態で実行して、出力を比べてみるといい。
241デフォルトの名無しさん:2005/05/18(水) 01:41:15
>間接的にincludeすると
他のヘッダファイルのinclude順番じゃねの?
242240:2005/05/18(水) 01:41:39
ごめん。アンカーミスった。 ×235 ○>>239
243デフォルトの名無しさん:2005/05/18(水) 01:57:51
>>234
インクルードガードしてないうっかりミスとか?
244デフォルトの名無しさん:2005/05/18(水) 01:59:30
原因が分りました。namespaceを消したらエラーが無くなりましたです。。
複数のクラスを1つのnamespaceにするために
---foo.h----
namespace bkl {

#include "bar.h"
#include "hoge.h"
...
}
こんな感じでやってたんですが、これってまずかったんでしょうか。。
245デフォルトの名無しさん:2005/05/18(水) 02:05:28
>>244
まずい。
ヘッダは全部グローバルで #include されているものと考えるべき。
bar.h の中で namespace bkl { ... }
hoge.h の中でも namespace bkl { ... }
246デフォルトの名無しさん:2005/05/18(水) 02:12:17
>>245
そうだったんですか、、これから全部書き直して来ます。ありがとうございました。
247デフォルトの名無しさん:2005/05/18(水) 03:21:58
メモリ上にロードしたデータ配列をファイルとして扱う(?)方法ってありますでしょうか?

ファイルを固めたアーカイブから、1ファイルだけをメモリにロードして、そのデータを
ファイルとして扱いたいのですが。
248デフォルトの名無しさん:2005/05/18(水) 06:40:05
Char型のポインタってどうやって文字の長さを判別してますか。
なぜポインタを渡すだけで必要な文字長でちゃんと代入されますか。
249デフォルトの名無しさん:2005/05/18(水) 07:39:18
NULL終端文字列
null-terminated
250デフォルトの名無しさん:2005/05/18(水) 09:15:56
>>249
ポインタのNULLと混同するから、その呼び方はやめてほしいなぁ。
251デフォルトの名無しさん:2005/05/18(水) 09:46:27
( ゚д゚) …
252デフォルトの名無しさん:2005/05/18(水) 10:07:45
>>248
Char型なんてない。

>>250
ではなんと呼べと。
253デフォルトの名無しさん:2005/05/18(水) 10:14:26
/*
計算出力/*2005/5/18*/
/*
#include <studio.h>;

char* main(WORD)
{
int i
i = scanf(%d+10);
print("\%d=%d\ti=%d", %d, i);
print("%d+10=i");

extern (char*)i;
]
254デフォルトの名無しさん:2005/05/18(水) 10:21:56
>>253
何このゴミ。
255デフォルトの名無しさん:2005/05/18(水) 10:23:14
間違い探しじゃない
256デフォルトの名無しさん:2005/05/18(水) 10:28:41
いや、正しいと思われる行の方が少ないから。
257デフォルトの名無しさん:2005/05/18(水) 11:10:08
>>250
NULL文字
NULLポインタ
こう言えば混同も何も無いだろ
オマエが混同しやすい言い方してるだけ
258250:2005/05/18(水) 11:31:09
せめて null とか NUL とかにして、ヌルポインターマクロの NULL と違うというのがわかればいいんだ。
全部大文字の NULL で「NULL文字」なんて言ってるのは、混同している日本人だけじゃないか?
memset(&a,NULL,sizeof(a)) なんてコード、もう見たくないんだよ。
259デフォルトの名無しさん:2005/05/18(水) 11:51:39
ナル文字。
ヌルポインタ。
260デフォルトの名無しさん:2005/05/18(水) 11:59:57
ぬるぽ!!
261デフォルトの名無しさん:2005/05/18(水) 12:15:17
>>260
Javaスレにお帰りください
262デフォルトの名無しさん:2005/05/18(水) 12:18:56
NIL
263デフォルトの名無しさん:2005/05/18(水) 12:24:04
http://www.pdflib.com/products/pdflib/download-source.html
ここにあるWindows用のソースコードをコンパイル方法を教えてください。
環境はWinXPHomeとC++Builder6Proです。
264249:2005/05/18(水) 12:28:59
>>250,>>258 & >>251,252,257
深く考えずに大文字でNULLと書いてしまったが
言われてみればごもっとも・・・orz
(言い訳させてもらえば、カタカナで書くのを一瞬躊躇したためで、
英語を併記したのもそのためです)
265デフォルトの名無しさん:2005/05/18(水) 12:38:03
>>258
>混同している日本人だけじゃないか?
混同しているMSも含めといて下さい。
266デフォルトの名無しさん:2005/05/18(水) 12:39:52
(´-`).。oO(なんで日本人だけだと思うのだろう)
267デフォルトの名無しさん:2005/05/18(水) 12:40:05
文字列終端ならふつーは'\0'
268デフォルトの名無しさん:2005/05/18(水) 12:42:32
>>263
doc/pdflib/readme-source-windows.txt
読んでガンガレ
ってこれしかないが・・


Building PDFlib with other Windows compilers
--------------------------------------------

In order to build PDFlib with other compilers, observe the above
notes and make sure to define the preprocessor symbol WIN32.

それ以上は専用スレいったほうがよさげ
269デフォルトの名無しさん:2005/05/18(水) 13:25:30
>>267
だからそれをヌル文字と呼ぶんだっつの
270デフォルトの名無しさん:2005/05/18(水) 15:00:12
質問させてください、
とあるクラスをヘッダファイル(hoge.h)の中だけで全部インラインで書いてたのですが、
微妙なのでCPPファイル(hoge.cpp)を作ってそちらに実装を書き写したところ、
メンバにSTLのmapを使っているところでエラーが出まくりました。
環境はVisualC++6.0SP5です。
↓こんなかんじです
private:
  map<unsigned short, FUGAGA>  // 構造体FUGAGAを値、unsigned shortをキーとするmap

(略)hoge.h(333) : error C2143: 構文エラー : ';' が '<' の前に必要です。
(略)hoge.h(333) : error C2501: 'map' : 識別名を宣言するのに、型が指定されていません。
(略)hoge.h(333) : error C2059: 構文エラー : '<'
(略)hoge.h(333) : error C2238: ';' の前に不正なトークンがあります。
以下略...

ヘッダファイルだけでインラインで全部書いていたときは出なかったエラーなので
元に戻したら直ったのですが、
hoge.cppでたった一行
#include "hoge.h"
と書いただけで上記のエラーがずらーっと・・・・
(実装内容は全部ヘッダに戻したので実質hoge.cppには上記の一行しか書いてない状態)

mapのヘッダファイルはインクルードしてるし、#include "hoge.h"をコメントアウトしたら
ビルドに成功するので文法上の間違いとかではなさそうなのですが
原因が全く思いつきません・・・・
どなたか教えてください、よろしくお願いしますm(_ _)m
271デフォルトの名無しさん:2005/05/18(水) 16:11:40
>>270
リビルドして味噌。
さもなくばhoge.hをぎりぎりまで削ってみるとか。
272270:2005/05/18(水) 16:23:05
リビルドしてもだめでした・・・orz
削る=行数を減らすということでしょうか?

あと訂正です、
private:
  map<unsigned short, FUGAGA> mapFugaga;  // 構造体FUGAGAを値、unsigned shortをキーとするmap
でした、すみません
273デフォルトの名無しさん:2005/05/18(水) 16:26:09
実は見ているhoge.hとインクルードしているhoge.hが違うとか。
274デフォルトの名無しさん:2005/05/18(水) 16:27:42
std::map
とか。いやまさか。
275デフォルトの名無しさん:2005/05/18(水) 16:32:04
(CMainWin *ptr =〜)

if(ptr->g_Flg){
・・・
}
って、g_Flgがtrueならば(ブーリアンです)if内に入るってことでいいんですよね?
いままで順調に動いていたんですが、if内で使用するクラスを作ったら、
入らなくなってしまったのですが。。
何か原因とかありますか?
ifのとこでブレークさせても、ちゃんと 1が返ってきてます。

ちなみに新クラスは、
void CMainWin::Recter_ctrl(int sX, int sY, int eX, int eY)
{
CPaintDC DCP(this);
DCP.BitBlt(0,0,maxX,maxY,&m_memDC,0,0,SRCCOPY);

CBrush HollowBrush;
HollowBrush.CreateStockObject(HOLLOW_BRUSH);
m_memDC.SelectObject(&m_RedBrush);
m_memDC.Rectangle(sX,sY,eX,eY);
m_memDC.SelectObject(&HollowBrush);

if(eY > 700) ResetWin();
InvalidateRect(NULL);

}
で関係ないと思うのですが。。
276デフォルトの名無しさん:2005/05/18(水) 16:35:03
>>274
そ・・・・・それでした|||||||||orz
アホなミスでお手数かけてスミマセン つД`)

いつもテキトーにusing namespaceで済ませてたから気付きませんでした・・・
どうもありがとうございましたm(_ _)m
277デフォルトの名無しさん:2005/05/18(水) 18:08:39
質問です

いま仮想ウィンドウでビットマップ作ってCDCで長方形を表示させているのですが、
引数が左上の座標と右下の座標しかないのですが、
この長方形を斜めに傾かせることってできますか?
278デフォルトの名無しさん:2005/05/18(水) 18:10:15
斜めの長方形を描画する関数はなかったと思う。
ポリゴン描画(あったかなかったか覚えてねぇ)か線分描画で描くべし。
279デフォルトの名無しさん:2005/05/18(水) 18:14:32
文字列についての質問です。

char* str;

void setstring()
{
 str = "hello world";
}

void main()
{
 setstring();
 printf("%s \n", str);
}

setstring()関数中で文字列ポインタをsetに入れた場合に
その関数からリターンしたあとで、そのポインタが使ってもいいですか?
280デフォルトの名無しさん:2005/05/18(水) 18:20:11
>>279
その"hello world"の寿命はプログラムの生存期間に等しい。故に問題ない。
#が、何故グローバル変数にする?
281デフォルトの名無しさん:2005/05/18(水) 18:20:17
sscanfに変わる
数字読み込みに便利な関数など、ありませんか?
ANSI-Cでなくても構わないです。
282デフォルトの名無しさん:2005/05/18(水) 18:21:31
>>279
setstring()中に記述されている"文字列"は
ローカルにあるわけじゃないので使ってもいい
283デフォルトの名無しさん:2005/05/18(水) 18:22:09
>>281
CかC++かで答えが変わるがどっちだ?
284デフォルトの名無しさん:2005/05/18(水) 18:23:03
>>283
両方
285デフォルトの名無しさん:2005/05/18(水) 18:29:12
>>280
ありがとうございました。
質問ではchar* strなのですが、実際はもっとややこしい形をしています;;

>>282
ローカルではなく、プログラム内にあると考えればいいんですね。。。
ありがとうございました。
286281:2005/05/18(水) 18:34:05
.cppでお願いします。
287277:2005/05/18(水) 18:39:52
>>278
やはりないですか。
どうもです。
288デフォルトの名無しさん:2005/05/18(水) 19:04:18
>>286
>>入力演算子
289281:2005/05/18(水) 19:11:45
自分で探してみます。ありがとうございました。
290デフォルトの名無しさん:2005/05/18(水) 19:40:18
質問です。char型変数がもし数値だったら
キャストしてint型変数に渡すという方法を教えてください。
291デフォルトの名無しさん:2005/05/18(水) 19:42:00
>>290
数値って数字のコード'0'〜'9'って事か?isdigit()。
292デフォルトの名無しさん:2005/05/18(水) 19:51:38
>>290
c-'0'とか文字列ならatoiとか。
293デフォルトの名無しさん:2005/05/18(水) 20:23:08
>291
そです。10進法です。でもchar型だから無理です。

>292
atoiする前にchar変数の中身が整数か確認したいのです。
if(〜みたいな感じで
c-'0'ってのはよく分かりません
294デフォルトの名無しさん:2005/05/18(水) 20:27:36
>>293
if (isdigit(c))
 i = c - '0';
else
 puts("not a number!");
295293:2005/05/18(水) 20:56:41
>294
ありがとうございます。
でもisdigitはchar型の引数は無理みたいです。
296デフォルトの名無しさん:2005/05/18(水) 21:04:59
>>295
isdigitのプロトタイプは
int isdigit(int);
で、引数にchar型を取ったら、自動的にint型へのプロモート(格上げ)が
行われるからモーマンタイのはず。
もしかして #include <ctype.h> をしてないだけのオチ?
297293:2005/05/18(水) 21:16:46
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
int main()
{
char c[] = "1";
int i;
if (isdigit(c))
 i = c - '0';
else
 puts("not a number!");
return 0;
}
こんな感じですが。
298293:2005/05/18(水) 21:31:56
スマソ。やっぱもういいです。。。
299デフォルトの名無しさん:2005/05/18(水) 21:40:32
>>297>>298
まあそう言うな。char型の配列とは初耳だぞ。
その文脈では、atoi()を使うのが適切だ。
で、atoi()を適用する前に、すべての配列の要素に対してisdigit()
を適用し、全部OKだったら初めてatoi()を使えばいい。

というか、情報を小出しにするな。分かる物も分からなくなるだろが。
300デフォルトの名無しさん:2005/05/18(水) 21:56:40
>>293は文字と文字列が混同されてる希ガス
301デフォルトの名無しさん:2005/05/18(水) 22:03:59
こうなったら意地でもプログラム例を書いてやる。
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

int isint(const char *str)
{
 while (isdigit(*str++)) {
  if (*str == '\0')
   return 1;
 }
 return 0;
}

int main()
{
 char c[][5] = {"123X", "1234", "A123"};
 int i;
 int N = sizeof(c) / sizeof(c[0]);

 for (i = 0; i < N; i++)
  if (isint(c[i]))
   printf("%d\n", atoi(c[i]));
  else
  printf("%s isn't a number.\n", c[i]);

 return 0;
}
302293:2005/05/18(水) 22:16:03
わざわざありがとうございます。
逃げるようで申し訳ないのですが
頭冷やして出直してきます(´・ω・`)
303デフォルトの名無しさん:2005/05/18(水) 22:46:50
(´・ω・`)
304デフォルトの名無しさん:2005/05/18(水) 23:20:11
(`・ω・´)
305デフォルトの名無しさん:2005/05/18(水) 23:40:32
(・ω・)
306デフォルトの名無しさん:2005/05/18(水) 23:44:56
(ω)
307デフォルトの名無しさん:2005/05/18(水) 23:46:29
ω
308デフォルトの名無しさん:2005/05/18(水) 23:57:31
?( ´・ω・)っω
309デフォルトの名無しさん:2005/05/19(木) 00:01:11
│     _、_
│  ヽ( ,_ノ`)ノ 残念 それは私のおいなりさんだ
│ へノ   /
└→ ω ノ
      >  
310デフォルトの名無しさん:2005/05/19(木) 00:08:59
ふつうにsscanf()使えばいいじゃん。
あとはstrtol()とかさ。

if (sscanf(s, "%d", &n) == 1) {
  /* OK */
} else {
  /* NG */
}
311デフォルトの名無しさん:2005/05/19(木) 00:13:59
>>310
それでは"123X"みたいな文字列もOKになってしまう。
質問者がどこまで要求しているのかわからないが。
312258(=250):2005/05/19(木) 01:09:25
>>265
MSDNを眺めてみたけど、英語サイトで "null terminated" と書いてあるものを
日本語訳によって「NULLで終わる」とされているようだった。
こいつらの影響も大きいな。

>>266
"NULL character" と "NULL文字" でぐぐってみて、そう思った。
313デフォルトの名無しさん:2005/05/19(木) 03:30:41
>>310
sscanf()を使うなら%nで変換終了点をチェック。
まぁ、それくらいならstrtol()で同じ事をすればよろしい。
314デフォルトの名無しさん:2005/05/19(木) 08:36:47
WindowsのRECT構造体型の変数に対し、
rect*nのように書く事で中身をn倍できるようにしたいのですが、
演算子のオーバーロードとかいうのを使えばできるのかと思ったんですけど
書き方が分かりません。どうやって書けばよいのでしょうか。
315デフォルトの名無しさん:2005/05/19(木) 08:51:14
戻り値型 operator*(左辺値型, 右辺値型) {}
316デフォルトの名無しさん:2005/05/19(木) 08:52:51
>>314
矩形をn倍って、倍率だけじゃなくて拡大の中心が必要じゃないか?
317デフォルトの名無しさん:2005/05/19(木) 09:30:07
>>315>>316
できました。今回やりたい事はこれだけで用が足ります。
ありがとうございました。
318デフォルトの名無しさん:2005/05/19(木) 11:06:42
MFCダイアログベースです。
ボタンなどのコントロールを
メンバ変数で持つのと、GetDlgItem()するのと
どういった違いがあるのでしょうか。
お願いします。
VC++6.0 WinXP
319デフォルトの名無しさん:2005/05/19(木) 11:21:35
>>318
例えばエディットボックスは前者ならCEditのようにコントロール変数で持つこともCStringやintのように値として持つこともできる。
後者ではCEdit * p = static_cast<CEdit *>(GetDlgItem(...))すればコントロール変数にはなる。
方針を決めて、適材適所でいいと思う。
#値として扱いたいなら前者
#そのダイアログクラス内で何箇所から操作/参照する必要があるなら前者
#そうでないなら後者
320318:2005/05/19(木) 13:31:30
>>319
なるほど。
値として扱えるのですね。
いつも値が欲しい時は
GetWindowText()などとしていました。
いくつかの場所でボタンに対し操作を行うので
メンバ変数で持つことにします。
ありがとうございました。
321デフォルトの名無しさん:2005/05/19(木) 14:29:26
値を使うときは UpdateData(FALSE) をワスレズニ
322デフォルトの名無しさん:2005/05/19(木) 15:25:51
配列の大きさは定数じゃないといけないのですか?
323デフォルトの名無しさん:2005/05/19(木) 15:34:55
コントロール→変数がTRUEで
変数→コントロールがFALSEだった・・
324デフォルトの名無しさん:2005/05/19(木) 15:44:39
>>322

struct x{
int i;
char c[];
}

この手のソースは見るがどのコンパイラでもOKかは不明。
普通はポインタじゃないか。
325デフォルトの名無しさん:2005/05/19(木) 15:48:41
C99は可変だよん。
326デフォルトの名無しさん:2005/05/19(木) 16:09:10
>>325
C99では実行時に動的に確保されると言うことですか?
327デフォルトの名無しさん:2005/05/19(木) 16:11:24
スタック上の変数はそもそもみな動的確保だろ。
328デフォルトの名無しさん:2005/05/19(木) 16:21:54
>>326
C99では可変長配列が扱えると言うことです。
329デフォルトの名無しさん:2005/05/19(木) 17:08:14
そうするとvectorはもういらないのか?
330デフォルトの名無しさん:2005/05/19(木) 17:22:04
配列を宣言するとき要素数を動的に決定できるけど
その後は変更できないんじゃないの?
331デフォルトの名無しさん:2005/05/19(木) 18:15:59
そのとおり
332デフォルトの名無しさん:2005/05/19(木) 18:35:44
_allocaみたいなもんか
333デフォルトの名無しさん:2005/05/19(木) 18:35:51
returnを実行すると呼び出しもとのプログラムに戻りますが、
呼び出しもとのプログラムのさらに呼び出し元のプログラムに戻らせる方法はありますか?
334デフォルトの名無しさん:2005/05/19(木) 18:38:52
例外を投げればキャッチされるまでどこまでも戻れます。
335デフォルトの名無しさん:2005/05/19(木) 18:47:45
嫌な教え方するなよ
336デフォルトの名無しさん:2005/05/19(木) 19:14:11
setjmp longjmp を知りたいのだろうか・・・
337デフォルトの名無しさん:2005/05/19(木) 19:23:54
>>333
インラインアセンブラを使えば戻れます。
但し、スタックの巻き戻しは省略します(w
338デフォルトの名無しさん:2005/05/19(木) 20:15:40
>>333
戻り先に戻るかどうかを決める情報を返せばいいだろ。
339デフォルトの名無しさん:2005/05/19(木) 21:37:21
文字列の2次元配列を動的に確保し、配列に代入します。
配列をプリントfする方法を教えてください。
VC++でお願いします。
d:\car.dat n個*m列は任意
豊田、ホンダ、日産
ノア、DQNワゴン、セレナ
あるファード、エリシオン、LLグランド
340デフォルトの名無しさん:2005/05/19(木) 21:47:13
宿題なら宿題スレでやれよ
あとスレタイな
341339:2005/05/19(木) 21:47:14
解決しました。
342デフォルトの名無しさん:2005/05/19(木) 22:02:47
339
麻奈とか望洋とかの本には、書いてないのです。
1次元の文字配列をそのまま出力とか。
int*[]とか、VBだと誰でもやっているのに
MFCに組み込みたいのです。
343デフォルトの名無しさん:2005/05/19(木) 22:15:58
コンパイルまではうまくいくんですが実行しようとすると
Segmentation fault(core dumped)と表示されて失敗します。
原因は何でしょうか?
344デフォルトの名無しさん:2005/05/19(木) 22:22:16
char *argv[]
345デフォルトの名無しさん:2005/05/19(木) 22:31:08
VC++ .NET のWin32コンソールアプリケーションにて
実行ファイルのパスを取得したいのですがどうしたらよいのでしょうか?
VBではapp.pathを参照すれば簡単に取得できるのですが・・
346デフォルトの名無しさん:2005/05/19(木) 22:31:58
>>343
gdb使うか、printf埋め込んでどの行でおきたか調べる
たいていは初期化してないポインタでアクセスしたとか
NULLポインタとかその辺
347デフォルトの名無しさん:2005/05/19(木) 22:34:08
>>345
argv[0]とかGetModuleFilename()とか
348デフォルトの名無しさん:2005/05/19(木) 22:38:34
inlineってどういう時に使うの?良く分からん。
349デフォルトの名無しさん:2005/05/19(木) 22:50:03
>>348
関数呼び出しのオーバーヘッドが無視できないほど大きいとき。
350343:2005/05/19(木) 22:53:12
解決しました、ありがとうございました。
351348:2005/05/19(木) 23:04:29
>>349
馬鹿ですいませんが、関数の呼び出しのオーバーヘッドが気になる場合って
わからなかったりw
Win上でヌルくPGやっている分には気にしないでいいですか?
352デフォルトの名無しさん:2005/05/19(木) 23:08:22
気にしないでいいよ。
ループの真ん中が関数の場合とインラインの場合ではループする回数が大きいほど差が出るのはわかるべ
353345:2005/05/19(木) 23:12:50
ありがとうございます。
GetModuleFilename()で試してみたいと思います。
354348:2005/05/19(木) 23:13:28
>>352
thanx
ついでにループの説明で、ちょっとは理解できますた。
355デフォルトの名無しさん:2005/05/20(金) 00:09:42
以下のプログラムはコンパイルはできるんですがなぜか実行できません。
何ででしょうか?

#include <stdio.h>
#include <stdlib.h>
typedef struct node *link;
struct node {int item; link next;};

int main(int argc,char *argv[]) {
struct node heada,headb;
int i,N=atoi(argv[1]);
link t,u,x,a = &heada,b;
srand(1);
for(i=0,t=a;i<N;i++){
t->next = malloc(sizeof *t);
t = t->next; t->next = NULL;
t->item = rand() % 1000;
}
b = &headb; b->next = NULL;
for(t=a->next; t!=NULL;t=u){
u=t->next;
for(x=b;x->next!=NULL;x=x->next)
if(x->next->item > t->item) break;
t->next = x->next;
x->next = t;
}
}
356デフォルトの名無しさん:2005/05/20(金) 00:24:01
>>355
何がやりたいの?
そのコードだと出力が全然無いから動いたかどうか確認できないと思うけど。
357デフォルトの名無しさん:2005/05/20(金) 00:36:22
デバッガで確認したとか
358デフォルトの名無しさん:2005/05/20(金) 00:37:54
343にもあるみたいですがSegmentation fault(core dumped)という表示が
出るのでそれが出ないようにしたいんです。
359デフォルトの名無しさん:2005/05/20(金) 00:54:51
int i,N=atoi(argv[1]);
360デフォルトの名無しさん:2005/05/20(金) 00:57:46
>>358
もう、お茶目さんね!最適化をOFFにして、一行ずつデバッガで実行してみれば
わかるじゃないの。
361デフォルトの名無しさん:2005/05/20(金) 09:02:59
STLのvectorのeraseメソッドは、削除後、配列(じゃないけど)を
前に詰めてくれますか?
詰めない場合、swapメソッドでソートするのが正攻法?
362デフォルトの名無しさん:2005/05/20(金) 09:04:43
標準入力のデータの値のコピーでなく先頭アドレスを取得したいのですが、何か方法はありますか?
363361:2005/05/20(金) 09:36:58
怪傑しました
364デフォルトの名無しさん:2005/05/20(金) 10:12:58
>>362
意味ワカンネ
365デフォルトの名無しさん:2005/05/20(金) 11:32:34
自分が何を言ってるのかわかってるのかな、>>362氏は
366362:2005/05/20(金) 11:53:42
何か勘違いをしているかもしれません。
初心者なので分かっているのかどうかも分かりません。
やりたい事はCGIのPOSTメソッドで送られてきた入力を受け取る事なのですが、
cinやreadで標準入力を受け取ると値のコピーになりますよね?
入力データに対して行う操作が参照だけなので、
ポインタを使おうと思ったのです。
367デフォルトの名無しさん:2005/05/20(金) 12:09:42
struct Map{
  int x;
  int y;
};

int main(void)
{
  char Buf[100];

  
  
  
  
  
368デフォルトの名無しさん:2005/05/20(金) 12:16:26
間違えて途中で書き込んでしまいました・・・。

struct Map{
  int x;
  int y;
};

int main(void)
{
  //1バイト列のデータ確保して
  char Buf[100]; 

  //Map型のポインタでアドレス計算してバイト列にアクセス
  Map* pMap = (Map*)Buf; 
  for(int i=0; i<... ;i++)
  {  
    pMap[i].x = 5;
    pMap[i].y = 10;
  }
  return 0;


とやってもよろしいものでしょうか?
もちろん確保した領域を超えてアクセスしないように考慮しますが。
Win⇔Linuxの通信に使います。
369デフォルトの名無しさん:2005/05/20(金) 12:19:20
>>366
標準入力はシステムコール、API 等から直接返されるもので、どこか特定のメモリに
格納されるものではない。
従ってポインタでアクセスしようというアプローチは間違い。

ファイルへのアクセスと同じ。
370デフォルトの名無しさん:2005/05/20(金) 12:19:52
>>368
アラインメントが正しく保たれているなら、問題ない。
371デフォルトの名無しさん:2005/05/20(金) 12:20:43
>>368
無問題だが、union を使わない理由は何だ?
372デフォルトの名無しさん:2005/05/20(金) 12:21:09
>>368
intのサイズやエンディアンやアライメントなど、不安要素はいくつかある。
それらの要素に対して、現在および将来に渡って確証が持てない限り、
よろしくないと思われる。
373368:2005/05/20(金) 12:47:43
確かにこれでうまく動いているんでがちょっと心配だったもので。
実際にはintじゃなくてfloatだったりしますが、
もうすぐ64ビットとかいってるのにintで例に出したのは悪かったかもしれません。
unionの使い方はよくわかりませぬ。ちょっと調べてみます。
暇な人いればご教授いただければ幸いです。
374デフォルトの名無しさん:2005/05/20(金) 12:49:44
>>373 floatなら、さらに悪い。
375デフォルトの名無しさん:2005/05/20(金) 12:54:37
うーむ、やっぱりfloatの内部データの持ち方も危険ですか・・・。
376362:2005/05/20(金) 13:04:23
>>369
レスありがとうございました。
377デフォルトの名無しさん:2005/05/20(金) 14:44:19
intのバイト数は環境に依存するらしいですが、
具体的にはどう決まるんでしょうか?
32ビット機なら4バイト、とかですか?
378デフォルトの名無しさん:2005/05/20(金) 14:45:19
>>377
コンパイラを書いたやつの勝手。
379デフォルトの名無しさん:2005/05/20(金) 15:43:15
>>355
t->next = malloc(sizeof *t);
t->next = malloc(sizeof t);
380デフォルトの名無しさん:2005/05/20(金) 15:48:57
>>379
そのsizeofの値をprintしてみな
381デフォルトの名無しさん:2005/05/20(金) 15:55:06
>>358
とりあえず、実行時に引数の数字はつけてるか
382378:2005/05/20(金) 16:09:19
>>378
ありがとう。
383382:2005/05/20(金) 16:10:00
名前欄377の間違いでした_no
384デフォルトの名無しさん:2005/05/21(土) 17:27:18
strとTEST_STRINGのアドレスは同じ値だと思うのですが、
これを実行すると違う値が出てしまいます。
何が間違っているのでしょうか?

#include <stdio.h>
#define TEST_STRING "abcdefghijklmnopqrstuvwxyz"

int main() {
char *str = TEST_STRING;

printf("%p\n",str);
printf("%p\n",TEST_STRING);

return 0;
}
385デフォルトの名無しさん:2005/05/21(土) 17:33:04
>>384
#define はテキストマクロなので、
char *str = "abcdefghijklmnopqrstuvwxyz";
printf("%p\n",str);
printf("%p\n","abcdefghijklmnopqrstuvwxyz");
と書いたのと同じ。
文字列リテラルは、内容が同じでも同じ領域に確保されるとは限らない。
386デフォルトの名無しさん:2005/05/21(土) 17:33:34
>>384
普通は違うのが当たり前。別々な文字列リテラルが確保されるから。
但し、BCCなどのコンパイルオプションによっては、同一文字列リテラル
をマージする事ができるものがあり、それだと同じアドレスになる。
387デフォルトの名無しさん:2005/05/21(土) 17:41:25
>>385
>>386
ありがとうございました。
388デフォルトの名無しさん:2005/05/22(日) 09:30:38
const size_t num = 10;
int array[num];

このコードは、C++ では通りますが C では通りません。
理由を教えてください。
389デフォルトの名無しさん:2005/05/22(日) 09:40:53
>>388
C99サポートのCなら通る。
390388:2005/05/22(日) 10:46:44
欲しかったのはそういう答えじゃないんだけど・・・orz
391デフォルトの名無しさん:2005/05/22(日) 10:49:13
仕様
392デフォルトの名無しさん:2005/05/22(日) 11:20:35
>理由
昔のCではサポートしてない
C99ならおけ、って >389もいっとろーが
393デフォルトの名無しさん:2005/05/22(日) 11:22:19
こんなに言っても解らないとはしようがない奴だ!
394デフォルトの名無しさん:2005/05/22(日) 11:50:46
>昔のCではサポートしてない

確か昔は構造体の丸ごとコピー(代入)ができなかったんだよね
395デフォルトの名無しさん:2005/05/22(日) 12:09:47
規約にはなかったけど構造体の
まるごとコピーはかなり昔からできた
396デフォルトの名無しさん:2005/05/22(日) 12:30:49
下のような構造体hogeがあるとして、この構造体型の変数hooに対し、
hoo(100,200)のような書き方で簡単に中身に代入できるようにするには
どうしたらよいですか。

struct hoge{
int a;
int b;
};
397デフォルトの名無しさん:2005/05/22(日) 12:32:06
struct hoge hoo = {{100,200}};
398デフォルトの名無しさん:2005/05/22(日) 12:34:41
{{}}って二重にしなきゃいけないんだっけ?
最近C触ってないから忘れちったぃ。
399デフォルトの名無しさん:2005/05/22(日) 12:40:07
struct hoge{
void operator()(int x, int y) { a = x; b = y; }
int a;
int b;
};
400デフォルトの名無しさん:2005/05/22(日) 12:41:50
too many initializers for 'hoo'
401デフォルトの名無しさん:2005/05/22(日) 12:43:56
エラー E2291 s.c 10: } が必要
エラー E2141 s.c 10: 宣言の構文エラー
エラー E2139 s.c 10: 宣言に ; がない
警告 W8004 s.c 10: 'hoo' に代入した値は使われていない
エラー E2190 s.c 10: 不要な }
エラー E2190 s.c 10: 不要な }
402デフォルトの名無しさん:2005/05/22(日) 12:44:32
>>397
例えば関数の引数としてhoge型の構造体変数を渡したいとき、
一旦hooを作って値を入れて、それを関数に渡すのではなくて、
関数の引数のところに直接
func(hoo(100,200));
みたく書けるようにしたいです。
403デフォルトの名無しさん:2005/05/22(日) 12:49:14
>402
C99対応コンパイラなら
-----
typedef struct { int x, y; } point_t ;
void PutPixel(const point_t *p)
{
  ...
}

  ...
  PutPixel(&(point_t){640, 480});
  //または
  PutPixel(&(point_t){.x=640, .y=480});
-----
ってなことができるらしい
404デフォルトの名無しさん:2005/05/22(日) 12:53:55
ま、どのみち構造体を引数に取る関数の大半は構造体そのものではなく構造体へのポインタが引数だったりするんで大して役に立たないわけだが。
405デフォルトの名無しさん:2005/05/22(日) 12:53:57
>>402
hoo gen_hoo( int, int ){}
func( gen_foo( 100, 200 ) );
406402:2005/05/22(日) 13:02:26
すいません、間違えました。
func(hoge(100,200));のように書きたかったです。
というか実際使いたいのはwinのPOINT型構造体です。
関数に渡す際などに、一々変数を作って渡すのが面倒くさいので
func(POINT(100,200));のようにかけないものかと思って質問させていただいた次第です。
407402:2005/05/22(日) 13:13:17
あれ、質問の意図が変わってしまいました。

整理しますと、

・winのPOINT構造体型の変数hooに対し、hoo(100,200);のように値を一度に代入する方法

・変数を作らずにfunc(POINT(100,200));のようにPOINT構造体を引数として渡す方法

を知りたいです。
408デフォルトの名無しさん:2005/05/22(日) 13:25:55
>>407
POINT構造体返す関数でも作れば?

POINT SETPOINT(int x, int y)
{
POINT point;
point.x = x;
point.y = y;
return point;
}

void func_test(POINT& point)
{
printf("x: %d, y:%d\n", point.x, point.y);
}

main()
{
func_test(SETPOINT(100, 200));
}
409デフォルトの名無しさん:2005/05/22(日) 13:32:36
>408
脳内コンパイルすな!
410デフォルトの名無しさん:2005/05/22(日) 14:54:41
>>407
C99ならコンパウンドリテラルでぐぐれ。
C++ならこんなカンジで。

#include <stdio.h>
using namespace std;

class CPoint {
public:
 int x, y;
 CPoint(int x, int y)
 {
  this->x = x;
  this->y =y;
 }
};

void func_test(CPoint point)
{
 printf("x: %d, y:%d\n", point.x, point.y);
}

main()
{
 func_test(CPoint(100, 200));
}
411デフォルトの名無しさん:2005/05/22(日) 18:19:25
>>407
MFCあるいはATLのCPointを使えばfunc(CPoint(100, 200));と書ける。
ATLのなら<atltypes.h>をインクルードするだけで使えるんじゃないかと思う。(だめでも自分で作ればいいだけだし)
CPointはPOINTから継承されているのでPOINTを引数に取る関数へもそのまま渡せる。
412デフォルトの名無しさん:2005/05/22(日) 19:58:18
>>411
ようするに引数指定のコンストラクタ付き構造体か
413デフォルトの名無しさん:2005/05/22(日) 20:15:17
10年前ほどからずっとCの仕事をしたいと思ってる。
最近のCの仕事ってMFC不要ってのが多いの?
組み込みとかはMFCあまりいらないだろうけど、
業界仕事としてはCだけできれば採用可能ってのか多い
んかい??
414デフォルトの名無しさん:2005/05/22(日) 20:21:57
>>413
そりゃそうだ。
MFCなんてそもそもCでは使えない。
415413:2005/05/22(日) 21:00:28
>>414
いやはや、すまない。C/C++系の仕事と
みなしてくだされ・・・
416デフォルトの名無しさん:2005/05/22(日) 22:27:45
>>413
それでもあまり変わらないが…。
Windows以外にMFCは使えないわけだし。
君の言う業界ってWindowsを除くのか?
417デフォルトの名無しさん:2005/05/22(日) 22:28:47

Windows以外を、だ。
418デフォルトの名無しさん:2005/05/22(日) 22:42:40
スレ違いだからこの辺でやめとけ。
419デフォルトの名無しさん:2005/05/22(日) 23:44:17
一定時間Waitするプログラムを作ろうと思っております。

方法はForで無限ループさせ
ループのたびに、システム時間をチェックし、
設定時間になったらループを抜けるようにしようと思うのですが
システムへの負荷って無茶苦茶高くなってしまうものなのでしょうか?

またforで無限ループさせる以外に他になにかいい方法がありましたらお教え願います。
420デフォルトの名無しさん:2005/05/22(日) 23:50:07
むちゃくちゃ高くなる。
素直にAPIつかっとけ
421デフォルトの名無しさん:2005/05/22(日) 23:53:19
>無限ループさせる以外
たいまいべんとってないの?
422デフォルトの名無しさん:2005/05/23(月) 00:17:11
環境依存なので環境書いとくれ
423419:2005/05/23(月) 00:52:12
環境はWindows 2000 serverです。

APIは使えないと思います。(コンパイラが未対応)

>>421
タイマイベントというのは、APIによるタイマイベントでしょうか?
Cでそういったイベントを発生できるのでしたら
ヒントでもお教え頂けないでしょうか。。
424デフォルトの名無しさん:2005/05/23(月) 00:56:14
>>423
環境依存と書かれた時点でピュアCでは出来ないことは自明ではなかろうか。
425デフォルトの名無しさん:2005/05/23(月) 00:58:34
APIが使えないコンパイラってあるのか?
標準ライブラリにしたって各プラットフォームのAPI呼んでる訳なんだが‥‥
426デフォルトの名無しさん:2005/05/23(月) 01:03:14
どーしてもだめならループ中に sleep かましてしのぐとか
427デフォルトの名無しさん:2005/05/23(月) 01:08:32
sleepなど無い
428デフォルトの名無しさん:2005/05/23(月) 01:09:40
SleepもAPIか・・・
429419:2005/05/23(月) 01:10:45
すみません。大嘘ぶっこいてました。
環境はUNIX(AIX)です。。。
430デフォルトの名無しさん:2005/05/23(月) 01:42:39
コンパイルしようとしたら

In function 'main':
warning: assingment makes pointer from without a cast

となって失敗します。これってどうしろってことなんですか?
431430:2005/05/23(月) 01:46:55
すみません、この表示が出てもコンパイル
はしたことになってたみたいです。なんでもないです。
432デフォルトの名無しさん:2005/05/23(月) 02:00:01
警告はきちんと処理しとけ
警告:assingmentはポインターを作ります、fromキャストなし

キャスト汁!
433デフォルトの名無しさん:2005/05/23(月) 02:04:28
元スレ見たけど、mallocのプロトタイプが無かったせいみたいよ
434デフォルトの名無しさん:2005/05/23(月) 02:11:50
linux で、キャッシュを汚染せずに file からメモリに直接データ転送する方法を
ご存知の方はいませんでしょうか?
WIN32 の場合、CreateFile の dwFlagsAndAttribute に
FILE_FLAG_NO_BUFFERING フラグをつけると、L1,L2 キャッシュを汚染せずに
file からメモリに直接DMA転送します。同様の事を linux で行いたいと考えている
のですが、fread 文を使うとキャッシュを汚染してしまうようです。
なお、マルチスレッドで file access スレッドと複数のデータ処理スレッドからなる
構造のプログラムであり、mmap を使用する事はできません。
いい方法をご存知の方は、ぜひご教授下さい。m(_ _)m

435デフォルトの名無しさん:2005/05/23(月) 02:16:15
>プロトタイプが無かった
この場合は別の警告がでねーか? 知らねー関数がでてきたけど...みたいな
436デフォルトの名無しさん:2005/05/23(月) 07:05:55
>>434
FILE_FLAG_NO_BUFFERINGはCPUのキャッシュじゃなくて
メモリ上に取られるファイルキャッシュを使わないという意味だと思うが。
437デフォルトの名無しさん:2005/05/23(月) 07:14:35
>>435
C++ならね。
Cだと単にintを返す関数と仮定される
438デフォルトの名無しさん:2005/05/23(月) 07:21:34
>>437 C++なら警告じゃなくてエラー
439デフォルトの名無しさん:2005/05/23(月) 07:25:24
>>437
Cでもプロトタイプがないって警告を出す処理系もある。(BCCとか)
440デフォルトの名無しさん:2005/05/23(月) 14:37:55
他のアプリでキーボードを叩きたいのですが
何を検索すれば資料が出ますか?
441デフォルトの名無しさん:2005/05/23(月) 15:31:11
キーボードを叩くにはロボットハンドか何かを用意しないと。
442デフォルトの名無しさん:2005/05/23(月) 16:13:47
人間の手に電極埋め込む
443デフォルトの名無しさん:2005/05/23(月) 18:44:56
>>440
キーを押した事にすると言う意味なら。
PostMessage(他のアプリのHWND, WM_KEYDOWN, キーコード, 0);
444デフォルトの名無しさん:2005/05/23(月) 18:49:42
何故そこで環境を聞かんのかと。
445デフォルトの名無しさん:2005/05/23(月) 19:46:03
【初心者歓迎】なスレにはテレパスが必須。
446デフォルトの名無しさん:2005/05/23(月) 21:10:27
クレパスでは駄目ですか
447デフォルトの名無しさん:2005/05/23(月) 21:12:17
お互いが相手のメソッドを呼び合っているようなクラスについて質問。
class unko {
private:
int kuso;
public:
void setkuso() {
kuso = tinko.sikko();
}
int ketsu() { return 1; }
} unko;

class tinko {
private:
int tinpo;
public:
void settinpo() {
tinpo = unko.ketsu();
}
int sikko(){ return 1; }
} tinko;

のようにグローバルでclass変数を宣言してるんですが、
自分より後に宣言されているほうのメソッドを内部で呼び出してると、
「未定義のオブジェクト」エラーがでてしまいます。
どうしたもんでしょう。
スコープ解決演算子とかそういう関係でなんとかなるんですかね?
どっちを先に定義しても、あとのほうで定義している関数も中で呼び出してる
ので必ず未定義のオブジェクトエラーになっちゃうんですが
448デフォルトの名無しさん:2005/05/23(月) 21:24:04
そもそもグローバル変数でこんなことやるなんて設計がうんこじゃないか?
class unko {
private:
    int kuso;
public:
    void setkuso();
    int ketsu() {return 1;}
};

class tinko {
private:
    int tinpo;
public:
    void settinpo();
    int sikko(){return 1;}
};

unko u;
tinko t;

void unko::setkuso() {
    kuso = t.sikko();
}

void tinko::settinpo() {
    tinpo = u.ketsu();
449デフォルトの名無しさん:2005/05/23(月) 21:42:50
じゃあ普通はどうすんの
450デフォルトの名無しさん:2005/05/23(月) 21:44:02
とりあえずうんこしてくる。
451デフォルトの名無しさん:2005/05/23(月) 21:46:11
設計を見直す。
452デフォルトの名無しさん:2005/05/24(火) 03:09:15
>お互いが相手のメソッドを呼び合っている
なぜ?
453デフォルトの名無しさん:2005/05/24(火) 06:43:15
>>434
>FILE_FLAG_NO_BUFFERING フラグをつけると、L1,L2 キャッシュを汚染せずに
>file からメモリに直接DMA転送します。同様の事を linux で行いたいと考えている
自信満々で言ってるけどほんまかいな?
454デフォルトの名無しさん:2005/05/24(火) 14:09:47
以下のプログラムのベンチマークを取ろうと思ったのですが、
コンパイラの最適化でループ処理を消されるからか計算時間がほとんどかからず終わってしまいます。
どうすればベンチマークが取れますか?
int main(){
unsigned long bit1 = 156761546,bit2=4891656,max = 500000,i=0,a;
a = time(NULL);
while(i<max){
bit1 = bit1 & bit2;
i++;
}
cout << time(NULL) - a << endl;
}
455デフォルトの名無しさん:2005/05/24(火) 14:59:37
>>454
time a.out
Windowsならパフォーマンスカウンタとか使えば?
456デフォルトの名無しさん:2005/05/24(火) 15:29:03
>>454
最適化をオフにすればいいだろ。
457デフォルトの名無しさん:2005/05/24(火) 15:56:45
最適化OFFだけじゃとても足りない
1万回くらい実行したら
458デフォルトの名無しさん:2005/05/24(火) 15:58:17
>以下のプログラムのベンチマークを取ろうと思ったのですが、
談合の悪寒w
459デフォルトの名無しさん:2005/05/24(火) 16:33:01
>>454
ループの中に関数呼び出しを入れてみろ。何もせずにリターンする関数でいい。
大抵の場合最適化が取り消される。

inline関数はお勧めしないが。
460デフォルトの名無しさん:2005/05/24(火) 16:57:56
#include <stdio.h>

void main(void)
{
int kazu;

kazu=1;
scanf("%d\n",&kazu);
while(kazu<50)
{

printf("%d\n",&kazu);
kazu=kazu+1;

}
を実行して、1と2を入力したら、
1
2
1245052
1245052
1245052
1245052
.
.
.
と出てきた。

ちなみにMicrosoft Visual C++(Win32?)使用。
  
461デフォルトの名無しさん:2005/05/24(火) 17:01:18
>>460
マルチ(orコピペ)すなや。
462デフォルトの名無しさん:2005/05/24(火) 17:02:49
C++使える場合、C++使えないヤツより
いっぱい仕事とれますか?
C++できんってヤツが周りに多くて困っている
んだが。
463デフォルトの名無しさん:2005/05/24(火) 17:04:53
C++できんという香具師の問題は、C++を使えないということよりも
新しいことを吸収する能力の欠如に自分自身が気付いていないことだね。
464デフォルトの名無しさん:2005/05/24(火) 17:05:13
>>460
氏ね
465デフォルトの名無しさん:2005/05/24(火) 17:05:52
少なくとも日本語が使えない奴よりは使えそうだが。
466デフォルトの名無しさん:2005/05/24(火) 19:11:00
ファイルを読み込んで処理して、その出力を他の処理に渡すというプログラムを作ったのですが、読み込むファイル数が一定以上になると、"Too many open files"というエラーがでて終了してしまいます。
% output = load_file(filename)

lsofで見てみると、膨大なPIPEが出てきています。
outputを他のプログラムに渡す処理をするとき、それも「1ファイルのオープン」となって、それが残ってしまっているのかなと思います。

どうやってこのファイルを消せばいいのでしょうか?
467デフォルトの名無しさん:2005/05/24(火) 19:12:35
>>466
closeするだけだと思うのだが、言語は何かね。
468デフォルトの名無しさん:2005/05/24(火) 19:16:31
>>466
そのコードはCにもC++にも見えないが。
469デフォルトの名無しさん:2005/05/24(火) 19:17:52
C言語です。どこでcloseするのでしょう?
output = load_file(filename)
x = program(output)
と続きます。
470デフォルトの名無しさん:2005/05/24(火) 19:19:30
dupして閉じちゃったら
471デフォルトの名無しさん:2005/05/24(火) 19:21:14
あ、ちなみに、load_fileや、programはC(C++)でコンパイルされたoctaveのプログラムです。
472466:2005/05/24(火) 19:36:05
解決しました。
if ((ptr = popen (cmd, "r")) == NULL)
{
error("Can't execute command");
return retval;
}
のパイプが残っていることがわかりました。これをcloseすれば良かったんですね。
ありがとうございました。
473デフォルトの名無しさん:2005/05/24(火) 20:50:40
boost::spiritをVC++.NET(VC7.0)で使おうとしています。

#include <boost/spirit.hpp>
とincludeしただけで以下のエラーが出てどうしようもない状況です。
google検索しても見つからず途方に暮れています
解決方法をご存知の方、ご教授お願いします。

d:\lib\boost\boost\spirit\core\non_terminal\subrule.hpp(105): error C2065: 'ScannerT' : 定義されていない識別子です。
d:\lib\boost\boost\spirit\core\non_terminal\subrule.hpp(105): error C2065: 'ListT' : 定義されていない識別子です。
d:\lib\boost\boost\spirit\core\non_terminal\subrule.hpp(105): error C2687: 列以外でテンプレート クラスの入れ子の UDT を定義できません。
d:\lib\boost\boost\spirit\core\non_terminal\subrule.hpp(105): fatal error C1903: 直前のエラーを修復できません。コンパイルを中止します。
474デフォルトの名無しさん:2005/05/24(火) 20:50:48
boost::spiritをVC++.NET(VC7.0)で使おうとしています。

#include <boost/spirit.hpp>
とincludeしただけで以下のエラーが出てどうしようもない状況です。
google検索しても見つからず途方に暮れています
解決方法をご存知の方、ご教授お願いします。

d:\lib\boost\boost\spirit\core\non_terminal\subrule.hpp(105): error C2065: 'ScannerT' : 定義されていない識別子です。
d:\lib\boost\boost\spirit\core\non_terminal\subrule.hpp(105): error C2065: 'ListT' : 定義されていない識別子です。
d:\lib\boost\boost\spirit\core\non_terminal\subrule.hpp(105): error C2687: 列以外でテンプレート クラスの入れ子の UDT を定義できません。
d:\lib\boost\boost\spirit\core\non_terminal\subrule.hpp(105): fatal error C1903: 直前のエラーを修復できません。コンパイルを中止します。
475デフォルトの名無しさん:2005/05/24(火) 20:51:35
2度カキコされてしまいました、ごめんなさい。
476デフォルトの名無しさん:2005/05/24(火) 21:10:36
VC++.net 2003(VC++7.1)にバージョンアップする
477デフォルトの名無しさん:2005/05/24(火) 21:48:47
2年ほどjavaやってまたc++(vc7.1)に戻ってきたが
コンパイルエラーのメッセージがアホ過ぎだ。
1箇所間違えただけでエラー箇所いっぱい出てくるし
しかも肝心の場所とちがう。
478デフォルトの名無しさん:2005/05/24(火) 22:31:54
>>477
郷に入りては(ry
479デフォルトの名無しさん:2005/05/24(火) 22:38:43
VC6.0です。

class A {
private:
static void (*func)(int);
};

funcの定義の方法が分かりません。

どのように定義すればよろしいのでしょうか。
よろしくお願いいたします。
480デフォルトの名無しさん:2005/05/24(火) 22:41:55
>>479
「intを引数にとってvoidが戻り値の関数へのstaticなポインタを
privateメンバに持っている」と定義されていると思うんだけれども。
何を定義したいのかな?
481デフォルトの名無しさん:2005/05/24(火) 22:45:16
>>479
void (*A::func)(int) = ...;
482デフォルトの名無しさん:2005/05/24(火) 23:40:02
C++で、メンバ変数にReadOnlyのような属性を付けたいのですが、
擬似的ものでも何か実現する方法はないですか?
関数経由じゃないとだめでしょうか?
483デフォルトの名無しさん:2005/05/24(火) 23:41:51
>>482
const
const
const
const
const
const
const
const
const
484479:2005/05/25(水) 00:36:33
>>481
そんな所にクラス名が入るのですね。
ありがとうございました。

485デフォルトの名無しさん:2005/05/25(水) 01:31:30
>>453
アラインを揃えたメモリを確保して転送する必要があるので、DMA転送している
のだと思ってたんだけど、違うのかな? 速度的にも fread より遥かに速いようだし。
自信は全く無し。。 orz
486デフォルトの名無しさん:2005/05/25(水) 08:42:48
たくさんのクラスを宣言するときって普通、どういう順番でクラスとメンバ関数
を宣言していくのが見やすいですかね??暗黙の定石みたいなものってないんですか。
class x {
   public:
      int momo;
      void momomo();
};
class y {
   public:
      int mamama;
      void mama();
};
void x::mama() {
}
void y::momomo() {
}
↑こうなのか
class x {
   public:
      int momo;
      void momomo();
};
void x::mama() {
}
class y {
   public:
      int mamama;
      void mama();
};
void y::momomo() {
}
↑こっちがいいのか。あなたの判定はドッチ?
487デフォルトの名無しさん:2005/05/25(水) 08:51:14
>>486
宣言と定義は混ぜないのが基本。
488aaa:2005/05/25(水) 09:27:05
#include <stdio.h>
typedef struct foo{
int x;
} foo;
typedef struct bar{
foo *y;
} bar;

int main(void){
int i;
int x, y;
bar A;
A.y->x = 100;
printf("%d", A.y->x);
return 0;
}

#if 0
gcc test.c;./a.out

コンフィグオプション:
../configure --prefix=/usr --mandir=/usr/share/man
--infodir=/usr/share/info --enable-shared --enable-threads=posix
--disable-checking --with-system-zlib --enable-__cxa_atexit
--disable-libunwind-exceptions --enable-java-awt=gtk
--host=i386-redhat-linux
スレッドモデル: posix
gcc バージョン 3.4.3 20050227 (Red Hat 3.4.3-22.fc3)
#endif


確保していないはずの領域に書きこめてしまうのはなぜですか?
489デフォルトの名無しさん:2005/05/25(水) 09:29:59
>>488
たまたまです。環境と運が悪ければシステムごと落っこちます。
490aaa:2005/05/25(水) 09:37:10
>>489
落ちないほうがむしろ運が悪いんでしょうね
491デフォルトの名無しさん:2005/05/25(水) 10:41:07
#include <stdio.h>
#include <math.h>

main()
{

printf("%f",(1/100)*100);

return 0;
}

で計算すると、0.0000000になりました。これはなぜなんでしょうか?
492デフォルトの名無しさん:2005/05/25(水) 10:46:23
>>491
(1/100)*100は全て整数演算。実数演算したかったらどれかを実数の定数にせよ。
Ex.:(1.0/100)*100
493デフォルトの名無しさん:2005/05/25(水) 10:54:21
age
494492:2005/05/25(水) 11:06:38
なるほど、ありがとうございました
495デフォルトの名無しさん:2005/05/25(水) 12:11:04
逆ポーランド記法の計算をする時って、標準入力からはどのように入れればいいんですかね?
括弧とか計算符号とかどうすればいいのかがわからない○| ̄|_
教えてえらいひと

ちなみに環境なんてわかんないくらいの初心者君○| ̄|_
496デフォルトの名無しさん:2005/05/25(水) 12:16:28
497デフォルトの名無しさん:2005/05/25(水) 12:17:06
二分木で
498デフォルトの名無しさん:2005/05/25(水) 13:56:21
ドモホルンリンクル
499デフォルトの名無しさん:2005/05/25(水) 20:04:26
コンポジションだか集約だかしらないけど、
クラスメンバにオブジェクトを持つとき、
他のオブジェクトへのポインタじゃなくて、他のクラス変数自体を持つと
なんか問題があるのですか?
ヒープ領域を使うからデカいクラスをメンバに持っちゃダメだとか
書いてる人もいるけどそうなの?とにかくなんでポインタなんでしょうか
おしえてください
500デフォルトの名無しさん:2005/05/25(水) 20:15:54
>>499
つ憂鬱本
501デフォルトの名無しさん:2005/05/25(水) 22:16:02
>>499
ポインタならそのクラスのためのヘッダを外側のクラスのヘッダにインクルードしなくて済みますよ。
動的な差し替えとか、遅延初期化とかも可能だし。
オブジェクト指向チックにしたいなら、オブジェクトの型を固定するような使い方はそもそもしないのが吉。
ポインタにして作成メソッドをvirtualにしとけばサブクラスでオーバーライドできるしね。

> ヒープ領域を使うからデカいクラスをメンバに持っちゃダメ
まったくの嘘ですな。
502デフォルトの名無しさん:2005/05/26(木) 00:01:01
ヒープじゃなくてスタックにとってオーバーフローってことじゃないの?

class a{
char c[4096];
};

class b{
a _a[4096];
};

void f(){
b _b[4096];
};
503デフォルトの名無しさん:2005/05/26(木) 00:13:34
>>495
丸ごと文字列で式を取り込んで、自作のパーサに取り込めば?
504デフォルトの名無しさん:2005/05/26(木) 00:20:49
そんなのちょっと探せばサンプルがゴロゴロしてそうだけど
505デフォルトの名無しさん:2005/05/26(木) 12:08:49
>>495 は先ず、「逆ポーランドって何?」から調べるべき。
なんだ括弧って。
506デフォルトの名無しさん:2005/05/26(木) 15:02:24
Linuxは超初心者です。
Cygwinでmakeを実行したら

$make
gcc -o hoge1 hoge.o
/usr/lib/gcc-lib/i686-pc-cygwin/3.3.3/../../../../i686-pc-cygwin/bin/ld: cannot
find -luser32
collect2: ld returned 1 exit status
make: *** [hoge1] Error 1

と怒られてしまいました。
どうしたらいいのでしょうか。助けてください。
507デフォルトの名無しさん:2005/05/26(木) 16:21:13
>>506
LinuxとCygwinに何の関係が?

それはさておき、libuser32.aが見つからないと言っているようだ。
それを用意したまえ。
508デフォルトの名無しさん:2005/05/26(木) 17:38:27
K&Rの演習ってやったほうがいいですか?
509デフォルトの名無しさん:2005/05/26(木) 18:13:07
>>508
君のレベルによる。
510デフォルトの名無しさん:2005/05/26(木) 18:16:55
switch( a ){
case 1:
int aaa[3];
break;
case 2:
int aaa[10];
break;
}
このように宣言することはできないでしょうか?
実際やってみたらエラーがでまくりです
511デフォルトの名無しさん:2005/05/26(木) 18:23:50
>>510
無理。
512デフォルトの名無しさん:2005/05/26(木) 18:26:03
case のラベルごとにブロックで囲めばいいだけだろ
よくやる手だ
513デフォルトの名無しさん:2005/05/26(木) 18:28:10
>>512
俺もそう考えたが、質問者はあの配列を
下のほうで使うんじゃないかと思われる。

もしそうだったら>>512の手は使えないね
514デフォルトの名無しさん:2005/05/26(木) 18:31:54
>俺もそう考えたが、質問者はあの配列を
>下のほうで使うんじゃないかと思われる。
どこをどう見たら…
515デフォルトの名無しさん:2005/05/26(木) 18:34:36
>>510
そもそも条件ごとに配列の要素数を変えることはできない。
最大値が判っているなら、それで済ませるのが無難かと。
つまり、>510の場合、int aaa[10]を定義して使いまわせばいい。
516デフォルトの名無しさん:2005/05/26(木) 18:35:44
>>514
だってすぐbreakで抜けてるじゃん
517デフォルトの名無しさん:2005/05/26(木) 18:44:40
>>516
試しに書いてるだけだろ
518デフォルトの名無しさん:2005/05/26(木) 18:45:36
>>517
本人に聞いてみろよ
519デフォルトの名無しさん:2005/05/26(木) 18:46:50
省略してるんじゃまいか
520デフォルトの名無しさん:2005/05/26(木) 18:50:17
どう見ても省略してるだけに見えるが
521デフォルトの名無しさん:2005/05/26(木) 18:51:58
自演で何回も書き込んでるやつ、うざい
522デフォルトの名無しさん:2005/05/26(木) 18:54:45
もう動的確保でいいよ
523デフォルトの名無しさん:2005/05/26(木) 19:02:59
いや、>>513の言うことも一理ある。
条件aによって配列のサイズを変えたいということじゃないだろうか?

ならば、
int size = 0;
switch( a ){
case 1:
 size = 3;
 break;
case 2:
 size = 10;
 break;
}
{
 int aaa[size];

 /* aaaに対する処理 */
}
のようにすれば何とかなると思われる。
C99に準拠してないコンパイラは怒るかもしれんが。
524デフォルトの名無しさん:2005/05/26(木) 19:23:41
怒られたら
int *aaa = new int[siae];

int *aaa = (int*)malloc(size);
すればいいさ。
525506:2005/05/26(木) 20:07:24
>>507
make通りました。ありがとうございます。
526510:2005/05/26(木) 21:16:49
>>511-525
いろいろありがとです
switch文を出た後に同じような処理をするんで配列の確保だけを
無駄に多く配列を作らずにswitch文でできたらいいな〜と思ったしだいです
>>523-524さんのやつで行こうと思います
助かりました!!!
527初心者:2005/05/26(木) 22:52:39
学校の数値解析という授業でy=sin(x)を微分するプログラムを作れという宿題が出ました。はっきりいってまったくわからなくてこまってます。ぜひお教えください。
528デフォルトの名無しさん:2005/05/26(木) 23:01:19
>>527
数値的な微分でいいのか解析的な微分が必要なのかくらいは書いてくれ。
そんだけの情報じゃ私たちも全くわからなくて困ります。
529初心者:2005/05/26(木) 23:05:06
申し訳ありませんでした。
問題は数値的な微分です。
逐次計算式を作って計算するプログラムを作れといわれました。
530デフォルトの名無しさん:2005/05/26(木) 23:05:55
>>527
宿題スレに逝け
531デフォルトの名無しさん:2005/05/27(金) 06:18:40
ifdef で && や || を使用する方法を教えてください
532デフォルトの名無しさん:2005/05/27(金) 07:24:43
>>531
#ifdefでは無理。#ifでやる必要がある。

#if defined HOGE && defined FOO || defined BAR
533デフォルトの名無しさん:2005/05/27(金) 10:35:31
選択法のソートってどうやるの?
534デフォルトの名無しさん:2005/05/27(金) 12:36:25
>>533
ググレ
535デフォルトの名無しさん:2005/05/27(金) 12:57:45
switch(a){
 case 0 || 1:
  break;
 case 2 || 3:
  break;
 case 4:
  break;
}
エラー:case の値 '1' は既に使われています。

switch(a){
 case 0:
  break
 case 1:
  break;
 case 2:
  break
 case 3:
  break;
 case 4:
  break;
}
エラーなし

いったいどういうことなんでしょうか?
メディーーーーーーク
536デフォルトの名無しさん:2005/05/27(金) 13:14:43
>>535
case 0 || 1 ≡ case (0 || 1) ≡ case 1
case 2 || 3 ≡ case (2 || 3) ≡ case 1

そういうときは

 case 0:
 case 1:
   // 処理
   break;
 case 2:
 case 3:
   // 処理
   break;
 case 4:
   // 処理
537デフォルトの名無しさん:2005/05/27(金) 13:15:05
switch(a){ 
 case 0 :
 case 1 : 
 /* 0と1の処理 */
  break; 
 case 2 :
  case 3 :
 /* 2と3の処理 */ 
  break; 
 case 4: 
  break; 

538デフォルトの名無しさん:2005/05/27(金) 13:25:28
0||1と2||3をprintfしてみりゃわかる
539535:2005/05/27(金) 13:52:13
>>536-537
無事通りました。ありがとうございます
でもなんで、「0または1」と「2または3」
という条件が一緒って判断されてしまうのでしょうか?????
やっぱりメディーーーーーーク
540デフォルトの名無しさん:2005/05/27(金) 14:15:36
「0または1」も「2または3」

「FALSEまたはTRUE」も「TRUEまたはTRUE」

TRUEもTRUE

同じ
541デフォルトの名無しさん:2005/05/27(金) 14:26:46
542デフォルトの名無しさん:2005/05/27(金) 14:51:52
vc++6 W2kですが、
timeGetTimeを使おうとして"mmsystem.h"をincludeすると

error C2146: 構文エラー : ';' が、識別子 'MMVERSION' の前に必要です。
fatal error C1004: 予期せぬ EOF が検出されました。

とエラーがでます。どうしたらよいでしょうか。
543デフォルトの名無しさん:2005/05/27(金) 15:04:29
そのinclude文の前後をここに晒す
544デフォルトの名無しさん:2005/05/27(金) 15:06:14
#include <stdio.h>
#include <stdlib.h>
#include <mmsystem.h>

だけであります。
545デフォルトの名無しさん:2005/05/27(金) 15:12:48
>>542
#include "stdafx.h"
あと死ね。
546デフォルトの名無しさん:2005/05/27(金) 15:15:36
suse linux gcc上でコンパイルしています。

Aというクラスがあり、デフォルト引数を指定したコンストラクタを作成しました。

class A{
    public:
        void A(string filename);
        void B(void);
};


A::A(string filename="test.txt")
{
    x=new ofstream(filename.c_str());
}

main関数内で

A x("bbb.txt");

と引数を指定して作成した場合はコンパイルできるのですが

A x();

として作成した場合、エラーが出てコンパイルできません。エラーは具体的にはメイン関数内で

x.B();
と呼び出すところで起こり、

request for member 'B' in 'x', which is of non-class type 'A ()()'

というエラーメッセージが出ます。何がいけないのでしょうか?
547デフォルトの名無しさん:2005/05/27(金) 15:19:56
>>546
デフォルトのコンストラクタがない。
548デフォルトの名無しさん:2005/05/27(金) 15:20:55
>>545
インクルード ファイルがオープンできません。'stdafx.h': No such file or directory

当然だと思うのですが、とエラーが出ました。
あと、なんで死ななきゃなりませんか?
詳細に教えてください。
549デフォルトの名無しさん:2005/05/27(金) 15:31:32
>>546
A x();
と書くと、これはAを返す無引数関数の宣言になる。
A x;
と書くべし。
550デフォルトの名無しさん:2005/05/27(金) 15:35:19
>>547
ありがとうございます。下記のように変更してみたのですがやはり同じエラーが出ます。

class A{ 
    public: 
        void A(string filename); 
        void A(void); 
        void B(void); 
}; 


A::A(string filename) 

    x=new ofstream(filename.c_str()); 

A::A(void) 

    x=new ofstream( "test.txt"); 

551549:2005/05/27(金) 15:37:34
それから、デフォルト引数は実装側じゃなくてインタフェースに書かないといけない。
struct A
{
A(int i = 7);
};


A::A(int i){..}
552デフォルトの名無しさん:2005/05/27(金) 15:43:25
今の時間を文字列にして手に入れたいのですがどうすればいいですか?
553デフォルトの名無しさん:2005/05/27(金) 15:45:46
>>552
strftime
554デフォルトの名無しさん:2005/05/27(金) 16:14:40
>>548
死ぬほどではないが初歩的ミス。
プリコンパイルヘッダ
555554:2005/05/27(金) 16:16:48
入力途中で書き込んでしまった、すまん。
まあ、あれでわかるからいいか。
556デフォルトの名無しさん:2005/05/27(金) 16:30:17
>>554
すいません、よく意味がわからないのですが、
stdafx.hとかいうのは、よくコンパイル時間を短くしたりしたい時なんかに
あまり変更しないヘッダなんかをそこに入れて自分で作るものじゃないんですか?
何の関係があるのでしょうか?
557デフォルトの名無しさん:2005/05/27(金) 16:33:06
>>556
そうだから、全ての.c/.cppファイルがインクルードしている必要がある。
558デフォルトの名無しさん:2005/05/27(金) 16:35:30
CString strD;
strDに数字が入ってるのですがこれをint型に直したいのですがどうすればいいでしょうか
559デフォルトの名無しさん:2005/05/27(金) 16:38:23
>>558
_ttoi
560デフォルトの名無しさん:2005/05/27(金) 16:40:03
>>542
mmststem.hはWORDとかUINTとかの型に依存していて、
しかも自分ではそれらの定義のあるヘッダをincludeしていないから、
mmsystem.hをincludeする前にそれをincludeしてやる必要がある。
windowsのsdkは詳しくないけど、多分windows.hをincludeしておけば大丈夫。
ちなみにstdafx.hは無関係。
561542:2005/05/27(金) 16:46:00
>>557
度々申し訳ないのですが、
全ての.c/.cppファイルが、「何を」インクルードしてる必要があるのでしょうか。
作ってるものは.cppファイル一つの単純なプロジェクトで、
自作のヘッダファイルも何もないのですが。

"mmsystm.h"を使いたいだけなのですが、
プリコンパイルヘッダが何の関係があるのか分かりません。
562542:2005/05/27(金) 16:51:33
>>560
そういうことですか。
試したらいけました。
ありがとうございました。
563デフォルトの名無しさん:2005/05/27(金) 17:16:24
>>561
何かってのは普通stdafx.hのこと。
fatal error C1004:とくれば大抵それが原因だから。
564デフォルトの名無しさん:2005/05/27(金) 17:27:46
Visual Studio 2005 beta2ですが、
ifstream fin(fileName, std::ios::in | std::ios::binary);
int a;
fin.get((char*)&a, sizeof(a));
このときバイナリデータが0x0Aだと読み込んでくれません。
fin.get((char*)&a, sizeof(a), 'a');
のように適当に区切り文字も変更すると読み込みますが、
これではぜんぜん根本的な解決になってません。。
どうすればいいんでしょうか?
565デフォルトの名無しさん:2005/05/27(金) 17:29:29
textで
566564:2005/05/27(金) 17:39:03
>>565 画像データを読み込みたいのでバイナリでないと都合がわるいです。

fin.readを使ったら解決できました。
でもbasic_istream.readは廃止予定みたいなワーニングがでます。
warning C4996: 'std::basic_istream<_Elem,_Traits>::read' が古い形式として宣言されました。
こちらはどうにかならないでしょうか?
567542:2005/05/27(金) 17:52:13
>>563
ですからそのファイルはどうやって用意すればよいでしょうか?
>>560の方の助言に従い解決しましたし、全て説明がついていると思うのですが、
それ以上にstdafx.hがこの問題の解決に何の関係があるのか気になっています。
568563:2005/05/27(金) 17:55:52
>>567
俺の言った「普通」がお前の問題には当てはまらなかったと言いたかっただけだ。
569デフォルトの名無しさん:2005/05/27(金) 17:57:13
もういいって
570542:2005/05/27(金) 18:02:29
キチガイに絡まれているのでしょうか。
それとも私の読解力がないのでしょうか。
全く意味がわかりません。
571デフォルトの名無しさん:2005/05/27(金) 18:11:36
>>542 の方が、解ってて絡んでる希ガス
572デフォルトの名無しさん:2005/05/27(金) 18:27:22
いや本当に意味がわからないというか、何の関係があるのか分からないので
スッキリしないで気持ち悪いです。別の解決法でもあるのかなと。
全く関係ない話ですよね?
ただキチガイが意味不明なことを意って混乱させてようとしてるだけ
と考えてよいですか?
573デフォルトの名無しさん:2005/05/27(金) 18:29:12
>>542
おいおい、回答が多少ずれてたからといって回答者をキチガイとは聞き捨てならんな。
二度とこのスレに現れるなよ。
574デフォルトの名無しさん:2005/05/27(金) 18:30:52
やっぱ>>571っぽい希ガス
575デフォルトの名無しさん:2005/05/27(金) 18:32:11
いや、途中から話のすれ違いがあってstdafx.hの一般論的な話として
それ自体の意味を教えてくれたんだとすれば、その方には御礼を言いたいですが、
発端の>>545のstdafx.hをインクルードすれば解決するってのは
全く関係ないですよね?
576デフォルトの名無しさん:2005/05/27(金) 18:33:15
>>572
単に自分の間違いを認めるのが嫌なだけだろ。許してやれよ。

>>573
何様のつもりだ?
あほな回答者を非難するのは当然だと思うが。
577デフォルトの名無しさん:2005/05/27(金) 18:34:11
>>575
>>545はC++スレの伝統的なコピペ。
578デフォルトの名無しさん:2005/05/27(金) 18:34:41
(・∀・)
579デフォルトの名無しさん:2005/05/27(金) 18:37:17
>>542は途中からニセモノになってるだろ。
580デフォルトの名無しさん:2005/05/27(金) 18:45:27
野茂のソックリさん
581デフォルトの名無しさん:2005/05/27(金) 18:49:22
それはニセノモ
582デフォルトの名無しさん:2005/05/27(金) 18:53:47
野茂本人
583デフォルトの名無しさん:2005/05/27(金) 18:55:53
それはホンノモ
584デフォルトの名無しさん:2005/05/27(金) 19:16:39
>>579-583
お前ら全員ワロピ
585デフォルトの名無しさん:2005/05/27(金) 22:14:03 BE:386637697-
ttp://www.sgnet.co.jp/c/2-1.htm
ここによると
#include <stdio.h>が記述されていないとエラーになるそうですが、
自分がやってもエラーにならないんです。
どういうことでしょうか?
586デフォルトの名無しさん:2005/05/27(金) 22:17:02
>>585
それはよかったな。せいぜい書かずに精進してくれ。
しかしvoid mainってそこのページ・・・・・
587デフォルトの名無しさん:2005/05/27(金) 22:18:37
>>585
その例はCの規格に照らして正しいから(c99では「未定義」だが、これはエラーを出さなくても良いことを意味する)。
588デフォルトの名無しさん:2005/05/27(金) 22:28:05
>>585
全ての処理系でエラーになるわけではない。
ちなみにC++では必ずエラーになる。
589デフォルトの名無しさん:2005/05/27(金) 22:28:38 BE:497105699-
そこのページ・・?
問題でもあるんでしょうか?
590587:2005/05/27(金) 22:31:19
一応解説しておく。
今、Cの標準規格にはC89とC99があって、C89の方が一般に使われている。
そのコードはC89では完全に正しい(良いスタイルかどうかは別だが)から、
コンパイラはエラーを出してはいけない(警告なら良い)。
C99では未定義だから、どう扱おうとコンパイラの勝手だということになる。

この点でそのページは間違ってるし、>>586の言ってる問題もあるから、お勧めはしない。
591デフォルトの名無しさん:2005/05/27(金) 22:37:15 BE:220935694-
わかりました。どうもありがとうございました。
592デフォルトの名無しさん:2005/05/27(金) 22:38:35
mainの戻り値をvoidにしている所は駄目なCやC++のサイト・本などを判別する指標になる。
正式なのはint main(void)とint main(int argc, char *argv[])だけ。
ただし同じ意味になるのであれば多少の相違点があっても問題ない。
例えばC++ではint main()も正しい。C++ではint main(void)と同じになるから。
593デフォルトの名無しさん:2005/05/27(金) 23:16:43
>>592

 main()
 main( int argc, char* argv[] )

は?
594592:2005/05/27(金) 23:17:37
と思ったらどうやらCでも関数定義時に限っては括弧の中にvoidを書いても書かなくてもいいみたいだ。

結構古い本にそのようなことが書いてあり、
気になってC99の規格も読んでみたがそんなことが書いてあった。
ただし廃止予定事項となっていたが。
595デフォルトの名無しさん:2005/05/28(土) 00:35:28
C++ソースでヘッダもソースも一緒くたにして*.hpp拡張子にして纏めています。
これが、ソースの管理上やコンパイル等で悪影響を与える事はありますか?

環境VC2003です。
596デフォルトの名無しさん:2005/05/28(土) 00:37:38
>>592
Cだと関数定義/宣言の括弧になにも入れないと、K&Rスタイルとの互換性で
「引数チェックはしないよん」という意味になるんじゃなかったか
要するに何でも素通しの、プロトタイプ以前の世界。
597デフォルトの名無しさん:2005/05/28(土) 00:38:23
>>595
コンパイル時間は遅くなるだろうな
598デフォルトの名無しさん:2005/05/28(土) 00:40:34
>>595
ちょくちょくいじるプログラムだったらお勧めできない。
ちょっと変更しただけで全コンパイル走るし。
staticなメンバ変数の置き場にも困るな。
599595:2005/05/28(土) 00:45:56
あ、確かにコンパイル遅いや。
*.hppのままでプリコンパイル済みヘッダとか効かすのって無理かや・・・。
ちょくちょくいじるソースなので、分ける事にします。

ヘッダとソース分かれているの、マンドクセ。
600デフォルトの名無しさん:2005/05/28(土) 00:48:28
>>595
JavaやC#になれていると、醜いと感じるかもしれないし
テンプレート使いまくりだと、めんどいと感じるかもしれないが

まあ我慢汁
601デフォルトの名無しさん:2005/05/28(土) 00:51:55
俺はJavaやC#のほうが見にくい。
IDEがサポートしてくれりゃそれでいいんだろうけど、大体ツリー形式でパラメータ途中で切れてたりするし。
たいていアルファベット順に並び替えられちゃうし同じクラス内では全部フラットだから機能ごとにまとめて書くなんていプログラマの気遣いが水の泡になっちゃう。
C++のヘッダ見たほうが正確で速いや。
なんかコメント書いてあるかもしれないし。
602デフォルトの名無しさん:2005/05/28(土) 00:54:14
>>601
Stroustrupは同じ意見みたいだな。
まあJavaの場合はjavadocとかあるから。
603デフォルトの名無しさん:2005/05/28(土) 09:08:07
同じクラス内で複数インスタンスがある場合でもそのクラス共通で使える変更可能な変数をつくることはできますか?
staticにしただけじゃだめでした。static constだと値が変更できないのでちょっと今回の用途には合いません。
どなたかご教授おねがいします
604デフォルトの名無しさん:2005/05/28(土) 09:08:23
age
605デフォルトの名無しさん:2005/05/28(土) 09:16:44
>>603
static で何が不満なんだ?
606デフォルトの名無しさん:2005/05/28(土) 09:24:56
>>603
//ヘッダ
class hoge
{
  static int foo;
};

//cppファイル
static int hoge::foo;
普通のグローバル変数と同じようにどこか一箇所で定義が必要。
607デフォルトの名無しさん:2005/05/28(土) 09:36:23
クラス変数にstatic設定してみたんですがコンパイルエラーでうまくいきませんでした。
CWindow2 error LNK2001: 外部シンボル ""protected: static int CWindow::NumWindow" (?NumWindow@CWindow@@1HA)" は未解決です。
または
CWindow2 error LNK2005: "public: static int CWindow::NumWindow" (?NumWindow@CWindow@@2HA) は既に CWindow.obj で定義されています。

どういう宣言の仕方をすればいいのでしょうか?
ソースはヘッダとソースで分割してます。
608デフォルトの名無しさん:2005/05/28(土) 09:37:13
>>606
あ、ヘッダに書いてました。
そうかソースのほうか。
勉強になりました。
Thx!
609デフォルトの名無しさん:2005/05/28(土) 12:57:00
ヘッダにも要るんだぞ?
610デフォルトの名無しさん:2005/05/28(土) 17:14:19
いらん、クラスの中だけでいい
611デフォルトの名無しさん:2005/05/28(土) 17:35:07
宣言は.h、定義は.cppだろ?
612デフォルトの名無しさん:2005/05/28(土) 17:36:33
継承クラスから基本クラスのコンストラクターを呼ぶにはどうすればいいの?
class Base
{
Base()

Base(int i)

}

class Sub : public Base
{
Sub():Base(){
Base(5)
}
}
ではだめだった
613デフォルトの名無しさん:2005/05/28(土) 17:37:18
>>612
Base二回呼ぶなよ
614デフォルトの名無しさん:2005/05/28(土) 17:38:32
正確には条件によって呼び出すBaseを変えたい.
なので2回呼ぶこともある
615デフォルトの名無しさん:2005/05/28(土) 17:46:39
> 正確には条件によって呼び出すBaseを変えたい.

基底クラスのコンストラクタは派生クラスのコンストラクタが実行
される前に呼ばれるから、むりだよ
そういうことがやりたいのなら、設計を変えるんだね
616デフォルトの名無しさん:2005/05/28(土) 17:53:38
>正確には条件によって呼び出すBaseを変えたい
なぜ?その理由は?
617デフォルトの名無しさん:2005/05/28(土) 17:53:58
>>612
Sub() : Base( condition ? Base() : Base( 5 ) ){}

正確にはやりたいことと違うが、Baseがまともなクラスなら問題はないでしょう。
618デフォルトの名無しさん:2005/05/28(土) 18:35:54
>>617 
その方法がいいかも
これでも動いてはくれた。Vc.net2003だから動いただけかな?
class Sub : public Base
{
int flag;
int initProc(){
ごにょごにょ
  return flag;
}
Sub():Base(flag=initProc()){
}
}
動いたのでOKなんだけどちょっと不安
619デフォルトの名無しさん:2005/05/28(土) 20:15:40
基本的な質問で、すみません。

unsigned char *AAA;
unsigned char BBB[3][XXX][YYY];
AAA = (unsigned char *)malloc((size_t)XXX*YYY*3);

AAAには、BBB[0],BBB[1],BBB[2]……といった順で同じデータ形式が
格納されるとします。
AAAとBBBの間で、効率よくデータのやり取りするには、どうすれば良いですか?
この関数を使え的なアドバイスでもかまいません。
620デフォルトの名無しさん:2005/05/28(土) 20:23:08
>>619
memcpy()
あとunsigned char (*AAA)[XXX][YYY];にするのも考えてみたらどう?
621619:2005/05/28(土) 21:32:44
>>620
色々試してみたのですが、上手くいきません。
申しわけないですが、実際の記述を教えていただけないでしょうか?
622デフォルトの名無しさん:2005/05/28(土) 21:55:08
>>621
その前に自分が試した色々と、上手く行かなかった結果について、
「実際の記述」を示すのが先だろう。
623デフォルトの名無しさん:2005/05/28(土) 22:24:58
>AAAには、BBB[0],BBB[1],BBB[2]……といった順で同じデータ形式が

BBBって3次だから AAA には BBB[0][0][0], BBB[0][0][1], ... ぢゃねの?
624619:2005/05/28(土) 22:38:20
>>622
失礼しました。
例えば AAA から BBB にコピーする時は……

memcpy(BBB[0], *(AAA ),((size_t)XXX*YYY));
memcpy(BBB[1], *(AAA +((size_t)XXX*YYY))),((size_t)XXX*YYY));

かなぁ?とか(^^;
配列が分かっていないと言われれば、それまでなんですが……
いまは、以下をforで回してコピーしています。
BBB[n][i][j]= *(AAA +k);

>>623
はい。それが正しいです。省略?していました。すみません。
625デフォルトの名無しさん:2005/05/28(土) 22:41:51
>>624
memcpy(BBB, AAA, XXX * YYY * 3);
forでループさせる必要は全く無い。
626デフォルトの名無しさん:2005/05/28(土) 22:44:07
>>624
なんだそりゃ。コンパイルも通らないだろ。
memcpy(BBB,AAA,sizeof(BBB));
これでおしまいじゃないか?
627619:2005/05/28(土) 22:54:46
>>625,626
ありがとうございます。
上手く行きました。
美しい記述で、感動中……

>>626 はい。>>624は、コンパイルすら通りませんでした。
で、その試行例を書いて聞くには、余りにも恥ずかしかった次第です。
本当にありがとうございました。
628デフォルトの名無しさん:2005/05/28(土) 23:12:25
>607
あえて揚げ足とりさせてもらうとそれはコンパイル時のエラーじゃない。リンク時のエラーだ。
629デフォルトの名無しさん:2005/05/29(日) 00:30:08
class a{
public:
  a(int (*test)[2] ){ 何かの処理 };
}

class b : public class a{
public:
  b(int age, int (*test)[2]) : a((*test)[2]);
};

b::b(int age, int (*test)[2]))
{
 何かの処理
}
とやってもうまくいきませんでした
どうしてでしょうか?

630デフォルトの名無しさん:2005/05/29(日) 00:33:56
どううまくいかなかったのかね
631629:2005/05/29(日) 00:41:58
>>630
肝心なものが書いてありませんでしたヽ(´Д`;)ノ
「構文エラー : ';' : メンバ関数の定義を終了するための '}' がありません。」
こんなエラーが出てしまいます

もう一つ問題ができてしまいました
コンストラクタで引数の数だけ二次元配列を作成するにはどうしたらいいのでしょうか
632629:2005/05/29(日) 00:43:14
上のエラーは
  b(int age, int (*test)[2]) : a((*test)[2]);
の部分で出ています
633デフォルトの名無しさん:2005/05/29(日) 00:46:15
>>629 コンストラクタの定義には空でも { } が必要。
634デフォルトの名無しさん:2005/05/29(日) 00:49:00
>>629
: でつなげるのはbの関数定義のほう
635デフォルトの名無しさん:2005/05/29(日) 00:55:57
3行目セミコロンいらない、6行目 aの前にclassいらない
8行目:以降いらない(セミコロンはいる)
11行目、最後の括弧閉じいらない、ここに、: a(test) とつなげる
636629:2005/05/29(日) 01:12:32
キタ━━━━(゚∀゚)━━━━!!
>>633-635
ありがとう
うまくいったよ

コンストラクタで引数の数だけ二次元配列を作成するにはどうしたらいいのでしょうか

これの方法見つけました
   double** pd = new double* [2];
   for (i1 = 0; i1 < 2; i1++)
      pd[i1] = new double [3];
でできるみたいですね、でもちょっとめんどい(´・ω・`)ショボーン
637629:2005/05/29(日) 01:36:00
無念・・・

class a{
 double **d;
public:
 a( int size );
}

a::a( int size )
{
 d = new double *[size];
 for(int i = 0; i = size; i++){
  d[size] = new double[size];
 }
}
ここまでは完璧なんだけどデストラクタが引数をとれない・・・
   for (int i = 0; i < size; i++){
    delete [] d[i];
   }
   delete [] d;
こんな感じで配列が解放できないよヽ(`Д´)ノウワァァァン
638デフォルトの名無しさん:2005/05/29(日) 01:42:18
メンバーでとっとけばいいだろ
639デフォルトの名無しさん:2005/05/29(日) 01:43:47
メンバー
640629:2005/05/29(日) 01:50:16
>>638-639
確かにメンバーで確保して
解放するメンバーを作っておけばできるけど
う〜むなんか方法無いのかな〜
641デフォルトの名無しさん:2005/05/29(日) 01:52:04
は?それが方法だろ。何か問題が?
642629:2005/05/29(日) 01:57:26
>>641
そうだよね
できる方法が有るだけでも助かったよ〜
>>638-641
ありがとう
643デフォルトの名無しさん:2005/05/29(日) 08:18:58
std::vector<std::vector<double> >
644デフォルトの名無しさん:2005/05/29(日) 13:39:39
異種リストで教えていただきたいことがあります。
class TBase{
 virtual void Speak() = 0;
};
class TInt{
 int Value;
 int Speak() {return Value;};
};
class TFloat{
 float Value;
 float Speak(){return Value;};
};
TBaseのリストにに派生したクラスがぶら下がって
返りの型が違う(けどなんとなく互換性がある)ものを
ポリモーフィズムできないでしょうか?
645デフォルトの名無しさん:2005/05/29(日) 13:47:57
>>644 ちゃんとした互換性がないとダメです。
646644:2005/05/29(日) 13:59:39
そこをどうにかして(別の手法でも)似たようなことを可能にする
技法はないのでしょうか?
647デフォルトの名無しさん:2005/05/29(日) 14:04:36
>>646
何がしたい?「ポリモーフィズムしたい」じゃわからんぞ。
648デフォルトの名無しさん:2005/05/29(日) 14:10:29
>>644
TBaseのポインタ・参照からSpeak()を呼んだときに戻り値を何で受け取ったらいいのかわからないからそんなこと出来ない。
C++なんだからテンプレートを使って作り直してみろ。
649644:2005/05/29(日) 14:30:08
どうもつきあってくれて、ありがとうございます。
ちょっと説明がうまく言えないのでご容赦を。
上のクラスみたいにint,float,charのようなメンバを持つオブジェクトが
リストで連なっていて、それを先頭から足したり割ったりしていくわけですが
(ここは諸事情で同じ型に統一できないのです、ただ全部数値として格納してます)
メンバの型を判定してint&int,int&float,float&intの足す処理、√の処理、二乗の処理
のように書いていくと膨大な関数を作らないとならず、また判定するために重くなるようです。
それでそういう組み合わせの型に関係なく、足したり引いたりするには
どうしたらいいのか、ということがやりたい処理です。
なにか良い方法はありませんでしょうか。。。
650644:2005/05/29(日) 14:32:03
テ、テンプレートというのですか、未知の領域ですが調べてみます。
651デフォルトの名無しさん:2005/05/29(日) 14:50:09
>>644
全部doubleに変換してから処理すれば?
#intのビット数がdoubleで表現できる精度を越えていなければ。
652デフォルトの名無しさん:2005/05/29(日) 20:50:14
メンバーの引数をコンストラクタの引数にできるでしょうか?
class apple{
 apple(int i );
 orenge(int i );
}

main(){
 apple ringo( ); ←ここで定義したくない
 for(int i = 1; i <10; i++){
  ringo.orenge( i )
 }
}
こんな感じでfor文のiをコンストラクタの引数にしたいんです
653デフォルトの名無しさん:2005/05/29(日) 20:59:36
>>652
状況が良くわからないが、コンストラクタとは別に初期化するメンバ関数を作れば解決?
(std::fstreamとstd::fstream::open()のように)
654652:2005/05/29(日) 21:02:24
すいません、事故解決しました
下のようにしたら普通に動きました
おかしいな〜 さっきは動かなかったのに(゜∀。)ワヒャヒャヒャヒャヒャヒャ
class apple{
 apple(int i );
 orenge(int i );
}

main(){
 for(int i = 1; i <10; i++){
  apple ringo( i );
  ringo.orenge( i );
 }
}
655デフォルトの名無しさん:2005/05/29(日) 21:06:39
一体何をやろうとしているのかさっぱり意味がわからない。
656デフォルトの名無しさん:2005/05/29(日) 21:44:56
初心者でも、自分が何をしようとしているか&どこで詰まっているか
他人が分かるように的確に書けるやつは、たいてい自分で解決しちゃうからな。


説明の出来ないやつは自分で解決できたと思い込むと。
657デフォルトの名無しさん:2005/05/30(月) 11:18:19
そもそも英語のつづりに無頓着なやつは
コーディングも適当な気がする・・・
658Google先生:2005/05/30(月) 12:52:29
もしかして: orange
659デフォルトの名無しさん:2005/05/31(火) 02:28:22
VBからVC++へ二次元配列を渡すときに
参照渡しはできないんでしょうか?
SafeArrayを使っても参照渡しになりませんでした
660デフォルトの名無しさん:2005/05/31(火) 07:09:55
失礼します。
以下のプログラムでscanf関数の部分がループになるのですが
何かおかしい所ありますでしょうか?

void input(int i){
int tmp;
scanf("%d",&tmp);
}

はじめ、構造体のint要素へ値の受け渡しをする作業を行う
関数として設計したのですが、scanfの処理部でなぜかループ状態になり
制御がきかなくなりますので、簡略化してほぼ独立な関数(上のような形)
として実行してみましたが、やはり上手くいきません。
原因がわからないのがなんとも気持ち悪いのでご指導下さい。
どうぞよろしくおねがいします。
661デフォルトの名無しさん:2005/05/31(火) 10:15:30
>>660
たとえば、%dで数値をとろうとした場合、
キーボードで数字以外を入力すると
取得できずに戻ってくるわけだが、
入力バッファにこの文字は残ったままなので
バッファクリアしないで再びscanfを呼んでも
キー入力を待たずに同じ結果になるばかり

つまりループする
662デフォルトの名無しさん:2005/05/31(火) 12:44:59
>>661
それ以前に、提示されたソースのみではループのしようもない訳だが
663デフォルトの名無しさん:2005/05/31(火) 13:22:34
親と子のダイアログが作ったのですが、子のボタンにはコントロール変数が追加できるのに親ダイアログのボタンには
どのボタンにもコントロール変数が追加できません。

ご存知の方、恐れながらご教授お願いいたします。
664デフォルトの名無しさん:2005/05/31(火) 14:29:38
>>663
環境を明示しましょう。

もしかしたらこちら?
★初心者にVisual C++を教えるスレ★ Part19
http://pc8.2ch.net/test/read.cgi/tech/1116209988/
http://pc8.2ch.net/test/read.cgi/tech/1115386557/
665デフォルトの名無しさん:2005/05/31(火) 15:08:01
>>661
ありがとうございました。
ちゃんとint型を入力しているのですが・・・。
http://www9.plala.or.jp/sgwr-t/c/sec05.html
↑ページの最後にある、改行記号の読み捨てなどやってみましたが
改善されませんでした。
ただ、タイプミスから偶然判明したのですが、scanf部を・・・

scanf("* %d",&tmp);

とすると、なぜかループに陥らない事が・・・・
なぜだ〜、何が原因なんだ〜

>>662
そうなんです。
開発環境がvC6.0なので、デバッグツールでプログラムの挙動を
追ったのですが、どうもscanf関数内部でループに陥っているらしく
scanfの戻り値などは戻ってこずに制御不能になります。
とりあえず時間がなくなってきたので、改良はまた帰ってきてからダナ・・・
(´・ω・`)ショボボン

どうもありがとうございました
666デフォルトの名無しさん:2005/05/31(火) 16:19:10
>>665
コンパイラだけでも.NETに置き換えたら?

Microsoft Visual C++ Toolkit 2003 質問箱
http://pc8.2ch.net/test/read.cgi/tech/1109618655/
667デフォルトの名無しさん:2005/05/31(火) 17:16:23
>>663
> 親と子のダイアログが作ったのですが

何を?
668662:2005/05/31(火) 17:18:35
>>665
皮肉に気付け


現象が出る最小限のコードと、
入力したデータなどの情報がないと、
誰もまともに答えられん。
669デフォルトの名無しさん:2005/05/31(火) 17:25:43
まさかとは思うが全角の数字を入力して無いだろうな…
670デフォルトの名無しさん:2005/05/31(火) 17:36:26
まっさか〜
671デフォルトの名無しさん:2005/05/31(火) 17:41:32
さーまーに
672デフォルトの名無しさん:2005/05/31(火) 19:00:05
Java の次のコードに相当する C++ のコード教えて。

public class UniqueID {
public static final UniqueID Foo = new UniqueID();
public static final UniqueID Bar = new UniqueID();
public static final UniqueID Baz = new UniqueID();
private UniqueID() {}
}
673デフォルトの名無しさん:2005/05/31(火) 19:20:59
>>672
//ヘッダ
class UniqueID {
public:
  static UniqueID Foo;
  static UniqueID Bar;
  static UniqueID Baz;
private:
    UniqueID() {}
};

//どこかcppファイル
UniqueID UniqueID::Foo;
UniqueID UniqueID::Bar;
UniqueID UniqueID::Baz;
674デフォルトの名無しさん:2005/05/31(火) 20:24:11
enum
675デフォルトの名無しさん:2005/05/31(火) 22:17:04
すいませんが、お知恵を貸してください。
1234というintの数字をそのままstd:stringクラスに代入したいのですが、いい案はないでしょうか?
int hoge = 1234;
string str = int_to_string ( hoge );
みたな。
馬鹿みたいな質問ですがよろしくお願いします。
676デフォルトの名無しさん:2005/05/31(火) 22:22:46
std::ostringstream s;
s << 1234;
string str = s.str();
677デフォルトの名無しさん:2005/05/31(火) 22:57:22
>>675
boost::lexical_cast
678675:2005/05/31(火) 23:39:58
>>676-677
ありがとう。一行で簡単に書けるような方法はないんですね。がんばってみます。
679デフォルトの名無しさん:2005/05/31(火) 23:41:02
680デフォルトの名無しさん:2005/05/31(火) 23:41:52
>>675
string str = "1234";
681デフォルトの名無しさん:2005/06/01(水) 00:32:06
>>680
"1234"じゃなくて(int)1234だ
682デフォルトの名無しさん:2005/06/01(水) 04:28:10
cやc++のサンプルコードを眺めていると
mallocで確保したメモリはfreeで、newで確保したメモリはdeleteで解放しているのですが、
intやcharで宣言した領域は解放していないものがあります。
intやcharのメモリはプログラム終了時に自動的に解放されるのでしょうか?
固定長だから、プログラムコードのメモリが解放されると同時に解放されているのでしょうか。
683デフォルトの名無しさん:2005/06/01(水) 05:28:37
解放してるものがあるの?
スタックに取った自動変数はブロックを抜ければ自動的に解放される
684デフォルトの名無しさん:2005/06/01(水) 08:05:55
>>673
std::map<> とかに入れるときは &UniqueID::Foo とか?
685デフォルトの名無しさん:2005/06/01(水) 12:15:16
比較的短いスパンでCPUに意図的に負荷をかけたいのですが、どういう処理をさせるのが
適切でしょうか?
例えば、特定のホットキーを押している数秒間だけ負荷をかけるとか
686デフォルトの名無しさん:2005/06/01(水) 12:55:06
負荷をかける目的で、何が適切かは変わるからなぁ。
687デフォルトの名無しさん:2005/06/01(水) 13:11:28
>>686
では逆に、例えばこういう目的にはこういう処理が適切とか、いくつか挙げて頂けますでしょうか
一応私の目的としては、負荷をかけることで早すぎるアクションゲームなんかを遅くしたいなあと思ってるんですが
…πの計算でもさせればいいのかしら
688デフォルトの名無しさん:2005/06/01(水) 13:12:19
単にCPU使用率を100%にしたいだけなら空ループでもことたりるが、CPUの持つ演算器すべてをフル回転させようと思うとちと難問だて。
689デフォルトの名無しさん:2005/06/01(水) 13:14:16
それだとsleepするだけでいい罠
690デフォルトの名無しさん:2005/06/01(水) 13:14:56
sleepだと自分のスレッドが止まるだけだろ
691デフォルトの名無しさん:2005/06/01(水) 13:16:32
>>689
sleepしても、マルチタスクOSなら他のプロセスにCPU時間が回される
だけで、負荷にはならんよ。

Windowsなら、SetPriorityClass()APIでも使って、重くしたらどう?
692デフォルトの名無しさん:2005/06/01(水) 13:16:42
>>689
は?sleepってなにやってるか知らないの?
693デフォルトの名無しさん:2005/06/01(水) 13:25:00
>>692
だから、>>685はCPUに意図的に負荷を掛けて、温度を上昇させる
とか、そういう実験をしたいんだろ。
sleepはOSの問題。馬鹿ですか?
694デフォルトの名無しさん:2005/06/01(水) 13:27:24
>>693
負荷をかけることで早すぎるアクションゲームなんかを遅くしたいなあと思ってるんですが
695デフォルトの名無しさん:2005/06/01(水) 13:29:18
>>693
はい?なんですか?その頓珍漢な返答は?
696デフォルトの名無しさん:2005/06/01(水) 13:29:53
>>694
大昔の奴ね。裏でmp3エンコードとかやりながら遊ぶと遅くなりますよ
697デフォルトの名無しさん:2005/06/01(水) 13:30:22
>>694
そういう用途ならSleep()で結構。
698デフォルトの名無しさん:2005/06/01(水) 13:31:22
タイマをいじって、ものすごい短い間隔で割り込みがかかるように
すればいいだろ。
699デフォルトの名無しさん:2005/06/01(水) 13:33:54
>>697
他人の書いたゲームの事かと。
700デフォルトの名無しさん:2005/06/01(水) 13:38:46
普通DOSベースで動くアクションゲームなんかは、最初にCPUの速度を
測って、ウェイトルーチンに与えるパラメタを変えたりして、CPUが替わっても
ゲームそのものの速度にはあまり影響が出ないようにしてあるもんだけどな。

それか、プログラマブルタイマ割り込みかVSYNC割り込みでタイミングを
取ってる物がほとんどだぞ。

相当古いゲームなんですか?
701デフォルトの名無しさん:2005/06/01(水) 13:38:55
ゲームプログラムのメインルーチンで呼ばれているであろうAPIをのっとって、呼び出されるたびにSleep()かまして強制的に止めるというネタはどっかにあったな
702デフォルトの名無しさん:2005/06/01(水) 13:45:51
もしかして、そのままゲームをやったら難易度が高すぎるので、
自分で速度を調節したいとか、そういう質問か?

板違いだろ。PCゲーム板でも逝け。
703デフォルトの名無しさん:2005/06/01(水) 13:48:30
むしろ早くするにはどうすればいいのでしょうか?
704デフォルトの名無しさん:2005/06/01(水) 13:55:09
705デフォルトの名無しさん:2005/06/01(水) 16:36:37
cinで入力した文字を使った名前の関数を作成するにはどうしたらいいのでしょうか?
cin でaiueoと受け取ったら
int aiueoというものを作りたいのですが
706デフォルトの名無しさん:2005/06/01(水) 16:49:52
無理
707706:2005/06/01(水) 16:51:33
いや無理じゃないな。
動的にダイナミックリンクライブラリ作ればいける。
708デフォルトの名無しさん:2005/06/01(水) 17:29:44
それが既に無理だろ
709デフォルトの名無しさん:2005/06/01(水) 18:33:24
メンバ変数、ローカル変数、グローバル変数、関数の引数や、
関数名などのネーミングでうまい方法、
もしくは一般的な推奨ルールなど自慢してください。
どうもウィンドウズのなんたら記法っていうのになじめないんです。
710デフォルトの名無しさん:2005/06/01(水) 18:46:28
>>709
慣れると便利だけどね。
711デフォルトの名無しさん:2005/06/01(水) 18:51:56
>>709
そんなもんそれこそきりが無い罠
712デフォルトの名無しさん:2005/06/01(水) 21:56:13
フィーリングですよ、フィーリング
713デフォルトの名無しさん:2005/06/01(水) 23:23:57
714デフォルトの名無しさん:2005/06/01(水) 23:29:11
ついでというわけではないのですが質問です。
ものすごく遠くにある int i とかを使い回していいのでしょうか?
それともちゃんとブロックで破棄しながら進んでいかないといけないのでしょうか・・・。
715デフォルトの名無しさん:2005/06/01(水) 23:48:32
>>714
言語仕様としては使いまわしてよい。
お行儀としてはブロックスコープで区切った方が良い。
その方がわかり易いし、良いコードが出る可能性も高くなる。
716デフォルトの名無しさん:2005/06/01(水) 23:50:02
>>714
遠くにあるint iが使えるという時点でペケ。
717デフォルトの名無しさん:2005/06/02(木) 01:00:04
>>715-716
レスありがとうございます。
これからはきちんと管理していこうと思います。
718デフォルトの名無しさん:2005/06/02(木) 02:19:11
このプログラムってメモリリークしてますか?
#include <iostream.h>
int main(){
unsigned int no = 1234;
char *value;
value=(char*)malloc(4);
memcpy(value,&no,4);
memcpy(&no,value,4);
cout << no << endl;
free(value);
}
719デフォルトの名無しさん:2005/06/02(木) 02:30:11
>>718
してない。
余談だけど4よりsizeof(unsigned int)使ったほうがいいよ。
720デフォルトの名無しさん:2005/06/02(木) 03:09:03
>>719
レスありがとう。
なるほど、sizeofの方がソースコードが環境に依存しないで済みますね。
721デフォルトの名無しさん:2005/06/02(木) 07:15:55
>>718
C++ならmalooc()なんか使うなや。
722デフォルトの名無しさん:2005/06/02(木) 09:26:36
まるーっく!
723721:2005/06/02(木) 09:42:01
s/o/l/
724デフォルトの名無しさん:2005/06/02(木) 11:18:31
ミクロな揚げ足取りになると俄然元気な奴っているよな。
725デフォルトの名無しさん:2005/06/02(木) 11:19:35
>>721
C++でostream使わずにstdio使ったらファビョる方ですか?^^;
726デフォルトの名無しさん:2005/06/02(木) 11:27:02
ファビョるつーか、C/C++スタイルが混在してて気持ち悪いってことじゃないか?
727デフォルトの名無しさん:2005/06/02(木) 11:51:55
>>726
C++ は元々そういう言語。
ただ malloc は混乱の元になりかねんので
封印したほうがいいんジャマイカ。
728デフォルトの名無しさん:2005/06/02(木) 11:56:38
C++はCに機能を追加したに過ぎない言語だから当り前の事じゃん
729デフォルトの名無しさん:2005/06/02(木) 13:10:40
malloc使うなって意見に対して、stdio諸々を持ち出すのはどうだろうねえ。
確かに「理屈の上の立場」は両者同じだけど、
代替となる「C++ならではの手段」の評判が違いすぎるだろう。
730デフォルトの名無しさん:2005/06/02(木) 14:24:17
mallocとnewって本質は同じじゃないの?
731デフォルトの名無しさん:2005/06/02(木) 14:32:30
メモリを確保するという点では同じだけど
newは確保した領域にオブジェクトを構築するという重要な仕事があるからなぁ。
同じというには無理があると俺は思う。
732デフォルトの名無しさん:2005/06/02(木) 17:16:44
>>730
互換性はないということになっているから、本質的に同じとはいえない。
メモリ確保をどう行うか、実装によって違う可能性がある。
733デフォルトの名無しさん:2005/06/02(木) 18:09:06
>>730
malloc()はコンストラクタの呼び出しを行わない。
734デフォルトの名無しさん:2005/06/02(木) 21:05:16
>>730
mallocの本質はメモリ領域の確保だけ
newの本質はインスタンスの作成、メモリの確保だけではない
735デフォルトの名無しさん:2005/06/02(木) 21:05:50
>>730
new はメモリ不足に対して例外を投げる。
736デフォルトの名無しさん:2005/06/02(木) 21:09:21
>>730
newはニューっと新しいメモリを確保する。
737デフォルトの名無しさん:2005/06/02(木) 21:27:01
流れが読めずにすみませんが std って何と読めばいいのでしょうか?
どの本を読んでも書いていないのですが 「すたんだ〜ど」 で良いのでしょうか?
738デフォルトの名無しさん:2005/06/02(木) 21:29:53
えすてぃーでぃー
739デフォルトの名無しさん:2005/06/02(木) 21:40:08
Super Threading Document
の略です。えすてぃーでぃ〜と発音してください
740737:2005/06/02(木) 21:45:13
>>738-739
なんか激しくウソクサイのですが…
本当ですか?
741デフォルトの名無しさん:2005/06/02(木) 22:12:35
略はともかく、読みはこれでいいだろ

迷ったらアルファベットをバラして読むほうが間違いが少ない
742デフォルトの名無しさん:2005/06/02(木) 22:55:12
stdioやらstdlibは「えすてぃでぃ○○」と読むだろう?
743デフォルトの名無しさん:2005/06/02(木) 23:18:18
>>737
standardでいい
744デフォルトの名無しさん:2005/06/03(金) 00:04:45
studioだよ
745デフォルトの名無しさん:2005/06/03(金) 01:26:16
SuTtokoDokkoi
746デフォルトの名無しさん:2005/06/03(金) 01:53:35
コンストラクタと値を設定する関数の内容がまったく同じになってしまったのですが、
こんな場合は、どうすべきなのでしょうか? 記述するまでもないですが、一応こんな
感じなんです。

CHoge::CHoge( int x ) {
_a = x ;
}

void CHoge::set_value( int x ) {
_a = x ;
}

あくまで、大雑把に書くとこんな感じです。とにかく、中身が全く同じなんですが、
初期化時点でどうしても必要な引数が一つある場合と、無い場合が二つ存在してます。
だからこうして分けてて、 : CHoge( x ) の明示的な呼び出ししてもエラーとか言われ
ちゃうし・・・
わたしが言おうとしてる、意味わかるかたどうかご教示お願いします。
747デフォルトの名無しさん:2005/06/03(金) 03:31:27
>>746
>わたしが言おうとしてる、意味わかるかたどうかご教示お願いします。
大馬鹿者。
他人が読んで意味が明確に分かるように説明するのは質問者の義務。
お前の書いてることは支離滅裂で意味不明。書き直せ。
748デフォルトの名無しさん:2005/06/03(金) 04:28:13
> あくまで、大雑把に書くとこんな感じです。とにかく、中身が全く同じなんですが、
ここまでは理解した。

> 初期化時点でどうしても必要な引数が一つある場合と、無い場合が二つ存在してます。
> だからこうして分けてて、 : CHoge( x ) の明示的な呼び出ししてもエラーとか言われ
> ちゃうし・・・
病院に行け
749デフォルトの名無しさん:2005/06/03(金) 05:15:30
こういう話なのかな?
class CHoge {
int a;
public:
CHoge(int x) {set_value(x);}
void set_value(int x) {a = x;}
};
750デフォルトの名無しさん:2005/06/03(金) 06:12:02
正直、>>747-748は無理して絡んでる。
751デフォルトの名無しさん:2005/06/03(金) 07:06:59
無理しなくても>>746は意味不明だろw
752デフォルトの名無しさん:2005/06/03(金) 12:02:08
>>749
ありがとうございます、出来ました。
それでよかったんですね・・・(ノ_・、)シクシク
すごく馬鹿らしい質問だったかもしれないけど、お陰で助かりました。
753デフォルトの名無しさん:2005/06/03(金) 13:03:32
寧ろ漏れは>746に対する>749が>752のヒントになってることが不思議だ。
754デフォルトの名無しさん:2005/06/03(金) 13:10:50
>>752
一応注意しておくけど、質問の内容が馬鹿らしかったのではなく、
説明の仕方が馬鹿らしかったんだからね。
755デフォルトの名無しさん:2005/06/03(金) 15:33:38
unsigned char a = 0xff;
このaをsigned shortに変換するのに

(signed short)aじゃだめで
(signed short)(signed char)aでないと駄目なのはどうしてですか?
756デフォルトの名無しさん:2005/06/03(金) 15:40:29
>>755
コンパイラの問題じゃないか?
WindowsXp、VC++6.0では
(signed short)a
で問題無かったけど。
757755:2005/06/03(金) 15:46:53
>>756
すいません。勘違いだった。
758755:2005/06/03(金) 16:00:07
やっぱり駄目でした。
unsigned char a=0xff;
printf("(signed short)(signed char)a = %x\n",(signed short)(signed char)a);
printf("(signed short)a = %x\n",(signed short)a);

結果
(signed short)(signed char)a = ffffffff
(signed short)a = ff
になりました。

unsigned char a=0xffとはa==-1のことだと思うので、正しくキャストできているのは上の方の結果だと思うのですが。
759755:2005/06/03(金) 16:02:38
コンパイラはgccです。
760デフォルトの名無しさん:2005/06/03(金) 16:02:51
0xff はunsigned なら 255 だろうが
761デフォルトの名無しさん:2005/06/03(金) 16:04:35
(signed int)(signed char)a の場合
255 -> -1 -> -1
(signed int)aの場合
255->255

何の問題もないが
762デフォルトの名無しさん:2005/06/03(金) 16:06:22
>>760-761
>0xff はunsigned なら 255 だろうが
そうだ。やっぱり自分の方の間違いか。スレ汚しすいません。
763デフォルトの名無しさん:2005/06/04(土) 00:16:50
メモリの確保に付いての質問なのですが
こういう動的配列とかではよく利用しているのですが
int* a;
a = new int[num];

例えばこういう使い方の意味がよくわからんのです
CMyBitmap* pBitmap;
↑画像をファイルから読み込んだり表示したり色々する
 DirectXでもなんでもいいけども
pBitmap = new CMyBtimap;

こうする理由がいまいちわからない。
データが消えたりするのでしょうか、それとも処理速度が上がったり?
764デフォルトの名無しさん:2005/06/04(土) 00:19:52
>>763
newで作ったオブジェクトはブロックを抜けてもdeleteしない限り消えない。
だからスコープがブロック範囲では困るときに(も)使う。
765デフォルトの名無しさん:2005/06/04(土) 00:22:47
>>763
{
    CMyBitmap  Bitmap;
    CMyBitmap* pBitmap;
    pBitmap = new CMyBtimap;
    // Bitmapの内容も、pBitmapの内容も保証される
}
{
    // Bitmapの内容は保証されない
    // pBitmapの内容は保証される(delete前ならば)
}
766デフォルトの名無しさん:2005/06/04(土) 00:34:56
それの意味がわからないようじゃ、まだまだ初心者どころか赤子だな
767デフォルトの名無しさん:2005/06/04(土) 00:39:32
>>764-765
レス有難うございます

スコープを外れても使用する事が出来るのですね
まさにメモリ確保。レスどうもでした。
768デフォルトの名無しさん:2005/06/04(土) 00:46:43
>>766
おっと、そんなツレナイ事カキコしないでくださいよ旦那。
学校ではまったく習ってないのよ、もう本が師匠。
769デフォルトの名無しさん:2005/06/04(土) 01:08:41
えーと、ある関数があって、その関数を呼び出した関数の名前を知る方法はありますか?

void func ()
{
printf ( "このfunc()を呼び出した関数名");
}

こんな感じ。要するにログを吐きたい。
770デフォルトの名無しさん:2005/06/04(土) 01:24:02
皆さんこんばんは、つい最近必要に迫られてc++をはじめたのですが質問があります。

・ポインタに配列を利用してたくさんのオブジェクトを生成する
・基幹クラスののポインタに派生クラスのオブジェクトを入れる

これらのことはできたのですが、この二つを同時に行うプログラムを組んだところ
コンパイルはできるものの実行中にエラーを吐くようになってしまいました。

↓実際に組んだ物
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/498.txt

どうかアドバイスをお願いします。
771デフォルトの名無しさん:2005/06/04(土) 01:33:45
>>770

それでは要素がpet型の配列を作ってdobutu型のポインタで保持してることになる。
やりたいことがポリモーフィズムならば、要素がdobutu*型の配列を
作らなければならない。

で、その場合は配列を作った後で、配列の各要素は改めてnewしつつ配列に
ポインタを突っ込む必要がある。
772デフォルトの名無しさん:2005/06/04(土) 01:37:58
773デフォルトの名無しさん:2005/06/04(土) 01:41:07
>>770
簡単に言うと、doubutuのインスタンスとpetのインスタンスのsizeofが違う
ので、mem[i]でアクセスした時にi==0の時はいいかもしれないが、i>0に
なると結果は不定なわけだな。
774デフォルトの名無しさん:2005/06/04(土) 02:04:48
レスありがとうございます。自分なりに考えてみました。
これであってますでしょうか?

int main()
{
int number;
cout << "数を入力:", cin >> number;

doubutu **fuga ;

fuga = new doubutu*[number] ;

for(int i =0 ; i < number ; i++)
fuga[i] = new pet, fuga[i]->setdata();

cout << endl, cout <<"データの表示" << endl;

for(i = 0 ; i<number ; i++)
fuga[i]->showdata();

delete[] fuga ;
}
775デフォルトの名無しさん:2005/06/04(土) 02:17:23
>>774
petのインスタンスがdeleteされてない。

そもそも配列を動的に確保するぐらいならstd::vector使うよし。
776デフォルトの名無しさん:2005/06/04(土) 02:22:06
>>771
>>772
>>773

回答ありがとうございます。
doubutu型のポインタでpet型の配列を保持しているのでdoubutu型の配列を生成するとは

doubutu *mem;
mem = new doubutu[number];

としてあげるということでいいのでしょうか?

>で、その場合は配列を作った後で、配列の各要素は改めてnewしつつ配列に
>ポインタを突っ込む必要がある。

えーと、ここは具体的にどうすればいいのか・・・

772は英語なので明日にでもじっくりと読みたいと思います
777770:2005/06/04(土) 02:34:29
>>774

doubutu **fuga ;
fuga = new doubutu*[number] ;
とすると確かに動くのですが

ポインタfugaを**としてることと
doubutu*[number]の*の部分はどういう意味になるのか教えていただけないでしょうか

おしえてちゃんで申し訳ないです。。。
778デフォルトの名無しさん:2005/06/04(土) 02:39:57
>777
ポインタがちゃんと分かっていれば分からないはずはないんだが。

doubutu **fuga なら fuga は doubutu 型へのポインタへのポインタ型。
fuga = new doubutu[number] だと dobutu 型の配列。
fuga = new doubutu* [number] だと doubutu * 型(doubutu へのポインタ型)の配列。
779770:2005/06/04(土) 02:42:56
キター!
やっとすっきりしました!

ポインタへのポインタって考え方はありなのか・・・
780デフォルトの名無しさん:2005/06/04(土) 02:44:06
>>779
ちゃんとdeleteしろよ。
781デフォルトの名無しさん:2005/06/04(土) 02:45:59
あっと、お礼を書く前に送信してしまった

>>780
ちゃんとdelete付け加えておきます

皆様ありがとうございました
782デフォルトの名無しさん:2005/06/04(土) 02:54:49
Cのポインタなんですが、

int a[2];
printf("%p %p\n",a,&a);

で同じアドレスが表示されるのはなぜですか?
さらに同じアドレスなのに

*a = 1;

はよくて

*(&a) =1;

は怒られるのはなぜですか?お願いします。
783デフォルトの名無しさん:2005/06/04(土) 03:10:10
*a
*(a+0)

a[0]
784デフォルトの名無しさん:2005/06/04(土) 03:13:18
a <-> &a[0]

&a とは意味がまったく違う
785デフォルトの名無しさん:2005/06/04(土) 03:22:47
OGASAWARAいいかげんにしる!
786デフォルトの名無しさん:2005/06/04(土) 04:32:31
>783,784

aと&a[0]が同じなのは分かるんですが、
なぜaと&aが同じ値になるんでしょうか?
&aは何を意味しているんですか?
787デフォルトの名無しさん:2005/06/04(土) 04:36:12
じゅうしょ
788デフォルトの名無しさん:2005/06/04(土) 04:37:43
>>786 &a は配列へのポインタだよ。
789デフォルトの名無しさん:2005/06/04(土) 06:01:06
a は配列の第一要素へのポインタで、
&a は配列へのポインタで、値が一緒なだけで、
別物と考えるということですか?
なので
*(&a) = 1;
という代入も認められない。
じゃあ &a という記述は何のためにあるんですか?

うざくてすみません
790デフォルトの名無しさん:2005/06/04(土) 06:51:26
>>789
T a[N];
T (*p)[N];
のとき、p = a でも p = &a[0] でもなく、p = &a でなければならない。
791789:2005/06/04(土) 07:51:58
>>790
なるほど。それは例えば複数の配列に同じ処理をしたいときに
pで処理を書いておいて、先頭でp=&aとかp=&bと代入して使うと
いうことでいいですか?
いまいちポインタのうれしさが分かってないんで。
皆さんありがとうございました。
792デフォルトの名無しさん:2005/06/04(土) 07:52:21
>>782
アドレスの値は同じでも型がそれぞれ違う。
aとかくと先頭要素へのポインタということでint *。
&aは配列へのポインタなのでint (*)[2]。
793デフォルトの名無しさん:2005/06/04(土) 08:37:12
勉強不足のタメ、以下の警告の意味がよくわからないのですがご教授くださるとありがたいです

警告 W8030 test.cpp 28: 'x' パラメータ(vector<shape *,allocator<shape *> >::pus
h_back(shape * const &))のために一時変数を使用する(関数 main())

test.cpp
  23 : vector<shape *> shapes;
  〜
  28 : shapes.push_back(dynamic_cast<shape *>(new circle));

circle は shapeクラスを継承したクラスです
794デフォルトの名無しさん:2005/06/04(土) 08:59:39
>>793
push_backは参照を受け取る。
そこへ右辺値を作るdynamic_castの値を渡しているので内部では一時変数を作ってそこへの参照を渡しているということ。

アップキャストだろうからdynamic_castをなくせば警告は無くなるんじゃないかと思う。
795デフォルトの名無しさん:2005/06/04(土) 09:35:35
すみません、初心者です。
DLLを共有エリア(0x80000000以上)に置きたいのですが、どうすればよいでしょうか・・・?
無料版BCC++を使っています。
796デフォルトの名無しさん:2005/06/04(土) 09:35:53
すみません、初心者です。
DLLを共有エリア(0x80000000以上)に置きたいのですが、どうすればよいでしょうか・・・?
無料版BCC++を使っています。
797デフォルトの名無しさん:2005/06/04(土) 09:36:35
すみません、初心者です。
DLLを共有エリア(0x80000000以上)に置きたいのですが、どうすればよいでしょうか・・・?
無料版BCC++を使っています。
798デフォルトの名無しさん:2005/06/04(土) 09:39:43
*((char*)0x80000000) = 'D';
*((char*)0x80000001) = 'L';
*((char*)0x80000002) = 'L';
799デフォルトの名無しさん:2005/06/04(土) 09:50:18
トローチ
800793:2005/06/04(土) 10:03:51
test.cpp
  28 : shapes.push_back(new circle);
に変えても同じ警告が出ました。
使っているコンパイラは bcc32 です
801デフォルトの名無しさん:2005/06/04(土) 10:21:54
>>793
俺は気にしなくて良いと思う。const参照に一時オブジェクトを渡すなんて
日常茶飯事だからな。
g++だと-Wallでも警告でないし。
802632:2005/06/04(土) 10:57:56
borland5.5で 桁あふれ例外のキャッチをしたいのですが可能でしょうか。
試しに
catch(System.OverflowException e){.....}
としてみましたがうまくいきませんでした。
初心者です。よろしくおねがいします。
803793:2005/06/04(土) 11:03:00
>>794
>>801
そうですか気にしないようにします、お答えありがとうございました。
804デフォルトの名無しさん:2005/06/04(土) 11:38:29
>>795
部分的に共有させるのならできる。

http://www.kumei.ne.jp/c_lang/sdk2/sdk_161.htm
BCCでも同じようにやればいい。
805デフォルトの名無しさん:2005/06/04(土) 12:09:10
>>802
System.OverflowExceptionはC#の構文。
806デフォルトの名無しさん:2005/06/04(土) 12:22:05
typedef __int64 int64_t;
という型があります。
これのサイズをチェックして
8バイトじゃなければ
コンパイルを中止するようにしたいんですが
何か方法はありますか?

イメージとしてはこんな感じです。
#if sizeof(int64_t) != 8
#error 失敗すますた。
#endif
807デフォルトの名無しさん:2005/06/04(土) 12:25:18
そこでどうするかというと_controlfp()で浮動小数点数関連の例外を発生させるようにする。
これで構造化例外がやってくるようになる。(__tryと__except)
そして構造化例外はC++例外として受け取れるようにも出来る。
http://www.microsoft.com/japan/msdn/library/ja/jpdndeepc/htm/deep03162000.asp
808632:2005/06/04(土) 12:29:31
C#のSystem.OverflowExceptionに相当する
bcc32の構文をご存知の方いらっしゃいましたら
ご教授願います。
809デフォルトの名無しさん:2005/06/04(土) 12:35:46
810632:2005/06/04(土) 12:38:37
> 809
すみません 更新遅れてました
試してみます
811デフォルトの名無しさん:2005/06/04(土) 12:49:01
>>806 BOOST_STATIC_ASSERT
812デフォルトの名無しさん:2005/06/04(土) 12:49:36
>>806
BOOST_STATIC_ASSERTはどう?
813デフォルトの名無しさん:2005/06/04(土) 12:59:27
#include<stdio.h>
int main(void)
{
int num;
while(1)
{
printf("Input : ");
scanf("%d",&num);
if(num=0)
{
break;
}
}
   printf("num is %d",num);
   return 0;
}
このプログラムでifの条件は代入が成立したということで真になって、
break;でwhileループを抜けると思うのですが、無限ループしてしまいます。
どうしてでしょうか?教えてください。
814デフォルトの名無しさん:2005/06/04(土) 13:01:21
>>811-812
ありがとうございました。
やっぱりBOOSTは避けて通れない道なんですかね。

また、別話題ですいません。
あるサイトにメンバ変数は遅い為
forループの中では使わないで
auto変数を使えって書いてあったんですが
皆さんはやってますか?
815デフォルトの名無しさん:2005/06/04(土) 13:12:52
>813
>if(num=0)
816デフォルトの名無しさん:2005/06/04(土) 13:16:13
>>813
×if( num = 0 )
○if( num == 0 )

ソースそのままのっけたかは わからんけど。
とりあえず誤り指摘。
817デフォルトの名無しさん:2005/06/04(土) 13:19:34
>>814
速度が問題にならない限りやらないなぁ俺は。
818デフォルトの名無しさん:2005/06/04(土) 13:22:16
>>815-816
ちょっとズレてないかおまいらの指摘。
わかってて代入してるんだぞ>>813は。

>>813
> このプログラムでifの条件は代入が成立したということで真になって、
いや、ここで評価されるのは「代入した結果の値」であって、
この場合それが0だから、つまり偽になる。
819816:2005/06/04(土) 13:33:30
>>818
そうだったのかっ!!
820デフォルトの名無しさん:2005/06/04(土) 13:42:24
何この阿呆なレスの応酬。
>813がscanf()を代入だなんていうから>818が素っ頓狂なレスつけてるし、>819は納得しているし。
821デフォルトの名無しさん:2005/06/04(土) 13:48:13
buf="今日はいい天気"(1)
     ↓変換
data="8da193fa82cd82a282a293568b43"(2)

のように変換出来るようにしたいのですが
(1)→(2)の変換を どうすればいいか分かりません。
よろしくお願いします。

822デフォルトの名無しさん:2005/06/04(土) 13:54:04
>>820
> >813がscanf()を代入だなんていうから
そんなこと誰も言ってないじゃん。
823デフォルトの名無しさん:2005/06/04(土) 14:01:04
>>814
ついついメンバ変数には長い名前をつけてしまうから、
メンバ関数内では短い名前で使えるようにというのもあって俺はやっている。
824デフォルトの名無しさん:2005/06/04(土) 14:03:17
ファイルから一行の文字列を読み込みたいんですけど、こういう場合
どうすべきでしょうか?
string test
fget( test, ---
のようなイメージでやりたいんですけど。
825デフォルトの名無しさん:2005/06/04(土) 14:08:50
stringがstd::stringなら
std::getline使えば
826デフォルトの名無しさん:2005/06/04(土) 14:11:22
ファイルヘッダ情報を読み込むのはどうしたらよいのでしょう?
827デフォルトの名無しさん:2005/06/04(土) 14:23:28
using std::string ;
int main(void)
{
FILE *fp ;
string s ;
fp = fopen( "test.txt", "r" ) ;
getline(fp,s) ;

みたいにしたんですけど、できません・・・
828デフォルトの名無しさん:2005/06/04(土) 14:24:08
>>826 ファイルヘッダ情報って何だ?
829デフォルトの名無しさん:2005/06/04(土) 14:24:57
>>827 使う関数のプロトタイプくらい調べろよ。
830デフォルトの名無しさん:2005/06/04(土) 14:31:19
>>817,>>823
なんか他のスレッドから参照されないことを
保障するキーワードみたいなのあればいいですね。
答えてくれてありがとうございました。
831デフォルトの名無しさん:2005/06/04(土) 14:50:08
コマンドラインでjpegからjpeg2000への変換ソフトの開発を考えています。
linuxでも動くものを作りたいのでsusieのプラグインは使いたくありません。
また将来的にはGUIでもやりたいと思っているのですが、フリーで使えるライブラリなどはないでしょうか?
832デフォルトの名無しさん:2005/06/04(土) 14:52:01
初心者なので、教えてください。
時、分、秒をそれぞれUINT8型で格納している構造体があります。
そこから、sprintfを使い、char型の配列に変換して出力することは出来るんです。
・・・で、問題はここからで、時、分、秒をそれぞれ1ビットずつで
、16進数であらわすことが求められました。
自分でもよく分かってないので上手く説明できないのですが、
やり方を教えてほしいです。

833デフォルトの名無しさん:2005/06/04(土) 14:54:14
>>832
1ビットの16進数?1バイトの16進数の間違いじゃないのか?
あと、基数変換を知っているかね?
834デフォルトの名無しさん:2005/06/04(土) 14:57:25
>>827
FILE *とfopenではなくstd::ifstream
835デフォルトの名無しさん:2005/06/04(土) 14:58:37
> 時、分、秒をそれぞれ1ビットずつで
難しすぎる
836デフォルトの名無しさん:2005/06/04(土) 15:01:58
>>821
#include <iomanip>
#include <sstream>
std::string hoge(const std::string& str)
{
    std::ostringstream oss;
    for (std::string::size_type i = std::string::size_type(0); i < str.size(); ++i)
        oss << std::hex << std::setfill('0') << std::setw(2) << (str[i] & 0xFF);
    return oss.str();
}
837デフォルトの名無しさん:2005/06/04(土) 15:04:33
>> 827
fstream fi("test.txt",ios::in);
string s((istreambuf_iterator<char>(fi)),istreambuf_iterator<char>());
cout << s;
//一文字づつなら
fi.seekg(0);
istreambuf_iterator<char> ch(fi);
cout << *ch;
for(int i=0;i<10;++i)
cout << *++ch ;

838デフォルトの名無しさん:2005/06/04(土) 15:13:37
>>834>>837
レスありがとうございました。
難しいですが、これを参考にがんばってみます。
839832:2005/06/04(土) 15:52:58
>>833
すみません。そうです、1バイトでした。
基数変換・・・ですか。よくわからないんですが。
840デフォルトの名無しさん:2005/06/04(土) 16:28:33
>>832
1バイトの表現ならつまり
printf("%02x %02x %02x\n", h, m, s);
ですか? わかりません!!
841初心者:2005/06/04(土) 17:05:35
たぶんFAQなのでしょうが,マニュアル見ても,gooでもわからず, どなたか,教えていただけませんか.環境は,XP + Visual C++
.NET (2003)です.(配列でない)文字型変数のアドレスって,存在しないの でしょうか?C/C++の教科書見ていると,直にそのようなことを書いてい
るものは見つからないのですが.下記プログラムの,p_c2が「フフフ」なのと,&c3がアドレスでなくて,値そのものを出力するのは,根は同じなのでしょうが,何が間違ってい
るのでしょうか?よろしくお願いいたします.

#include <iostream>
using namespace std;

int main()
{
//今度は文字型変数
char c2;
char *p_c2;
c2='5';
p_c2=&c2;
cout << "value=" << c2 << "\n"; //これは値
cout << "address=(p_c2)" << p_c2 << "\n"; //これはアドレスのつもりだけど「フフフフ」

//2chに「自動変数のときだけ」と書いてあったので

static char c3;
char *p_c3;
c3='H';
p_c3=&c3;
cout << "value=" << c3 << "\n"; //これは値
cout << "address=" << p_c3 << "\n"; //これはアドレスのつもりだけど,値
cout << "address=(&c3)" << &c3 << "\n"; //これもアドレスのつもりだけど,値

return 0;
}
842デフォルトの名無しさん:2005/06/04(土) 17:09:29
アドレスは取れているが、それを文字列として表示しようとしている
843デフォルトの名無しさん:2005/06/04(土) 17:47:43
cout << reinterpret_cast<void*>(p_c2) << endl;
でいいんかな?
844デフォルトの名無しさん:2005/06/04(土) 17:48:18
>>841
operator << に char const* を渡すと "" によるものと同じく、
0 で終わる文字列を表示させることになる。
アドレスを表示させたければ、 static_cast<void*>(&c2) とすればいいだろう。
845初心者:2005/06/04(土) 18:01:10
ありがとうございました.うまくいきました.整数型と同じようにアドレスが取れていることがわかりましたので,843, 844が書いてらっしゃる 「<<」 の機能や,static_cast<void*>,reinterpret_cast<void*>を勉強してみます.
846デフォルトの名無しさん:2005/06/04(土) 19:59:13
>>831
フリーかどうかは知らんが公式のリファレンスコードがあるぞ?
http://www.ece.uvic.ca/~mdadams/jasper/
847デフォルトの名無しさん:2005/06/04(土) 20:21:43
#include<stdio.h>

int main(int argc, char *argv[]) // 引数付きmain()の基本的な形
{
……云々といったプログラムを組みたいのですが、VCでのパラメーターの入力が出来ません。
Unix環境だと出来るのですが、家だとこういったもの出来ないのでしょうか?
848デフォルトの名無しさん:2005/06/04(土) 20:22:47
>>847 できませんって、どうなるんだよ?
849デフォルトの名無しさん:2005/06/04(土) 20:24:27
>>848
F5でしか実行方法がわからないのです。
F5をおすとパラメータを入力していないので、パラメータ入力無しの実行結果になってしまいます。
850デフォルトの名無しさん:2005/06/04(土) 20:25:38
> VCでのパラメーターの入力が出来ません

??何がどうできなかったんだ??

君が作ろうとしてるのはVC++では「Win32コンソールアプリケーション」と呼ばれる
種類のプログラムで、いわゆるDOS窓上で実行される。
DOS窓開いてプロンプトに君の作ったプログラムの名前と引数入力すれば、普通に
受け付けてもらえるよ。

まあ、シェルが違うから、引用符やワイルドカードの扱いだのが
UNIXとは違うがね。
851デフォルトの名無しさん:2005/06/04(土) 20:26:44
VC++上のデバッガから実行しようとしてるのか。
なら、デバッグオプションで引数を設定するんだね

VC++のバージョンにもよるが、プロジェクトの設定にデバッグという
項目があって、そこで引数を指定できるはずだ
852デフォルトの名無しさん:2005/06/04(土) 20:28:15
>>849
use cmd.exe or command.com
853デフォルトの名無しさん:2005/06/04(土) 20:28:19
>>850
>>851
丁寧かつ即レスありがとうございます。
うまく入力させることが出来ました、精進します。
854デフォルトの名無しさん:2005/06/04(土) 21:08:11
数列をソートするプログラムなんですが
ソートするときに入れ替える回数が0回のままなんです
どこがおかしいのでしょうか?

http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/499.txt
855デフォルトの名無しさん:2005/06/04(土) 21:15:48
>>854
> count++;
アドレスをインクリメントしちゃダメだろう。
(*count)++;
856デフォルトの名無しさん:2005/06/04(土) 21:16:59
>>854
× count++
○ (*count)++
857デフォルトの名無しさん:2005/06/04(土) 21:22:51
class ca {
public:
void hoge_a( void ) { cout << "test1" ; }
} ;

class cb : public ca {
public:
void hoge_b( void ) { cout << "test2" ; }
} ;

class cc : public cb {
public:
void hoge_c( void ) { cout << "test3" ; }
} ;


int main( void )
{
ca a ;
cb b ;
cc c ;
a.hoge_a() ;
b.hoge_a() ;
c.hoge_a() ;// ここで使わせたくない。
}

c.hoge_a() を使わせたくないのですが、こういったとき、
どう継承させればよいのでしょうか?
858854:2005/06/04(土) 21:36:47
>>855
>>856
即レスありがとうございます
勉強し直します(;´Д`)
859デフォルトの名無しさん:2005/06/04(土) 21:45:26
>>857
class cc : public cb {
public:
void hoge_c(){ cout << "test3";}
private:
using ca::hoge_a;
};
860デフォルトの名無しさん:2005/06/04(土) 22:01:32
>>859
なるほど、ありがとうございました!
861デフォルトの名無しさん:2005/06/04(土) 22:27:55
class cc : private cb じゃだめなのかな?
862デフォルトの名無しさん:2005/06/04(土) 22:29:26
ttp://cham.ne.jp/piro/p_cp.html
ここに、動的3次元配列のサンプルがのっていて、コンパイルしたら、
warning C4786 とか、識別子が '255' 文字に切り捨てられました
など、ものすごい数の警告が出るのですが、そもそもこのやり方は普通なのでしょうか?
vector<vector<vector<int> > > の、> > の間にスペースが無きゃいけない、
あたり、なんだか強引な気がします。皆さんのご意見を伺いたいです。
863デフォルトの名無しさん:2005/06/04(土) 22:46:40
>>862
> vector<vector<vector<int> > > の、> > の間にスペースが無きゃいけない、
> あたり、なんだか強引な気がします。
とりあえず、これは動的3次元配列云々とはまったく別の問題。
「最後の文字が '>' である型を、最後のテンプレートパラメータとして用いること」は
強引でも何でもなく、そのことをスペース無しで判別できない言語仕様のほうに問題がある。
864デフォルトの名無しさん:2005/06/04(土) 22:55:41
>>847=>>849=>>853
激しく遅レスで悪いが、
↓のようなスレもあるので併せて活用すべし

★初心者にVisual C++を教えるスレ★ Part19
http://pc8.2ch.net/test/read.cgi/tech/1116209988/
865デフォルトの名無しさん:2005/06/04(土) 22:59:09
つっこみが入らなかったあたり、やり方としては普通なのですね。
けれど、そもそもどうやって使えばいいのでしょうか? 

vector<vector<char> > obj;

obj.resize(5) ;
for ( size_t i = 0 ; obj.size() ; i++ )
obj[i].resize(5) ;

for ( int j = 0 ; j < 5 ; j++ ) {
if ( j != 4 )
obj[j].push_back(4 + j) ;
else
obj[j].push_back('\0') ;
}
cout << obj[0] << endl ;

とりあえず、テストでやってみました。obj[5][5] が確保されてて、
obj[0][0] obj[0][1] obj[0][2] ... と、適当な数字をいれて、文字列
にしたつもりですが、表示もうまくいきません。
866デフォルトの名無しさん:2005/06/04(土) 23:04:06
>>862
warningは#pragma使うなり、
「> >の」スペースについては適宜typedefするなりして対処
867デフォルトの名無しさん:2005/06/04(土) 23:05:19
>>862=>>865
warning 4786はSTL使うと必ず出る警告
pragma使うなどしてコンパイラにwarning 4786を出さないようにさせるか、自分で無視しなされ
868デフォルトの名無しさん:2005/06/04(土) 23:11:03
>>865
とりあえずオマエは普通の配列とvectorを混同しすぎ
そのobj[0]で返されるのはvector全体であって配列内のデータじゃない
それをcoutしてもオマエが思ってるような表示がされるわけないだろ
869デフォルトの名無しさん:2005/06/04(土) 23:15:40
>>866
なんか色々間違ってるぞ。

まず、cout << [vector<t>型] なんてやっても、全要素が一気に出力されたりはしないぞ。
要素を一つ一つ出力しなきゃ。

それから、char型の変数に「適当な数字」を入れたら、そりゃ表示されないこともあるだろうよ。
文字として出力可能な値じゃなきゃ。

あと、push_backってのは要素数を一つ増やしてそこに引数のコピーを代入する関数だから、
そのコードだとobj[j][0]〜obj[j][4]には何も代入していないことになる。
その代わりにobj[j][5]〜obj[j][9]までが新たに作られ、そこに各値が代入されている。
resize(5)がcapacity(5)なら意図した通りに動くがね。
870869:2005/06/04(土) 23:16:18
すまん。わかるとは思うが、>>866宛じゃなくて>>865宛な。
871デフォルトの名無しさん:2005/06/04(土) 23:26:54
>>863,>>866-870
レスありがとうございました。配列とvector は意味合い的には違うのですか。
C++はまだ僕には敷居が高いようです・・・。
警告の方は #pragma warning( disable : 4786 ) を付けたら消えてくれました。
STL使うと必ずでる警告だったのですね、安心です。
大変色々と、勉強になりました。
872デフォルトの名無しさん:2005/06/04(土) 23:34:43
>>871
普通の配列はただの変数、vectorはクラス
873デフォルトの名無しさん:2005/06/04(土) 23:41:46
>>872 頼むから、初心者スレで偉そうにデタラメを言うのはやめてくれ。
874デフォルトの名無しさん:2005/06/04(土) 23:43:54
ここ二週間くらいでこのスレの回答者のレベルが著しく落ちた件について。
875デフォルトの名無しさん:2005/06/04(土) 23:44:53
落ちたか?
元から低いの間違いだろ
876デフォルトの名無しさん:2005/06/04(土) 23:51:52
まあ気のせいかも知れんね。
俺はこのスレの回答者のレベルが低いとは思っていないが。
877デフォルトの名無しさん:2005/06/05(日) 00:19:10
質問なのですがファイルを読み込むときにファイルのデータではなく
ファイルの属性や最新更新日時を読み込む方法はないでしょうか?
878デフォルトの名無しさん:2005/06/05(日) 00:22:51
>>877
stat とか fstat 使う。
879デフォルトの名無しさん:2005/06/05(日) 00:27:38
>>877
それ思いっきり環境依存。ファイルシステムの問題だから。
まあUNIXのシステムコールであるstat()やfstat()はWindowsのコンパイラでも
サポートされてたりはするが。
880877:2005/06/05(日) 00:28:15
>>878
おぉ!こんな関数があったのですね!
早速試してみます。ありがとうございました!
881デフォルトの名無しさん:2005/06/05(日) 01:12:53
>>879
【初心者歓迎】C/C++室 Ver.17【環境依存OK】
882デフォルトの名無しさん:2005/06/05(日) 01:14:13
>>881
だから?
883デフォルトの名無しさん:2005/06/05(日) 01:16:15
思いっきり環境依存、って
884デフォルトの名無しさん:2005/06/05(日) 01:25:24
質問者が自分の環境を書いていないことから
「自分の質問の内容が環境依存であることがわかってない」と判断して
それが環境依存であることをまず明確にし、
ついでにstat()やfstat()がUNIX系でもWinでも使えることまで教えてあげてるのが
>>879だろ?

それに対する>>881の反応がよくわからんのよ。
885デフォルトの名無しさん:2005/06/05(日) 01:27:38
そんなことどうでもいいから次の質問どうぞ
886879:2005/06/05(日) 01:45:34
>>884
そこまで言われるとちと照れるぞよ
887デフォルトの名無しさん:2005/06/05(日) 01:56:22
#include <iostream>
#include <string>

int main()
{
// inserts str2 into str1 at locations 11 and then 20
string str1 = "Judges live on income";
string str2 = " fixed";
str1.insert(11, str2);
str1.insert(20, str2);
cout << str1 << endl;
// add ! to the end
str1.push_back('!');
cout << str1 << endl << endl;
}
//error C2039: 'push_back' :
//'basic_string<char,struct std::char_traits<char>,class std::allocator<char> >' のメンバではありません。

見かけたサンプルを持ってきたのですが、コンパイルが通りません。なにか間違っているのでしょうか?
コンパイラはVC6.0です。
str1.push_back('!'); が通らないのは、コンパイラが古いからなのでしょうか?
結構ググったんですけど、一向に答えが見つからないっす・・・
888888:2005/06/05(日) 02:01:51
 
889デフォルトの名無しさん:2005/06/05(日) 02:03:53
いまさらVC++6.0使ってるのが悪い。が、VC++6.0でもSTLportいれればいけた気もするが。素直にVC++のバージョンあげとけ
890デフォルトの名無しさん:2005/06/05(日) 02:05:25
stringにpush_backってあったっけ?
891デフォルトの名無しさん:2005/06/05(日) 02:09:07
std::string str1 = "Judges live on income";
std::string str2 = " fixed";

string が別のやつと思われてるとか
892デフォルトの名無しさん:2005/06/05(日) 02:11:59
string に push_back はある。
893890:2005/06/05(日) 02:12:20
やっぱ無いわ
894デフォルトの名無しさん:2005/06/05(日) 02:12:50
最新のPlatformSDKのlibはVC++6のリンカではリンクできなくなったらしいね
VS.NET 2003付属のやつとかだとまだいけるけど

まあいい加減寿命だよなあVC++6も
895デフォルトの名無しさん:2005/06/05(日) 02:14:00
>>889
察するに、やはり新しいのには push_back が入っているっぽいですね
時期がくるまで、str1+='!'; で凌ごうと思います。
レスありがとうでした
896デフォルトの名無しさん:2005/06/05(日) 02:21:17
標準規格見たけどbasic_stringにはpush_backメンバがあるらしいぞ。
21.3
897デフォルトの名無しさん:2005/06/05(日) 02:34:55
>896
VC++6.0
898デフォルトの名無しさん:2005/06/05(日) 03:14:38
cygwin を使ってgccコンパイルしようとすると
$ gcc test1.c
/usr/lib/gcc-lib/i686-pc-cygwin/3.3.3/../../../../i686-pc-cygwin/bin/ld: cannot
find -luser32
collect2: ld returned 1 exit status
というエラーがでます。
同じような過去スレを拝見してlibuser32.aを用意すればとアドバイスされてたのですが
自分にはそれさえよくわかりません誰か詳しく教えて下さい。
899デフォルトの名無しさん:2005/06/05(日) 03:16:07
検索して libuser32.a があるか
900デフォルトの名無しさん:2005/06/05(日) 04:16:30
おまいはcygwin使う前に学ばなければならない事がたくさんある気がする
901デフォルトの名無しさん:2005/06/05(日) 04:47:40
class outer {
 private:
 void outer_function();

 class inner {
  void inner_function(void) {
   outer_function(); // エラー
  }
 };
};

このようなソースで、入れ子のクラスからprivateの外側の関数を呼び出したいのですが
他所では、friendを用いて外側の変数を呼び出すサンプルソースがよくありますが
関数を呼び出そうとなると、どうやってもうまくいきません。
解決方法がありましたら、どなたか宜しくお願いします。

一応、環境はvc7です。
902デフォルトの名無しさん:2005/06/05(日) 05:05:25
>>898

1. まず下記ディレクトリでlibuser32.aを探す。
/lib/w32api
2. 存在しなければCygwinインストール時に必要物チェックし忘れてないか調べる
3. 存在すれば下記コマンドを試す。
gcc test1.c -I/usr/include/w32api -L/lib/w32api -luser32

 ていうかuser32使うようなソースって>>898のコマンドだけでリンカまで行く??
903デフォルトの名無しさん:2005/06/05(日) 05:05:26
>>901
そのouter_functionはどのインスタンスに対して呼んでる?
C++のインナークラスはjavaでいうstaticなインナークラスになります。
904デフォルトの名無しさん:2005/06/05(日) 05:30:16
>>903
「privateの外側の関数」、という表現が誤解を招いてしまったようですね。

単に、クラスinnerから、クラスouterにあるouter_functionを呼び出したい、ということです。
的外れでしたらごめんなさい。
905デフォルトの名無しさん:2005/06/05(日) 05:53:22
>>904
とりあえず>>901ではouter_function()の呼び出しに必要なouterのインスタンスが存在しないからエラーで当然。
outer_function()をstaticにするか、どこかでouterのインスタンスを与える必要がある。
906903:2005/06/05(日) 06:32:27
誤解はしてないと思う。結論から言えばこう。

class inner {
  outer* out;

  void inner_function(void) {
   out->outer_function();
  }
907デフォルトの名無しさん:2005/06/05(日) 06:57:00
もしスレ違いだったらごめんなさい。

intel c++ compiler for linux non commercialのtar.gzファイルを解凍すると
rpmファイルがいくつか出てきますが、この内の
intel-icc_ide8-8.1-028.i386.rpm
intel-icc8-8.1-028.i386.rpm
の二つは、HDDの形式がIDEだったら前者を選ぶべきなんでしょうか?
それともここで言うIDEって総合開発環境の事ですか?
908デフォルトの名無しさん:2005/06/05(日) 11:19:02
>>905,906
関数名とその中身を書いたものに対しては呼べなくて
実体が無いと駄目ということですね。そしてその実体のことを
インスタンスと言う、でしょうか。

とにかく勉強になりました、ありがとうございます。
自分のコード内でも>>906で示して頂いたソースで解決できました。
909デフォルトの名無しさん:2005/06/05(日) 12:00:54
>>907
普通に考えて、HDDインターフェースとコンパイラが関係あるとは思えないが。
910デフォルトの名無しさん:2005/06/05(日) 17:19:11
タブで区切られたテキストを抽出するプログラム作ってみたのですが、
どうにもうまいやり方とは思えません。
どのようにすれば、もっと良いものになるか、ご指導お願いします。

http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/502.txt
911デフォルトの名無しさん:2005/06/05(日) 17:38:47
>>910
うまいどうかは分からないけれども。C++でわざわざレガシーC文字列を
持ち出す意図が分からないから、とりあえずstd::stringに読み込んでる。
#include <fstream>
#include <iostream>
#include <sstream>
#include <string>

int main()
{
    std::ifstream in("test.txt");
    std::string line;
    while (std::getline(in, line))
    {
        if (!line.empty())
        {
            std::istringstream temp(line);
            int num;
            std::string mes1, mes2;
            temp >> num;
            temp.get(); // '\t'消費
            std::getline(temp, mes1, '\t');
            std::getline(temp, mes2, '\t');
            std::cout << num << ':' << mes1 << ':' << mes2 << std::endl;
        }
    }
    return 0;
}
912デフォルトの名無しさん:2005/06/05(日) 17:57:57
>>910
そういうクラスを使うのがはやくね?
913デフォルトの名無しさん:2005/06/05(日) 18:15:51
>>911
お手本のプログラムを理解するのに、多少時間がかかってしまいました・・・
レスが遅れて申し訳ないです。
>>910 のプログラムでつっこみどころが多いかと思いますが、それはただ単に
知っている範囲で強引に作ったからです。
しかし、ずいぶんすっきり出来るものなのですね。ご教示ありがとうございました。
914898:2005/06/05(日) 18:39:00
902さん、899さん、900さんありがとうございました。
なんとかコンパイルできるようになりました。
特に902さん、どもでした。
915デフォルトの名無しさん:2005/06/05(日) 19:28:46
基本的な事なんだと思うんですけど教えてください。
char c=25;
cout<<c;
ってやると文字で25に対応するのが出力されますよね?
そうじゃなくてこのときの出力で25を出すにはどうしたらいいですか?

Cなら
printf("%d",c);
ってやれば出せるようなのをcoutを使って出せるのか?
ってことなんですけど、
どうやって調べればいいのかわからないので教えてください。
916デフォルトの名無しさん:2005/06/05(日) 19:33:34
char c[3];
sprintf(c, "%d", 25);
cout << c;
917デフォルトの名無しさん:2005/06/05(日) 19:44:30
>>915
std::cout << static_cast<int>(c);
918デフォルトの名無しさん:2005/06/05(日) 19:47:56
>>917
できました。
ありがとうございました。
919デフォルトの名無しさん:2005/06/05(日) 21:27:15
cout<<(int)c;
で行けなかったっけ?
920デフォルトの名無しさん:2005/06/05(日) 21:30:51
>>919
何その混在コード
921デフォルトの名無しさん:2005/06/05(日) 21:34:23
>>920
おや、、よくわからないんですが、こういうのはイクナイん?
922デフォルトの名無しさん:2005/06/05(日) 21:38:31
>>921
C++の入門書とか読んだ事あるか?
std::は要らないけど、static_cast<int>はC++形式のキャストだぞ。
923デフォルトの名無しさん:2005/06/05(日) 21:38:50
>>921
C++ではC++のキャスト使え。
ということで>>917
924デフォルトの名無しさん:2005/06/05(日) 21:40:33
え〜、なんで〜

cout << static_cast<int>(c);

より

cout << (int)c;

の方が簡潔でいいじゃん。
925デフォルトの名無しさん:2005/06/05(日) 21:41:24
>>922-923
なるほど。C++はお勉強途中なので、
独自のキャストがあるとは知りませんでした。
どうもありがとう。

あと、>>915さん、嘘書いちゃってごめんねー。
926デフォルトの名無しさん:2005/06/05(日) 21:49:17
>>924
目立つようにわざと長ったらしくなっている。
927デフォルトの名無しさん:2005/06/05(日) 21:56:23
質問させてください。
テキストファイルの中身をメモリ上に展開して、
あらかじめ確保している文字列とチェックする関数を作りたいんですが
#メモリに展開・ファイル読み込みはじめてやるもので。

以下のようかんじで考えてるんですが、不備やもっと良いやり方があれば
ご教授願いたいです。

今、ちょっとパソコンに環境なくて試せていないので
(明日には試せそうですが)
申し訳ないのですがご教授ください。


void main(){
FILE *fp;
char *s;
s=(char *)malloc(256);

if ((fp = fopen("C:\\smpl.txt", "r")) == NULL) {
printf("file open error!!\n");
exit(1);
}

       fgets(s, 256, fp)== NULL
fclose(fp);/

/*ここで、strcmpあたりで、あらかじめある文字列を、チェックする予定です。*/
}
928デフォルトの名無しさん:2005/06/05(日) 22:17:03
すんませんが、質問させて下さい。
Windowsでウインドウの内部座標を取ろうとしてるんですが
GetWindowRect(hWnd,&rect);
でrectにWindowの座標を代入出来ますよね?
でもタイトルバーなどを含んだ外側なのですが
これをタイトルバーなど含まない完全な内側の座標を取得するには何か足りないのでしょうか?
929デフォルトの名無しさん:2005/06/05(日) 22:21:39
>>928
そういうときはMSDNでGetWindowRectを調べるんだ。
関連するAPIが見つかる場合があるぞ。
ttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowfunctions/getwindowrect.asp
930デフォルトの名無しさん:2005/06/05(日) 22:23:33
で、↓なスレがあることも知っておくといいぞ。
Win32API質問箱 Build32
http://pc8.2ch.net/test/read.cgi/tech/1117271829/
931デフォルトの名無しさん:2005/06/05(日) 22:27:22
そしてステータスバーまでは考慮してくれないことに涙せよ
932デフォルトの名無しさん:2005/06/05(日) 22:32:46
>>927
その「テキストファイル」の中身は1行しかなくてしかも255byte以下と
決まってるのか?そうでないと対応できないコードになってるが。

もしそうなら、わざわざmalloc()とか使う必要なし。ただの配列に読み込めばいい。

それと、
fgets(s, 256, fp)== NULL
は意味不明。
933デフォルトの名無しさん:2005/06/05(日) 22:37:45
>>919-925
とりあえず>>915は"Cで"と言っておるわけだが
934デフォルトの名無しさん:2005/06/05(日) 22:48:06
>>933
おれのモニタには「Cなら」と写っている。
935927:2005/06/05(日) 22:52:00
>>932
>その「テキストファイル」の中身は1行しかなくてしかも255byte以下と
>決まってるのか?そうでないと対応できないコードになってるが。

改行コードがあってもできるほうが良いですが、これではだめですか。。。
なにがいけないのでしょうか?

ファイルの大きさ分だけ動的に確保したかったのですが、わからず
255byte としました。

>fgets(s, 256, fp)== NULL
'==NULL'部分は間違えですね。fgets(s, 256, fp)が正しいです。
これで256byte分の読み込み仕様とおもってました。
936デフォルトの名無しさん:2005/06/05(日) 22:54:38
>Cなら
>printf("%d",c);
>ってやれば出せるようなのをcoutを使って出せるのか?

cout をつかって出せばよさそうなので C++ ではないかと。


あとさ、質問は

>どうやって調べればいいのかわからないので教えてください。

ってところだから誰もマトモに答えてないんだよね。
937デフォルトの名無しさん:2005/06/05(日) 23:00:39
>>933
釣りだよな?
938デフォルトの名無しさん:2005/06/05(日) 23:09:05
WindowsだとUNIX形式の改行が変でファイルサイズとメモリに実際に読み込んだサイズが異なるみたい。
あとファイル大きいとメモリたんなくなる。
int main(){
FILE *fp;
char *s;
size_t siz;
if((fp=fopen("./sample.txt","r"))==NULL)
exit(1);
// -------- ファイルのサイズを得る
fseek(fp,0,SEEK_END);
if((siz=ftell(fp))<0)
goto error1;
fseek(fp,0,SEEK_SET);
// -------- サイズを確保
if((s=(char*)malloc(siz+1))==NULL)
goto error1;
// -------- 読み込む
if((siz=fread(s,sizeof(char),siz,fp))<0)
goto error2;
s[siz]='\0';
fclose(fp);
printf("%s",s);
//... 
// -------- 後始末
free(s);
return 0; //成功
error2:
free(s);
error1:
fclose(fp);
exit(1);
}
939デフォルトの名無しさん:2005/06/05(日) 23:11:46
>>936
つまり俺は魚が欲しいんじゃなく、魚の釣り方を教えて欲しい、と言っているのか?
だとしたらあっぱれだな。見所がある。が、ちがうんじゃないカナ?
940デフォルトの名無しさん:2005/06/05(日) 23:14:44
windowsでは

fopen("./sample.txt","r")

"rb"だろ、ファイルは
941デフォルトの名無しさん:2005/06/05(日) 23:27:44
おいおい初心者ばっかりだな

と思ったら初心者スレでしたよ
942デフォルトの名無しさん:2005/06/05(日) 23:28:53
すまんすまんうろ覚えで、はじめは
fopen("./thxxx0.cpp","br") <- "rb" でなく
ってやってて、コンパイルは通ったがファイルが開けなかったん…
で、悩んだあげく送信。

orz
943デフォルトの名無しさん:2005/06/05(日) 23:29:16
>>938
改行コードが違うのは常識な。WindowsではCR+LF、UNIXではLF。

で、テキストモードでファイルを開いた場合(fopenで"b"を指定しなければ
テキストモードになる)は、UNIX風にファイルを\nで終端された
行の集まりに見せるために、Cランタイム側で細工をしている。

そういう事情もあって、テキストモードでのfseek()は、ftell()で得た
ポイントへの移動しかサポートされない。
944927:2005/06/05(日) 23:44:14
>>938-943

早急におしえていただき、ありがとうございました。
fseek()は、ftell()あたりは、まだちゃんと理解できていないので
ググッて勉強してきます。
945928:2005/06/05(日) 23:46:25
RECT rect;
GetClientRect(winsys->hWnd,&rect);
POINT point;
ClientToScreen(winsys->hWnd,&point);

rect.left = point.x;
rect.right += point.x;
rect.top = point.y;
rect.bottom += point.y;

rectに内部のスクリーン座標を入れようとしてみたのですが
これでは何故か上手く座標が設定されないんですがどうすれば良いでしょうか?
946デフォルトの名無しさん:2005/06/05(日) 23:47:55
>POINT point;
>ClientToScreen(winsys->hWnd,&point);

何を期待してるんだ?
947デフォルトの名無しさん:2005/06/05(日) 23:50:48
RECT rect

POINT point
は違うだろ
948デフォルトの名無しさん:2005/06/05(日) 23:51:42
>>945
ClientToScreenにもそのまま&rectを渡せ。
949デフォルトの名無しさん:2005/06/05(日) 23:54:07
>>946
クライアント座標をスクリーン座標に変換したかったのかと思われる。
winsysにシステムを色々と入れてるんだろうと予想して…
こういう事をしたかったんじゃないか?

rectでclientサイズ取得してpointでclientのscreen座標を求める。
それをrectに移してサイズ取得したのを代入すればclient内部のscreen座標が出るとでも。

どう期待したらこう思うのか良く解らないが。
950デフォルトの名無しさん:2005/06/05(日) 23:58:04
>>948
それだと
'ClientToScreen' : RECTからPOINT変換不可
が出てくると思う。
なので
ClientToScreen(winsys->hWnd,(POINT)&rect);か?
RECTとPOINTは違うけどいけたと思う。
951デフォルトの名無しさん:2005/06/06(月) 00:00:11
>>950
RECTとPOINTはそれで無理。
漏れが知ってる事でマジレスするとそのまま&rectは渡せない。
スマソ。初心者なので答えは任せる。
952デフォルトの名無しさん:2005/06/06(月) 00:07:55
>>945
マジレスするとPOINTの宣言後にPOINTの初期化がされてないから。
POINT point = {0,0};
で一応上手くいく。

更新して立ってなかったら次スレ立ててくるわ。
953デフォルトの名無しさん:2005/06/06(月) 00:13:34
立てたけどこれで良かったかな?
次スレ
http://pc8.2ch.net/test/read.cgi/tech/1117984322/
954デフォルトの名無しさん:2005/06/06(月) 00:20:16
>>953
スレタイから環境依存OKを外したのは意味があるのか?
あと、 Ver が vol に変わってるのも意味がわからん。
955デフォルトの名無しさん:2005/06/06(月) 00:23:26
スマソ。単に環境依存OK文字忘れていたorz
今までvolと思っていて見直したらverだったんで凹む。
やっぱスレ立てたの間違いだったorzマジスマソ
956デフォルトの名無しさん:2005/06/06(月) 05:51:49
>>945
どっちかっつとWin32APIスレ行きな質問だな。
GetWindowRectとGetClientRectで自前計算できようが
957デフォルトの名無しさん:2005/06/06(月) 07:27:11
pointが未初期化。
pointにrectのleft,top入れるべし、、、ってどうせゼロだから0入れればいいけど。
んで、rectの4つすべてに足して平行移動しないと。
API以前の話だな
958デフォルトの名無しさん:2005/06/06(月) 14:49:21
age
959デフォルトの名無しさん:2005/06/06(月) 14:50:11
miss!
960デフォルトの名無しさん:2005/06/06(月) 19:50:47
ゲームの補助ツールを作っているのですが、
F1キーを押す、みたいな関数って無いんでしょうか。
調べてもキーが押されているかどうかを調べるようなのは色々あるようなのですが。
環境はVC++です。
961デフォルトの名無しさん:2005/06/06(月) 20:04:11
OS何よ?っても、ゲームって言うしたぶんWindowsじゃろうけど
962デフォルトの名無しさん:2005/06/06(月) 20:14:11
VC++って書いてあんだろ

SendMessageでメッセージをウィンドウに送ればいいかと
VK_F1だっけか
963960:2005/06/06(月) 20:15:26
>>961
すみません、書き忘れてました。
Windowsです。
964デフォルトの名無しさん:2005/06/06(月) 20:50:07
>>962
VC++でWindowsのアプリしか作れないのか?
965デフォルトの名無しさん:2005/06/06(月) 20:54:00
VC++はクロスコムパイラじゃないだろ
966デフォルトの名無しさん:2005/06/06(月) 21:00:49
967デフォルトの名無しさん:2005/06/06(月) 21:46:20
どれにしても結局Windows上で動く罠。
968デフォルトの名無しさん:2005/06/06(月) 21:49:08
CE用のはターゲットCPU幾つか選べまんねん。
969960:2005/06/06(月) 23:18:29
一応PostMessage(HWND_BROADCAST, WM_KEYDOWN, VK_F1, 0)
で思ったような動作はしたのですが、どうも遅い気がします。
何か遅くなるような原因とかあるんでしょうか…?
970877:2005/06/06(月) 23:34:10
C言語において個数も長さも未定の文字列を扱うために
char **name;
というのを使おうとしているのですがうまくいきません。
どうすればよいのでしょうか?

int main()
{
char *str1 = "aaaa";  //とりあえず2つ
char *str2 = "bbbb";
char **name;

for(i=0; *str1!='\0'; i++){
 name[0][i] = *str1;
 str1++;
}

for(i=0; *str2!='\0'; i++){
 name[1][i] = *str2;
 str2++;
}

実行するとメモリアクセスエラーが発生します。
971デフォルトの名無しさん:2005/06/06(月) 23:35:20
>>970 書き込む先のメモリを割り当てるとよい。
972デフォルトの名無しさん:2005/06/06(月) 23:55:36
>>971
メモリを割り当てるというのは
mallocを使うと言うことでよろしいのでしょうか?
973デフォルトの名無しさん:2005/06/06(月) 23:56:26
んだ
974972:2005/06/07(火) 00:00:17
なるほど、mallocを調べてみてもう少しがんばってみます!
ありがとうございました。
975780:2005/06/07(火) 02:40:46
>>974
mallocしたらちゃんとfreeしとけよ。

って漏れこんな指摘ばっか。最近これでひどい目にあいまつた。
976デフォルトの名無しさん:2005/06/07(火) 05:33:59
>>969
そりゃBROADCASTしてりゃ重くなるわ
977デフォルトの名無しさん:2005/06/07(火) 05:35:51
>>969
ネットワークのMACアドレス問い合わせパケットじゃねぇんだからよ、
ある特定のアプリの窓にメッセージ送るのにいちいちBROADCASTするなんてただの阿呆だぞ。
目的のアプリの窓のハンドル取得して直接送れ
978960:2005/06/07(火) 15:54:35
>>977
ハンドルって毎回変わるやつですよね?
すみません、スキル足らずで取得の方法がわからなくて…。
979デフォルトの名無しさん:2005/06/07(火) 15:59:18
>>978
FindWindow()
980デフォルトの名無しさん:2005/06/07(火) 17:12:39
>>978
それはプログラムのスキルが足らないんじゃなくて検索のスキルが足らないな
おまえさんに必要なのはC/C++のことよりもWin32APIのことだし、
今後わからないならWin32APIスレで聞くとよい
981デフォルトの名無しさん:2005/06/07(火) 17:28:42
こりゃSendInputやらkeybd_eventの存在も知らなそうなだ
982デフォルトの名無しさん:2005/06/07(火) 17:35:01
単一のWindowにKEYDOWN送るのにkeybd_eventすることも無いと思うが
983デフォルトの名無しさん:2005/06/07(火) 17:46:36
まあな
984デフォルトの名無しさん:2005/06/07(火) 19:32:29
演算子のオーバーロードの辺りで頭がこんがらがっちゃいました。
だれかこんな僕に優しくわかりやすく教えてください
985デフォルトの名無しさん:2005/06/07(火) 19:44:00
>>984
どんな風にわからないのか、優しくわかりやすく説明してくれ。
986デフォルトの名無しさん:2005/06/07(火) 20:09:30
なんもかんもわからんで、どないもこないもなりませんわ
987デフォルトの名無しさん:2005/06/07(火) 21:16:12
やめちまえ
988デフォルトの名無しさん:2005/06/07(火) 21:23:26
すみやかにその企画を終了し、別の企画に取り組みたまえ
989デフォルトの名無しさん:2005/06/07(火) 21:25:34
operator T( ){
throw ぬるーり;
}
990デフォルトの名無しさん:2005/06/07(火) 21:41:18
i+1 == E[x].start && j+1 == E[x].end
のときに配列に1を代入したいのですが
なぜか0が代入されてしまいます。
どこが間違ってるのか教えてください。
さっぱりわかんねorz

http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/510.txt
991デフォルトの名無しさん:2005/06/07(火) 21:49:32
>>990
x == 0 のとき、a[0][1] は 1 になるが、
x == 1 のとき、a[0][1] はどうなる?
992デフォルトの名無しさん:2005/06/07(火) 22:04:02
>>989
throwするんかい
993デフォルトの名無しさん:2005/06/08(水) 01:07:32
>>990
>/*構造体型struct edgeの宣言*/
言われんでも見りゃわかるわw
「何をしてるのか」じゃなくて「何をしたいのか」をコメントしような

この場合なんのつもり(何に使うつもり)で構造体edgeを宣言
したのかを書いてくれ

ちなみにxを使ったループが外にあるせいで
毎回結果が上書きされてx==9の場合の結果しかaに入ってないが
それが意図した操作なのか?根本から間違ってるように見える
994デフォルトの名無しさん:2005/06/08(水) 01:20:19
ちと、文字列の半角を全部全角に切り替える処理を行いたいんですが
VBのstrtocnvみたいな便利な関数は無いですか?
995デフォルトの名無しさん:2005/06/08(水) 01:33:15
LcMapString()
996デフォルトの名無しさん
>>967
今だと Xbox360 (PowerPC) とか。