SoloCodigo

Programación General => C/C++ => Mensaje iniciado por: pacorubio77 en Domingo 31 de Mayo de 2009, 02:07

Título: una consulta sobre el siguiente programa
Publicado por: pacorubio77 en Domingo 31 de Mayo de 2009, 02:07
Hola,queria preguntarle si sabia la causa del siguiente "Fallo de segmentacion",ya que no entiendo el porque y llevo días,buscando la causa.

si yo tengo el siguiente programa:

#include<iostream>
#include<fstream>
#include<string>


const int Ksimbol=5;
const int Kmax=100;
struct TNodo{
   int est;
   int Matriz[Ksimbol][Kmax];
   char sim[Ksimbol];

};

struct TAfd{

   int estado;
   int vestados[Kmax];
   TNodo v1[Kmax];
   
};

//TAfd v[100];

using namespace std;


int main(int argc,char *argv[]){

//Talumno v[1000];
   TAfd v[100];
   cout<<argv[1]<<endl;
   


}

//Mi pregunta es porque ahora declarándome TAfd v[100] como local, me da un fallo de segmentación,pero esa misma variable declarándomela como global, no me da error,le he puesto ese programa ,para simplificar mi duda, ya que mi programa es mucho más extenso,pero es el caso,pero minimizado.

¿Me puede decir la causa de que por una parte me da fallo de segmentacion y por otra parte no?

Mi version de compilador es la 4.1.2 y tengo instalado el valdring(que creo que es el que me detecta el fallo),ya que en un compilador como un 3.1.6 no detecta el siguiente fallo,siempre en c++;



Un saludo,espero respuesta.
Gracias.
Título: Re: una consulta sobre el siguiente programa
Publicado por: Eternal Idol en Domingo 31 de Mayo de 2009, 09:22
stack overflow, no podes ocupar tantos bytes en la pila (20.160.400), no existen.
Título: Re: una consulta sobre el siguiente programa
Publicado por: pacorubio77 en Domingo 31 de Mayo de 2009, 11:02
que quiere decir que no puedo ocupar tantos bytes en la pila (20,40,...), ? y como variable global si?, es que a mi me prohiben utilizar variables globales que no sean constantes...me ponen directamente un 0, y como variable global no me da error,pero si como local, me podría ayudar y decir como utilizarla? además de explicarme lo de la pila?
Título: Re: una consulta sobre el siguiente programa
Publicado por: Eternal Idol en Domingo 31 de Mayo de 2009, 12:43
La pila es muy chica y tu codigo ocupa unos 20 MILLONES de bytes, una variable global no va en la pila y no tiene ese problema. Usa memoria dinamica y listo.
Título: Re: una consulta sobre el siguiente programa
Publicado por: pacorubio77 en Domingo 31 de Mayo de 2009, 13:33
lo que me dice usted es que TAfd v[100], lo haga dinámico?, como expreso eso? para hacerlo dinámico? me puede decir la definicion para hacerlo dinámico?
Título: Re: una consulta sobre el siguiente programa
Publicado por: Eternal Idol en Domingo 31 de Mayo de 2009, 13:38
Reservar:
TAfd *v = new TAfd[100];

Usar

Liberar:
delete[] v;
Título: Re: una consulta sobre el siguiente programa
Publicado por: pacorubio77 en Domingo 31 de Mayo de 2009, 13:47
Cita de: "Eternal Idol"
Reservar:
TAfd *v = new TAfd[100];

Usar

Liberar:
delete[] v;


El objetivo de utilizar memoria dinámica es porque las posiciones de v que no se ocupan se pueden borrar?, la asignacion y todol o demás es idéntico que con los vectores estáticos?

Otra pregunta, ahora estoy reservando 100 posiciones para un TAfd, pero las que no se usan, tengo que hacer delete? porque si lo que queremos es sólo utilizar la memoria que usamos y la que no usamos eliminarla, tendría que hacer delete en lo que no uso?

Y una ultima pregunta, si yo antes, TAfd v[100], era una parametro de una funcion...por ejemplo
void MiFuncion(v), cuyo prototipo es void MiFunciion(TAfd v[]) ,ahora como lo meto como parámetro? tengo que cambiar la notacion ?cual sería la correcta?

Un saludo,espero respuesta.
Gracias.
Título: Re: una consulta sobre el siguiente programa
Publicado por: m0skit0 en Domingo 31 de Mayo de 2009, 14:31
Cita de: "pacorubio77"
El objetivo de utilizar memoria dinámica es porque las posiciones de v que no se ocupan se pueden borrar?, la asignacion y todol o demás es idéntico que con los vectores estáticos?
No, las variables locales se reservan en la pila, la asignación de memoria se reserva del montículo (heap).

Cita de: "pacorubio77"
ahora estoy reservando 100 posiciones para un TAfd, pero las que no se usan, tengo que hacer delete?
Si la reservas en lo mismo que usarla y por tanto debes hacer delete. Si no las usas, no las reserves y asi optimizas tu programa.

Cita de: "pacorubio77"
ahora como lo meto como parámetro? tengo que cambiar la notacion ?cual sería la correcta?
No hay diferencia con antes.
Título: Re: una consulta sobre el siguiente programa
Publicado por: pacorubio77 en Domingo 31 de Mayo de 2009, 16:44
Es decir despues de utilizarlo debo de hacer delete []v?, para borrar el vector? o tengo que hacer

Código: C++
  1.  
  2. for(int i=0;i<100;i++){
  3. delete[i]v
  4. }
  5.  
?? porque estó es para liberar memoria..verdad?
Título: Re: una consulta sobre el siguiente programa
Publicado por: Eternal Idol en Domingo 31 de Mayo de 2009, 17:24
Cita de: "pacorubio77"
Es decir despues de utilizarlo debo de hacer delete []v?, para borrar el vector? o tengo que hacer

Si, tal y como figura en el que codigo de ejemplo que te di:
Código: Text
  1. delete[] v;
  2.