Как инициализировать элементы массива перед его использованием? - PullRequest
1 голос
/ 03 февраля 2012

Мне нужно написать программу, которая иллюстрирует использование указателей с массивами и функциями.

#include <stdio.h>
#include <conio.h>

#define ROWS 3
#define COLS 4

void print(int rows, int cols, int *matrix);

void main(void)
{
    int a[ROWS*COLS],i;
   for(i=0;i<ROWS*COLS;i++)
   {
        a[i]=i+1;
   }
   print(ROWS,COLS,a);
    getch();
}

void print(int rows, int cols, int *matrix)
{
    int i,j,*p=matrix;
    for(i=0;i<rows;i++)
   {
    for(j=0;j<cols;j++)
      {
        printf("%3d",*(p+(i*cols)+j));
      }
      printf("\n");
   }
}

Приведенная выше программа печатает матрицу с предварительно определенными строками и столбцами. Я хочу изменить программу так, чтобы строки и столбцы вводились пользователем.

#include <stdio.h>
#include <conio.h>

void print(int rows, int cols, int *matrix);

void main(void)
{
    int ROWS,COLS,a[ROWS*COLS],i;
   printf("Enter the number of rows: ");
   scanf("%d",ROWS);
   printf("\nEnter the number of columns: ");
   scanf("%d",COLS);
   for(i=0;i<ROWS*COLS;i++)
   {
        a[i]=i+1;
   }
   print(ROWS,COLS,a);
    getch();
}

void print(int rows, int cols, int *matrix)
{
    int i,j,*p=matrix;
    for(i=0;i<rows;i++)
   {
    for(j=0;j<cols;j++)
      {
        printf("%3d",*(p+(i*cols)+j));
      }
      printf("\n");
   }
}

Эта программа выдает ошибку, что переменные ROWS и COLS используются до их объявления. Как решить эту проблему.

Ответы [ 4 ]

5 голосов
/ 03 февраля 2012

Один из вариантов - выделить a в куче:

int main(void)
{
   int rows,cols,*a,i;
   printf("Enter the number of rows: ");
   scanf("%d",&rows);
   printf("\nEnter the number of columns: ");
   scanf("%d",&cols);
   a = malloc(rows*cols*sizeof(int));
   for(i=0;i<rows*cols;i++)
   {
        a[i]=i+1;
   }
   print(rows,cols,a);
   getch();
   free(a);
}

Обратите внимание, что я:

  1. Добавлены амперсанды, отсутствующие в scanf()звонки;
  2. Изменен тип возврата main() на int.См. Каковы действительные подписи для функции main () C?

Как вы, почему ваш код не работал:

Традиционно, C требует константные выражениядля границ массива.Когда ROWS и COLS были константами, все было хорошо с вашим кодом.Как только вы превратили их в переменные, a стал массивом переменной длины .Проблема заключалась в том, что размер массива вычислялся в точке, где массив объявлен, и в этот момент значения ROWS и COLS еще не были известны.

В C99 этоможно исправить свой код, нажав на объявление a вниз:

int main(void)
{
   int rows,cols,i;
   printf("Enter the number of rows: ");
   scanf("%d",&rows);
   printf("\nEnter the number of columns: ");
   scanf("%d",&cols);
   int a[rows*cols];
   for(i=0;i<rows*cols;i++)
   {
        a[i]=i+1;
   }
   print(rows,cols,a);
   getch();
}
1 голос
/ 03 февраля 2012
   printf("Enter the number of rows: ");
   scanf("%d",&ROWS);
   printf("\nEnter the number of columns: ");
   scanf("%d",&COLS);
0 голосов
/ 03 февраля 2012
  1. Вам нужно динамически распределить массив - используйте malloc
  2. scanf("%d", &ROWS); - обратите внимание, * & - scanf требует адрес.
0 голосов
/ 03 февраля 2012

Вы должны объявить массив после получения rows и cols - в противном случае это не имеет смысла.

int rows,cols;
scanf("%d %d",&rows,&cols);
int a[rows*cols];

Кстати, main должно вернуть int (0, еслипрограмма успешно завершается)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...