0

そのため、このサイトを検索してトピックを徹底的に調べましたが、役立つものを見つけることができませんでした.

私は友人のためにタスクを作成しています。C++ を使用してから 1 年以上になります。

したがって、私が直面している問題は、ポインターとポインターを介して構造体を返すことです。

以下にコードを示します。

#include <stdio.h>
#include <conio.h>
#include <iostream.h>

    struct student
   {
    int SUB[3];
   };

   struct AVGPCT
   {
    float avg;
      float pct;
   };


AVGPCT* CALC(student *A)
{
   int x,y;
    AVGPCT D[5]={0.0,0.0,0.0,0.0,0.0};

   for(x=0;x<5;x++)
   {
    for(y=0;y<3;y++)
      {
        D[x].avg+=A[x].SUB[y];
         D[x].pct+=A[x].SUB[y];
      }
   }

   for(x=0;x<5;x++)
   {
    D[x].avg/=2;
      D[x].pct/=300;
   }
   return (D);
}

void main(void)
{
   int i,j;
   student S[5];
   AVGPCT *V;

   for(i=0;i<5;i++)
   {
    for(j=0;j<3;j++)
      {
        cout << "Enter Marks Of Subject[" << (j+1) << "] Of Student [" << (i+1) <<"] [Max=100]:";
        cin >> S[i].SUB[j];
      }
   }

   V = CALC(S);
   cout << "Average Number Of Student [1]: " << V->avg;
   cout << (*V).pct;

   getch();
}

問題は、その場所から正しい値を取得するのに苦労していることです。

V++ でポインターをインクリメントしようとしています。面白いことに、次を使用すると値が正しく出力されます。

cout << V->avg;
cout << V->pct;
V++;
cout << V->avg;
cout << V->pct;

等々。しかし、ループを使用したり、1 行でも書いたり、endl や \n を使用したりすると、値がごちゃ混ぜになり、意味不明な値が表示されます。

では、ここで何がうまくいかないのでしょうか?

構造体を使用することが重要であり、コードに従ってガイドしてください。

4

2 に答える 2

4

スタック上のデータへのポインターを返すことはできません。代わりにaを使用しstd:vector<AVGPCT>、ポインターではなく値で返します。C++ は、Java や C# とは異なり、ポインターではなく値に基づいています。

voidC++ はから戻ることを許可しませんmain()

<iostream.h>C++ 標準によると、ヘッダーは存在しません。標準ヘッダーは<iostream>.

于 2012-11-19T20:26:59.967 に答える
2

この線のように見えます

AVGPCT D[5]={0.0,0.0,0.0,0.0,0.0};

配列 D を関数に対してローカルに宣言しますCALC()

その配列へのポインターをメイン関数に戻しますが、関数が終了すると、配列は上書き用の無料ゲームとしてマークされます。プログラムで多くのことを行うほど、メモリ内のこの場所が上書きされる可能性が高くなりますが、それがいつ起こるかはわかりません。したがって、うまくいく場合もあれば、うまくいかない場合もあります。

アドバイスをするリスクを冒してD、main のどこかで宣言し、それへのポインターを関数に渡すか、関数内で or を使用してnewmalloc結果のポインターを返す方がおそらく良いでしょう。

于 2012-11-19T20:26:36.890 に答える