tags:

views:

200

answers:

2

I'm reading through "Illustrated C" and the first exercise question asks:

Program MATMUL multiplies matrices of fixed size. Make the program deal with any specified sizes.

So below is the code that I have come up with thus far. However I read that all attributes need to be declared before the main function. So how do I get custom sized arrays without declaring them in the main function?

#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;
}
+7  A: 

float A[i][j], B[j][k], C[i][k]; //Not legal, right?

Your question has been tagged C and VLAs are part of C99, so float A[i][j], B[j][k], C[i][k]; is legal.

EDIT

If your compiler doesn't support C99 then you are left with no option other than dynamic memory allocation.

Example:

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

Note: Do not forget to free the memory when you are done.

Prasoon Saurav
His problem might be, that a variable declaration is not allowed at this point. Add some `{}` or use a second method ...
tanascius
IF your compiler conforms to C99. If you need to support a compiler that doesn't (they are still out there) then you should know how to do it both ways (with malloc and without)
A. Levy
`If you need to support a compiler that doesn't (they are still out there) ` then I'd tell them to upgrade their compilers.
Prasoon Saurav
@A Levy: Compiling with Visual C++ Express 2008, is it C99 compliant?
Anarchist
No, MSVC does not support C99.
Ivo Wetzel
If you take Prasoon's advice and upgrade your compiler then use VLAs, make sure you don't allow insanely large dimensions. GCC puts VLAs on the stack.
Nathon
I installed CodeBlocks so I can compile with GNU GCC.
Anarchist
+2  A: 

You'll probably want to allocate the memory to store the array dynamically. Somewhere along the line of:

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

/* <snip> */

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

NOTE: Adjust accordingly for two-dimensional arrays.

Santa
I wouldn't say he needs to, more like "he can also".
Michael Foukarakis
Why was this answer down-voted? Perhaps he should have done an explicit cast to (float *) of the malloced memory, but this answer is correct.
A. Levy
/shrug. Edited for correctness anyway.
Santa