Shawn
Shawn

Reputation: 2435

Multiplying matrices using pointers

Hey guys I am trying practice learning pointers in c++. So I am trying to multiply these arrays and am getting all 0's in my resulting matrix. if anybody could just hint to me what to look at or some advice on what is causing this that would be amazing.

Here is the code:

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

/* Routines called. */
int loadMatrixFromFile(char *filename, int *data);
void showMatrix(int *data, int len);
int makeIdent(int matrixB[5][5], int length);
int matrixA[5][5];
int matrixB[5][5];
int matrixC[5][5];
void multiplyMatrices(int matrixA[5][5], int matrixB[5][5],int matrixC[5][5]);

int main(){
    int len, data[1000];
    len = loadMatrixFromFile("Numbers.txt", data);
    showMatrix(data, len);
    makeIdent(matrixB, len);
    multiplyMatrices(matrixA, matrixB, matrixC);
}

int makeIdent(int matrixB[5][5], int len){
    int i,j;
    int *ptr;
    ptr = &matrixB[5][5];
    printf("Matrix B is: \n");
    for(i=0;i<5;i++){
           for(j=0;j<5;j++){
                 if(i==j){
                         *ptr=1;
                         printf("%d ", *ptr);
                 }
                 else{
                     *ptr=0;
                     printf("%d ",*ptr);
                 }
           }
           printf("\n");
     }
    return *ptr;
     printf("\n");
}
int loadMatrixFromFile(char *filename, int *data){
    FILE *in;
    int len;
    int j;
    in = fopen(filename, "r");
    if (in == NULL) {
        printf("Could not find file: %s \n", filename);
    }
    else {
        printf("Reading numbers...\n");
        fscanf(in, "%d", &len);
        printf("reading %d numbers from file %s ....\n", len, filename);
        for(j=0;j<len;j++) {
            fscanf(in, "%d", data + j);
        }
        fclose(in);
    }
    for(int i = 0; i<5; i++){
        for(int j = 0; j < 5; j++){
                matrixA[i][j] = *(data + i*5 + j);
        }
    }
    return len;
}
void showMatrix(int *data, int len){
    int j;
    int count = 0;
    printf("Showing %d numbers from data array....\n", len);
    printf("Matrix A is: \n");
    for(j=0;j<len;j++) {
        printf("%d ", *(data + j));
        count++;
        if(count % 5 == 0){
            printf("\n");
        }
    }
    printf("\n");
}

void multiplyMatrices(int matrixA[5][5], int matrixB[5][5],int matrixC[5][5]){

     int i, n, j;
     int *ptr1, *ptr2, *ptr3;
     ptr1 = &matrixA[5][5];
     ptr2 = &matrixB[5][5];
     ptr3 = &matrixC[5][5];

     printf("\n");
     printf("Matrix A x Matrix B is: \n");
     for(i=0;i<5;i++){
         for(j=0;j<5;j++){
             *ptr3=0;
         }
     }
     for (i = 0; i<5; i++){
            for (j = 0; j<5; j++){
                for(n=0;n<5;n++){
                *ptr3 += (*ptr1**ptr2);
      }
                printf("%d ",*ptr3);
    }
    printf("\n");
  }
}

Upvotes: 2

Views: 3601

Answers (1)

Charlie Burns
Charlie Burns

Reputation: 7044

In makeIdent you need to increment ptr after each element. To initialize ptr you need to point it to the first element in the array, not the last element.

int makeIdent(int matrixB[5][5], int len){
    int i,j;
    int *ptr;
    ptr = &matrixB[0][0]; // note the 0 instead of the 5
    printf("Matrix B is: \n");
    for(i=0;i<5;i++){
           for(j=0;j<5;j++){
                 if(i==j){
                         *ptr=1; 
                         printf("%d ", *ptr);

                 }
                 else{
                     *ptr=0;
                     printf("%d ",*ptr);
                 }
                 ptr++; // this is new
           }
           printf("\n");
     }
    return 0;
}

This is closer to what you want for multiplyMatrices:

void multiplyMatrices(int matrixA[5][5], int matrixB[5][5],int matrixC[5][5]){

 int i, n, j;
 int *ptr1, *ptr2, *ptr3;
 ptr1 = &matrixA[0][0];
 ptr2 = &matrixB[0][0];
 ptr3 = &matrixC[0][0];

 for (i = 0; i<5; i++) {
     for (j = 0; j<5; j++) {
         *ptr3 = (*ptr1 * *ptr2);
         ptr1++; ptr2++; ptr3++;
     }
 }
}

You could say this instead:

*ptr3++ = *ptr1++ * *ptr2++;

But I don't want to confuse the issue.

Upvotes: 3

Related Questions