-4

私の教科書からの質問は次のとおりです。

float へのポインターを返し、2 つのパラメーターを持つ関数を作成します。返されるポインターは、2 次元配列の対応する行の要素の合計を含む float の配列を指す必要があります。

私の解決策は次のとおりです。

float* ptr (float array[][COL], int rows) {
    float *ptr;
    int j; 

    for (j=0; j<COL; j++)
        *ptr += array[rows][j];

    return *ptr; 
}

この解決策が正しいかどうか疑問に思っていますか?どうもありがとうございました。

4

1 に答える 1

1

ポイントするためのメモリを割り当てていないptrため、答えは避けられません。自動配列へのポインターを返すことができないように、メモリが十分に長く続くことを確認する必要があります。静的配列を用意する必要があります (ただし、十分に大きくするにはどうすればよいでしょうか)。または、メモリを動的に割り当てて ( malloc()et al)、呼び出し元のコードが割り当てられたものを解放するようにする必要があります。

アルゴリズムの問​​題もあります。すべての行のすべての値を 1 つの値に累積していますが、行ごとに個別の値を計算する必要があります。

また、*ptrですfloatreturn ptr;タイプを正しくするだけで済みます。

関数名も異なる必要があります。

#include <stdio.h>
#include <stdlib.h>

enum { COL = 7 };

float *row_sums(float array[][COL], int rows)
{
    float *ptr = malloc(rows * sizeof(*ptr));
    if (ptr != 0)
    {
        for (int i = 0; i < rows; i++)
            for (int j = 0; j < COL; j++)
                ptr[i] += array[i][j];
    }
    return ptr;
}

int main(void)
{
    float data[][COL] = { { 1.0 }, { 2.0 }, { 0.0, 3.0 }, { -1.0, -2.0 } };
    float *result = row_sums(data, 4);
    for (int i = 0; i < 4; i++)
        printf("%d: %.1f\n", i, result[i]);
    free(result);
    return(0);
}

の使用は4最適ではありません。のようなものにする必要がありますROWS。ここで、次を使用して定義されています。

enum { ROWS = sizeof(data) / sizeof(data[0]) } ;
于 2013-06-27T05:56:29.773 に答える