ページ 11

関数間ポインタがわかりません(汗)

Posted: 2015年6月01日(月) 14:40
by kakana
//=============================================================================
//
// ポインタ処理 [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: 関数間ポインタがわかりません(汗)

Posted: 2015年6月01日(月) 16:45
by みけCAT
コードはBBcodeを有効にした状態でcodeタグで囲んでいただけると、見やすくなるのでありがたいです。
kakana さんが書きました:// アドレスを代入
pData = &aPersonalData[0];
ここの部分が定義されていないとエラーが出てしまいます…
どうすればよいですか?
テストしていませんが、多分該当の2箇所を削除すればいいと思います。

【追記】
テストしました。
C++なので、main関数の戻り値はintにしないとコンパイルエラーになります。
void main(void)という部分を int main(void)としてください。

Re: 関数間ポインタがわかりません(汗)

Posted: 2015年6月02日(火) 00:18
by box

コード:

#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;
}