• Martes 30 de Abril de 2024, 07:04

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

Páginas: [1] 2
1
C/C++ / Re: Ajedrez Y Damas
« en: Viernes 26 de Marzo de 2004, 18:20 »
Buenas. Esto sería má fácil en visual, pero siendo que es un proyecto de clase intentaré ceñirme lo más posible a C normal. Si alguien ve algun error que me corrija rápidamente ^_^

La intención es crear 2 funciones, una que grabe toda tu matriz del tablero, y otra que la cargue (faltaría implementar como se sabe a quien le toca jugar, pero weno xDD). Ambas devuelve 0 si no hubo prolemas, y -1 si los hubo.

Suponemos que tablero[8][8] es tu matriz, y esta se la pasas a la funcion (recordandomelo yo, al pasar una matriz a una funcion hay que pasarle tambien su tamaño):


int grabar(char tablero[][],int x,int y)
{
FILE * archivo;
int c,z;
archivo = fopen("jedrez.sav","w");
if (archivo==null)
   return -1;
if (! fseek(archivo,0,SEEK_SET))
   return -1;
char * linea;
for (c=0;c<y;c++)
{
for (z=0;z<x;z++)
{
linea[z*2]=tablero[z][c];
linea[z*2+1]=' ';
}
linea[z*2-1]='\0';
fprintf(archivo,linea);
}
return 0;
}

y la funcion de cargar es igual pero en vez de escribiendo leyendo. Si le has pillado el truco podrás escribir la otra funcion, o si lo necesitas te la escribo ^_^

2
C/C++ / Re: Ayuda Urgente
« en: Domingo 21 de Marzo de 2004, 23:14 »
Buenas. Apoyo el no uso del GOTO, la verdad que los tiempos de usar esta sentencia han desaparecido. Ya han dado multitud de razones, asi que lo dejo como esta  :P

Respecto a como salir de dos o mas bucles a la vez.....en mi opinion si esto sucede es una mala planificación de los mismos, y hay que revisar el código, pero me ha ocurrido mas de una vez y para poder continuar y más tarde revisarlo utilizo esta forma:

bool pasalir=true;
for(x=0;x<10 && pasalir;x++)
{
for(y=0;y<10 && pasalir;y++)
{
...
if ("quieressalir") pasalir=false
}
}

pero ya te digo, son métodos que uso hasta q tengo tiempo de depurar el código

3
Retos / Re: El Reto Es Sencillo
« en: Domingo 21 de Marzo de 2004, 22:54 »
Buenas. La verdad que ambas pruebas que presentas no estan del todo ajustadas.

En la primera. Si realizas 64 movimientos es porque en una casillas has pasado 2 veces....se interpreta que tienes que terminar donde empiezas?? La forma de hacerla es fácil, y esta será (creo) la forma más optimizada que hay. Manualmente, antes de programar, te preparas un recorrido circular (es decir, donde piezas acabas) pasando por todos. Una vez tienes el recorrido, y en una matriz de 8*8, y simulando el sistema FAT puedes establecer el camino que ha de seguir. Cuando el usuario te indica en que posicion del tablero esta simplemente lo localiza en la matriz y va realizando el recorrido predeterminado empezando desde la posicion determinada.

La segunda, lo estoy pensando, y ya me perdonarás pero la septima no consigo colocarla de ninguna de las maneras. Pero he pensado poco, con este estaré un poco más xDD

4
Visual C++ / Re: Envío De Mensajes Entre Clases
« en: Jueves 26 de Febrero de 2004, 15:30 »
Buenas. Tengo una solucion un poco rebuscada a tu problema (sin tener que recurrir a threads) pero se tienen que dar varias condiciones:

1) Que trabajes bajo visual c++.net (en versiones anteriores no se si existen los objectos que te voy a comentar).

2) Que trabajes en clases administradas, en MFC no se como va el tema.

3) Que haya comunicacion entre ambas para poder establecer la comunicacion

El sistema consiste en crear una funcion en cada una de las clases que serán las que reciban el mensaje. Y he aqui lo más importante, en cada clase tienes que crear un delegado que apunte a la funcion de la otra clase.

La verdad, la teoría es esta, pero no tengo ni idea de como se crean los delegados xDD.

5
Visual C++ / Re: Help
« en: Miércoles 25 de Febrero de 2004, 12:43 »
Buenas. No te puedo hablar mucho sobre tu problema, pero si te puedo comentar que los errores de links los da por declarar (o incluir) una libreria mas de una vez en un archivo, o por declarar (o incluir) dos que son "incompatibles". Te preguntaras que es esto de incompatibles, pues bien.......tu sabes que cuando incluyes una libreria, esa libreria te deja objetos globales, o funciones. Que pasa si dos librerias diferentes intentan crear un mismo objecto o funcion??? (funcion que no se puede sobrecargar, me imagino que eso se entendio)

En ese caso gramaticalmente no hay errores en el programa, pero te saltan esos errores de linkeo tan molestos.

Espero que te haya servido (y haberme explicado bien) xDD

6
Visual C++ / Re: Clistbox
« en: Martes 24 de Febrero de 2004, 23:55 »
Buenas, con MFC te debería resultar sencillo. No te aparece la opcion directamente de añadir evento de doble click??? O el problema lo tienes en que no te actua a este evento?? Lo unico que te puedo comentar es que si recoges el evento de click simple, el de double click creo que no lo recoge nunca......es lo malo xDD

Luego, he creido entender que quieres poner el evento en cada uno de los objectos que contiene???? No se si eso te será posible. Ponselo al control entero, y cuando ese evento se lance llamaráa tu funcion.....en esa funcion compruebas que elemento esta seleccionado, y llamas a la funcion correspondiente a ese objeto. Creo que será lo mejor en ese caso

Suerte ^_^

7
Visual C++ / Re: Clistbox
« en: Sábado 21 de Febrero de 2004, 17:30 »
Otra cosa que podrías hacer sería lo siguiente:

Te declaras una variable en tu clase, de tipo entero , que tendrá en todo momento el indice de el clistbox. Tus botones tendria que trabajar con este valor en vez de con el valor de clistbox directamente.

Luego, incluyes el evento de onchangeselect (no se ahora muy bien que evento es, pero la idea es esa, un evento que detecte cuando pulses con el raton.

La funcion basicamente lo que tendría que hacer seria usar la variable anterior para cambiar el indice.

Es una forma no de impedir que pulsen, pero por lo menos no puede cambiar el clistbox mas q con tus botones.

Espero q te ayude ^_^

8
Visual C++ / Re: dormir la ejecución de una hebra
« en: Miércoles 18 de Febrero de 2004, 11:03 »
Buenas. Si quieres seguir trabajando con el sleep, y lo que te interesa es un bucle al segundo puedes hacer algo como esto:

Thread * mithread;
...
mithread = new Thread(new ThreadStart(this,this->tufuncion);
...
mithread->start();

eso será la creacion, ahora vamos a la funcion:

void tufuncion()
{
int mili;
int seg;
mili = System::DateTime::get_Millisecond();
while ('el thread se tenga que ejecutar')
{
//aqui haces una vuelta
...
//y ahora para controlar la siguiente vuelta
mithread->sleep(900);//lo mandamos dormir 900 milisegundos, asi tendremos una aproximacion mas certera
seg = System::DateTime::get_Millisecond();
if (seg>mili) mithread->sleep(mili+1000-seg-2);
else mithread->sleep(seg-mili-2);
mili = System::DateTime::get_Millisecond();
}
...
}

El codigo me parece es bastante sencillo. Lo unico son los 2 milisegundos que descansa de menos. En principio es por el tiempoque tarde en volver arriba del while.

Si quisieses conseguir un código portable, y 100% seguro (mejor dicho, 99,9999&) antes del while deberías comprobar cuantos milisegundos tarda en hacer lo que sea. Es decir, la funcion sería algo como:

void mifuncion(){
int mili;
int seg;
int tiempoinvertido;
//primero controlamos el tiempo que tarda
mili = System::DateTime::get_Millisecond();
seg = System::DateTime::get_Millisecond();//en el bucle lo hace con mili
tiempoinvertido=System::DateTime::get_Millisecond();
if (tiempoinvertido<mili) tiempoinvertido=tiempoinvertido+1000-mili;
else tiempoinvertido=tiempoinvertido-mili;
//ahora lo hacemos igual que antes, contando con esta variable
while ('el thread se tenga que ejecutar')
{
//aqui haces una vuelta
...
//y ahora para controlar la siguiente vuelta
mithread->sleep(900);//lo mandamos dormir 900 milisegundos, asi tendremos una aproximacion mas certera
seg = System::DateTime::get_Millisecond();
if (seg<mili) mithread->sleep(seg+1000-mili-tiempoinvertido);
else mithread->sleep(seg-mili-tiempoinvertido);
mili = System::DateTime::get_Millisecond();
}
...
}

Algo asi podría resultar bastante portable xDD. Aunque dependiendo de lo que quieras puedes hacer un bucle un poco diferente y comprobar todo el rato la hora, y a cada cambio de segundo hacer lo que quieras. Yo tengo un programa que para no crear un reloj interno funciono con el de windows. Los sleep los tengo cada 100 milisegundos en principio, aunque esa cantidad la voy cambiando en tiempo de ejecucion dependiendo de la cantidad de milisegundos que queden para pasar de segundo (es decir, siempre hago 10 vueltas xDD)

Espero q te sirva, suerte ^_^

9
C/C++ / Re: Funcion No Recursiva (arboles)
« en: Domingo 15 de Febrero de 2004, 21:08 »
Buenas. No se a que te refieres. En principio eliminar una recursividad depende de la propiea recursividad. Hay algunas que con un bucle for o while se pueden romper, pero para otras se necesitan utilizar varias de estas estructuras, anidarlas, y utilizar algunas variables y/o vectores extras.

Si quieres coloca tu funcion recursiva e intentaré romperla.

10
Visual C++ / Re: Duda con las variables STATIC y la función FindText
« en: Viernes 13 de Febrero de 2004, 23:18 »
Buenas. Lo de la pereza no lo habia pensado xDD.

Lo que me comentas, en ningun caso esa memoria se reutilizaría, puesto que la funcion devuelve la estructura. En todo caso habría que adaptar el principal para que recoja la estructura de forma que no se pierda. Pero bueno, lo que quieras.

En todo caso, si como comentas no quieres acceder a ella para nada, no hace falta que guardes la estructura. Ten encuenta que en C no existe recolector de basura como en java (para quienes no sepan de lo que hablo, en java hay un recolector que elimina las zonas de memoria usadas A LAS QUE NO SE HACE REFERENCIA), por lo que la estructura en cuestion no desaparecería de memoria hasta que ella misma se elimine.

11
C/C++ / Re: Modificando Una Cadena
« en: Viernes 13 de Febrero de 2004, 22:04 »
buenas. El problema es lógico que lo de en ejecucion, puesto que el puntero lo estas moviendo. Intenta ejecutar cambiando el modo en que recorres la cadena, me refiero

void modifica(char* p)
{
int x=0;
while(*(p+x)!='\0')
{
*(p+x)=funcion(*(p+x));
x++;
}
}


Asi te debería de funcionar, puesto que a la hora de volver al principal el puntero no lo has modificado, simplemente el contenido.

Suerte ^_^

P.D: Puedes utilizar p
  • en vez de *(p+x)

12
Visual C++ / Re: Duda con las variables STATIC y la función FindText
« en: Viernes 13 de Febrero de 2004, 00:01 »
Buenas. Otra solucion que puedes utilizar es hacer que la funcion te devuelva el puntero a la estructura en cuestion, de esta forma nunca perderías el acceso.

El codigo podría ser algo como:
Código: Text
  1.  
  2. FINDREPLACE* miFuncion(){
  3.  
  4. FINDREPLACE findreplace;
  5. ...
  6. FindText(&findreplace);
  7. return &findreplace;
  8. }
  9.  
  10.  

Respecto ha si hay gente que responde, tiendo a pensar que cuando la gente lo sabe responde, si nadie responde es pq nadie sabe xDD.

13
Retos / Re: Division Sílabica
« en: Jueves 5 de Febrero de 2004, 10:04 »
Buenas. Yo la verdad al principio intenté empezarlo, incluso comenté la solución al sublime que espero os ayudase. Pero por diferentes razones debí de dejarlo puesto que el proyecto del cyber me lleva bastante tiempo. Eso si, al siguiente reto le daré duro desde el principio (si puedo xDD)

Por cierto, se que esto no es visual c++.net, pero alguno sabe como conectar dos programas sin usar MFC??

GRACIAS

14
Visual C++ / Sockets Bajo Visual C++.net
« en: Martes 3 de Febrero de 2004, 00:03 »
Buenas. No es la primera vez que hago esta pregunta, pero ha llegado un momento que mis conocimientos sobre el tema no dan de sí. Adjunto el código que tengo hasta ahora. Si alguien pudiese ayudarme a hacer funcionar los sockets sin MFC se lo agradecería ^_^.

La historia de los Threads es provisional mientras encuentro otra forma de poedr usar la clase administrada desde la no administrada (por problemas de herencia).

Aprobecho, en otro mensaje me nombraron algo de Factory  de clases administradas y no administradas. Alguien me peude exlpicar  es??

GRACIAS

15
Visual C++ / Re: No Compila...!!!
« en: Domingo 1 de Febrero de 2004, 12:33 »
Vete a la carpeta donde tienes tu proyecto, y verás que te ha creado una carpeta debug. Eliminala. Ahora dale a compilar, y te debería de ir. ^_^

16
Visual C++ / Re: Necesito Clases Estáticas
« en: Sábado 31 de Enero de 2004, 01:05 »
Buenas. Sencillo versatil y flexible.....esas tres palabras las entendí y me gustaron, pero lo que me dijiste de "Factory de Objetos de clases administradas y no administradas" no entendí nada. Si no te importa explicarme un poco de que va el tema, y un ejemplo si fuese posible......

GRACIAS.

17
Otros CLR / Clase Estatica
« en: Miércoles 28 de Enero de 2004, 20:17 »
Buenas. Necesito utilizar una clase statica administrada para poder pasar datos entre una clase administrada y una no administrada (por cuestiones de herencia). De la clase administrada tengo acceso directo a la no administrada.

He puesto la misma consulta en el otro foro destinado a visual c++, pero lo pongo aqui por si alguien entra xDD

18
Visual C++ / Necesito Clases Estáticas
« en: Miércoles 28 de Enero de 2004, 17:09 »
Buenas. Actualmente tengo un programa que utiliza clases administradas y no administradas. Necesito un intercambio de datos entre ellas en ambas direcciones. De la administrada a la no administrada es facil, puesto que puedo crear un objeto de esa clase y por medio de una funcion pasarle referencia. Pero al reves no es tan facil, pues en la no administrada no puedo crear un objeto administrado para conseguir acceso.

He estado mirando otra maneras, pero la unica forma viable que veo es creando un clase estatica administrada, crear ahi un objeto que me de acceso de la clase no administrada a la administrada.

Que piensan?? Alguna solución???

19
C/C++ / Re: Ayuda Con Ejercicio
« en: Lunes 26 de Enero de 2004, 12:24 »
Buenas. Se que esto es el foro de "principiantes", pero no es el foro de "resuelvanme mis ejercicios". Si tienes una duda CONCRETA sobre el ejercicio hazla, pero no pongas el ejercicio completo.

Si el problema que tienes es que el conjunto del ejercicio lo ves demasiado grande, tómatelo con calma y pasito a pasito, me explico. Hazte subejercicios y luego juntalos todos en uno. Primero hazte un programa que pida 10 nombres, tu los recojes en un vector, y los visualizas. Una vez lo tengas, create un programa que visualice numeros enteros, entre el 1 y el 10. Una vez lo tengas, una matriz que se rellene utilizando dicha funcion.......despues a contar aprobados y suspensos........despues a ordenar por aprobados, y despues por suspensos.

He tenido que ayudar a muchas personas con la programación, realmente es un tema que a muchas personas que no les gusta les cuesta porque no le ven el truco. Cuando a ti te dan un ejercicio lo primero que hay que hacer no es ponerse a programar, sino dividir el problema en ejercicios más fáciles. Las personas más experimentadas, que les gusta el tema y realmente son expertas, este paso se lo saltan puesto que ya tienen la cabeza acostumbrada a ese "divide y vencerás".

Bueno, suerte con el ejercicio. Y si tienes alguna duda pregunta, pero recuerda, duda concreta pls ^_^

20
Visual C++ / Re: Necesito Codigo
« en: Domingo 25 de Enero de 2004, 03:07 »
Buenas. Existen (conozco) varias formas de hacer ordenaciones numericas. A continuación te pongo 2 que conozco. La primera es lenta, el codigo es poco depurado, y seguramente es la primera que hayamos estudiado todos xDD. La segunda es un poco más avanzada y no va tan lenta. Hay mas rapidas pero ahora no me acuerdo, quizás alguien más experimentado te las diga ^_^

FORMA 1[/u][/b][/size]
int numeros[10];
int aux;
int x;
bool y=false;
//pides los 10 numeros
.....
//ahora a ordenar
while (!y)
{
y=true;
for (x=0;x<9;x++)
{
if (numeros
  • >numeros[x+1])

{
y=false;
aux=numeros
  • ;

numeros
  • =numeros[x+1];

numeros[x+1]=aux;
}//if
}//if
}//while


FORMA 1[/u][/b][/size]
int numeros[10];
int aux;
int x;
int y;
//pides los 10 numeros
.....
//ahora a ordenar
for (y=0;y<10;y++)
{
for (x=y+1;x<10;x++)
{
if (numeros[y]>numeros[y])
{
aun=numeros[y];
numeros[y]=numeros
  • ;

numeros
  • =aux;

}//if
}//for(x)
}//for(y)

Cualquiera de las dos formas te vale............aunque te recomiendo si nadie te da ninguna mejor la ultima. Si la usas pocas veces el tiempo no se notará, pero es mas rápida esta ultima (o mejor dicho, no tan lenta xDD)

21
Visual C++ / Re: Varias Dudas
« en: Jueves 22 de Enero de 2004, 17:41 »
No, no sirve. Estoy en una clase administrada, asi ue si intento poner
constant __wchar_t misChar;
misChar=miString->getChars();
me salta un error al compilar que me indica que no se reconoce como funcion, y por lo tanto no rula de ninguna manera.

Alguna idea mas??

22
Visual C++ / Re: Varias Dudas
« en: Jueves 22 de Enero de 2004, 11:38 »
Buenas. Lo primero darte las gracias por sendas respuestas. La primera no me sirve puesto que utilizo System::String en vez de std::string, si tienes alguna otra solucion...pero gracias ^_^.

Respecto al socket, gracias asi en principio compila xDD aunque ya encontré ayer un manual que viene bastante bien explicado. He de crear una clase que herede de la clase CSocket y ya tengo todo solucionado xDD

Pero gracias. xDD

23
Visual C++ / Varias Dudas
« en: Miércoles 21 de Enero de 2004, 21:36 »
Pues eso, tengo dos problemas y me gustaría a ver si me podeis ayudar.

El primero no es muy complicado, simplemente me gustaría saber como recorrer cada uno de los caracteres de un String. La unica solucion que me han dado hasta ahora es escribir el string en un fichero de texto, y leerlo caracter a caracter. Esta solucion en principio estaría bien, pero teniendo en cuenta que el proceso va a ser repetitivo el tiempo de ejecución aumentaría en sobremanera, por lo que es una opcion "poco" viable. A ver si alguien sabe como solucionar esto xDD.

El siguiente es un tema más complicado. Me gustaría conocer un poco el tema de conexiones de Sockets, para hacer una aplicacion cliente/servidor sencillita en un principio, y luego ya se verá. Demomento he visto por inet y el codigo que he encontrado es el siguiente:

Código: Text
  1.  
  2. WSADATA g_DatosWS;
  3. SOCKET g_Socket;
  4. sockaddr_in g_DirRemota;
  5. sockaddr g_DirRemot;
  6. if(WSAStartup(MAKEWORD(1, 1), &g_DatosWS) != 0)
  7. {
  8.     Console::WriteLine(&#34;ERROR NO SE PUDO HACE NA&#34;);
  9. }
  10. else
  11. {
  12.     g_Socket = socket(AF_INET, SOCK_STREAM, 0);
  13.     if(g_Socket == INVALID_SOCKET)
  14.   Console::WriteLine(&#34;No puedo crear el socket&#34;);
  15.     else
  16.     {
  17.   g_DirRemota.sin_addr.s_addr = inet_addr(&#34;192.168.X.X&#34;);
  18.   g_DirRemota.sin_port = htons(80);
  19.   if (connect(g_Socket,g_DirRemota,??)==0)
  20.     Console::WriteLine(&#34;Conexion establecida correctamente&#34;);
  21.   else
  22.     Console::WriteLine(&#34;Fallo en el ultimo momento&#34;);
  23.     }
  24. }
  25.  
  26.  
Pero el problema que tengo en este codigo es justo en la funcion Connect, puesto que el segundo parametro debería ser sockaddr y en el manual que tengo utiliza sockaddr_in (y no lo convierte automaticamente). Despues tengo problema con el tercer argumento, que se supone es el el tamaño pero ni idea de como hayarlo xDD.

Si alguien me puede ayudar se lo agradeceré ^_^

24
C/C++ / Re: Ayuda Please !
« en: Miércoles 21 de Enero de 2004, 13:07 »
Buenas. Lo unico que debes de tener claro en esas funciones porque "se sale un poco de lo normal" por asi decirlo, el la resta de caracteres. En una resta, por ejemplo "a"-"H" lo que ocurre es que pasa ambas cadenas a numeros mediante la tabla ascii, y de esa forma puede realizar la resta.  Sabiendo eso el ejercicio te debería resultar facilón ^_^

25
C/C++ / Re: Trabajo Con Enteros
« en: Miércoles 21 de Enero de 2004, 12:59 »
Aqui tienes ambas funciones:

int primeraCifra(int num)
{
return (num%10);
}
int ultimaCifra(int num)
{
while (num>=10)
     num=(num-num%10)/10;
return num;
}

Páginas: [1] 2