Определенные пользователем размеры массива в C - PullRequest
4 голосов
/ 19 июля 2010

Я читаю «Иллюстрированный C», и первый вопрос упражнения задает:

Программа MATMUL умножает матрицы фиксированного размера. Заставьте программу работать с любыми указанными размерами.

Итак, ниже приведен код, который я придумал до сих пор. Однако я прочитал, что все атрибуты должны быть объявлены перед основной функцией. Так как же получить массивы нестандартного размера, не объявляя их в основной функции?

#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>

int n, m, i, j, k;

int main(void)
{
    printf("\nEnter:rows for A, columns for A and rows for B, columns for B\n");
    scanf("%i %i %i", &i, &j, &k);
    float A[i][j], B[j][k], C[i][k];    //Not legal, right?

    /*Read in A array*/
    for(n=0; n<i; ++n)
        for(m=0; m<j; ++m)
            scanf("%f", &A[n][m]);

    /*Read in B array*/
    for(n=0; n<j; ++n)
        for(m=0; m<k; ++m)
            scanf("%f", &B[n][m]);

    /*Calculate C array*/
    for(j=0; j<i; ++j)
        for(i=0; i<k; ++i)
        {
            C[i][j] = 0;
            for (k=0; k<j; ++k)
                C[i][j] += A[i][k] * B[k][j];
        }
    for(n=0; n<i; ++n)
         for(m=0; m<k; ++m)
        printf("\n%.2f\t", C[n][m]);

    return 0;
}

Ответы [ 2 ]

6 голосов
/ 19 июля 2010

float A [i] [j], B [j] [k], C [i] [k]; // Не законно, верно?

Ваш вопрос помечен C и VLA являются частью C99, поэтому float A[i][j], B[j][k], C[i][k]; является законным.

EDIT

Если ваш компилятор не поддерживает C99, у вас не останется другого выбора, кроме dynamic memory allocation.

Пример:

  float **A;
  int l;
  A= (float**)malloc(i*sizeof(float*));
  for(l=0;l<i;++l)
     A[l]= (float*)malloc(j*sizeof(float));

Примечание : Не забудьте free память, когда вы закончите .

3 голосов
/ 19 июля 2010

Возможно, вы захотите выделить память для динамического хранения массива.Где-то вдоль линии:

float *a;
int siz;    /* store user input here */

/* <snip> */

/* allocate a float array with `siz` elements */
a = (float *) malloc(sizeof(float) * siz);

ПРИМЕЧАНИЕ. Отрегулируйте соответственно для двумерных массивов.

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