Duda programación en c

Buenas, tengo un problema y es que estoy ofuscado con un problemilla que tengo en c. La cosa va de crear matrices dinamicamente, para lo que utilizo la función malloc y tal, y no tengo ningún problema o eso creo porque por lo que estoy viendo porque como yo lo hago me invierte las filas por las columnas, por ejemplo: (suponemos que b es de la misma dimension que A y que es por ejemplo:
1 2 3
4 5 6
7 8 9)

int **a;
int i,j;
a =(int **) malloc (sizeof(int*)*3);
for(i=0;i<3;i++)
     a[i]=(int*)malloc(sizeof(int)*);
for(i=0;i<3;i++)
    for(i=0;i<3;j++)
       a[i][j]=b[i][j];


Pues el resultado me sale invertido, osea cambia filas por columnas.

a = 1 4 7
2 5 8
3 6 9

¿Que hago mal?
el segundo bucle está mal, modificas i pero no j.
ah perdona es que me he equivocado yo al escribirlo aqui, imaginaros que es una j
Haciendo esto tira correctamente
#include <stdlib.h>
#include <stdio.h>

int main (void){
int a[3][3], b[3][3];
int i,j;

for(i=0;i<3;i++){
  for(j=0;j<3;j++){
    if((i+1) % (j+1) == 0)
      a[i][j]=i+j; //Relenamos la matriz con numers distintos.
    else
      a[i][j]=5+i;
  }
}
printf("Matriz A \n");
for(i=0;i<3;i++){
  for(j=0;j<3;j++){
    printf("%i ", a[i][j]);
  }
  printf("\n");
}

for(i=0;i<3;i++){
    for(j=0;j<3;j++){
       b[i][j]=a[i][j];
    }
}
printf("Matriz b \n");
for(i=0;i<3;i++){
  for(j=0;j<3;j++){
    printf("%i ", b[i][j]);
  }
  printf("\n");
}
return 0;
}


Y su salida:
./main                                                                                                                                         
Matriz A                                                                                                                                                                         
0 5 5                                                                                                                                                                           
1 2 6                                                                                                                                                                           
2 7 4                                                                                                                                                                           
Matriz b                                                                                                                                                                         
0 5 5                                                                                                                                                                           
1 2 6                                                                                                                                                                           
2 7 4                                       


A mi no me falla.
Puedo estar un poco dormido y no me apetece comprobarlo, pero que haces para reservar memoria?

El primer malloc, crea espacio para 3 punteros a int, y el segundo malloc hace que cada puntero a int apunte a un espacio generado con el tamaño de int?

no es demasiado complicarse la vida? y además solo generas espacio para 3 int, no 9... que vete a saber donde está escribiendo?

De todas formas si no pones el codigo entero, dificil lo tenemos para sacarte el fallo.. porque si luego recorres la matriz al revés para ver el resultado y te salen los valores cambiados.. pues es normal.
nu_kru escribió:Puedo estar un poco dormido y no me apetece comprobarlo, pero que haces para reservar memoria?

El primer malloc, crea espacio para 3 punteros a int, y el segundo malloc hace que cada puntero a int apunte a un espacio generado con el tamaño de int?

no es demasiado complicarse la vida? y además solo generas espacio para 3 int, no 9... que vete a saber donde está escribiendo?

De todas formas si no pones el codigo entero, dificil lo tenemos para sacarte el fallo.. porque si luego recorres la matriz al revés para ver el resultado y te salen los valores cambiados.. pues es normal.


(Asumo que en el malloc del bucle le falta un '3' al lado del '*')

Dependiendo de qué quiera hacer, no se complica la vida. No obstante, es de las peores formas de reservar memoria para matrices convencionales. Lo mejor, generalmente, es hacer:
a = malloc(cols * rows * sizeof(*a));

Y acceder a los elementos via:
a_ij = a[i * cols + j];


- ferdy
Perdonar por los fallos en el código... Bueno en realidad el problema que tengo es en una función recursiva, pero tambien lo probe hacer como lo he puesto arriba(corrigiendo los fallos) y no me sale. Os pongo el código para facilitaros las cosas y de pasos os explico que es lo que quiero hacer con esto. El problema es que tengo una matriz P, rellena de números cualesquier y a partir de ella tengo que crear una matriz G (Matriz de ganancia), que se genera copiando todos los elementos de la primera fila, y a partir de ellos ir generando los demás elementos de la matriz de ganancia como muestro en la imagen.

Imagen
Imagen




Mi problema es que no me copia la primera fila si no la primera columna

quedando la matriz G así:
4 0 0 0
2 0 0 0
5 0 0 0
2 0 0 0

    int **m,**g;
    int i;
    m = (int **)malloc(sizeof(int*)*SIZE);
    for(i=0; i<SIZE ; i++)
        m[i] = (int *) malloc(sizeof(int)*SIZE);
    MatrizP(m, SIZE);
    g = (int **)malloc(sizeof(int*)*SIZE);
    for(i=0; i<SIZE ; i++)
        g[i] = (int *) malloc(sizeof(int)*SIZE);
    MG(0, 0, SIZE, m, g);


Función que rellena la matriz de números aleatorios
void MatrizP(int **m,int n){
    int i,j;
    srand(time(0));
    for(i=0; i<n ;i++)
        for(j=0; j<n ; j++){
            m[i][j] = rand() % 10;
        }
}


Función que realiza la matriz de ganancia.
int MG(int x,int y, int tam, int **p, int **g){
    if(x>=0 && x<tam){
        if(y==0){
            if(g[x][y]!=p[x][y]){
                g[x][y]=p[x][y];
                ImprimirMatriz(g, tam);
                printf("-----------\n");
                x++;
                if(x<tam)
                    MG(x, y, tam, p, g);
                else
                    MG(0, y+1, tam, p, g);
            }
            else
                return g[x][y];
        }
        else
            g[x][y] = p[x][y]+ Max(MG(x-1, y-1, tam, p, g),MG(x, y-1, tam, p, g),MG(x+1, y-1, tam, p, g));
    }
    else
        return -1;
   
}







PD: Ferdy,se que no es la manera más eficiente de hacerlo, pero me interesa esa manero de hacerlo.
¿Función que imprime la matriz?

¿Por qué te interesa guardar así la matriz?

- ferdy

PD: Mientras, sigo mirando...

--------------------

Entiendo que la convención es (fila, columna) como toda la vida de Dios, ¿no?.

- ferdy
Si la conversión es como toda la vida de dios fila,columna. La función de imprimir la matriz es simple es esta:
void ImprimirMatriz(int **m,int n){
   
    int i,j;
    for(i=0;i<n;i++){
        for(j=0;j<n;j++)
            printf("%d ",m[i][j]);
        printf("\n");
       
    }
}


Hago así la matriz, porque me es más facil trabajar con ella
8 respuestas