0
  1. 最初の問題: 0 エラー、0 警告。確かにコードは正しいです。何が悪いのか教えてください。(これはプログラムの一部です。) 何が悪いのか理解できません。少なくともそれは表示されますarray[3][3] = {{1,1,1},{1,1,1},{1,1,1}}

  2. 2 番目の問題: しかし、「ゼロ」の代わりに、クリア フィールドが表示されます。(何も見えない) でも があれば{{1,1,1},{1,1,1},{1,1,1}}'1' が見える... 理由を教えて?

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//#define L 3            /* Including the [0]-element */
//#define C 3            /* Including the [0]-element */
#define RANGE 100      /* Set up the range of random values */

int fill_in(int *, int, int); /* Prototype of function */

int main()
{
   int L = 3, C = 3;

   int array[L][C];  // L - Line, C - Column
   int i, j;        // Global variables

   int * aPtr;
   aPtr = &array[L][C];

   srand((unsigned)time(NULL));

   fill_in(aPtr, L - 1, C - 1);

   /* Displaying array (AFTER) */   //  <--- going to make a function, but my first one 
   printf("\nAFTER:\n");            //       doesn't work correctly =(
   for (i = 0; i <= L - 1; i++)
   {
      for (j = 0; j <= C - 1; j++)
         printf("%2.d ", array[i][j]);
      printf("\n");
   }

   return 0;
}

int fill_in( int * aptr, int m, int n)   ///  PROBLEM?  O_о
{
   int arr[m][n];
   int i, j;      // Local variables

   /* Filling array with random values */
   for (i = 0; i <= m - 1; i++)
   {
      for (j = 0; j <= n - 1; j++)
         arr[i][j] = 1;      //1 + rand()%RANGE;  // If each element == 1, it works! 
   }

   return arr[i][j];
}

更新:解決しました!説明はコードのコメントにあります。次のコードは正しく機能します。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define Lines 2            /* Including the [0]-element */
#define Columns 2            /* Including the [0]-element */
#define RANGE 100      /* Set up the range of random values */

int fill_in(int*, int, int); /* Prototypes of functions */
int display(int*, int, int);

int main()
{
    int L = Lines, C = Columns;
    int array[L][C];  // L - Line, C - Column
    int* aPtr;
    aPtr = &array[0][0];

    srand((unsigned)time(NULL));


    fill_in(aPtr, L, C);   /* Filling array with random values. */
    display(aPtr, L, C);   /* Displaying array. */


    return 0;
}

////////////////////////////////////////////////////////////////////

/**   Eureka!  The fact is that pointer of a[0][0] is *ptr[0], and
      the pointer of a[2][2] is *ptr[8] ---> The 8-th element of the array[2][2].

  >>>>   Pointer sees array[][] not as matrix (square), but as a line!
  >>>>   As if to make a line of a square matrix!

*/

int fill_in(int* aptr, int m, int n)        /* Filling array with random values. */
{
   int i;      // Local variables
   int max_number_of_element = ((m+1)*(n+1)-1);

   for (i = 0; i <= max_number_of_element; i++)
      *(aptr + i) = 1 + rand()%RANGE;

   return *aptr;
}


int display(int* aptr, int m, int n)    /* Displaying array. */
{
   int i;
   int count = 1;
   int max_number_of_element = ((m+1)*(n+1)-1);

   for (i = 0; i <= max_number_of_element; i++)
   {
      printf("%2.d  ", *(aptr + i));

      if (count % (n+1) == 0)
         printf("\n");
      count++;
   }
return i;
}

それ以外の:

for (i = 0; i < m; i++)
   for (j = 0; j < n; j++)
      aptr[i * n + j] = 1;

私が使用した:

for (i = 0; i <= max_number_of_element; i++)   
  *(aptr + i) = 1;
//Pointer sees array[][] not as matrix (square), but as a direct sequence (line).

配列の外側で何かを行うかどうかはわかりませんが、主な問題は解決されました。

PS私が間違っていたら教えてください。

4

2 に答える 2

5

aptr関数内では何もしませんfill_in。代わりに、ローカルarr配列を埋めます。代わりにこれを行います:

for (i = 0; i < m; i++)
{
    for (j = 0; j < n; j++)
        aptr[i * n + j] = 1;
}

さらに、これ:

aPtr = &array[L][C];

する必要があります

aPtr = &array[0][0];

配列の最初の要素へのポインターが必要です。

また、 の代わりにcounter <= max - 1、より簡潔で従来のcounter < max表記を使用します。

于 2013-03-19T12:01:59.123 に答える
1

これは間違っています

int * aPtr;
aPtr = &array[L][C];

配列の境界外の位置にポインタを割り当てています。配列は行と列の両方で0から2まで定義されており、ポインターに位置(3,3)を割り当てています。

これに加えて、fill_in関数への引数として渡すポインターでは何もしていません。

于 2013-03-19T12:05:59.457 に答える