[表示 : 全て 最新50 1-99 2chのread.cgiへ]
Update time : 06/03 14:43 / Filesize : 8 KB / Number-of Response : 33
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

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



1 名前:デフォルトの名無しさん [2009/11/22(日) 16:04:30 ]
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。

【前スレ】
【初心者歓迎】C/C++室 Ver.69【環境依存OK】
pc12.2ch.net/test/read.cgi/tech/1256022655/

【アップローダー】(質問が長い時はココ使うと便利)
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
codepad.org/ (コンパイルもできるし出力結果も得られるのでお勧め)

◆ソースのインデントについて
半角空白やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのも手ですが直接貼る場合は、
全角空白か に置換すると見栄えだけはよくなります。

2 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 16:05:48 ]
ぬるぽ

3 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 16:07:14 ]
>>1
自分は立てたくても立てられなかった

>>2
ガッ

4 名前:デフォルトの名無しさん [2009/11/22(日) 19:49:45 ]
おつ

5 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 19:59:40 ]
生態シミュレートのプログラムを作ろうと思ってるんだけど、無限に要素数を増やす方法を
どうしたらいいのかがわからないんだけど。

一応ひとつ思いついた方法としては、構造体の中に、自分自身へのポインタを持たせて、
そのポインタをはじめは0にしておく。で、新しくnewかなにかをして、そのポインタを既存の要素に
持たせる・・・って感じなんだけど、これだと、途中で要素が消失したとき、その後の要素が
行方不明(ポインタが何処にも存在しない状態)になってしまう・・・ね。
はじめからポインタを用意してたら、上限数が決まっちゃうし、どうしたらいいかな?

6 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 20:08:37 ]
STLの適当なコンテナ使えよ
どうしても自分で書きたいならリンクリストでググれば望みのものがでてくる

で、なんで生態系シミュレートにリンクリストがいるんだ?
生物を数珠つなぎにしてなにかいいことあるのか?

7 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 20:16:06 ]
無限に増えるシミュだとすぐにメモリが枯渇する気がする

8 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 20:26:49 ]
>>5
消える要素の後の要素のポインタを、消える要素の前の要素のポインタにつっこめばいい。

9 名前:デフォルトの名無しさん [2009/11/22(日) 21:13:54 ]
質問です。

char *func(){
char str[]="hogehoge";
return str;
}

void func2(){
char *str;
str=func();
}

とした場合、
func2内での、strの配列の領域が保証される寿命ってどこまでなのでしょうか?
func()抜けた瞬間、strが解放されると思ったんですが、一応暫く使えてるんですが・・・


10 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 21:23:04 ]
>>9
抜けた瞬間消えるけど、わざわざクリアしないし、しばらくは残ってるな。
基本、アクセスしちゃだめ。



11 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 21:27:04 ]
いやいや、staticでない関数内で確保した領域のアドレスを関数外に返しちゃ駄目でしょ

void func(char *str){
 str = "hogehoge";
}

void func2(){
 char *str;
 str = func(str);
}

12 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 21:27:11 ]
>>9
解放されない。
いつでも使える。

13 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 21:29:38 ]
間違えてた、返り値消してない

void func(char *str){
 str = "hogehoge";
}

void func2(){
 char *str;
 func(str);
}

14 名前:デフォルトの名無しさん [2009/11/22(日) 21:35:50 ]
>13
何がしたいの

15 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 21:38:03 ]
>>13
馬鹿はほっとけ

16 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 21:39:31 ]
>>14
間違えたw。
馬鹿は13でよろしこw。

17 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 22:10:45 ]
>>9
>char str[]="hogehoge";

これ結構な高コストだからあまり多用しないほうがいいよ。
static char str[]="hogehoge";

なら良いけど。


18 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 22:18:00 ]
>>17
ポケモンカードでいうと、エネルギーカード2枚分くらいのコストですか?

19 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 22:18:54 ]
>>13はCプログラマを名乗っちゃいけないレベル

20 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 22:19:09 ]
>>17
分かってないなぁw
改悪になってる・・・

ひょっとして"hogehoge"用に領域が9バイト確保された後、コピーされると思っていない?
違うんだなぁ、これがw。
プログラムがRAMにロードされたとき、
データとして"hogehoge"はメモリ上に展開されて、
その代入ではホゲ文字列の先頭アドレスがstrに設定されるだけ。

分かる?スタティックにする理由は何?



21 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 22:29:15 ]
>>20
つりか?

22 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 22:30:17 ]
>>20

23 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 22:41:34 ]
コピーされなかったら配列は永遠に初期化できないじゃないか。
char *str = "hogehoge"; ならともかく。

24 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 22:43:40 ]
コンパイル時に数が決まるから strcpy() よりは早いけどな。
まあ、ループ展開しないと比較演算は必要だから同じか。

25 名前:20 mailto:sage [2009/11/22(日) 23:01:28 ]
>>23
おぉ、すまんすまんw。
自分のコーディングスタイルと違うので間違っちゃったw。

char str[]="hogehoge";

ってすると、スタックに積まれてたw。
これは危険だ!

なにげに勉強になっちゃったw。
では、さらばだ!


26 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 23:37:40 ]
>>6
いや、数珠つなぎにしたいとかじゃなくて、無限に要素を増やしたいから、どうしたものか・・・と。
で、自分がとりあえず考えた方法があれだったっていう

>>8
だなぁ・・・。
やっぱ、そうしかないのかな?



とりあえず、回答ありがとう。

27 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 23:50:55 ]
>>5
遅くていいならディスク上にファイルとして配列を持ち、ガリガリやれよ
相当遅いが、1TBの配列だって持てるわけだ

28 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 00:02:45 ]
*dataと*tmpを用意、*dataに大きさNの配列を動的に確保
要素数がNを超えそうなら*tmpに大きさ2Nの配列を確保して*dataの内容をコピー後ポインタをスワップ
スワップ後のtmpを解放

まあただのvector実装なんだが

29 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 00:09:32 ]
そも無限は無理。

30 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 01:51:22 ]
>>26
だから、無制限に要素を増やそうとすると数珠繋ぎとかになるんだよ
じゃなきゃ、溢れた時にでかい領域を再確保してコピーするとかな

で、それらをきっちりやってくれるのがSTLコンテナだが、原理知らないで使うと
えらいパフォーマンス落としたりもするから、一度自分でそれらしく書いてみても
いい
理屈が理解できたら、STLコンテナを使っちゃった方が安心で軽くて楽だが



31 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 01:56:40 ]
128KBくらいのブロックをつなげろよ。
HDDのクラスタと同じようなもん。
vectorなどは、再配置するから効率悪い。
ブロックで管理すれば再配置無し。

32 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 02:02:35 ]
実質ブロックで管理(仕様では明記してないけど)してて
それなりに高速なデータ構造となるとstd::dequeかな。

悩んだらとりあえずdequeつかっとけというのが俺の経験則。






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](*・∀・)<8KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef