Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 599
Está perdiendo oportunidades comerciales:
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Registro
Entrada
Usted acepta la política del sitio web y las condiciones de uso
Si no tiene cuenta de usuario, regístrese
¡Hola!
Me pueden decir cómo mover el cursor a, por ejemplo, la línea 7 de un documento de texto, para extraer una subcadena de esta posición...
¿Qué es más rápido: varios archivos de texto con una línea o un archivo con más líneas?
Necesita saber cuántos bytes hay en una línea y mover el puntero a 6 de esos valores desde el principio del archivo.
¡Hola!
¿Qué es más rápido, muchos archivos de texto con una línea o un archivo con muchas líneas?
Depende de la implementación específica del algoritmo y del problema a resolver. Quizás en tu caso, la primera opción sea más rápida, pero yo no pensaría en el rendimiento en tu lugar.
Por favor, dígame cómo mover el cursor, digamos, en la 7ª línea de un documento de texto, para extraer la subcadena ya desde esta posición...
Lea la documentación estándar. La sección deoperaciones de archivo. Por ejemplo, puede leer un archivo línea por línea con FileReadString, un ejemplo está directamente en la documentación:
¿Pueden decirme cómo convertir el valor de un clic del ratón en un gráfico en un valor de precio o viceversa?
Dime cómo convertir el valor de un clic del ratón en un gráfico en un valor de precio o viceversa.
Utilice la función ChartXYToTimePrice. Véase "Operaciones con gráficos" en la documentación.
Utilice la función ChartXYToTimePrice. Véase "Operaciones con gráficos" en la documentación.
Gracias.
Así que cometieron un error con CArrayObj. En lugar de: CArrayObj test_objects ; Escribieron: CArrayObj* test_objects, pero se olvidaron de hacer un destructor para él; Tal vez configuraron incorrectamente el modelo de memoria para trabajar con CArrayObj. Quizás los programadores simplemente se excedieron con los punteros. El diagnóstico es claro: el uso de punteros donde no son necesarios suele provocar fugas.
Hay una función en alguna clase. Declaro un array de objetos CArrayObj en él. Agrego objetos de clase global en él. Cuando la función finaliza, la matriz de objetos en sí no es necesaria. Los objetos son necesarios, por supuesto.
Si creo el array como un puntero CArrayObj *test_objects, obtendré objetos no borrados en el registro, lo que provocará un error de falta de memoria al final.
Si declaro el array como CArrayObj test_objects, añado objetos a él, entonces resulta que cuando la función termina y los objetos dejan de estar disponibles, porque el array con los objetos está como borrado...
Si declaro un array como CArrayObj test_objects, añado objetos a él, entonces resulta que cuando la función termina, los objetos no estarán disponibles, porque el array con los objetos está como borrado...
Esto es correcto, porque en este caso, se coloca CArrayObj test_objects en la pila y en el espacio de direcciones de la función. Cuando la función sale, el espacio de direcciones de la función se sobrescribe, incluyendo su CArrayObj test_objects.
La función se termina, la matriz de objetos en sí no es necesaria. Los objetos, por supuesto, son necesarios.
Recuerda de una vez por todas que si necesitas objetos dentro de un CArrayObj, también necesitas el propio CArrayObj. CArrayObj es un embalaje obligatorio. No puedes prescindir de él, y punto.
Si creo un array como un puntero CArrayObj *test_objects, entonces obtengo objetos no borrados en el registro, lo que eventualmente llevará a un error de falta de memoria.
En este caso se crea un puntero a algún objeto CArrayObj en el heap. El heap es un segmento de memoria del espacio de direcciones del programa en el que la memoria se asigna y elimina manualmente con la ayuda de los correspondientes operadores new y delete. Significa que si escribes nuevo, debe haber su copia espejo de borrado en algún lugar. Además, nuevo y borrar pueden estar ubicados en diferentes partes del programa, por ejemplo, en diferentes métodos:
Si, después de llamar a foo_analize, los objetos siguen siendo necesarios, el operador de borrado puede colocarse en otro lugar, donde se garantice que los objetos son necesarios. Este lugar universal puede ser OnDeinit, por ejemplo, que se llama antes de que se cierre el programa.
Recuerda lo principal, Si hay un operador nuevo, siempre debe haber un operador de eliminación para él. De lo contrario, habrá fugas de memoria. Los operadores new y delete que trabajan sobre el mismo objeto no tienen que estar "uno al lado del otro" en el mismo método. Delete puede estar en cualquier lugar lejos de la asignación de memoria, siempre y cuando delete tenga una referencia al objeto asignado en el heap.
** Aunque esto es cierto, es mejor evitar este tipo de construcciones porque siempre hay que tener mucho cuidado con dónde y bajo qué circunstancias se llama al operador de borrado, lo cual no siempre es obvio. En cambio, sólo hay que aprender a utilizar las clases. La clase permite colocar y eliminar automáticamente objetos en el montón, sin utilizar los operadores new y delete:
Esta clase no contiene punteros explícitamente. Por lo tanto, no es necesario utilizar tanto nuevo como borrado. Después de salir del programa, la clase liberará todos los objetos CItem y CArrayObj automáticamente, lo que hace la vida del desarrollador mucho más fácil.
Esto es correcto, porque en este caso se coloca CArrayObj test_objects en la pila, y el espacio de direcciones de la función. Al salir de la función, el espacio de direcciones de la función se sobrescribe, incluyendo su CArrayObj test_objects.
Recuerda de una vez por todas que si necesitas objetos dentro de un CArrayObj, necesitas el propio CArrayObj. CArrayObj es un paquete obligatorio. No se puede prescindir de él, y punto.
En este caso, se crea un puntero a algún objeto CArrayObj en el heap. El heap es un segmento de memoria del espacio de direcciones del programa en el que la memoria se asigna y elimina manualmente con la ayuda de los correspondientes operadores new y delete. Significa que si escribes nuevo, debe haber su copia espejo de borrado en algún lugar. Además, nuevo y borrar pueden estar ubicados en diferentes partes del programa, por ejemplo, en diferentes métodos:
Si, después de llamar a foo_analize, los objetos siguen siendo necesarios, el operador de borrado puede colocarse en otro lugar, donde se garantice que los objetos son necesarios. Este lugar universal puede ser OnDeinit, por ejemplo, que se llama antes de que se cierre el programa.
Recuerda lo principal, si hay un operador nuevo, siempre debe haber un operador de eliminación para él. De lo contrario, habrá fugas de memoria. Los operadores new y delete que trabajan con el mismo objeto no tienen que estar ubicados "uno al lado del otro" en el mismo método. Delete puede estar en cualquier lugar lejos de la asignación de memoria, siempre y cuando delete tenga una referencia al objeto asignado en el heap.
** Aunque esto es cierto, es mejor evitar este tipo de construcciones porque siempre hay que tener mucho cuidado con dónde y bajo qué circunstancias se llama al operador de borrado, lo cual no siempre es obvio. En cambio, sólo hay que aprender a utilizar las clases. La clase permite colocar y eliminar automáticamente objetos en el montón, sin utilizar los operadores new y delete:
Esta clase no contiene punteros explícitamente. Por lo tanto, no es necesario utilizar tanto nuevo como borrado. Después de que el programa salga, la clase liberará automáticamente todos los objetos CItem y CArrayObj, lo que facilita la vida al desarrollador.
Gracias. Pero no he encontrado una respuesta a mi pregunta. Dónde debo poner delete si declaro un puntero. Repito, el objeto CArrayObj está declarado en una función... ¿cómo puedo borrarlo en Deinit()?
Pero antes resolví el problema así. Antes de terminar la función:
Gracias. No pude encontrar una respuesta a mi pregunta exacta. Dónde debo poner delete si declaro un puntero. De nuevo, el objeto CArrayObj está declarado en una función... ¿cómo puedo borrarlo en Deinit()?
Este no es un club de telépatas. No has adjuntado tu código, así que puedes decidir por ti mismo dónde colocar el borrado.
No es correcto.