循环for不起作用,因为我认为C中的乘法二维数组

时间:2017-09-10 02:19:31

标签: c arrays loops

我在函数realizar_operacion_arreglos中遇到循环问题。我做了机械循环,但编译器没有抛出相同的东西。我需要帮助来解决这个问题。

数组a

2 3  1
5 -1 7

数组b

 2  5 2 
 3  0 4
-1  1 1

正确的结果是

12 11 17
 0 32 13 

但这是代码的实际结果

12  11  17
-7  7  7 

怎么了?

/********************************************************************************
 * Programa 8: Multiplicacion entre 2 arreglos de 2D. Se debe comprobar si primero
 * se puede realizar la multiplicacion. Si se puede retorne 1 si no 0
 *
 * Input: 2 arreglos de 2D, tamaño de cada arreglo
 *
 * Output: multiplicacion de los dos arreglos, condicional si se puede o no la
 *
 * multiplicacion con 0 y 1
 *
  *********************************************************************************/
 #include <stdio.h>
 #include <stdlib.h>
 #include <math.h>

 // Prototipos

 int pedir_fila1();
 int pedir_columna1();
 void **pedir_valores_arreglo1(int **arreglo1, int fila1, int columna1);
 int pedir_fila2();
 int pedir_columna2();
 void **pedir_valores_arreglo2(int **arreglo2, int fila2, int columna2);
 int verificar_multiplicacion(int columna1, int fila2);
 int **realizar_operacion_arreglos(int **arreglo1, int fila1, int columna1, 
 int **arreglo2, int fila2, int columna2);

 // Main

 int main (){
 int fila1, fila2, columna1, columna2, verificacion, i, j = 0;
 int **arreglo1, **arreglo2, **m;
 fila1 = pedir_fila1();
 columna1 = pedir_columna1();
 fila2 = pedir_fila2();
 columna2 = pedir_columna2();
 verificacion = verificar_multiplicacion(columna1,fila2);
 if(columna1==fila2){
 arreglo1 = (int **) calloc(fila1,sizeof(int *));
 for(i = 0; i<fila1; i++){
 arreglo1[i] = (int *) calloc(columna1,sizeof(int));
 }
 arreglo2 = (int **) calloc(fila2,sizeof(int *));
 for(i = 0; i<fila2; i++){
 arreglo2[i] = (int *) calloc(columna2,sizeof(int));
 }
 m = (int **) calloc(fila1,sizeof(int *));
  for(i = 0; i<fila1; i++){
    m[i] = (int *) calloc(columna2,sizeof(int));
 }
 pedir_valores_arreglo1(arreglo1,fila1,columna1);
 pedir_valores_arreglo2(arreglo2,fila2,columna2);
 m=realizar_operacion_arreglos(arreglo1,fila1,columna1,arreglo2,fila2,columna2);

 for(i=0; i<fila1; i++){
 for(j=0; j<columna2; j++){
 printf(" %d ",m[i][j]);
 }
 printf("\n");
 }printf("\n");
 }else{
 return 0;
 }
 }

 // Desarrollo de los prototipos

 int pedir_fila1(){
 int fila1 = 0;
 printf("Favor ingrese el numero de filas para el arreglo 1 \n");
 scanf("%d",&fila1);
 if(fila1<0){
 printf("No se puede dimensionar la fila negativa");
 return 0;
 }else{
 return fila1;
 }
 }

 int pedir_columna1(){
 int columna1 = 0;
 printf("Favor ingrese el numero de columnas para el arreglo 1 \n");
 scanf("%d",&columna1);
 if(columna1<0){
 printf("No se puede dimensionar la columna negativa");
 return 0;
 }else{
 return columna1;
 }
 }

 void **pedir_valores_arreglo1(int **arreglo1, int fila1, int columna1){
 int i, j = 0;
 for(i=0; i<fila1; i++){
 for(j=0; j<columna1; j++){
 printf("Para el arreglo 1, ingrese la fila %d y la columna %d\n",i+1,j+1);
 scanf(" %d",&arreglo1[i][j]);
 }
 }
 for(i=0; i<fila1; i++){
 for(j=0; j<columna1; j++){
 printf(" %d ",arreglo1[i][j]);
 }
 printf("\n");
 }
 printf("\n");
 }

 int pedir_fila2(){
 int fila2 = 0;
 printf("Favor ingrese el numero de filas para el arreglo 2 \n");
 scanf("%d",&fila2);
 if(fila2<0){
 printf("No se puede dimensionar la fila negativa");
 return 0;
 }else{
 return fila2;
 }
 }

 int pedir_columna2(){
 int columna2 = 0;
 printf("Favor ingrese el numero de columnas para el arreglo 2 \n");
 scanf("%d",&columna2);
 if(columna2<0){
 printf("No se puede dimensionar la columna negativa");
 return 0;
 }else{
 return columna2;
 }
 }

 void **pedir_valores_arreglo2(int **arreglo2, int fila2, int columna2){
 int i, j = 0;
 for(i=0; i<fila2; i++){
 for(j=0; j<columna2; j++){
 printf("Para el arreglo 2, ingrese la fila %d y la columna %d\n",i+1,j+1);
 scanf("%d",&arreglo2[i][j]);
 }
 }
 for(i=0; i<fila2; i++){
 for(j=0; j<columna2; j++){
 printf(" %d ",arreglo2[i][j]);
 }
 printf("\n");
 }
 printf("\n");
 }

 int verificar_multiplicacion(int columna1, int fila2){
 int verificacion = 0;
 if(columna1==fila2){
 printf("La multiplicacion de matrices se puede realizar\n");
 verificacion = 1;
 return verificacion;
 }else{
 printf("La multiplicacion de matrices no se puede realizar\n");
 verificacion = 0;
 return verificacion;
 }
 }

 int **realizar_operacion_arreglos(int **arreglo1, int fila1, int columna1, int **arreglo2, int fila2, int columna2){

 int i, j, k = 0;
 int **resultado;
 resultado = (int **)calloc(fila1,sizeof(int *));
 for(i=0; i<columna2; i++){
 resultado[i]=(int *)calloc(columna2,sizeof(int));
 }

 for ( k = 0; k < fila1; k++){
   int temporal = 0;
   for ( j = 0; j < columna2; j++){
     int temporal = 0;
     for ( i = 0; i < columna1; i++ ){
       temporal += (arreglo1[k][i])*(arreglo2[i][j]);
       resultado[k][j]=temporal;
     }
   }
 }
 return resultado;
 }

1 个答案:

答案 0 :(得分:1)

int** realizar_operacion_arreglos(...)函数中,变量int** resultado未初始化。它是一个指针,这意味着通过使用它,您可以将乘法结果写入计算机内存中的某个随机区域。并且该区域的一部分稍后会被重写,这正是结果部分正确且部分不正确的原因。

因此,您需要为resultado矩阵分配内存。替换

int** resultado;

使用:

int** resultado = (int**)calloc(fila1, sizeof(int*));
for (size_t i = 0; i < fila1; ++i) {
    resultado[i] = (int*)calloc(columna2, sizeof(int));
}

(这与前两个矩阵的main()函数中的实际情况完全相同)。

另外请记住,在程序退出之前,您应该free()所有内存,但首先我建议您专注于使代码正常工作。

更新1

您已将我的代码段添加到您的程序中,但位置错误。现在,你分配了适量的内存,但是太快了。之后

m=realizar_operacion_arreglos(arreglo1,fila1,columna1,arreglo2,fila2,columna2);

指针m被赋予一个新值(不正确的值,如上所述),并且结果矩阵的内存丢失。

您需要将此分配代码移至realizar_operacion_arreglos函数。只需删除

即可
int** resultado;

行和地点

int** resultado = (int**)calloc(fila1, sizeof(int*));
for (size_t i = 0; i < fila1; ++fila1) {
    resultado[i] = (int*)calloc(columna2, sizeof(int));
}

而不是。

更新2

抱歉,for循环中有一个拼写错误,导致无限循环和Out of Memory条件。它现在已修好。

似乎通过此修复程序,您的程序可以运行。至少我得到了正确的结果。

更新3

使用gcc -Wall -Wextra -pedantic -g -o main main.c进行编译时,会发出以下警告:

main.c: In function ‘main’:
main.c:31:40: warning: variable ‘verificacion’ set but not used [-Wunused-but-set-variable]
  int fila1, fila2, columna1, columna2, verificacion, i, j = 0;
                                        ^~~~~~~~~~~~
main.c: In function ‘realizar_operacion_arreglos’:
main.c:167:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (size_t i = 0; i < fila1; ++i) {
                       ^
main.c: In function ‘pedir_valores_arreglo1’:
main.c:107:2: warning: control reaches end of non-void function [-Wreturn-type]
  }
  ^
main.c: In function ‘pedir_valores_arreglo2’:
main.c:148:2: warning: control reaches end of non-void function [-Wreturn-type]
  }
  ^

要摆脱这些警告:

  1. 在主要功能中,您应该使用if (verificacion)而不是if (columna1 == fila2)
  2. 描述行数/列数的变量应为size_t类型,而不是int。这是因为int无法保留所有可接受的值,而size_t是&#34;精心制作的&#34;用于索引和类似的东西。如果您要进行此更改,则应将fila1columna1,...等所有变量更改为size_t类型。但是我建议将此更改留待以后(如果有的话),至少如果你能在一段时间内发出此警告就好了。
  3. 功能pedir_valores_arreglo1不会返回任何内容,请将其从void**更改为void
  4. pedir_valores_arreglo2执行相同操作。
  5. 如果main()为1,那么verificacion函数也不会返回任何内容 ...实际上这意味着它返回0(至少在我的计算机上) 。但是在代码开头的文本中,指出在成功的情况下,程序应该返回1.因此,在main(return 1;调用之后立即添加printf()语句( )功能。