【初心者歓迎】C/C++室 Ver.4【環境依存OK】
>>936への>937に対するどうでもいい補足
vector限定なら、予めreserveした領域はinsertしてもそのまま使える。
また、insertしなければ(当然)そのまま使える。
eraseした場合もeraseした要素より前の要素についてはそのまま使える。
再配置後、イテレータが無効になるのはvectorだけじゃなかったけ?
deequeも無効になったけか?
とりあえず、setとmapは保証されてたような・・・。
set と map は再配置しないし...。
>>941 すまん、なんか勘違いしてるからつってきます。
>>923 > なぜ八進数を用意したのだ?
カーニハンとかが使ってたミニコン (ミニコンポじゃねーぞ) の PDP7 とかの機械語が 8 進数ベースだったから。
ちなみに、C 言語はそれ以外にも printf("%d\n", 010) とやると 10 と出力されないとか、8 進数基調のところがいくつか見られる。
>>943 >010) とやると 10 と出力されないとか
こういうのは8進数基調というより、単に8進数を扱いやすいだけというべきだよな。
>>944 扱いやすいだけなら、0o277 とかで充分だと思うけど。
ついでに、0b11111111 とかも用意してもらえたらよかったのに。
946 :
デフォルトの名無しさん:04/02/14 14:26
再帰関数の再帰って英語で何だっけ?
recursive かと思ったんだけど、辞書に載ってなかったので。
>>947 どうもです。
研究社の新英和中辞典にも載ってないってことは
結構専門的な言葉なのかな。
recurse でも載ってない。
951 :
デフォルトの名無しさん:04/02/15 11:14
BorlandC++Builder使ってます。
TObjectを継承したクラスAを作ろうと思うんですが…うまくいきません。
デストラクタが基本クラスTObjectと矛盾すると言われてどうしてもうまくいかない
のです。
なぜなんでしょう?どなたが教えてください
どなたさん、ご指名ですよ。
どなたさん、ご足労ありがとうございました。
自己解決しましたので
955 :
デフォルトの名無しさん:04/02/15 20:42
関数の戻り値で2つ以上の値を返す事ってできないんですか?
int hoge(){
int a,b;
...
...
...
return a,b;
}
みたいな感じなんですが。
int hoge(){
int a,b;
int n[2];
...
...
..
n[0]=a;
n[1]=b;
return n;
}
こうならOKなんでしょうか?
957 :
デフォルトの名無しさん:04/02/15 21:02
>>956 それってC++標準ライブラリじゃないですよね?
gccでコンパイル通りますか?
958 :
デフォルトの名無しさん:04/02/15 21:06
>>955 戻り値を構造体にまとめてしまうとか、
ポインタ型の引数を受け取って
そのポインタの中身を書き換えて返すとかする。
グローバル変数にしてしまって、関数内でそれを書き換えさせる
ド顰蹙ものの解決法も。
int hoge(){
int a,b;
int n[2];
...
...
..
n[0]=a;
n[1]=b;
return n;
}
はダメ。戻り値の型はintなのに、int配列(の先頭アドレス)を返そうとしてる。
またnの内容は関数内でしか有効でないので、アドレスを渡しても受けたときには
そこにあったnの内容は消えている。文字列でも同じ。
昨日はエロゲーで徹夜したので、きょうはもう寝る。
>>957 導入じたい難しくないから、自分でためしてみろや。
やるきねー奴だな。
>>955 俺も初心者だが考えてみたよ。
これでどうだろう。
#include <stdio.h>
int *hoge(void);
int main(void)
{
int *p;
p = hoge();
printf("n[0]=%d, n[1]=%d", p[0], p[1]);
return 0;
}
int *hoge(void)
{
int a=1,b=2;
int n[2];
//...
//...
//..
n[0]=a;
n[1]=b;
return &n[0];
}
ちなみに、return n+0; でもうまくコンパイルできた。
int *np; np = n; return np; でもうまくコンパイルできた。
ただし return n; は警告が出た。
添え字無しのnを「配列の先頭を示すポインタ」とみなし
てくれるのは、あくまでも式の中ということかね。
>>963 >警告が出た
そりゃ、ローカル変数のアドレスを返そうとしてるからだ
ローカル(auto)変数のアドレスを返しちゃいかんよ。
いや、返すこと自体は構わないが、その中身を参照しても正しくは動かない。
(動くこともあるかもしれないが、それは偶然)
せっかくコンパイラが警告を出してくれているのだから
「とにかく警告が出なくなればいい」ではなくて、
せめてその意味くらいは考えよう。
>>963 >>958に書いてあるようにhoge内で定義された領域に
hoge外部からアクセスしちゃだめ。
2つ程度ならポインタ型の引数を受け取るのが簡単。
void hoge(int *a, int *b)
{
*a=1; *b=2;
}
みたいな
これもFAQに近い内容なんで簡単にまとめておくと
1 出力先の変数のアドレスを引数として受け取るようにする
2 返したい値を全て含む構造体を導入してそれを返すようにする。
2' C++であれば標準ライブラリの std::pair の利用法を参考にするとよい。
>>964-967 ありがとうございます。間抜けなことをしてしまった…。
ローカル変数のアドレスではなく値を直接返すように直しました。
今回のような場合は、
>>966の方法が簡単そうですね。もし、
>>955の、
「関数の戻り値で2つ以上の値を返す」形にこだわる必要があるなら、
やはり(C言語では)構造体を使うことになるのかな。
#include <stdio.h>
struct s_type {
int a;
int b;
};
struct s_type hoge(void);
int main(void)
{
struct s_type to;
to = hoge();
printf("a=%d, b=%d", to.a, to.b);
return 0;
}
struct s_type hoge(void)
{
struct s_type from;
from.a=1;
from.b=2;
return from;
}
>>968 #include <stdio.h>
struct s_type {
int a;
int b;
};
void hoge(s_type* ps){
ps->a=1;
ps->b=2;
}
int main(void){
struct s_type s;
hoge(&s);
printf("a=%d, b=%d", s.a, s.b);
return 0;
}
>>968 なぜstd::make_pairを使わない?
>>968 >>969に替わって補足
>>969はポインタを使って渡す方法ね
例みたいなメンバが二つしかない構造体ならあんまり問題にならないんだけど、
大きな構造体の場合、データを丸まるコピーするのは高価な処理になるから、
ポインタを使って渡そうっていう話です
ただ、二つ程度のメンバならポインタを使わないほうがたぶん速い
さらにはコンパウンドリテラルとか使ったときに最適化確率アップかも知れず
まあ、ここらへんは環境依存
C でプログラムはじめたんだけど、モジュールの分け方に定石のようなの
はあるんでしょうか?
作りはじめはいいんだけど、いろいろ追加してるうちに、モジュールが
互いに関数とデータを参照しあって、モジュールに分けてる意味が薄れていってし
まうってことが多くて・・。
>>974 ある部品を作ったら、それができる限り単独で動くようにする。
他の部品に依存する場合、依存関係はできる限り一方向にする。
「できる限り」というのがどの程度を差すのかは要件に依存する。
市松模様をつくりたいものです。
int n=8,x=100,y=100,a=40; // nは8マス,xとyは座標,aは中に置くコマの大きさ
int xx=140; // xxは座標
int m=1; // mは1マスと言う意味
// 四角形1マスの色(白)
Hdr = CreateSolidBrush(RGB (255,255,225));
HdrOld = SelectObject(hdc,Hdr );
// 四角形1マスを描く1
Rectangle(hdc,x,y,x+a*m,y+a*m);
SelectObject(hdc,HdrOld);
DeleteObject(Hdr);
//四角形1マスの色(緑)
Hdr = CreateSolidBrush(RGB (0,155,0));
HdrOld = SelectObject(hdc,Hdr );
//四角形1ますを描く2
Rectangle(hdc,xx,y,xx+a*m,y+a*m);
SelectObject(hdc,HdrOld);
DeleteObject(Hdr);
これだとxが100yが100の所に白と、xが140yが140の所に緑が1つずつしか書けない
のですが、これに何か付け加えて8マス×8マスの市松模様を作れませんか?
これを繰り返せばいいのかと思っているのですが、どのようにすればいいのか
よく分かりません。お分かりになる方教えていただけないでしょうか?
(APIです)
978 :
デフォルトの名無しさん:04/02/19 21:53
何の後始末?
コピペ元のスレの後始末かと
>>975 最初の考えはそんな感じなんだけど、つづかんのです・。
最初からもっと詰めとかないとだめってことなのかな?
プロは、どうやってるんだろう。
>>980 ERモデリングでもやってみれば?
必要な属性と動作を取り出すのには初心者には楽かと。
当方VB厨ですが、勉強がてらに
>>976のを書いてみました。
晒してよかですか?
ええよ
じゃぁ、汚いコードかもしれませぬが遠慮なく貼らせていただきます。
int n = 8, x = 50, y = 50, a = 40;
int xx = 10;
int nLeft = 0, nTop = 0;
HBRUSH brOld, brNega, brPosi;
brNega = CreateSolidBrush(RGB(255,255,225));
brPosi = CreateSolidBrush(RGB(0,155,0));
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
nLeft = (i * x) + xx;
nTop = (j * y) + xx;
brOld = (HBRUSH)SelectObject(hdc,
(((i % 2) == (j % 2)) ? brNega : brPosi));
Rectangle(hdc, nLeft, nTop, nLeft + xx + 1, nTop + xx + 1);
SelectObject(hdc, brOld);
}
}
DeleteObject(brNega);
DeleteObject(brPosi);
C系を最初に覚えた方に質問です。
VB6.0できるようになるまで、どれくらいかかりました?
当方おそらく、1週間くらいは合計でやってると思いますが、全然できません。
#include とかないっぽいし(POINT とか RECT とか自分で定義するの?)、
毎回コントロールをプロジェクトで追加しないといけないし、
なんかめんどくさ。つーか、久しぶりに起動するともう全然覚えてないし。
ポインタとか、いまいちわかりづらくなってるし、
覚えるこつってあるんですかね?
MSDN読むしかないのかな?