Foros del Web » Programación para mayores de 30 ;) » C/C++ »

problema con funciones y arrays dinamicos [cuadrado magico]

Estas en el tema de problema con funciones y arrays dinamicos [cuadrado magico] en el foro de C/C++ en Foros del Web. bueno lo que sucede es que tengo que hacer un trabajo para la U.. y se trata de crear un cuadrado magico... que es que ...
  #1 (permalink)  
Antiguo 05/07/2014, 14:49
 
Fecha de Ingreso: julio-2014
Mensajes: 1
Antigüedad: 9 años, 9 meses
Puntos: 0
problema con funciones y arrays dinamicos [cuadrado magico]

bueno lo que sucede es que tengo que hacer un trabajo para la U.. y se trata de crear un cuadrado magico... que es que todas las sumas de los cuadrados de el mismo resultado.... el problema que tengo es que no se como hacer una matriz bidimensional variable.. lo he intentado muchas cosas. pero veo que aun me falta.. pero tengo q entregar este trabajo.. y no se como hacerlo.. a y se me olvida.. es que todo el programa tiene que se por obliación con funciones.. y tengo algo.. pero por motivos que no se.. no me funciona el programa. me compila.. pero solo qeda ai.. si algien tuviera algo de tiempo plz.. :/


Código:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
 
void inicializar_arreglo (int **a, const int j){
    int x,y;
    for(x=0; x<j; x++){
        for(y=0; y<j; y++){
            (a[y][x]=0);
        }
    }
}

void materializar_arreglo(int **a, const int j){
    int w, y, x, z, tx, ty;
    (w=j*j);
    (y=0);
    (x=j/2);
    (tx=0);
    (ty=0);
    for(z=1; z<=w; z++){
        (a[y][x]=z);
        (ty=y);
        (tx=x);
        (y--);
        if(y<0){
            (y=j-1);
        }
        (x--);
        if(x<0){
            (x=j-1);
        }
        if(a[y][x]>0){
            (y=ty+1);
            (x=tx);
        }
    }
}

int main(){
    int i , j , k , w , x , y , z , tx , ty ;
    printf("||CUADRADO MAGICO||\n\n");
    printf("Ingrese un numero del cuadrado magico.\n\n");
    scanf("%d",&i);
    while(i<=2 | i%2==0){
        printf("Ingrese un numero impar mayor o igual que 3.\n\n");
        scanf("%d",&i);
        printf("\n");
    }
    int arr[i][i];
    inicializar_arreglo(arr,i);
    materializar_arreglo(arr,i);
    
    
    for(j=0; j<i; j++){
                for(k=0; k<i; k++){
                        printf("[%3d] ",arr[j][k]);
                        }
                printf("\n\n");
                }
    return 0;
}
  #2 (permalink)  
Antiguo 05/07/2014, 17:25
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: problema con funciones y arrays dinamicos [cuadrado magico]

Te sugiero que ejecutes la aplicacion en el depurador, parece magia pero te encuentra los errores :))

Antes de nada: para que conio.h? Si no vas a usar ninguna de sus funciones puedes ahorrartela, ademas no forma parte del estandar.

Prueba a bloquear memoria dinamica para el array; primero reservas las filas y para cada fila las columnas, algo asi:

Código C:
Ver original
  1. int **arr = 0;//puntero nulo
  2. *arr = malloc(sizeof(int)*i);//reservas memoria para 'i' filas
  3. for(j = 0; j < i; j++) {
  4.     arr[j] = malloc(sizeof(int)*i);//para cada fila reservas memoria para 'i' columnas
  5. }

Puedes hacerlo de otras formas; si usas esta vas a acceder a las posiciones del array de forma:

Código C:
Ver original
  1. array[fila][columna]

Ya tienes el array listo, y lo envias tal cual a las funciones de inicio y populado.

Recuerda que para cada malloc necesitas un free, luego despues de usar el array tienes que liberar la memoria. En esta aplicacion no tiene sentido porque el s.o. se encargará de ello, pero tal vez en futuras aplicaciones tengas que reutilizar el array, ya sea para resetearlo o para redimensionarlo. En este caso la liberacion de memoria es el proceso inverso a la reserva: para cada fila liberas las columnas, y al final liberas las filas; algo asi:

Código C:
Ver original
  1. for(j = 0; j < i; j++) {
  2.     free(arr[j]);
  3. }
  4. free(*arr);

Ya lo tienes. Revisa estas lineas para entender exactamente que hacen, y ante cualquier duda ya sabes donde preguntar.

Espero que te sirva de ayuda

Saludos
vosk
  #3 (permalink)  
Antiguo 05/07/2014, 23:53
Avatar de leosansan  
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 11 años, 10 meses
Puntos: 49
Respuesta: problema con funciones y arrays dinamicos [cuadrado magico]

Cita:
Iniciado por vosk Ver Mensaje
................................................
Código C:
Ver original
  1. int **arr = 0;
  2. *arr = malloc(sizeof(int)*i);//reservas memoria para 'i' filas
..............................................
Creo que se te fue un asterisco de más:

Código C++:
Ver original
  1. int **arr = 0;
  2. arr = malloc(sizeof(int)*i);

O bien, y con una comprobación de memoria suficiente:

Código C++:
Ver original
  1. int **arr= malloc(sizeof(int)*i);//reservas memoria para 'i' filas
  2.   if(!arr){
  3.         printf("No hay espacio suficiente en memoria");
  4.         exit(EXIT_FAILURE);
  5.   }
  6.   for(j = 0; j < i; j++) {
  7.       arr[j] = malloc(sizeof(int)*i);//para cada fila reservas memoria para 'i' columnas
  8.   }

O también con calloc, que inicializa a cero y se ahorra la función "inicializar_arreglo":

Código C++:
Ver original
  1. int **arr= calloc( i, sizeof ( int ));
  2.     if(!arr){
  3.             printf("No hay espacio suficiente en memoria");
  4.             exit(EXIT_FAILURE);
  5.       }
  6.     for(j = 0; j < i; j++) {
  7.         arr[j] = calloc( i, sizeof ( int ));
  8.     }
  9.  
  10.   ///inicializar_arreglo (arr,i);


¡¡¡Saluditos!!!


Última edición por leosansan; 06/07/2014 a las 00:46
  #4 (permalink)  
Antiguo 06/07/2014, 14:37
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: problema con funciones y arrays dinamicos [cuadrado magico]

@leosansan: "...Creo que se te fue un asterisco de más..:"

Si yo tambien lo creo :))

Y ademas me olvidé la comprovacion de error en la reserva de memoria, que tambien tiene que ir en la reserva de memoria para las columnas, ya sea con malloc o con calloc.

Gracias por la correccion

Saludos
vosk

Etiquetas: arrays, cuadrado, dinamicos, funcion, funciones, int, programa
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:39.