Calcular máximo de matriz, error

Iniciado por Puntoinfinito, 17 Julio 2013, 18:30 PM

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

Puntoinfinito

Hola!!  :D

Necesito una función que lea unos numeros de un archivo de texto que luego los cojera y los ordenara para añadirlos por orden a un miembro de una clase (dat.topScore)

Código (cpp) [Seleccionar]
void readScore() {

char linea[128]; // para la lectura
int lineas = 0; // para ver las lineas del archivo
int temp[128]; /// original
int _temp[128]; // temporal para ordenar
for (int i = 0; i < 128; i++) {
_temp[i] = 0; // añado inicializador
}

      /*** obtengo las lineas del archivo que he definido anteriormente ***/        

while (!dataFile_o.eof()) {
dataFile_o.getline(linea,sizeof(linea));
temp[lineas] = atoi(linea);
lineas++;
}

      /***** Calculo el maximo de la matriz y la guardo en otra (_temp) y
               para que no se repita el numero le pongo de valor 0 a la matriz
               original y así evadir el repetimiento ****/

for (int i = 0; i < lineas; i++) {
_temp[i] = *max_element(temp,temp+lineas);
for (int z = 0; z < lineas; z++) {
if (_temp[i] == temp[z]) {
temp[z] = 0;
}
}
       cout << _temp[i]; // AQUÍ LO IMPRIME ORDENADO
}

       /*** Finalmente guardo la matriz ordenada en un miembro de una clase ***/

for (int i = 0; i < lineas; i++) {
_temp[i] = dat.topScore[i]; // NO ENTIENDO PORQUE NO LO GUARDA BIEN (saca todo de ceros)
cout << _temp[i];
}

}


El error ya lo he comentado más o menos en el código, cuando hago la impresión durante el primer ciclo for de ordenar sale todo bien luego cuando hago la impresión de nuevo me sale todo de "00000"...

Nose si me explico xD Si hay dudas preguntad porfavor!! Saludos y gracias por leer  :-*
AHORA EN SOFTONIC || CLICK HERE!!
Base64: QWNhYmFzIGRlIHBlcmRlciAxIG1pbnV0byBkZSB0dSB2aWRhLiBPbOkh



HACK AND 1337 : http://hackandleet.blogspot.com
WEBSITE: http://www.infiniterware.

eferion

Así a bote pronto no veo dónde has guardado los datos en dat...

No es que te esté guardando mal los datos... es que no los estás guardando.

Puntoinfinito

Esque no esta el código completo, pero de donde lee los datos es de aquí:

ifstream dataFile_o("data/score.dat",ios::app);

Y respondiendo a tu pregunta, los datos los guardo aquí:

_temp[i] = *max_element(temp,temp+lineas);

Si te fijas cuando hago:

cout << _temp[i]; // AQUÍ LO IMPRIME ORDENADO

lo imprime todo bien, sin problemas, ordenado... :/
AHORA EN SOFTONIC || CLICK HERE!!
Base64: QWNhYmFzIGRlIHBlcmRlciAxIG1pbnV0byBkZSB0dSB2aWRhLiBPbOkh



HACK AND 1337 : http://hackandleet.blogspot.com
WEBSITE: http://www.infiniterware.

eferion

_temp[i] = dat.topScore[i];

ahí estás sacando datos de dat y guardándolos en _temp... dat no lo estableces en ninguna parte del código que has puesto.

0xDani

Cita de: eferion en 17 Julio 2013, 18:58 PM
_temp[i] = dat.topScore[i];

ahí estás sacando datos de dat y guardándolos en _temp... dat no lo estableces en ninguna parte del código que has puesto.

Exacto, te cargas lo que haya en _temp, la asignación está al revés.
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM

rir3760

Cita de: Puntoinfinito en 17 Julio 2013, 18:30 PMNecesito una función que lea unos numeros de un archivo de texto que luego los cojera y los ordenara para añadirlos por orden a un miembro de una clase (dat.topScore)
El problema me parece que ya esta resuelto.

Otras dos recomendaciones son:

Si quieres que todos los elementos de un array se inicializen a cero:
Código (cpp) [Seleccionar]
int _temp[128]; // temporal para ordenar
for (int i = 0; i < 128; i++) {
   _temp[i] = 0; // añado inicializador
}

Puedes hacerlo de una forma mas breve, indicando el valor del primer elemento:
Código (cpp) [Seleccionar]
int _temp[128] = {0}; // _temp[0] es cero, los elementos restantes se inicializan a cero

Y para controlar la lectura de datos en un bucle no se recomienda el uso de la función miembro eof:
Código (cpp) [Seleccionar]
while (!dataFile_o.eof()) {
   dataFile_o.getline(linea,sizeof(linea));
   temp[lineas] = atoi(linea);
   lineas++;
}

Ello porque eof resultara en el valor verdadero solo después del fallo de una operación de lectura. En su lugar puedes utilizar el resultado de getline directamente (y de paso reduces el numero de sentencias):
Código (cpp) [Seleccionar]
while (dataFile_o.getline(linea,sizeof(linea))){
   temp[lineas] = atoi(linea);
   lineas++;
}


Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

eferion

Cita de: rir3760 en 18 Julio 2013, 02:11 AM
Si quieres que todos los elementos de un array se inicializen a cero:
Código (cpp) [Seleccionar]
int _temp[128]; // temporal para ordenar
for (int i = 0; i < 128; i++) {
   _temp[i] = 0; // añado inicializador
}

Puedes hacerlo de una forma mas breve, indicando el valor del primer elemento:
Código (cpp) [Seleccionar]
int _temp[128] = {0}; // _temp[0] es cero, los elementos restantes se inicializan a cero

Además de las dos mencionadas, creo que la forma más común de inicializar la memoria es utilizar la función memset.

memset( _temp, 0, sizeof( _temp ) );


Puntoinfinito

 :-X ... Supongo que el descuido ese será por estar ya unas cuantas horas programando... jjajaj como no me he fijadoo. Gracias!!

Y por las recomendaciones ya lo he implementado, gracias por la ayuda :)

Saludos!!
AHORA EN SOFTONIC || CLICK HERE!!
Base64: QWNhYmFzIGRlIHBlcmRlciAxIG1pbnV0byBkZSB0dSB2aWRhLiBPbOkh



HACK AND 1337 : http://hackandleet.blogspot.com
WEBSITE: http://www.infiniterware.