0
#include <stdlib.h>
#include <stdio.h>

#define FILAS 3
#define COLUMNAS 3

int matriz[FILAS][COLUMNAS];

int valor;

void valor_matriz(int matriz, int valor, int *z, int *x);

int main(int argc, char const *argv[])
{
    for (int fila = 0; fila < FILAS; fila++) //limpia matriz poniendo todo a cero 
    {
        for (int columna = 0; columna < COLUMNAS; columna++)
        {
            matriz[fila][columna] = 0;
        }
    }

    int *z = 0;
    int *x = 0;
    for (int columna = 0; columna < COLUMNAS; columna++) 
    {
        for (int fila = 0; fila < FILAS; fila++)
        {
            *z++;
            scanf("%d", &valor);
            valor_matriz(**matriz, valor, z, x);
        } 
        *x++;
    }

}

void valor_matriz(int matriz, int valor, int *z, int *x) //funcion que guarda valores de la matriz
{
    matriz[z][x] = valor;
}
 

El programa no me da error al compilar pero cuando se ejecuta la función valor_matriz, se cierra. Creo que puede ser por la matriz que cuando la igualo a valor, deja de ejecutarse el programa. También se que estoy utilizando mal los punteros pero tampoco se como hacerlo para que este bien y no me de error al compilar. Gracias por tu atención. :)

MrDave1999
  • 7,491
  • 1
  • 7
  • 22
Ivan Rey
  • 3
  • 1

1 Answers1

0

*z++ es igual a *z = *z + 1, como el puntero z apunta a 0, estás intentando acceder a una dirección que al programa no le pertenece (esto se lo denomina fallo de segmentación), esto trae como consecuencia, que el sistema operativo mate el proceso actual. Esa es la razón del porque el programa deja de ejecutarse.

Es más, los punteros x y z no hacen falta (y en este caso no le veo el sentido en usarlo). Con las variables columna y fila es suficiente.

Además, si definiste matriz como global, no hace falta tener un parámetro llamado matriz (y está mal como lo tienes, porque debería ser int matriz[][COLUMNAS]).

Entonces la función quedaría así:

void valor_matriz(int valor, int z, int x) 
{
    matriz[z][x] = valor;
}

El código completo queda así:

int main(int argc, char const *argv[])
{
    for (int fila = 0; fila < FILAS; fila++) //limpia matriz poniendo todo a cero 
    {
        for (int columna = 0; columna < COLUMNAS; columna++)
        {
            matriz[fila][columna] = 0;
        }
    }

    for (int columna = 0; columna < COLUMNAS; columna++) 
    {
        for (int fila = 0; fila < FILAS; fila++)
        {
            scanf("%d", &valor);
            valor_matriz(valor, fila, columna);
        } 
    }

}

void valor_matriz(int valor, int z, int x) 
{
    matriz[z][x] = valor;
}

Ahora, no deberías usar variables globales (para más información, mira este hilo) en este caso, no hace falta.

Así queda sin el uso de variables globales:

#define FILAS 3
#define COLUMNAS 3

void valor_matriz(int matriz[][COLUMNAS], int valor ,int z, int x);

int main(int argc, char const *argv[])
{
    int matriz[FILAS][COLUMNAS];
    int valor; //Ahora es declarado como una variable local.
    for (int fila = 0; fila < FILAS; fila++) //limpia matriz poniendo todo a cero 
    {
        for (int columna = 0; columna < COLUMNAS; columna++)
        {
            matriz[fila][columna] = 0;
        }
    }

    for (int columna = 0; columna < COLUMNAS; columna++) 
    {
        for (int fila = 0; fila < FILAS; fila++)
        {
            scanf("%d", &valor);
            valor_matriz(matriz, valor, fila, columna);
        } 
    }

}

void valor_matriz(int matriz[][COLUMNAS], int valor, int z, int x) 
{
    matriz[z][x] = valor;
}

Algunas observaciones:

1.- Cuando declaras funciones, no hace falta especificar el nombre de cada parámetro.

Ejemplo:

void valor_matriz(int [][COLUMNAS], int, int, int);

2.- Según el estándar, la función main debe retornar un valor.

3.- La función valor_matriz es innecesaria. Puedes usar directamente el código matriz[fila][columna] = valor.

MrDave1999
  • 7,491
  • 1
  • 7
  • 22