0

関数があり、配列へのポインターと関数へのポインターを受け取り、パラメーターで渡された関数によって定義された順序で新しい配列を返す必要があります。タイプを知らずにある配列の要素を別の配列にコピーする方法に関する私の問題

void * scrambleArr(void * arr, int numElem, int elemSize, int (*func)(void*)) {
    void * newArr;
    int cPos, newPos,i;

    newArr = (void *)malloc(numElem*elemSize);

    for (i=0 ; i < numElem ; i++)
    {
        cPos = i*elemSize;
        newPos = func((char*)arr+cPos);
        *((char*)newArr+newPos) = *((char*)arr+cPos);
    }
    return newArr;
}

最後のパラメータを渡した関数

int posArrayBySize(void *el) {
    ARRAY* arr = (ARRAY *)el;
    return arr->size - 1;
}

メインのコード:

int main( ) {
    ARRAY * arrSorted;
    int a[2] = {1,2};
    int b[3] = {1,1,1};
    int c[1] = {9};
    int d[4] = {3,3,3,3};
    ARRAY arr[4] = {{a,2},{b,3},{c,1},{d,4}};

    arrSorted =(ARRAY *)scrambleArr(arr,4,sizeof(ARRAY),posArrayBySize);

    free(arrSorted);
    return 0;
}

arrSorted を実行した後、ガベージが含まれています。

私にとっての別のオプションは、コピーではなく、ある配列を他の要素にポイントすることです。それは可能ですか?

ありがとう。

4

2 に答える 2

6

memcpy は、探している関数です。

于 2011-04-16T16:42:47.483 に答える
0

これは機能しません

*((char*)newArr+newPos) = *((char*)arr+cPos);

arr + cPosをcharであるため逆参照しているため、最初のバイトのみがコピーされます。

于 2011-04-16T16:48:53.337 に答える