Menú

Mostrar Mensajes

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

Mostrar Mensajes Menú

Temas - Seyro97

#1
Hola, muy buenas. Con el fin de investigar un poco sobre la preferencia entre operadores, hice el siguiente programa:

Código (cpp) [Seleccionar]
#include <iostream>

int Mostrar(const char *lpszMensaje);

int main() {
    //(*(int *)(&(std::cout << "Izquierda->"))) + (*(int *)(&(std::cout << "Centro->"))) * (*(int *)(&(std::cout << "Derecha->")));
    Mostrar("Izquierda->") + Mostrar("Centro->") * Mostrar("Derecha->");

    std::cin.get();
    return 0;
}

inline int Mostrar(const char *lpszMensaje) {
    std::cout << lpszMensaje;

    return 0;
}


Lo que yo me esperaba es que se ejecutara Mostrar("Centro->") * Mostrar("Derecha->"), y después Mostrar("Izquierda->") más el resultado anterior, ya que el operador * tiene preferencia sobre el +, pero la salida del programa ha sido la siguiente:

Izquierda->Centro->Derecha->

Es decir, que ¿en teoría se habría ejecutado primero la suma, y después el producto? No lo entiendo... Si alguien me lo pudiera explicar... Gracias!

PD.: En el compilador he puesto que no optimice el código. Comando usado:

g++ -o main.exe main.cpp
Trabajando con MinGW-w64 desde Windows
#2
Hola a tod@s. La cosa es que estaba experimentando con las librerías Standard 'chrono.h' y 'thread.h' de C++11, usando el compilador de VC2015 de 64 bits. El problema es que al decirle que espere un milisegundo con la función 'std::this_thread::sleep_for(std::chrono::milliseconds(1))', el programa dice que espera entre catorce y quince milisegundos.

Código (cpp) [Seleccionar]
#include <iostream>
#include <thread>
#include <chrono>
#include <windows.h>

int main() {
std::chrono::high_resolution_clock::time_point cStartTime, cEndTime;
long long lTimeElapsed;

while(true) {
cStartTime = std::chrono::high_resolution_clock::now();
//std::this_thread::sleep_for(std::chrono::milliseconds(1));
Sleep(1);
cEndTime = std::chrono::high_resolution_clock::now();

lTimeElapsed = std::chrono::duration_cast<std::chrono::milliseconds>(cEndTime - cStartTime).count();

std::cout << "Time elapsed: " << lTimeElapsed <<  "ms" << std::endl;
}

std::cout << "\nEl programa ha terminado";

std::cin.get();
return 0;
}


Nota: La función Sleep y 'std::this_thread::sleep_for(std::chrono::milliseconds(1));' dan los mismos resultados

Aquí una captura de la salida:
#3
Hola, quiero convertir caracteres codificados en UNICODE (8 Bits) a la codificación que usa la consola de Windows (descritos en la página de código 437, pincha aquí para verla) usando el programa Notepad++. Gracias
#4
Hola a tod@s. La pregunta es la siguiente: ¿cómo podría empaquetar todas las DLLs incluidas en el directorio (por defecto) "C:\MinGW\bin" usando el comando g++? Para así no tener que andar poniendo las DLLs en la carpeta del programa cuando vaya a otro ordenador sin MinGW. Gracias
#5
Hola a tod@s. Para investigar un poco la relación entre C++ y ASM he estado obteniendo códigos ASM usando el comando "g++ -S -Wall -o main.s main.cpp". La pregunta es: ¿cómo puedo pasar ese código en ensamblador a un ejecutable (la función main está en el código)?
#6
Hola. La pregunta viene del siguiente problema que me he planteado: quiero hacer un representador de funciones. El usuario ha de introducir una función cualquiera [ f(x)  = ...].

La idea que he tenido es convertir el string en código máquina (siguiendo una sintaxis xD)

La función en primera instancia se vería así:

Código (cpp) [Seleccionar]
float funcion(float x) {
       // Aquí se insertaría el código en código máquina
       
       return x;
}


Después de que el usuario haya introducido la función f(x) = x + 2, la función (en C++, Visual Studio)  se vería así:

Código (cpp) [Seleccionar]
int funcion(int x) {
_asm {
add x, 2
};

return x;
}


PD.: Quiero usar registros de 32 bits

Gracias
#7
Hola a tod@s. El problema que tengo es que al acceder al último término de una matriz generada con 'malloc', el programa deja de funcionar.

Código (cpp) [Seleccionar]
matriz = (int **)malloc(orden * sizeof(int));

if(matriz == (int **)0) {
printf("Error asignando memoria a la matriz (primer paso)");
return 0;
}

for(int i = 0; i < orden; i++) {
matriz[i] = (int *)malloc(orden * sizeof(int));

if(matriz[i] == (int *)0) {
printf("Error asignando memoria a la matriz (segundo paso)");
return 0;
}
}


La variable 'matriz' es de tipo 'int **'. Cuando intento cambiar el valor de 'matriz[orden - 1][orden - 1], el programa se cierra inesperadamente (Windows). Estoy compilando con MinGW usando el siguiente comando:
Código (cpp) [Seleccionar]
gcc -Wall -std=c99 -o main.exe main.c

No me salta ningún 'Warning'.

La parte donde cambio los datos de la matriz es:

Código (cpp) [Seleccionar]
int tempValue;
int *tempPointer;

for(unsigned int fila = 0; fila < orden; fila++) {
for(unsigned int columna = 0; columna < orden;) {
printf("\nIntroduzca el elemento fila %u columna %u: ", fila, columna);

if(scanf("%i", &tempValue) == EOF) {
printf("\nLa proxima vez introduzca un numero valido.");
} else {
tempPointer = matriz[fila];
tempPointer[columna] = tempValue;

columna++;
}
}
}

Según el debugger, el programa crashea en
#8
Hola foro.elhacker.net!.

Tengo una sugerencia que seguro que a mas de uno le interesa: La idea es añadir un nuevo subforo a Foros Generales dedicado a las matemáticas (dudas de mates, álgebra y demás). Esto lo veo útil porque tanto en programación (ya sea de videojuegos, o emuladores de físicas) como en Seguridad Informática (codificación, sucesiones, algoritmos...) puede llegar a ser útil.

¡Muchas gracias por leerme!
#9
Hola, muy buenas a tod@s. Resulta que estaba intentando crear un documento con codificación ASCII extendido (seleccionando la opción ANSI), pero se guarda en UNICODE. Prueba de ello es que al guardar un documento con el carácter á este se guarda en hexadecimal como 0xE1 (225 en decimal), por lo que corresponde a la codificación en UNICODE (Creo que UTF-8). Entonces la pregunta es: ¿Cómo puedo guardar un documento con Notepad++ codificado en ASCII extendido? Gracias
#10
ASM / (Consulta) Acceder a la memoria de vídeo
15 Agosto 2015, 08:53 AM
Hola, muy buenas a tod@s. La pregunta me parece que es simple de comprender: ¿Se puede acceder a la parte de la memoria de vídeo la cual almacena el mapa de bits de la pantalla? Me explico: quiero acceder a la parte de la memoria que contiene el estado de los píxeles de la pantalla. Gracias
#11
Hola, muy buenas a tod@s. Me gustaría empezar a crear videojuegos. Sé C++, pero me parece un lenguaje demasiado largo (muchas lineas a escribir) para mi solo. Por ello, me pregunté si usar Java. Esta decisión va a depender de la lista que se vaya creando en las respuestas a esta pregunta.

PD.: Ya conozco MineCraft
#12
Hola, muy buenas a tod@s. El caso es que estoy haciendo un videojuego y quiero añadirle sincronización vertical. Para ello, me gustaría contar el tiempo que ha tardado el programa en procesar un fotograma y hacer una función de espera para que me vaya a, por ejemplo, 85 fotogramas por segundo (esa es la frecuencia de mi monitor :P).

Muchas gracias!
#13
Hola, muy buenas a tod@s. Me preguntaba que por qué un procesador de 32 bits solamente soporta 2 GB de RAM.

Me pregunto esto porque un puntero compilado con un compilador de 32 bits ocupa 32 bits. Por lo tanto, dicho puntero puede apuntar a 2^32 (dos elevado a 32) posiciones. Entonces, si divido ese numero de posiciones entre 2^30 (representa 1 GB), me da 4 como resultado, es decir, que puedo apuntar sin problemas a todos los bytes de esos 4 GB.

Espero que se entienda y que se aclare mi duda :D. Gracias por pasaros
#14
Hola, muy buenas. Contextualizo: debido a la curiosidad, quise saber como se construía en binario las variables flotantes, y de donde venía eso de 'coma simple'. Buscando, encontré que es un estandar (Estandar IEEE 754). Encontré que el primer bit corresponde al signo, los 8 siguientes al exponente (cuya base es 2) y la mantisa ocupa el resto de los 32 bits que ocupa estas variables de este tipo (la mantisa es el número quitandole la coma). Ahora bien, ¿que pasa con las variables de tipo flotante que no tienen signo (unsigned float)? ¿que hacen con el bit del signo? ¿Es ignorado o es aprovechado?

Muchas gracias
#15
Hola, muy buenas a tod@s. La duda es la siguiente: ¿como hace un juego para que se le puedan meter mods? Pongo un ejemplo: Tenemos un juego que va de disparos, al cual se le pueden meter mods para tener mas armas, o que las armas hagan cosas especiales (lanzar balas con forma de arco iris XD). Explico mejor mi duda: En C++, como se puede hacer que un ejecutable admita mas código, es decir, como hace para que se le pueda insertar código.

Espero haberme explicado, y gracias por sus respuestas
#16
Hola, muy buenas.

La duda viene de que supuestamente un programa no puede acceder a la memoria RAM que no use el programa en sí (por el tema del procesador con modo de protección). Partiendo de aquí, como hace Cheat Engine para poder visualizar e incluso cambiar los valores de cualquier parte de la memoria RAM?

Gracias
#17
Hola, muy buenas a tod@s. Me gustaría saber si conocen algún tutorial (a ser posible en Español) sobre la utilización de lenguaje ensamblador en C++ con el compilador que usa el Visual Studio v12.0. A ser posible, que el tutorial no presuponga que se algo de ensamblador (registros, y todo eso). No quiero aprender a usar ASM con ensambladores como MASM, NASM o TASM por la dependencia de la arquitectura, es decir, que me quiero quitar de ese tipo de complicaciones. Estoy usando la versión de 32 bits

Aun con todo lo que he dicho, ¿es recomendable que aprenda ensamblador de esta manera, o es mejor para el entendimiento que cree los programas enteramente con ensamblador?

Muchas gracias!
#18
Hola, muy buenas. Me gustaría saber como obtener una lista de archivos y carpetas dado un directorio en cualquier sistema operativo. Si es posible, me gustaría almacenar esta información en una variable de tipo char **.

Muchas gracias
#19
Hola, muy buenas a tod@s. Me estoy desesperando con Visual Studio 12.0 Express. El error se resume en un código muy simple:

Código (cpp) [Seleccionar]

int main() {
const char *code;
code = new char[2];
code[0] = 'a'; // Aquí está el error

       return 0;
}


Como ven, primero creo una cadena de caracteres. Por consiguiente, la inicializo con el operador new. Y por último, el lugar donde está el error. El error según Visual Studio dice así: "Error: La expresión debe ser un valor L modificable". También he probado lo siguiente:

Código (cpp) [Seleccionar]
*code = 'a'

No entiendo lo que pasa. A lo mejor es una tontería...

Espero que me puedan ayudar. Gracias
#20
Hola, muy buenas. Primero quiero aclarar que estoy hablando de la API de Window. Hoy se me presenta una duda la cual es que por qué pasamos por referencia la estructura de una ventana en la función RegisterClassEx. Con esto, se me presenta otra duda: ¿puedo eliminar la estructura (habiendola inicializado con new) una vez llamada la función 'RegisterClasEx', o puede que el programa crashee al intentar acceder a la estructura que he eliminado? Es decir, la duda es que si Windows necesitará en un futuro la estrctura.
#21
Hola a tod@s. El problema proviene de función de la API de Windows en colaboración con OpenGL. La función es wglMakeCurrent(NULL, NULL). El problema es que que a veces (aleatoriamente) el programa crashea. He buscado por internet, pero nadie ha dado una respuesta que me sirva.

Esta función la utilizo cuando voy a cerrar el programa. Aquí está la función llamada al cerrarse el programa:

Código (cpp) [Seleccionar]
void Game::destroy() {
wglMakeCurrent(NULL, NULL);
wglDeleteContext(*hRC);
ReleaseDC(*hWnd, *hDC);

delete[] cWindow;
delete[] hWnd;
delete[] Msg;
delete[] hDC;
delete[] hRC;
}
#22
Hola, muy buenas a tod@s, os comento:

Estaba creando un simple Hello World de OpenGL usando la API de Windows. He ido paso a paso, creando primero una ventana simple con la API de Windows (la cual se ha creado correctamente), y posteriormente he creado un contexto con el viejo OpenGL. El problema lo da la función SetPixelFormat, el cual da el código de error 3221684230 (en hexadecimal 0xC0070006). No tengo ni idea de que puede pasar, incluso he copiado/pegado un código de un contexto de OpenGL de Internet y me pasa lo mismo...

Código (cpp) [Seleccionar]
#ifndef UNICODE
#define UNICODE
#endif

#include <windows.h>
#include <gl\gl.h>

#include <chrono>
#include <thread>

#include <iostream>

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

int main() {
WNDCLASSEX cWindow;
HWND hWnd;
MSG Msg;
HDC hDC;
HGLRC hRC;

memset(&Msg, NULL, sizeof(MSG));

cWindow.cbSize = sizeof(WNDCLASSEX);
cWindow.hInstance = GetModuleHandle(NULL);
cWindow.lpszClassName = L"¡Título!";
cWindow.lpfnWndProc = WndProc;
cWindow.lpszMenuName = NULL;
cWindow.style = CS_OWNDC;
cWindow.hIcon = LoadIcon(NULL, IDI_APPLICATION);
cWindow.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
cWindow.hCursor = LoadCursor(NULL, IDC_ARROW);
cWindow.hbrBackground = (HBRUSH)3;
cWindow.cbClsExtra = 0;
cWindow.cbWndExtra = 0;

if(RegisterClassEx(&cWindow) == NULL) {
MessageBox(NULL, L"Error registring a window class!", L"Fatal error", MB_OK | MB_ICONERROR);
PostQuitMessage(0);
}

hWnd = CreateWindowEx(0, L"¡Título!", L"¡Título!", WS_OVERLAPPEDWINDOW | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT,
  640, 480, HWND_DESKTOP, NULL, GetModuleHandle(NULL), (void *)NULL);

if(hWnd = NULL) {
MessageBox(NULL, L"Error creating a window!", L"Fatal error", MB_OK | MB_ICONERROR);
PostQuitMessage(0);
}

ShowWindow(hWnd, SW_SHOWDEFAULT);

PIXELFORMATDESCRIPTOR PFD;
int choosenPFD;

memset(&PFD, NULL, sizeof(PIXELFORMATDESCRIPTOR));
PFD.nVersion = 1;
PFD.nSize = sizeof(PIXELFORMATDESCRIPTOR);
PFD.iPixelType = PFD_TYPE_RGBA;
PFD.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
PFD.cColorBits = 24;
PFD.cDepthBits = 16;
PFD.iLayerType = PFD_MAIN_PLANE;

hDC = GetDC(hWnd);

choosenPFD = ChoosePixelFormat(hDC, &PFD);

if(!choosenPFD) {
MessageBox(hWnd, L"Error choosing a pixel format (old)!", L"Fatal error", MB_OK | MB_ICONERROR);
PostQuitMessage(0);
}

if(!SetPixelFormat(hDC, choosenPFD, &PFD)) {
std::clog << GetLastError();
MessageBox(hWnd, L"Error setting a pixel format (old)!", L"Fatal error", MB_OK | MB_ICONERROR);
PostQuitMessage(0);
}

hRC = wglCreateContext(hDC);

if(!hRC) {
MessageBox(hWnd, L"Error creating a OpenGL context (old)!", L"Fatal error", MB_OK | MB_ICONERROR);
PostQuitMessage(0);
}

if(!wglMakeCurrent(hDC, hRC)) {
MessageBox(hWnd, L"Error linking a OpenGL context with a window!", L"Fatal error", MB_OK | MB_ICONERROR);
PostQuitMessage(0);
}

while(Msg.message != WM_QUIT) {
if(PeekMessage(&Msg, hWnd, NULL, NULL, PM_REMOVE)) {
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);



SwapBuffers(hDC);

std::this_thread::sleep_for(std::chrono::microseconds(11764));
}

wglMakeCurrent(NULL, NULL);
wglDeleteContext(hRC);
ReleaseDC(hWnd, hDC);
DestroyWindow(hWnd);
UnregisterClass(L"¡Título!", GetModuleHandle(NULL));

return 0;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
switch(uMsg) {
case WM_DESTROY:
PostQuitMessage(0);
}

return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
#23
Hola. Muy buenas a tod@s. Hoy me ha entrado la curiosidad de este mundo de la seguridad informática. Bien, me presento: soy un programador principalmente en lenguaje C++ y Java (principalmente usados en videojuegos). Sé mas o menos como funciona la arquitectura de un ordenador (manejo de memoria, código máquina...). No sé prácticamente nada sobre redes (solo sé lo que es muy básico). La mayor parte de mi experiencia está basada en Windows, es decir, no sé prácticamente nada sobre Linux y servidores

Sabiendo todo esto, por dónde me recomendarían empezar a aprender Seguridad Informática (por hobby :)). Gracias
#24
Hola a tod@s. La duda está básicamente expresada en el título. Estoy buscando un tema para el IDE Eclipse CDT (C++) que se parezcca al de Visual Studio 2013 (tema oscuro).

Aquí os dejo de como se ve el tema de Visual Studio:



Nota: es preferible que el tema sea compatible con Color Theme (los que usen Eclipse CDT supongo que sabrán que es), para los que no, es como una amplicación dentro de Eclipse que te permite poner un tema sin complicaciones.

Muchas gracias.
#25
Hola. Muy buenas a tod@s. El problema que tengo es algo extraño. Primero enseño el código:

Código (cpp) [Seleccionar]
void String::replaceData(const char *data) {
_num_characters = 0;

while(data[_num_characters] != (char)NULL)
_num_characters += 1;

realloc(_value, _num_characters + 1);
_value[_num_characters] = (char)0;

while(true) {
--_num_characters;

_value[_num_characters] = data[_num_characters];

if(_num_characters == NULL)
break;
}
}


Main

Código (cpp) [Seleccionar]
#include <iostream>

#include "string.h"

int main(int argc, char *argv[]) {
String cadena = "Hola";

cadena.replaceData("Hola, soy un programador");

std::cin.get();
return 0;
}


El problema está en la línea 4, donde el while. Cuando la cadena que le paso por parámetros tiene mas de 16 caracteres, y en el programa presiono enter (el cin.get deja continuar el programa), me sale el siguiente error:
'Debug Assertion Failed, file f:\dd\vctools\crt\crtw32\misc\dbgheap.c, line 1322, expression: _CrtlsValidHeapPointer(pUserData)'

Sé que el error se produce en el while ya que quitandolo, y sustituyendo la variable _num_characters por 17 no me da ese error.

Espero que me puedan ayudar :P Gracias
#26
Hola a todos. Hoy tengo una duda/curiosidad que quería resolver.

La duda es la siguiente: ¿Las variables (arrays, clases...) de desasignan al cerrar el programa? También las variables previamente asignadas con malloc se desasignan al cerrar el programa, o necesitas eliminarlas tu mismo?

Gracias
#27
Hola. Muy buenas a todos. Hoy traigo una duda de las que uno piensa que el compilador está fallando porque no tiene otra explicación.

Primero voy a introducir: Estoy intentando imitar la clase string a modo de ejercicio. Pues bien, en el constructor está pasado algo solo descriptible a través de la salida (está debajo del código).

Código (cpp) [Seleccionar]
String::String(const char *init_value) {
unsigned int num_characters = 0;

while(init_value[num_characters] != (char)NULL)
num_characters += 1;

_num_characters = num_characters;
_value = (char *)malloc(num_characters + 1);

_value[num_characters] = (char)0;

while(--num_characters >= 0) {
printf("%d ", num_characters);  // _value[num_characters] = init_value[num_characters];
}
}


Pues bien, la salida es la siguiente:
3 2 1 0 -1 -2 -3 -4 //... y así hasta el infinito
(El comentario no está en la salida, solo es para aclarar)

Como ven, aunque num_characters valga menos de 0, el while se sigue repitiendo...

Espero que sea error del compilador, porque si no yo sería muy tonto

#28
Hola, muy buenas a tod@s. Hoy tengo una duda sobre como cargar BMP en la RAM para pasarsela a OpenGL. Bueno, se podría decir que casi lo consigo, pero no!. Mejor vean por ustedes mismos el resultado, y a ver si alguien ve el error...

Código (cpp) [Seleccionar]
TEXTURE::TEXTURE(const char *path) {
unsigned char header[54];
unsigned int dataPos;
unsigned int width, height, size;
unsigned char *data;
FILE *filePointer = fopen(path, "rb");

if(filePointer == NULL)
printf_s("Error openning image file at '%s'!", path);

if(!fread(header, 1, 54, filePointer))
printf_s("Error, file at '%s' isn't a real BMP file.", path);

if(header[0] != 'B' || header[1] != 'M')
printf_s("Error, file at '%s' isn't a real BMP file.", path);

dataPos = *(int *)&header[0x0A];
size    = *(int *)&header[0x22];
width   = *(int *)&header[0x12];
height  = *(int *)&header[0x16];

if(!size)
size = width * height * 3;

if(!dataPos)
dataPos = 54;

data = new unsigned char[size];
fread(data, 1, size, filePointer);

fclose(filePointer);

glGenTextures(1, &texID);

glBindTexture(GL_TEXTURE_2D, texID);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);

glBindTexture(GL_TEXTURE_2D, 0);
}


Resultado:


Imagen original:


Código del Vertex Shader:
#version 330 core

layout(location = 0) in vec4 position;
layout(location = 1) in vec2 texCoords;

out DATA {
   vec2 texCoords;
} vs_out;

void main() {
   gl_Position = position;

   vs_out.texCoords = texCoords;
}


Código del Fragment Shader:
#version 330 core

layout(location = 0) out vec4 color;

in DATA {
   vec2 texCoords;
} fs_in;

uniform sampler2D sampler;

void main() {
   color = texture(sampler, fs_in.texCoords);
}

Espero que me puedan ayudar... ¡Gracias!




O esto es magia, o visual studio me está trolleando. Ahora si que funciona... Sinceramente, no se que pasaba...
#29
Hola. Muy buenas a tod@s. Bueno, ya habiendo solucionado el problema con las dependencias, se me presenta otro problema: al ejecutar un programa compilado de un código sencillo, este crashea.

El código es el siguiente:

Código (cpp) [Seleccionar]
#include <iostream>

#include <GL/glew.h>
#include <GLFW/glfw3.h>

static void errorCallback(int error, const char* description) {
std::cout << description << ". Error core: " << error << std::endl;
}

static void keyCallback(GLFWwindow* window, int key, int scancode, int action, int mods) {
if(key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
glfwSetWindowShouldClose(window, GL_TRUE);
}

int main() {
GLFWwindow* window;
GLuint VAO;
GLuint VBO;
GLfloat Vertices[] = {
-0.5f, -0.5f, 0.0f,
-0.5f, 0.5f, 0.0f,
0.5f, 0.5f, 0.0f
};

glfwSetErrorCallback(errorCallback);

if(!glfwInit())
return -1;

window = glfwCreateWindow(640, 640, "Mi juego", NULL, NULL);

if(!window) {
glfwTerminate();
return -1;
}

glfwMakeContextCurrent(window);
glfwSetKeyCallback(window, keyCallback);

glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
glEnable(GL_DEPTH_TEST);

glGenVertexArrays(1, &VAO);
glBindVertexArray(VAO);

glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, false, 0, 0);
glEnableVertexAttribArray(0);

while(!glfwWindowShouldClose(window)) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glBindBuffer(GL_ARRAY_BUFFER, VBO);
glDrawArrays(GL_TRIANGLES, 0, 3);

glfwSwapBuffers(window);
glfwPollEvents();
}

glfwDestroyWindow(window);
glfwTerminate();

return 0;
}


Como ya se ha mencionado, el código puede ser compilado sin problemas, pero al ejecutar el .exe correspondiente, crashea (nótese que se abre la ventana en blanco, y justo en ese momento crashea). ¡Gracias por su atención y ayuda!
#30
Hola. Muy buenas a tod@s. Hoy se me presenta un problema bastante frustrante porque no tiene que ver con C++ y no he encontrado la solución en Internet.

El problema es que al compilar un sencillo código sobre GLFW, me da error al enlazar con dicha librería.

Código de error:
Código (cpp) [Seleccionar]
1>main.obj : error LNK2019: símbolo externo _glfwInit sin resolver al que se hace referencia en la función _main
1>main.obj : error LNK2019: símbolo externo _glfwTerminate sin resolver al que se hace referencia en la función _main
1>main.obj : error LNK2019: símbolo externo _glfwSetErrorCallback sin resolver al que se hace referencia en la función _main
1>main.obj : error LNK2019: símbolo externo _glfwCreateWindow sin resolver al que se hace referencia en la función _main
1>main.obj : error LNK2019: símbolo externo _glfwDestroyWindow sin resolver al que se hace referencia en la función _main
1>main.obj : error LNK2019: símbolo externo _glfwWindowShouldClose sin resolver al que se hace referencia en la función _main
1>main.obj : error LNK2019: símbolo externo _glfwSetWindowShouldClose sin resolver al que se hace referencia en la función "void __cdecl key_callback(struct GLFWwindow *,int,int,int,int)" (?key_callback@@YAXPAUGLFWwindow@@HHHH@Z)
1>main.obj : error LNK2019: símbolo externo _glfwPollEvents sin resolver al que se hace referencia en la función _main
1>main.obj : error LNK2019: símbolo externo _glfwSetKeyCallback sin resolver al que se hace referencia en la función _main
1>main.obj : error LNK2019: símbolo externo _glfwMakeContextCurrent sin resolver al que se hace referencia en la función _main
1>main.obj : error LNK2019: símbolo externo _glfwSwapBuffers sin resolver al que se hace referencia en la función _main
1>main.obj : error LNK2019: símbolo externo _glfwSwapInterval sin resolver al que se hace referencia en la función _main


Como ven, todos estos errores vienen de que hay problemas al enlazar con las dependecias de GLFW. Bien, los pasos que seguí son los siguientes:

1) Crear proyecto 'aplicación de consola de consola' en VS2013
2) Acceder a las propiedades del proyecto
3) En el apartado general de C++, añadí las carpetas de include donde están los headers de GLFW (C:\Users\Carlos\Desktop\Programacion\Cpp\Prueba\include)
4) En en apartado general de 'vinculador' he añadido las carpetas donde están los binarios .lib de GLFW (C:\Users\Carlos\Desktop\Programacion\Cpp\Prueba\binaries\lib-vc2013)
5) Último paso: en el apartado entrada del vinculador añadí esto:
opengl32.lib
glfw3.lib
glfw3dll.lib
Además de estas, hay agregadas por defecto

Bueno. En último lugar les enseñaré el código por si sirve de algo:

Código (cpp) [Seleccionar]
#include <GLFW/glfw3.h>

#include <stdlib.h>
#include <stdio.h>

static void error_callback(int error, const char* description) {
fputs(description, stderr);
}

static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) {
if(key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
glfwSetWindowShouldClose(window, GL_TRUE);
}

int main(void) {
GLFWwindow* window;

glfwSetErrorCallback(error_callback);

if(!glfwInit())
exit(EXIT_FAILURE);

window = glfwCreateWindow(640, 480, "Simple example", NULL, NULL);
if(!window) {
glfwTerminate();
exit(EXIT_FAILURE);
}

glfwMakeContextCurrent(window);
glfwSwapInterval(1);

glfwSetKeyCallback(window, key_callback);

while(!glfwWindowShouldClose(window)) {
glClear(GL_COLOR_BUFFER_BIT);

glfwSwapBuffers(window);
glfwPollEvents();
}

glfwDestroyWindow(window);

glfwTerminate();
exit(EXIT_SUCCESS);
}


Espero que me puedan ayudar :P ¡Muchas gracias por su atención!
#31
Java / (Ayuda) Creando un FloatBuffer
10 Mayo 2015, 01:48 AM
Hola. ¡Muy buenas a tod@s! Hoy os quería preguntar una duda sobre un código que encontré en internet sobre como crear un floatBuffer:

Código (java) [Seleccionar]
public static FloatBuffer createFloatBuffer(float[] array) {
FloatBuffer result = ByteBuffer.allocateDirect(array.length << 2).order(nativeOrder()).asFloatBuffer();
result.put(array).flip();
return result;
}


Bueno, las dudas son las siguientes:

1-. array.length << 2 (Linea 2) Lo que no entiendo es el por qué de ese desplazamiento de bits

2-. order(nativeOrder()) (Linea 3) No entiendo nada xD

3-. flip() (Linea 3) Tampoco entiendo nada

Os doy las gracias por adelantado por ayudarme y ayudar a todo el mundo que no lo entienda :D
#32
Hola. Muy buenas a todos los programadores. Hoy tengo un problema que mecomplica las cosas. El problema es que quiero desplazar a nivel de bits un float 24 bits, pero java me dice que hay un error, expresado con la siguiente frase:

"The operator >> is undefined for the argument type(s) float, int"

La línea es:

Código (java) [Seleccionar]
fWritter.write((byte)(vertice.x >> 24));

vertice.x es de tipo flotante

Por favor, ayudenme. A lo mejor me podrían enseñar a encapsular un flotante en un entero (a nivel de bits) Cero problemas con ese método (solo que no se como realizarlo xD)

¡Muchas gracias por pasaros!
#33
Hola, muy buenas a todos y a todas. El caso es que para un mini-proyecto estoy haciendo una página web, la cual tiene un menú desplegable funcionando en HTML.

La idea es tener un contenedor(div) principal que englobe a todo el menú. En primera instancia, solo serán visibles un par de botones, pero cuando pulses cualquiera de esos dos botones, entonces aparecerá un submenú.

El código que llevo es el siguiente: (las funciones highPrincipalMenu resaltan el botón sobre el que está el ratón y la función lowAll desresalta todos los botones)

Código (html4strict) [Seleccionar]

<div id="menuBlock" onmouseout="lowAll();">
<div id="menuExpander" onmouseover="highPrincipalMenu('menuExpander');">
<img src="images/menu/menu.png" width="100%" height="100%">
</div>

<div id="menuBlockItem">
</div>

<div id="menuShare" onmouseover="highPrincipalMenu('menuShare');">
<img src="images/menu/share.png" width="100%" height="100%">
</div>
</div>


El problema es el siguiente: cuando yo paso el ratón sobre sobre cualquiera de los botones funciona perfecto, pero cuando quito el ratón de los botones se desmarcan, pero lo que yo quiero es que cuando el ratón deje el contenedor PRINCIPAL se apagen los botones

Espero haberme expresado bien, y ¡muchas gracias!
#34
Java / (Ayuda) Plantillas en java
5 Abril 2015, 01:07 AM
Hola, ¡muy buenas a todos y a todas!

Aprendiendo por ahí como usar cierta librería, me he encontrado con una estructura que sabía que existía de C++, pero nunca he llegado a saber para que sirve.

Estrucutra:

Código (java) [Seleccionar]
private Map<String, Integer> locationCache = new HashMap<String, Integer>();

Entonces, ¿alguien me la podría explicar? Gracias
#35
Hola programadores! Siendo un programador en C++, últimamente Java me está gustando cada vez mas. Aun estoy aprendiendo este gran lenguaje, pero creo que ya se lo suficiente como para aprender a usar una librería llamada LWJGL en su versión 3. El caso es que he estado media hora buscando un tutorial decente (ingles o español), pero no he encontrado gran cosa.

¿Alguien puede compartir un buen tutorial sobre esta librería?


¡Gracias por su atención y respuestas!
#36
Hola, muy buenas a tod@s!

El proceso es simple: estoy intentando crear una aplicación con una librería compilada en un .jar. Al compilar el programa principal (el comando lo mostraré ahora)no me sale ningún error, pero a la hora de ejecutar el archivo .class con un CLASSPATH en el directorio del .jar me dice 'No se ha encontrado la clase principal Main',pero esa es la única clase escrita en el .java

Comandos usados:

javac -cp "lwjgl.jar" Main.java (No da ningún error, me crea un .class)
set CLASSPATH="C:\Users\Carlos\Desktop\Game" (No da ningún error)
java Main (El error antes mencionado)

ESPERO QUE ME PUEDAN AYUDAR. GRACIAS POR SU ATENCIÓN
#37
Hola, muy buenas. En primer lugar, a partir de ahora se supondrá que uso Java.

Estaba haciendo un ejercicio que decía así:


  • Lee un número por teclado y muestra por consola, el carácter al que pertenece en la tabla ASCII. Por ejemplo: si introduzco un 97, me muestre una a.

  • Modifica el ejercicio anterior, para que en lugar de pedir un número, pida un carácter (char) y muestre su código en la tabla ASCII.

Bien. He hecho el programa y todo va bien, pero con un problema. Cuando paso, por ejemplo, el carácter 'á' a número me da como resultado 160, el que le corresponde en ASCII. El problema es que a la hora de mostrar dicho carácter por pantalla se convierte a  UTF-8 (he hecho varias pruebas, y confirmo lo que digo.). Sabiendo que la consola trabaja con el código ASCII (Windows), y que el valor numérico de dicho carácter corresponde al código ASCII, ¿Por qué se muestra como UTF-8?

El código:

Código (java) [Seleccionar]
import java.util.Scanner;

public class Main {
public static void main(String[] args) {
Scanner Reader = new Scanner(System.in);
char Character = ' ';

System.out.print("Introduzca un caracter cualquiera: ");
Character = Reader.next().charAt(0);

System.out.println("El valor numérico de " + Character + " es " + ((int)Character));
}
}



MUCHAS GRACIAS POR ATENDERME
#38
Hola, muy buenas. Les cuento. He estado haciendo programas con el compilador MinGW (En C++, usando g++). El problemaviene ahora: cuando intento hacer una aplicación de Windows se compila correctamente, pero la consola sigue estando visible. La duda es: ¿como quito esa consola?. Gracias!
#39
Hola a tod@s. Hoy os presento la segunda parte de mi tutorial sobre C++. En este tutorial explico exhaustivamente el código de iniciación para todo aquel que quiera ser programador. Lo explico linea por linea, diferenciando diferentes tipos de lineas (sentencias, directivas de preprocesador...) Espero que se lo pasen bien aprendiendo a programar

Para visitar este tutorial, solo tienes que pinchar aquí

Muchas gracias por pasaros y espero que tengan un buen día.
#40
Hola a tod@s. La duda que tengo es bastante simple. Resulta que estoy empezando a crear páginas web en un sitio (no digo cual para que no piensen que es Spam). La pregunta es: ¿Puedo crear temas por aquí para anunciar mis tutoriales? Evidentemente, no voy a spamearos de temas, solo pondría un tema por tutorial que haga. Los tutoriales irán de C++, java, html, WinAPI y OpenGL.

Muchas gracias por pasaros y responder!
#41
Hola, ¡muy buenas programadores! Hoy estoy buscando a alguien que esté aprendiendo a usar OpenGL y esté interesado en trabajar en equipo conmigo. Porque una parte muy importante de la programación es hacer equipos y así aprender unos de otros. Yo también estoy aprendiendo a usar OpenGL.

Busco personas que sepan C++.

¡MUCHAS GRACIAS POR SU ATENCIÓN!  :D
#42
Programación C/C++ / (Ayuda) Entender un código
6 Diciembre 2014, 00:33 AM
Hola, ¡muy buenas forer@s! Hoy os traigo una duda un tanto elemental, es decir, bastante básica a mi parecer.

Me preguntaba si alguien tendría la amabilidad de explicarme este código. He de decir que ando muy perdido en cuanto a librerías en C++, puesto que he pasado de programar con iostream a programar con la API de Windows y OpenGL. Bueno, aquí os dejo el código (me podéis explicar, si queréis, siendo técnicos, para que tengáis que escribir menos):

Código (cpp) [Seleccionar]
bool CShader::loadShader(string sFile, int a_iType)
{
   FILE* fp = fopen(sFile.c_str(), "rt");
   if(!fp)return false;

   // Get all lines from a file

   vector<string> sLines;
   char sLine[255];
   while(fgets(sLine, 255, fp))sLines.push_back(sLine);
   fclose(fp);

   const char** sProgram = new const char*[ESZ(sLines)];
   FOR(i, ESZ(sLines))sProgram[i] = sLines[i].c_str();
   
   uiShader = glCreateShader(a_iType);

   glShaderSource(uiShader, ESZ(sLines), sProgram, NULL);
   glCompileShader(uiShader);

   delete[] sProgram;

   int iCompilationStatus;
   glGetShaderiv(uiShader, GL_COMPILE_STATUS, &iCompilationStatus);

   if(iCompilationStatus == GL_FALSE)return false;
   iType = a_iType;
   bLoaded = true;

   return 1;
}


Notas:
* No hace falta que me expliqueis esto: uiShader = glCreateShader(a_iType), esto: glShaderSource(uiShader, ESZ(sLines), sProgram, NULL); ni esto: glCompileShader(uiShader);

* Explicad solo lo que sepais, y así todos podrán ayudar y nadie se confundirá ;)

¡MUCHAS GRACIAS POR SU ATENCIÓN Y POR SU AYUDA!
#43
Hola, ¡muy buenas a todos! Hoy os vengo a preguntar una duda. El caso es que estoy traduciendo un documento que trata el OpenGL moderno, pero me he encontrado con un término que se que significa, pero no le encuentro una traducción literal. El término en cuestión es Scan convertion.

Os digo que significa: Es transformar las coordenadas en ventana(flotantes) a coordenadas en ventana (enteras)

Os dejo una imagen bastante descriptiva:



También os dejo la definición literal de la página: The process of taking a triangle in window space and converting it into a number of fragments based on projecting it onto the pixels of the output image


Espero que me puedan ayudar. ¡MUCHAS GRACIAS POR PASAROS!
#44
Hola, amigos! Hoy he decidido cambiar de IDE y compilador (antes usaba code::blocks). Me he cambiado a Visual Studio Express 2013, y tengo una duda sobre los tabuladores.

Cuando yo escribo ":" (sin comillas), me salta un tabulador hacia atras, cosa que no me gusta.

Ejemplo:


Código (cpp) [Seleccionar]
switch(Variable) {
   case 1: // De esto pasa a...
       ...
       
       break;
}


Código (cpp) [Seleccionar]
switch(Variable) {
case 1: // Esto
   ...
       
   break;
}




Tambien hay otra cosa que no me gusta, y es que despues de un if, while, for o cualquer controlador de flujo, me pone un espacio entre ese if y el parentesis

Ejemplo:
Código (cpp) [Seleccionar]
if(Variable > 1) // De esto pasa a...{
   ...
}


Código (cpp) [Seleccionar]
if (Variable > 1) // Esto{
   ...
}



Me gustaría ver si me pueden decir como omito estas "autocorrecciones", porque me resultan muy molestas...

Muchas gracias :D
#45
Hola, ¡muy buenas, foro! He estado buscando mucho por Google un tutorial sobre OpenGL 4.1 usando glext, pero no he encontrado gran cosa en español... Mi petición sería que me pasaseis algún tutorial o algo que conozcais sobre OpenGL (4.1 o 3.3) usando la librería glext.h y wglext.h Y sería maravilloso si se usara solo la API de Windows, no librerías como FreeGlut, o Glew

Por favor, estoy deseando meterme en el mundo de OpenGL, pero Glut, ni glew me gustan porque me quitan demasiado control a mi gusto :P


¡MUCHAS GRACIAS POR SU COLABORACIÓN!