¿Por qué mi programa deja de funcionar?

Iniciado por LML-32, 26 Mayo 2016, 05:51 AM

0 Miembros y 2 Visitantes están viendo este tema.

LML-32

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];

}

AlbertoBSD

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.
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

LML-32


AlbertoBSD

Creo que estas omitiendo la posicion del arreglo 0.

Si declaras algo como
Código (cpp) [Seleccionar]
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
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

LML-32

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;"

AlbertoBSD

#5
Ademas veo que solo estas usando una cadena de cada arreglo.

No es necesario declarar

string variable[4];

Si solo vas a almacenar una cadena.

En dado caso solo declara

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!



Cita de: LML-32 en 26 Mayo 2016, 06:53 AM
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

vgrados[0] = "Cadena 1";
vgrados[1] = "Cadena 2";
vgrados[2] = "Cadena 3";


Si solo vas a usar una cadena solo declara

string vgrados;
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

LML-32

Cambiando la forma de declararlo sí funciona, pero se supone que tengo que hacer arreglos de tipo vector...

¡Gracias de todos modos! :-)

AlbertoBSD

Tienes que hacerlo con char?

char m[25];
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

LML-32

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.

#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.";
}
}
    }
    }
}
}
}

AlbertoBSD

A ver te dejo una version  :rolleyes: :rolleyes: Que involucra puros char...

#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;

int main (void) {
char m[25],a[5]="",b[3]="",c1[3]="",c2[3]="",d1[4]="",d2[3]="",e[5]="",f[4]="";
cout<<"Teclea un metar (25 caracteres, sin espacios): ";
cin>>m;
memcpy(a,m,4);
memcpy(b,m+4,2);
memcpy(c1,m+6,2);
memcpy(c2,m+8,2);
memcpy(d1,m+11,3);
memcpy(d2,m+14,2);
memcpy(e,m+18,2);
memcpy(f,m+22,3);

if(strcmp(a,"MMML") == 0)
{
cout<<"Mexicali";
}
else
{
if(strcmp(a,"MMTJ") == 0)
{
cout<<"Tijuana";
}
}
cout<<"\nDia: "<<b;
cout<<" Hora: "<<c1;
cout<<":"<<c2<<" Zulu.";
cout<<d1;
}


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

Declara solo 2 variables

string m,arreglo[N];

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

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


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

Saludos
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW