|
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
« en: Lunes 1 de Junio de 2009, 10:22 »
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 : case 5: mostrar(v,n); break;
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. void cargar(int v[50],int * n); //le pasamos la DIRECCION de la variable. Modificaremos el CONTENIDO de esa dirección. void cargar(int v[50],int * n) { int NuevaN; ... codigo cin>>NuevaN; *n=NuevaN; //metemos el nuevo valor en la variable ... codigo de hacer cosas } //en main la usarias: cargar(v, &n); //le pasamos la DIRECCION de n por referencia.
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
127
« 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. w32Register Reg; Reg.Open("SOFTWARE\Empresa"); std::string value=Reg["Root"];
esto funciona correctamente, la clase abre la carpeta del registro y con el operador [] sobrecargado accedo a los valores. Todo correcto. pero si hago : GRegister * Reg=new w32Register(); Reg->Open("SOFTWARE\AgotekArtek"); std::string value=Reg["Root"];
Si lo uso dinamicamente, el compilador me tira : error C2107: illegal index, indirection not allowed la definicion del operador la he hecho asi: std::string w32Register::operator [](std::string index) { std::string S; char s[200]; DWORD size=200; DWORD dwType=0; LONG ret=RegQueryValueEx(hKey,index.c_str(),NULL,&dwType,(LPBYTE)s,&size); if (ret!=ERROR_SUCCESS) return 0; S=s; //creamos un std::string con el buffer return S; //lo pasamos por copia }
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
« 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: #ifdef _DEBUG #include <new> void* operator new (size_t size, const char* file, int line, const char *); void* operator new[] (size_t size, const char* file, int line, const char *); void* operator new (size_t size); #define DEBUG_NEW new(__FILE__, __LINE__,__FUNCTION__) void operator delete (void * size); void operator delete (void * size, const char* file, int line, const char *); void operator delete[] (void * size, const char* file, int line, const char *); #else #define DEBUG_NEW new #endif
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: #include <gMemory.h> #define new DEBUG_NEW
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ó. 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
« 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: #ifdef _MY_MEMORY_CONTROL_OVERRIDE void* operator new(size_t size) { void *p=malloc(size); if (p!=NULL) if (IsDebuggerPresent()) { char s[100]; sprintf(s,"Mem: %08x Size: %07d Total:%dn",p,size,MemControl::APP_GlobalMemoryAllocated); OutputDebugStringA(s); MemControl::APP_GlobalMemoryAllocated+=(unsigned long)size; MemControl::Add(size,p); } return p; } #endif
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: void* operator new(size_t size,char *szFile = __FILE__, UINT nLineNo = __LINE__)
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
« en: Lunes 25 de Mayo de 2009, 10:48 »
que sincronización
131
« 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. struct element //record for senders { char date[10];//The date of the transfer int amountOfMoney;//the amount of money send char senderName[500];//the sender name char receiverName[500];// the receiver name }; element * list; list=new element[3000]; //o tambien list=(element*)malloc(sizeof(element)*3000);
132
« 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
« 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
« 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.combuscas 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. MYSQL * Data = mysql_init((MYSQL*) 0); //inicializas mysql if (!mysql_real_connect(Data,url ,user,password, NULL,0,NULL,0)) //conectas con el servidor return false; mysql_select_db(Data,DB); //seleccionas la database char SQL[]="select * from tabla"; int r=mysql_real_query(Data,SQL,(unsigned long)strlen(SQL)); if (r!=0) { return false;} Res = mysql_store_result(Data) ; MYSQL_ROW row; while (row = mysql_fetch_row(Res)) { [... hacer cosas con resultados...] } mysql_free_result(Res);
135
« 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.htmlsi es ODBC tienes bastantes tutoriales al respecto http://www.codeproject.com/KB/database/excel_odbc.aspxpara 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.aspxConectarse 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
« 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
« 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
« en: Miércoles 6 de Mayo de 2009, 09:36 »
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 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 *). 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. ((MIESTRUCTURA*)v)->Campo_de_la_estructura
139
« 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. pthread_create(&hilo0, NULL, (void *) &mis_datos_parametro, (void *) &id0);
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
« 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
« 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!
142
« 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
« 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
« 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
« 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 : GPROTOCOL_API DWORD Execute(const std::string command,std::string * response) { std::string s; s="config"; if (command.compare(0,s.size(),s)==0) { *response="0 OK CONFIG"; int r=0; return r; } }
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
« 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
« en: Jueves 19 de Febrero de 2009, 19:20 »
Muchisimas gracias! eras asi como se resolvia! gracias de nuevo eternalidol!
148
« 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
« en: Jueves 12 de Febrero de 2009, 17:06 »
con SetDIBitsToDevice tambien falla :S
150
« 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. BITMAPINFO dib; HDC dc; BYTE * data; int w=img->GetWidth(); int h=img->GetHeight(); //img->Draw(GetDC(hWnd),0,0,w*mul,h*mul); dc=GetDC(hWnd); data=img->GetData(); memset(&dib,0,sizeof(dib)); dib.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); dib.bmiHeader.biHeight = -h; //Alto dib.bmiHeader.biWidth = w; //Largo dib.bmiHeader.biPlanes = 1; dib.bmiHeader.biBitCount = 3*8; dib.bmiHeader.biClrUsed = 0; dib.bmiHeader.biClrImportant = 0; dib.bmiHeader.biXPelsPerMeter =0; dib.bmiHeader.biYPelsPerMeter =0; dib.bmiHeader.biCompression = BI_RGB; dib.bmiHeader.biSizeImage =0; if (StretchDIBits(dc,0,0,w,h, 0, 0, w,h, data,&dib, DIB_RGB_COLORS, SRCCOPY)!=h) { //...error }
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
|
|
|