Dev - C++ - Ayuda, programa compila pero no corre C++

 
Vista:
sin imagen de perfil

Ayuda, programa compila pero no corre C++

Publicado por Matias (5 intervenciones) el 15/02/2015 23:16:52
Hola, buenos días. Estoy con problemas en un programa que estoy haciendo, al parecer compila bien pero cuando ejecuto el programa, se cierra en la parte de selección. Poniendo unos breakpoints, noto que al principio se queda el programa (tipeando cualquiera de las selecciones). Es muy largo para subirlo todo, no pretendo que lo lean, pero quizás tenga algún error que no vea en la primera parte. Acá les dejo el comienzo del programa. Estoy en Windows Vista.

Solo el main y las declaraciones subo, si está todo bien esto voy subiendo de a poco, ya que son 500 líneas.
Muchas gracias por su tiempo.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#include <iostream>
#include "torneo.h" //algunas funciones preestablecidas 
#include <cstdlib>
#include <math.h>
#include <string.h>
#include <time.h>
#define BUFFER_SIZE 1024
using namespace std;
 
typedef struct{ //acá entran  los datos del archivo
    short indice;
	char nombre[31];
	int paramA;
	int paramB;
} Equipo; //para el array que va a tener cada partido
typedef struct{
    char equipo[31];
    int resultado;
    int paramA;
    int paramB;
    int puntos;
}tipopartido;
typedef struct{ // local y visitante tienen almacenado un array tipopartido por fecha
    tipopartido local[99];
    tipopartido visitante[99];
    }partidosfixture;
typedef struct{ // Para mostrar la tabla de posiciones uso otro array en vez de la lista, es más fácil de ordenar
    int puntos;
    char nombre[31];
}posiciones;
typedef struct{ //nodo de información de la lista
    int fecha;
    partidosfixture tabla[99];
    bool fuesimulado;
}info;
 
typedef struct tipofixture{ // la lista del fixture
info infofixture;
tipofixture *siguiente;
 }tipofixture;
 
void GenerarFixture(Equipo vectorequipos[], tipofixture *fixture, int &fechastotales, int &PartidosPorFecha, int &totalequipos);
void VerEquipo(Equipo vectorequipos);
void VerTabla();
void GuardarFixture();
void CargarFixture();
void LlenarVector(Equipo vectorequipos[], int &i);
void crearlista(tipofixture *fixture);
void ponerenlista (tipofixture *fixture, Equipo vectorequipos[], int &local, int &visitante, int i);
void buscarlocal (tipofixture *fixture, Equipo vectorequipos[], int local, int visitante, int i, int &a);
void buscarvisitante(tipofixture *fixture, Equipo vectorequipos[], int visitante, int i, int &a);
void menusimularpartido (tipofixture *fixture, tipofixture *listanueva, int fechastotales,  int &PartidosPorFecha, posiciones vectortabla[],int &tamanio);
void comprobarsimulacion (tipofixture *fixture, int fechasimular, int fechastotales, int &PartidosPorFecha, posiciones vectortabla[], tipofixture *listanueva,int &tamanio);
bool recorrerlista(tipofixture *fixture, int fechasimular);
void simularfecha(tipofixture *fixture, tipofixture *listanueva, int fechasimular, int &PartidosPorFecha, posiciones vectortabla[], int &tamanio);
void vaciarlista (tipofixture *listaux);
void MostrarEquipo (tipofixture *fixture,int PartidosPorFecha, int fechastotales);
void Aleatoriafecha (int l, int fechastotales, tipofixture *fixture);
bool FechaEncontrada (int vec[], int fechastotales, int x);
void OrdenarLista(tipofixture *listanueva);
void ReinsertarEnLista (tipofixture *listanueva, tipofixture *ptr);
void MostrarTabla (tipofixture *listanueva, int m, int totalequipos, Equipo vectorequipos[]);
void acumularpuntaje (posiciones vec[],tipofixture *listanueva,int totalequipos);
void ordenarpuntaje(posiciones vec[], int totalequipos);
 
int main() {
    int totalequipos= 0;
    posiciones vectortabla[99];
    tipofixture *fixture;
    tipofixture *listanueva = NULL;
	int fechastotales=0;
    int v=0;
	int a;
	int PartidosPorFecha;
	Equipo vectorequipos[99];
	int tamanio= 0;
 
	while (a!= 7) {
		cout<<"FIXTURE 2014"<<endl;
		cout<<"Ingrese un número"<<endl;
		cout<<"1. Generar Fixture"<<endl;
		cout<<"2. Simular Partidos"<<endl;
		cout<<"3. Ver Equipo"<<endl;
		cout<<"4. Ver Tabla de Posiciones"<<endl;
		cout<<"5. Guardar Fixture"<<endl;
		cout<<"6. Cargar Fixture"<<endl;
		if (v==0){
		cout<<"7. Salir"<<endl;
		}
		cin>>a;
		v++;
		int localA, localB, visitanteA, visitanteB, golesLocal, golesVisitante;
        if(a=1){ //con el switch explotaba, no sé porqué
            GenerarFixture(vectorequipos, fixture, fechastotales, PartidosPorFecha,totalequipos);
            listanueva = fixture;
            OrdenarLista(listanueva);
            cout<<"Su fixture se ha generado con éxito"<<endl;
        }
	    else if (a=2){
                menusimularpartido (fixture,listanueva, fechastotales,PartidosPorFecha,vectortabla,tamanio);
	    } else if (a=4){
	            cout<<"ingrese una fecha, de querer ver la tabla hasta la ultima fecha simulada ingrese 0"<<endl;
	            int m;
	            cin>>m;
	            if(recorrerlista(listanueva,m)){
                    cout<<"No se simularon partidos hasta esa fecha";
	            }else if(m=0) { cout<<"No existe una fecha 0!";}
	            else MostrarTabla (listanueva,m,totalequipos,vectorequipos);
 
 
 
	    } else if (a=3){
 
                MostrarEquipo(listanueva,PartidosPorFecha,fechastotales);
 
	    }else if(a=5){
	        FILE *archivo = fopen ("equipos.txt", "w");
	        for(int k=1;k<=totalequipos/2;k++){
                    int f=0;
 
                    fwrite((const void*)& f,sizeof(int)*1,1,archivo);
                    fwrite((const void*) & listanueva->infofixture.tabla[f].local[f].paramA,sizeof(int)*1,1,archivo);
                    fwrite((const void*) & listanueva->infofixture.tabla[f].local[f].paramB,sizeof(int)*1,1,archivo);
                    fwrite(listanueva->infofixture.tabla[f].local[f].equipo,sizeof(char)*31,1,archivo);
                    fwrite(listanueva->infofixture.tabla[f].visitante[f].equipo,sizeof(char)*31,1,archivo);
 
                    f++;
                }
                cout<<"Guardado con éxito";
                fclose(archivo);
 
	    } else if (a=6){
           vaciarlista(fixture);
           vaciarlista(listanueva);
           GenerarFixture(vectorequipos,fixture,fechastotales,PartidosPorFecha,totalequipos);
            cout<<"Se ha cargado y generado un nuevo fixture!";
		};
 
 
 
	};
	if(a=7)
        vaciarlista(fixture);
        vaciarlista(listanueva);
 
}

No sé que puede ser, quizá sea una sobrecarga del procesador, quizá definí mal alguna lista, no sé.
Es un trabajo en el que tengo que crear un fixture a partir de un archivo, de necesitarse más detalles de lo que tengo que hacer los paso sin tardanza.

Espero me puedan ayudar! Gracias de nuevo!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de vangodp
Val: 73
Ha disminuido 1 puesto en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Ayuda, programa compila pero no corre C++

Publicado por vangodp (287 intervenciones) el 16/02/2015 07:01:25
son muchas lineas. subelo a
1
http://codepad.org/
. Si lo intento copiar y pegar en mi compilador eso sale todo en la misma linea y es un follón arreglar.

Si tienes mas de un archivo como has dicho pega todo junto, poniendo el nombre del archivo y la extencion como comentario antes.

//main.cpp
#include<stdio.h>
#.....

O si te fías bien el foro permite subir archivitos comprimidos.
;)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve
Val: 45
Ha disminuido su posición en 6 puestos en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Ayuda, programa compila pero no corre C++

Publicado por xve (68 intervenciones) el 16/02/2015 12:57:12
Hola Vangodp, a mi también me pasaba... que copiaba el código y me lo ponía todo en una linea... y era porque utilizaba Firefox... si utilizas por ejemplo chrome, opera o safari, esto ya no te pasa.

De igual manera, si haces clic en un archivo comprimido con rar, firefox te lo abre... y el resto de navegadores te lo pone para descargar...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Ayuda, programa compila pero no corre C++

Publicado por Matias (5 intervenciones) el 16/02/2015 20:28:37
Bueno, te dejo el comprimido.
No quería subir todo porque es muy largo y no van a querer leerlo todo, mucha molestia ;
pero bueno, si todavía sigues con intenciones de ayudarme, aquí está:
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de vangodp
Val: 73
Ha disminuido 1 puesto en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Ayuda, programa compila pero no corre C++

Publicado por vangodp (287 intervenciones) el 16/02/2015 23:56:26
hay varios archivos compañero de nombre igual. ¿Me podría decir cuales son los que compilas?

Pero a a estoy usando ese que pones que se llama Trabajo.cpp y el de cabecera torneo.h que esta dentro de la carpeta src.

Te cuento que no tengo visual studio así que tengo que generar un archivo en codeblocks.

De entrada veo que cometes errores tontos como por ejemplo if(a=2) ???? No será if (a==2)...???

es que a=2 es una asignación, si a if le pongo un a=2 va entrar en ese menú si o si ya que 2 es positivo y si lo meto ese 2 en a es justo lo que espera if, "un true" XD.

Si hago a == 2 entonces si es una comparación.

si tengo un menú que tengo que elegir una opción y esa opción es a = unNumero, lo mas seguro que tu quieras es hacer una comparación y no una asignación. Eso seria un disparate XD. Probablemente por eso te "Explota el switch" como dices en un comentario. XDD

Si me facilitas saber cuales son los archivos correctos podremos hacerlo más rápido.

Seguiré investigando y aguardo respuesta ;)

Suerte
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de vangodp
Val: 73
Ha disminuido 1 puesto en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Ayuda, programa compila pero no corre C++

Publicado por vangodp (287 intervenciones) el 17/02/2015 02:55:26
Bueno... He descubierto más cosillas. Madre mía, te falla la lógica un montón, te explico: Para depurar ese programa hay que hacer linea a linea.

Voy opción por opción en el menú de selección, ahora estoy aun en el primer que es "1. Generar Fixture". Al elegir esta opción vamos al primer if de main, el que pone el comentario "//con el switch explotaba, no sé porqué". Después de haberle arreglado el problema que comente antes "a=1 por a==1" ya podemos entrar en el. Ese if llama a la función GenerarFixture(), que a su ves llama a LlenarVector ()... De ahí no he pasado, entonces entre a investigar un poco.

En la función LlenarVector () hay un bucle while que, a su ves usa como parámetro a la función leerEquipo(), esa ultima recibe 4 parámetros, FILE *archivo, char nombre[31], int &paramA, int &paramB. Se supone que esa función se encarga de leer una linea de del archivo "equipos.txt" (o así creo que funciona), a cada loop del bucle while que comente.

Te diré que la linea de código que se ocupa de leer el archivo que es fscanf ( archivo, "%d %d %d", &i, &paramA, &paramB ); no esta funcionando como tu crees. El error creo que esta relacionado al tipo de fichero que es de texto plano.

Cuando intentas guardar un entero en un archivo de texto plano lo que haces es pasa de eso 9212123 a eso "9212123" ¡Si una cadena de caracteres! El error esta que intentas leer enteros cuando son caracteres en realidad. los parámetros de fscanf "%d %d %d", &i, &paramA, &paramB intenta leer 3 enteros pero "todos son cadenas de caracteres".

Puedes poner un cout luego después de la linea fscanf dentro de la función leer equipo y veras que te imprimen cosas raras y no los numeros que cres que esta tomando del archivo:

cout << "Parametros: " << "i:" << i << ", paramA: " << paramA << ", paramB: " << paramB << endl;
cin.ignore();
cin.ignore();

La solución al problema seria leer todo como chars y convertirlos, o usar archivos binarios. Espero tu respuesta a ver que opinas si crees que me equivoco o lo que sea.

¿Como es que has llegado tan lejos sin ir probando esas cosas? En fin..

Hasta luego
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Ayuda, programa compila pero no corre C++

Publicado por Matias (5 intervenciones) el 17/02/2015 10:27:25
Muchísimas gracias por tomarte tu tiempo y leer todo para ayudarme, lo aprecio mucho.
Es el archivo trabajo.cpp, en el pdf eestán los objetivos del trabajo, y el archivo de texto equipos.txt es el original dado para empezar. Ignora el torneo.Cpp porque lo metí en mi trabajo, la librería es de utilidad (torneo.h).
Lo de los if se me había pasado, por eso no podía pasar del primer bucle, mala mía , ahora puedo hacer la depuración línea a línea.
Ahora, la función leerEquipo, junto a generarPartido y simularPartido las dio el profesor, no pueden estar mal ya que ya hay varios estudiantes que lo hicieron con eso y les funcionó correctamente, es prácticamente imposible que sea ese el motivo por el que el programa no corra.
Me pondré a revisar si hay más errores tontos como ese, suelo cometer errores de distraído como allí se nota jaja.


PD: hice todo con la imposibilidad de compilar (larga historia), y cuando empecé con el compilador, corregí errores hasta que quedó compilado, no tuve oportunidad de probar las cosas antes
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de vangodp
Val: 73
Ha disminuido 1 puesto en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Ayuda, programa compila pero no corre C++

Publicado por vangodp (287 intervenciones) el 17/02/2015 15:16:02
vale... ¿Sabes una de esas veces que nadie esta equivocado? XDDD, pues ni tu ni tu maestro ni yo, lo que dije es cierto.

Al guardar un entero en un archivo de texto plano si pierde el formato. Eso lo puedes buscar por Internet y leer o preguntar a tu maestro, si dice que no miente. Lo puedes comprobar aqui: http://es.wikibooks.org/wiki/Programaci%C3%B3n_en_C/Manejo_de_archivos#Lectura en la frase que pone: "Un archivo generalmente debe verse como un string (una cadena de caracteres) que esta guardado en el disco duro.". ¿Por que lo dice "generalmente"? Por que los binarios no son así, trabajan como la ram guardando enteros, chars, boleanos, reales etc etc.

Otra cosa... Que sea tu maestro no le califica como un buen programador, eso si, no le estoy juzgando, pero ojo, lo que digo es ¡Dudad de todos! XD

Lo que pasa es que si te fías fscanf formatea nuevamente el texto a enteros. Básicamente como en tu fichero tienes lineas como: "1 1157 315 River Plate" se lo lee por ejemplo el primer 1 y lo "transforma" en entero nuevamente. Veamos otro ejemplo... El segundo numero "1157", en realidad son 4 chars pero como esta rodeado de "espacios" si te fías en la cadena de formato "%d %d %d" esta esperando 3 enteros que están separados por "espacios" , hay el carácter ' ' entre los %d, si los juntara todos 11157315 seguramente lo leería el primer y los siguientes a tomar viento.

Yo no soy el mejor programador del mundo, simplemente indago en las cosas, de echo creo que la forma optima de leer linea a linea un fichero es esta:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>
#include <cstdio>
using namespace std;
#define BUFFER_SIZE 1024
 
 
int main (){
    int a, b, c, eof=1;
    char frase[BUFFER_SIZE];
 
    FILE *file = fopen ( "equipos.txt", "r" );
 
    while ( !feof(file) ){ //Lee todo el archivo de forma consecutiva hasta que encuentre el fin del archivo.
 
        //lee 3 enteros y un string de no mas de 1023 caracteres y garantiza espacio para el ultimo 
        //caracter nulo de la cadena y tambien lo inserta ese nulo. Tambien evita que entre el caracter '\n' en el string. ¡Un chollo vamos!
        fscanf ( file, "%d %d %d %1023[^\n]%*c", &a, &b, &c, frase);
 
        //imprime de forma ordenada linea a linea del archivo
        printf ("%03d %05d %05d %s\n", a, b, c, frase);
 
        //¡Truco! Si no llamamos la funcion feof() antes de salir dentro del bucle repetirá la ultima linea del archivo 2 veces. ¡Asi que llamad a feof()!XD 
        feof(file);
    }
 
    fclose(file);
    cin.ignore();
    return 0;
}

Habría que poner los comprobadores para ver si el archivo abrió correctamente o devuelve un nulo en caso de fallo, pero si pruebas con tu archivo de equipos.txt veras que es optimo.

Seguiré mirando el código esta noche. que dentro poco me voy a los estudios. XD

¿Para cuando lo tienes que entregar? Si quieres agregarme en skype me llamo igual. estoy en España por si preguntas que hora es por la noche aquí >_<

Bueno... Suerte.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Ayuda, programa compila pero no corre C++

Publicado por Matias (5 intervenciones) el 18/02/2015 04:04:25
Para el 23 de este mes D: , ahora te agrego, arreglé todos los if pero ninguna de las opciones me lleva a ningún lugar, vuelve a mostrar el menú de selección :S, pienso terminarlo esta noche, porque se me vienen los finales encima
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar