elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Tutorial básico de Quickjs


  Mostrar Mensajes
Páginas: 1 2 3 4 5 6 7 8 9 10 [11] 12 13 14 15 16 17 18 19
101  Programación / Java / Re: Agregar un JLabel en tiempo de ejecución en: 30 Julio 2013, 00:46 am
Muchas gracias por responder.

La verdad es que estoy tratando de hacer el juego de la "Snake" (lo he visto como reto en la sección C++, en donde usan las bibliotecas SDL y Allegro, pero quiero intentarlo con Java en modo GUI usando los JFrame, de paso que aprendo sobre este lenguaje, que lo llevaré como curso el ciclo entrante).

Como aún no he avanzado mucho quiero probar antes cómo serían las funciones para agregar un JLabel y que se muestre (esto sería cuando se ha "comido" un objeto determinado y la Snake debe crecer).

Este es el código que he escrito referente a ello:
Código
  1.    private void formWindowOpened(java.awt.event.WindowEvent evt) {                                  
  2.        ArrayList<javax.swing.JLabel> Bloques = new ArrayList<>();
  3.        Bloques.add( new javax.swing.JLabel("/SnakePackage/imgs/body.gif") );
  4.        MyMain.add(Bloques.get(0));
  5.        Bloques.get(0).setLocation(0, 0);
  6.    }    
No estoy totalmente seguro, pero me parece que esta función se activa una sola vez cuando se inicia el programa.
Estoy creando un ArrayList para almacenar allí los JLabel que se vayan creando. Estos JLabel en realidad no contienen texto y son una imagen muy pequeña (10x10px me parece).

Hasta antes conseguía que un JLabel con la misma imagen se moviera (derecha, izquierda, arriba, abajo) según se presionen las teclas correspondientes y allí cambiaba la posición con setLocation(x, y).

El error me dice que un método non-static no puede ser referenciado de un contexto static. ¿Cómo es eso?

Bueno, MyMain es el nombre que le puse al JFrame cuando lo agregué al paquete, pero al parecer no es un JPanel (¿es necesario que cree uno?):
Código
  1. public class MyMain extends javax.swing.JFrame
102  Programación / Java / Agregar un JLabel en tiempo de ejecución en: 30 Julio 2013, 00:06 am
¿Cómo puedo agregar un JLabel en tiempo de ejecución?

Es decir, en el momento de que "suceda algo" quiero que aparezca una imagen en una posición determinada.
Quisiera que el JLabel se cree en ese instante y se muestre en una posición que yo elija basándome en datos que se han obtenido en tiempo de ejecución.
No quisiera respuestas como "créalo oculto y luego muéstralo" porque de seguro es posible crearlo al instante, sólo que no tengo idea de cómo  :silbar:

Gracias de antemano ...
103  Programación / Programación C/C++ / Re: C++ While (No consigo salir del ciclo) en: 29 Julio 2013, 00:01 am
Puedes leerlo en lenguaje humano como: "mientras sea diferente de... y diferente de... y diferente de..."
Es decir, si es diferente de cualquiera de esas palabras van a continuar las iteraciones.

Si usas el operador lógico OR jamás acabaría porque... ser diferente de X o de Y siempre se cumplirá.
Sea cual fuere la entrada, dicha condición siempre será verdadera... porque para ser falsa tendría que ingresarse algo que sea igual a X y Y simultáneamente y eso es imposible porque X y Y son distintos y una expresión (o una variable) no puede tener 2 valores a la vez.
104  Programación / Programación C/C++ / Re: [Opinión] Interesante manera de usar char* con cout en: 25 Julio 2013, 23:43 pm
Los dolores de cabeza se pueden generar en los casos donde esa sustitución no se da, por ejemplo cuando el operando de '&' es un array. Ese operador resulta en la dirección en memoria del objeto y si este es de tipo "T" el puntero resultante es de tipo "T *".
Muchas gracias por responder.
Pero la verdad es que no entiendo mucho a qué se refiere con "dirección en memoria del objeto". Es decir, he revisado los temas de clases y objetos, pero cuando se refiere a un array como objeto, ¿qué debería imaginarme exactamente? ¿Una instancia de una clase que contiene un array?

Agradecería mucho que nos explique un poco más acerca de:
Código
  1. char (*)[12]
O tal vez pueda decirme con qué nombre más o menos buscar este tema.

En este código:
Código
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int main()
  5. {
  6.    char v[]="Probando";
  7.    cout<<v<<endl;
  8.    cout<<&v[0]<<endl;
  9.    cout<<(char*)v<<endl;
  10.    cout<<&v<<endl;
  11.    return 0;
  12. }
Los primeros tres argumentos que se le envían a cout son exactamente lo mismo, ¿verdad?
Es decir, se le envía la dirección en memoria de v[0] y muestra la cadena.
Lo último muestra una dirección de memoria, ¿es la de v[0]?
Antes preguntaba si era la única forma de mostrar por pantalla dicha dirección de memoria.
105  Programación / Programación C/C++ / Re: [Opinión] Interesante manera de usar char* con cout en: 24 Julio 2013, 22:58 pm
Si, es cierto, pero la función que recibe un vector de caracteres no se limita a imprimir ese carácter ... la función que recibe un vector de caracteres va a procesar todos los caracteres del vector hasta que encuentre un carácter nulo.
Me estaba refiriendo a lo que decía el autor del tema.

Entonces he escrito lo siguiente:
Código
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. void something(char *text)
  5. {
  6.    cout << *text;
  7. }
  8.  
  9. int main()
  10. {
  11.    char v[]="Probando";
  12.    cout<<&v<<endl;
  13.    cout<<v<<endl;
  14.    something(v);
  15.    return 0;
  16. }
Y pues, yo creí que pasar como argumento v es lo mismo que pasar &v (pero no es exactamente lo mismo).
Lo primero muestra la dirección de memoria del primer elemento.
Lo segundo imprime toda la cadena como dices.
Pero yo me refería a lo tercero, que sólo muestra el primer caracter (es por el operador de indirección).

Si escribo lo siguiente, sigue mostrando solo la letra 'P':
Código
  1.    char* p = v;
  2.    cout<<*p;
  3.  

Eso quiere decir que cuando a cout le paso v o &v[0] es lo mismo... o incluso si le paso p, pero escribir *p ya le quita la gracia porque muestra el valor del elemento correspondiente a la dirección de memoria (es decir, sólo v[0]).

Entonces podemos decir que v es como un puntero constante a char.
Cuando cout recibe un puntero a char (sea constante o no), muestra el valor apuntado por ese puntero y los valores ubicados en las direcciones de memoria que le siguen, hasta encontrar la marca de fin de cadena.
Pero al escribir &v es como querer obtener la dirección de memoria de algo que ya propiamente es una dirección de memoria y se muestra entonces la dirección de memoria de v[0]. ¿Sería la única forma de mostrar la dirección de memoria de v usando cout?
Si muestro por pantalla &p (donde p es una variable puntero que almacena la dirección de memoria de v[0]) debería pasar lo mismo (pues estoy tratando de obtener la dirección de memoria de una dirección de memoria). Pero al probar esto, la dirección que se muestra es la dirección de la variable puntero, y no se está desreferenciando una dirección de memoria, que es lo que aproximadamente sucede al hacer &v (creo que me estoy haciendo mucho lío en vano :silbar:).

No se me permite hacer algo como:
Código
  1.    p = &v;
Pero sí esto:
Código
  1.    p = &v[0];
  2.    cout<<*p;
  3.  
Y el resultado nuevamente es 'P'.

A ver, cout es una clase de c++. Esta clase tiene varias sobrecargas del operador de inserción ( << ), una para cada tipo de dato soportado.
En realidad cout es un objeto de la clase ostream (o eso es lo que me dice esta referencia).


Y respecto a:
Código
  1. void something(char *text){
  2.    cout<<&(*(&(*(&(*text)))))<<endl;
  3.    cout<<text;
  4. }
En ambos casos te va a mostrar una cadena de texto. A la función que recibe el dato únicamente sabe qué tipo le estás pasando, no entiende de las transformaciones previas que le hayas hecho.
Es porque las transformaciones se hacen previamente y el resultado de dicha expresión es lo que se envía como argumento a cout (ya resuelto), pero eso no implica que yo deba ignorar dichas transformaciones.
Es decir, en este caso se referencia y desreferencia una cantidad igual de veces y luego de hacer todo ello recién muestra lo correspondiente. No es que deba ignorar las transformaciones y fijarme sólo en el tipo de dato que le envío... es decir, si escribiera un & o un * menos, el resultado no sería el mismo (aún cuando las conversiones se estén haciendo sobre un tipo de dato char*).
106  Programación / Programación C/C++ / Re: Ayuda 1pregunta en C/C++ en: 24 Julio 2013, 07:01 am
Código
  1. #include <stdio.h>
  2.  
  3. int funcion2()
  4. {
  5.    return 5;
  6. }
  7.  
  8. int funcion1()
  9. {
  10.   return funcion2();
  11. }
  12.  
  13. int main(void)
  14. {
  15.    printf("%d \n",funcion1() );
  16.  
  17.   getchar();
  18.   return 0;
  19. }
  20.  

- Al inicio se encuentra la declaración y definición de ambas funciones (ello no implica que se ejecuten antes de main(), sólo si son llamadas por esta función principal).
- Desde main() muestras el valor devuelto por funcion1().
- funcion1() devuelve el valor devuelto por funcion2().
- funcion2() devuelve 5.
- Se muestra 5 por pantalla.

Extra.
Por lo general se recomienda escribir antes de main() los prototipos de las funciones. Algo como:
Código
  1. int funcion1();
  2. int funcion2();
Y luego, usualmente después de main(), definir el cuerpo de las funciones, para que no haya conflictos en programas donde usas muchas.

Por ejemplo, en tu programa, si el orden hubiese sido el siguiente:
Código
  1. #include <stdio.h>
  2.  
  3. int funcion1()
  4. {
  5.   return funcion2();
  6. }
  7.  
  8. int funcion2()
  9. {
  10.    return 5;
  11. }
  12.  
  13. int main(void)
  14. {
  15.    printf("%d \n",funcion1() );
  16.  
  17.   getchar();
  18.   return 0;
  19. }
... hubiese errores, ya que al momento en que se define el cuerpo de funcion1() aún no existe funcion2(). Entonces cuando muchas funciones se llamen entre sí, para no estar pendientes del orden, es mejor escribir sus declaraciones (prototipos  :silbar:).
107  Programación / Programación C/C++ / Re: [Opinión] Interesante manera de usar char* con cout en: 24 Julio 2013, 06:46 am
Código
  1. void something(char *text){
  2.    cout << *text;
  3. }

*text es de tipo char... luego cout solo te imprime un carácter.
Cuando se invoca la función y se le pasa como argumento el nombre de un vector de caracteres, realmente se le está pasando la dirección de memoria del primer elemento y por ello sólo muestra el primero, ¿verdad?

Código
  1. void something(char **text){
  2.    cout << *text;
  3. }
Esto es un puntero a otro puntero a char.
Cuando se invoque la función y se le pase como argumento la dirección del primer elemento de un vector de caracteres, dicha dirección de memoria es almacenada en text (variable puntero a puntero). Si escribo *text es como mostrar el valor apuntado por text, que viene a ser un puntero a char. ¿Entonces no debería mostrar la dirección de memoria del vector?

Tal vez puedan explicarme un poco que no lo veo tan simple :S
108  Programación / Programación C/C++ / Re: Duda con structs C/C++ en: 21 Junio 2013, 18:32 pm
Depende, en C++ se puede definir un operador = específico para la estructura [...]

Tal vez no sea muy adecuado preguntar por acá, pero es una pregunta corta:
¿Cómo puedo encontrar más acerca de estos temas?
Es decir, ¿con qué nombre lo busco?

Con ello podría determinar las acciones de usar '+=' en clases que yo mismo vaya creando, ¿verdad?
109  Programación / Programación C/C++ / Re: Video Tutorial Programacion C++ en: 13 Junio 2013, 07:00 am
En este otro enlace hay un tutorial para C++ y funciones recursivas...
https://www.youtube.com/watch?v=Dt3GUEd3wVs
110  Programación / Programación General / Re: ¿Es normal que me aburra de la programación? en: 17 Mayo 2013, 02:58 am
Coincido completamente con el comentario de OmarHack acerca de "no ver resultados a corto plazo".
A mí me gusta aprender cada vez más acerca de la programación. También estoy llevando un estudio de C++ y ya voy entrando a los temas de nivel intermedio. Muchas veces puedo estar concentrado por varias horas, practicando mucho... pero comienzo a estresarme cuando surgen algunos problemas que no puedo resolver, por donde sea que los mire.
En ese instante pierdo temporalmente mi gusto por continuar programando y me dedico a otras actividades.
Luego, cuando nuevamente tengo ganas de programar, por ver las grandes cosas que podría hacer, continuo y llego a resolver los problemas que había dejado pendientes (es decir, mientras pueda hacer pausas, muy largas a veces, porque llevo otros cursos, creo que podré mantener esa afición por programar).
Lo que me impulsa a seguir en esto es pensar en los grandes proyectos logrados por grandes programadores. Aunque me falte muchísimo... el saber que estoy perdiendo el tiempo reflexionando hace que automáticamente me centre en continuar estudiando  ;-)
Páginas: 1 2 3 4 5 6 7 8 9 10 [11] 12 13 14 15 16 17 18 19
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines