|
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 ... 5 6 [7] 8 9 ... 12
151
« en: Jueves 5 de Febrero de 2009, 16:40 »
es la forma de definir el Orden de un algoritmo, una O mayuscula y luego su valor. El orden de un algoritmo es digamos el numero de iteraciones que debe de hacer para resolverlo. Por ejemplo, pintar una matriz de N columnas y M files tendra Orden MxN o sea, habra que pintar m por n veces. Al ser una matriz cuadrada se pone O:n^2 por que lo vas a hacer n veces columnas y n veces filas. Es solo una forma de expresar la "lentitud" en comparación de un algoritmo. Ejemplos de orden: Acceder a un elemento de un vector por su indice : vector[5] -> O:1 //en una vuelta hecho Buscar un elemento en un array -> O: N por que como mucho habra que iterar N veces donde n es el tamaño del array Buscar en una matriz O: NxM o O:N^2 si es cuadrada Buscar un elemento en un arbol binario de busqueda O: log2N etc etc etc Esto son cosas de ingenieria de software, no son necesarias para saber hacer las cosas  pero te sirven para hacerlas mejor en proyectos grandes.
152
« en: Jueves 5 de Febrero de 2009, 16:07 »
al ser matrizes cuadradas, la suma de las diagonales de O:n en vez de O:n^2 asi que yo lo haria mas eficiente
for (int i=0;i<n;i++) { diagonal1+=m; diagonal2+=m[n-i-1]; }
153
« en: Martes 3 de Febrero de 2009, 10:18 »
para hacerlo por columnas, intercambia en el for los elementos x e y
154
« en: Martes 3 de Febrero de 2009, 10:17 »
depende de como ingreses los datos, quieres pedirle al user los numeros uno a uno o quieres que te de las matrices separadas por espacios: para ello , lo mejor seria que recibas un string entero y luego por cada token lo vayas metiendo en la matriz. Para recibir un string puedes hacer scanf("%s",s); Cojes el array, cuentas el numero de espacios que hay en el para ver el numero de elementos que tienes escritos. una vez sabes cuantos elementos hay, localizas usando malloc una matriz cuadrada de N^2. Luego vas metiendo los elementos usando strtok y strtoi (miralo en google, pero el primero descompone un string en cachos simples y el otro convierte de string a integer) con eso tendras los datos y podras hacer por cada token, el elemento x de la matrix = strtoi(token). no se si me he explicao igual he quedao confuso para sumarlos, simplemente haz un doble for de n elementos y los vas sumando en una variable auxiliar for (int y=0;y<n;y++) { aux=0; for (int x=0;x<n;x++) { aux+=matrix[y] } printf("%d",aux); }
155
« en: Lunes 2 de Febrero de 2009, 01:54 »
Buenas: Tengo una pagina web que funciona correctamente en localhost y en un php 4.3.9 ahora, lo subo a un php 4.4 y me da un problema raro: Cuando logueo, guardo el Login introducido (y verificado) en una session $_SESSION["login"]; cuando vuelvo del formulario, las session es valida y tiene el login por ejemplo $_SESSION["login"]="Diego"; pero, en cuanto salto otra pagina, la session se convierte en $_SESSION["login"]="Object"; os pongo el codigo del login: $s=""; $user_login=""; $user_pass=""; //----- aqui recibo el resultado del formulario if (isset($_REQUEST["user_login"]) && isset($_REQUEST["user_pass"])) //acaba de llegar el post { $_SESSION["login"]=$_REQUEST["user_login"]; $_SESSION["pass"]=$_REQUEST["user_pass"]; } ///------------------- si se marca el ?link=logoff deslogueo if (isset($_GET["link"])) if ($_GET["link"]=="logoff") { unset($_SESSION["login"]); unset($_SESSION["pass"]); unset($_SESSION["id_user"]); } //----------------- compruebo que la session es un usuario valido //esta parte funciona la primera vez, la siguiente no por que $_SESSION["login"]="object" if (isset($_SESSION["login"]) && isset($_SESSION["pass"])) { $q="select * from user_fd where Login="".$_SESSION["login"]."" and Password="".$_SESSION["pass"]."""; $this->Conn->Query($q,"log"); if ($this->Conn->GetNumRows("log")==0) { unset($_SESSION["login"]); unset($_SESSION["pass"]); unset($_SESSION["id_user"]); Jump("index.php?link=logerror"); } else { $row=$this->Conn->GetRow("log",0); $_SESSION["id_user"]=$row["id"]; } } //------------------ Dibujado del Form // if (!isset($_SESSION["login"])) { $s=$s."<form name="".$this->name."" action=".SelfUrl()." method=post>"; $s=$s."<table>"; $s=$s."<tr><td>Login:</td><td><input type="text" id="user_login" name="user_login"></td></tr>"; $s=$s."<tr><td>Contraseña:</td><td><input type="password" id="user_pass" name="user_pass"></td></tr>"; $s=$s."<tr><td align="right"><a href="".SelfUrl()."?link=register" >Registrarse</a></td><td><input align=right type="submit" value="Entrar"></td></tr>"; $s=$s."</table>"; $s=$s."</form>"; return $s; } else { $s=$s."<table>"; $s=$s."<tr><td colspan=2 align="right"> Bienvenido ".$_SESSION["login"]."</td></tr>"; $s=$s."<tr><td colspan=2 align="right"> <a href="".SelfUrl()."?link=logoff">logoff</a></td></tr>"; $s=$s."</table>"; return $s; }
es algun problema de versiones? estoy haciendo algo mal que realmente sobrevive por los pelos en la otra version? gracias att. Diego Martinez
156
« en: Lunes 2 de Febrero de 2009, 01:47 »
perfecto, muchas gracias
157
« en: Viernes 30 de Enero de 2009, 11:40 »
Buenas: Una consulta sencillita: Tengo un string con este formato : Nombre=valor por ejemplo: TYPE=8F y quiero leerlo con sscanf descomponiendolo en 2 strings , para ello hago sscanf(ptr,"%[^=]s=%s",Var,Value);
pero me resulta que solo me lee el primero de los strings :S que hago mal? he estado mirando la sintaxis del sscanf y parece correcto. att diego martinez
158
« en: Miércoles 28 de Enero de 2009, 02:00 »
buenas: Estoy haciendo una sentencia que quiero que me de una lista de los eventos que hay en una tabla. Esta tabla de eventos tiene un id por evento. evento: id int auto_increment, nombre varchar(50) Los usuarios pueden darse de alta a eventos , para ello uso la tabla inscripcion. la tabla inscripcion solo tiene : id int auto_increment id_user int, id_evento int para cruzarlo ahora bien , quiero hacer una sentencia que me de todos los eventos, y ademas EL NUMERO DE USUARIOS que estan inscritos si hago: select evento.nombre,count(inscripcion.id) from evento join inscripcion where inscripcion.id_evento=evento.id me da mal, (mas que nada por que no tengo ni idea de si es siquiera de este estilo lo que quiero hacer). alguien me puede decir como hacerlo? muchas gracias, no se si me he explicado muy bien
159
« en: Jueves 22 de Enero de 2009, 09:55 »
en void calculden(int den1, int den2, int *resulmcm) estas pasando resulmcm como PUNTERO a INT.
luego se lo das a una funcion mcm(den1,den2,dividendo1,resulmcm); <- resultmcm es un puntero
asi que el compilador cree que mcm deberia recibir un puntero a int. Como puedes sobrecargar las funciones, el linkador esta esperando a que hagas una funcion de mcm que acepte punteros a int como parametro. La solucion: refiere el contenido del puntero
mcm(den1,den2,dividendo1,*resulmcm); <- el operador * sirve para referirse al contenido del puntero.
160
« en: Lunes 19 de Enero de 2009, 10:26 »
la condicion del while se ejecuta ANTES del contenido del nido. Asi pues, al entrar en el while (resto<=0) no se ejecuta el nido por que resto puede estar inicializado con otro valor. Usa mejor do { } while(...) ademas, deberias inicializar el resto por si acaso.
161
« en: Lunes 12 de Enero de 2009, 12:28 »
gracias por la respuesta. Pues si, lo probé y seguia igual de mal. Al final buscando he encontrado el fallo: u_long iMode = 1; // <------ el fallo es que no habia entendido bien que parametro se pasaba como iMode. ioctlsocket (Socket, FIONBIO, &iMode);
En la espec pone que iMode debe ser distinto de 0 para que sean non-blocking. Bien la cosa es que se refieren al valor interno, no a la direccion (pensaba que era que si le pasabas null seria blocking) pero hay que poner iMode a 1 para que sean non-blocking de verdad, asi que con eso se solucionó. Gracias igualmente. Nos vemos.
162
« en: Lunes 12 de Enero de 2009, 10:49 »
Buenas: estoy haciendo una comunicación UDP entre 2 equipos. Cuando se produce un evento, el equipo A manda una trama UDP al equipo B que esta en escucha con Bind. Uso select para ver si tengo que hacer recv en el recepctor. Y aqui viene el problema, el receptor a pesar de tener un sleep , me consume el 98% de la CPU. Alguien sabe que hago mal? Os pongo el codigo. //este es el bucle de mensajeria de windows while (!this->IsFinished() && !this->IsRestarting()) { this->Messager(); //translate message, dispatch etc... this->UDPServer->Poll(); Sleep(this->Main_Sleep); //vale 1 MainSleep }
y este es el UDPServer int appIP::InitHost() { //creamos un socket para UDP this->Socket=socket(AF_INET, SOCK_DGRAM, 0); if (this->Socket==SOCKET_ERROR) return 1; //limpiamos nuestra address para hacer de host memset((void *)&Host, ' ', sizeof(struct sockaddr_in)); /* Set family and port */ Host.sin_family = AF_INET; Host.sin_port = htons(Port); /* Get host name of this computer */ gethostname(host_name, sizeof(host_name)); HostProperties = gethostbyname(host_name); //cojemos el nombre de la maquina local /* Check for NULL pointer */ if (HostProperties == NULL) return 1; /* Assign the address */ Host.sin_addr.S_un.S_un_b.s_b1 = HostProperties->h_addr_list[0][0]; Host.sin_addr.S_un.S_un_b.s_b2 = HostProperties->h_addr_list[0][1]; Host.sin_addr.S_un.S_un_b.s_b3 = HostProperties->h_addr_list[0][2]; Host.sin_addr.S_un.S_un_b.s_b4 = HostProperties->h_addr_list[0][3]; /*tenemos la ip , hagamosla string*/ sprintf(StringIP,"%d.%d.%d.%d",Host.sin_addr.S_un.S_un_b.s_b1,Host.sin_addr.S_un.S_un_b.s_b2,Host.sin_addr.S_un.S_un_b.s_b3,Host.sin_addr.S_un.S_un_b.s_b4); TimeOut.tv_usec = msTimeout%1000; TimeOut.tv_sec = msTimeout/1000; // Time in seconds FD_ZERO (&fdSocket); FD_SET (Socket, &fdSocket); //ponemos el socket en vigilancia if (bind(Socket, (struct sockaddr *)&Host, sizeof(struct sockaddr_in)) == -1) { return 1; } return 0; }
Y este es el polling del select. void appIP::Poll() { unsigned int bytes_received=0; int AddrSize=(int)sizeof(struct sockaddr_in); this->fdSocket.fd_count = 1; if ( select(0,&this->fdSocket,0,0,&this->TimeOut) > 0 //hay notificacion && FD_ISSET (this->Socket, &this->fdSocket) //y es nuestro socket ) { bytes_received = recvfrom(this->Socket,(char*) this->Buffer, 100, 0, (struct sockaddr *)&this->Ext, &AddrSize); if (bytes_received>0) { if (this->Events["receive"]!=NULL) this->Events["receive"](this); } } }
no se, al select le he puesto un time out de 1 ms para que la mitad del tiempo este durmiendo la cpu, asi que deberia ir relajado. Quizas estoy manejando mal el select? gracias por anticipado.
163
« en: Lunes 12 de Enero de 2009, 10:41 »
la verdad es que tal como dicen, la recursividad es lo que tiene, que consume pila como ella sola. Publica el codigo, quizas se pueda hacer algun invento para optimizar.
164
« en: Miércoles 7 de Enero de 2009, 11:29 »
no defines el valor de files, si empieza con un numero mayor que alcada no se ejecuta el for
165
« en: Lunes 5 de Enero de 2009, 14:24 »
es el tipico ejercicio de maquina de turing. si son de tamaño distinto no son iguales. por cada elemento del array 1 , buscalo en el aray 2 , y si coincide, borra el elemento del array 2 y continua. al final, encontraras, o bien un elemento que no esta en el array 2 (distintos) o bien acabaras el array1 (iguales). Para i <- 0 hasta NumElementos hacer Para e <- 0 hasta NumElementos hacer Si V1[i] == aux[e] entonces eliminar aux[e]; //borrarlo de la lista, marcarlo cion un caracter diferente , etc... continuar fin SI si (e==numElementos) //se salio del array aux sin encontrarlo error "no son iguales" fin para fin para O:n*n
166
« en: Lunes 5 de Enero de 2009, 11:20 »
veamos: para la primera pregunta, usa una funcion recursiva y como parametro añadele dos punteros a entero. Dentro de la funcion cambias el contenido de los punteros. En uno guardas el nivel en el que estas, y en el otro el nivel maximo al que has llegado. Ex: void SizeBranch ( Node * Nod, int * CurrentBranchSize, int * maxSizeBranch) { //recursividad normal no añadida //... //... //al avanzar un nivel *CurrentBranchSize=*CurrentBranch+1; if( *CurrentBranchSize>*maxSizeBranch) *maxSizeBranch=*CurrentBranchSize; //al hacer return por que no tiene descendencia *CurrentBranchSize=*CurrentBranch-1; //por que volvemos un nivel. }
segunda pregunta: si, la unica diferencia del avl es en la insercion, pero esto deberia valer para cualquier arbol. tercera pregunta: es mas facil que la primera, simplemente pasa 1 integer e incrementalo en cada iteracion. void TreeSize(Node * n, int * size) { // recursividad normal ... *size=*size+1; //esto incrementa size 1 vez por nodo }
167
« en: Lunes 5 de Enero de 2009, 11:09 »
veamos, corregidme si me equivoco, pero creo que el problema radica en que en el caso de los templates, el linkador desconoce como debe linkar la operacion en caso de ser int. Mientras el .h usa T como typo, en algun C debes definir como <int> y decirle que debe hacer. O sea, si lo haces en el .h se compila bien por que se hace el cambio en el propio compilado, sin embargo, el linkador no sabe de que le hablas, asi que debes definir un modulo con la template bien definida , o sea: bool ARBOL<int>::Insertar(int x) { ... } bool ARBOL<float>::Insertar(float x) { ... }
este problema lo encontre yo al usarlas para el compilador IAR. Para otras cosas uso simples .h por que suelen ser operaciones simples. Pero si tienes que usar un modulo .cpp tienes que indicar todos los tipos posibles en los que el linkador se puede encontrar el tema. suerte.
168
« en: Jueves 18 de Diciembre de 2008, 18:03 »
Buenas: Tengo una ventana en Win32 pintada usando StretchDibBits. La cosa es que quiero limpiarla debido a que no siempre pinto en la misma zona. He buscado y no hay ninguna funcion win32 gdi que me permita limpiarla. He probado a pintar un rectangulo encima pero no ha funcionado. Alguien sabe si hay alguna funcion "Clear"? mi codigo: RECT r; GetWindowRect(Marco_Mapa,&r); HBRUSH b=CreateSolidBrush(RGB(255,255,255)); FillRect(hDC,&r,(HBRUSH)(b)); Mapa->Draw(hDC,0,0,200,140); delete(Mapa); DeleteObject(b);
169
« en: Viernes 5 de Diciembre de 2008, 19:04 »
Buenas: tengo un hilo que parece ser qeu da algun problema y "desaparece". Con desaparecer me refiero a que no produce ninguna excepción, no pasa por _endthread ni hace nada raro, sin embargo, el hilo deja de funcionar y ademas desaparece de la lista de threads del spy++. Alguien sabe que puede provocar algo asi? De mientras averiguo la razón, estoy intentando descubrir cuando desaparece para relanzarlo. Para ello, en msdn dicen de usar WaitForSingleObject, sin embargo, cuando se produce esta "desaparición" waitforsingleobject no retorna. He probado tambien con _cwait y pasa lo mismo. Alguien sabe como puedo "vigilar" la permanencia de un hilo?. Gracias. //este es hilo de vigilancia del otro hilo unsigned int __stdcall Watcher(void *) { _cwait(NULL,(intptr_t)app->GetCom()->ReadThread,0); //no detecta la finalización //WaitForSingleObject(app->GetCom()->ReadThread,INFINITE); //no detecta la finalización if (app->IsFinished()==false) MessageBox(0,"HILO DE LECTURA ROTO SIN SOLICITUD",0,0); return 0; }
170
« en: Viernes 28 de Noviembre de 2008, 17:20 »
puedes hacerlo con la api de mysql para c que puedes coger en la pagina oficial de mysql.net
usarla es muy simple, cuando te la instales te ayudo si tienes alguna duda.
171
« en: Viernes 17 de Octubre de 2008, 19:27 »
Buenas: estoy haciendo un motor y estoy intentando aplicar skinning a partir de bones (en algunos lugares lo llaman de otra forma) pero es la deformacion de la malla para mover una malla unica por medio de los bones vamos. La cosa es que aplico este codigo: //---- Dibujamos el mesh int nB=E->GetNBones(); int nV=E->GetNVertex(); _3D * V=E->GetVertex(); //array de vertices _3D v; //vertice x,y,z,w double weight; RenderBone(Bones->Root); //aplico las matrices absolutas de los bones for (int iV=0;iV<nV;iV++) { E->WeightedVertex[iV]=V[iV]; E->WeightedVertex[iV].w=1.0; } for (int b=0;b<E->GetNBones();b++) { KngBone * B=E->GetBone(b); for (int w=0;w<B->GetNWeights();w++) { iV=B->GetWeight(w).n; weight=B->GetWeight(w).w; v=B->Absolute.VectorMatrixMultiply(E->WeightedVertex[iV]); //aqui multiplico la matriz acumulada de todos los bones que afectan a este bone y la aplico sobre el vertice. v.x*=weight; //opero sobre los pesos para saber el verdadero desplazamiento v.y*=weight; v.z*=weight; v.w*=weight; //sumo todos los pesos para tener el vertice bien E->WeightedVertex[iV].x+=v.x;E->WeightedVertex[iV].y+=v.y;E->WeightedVertex[iV].z+=v.z; } } for (ifaces=0;ifaces<nFaces;ifaces++) { glBegin(GL_LINE_STRIP); // Drawing Using Triangles F=Faces[ifaces]; _3D va,vb,vc; va=E->WeightedVertex[F.a]; vb=E->WeightedVertex[F.b]; vc=E->WeightedVertex[F.c]; glVertex3f( va.x, va.y, va.z); glVertex3f( vb.x, vb.y, vb.z); glVertex3f( vc.x, vc.y, vc.z); glVertex3f( va.x, va.y, va.z); glEnd(); }
para obtener las matrices absolutas de los bones antes hago una operacion recursiva void KngRendererBone::RenderBone(KngBone * B) { B->Absolute=*(B->GetMatrix()); //copio la matriz if (B->GetParent()!=NULL) B->Absolute*=B->GetParent()->Absolute; //y la multiplico por la matriz acumulada de su padre for (int e=0;e<B->GetNChilds();e++) RenderBone(B->GetChild(e)); //recursiva }
y la malla se me deforma horriblemente. no se que hago mal, alguien sabe algun tutorial donde expliquen que operaciones hay que producir para que se deforme bien? alguien sabe que puedo estar torciendo? gracias por anticipado, pero buf, tengo el engine parado por esto.
172
« en: Viernes 10 de Octubre de 2008, 09:52 »
si se puede con la directiva #ifndef o #ifdef #ifndef _mytypo #defien _mytypo typedef mytypo ... #endif
173
« en: Martes 7 de Octubre de 2008, 16:40 »
Buenas:
Tengo un problema curioso. Dispongo de un aparato que emite tramas a traves de un puerto de rs232. La cosa es que si al iniciar windows, el dispositivo emite alguna trama, el ratón se vuelve loco y el puerto de comunicaciones se queda bloqueado , como si windows hubiera decidido que este puerto tiene conectado un ratón rs232.
Como se puede evitar que windows interprete el puerto como una interfaz humana?
gracias
174
« en: Domingo 8 de Junio de 2008, 17:38 »
tienes que usar una matriz bidimensional
como char Matrix[20][30] asi podras guardar 20 textos de 30 bytes
para hacer la entrada, en vez de &nombre usas &nombre[indice++]
y luego para mostrarlo lo iteras
me da que lo que te vendria bien para hacer eso son structuras
typedef struct { char nombre[20]; char DNI[10]; char telf[20]; int edad; }REGISTRO;
REGISTRO tabla[20];
e ir metiendo, mirate en google structuras en c
175
« en: Lunes 2 de Junio de 2008, 12:37 »
con las gdi de windows puedes hacerlo, empleando el StretchDibits puedes cambiarle el tamaño y gestionando el TransparentBlt haces que sea transparente hLoc =LoadImage(NULL,s,IMAGE_BITMAP,0,0,LR_LOADFROMFILE | LR_DEFAULTSIZE); SetStretchBltMode(hDC,COLORONCOLOR); SelectObject(memHDC, hLoc); x=((A->GetPosition()).x)+MapaOx; y=((A->GetPosition()).y)+MapaOy; TransparentBlt( hDC, 0+x-15, 0+y-15, 30, 30, memHDC, 0, 0, 30, 30, RGB(255,255,255));
Edito: este codigo es para cargar un BMP para hacerlo con otro tipo, localizas la imagen en un DIB antes...
Páginas: 1 ... 5 6 [7] 8 9 ... 12
|
|
|