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 - Littlehorse

#231
Dejo el post cerrado hasta publicar los resultados.  ;)

Saludos
#232
@Franki.

Estas errado por demasiado. Nada mas lejos de la realidad.

1) C se utiliza en gran medida para controladores, sistemas operativos, y demás, porque carece de las ventajas del paradigma mas utilizado actualmente: la orientación a objetos. Por supuesto solo refiriéndonos a C y no a Objective-C.
Es un lenguaje simple y complejo a la vez, que cumple los requerimientos para el desarrollo en bajo nivel como ninguno, por esa razón es el lenguaje mas utilizado en esa área.

2) En el área de desarrollo de controladores, de sistemas operativos, y de lo que se te pueda ocurrir a bajo nivel, C++ no se utiliza en gran parte porque la visión que tiene ese mercado en su mayoría es que C++ es un lenguaje con extras innecesarios para esa tarea. Aunque no todos piensen así, la mayoría lo piensa y por esa razón se utiliza C en esa área y no C++.

3) C++ hoy por hoy lo utilizan muchísimas empresas en todo el mundo, desde empresas de primera linea como IBM, Google y Microsoft, hasta empresas mas pequeñas que necesiten de la potencia de C++.

4) C/C++ no son un poco mas rápido que Java. La diferencia de velocidad es un detalle que no hay que minimizar; es un detalle que influye demasiado conforme la complejidad de la tarea que realiza la aplicación aumenta.

Si se utilizan lenguajes como Java, C#, y demás, es porque son plataformas excelentes para desarrollar aplicaciones sencillas en poco tiempo, con mano de obra barata. Si necesitas hacer una aplicación rápidamente que sincronice algunos servidores para sacarla como servicio en tu empresa, es mucho mas barato y rápido pagarle a un programador de Java de 6 meses de experiencia que pagarle a uno de C++ con 3 años de experiencia.

No se puede trabajar programando en C++ si no se tiene como mínimo mas de 1 año de estudio con el lenguaje, sin embargo en 5 meses podes entrar como junior en una empresa programando en Java, dado que la curva de aprendizaje son muy distintas.
A las empresas les sale mucho mas barato pagar un junior en Java que le rinde lo que la empresa necesita, y al junior le sirve para tener un sueldo y ganar experiencia laboral para poder, en un futuro, ganar mas dinero y conseguir un puesto mejor.

No vas a ver una suite de Adobe desarrollada en Java, ni vas a ver un Crysis hecho en C#. Cuando la aplicación requiere medianamente ciertos recursos, en lo que menos se piensa es en Java.
No por esto estoy queriendo decir que Java u plataformas similares no se utilizan para proyectos de gran envergadura, se utilizan por supuesto pero depende de que tipo de proyecto.
La aceptación de las empresas y la aparente salida laboral inmediata que tienen se deben a lo anterior expuesto y no exclusivamente a la facilidad del desarrollo ni al rendimiento como se quiere hacer creer.

Otro detalle a tener en cuenta, es que un gran director del mundo de desarrollo es Microsoft. Y como ya habrán visto en otros hechos puntuales (como los efectuados por Oracle) quien dirige la batuta es quien decide muchas cosas, y por hoy las apuestas de Microsoft son C++ -como lo fue siempre- para aplicaciones de rendimiento y .NET para aplicaciones sencillas.

Saludos!

#233
Programación C/C++ / Re: sobrecarga de operador<<
17 Diciembre 2010, 19:10 PM
Buenas preguntas .

CitarEse operator<< lo podría opner como método de la clase y que hiciese la misma tarea?

No, no exactamente. Se declara como una función libre siempre que este llamando a otra función que haga la tarea, si no es el caso, se declara como friend de la clase en pos que pueda acceder a los miembros privados.


CitarComo hago para que en el operador de asignación detecte que se trata del mismo objeto y no lo borre.

Bueno podes hacer varias cosas. Realmente depende de si los usuarios de tu clase van o no van a realizar asignaciones así mismos, aunque lo ideal es pensar que siempre son capaces de hacerlo.
Si no existe la posibilidad que algo así ocurra bajo ningún aspecto, lo mas sencillo es hacer esto:

Código (cpp) [Seleccionar]
MiClase& operator=(const MiClase& mib)
{
if (this == &mib)//Mismo objeto?
return *this;//salimos...
num1 = 0;//Y si no, el resto de la logica
num2 = 0;
num1 = mib.num1;
num2 = mib.num2;
return *this;
}


ahora dependiendo de la complejidad de la clase tal vez haya que añadir bastante código extra. Realmente depende del caso en particular.

Saludos!
#234
S4 League. -No es primera persona pero vale la pena probarlo-

[youtube=425,350]http://www.youtube.com/watch?v=uez5eE7u9uw[/youtube]

Combat Arms (EU, no America porque tienen IP-BAN)

[youtube=425,350]http://www.youtube.com/watch?v=8uF3lgE-l4s[/youtube]

Alliance of Valiant Arms.

[youtube=425,350]http://www.youtube.com/watch?v=2PpaSOpMI2U&feature=related[/youtube]

Genesis A.D.

[youtube=425,350]http://www.youtube.com/watch?v=FNExA0LjpK8&feature=fvwrel[/youtube]

El que menos pide es el S4, por orden los que le siguen van pidiendo un poco mas de maquina, siendo el Genesis A.D. el que mas pide. El "poco" mas, es poco literalmente, con una placa de gama baja corres la mayoría, por las dudas chequea los requerimientos antes de probar alguno.

Saludos.


#235
char *p;

Declara un puntero a char.

char *gets(char *buffer);

Es el prototipo de una función. En este caso la función es gets, y acepta un puntero a char como parámetro, y retorna un puntero a char.

Citarpara que se usa \0

Es lo que se utiliza con las cadenas *char para verificar si se ha llegado al final de cadena. Es decir, recorres la cadena mientras no se encuentre el caracter nulo, si lo encuentras es que has llegado al final de la cadena.

Usa el buscador del foro para este tipo de dudas ya que están ampliamente repetidas. Lo mejor es que también comiences con un buen libro y no un paper de alguna web; en el hilo de "libros/papers" que se encuentra en las chinchetas hay muchos.

Saludos.
#236
No se de que hablan puesto que todavía no se han publicado los resultados. Entre hoy y mañana publicare los ganadores y los que han ganado las menciones especiales.

Saludos
#237
Bueno usualmente no me gusta extenderme demasiado en las explicaciones al menos que sea realmente necesario, y en este caso lo es. Viendo el código ya el problema ha quedado claro, espero que la explicación también.  ;D


Cuando el compilador recorre la clase y la analiza, al encontrarse con la declaración friend de la sobrecarga del operador, en este punto:


Código (cpp) [Seleccionar]
template<typename TYPE>class matriz{
protected:
unsigned filas,columnas;
TYPE** datos;
public:
matriz (unsigned FILAS,unsigned COLUMNAS);
friend std::ostream &operator << (std::ostream &os,matriz<TYPE> X); // sobrecarga friend
};


el compilador no sabe que dichas funciones en si mismas son templates, entonces asume que la definición de dichas funciones son precisamente, no-template.
Al utilizar los métodos propiamente dichos, el compilador genera una llamada a las versiones no-template de dichos métodos, lo cual seria así:

Código (cpp) [Seleccionar]

std::ostream &operator << (std::ostream &os,matriz<TYPE> X);// Sobrecarga friend no-template


pero esos métodos nunca están definidos puesto que en realidad técnicamente no existen. Entonces en ese momento el linker te da el error de referencia indefinida.

La forma de solucionarlo es basicamente aclarándole al compilador que la versión de la función que tiene que buscar es precisamente, un template.

Primero que nada, usamos forward declarations de la clase y de la sobrecarga:

Código (cpp) [Seleccionar]
template<typename TYPE> class matriz;
template<typename TYPE> std::ostream &operator <<(std::ostream &os,matriz<TYPE> X);


y luego de eso, agregamos <> a la sobrecarga del operador para que el compilador al recorrer la clase sepa que nos estamos refiriendo a un template:

Código (cpp) [Seleccionar]
friend std::ostream &operator << <> (std::ostream &os,matriz<TYPE> X);

y luego lo defines:

Código (cpp) [Seleccionar]
template<typename TYPE> std::ostream &operator << (std::ostream &os, matriz<TYPE> X)
{
//la logica aqui
}


El código final te debería quedar así:

Código (cpp) [Seleccionar]
template<typename TYPE> class matriz; //Forward declaration de la clase
template<typename TYPE> std::ostream &operator <<(std::ostream &os,matriz<TYPE> X); // Forward declaration de la sobrecarga

//Definición de la clase
template<typename TYPE>class matriz{
protected:
unsigned filas,columnas;
TYPE** datos;
public:
matriz (unsigned FILAS,unsigned COLUMNAS);
friend std::ostream &operator << <> (std::ostream &os,matriz<TYPE> X); //Especificar versión template
};

//Definición del constructor
template<typename TYPE> matriz<TYPE>::matriz(unsigned FILAS, unsigned COLUMNAS){
filas=FILAS;
columnas=COLUMNAS;
datos=new TYPE *[filas];
for(unsigned i=0;i<filas;i++){
datos[i]=new TYPE [columnas];
for(unsigned j=0;j<columnas;j++){
datos[i][j]=0;
};
};
};

//Sobrecarga del operador
template<typename TYPE> std::ostream &operator << (std::ostream &os, matriz<TYPE> X){
for(unsigned i=0;i<X.filas;i++){
for(unsigned j=0;j<X.columnas;j++){
os<<X.datos[i][j]<<'\t';
};
os<<'\n';
};
return os;
};


int main(int argc,char* argv[]){
matriz<int> A=matriz<int>(4,4);
std::cout<<A<<std::endl;
std::system("pause");
return 0;
};



Eso o declarar y definir la sobrecarga dentro de la clase.
No lo he probado porque tengo el compilador bastante ocupado, pero si no llega a funcionar correctamente, ya sabes.

Saludos!
#238
Pon lo que llevas hecho así se ve claramente el error sin necesidad de especular.

Lectura recomendada:

http://www.codeproject.com/KB/system/hooksys.aspx

Saludos
#239
No se puede borrar el ejecutable mientras se encuentre en ejecución. Se pueden hacer otras cosas como iniciar un proceso secundario que sincronice con el ejecutable principal y lo borre terminada su ejecución. El efecto es el mismo y es por demás la solución mas sencilla.

Si reiniciar es una opción, podes usar MoveFileEx con el flag MOVEFILE_DELAY_UNTIL_REBOOT:

CitarIf dwFlags specifies MOVEFILE_DELAY_UNTIL_REBOOT and lpNewFileName is NULL, MoveFileEx registers the lpExistingFileName file to be deleted when the system restarts. If lpExistingFileName refers to a directory, the system removes the directory at restart only if the directory is empty.
Saludos
#240
Cita de: Sagrini en 16 Diciembre 2010, 18:44 PM
printf ("\n\n\n\n\n\n\n\n\n\n"); y listo


Si lees el hilo, deja bien claro en el primer post que:

Citar
para borrar la pantalla sin usar líneas vacías en consola... o es que no hay manera alguna?...saludoss