duda al pasar array a funcion

B

Hola
EStoy intentando hacer lo siguiente

void mostrar_matriz(int fila,int columna,int A[][2]){
     int i,j;
    for(i=0;i<fila;i++){
                     for(j=0;j<columna;j++){
                                      printf("%i",A[i][j]);
                                      printf("\t");
                                      }
                                      printf("\n");
                                      }
    return;
}

Eso escribe una matriz que yo le pase desde la funcion principal por pantalla, la cosa es que no se como ponerlo para que escriba una matriz de cualquier tamaño porque si lo pongo asi
int A[][]
no funciona, me obliga a poner un tamaño en 2 el segundo miembro o no va, y no se como ponerlo :(

cabron

int** A

1 respuesta
B

#2

void mostrar_matriz(int fila,int columna,int** A[][]){
     int i,j;
    for(i=0;i<fila;i++){
                     for(j=0;j<columna;j++){
                                      printf("%i",A[i][j]);
                                      printf("\t");
                                      }
                                      printf("\n");
                                      }
    return;
}

asi?? y luego como la llamo?

1 respuesta
cabron

#3

Asumiendo que fila y columna son las dimensione del array:

for(i=0;i<fila;i++)
    {
        for(j=0;j<columna;j++)
        {
            printf("%d\n", *(A+(i*columna)+j));
        }
    }
1 respuesta
B

#4 me refiero a luego en la funcion principal como la llamo?

int** B[2][2];
    **B[0][0]=1;
    **B[0][1]=2;
    **B[1][0]=3;
    **B[1][1]=4;
    int i,j;
    i=2;
    j=2;
    mostrar_matriz(i,j,**B);
    system("pause");
    return 0;

asi?? se me cuelga cuando compilo xD

1 respuesta
cabron

#5

El ** es solo para el parámetro de la función, no tienes que ponerlo en el resto de sitios

int  B[2][2];
 B[0][0]=1;
 B[0][1]=2;
 B[1][0]=3;
 B[1][1]=4;
  int i,j;
    i=2;
    j=2;
    mostrar_matriz(i,j,B);
1 respuesta
B

#6

void mostrar_matriz(int fila,int columna,int** A){
     int i,j;
    for(i=0;i<fila;i++){
                     for(j=0;j<columna;j++){
                                      printf("%d\n", *(A+(i*columna)+j));
                                      printf("\t");
                                      }
                                      printf("\n");
                                      }
    return;
}
int main(){
    int B[2][2];
    B[0][0]=1;
    B[0][1]=2;
    B[1][0]=3;
    B[1][1]=4;
    int i,j;
    i=2;
    j=2;
    mostrar_matriz(i,j,B);
    system("pause");
    return 0;
}

Lo tengo asi puesto y al intentar compilar me sale esto
cannot convert int (*)[2]' toint' for argument 3' tovoid mostrar_matriz(int, int, int)'

1 respuesta
cabron

#7

Ponlo así: mostrar_matriz(i,j,(int**) B);

1 respuesta
B

#8 vaaaaale ahora si, que dios te lo pague con mucho sexo.

Entonces no hay manera de ponerlo como arrays? hay que hacerlo con punteros?

1 respuesta
cabron

#9

Los punteros son arrays, es lo mismo, solo cambia la sintaxis. No sé si lo puedes hacer con sintaxis de arrays, hace años que no toco C, es un milagro que todavía me acuerde...

1 respuesta
B

#10 joder es que lo veo y no se como funciona la verdad, como si lo hubiera hecho un mago xD.

#10 por ejemplo
(A+(icolumna)+j))
eso que cojones es lo que me hace? me apunta al dato que le paso desde B?o que?

1 respuesta
ankris14

#11 A ver, que te veo un poco perdido.
Primer tema, en C no puedes asignar el tamaño de arrays en tiempo de ejecución, para ello necesitas reservar memoria dinamicamente (con malloc por ejemplo).
Segundo, tienes que saber lo que pasas a la función. Los arrays se pasan por referencia, es decir, le pasas el puntero a la dirección en memoria en la que está el array, al contrario que con variables normales que se suelen pasar por valor (se crea una copia propia de la función y los cambios en esa copia no influyen en la variable original).

2 respuestas
B

#12 llevo desde que empece con C huyendo de los punteros y me va a tocar estudiarlos? inyustisia :(

1 respuesta
HeXaN

#13 Algo estás haciendo mal si estás huyendo de los punteros haciendo C.

1 respuesta
B

#14 realmente esq nunca me ha hecho falta, para lo que yo he usado C ha sido para calculo numerico y entonces pasaba de ellos bastante

lo que sigo sin ver es
(A+(icolumna)+j)
no veo donde esta apuntando ese puntero

2 respuestas
ankris14

#15 Apunta a la dirección de A, a cada iteración del bucle vas a mostrar la dirección de A+1, asi hasta que llegas al final de la memoria que se ha reservado para la matriz.

1 respuesta
cabron

#15

La clave está en visualizar el array tal y como se almacena en memoria.

Tu una matriz la ves así:
1 2 3
4 5 6
7 8 9

Pero eso es solo una visualización lógica, físicamente en memoria está todo seguido tal que así:

1 2 3 4 5 6 7 8 9

Un array es un puntero al primer elemento, eso grabatelo con fuego y que no se te olvide

Ahora bien, para mantener la lógica de que eso es una matriz, lo tienes que ver así:

1 2 3| 4 5 6 | 7 8 9

Es decir, cuando quieras moverte una fila, te tienes que saltar todas las columnas de la fila anterior, o lo que es lo mismo: dirección del primer elemento + (numero de fila * numero de columnas)

Y como un array es la dirección del primer elemento... te sale:

array + (i * columna)

Donde i es el número de fila dentro del bucle.

Ahora bien, si solo dejas eso, siempre te quedas en el primer elemento de cada fila, para ir moviéndote por cada columna, tienes que añadir el indice del segundo bucle, con lo que te queda:

array + (i * columna) + j

Y aquí es donde viene otro punto clave, como un array es un puntero, cuando te mueves a la siguiente posición, realmente no tienes el valor de la siguiente posición, si no que tienes la dirección de memoria del siguiente elemento. Para obtener el valor de esa direcciónde memoria tienes que usar el operador de indirección, que es '*', y de ahí te sale completo

*(array + (i * columna) + j)

1 2 respuestas
ferminx360

#17 #16 #12 Sois unos grandes!

B

#17 AAAAH vale vale, eso era lo que no veia, que todo se guardaba en una misma linea

Muchisimas gracias!!

B

jovenes me ha venido otra pregunta dandole vueltas a lo mismo.

Si yo ahora hago una funcion que el resultado anterior me lo vaya guardando en una matriz
A[j]=A(icolumna)+j (se que soy un cabezon pero seguir intentarlo ponerlo asi, pero se me ahce mucho mas facil xD)

Vale esa funcion, me construye la matriz sin problemas, pero ahora por ejemplo si yo hago otra funcion , a la que le paso los datos desde la funcion principal como me habeis dicho arriba(eso sin problema) luego una vez los tengo asi, llamo a la funcion nueva que he hecho que me los pone en forma de matriz A[j] y sigo trabajando dentro de la funcion haciendo lo que quiera. La cosa es que la matriz que creo ahi, evidentemente se me borra al llamarla y no puedo trabajar con ella. Hay alguna manera de que se quede fija?
Se me ha ocurrio ir asignandolo a una variable global, pero quedaria un poco cutre.

Creo que me explico como un libro llamas, lo siento xD

Usuarios habituales