【初心者歓迎】C/C++室 Ver.17【環境依存OK】
急速にスレの質が低下してまいりました
もうかよ!
4 :
デフォルトの名無しさん:2005/05/13(金) 14:00:10
Cよ!ありがとう!そして
さよなら…
return 0;
前スレ続きの質問なんですが、
関数の引数に定数を渡し、その関数内で常に同じ値になるときは、
どうなりますか
Func( 256, 4 );
void Func(int a, int b)
{
float fa = a / 256;
float fb = b / 256;
return fa + fb;
}
ちょっと、極端ですけど。
voidですが?
>>6 オプチマイズをOFFにしてればどもならん
ONならコンパイラによる
訂正
return fa+fb; -> g_val = fa+fb;
でもobj吐いた段階じゃよそから呼ばれ無いことがわからんから
やっぱどもならんか
>>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;
}
と同じコードになることは十分有り得る。
12 :
11:2005/05/13(金) 16:11:31
おっと、遅かったか。
g_val = fa + fb;
となると、inlineをつけてもinline化されることは期待できなくなってくるね。
13 :
6:2005/05/13(金) 16:17:24
勉強になりました
>>11 絶対ありえない。
あるとしたらreturn 1.;
あ、ほんとだ、整数演算になってら。
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);
}
・・・・・動かないんですよね;何が違うかわかりません?
それと、係数をファイルから読み込んで方程式を解かせるには
どうしたらいいんでしょうか?
プログラムって難しくって・・・、頭あんまり良くないからなぁ・・・
アドバイスだけでもお願いします。
>>16 '{' と '}' の関係を見直してみ。
>>16 動かないというのは、何がどう動かないのか
>>16 係数をファイルから云々はfopen使っとけ。
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
>>16 > 何が違うかわかりません?
1.質問の仕方
2.勉強の順序
3.質問に至るまでの調査の仕方・時間
4.あなたの考え方
>>20 参照は初期化したあとには参照先を変えられない。
>>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のままポインタとして使えないし、それ以前にメイン
関数でポインタを作成して代入しなきゃならないのか?スレ違いかも知れませ
んがよろしくお願いします。
C言語で質問です。
メモリの任意のアドレスにある値を取り出したいんですが、どうしたらいいのでしょう?
具体的には
0x75DCD3というアドレスにある値を取り出して変数に渡したいんです。
>>26 type val = *(type *)0x75dcd3
>>27 どうもありがとうございました。ちょっと試してみます
29 :
デフォルトの名無しさん:2005/05/13(金) 23:01:33
VisualStudio.Net 2003のVC++で開発しています。
アプリケーション間で文字列を送受信する方法で、
SendMessage+COPYDATA以外の方法はあるのでしょうか?
SendMessageで送受信自体は実現できたのですが、
受信側の処理終了まで待つのが引っかかっています。
PostMessageの様に、送信側が待機状態にならずに
文字列の送信も行えるのが理想なのですが
DDE、OLE、パイプ、クリップボード、メールスロット、メモリマップトファイル・・・
31 :
デフォルトの名無しさん:2005/05/13(金) 23:29:20
むう、やっぱりそういう方法になりますか。
現状では、15桁数字を分割してPostMessage送信していたのですが
今回15桁数字*2の送信が必要になりまして。
文字列とは言っても数字のみで、あとほんの少しの桁数だから
PostMessageみたいな簡易的な方法があればよかったのですが・・・
ありがとうございました
>>31 >>30の何が気に入らない?
ソケット通信を始め、プロセス間通信の方法は多々あるぞ。
親切すぎるのも考え物か…?
最新のC++の規格に対応した入門書を教えてください。(規格書以外でおねがいします)
36 :
35:2005/05/14(土) 06:08:28
理由は柴田望洋のプログラミング講義C++を買ったのですが、
どうも書き方が古いということなので、古い書きかたが身につかないうちに、
最新のもので学んでおきたいのです
38 :
デフォルトの名無しさん:2005/05/14(土) 21:18:34
グローバルで、クラスhogeへのポインタ型のvectorを作って、
どっかの関数内でhogeのインスタンスをnewで生成してポインタをvectorに入れたとき、
その関数を出て、別の関数内でvectorのポインタからインスタンスを使ったりしたら
まずい事になりますか?
関数内で宣言された普通の変数とかは、そこを出ると消えちゃうんですよね?
>>38 言っている意味がよくわからないから、短いコード例を示してくれないか?
>>38 newで作成したインスタンスは、ローカルとかグローバルに関係ない。以上。
>>38 何の問題もない。
#include <vector>
class hoge {};
void sub();
std::vector<hoge*> phoge;
int main()
{
sub();
delete phoge[0];
}
void sub()
{
phoge.push_back(new hoge);
}
>>41 はい。わざわざすいません。ありがとうございました。
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());
>>44 delete it;
は
delete *it;
じゃね?
部分消去は以下のように
delete p[i]; // i < p.size()
p[i]=0;
p.erase(remove(p.begin(),p.end(),static_cast<hoge*>(0)),p.end());
48 :
38:2005/05/14(土) 22:26:42
>>44-47 後で多分必要になると思うので参考にします。ありがとうございます。
ところでまた質問なんですが、、
「動物クラス」を継承した「犬クラス」と「猫クラス」、
そして、「動物クラスへのポインタ型」のvectorがあるとします。
適当な順番で何個かの犬クラスや猫クラスをnewで生成し、
動物クラスへのポインタ型変数に入れ、vectorに挿入していきます。
このあと、vectorから適当な要素を取り出して、
そのポインタが犬のインスタンスを指しているのか、
猫のインスタンスを指しているのかを判別するにはどういう方法があるでしょうか?
例えば識別の為のメンバ変数とかメソッドを作っておき、
1が帰ってきたら犬、2が帰ってきたら猫、のようにチェックしてもいいと思うのですが、
本来そのクラス自体が種類を表しているはずなのに、
内部に自分自身の種類の識別のためのメンバ変数を持たせるというのはなんだか気持ちが悪いです。
他にもう少しましな方法というのはないでしょうか。
こういったとき、どうやるのが普通でしょうか。
dynamic_cast
>>48 プログラムで判別すると、継承したクラスの種類が増えるにつれ、if文の
羅列になってしまい、好ましくない。だから普通は判別の必要がないように、
仮想関数にする。
51 :
38:2005/05/14(土) 23:21:22
>>49>>50 ある種類だけ取り出したいときにはどうすればよいのだろうと思って質問したのですが
dynamic_castというのがまさに探していたものという感じでした。
でもそれが必要になる事自体、設計がよくないみたいですね。見直してみます。
ありがとうございました。
>>51 dynamic_castが必ずしも悪いわけではなく、ダウンキャストが必須の場面では
使わざるを得ない。しかし継承関係を調べるのに使うのは、設計が間違っている
可能性があるって事を指摘しただけで、学習の過程でいろいろ試してみられる
のは全く問題ないですよ♪
typeof演算子
54 :
デフォルトの名無しさん:2005/05/14(土) 23:34:06
環境はWindowsXP。DOS窓で動くC言語プログラム。
テキストファイルに改ページを入れるにはどうすればいいですか?
昔のDOSだったら、
改ページコードを書き込んで、テキストファイルはプリンタへリダイレクト。
でよかったののですが、WindowsXPの場合、エスケープシーケンスが使えないので困っています。
よろしくお願いします。
56 :
デフォルトの名無しさん:2005/05/15(日) 00:23:20
ポインタは変数の開始位置アドレスを表しますが、
変数の終端位置アドレスを指定しなくてもその開始位置から何バイトまでがその変数なのか、
という事は勝手に判断してくれるのでしょうか。
例えば標準関数などに変数の開始位置アドレスを使うものがありますが終端位置を使っていません。
OS等がよろしくやってくれるんでしょうか?
>>57 そのために型情報を使う。或いは配列として扱うならナル文字などのSentinelを置く。
#尤も、後者の場合も型情報を使っているわけだが。
いずれにしても、この場合はOS云々は関係がない。
>>57 T* p があれば、 (char*)p + sizeof(T) でオブジェクトの占めているメモリの終端は得られる。
しかし、ほとんどの処理は「変数の終端位置」なんて考慮しない。
その「変数の終端位置」っていうのは何に使えると思うんだ?
>>57 sprintfやstrcatの事を言ってるのだと予想。
61 :
60:2005/05/15(日) 01:57:05
ということなら、
これらの関数は格納先のサイズを知る術は無いのでバッファオーバーランの危険がある。
62 :
57:2005/05/15(日) 01:57:22
レスありがとうございました。
>>59 メモリの読み取り開始位置と読み取り終了位置の判別をどうやっているのだろうという事でした。
>>62 やっぱり意味わからん。配列の先頭をポインタで渡すときの話か?
64 :
57:2005/05/15(日) 04:42:31
>>63 配列に限らずですが、先頭アドレスの情報だけではその変数は扱えないはずでは、と思ったのです。
変数の型から計算しているという事に納得しました。
以下のようなクラスで、aをx[0]への参照にしたいのですが、
a(x[0])の設定をnewでメモリを確保した後に、実行させるにはどうしたらよいのでしょうか?
class foo
{
public:
int &a;
int *x;
};
foo::foo() : a(x[0])
{
x = new int[10];
}
CのCGIで、
HTMLのフォームからPOSTメソッドで行われた標準入力は、
そのHTMLフォームの順番通りになっている事が保証されるのでしょうか?
例えば、題名・名前・本文という内容のデータを受け取った時、
標準入力には必ず題名・名前・本文という順番で格納されているのでしょうか。
>>65 foo::foo() : x(new int[10]), a(x[0])
{
}
>>65 >>67 メンバの初期化は宣言順だから、クラス定義も書き換えなきゃダメ
class foo
{
public:
int* x;
;int& a;
foo();
};
69 :
デフォルトの名無しさん:2005/05/15(日) 10:10:18
すいません、C++のiostreamのマニピュレーターを自作したいのですが
どこかのWebで解説されていませんか?
もしくはこの本に乗っているでもいいので教えてください。
マニピュレーターが関数である、という知識しかありません。
>>69 マニピュレータが関数である、ということがわかっていれば、
それ以上の解説なんか要らないことがほとんどなんで、たぶん無いだろうな。
>>69 「出力以外の何か」をするように<<演算子を定義するだけだが。
それから、マニピュレータは関数であるとは限らない。
ostream &(&)(ostream &)型に対してあらかじめ<<演算子が定義されているだけ。
#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]は*をつけるとエラーになります。
これは何故ですか?
>>73 > これをコンパイルしても「定数式が必要(main関数)」というエラーが出て通りません。
>何がダメなんでしょう?
古いCだと、配列の大きさは定数でなければならない。
#define SIZE 10
char s_in[SIZE] = "=";
とでもするべし。
>それと、testfunc内でsizeは*を使わないとエラーになるのに、s_in[i]は*をつけるとエラーになります。
>これは何故ですか?
s_in[i]は、*(s + i)と同じ意味を持つ。
>>74 ありがとうございます。
新しいCならば、変数でも可能なのでしょうか?
その行に来たときに動的に配列を作成してくれるということなのでしょうか?
レスありがとうございます。
以下のように修正したところ、「互換性のないポインタ変換」というエラーが出ました。
これは何故でしょうか?
#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;
}
75は私ではないです。
>>76 testfuncの仮引数で、
char *s_in[]
とあるけど、これは「char *の配列」を指定している。
一方mainではcharの配列(これはchar *に変換される)を渡している。
80 :
69:2005/05/15(日) 12:58:22
>>70-71 ありがとうございました。できました。
ostream& test ( ostream& out )
{
out << " " << setw(2) << setfill('0');
return out;
}
しかしどうやったらこういう知識を得られるのでしょうか?
ある日突然朝起きたら閃くわけじゃないよね?
いやそういう君はどうやって得たのさw
>>80 ・俺は「プログラミング言語C++第三版」で読んだ。
・「マニピュレータ c++」でググると9番目に出てくる。
・知識はなくとも、自分で<<を定義できることを知っていれば考え出せる。
struct test_t{} test;
std::ostream &operator<<(std::ostream &out, const test_t &)
{
out << " " << setw(2) << setfill('0');
return out;
}
83 :
69:2005/05/15(日) 13:13:34
>>81 (すでに転職して消えてしまった)先輩がちょろっと、「マニピュレーターは単なる関数だから」って言ってたのを覚えていたから。
いなくなって初めてわかる「できる先輩」のありがたさ。もっと教わっておくんだった。
>>82 Stroup先生の本は翻訳が読みづらい…
プログラマーには向いてないんですかね orz
>>83 "Stroustrup"な。翻訳が読みづらいと思うなら、原書を読むのはどうかね?
全然読めない罠
86 :
デフォルトの名無しさん:2005/05/15(日) 14:17:14
winsock使う簡単なプログラムの練習をしてるんですが、何をするにも
WSADATA wsadata;
WSAStartup(MAKEWORD(1,1),&wsadata);
が必要なのでしょうか?
wsadataなんて使わないプログラムなんですが、これがないとエラーになってしまいます。
88 :
デフォルトの名無しさん:2005/05/15(日) 14:26:31
>>87 あ、WSAstartupが必要らしいってことはわかるんです。
でも、wsadataなんて使わない構造体を宣言するのにどうも違和感が…。
>>88 要らないならローカルに定義してすぐ捨てればいいだろ。
90 :
デフォルトの名無しさん:2005/05/15(日) 14:34:56
>>89 やっぱり一回は必要なんですね。
どこかで初期化したら、他の関数ではもう意識しなくていいということですか。
ありがとうございましたー
>>90 あんたが必要なくてもライブラリが必要とするわけだ。
92 :
デフォルトの名無しさん:2005/05/15(日) 23:52:36
char m_hoge[256];
みたいな文字列のメンバに、コンストラクタの初期化リストで適当な文字を入れて
初期化したいときはどうやって書けばよいのでしょうか。
94 :
デフォルトの名無しさん:2005/05/16(月) 00:04:02
for( ; ; )
上記のようにすべて省略した場合、無限ループになるのでしょうか?
また、この省略は文法的に認められているのでしょうか?
for( i=0 ; ;i++ )
また上記のようにエンドのみを終了した場合も無限ループとなるのでしょうか?
95 :
デフォルトの名無しさん:2005/05/16(月) 00:06:38
>>93 ありがとうございます。
char型の文字列だと無理なんでしょうか?
例えば名前を入れたい文字列だとして、
初期値として"名無し"と初期化したりしたいのですが。
>>95 無理です。
同様に、配列の {} による初期化もできません。
>>94 全部省略したら無限ループになります。
;(セミコロン)は省略できませんが、その他は省略できます。
次の奴も無限ループになります。
>>95 初期化を諦めて代入にすればどう?
まあ、初期化リストに書けない事で、継承していた場合の基本クラスの
コンストラクタ呼び出しが出来なくなるが・・・・・
>>95 メンバをポインタ変数にし、"奈々氏"を返す関数で初期化する。
>>98 char[] ひとつを代入にしたところで
基本クラスのコンストラクタ呼び出しには影響しないんじゃないか?
>>99 ポインタの指す先の寿命について厳しい注意が必要。
>>100 いや、初期化リストの所に書きたいと言っているので、もしかしたら
親クラスのコンストラクタでも呼び出す可能性があるのかと思って。
気にしないでくだされ。
>>101 やっぱり何が関係あるのかわからん。まあ気にしないでおくかな。
static inline const char * r774() {return "名無し";}
LinuxでCPU使用率と物理メモリの空き容量を取得するにはどのようにしたらよいのでしょうか?
>>104 そんな時は逆転の発想が必要です
CPUを無意味に使って、メモリも不必要に使い倒します
そうすれば、両方とも100%使用状態
特に取得する必要もありません
>105
あおどのくらい使用できるかを知りたいのですが・・・
つまりその、100%じゃないかどうかをしりたいのです
>>106 負荷を徐々にかけていけば、どのへんが限界かわかるでしょう。
メモリの場合だったら、1メガバイトずつ確保していってだな。
>>109 しかしその場合、仮想メモリがあったらエラーをかえさないのでは?
仮想メモリも無限にあるわけではないのでな、
物理メモリのって書いてあるわけだがな、
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;
}
> hairetu[1] = "z";
hairetu[1] = 'z';
> 移植性のないポインタ変換
わけのわからんメッセージだな。どこのコンパイラだ?
hairetu[1] = "z";
これがまずい。charにchar*を代入しようとしてる。
>>114-115 コンパイル出来ました。
ありがとうございます。
"と'で意味違うんですね。
コンパイラはborland c++ compilerです。
0が偽で0以外が真なのに、mainでは正常終了の場合にreturn 0;を実行するのは何故ですか?
main以外の自作関数などでは成功時return 1;で失敗時return 0;とするほうが便利ですけど
自作関数ではこういう使い方でいいんですよね?
>>117 DOSの頃、プログラム終了値は「エラーレベル(ERRORLEVEL)」とも言われてました。
その頃の名残ですね。DOSでIF ERRORLEVEL 〜 を使用して
BATファイルを組んだ事がある人ならピンとくるんですけどね。
自作関数は勿論自由に組んでOK。
戻り値はポインタの場合、0(=NULL)を返す事がざらですし。
>>117 return 時の値は場合によって選択する
main() で成功時に 0 を返すのは、その方が都合がいいシェルでもあるのだろう。
成功か失敗としか返さないならboolean、失敗時に失敗の内容を返す場合は成功時0、失敗時は内容に応じた数値。ケースバイケース。
WindowsのAPIも成功時に0返すのが多い。
121 :
117:2005/05/16(月) 11:19:54
レスありがとうございました。
> WindowsのAPIも成功時に0返すのが多い。
そうか?
あまり無い気がするが
OLE/COM関係とかでHRESULTを返す場合は成功時にNOERROR(==0)を返す場合があるな。
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 }
という様に内部ではなっているのでしょうか?
しかしこれでは文字列が長いほど無駄が多くなります。
予め何バイトを出力すればいいのかが分かっている場合、
この様な比較処理無しに指定バイト数だけ出力したいのですが、何か方法はあるでしょうか?
i=0;
while(str[i] != NULL){
str[i]を出力;
i++;
}else{ return }
to
for(i=0;i<Length;i++;){
str[i]を出力;
}else{ return }
>>124 > char str[10] = {"a","b","c"};
そのような初期化はエラーになる。
> while(str[i] != NULL){
> 〜
> }else{
そのような構文は無い。
127 :
124:2005/05/16(月) 12:09:00
>>125 その場合、i<lengthの比較を出力文字数回行っているのでは?
str[i]を出力; の部分も具体的にどう書けばいいのか自分には良く分かりません。
coutの内部を予想するのにcoutを使うわけにもいかなかったのでそう書きましたけど。
1文字だけならcoutを使っても無駄無く出来るのか、余計な処理が入ってしまうのか・・前者なら良いのだけど。
>>124 つまらねぇことを気にするな。
一般的に出力処理はそれ自体がコストが掛かるから、枝葉末節はどうでもいい。
129 :
124:2005/05/16(月) 12:13:37
あぁ!すみません。
>>124は今書いているプログラムをデフォルメしたものですが、投稿したプログラムはデバッグしてませんでした。
str[]は末尾にヌル文字の入った適当な文字列
while〜elseと書いたのはstr[i]がNULL文字でない間出力処理をして、NULL文字が来たら終了という意図です。
130 :
デフォルトの名無しさん:2005/05/16(月) 14:29:17
string型で宣言と同時にサイズだけ指定することってできますか?
>>130 string s(len, '\0');
意味あるかは知らないけど
char a[] = "あいうえお";
if(a == "あいうえお") printf("%s" , a);
「もし右辺と同じ文字列が含まれているなら」という風に
したいのですが、教えてください。
if(strcmp(a, "あいうえお") == 0)
>>130 何をしたいのか具体的に。
>131じゃ余りに意味がない。
>>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;
}
>133>135
ありがとうございます
今のところ全体一致でも結構ですた。
138 :
60:2005/05/16(月) 15:41:18
>>136 何を持って問題とするかの定義がないので何とも言えないが、
言語規約的には問題なし。
但し、ロジック的には余り意味がないという点で、問題あり。
動作結果も載せないと問題がなんなのかわからんな
>>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 );
}
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って定義しなくてもいけたんで戸惑っております。。
ちなみにコードは本を見て書きました。というか変数以外は写しました。
staticメンバ関数やグローバル関数でthis使ってるんだろ。
つーか提示されたコードにGrab_Threadなんて見当たらないんだが。
>>144 質問とは関係無いが、
mm_str がマルチバイトなのかシングルバイトなのか・・・。
int swprintf( wchar_t *buffer, const wchar_t *format [, argument] ... );
size_t strlen( const char *string );
>>147 よく見ろ。swprintfじゃなくてwsprintfだぞ。
問題なさそうなとこだけ切り取って
どこがおかしいでしょうかって聞いてるのか
150 :
147:2005/05/16(月) 16:34:47
おっと、こいつぁすまねぇ。
まぁ挙げればきりが無いな
153 :
151:2005/05/16(月) 16:50:57
API とも言わんな
154 :
144: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){
さっきの中身
}
}
といった感じです。
>>154 クラスのメンバ関数じゃないとthisは無いぞ
その関数の宣言を見せろ。
157 :
144: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)
{
と続きますが。。
WinObjPtrがthisなんじゃないの?
キャストして使うのでは
グローバル関数でthisが使えたとしたら、それは何を指してるんだろうな?
>>158がいいこといった。
CClientDC DC(this);を
CClientDC DC(static_cast<CWnd *>(WinObjPtr));にしたらどうなる?
>>159 C++に限定しないなら、プログラム全体のグローバル変数・関数をメンバに持つ実行コンテキストクラスのインスタンスだろうな。
162 :
144:2005/05/16(月) 17:49:01
すいません。
なんかテキストクラスというのがあって、
そこをいじっていたらできました。
ほかにCClientDC DC(this)を宣言してるとこがあったみたいです。。
お手数おかけしました。
ありがとうございます。
163 :
デフォルトの名無しさん:2005/05/16(月) 18:39:29
プログラム全体で共有したいグローバル変数はどうインプリメントしてますか?
構造体か何かで定義して、そのアドレス(ポインタ?)をextern宣言?
グローバル変数なんてほとんど使わないので、使うとしたら素直に生。
クラス化する。
なんでわざわざ構造体で定義すんのかが謎
構造体定義するくらいならクラスにする
167 :
デフォルトの名無しさん:2005/05/16(月) 19:43:32
>>166 お前わかってないな〜
class と struct はぜんぜん違うよ
当然だろ?w
169 :
デフォルトの名無しさん:2005/05/16(月) 19:54:06
>>167 デフォルトがパブリックかプライベートかだけの差でしょ?
( д ) ゚ ゚
172 :
デフォルトの名無しさん:2005/05/16(月) 20:11:15
>>171 class と struct の言語仕様上の違いは、デフォルトが private か public だけだ。
しかし、struct のイメージは、「データ構造」であり、
class のイメージは「オブジェクト」なんだ。
これを分かっていないで何でもかんでも class にしたがるやつがいるが、
イメージは大事にせにゃあかんぞ。それで可読性も変わる。
いいやん。自分でわかりにくいプログラムをわざと書いて、悦ぶ
被虐体質(マゾ)な香具師なんだろ。
>>172 コンストラクタと operator= だけを持つ struct なんてぇモノを
タマに作るんですが、邪道でつか?
175 :
デフォルトの名無しさん:2005/05/16(月) 20:22:30
じゃあclassもmemsetでゼロクリアできるの?
PODでなくとも仮想関数テーブル含んで泣けりゃ桶なんじゃない?
>>177 浮動小数点数やポインタを含んでいると不具合が出る処理系もある。
宣言の順番が逆なのはキノセイか?
いろいろ問題はあるけどまずheadの中身がない
…って書くと馬鹿にしてるみたいだな
>>180,181
headの宣言の場所がおかしいみたいですね・・・
他にも問題は山積みっぽいですがもうちょい頑張って考えてみます。
有難うございました。
>>167 で、グローバル変数がいくつか必要なときはあんたならclassにしないでstructにするということか?
#だとしたら呆れたもんだ。
宣言の場所っていうかポインタしか作ってないから中身がないんだ
readnumの頭にhead = newdigit();でも突っ込んどけばとりあえず動きはする
あと p->value = c - '0';
それにgetcharした文字が数字かどうか判別しないと題意に沿わない希ガス
>1行に1個のデータを
っていうのも考慮されてないし確かに問題山積み
struct list{
int value;
Digit *prev;
Digit *next;
};
typedef struct list Digit;
普通この順番だろ?
でも、すべてのモジュールから参照したい変数っていうか
データってあるでしょ?
そんなのはどうすればいいにょ?
struct Digit{
int value;
Digit *prev;
Digit *next;
};
まあ、好みの問題だろ
>>186 文法的に問題ない
>>186でエラー吐くのは俺のコンパイラだけですか。
193 :
191:2005/05/16(月) 22:39:15
あ、ごめん
186だと問題大有りw
194 :
191:2005/05/16(月) 22:40:16
宣言内の Digit が struct list だと思ってた
>>163 namespace Global で包む。
ヌルポ
Visual C++ Express Edition Beta 2 日本語版ってフリー?
199 :
デフォルトの名無しさん:2005/05/17(火) 00:32:39
無料
へー。とりあえずインスコしてみよ。
b が取れたら有料ものになるのかしらん。
Windows(.net以前)でのクライアント、サーバー間の通信方式でよく使われるのは何でしょう?
独自プロトコル、DCOM、SOAP、その他?
独自
NetBIOS
NetBEUI
ベンチマークプログラムの為にマイクロ秒を取得する関数が欲しいのですが
その様な関数があれば名前を教えてもらえませんか。
>>205 環境書かないとわからんぞ。
Pentium以降のx86ならインラインアセンブラなりでRDTSC命令呼べばいいんじゃないか?
WindowsならQueryPerformanceCounter
207 :
デフォルトの名無しさん:2005/05/17(火) 09:56:06
仮想関数を派生クラスで実装する時、
戻り値とか引数の型が一致してないといけませんか?
はい。
ありがとうございました。
戻り値は違っててもいい
211 :
208:2005/05/17(火) 17:11:18
え?本当に?
少しだけね。
共変の戻り値でググれ。
>>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; }
};
コンパイル通らなかったよ。
class Base
{
public:
Base* Clone();
};
class Derived : public Base
{
public:
Derived* Clone();
};
>>214 コンパイル通らなかったよ。
VC6 で。
おいおい、戻り値が違ってもいい仮想関数なんて聞いたことねぇぞ
戻り値がBase*でDerived*を返せるっていう当たり前の
話だったりして
>>217 Derived型だと分かっているときにClone()を呼ぶと戻り値がDerived型なのでアップキャストしなくていいというのが肝。
なるほど
221 :
デフォルトの名無しさん:2005/05/17(火) 22:18:56
教えてください。
javaで言うabstruct、interface は、C++だとどういう記述になるのでしょうか?
作成方法と継承方法をお願いします。
また、c++にあるvirtualという予約語は、オーバーライドさせるためにあるのでしょうか?
でもこの記述がなくてもできますよね?
以上!
>>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
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ではできるのかな???
>>226 explicit指定のない一引数のコンストラクタは暗黙の型変換を導入する。その例だと、
CTest x = 3; /* CTest x(3);と同じ。 */
の様に使える。
229 :
デフォルトの名無しさん:2005/05/18(水) 00:16:58
下のようなコードを書こうとして詰まりました。cin >> で改行を
読み込んだかどうかを調べたいのですが、どうすればいいのでしょう。
やりたいことは改行までに現れる不定個の整数を読み込んで処理することなんですが……。
while (1) {
while (1) {
cin >> c;
// もし改行なら break;
...
}
}
>>227 直接はできない。普通は代わりにポインタを渡したり構造体を返したりする。
>>229 cはcharか?もしそうならc = cin.get()とすると、空白を読み飛ばさない
232 :
227:2005/05/18(水) 00:47:53
>>230 THX!やっぱりできないのか〜
構造体を返すってのはわかるけどポインタを渡す???
ポインタを戻り値にしても一つしかあらわせないんじゃないのかな?
>複数の戻り値
配列
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
}
こんな感じなんですが。。
>>234 「エラーが出る」と相談するときにはエラーメッセージをコピペしよう。
>>232 横レスになるけど、230の書いたのは
ポインタを戻り値にするんじゃなくて引数として渡すってこと。
VBでいうByRefみたいなもの。
C++では参照渡しという方法もある
237 :
227:2005/05/18(水) 01:11:56
>>236 ありがとう〜
なるほどよくわかったよ、参照渡しのことか!!!
複数の戻り値を次の行でまた違う関数の引数にしようとおもってたから
構造体はちょっとめんどくさそうだったんだよね、ByRef(゚Д゚ )ウマー
>ポインタを戻り値
配列
239 :
デフォルトの名無しさん:2005/05/18(水) 01:21:46
>>235 morio.o(.text+0x45): In function `main':
: undefined reference to `bkl::Random::Random()'
えーっと、こんな感じの参照先が見つからないってエラーがいっぱい出ます。
無いと言われる物のオブジェクトファイルはちゃんと引数に渡しているんですが。。
>>235 gccだな。
ほんとうに #include の書き方だけで何か変わるんなら、
gcc -E main.cc をそれぞれの状態で実行して、出力を比べてみるといい。
>間接的にincludeすると
他のヘッダファイルのinclude順番じゃねの?
242 :
240:2005/05/18(水) 01:41:39
ごめん。アンカーミスった。 ×235 ○
>>239
>>234 インクルードガードしてないうっかりミスとか?
244 :
デフォルトの名無しさん:2005/05/18(水) 01:59:30
原因が分りました。namespaceを消したらエラーが無くなりましたです。。
複数のクラスを1つのnamespaceにするために
---foo.h----
namespace bkl {
#include "bar.h"
#include "hoge.h"
...
}
こんな感じでやってたんですが、これってまずかったんでしょうか。。
>>244 まずい。
ヘッダは全部グローバルで #include されているものと考えるべき。
bar.h の中で namespace bkl { ... }
hoge.h の中でも namespace bkl { ... }
246 :
デフォルトの名無しさん:2005/05/18(水) 02:12:17
>>245 そうだったんですか、、これから全部書き直して来ます。ありがとうございました。
メモリ上にロードしたデータ配列をファイルとして扱う(?)方法ってありますでしょうか?
ファイルを固めたアーカイブから、1ファイルだけをメモリにロードして、そのデータを
ファイルとして扱いたいのですが。
Char型のポインタってどうやって文字の長さを判別してますか。
なぜポインタを渡すだけで必要な文字長でちゃんと代入されますか。
NULL終端文字列
null-terminated
>>249 ポインタのNULLと混同するから、その呼び方はやめてほしいなぁ。
( ゚д゚) …
/*
計算出力/*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;
]
間違い探しじゃない
いや、正しいと思われる行の方が少ないから。
>>250 NULL文字
NULLポインタ
こう言えば混同も何も無いだろ
オマエが混同しやすい言い方してるだけ
258 :
250:2005/05/18(水) 11:31:09
せめて null とか NUL とかにして、ヌルポインターマクロの NULL と違うというのがわかればいいんだ。
全部大文字の NULL で「NULL文字」なんて言ってるのは、混同している日本人だけじゃないか?
memset(&a,NULL,sizeof(a)) なんてコード、もう見たくないんだよ。
ナル文字。
ヌルポインタ。
ぬるぽ!!
NIL
264 :
249:2005/05/18(水) 12:28:59
>>250,
>>258 &
>>251,252,257
深く考えずに大文字でNULLと書いてしまったが
言われてみればごもっとも・・・orz
(言い訳させてもらえば、カタカナで書くのを一瞬躊躇したためで、
英語を併記したのもそのためです)
>>258 >混同している日本人だけじゃないか?
混同しているMSも含めといて下さい。
(´-`).。oO(なんで日本人だけだと思うのだろう)
文字列終端ならふつーは'\0'
>>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.
それ以上は専用スレいったほうがよさげ
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
>>270 リビルドして味噌。
さもなくばhoge.hをぎりぎりまで削ってみるとか。
272 :
270:2005/05/18(水) 16:23:05
リビルドしてもだめでした・・・orz
削る=行数を減らすということでしょうか?
あと訂正です、
private:
map<unsigned short, FUGAGA> mapFugaga; // 構造体FUGAGAを値、unsigned shortをキーとするmap
でした、すみません
実は見ているhoge.hとインクルードしているhoge.hが違うとか。
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);
}
で関係ないと思うのですが。。
>>274 そ・・・・・それでした|||||||||orz
アホなミスでお手数かけてスミマセン つД`)
いつもテキトーにusing namespaceで済ませてたから気付きませんでした・・・
どうもありがとうございましたm(_ _)m
277 :
デフォルトの名無しさん:2005/05/18(水) 18:08:39
質問です
いま仮想ウィンドウでビットマップ作ってCDCで長方形を表示させているのですが、
引数が左上の座標と右下の座標しかないのですが、
この長方形を斜めに傾かせることってできますか?
斜めの長方形を描画する関数はなかったと思う。
ポリゴン描画(あったかなかったか覚えてねぇ)か線分描画で描くべし。
文字列についての質問です。
char* str;
void setstring()
{
str = "hello world";
}
void main()
{
setstring();
printf("%s \n", str);
}
setstring()関数中で文字列ポインタをsetに入れた場合に
その関数からリターンしたあとで、そのポインタが使ってもいいですか?
>>279 その"hello world"の寿命はプログラムの生存期間に等しい。故に問題ない。
#が、何故グローバル変数にする?
sscanfに変わる
数字読み込みに便利な関数など、ありませんか?
ANSI-Cでなくても構わないです。
>>279 setstring()中に記述されている"文字列"は
ローカルにあるわけじゃないので使ってもいい
>>281 CかC++かで答えが変わるがどっちだ?
>>280 ありがとうございました。
質問ではchar* strなのですが、実際はもっとややこしい形をしています;;
>>282 ローカルではなく、プログラム内にあると考えればいいんですね。。。
ありがとうございました。
286 :
281:2005/05/18(水) 18:34:05
.cppでお願いします。
287 :
277:2005/05/18(水) 18:39:52
289 :
281:2005/05/18(水) 19:11:45
自分で探してみます。ありがとうございました。
質問です。char型変数がもし数値だったら
キャストしてint型変数に渡すという方法を教えてください。
>>290 数値って数字のコード'0'〜'9'って事か?isdigit()。
>>290 c-'0'とか文字列ならatoiとか。
>291
そです。10進法です。でもchar型だから無理です。
>292
atoiする前にchar変数の中身が整数か確認したいのです。
if(〜みたいな感じで
c-'0'ってのはよく分かりません
>>293 if (isdigit(c))
i = c - '0';
else
puts("not a number!");
295 :
293:2005/05/18(水) 20:56:41
>294
ありがとうございます。
でもisdigitはchar型の引数は無理みたいです。
>>295 isdigitのプロトタイプは
int isdigit(int);
で、引数にchar型を取ったら、自動的にint型へのプロモート(格上げ)が
行われるからモーマンタイのはず。
もしかして #include <ctype.h> をしてないだけのオチ?
297 :
293: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;
}
こんな感じですが。
298 :
293:2005/05/18(水) 21:31:56
スマソ。やっぱもういいです。。。
>>297>>298 まあそう言うな。char型の配列とは初耳だぞ。
その文脈では、atoi()を使うのが適切だ。
で、atoi()を適用する前に、すべての配列の要素に対してisdigit()
を適用し、全部OKだったら初めてatoi()を使えばいい。
というか、情報を小出しにするな。分かる物も分からなくなるだろが。
こうなったら意地でもプログラム例を書いてやる。
#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;
}
302 :
293:2005/05/18(水) 22:16:03
わざわざありがとうございます。
逃げるようで申し訳ないのですが
頭冷やして出直してきます(´・ω・`)
(´・ω・`)
(`・ω・´)
(・ω・)
(ω)
ω
?( ´・ω・)っω
│ _、_
│ ヽ( ,_ノ`)ノ 残念 それは私のおいなりさんだ
│ へノ /
└→ ω ノ
>
ふつうにsscanf()使えばいいじゃん。
あとはstrtol()とかさ。
if (sscanf(s, "%d", &n) == 1) {
/* OK */
} else {
/* NG */
}
>>310 それでは"123X"みたいな文字列もOKになってしまう。
質問者がどこまで要求しているのかわからないが。
>>265 MSDNを眺めてみたけど、英語サイトで "null terminated" と書いてあるものを
日本語訳によって「NULLで終わる」とされているようだった。
こいつらの影響も大きいな。
>>266 "NULL character" と "NULL文字" でぐぐってみて、そう思った。
>>310 sscanf()を使うなら%nで変換終了点をチェック。
まぁ、それくらいならstrtol()で同じ事をすればよろしい。
314 :
デフォルトの名無しさん:2005/05/19(木) 08:36:47
WindowsのRECT構造体型の変数に対し、
rect*nのように書く事で中身をn倍できるようにしたいのですが、
演算子のオーバーロードとかいうのを使えばできるのかと思ったんですけど
書き方が分かりません。どうやって書けばよいのでしょうか。
戻り値型 operator*(左辺値型, 右辺値型) {}
>>314 矩形をn倍って、倍率だけじゃなくて拡大の中心が必要じゃないか?
>>315>>316 できました。今回やりたい事はこれだけで用が足ります。
ありがとうございました。
MFCダイアログベースです。
ボタンなどのコントロールを
メンバ変数で持つのと、GetDlgItem()するのと
どういった違いがあるのでしょうか。
お願いします。
VC++6.0 WinXP
>>318 例えばエディットボックスは前者ならCEditのようにコントロール変数で持つこともCStringやintのように値として持つこともできる。
後者ではCEdit * p = static_cast<CEdit *>(GetDlgItem(...))すればコントロール変数にはなる。
方針を決めて、適材適所でいいと思う。
#値として扱いたいなら前者
#そのダイアログクラス内で何箇所から操作/参照する必要があるなら前者
#そうでないなら後者
320 :
318:2005/05/19(木) 13:31:30
>>319 なるほど。
値として扱えるのですね。
いつも値が欲しい時は
GetWindowText()などとしていました。
いくつかの場所でボタンに対し操作を行うので
メンバ変数で持つことにします。
ありがとうございました。
値を使うときは UpdateData(FALSE) をワスレズニ
配列の大きさは定数じゃないといけないのですか?
コントロール→変数がTRUEで
変数→コントロールがFALSEだった・・
>>322 struct x{
int i;
char c[];
}
この手のソースは見るがどのコンパイラでもOKかは不明。
普通はポインタじゃないか。
C99は可変だよん。
>>325 C99では実行時に動的に確保されると言うことですか?
スタック上の変数はそもそもみな動的確保だろ。
>>326 C99では可変長配列が扱えると言うことです。
そうするとvectorはもういらないのか?
配列を宣言するとき要素数を動的に決定できるけど
その後は変更できないんじゃないの?
そのとおり
_allocaみたいなもんか
returnを実行すると呼び出しもとのプログラムに戻りますが、
呼び出しもとのプログラムのさらに呼び出し元のプログラムに戻らせる方法はありますか?
例外を投げればキャッチされるまでどこまでも戻れます。
嫌な教え方するなよ
setjmp longjmp を知りたいのだろうか・・・
>>333 インラインアセンブラを使えば戻れます。
但し、スタックの巻き戻しは省略します(w
>>333 戻り先に戻るかどうかを決める情報を返せばいいだろ。
339 :
デフォルトの名無しさん:2005/05/19(木) 21:37:21
文字列の2次元配列を動的に確保し、配列に代入します。
配列をプリントfする方法を教えてください。
VC++でお願いします。
d:\car.dat n個*m列は任意
豊田、ホンダ、日産
ノア、DQNワゴン、セレナ
あるファード、エリシオン、LLグランド
宿題なら宿題スレでやれよ
あとスレタイな
341 :
339:2005/05/19(木) 21:47:14
解決しました。
342 :
デフォルトの名無しさん:2005/05/19(木) 22:02:47
339
麻奈とか望洋とかの本には、書いてないのです。
1次元の文字配列をそのまま出力とか。
int*[]とか、VBだと誰でもやっているのに
MFCに組み込みたいのです。
コンパイルまではうまくいくんですが実行しようとすると
Segmentation fault(core dumped)と表示されて失敗します。
原因は何でしょうか?
char *argv[]
345 :
デフォルトの名無しさん:2005/05/19(木) 22:31:08
VC++ .NET のWin32コンソールアプリケーションにて
実行ファイルのパスを取得したいのですがどうしたらよいのでしょうか?
VBではapp.pathを参照すれば簡単に取得できるのですが・・
>>343 gdb使うか、printf埋め込んでどの行でおきたか調べる
たいていは初期化してないポインタでアクセスしたとか
NULLポインタとかその辺
>>345 argv[0]とかGetModuleFilename()とか
inlineってどういう時に使うの?良く分からん。
>>348 関数呼び出しのオーバーヘッドが無視できないほど大きいとき。
350 :
343:2005/05/19(木) 22:53:12
解決しました、ありがとうございました。
351 :
348:2005/05/19(木) 23:04:29
>>349 馬鹿ですいませんが、関数の呼び出しのオーバーヘッドが気になる場合って
わからなかったりw
Win上でヌルくPGやっている分には気にしないでいいですか?
気にしないでいいよ。
ループの真ん中が関数の場合とインラインの場合ではループする回数が大きいほど差が出るのはわかるべ
353 :
345:2005/05/19(木) 23:12:50
ありがとうございます。
GetModuleFilename()で試してみたいと思います。
354 :
348:2005/05/19(木) 23:13:28
>>352 thanx
ついでにループの説明で、ちょっとは理解できますた。
以下のプログラムはコンパイルはできるんですがなぜか実行できません。
何ででしょうか?
#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;
}
}
>>355 何がやりたいの?
そのコードだと出力が全然無いから動いたかどうか確認できないと思うけど。
デバッガで確認したとか
343にもあるみたいですがSegmentation fault(core dumped)という表示が
出るのでそれが出ないようにしたいんです。
int i,N=atoi(argv[1]);
>>358 もう、お茶目さんね!最適化をOFFにして、一行ずつデバッガで実行してみれば
わかるじゃないの。
STLのvectorのeraseメソッドは、削除後、配列(じゃないけど)を
前に詰めてくれますか?
詰めない場合、swapメソッドでソートするのが正攻法?
標準入力のデータの値のコピーでなく先頭アドレスを取得したいのですが、何か方法はありますか?
363 :
361:2005/05/20(金) 09:36:58
怪傑しました
自分が何を言ってるのかわかってるのかな、
>>362氏は
366 :
362:2005/05/20(金) 11:53:42
何か勘違いをしているかもしれません。
初心者なので分かっているのかどうかも分かりません。
やりたい事はCGIのPOSTメソッドで送られてきた入力を受け取る事なのですが、
cinやreadで標準入力を受け取ると値のコピーになりますよね?
入力データに対して行う操作が参照だけなので、
ポインタを使おうと思ったのです。
struct Map{
int x;
int y;
};
int main(void)
{
char Buf[100];
間違えて途中で書き込んでしまいました・・・。
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の通信に使います。
>>366 標準入力はシステムコール、API 等から直接返されるもので、どこか特定のメモリに
格納されるものではない。
従ってポインタでアクセスしようというアプローチは間違い。
ファイルへのアクセスと同じ。
>>368 アラインメントが正しく保たれているなら、問題ない。
>>368 無問題だが、union を使わない理由は何だ?
>>368 intのサイズやエンディアンやアライメントなど、不安要素はいくつかある。
それらの要素に対して、現在および将来に渡って確証が持てない限り、
よろしくないと思われる。
373 :
368:2005/05/20(金) 12:47:43
確かにこれでうまく動いているんでがちょっと心配だったもので。
実際にはintじゃなくてfloatだったりしますが、
もうすぐ64ビットとかいってるのにintで例に出したのは悪かったかもしれません。
unionの使い方はよくわかりませぬ。ちょっと調べてみます。
暇な人いればご教授いただければ幸いです。
うーむ、やっぱりfloatの内部データの持ち方も危険ですか・・・。
376 :
362:2005/05/20(金) 13:04:23
intのバイト数は環境に依存するらしいですが、
具体的にはどう決まるんでしょうか?
32ビット機なら4バイト、とかですか?
>>355 t->next = malloc(sizeof *t);
t->next = malloc(sizeof t);
>>379 そのsizeofの値をprintしてみな
>>358 とりあえず、実行時に引数の数字はつけてるか
382 :
378:2005/05/20(金) 16:09:19
383 :
382:2005/05/20(金) 16:10:00
名前欄377の間違いでした_no
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;
}
>>384 #define はテキストマクロなので、
char *str = "abcdefghijklmnopqrstuvwxyz";
printf("%p\n",str);
printf("%p\n","abcdefghijklmnopqrstuvwxyz");
と書いたのと同じ。
文字列リテラルは、内容が同じでも同じ領域に確保されるとは限らない。
>>384 普通は違うのが当たり前。別々な文字列リテラルが確保されるから。
但し、BCCなどのコンパイルオプションによっては、同一文字列リテラル
をマージする事ができるものがあり、それだと同じアドレスになる。
388 :
デフォルトの名無しさん:2005/05/22(日) 09:30:38
const size_t num = 10;
int array[num];
このコードは、C++ では通りますが C では通りません。
理由を教えてください。
390 :
388:2005/05/22(日) 10:46:44
欲しかったのはそういう答えじゃないんだけど・・・orz
仕様
>理由
昔のCではサポートしてない
C99ならおけ、って >389もいっとろーが
こんなに言っても解らないとはしようがない奴だ!
>昔のCではサポートしてない
確か昔は構造体の丸ごとコピー(代入)ができなかったんだよね
規約にはなかったけど構造体の
まるごとコピーはかなり昔からできた
396 :
デフォルトの名無しさん:2005/05/22(日) 12:30:49
下のような構造体hogeがあるとして、この構造体型の変数hooに対し、
hoo(100,200)のような書き方で簡単に中身に代入できるようにするには
どうしたらよいですか。
struct hoge{
int a;
int b;
};
struct hoge hoo = {{100,200}};
{{}}って二重にしなきゃいけないんだっけ?
最近C触ってないから忘れちったぃ。
struct hoge{
void operator()(int x, int y) { a = x; b = y; }
int a;
int b;
};
too many initializers for 'hoo'
エラー 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));
みたく書けるようにしたいです。
>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});
-----
ってなことができるらしい
ま、どのみち構造体を引数に取る関数の大半は構造体そのものではなく構造体へのポインタが引数だったりするんで大して役に立たないわけだが。
>>402 hoo gen_hoo( int, int ){}
func( gen_foo( 100, 200 ) );
406 :
402:2005/05/22(日) 13:02:26
すいません、間違えました。
func(hoge(100,200));のように書きたかったです。
というか実際使いたいのはwinのPOINT型構造体です。
関数に渡す際などに、一々変数を作って渡すのが面倒くさいので
func(POINT(100,200));のようにかけないものかと思って質問させていただいた次第です。
407 :
402:2005/05/22(日) 13:13:17
あれ、質問の意図が変わってしまいました。
整理しますと、
・winのPOINT構造体型の変数hooに対し、hoo(100,200);のように値を一度に代入する方法
・変数を作らずにfunc(POINT(100,200));のようにPOINT構造体を引数として渡す方法
を知りたいです。
>>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));
}
>408
脳内コンパイルすな!
>>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));
}
>>407 MFCあるいはATLのCPointを使えばfunc(CPoint(100, 200));と書ける。
ATLのなら<atltypes.h>をインクルードするだけで使えるんじゃないかと思う。(だめでも自分で作ればいいだけだし)
CPointはPOINTから継承されているのでPOINTを引数に取る関数へもそのまま渡せる。
>>411 ようするに引数指定のコンストラクタ付き構造体か
10年前ほどからずっとCの仕事をしたいと思ってる。
最近のCの仕事ってMFC不要ってのが多いの?
組み込みとかはMFCあまりいらないだろうけど、
業界仕事としてはCだけできれば採用可能ってのか多い
んかい??
>>413 そりゃそうだ。
MFCなんてそもそもCでは使えない。
415 :
413:2005/05/22(日) 21:00:28
>>414 いやはや、すまない。C/C++系の仕事と
みなしてくだされ・・・
>>413 それでもあまり変わらないが…。
Windows以外にMFCは使えないわけだし。
君の言う業界ってWindowsを除くのか?
↑
Windows以外を、だ。
スレ違いだからこの辺でやめとけ。
419 :
デフォルトの名無しさん:2005/05/22(日) 23:44:17
一定時間Waitするプログラムを作ろうと思っております。
方法はForで無限ループさせ
ループのたびに、システム時間をチェックし、
設定時間になったらループを抜けるようにしようと思うのですが
システムへの負荷って無茶苦茶高くなってしまうものなのでしょうか?
またforで無限ループさせる以外に他になにかいい方法がありましたらお教え願います。
むちゃくちゃ高くなる。
素直にAPIつかっとけ
>無限ループさせる以外
たいまいべんとってないの?
環境依存なので環境書いとくれ
423 :
419:2005/05/23(月) 00:52:12
環境はWindows 2000 serverです。
APIは使えないと思います。(コンパイラが未対応)
>>421 タイマイベントというのは、APIによるタイマイベントでしょうか?
Cでそういったイベントを発生できるのでしたら
ヒントでもお教え頂けないでしょうか。。
>>423 環境依存と書かれた時点でピュアCでは出来ないことは自明ではなかろうか。
APIが使えないコンパイラってあるのか?
標準ライブラリにしたって各プラットフォームのAPI呼んでる訳なんだが‥‥
どーしてもだめならループ中に sleep かましてしのぐとか
sleepなど無い
SleepもAPIか・・・
429 :
419:2005/05/23(月) 01:10:45
すみません。大嘘ぶっこいてました。
環境はUNIX(AIX)です。。。
コンパイルしようとしたら
In function 'main':
warning: assingment makes pointer from without a cast
となって失敗します。これってどうしろってことなんですか?
431 :
430:2005/05/23(月) 01:46:55
すみません、この表示が出てもコンパイル
はしたことになってたみたいです。なんでもないです。
警告はきちんと処理しとけ
警告:assingmentはポインターを作ります、fromキャストなし
キャスト汁!
元スレ見たけど、mallocのプロトタイプが無かったせいみたいよ
linux で、キャッシュを汚染せずに file からメモリに直接データ転送する方法を
ご存知の方はいませんでしょうか?
WIN32 の場合、CreateFile の dwFlagsAndAttribute に
FILE_FLAG_NO_BUFFERING フラグをつけると、L1,L2 キャッシュを汚染せずに
file からメモリに直接DMA転送します。同様の事を linux で行いたいと考えている
のですが、fread 文を使うとキャッシュを汚染してしまうようです。
なお、マルチスレッドで file access スレッドと複数のデータ処理スレッドからなる
構造のプログラムであり、mmap を使用する事はできません。
いい方法をご存知の方は、ぜひご教授下さい。m(_ _)m
>プロトタイプが無かった
この場合は別の警告がでねーか? 知らねー関数がでてきたけど...みたいな
>>434 FILE_FLAG_NO_BUFFERINGはCPUのキャッシュじゃなくて
メモリ上に取られるファイルキャッシュを使わないという意味だと思うが。
>>435 C++ならね。
Cだと単にintを返す関数と仮定される
>>437 Cでもプロトタイプがないって警告を出す処理系もある。(BCCとか)
他のアプリでキーボードを叩きたいのですが
何を検索すれば資料が出ますか?
キーボードを叩くにはロボットハンドか何かを用意しないと。
人間の手に電極埋め込む
>>440 キーを押した事にすると言う意味なら。
PostMessage(他のアプリのHWND, WM_KEYDOWN, キーコード, 0);
何故そこで環境を聞かんのかと。
【初心者歓迎】なスレにはテレパスが必須。
クレパスでは駄目ですか
お互いが相手のメソッドを呼び合っているようなクラスについて質問。
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変数を宣言してるんですが、
自分より後に宣言されているほうのメソッドを内部で呼び出してると、
「未定義のオブジェクト」エラーがでてしまいます。
どうしたもんでしょう。
スコープ解決演算子とかそういう関係でなんとかなるんですかね?
どっちを先に定義しても、あとのほうで定義している関数も中で呼び出してる
ので必ず未定義のオブジェクトエラーになっちゃうんですが
そもそもグローバル変数でこんなことやるなんて設計がうんこじゃないか?
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();
じゃあ普通はどうすんの
とりあえずうんこしてくる。
設計を見直す。
>お互いが相手のメソッドを呼び合っている
なぜ?
>>434 >FILE_FLAG_NO_BUFFERING フラグをつけると、L1,L2 キャッシュを汚染せずに
>file からメモリに直接DMA転送します。同様の事を linux で行いたいと考えている
自信満々で言ってるけどほんまかいな?
以下のプログラムのベンチマークを取ろうと思ったのですが、
コンパイラの最適化でループ処理を消されるからか計算時間がほとんどかからず終わってしまいます。
どうすればベンチマークが取れますか?
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;
}
>>454 time a.out
Windowsならパフォーマンスカウンタとか使えば?
最適化OFFだけじゃとても足りない
1万回くらい実行したら
>以下のプログラムのベンチマークを取ろうと思ったのですが、
談合の悪寒w
>>454 ループの中に関数呼び出しを入れてみろ。何もせずにリターンする関数でいい。
大抵の場合最適化が取り消される。
inline関数はお勧めしないが。
#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?)使用。
C++使える場合、C++使えないヤツより
いっぱい仕事とれますか?
C++できんってヤツが周りに多くて困っている
んだが。
C++できんという香具師の問題は、C++を使えないということよりも
新しいことを吸収する能力の欠如に自分自身が気付いていないことだね。
少なくとも日本語が使えない奴よりは使えそうだが。
466 :
デフォルトの名無しさん:2005/05/24(火) 19:11:00
ファイルを読み込んで処理して、その出力を他の処理に渡すというプログラムを作ったのですが、読み込むファイル数が一定以上になると、"Too many open files"というエラーがでて終了してしまいます。
% output = load_file(filename)
lsofで見てみると、膨大なPIPEが出てきています。
outputを他のプログラムに渡す処理をするとき、それも「1ファイルのオープン」となって、それが残ってしまっているのかなと思います。
どうやってこのファイルを消せばいいのでしょうか?
>>466 closeするだけだと思うのだが、言語は何かね。
>>466 そのコードはCにもC++にも見えないが。
469 :
デフォルトの名無しさん:2005/05/24(火) 19:17:52
C言語です。どこでcloseするのでしょう?
output = load_file(filename)
x = program(output)
と続きます。
dupして閉じちゃったら
471 :
デフォルトの名無しさん:2005/05/24(火) 19:21:14
あ、ちなみに、load_fileや、programはC(C++)でコンパイルされたoctaveのプログラムです。
472 :
466:2005/05/24(火) 19:36:05
解決しました。
if ((ptr = popen (cmd, "r")) == NULL)
{
error("Can't execute command");
return retval;
}
のパイプが残っていることがわかりました。これをcloseすれば良かったんですね。
ありがとうございました。
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: 直前のエラーを修復できません。コンパイルを中止します。
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: 直前のエラーを修復できません。コンパイルを中止します。
2度カキコされてしまいました、ごめんなさい。
VC++.net 2003(VC++7.1)にバージョンアップする
2年ほどjavaやってまたc++(vc7.1)に戻ってきたが
コンパイルエラーのメッセージがアホ過ぎだ。
1箇所間違えただけでエラー箇所いっぱい出てくるし
しかも肝心の場所とちがう。
VC6.0です。
class A {
private:
static void (*func)(int);
};
funcの定義の方法が分かりません。
どのように定義すればよろしいのでしょうか。
よろしくお願いいたします。
>>479 「intを引数にとってvoidが戻り値の関数へのstaticなポインタを
privateメンバに持っている」と定義されていると思うんだけれども。
何を定義したいのかな?
>>479 void (*A::func)(int) = ...;
C++で、メンバ変数にReadOnlyのような属性を付けたいのですが、
擬似的ものでも何か実現する方法はないですか?
関数経由じゃないとだめでしょうか?
>>482 const
const
const
const
const
const
const
const
const
484 :
479:2005/05/25(水) 00:36:33
>>481 そんな所にクラス名が入るのですね。
ありがとうございました。
>>453 アラインを揃えたメモリを確保して転送する必要があるので、DMA転送している
のだと思ってたんだけど、違うのかな? 速度的にも fread より遥かに速いようだし。
自信は全く無し。。 orz
たくさんのクラスを宣言するときって普通、どういう順番でクラスとメンバ関数
を宣言していくのが見やすいですかね??暗黙の定石みたいなものってないんですか。
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() {
}
↑こっちがいいのか。あなたの判定はドッチ?
488 :
aaa: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
確保していないはずの領域に書きこめてしまうのはなぜですか?
>>488 たまたまです。環境と運が悪ければシステムごと落っこちます。
490 :
aaa: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になりました。これはなぜなんでしょうか?
>>491 (1/100)*100は全て整数演算。実数演算したかったらどれかを実数の定数にせよ。
Ex.:(1.0/100)*100
493 :
デフォルトの名無しさん:2005/05/25(水) 10:54:21
age
494 :
492:2005/05/25(水) 11:06:38
なるほど、ありがとうございました
逆ポーランド記法の計算をする時って、標準入力からはどのように入れればいいんですかね?
括弧とか計算符号とかどうすればいいのかがわからない○| ̄|_
教えてえらいひと
ちなみに環境なんてわかんないくらいの初心者君○| ̄|_
二分木で
ドモホルンリンクル
コンポジションだか集約だかしらないけど、
クラスメンバにオブジェクトを持つとき、
他のオブジェクトへのポインタじゃなくて、他のクラス変数自体を持つと
なんか問題があるのですか?
ヒープ領域を使うからデカいクラスをメンバに持っちゃダメだとか
書いてる人もいるけどそうなの?とにかくなんでポインタなんでしょうか
おしえてください
>>499 ポインタならそのクラスのためのヘッダを外側のクラスのヘッダにインクルードしなくて済みますよ。
動的な差し替えとか、遅延初期化とかも可能だし。
オブジェクト指向チックにしたいなら、オブジェクトの型を固定するような使い方はそもそもしないのが吉。
ポインタにして作成メソッドをvirtualにしとけばサブクラスでオーバーライドできるしね。
> ヒープ領域を使うからデカいクラスをメンバに持っちゃダメ
まったくの嘘ですな。
ヒープじゃなくてスタックにとってオーバーフローってことじゃないの?
class a{
char c[4096];
};
class b{
a _a[4096];
};
void f(){
b _b[4096];
};
>>495 丸ごと文字列で式を取り込んで、自作のパーサに取り込めば?
そんなのちょっと探せばサンプルがゴロゴロしてそうだけど
>>495 は先ず、「逆ポーランドって何?」から調べるべき。
なんだ括弧って。
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
と怒られてしまいました。
どうしたらいいのでしょうか。助けてください。
>>506 LinuxとCygwinに何の関係が?
それはさておき、libuser32.aが見つからないと言っているようだ。
それを用意したまえ。
508 :
デフォルトの名無しさん:2005/05/26(木) 17:38:27
K&Rの演習ってやったほうがいいですか?
switch( a ){
case 1:
int aaa[3];
break;
case 2:
int aaa[10];
break;
}
このように宣言することはできないでしょうか?
実際やってみたらエラーがでまくりです
case のラベルごとにブロックで囲めばいいだけだろ
よくやる手だ
>>512 俺もそう考えたが、質問者はあの配列を
下のほうで使うんじゃないかと思われる。
もしそうだったら
>>512の手は使えないね
>俺もそう考えたが、質問者はあの配列を
>下のほうで使うんじゃないかと思われる。
どこをどう見たら…
>>510 そもそも条件ごとに配列の要素数を変えることはできない。
最大値が判っているなら、それで済ませるのが無難かと。
つまり、>510の場合、int aaa[10]を定義して使いまわせばいい。
省略してるんじゃまいか
どう見ても省略してるだけに見えるが
自演で何回も書き込んでるやつ、うざい
もう動的確保でいいよ
いや、
>>513の言うことも一理ある。
条件aによって配列のサイズを変えたいということじゃないだろうか?
ならば、
int size = 0;
switch( a ){
case 1:
size = 3;
break;
case 2:
size = 10;
break;
}
{
int aaa[size];
/* aaaに対する処理 */
}
のようにすれば何とかなると思われる。
C99に準拠してないコンパイラは怒るかもしれんが。
怒られたら
int *aaa = new int[siae];
や
int *aaa = (int*)malloc(size);
すればいいさ。
525 :
506:2005/05/26(木) 20:07:24
>>507 make通りました。ありがとうございます。
526 :
510:2005/05/26(木) 21:16:49
>>511-525 いろいろありがとです
switch文を出た後に同じような処理をするんで配列の確保だけを
無駄に多く配列を作らずにswitch文でできたらいいな〜と思ったしだいです
>>523-524さんのやつで行こうと思います
助かりました!!!
527 :
初心者:2005/05/26(木) 22:52:39
学校の数値解析という授業でy=sin(x)を微分するプログラムを作れという宿題が出ました。はっきりいってまったくわからなくてこまってます。ぜひお教えください。
>>527 数値的な微分でいいのか解析的な微分が必要なのかくらいは書いてくれ。
そんだけの情報じゃ私たちも全くわからなくて困ります。
529 :
初心者:2005/05/26(木) 23:05:06
申し訳ありませんでした。
問題は数値的な微分です。
逐次計算式を作って計算するプログラムを作れといわれました。
531 :
デフォルトの名無しさん:2005/05/27(金) 06:18:40
ifdef で && や || を使用する方法を教えてください
>>531 #ifdefでは無理。#ifでやる必要がある。
#if defined HOGE && defined FOO || defined BAR
533 :
デフォルトの名無しさん:2005/05/27(金) 10:35:31
選択法のソートってどうやるの?
534 :
デフォルトの名無しさん:2005/05/27(金) 12:36:25
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;
}
エラーなし
いったいどういうことなんでしょうか?
メディーーーーーーク
>>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:
// 処理
switch(a){
case 0 :
case 1 :
/* 0と1の処理 */
break;
case 2 :
case 3 :
/* 2と3の処理 */
break;
case 4:
break;
}
0||1と2||3をprintfしてみりゃわかる
539 :
535:2005/05/27(金) 13:52:13
>>536-537 無事通りました。ありがとうございます
でもなんで、「0または1」と「2または3」
という条件が一緒って判断されてしまうのでしょうか?????
やっぱりメディーーーーーーク
「0または1」も「2または3」
↓
「FALSEまたはTRUE」も「TRUEまたはTRUE」
↓
TRUEもTRUE
同じ
542 :
デフォルトの名無しさん:2005/05/27(金) 14:51:52
vc++6 W2kですが、
timeGetTimeを使おうとして"mmsystem.h"をincludeすると
error C2146: 構文エラー : ';' が、識別子 'MMVERSION' の前に必要です。
fatal error C1004: 予期せぬ EOF が検出されました。
とエラーがでます。どうしたらよいでしょうか。
そのinclude文の前後をここに晒す
#include <stdio.h>
#include <stdlib.h>
#include <mmsystem.h>
だけであります。
>>542 #include "stdafx.h"
あと死ね。
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 ()()'
というエラーメッセージが出ます。何がいけないのでしょうか?
548 :
デフォルトの名無しさん:2005/05/27(金) 15:20:55
>>545 インクルード ファイルがオープンできません。'stdafx.h': No such file or directory
当然だと思うのですが、とエラーが出ました。
あと、なんで死ななきゃなりませんか?
詳細に教えてください。
>>546 A x();
と書くと、これはAを返す無引数関数の宣言になる。
A x;
と書くべし。
>>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");
}
551 :
549:2005/05/27(金) 15:37:34
それから、デフォルト引数は実装側じゃなくてインタフェースに書かないといけない。
struct A
{
A(int i = 7);
};
A::A(int i){..}
今の時間を文字列にして手に入れたいのですがどうすればいいですか?
>>548 死ぬほどではないが初歩的ミス。
プリコンパイルヘッダ
555 :
554:2005/05/27(金) 16:16:48
入力途中で書き込んでしまった、すまん。
まあ、あれでわかるからいいか。
556 :
デフォルトの名無しさん:2005/05/27(金) 16:30:17
>>554 すいません、よく意味がわからないのですが、
stdafx.hとかいうのは、よくコンパイル時間を短くしたりしたい時なんかに
あまり変更しないヘッダなんかをそこに入れて自分で作るものじゃないんですか?
何の関係があるのでしょうか?
>>556 そうだから、全ての.c/.cppファイルがインクルードしている必要がある。
CString strD;
strDに数字が入ってるのですがこれをint型に直したいのですがどうすればいいでしょうか
>>542 mmststem.hはWORDとかUINTとかの型に依存していて、
しかも自分ではそれらの定義のあるヘッダをincludeしていないから、
mmsystem.hをincludeする前にそれをincludeしてやる必要がある。
windowsのsdkは詳しくないけど、多分windows.hをincludeしておけば大丈夫。
ちなみにstdafx.hは無関係。
561 :
542:2005/05/27(金) 16:46:00
>>557 度々申し訳ないのですが、
全ての.c/.cppファイルが、「何を」インクルードしてる必要があるのでしょうか。
作ってるものは.cppファイル一つの単純なプロジェクトで、
自作のヘッダファイルも何もないのですが。
"mmsystm.h"を使いたいだけなのですが、
プリコンパイルヘッダが何の関係があるのか分かりません。
562 :
542:2005/05/27(金) 16:51:33
>>560 そういうことですか。
試したらいけました。
ありがとうございました。
>>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');
のように適当に区切り文字も変更すると読み込みますが、
これではぜんぜん根本的な解決になってません。。
どうすればいいんでしょうか?
textで
566 :
564:2005/05/27(金) 17:39:03
>>565 画像データを読み込みたいのでバイナリでないと都合がわるいです。
fin.readを使ったら解決できました。
でもbasic_istream.readは廃止予定みたいなワーニングがでます。
warning C4996: 'std::basic_istream<_Elem,_Traits>::read' が古い形式として宣言されました。
こちらはどうにかならないでしょうか?
567 :
542:2005/05/27(金) 17:52:13
>>563 ですからそのファイルはどうやって用意すればよいでしょうか?
>>560の方の助言に従い解決しましたし、全て説明がついていると思うのですが、
それ以上にstdafx.hがこの問題の解決に何の関係があるのか気になっています。
568 :
563:2005/05/27(金) 17:55:52
>>567 俺の言った「普通」がお前の問題には当てはまらなかったと言いたかっただけだ。
もういいって
570 :
542:2005/05/27(金) 18:02:29
キチガイに絡まれているのでしょうか。
それとも私の読解力がないのでしょうか。
全く意味がわかりません。
いや本当に意味がわからないというか、何の関係があるのか分からないので
スッキリしないで気持ち悪いです。別の解決法でもあるのかなと。
全く関係ない話ですよね?
ただキチガイが意味不明なことを意って混乱させてようとしてるだけ
と考えてよいですか?
>>542 おいおい、回答が多少ずれてたからといって回答者をキチガイとは聞き捨てならんな。
二度とこのスレに現れるなよ。
いや、途中から話のすれ違いがあってstdafx.hの一般論的な話として
それ自体の意味を教えてくれたんだとすれば、その方には御礼を言いたいですが、
発端の
>>545のstdafx.hをインクルードすれば解決するってのは
全く関係ないですよね?
>>572 単に自分の間違いを認めるのが嫌なだけだろ。許してやれよ。
>>573 何様のつもりだ?
あほな回答者を非難するのは当然だと思うが。
(・∀・)
野茂のソックリさん
それはニセノモ
野茂本人
それはホンノモ
>>585 それはよかったな。せいぜい書かずに精進してくれ。
しかしvoid mainってそこのページ・・・・・
>>585 その例はCの規格に照らして正しいから(c99では「未定義」だが、これはエラーを出さなくても良いことを意味する)。
>>585 全ての処理系でエラーになるわけではない。
ちなみにC++では必ずエラーになる。
そこのページ・・?
問題でもあるんでしょうか?
590 :
587:2005/05/27(金) 22:31:19
一応解説しておく。
今、Cの標準規格にはC89とC99があって、C89の方が一般に使われている。
そのコードはC89では完全に正しい(良いスタイルかどうかは別だが)から、
コンパイラはエラーを出してはいけない(警告なら良い)。
C99では未定義だから、どう扱おうとコンパイラの勝手だということになる。
この点でそのページは間違ってるし、
>>586の言ってる問題もあるから、お勧めはしない。
わかりました。どうもありがとうございました。
mainの戻り値をvoidにしている所は駄目なCやC++のサイト・本などを判別する指標になる。
正式なのはint main(void)とint main(int argc, char *argv[])だけ。
ただし同じ意味になるのであれば多少の相違点があっても問題ない。
例えばC++ではint main()も正しい。C++ではint main(void)と同じになるから。
>>592 main()
main( int argc, char* argv[] )
は?
594 :
592:2005/05/27(金) 23:17:37
と思ったらどうやらCでも関数定義時に限っては括弧の中にvoidを書いても書かなくてもいいみたいだ。
結構古い本にそのようなことが書いてあり、
気になってC99の規格も読んでみたがそんなことが書いてあった。
ただし廃止予定事項となっていたが。
C++ソースでヘッダもソースも一緒くたにして*.hpp拡張子にして纏めています。
これが、ソースの管理上やコンパイル等で悪影響を与える事はありますか?
環境VC2003です。
>>592 Cだと関数定義/宣言の括弧になにも入れないと、K&Rスタイルとの互換性で
「引数チェックはしないよん」という意味になるんじゃなかったか
要するに何でも素通しの、プロトタイプ以前の世界。
>>595 ちょくちょくいじるプログラムだったらお勧めできない。
ちょっと変更しただけで全コンパイル走るし。
staticなメンバ変数の置き場にも困るな。
599 :
595:2005/05/28(土) 00:45:56
あ、確かにコンパイル遅いや。
*.hppのままでプリコンパイル済みヘッダとか効かすのって無理かや・・・。
ちょくちょくいじるソースなので、分ける事にします。
ヘッダとソース分かれているの、マンドクセ。
>>595 JavaやC#になれていると、醜いと感じるかもしれないし
テンプレート使いまくりだと、めんどいと感じるかもしれないが
まあ我慢汁
俺はJavaやC#のほうが見にくい。
IDEがサポートしてくれりゃそれでいいんだろうけど、大体ツリー形式でパラメータ途中で切れてたりするし。
たいていアルファベット順に並び替えられちゃうし同じクラス内では全部フラットだから機能ごとにまとめて書くなんていプログラマの気遣いが水の泡になっちゃう。
C++のヘッダ見たほうが正確で速いや。
なんかコメント書いてあるかもしれないし。
>>601 Stroustrupは同じ意見みたいだな。
まあJavaの場合はjavadocとかあるから。
同じクラス内で複数インスタンスがある場合でもそのクラス共通で使える変更可能な変数をつくることはできますか?
staticにしただけじゃだめでした。static constだと値が変更できないのでちょっと今回の用途には合いません。
どなたかご教授おねがいします
604 :
デフォルトの名無しさん:2005/05/28(土) 09:08:23
age
>>603 //ヘッダ
class hoge
{
static int foo;
};
//cppファイル
static int hoge::foo;
普通のグローバル変数と同じようにどこか一箇所で定義が必要。
クラス変数に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 で定義されています。
どういう宣言の仕方をすればいいのでしょうか?
ソースはヘッダとソースで分割してます。
>>606 あ、ヘッダに書いてました。
そうかソースのほうか。
勉強になりました。
Thx!
ヘッダにも要るんだぞ?
いらん、クラスの中だけでいい
宣言は.h、定義は.cppだろ?
612 :
デフォルトの名無しさん:2005/05/28(土) 17:36:33
継承クラスから基本クラスのコンストラクターを呼ぶにはどうすればいいの?
class Base
{
Base()
Base(int i)
}
class Sub : public Base
{
Sub():Base(){
Base(5)
}
}
ではだめだった
614 :
デフォルトの名無しさん:2005/05/28(土) 17:38:32
正確には条件によって呼び出すBaseを変えたい.
なので2回呼ぶこともある
> 正確には条件によって呼び出すBaseを変えたい.
基底クラスのコンストラクタは派生クラスのコンストラクタが実行
される前に呼ばれるから、むりだよ
そういうことがやりたいのなら、設計を変えるんだね
>正確には条件によって呼び出すBaseを変えたい
なぜ?その理由は?
>>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の間で、効率よくデータのやり取りするには、どうすれば良いですか?
この関数を使え的なアドバイスでもかまいません。
>>619 memcpy()
あとunsigned char (*AAA)[XXX][YYY];にするのも考えてみたらどう?
621 :
619:2005/05/28(土) 21:32:44
>>620 色々試してみたのですが、上手くいきません。
申しわけないですが、実際の記述を教えていただけないでしょうか?
>>621 その前に自分が試した色々と、上手く行かなかった結果について、
「実際の記述」を示すのが先だろう。
>AAAには、BBB[0],BBB[1],BBB[2]……といった順で同じデータ形式が
BBBって3次だから AAA には BBB[0][0][0], BBB[0][0][1], ... ぢゃねの?
624 :
619: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 はい。それが正しいです。省略?していました。すみません。
>>624 memcpy(BBB, AAA, XXX * YYY * 3);
forでループさせる必要は全く無い。
>>624 なんだそりゃ。コンパイルも通らないだろ。
memcpy(BBB,AAA,sizeof(BBB));
これでおしまいじゃないか?
627 :
619:2005/05/28(土) 22:54:46
>>625,626
ありがとうございます。
上手く行きました。
美しい記述で、感動中……
>>626 はい。
>>624は、コンパイルすら通りませんでした。
で、その試行例を書いて聞くには、余りにも恥ずかしかった次第です。
本当にありがとうございました。
>607
あえて揚げ足とりさせてもらうとそれはコンパイル時のエラーじゃない。リンク時のエラーだ。
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]))
{
何かの処理
}
とやってもうまくいきませんでした
どうしてでしょうか?
どううまくいかなかったのかね
631 :
629:2005/05/29(日) 00:41:58
>>630 肝心なものが書いてありませんでしたヽ(´Д`;)ノ
「構文エラー : ';' : メンバ関数の定義を終了するための '}' がありません。」
こんなエラーが出てしまいます
もう一つ問題ができてしまいました
コンストラクタで引数の数だけ二次元配列を作成するにはどうしたらいいのでしょうか
632 :
629:2005/05/29(日) 00:43:14
上のエラーは
b(int age, int (*test)[2]) : a((*test)[2]);
の部分で出ています
>>629 コンストラクタの定義には空でも { } が必要。
3行目セミコロンいらない、6行目 aの前にclassいらない
8行目:以降いらない(セミコロンはいる)
11行目、最後の括弧閉じいらない、ここに、: a(test) とつなげる
636 :
629:2005/05/29(日) 01:12:32
キタ━━━━(゚∀゚)━━━━!!
>>633-635 ありがとう
うまくいったよ
コンストラクタで引数の数だけ二次元配列を作成するにはどうしたらいいのでしょうか
↑
これの方法見つけました
double** pd = new double* [2];
for (i1 = 0; i1 < 2; i1++)
pd[i1] = new double [3];
でできるみたいですね、でもちょっとめんどい(´・ω・`)ショボーン
637 :
629: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;
こんな感じで配列が解放できないよヽ(`Д´)ノウワァァァン
メンバーでとっとけばいいだろ
メンバー
640 :
629:2005/05/29(日) 01:50:16
>>638-639 確かにメンバーで確保して
解放するメンバーを作っておけばできるけど
う〜むなんか方法無いのかな〜
は?それが方法だろ。何か問題が?
642 :
629:2005/05/29(日) 01:57:26
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のリストにに派生したクラスがぶら下がって
返りの型が違う(けどなんとなく互換性がある)ものを
ポリモーフィズムできないでしょうか?
646 :
644:2005/05/29(日) 13:59:39
そこをどうにかして(別の手法でも)似たようなことを可能にする
技法はないのでしょうか?
>>646 何がしたい?「ポリモーフィズムしたい」じゃわからんぞ。
>>644 TBaseのポインタ・参照からSpeak()を呼んだときに戻り値を何で受け取ったらいいのかわからないからそんなこと出来ない。
C++なんだからテンプレートを使って作り直してみろ。
649 :
644:2005/05/29(日) 14:30:08
どうもつきあってくれて、ありがとうございます。
ちょっと説明がうまく言えないのでご容赦を。
上のクラスみたいにint,float,charのようなメンバを持つオブジェクトが
リストで連なっていて、それを先頭から足したり割ったりしていくわけですが
(ここは諸事情で同じ型に統一できないのです、ただ全部数値として格納してます)
メンバの型を判定してint&int,int&float,float&intの足す処理、√の処理、二乗の処理
のように書いていくと膨大な関数を作らないとならず、また判定するために重くなるようです。
それでそういう組み合わせの型に関係なく、足したり引いたりするには
どうしたらいいのか、ということがやりたい処理です。
なにか良い方法はありませんでしょうか。。。
650 :
644:2005/05/29(日) 14:32:03
テ、テンプレートというのですか、未知の領域ですが調べてみます。
>>644 全部doubleに変換してから処理すれば?
#intのビット数がdoubleで表現できる精度を越えていなければ。
メンバーの引数をコンストラクタの引数にできるでしょうか?
class apple{
apple(int i );
orenge(int i );
}
main(){
apple ringo( ); ←ここで定義したくない
for(int i = 1; i <10; i++){
ringo.orenge( i )
}
}
こんな感じでfor文のiをコンストラクタの引数にしたいんです
>>652 状況が良くわからないが、コンストラクタとは別に初期化するメンバ関数を作れば解決?
(std::fstreamとstd::fstream::open()のように)
654 :
652: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 );
}
}
一体何をやろうとしているのかさっぱり意味がわからない。
初心者でも、自分が何をしようとしているか&どこで詰まっているか
他人が分かるように的確に書けるやつは、たいてい自分で解決しちゃうからな。
説明の出来ないやつは自分で解決できたと思い込むと。
そもそも英語のつづりに無頓着なやつは
コーディングも適当な気がする・・・
もしかして: 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の処理部でなぜかループ状態になり
制御がきかなくなりますので、簡略化してほぼ独立な関数(上のような形)
として実行してみましたが、やはり上手くいきません。
原因がわからないのがなんとも気持ち悪いのでご指導下さい。
どうぞよろしくおねがいします。
>>660 たとえば、%dで数値をとろうとした場合、
キーボードで数字以外を入力すると
取得できずに戻ってくるわけだが、
入力バッファにこの文字は残ったままなので
バッファクリアしないで再びscanfを呼んでも
キー入力を待たずに同じ結果になるばかり
つまりループする
>>661 それ以前に、提示されたソースのみではループのしようもない訳だが
663 :
デフォルトの名無しさん:2005/05/31(火) 13:22:34
親と子のダイアログが作ったのですが、子のボタンにはコントロール変数が追加できるのに親ダイアログのボタンには
どのボタンにもコントロール変数が追加できません。
ご存知の方、恐れながらご教授お願いいたします。
>>661 ありがとうございました。
ちゃんとint型を入力しているのですが・・・。
http://www9.plala.or.jp/sgwr-t/c/sec05.html ↑ページの最後にある、改行記号の読み捨てなどやってみましたが
改善されませんでした。
ただ、タイプミスから偶然判明したのですが、scanf部を・・・
scanf("* %d",&tmp);
とすると、なぜかループに陥らない事が・・・・
なぜだ〜、何が原因なんだ〜
>>662 そうなんです。
開発環境がvC6.0なので、デバッグツールでプログラムの挙動を
追ったのですが、どうもscanf関数内部でループに陥っているらしく
scanfの戻り値などは戻ってこずに制御不能になります。
とりあえず時間がなくなってきたので、改良はまた帰ってきてからダナ・・・
(´・ω・`)ショボボン
どうもありがとうございました
>>663 > 親と子のダイアログが作ったのですが
何を?
668 :
662:2005/05/31(火) 17:18:35
>>665 皮肉に気付け
現象が出る最小限のコードと、
入力したデータなどの情報がないと、
誰もまともに答えられん。
まさかとは思うが全角の数字を入力して無いだろうな…
まっさか〜
さーまーに
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() {}
}
>>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;
enum
675 :
デフォルトの名無しさん:2005/05/31(火) 22:17:04
すいませんが、お知恵を貸してください。
1234というintの数字をそのままstd:stringクラスに代入したいのですが、いい案はないでしょうか?
int hoge = 1234;
string str = int_to_string ( hoge );
みたな。
馬鹿みたいな質問ですがよろしくお願いします。
std::ostringstream s;
s << 1234;
string str = s.str();
>>675 boost::lexical_cast
678 :
675:2005/05/31(火) 23:39:58
>>676-677 ありがとう。一行で簡単に書けるような方法はないんですね。がんばってみます。
>>675 string str = "1234";
>>680 "1234"じゃなくて(int)1234だ
682 :
デフォルトの名無しさん:2005/06/01(水) 04:28:10
cやc++のサンプルコードを眺めていると
mallocで確保したメモリはfreeで、newで確保したメモリはdeleteで解放しているのですが、
intやcharで宣言した領域は解放していないものがあります。
intやcharのメモリはプログラム終了時に自動的に解放されるのでしょうか?
固定長だから、プログラムコードのメモリが解放されると同時に解放されているのでしょうか。
解放してるものがあるの?
スタックに取った自動変数はブロックを抜ければ自動的に解放される
>>673 std::map<> とかに入れるときは &UniqueID::Foo とか?
比較的短いスパンでCPUに意図的に負荷をかけたいのですが、どういう処理をさせるのが
適切でしょうか?
例えば、特定のホットキーを押している数秒間だけ負荷をかけるとか
負荷をかける目的で、何が適切かは変わるからなぁ。
>>686 では逆に、例えばこういう目的にはこういう処理が適切とか、いくつか挙げて頂けますでしょうか
一応私の目的としては、負荷をかけることで早すぎるアクションゲームなんかを遅くしたいなあと思ってるんですが
…πの計算でもさせればいいのかしら
単にCPU使用率を100%にしたいだけなら空ループでもことたりるが、CPUの持つ演算器すべてをフル回転させようと思うとちと難問だて。
それだとsleepするだけでいい罠
sleepだと自分のスレッドが止まるだけだろ
>>689 sleepしても、マルチタスクOSなら他のプロセスにCPU時間が回される
だけで、負荷にはならんよ。
Windowsなら、SetPriorityClass()APIでも使って、重くしたらどう?
>>689 は?sleepってなにやってるか知らないの?
>>692 だから、
>>685はCPUに意図的に負荷を掛けて、温度を上昇させる
とか、そういう実験をしたいんだろ。
sleepはOSの問題。馬鹿ですか?
>>693 負荷をかけることで早すぎるアクションゲームなんかを遅くしたいなあと思ってるんですが
>>693 はい?なんですか?その頓珍漢な返答は?
>>694 大昔の奴ね。裏でmp3エンコードとかやりながら遊ぶと遅くなりますよ
>>694 そういう用途ならSleep()で結構。
タイマをいじって、ものすごい短い間隔で割り込みがかかるように
すればいいだろ。
普通DOSベースで動くアクションゲームなんかは、最初にCPUの速度を
測って、ウェイトルーチンに与えるパラメタを変えたりして、CPUが替わっても
ゲームそのものの速度にはあまり影響が出ないようにしてあるもんだけどな。
それか、プログラマブルタイマ割り込みかVSYNC割り込みでタイミングを
取ってる物がほとんどだぞ。
相当古いゲームなんですか?
ゲームプログラムのメインルーチンで呼ばれているであろうAPIをのっとって、呼び出されるたびにSleep()かまして強制的に止めるというネタはどっかにあったな
もしかして、そのままゲームをやったら難易度が高すぎるので、
自分で速度を調節したいとか、そういう質問か?
板違いだろ。PCゲーム板でも逝け。
むしろ早くするにはどうすればいいのでしょうか?
cinで入力した文字を使った名前の関数を作成するにはどうしたらいいのでしょうか?
cin でaiueoと受け取ったら
int aiueoというものを作りたいのですが
無理
707 :
706:2005/06/01(水) 16:51:33
いや無理じゃないな。
動的にダイナミックリンクライブラリ作ればいける。
それが既に無理だろ
メンバ変数、ローカル変数、グローバル変数、関数の引数や、
関数名などのネーミングでうまい方法、
もしくは一般的な推奨ルールなど自慢してください。
どうもウィンドウズのなんたら記法っていうのになじめないんです。
フィーリングですよ、フィーリング
ついでというわけではないのですが質問です。
ものすごく遠くにある int i とかを使い回していいのでしょうか?
それともちゃんとブロックで破棄しながら進んでいかないといけないのでしょうか・・・。
>>714 言語仕様としては使いまわしてよい。
お行儀としてはブロックスコープで区切った方が良い。
その方がわかり易いし、良いコードが出る可能性も高くなる。
>>714 遠くにあるint iが使えるという時点でペケ。
>>715-716 レスありがとうございます。
これからはきちんと管理していこうと思います。
このプログラムってメモリリークしてますか?
#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);
}
>>718 してない。
余談だけど4よりsizeof(unsigned int)使ったほうがいいよ。
>>719 レスありがとう。
なるほど、sizeofの方がソースコードが環境に依存しないで済みますね。
>>718 C++ならmalooc()なんか使うなや。
まるーっく!
723 :
721:2005/06/02(木) 09:42:01
s/o/l/
ミクロな揚げ足取りになると俄然元気な奴っているよな。
>>721 C++でostream使わずにstdio使ったらファビョる方ですか?^^;
ファビョるつーか、C/C++スタイルが混在してて気持ち悪いってことじゃないか?
>>726 C++ は元々そういう言語。
ただ malloc は混乱の元になりかねんので
封印したほうがいいんジャマイカ。
C++はCに機能を追加したに過ぎない言語だから当り前の事じゃん
malloc使うなって意見に対して、stdio諸々を持ち出すのはどうだろうねえ。
確かに「理屈の上の立場」は両者同じだけど、
代替となる「C++ならではの手段」の評判が違いすぎるだろう。
730 :
デフォルトの名無しさん:2005/06/02(木) 14:24:17
mallocとnewって本質は同じじゃないの?
メモリを確保するという点では同じだけど
newは確保した領域にオブジェクトを構築するという重要な仕事があるからなぁ。
同じというには無理があると俺は思う。
>>730 互換性はないということになっているから、本質的に同じとはいえない。
メモリ確保をどう行うか、実装によって違う可能性がある。
>>730 malloc()はコンストラクタの呼び出しを行わない。
>>730 mallocの本質はメモリ領域の確保だけ
newの本質はインスタンスの作成、メモリの確保だけではない
>>730 new はメモリ不足に対して例外を投げる。
>>730 newはニューっと新しいメモリを確保する。
流れが読めずにすみませんが std って何と読めばいいのでしょうか?
どの本を読んでも書いていないのですが 「すたんだ〜ど」 で良いのでしょうか?
えすてぃーでぃー
Super Threading Document
の略です。えすてぃーでぃ〜と発音してください
740 :
737:2005/06/02(木) 21:45:13
略はともかく、読みはこれでいいだろ
迷ったらアルファベットをバラして読むほうが間違いが少ない
stdioやらstdlibは「えすてぃでぃ○○」と読むだろう?
studioだよ
SuTtokoDokkoi
コンストラクタと値を設定する関数の内容がまったく同じになってしまったのですが、
こんな場合は、どうすべきなのでしょうか? 記述するまでもないですが、一応こんな
感じなんです。
CHoge::CHoge( int x ) {
_a = x ;
}
void CHoge::set_value( int x ) {
_a = x ;
}
あくまで、大雑把に書くとこんな感じです。とにかく、中身が全く同じなんですが、
初期化時点でどうしても必要な引数が一つある場合と、無い場合が二つ存在してます。
だからこうして分けてて、 : CHoge( x ) の明示的な呼び出ししてもエラーとか言われ
ちゃうし・・・
わたしが言おうとしてる、意味わかるかたどうかご教示お願いします。
>>746 >わたしが言おうとしてる、意味わかるかたどうかご教示お願いします。
大馬鹿者。
他人が読んで意味が明確に分かるように説明するのは質問者の義務。
お前の書いてることは支離滅裂で意味不明。書き直せ。
> あくまで、大雑把に書くとこんな感じです。とにかく、中身が全く同じなんですが、
ここまでは理解した。
> 初期化時点でどうしても必要な引数が一つある場合と、無い場合が二つ存在してます。
> だからこうして分けてて、 : CHoge( x ) の明示的な呼び出ししてもエラーとか言われ
> ちゃうし・・・
病院に行け
こういう話なのかな?
class CHoge {
int a;
public:
CHoge(int x) {set_value(x);}
void set_value(int x) {a = x;}
};
>>749 ありがとうございます、出来ました。
それでよかったんですね・・・(ノ_・、)シクシク
すごく馬鹿らしい質問だったかもしれないけど、お陰で助かりました。
寧ろ漏れは>746に対する>749が>752のヒントになってることが不思議だ。
>>752 一応注意しておくけど、質問の内容が馬鹿らしかったのではなく、
説明の仕方が馬鹿らしかったんだからね。
unsigned char a = 0xff;
このaをsigned shortに変換するのに
(signed short)aじゃだめで
(signed short)(signed char)aでないと駄目なのはどうしてですか?
>>755 コンパイラの問題じゃないか?
WindowsXp、VC++6.0では
(signed short)a
で問題無かったけど。
757 :
755:2005/06/03(金) 15:46:53
758 :
755: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のことだと思うので、正しくキャストできているのは上の方の結果だと思うのですが。
759 :
755:2005/06/03(金) 16:02:38
コンパイラはgccです。
0xff はunsigned なら 255 だろうが
(signed int)(signed char)a の場合
255 -> -1 -> -1
(signed int)aの場合
255->255
何の問題もないが
>>760-761 >0xff はunsigned なら 255 だろうが
そうだ。やっぱり自分の方の間違いか。スレ汚しすいません。
メモリの確保に付いての質問なのですが
こういう動的配列とかではよく利用しているのですが
int* a;
a = new int[num];
例えばこういう使い方の意味がよくわからんのです
CMyBitmap* pBitmap;
↑画像をファイルから読み込んだり表示したり色々する
DirectXでもなんでもいいけども
pBitmap = new CMyBtimap;
こうする理由がいまいちわからない。
データが消えたりするのでしょうか、それとも処理速度が上がったり?
>>763 newで作ったオブジェクトはブロックを抜けてもdeleteしない限り消えない。
だからスコープがブロック範囲では困るときに(も)使う。
>>763 {
CMyBitmap Bitmap;
CMyBitmap* pBitmap;
pBitmap = new CMyBtimap;
// Bitmapの内容も、pBitmapの内容も保証される
}
{
// Bitmapの内容は保証されない
// pBitmapの内容は保証される(delete前ならば)
}
それの意味がわからないようじゃ、まだまだ初心者どころか赤子だな
>>764-765 レス有難うございます
スコープを外れても使用する事が出来るのですね
まさにメモリ確保。レスどうもでした。
>>766 おっと、そんなツレナイ事カキコしないでくださいよ旦那。
学校ではまったく習ってないのよ、もう本が師匠。
769 :
デフォルトの名無しさん:2005/06/04(土) 01:08:41
えーと、ある関数があって、その関数を呼び出した関数の名前を知る方法はありますか?
void func ()
{
printf ( "このfunc()を呼び出した関数名");
}
こんな感じ。要するにログを吐きたい。
>>770 それでは要素がpet型の配列を作ってdobutu型のポインタで保持してることになる。
やりたいことがポリモーフィズムならば、要素がdobutu*型の配列を
作らなければならない。
で、その場合は配列を作った後で、配列の各要素は改めてnewしつつ配列に
ポインタを突っ込む必要がある。
>>770 簡単に言うと、doubutuのインスタンスとpetのインスタンスのsizeofが違う
ので、mem[i]でアクセスした時にi==0の時はいいかもしれないが、i>0に
なると結果は不定なわけだな。
レスありがとうございます。自分なりに考えてみました。
これであってますでしょうか?
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 ;
}
>>774 petのインスタンスがdeleteされてない。
そもそも配列を動的に確保するぐらいならstd::vector使うよし。
>>771 >>772 >>773 回答ありがとうございます。
doubutu型のポインタでpet型の配列を保持しているのでdoubutu型の配列を生成するとは
doubutu *mem;
mem = new doubutu[number];
としてあげるということでいいのでしょうか?
>で、その場合は配列を作った後で、配列の各要素は改めてnewしつつ配列に
>ポインタを突っ込む必要がある。
えーと、ここは具体的にどうすればいいのか・・・
772は英語なので明日にでもじっくりと読みたいと思います
777 :
770:2005/06/04(土) 02:34:29
>>774 doubutu **fuga ;
fuga = new doubutu*[number] ;
とすると確かに動くのですが
ポインタfugaを**としてることと
doubutu*[number]の*の部分はどういう意味になるのか教えていただけないでしょうか
おしえてちゃんで申し訳ないです。。。
>777
ポインタがちゃんと分かっていれば分からないはずはないんだが。
doubutu **fuga なら fuga は doubutu 型へのポインタへのポインタ型。
fuga = new doubutu[number] だと dobutu 型の配列。
fuga = new doubutu* [number] だと doubutu * 型(doubutu へのポインタ型)の配列。
779 :
770:2005/06/04(土) 02:42:56
キター!
やっとすっきりしました!
ポインタへのポインタって考え方はありなのか・・・
あっと、お礼を書く前に送信してしまった
>>780 ちゃんとdelete付け加えておきます
皆様ありがとうございました
782 :
デフォルトの名無しさん:2005/06/04(土) 02:54:49
Cのポインタなんですが、
int a[2];
printf("%p %p\n",a,&a);
で同じアドレスが表示されるのはなぜですか?
さらに同じアドレスなのに
*a = 1;
はよくて
*(&a) =1;
は怒られるのはなぜですか?お願いします。
*a
*(a+0)
a[0]
a <-> &a[0]
&a とは意味がまったく違う
OGASAWARAいいかげんにしる!
786 :
デフォルトの名無しさん:2005/06/04(土) 04:32:31
>783,784
aと&a[0]が同じなのは分かるんですが、
なぜaと&aが同じ値になるんでしょうか?
&aは何を意味しているんですか?
787 :
デフォルトの名無しさん:2005/06/04(土) 04:36:12
じゅうしょ
789 :
デフォルトの名無しさん:2005/06/04(土) 06:01:06
a は配列の第一要素へのポインタで、
&a は配列へのポインタで、値が一緒なだけで、
別物と考えるということですか?
なので
*(&a) = 1;
という代入も認められない。
じゃあ &a という記述は何のためにあるんですか?
うざくてすみません
>>789 T a[N];
T (*p)[N];
のとき、p = a でも p = &a[0] でもなく、p = &a でなければならない。
791 :
789:2005/06/04(土) 07:51:58
>>790 なるほど。それは例えば複数の配列に同じ処理をしたいときに
pで処理を書いておいて、先頭でp=&aとかp=&bと代入して使うと
いうことでいいですか?
いまいちポインタのうれしさが分かってないんで。
皆さんありがとうございました。
>>782 アドレスの値は同じでも型がそれぞれ違う。
aとかくと先頭要素へのポインタということでint *。
&aは配列へのポインタなのでint (*)[2]。
勉強不足のタメ、以下の警告の意味がよくわからないのですがご教授くださるとありがたいです
警告 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クラスを継承したクラスです
>>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++を使っています。
*((char*)0x80000000) = 'D';
*((char*)0x80000001) = 'L';
*((char*)0x80000002) = 'L';
トローチ
800 :
793:2005/06/04(土) 10:03:51
test.cpp
28 : shapes.push_back(new circle);
に変えても同じ警告が出ました。
使っているコンパイラは bcc32 です
>>793 俺は気にしなくて良いと思う。const参照に一時オブジェクトを渡すなんて
日常茶飯事だからな。
g++だと-Wallでも警告でないし。
802 :
632:2005/06/04(土) 10:57:56
borland5.5で 桁あふれ例外のキャッチをしたいのですが可能でしょうか。
試しに
catch(System.OverflowException e){.....}
としてみましたがうまくいきませんでした。
初心者です。よろしくおねがいします。
803 :
793:2005/06/04(土) 11:03:00
>>802 System.OverflowExceptionはC#の構文。
806 :
デフォルトの名無しさん:2005/06/04(土) 12:22:05
typedef __int64 int64_t;
という型があります。
これのサイズをチェックして
8バイトじゃなければ
コンパイルを中止するようにしたいんですが
何か方法はありますか?
イメージとしてはこんな感じです。
#if sizeof(int64_t) != 8
#error 失敗すますた。
#endif
808 :
632:2005/06/04(土) 12:29:31
C#のSystem.OverflowExceptionに相当する
bcc32の構文をご存知の方いらっしゃいましたら
ご教授願います。
810 :
632:2005/06/04(土) 12:38:37
> 809
すみません 更新遅れてました
試してみます
>>806 BOOST_STATIC_ASSERT
>>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変数を使えって書いてあったんですが
皆さんはやってますか?
>813
>if(num=0)
>>813 ×if( num = 0 )
○if( num == 0 )
ソースそのままのっけたかは わからんけど。
とりあえず誤り指摘。
>>814 速度が問題にならない限りやらないなぁ俺は。
>>815-816 ちょっとズレてないかおまいらの指摘。
わかってて代入してるんだぞ
>>813は。
>>813 > このプログラムでifの条件は代入が成立したということで真になって、
いや、ここで評価されるのは「代入した結果の値」であって、
この場合それが0だから、つまり偽になる。
819 :
816:2005/06/04(土) 13:33:30
何この阿呆なレスの応酬。
>813がscanf()を代入だなんていうから>818が素っ頓狂なレスつけてるし、>819は納得しているし。
821 :
デフォルトの名無しさん:2005/06/04(土) 13:48:13
buf="今日はいい天気"(1)
↓変換
data="8da193fa82cd82a282a293568b43"(2)
のように変換出来るようにしたいのですが
(1)→(2)の変換を どうすればいいか分かりません。
よろしくお願いします。
>>820 > >813がscanf()を代入だなんていうから
そんなこと誰も言ってないじゃん。
>>814 ついついメンバ変数には長い名前をつけてしまうから、
メンバ関数内では短い名前で使えるようにというのもあって俺はやっている。
ファイルから一行の文字列を読み込みたいんですけど、こういう場合
どうすべきでしょうか?
string test
fget( test, ---
のようなイメージでやりたいんですけど。
stringがstd::stringなら
std::getline使えば
826 :
デフォルトの名無しさん:2005/06/04(土) 14:11:22
ファイルヘッダ情報を読み込むのはどうしたらよいのでしょう?
using std::string ;
int main(void)
{
FILE *fp ;
string s ;
fp = fopen( "test.txt", "r" ) ;
getline(fp,s) ;
みたいにしたんですけど、できません・・・
>>827 使う関数のプロトタイプくらい調べろよ。
>>817,
>>823 なんか他のスレッドから参照されないことを
保障するキーワードみたいなのあればいいですね。
答えてくれてありがとうございました。
コマンドラインでjpegからjpeg2000への変換ソフトの開発を考えています。
linuxでも動くものを作りたいのでsusieのプラグインは使いたくありません。
また将来的にはGUIでもやりたいと思っているのですが、フリーで使えるライブラリなどはないでしょうか?
832 :
デフォルトの名無しさん:2005/06/04(土) 14:52:01
初心者なので、教えてください。
時、分、秒をそれぞれUINT8型で格納している構造体があります。
そこから、sprintfを使い、char型の配列に変換して出力することは出来るんです。
・・・で、問題はここからで、時、分、秒をそれぞれ1ビットずつで
、16進数であらわすことが求められました。
自分でもよく分かってないので上手く説明できないのですが、
やり方を教えてほしいです。
>>832 1ビットの16進数?1バイトの16進数の間違いじゃないのか?
あと、基数変換を知っているかね?
>>827 FILE *とfopenではなくstd::ifstream
> 時、分、秒をそれぞれ1ビットずつで
難しすぎる
>>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();
}
>> 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 ;
839 :
832:2005/06/04(土) 15:52:58
>>833 すみません。そうです、1バイトでした。
基数変換・・・ですか。よくわからないんですが。
>>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;
}
アドレスは取れているが、それを文字列として表示しようとしている
cout << reinterpret_cast<void*>(p_c2) << endl;
でいいんかな?
>>841 operator << に char const* を渡すと "" によるものと同じく、
0 で終わる文字列を表示させることになる。
アドレスを表示させたければ、 static_cast<void*>(&c2) とすればいいだろう。
845 :
初心者:2005/06/04(土) 18:01:10
ありがとうございました.うまくいきました.整数型と同じようにアドレスが取れていることがわかりましたので,843, 844が書いてらっしゃる 「<<」 の機能や,static_cast<void*>,reinterpret_cast<void*>を勉強してみます.
847 :
デフォルトの名無しさん:2005/06/04(土) 20:21:43
#include<stdio.h>
int main(int argc, char *argv[]) // 引数付きmain()の基本的な形
{
……云々といったプログラムを組みたいのですが、VCでのパラメーターの入力が出来ません。
Unix環境だと出来るのですが、家だとこういったもの出来ないのでしょうか?
849 :
デフォルトの名無しさん:2005/06/04(土) 20:24:27
>>848 F5でしか実行方法がわからないのです。
F5をおすとパラメータを入力していないので、パラメータ入力無しの実行結果になってしまいます。
> VCでのパラメーターの入力が出来ません
??何がどうできなかったんだ??
君が作ろうとしてるのはVC++では「Win32コンソールアプリケーション」と呼ばれる
種類のプログラムで、いわゆるDOS窓上で実行される。
DOS窓開いてプロンプトに君の作ったプログラムの名前と引数入力すれば、普通に
受け付けてもらえるよ。
まあ、シェルが違うから、引用符やワイルドカードの扱いだのが
UNIXとは違うがね。
VC++上のデバッガから実行しようとしてるのか。
なら、デバッグオプションで引数を設定するんだね
VC++のバージョンにもよるが、プロジェクトの設定にデバッグという
項目があって、そこで引数を指定できるはずだ
>>849 use cmd.exe or command.com
853 :
デフォルトの名無しさん:2005/06/04(土) 20:28:19
>>850 >>851 丁寧かつ即レスありがとうございます。
うまく入力させることが出来ました、精進します。
>>854 > count++;
アドレスをインクリメントしちゃダメだろう。
(*count)++;
>>854 × count++
○ (*count)++
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() を使わせたくないのですが、こういったとき、
どう継承させればよいのでしょうか?
858 :
854:2005/06/04(土) 21:36:47
>>857 class cc : public cb {
public:
void hoge_c(){ cout << "test3";}
private:
using ca::hoge_a;
};
class cc : private cb じゃだめなのかな?
ttp://cham.ne.jp/piro/p_cp.html ここに、動的3次元配列のサンプルがのっていて、コンパイルしたら、
warning C4786 とか、識別子が '255' 文字に切り捨てられました
など、ものすごい数の警告が出るのですが、そもそもこのやり方は普通なのでしょうか?
vector<vector<vector<int> > > の、> > の間にスペースが無きゃいけない、
あたり、なんだか強引な気がします。皆さんのご意見を伺いたいです。
>>862 > vector<vector<vector<int> > > の、> > の間にスペースが無きゃいけない、
> あたり、なんだか強引な気がします。
とりあえず、これは動的3次元配列云々とはまったく別の問題。
「最後の文字が '>' である型を、最後のテンプレートパラメータとして用いること」は
強引でも何でもなく、そのことをスペース無しで判別できない言語仕様のほうに問題がある。
つっこみが入らなかったあたり、やり方としては普通なのですね。
けれど、そもそもどうやって使えばいいのでしょうか?
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] ... と、適当な数字をいれて、文字列
にしたつもりですが、表示もうまくいきません。
>>862 warningは#pragma使うなり、
「> >の」スペースについては適宜typedefするなりして対処
>>862=
>>865 warning 4786はSTL使うと必ず出る警告
pragma使うなどしてコンパイラにwarning 4786を出さないようにさせるか、自分で無視しなされ
>>865 とりあえずオマエは普通の配列とvectorを混同しすぎ
そのobj[0]で返されるのはvector全体であって配列内のデータじゃない
それをcoutしてもオマエが思ってるような表示がされるわけないだろ
>>866 なんか色々間違ってるぞ。
まず、cout << [vector<t>型] なんてやっても、全要素が一気に出力されたりはしないぞ。
要素を一つ一つ出力しなきゃ。
それから、char型の変数に「適当な数字」を入れたら、そりゃ表示されないこともあるだろうよ。
文字として出力可能な値じゃなきゃ。
あと、push_backってのは要素数を一つ増やしてそこに引数のコピーを代入する関数だから、
そのコードだとobj[j][0]〜obj[j][4]には何も代入していないことになる。
その代わりにobj[j][5]〜obj[j][9]までが新たに作られ、そこに各値が代入されている。
resize(5)がcapacity(5)なら意図した通りに動くがね。
870 :
869:2005/06/04(土) 23:16:18
>>863,
>>866-870 レスありがとうございました。配列とvector は意味合い的には違うのですか。
C++はまだ僕には敷居が高いようです・・・。
警告の方は #pragma warning( disable : 4786 ) を付けたら消えてくれました。
STL使うと必ずでる警告だったのですね、安心です。
大変色々と、勉強になりました。
>>871 普通の配列はただの変数、vectorはクラス
>>872 頼むから、初心者スレで偉そうにデタラメを言うのはやめてくれ。
ここ二週間くらいでこのスレの回答者のレベルが著しく落ちた件について。
落ちたか?
元から低いの間違いだろ
まあ気のせいかも知れんね。
俺はこのスレの回答者のレベルが低いとは思っていないが。
877 :
デフォルトの名無しさん:2005/06/05(日) 00:19:10
質問なのですがファイルを読み込むときにファイルのデータではなく
ファイルの属性や最新更新日時を読み込む方法はないでしょうか?
>>877 それ思いっきり環境依存。ファイルシステムの問題だから。
まあUNIXのシステムコールであるstat()やfstat()はWindowsのコンパイラでも
サポートされてたりはするが。
880 :
877:2005/06/05(日) 00:28:15
>>878 おぉ!こんな関数があったのですね!
早速試してみます。ありがとうございました!
>>879 【初心者歓迎】C/C++室 Ver.17【環境依存OK】
思いっきり環境依存、って
質問者が自分の環境を書いていないことから
「自分の質問の内容が環境依存であることがわかってない」と判断して
それが環境依存であることをまず明確にし、
ついでにstat()やfstat()がUNIX系でもWinでも使えることまで教えてあげてるのが
>>879だろ?
それに対する
>>881の反応がよくわからんのよ。
そんなことどうでもいいから次の質問どうぞ
886 :
879:2005/06/05(日) 01:45:34
#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('!'); が通らないのは、コンパイラが古いからなのでしょうか?
結構ググったんですけど、一向に答えが見つからないっす・・・
888 :
888:2005/06/05(日) 02:01:51
いまさらVC++6.0使ってるのが悪い。が、VC++6.0でもSTLportいれればいけた気もするが。素直にVC++のバージョンあげとけ
stringにpush_backってあったっけ?
std::string str1 = "Judges live on income";
std::string str2 = " fixed";
string が別のやつと思われてるとか
string に push_back はある。
893 :
890:2005/06/05(日) 02:12:20
やっぱ無いわ
最新のPlatformSDKのlibはVC++6のリンカではリンクできなくなったらしいね
VS.NET 2003付属のやつとかだとまだいけるけど
まあいい加減寿命だよなあVC++6も
>>889 察するに、やはり新しいのには push_back が入っているっぽいですね
時期がくるまで、str1+='!'; で凌ごうと思います。
レスありがとうでした
標準規格見たけどbasic_stringにはpush_backメンバがあるらしいぞ。
21.3
>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を用意すればとアドバイスされてたのですが
自分にはそれさえよくわかりません誰か詳しく教えて下さい。
検索して libuser32.a があるか
おまいはcygwin使う前に学ばなければならない事がたくさんある気がする
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のコマンドだけでリンカまで行く??
>>901 そのouter_functionはどのインスタンスに対して呼んでる?
C++のインナークラスはjavaでいうstaticなインナークラスになります。
>>903 「privateの外側の関数」、という表現が誤解を招いてしまったようですね。
単に、クラスinnerから、クラスouterにあるouter_functionを呼び出したい、ということです。
的外れでしたらごめんなさい。
>>904 とりあえず
>>901ではouter_function()の呼び出しに必要なouterのインスタンスが存在しないからエラーで当然。
outer_function()をstaticにするか、どこかでouterのインスタンスを与える必要がある。
906 :
903:2005/06/05(日) 06:32:27
誤解はしてないと思う。結論から言えばこう。
class inner {
outer* out;
void inner_function(void) {
out->outer_function();
}
もしスレ違いだったらごめんなさい。
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って総合開発環境の事ですか?
>>905,906
関数名とその中身を書いたものに対しては呼べなくて
実体が無いと駄目ということですね。そしてその実体のことを
インスタンスと言う、でしょうか。
とにかく勉強になりました、ありがとうございます。
自分のコード内でも
>>906で示して頂いたソースで解決できました。
>>907 普通に考えて、HDDインターフェースとコンパイラが関係あるとは思えないが。
>>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;
}
>>911 お手本のプログラムを理解するのに、多少時間がかかってしまいました・・・
レスが遅れて申し訳ないです。
>>910 のプログラムでつっこみどころが多いかと思いますが、それはただ単に
知っている範囲で強引に作ったからです。
しかし、ずいぶんすっきり出来るものなのですね。ご教示ありがとうございました。
914 :
898:2005/06/05(日) 18:39:00
902さん、899さん、900さんありがとうございました。
なんとかコンパイルできるようになりました。
特に902さん、どもでした。
基本的な事なんだと思うんですけど教えてください。
char c=25;
cout<<c;
ってやると文字で25に対応するのが出力されますよね?
そうじゃなくてこのときの出力で25を出すにはどうしたらいいですか?
Cなら
printf("%d",c);
ってやれば出せるようなのをcoutを使って出せるのか?
ってことなんですけど、
どうやって調べればいいのかわからないので教えてください。
char c[3];
sprintf(c, "%d", 25);
cout << c;
>>915 std::cout << static_cast<int>(c);
>>917 できました。
ありがとうございました。
cout<<(int)c;
で行けなかったっけ?
>>920 おや、、よくわからないんですが、こういうのはイクナイん?
>>921 C++の入門書とか読んだ事あるか?
std::は要らないけど、static_cast<int>はC++形式のキャストだぞ。
924 :
デフォルトの名無しさん:2005/06/05(日) 21:40:33
え〜、なんで〜
cout << static_cast<int>(c);
より
cout << (int)c;
の方が簡潔でいいじゃん。
>>922-923 なるほど。C++はお勉強途中なので、
独自のキャストがあるとは知りませんでした。
どうもありがとう。
あと、
>>915さん、嘘書いちゃってごめんねー。
>>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あたりで、あらかじめある文字列を、チェックする予定です。*/
}
すんませんが、質問させて下さい。
Windowsでウインドウの内部座標を取ろうとしてるんですが
GetWindowRect(hWnd,&rect);
でrectにWindowの座標を代入出来ますよね?
でもタイトルバーなどを含んだ外側なのですが
これをタイトルバーなど含まない完全な内側の座標を取得するには何か足りないのでしょうか?
そしてステータスバーまでは考慮してくれないことに涙せよ
>>927 その「テキストファイル」の中身は1行しかなくてしかも255byte以下と
決まってるのか?そうでないと対応できないコードになってるが。
もしそうなら、わざわざmalloc()とか使う必要なし。ただの配列に読み込めばいい。
それと、
fgets(s, 256, fp)== NULL
は意味不明。
>>933 おれのモニタには「Cなら」と写っている。
935 :
927:2005/06/05(日) 22:52:00
>>932 >その「テキストファイル」の中身は1行しかなくてしかも255byte以下と
>決まってるのか?そうでないと対応できないコードになってるが。
改行コードがあってもできるほうが良いですが、これではだめですか。。。
なにがいけないのでしょうか?
ファイルの大きさ分だけ動的に確保したかったのですが、わからず
255byte としました。
>fgets(s, 256, fp)== NULL
'==NULL'部分は間違えですね。fgets(s, 256, fp)が正しいです。
これで256byte分の読み込み仕様とおもってました。
>Cなら
>printf("%d",c);
>ってやれば出せるようなのをcoutを使って出せるのか?
cout をつかって出せばよさそうなので C++ ではないかと。
あとさ、質問は
>どうやって調べればいいのかわからないので教えてください。
ってところだから誰もマトモに答えてないんだよね。
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 つまり俺は魚が欲しいんじゃなく、魚の釣り方を教えて欲しい、と言っているのか?
だとしたらあっぱれだな。見所がある。が、ちがうんじゃないカナ?
windowsでは
fopen("./sample.txt","r")
"rb"だろ、ファイルは
おいおい初心者ばっかりだな
と思ったら初心者スレでしたよ
すまんすまんうろ覚えで、はじめは
fopen("./thxxx0.cpp","br") <- "rb" でなく
ってやってて、コンパイルは通ったがファイルが開けなかったん…
で、悩んだあげく送信。
orz
>>938 改行コードが違うのは常識な。WindowsではCR+LF、UNIXではLF。
で、テキストモードでファイルを開いた場合(fopenで"b"を指定しなければ
テキストモードになる)は、UNIX風にファイルを\nで終端された
行の集まりに見せるために、Cランタイム側で細工をしている。
そういう事情もあって、テキストモードでのfseek()は、ftell()で得た
ポイントへの移動しかサポートされない。
944 :
927:2005/06/05(日) 23:44:14
>>938-943 早急におしえていただき、ありがとうございました。
fseek()は、ftell()あたりは、まだちゃんと理解できていないので
ググッて勉強してきます。
945 :
928: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に内部のスクリーン座標を入れようとしてみたのですが
これでは何故か上手く座標が設定されないんですがどうすれば良いでしょうか?
>POINT point;
>ClientToScreen(winsys->hWnd,&point);
何を期待してるんだ?
RECT rect
と
POINT point
は違うだろ
>>945 ClientToScreenにもそのまま&rectを渡せ。
>>946 クライアント座標をスクリーン座標に変換したかったのかと思われる。
winsysにシステムを色々と入れてるんだろうと予想して…
こういう事をしたかったんじゃないか?
rectでclientサイズ取得してpointでclientのscreen座標を求める。
それをrectに移してサイズ取得したのを代入すればclient内部のscreen座標が出るとでも。
どう期待したらこう思うのか良く解らないが。
>>948 それだと
'ClientToScreen' : RECTからPOINT変換不可
が出てくると思う。
なので
ClientToScreen(winsys->hWnd,(POINT)&rect);か?
RECTとPOINTは違うけどいけたと思う。
>>950 RECTとPOINTはそれで無理。
漏れが知ってる事でマジレスするとそのまま&rectは渡せない。
スマソ。初心者なので答えは任せる。
>>945 マジレスするとPOINTの宣言後にPOINTの初期化がされてないから。
POINT point = {0,0};
で一応上手くいく。
更新して立ってなかったら次スレ立ててくるわ。
>>953 スレタイから環境依存OKを外したのは意味があるのか?
あと、 Ver が vol に変わってるのも意味がわからん。
スマソ。単に環境依存OK文字忘れていたorz
今までvolと思っていて見直したらverだったんで凹む。
やっぱスレ立てたの間違いだったorzマジスマソ
>>945 どっちかっつとWin32APIスレ行きな質問だな。
GetWindowRectとGetClientRectで自前計算できようが
pointが未初期化。
pointにrectのleft,top入れるべし、、、ってどうせゼロだから0入れればいいけど。
んで、rectの4つすべてに足して平行移動しないと。
API以前の話だな
age
959 :
デフォルトの名無しさん:2005/06/06(月) 14:50:11
miss!
ゲームの補助ツールを作っているのですが、
F1キーを押す、みたいな関数って無いんでしょうか。
調べてもキーが押されているかどうかを調べるようなのは色々あるようなのですが。
環境はVC++です。
OS何よ?っても、ゲームって言うしたぶんWindowsじゃろうけど
VC++って書いてあんだろ
SendMessageでメッセージをウィンドウに送ればいいかと
VK_F1だっけか
963 :
960:2005/06/06(月) 20:15:26
>>961 すみません、書き忘れてました。
Windowsです。
>>962 VC++でWindowsのアプリしか作れないのか?
VC++はクロスコムパイラじゃないだろ
どれにしても結局Windows上で動く罠。
CE用のはターゲットCPU幾つか選べまんねん。
969 :
960:2005/06/06(月) 23:18:29
一応PostMessage(HWND_BROADCAST, WM_KEYDOWN, VK_F1, 0)
で思ったような動作はしたのですが、どうも遅い気がします。
何か遅くなるような原因とかあるんでしょうか…?
970 :
877: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++;
}
実行するとメモリアクセスエラーが発生します。
>>970 書き込む先のメモリを割り当てるとよい。
972 :
デフォルトの名無しさん:2005/06/06(月) 23:55:36
>>971 メモリを割り当てるというのは
mallocを使うと言うことでよろしいのでしょうか?
んだ
974 :
972:2005/06/07(火) 00:00:17
なるほど、mallocを調べてみてもう少しがんばってみます!
ありがとうございました。
975 :
780:2005/06/07(火) 02:40:46
>>974 mallocしたらちゃんとfreeしとけよ。
って漏れこんな指摘ばっか。最近これでひどい目にあいまつた。
>>969 そりゃBROADCASTしてりゃ重くなるわ
>>969 ネットワークのMACアドレス問い合わせパケットじゃねぇんだからよ、
ある特定のアプリの窓にメッセージ送るのにいちいちBROADCASTするなんてただの阿呆だぞ。
目的のアプリの窓のハンドル取得して直接送れ
978 :
960:2005/06/07(火) 15:54:35
>>977 ハンドルって毎回変わるやつですよね?
すみません、スキル足らずで取得の方法がわからなくて…。
>>978 それはプログラムのスキルが足らないんじゃなくて検索のスキルが足らないな
おまえさんに必要なのはC/C++のことよりもWin32APIのことだし、
今後わからないならWin32APIスレで聞くとよい
こりゃSendInputやらkeybd_eventの存在も知らなそうなだ
単一のWindowにKEYDOWN送るのにkeybd_eventすることも無いと思うが
まあな
演算子のオーバーロードの辺りで頭がこんがらがっちゃいました。
だれかこんな僕に優しくわかりやすく教えてください
>>984 どんな風にわからないのか、優しくわかりやすく説明してくれ。
なんもかんもわからんで、どないもこないもなりませんわ
やめちまえ
すみやかにその企画を終了し、別の企画に取り組みたまえ
operator T( ){
throw ぬるーり;
}
>>990 x == 0 のとき、a[0][1] は 1 になるが、
x == 1 のとき、a[0][1] はどうなる?
>>990 >/*構造体型struct edgeの宣言*/
言われんでも見りゃわかるわw
「何をしてるのか」じゃなくて「何をしたいのか」をコメントしような
この場合なんのつもり(何に使うつもり)で構造体edgeを宣言
したのかを書いてくれ
ちなみにxを使ったループが外にあるせいで
毎回結果が上書きされてx==9の場合の結果しかaに入ってないが
それが意図した操作なのか?根本から間違ってるように見える
ちと、文字列の半角を全部全角に切り替える処理を行いたいんですが
VBのstrtocnvみたいな便利な関数は無いですか?
LcMapString()
>>967 今だと Xbox360 (PowerPC) とか。