bumi
bumi

Reputation: 11

c - warning: pointer argument of a function may be used uninitialized

     #include <stdio.h>
 #include <stdlib.h>

void multiplyMatrix (int **first, int **second, int **multiply);
int m, n, p, q, i, c, d, k, sum = 0;
int main()
{
  int **first, **second, **multiply;

  printf("Enter the number of rows and columns of first matrix\n");
  scanf("%d%d", &m, &n);
  first = (int **) malloc(m * sizeof(int *));
    for(i = 0 ; i < n ; i++){

        first[i]=(int *)malloc(m * sizeof(int *));
  }
  printf("Enter the elements of first matrix\n");

  for (c = 0; c < m; c++)
    for (d = 0; d < n; d++)
      scanf("%d", &first[c][d]);

  printf("Enter the number of rows and columns of second matrix\n");
  scanf("%d%d", &p, &q);
  second = (int **) malloc(p * sizeof(int *));
    for(i = 0 ; i < q ; i++){

        second[i]=(int *) malloc(p * sizeof(int *));
  }
  if (n != p)
    printf("Matrices with entered orders can't be multiplied with each other.\n");
  else
  {
    printf("Enter the elements of second matrix\n");

    for (c = 0; c < p; c++)
      for (d = 0; d < q; d++)
        scanf("%d", &second[c][d]);

    /*for (c = 0; c < m; c++) {
      for (d = 0; d < q; d++) {
        for (k = 0; k < p; k++) {
          sum = sum + first[c][k]*second[k][d];
        }

        multiply[c][d] = sum;
        sum = 0;
      }
    }*/
    multiplyMatrix(first, second, multiply);
    printf("Product of entered matrices:-\n");

    for (c = 0; c < m; c++) {
      for (d = 0; d < q; d++)
        printf("%d\t", multiply[c][d]);

      printf("\n");
    }
  }

  return 0;
}

void multiplyMatrix (int **first, int **second, int **multiply)
{

    for (c = 0; c < m; c++) {
      for (d = 0; d < q; d++) {
        for (k = 0; k < p; k++) {
          sum = sum + first[c][k]*second[k][d];
        }

        multiply[c][d] = sum;
        sum = 0;
      }
    }
}

The program i want to write should be like this: The program asks to the user to enter both the sizes and elements of 2 matrices (or you can call it 2d arrays). Then it will multiply those matrices and print the answer.

The problem i am getting: i used pointers and malloc functions to dynamically allocate the matrices. for the multiplication, i created a function called "multiplyMatrix" which i get a warning for one of the arguments of it in the decleration. here is the warning:

warning: 'multiply' may be used uninitialized in this function.

so there is some kind of a problem with initializing this argument. i feel like the answer is simple but at the same time i can't find the solution.

Upvotes: 0

Views: 1666

Answers (3)

R Sahu
R Sahu

Reputation: 206567

Suggestions to improve your code:

  1. Create a function to allocate memory for a matrix.
  2. Create a function to read matrix data.
  3. Create a function to deallocate memory of a matrix.
  4. Avoid use of global variables. Pass the necessary arguments to a function.
  5. Use those functions instead of duplicating code in main.
#include <stdio.h>
#include <stdlib.h>

int** createMatrix(int rows, int cols)
{
   int i;
   int** mat = malloc(sizeof(*mat)*rows);
   for ( i = 0; i < rows; ++i )
      mat[i] = malloc(sizeof(*mat[i])*cols);

   return mat;
}

void readMatrix(int** mat, int rows, int cols)
{
   int r;
   int c;
   for ( r = 0; r < rows; ++r )
      for ( c = 0; c < cols; ++c )
         scanf("%d", &mat[c][c]);
}

void deleteMatrix(int** mat, int rows)
{
   int i;
   for ( i = 0; i < rows; ++i )
      free(mat[i]);
   free(mat);
}

void multiplyMatrix (int **first, int **second, int **multiply,
                     int frows, int fcols, int scols)
{
   int sum = 0;
   int r;
   int c;
   int k;

   for (r = 0; r < frows; r++) {
      for (c = 0; c < scols; c++) {
         sum = 0;
         for (k = 0; k < fcols; k++) {
            sum += first[r][k]*second[k][c];
         }

         multiply[r][c] = sum;
      }
   }
}

int main()
{
   int m, n, p, q;
   int r, c;
   int **first, **second, **multiply;

   printf("Enter the number of rows and columns of first matrix\n");
   scanf("%d%d", &m, &n);

   first = createMatrix(m, n);

   printf("Enter the elements of first matrix\n");
   readMatrix(first, m, n);


   printf("Enter the number of rows and columns of second matrix\n");
   scanf("%d%d", &p, &q);

   if (n != p)
      printf("Matrices with entered orders can't be multiplied with each other.\n");
   else
   {
      second = createMatrix(p, q);

      printf("Enter the elements of second matrix\n");
      readMatrix(second, p, q);

      multiply = createMatrix(m, q);

      multiplyMatrix(first, second, multiply, m, n, q);
      printf("Product of entered matrices:-\n");

      for (r = 0; r < m; r++) {
         for (c = 0; c < q; c++)
            printf("%d\t", multiply[r][c]);

         printf("\n");
      }

      deleteMatrix(multiply, m);
      deleteMatrix(second, p);
   }

   deleteMatrix(first, m);

   return 0;
}

Upvotes: 0

user3629249
user3629249

Reputation: 16540

the variable multiply was declared in main(), however it is never set to point to anything. it needs to be created the same way as first and second, however it does not need to have its' values filled in.

Upvotes: 0

Martyn Davis
Martyn Davis

Reputation: 624

You have not allocated the memory to be used by the multiply matrix - hence it is being flagged as uninitialised.

You also need to review how you use your row and column values when allocating the first and second matrices, for example:

  first = (int **) malloc(m * sizeof(int *));
    for(i = 0 ; i < m ; i++){

        first[i]=(int *)malloc(n * sizeof(int *));
  }

(Incorporates comment made by wildplasser)

This will allow first to be accessed as first[row][col]

Upvotes: 1

Related Questions