• ベストアンサー

構造体で・・・・

構造体は配列を使用せずメモリ領域を獲得する関数を使用すること、 *構造体内部のメンバ名には配列を用いて良い。  という、条件があるのですが場合はどのようにすればよろしいでしょうか? どなたか教えてください。 構造体は以下のようになってます。 /*構造体の定義*/ struct seiseki{   char name[20];   int eig;   int suu;   int kok;   char rank[3]; };

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

struct seiseki *seisekip; seisekip = (struct seiseki*)malloc(n*sizeof(struct seiseki)); みたいにせよということだと思います。 n は、確保する個数 そうすれば、 struct seiseki a[n]; として配列で確保した場合と同じように seisekip[i]で使えます。

その他の回答 (10)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.11

> > 構造体は配列を使用せず > > とあることから、一度に複数の構造体を使用することも想定する必要があるのでは? はい。その辺りのことは私も他の方も承知かと思います。 要するに、質問には具体的なことが何も書かれていないので、単に要求された内容を満たすだけであれば、静的な記憶域を返すだけでもOKだと思ったわけです。 質問には、「配列を使うな」とは書いていますが、複数のオブジェクトが必要とは書いていません。 最もひねくれた回答をするなら、struct seisekiの配列をメンバに持つ構造体を宣言して、struct seiseki[]へのポインタを返してもよいわけです。

  • ency
  • ベストアンサー率39% (93/238)
回答No.10

横レスになってしまいますが。。。 質問者 zebrastarさんの記載内容に > 構造体は配列を使用せず とあることから、一度に複数の構造体を使用することも想定する必要があるのでは? No3 jactaさんのやりかたでそれを実現しようとすると、結局関数内で static な配列を使うしかないと思うのですが。。。 # その場合、配列のインデックスを含めて static にする必要がありますよね。 …見当はずれなことを書いていたらごめんなさい。。。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.9

> #3ってどういう使い方を想定してるんだろうか? 使い方といっても、 struct seiseki *p = seiseki(); strcpy(p->name, "abc"); p->eig = 80; ... /* free不要 */ しかないと思いますが... > こんな使い方するくらいなら、単純に変数を1個用意した方がいい。 直接宣言してしまうと、それこそ「獲得」ではなくなります。 題意では、「配列を使用しない」ことと「メモリ領域を獲得する関数を使うこと」だけが要求されています。その「メモリ領域」が静的なものか動的なものかまでは規定されていませんね。もし、所有権が完全に移らないことが問題であるなら、フラグを追加すれば済むことです。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.8

そうそう、獲得とは違う そもそも #3ってどういう使い方を想定してるんだろうか? こんな使い方するくらいなら、単純に変数を1個用意した方がいい。

回答No.7

ああ、構文的には正しいけれど、 「題意に沿っているか?」と問われれば「否」ですかね。

  • nk2
  • ベストアンサー率23% (6/26)
回答No.6

「メモリ領域を獲得する関数」 関数は振る舞いです。 振る舞いは動作です。 メモリを確保する動作を用いよ。 ということになりますから、 動的にメモリを確保せよ。ということでしょう。 static struct seiseki storage; ではリンクしたときにメモリ領域が確保されるので、 条件を満たしていないと思います。

回答No.5

あかんこたないでしょう、staticやし。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

#3は、あかんやろ

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

struct seiseki *seiseki(void) {  static struct seiseki storage;  return &storage; } でも、メモリ領域を獲得する関数を使用したことになると思います。

回答No.2

> どのようにすればよろしいでしょうか? …なにを? (質問の仕方が下手!) struct seiseki table[N]; を struct seiseki* table = (struct seiseki*)malloc(sizeof(struct seiseki)*N); に置き換える、ということでしょうか? # 使い終わったらfreeを忘れずに

関連するQ&A

  • 構造体で配列を使用しない方法。

    構造体で配列を使用せずに、メモリ領域を獲得する関数を使用する場合はどうすればよろしいですか??  例 char *str; struct seiseki{ char name[20]; int eig; int suu; int kok; char rank[3]; }; str = ()malloc();

  • 構造体について

    凄く初歩的な質問で申し訳ありませんが… 入門書の構造体のところで 以下のようなプログラムの例がありました。 #include <stdio.h> struct seiseki { /* 構造体の宣言 */ int no; char name[20]; double average; }; int main(void) { int i; struct seiseki seito1, seito2[20]; /* 構造体変数と構造体配列の宣言 */ >char name[20] というのは、NAMEの領域を20文字 確保すると言うことですよね? >struct seiseki seito1, seito2[20] ここの箇所が分からないのですが seito2[20]の20というのは どうして20なのですか? NAMEだけではないので もっと大きな数字になるような気がするのですが… またseito1の方は どうして数字が何もないんですか? 考え違いをしているところを ご指摘して頂ければ幸いです。

  • 構造体型のポインタ変数を含む構造体

    struct seiseki_tag { Int32 math ; Int32 english ; Int32 science; } ; typedef struct seiseki_tag SEISEKI ; struct personal_tag { Char name ; Int32 num ; SEISEKI *sptr } : typedef struct personal_tag PERSONAL ; struct info_tag { PERSONAL person_info ; } ; typedef struct info_tag INFO ; たとえば、上記のように3つの構造体があり、PERSONAL構造体のメンバーに SEISEKI構造体の型を持つポインタ変数が含まれているような場合で、下記のように INFO型のポインタ変数からSEISEKI構造体のメンバーを参照する方法を教えてください。 PERSONAL構造体メンバーのnameやnumは INFO *info ; info->person_info.name ; info->person_info.num ; のように参照すると思いますが、sptrが示すSEISEKI構造体のメンバーへの アクセスができません。下記のように参照を試みたのですがコンパイルは 通るのですが、実際に参照できていませんでした。 INFO *info ; SEISEKI *seiseki ; seiseki = info->person_info.sptr ; seiseki->math ; 判りにくい説明で申し訳ありませんが、どなたか教えていただければと思います。 よろしくお願いいたします。

  • C言語 構造体配列 list

    プログラミングでこの問題がわからないので教えてください! 下記の構造体タグseisekiを使って,表に示すデータをもつ構造体配列listを作成する. 構造体配列listを利用して,一番点数の高い 者を探し,その名前を表示する. struct seiseki{ char name[30]; int score; name score }; 表 佐藤 80 鈴木 75 田中 95 高橋 90

  • C言語 list 構造体配列

    どうしてもこの問題がわからないので教えてください!  下記の構造体タグ「seiseki」を使って,表に示すデータをもつ構造体配列「list」を作成する.  関数に構造体配列「list」のアドレスを渡す.  関数で構造体ポインタ「*list」を利用して,一番点 数の高い者(1名限定)を調べ,その名前を表示する. struct seiseki{ char name[30]; int score; name score }; 表 佐藤 80 鈴木 75 田中 95 高橋 90

  • ファイルから読みこんで構造体に格納する、

    shohinというファイルに RX-100 odango_tsumeawase 3000という のが 五行ならんでいるのですが、 これを読み込んで struct shohin{ char code[10]: char name[40]; int price; } にファイルから読みこんで構造体配列に 格納したいのですが、構造体配列に格納する やりかたがわかりません。 構造体配列は struct shohin list[];というのを宣言しています。 ファイルから一行読み込んで fprintf()を使おうと思うのですが、 それはできますか? メンバ毎に格納したいのですが、 それがわかりません お願いします。

  • 構造体について

    以下のような構造体の宣言が合ったとき struct list { int a; char b[20]; struct list *next; }; struct list *add_list( int a, char *str, struct list *head );・・・1 struct list *del_list( int a, struct list *head );・・・2 1は引数の数が同じため問題ないのですが、2はどういう意味になるのでしょう?

  • C#で構造体の配列を持った構造体を使いたいのですが

    C#で構造体の配列を持った構造体を使いたいのですが Cならば struct xyz { struct abc _abc[32]; int index; }; struct abc { int a; int b; int c; }; struct xyz _xyz[8]; xyz[0]._abc[3].b = 1; のような使い方で という感じで やっていた事を C#で 同じような事をやろうとしても うまくいきません うまくやる方法をどなたかご存知ないでしょうか Visual Studio 2005行った場合 コンパイルで 構文エラーです。不適切な配列の宣言子です。マネージ配列を宣言するには、次元指定子を変数の識別子の前に指定します。固定サイズ バッファ フィールドを宣言するには、フィールド型の前に fixed キーワードを使用します となり fixed をつけると 固定サイズ バッファの型は次のうちの 1 つでなければなりません: bool、byte、short、int、long、char、sbyte、ushort、uint、ulong、float または double となってしまいます

  • 構造体の構造体 引数

    構造体の中の構造体の関数の引き渡し方法がわかりません。 下記ソースで試したのですが、うまくいきませんでした。 助言お願いいたします。 //repo.c #include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> #define NUM 20 #define MAX 15 struct seiseki{ float shu[3]; }; struct seito{ char name[NUM]; int age; struct seiseki kekka; }; void input(struct seito *p); void s_input(struct seiseki *p); void ss_input(struct seiseki *data); int main(){ int i; struct seito data[2]; for(i=0;i<2;i++){ printf("------------------------------\n"); printf("%d人目",i+1); input(&data[i]); } printf("%f\n",data[0].kekka.shu[0]); printf("%f\n",data[0].kekka.shu[1]); printf("%f\n",data[0].kekka.shu[2]); //data[1]に格納できない。 printf("%f\n",data[1].kekka.shu[0]); printf("%f\n",data[1].kekka.shu[1]); printf("%f\n",data[1].kekka.shu[2]); return 0; } void input(struct seito *p){ printf("名前->"); scanf("%s",p->name); printf("年齢->"); scanf("%d",p->age); s_input(&(p->kekka)); } void s_input(struct seiseki *data){ printf("国語->"); ss_input(data); printf("算数->"); ss_input(data); printf("英語->"); ss_input(data); } //下記関数で成績をchar型で受け取り、数値化したい。 void ss_input(struct seiseki *data){ char p[100]; int i=0; static int o=0; scanf("%s",p); while( p[i] != '\0'){ if(isdigit(p[i])==0){ printf("再入力してください"); scanf("%s",p); } i++; } data->shu[o]=atof(p); printf("%f\n",data->shu[o]); o++; }

  • 構造体を使ったプログラム

    学校でC言語を勉強しています。(まだ初心者です) テストの成績を入力して、その結果を降順にソートしたいんですけど、 下記のプログラムでは、正常に動かないです。 struct seiseki { char nama; int sansuu; int rika; int goukei; }; ~~~~~~~~~~~~~~~~~~~~ struct seiseki class_a; struct seiseki class_b; struct seiseki *ptr1; struct seiseki *ptr2; ptr1 = class_a; ptr2 = class_b; ~~~~成績はあらかじめ入力済み~~~~ sout(class_a, 3); sout(class_b, 3); void sout(struct seiseki *p, int num) { struct seiseki temp; int count; int j; for (count = 1; num > count; count++) { temp = p[count]; for (j = count; j > 0 && p[j - 1].goukei < temp.goukei; j--) { p[j] = p[j - 1]; } p[j] = temp; p++; } } class_aだけを実行するプログラムだとちゃんと表示されますが、 一度でclass_aとclass_bを実行するプログラムだと表示がおかしくなります。 どなたか教えてください。

専門家に質問してみよう