Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Arreglos en C++

Estas en el tema de Arreglos en C++ en el foro de C/C++ en Foros del Web. Probablemente se que puedan estar cansados de dudas como estas, la verdad soy autodidacta y no se me es algo muy facil estas cosas, tengo ...
  #1 (permalink)  
Antiguo 24/01/2012, 22:37
 
Fecha de Ingreso: enero-2012
Mensajes: 1
Antigüedad: 12 años, 3 meses
Puntos: 0
Arreglos en C++

Probablemente se que puedan estar cansados de dudas como estas, la verdad soy autodidacta y no se me es algo muy facil estas cosas, tengo la duda, he programado en windevc++ y me ha permitido correr el codigo (no es todo, ya que quiero corregir el error pero no lo encuentro), ahorita estoy corriendo en Mac OS X,

Código PHP:
#include <iostream>

using namespace std;

typedef double** matriz;

void rellena_matriz(int nmatriz M)
{
    for (
int i 0ni++) 
    {
        for (
int j 0nj++) 
        {
            
cout<<"Ingresa el elemento a_"<<i+1<<j+1<<" = ";
            
cin>>M[i][j];
        }
    }
}

void crear_matriz(int nmatriz M)
{
    
= new double* [n];
    for (
int i 0ni++) 
    {
        
M[i]=new double [n];
    }
}

int main() 
{
    
matriz M=0;
    
cout<<"Ingresa el tamaño de la matriz: ";
    
int n;
    
cin>>n;
    
crear_matriz(nM);
    
rellena_matriz(nM);        

y al compilar me sale este error

Run Command: line 1: 3329 Segmentation fault ./"$2" "${@:3}"

Asumo yo es por que se esta pidiendo espacio inexistente en el nucleo, la verdad no tengo idea. Espero me puedan ayudar y muchas gracias.
  #2 (permalink)  
Antiguo 25/01/2012, 03:04
 
Fecha de Ingreso: junio-2010
Ubicación: Madrid
Mensajes: 620
Antigüedad: 13 años, 10 meses
Puntos: 73
Respuesta: Arreglos en C++

En primer lugar, en la función main() estás asignando un valor 0 a una variable que es un puntero. En C/C++ los punteros se inicializan a valor NULL, este es un valor que la máquina reconoce como dirección no válida (un puntero es una dirección de memoria), y puede que este valor coincida con cero o puede qaue no, depende de la implementación.

El fallo se genera en la función crea_matriz. A esta función le pasas como parámetro el tamaño de la matriz que deseas (correcto) y la matriz en la que quieres guardar los datos. Aquí está el origen del error. Pasas como parámetro un puntero (que, en principio, vale NULL).Dentro de la función, modificas este puntero al crear la matriz. Lo que has hecho, en realidad, es modificar una copia de ese puntero, con lo que la modificación la pierdes al salir de la función. Cuando vuelve a main() para llamar a la función rellena_matriz, la matriz que estás pasando en realidad es el puntero nulo que ya tenías, lo que te provoca el error: Estás intentando acceder a una zona de memoria a través de un puntero nulo. Los errores Segmentation fault (o Violation Access en otros compiladores) están casi siempre relacionados con mal uso de punteros.

Prueba con esto:
Código C++:
Ver original
  1. int main()
  2. {
  3.     matriz M = NULL;
  4.  
  5.     cout<<"Ingresa el tamaño de la matriz: ";
  6.     int n;
  7.     cin>>n;
  8.    
  9.     M = crear_matriz(n);
  10.  
  11.     rellena_matriz(n, M);
  12. }
  13.  
  14. matriz crear_matriz(int n)
  15. {
  16.     matriz M;
  17.  
  18.     M = new double* [n];
  19.     for (int i=0; i<n; i++)
  20.         M[i] = new double [n];
  21.  
  22.     return M;
  23. }

Además, dado que reservas memoria de manera dinámica, deberás liberar esa memoria cuando ya no la necesites. Conviene que crees también una función para eliminar una matriz, y elimines las matrices que generes conforme ya no las necesites.

Saludos,

Etiquetas: arreglos, c++, matrices
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:00.