09/11/22 16:05:48
ぬるぽ
3:デフォルトの名無しさん
09/11/22 16:07:14
>>1 乙
自分は立てたくても立てられなかった
>>2
ガッ
4:デフォルトの名無しさん
09/11/22 19:49:45
おつ
5:デフォルトの名無しさん
09/11/22 19:59:40
生態シミュレートのプログラムを作ろうと思ってるんだけど、無限に要素数を増やす方法を
どうしたらいいのかがわからないんだけど。
一応ひとつ思いついた方法としては、構造体の中に、自分自身へのポインタを持たせて、
そのポインタをはじめは0にしておく。で、新しくnewかなにかをして、そのポインタを既存の要素に
持たせる・・・って感じなんだけど、これだと、途中で要素が消失したとき、その後の要素が
行方不明(ポインタが何処にも存在しない状態)になってしまう・・・ね。
はじめからポインタを用意してたら、上限数が決まっちゃうし、どうしたらいいかな?
6:デフォルトの名無しさん
09/11/22 20:08:37
STLの適当なコンテナ使えよ
どうしても自分で書きたいならリンクリストでググれば望みのものがでてくる
で、なんで生態系シミュレートにリンクリストがいるんだ?
生物を数珠つなぎにしてなにかいいことあるのか?
7:デフォルトの名無しさん
09/11/22 20:16:06
無限に増えるシミュだとすぐにメモリが枯渇する気がする
8:デフォルトの名無しさん
09/11/22 20:26:49
>>5
消える要素の後の要素のポインタを、消える要素の前の要素のポインタにつっこめばいい。
9:デフォルトの名無しさん
09/11/22 21:13:54
質問です。
char *func(){
char str[]="hogehoge";
return str;
}
void func2(){
char *str;
str=func();
}
とした場合、
func2内での、strの配列の領域が保証される寿命ってどこまでなのでしょうか?
func()抜けた瞬間、strが解放されると思ったんですが、一応暫く使えてるんですが・・・
10:デフォルトの名無しさん
09/11/22 21:23:04
>>9
抜けた瞬間消えるけど、わざわざクリアしないし、しばらくは残ってるな。
基本、アクセスしちゃだめ。
11:デフォルトの名無しさん
09/11/22 21:27:04
いやいや、staticでない関数内で確保した領域のアドレスを関数外に返しちゃ駄目でしょ
void func(char *str){
str = "hogehoge";
}
void func2(){
char *str;
str = func(str);
}
12:デフォルトの名無しさん
09/11/22 21:27:11
>>9
解放されない。
いつでも使える。
13:デフォルトの名無しさん
09/11/22 21:29:38
間違えてた、返り値消してない
void func(char *str){
str = "hogehoge";
}
void func2(){
char *str;
func(str);
}
14:デフォルトの名無しさん
09/11/22 21:35:50
>13
何がしたいの
15:デフォルトの名無しさん
09/11/22 21:38:03
>>13
馬鹿はほっとけ
16:デフォルトの名無しさん
09/11/22 21:39:31
>>14
間違えたw。
馬鹿は13でよろしこw。
17:デフォルトの名無しさん
09/11/22 22:10:45
>>9
>char str[]="hogehoge";
これ結構な高コストだからあまり多用しないほうがいいよ。
static char str[]="hogehoge";
なら良いけど。
18:デフォルトの名無しさん
09/11/22 22:18:00
>>17
ポケモンカードでいうと、エネルギーカード2枚分くらいのコストですか?
19:デフォルトの名無しさん
09/11/22 22:18:54
>>13はCプログラマを名乗っちゃいけないレベル
20:デフォルトの名無しさん
09/11/22 22:19:09
>>17
分かってないなぁw
改悪になってる・・・
ひょっとして"hogehoge"用に領域が9バイト確保された後、コピーされると思っていない?
違うんだなぁ、これがw。
プログラムがRAMにロードされたとき、
データとして"hogehoge"はメモリ上に展開されて、
その代入ではホゲ文字列の先頭アドレスがstrに設定されるだけ。
分かる?スタティックにする理由は何?
21:デフォルトの名無しさん
09/11/22 22:29:15
>>20
つりか?
22:デフォルトの名無しさん
09/11/22 22:30:17
>>20
23:デフォルトの名無しさん
09/11/22 22:41:34
コピーされなかったら配列は永遠に初期化できないじゃないか。
char *str = "hogehoge"; ならともかく。
24:デフォルトの名無しさん
09/11/22 22:43:40
コンパイル時に数が決まるから strcpy() よりは早いけどな。
まあ、ループ展開しないと比較演算は必要だから同じか。
25:20
09/11/22 23:01:28
>>23
おぉ、すまんすまんw。
自分のコーディングスタイルと違うので間違っちゃったw。
char str[]="hogehoge";
ってすると、スタックに積まれてたw。
これは危険だ!
なにげに勉強になっちゃったw。
では、さらばだ!
26:デフォルトの名無しさん
09/11/22 23:37:40
>>6
いや、数珠つなぎにしたいとかじゃなくて、無限に要素を増やしたいから、どうしたものか・・・と。
で、自分がとりあえず考えた方法があれだったっていう
>>8
だなぁ・・・。
やっぱ、そうしかないのかな?
とりあえず、回答ありがとう。
27:デフォルトの名無しさん
09/11/22 23:50:55
>>5
遅くていいならディスク上にファイルとして配列を持ち、ガリガリやれよ
相当遅いが、1TBの配列だって持てるわけだ
28:デフォルトの名無しさん
09/11/23 00:02:45
*dataと*tmpを用意、*dataに大きさNの配列を動的に確保
要素数がNを超えそうなら*tmpに大きさ2Nの配列を確保して*dataの内容をコピー後ポインタをスワップ
スワップ後のtmpを解放
まあただのvector実装なんだが
29:デフォルトの名無しさん
09/11/23 00:09:32
そも無限は無理。
30:デフォルトの名無しさん
09/11/23 01:51:22
>>26
だから、無制限に要素を増やそうとすると数珠繋ぎとかになるんだよ
じゃなきゃ、溢れた時にでかい領域を再確保してコピーするとかな
で、それらをきっちりやってくれるのがSTLコンテナだが、原理知らないで使うと
えらいパフォーマンス落としたりもするから、一度自分でそれらしく書いてみても
いい
理屈が理解できたら、STLコンテナを使っちゃった方が安心で軽くて楽だが
31:デフォルトの名無しさん
09/11/23 01:56:40
128KBくらいのブロックをつなげろよ。
HDDのクラスタと同じようなもん。
vectorなどは、再配置するから効率悪い。
ブロックで管理すれば再配置無し。
32:デフォルトの名無しさん
09/11/23 02:02:35
実質ブロックで管理(仕様では明記してないけど)してて
それなりに高速なデータ構造となるとstd::dequeかな。
悩んだらとりあえずdequeつかっとけというのが俺の経験則。