Foros del Web » Programación para mayores de 30 ;) » Programación General »

Urgentisimo - Violacion de Segmento - C++

Estas en el tema de Urgentisimo - Violacion de Segmento - C++ en el foro de Programación General en Foros del Web. Hola a todos, soy nuevo aki, y os cuento mi problema. Programo en C++ en Linux, y me aparece una violacion de segmento en un ...
  #1 (permalink)  
Antiguo 06/04/2005, 09:24
Avatar de fibergran  
Fecha de Ingreso: abril-2003
Ubicación: Jaén
Mensajes: 134
Antigüedad: 21 años, 7 meses
Puntos: 0
Urgentisimo - Violacion de Segmento - C++

Hola a todos, soy nuevo aki, y os cuento mi problema.
Programo en C++ en Linux, y me aparece una violacion de segmento en un bucle que esta bien implementado. Si alguien me puede ayudar gracias, aki adjunto los archivos que componen mi programa:

___________________________________________
Matriz_basico.h
___________________________________________

#ifndef matriz_basico
#define matriz_basico

struct Matriz {
int **m;
int filas;
int columnas;
};

void CrearMatriz (Matriz & m, int f, int c);
int FilasMatriz (const Matriz & m);
int ColumnasMatriz (const Matriz & m);
void SetMatriz (Matriz & m, int i, int j, int v);
int GetMatriz (const Matriz & m, int i, int j);
void DestruirMatriz (Matriz & m);

#endif

_________________________________________
Matriz_basico.cpp
_________________________________________

#include <iostream>
#include "matriz_basico.h"

void CrearMatriz (Matriz & m, int f, int c){
m.filas = f;
m.columnas = c;
m.m = new int *[f];
for (int i=0; i<f; i++)
m.m[i] = new int [c];
for (int i=0; i<f; i++)
for (int j=0; j<c; j++)
m.m[i][j] = 0;
}

int FilasMatriz (const Matriz & m){
return m.filas;
}

int ColumnasMatriz (const Matriz & m){
return m.columnas;
}

void SetMatriz (Matriz & m, int i, int j, int v){
m.m[i][j] = v;
}

int GetMatriz (const Matriz & m, int i, int j){
int valor=0;
valor = m.m [i][j];
return valor;
}

void DestruirMatriz (Matriz & m){
int f=0;
f = m.filas;
for (int i=0; i<f; i++)
delete m.m[i];
delete m.m;
}

____________________________________________
Matriz_adicional.h
____________________________________________

#ifndef matriz_adicional
#define matriz_adicional

void LeerMatriz (Matriz & m);
void EscribirMatriz (const Matriz & m);
int Maximo (const Matriz & m);
int Minimo (const Matriz & m);

#endif

_______________________________________________
Matriz_adicional.cpp
_______________________________________________

#include <iostream>
#include "matriz_basico.h"
#include "matriz_adicional.h"

using namespace std;

void LeerMatriz (Matriz & m){
int valor=0;
cout << "Introduzca los elementos de la matriz: " << endl;
for (int j=0; j<FilasMatriz (m); j++){
for (int h=0; h<ColumnasMatriz (m); h++){
cout << "Elemento " << j+1 << "," << h+1 << ":";
cin >> valor;
SetMatriz (m, j, h, valor);

}
}
cout<<"si sale";
}

void EscribirMatriz (const Matriz & m){
int temporal=0, filas=0, columnas=0;
filas = FilasMatriz (m);
columnas = ColumnasMatriz (m);
for (int i=0; i<filas; i++){
for (int j=0; j<columnas; j++){
temporal = GetMatriz (m, i, j);
cout << temporal << "\t";
}
cout << "\n";
}
}

int Maximo (const Matriz & m){
int maximo=0, temporal=0, filas=0, columnas=0;
filas = FilasMatriz (m);
columnas = ColumnasMatriz (m);
for (int i=0; i<filas; i++){
for (int j=0; j<columnas; j++){
temporal = GetMatriz (m, i, j);
if (temporal > maximo)
maximo = temporal;
}
}
return maximo;
}

int Minimo (const Matriz & m){
int minimo=0, temporal=0, filas=0, columnas=0;
filas = FilasMatriz (m);
columnas = ColumnasMatriz (m);
for (int i=0; i<filas; i++){
for (int j=0; j<columnas; j++){
temporal = GetMatriz (m, i, j);
if (temporal < minimo)
minimo = temporal;
}
}
return minimo;
}

_______________________________________________
magica.cpp
_______________________________________________

//este es el programa principal, voy a poner solo hasta donde falla

#include <iostream>
#include "matriz_basico.h"
#include "matriz_adicional.h"

using namespace std;

int main (){

Matriz magica;
int suma=0, mem=0, filas=0, columnas=0;
int *vector;
bool magica_bool=true;
cout << "Introduzca las dimensiones de la matriz: " << endl;
cin >> filas;
cin >> columnas;
CrearMatriz (magica, filas, columnas);
LeerMatriz (magica);

.
.
.
.
.
__________________
Visiten http://www.testsdetrafico.es
  #2 (permalink)  
Antiguo 06/04/2005, 11:16
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
Solo probe con dos dimensiones (2 y 2) en VC++ y funciono ... ¿Donde falla exactamente?
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #3 (permalink)  
Antiguo 07/04/2005, 03:38
Avatar de fibergran  
Fecha de Ingreso: abril-2003
Ubicación: Jaén
Mensajes: 134
Antigüedad: 21 años, 7 meses
Puntos: 0
a mi me falla siempre que la matriz es cuadrada, no da problemas con una de 2*3 por ejemplo o 3*2 pero si de 3*3
__________________
Visiten http://www.testsdetrafico.es
  #4 (permalink)  
Antiguo 07/04/2005, 14:11
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años, 7 meses
Puntos: 17
Ese código es basura en C++, como C está bien. Si es para practicar punteros, sigue con ello. Si no, bórralo, usa la STL. Aquí te he hecho muy rápidamente una plantilla matriz, con constructor y destructor, get y set para no liarte más. (Si la quieres dinámica, tampoco hay mucho problema).

Código:
#include <iostream>
#include <vector>

using namespace std;

template <class T>
class Matriz
{
public:
	Matriz(int filas, int columnas, T valor) : x(filas), y(columnas)
	{
		int i,j;
		vector<T> t;
		for(i=0;i<filas;i++)
		{
			m.push_back(t);
			for(j=0;j<columnas;j++)	m[i].push_back(valor);
		}
	}

	~Matriz()
	{
	}

	T Get(int fila, int columna)
	{
		return m[fila][columna];
	}

	void Set(int fila, int columna, T valor)
	{
		m[fila][columna]=valor;
	}

private:
	vector< vector<T> > m;
	int const  x,y;

};

int main()
{
	Matriz<int> m (3,3,0);
	m.Set(1,1,5);
	cout << m.Get(1,1) << endl;

    system("PAUSE");
    return EXIT_SUCCESS;
}


Compara tamaño, calidad y seguridad de ambas ;)

Última edición por MaxExtreme; 07/04/2005 a las 14:17
  #5 (permalink)  
Antiguo 07/04/2005, 14:40
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
Relajate un poco, me parece que no tenes derecho a decir que el codigo de otra persona es una basura y estoy seguro que no vas a caer nada simpatico.

Espero que no seas un adicto a la STL ...
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #6 (permalink)  
Antiguo 07/04/2005, 14:47
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años, 7 meses
Puntos: 17
Lee con calma mis post xDDDDDDDDD Digo que eso es código basura en C++... Yo no digo que programe mejor o peor, eso se aprende con le tiempo. Repito: si es para practicar punteros, es lo que debe hacer. Lógico que falle la primera vez. Pero si no, le _recomiendo_ que olvide esa manera de codear.
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 21:26.