• Viernes 8 de Noviembre de 2024, 22:59

Autor Tema:  una consulta sobre el siguiente programa  (Leído 1897 veces)

pacorubio77

  • Miembro MUY activo
  • ***
  • Mensajes: 207
    • Ver Perfil
una consulta sobre el siguiente programa
« en: Domingo 31 de Mayo de 2009, 02:07 »
0
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.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: una consulta sobre el siguiente programa
« Respuesta #1 en: Domingo 31 de Mayo de 2009, 09:22 »
0
stack overflow, no podes ocupar tantos bytes en la pila (20.160.400), no existen.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

pacorubio77

  • Miembro MUY activo
  • ***
  • Mensajes: 207
    • Ver Perfil
Re: una consulta sobre el siguiente programa
« Respuesta #2 en: Domingo 31 de Mayo de 2009, 11:02 »
0
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?

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: una consulta sobre el siguiente programa
« Respuesta #3 en: Domingo 31 de Mayo de 2009, 12:43 »
0
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.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

pacorubio77

  • Miembro MUY activo
  • ***
  • Mensajes: 207
    • Ver Perfil
Re: una consulta sobre el siguiente programa
« Respuesta #4 en: Domingo 31 de Mayo de 2009, 13:33 »
0
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?

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: una consulta sobre el siguiente programa
« Respuesta #5 en: Domingo 31 de Mayo de 2009, 13:38 »
0
Reservar:
TAfd *v = new TAfd[100];

Usar

Liberar:
delete[] v;

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

pacorubio77

  • Miembro MUY activo
  • ***
  • Mensajes: 207
    • Ver Perfil
Re: una consulta sobre el siguiente programa
« Respuesta #6 en: Domingo 31 de Mayo de 2009, 13:47 »
0
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.

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: una consulta sobre el siguiente programa
« Respuesta #7 en: Domingo 31 de Mayo de 2009, 14:31 »
0
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.

pacorubio77

  • Miembro MUY activo
  • ***
  • Mensajes: 207
    • Ver Perfil
Re: una consulta sobre el siguiente programa
« Respuesta #8 en: Domingo 31 de Mayo de 2009, 16:44 »
0
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?

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: una consulta sobre el siguiente programa
« Respuesta #9 en: Domingo 31 de Mayo de 2009, 17:24 »
0
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.  

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.