配列の最終的な値では、最初の要素のみがゼロになり、再びforループに移動すると(gdbを使ってチェックされます)コードの最下部にあります。私を助けてください。私は何がうまくいかないのか分からない。行列の回転..forループはポインタの値を変更します
#include<stdio.h>
#include<stdlib.h>
int main()
{
int a, b, c;
printf("enter the size of matrix");
scanf("%d%d",&a,&b);
printf("enter the number of rotations");
scanf("%d",&c);
int *arr = malloc (sizeof(int) * a * b);
int x = (a >= b)? a : b;
printf("enter the values of matrix");
// scanning the values
for(int i = 0; i < a; i++)
{
for(int j = 0; j < b; j++)
{
scanf("%d",(arr + i * b + j));
}
printf("\n");
}
// main code starts
for(int y = 0; y < c; y++)
{
// declared a new array
int *arr1 = malloc (sizeof(int) * a * b);
for(int k = 0; k < x/2; k++)
{
for(int i = k; i < a - k; i++)
{
for(int j = k; j < b - k; j++)
{
if (i == k && j > k)
{
*(arr1 + i * b + j - 1) = *(arr + i * b + j);
}
else if (i == a - k - 1 && j < b - k - 1)
{
*(arr1 + i * b + j + 1) = *(arr + i * b + j);
}
else if (j == k && i < a - k - 1)
{
*(arr1 + i * b + j + b) = *(arr + i * b + j);
}
else if (j == b - k - 1 && i > k)
{
*(arr1 + i * b + j - b) = *(arr + i * b + j);
}
}
}
if (x % 2 != 0 && a == b)
*(arr1 + x/2 * b + (b/2)) = *(arr + x/2 * b + (b/2));
}
// changing the old array to new array
arr = arr1;
// first value is getting printed correctly here
printf("%d\n",*(arr));
printf("%p\n",&(*arr));
free(arr1);
}
// printing the output
for(int i = 0; i < a; i++)
{
for(int j = 0; j < b; j++)
{
printf("%d ",*(arr + i * b + j));
}
printf("\n");
}
// first value is getting printed incorrectly here, outside the loop
printf("\n%d\n",*(arr));
printf("%p",&(*arr));
}
コードが何を達成しようとしているかについての説明は役に立ちます(「行列回転」は多くの異なることを意味します)。サンプルの入力と期待される出力との比較は非常に価値があります。コードのコメントや散文の中でアルゴリズムがどのように動作するかについての説明は、いいかもしれません。 –
Jonathanによると、Cは配列割り当てをサポートしていません。しかし、それは本当に問題ではありません。あなたは配列を割り当てていません。あなたはポインタを割り当てています。それは割り当てられたメモリのアドレスだけをコピーし、そこに格納されているデータはコピーしません。 –
[0] [0]が[1] [0]、a [0] [1]が[0] [0]になるように反時計回りに回転するなど@JohnBollinger –