Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - MAFUS

#811
Programación C/C++ / Re: cadena de caracteres
27 Abril 2017, 12:01 PM
Este último código tiene pérdida de memoria al perder la referencia a cadena. Hay que pensar que es memoria dinámica y hay que liberarla a mano.
#812
Lo escribo desde el móvil así que voy a simplificar.
Tu dices:
char palabras[5] = "CASCO"
Ahora como está entrecomillado hay que pensar hay el carácter nulo.
Así que tu array queda
#1: palabras[0] = 'C'
#2: palabras[1] = 'A'
...
#5: palabras[4] = 'O'

Y fuera de los límites de array está el caracter nulo.

Esto es peligroso porqué el programa sí copia dicho caracter nulo pero no tiene un espacio reservado. Eso significa que otra vatiable que tenga asignada esa zona de memoria te sobreescribirá ese caracter nulo y si ese es un valor distinto a 0 las funciones encargadas de manejar cadenas no encontrarán el final de esta donde tu lo esperas. Que es lo que te pasa. Así como lo tienes una cadena machaca el caracter nulo de la anterior por tanto printf escribe toda la ristra de palabras que hay en el array.
#813
En algunas funciones te olvidas de recorrer la lista y en el main tienes un gran problema en la línea de definición de variables.
#814
Al entrecomillar una cadena el compilador ya pone automáticamente el caracter nulo pero deberás tenerlo en cuenta al dimensionar un array manualmente.

Sobre dimensionar los arrays.
Cuando le das un tamaño estás indicando el número máximo de elementos que va a contener pero  como la numeración del índice empieza en el 0  el índice sulerior será siempre el número usado para dimensionar menos 1.

Por ejemplo
miarray [4]

Los elementos serán:
#1: miarray[0]
#2: miarray[1]
#3: miarray[2]
#4: miarray[3]
#815
Te lías con tus variables.

number es escalar, no un array, por eso el fallo. El array es element. ¿Acepta tu compilador arrays de tamaño variable (de tamaño definido entiempo de ejecución)?

Por otra parte entiendo que push da un tamaño inicial a un objeto si su puntero apunta a NULL.
#816
Entrecomillando una cadena has dado un paso pero sigues teniendo un fallo.
Un poco de teoría: Los lenguajes de programación, al menos antes de la era de la programación orientada a objetos, tenían el problema de saber dónde termina una cadena de texto. Nosotros entendemos las palabras, pero la máquina no; para ella son sólo una secuencia de números en una sección de su memoria lineal. Pero ¿dónde termina?
Para resolver el problema los diseñadores pensaron en dos soluciones totalmente diferentes pero totalmente funcionales:
1. El tamaño de la cadena lo marcaba el primer byte de ésta. Como pro no se necesitaba calcular el tamaño pues ya lo daba la cadena misma; por contra una cadena no podía superar los 255 caracteres.
2. Marcar la cadena con un carácter especial que no será usado en otra situación. Como pro una cadena puede ser tan larga como el programador necesita; por contra el tamaño debe ser calculado programáticamente, hay un carácter que no puede ser usado en los textos y el auténtico tamaño del array de caracteres es un byte más largo a lo que el programador escribe, por ese mismo carácter.

C usa la segunda opción.
Cuando tu escribes una cadena de esta forma
"HOLA"lo que C hace por debajo es{'H', 'O', 'L', 'A', '\0}es decir, prepara un array con las letras que le has dado entrecomilladas y agrega el carácter nulo, que vale 0 (cero) en decimal, para marcar el final de la cadena. Esa es la base de todas las funciones que trabajan con cadenas.

Por tanto cuándo defines un array para alojar una cadena y debes darle las dimensiones a mano piensa que debes sobredimensionar a 1 elemento más que el número de letras tiene la cadena.

Por tanto debes redimensionar tus arrays de palabras para poder alojar el carácter nulo.
#817
Vale, en otros lenguajes puede funcionar pero en C las cadenas no se declaran de esa forma. Repasa cadenas y caracteres sueltos.
#818
El algoritmo debería buscar el mínimo valor de la lista entera y cambiarlo por el del puntero principal
pero
tu código busca el primer elemento menor al del puntero principal, intercambiarlo (o eso creo que hace) y saltar a la próxima del puntero principal.
#819
Pues todo ese planteamiento está mal.
El archivo debe leerse en el orden en que está configurado y no debes leer más allá de su final.
#820
El programa, tal y como está, a mi no me lee bien. leerMuebles me da fallo de segmento.


Haciendo el ejercicio para mí y adaptando el código al C he dado con estos errores:
Tú dices que lista2.txt tiene este formato
Citar17/02/01 7737 5
17/01/22 1325 2
15/12/23 2176 6
pero tu código lee primero el código
Código (c++) [Seleccionar]
void leerVenta(ifstream& fichV, tVenta& laVenta) {
char aux;
fichV >> laVenta.codigo;
leerFecha(fichV, laVenta.fecha);
fichV >> laVenta.unidades;
}

por lo tanto el orden de los datos difiere del archivo con los de tu programa.

Sea como sea cuándo leas del archivo y al encontrarte con el marcador -1 no debes leer más allá,  sin embargo en el código de las funciones leerVenta y leerMueble aunque leas dicho marcador sigues leyendo datos del archivo aunque estos no existan.