Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: LML-32 en 26 Mayo 2016, 05:51 am



Título: ¿Por qué mi programa deja de funcionar?
Publicado por: LML-32 en 26 Mayo 2016, 05:51 am
Hola, espero que alguien pueda ayudarme. Estoy programando en C++, guardo una cadena de 25 caracteres y necesito desglosarla por partes, así que sustraje algunos caracteres en variables de tipo string, para luego almacenarlas en vectores (sé que lo puedo hacer sólo con cadenas, pero usarlos es requerimiento para mi práctica).
He estado compilando parte por parte y me di cuenta de que el problema ocurre cuando utilizo más de tres vectores, los primeros tres funcionan bien y corre el programa, pero al leer el cuarto deja de funcionar y no entiendo el por qué, no me marca ningún error ni advertencia.
¿Alguien sabe cómo corregirlo o qué estoy haciendo mal? :c

Mi programa está súper largo, pero este es uno corto que hice para intentar hallar el problema:
Citar
#include<iostream>
#include<conio.h>
#include<string.h>
using namespace std;
int main (void)
{
   string m,a,b,c1,c2,d1,d2,e,f;
   string lugar[4],dia[2],hora1[2],hora2[2],vgrados[3],vnudos[2],visib[2],nubes[3];
    cout<<"Teclea un metar (25 caracteres, sin espacios): ";
    cin>>m;
    a=m.substr(0,4);
    b=m.substr(4,2);
    c1=m.substr(6,2);
    c2=m.substr(8,2);
    d1=m.substr(11,3);
    d2=m.substr(14,2);
    e=m.substr(18,2);
    f=m.substr(22,3);
    lugar[4]=a;
    if(lugar[4]=="MMML")
    {
       cout<<"Mexicali";
   }
   else
   {
      if(lugar[4]=="MMTJ")
      {
         cout<<"Tijuana";
      }
   }
    dia[2]=b;
    cout<<"\nDia: "<<dia[2];
    hora1[2]=c1;
    cout<<" Hora: "<<hora1[2];
    hora2[2]=c2;
    cout<<":"<<hora2[2]<<" Zulu.";
    vgrados[3]=d1;
    cout<<vgrados[3];

}


Título: Re: ¿Por qué mi programa deja de funcionar?
Publicado por: AlbertoBSD en 26 Mayo 2016, 06:21 am
Posiblemente es un error de memoria, estas usando algun valor no inicializado o fuera de los limites establecidos.

Pero sin codigo no puedo decirte con exactitud cual es la falla.

Saludos.


Título: Re: ¿Por qué mi programa deja de funcionar?
Publicado por: LML-32 en 26 Mayo 2016, 06:26 am
Lo siento, ya agregué el código x)


Título: Re: ¿Por qué mi programa deja de funcionar?
Publicado por: AlbertoBSD en 26 Mayo 2016, 06:43 am
Creo que estas omitiendo la posicion del arreglo 0.

Si declaras algo como
Código
  1. string vgrados[3];

No puedes usar la posicion 3, solo la 0, la 1 y la 2 (Solo del 0 al 2) Que siguen siendo 3 posiciones.

Lo mismo para las otras variables....
Otra cosa si vas a usar iostream no necesitas stdio.h

Ya con el namespace es suficiente..

Saludos


Título: Re: ¿Por qué mi programa deja de funcionar?
Publicado por: LML-32 en 26 Mayo 2016, 06:53 am
Pero lo que está dentro de los corchetes es la cantidad de caracteres del vector, ¿no?
Funciona todo bien hasta la parte donde indico:
" vgrados[3]=d1;"


Título: Re: ¿Por qué mi programa deja de funcionar?
Publicado por: AlbertoBSD en 26 Mayo 2016, 06:55 am
Ademas veo que solo estas usando una cadena de cada arreglo.

No es necesario declarar

 
Código
  1. string variable[4];

Si solo vas a almacenar una cadena.

En dado caso solo declara

 
Código
  1. string variable;


Edito
No es asi, un string ya es un string no tienes que definirle la canitdad de caracteres.

Si por el contrario quieres usar char entonces si necesitas definir la cantidad.

Saludos!


Funciona todo bien hasta la parte donde indico:
" vgrados[3]=d1;"

Es lo que te comento lo que tu declarastes es un arreglo de cadenas y lo puedes tener 3 cadenas diferntes

Código
  1. vgrados[0] = "Cadena 1";
  2. vgrados[1] = "Cadena 2";
  3. vgrados[2] = "Cadena 3";

Si solo vas a usar una cadena solo declara

Código
  1. string vgrados;


Título: Re: ¿Por qué mi programa deja de funcionar?
Publicado por: LML-32 en 26 Mayo 2016, 07:08 am
Cambiando la forma de declararlo sí funciona, pero se supone que tengo que hacer arreglos de tipo vector...

¡Gracias de todos modos! :-)


Título: Re: ¿Por qué mi programa deja de funcionar?
Publicado por: AlbertoBSD en 26 Mayo 2016, 07:14 am
Tienes que hacerlo con char?

Código
  1. char m[25];


Título: Re: ¿Por qué mi programa deja de funcionar?
Publicado por: LML-32 en 26 Mayo 2016, 07:23 am
Creo que tengo que hacerlo con string, para extraer caracteres. Haz de cuenta que de un código así MMML181441Z32007KT10SMSKC tengo que separar parte por parte para que me diga el lugar, la fecha, etc.

Lo hice como en el código que dejaré abajo (y funciona), pero no sé cómo cambiarlo para usar un arreglo vector.
Código:
#include<iostream>
#include<conio.h>
#include<string.h>
using namespace std;
int main (void)
{
    string a;
    cout<<"Teclea un metar (25 caracteres, sin espacios): ";
    cin>>a;
   
    if(a.substr(0,4)=="MMML")
    {
        cout<<(a.substr(0,4))<<" Lugar- Aeropuerto Internacional de Mexicali";
    }
    else
    {
    if(a.substr(0,4)=="MMTJ")
    {
cout<<(a.substr(0,4))<<" Lugar- Aeropuerto Internacional de Tijuana";
}
else
{
cout<<"Aeropuerto desconocido";
}
}
   
   cout<<"\n"<<(a.substr(4,7))<<" Fecha y hora- Dia: "<<(a.substr(4,2))<<" Hora: "<<(a.substr(6,2))<<":"<<(a.substr(8,2))<<" Zulu.";
   cout<<"\n"<<(a.substr(11,7))<<" Viento- "<<(a.substr(11,3))<<" grados con "<<(a.substr(14,2))<<" nudos.";
   cout<<"\n"<<(a.substr(18,4))<<" Visibilidad- "<<(a.substr(18,2))<<" millas.";
   
    if(a.substr(22,3)=="SKC")
                            {
                            cout<<"\n"<<(a.substr(22,3))<<" Nubes- Sky clear, despejado.";
}
else
{
if(a.substr(22,3)=="SCT")
{
cout<<"\n"<<(a.substr(22,5))<<" Nubes- Scattered, dispersas.";
    }
    else
    {
    if(a.substr(22,3)=="OVC")
{
cout<<"\n"<<(a.substr(22,5))<<" Nubes- Overcast, cerrado.";
        }
        else
        {
        if(a.substr(22,3)=="TCU")
{
cout<<"\n"<<(a.substr(22,5))<<" Nubes- Towering cumulus.";
        }
        else
        {
        if(a.substr(22,3)=="FEW")
{
cout<<"\n"<<(a.substr(22,5))<<" Nubes- Few, escasas.";
        }
        else
        {
        if(a.substr(22,3)=="BKN")
{
cout<<"\n"<<(a.substr(22,5))<<" Nubes- Broken, fragmentadas.";
    }
    else
    {
    if(a.substr(22,3)=="0CB")
{
cout<<"\n"<<(a.substr(22,5))<<" Nubes- Cumulonimbus.";
    }
    else
    {
    cout<<"\n"<<(a.substr(22,3))<<" Nubes- No hay nubes.";
}
}
    }
    }
}
}
}


Título: Re: ¿Por qué mi programa deja de funcionar?
Publicado por: AlbertoBSD en 26 Mayo 2016, 07:30 am
A ver te dejo una version  :rolleyes: :rolleyes: Que involucra puros char...

Código
  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<string.h>
  4. using namespace std;
  5.  
  6. int main (void) {
  7. char m[25],a[5]="",b[3]="",c1[3]="",c2[3]="",d1[4]="",d2[3]="",e[5]="",f[4]="";
  8. cout<<"Teclea un metar (25 caracteres, sin espacios): ";
  9. cin>>m;
  10. memcpy(a,m,4);
  11. memcpy(b,m+4,2);
  12. memcpy(c1,m+6,2);
  13. memcpy(c2,m+8,2);
  14. memcpy(d1,m+11,3);
  15. memcpy(d2,m+14,2);
  16. memcpy(e,m+18,2);
  17. memcpy(f,m+22,3);
  18.  
  19. if(strcmp(a,"MMML") == 0)
  20. {
  21. cout<<"Mexicali";
  22. }
  23. else
  24. {
  25. if(strcmp(a,"MMTJ") == 0)
  26. {
  27. cout<<"Tijuana";
  28. }
  29. }
  30. cout<<"\nDia: "<<b;
  31. cout<<" Hora: "<<c1;
  32. cout<<":"<<c2<<" Zulu.";
  33. cout<<d1;
  34. }

Si lo que quieres es usar un arreglo de cadenas entonces...

Declara solo 2 variables

Código
  1. string m,arreglo[N];

Y cuando copies las cadenas al arreglo como ya lo haces usa:

Código
  1. arreglo[0] = m.substr(4,7);
  2. arreglo[1] = m.substr(6,2);
  3. // Asi sucesivamente
  4.  

El detalle es que todas las variables tendran el nombre de arrglo... lo cual no es muy sugerente de que contiene esa variable.

Saludos


Título: Re: ¿Por qué mi programa deja de funcionar?
Publicado por: LML-32 en 26 Mayo 2016, 07:48 am
Oh, ya veo, ya entendí lo que me decías del char y el string. Entonces lo cambiaré como en tu ejemplo, ¡muchas gracias! :D

EDITO: ¡Ya lo terminé y funciona! En serio te agradezco muchísimo  ;-) ;D