SoloCodigo

Programación General => C/C++ => Visual C++ => Mensaje iniciado por: cremix en Jueves 21 de Mayo de 2009, 10:51

Título: Fallo en memoria
Publicado por: cremix en Jueves 21 de Mayo de 2009, 10:51
Hola:

Mi problema es el siguiente. Tengo dos clases: Red y Nodo. En la clase red hay un triple puntero:

"Red.cpp"

protected:
  Nodo*** capas;//Es una matriz de punteros del tipo objeto Nodo

Ahora, en la misma clase, declaro las siguientes funciones:

Nodo***  Red::getCapas()
{
          return capas;
}

Nodo* Red::getNodo(int capa, int nodo)
{
       return capas[capa][nodo];
}

Y si me voy al MAIN y realizo, por ejemplo, lo siguiente:

Red* red = new Red(...);//creo Red

red->getCapas[j][k]->print_atributoDeNodo();//j y k son unos valores cualesquiera. El print es una función de la clase Nodo

Me compila correctamente pero al ejecutar el programa se me interrumpe la ejecución diciéndome:

Excepción no controlada en 0x00411fa1 en NeuralNetwork.exe: 0xC0000005: Infracción de acceso al leer la ubicación 0xcdcdcddd. Con las opciones de Interrumpir o Continuar.

En Resultados me sale lo siguiente:

'NeuralNetwork.exe': se cargó 'C:Documents and SettingspracticaEscritorioIA2_RNNeuralNetworkDebugNeuralNetwork.exe', Símbolos cargados.
'NeuralNetwork.exe': se cargó 'C:WINDOWSsystem32ntdll.dll'
'NeuralNetwork.exe': se cargó 'C:WINDOWSsystem32kernel32.dll'
'NeuralNetwork.exe': se cargó 'C:WINDOWSWinSxSx86_Microsoft.VC90.DebugCRT_1fc8b3b9a1e18e3b_9.0.21022.8_x-ww_597c3456msvcp90d.dll', Símbolos cargados.
'NeuralNetwork.exe': se cargó 'C:WINDOWSWinSxSx86_Microsoft.VC90.DebugCRT_1fc8b3b9a1e18e3b_9.0.21022.8_x-ww_597c3456msvcr90d.dll', Símbolos cargados.
Primera excepción en 0x00411fa1 en NeuralNetwork.exe: 0xC0000005: Infracción de acceso al leer la ubicación 0xcdcdcddd.
Excepción no controlada en 0x00411fa1 en NeuralNetwork.exe: 0xC0000005: Infracción de acceso al leer la ubicación 0xcdcdcddd.


Y si me voy al código de la función print por ejemplo ésta:

                                         void Nodo::print_delta()
                                        {
       ====>                               cout << "Delta del nodo: " << delta << endl;
                                        }

Me aparece esa flecha en amarillo.

¿Alguien sabe que es lo qué pasa? Si creo un Nodo normal, llamar a sus funciones no es ningún problema. Pero crear las funciones de acceso a un objeto de tipo Red, usarlas y acceder a los Nodos es todo un problema.

Un saludo
Título: Re: Fallo en memoria
Publicado por: Amilius en Domingo 6 de Septiembre de 2009, 00:56
Pareciera que tienes un "wild pointer", un puntero que apunta a cualquier cosa. En otras palabras parece que no reservaste memoria para tu arreglo bidimensional de nodos, o no lo inicializaste para que apunte a la dirección de memoria correcta si tu objeto red no es el que crea dichos nodos. De hecho necesitas una llamada de constructor por nodo, otra por fila de nodos y otra por columna de punteros a fila de nodos.