Segmentation fault (core dumped)

Estoy trabajando con makefiles,al compilar el siguiente codigo la opción de random trabaja perfectamente, pero en la opción de introducir la matriz mediante el teclado sale esto Segmentation fault (core dumped), podrían decirme por qué sale esto o que esta mal en el codigo, porfavor.

El error se origina después de ingresar la matriz (user(b, N, P);). Creo que el error está en la función printm(b, N, P);.

function.h

#ifndef function_H
#define function_H

int user(int **m, int N, int P);
void printm(int **m, int N, int P);
int generator(int **m, int N, int P);
void lmax(int **m, int N, int P);

#endif

function.cc

#include
#include
#include
#include “function.h”

using namespace std;

int user(int **m, int N, int P)
{
for (int i=0; i> m[i][j];
}
}
return 0;
}

void printm(int **m, int N, int P)
{
int i;
for (i=0; i
#include
#include “function.h”

using namespace std;

int main()
{
int N, P, **a, **b;
char ch;

cout << "\n 1 - Initialize matrix by using a random number generator." << endl; cout << " 2 - Initialize matrix via user input." << endl; cout << " 0 - Exit." << endl; cout << "\n Your choice: "; do { ch = getchar(); switch(ch) { case '1': cout << "\n Rows: "; cin >> N;
cout << " Columns: "; cin >> P; cout << endl; a = new int *[N]; for (int i=0; i> N;
cout << " Columns: "; cin >> P; cout << endl; b = new int *[N]; for (int i=0; i> m[i][j];
}
}

return 0;
}

void printm(int **m, int N, int P)
{
int i;
for (i=0; i> m[i][j];
}
return 0;
}
}

int generator(int **m, int N, int P)
{
srand(time(NULL));
for (int i=0; i func)
{
for( int i=0; i> dato;
}

void RellenarAleatoriamente(int& dato, int fila, int columna)
{
static bool init = false;

if( !init )
{
init = true;
srand(time(NULL));
}

dato = rand()%50;
}

// …
case 1:
{
int filas, columnas;
std::cout << "\n Rows: "; std::cin >> filas;
std::cout << " Columns: "; std::cin >> columnas;

Matrix matriz = NuevaMatriz(filas,columnas);
MatrixLoop(matriz, RellenarAleatoriamente);
// …
BorrarMatriz(matriz);

break;
}

case 2:
{
int filas, columnas;
std::cout << "\n Rows: "; std::cin >> filas;
std::cout << " Columns: "; std::cin >> columnas;

Matrix matriz = NuevaMatriz(filas,columnas);
MatrixLoop(matriz, RellenarPorUsuario);
// …
BorrarMatriz(matriz);

break;
}

También se pueden usar lambdas para conseguir un código más legible:

void MatrixLoop(Matrix& matriz, std::function func)
{
for( int i=0; i lambda = [](int& dato, int fila, int columna )
{
std::cout << "Valor para (" << fila << "," << columna << "): "; std::cin >> dato;
};

MatrixLoop(matriz,lambda);
}

void RellenarAleatoriamente(Matrix& matriz)
{
std::function lambda = [](int& dato, int, int)
{
dato = rand()%50;
};

srand(time(NULL));
MatrixLoop(matriz,lambda);
}

// …
case 1:
{
int filas, columnas;
std::cout << "\n Rows: "; std::cin >> filas;
std::cout << " Columns: "; std::cin >> columnas;

Matrix matriz = NuevaMatriz(filas,columnas);
RellenarAleatoriamente(matriz);
// …
break;
}

case 2:
{
int filas, columnas;
std::cout << "\n Rows: "; std::cin >> filas;
std::cout << " Columns: "; std::cin >> columnas;

Matrix matriz = NuevaMatriz(filas,columnas);
RellenarPorUsuario(matriz);
// …

break;
}

Y bueno, ya solo faltaría imprimir la matriz:

void Imprimir(Matrix const& matriz)
{
auto lambda = [](int& dato, int, int columna)
{
if( columna == 0 )
std::cout << '\n'; else std::cout << ' '; std::cout << dato; } LoopMatrix(matriz, lambda); } Otra opción, con un código más sencillo y modesto pero también más rígido, podría ser que disponer de una única función RellenarMatriz que reciba un bool (o incluso un enum si quieres ser más flexible). En función del valor de esa variable tomará una entrada de datos u otra: void RellenarMatriz(Matrix & matriz, bool esRandom) { srand(time(NULL)); for( int i=0; i> matriz[i][j];
}
}
}
}

De una forma similar podrías actuar ante la entrada de los valores fila y columna, eso ya te lo dejo a ti para practicar si te ves con energías.

Del segmentation fault que mencionas no veo ni rastro, pero también es cierto que falta la implementación de lmax…

Un saludo.

  

 

Muchas gracias por tu ayuda, pero exactamente, un requisito de mi práctica es usar memoria dinámica y sin estructura
– Neon
el 25 may. a las 16:12

  

 

Lo que te he explicado se puede hacer igual sin estructuras
– eferion
el 25 may. a las 16:51