0

私の宿題では、1次元配列が与えられ、2次元配列に変換する必要があります。2次元配列の列数は2です。これは、1次元配列をペア(数の値、配列内の出現数)として表す必要があるためです。これが試みたものです。エラーはコードの最後の2行に表示されます:アクセス違反の書き込み場所0xfdfdfdfd。

#include <iostream>
#include <stdlib.h>
using namespace std;

int main()
{
    const int NR=17;
    int arr[NR]={6,7,3,1,3,2,4,4,7,5,1,1,5,6,6,4,5};
    int **newArr;
    int count=0;
    int countLines=0;
    int searched;
    for(int i=0;i<NR;i++)
    {
            newArr=new int*[countLines];
        for(int i=0;i<countLines;i++)
        {
            newArr[i]=new int[2];
        }
        searched=arr[i];
        if(i>0)
        {
            for(int k=0;k<countLines;k++)
            {
                if(newArr[countLines][0] == searched)
                {
                    searched=arr[i]++;
                }

                for(int j=0;j<NR;j++)
                {
                    if(searched==arr[j])
                    {
                        count++;
                    }
                }
                countLines++;
            }
        }
        else
        {
            for(int j=0;j<NR;j++)
            {
                if(searched==arr[j])
                {
                    count++;
                }
            }
            countLines++;
        }

        newArr[countLines][0]=searched;
        newArr[countLines][1]=count;
    }
}
4

2 に答える 2

3

まずnewArr、メモリを割り当てる前に、最初のループで使用しています。正当なメモリを所有していないポインタを逆参照することはできません。その結果、未定義の動作が発生します。

次に、最後の部分では、このようnewArrに等しいメモリを割り当てていますcountLines

newArr = new int*[countLines] ;

これは、の最初の次元のインデックスがであるということを意味しnewArrます0------>countLines-1。行うことnewArr[countLines][0] = searched ;は再び未定義です。それを作りなさいnewArr[countLines - 1]

于 2012-11-17T13:37:04.023 に答える
1

(a)人々があなたの質問に答えている間にあなたがそれを変更し、(b)それは文字通り時間がかかりすぎるので、私は行ごとのコード分析に煩わされるつもりはありません。しかし、ここにクランカーの要約(網羅的ではない)があります:

  1. 2番目から始まる各ループ反復でメモリ(newArr)がリークしています。
  2. アレイへのアクセスが何度も範囲外になっています。
  3. これを解決するために、ポインタ配列を使用する必要まったくありません。次元[N][2]の単一配列。ここで、Nは一意の値の数です。

この問題を解決するための(数え切れないほどの)方法の1つを以下に示します。

#include <iostream>
#include <algorithm>

int main()
{
    // 0. Declare array and length
    int arr[]={6,7,3,1,3,2,4,4,7,5,1,1,5,6,6,4,5};
    const size_t NR = sizeof(arr)/sizeof(arr[0]);

    // 1. sort the input array
    std::sort(arr, arr+NR);

    /* alternaive sort. for this input size bubble-sort is
       more than adequate, in case your limited to not being
       allowed to use the standard library sort */
    /*
    for (size_t i=0;i<NR;++i)
        for (size_t j=i+1;j<NR;++j)
            if (arr[i] > arr[j])
            {
                arr[i] ^= arr[j];
                arr[j] ^= arr[i];
                arr[i] ^= arr[j];
            }
    */

    // 2. single scan to determine distinct values
    size_t unique = 1;
    for (size_t i=1;i<NR;++i)
        if (arr[i] != arr[i-1])
            unique++;

    // 3. Allocate a [unique][2] array
    int (*newArr)[2] = new int[unique][2];

    // 4. Walk array once more, accumulating counts
    size_t j=0;
    newArr[j][0] = arr[0];
    newArr[j][1] = 1;
    for (size_t i=1;i<NR;++i)
    {
        if (arr[i] != arr[i-1])
        {
            newArr[++j][0] = arr[i];
            newArr[j][1] = 0;
        }
        ++newArr[j][1];
    }

    // 5. Dump output
    for (size_t i=0;i<unique;++i)
        cout << newArr[i][0] << " : " << newArr[i][1] << endl;

    delete [] newArr;

    return EXIT_SUCCESS;
}

出力

1 : 3
2 : 1
3 : 2
4 : 3
5 : 3
6 : 3
7 : 2
于 2012-11-17T14:26:40.320 に答える