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ú

Mensajes - tca153

#1
Programación C/C++ / ayuda con ncurses
29 Agosto 2021, 02:00 AM
buen dia a todos, estoy haciendo un programa algo tonto con ncurses, un juego, y una de las clases me esta dando problemas, la de manejo de pantalla, tengo 2 problemas que son:
1-cuando se ejecuta la ventana del terminal siempre es muy chica, de alrededor de1/4 a 1/3 del area de la pantalla, en ese momento las zonas que dibujo en pantalla estan bien, pero cuando la maximizo quedan chicas.
2-para realizar un mapa uso 9 sub ventanas llamadas bloques, pero resulta que estas no me toman los atributos de color, lo demas anda.
El mas importante seria el primero, necesitaria saber como arrancar ya con la pantalla maximizada por soft, si es que se puede (lei por ahi que si y tambien vi una funciones llamadas resizeterm y resize_term que no se si tendran algo que ver) y adaptar la escala al nuevo tamaño de forma automatica (tambien he podido ver que puedo interceptar el evento de maximizado como una pulsacion con getch()). lo otro seria mas por prolijidad

#ifndef PANTALLA_H
    #define PANTALLA_H
    #include <ncurses.h>

    class Pantalla
    {
        private:
            WINDOW *mapa, *dialogo, *inventario, *bloques[9];
        public:
            Pantalla();
            ~Pantalla();
            int Mapa(void);
            int Dialogo(void);
            int Inventario(void);
    };

#endif // PANTALLA_H


#include "Pantalla.h"
#include <ncurses.h>
#include <iostream>

Pantalla::Pantalla()
{
    int8_t i;
    initscr();
    start_color();
    cbreak();
    noecho();
    keypad(stdscr,TRUE);
    init_pair(1,COLOR_RED,COLOR_GREEN);
    init_pair(2,COLOR_RED,COLOR_WHITE);
    init_pair(3,COLOR_BLUE,COLOR_YELLOW);
    init_pair(4,COLOR_BLACK,COLOR_RED);
    init_pair(5,COLOR_BLACK,COLOR_CYAN);
    mapa=subwin(stdscr,22,38,1,1);

    if(mapa == NULL)
    {
        endwin();
        std::cout << "imposible crear ventana";
        getch();
        return;
    }
    dialogo=subwin(stdscr,10,38,1,41);
    if(dialogo == NULL)
    {
        delwin(mapa);
        endwin();
        std::cout << "imposible crear ventana";
        getch();
        return;
    }
    inventario=subwin(stdscr,10,38,13,41);
    if(inventario == NULL)
    {
        delwin(mapa);
        delwin(dialogo);
        endwin();
        std::cout << "imposible crear ventana";
        getch();
        return;
    }
    for(i=0;i<3;i++)
    {
        bloques[i]=subwin(mapa,5,7,5,9+(7*i));
        bloques[i+3]=subwin(mapa,5,7,10,9+(7*i));
        bloques[i+6]=subwin(mapa,5,7,15,9+(7*i));
    }
    for(i=0;i<9;i++)
    {
        box(bloques[i],0,0);
    }
    attron(COLOR_PAIR(1));
    bkgd(COLOR_PAIR(1));
    attroff(COLOR_PAIR(1));
    wattron(mapa,COLOR_PAIR(2));
    wbkgd(mapa,COLOR_PAIR(2));
    wattroff(mapa,COLOR_PAIR(2));
    wattron(dialogo,COLOR_PAIR(3));
    wbkgd(dialogo,COLOR_PAIR(3));
    wattroff(dialogo,COLOR_PAIR(3));
    wattron(inventario,COLOR_PAIR(4));
    wbkgd(inventario,COLOR_PAIR(4));
    wattroff(inventario,COLOR_PAIR(4));
    box(mapa,0,0);
    box(dialogo,0,0);
    box(inventario,0,0);
    refresh();
    getch();
}

Pantalla::~Pantalla()
{
    delwin(mapa);
    delwin(dialogo);
    delwin(inventario);
    endwin();
}
#2
gracias a todos por sus respuestas, ya resolvi el problema, lo que si no se porque se produjo, resulta que la ruta en la que buscaba al compilador era c:\mingw, no se porque buscaba por defecto ahi en lugar de en c:\programfile\codeblocks\mingw me di cuenta cuando revise bien en la pestaña compiler y ahi estaban las rutas mal las corregi y listo ya funciona bien.
Como punto final quiero decir, si es que sirve de algo, en la captura que manda bloodsharp
que figuran dos items marcados, si tienen un windows de 32 bits NO DESCARGUEN, repito NO DESCARGUEN la version que dice 32 bits, porque estan mal marcadas, esa es la de 64 bits, deben descargar la que NO DICE 32 bits, y busquen en FossHUB tendran mas control de que descargan, por ultimo esas son las que descargue. Muchas gracias a los dos por su valiosa ayuda, y espero que me sigan ayudando en el futuro. Mil Gracias y chau
#3
hola el problema es simple, codeblock no encuentra ningun compilador, ya lo intente 10 veces y en 2 maquinas distintas, 1 con windows 7 profesional, y la otra con windows 7 starter. segui lo que dice en el enlace https://www.youtube.com/watch?v=GBoNm3LUovE
y nada, y ahora cuando arranca aparece un cuadro amarillo abajo a la derecha de la pantalla, alguien sabe como resolver esto
#4
muchisimas gracias a los 2, RayR muchas gracias, y para BloodSharp pocas veces en foros vi gente como vos mas interesada en compartir lo que sabe que en criticar por no saber, a los dos un fuerte abrazo, y ahora a programar
#5
te agradezco la paciencia bloodsharp, tendre que cambiar de planes, una cosa mas, sabras como configurar code blocks para usar ncurses, logro que me detecte la ncurses.h pero no compila
#6
gracias para empezar soy nuevo en linux, a que funciones especificas te referis, y por otra parte, estamos de acuerdo que esa zona de memoria igual que la 0xA0000000, siguen existiendo?, si es asi no hay ninguna manera de romper esa barrera sin dañar al SO?
#7
hola y muchísimas gracias por contestar, primero si la distro que uso es bionicpup 8.0 64bits, es el penúltimo puppy linux y hasta agora el ultimo con la opción de instalar en disco, la versión 9.5 solo viene con instalación frugal, y segundo, si se que puedo utilizar cout para dibujar y borrar, pero la idea es hacer un juego en modo texto que pueda después,  y con obvios retoques, a modo gráfico tal vez algún modo vesa, si no puedo hacerlo en modo texto, ya me puedo ir olvidando de hacerlo en modo gráfico donde voy a tener mas problemas, ojo se que puedo hacerlo usando qt designer o algún otro parecido pero me gusta programar para consola, el otro tema seria la velocidad y las prestaciones, no solo es mas rápido escribir en la pantalla usando un puntero que usando cout, también así puedo escribir un byte único en donde yo quiera dentro de la pantalla sino que también puedo controlar los atributos de cada byte en forma independiente a los demás bytes cosa que es mucho mas difícil con los métodos de la clase std
#8
hola, tengo este ligero problema con una clase que hize, en esta clase tengo un puntero apuntado a la zona de video en modo texto (0xB8000000h) pero cuando trato de leer o escribir en esa direccion me da un error en tiempo de ejecucion (SEGMENTATION FAULT) y hay unos numeros antes que siempre cambian, que sera lo que pasa, yo probe esto en windows y siempre andubo bien, pero aca falla.
Para mas datos estoy usando binicpup 64 bits y el compilador es codelite, y aca esta la clase

#ifndef PANTALLA_H
   #define PANTALLA_H
   #include <iostream>
   
   class PANTALLA
   {
      private:
         int X,Y;
         unsigned char *scr;

      public:
      
         // Constructor
      
         PANTALLA()
         {
            scr=(unsigned char *)0xb8000000;
            X=Y=0;   
            clear();
         }
      
         void clear(void)
         {
            for(int i=1;i<2000;i+=2)
               *(scr+i)=0;      // punto en donde falla sin esto corre bien         
         }
   };

#endif // PANTALLA_H

cualquier ayuda sera muy apreciada, gracias
#9
Criptografía / ayuda con un cifrado vernam
25 Agosto 2017, 21:10 PM
hola estoy tratando de hacer un cifrador vernam para lo que se me ocurrio utilizar la clave como semilla de un generador de numeros pseudo-aleatorios para cifrar el mensaje y hacerla lo suficientemente grande como para eludir al test de kasinsky, pero lei que los generadores que hay no son criptograficamente seguros, asi que improvise uno, pero no se que tan bueno es. Alguien sabra o podra hacerle los test para saber si es bueno o no, o explicarme como hacerlo?

el codigo basico del generador (no del cifrador) es este:

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

void main() {
char clave[30];
unsigned char *subc;
int i,j,n,k,l,m,salto;
long numero;
unsigned long long semilla;

printf("ingrese la clave\n");
gets(clave);

n=strlen(clave);

subc=malloc(n*n);

semilla ^= semilla;
l ^= l;

for(i=0;i<n;i++)
   semilla += (long long)clave[i];
   
semilla <<= 1;
semilla++;

for(m=0;m<n;m++) {
for(i=0;i<n;i++) {
for(j=0;j<clave[i];j++) {
semilla *= semilla;
semilla %= 2147483629;
semilla *= 16811;
semilla %= 2147483629;
}

numero = (long) semilla;
// printf("%12u   %08X\n",numero,numero);

salto ^= salto;
for(k=7;k>=0;k--) {
if(!clave[i]&1<<k)
    salto++;
subc[l] <<=1;
if(numero & 1<<(k+23-salto))
    subc[l]++;
}
l++;
}
}

printf("\n");

for(i=0;i<n;i++) {
   for(j=0;j<n;j++)
      printf("%4d\n",subc[i*n+j]);
   //printf("\n");
}

for(i=0;i<(n*n-1);i++)
subc[i] ^= subc[i+1];

for(i=0;i<(n*n-1);i++)
   printf("%4d\n",subc[i]);

for(i=0;i<(n*n-2);i++)
subc[i] ^= subc[i+1];

for(i=0;i<(n*n-2);i++)
   printf("%4d\n",subc[i]);

for(i=0;i<(n*n-3);i++)
subc[i] ^= subc[i+1];

for(i=0;i<(n*n-3);i++)
   printf("%4d\n",subc[i]);

free(subc);
}


esto es lo basico, solo saca por pantalla la secuencia generada.
#10
hola, estoy tratando da hacer un cifrador tipo vernam pero en lugar de una clave corta, esta la uso como semilla de un generador pseudo-aleatorio que improvise, este usa un generador congruencial lineal multiplicativo como el que usa mathlab pero con valores ligeramente distintos y una forma de seleccion de bits de ese numero para generar el numero final ( 8 bits) luego uso un xor entre los numeros generados para generar otra secuencia n-1 mas chica, mi problema es que no se si los numeros son lo suficientemente aleatorios y fuertes como para ser usados en el cifrado, alguien puede o sabe hacer las pruebas necesarias?

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

void main() {
char clave[30]="";
unsigned char *subc;
int i,j,n,k,l,m,salto;
long numero;
unsigned long long semilla;

printf("ingrese la clave\n");
gets(clave);

n=strlen(clave);

subc=malloc(n*n);

semilla ^= semilla;
l ^= l;

for(i=0;i<n;i++)
  semilla += (long long)clave[i];
 
semilla <<= 1;
semilla++;

for(m=0;m<n;m++) {
for(i=0;i<n;i++) {
for(j=0;j<clave[i];j++) {
semilla *= semilla;
semilla %= 2147483629;
semilla *= 16811;
semilla %= 2147483629;
}

numero = (long) semilla;
// printf("%12u   %08X\n",numero,numero);

salto ^= salto;
for(k=7;k>=0;k--) {
if(!clave[i]&1<<k)
  salto++;
subc[l] <<=1;
if(numero & 1<<(k+23-salto))
  subc[l]++;
}
l++;
}
}

printf("\n");

for(i=0;i<n;i++) {
  for(j=0;j<n;j++)
     printf("%4d\n",subc[i*n+j]);
  //printf("\n");
}

for(i=0;i<(n*n-1);i++)
subc[i] ^= subc[i+1];

for(i=0;i<(n*n-1);i++)
  printf("%4d\n",subc[i]);

for(i=0;i<(n*n-2);i++)
subc[i] ^= subc[i+1];

for(i=0;i<(n*n-2);i++)
  printf("%4d\n",subc[i]);

for(i=0;i<(n*n-3);i++)
subc[i] ^= subc[i+1];

for(i=0;i<(n*n-3);i++)
  printf("%4d\n",subc[i]);

free(subc);
}


esta es una version algo primitiva pero hace precisamente lo que dije