我在函数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;
}
答案 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()
所有内存,但首先我建议您专注于使代码正常工作。
您已将我的代码段添加到您的程序中,但位置错误。现在,你分配了适量的内存,但是太快了。之后
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));
}
而不是。
抱歉,for循环中有一个拼写错误,导致无限循环和Out of Memory条件。它现在已修好。
似乎通过此修复程序,您的程序可以运行。至少我得到了正确的结果。
使用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]
}
^
要摆脱这些警告:
if (verificacion)
而不是if (columna1 == fila2)
size_t
类型,而不是int
。这是因为int
无法保留所有可接受的值,而size_t
是&#34;精心制作的&#34;用于索引和类似的东西。如果您要进行此更改,则应将fila1
,columna1
,...等所有变量更改为size_t
类型。但是我建议将此更改留待以后(如果有的话),至少如果你能在一段时间内发出此警告就好了。pedir_valores_arreglo1
不会返回任何内容,请将其从void**
更改为void
。pedir_valores_arreglo2
执行相同操作。如果main()
为1,那么verificacion
函数也不会返回任何内容 ...实际上这意味着它返回0(至少在我的计算机上) 。但是在代码开头的文本中,指出在成功的情况下,程序应该返回1.因此,在main(return 1;
调用之后立即添加printf()
语句( )功能。