SoloCodigo

Programación General => C/C++ => Mensaje iniciado por: RamonVeres en Sábado 16 de Mayo de 2009, 17:13

Título: Reutilizacion de codigo
Publicado por: RamonVeres en Sábado 16 de Mayo de 2009, 17:13
El tema es asi:

1)Estoy tratando de reutilizar codigo de una aplicacion a otra, la nueva aplicacion es una DLL dinamica.

2)Creo un "RIV_Varios.h"

Código: C++
  1. #ifndef __RIV_Varios_H__
  2. #define __RIV_Varios_H__
  3.  
  4. //#include "stdafx.h"
  5.  
  6. class CRIV_Varios //: public CDialog
  7. {
  8.  
  9. private:
  10.    
  11.     // Construction
  12. public:
  13.     int Byte_2_Hex(char Byte_Entrada, char *Char_Salida);
  14.  
  15.     unsigned int read_16u(FILE *fp);
  16.     unsigned long read_32u(FILE *fp);
  17.  
  18.  
  19.     // Implementation
  20. protected:
  21.  
  22. };
  23.  
  24. #endif
  25.  

3)Creo un "RIV_Varios.Cpp"

Código: C++
  1. #include "RIV_Varios.h"
  2.  
  3. //////////////////////////////////
  4. unsigned long CRIV_Varios::read_32u(FILE *fp)
  5.     {
  6.         unsigned char b0,b1,b2,b3; // bytes from file
  7.         b0 = getc(fp);
  8.         b1 = getc(fp);
  9.         b2 = getc(fp);
  10.         b3 = getc(fp);
  11.         return (unsigned long)((((((b3<<8)|b2)<<8)|b1)<<8)|b0);
  12.     }
  13. // Similarly for writing to file
  14. // Other routines need to be written for 16 bit (signed/unsigned)
  15. //////////////////////////////////
  16.  
  17. //////////////////////////////////
  18. unsigned int CRIV_Varios::read_16u(FILE *fp)
  19.     {
  20.         unsigned char b0,b1; // bytes from file
  21.         b0 = getc(fp);
  22.         b1 = getc(fp);
  23.         return (unsigned int)((b1<<8)|b0);
  24.     }
  25. //////////////////////////////////
  26.  
  27.  
  28. //////////////////////////////////
  29. int CRIV_Varios::Byte_2_Hex(char Byte_Entrada, char *Char_Salida)
  30. {
  31.     char aux_char;
  32.  
  33.     aux_char = Byte_Entrada;
  34.     aux_char = aux_char & 0x0000000F;
  35.  
  36.     if (aux_char <= 0x9)
  37.     {
  38.         Char_Salida[1] = ( aux_char ) + 0x30;
  39.     }
  40.     else
  41.     {
  42.         Char_Salida[1] = aux_char + 0x37;
  43.     }
  44.    
  45.     aux_char = Byte_Entrada;
  46.     aux_char = aux_char >> 4;
  47.     aux_char = aux_char & 0x0000000F;
  48.  
  49.     if (aux_char <= 0x9)
  50.     {
  51.         Char_Salida[0] = aux_char + 0x30;
  52.     }
  53.     else
  54.     {
  55.         Char_Salida[0] = aux_char + 0x37;
  56.     }
  57.  
  58.     return (0);
  59. }
  60. //////////////////////////////////
  61.  
  62.  
  63.  

4)Compilo y me da este error:

Código: C++
  1. RIV_Varios.cpp
  2. c:*riv_varios.cpp(69) : fatal error C1010: unexpected end of file while looking for precompiled header directive
  3.  

Y la verdad es que no se para donde agarrar, debe ser una tonteria solucionarlo, pero ?

Agredecere cualquier ayuda.
Título: Re: Reutilizacion de codigo
Publicado por: Eternal Idol en Sábado 16 de Mayo de 2009, 19:45
El error en la MSDN (http://msdn.microsoft.com/en-us/library/d7fz9ckx(VS.80).aspx).
Título: Re: Reutilizacion de codigo
Publicado por: RamonVeres en Lunes 18 de Mayo de 2009, 03:58
Aparentemente faltaria una libreria o algo asi, pero cual?

Che, crear un archivo para reutilizar codigo tiene que ser una boludez, nadie sabe como hacerlo?
Título: Re: Reutilizacion de codigo
Publicado por: diego.martinez en Lunes 18 de Mayo de 2009, 11:57
Esta buscando las cabeceras de precompilacion  stdafx.h y las tienes comentadas en el codigo //#include "stdafx.h"
y por eso , mientras busca esa linea, encuentra el fin del archivo antes de encontrarla con lo que se queja de ello.

si estas usando visual studio , puedes ir a Project -> Properties -> Precompiled Headers -> Create/Use Precompiled Header
y pasarlo a Not Using Precompiled Headers.

Ni idea de como saldrá en castellano, pero seguro que puedes hacerte una idea si lo tienes asi.

EDITO: si, he puesto exactamente lo mismo que eternal idol, sorry .
Título: Re: Reutilizacion de codigo
Publicado por: m0skit0 en Lunes 18 de Mayo de 2009, 12:40
Cita de: "RamonVeres"
Che, crear un archivo para reutilizar codigo tiene que ser una boludez, nadie sabe como hacerlo?
Pareces argentino :lol:

Bromas aparte: copias el código, lo pones en otro fichero y listo :P Utiliza un fichero de cabecera para poner los prototipos de las funciones & variables e inclúyelo en el fichero principal.

Salud
Título: Re: Reutilizacion de codigo
Publicado por: RamonVeres en Lunes 18 de Mayo de 2009, 16:30
Gracias por responderme, si, soy argentino por desgracia.

El codigo en rojo que me escribistes si es para el compilador, #no #deberia #estar #asi?

igual no entiendo nada, no tienen un ejemplo de un .h y un .cpp que pueda ser reutilizado y listo?

Gracias.
Título: Re: Reutilizacion de codigo
Publicado por: m0skit0 en Lunes 18 de Mayo de 2009, 16:44
Cita de: "RamonVeres"
no tienen un ejemplo de un .h y un .cpp
Por ejemplo, tengo una función que calcula el factorial de un número n > 0, así que para reutilizarla la pongo en fmate.c (que no de beber)  :)

Código: C
  1. long factorial(int n)
  2. {
  3.     if (n <= 1)
  4.         return 1;
  5.     else
  6.         return n*factorial(n-1);
  7. }
  8.  
Y me hago otro fichero, fmate.h, que contiene:

Código: C
  1. long factorial(int n);
  2.  
Ahora para usar esta función me basta con poner en mi proyecto:

Código: C
  1. #include "fmate.h"
  2. [...]
  3. /* Ejemplo */
  4. fact = factorial(20);
  5.  

Cita de: "RamonVeres"
El codigo en rojo que me escribistes si es para el compilador, #no #deberia #estar #asi?
Es broma, es mi firma  :lol:  :P
Título: Re: Reutilizacion de codigo
Publicado por: RamonVeres en Lunes 18 de Mayo de 2009, 16:53
Eso es lo que buscaba, lo voy a probar.

Che, lo del codigo rojo es un aporte mas a la confusion general?

Nota: "Che" significa "Mi", ("Che señor" = "Mi señor"), no es algo despectivo sino todo lo contrario.

Gracias.
Título: Re: Reutilizacion de codigo
Publicado por: m0skit0 en Lunes 18 de Mayo de 2009, 17:54
Cita de: "RamonVeres"
Nota: "Che" significa "Mi", ("Che señor" = "Mi señor"), no es algo despectivo sino todo lo contrario.
Sí, claro, yo lo decía de broma. Y sí, es un aporte más a la confusión, aunque deberías haberte dado cuenta de que es una firma  :P
Título: Re: Reutilizacion de codigo
Publicado por: RamonVeres en Lunes 18 de Mayo de 2009, 18:18
Es que todavia no hice el curso para leer la mente por internet.

No diferencio .Gif de txt con solo mirar.

Salu2.
Título: Re: Reutilizacion de codigo
Publicado por: m0skit0 en Lunes 18 de Mayo de 2009, 18:31
Bueno, hay una barrita bien clarita que separa el post de la firma. Todos los días se aprende algo nuevo. Y no seas tan borde, neng, que estamos aquí para ayudarte  <_<
Título: Re: Reutilizacion de codigo
Publicado por: RamonVeres en Lunes 18 de Mayo de 2009, 18:56
Cita de: "m0skit0"
Y no seas tan borde, neng, que estamos aquí para ayudarte  <_<

No se que me quisistes decir, pero ante la duda lo tomo como un chiste.

No se que entendistes pero desde ya que les estoy muy agradecido y asi lo he dejado escrito y si en algo puedo serles de ayuda, solo avisen.

Es que no quiero que los detalles me distraigan de terminar mi proyecto, si tuviera que diferenciar texto de .gif en cada ocasion o si tuviera que comprender toda nueva palabra que la humanidad inventa, llegaria a viejo luego de leer 4 o 5 mails, ja.... :argh: .

Sigan asi que despues les cuento que paso.
Título: Re: Reutilizacion de codigo
Publicado por: RamonVeres en Martes 19 de Mayo de 2009, 04:04
Listo, lo probe y anda muy bien:

borrar.cpp
Código: C++
  1.  
  2. #include "borrar.h"
  3. #include "stdafx.h"
  4.  
  5. void __stdcall suma(long* v, long* k)
  6. {
  7.   v[0] += k[0];
  8. }
  9.  
  10. void __stdcall textos(char A[8], char B[8])
  11. {
  12.     A[0]=B[0];
  13. }
  14.  
  15.  

borrar.h
Código: C++
  1.  
  2. void __stdcall suma(long* v, long* k);
  3. void __stdcall textos(char A[8], char B[8]);
  4.  
  5.  

Proyecto.def
Código: C++
  1.  
  2. LIBRARY   Proyecto
  3. DESCRIPTION "Implements a binary tree."
  4. EXPORTS
  5.     suma
  6.     textos
  7.  
  8.  

Cuando puse una rutinita simple, compile la DLL y la llame desde Visual Basic, funciono perfectamente.

Ahora me surgio otro problema, cuando puse una instruccion rand:

Código: C++
  1.  
  2. //////////////////////////////////
  3. int __stdcall Mat_RndRiv(int range_min, int range_max)
  4. {
  5.    // Generate random numbers in the half-closed interval
  6.    // [range_min, range_max). In other words,
  7.    // range_min <= random number < range_max
  8.    double u = (double)rand() / (RAND_MAX + 1) * (range_max - range_min) + range_min;
  9.    return ((int)u);
  10. }
  11. //////////////////////////////////
  12.  
  13.  

Se pudrio todo:

Código: C++
  1.  
  2. Compiling...
  3. RIV_Mat.cpp
  4. G:Ramon009.BckVCppVCppRIV_Mat.cpp(51) : error C2065: 'rand' : undeclared identifier
  5. G:Ramon009.BckVCppVCppRIV_Mat.cpp(51) : error C2065: 'RAND_MAX' : undeclared identifier
  6. Error executing cl.exe.
  7.  
  8.  

Creo que tanto "rand" como "RAND_MAX" deberian estar en "math.h", sin embargo trate de ponerla en todos lados y no funciona.

Y ahora ??????????????????????, siempre me faltan 5 para el peso.

Gracias.
Título: Re: Reutilizacion de codigo
Publicado por: m0skit0 en Martes 19 de Mayo de 2009, 10:52
Debes poner #include <math.h> en RIV_Mat.cpp. ¿Seguro que así tampoco funciona?  :huh:
Título: Re: Reutilizacion de codigo
Publicado por: RamonVeres en Martes 19 de Mayo de 2009, 18:21
En el interin descubri que falta la libreria:

Código: C++
  1. #include <stdlib.h>
  2.  
  3.  

Inserta en StdAfx.h

(Que tendra que ver??????)

Bueno, para no hacerla tan larga quedo mas o menos asi:

Código: C++
  1. // stdafx.h : include file for standard system include files,
  2. //  or project specific include files that are used frequently, but
  3. //      are changed infrequently
  4. //
  5.  
  6. #if !defined(AFX_STDAFX_H__A8E7B5CF_9C93_4A79_BE47_5711E9E50176__INCLUDED_)
  7. #define AFX_STDAFX_H__A8E7B5CF_9C93_4A79_BE47_5711E9E50176__INCLUDED_
  8.  
  9. #if _MSC_VER > 1000
  10. #pragma once
  11. #endif // _MSC_VER > 1000
  12.  
  13.  
  14. // Insert your headers here
  15. #define WIN32_LEAN_AND_MEAN     // Exclude rarely-used stuff from Windows headers
  16.  
  17. #include <windows.h>
  18.  
  19. // TODO: reference additional headers your program requires here
  20.  
  21. #include <stdlib.h>
  22. #include <stdio.h>
  23.   
  24. //{{AFX_INSERT_LOCATION}}
  25. // Microsoft Visual C++ will insert additional declarations immediately before the previous line.
  26.   
  27. #endif // !defined(AFX_STDAFX_H__A8E7B5CF_9C93_4A79_BE47_5711E9E50176__INCLUDED_)
  28.  
  29.  

El proyecto ya va tomando forma, al final, math.h no fue necesaria, cada vez entiendo menos.

Lo que me pasa ahora es que no se como se define CString.

No hay alguna clase de diccionario para saber donde o como se define cada cosa?

Gracias y mas gracias.
Título: Re: Reutilizacion de codigo
Publicado por: m0skit0 en Miércoles 20 de Mayo de 2009, 09:51
Cita de: "RamonVeres"
no se como se define CString.
CString es "cadena de C" y esto es char *.
Título: Re: Reutilizacion de codigo
Publicado por: RamonVeres en Viernes 22 de Mayo de 2009, 03:46
Pero me parece que "Cstring" es un tipo especial de variables, como si fuera "long" o "char", no es un nombre de variable.

Gracias.
Título: Re: Reutilizacion de codigo
Publicado por: m0skit0 en Viernes 22 de Mayo de 2009, 09:25
Cita de: "RamonVeres"
Pero me parece que "Cstring" es un tipo especial de variables, como si fuera "long" o "char", no es un nombre de variable.
¿Y qué he dicho yo, hermano? Es char *.  :lol: