ポインタ

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
kazuoni

ポインタ

#1

投稿記事 by kazuoni » 17年前

お邪魔します。
ずっとポインタについて勉強してたんですが・・・いくつか疑問が出てきましたので質問させていただきます。

typedef struct{
	const char *abc[3];
}states_t;

states_t states[10]
このように定義したのちにmain文で、↑の構造体でstates[0]でのabc[/url]に、
abc[0]→"要素1"
abc[1]→"要素2"
abc[2]→"要素3"
としたいのですが、
states[0].*occupation[3]={"要素1" , "要素2" , "要素3"};
と記述ができないとすると、どう記述をしたら良いのでしょうか?もしかしたら構造体の中が違うのでしょうか?


メモリの動的確保のところを勉強したんですが、イマイチ使う理由が分からないです。例えばゲームプログラミングでいうと、ゲームの前半では使用していたものが、後半に入ると全く使わなくなるので、メモリを解放すれば、少しでも処理が軽くなる!みたいなことなんでしょうか?あとリスト処理・・・ぐらいですか?

よろしくお願いします。

Re:ポインタ

#2

投稿記事 by » 17年前

#include <stdio.h>

typedef struct{
    const char *abc[3];
}states_t;

int main(void)
{
    states_t states[10];
    
    states[0].abc[0]= "要素1";
    states[0].abc[1]= "要素2";
    states[0].abc[2]= "要素3";
    printf("%s\n", states[0].abc[0]);
    printf("%s\n", states[0].abc[1]);
    printf("%s\n", states[0].abc[2]);
    return 0;
}


なお、main「文」ではなく、main「関数」です。

管理人

Re:ポインタ

#3

投稿記事 by 管理人 » 17年前

動的確保は要素をいくつ用意すればいいか解らない時などによく使います。
例えばリプレイ記録を作る為に、ユーザーが入力した情報を記録しないといけないとします。
わかりやすく単なる配列で説明します。

今キーの入力情報が10種類必要だとします。
(左、右、上、下、ジャンプ、加速、ポーズ・・・等)
60FPSで動いているのならこの10*60個の要素が1秒間に必要です。
30分記録したいのなら10*60*60*30個の要素が必要です。
これは約100万個であり、1メガに相当します。
BYTE型で用意したとしても、1メガバイトも配列だけで占有してしまう事になります。

しかしプレイヤーが30分でクリアするだろうと思っても、途中で点数稼ぎをする為に、わざとゆっくり
行くかもしれないし、どれ位の時間でクリアするかわかりませんよね。
せっかく入念に点数稼ぎしてても、クリア直前になって「リプレイ情報が記録できなくなりました」なんてログが出たらガッカリすると思います。

そこでどうすればいいのでしょう?
使うかどうかもわからないのに、多めに・・1000万個位確保しておくのが適切でしょうか?
いや、使う時に使う分だけ増やす方がいいですよね。

他にもいい例はあるかもしれませんし、リプレイデータはキー入力データを圧縮したりしますし、ビットのオンオフで入力状態を管理する事が多と思うのでいい例だったかどうかわかりませんが、ご紹介しました。

kazuoni

Re:ポインタ

#4

投稿記事 by kazuoni » 17年前

返事が送れて申し訳ありませんでした。。・さん、管理人さんご回答ありがとうございました!
states[0].abc[0]= "要素1";
states[0].abc[1]= "要素2";
states[0].abc[2]= "要素3";
は一つにまとめて定義はできないんでしょうが・・・?

なんだかまだ自分は動的確保をうまく使いこなせそうにないですね^^;w
それよりもポインタをもっと煮詰めないといけないです・・・(泣)

Justy

Re:ポインタ

#5

投稿記事 by Justy » 17年前

>は一つにまとめて定義はできないんでしょうが・・・?
 望む形かどうかはわかりませんが、
こうすれば一応纏められます。
[color=#d0d0ff" face="monospace]#include <stdio.h>

typedef struct{
    const char *abc[3];
}states_t;

static const states_t default_state_value = { "要素1", "要素2", "要素3" };

int main(void){
    states_t states[10];
    states[0] = default_state_value
    printf("%s\n%s\n%s\n", states[0].abc[0], states[0].abc[1], states[0].abc[2]);
    return 0;
}
[/color]

tk-xleader

Re:ポインタ

#6

投稿記事 by tk-xleader » 17年前

mallocで確保するメモリは、スタックではなくヒープ領域から確保される事が多いです。スタックはプログラムコードの展開場所である事も多いので、スタックを消費すると実行できなくなる事もあります。

そんなに大きい配列を必要とするならば、vectorを使うというのはどうでしょうか?

ibis

Re:ポインタ

#7

投稿記事 by ibis » 17年前

ところで、char *abc[3] というのは2文字の文字列へのポインタではないのですか?

kazuoni

Re:ポインタ

#8

投稿記事 by kazuoni » 17年前

justyさん、tkmakwins15さんご回答ありがとうございます!

>states[0] = default_state_value
申し訳ないのですが、構造体の中にはconst char型のみではなく、int型もある場合、これは使えないのですが、ほかにはあるでしょうか?
自分のやりたいこととして、構造体はRPGのキャラクターのステータスをまとめるために使っています。

vectorですか。。使ったことないですね。。またちょっと調べてきます・・・

>char *abc[3] というのは2文字の文字列へのポインタではないのですか?
abcは<charへのポインタ型>の大きさ3の配列だと思いますよ。

バグ

Re:ポインタ

#9

投稿記事 by バグ » 17年前

いえ、char型の配列ではなく、char型へのポインタの配列です。

tk-xleader

Re:ポインタ

#10

投稿記事 by tk-xleader » 17年前

よく考えたらC++ではなくC言語での開発ですね。失礼しました。C言語ではvectorは使えません。

Justy

Re:ポインタ

#11

投稿記事 by Justy » 17年前

構造体の中にはconst char型のみではなく、int型もある場合、
これは使えないのですが、ほかにはあるでしょうか

 なるほど、構造体の中の文字列へのポインタの配列の部分だけを初期化したい、と。
 なら、その部分だけを別の構造体にすれば一応出来ます。

[color=#d0d0ff" face="monospace]#include <stdio.h>

typedef struct hoge_strings_t {
    const char *p[3];
} hoge_strings_t;

typedef struct states_t {
    hoge_strings_t abc;
    int d;
    int e;
    int f;
    int g;
}states_t;

static const hoge_strings_t default_hoge_strings = { "要素1", "要素2", "要素3" };

int main(void) {
    states_t states[10];
    states[0].abc = default_hoge_strings;
    printf("%s\n%s\n%s\n", states[0].abc.p[0], states[0].abc.p[1], states[0].abc.p[2]);
    return 0;
}[/color]

kazuoni

Re:ポインタ

#12

投稿記事 by kazuoni » 17年前

Justyさんご回答ありがとうございます!

完璧です!!ww新しい構造体を入れるのは全く考え付かなかったです。。

あと・・・staticは静的な場所(?)が割り当てられて、プログラムの実行が開始されてから終了するまで、ずっと同じ場所って覚えているんですけど・・・プログラミングの中で変更することのないものはすべてstaticをつければよいのでしょうか?

tk-xleader

Re:ポインタ

#13

投稿記事 by tk-xleader » 17年前

プログラム中で変更しない変数には、staticではなくconstをつけるといいです。

kazuoni

Re:ポインタ

#14

投稿記事 by kazuoni » 17年前

たびたびすみません。。
>extern static const hoge_strings_t default_hoge_strings
をヘッダーに書くと「2 つ以上のストレージ クラスが指定されています」と出てしまうのですが・・・staticを書かなければうまく通ります。staticは書かなくても大丈夫ですかね?

Justy

Re:ポインタ

#15

投稿記事 by Justy » 17年前

>staticは書かなくても大丈夫ですかね?

 特に問題はないと思います。
 staticにしたのはそのファイルの中だけで有効にしたかっただけですから。
 externで外に出してしまうなら、staticは外さなければなりません。

kazuoni

Re:ポインタ

#16

投稿記事 by kazuoni » 17年前

Justyさん、ご回答ありがとうございます^^

今思えばヘッダーに入れる必要は特になかったので、結局最初の記述で落ち着きました(汗)
単純な質問の連続、申し訳ありませんでした。そして親切なご回答ありがとうございました!

またよろしくお願いします。

閉鎖

“C言語何でも質問掲示板” へ戻る