• 締切済み

構造体の使い方

構造体の基本的な使い方を練習しようと思ったのですが、 なかなかスムーズにいきません。 p.d=10; の部分がおかしいようなのですが、色々試してもコンパイルできませんでした。 正しい使い方を教えていただけないでしょうか ソース ↓ #include<stdio.h> struct type{ int a; float b;  double c; }var,*p; main(){ c=9.87;      p=&var; p.d=10; p->b=1.2; printf("int:%d\n",*p); printf("float:%.1f\n",&p); printf("double:%.3lf\n",c); return 0; }

みんなの回答

noname#119918
noname#119918
回答No.4

順番に挙げていきますと、 (1)変数cの型なし。 例) float c = 9.87; (2)p.d pは構造体のポインタですので、p->d=10; としないとエラーです。 (3)printf("int:%d\n",*p); *pということは構造体ですが、構造体を%dフォーマットで受け取ることは できません。 例)printf("int:%d\n",p->a); (4)printf("float:%.1f\n",&p); &pということは、構造体のポインタのポインタになります。 これはどのような意図で記述しているのですか? ざっと挙げると以上の通りです。 No.3さんのおっしゃるとおり、C言語の本を一冊手元に置いて 基本的な部分から取り組むべきだと思います。

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.3

★ちゃんとしたテキストは持っていますか? >構造体の基本的な使い方を練習しようと思ったのですが、 >なかなかスムーズにいきません。  ↑  構造体の基本的な使い方が解説されている本を1冊用意するか、本屋でさらっと見て  確認してみた方が良いでしょう。構造体は複数の変数をまとめて管理するだけなので  そんなに難しくはありません。 >色々試してもコンパイルできませんでした。  ↑  『struct type』構造体の『d』メンバがありません。  また main() 関数で『c』変数が宣言されていません。  あと『p.d』ではなく『p->d』か、『(*p).d』とします。  3つ正しくなかったのでコンパイルできないのです。 >正しい使い方を教えていただけないでしょうか  ↑  C言語の本、持っていないのかな?  持っていれば『構造体』は定番のはず。載っていると思いますけど。  (問題集ではなく堅苦しい解説書などです)  次のリンク先  http://homepage3.nifty.com/mmgames/c_guide/index.html→『苦しんで覚えるC言語』  にある  http://homepage3.nifty.com/mmgames/c_guide/16-01.html→『異なる型の変数をまとめる』  http://homepage3.nifty.com/mmgames/c_guide/16-02.html→『構造体の引数』  http://homepage3.nifty.com/mmgames/c_guide/16-03.html→『構造体の配列』  http://homepage3.nifty.com/mmgames/c_guide/16-q.html→『練習問題16』  を参照して下さい。 基本: ・構造体のメンバは普通は『.』演算子でアクセスします。  でも構造体のポインタは『->』演算子でもアクセスできます。  つまり、  struct type {   int a;   float b;   double c;  } var, *p;    // 普通は『.』演算子で  printf( "a=%d\n", var.a );  printf( "b=%f\n", var.b );  printf( "c=%f\n", var.c );    // ポインタは『->』演算子で  p = &var;  printf( "a=%d\n", p->a );  printf( "b=%f\n", p->b );  printf( "c=%f\n", p->c );    // ポインタで『.』演算子を使うなら  p = &var;  printf( "a=%d\n", (*p).a );  printf( "b=%f\n", (*p).b );  printf( "c=%f\n", (*p).c );  とします。 配列: ・例えば struct type data[ 100 ]; を宣言すると  for ( i = 0 ; i < 100 ; i++ ){   printf( "a=%d\n", data[i].a );   printf( "b=%f\n", data[i].b );   printf( "c=%f\n", data[i].c );   printf( "\n" );  }  とします。 ・ポインタの場合は  struct type *p = data;    for ( i = 0 ; i < 100 ; i++, p++ ){ ←ポインタ(p)++   printf( "a=%d\n", p->a );   printf( "b=%f\n", p->b );   printf( "c=%f\n", p->c );   printf( "\n" );  }  とします。 ・以上。

hihhuhha
質問者

お礼

ありがとうございました。 C言語のサイトを見て回るだけだったんですが、本もちゃんと用意しようと思います。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

ついでにいえば, ポインタに対して「.」演算子は使えないわなぁ.

  • dsuekichi
  • ベストアンサー率64% (171/265)
回答No.1

> p.d=10; > の部分がおかしいようなのですが、 提示された構造体に「d」の定義はありませんけど・・・ #a,b,cしか定義していない・・・ 投稿ミスですか?

関連するQ&A

  • ポインタ型配列のポインタを構造体のポインタ変数に格納する方法教えて!_ver2

    int型の配列は構造体のポインタ型のint型変数にはキャストすればうまくコンパイルが通りますが、同じ方法でfloat型の配列は構造体のポインタ型のfloat型変数にはキャストしてポインタの値を入れてもうまくコンパイルできず困っています。ちなみにコンパイルエラーは「互換でない型変換」と表示されます。 返答のほど、よろしくお願いいたします。 #include<stdio.h> #include<malloc.h> float time[] ={2.2, 2.3, 2.4}; int time2[] ={2, 2, 2}; struct timelist{ float *time; int *time2; struct timelist *next; }*head; void main(void) { struct timelist *p; p = (struct timelist *)malloc(sizeof(struct timelist)); p -> time = (float *)time[0]; p -> time2 = (int *)time2[0]; printf("time = %f\n", p -> time); printf("time2 = %d\n", p -> time2); }

  • C言語の構造体の問題が分かりません

    以下のソースコードを使って次の2つの問題に答えよ。というものです。 #include<stdio.h> #include<math.h> struct cartes{ double x,y; /*x-axis,y-axis*/ }; struct polar{ double r,th; /*radius,theta*/ }; struct cartes p2c(struct polar a) { struct cartes d; d.x=a.r*cos(a.th); d.y=a.r*sin(a.th); return d; } struct polar c2p(struct cartes b) { struct polar e; e.r=sqrt(b.x*b.x+b.y*b.y); e.th=atan(b.y/b.x); return e; } void main(void) { struct cartes c; struct cartes c1={1,1},c2={1,1.7320508},c3={1.7320508,1}; struct polar p1,p2,p3; struct polar p={1.41421356,0.7853982}; p1=c2p(c1); p2=c2p(c2); p3=c2p(c3); c=p2c(p); printf("radius=%lf, theta=%lf(radians)\n",p.r,p.th); printf("x-axis=%lf, y-axis=%lf\n",c1.x,c1.y); printf("radius=%lf, theta=%lf(radians)\n",p2.r,p2.th); printf("x-axis=%lf, y-axis=%lf\n",c.x,c.y); } 1.2次元直行座標における2点の座標を与えられて、2点間の距離を求める関数を作り、正しく動作するようにせよ。 2.複素数を構造体として定義せよ。次に2つの複素数変数を受けてその和、差、積、商を求める関数を作り、正しく動作するようにせよ。 以上2つの問題についてソースコードを書いてご説明いただければ幸いです。

  • 構造体の構造体 引数

    構造体の中の構造体の関数の引き渡し方法がわかりません。 下記ソースで試したのですが、うまくいきませんでした。 助言お願いいたします。 //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++; }

  • プログラミング構造体について。

    include<stdio.h> #include<stdlib.h> #include<string.h> struct person{ char name[10]; int gender; int age; }; void printPersonList(struct person *person_p, int size); void outputPersonList(struct person *person_p, int size); double getAverageOfAge(struct person *person_p, int size); int countMales(struct person *person_p, int size); int countFemales(struct person *person_p, int size); int main(void){ struct person *person_p; int i, count, gender, age, maleCount, femaleCount; char name[20]; double average; printf("登録する人数を入力してください。\n"); scanf("%d", &count); person_p = (struct person*)malloc(sizeof(struct person)* count); for(i=0; i < count; i++){ printf("名前・性別(男性:0, 女性:1)・年齢をスペース区切りで入力してください。\n"); scanf("%s %d %d", name, &gender, &age); strcpy((person_p + i) -> name, name); (person_p + i) -> gender = gender; (person_p + i) -> age = age; } printPersonList(person_p, count); outputPersonList(person_p, count); average = getAverageOfAge(person_p, count); printf("平均年齢:%f\n", average); maleCount = countMales(person_p, count); femaleCount = countFemales(person_p, count); printf("男性:%d名, 女性:%d名\n", maleCount, femaleCount); free(person_p); return 1; } void printPersonList(struct person *person_p, int size){ int i; printf("登録リスト\n"); printf(" name | gender | age\n"); printf("----------+--------+-----\n"); for(i=0; i < size; i++){ printf("%10s | %1d | %2d\n", (person_p + i) -> name, (person_p + i) -> gender, (person_p + i) -> age); } } void outputPersonList(struct person *person_p, int size){ FILE *output; int i; if((output = fopen("meibo.c", "w")) == NULL){ printf("meibo.cを開けませんでした。\n"); return; } for(i=0; i < size; i++){ fprintf(output, "%s, %d, %d\n", (person_p + i) -> name, (person_p + i) -> gender, (person_p + i) -> age); } fclose(output); } 残り3つの関数をすべて定義する(それぞれ10行程度) getAverageOfAge, countMales, countFemales どう定義すればいいのか教えてください。お願いします。

  • ポインタを使った構造体のプログラム

    ポインタを使ってメンバに値を入力して表示するプログラムを作ったのですが、mainのstruct XYZ aというオブジェクトと*bというそれを指すポインタを使ってプログラムを表示するにはどうすればいいのでしょうか。 これがプログラムです。 #include <stdio.h> struct XYZ { int x; long int y; double z; }; void set_xyz(struct XYZ *p,int x,long int y,double z) { p->x=x; p->y=y; p->z=z; } //void set_xyz(struct XYZ *,int,long int,double); int main() { struct XYZ a = {12,999999,1.41421356},*b; //ここのポインタ変数bでエラーが表示されます。 set_xyz(b,a.x,a.y,a.z); printf("a.x = %d\na.y = %d\na.z = %lf\n",b->x,b->y,b->z); return 0; } エラーの内容は「初期化されていないローカル変数 'b' が使用されます」となっています。 初歩的な質問ですみません・・・。

  • free compiler

    Borland C++ Compiler 5.5 無償版による実行ファイルは はワーキングエリアが1MBを越えると実行できません これはコンパイラが16bit版の実行ファイルしかできないからでしょうか? やはりbcc32でコンパイルしたものは32bit版ではなく16bit版なのでしょうか? 32bit版の実行ファイルをこのコンパイラで作ることはできますか? ちなみに以下のプログラムで性能チェックしました 下記のものは動きましたがMAXが65536の場合は駄目でした このとき1MB+αになります #include <stdlib.h> #include <stdio.h> #include <conio.h> #include <complex.h> #define MAX 60000//65536 int main(void) { complex<double> j(0.0,1.0),z; complex<double> q[3],p[MAX]; double a,b,x,y; p[MAX-1]=j; q[0]=1.0-j;q[1]=j;q[2]=1.0+j; printf("please input double number a\n"); scanf("%lf",&a); printf("please input double number b\n"); scanf("%lf",&b); z=a+j*b; printf("abs(%lf+j*%lf)=%lf\n",a,b,abs(z)); printf("size of int is %d.\n",sizeof(int)); printf("size of float is %d.\n",sizeof(float)); printf("size of long is %d.\n",sizeof(long)); printf("size of float is %d.\n",sizeof(float)); printf("size of double is %d.\n",sizeof(double)); cout<<q[0]<<q[1]<<q[2]<<"\n"<<p[MAX-1]<<"\n"; //c++ command getch(); return 0; } よろしくお願いします

  • 構造体のサンプルのソースなんですけど・・

    自分が勉強するのに使ってる参考書にのってるサンプルのソースを自分なりにいじってみたら、コンパイルはできるのに実行すると、「不正な処理を行ったので強制終了します」とメッセージがでて実行できません。 ソースは↓ #include<stdio.h> #include<string.h> struct kakakutyp{ int teika; int waribiki; int yuutai; }; struct syohintyp{ char name[30]; struct kakakutyp kakaku; int zaiko; }; main() { struct syohintyp *sp; strcpy(sp->name,"システム手帳B-386"); sp->kakaku.teika=8500; sp->kakaku.waribiki=7900; sp->kakaku.yuutai=7600; sp->zaiko=32; printf("品名:%s\n",sp->name); printf("定価価格:%d\n",sp->kakaku.teika); printf("割引価格:%d\n",sp->kakaku.waribiki); printf("優待価格:%d\n",sp->kakaku.yuutai); printf("在庫個数:%d\n",sp->zaiko); } になってます。なんでじっこうできないんでしょうか?参考書では、ドット演算子を使ってたんですが、それをアロー演算子に直したつもりです。 よろしくお願いします。

  • C言語 構造体の並び替え 

    #include<stdio.h> typedef struct{ char mozi[10]; char namae[30]; }PE; void input_profile(PE *p,int *a); void printf_profile(PE *p,int *a); int main(void) { int i=0; PE c[999]; input_profile(c,&i); return 0; } void input_profile(PE *p,int *a){ int c,b; for(b=0;999>b;b++) { printf("名前を入力\n"); scanf("%s",(p+b)->namae); printf("文字を入力\n"); scanf("%s",(p+b)->mozi); printf("入力を終えるなら0を入力してください\n続けるなら、それ以外の数字を入力してください\n"); scanf("%d",&c); if(c==0)break; } b++; *a=b; printf_profile(p,a); } void printf_profile(PE *p,int *a) { int b; for(b=0;*a>b;b++) { printf("NO%d\n",b+1); printf("文字%s\n",(p+b)->mozi); printf("名前%s\n",(p+b)->namae); } } このプログラムを 自分で関数を作って データ一覧をmoziのアルファベット順に表示するように書きなおしたいんですけど どうなるのでしょうか? どうか教えてください

  • 構造体へのポインタについて

    初心者です。 C入門書の著者のサポートページには正誤表とダウンロードしかないためこちらで質問させていただきます。 下記のコードの下から二行目の構造体へのポインタ (Car *) について、中学生に説明するように基本的な考え方、目的、書式、参考URLなどを教えて下さい。 ポインタについては、該当の章を読み直し基本事項については理解しておりますが、突然あるページから(Void *)や(Char *)など括弧で閉じるものが説明なしに出てきてちょっと混乱してます。(汗 どうぞ宜しくお願い致します。 #include<stdio.h> /* 構造体型struct Carの宣言 */ typedef struct Car{ int num; double gas; }Car; int main(void) { printf("int型のサイズは%dバイトです。¥n", sizeof(int)); printf("double型サイズは%dバイトです。¥n", sizeof(double)); printf("構造体structCar型のサイズは%dバイトです。¥n", sizeof(Car)); printf("構造体struct Car型へのポインタのサイズは%dバイトです。¥n", sizeof(Car *)); return 0; }

  • 分割コンパイルについて

    現在分割コンパイルが分からずに苦戦しています。 下記のリストは構造体を使わなければコンパイラを通すことができましたが、 使うとなぜか通りません。 あれこれ試しましたがどうしても分かりません。 何がおかしいのでしょうか? *define.hで全てのファイルへの定義や宣言を行わせています。 ////////////// //Main.cpp ////////////// #include <stdio.h> #include <conio.h> #include "define.h" int main( void ){ Tmp[0].c = 15; printf("a: %d\n", a); printf("b: %d\n", b); printf("c: %d\n", Tmp[0].c); printf("NUM:%d\n", NUM); aaa(); bbb(); getch(); return 0; } ////////////////// // A.cpp ///////////////// #include <stdio.h> #include "define.h" void aaa( void ){ printf("a: %d\n", a); printf("b: %d\n", b); printf("c: %d\n", Tmp[0].c); printf("NUM:%d\n", NUM); } ////////////////// // B.cpp ///////////////// #include <stdio.h> #include "define.h" void bbb( void ){ printf("a: %d\n", a); printf("b: %d\n", b); printf("c: %d\n", Tmp[0].c); printf("NUM:%d\n", NUM); } ////////////////// // define.cpp ///////////////// #include "define.h" int a = 10; int b = 20; struct Parameter { int c; }; struct Parameter Tmp[NUM]; ////////////////// // define.h ///////////////// #define NUM 100 extern int a; extern int b; extern struct Parameter Tmp[NUM]; void aaa( void ); void bbb( void );

専門家に質問してみよう