• ベストアンサー

構造体について

構造体についての質問です。 main関数で構造体に 格納しています。 その構造体の値を 自作の関数(look)で 参照したいのですが どのようにすればいいのか ご教示して頂けたら幸いです。 typedef struct nentbl_ { int tosi; int kan; } nentbl; //--------------------------------------------------- int look(id){ nentbl kihokyu[50]; printf("%d %d\n",kihokyu[id].tosi , kihokyu[id].kan); } //---------------------------------------------------- int main(void){ nentbl kihokyu[50]; ・ ・ ・ kihokyu[1].tosi =11; kihokyu[1].kan = 20; kihokyu[2].tosi = 21; kihokyu[2].kan = 30; kihokyu[3].tosi = 31; kihokyu[3].kan = 40; y = look(1);

  • niiza
  • お礼率43% (211/486)

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

  • ベストアンサー
回答No.3

typedef struct nentbl_ { int tosi; int kan; } nentbl; //--------------------------------------------------- int look(int id, nentbl *kihokyu){ printf("%d %d\n",kihokyu[id].tosi , kihokyu[id].kan); return 0 ; } int main(int argc, char* argv[]) { int y ; nentbl kihokyu[50]; kihokyu[1].tosi =11; kihokyu[1].kan = 20; kihokyu[2].tosi = 21; kihokyu[2].kan = 30; kihokyu[3].tosi = 31; kihokyu[3].kan = 40; y = look(1,kihokyu); return 0; }

niiza
質問者

お礼

ご返事有り難うございました。 お陰様で解決しました。

niiza
質問者

補足

少し質問があるのですが… >int main(int argc, char* argv[]) int argc, char* argv[] とあるのは どのような意味があるのでしょうか? ご教示して頂けたら幸いです。

その他の回答 (4)

  • keibou21
  • ベストアンサー率31% (18/58)
回答No.5

#2です 参考URLに載せたアドレスのC言語編を読まれることをお薦めします

参考URL:
http://www.kumei.ne.jp/c_lang/
niiza
質問者

お礼

有り難うございました。 大変に参考になりました。

回答No.4

main関数内で定義している nentbl kihokyu[50]; はmain関数内でのみ有効です。それ以外の関数でその変数を参照することが出来ません。 この場合、 nentbl kihokyu[50]; をmain関数の中で定義するのではなく、 構造体を定義した後の行に定義しては如何でしょうか。 そうする事でnentbl kihokyu[50];はどの関数からも参照が可能になると思います。 その際 look関数に定義してあるnentbl kihokyu[50]; を削除する必要があります。(多分エラーが出ると思います) それとlook関数の戻り値がint型になっているけど戻り値を返していないようなのでvoidにした方がいいのでは?

niiza
質問者

お礼

ご返事有り難うございました。 お陰様で解決しました。

niiza
質問者

補足

少し質問があるのですが… >それとlook関数の戻り値がint型になっているけど >戻り値を返していないようなのでvoidにした方がいいのでは? というのは、例えば void look(id){ と書くと言うことですか?

  • keibou21
  • ベストアンサー率31% (18/58)
回答No.2

int look(nentbl* nen) { printf("%d %d\n",nen->tosi , nen->kan); return 0; } ポインタで渡せば可能です。 main内で、 look(&kihokyu[1]); という感じで呼び出せば。

niiza
質問者

補足

ご返事有り難うございました。 お陰様で解決しました。 本題とは逸れますが printfのところで >printf("%d %d\n",nen->tosi , nen->kan); という書き方をされていますよね。 kihokyu[id].tosiという書き方と nen->tosiとの違いを ご教示して頂けたら幸いです。

  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.1

まず、質問の記述では、look関数内にある変数kihokyuとmain関数内にある変数kihokyuは別のオブジェクトなのでmain関数で設定した内容をlook関数から見ることはできませんね。 修正するやり方は2つ。 一つは構造体変数の宣言を関数外に置き(各関数内では宣言しない)、look関数から同じ変数が見えるようにする。 もう一つはlook関数の引数を増やして構造体配列への参照も引数として渡す。

niiza
質問者

お礼

ご返事有り難うございました。 お陰様で解決しました。

関連するQ&A

  • memcpyについて

    構造体に整数のデータを格納する方法を 教えて下さい。 「ex」ファイルのデータ 41 4352 42 2341 43 5411 --------- これらのデータを kihokyu[1].tosi=41 kihokyu[1].kan=4352 kihokyu[2].tosi=42 kihokyu[2].kan=2341 という感じで格納したいのです。 プログラム 構造体のテンプレートを宣言 typedef struct nentbl_ { int tosi; int kan; } nentbl; int main(void){ char buff[16]; FILE *fp; int age , kyoku , i, y; 構造体を宣言 nentbl kihokyu[50]; ファイルを開く fp = fopen("ex.fil","rb"); ・ ・ ・ while(fgets(buff,sizeof buff,fp) != NULL){     整数に変換 y = atoi(buff); ここでエラー memcpy(&kihokyu[i].tosi,y,4); パラメータ '__src' は const void * 型として定義されているので int は渡せない(関数 main ) たぶんmemcpy関数の使い方が間違えていると思うのですが… ご教授して頂けたら幸いです。

  • 構造体の返し方

    こういう構造体があるとして、 typedef struct Day{  int day1, day2, day3; } Day; このような関数で値を入れて、 int DayTest (char s) {  Day day;  day1 = 2003;  day2 = 12;  dat3 = 31;  return < ここの返し方がわからない >; } これを main() 関数で参照できるようにするには どうすればいいのでしょうか。 printf で出力させるとかで結構です。 ポインタだとは思うのですが、うまくいきません。

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

    初心者です。 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; }

  • 構造体について

    5件のデータをRECORDに追加したいのですが、 RECORD inputdata(void)の宣言文エラーなどのコンパイルエラー。それと、inputdataを用いてどうやって5件のデータを入れたらいいかがわかりません。教えてください。 #define SIZE 5 #include <stdio.h> typedef struct{ int yy; int mm; int dd; }YMD; typedef struct{ char name[20]; YMD birthday; int age; }RECORD; RECORD inputdata(void); void main(void) { int i; for(i = 0;i < SIZE;i++){ inputdata(); } RECORD inputdata(void) { RECORD person; printf("名前>"); scanf("%s", person.name); printf("誕生日入力\n"); printf("年>"); scanf("%d", person.birthday.yy); printf("月>"); scanf("%d", person.birthday.mm); printf("日>"); scanf("%d", person.birthday.dd); return person; }

  • 構造体の構造体 引数

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

  • ポインタを使って構造体の配列を戻り値にするには

    関数の戻り値を構造体の配列(アドレスを受け渡しを利用して)にしたいのですがうまくゆきません。 以下のプログラムではコンパイルはできるのですが、 a0 = 2 a1 = 4198512 a2 = 4329332 と表示されてしまいa1,a2がうまくゆきません。 ********************************************* #include<stdio.h> struct test{ int a; }; struct test *func(void); void main(void) { struct test *data;//構造体ポインタ int i; data = func(); //ポインタにtest関数の戻り値(アドレス)を代入 for(i=0;i<=2;i++){   printf("a%d = %d\n",i,(data+i)->a); //構造体要素を表示 } } struct test *func(void) { struct test data[3]={1,2,3}; //構造体配列を定義 return (&data[0]); //構造体配列の先頭アドレスを返す } ************************************************* test関数から受ける取ったアドレス(&data[0])をポインタ(data)に代入して1づつずらして表示させれば a0=1,a1=2,a=3 となると思ったのですがどこが間違っているのでしょうか? よろしくお願いします。

  • 分割コンパイル時に構造体....

    レベルの低い質問とは思いますが struct st { int a; int b; }; void a(struct st *ST) { ST->a=1; ST->b=1; } void main() { struct st ST; a(&ST); printf("%d%d",ST.a,ST.b); getch(); } これだと問題なく動作するのですが、ソースファイルを分割して ソース1 void a(struct st *ST); struct st { int a; int b; }; void main() { struct st ST; a(&ST); printf("%d%d",ST.a,ST.b); getch(); } ソース2 void a(struct st *ST) { ST->a=1; ST->b=1; } だとエラーが返ってくるのがなぜなのか解りません ソース2でも同じ構造体の宣言をしなければならないのでしょうか。 長くなり読みにくくなってしまいましたが、よろしくお願いします。

  • 構造体とポインタ

    演習問題を解いていて「構造体ポインタの指定の方法」で理解できない部分があったので、質問させていただきます。 その内容は、メイン関数で「scanf」で入力させた値を仮引数として計算する関数に送って計算し、メイン関数で表示処理を行うというものを、構造体とポインタを使って作るというものです。 とりあえずプログラムは以下のとおりになりました。 (字下げしたものが、下部のURL先にあります) #include <stdio.h> /***構造体***/ struct test{ int a; int b; }syoki[2] = { {0,0}, {0,0} }; /***値をプラスする関数***/ void kansu(struct test *no){ no->a++; no->b++; } /***メイン関数***/ void main(){ int nomber; //無限ループ for(;;){ printf("値を追加する番号を指定してください\n"); printf("(入力する値は、0か1)→"); scanf("%d", &nomber); //関数を呼び出す kansu(&nomber); //画面表示 printf("入力番号: %d\n",syoki); printf("値1: %d\n",syoki->a); printf("値2: %d\n",syoki->b); } } VisualStudio.NETのエラー内容では 「'int *__w64 ' から 'test *' に変換できません」 と表記されています。おそらくメイン関数で指定した「nomber」がint型では駄目だというのはわかるのですが、それでは他に何を指定すればいいのかわからないのです。 もしよければ、アドバイスをいただけると嬉しいです。 よろしくお願いします。

  • 構造体メンバ 構造体ポインタ 値代入

    typedef struct _test_t{ int aaa; int bbb; } test_t; typedef struct _globalData{ int xxx; test_t* pTestData[256]; } globalData_t; globalData_t globalData; int main(){ test_t testData1 = {1,1}; test_t testData2 = {2,2}; *globalData.pTestData[1] = testData1; /* (1) */ globalData.pTestData[2] = &testData1; /* (2) */ } 上記のようなグローバルデータの構造体globalData のメンバの構造体配列にtest_t型の構造体を格納し保持するには、 (1)、(2)のどちらが正しいでしょうか?

  • 構造体を引数で関数へ渡す

    こんばんは。現在C言語を学んでいます。 課題という形で構造体で定義されたデータを関数の引数に当てはめ、データを渡すという処理を行わねばならぬのですが、関数を利用しての構造体の受け渡しが分からず苦戦しております。ご助言頂ければ幸いです。 分かりづらいかとは思いますが下記が私が簡単にですが作ったものとなります。 私の考えている動作プロットとしては 1. 構造体の形式を定義する。 2. 冒頭にて存在する関数を定義 3. main関数内にて構造体に名前を付けて定義し、値を入力より受付 4. do_it_hoge関数に構造体を引数として与え(ここが分からず)関数を呼び出す。 5. 関数内にて引数で受け取った &hoge.a,b,c等を表示するなどしたい。(受け取る方法が分からず) 関数を呼ぶ際にカッコ内に入れるのは構造体の名前のみで良いのでしょうか? (例: do_it_hoge(hoge); のように) また呼び出される関数側の括弧は何を記述するのでしょうか? いつもならint hogehoge, や char hoge, などと宣言しているかと思うのですが。 読みづらく、分かりにくいものかとは思いますが どうぞ宜しくご教授頂ければと思っております。 構造体を触るのが久しぶりだったのでそちらでミスがあるかもしれません。もし何か補足等必要でしたらメッセージ頂ければ返事させていただきたいと思います。 //----------------------------------------------------------------// //構造体HOGEHOGE定義 //----------------------------------------------------------------// typedef struct tagHOGEHOGE { int a,b; int c; }HOGEHOGE; void do_it_hoge();//関数定義。ここでのカッコ内の定義も不明 //----------------------------------------------------------------// // main //----------------------------------------------------------------// void main(){ HOGEHOGE hoge;//hogeをHOGEHOGE利用で定義 scanf("%d,%d",&hoge.a,&hoge.b);//カンマ区切りで代入 scanf("%d",&hoge.c);//数値をhoge.cへ do_it_hoge();//←ここが分からず } //----------------------------------------------------------------// // do_it_hoge 関数。構造体を引数で受け取りたい関数。 //----------------------------------------------------------------// void do_it_hoge(){ // ←括弧内の受け方が分からず // ここでmainで入力された &hoge.aなどを参照して表示したい // 例: printf("hogeA:%d",&hoge.a); } //----------------------------------------------------------------//

専門家に質問してみよう