//=============================================================================
//
// ポインタ処理 [main.cpp]
//
//=============================================================================
#include <stdio.h>
#include <string.h>
//=============================================================================
// マクロ定義
//=============================================================================
#define MAX_NAME_FULL (256) // 氏名文字最大数
#define MAX_NAME_LAST (128) // 苗字文字最大数
#define MAX_NAME_FIRST (128) // 名前文字最大数
#define MAX_DATA (3) // データ最大値
//=============================================================================
// 個人データの構造体
//=============================================================================
typedef struct
{
char aNameFull[MAX_NAME_FULL]; // 氏名
int nAge; // 年齢
float fHeight; // 身長
float fWeight; // 体重
} PersonalData;
//=============================================================================
// プロトタイプ宣言
//=============================================================================
void InputData(PersonalData *pData);
void OutputData(PersonalData *pData);
//=============================================================================
// メイン関数
//=============================================================================
void main(void)
{
PersonalData aPersonalData[MAX_DATA];
// データ入力
InputData(&aPersonalData[0]);
// データ出力
OutputData(&aPersonalData[0]);
// キー入力待ち
printf("*** 何かキーを押してください ***\n");
rewind(stdin);
getchar();
}
//=============================================================================
// データ入力
//=============================================================================
void InputData(PersonalData *pData)
{
char aNameLast[MAX_NAME_LAST];
char aNameFirst[MAX_NAME_FIRST];
printf("+------------------------------+\n");
printf("| 個人データを入力してください |\n");
printf("+------------------------------+\n");
printf("\n");
// アドレスを代入
pData = &aPersonalData[0];
for(int nCnt = 0; nCnt < MAX_DATA; nCnt++)
{
printf("苗字> ");
scanf("%s", &aNameLast[0]);
printf("名前> ");
scanf("%s", &aNameFirst[0]);
strcpy(&pData->aNameFull[0], &aNameLast[0]);
strcat(&pData->aNameFull[0], " ");
strcat(&pData->aNameFull[0], &aNameFirst[0]);
printf("年齢> ");
scanf("%d", &pData->nAge);
printf("身長> ");
scanf("%f", &pData->fHeight);
printf("体重> ");
scanf("%f", &pData->fWeight);
printf("\n");
pData++;
}
}
//=============================================================================
// データ出力
//=============================================================================
void OutputData(PersonalData *pData)
{
printf("+------------------------+\n");
printf("| 個人データを表示します |\n");
printf("+------------------------+\n");
printf("\n");
// アドレスを代入
pData = &aPersonalData[0];
for(int nCnt = 0; nCnt < MAX_DATA; nCnt++)
{
printf("氏名:%s\n", &pData->aNameFull[0]);
printf("年齢:%d\n", pData->nAge);
printf("身長:%5.1f\n", pData->fHeight);
printf("体重:%5.1f\n", pData->fWeight);
printf("\n");
pData++;
}
return;
}
// アドレスを代入
pData = &aPersonalData[0];
ここの部分が定義されていないとエラーが出てしまいます…
どうすればよいですか?
関数間ポインタがわかりません(汗)
Re: 関数間ポインタがわかりません(汗)
コードはBBcodeを有効にした状態でcodeタグで囲んでいただけると、見やすくなるのでありがたいです。
【追記】
テストしました。
C++なので、main関数の戻り値はintにしないとコンパイルエラーになります。
void main(void)という部分を int main(void)としてください。
テストしていませんが、多分該当の2箇所を削除すればいいと思います。kakana さんが書きました:// アドレスを代入
pData = &aPersonalData[0];
ここの部分が定義されていないとエラーが出てしまいます…
どうすればよいですか?
【追記】
テストしました。
C++なので、main関数の戻り値はintにしないとコンパイルエラーになります。
void main(void)という部分を int main(void)としてください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 関数間ポインタがわかりません(汗)
#include <stdio.h>
#define MAX_DATA (3)
void inputData(int *p)
{
int i;
/* main関数で定義したdataという配列へのポインターをpで受けている。
* p[]にデータを入れれば、すなわちmain関数におけるdata[]にデータを
* 入れたことになる。
* p = &data[0]; とはできない。
* なぜなら、dataという配列を「ここで」定義しているわけではないから。
*/
for (i = 0; i < MAX_DATA; i++) {
printf("%d番目のデータを入力:", i + 1);
scanf("%d", &p[i]);
}
}
void outputData(int *p)
{
int i;
for (i = 0; i < MAX_DATA; i++) {
printf("%d番目のデータは", i + 1);
printf("%d\n", p[i]);
}
}
int main(void)
{
int data[MAX_DATA];
inputData(data);
outputData(data);
return 0;
}
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。