-1

与えられた配列 p[5] を循環的に左に 2 桁シフトする関数を記述します。したがって、p[0] = 15、p[1] = 30、p[2] = 28、p[3] = 19、p[4] = 61 の場合、シフト後 p[0] = 28、p[ 1] = 19、p[2] = 61、p[3] = 15、および p[4] = 30. (4 x 5) 行列に対してこの関数を呼び出し、2 だけ左にシフトされた行を取得します。

以下は私がこれまでに持っているコードですが、機能していません。の問題は、ヘルパー関数がパラメーターint *を取るため、メイン関数で配列を取らないため、正しく機能しないことです。しかし、それはうまくコンパイルされます。

#include<stdio.h>

void moveLeft2(int p[5])
{
    int temp1 = p[0];
    int temp2 = p[1];

    for(int i = 0; i <  5 - 2; i++)
    {
        p[i] = p[i + 2];
    }

    p[3] = temp1;
    p[4] = temp2;
}

int main()
{
    int p[4][5] = {
        {15,30,28,19,61},
        {1,2,3,4,5},
        {6,7,8,9,20},
        {11,12,13,14,15}};
    int i;

    moveLeft2(p);
    return 0;
}

誰でも助けることができますか?

4

2 に答える 2

1
void moveLeft2(int p[5])

その宣言は実際には嘘です。それが意味することは

void moveLeft2(int *p)

つまり、 に渡される引数は へmoveLeft2のポインタでなければなりませんint。実装では、ポインタが 5 つの s を保持するのに十分な大きさのメモリ ブロックを指していると想定していますがint、これは型によって強制されないため安全ではありませんが、ここで重要な点は、関数の引数が type でなければならないということint*です。

そして、もしあなたが持っているなら

int row[5] = {1,2,3,4,5};
moveLeft2(row);

コンパイラは、最高の警告レベルであっても警告を発しません。これは、配列が関数に渡されるときに最初の要素へのポインターに変換されるためです (および他のほとんどのコンテキストでは、配列は,および[address] 演算子の引数として最初の要素へのポインターに変換されません)。したがって、渡された引数には必要な型が正確に含まれています。sizeof_Alignof&

宣言

int p[4][5] = {...};

pそれぞれ5 の 4 つの配列の配列として宣言しintます。p[0]はこれらの最初のものなint[5]ので、

moveLeft2(p[0]);

は型が正しい関数呼び出しです (配列p[0]は最初の要素へのポインターに変換されます&p[0][0])。配列p[0]は 5 つintの の配列であるため、 の実装における仮定moveLeft2が満たされ、呼び出しは型が正しいだけでなく、意味的にも正しいです。

同じことが配列 (配列の) の他の行にも当てはまりますp。したがって、

for(i = 0; i < 4; ++i) {
    moveLeft2(p[i]);
}

4 つの行すべてを 1 つずつシフトします。

于 2012-11-28T01:36:06.603 に答える
0

代替品:

  • void moveLeft2(int p[5])void moveLeft2(int *p)
  • moveLeft2(p);moveLeft2(p[i]);
  • for (i = 0; i < 4; i ++)前に追加moveLeft2(p[i]);

コード:

#include<stdio.h>

void moveLeft2(int *p)
{
    int temp1 = p[0];
    int temp2 = p[1];
    int i;



    for(i = 0; i <  5 - 2; i++)
    {
        p[i] = p[i + 2];
    }

    p[3] = temp1;
    p[4] = temp2;
}

int main()
{
    int p[4][5] = {
        {15,30,28,19,61},
        {1,2,3,4,5},
        {6,7,8,9,20},
        {11,12,13,14,15}};
    int i;

    for (i = 0; i < 4; i ++)
        moveLeft2(p[i]);
    return 0;
}
于 2012-11-29T07:01:17.747 に答える