前提・実現したいこと
画面に「社員番号」「氏名」「給与」を入力して、ファイルに登録するプログラムを作成しています。
データの更新の場合と新規の場合を考えて作成しています。
問題となっているのは、
自分で作成した関数内で使用した構造体をメイン関数でも使用したいがその方法がわからないというものです。
ポインタを使う、メイン関数内で宣言すると言われたのですがわかりませんでした。
関数内で宣言したものをmain関数内で使用するにはポインタを使ってどうすればいいのかという質問で。
すみませんが教えていただけるとありがたいです。
既存データ表示処理の部分で
int X;
X=*rec[0];
という定義をしましたがこれもエラーが出ていて原因がわからないという状況です。
こちらの原因も教えていただけたらなと思います。
発生している問題・エラーメッセージ
main関数内でsearch関数内で定義した「rdbuf]という構造体データを使いたいが
main関数で使えないというものです。
エラーメッセージ
main関数内の「rdbuf」を使う場面で
error c2065: 'rdbuf' : underfind
warning c4047: 'argment' : different levels of indirection
というエラーが起きます。
```#include <stdio.h> #include <fcntl.h> #include <memory.h> #include <string.h> #include <io.h> #include <errno.h> #include <math.h> #include <stdlib.h> #include <sys\types.h> #include <sys\stat.h> /*********************************************************************/ /* 定数の定義 */ /*********************************************************************/ #define CR 0x0D #define LF 0x0A #define DATA SYAIN.MAS /*********************************************************************/ /* 構造体の宣言 */ /*********************************************************************/ struct syain_k { char sno[5]; /* 社員番号 */ char name[20]; /* 氏名 */ char salary[7]; /* 給与 */ char crlf[2]; /* CR/LF */ }; /*********************************************************************/ /* 静的変数の定義 */ /*********************************************************************/ /*********************************************************************/ /* 内部関数のプロトタイプ宣言 */ /*********************************************************************/ int numeric_chk(char str,int n); int search(char *sno,struct syain_k *rec); void data_disp(struct syain_k *rec); void touroku(int recno, char *sno,char *name,char *salary); /*********************************************************************/ /* main() メイン関数 */ /*********************************************************************/ int Fd; initial_syori() { Fd = open("SYAIN.DAT",O_CREAT); /*ファイルのオープン*/ } main() { int a; long d; int recno; char sno, name, salary; struct syain_k *rec; while(1) { printf("社員番号を入力してください\n"); scanf("%d",&sno); a=numeric_chk(sno,5); if(a==-1) printf("NUMERICエラー\n"); continue; d=atol(&sno); if(d==99999) return 0; else if(d>=1000&&d<=90000) printf("範囲エラー\n"); continue; recno=search(&sno, rdbuf); if(recno!=0) data_disp(&rebuf); printf("氏名の入力\n"); scanf("%s",name); printf("氏名[%s]\n",name); printf("給与を入力してください\n"); scanf("%s",salary); printf("給与:[%s]\n",salary); touroku(recno, &sno, &name, &salary); } } /*********************************************************************/ /* 数字か文字かのチェック */ /* IN: char *str チェックを行う文字列 */ /* in: int n チェックを行う文字列のバイト数 */ /* 戻り値 0:全て数字: -1:数字以外の文字あり */ /*********************************************************************/ int numeric_chk(str, n) int n; char *str; { int i; for(i=0;i<n;i++) if ((str[i]>='0')&&(str[i]<='9')) continue; else return(-1); } /*********************************************************************/ /* レコードの検索処理 */ /* IN: *sno キー入力された社員番号 */ /* OUT: *rec 社員番号が一致した時の既存レコード */ /* 戻り値 0・・・存在しない */ /* 1〜・・・既存のレコード番号 */ /*********************************************************************/ int search(char *sno, struct syain_k *rec) { struct syain_k rdbuf; int recno=0; int n; long a, b; a=atol(sno); b=atol(rdbuf.sno); lseek(Fd,0L,SEEK_SET); while(1) n=read(Fd,&rdbuf,34); if(n==0) { recno=0; return 0; } else { recno++; if(a==b) return recno; } } /*********************************************************************/ /* 既存データの表示処理 */ /* IN: rec 社員番号が一致した時のレコード */ /*********************************************************************/ void data_disp(struct syain_k *rec) /*表示処理*/ { int X; X=*rec[0]; switch(X) { case0: printf("役員\n"); break; case1: printf("部長\n"); break; case2: printf("課長\n"); break; case3: printf("係長\n"); break; case4: printf("主任\n"); break; default: printf(" \n"); } printf("%s", rdbuf.name[20]); printf("%s", rdbuf.salary[7]); } /*********************************************************************/ /* 登録処理 */ /* IN: recno・・・レコード番号 */ /* 0:更新レコードは存在しない */ /* 1〜:更新するレコード番号 */ /* IN: *sno・・・社員番号 */ /* IN: *name・・・氏名 */ /* IN: *salary・・・給与 */ /*********************************************************************/ void touroku(recno, sno, name, salary) int recno; char *sno, *name, *salary; { struct syain_k wtbuf; memcpy(wtbuf.sno, sno, 5); memcpy(wtbuf.name, name, 20); memcpy(wtbuf.salary, salary, 7); memcpy(wtbuf.crlf, CR/LF, 2); if (recno==0) lseek(Fd,0L,SEEK_END); else lseek(Fd,34*(recno-1),SEEK_SET); write(Fd,&wtbuf,34); } コード ```#
回答2件
あなたの回答
tips
プレビュー