2013-09-19 4 views
1

Эй, ребята, я пытаюсь практиковать учебные указатели в C++. Поэтому я пытаюсь размножать эти массивы и получаю все 0 в моей результирующей матрице. если кто-нибудь может просто намекнуть мне, что посмотреть или какие-то советы о том, что вызывает это, было бы потрясающе.Умножение матриц с помощью указателей

Вот код:

#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"); 
    } 
} 
+0

В multiplyMatrices * ptr3 = 0; забивается много в петле. Кажется довольно бессмысленным. –

+1

В multiplyMatrices ptr [1-3] все указывают на конец матрицы! Хлоп. –

+1

О, и вы никогда не увеличиваете свои указатели в multiplyMatrices. –

ответ

2

В makeIdent вам нужно увеличивать ptr после каждого элемента. В инициализируйте ptr, вам нужно указать его на первый элемент в массиве, а не на последний элемент.

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; 
} 

Это ближе к тому, что вы хотите для 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++; 
    } 
} 
} 

Вы могли бы это вместо того, чтобы сказать:

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

Но я не хочу, чтобы запутать вопрос.

+0

Хм, я попробовал это. Это дает мне матрицу 5x5 со всеми 0, за исключением того, что [0] [3] говорит 15746200. Будет ли это адрес, на который он ссылается для этого индекса? – Shawn

+1

В коде также есть другие проблемы. Например, makeIdent не работает. –

+0

makeIdent работает для меня, когда я его компилирую. Он отображает матрицу 5x5. Проблема, с которой я сталкиваюсь, заключается в том, что метод multiplyMatrices – Shawn

Смежные вопросы