• Lunes 7 de Julio de 2025, 00:14

Mostrar Mensajes

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


Mensajes - diego.martinez

Páginas: 1 ... 4 5 [6] 7 8 ... 12
126
C/C++ / Re: Arreglos unidimensionales!
« en: Lunes 1 de Junio de 2009, 10:22 »
Cita de: "asyba"
y cuando pongo si n == 0 que mediga que no carge nada y si n>0 que haga lo que esta dentro de esas llavaes,,, pero lo que me pasa es que siempre me dice usted no hacargado datos osea me toma n==0 y eh cargado datos..... me ayudan...

si te fijas, en el codigo tu pones :

Código: C++
  1.  
  2.    case 5: mostrar(v,n);
  3.                 break;
  4.  
  5.  

cuando llamas a mostrar , n tiene un valor indeterminado que se carga en el scope de la funcion main.  CERO.

Si quieres que el valor de n se mantenga entre funciones tienes que cambiarlo pasandolo por referencia.

Traduzco: cuando defines una variable, esa variable solo mantiene ese valor en la funcion en la que se crea. Cuando la pasas como parametro, se pasa una COPIA de esa variable. La original no la modificas, luego, n siempre vale lo que valia en Main, cosa que es indefinida.
Cuando modifias n en las funciones estas cambiando una COPIA del valor de n. Al volver a la funcion que la llama , main, la variable "vuelve" a su valor anterior (no vuelve por que nunca cambió, pero bueno).

Para evitar esto, modifica las funciones para usar n por referencia.

Código: C++
  1.  
  2. void cargar(int v[50],int  * n); //le pasamos la DIRECCION de la variable. Modificaremos el CONTENIDO de esa dirección.
  3.  
  4. void cargar(int v[50],int  * n)
  5. {
  6. int NuevaN;
  7.  
  8. ... codigo
  9.  
  10. cin>>NuevaN;
  11. *n=NuevaN; //metemos el nuevo valor en la variable
  12.  
  13. ... codigo de hacer cosas
  14. }
  15.  
  16. //en main la usarias:
  17.  
  18. cargar(v, &n);   //le pasamos la DIRECCION de n por referencia.
  19.  
  20.  
  21.  

Asi , en todas las funciones estarias usando la misma variable, y en main tendrias siempre la n actualizada.
Si tienes dudas sobre el paso de parametros por referencia pregunta. No he querido ser muy extenso.

espero que ayude  :hola:

127
C/C++ / sobrecargar operador []
« en: Lunes 1 de Junio de 2009, 10:10 »
Buenas:

estoy sobrecargando el operador [] en una de mis clases (w32Register : public GRegister) para usarla como un mapa.

Código: C++
  1.  
  2.         w32Register Reg;
  3.     Reg.Open("SOFTWARE\Empresa");
  4.     std::string value=Reg["Root"];
  5.  
  6.  

esto funciona correctamente, la clase abre la carpeta del registro y con el operador [] sobrecargado accedo a los valores. Todo correcto.
pero si hago :

Código: C++
  1.  
  2.  
  3. GRegister * Reg=new w32Register();
  4.  
  5.     Reg->Open("SOFTWARE\AgotekArtek");
  6.     std::string value=Reg["Root"];
  7.  
  8.  
  9.  

Si lo uso dinamicamente, el compilador me tira : error C2107: illegal index, indirection not allowed
 la definicion del operador la he hecho asi:

Código: C++
  1.  
  2. std::string w32Register::operator [](std::string index)
  3. {   
  4.     std::string S;
  5.     char s[200];
  6.     DWORD size=200;
  7.  
  8.     DWORD dwType=0;
  9.     LONG ret=RegQueryValueEx(hKey,index.c_str(),NULL,&dwType,(LPBYTE)s,&size);
  10.     if (ret!=ERROR_SUCCESS)
  11.         return 0;
  12.  
  13.     S=s; //creamos un std::string con el buffer
  14.    
  15.     return S; //lo pasamos por copia
  16. }
  17.  
  18.  

Como puedo hacer que el operador [] funcione con objetos dinamicos?
se que podria hacer (*Reg)["root"] pero preferiria poder acceder directamente con los punteros.

Gracias!!

128
C/C++ / Re: override del operador new
« en: Martes 26 de Mayo de 2009, 15:46 »
buenas, pues al final lo resolví con lo que yo entiendo que es un parche, pero como solo es una herramienta de debug, me viene bien para la verificación y luego se quita para la release.

os pongo como lo he hecho:
Código: C++
  1.  
  2.  
  3. #ifdef _DEBUG
  4.  
  5. #include <new>
  6.  
  7.         void* operator new      (size_t size, const char* file, int line, const char *);
  8.         void* operator new[]    (size_t size, const char* file, int line, const char *);
  9.         void* operator new      (size_t size);
  10.  
  11.         #define DEBUG_NEW       new(__FILE__, __LINE__,__FUNCTION__)
  12.  
  13.         void operator delete    (void * size);
  14.         void operator delete    (void * size, const char* file, int line, const char *);
  15.         void operator delete[]  (void * size, const char* file, int line, const char *);
  16.  
  17.     #else
  18.        
  19.         #define DEBUG_NEW       new    
  20.  
  21.     #endif
  22.  
  23.  
  24.  
  25.  

me defino operadores new con varios argumentos, sin embargo no predefino los argumentos, sino que preparo la macro DEBUG_NEW para llamar a new con los argumentos indicados.
luego , para no tener que cambiar el codigo en el programa:

Código: C++
  1.  
  2. #include <gMemory.h>
  3. #define new      DEBUG_NEW
  4.  
  5.  

Con lo que mis new se convierten en DEBUG_NEW que es lo mismo que new(__FILE__,__LINE__,__FUNCTION__) con lo que cuando se llama a new, se llama a mi operador new sobrecargado. asi, cada vez que se localiza memoria, lo almaceno en un vector, y cuando se llama a delete, uso el puntero para buscarlo en mi lista y eleminarlo, con lo que al terminar la ejecución , los registros del vector me indican que localización de memoria no se liberó.  :good:

Los operadores delete de mas que defino son necesarios para que el compilador no produzca un error al no encontrar el delete correspondiente, aunque no hace falta, ya que con hacer delete del puntero, ya sabremos que registro del vector es el que se elimina.

Es un poco chapuza, pero da el pego. A mi objeto global MEMORY, le he puesto una variable para evitar la reentrancia al localizar nuevos registros y que no me marque estos como localizaciones de memoria. Me falta añadirle sincronización para multitarea.

que os parece?

129
C/C++ / override del operador new
« en: Lunes 25 de Mayo de 2009, 15:59 »
Buenas:

estoy probando a hacer override del operador new para hacerme checkeos de memoria y ver si alguna funcion tiene "leaks".

para ello me he hecho:
Código: C++
  1.  
  2.  
  3. #ifdef _MY_MEMORY_CONTROL_OVERRIDE
  4.  
  5. void* operator new(size_t size)
  6. {
  7.  void *p=malloc(size);
  8.  
  9.  if (p!=NULL)
  10.  if (IsDebuggerPresent())
  11.  {
  12.      char s[100];
  13.      sprintf(s,"Mem: %08x Size: %07d Total:%dn",p,size,MemControl::APP_GlobalMemoryAllocated);
  14.         OutputDebugStringA(s);
  15.  
  16.      MemControl::APP_GlobalMemoryAllocated+=(unsigned long)size;
  17.      MemControl::Add(size,p);
  18.  }
  19.  
  20.  return p;
  21. }
  22.  
  23. #endif
  24.  
  25.  

asi cada vez que se localiza memoria me lo muestra en el output del debugger.

para que me muestre la linea y fichero, le añado:
Código: C++
  1.  
  2. void* operator new(size_t size,char *szFile = __FILE__, UINT nLineNo = __LINE__)
  3.  
  4.  

al hacerlo me muestra los errores :

error C2668: 'operator new' : ambiguous call to overloaded function

por lo visto no sabe diferenciar entre el new de siempre y mi nuevo new, entonces, como puedo forzarle a usar el mio?

130
C/C++ / Re: Stack overflow
« en: Lunes 25 de Mayo de 2009, 10:48 »
que sincronización  :beer:

131
C/C++ / Re: Stack overflow
« en: Lunes 25 de Mayo de 2009, 10:46 »
no, si solo localizas memoria para el array de elementos.

solo tendrás el puntero del array de elementos y no deberías tener que modificar nada del código, ya que el array es a fin de cuentas un puntero.
El array contendra elementos de tipo element que tendrán internamente arrays estaticos.
Código: C++
  1.  
  2. struct element //record for senders
  3. {
  4. char date[10];//The date of the transfer
  5. int amountOfMoney;//the amount of money send
  6. char senderName[500];//the sender name
  7. char receiverName[500];// the receiver name
  8. };
  9.  
  10. element * list;
  11.  
  12. list=new element[3000]; //o tambien list=(element*)malloc(sizeof(element)*3000);
  13.  
  14.  
  15.  

132
C/C++ / Re: imprimir por medio de impresora en c++
« en: Jueves 21 de Mayo de 2009, 16:47 »
umm gotoxy es solo para consolas... no te vale para la impresora

"Mueve el cursor de la ventana de texto a la posición según las coordenadas especificadas por los argumentos x e y. Si las coordenadas no son válidas entonces la llamda a la función gotoxy es ignorada. Los argumentos no pueden ser 0"

cuando haces impresora << ... mandas datos a la impresora y luego, cuando haces Gotoxy cambias el cursor de la pantalla, el cual no tiene nada que ver con la impresora.

Lo mejor es que te hagas un buffer con los datos que quieres mandar a la impresora en memoria, imprimas en memoria los datos y luego vuelques todo el buffer a la vez.

133
C/C++ / Re: Conectar aplicacion con base de datos SQL en hosting web
« en: Jueves 21 de Mayo de 2009, 10:26 »
es diferente.
Tu lo que has instalado es un servidor de Mysql , un programa que escucha en un puerto y si recibe tramas de mysql , las interpreta. Todo correcto.

La API (Aplication Programming Interface) de MySQL es un conjunto de Librerias, Codigo Fuente y DLLs para poder programar aplicaciones que interactuen con servidores Mysql. (Aplicaciones que no necesitan tener a disposición un servidor, ya que por ejemplo, la mia se conecta a un servidor remoto sin necesidad de tener el mysql instalado en mi máquina)

Si intentases ejecutar mi codigo, te dirá que no encuentra definidas esas funciones. Estan definidas en Libmysql.lib y libmysql.dll. Estas librerias te las descargas de la pagina de MySQL , en la seccion de descargas, con el nombre MySQL Connector.

Una vez las tengas, preparas el entorno de programación para usarlas y ale, a programar.

134
C/C++ / Re: Conectar aplicacion con base de datos SQL en hosting web
« en: Miércoles 20 de Mayo de 2009, 12:57 »
a ver, primero te bajas la api de mysql de la seccion de descargas de http://www.MYSQL.com
buscas y te bajas Mysql Connector (en version C y C++) yo particularmente uso la de C por que es la primera con la que me hice, y ya le he hecho una interfaz c++.
Linkas con la libmysql.lib que lleva y pones la dll en el directorio de la aplicación.

En el manual te viene como usar la api,  que funciones tiene y todo eso.
Código: C++
  1.  
  2.  
  3.  MYSQL * Data = mysql_init((MYSQL*) 0); //inicializas mysql
  4.  
  5.     if (!mysql_real_connect(Data,url    ,user,password, NULL,0,NULL,0)) //conectas con el servidor
  6. return false;
  7.                            
  8.     mysql_select_db(Data,DB); //seleccionas la database
  9.  
  10. char SQL[]="select * from tabla";
  11.  
  12.         int r=mysql_real_query(Data,SQL,(unsigned long)strlen(SQL));
  13.     if (r!=0) { return false;}
  14.    
  15.     Res = mysql_store_result(Data) ;
  16. MYSQL_ROW row;
  17. while (row = mysql_fetch_row(Res))
  18. {
  19.     [... hacer cosas con resultados...]
  20. }
  21.  
  22.     mysql_free_result(Res);
  23.  
  24.  
  25.  
  26.  

135
C/C++ / Re: Conectar aplicacion con base de datos SQL en hosting web
« en: Miércoles 20 de Mayo de 2009, 11:30 »
depende de que base de datos sea:
si es MySQL puedes usar la API de MySql (es la que uso yo) http://dev.mysql.com/doc/refman/5.0/en/c.html
si es ODBC tienes bastantes tutoriales al respecto http://www.codeproject.com/KB/database/excel_odbc.aspx

para interactuar con usuarios a través de internet tendrás que aprender a usar sockets. es bastante facil http://www.codeproject.com/KB/IP/beginningtcp_cpp.aspx

Conectarse a una base de datos y a ftp son cosas distintas. El ftp es un protocolo de transferencia de ficheros no de bases de datos, te podria servir para bajarte un archivo que tenga datos, pero lo que es interactuar con una base de datos depende del servidor que la sirve en el ordenador remoto. Lo mejor es que uses la api correspondiente a la base de datos.

136
C/C++ / Re: Reutilizacion de codigo
« 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 .

137
C/C++ / Re: tres en linea sin arreglos ni matrices
« en: Miércoles 6 de Mayo de 2009, 09:47 »
o podrias usar una variable de 32 bits y asignar 2 bits a cada casilla y usar mascaras para saber el estado .  :)

138
C/C++ / Re: Usar hilos pthreads en c++ para este caso
« en: Miércoles 6 de Mayo de 2009, 09:36 »
Cita de: "afrojene"
Por cierto me puedes decir como se haría el cast de void* ese que me comentas??
Pues te cuento, cuando tienes un tipo de dato y quieres hacerlo pasar por otro, se hace Casting. En este caso, si tienes un dato en forma de estructura

Código: C++
  1. MIESTRUCTURA * miST;
  2.  

si quisieras pasar como parametro void* a miST el compilador te diria algo tal que:

cannot convert or there is no suitable conversion from MIESTRUCTURA * to void *.

para pasarlo como parametro tendrias que hacer una conversion a tipo de dato (void*).
Para ello coges el puntero y le especificas el casting escribiendo el tipo de  al que lo quieres pasar entre parentesis, por ejemplo (void *).
Código: C++
  1.  
  2. void * v=(void*)miST;
  3.  
  4.  

entonces en v tendrias un puntero de tipo (void *).

ahora bien, una vez lo has pasado como parametro, en la funcion desconoces el antiguo tipo de dato del parametro con lo que no puedes interpretarlo como estructura, a no ser que vuelvas a hacer un casting.

Código: C++
  1.  
  2. ((MIESTRUCTURA*)v)->Campo_de_la_estructura
  3.  
  4.  
:good:

139
C/C++ / Re: Usar hilos pthreads en c++ para este caso
« en: Martes 5 de Mayo de 2009, 16:37 »
si no me equivoco , al generar los hilos tienes un parametro de tipo void* que se le va a pasar al hilo.
Entonces te preparas una estructura o buffer y se lo pasas en ese parametro.

Código: C++
  1.  
  2. pthread_create(&hilo0, NULL, (void *) &mis_datos_parametro, (void *) &id0);
  3.  
  4.  

yo suelo usar el _beginthread de windows entonces no se exactamente si funcionan igual , pero por lo que he ojeado por internet es parecido.

140
C/C++ / Re: Abrir página web
« en: Miércoles 29 de Abril de 2009, 09:21 »
si solo necesitas llamar al navegador por defecto apuntando a la web (el tipico "ir a la pagina oficial de la empresa") el System que te han dicho.

Sin embargo, si quieres embeberlo en la aplicación hay un articulo:

http://www.codeproject.com/KB/dialog/win32_dialoghelpers.aspx

141
C/C++ / Re: Comunicación entre procesos
« en: Miércoles 29 de Abril de 2009, 09:09 »
muchas gracias, he estado mirando lo del LPC este, aunque creo que al final usare Named Pipes.


Gracias!  :good:

142
C/C++ / Comunicación entre procesos
« en: Lunes 27 de Abril de 2009, 10:24 »
Buenas:

Voy a hacer una aplicacion compuesta de multiples procesos independientes intercomunicados (un estilo a google chrome).
He estado investigando en la msdn, y hay un monton de formas de comunicarse entre procesos:

Clipboard
COM
Data Copy
DDE
File Mapping
Mailslots
Pipes
RPC
Windows Sockets

 asi que la pregunta seria:
cual creeis que es la mejor forma de comunicarse entre procesos?

No es solo notificacion de eventos, tengo que pasar bloques de bastante tamaño entre ellos tambien (como imagenes completas por ejemplo).

Edit: añado, uso Visual C++ para win32 (nada de mfc).
gracias.

143
C/C++ / Re: interfaz gráfica
« en: Jueves 23 de Abril de 2009, 19:34 »
Buenas:

pues si estas trabajando bajo windows y con visual c++ te podrias crear la interfaz usando el propio resource editor del ide.
Despues, lo puedes lanzar usando DialogBox o CreateDialog de la Api de win32.

Para usarlo, solo tienes que crearte un procedimiento de ventana y recibir los mensajes.

este tutorial lo explica todo desde cero:

http://winprog.org/tutorial/

al menos es con el que aprendí.  Si tienes dudas comentame.

144
C/C++ / Re: Heaps
« en: Miércoles 1 de Abril de 2009, 18:22 »
buenas, siento tardar en responder, una semana infernal.

Pues llevaba desde la semana pasada detras de este bug.
Tenias razón con lo del reserve, ya que la excepción se producia cuando los std::strings intentaban liberar la memoria localizada durante el procesamiento en la dll.
Hacer el reserve no me servia, por que estaba empleando los literales como parametros std:string y entonces me requeria modificar muchisimo codigo, asi que lo he pasado de (std::string, std::string *) a un simple (const char *,char *)  y cambiado las funciones internas por strcmp y se ha arreglado.

Muchas gracias.

145
C/C++ / Heaps
« en: Miércoles 25 de Marzo de 2009, 12:38 »
Buenas:

Tengo una aplicación que emplea una dll hecha por mi.
Esta dll realiza unas operaciones interpretando comandos en ascii que se le mandan. Cuando realiza la operación devuelve otro comando con la respuesta.

Para ello he hecho una funcion :

Código: C++
  1.  
  2. GPROTOCOL_API DWORD Execute(const std::string command,std::string * response)
  3. {
  4. std::string s;
  5.  
  6.     s="config";
  7.     if (command.compare(0,s.size(),s)==0)
  8.     {
  9.         *response="0 OK CONFIG";
  10.         int r=0;
  11.         return r;  
  12.     }
  13. }
  14.  
  15.  


este cacho de codigo me produce un assert _CrtIsValidHeapPointer al retornar. El cacho de codigo esta en una dll y al debuguear se ejecuta correctamente hasta que llega al return r;

Segun msdn , dice que el acceso a memoria que realizo no esta dentro del heap.

Es debido al puntero que paso como response?
como puedo forzar a la dll a usar el heap del proceso localizador?

normalmente si localizara algo en la dll usaria HeapAlloc  pero aqui estoy pasando un std::string estatico desde el proceso que linka la dll.

Gracias.

146
C/C++ / Re: Convertidora Binario a otros sist
« en: Jueves 12 de Marzo de 2009, 20:46 »
bueno, si tienes los 0s y 1s en un array, para pasarlo de binario  a decimal solo tienes que ir leyendolos del final al principio y haciendo
mi_valor = mi_valor<<1 | (( array[elemento]=='1') ? 1 : 0);

con esto conviertes cualquier cadena de ceros y unos ascii a un numero, que puede ser decimal o lo que quieras una vez lo tengas en la variable.

147
C/C++ / Re: Problema de visualizacion de Stretchdibits
« en: Jueves 19 de Febrero de 2009, 19:20 »
Muchisimas gracias!

eras asi como se resolvia!

gracias de nuevo eternalidol!
 :lol:

148
C/C++ / Re: Problema de visualizacion de Stretchdibits
« en: Martes 17 de Febrero de 2009, 21:11 »
Buenas:

he descubierto la razon por la que se produce el Skew, (la forma de verse mal) por lo que comentan en los foros, el stretchdibits debe de tener el ancho alineado al DWORD.

Como puedo hacer esto?

EDIT: esto solo ocurre en las imagenes de 32 bits y la mia es de 24, luego no hay que alinear nada, pero se sigue viendo mal.

149
C/C++ / Re: Problema de visualizacion de Stretchdibits
« en: Jueves 12 de Febrero de 2009, 17:06 »
con SetDIBitsToDevice tambien falla :S

150
C/C++ / Problema de visualizacion de Stretchdibits
« en: Jueves 12 de Febrero de 2009, 15:39 »
Buenas:

Trabajando con Win32, tengo una imagen en un buffer rgb (o mejor dicho BGR).

Ese buffer esta correcto, lo pinto pixel a pixel y se ve perfecto. Lo paso a un raw y lo habro con photoshop y perfecto tambien.

Ahora, cuando lo visualizo con stretchdibits aparece con unas muestras erroneas de colores pintado en diagonal como si estuviera la anchura un pixel mas grande.

el codigo que uso es simple.


Código: C++
  1.  
  2. BITMAPINFO  dib;
  3. HDC dc;
  4. BYTE * data;
  5.                                 int w=img->GetWidth();
  6.                 int h=img->GetHeight();
  7.                 //img->Draw(GetDC(hWnd),0,0,w*mul,h*mul);          
  8.                 dc=GetDC(hWnd);            
  9.                 data=img->GetData();               
  10.  
  11.                 memset(&dib,0,sizeof(dib));
  12.                 dib.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
  13.                 dib.bmiHeader.biHeight          = -h; //Alto
  14.                 dib.bmiHeader.biWidth           = w; //Largo
  15.                 dib.bmiHeader.biPlanes          = 1;
  16.                 dib.bmiHeader.biBitCount        = 3*8;
  17.                 dib.bmiHeader.biClrUsed         = 0;
  18.                 dib.bmiHeader.biClrImportant    = 0;
  19.                 dib.bmiHeader.biXPelsPerMeter   =0;
  20.                 dib.bmiHeader.biYPelsPerMeter   =0;
  21.                 dib.bmiHeader.biCompression     = BI_RGB;
  22.                 dib.bmiHeader.biSizeImage       =0;            
  23.  
  24.                
  25.                 if (StretchDIBits(dc,0,0,w,h, 0, 0, w,h, data,&dib, DIB_RGB_COLORS, SRCCOPY)!=h)
  26.                 {
  27.                     //...error
  28.                 }
  29.  
  30.  


este codigo solo falla con ciertos tamaños de imagen. Sin embargo la imagen esta perfecta y los valores de w y h estan correctos, a que puede deberse el error? es un bug de la api?

gracias

la imagen sale asi:


no me pasa con todas solo con algunas, pero la descompresion es correcta.
supongo que tendra que ver con las proporciones o algun dato que no estoy usando bien

Páginas: 1 ... 4 5 [6] 7 8 ... 12