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

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


  Mostrar Mensajes
Páginas: 1 2 [3] 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ... 125
21  Programación / Programación C/C++ / Re: Estructuras con Punteros en: 13 Abril 2015, 09:02 am
si "paramsToWrite" es un vector de elementos de tipo "struct configParam", queda claro que para acceder a cada elemento de tipo "configParam" necesitas usar el operador de indice:

"paramsToWrite[contador];"

Luego, para acceder a cada uno de los miembros de "configParam" tienes que usar el operador adeucado y el nombre del miembro con el que quieres interactuar. En el caso del operador se distinguen dos casos:

* Si el acceso es por valor, se usa el operador '.'
* Si el acceso es mediante punteros, se usa el operador '->'

Entonces, dado que "paramsToWrite" te da acceso a un elemento de tipo "configParam" por valor, el acceso quedaría tal que:

Código
  1. // Para escribir
  2. strcpy( paramsToWrite[contador].clave, "aqui la clave" );
  3.  
  4. // Para leer
  5. char* cad;
  6. strcpy( cad, paramsToWrite[contador].clave );

PD.: no te olvides de incrementar "contador" en cada iteración.

Un saludo.
22  Programación / Programación C/C++ / Re: ¿como unir las ventanas y las clases de c++? en: 10 Abril 2015, 08:24 am
sí a eso me refiero, no se me ocurre como se manejraria el bucle de mensajes desde una clase, creo que se quedaria "atascado" sin salir de la clase, tenia curiosidad por saber como lo hacen los compiladores como visualbasic y delphi , en esos lenguajes es algo invisible al usuario.

Si por "usuario" quieres decir "programador" te tengo que corregir. No es invisible al programador.

Para que tu programa pueda mostrar una interfaz gráfica necesitas que tu código se conecte con la API correspondiente del sistema operativo que se encarga de gestionar la interfaz de usuario del sistema operativo. Lo que sucede es que normalmente no trabajas directamente sobre la API del sistema operativo, sino que haces uso de una librería que alguien se ha molestado en programar, y que te permite crear interfaces gráficas de una forma más sencilla.

En el caso de Delphi, la librería gráfica es la VCL (Visual Component Library). Además, tienes la "suerte" de que esta librería la proporciona Borland por defecto junto con el IDE, pero aunque no tengas que preocuparte por cómo funciona la clase "Button" de la VCL, has de saber que siempre vas a poder crear tus propios controles gráficos... y para poder hacer eso tienes que conocer cómo funciona esta librería.

En el caso de VisualBasic, la librería gráfica es la MFC (Microsoft Foundation Class). Tienes la "suerte" de que esta librería, al igual que la de Delphi, la proporciona Microsoft por defecto junto con su IDE.

En cualquier caso, has de saber que siempre tienes la opción de trabajar directamente con la API... al fin y al cabo cualquier componente gráfico se va a acabar apoyando antes o después en dicha API.

¿Por qué estoy tan seguro de que todo pasa por la API del sistema operativo? Muy sencillo. Si cada aplicación crease su propio gestor de ventanas sería imposible que pudieses visualizar varias aplicaciones a la vez en la pantalla del ordenador. Para que esto sea posible es necesario que exista un gestor común que se encargue de decidir qué ventana está encima de otra, con qué control está interactuando el usuario en cada momento, a qué control le llega el "foco" cuando el usuario manipula el ratón, etc.

En cuanto a cómo lo hacen con el bucle de mensajes... a ver, normalmente cuando se crea una aplicación con interfaz gráfica, se especifica una función que será la encargada de recibir todos los mensajes por parte del SO. En esta función se encapsula una secuencia de "if" para capturar todos los mensajes importantes para la aplicación. Cuando se recibe un mensaje que es reconcido por la aplicación, el código de esta función acaba llamando a un método concreto de la aplicación para que ese mensaje sea correctamente procesado.

Un ejemplo. Tienes una aplicación con dos botones (A y B), y quieres que al presionar el botón A aparezca un texto en pantalla. Entonces en el bucle de mensajes tienes que "escuchar" un mensaje de tipo "BOTON_PRESIONADO"... además, tendrás que asegurarte de que el botón presionado sea el A. Si todo lo anterior se cumple entonces el bucle de mensajes tiene que llamar a la función BotonAPresionado. Esta última función será la que muestre el mensaje por pantalla y, tras esto, la ejecución volverá al bucle de mensajes a la espera del siguiente mensaje.

Código
  1. #define BOTON_PRESIONADO = 0x01
  2.  
  3. #define A = 0x01
  4. #define B = 0x02
  5.  
  6. void bucleMensajes( int mensaje, int control )
  7. {
  8.  if( mensaje == BOTON_PRESIONADO && control == A )
  9.    BotonAPresionado( );
  10. }
  11.  
  12. void BotonAPresionado( )
  13. {
  14.  // Mostrar mensaje en pantalla
  15. }

El problema de trabajar a tan bajo nivel es que mantener ordenado la función del bucle de mensajes puede ser bastante complicado... las librerías gráficas te abstraen de esta parte, ya que ellas solas son capaces de configurar el bucle de mensajes en base a la configuración que tu ventana.
23  Programación / Programación C/C++ / Re: Error con "Void expression". en: 9 Abril 2015, 13:39 pm
Código
  1. void FindReplace(char s[], char e1, char e2){
  2.  return s;
  3. }

Si la función es "void" no puede tener "return s". Si necesitas devolver "s" entonces la función tienes que cambiar "void" por el tipo de retorno, en este caso char*.

Por otro lado,

Código
  1. for(i=0;s[i]!=0;i++);

Fíjate que ese "for" termina con ";"... ese bucle no va a hacer absolutamente nada y, en consecuencia, el if que le sigue va a sufrir las siguientes consecuencias:

  • Solo se va a ejecutar una vez
  • s[ i ] va a apuntar SIEMPRE al final de la cadena (por el efecto del bucle for)

Y, bueno, intenta evitar el uso de variables globales.

Un saludo.
24  Programación / Programación C/C++ / Re: C++. Cargar una matriz de struct usando archivos de cabeceras en: 8 Abril 2015, 08:17 am
Bienvenido al foro.

Lo primero, el código lo tienes que decorar con las etiquetas GeSHi. Son las normas del foro y, además, mejora su legibilidad.

Un consejo: en C++ no hace falta usar typedef para declarar las estructuras o las clases. Las dos líneas de código siguientes son equivalentes en C++:

Código
  1. typedef struct {int padron; string nombre;}datos;
  2. struct datos{int padron; string nombre;};

Vamos con tu error. A ver, typedef se usa para definir un alias... si el alias lo defines en un archivo de cabecera, todos los ficheros que incluyan dicha cabecera tendrán acceso a dicho alias.

En tu caso el problema es que estás definiendo dos veces el alias "datos"... uno a nivel global y otro dentro del main. El conflicto que esto genera se basa en que el alias del main únicamente tiene validez dentro del main... y no solo eso... no solo su ámbito es diferente, también lo es su "nombre interno" de cara al compilador C++:

Citar
main.cpp|26|error: cannot convert 'main()::datos (*)[2]' to 'datos (*)[2]' for argument '1' to 'void cargarmatriz(datos (*)[2])'|

es básicamente lo que te está diciendo el mensaje de error... no sabe cómo convertir main::datos a ::datos.

La solución es tan simple como quitar el typedef del main.

Un saludo.
25  Programación / Programación C/C++ / Re: Cambiar el valor de una variable en un puntero en: 7 Abril 2015, 10:25 am
Ya, pero quiero decir si puedo recuperar el valor de cualquier puntero aunque no esté siendo utilizado por ese mismo programa, un ejemplo:

puntero = 00x144a;

Quisiera saber si eso es posible, gracias por la respuesta man.

Si yo veo que una posición de memoria tiene el valor 0x144a no tengo forma de saber si ese valor se corresponde con una dirección de memoria apuntada o con un valor.

En cualquier caso, ivancea96 te ha comentado una forma en la que puedes modificar la memoria de programas externos.

Un saludo

26  Programación / Programación C/C++ / Re: Posibles combinaciones de una palabra en: 7 Abril 2015, 09:05 am
Lo que intentas hacer se llama permutación.

Si estás en C++ puedes usar next_permutation

Para hacer permutaciones en C tienes que currarte el algoritmo. Puedes buscar en Internet... puedes encontrar algo de código que te ayude en la tarea.

Un saludo.
27  Programación / Programación C/C++ / Re: Cambiar el valor de una variable en un puntero en: 7 Abril 2015, 09:01 am
si "p" es un puntero, con "p" accedes a la dirección de memoria apuntada y con "*p" accedes al contenido de la memoria apuntada. Un ejemplo:

Código
  1. int variable1 = 5;
  2. int variable2 = 10;
  3.  
  4. int* puntero; // ahora mismo no apunta a nada válido
  5. puntero = &variable1; // puntero apunta a "variable1"
  6. printf( "0x%x -> %d\n", puntero, *puntero );
  7.  
  8. // Cambiamos el valor "apuntado"
  9. *puntero = 23;
  10. printf( "0x%x -> %d\n", puntero, *puntero );
  11.  
  12. puntero = &variable2; // puntero apunta a "variable2"
  13.  
  14. printf( "0x%x -> %d\n", puntero, *puntero );
  15.  
  16. // Cambiamos el valor "apuntado"
  17. *puntero = 71;
  18. printf( "0x%x -> %d\n", puntero, *puntero );
  19.  
  20. printf( "variable1: %d\n", variable1 );
  21. printf( "variable2: %d\n", variable2 );
28  Programación / Programación C/C++ / Re: Solución ejercicio en C en: 6 Abril 2015, 14:55 pm
aunque esté respondida la respuesta, matizo.

El tema del if es que toda la condición ha de estar encerrada por un paréntesis... pero eso no impide que puedas usar paréntesis internos para organizar el código correctamente. Lo siguiente también sería válido:

Código
  1. If((grade=='a') || (grade=='A'))

Un saludo.
29  Programación / Programación C/C++ / Re: Menú ¿Dinámico? en C en: 6 Abril 2015, 12:17 pm
¿Qué tal algo así?

Código
  1. #include <iostream>
  2. #include <set>
  3. #include <vector>
  4. #include <conio.h>
  5. #include <windows.h>
  6.  
  7. class MenuItem
  8. {
  9.  public:
  10.  
  11.    MenuItem( char tecla,
  12.              const std::string& texto,
  13.              unsigned char backColor,
  14.              unsigned char foreColor )
  15.      : _tecla( tecla ),
  16.        _texto( texto ),
  17.        _backColor( backColor ),
  18.        _foreColor( foreColor )
  19.    { }
  20.  
  21.    ~MenuItem( )
  22.    { }
  23.  
  24.    char Tecla( ) const
  25.    { return _tecla; }
  26.  
  27.    std::string Texto( ) const
  28.    { return _texto; }
  29.  
  30.    unsigned char BackColor( ) const
  31.    { return _backColor; }
  32.  
  33.    unsigned char ForeColor( ) const
  34.    { return _foreColor; }
  35.  
  36.  private:
  37.  
  38.    char _tecla;
  39.    std::string _texto;
  40.    unsigned char _backColor;
  41.    unsigned char _foreColor;
  42. };
  43.  
  44. void SetBG(unsigned char ForgC, unsigned char BackC);
  45. void menu();
  46. char mostrarMenu( const std::vector< MenuItem >& items );
  47.  
  48. main ()
  49. {
  50. while (1)
  51. {
  52.   menu();
  53. }
  54. }
  55.  
  56. //Define la función de menú
  57. void menu()
  58. {
  59.  std::vector< MenuItem > items;
  60.  items.push_back( MenuItem( '1', "Opción 1", 14, 0 ) );
  61.  items.push_back( MenuItem( '2', "Opción 2", 0, 5 ) );
  62.  items.push_back( MenuItem( 'a', "Opción 3", 4, 7 ) );
  63.  
  64.  char opcion = mostrarMenu( items );
  65.  
  66.  switch( opcion )
  67.  {
  68.    case '1':
  69.      system( "cls" );
  70.      std::cout << "Ejecutando 1" << std::endl;
  71.      break;
  72.    case '2':
  73.      system( "cls" );
  74.      std::cout << "Ejecutando 2" << std::endl;
  75.      break;
  76.    case 'a':
  77.      system( "cls" );
  78.      std::cout << "Ejecutando 'a'" << std::endl;
  79.      break;
  80.  
  81.    default:
  82.      break;
  83.  }
  84.  
  85.  getch( );
  86. }
  87.  
  88. char mostrarMenu( const std::vector< MenuItem >& items )
  89. {
  90.  char to_return;
  91.  std::set< char > validAnswer;
  92.  
  93.  do
  94.  {
  95.    system( "cls" );
  96.    std::cout << "   MENU" << std::endl
  97.              << "===================" << std::endl;
  98.    for( auto& item : items )
  99.    {
  100.      SetBG( item.ForeColor( ), item.BackColor( ) );
  101.      std::cout << "  " << item.Tecla( ) << ". " << item.Texto( ) << std::endl;
  102.      validAnswer.insert( item.Tecla( ) );
  103.    }
  104.    SetBG(15,0);
  105.    std::cin >> to_return;
  106.  
  107.  } while( validAnswer.count( to_return ) == 0 );
  108.  
  109.  return to_return;
  110. }
  111.  
  112. void SetBG(unsigned char ForgC, unsigned char BackC)
  113. {
  114.  WORD wColor = ((BackC & 0x0F) << 4) + (ForgC & 0x0F);
  115.  SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), wColor);
  116. }

Se podría conseguir un código más claro si se "mapeasen" los colores:

Código
  1. enum Color : unsigned char
  2. {
  3.  Black,
  4.  DarkBlue,
  5.  DrakGreen,
  6.  DarkAqua,
  7.  DarkRed,
  8.  DarkPurple,
  9.  DarkYellow,
  10.  Silver,
  11.  Gray,
  12.  Blue,
  13.  Green,
  14.  Aqua,
  15.  Red,
  16.  Purple,
  17.  Yellow,
  18.  White
  19. };
  20.  
  21. // ...
  22.  
  23. class MenuItem
  24. {
  25.  public:
  26.  
  27.    MenuItem( char tecla,
  28.              const std::string& texto,
  29.              Color backColor,
  30.              Color foreColor );
  31.  
  32.    Color BackColor( ) const;
  33.  
  34.    Color ForeColor( ) const;
  35.  
  36.  private:
  37.  
  38.    Color _backColor;
  39.    Color _foreColor;
  40. };
  41.  
  42. // ...
  43.  
  44.  items.push_back( MenuItem( '1', "Opción 1", Black, Red ) );
  45.  items.push_back( MenuItem( '2', "Opción 2", Black, Blue ) );
  46.  items.push_back( MenuItem( 'a', "Opción 3", Silver, Purple ) );
30  Programación / Programación C/C++ / Re: ajedrez en builder en: 31 Marzo 2015, 16:36 pm
¿No prefieres mejor un enlace a un manual de C?

En serio, para que eso funcione necesitas un nivel mínimo que, a raiz de tus preguntas, no tienes.

Aun así:

Código
  1. int main( )
  2. {
  3.  int a = 0, b = 0;
  4.  int* puntero = &a;
  5.  *puntero = 20;
  6.  
  7.  puntero = &b;
  8.  *puntero = 30;
  9.  
  10.  printf( "%d %d", a, b ); // Imprime "20 30"
  11. }
Páginas: 1 2 [3] 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ... 125
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines