4

次のことを行うC++のプログラムがあります。ソートされていない整数の配列を取得し、それを昇順でサブ配列に分割します。例えば。私の配列は 1,2,3,-2,4 なので、出力は次のようになります: 1,2,3 //サブ配列 1 -2,4 //サブ配列 2

私がそれを行う必要があった方法は、ポインターの配列を割り当てることであり、その配列内の各セルは、1 つのシリーズを含むサブ配列 (これも動的に割り当てられます) を指します。また、「メイン」機能を変更することはできません

現在、演算子のオーバーロードを使用してサブ配列を出力する「印刷」メソッドがあります。

確認したところ、印刷方法が正常に機能していることがわかりましたが、このコードでは次のようになります。

cout << "\ns3: \n";
  print(s3);

  s3 = s1;
  cout << "\ns3 again: \n";
  print(s3);

print(s3) は正常に印刷されますが、print(s3) が再度呼び出されたときの代入演算子の後、ジャンク出力が得られます。いくつかのダブギングの後、デストラクタに関連するものだと思います。

誰かが私の問題を指摘して特定し、解決策を提供してくれれば、とても感謝しています。もちろんソースコードは差し上げます

アップデート

私は自分自身をもう少しうまく説明したいと思います.「印刷」を呼び出すたびに、トレースインすると、「印刷」の前に最初に実行されるのはコピーコンストラクターです。コピー コンストラクターにブレークポイントを設定すると、関数シグネチャ (コピー コンストラクター関数) のポインター "src" が正しい場所 (配列の最初の要素) を指していることがわかりますが、代入 s3=s1 の後print(s3) 再びコピー コンストラクターのポインターがジャンクです

**

ここにコード:

   // HW4.cpp : Defines the entry point for the console application.
//

#include <iostream>
using namespace std;


//global declerations and indexes//
typedef long int * LONG_INT_PTR;        

//class     
class SeriesArray
{
//members declerations
private: 
        LONG_INT_PTR *stable;
        int *count_arr;   //help array that indicate how many serieses made from the array and how many element in each series
        int count_size;   //  help counter
        int size;

public:
        SeriesArray::SeriesArray(LONG_INT_PTR arr, int n );
        SeriesArray::SeriesArray(const SeriesArray& src );
        SeriesArray::~SeriesArray();
        long int SeriesArray::get_entry(int i,int j) const;
        SeriesArray& SeriesArray::operator=(const SeriesArray& src);
        friend ostream& operator<<(ostream& stream, const SeriesArray& src);//global - not member
};


//members implementation
        //default constructor
        SeriesArray::SeriesArray(LONG_INT_PTR arr, int n )
        {
            size=n;
            int j=0;
            int s=0;
            count_size=0;
            count_arr=new int[size];
            for (int i=0;i<size;i++)
            {
                if (arr[i]<arr[i+1])
                    count_size++;
                else
                {
                    count_size++;
                    count_arr[j]=count_size;
                    j++;
                    count_size=0;
                }
            }
            size=j;
            stable=new LONG_INT_PTR[size];
            for (int i=0;i<size;i++)
            {
                stable[i]=new long int[count_arr[i]];
                for (int k=0;k<count_arr[i];k++)
                {
                    stable[i][k]=arr[s];
                    s++;
                }
            }

    }

    //copy constructor
    SeriesArray::SeriesArray(const SeriesArray& src )
    {

            size=src.size;
            count_arr=new int[size];
            stable=new LONG_INT_PTR[size];
            for (int i=0;i<size;i++)
            {
                count_arr[i]=src.count_arr[i];
                stable[i]=new long int[count_arr[i]];
            }
            memcpy(this->stable,src.stable,src.size*sizeof(long int));
    }

    //destructor
    SeriesArray::~SeriesArray()
    {
        for (int i=0;i<size;++i)
                delete[] stable[i];
        delete[] this->count_arr;
        count_size=0;
    }

    //member
    long int SeriesArray::get_entry(int i,int j) const
    {

        if (i<this->count_size&&this->stable[i][j]!=NULL)
            return (this->stable[i][j]);
        else return NULL;
    }


    //overload = operator
    SeriesArray& SeriesArray::operator=(const SeriesArray& src)
    {
        if (this==&src)
          return *this;

        if (stable!=NULL)
            delete[] stable;
        if (count_arr!=NULL)
            delete[] count_arr;
            //for (int i=0;i<size;i++)
            //  delete[] stable[i];
            size=src.size;
            count_arr=new int[src.size];
            memcpy(count_arr,src.count_arr,src.size*sizeof(int));
            stable=new LONG_INT_PTR[size];
            for (int i=0;i<size;i++)
            {
            //  count_arr[i]=rhs.count_arr[i];
                stable[i]=new long int[src.count_arr[i]];
            }
            memcpy(stable,src.stable,src.size*sizeof(long int));

        return *this;
    }


//***************************************************************************************************************************************************//
//global//

    //overload operator <<
    ostream& operator<<(ostream& stream,const SeriesArray& src)
    {
        for (int i=0;i<src.size;i++)
        {
        for (int j=0;j<src.count_arr[i];j++)
         {
            stream << " " << src.stable[i][j] << " " ; 
         }
        stream << "\n\n\n" ;
     }

        return stream;
    }

    //print
    void print(SeriesArray src)
    {
         cout << src;
        cout << "\n";
    }  // print



//main  
int main()
{
  long int arr1[20] = {23, 91, -71, -63, 22,  55, 51, 73, 17, -19,
                      -65, 44, 95,  66, 82, 85, 97, 30, 54, -34};
  long int arr2[10] = {0, 1, -7, -6, 2,  5, 6, 7, 1, -1};

  int count[20], i, j, n =20, sno;

  long int *parr[20];

  SeriesArray s1(arr1, 20);
  SeriesArray s2(arr2, 10);
  SeriesArray s3(arr2, 10);


  cout << "\narr1:\n";

  for(i=0; i < 20; i++)
    cout <<  "  " << arr1[i] << "  ";
  cout << "\n";

  cout << "\n\ntable:\n";
  print(s1); 

  cout << "\narr2\n";

  for(i=0; i < 10; i++)
    cout <<  "  " << arr2[i] << "  ";
  cout << "\n";

  cout << "\n\ntable:\n";
  print(s2);

  cout << "\ns3: \n";
  print(s3);


  s3 = s1;
  cout << "\ns3 again: \n";
  print(s3);

  cout << "\ns1 again: \n";
  print(s1);

  cin>>i;
 return 0;
} // main 
4

3 に答える 3

0

私はあなたのプログラムを試しましたが、実行時にプログラムが失敗する原因となるいくつかの間違いがあります (gcc を使用してプログラムをコンパイルします)。

void print(SeriesArray src)

これは値による呼び出しです。これにより、関数 print がコピー コンストラクターを呼び出します (このページをチェックしてください)。印刷を終了するとすぐに、src が削除されます (プログラムはデストラクタを呼び出します)。動的に割り当てられたメモリを使用しているため、これは問題です。参照によって呼び出したほうがよいでしょう。これにより、print がオーバーロードされた = 代入演算子を使用するようになります。

void print(SeriesArray & src)

次に、私のコメントで既に読んだように、無効なポインターがあります。さらに、安定版に十分なスペースを割り当てていません。このようにコンストラクタを書き直す必要があります-または、必要に応じてよりエレガントな方法で...

SeriesArray::SeriesArray(LONG_INT_PTR arr, int n )
{
    size=n;
    int j=0;
    int s=0;
    count_size=1;
    count_arr=new int[size];
    for (int i=0;i<size-1;i++)
    {
        if (arr[i]<arr[i+1])
            count_size++;
        else
        {
            count_arr[j]=count_size;
            j++;
            count_arr[j]=1;
            count_size=1;
        }
    }
    size=j+1;
    stable=new LONG_INT_PTR[size];
    for (int i=0;i<size;i++)
    {
        stable[i]=new long int[count_arr[i]];
        for (int k=0;k<count_arr[i];k++)
        {
            stable[i][k]=arr[s];
            s++;
        }
    }
}
于 2013-09-28T18:09:37.377 に答える