←検索窓の楽しみ方
  ショッピングモール  掲示板ランキング


【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※返信付き投稿の削除は禁止!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら


 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板1こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.3925

構造体配列の初期化
投稿者---シグイン(2005/06/07 11:24:37)


 早速ですが質問です。
 先日の続きです。
 構造体配列を使って年・クラスで(例;1年1組、2組、3組)、それぞれ一人だけ学生番号が一番小さい人を抽出するものを作っています。
 そのとき構造体配列の初期化(配列にあらかじめ)は必要なんでしょうか?たとえば「0」をいれるなど。
 ご指摘お願いします。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:構造体配列の初期化 3926 おでん 2005/06/07 11:49:00


No.3926

Re:構造体配列の初期化
投稿者---おでん(2005/06/07 11:49:00)


> 構造体配列を使って年・クラスで(例;1年1組、2組、3組)、それぞれ一人だけ学生番号が一番小さい人を抽出するものを作っています。
> そのとき構造体配列の初期化(配列にあらかじめ)は必要なんでしょうか?たとえば「0」をいれるなど。

使い方によるかと思いますが?
たとえば、学生数がわからないのでクラス毎に50の配列を作り、
学生が30人しかいないというような場合、初期値として学生番号に
学生番号としては決して現れない大きな番号(1000とか)を入れておけば
あとでソートを行う時に役に立ちます。
 単純に頭からなめて最小値を抽出する場合にも同様なことがいえます。
0にしてしまうと、最小値の判断が複雑(0以外の最小値なのでそれほど
でもありませんが)になります。

#私は、全て初期化(0でクリアするなど)するのがいいと思っています。


この投稿にコメントする

削除パスワード

No.3927

Re:構造体配列の初期化
投稿者---シグイン(2005/06/07 12:20:00)


>学生が30人しかいないというような場合、初期値として学生番号に
>学生番号としては決して現れない大きな番号(1000とか)を入れておけば
>あとでソートを行う時に役に立ちます。
そうですね。私は今回は30人と定型ですからこっちですかね。

> 単純に頭からなめて最小値を抽出する場合にも同様なことがいえます。
>0にしてしまうと、最小値の判断が複雑(0以外の最小値なのでそれほど
>でもありませんが)になります。
>
>#私は、全て初期化(0でクリアするなど)するのがいいと思っています。
初期化をするとソース行数が結構増えますが、編集するときはやっぱり必要なんですか。
こんなかんじですか?


mainの構造体配列の初期化
000: for(nin=ZERO; nin<EMP_NUM; nin++){
001:         per_ary[nin].num = ZERO;
002:         per_ary[nin].name = ZERO
003:         per_ary[nin].gender = MAN;
004:         per_ary[nin].nen = ZERO; per_ary[nin].kurasu = ZERO; per_ary[nin];
005:         out_flag[nin] = FALSE;
006:     }



抽出用に使う作業用(ただし構造体化はまだです。)
000: /* データ初期化 */
001:     /*for(i=0; i<LINE_MAX; i++){
002:         buf[i] = NULL;
003:     }
004:     for(i=0; i<NUMBER_MAX; i++){
005:         number_temp[i] = NULL;
006:     }
007:     for(i=0; i<GENDER_MAX; i++){
008:         gender_temp[i] = NULL;
009:     }
010:     /*for(i=0; i<NEN_MAX; i++){
011:         nen_temp[i] = NULL;
012:     }
013:     for(i=0; i<KUMI_MAX; i++){
014:         kumi_temp[i] = NULL;
015:     }
016:     
018:     
019:     /* 名前情報を格納用エリアへ保持する */
020:     memcpy( &name_area[0][0], name, sizeof(name_area)  );*/
021: 
022: 
023:     /* ループ1 */
024:     for(i=0; i<GAKU_NUM; i++){
025:         /* ファイルから1行読み込む */
026:         if(fgets(buf, LINE_MAX, fp)== NULL){    /* 読み込めなかったら終了 */
027:             return NG;
028:         }
029:         
030:         /* 番号の切り出し */
031:         str = strtok(buf, ",");
032:         strcpy(number_temp, str);
033:         number[i] = atoi(number_temp);
034: 
035:         /* 名前の切り出し */
036:         str = strtok(NULL, ",");
037:         strcpy((char *)&name_area[i][0], str);
038: 
039:         /* 性別の切り出し */
040:         str = strtok(NULL, ",");
041:         strcpy(gender_temp, str);
042:         gender[i] = atoi(gender_temp);
043: 





この投稿にコメントする

削除パスワード

No.3928

Re:構造体配列の初期化
投稿者---REE(2005/06/07 13:36:54)


>>#私は、全て初期化(0でクリアするなど)するのがいいと思っています。
>初期化をするとソース行数が結構増えますが、編集するときはやっぱり必要なんですか。

既におでんさんもおっしゃっていますが、
初期化が必要かどうかは、使い方によります。

例えば、他に有効な要素数を保持している変数があり、それを超える要素を使わないようにしていれば、初期化は不要です。(不要であっても初期化しておく場合もあります。)
逆にそのような変数がなければ、初期化は必要です。

また、同じ初期化をするにしても、一部の項目だけ初期化するという方法もあります。(その項目を見て無効なデータと判断した場合には、他の要素を使わない)



この投稿にコメントする

削除パスワード

No.3932

Re返信ありがとうございます。REEさんへ
投稿者---シグイン(2005/06/07 15:20:51)


>初期化が必要かどうかは、使い方によります。
そうですか。わかりました。

>例えば、他に有効な要素数を保持している変数があり、
 *ここの連分、特にこの箇所がよくわからなかったのですが*
それを超える要素を使わないようにしていれば、初期化は不要です。(不要であっても初期化しておく場合もあります。)
>逆にそのような変数がなければ、初期化は必要です。

>また、同じ初期化をするにしても、一部の項目だけ初期化するという方法もあります。(その項目を見て無効なデータと判断した場合には、他の要素を使わない)
ここもよくわからなかったです。具体的に教えていただけませんか。


私の情報源は初期化のことはやり方ばかり(少し説明で)で理解が少ないのが現状です。
お手数ですがよろしくお願いします。





この投稿にコメントする

削除パスワード

No.3934

Re:Re返信ありがとうございます。REEさんへ
投稿者---επιστημη(2005/06/07 17:01:02)


>>初期化が必要かどうかは、使い方によります。
>>例えば、他に有効な要素数を保持している変数があり、
> *ここの連分、特にこの箇所がよくわからなかったのですが*
>それを超える要素を使わないようにしていれば、初期化は不要です。(不要であっても初期化しておく場合もあります。)
>>逆にそのような変数がなければ、初期化は必要です。

struct RECORD { ... };
struct RECORD data[100];
int size = 0; ← 現在使われている要素数

要素を追加するときは data[size] の内容を設定し ++size しておきます。
削除時には --size します。
有効な要素はいかなる場合も data[0]〜data[size-1] であることを保証すれば、初期化は(使っていない/アクセスしないのだから)不要です。



この投稿にコメントする

削除パスワード

No.3935

Re:Re返信ありがとうございます。REEさんへ
投稿者---REE(2005/06/07 17:12:32)


>>また、同じ初期化をするにしても、一部の項目だけ初期化するという方法もあります。(その項目を見て無効なデータと判断した場合には、他の要素を使わない)
>ここもよくわからなかったです。具体的に教えていただけませんか。

struct RECORD
{
int no;
int a;
int b;
int c;
};

この様な場合、noだけを無効と分かる値で初期化しておきます。
aやbを見る前にnoを見れば有効か無効か分かりますので、あえて値を設定しておく必要がありません。



この投稿にコメントする

削除パスワード

No.3936

Re:Re返信ありがとうです。
投稿者---シィグウィン(2005/06/07 19:46:11)



>この様な場合、noだけを無効と分かる値で初期化しておきます。
>aやbを見る前にnoを見れば有効か無効か分かりますので、あえて値を設定しておく必要がありません。

お二方ともありがとうございます。
ちょっと前者(なんと読めばいいのかわかりませんが。すいません)の方の説明が理解できませんでしたが。





この投稿にコメントする

削除パスワード

No.3929

Re:構造体配列の初期化
投稿者---とおり(2005/06/07 13:39:01)


全部ゼロクリアで良ければmemsetが楽かも。

#include <stdio.h>
#include <memory.h>

//個人データ
typedef struct DAT {
  int  no;
  char name[32];
  int  sei;
} DAT;

//クラスデータ
typedef struct CLS {
  DAT data[50];
} CLS;

//学年データ
typedef struct NEN {
  CLS cls[10];
} NEN;

int main(void)
{
  NEN nen[3];
  memset(nen, 0x00, sizeof(nen)); //構造体初期化

  return(0);
}




この投稿にコメントする

削除パスワード

No.3930

Re:構造体配列の初期化
投稿者---nop(2005/06/07 14:06:04)


>全部ゼロクリアで良ければmemsetが楽かも。
> NEN nen[3];
> memset(nen, 0x00, sizeof(nen)); //構造体初期化

All 0 クリアなら、わざわざ memset() を使わなくても

 NEN nen[3] = {0};

でよいのでは?


この投稿にコメントする

削除パスワード

No.3931

Re:構造体配列の初期化
投稿者---とおり(2005/06/07 14:27:06)


>All 0 クリアなら、わざわざ memset() を使わなくても
>
> NEN nen[3] = {0};
>
>でよいのでは?

きゃー、本当ですねぇ。。。
定義と同時に初期化する風習がないもので。ってことにしておいてください。。。
便乗質問で申し訳けないですが、Cって nen[i].clear(); みたいに内部でクリア関数とか持てましたっけ?



この投稿にコメントする

削除パスワード

No.3933

Re:構造体配列の初期化
投稿者---YuO(2005/06/07 15:23:21)


>定義と同時に初期化する風習がないもので。ってことにしておいてください。。。

本来の意味として,初期化は定義と同時に行います。
初期化ではないが,オブジェクトを使える状態にすることを,私は「初期設定」と呼んだりしています。
# Cにおいて「初期化」は完全に定まった意味をもつ用語,「初期設定」は人によって意味が違うであろう用語。


>便乗質問で申し訳けないですが、Cって nen[i].clear(); みたいに内部でクリア関数とか持てましたっけ?

Cではメンバ関数をもつ事は出来ません。
ただし,
struct {
    void (*clear)(void);
} nen[10];
と定義されていて,適切に設定されたnen[i].clearが存在する場合,
nen[i].clear();
は正しいコードです。
# nen[i]の存在を,ポインタの指す先にある関数は知る事ができませんが……。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧




掲示板提供:Real Integrity