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 - huchoko

#1
int fat32_open_file(uint8_t* filename, uint8_t* buff)
{
if (!hd_exists() && !filename)
return 1;
hd_read(start_of_root, FAT32_FILES_PER_DIRECTORY * sizeof(struct DirectoryEntry), (uint8_t*)&drce[0]);

for (int i = 0; i < FAT32_FILES_PER_DIRECTORY; ++i) {
if (drce[i].file_name[0] == FAT32_NO_FILES)
break;
uint8_t* fatbuff = 0;
uint8_t fil[12];
fat2human(drce[i].file_name, fil);
trimName(fil, 11);
if (strcmp((char*)fil, (char*)filename) == 0) {
uint8_t fcluster = ((uint32_t)drce[i].cluster_number_hi) << 16 | ((uint32_t)drce[i].cluster_number_lo);   
int32_t ncluster = fcluster;
int32_t file_size = drce[i].file_size;

kputs("\nFile content: \n");

/* 1 sector file (less than 512 bytes) */
if (file_size < 512) {
hd_read(fcluster, 512, buff);
buff[file_size] = '\0';
//kputs("%s", (char*)buff);
}

while (file_size > 0) {
uint32_t fsect = start_of_data + bpb.sectors_per_cluster * (ncluster - 2);
uint32_t sector_offset = 0;
for (; file_size > 0; file_size -= 512) {
hd_read(fsect + sector_offset, 512, buff);
buff[file_size > 512 ? 512 : file_size] = '\0';
//kputs("%s", (char*)buff);
if (++sector_offset > bpb.sectors_per_cluster)
break;
}
uint32_t fsectcurrentcl = ncluster / (512 / sizeof(uint32_t));

hd_read(fat_start + fsectcurrentcl, 512, fatbuff);
uint32_t foffsectcurrentcl = ncluster % (512 / sizeof (uint32_t));
ncluster = ((uint32_t*)&fatbuff)[foffsectcurrentcl] & 0x0FFFFFFF;
}
return 0;
}
}
kputs("\nFile %s not found\n", filename);
return 1;
}

Funciona, pero hay un problema. Debo darle un tamaño al buffer:

uint8_t fileb[1024];
fat32_open_file(buff, fileb);

La cosa es que no se puede saber el tamaño del buffer pasado por la función, puede ser de 512, 2048, etc.
Hay una forma de hacer que fileb sea dinámico?
#2
Buenas, tal cual en el título, nececito probar si varios bits de una variable estan "seteados" osea valen 1 (como saben bit 0 o 1).
Puedo comprobar un solo bit con:

if (variableacomprobar & indexdelbit) {
    /* etc... */
}

Pero como lo hago para varios a la vez?
Por ejemplo, tengo una varible con dos bits que quiero comprobar a la vez:
Bits 7 y 6: quiero comprobar si el uno (bit 7) y el cero (bit 6) valen 1 y viceversa. Osea:

|15...|7|6|5|4|3|2|1|0|
       | |
       1 0
     Ó
       0 1

Espero haberme explicado bien, cualquier confusión preguntenme por aclaración. :)
#3
Buenas, he estado tratando de crear un array de strings, para luego leer todas sus strings.

/* Reservamos 16 elementos de string */
char* file_names_in_dir[16];
for (int i = 0; i < FAT32_FILES_PER_DIRECTORY; ++i) {
        ...
if (drce[i].file_name[0] == 0x00)
break;
file_names_in_dir[i] = drce[i].file_name;
++files_in_directory;
}
...
printf("%s", file_names_in_dir[0]);
...

El tema es que funciona, pero luego de imprimir la string correctamente le sigue basura.
por ejemplo, file_names_in_dir[0] es "HELLO TXT", pero luego la string sigue, pero con basura.
Alguna idea? Gracias.
#4
Programación General / Bug en GDB?
3 Junio 2019, 06:12 AM
Buenas. Érase un día normal y corriente, yo programando y buscando bugs con mi que creía fiel debugger GDB. El tema es que de la nada los breakpoints dejaron de funcionar, asi por si nada, sin haber hecho ninguna cosa rara, obiamente haciendo el debugger inútil  ;-)
Estoy haciendo una sesión remota; (target remote localhost:1234), luego cargé los símbolos (symbol-file foo.elf)
y luego el breakpoint (b syscall.c:27).
Pero aparece: No line 27 in file "syscall.c". y luego Make breakpoint pending on future shared library load? (y or [n]). Siendo que el archivo syscall.c y la línea 27 existen.
Le doy a Y, y nada, de por sí por que no sirve, y luego N, y aun así nada. El breakpoint nunca existió.

La versión de mi debugger es GNU gdb (Ubuntu 8.1-0ubuntu3) 8.1.0.20180409-git.
Un bug? Alguna solución? Estoy desesperado sin mi debugger :S
Saludos
PD: GDB y sesión remota son de la misma arquitectura (x86_64)
#5
Buenas, he hecho una implementación de printf, sin usar vsnprintf (por que no puedo).
Funciona bien, pero si trato de formatear un número hexadecimal y aveces cadenas, se descontrola todo, por lo que pienso que se me está colando un terminador nulo '\0' .
Ejemplo:
kputs("r8: %x    r9: %x    r10: %x", r->r8, r->r9, r->r10);
Salida:
r8: b8000└
Sólo me imprime r8  y de ahí el valor en hexadecimal, pero los demás los ignora y no imprime r9 ni r0.
Nótese el carácter "└" el cual no es esperado.

int kputs(const char *fmt, ...) {
/* Hacer nada si la cadena esta vacia. */
if (!fmt)
return 0;
char buffer[1024] = {0};
va_list args;

size_t cout;
unsigned int* charc;
va_start(args, fmt);

for (cout = 0; cout < strlen(fmt); ++cout) {
switch (fmt[cout]) {
case '%':
switch (fmt[cout + 1]) {
case 'c':
charc = va_arg(args, unsigned int);
putch(charc);
++cout;
break;
case 's':
charc = (int*) (va_arg(args, unsigned int));
strcpy(buffer, (const char*) charc);
print_string(buffer);
++cout;
break;
case 'i':
charc = va_arg(args, int);
itoa(charc, buffer, 10);
print_string(buffer);
++cout;
break;
case 'X':
case 'x':
charc = va_arg(args, int);
itoa((unsigned)charc, buffer, 16);
print_string(buffer);
++cout;
case '%':
putch("%");
++cout;

default:
va_end(args);
return 1;
}
break;
default:
putch(fmt[cout]);
break;
}
}
va_end(args);
return cout;
}

Las funciones itoa no creo que sean el problema, por que mi implementación no tiene problemas para imprimir enteros. (excepto que se desborda con un número muy grande, eso se arregla fácil)
#6
Pues digamos que dentro de una carpeta tengo más carpetas, de las cuales hay aún más carpetas. Cómo puedo borrar archivos de una misma extensión recursivamente en todas las carpetas que estén dentro de la carpeta principal?
Se que puedo usar rm -rf *.o, pero tengo miedo de dispararme el pie y borrar todo el disco entero.
Saludos  :)
#7
Pues eso, no logro hacer que Bochs use archivos ISO envez de archivos IMG. Nececito usar Bochs por su debugger.
Alguna idea?
Saludos
#8
Hola de nuevo aquí, veo que esta sección es algo relajada.
En fin, me gustaría saber como puedo pasar argumentos a una función de C desde NASM.
Ejemplo tengo una función en C declarada así:
void k_readkb(char* buf, int n);
Como podria pasar un argumento que tengo en ecx (a ecx se mueve un puntero a un area de memoria, que es un buffer, donde se dejaran los caracteres, un resb en .bss) hacia el primer argumento de la función de C y edx al 2do argumento de la función? Y en caso de que tenga más argumentos?
Me lio un poco con los registros, y no he encontrado mucho acerca de esto.
Saludos.
#9
Es posible (en C) tener una función dentro de un struct? Algo así más o menos:

struct foo
{
    int bar = 3;
    int sumar(int x, int y);
};

int sumar(int x, int y)
{
    x += y;
}

int main()
{
    struct foo asd;
    int spam = asd.bar;
    asd.sumar(5, 5);
    return 0;
}

Escuche que en C++ se podía, pero como lo puedo hacer en C?
La idea seria tener funciones mas organizadas, se podría con POO si estuviera en C++, pero sinceramente me da asco la forma en que se declaran clases en C++  ;-), aparte que solo puedo usar C ahora.
Saludos
#10
ASM / cmp no funciona
22 Febrero 2019, 19:58 PM
Pues tengo esta simple rutina en ensamblador (NASM):
Código (asm) [Seleccionar]

isr80:
    cli
    push byte 0
    push byte 80
    cmp eax, 3
    je .read_srv
    cmp eax, 4
    je .write_srv
    jmp .end
    .read_srv:
    mov ecx, strinputbuff
    mov eax, ebx
    call k_readkb
    xor eax, eax
    .write_srv:
    mov ecx, testmsg
    push ecx
    call kputs
    pop ecx
    jmp isr_common_stub
    .end:

Bueno, si mueves el valor 4 a eax, te imprime un texto, si mueves 3 a eax te lee el teclado, etc.
Pero no funciona, sea cual sea el valor que mueva a eax igualmente salta a la subrutina .write_srv.
Me tiene loco este error (por que no es la primera vez que me pasa, cada vez que uso cmp). Alguna idea?
PD: No estoy programando para un SO en específico.
#11
Pues eso, trato de crear un .iso a partir de un .img, pero el mkisofs se hace el chistosito y me dice que el archivo .img no existe cuando si.
mkisofs -o disk.iso -V Gryphus -b disk.img cdconts
Saludos
#12
Estoy escribiendo una consola en C, pues debo recibir comandos (por el teclado) y parsearlos.
E.j: tengo este comando:
echo hola! -f
Pues nececitaria separar esas strings algo asi:
["echo", "hola!", "-f"]
Osea separarlas en diferentes strings y guardarlas en un array.
Como lo podria hacer?
Saludos
#13
Hola, me gustaría saber como puedo hacer que GCC me genere sólo código objeto.
Si no saben que es el código objeto, es el código compilado, pero no "linkeado" osea que no se le ha pasado por el linker. De por sí no se puede ejecutar sin pasarlo por el linker.
Nececito el código objeto para linkearlo con otros c. objeto.
Saludos
#14
Programación C/C++ / [C] Como hacer un buffer FIFO?
30 Diciembre 2018, 19:17 PM
Pues estoy haciendo un driver de teclado, y necesito una cola o mejor dicho buffer de tipo FIFO (First in, First out) en el cual pueda insertar y quitar elementos de la lista. En sí, tiene que ser de tipo char.
Saludos.
#15
Pues he visto que C++ tiene excepciones (try, catch, throw)
Me sorprende, ya que es un lenguaje compilado y algo antiguo, casi de la edad de C.
Hay una lista de excepciones predefinidas, y algún ejemplo de como usarlas?
Saludos
#16
Pues, siendo nuevo en C++ y ahora estoy con las clases, he estado experimentando con los destructores, pero por una razón que no sé, mi programa se queda congelado.
Acá mi código:
Código (cpp) [Seleccionar]

#include <iostream>

class doggo
{
private:
std::string name, raza;
public:
doggo(std::string, std::string);
~doggo();
void mdatos();
void jugar();
};

doggo::doggo(std::string _name, std::string _raza)
{
name = _name;
raza = _raza;
}

doggo::~doggo()
{
}

void doggo::mdatos()
{
std::cout << "Nombre: " << name << std::endl;
std::cout << "Raza: " << raza << std::endl;
}

void doggo::jugar()
{
std::cout << "El perro esta jugando" << std::endl;
}

int main()
{
doggo perro1("fido", "normal");
perro1.mdatos();
perro1.jugar();
perro1.~doggo(); //objdes
std::cout << "\n";
return 0;
}

Saludos  :)
#17
Pues tengo un codigo que se compila sin problemas, pero en ninguna parte está el ejecutable supuestamente generado.
Estoy obligado a usar esta porquería de IDE, ya que trato de hacer funcionar OpenGL, que de por sí fue un reto lograr instalarlo (ni si quiera se si se instaló correctamente) no hay en ninguna parte sobre como usarlo con MinGW.
Saludos.
#18
Buenas, tengo este programa:
código ya no necesario, problema solucionado, ver abajo
#19
Pues no he encontrado mucha info acerca de ambas estructuras de datos, que alguien me las explique que son y cómo usarlas.
Saludos
#20
Tengo un juego, escrito en C, el cúal se trata del tres en raya.
Tu compites contra la computadora (el juego tiene una seudo IA)
Todo funciona bien, pero si el jugador o la seudo IA pone una ficha en el casillero 5, (el de almedio), se vuelve invisible y se bugea el juego.
Espero que logren leer mi código espagueti.  :)
Saludos.

#include <stdio.h>
#include <time.h>

void mainloop(char c[3][3]);
void inum(char c[3][3]);
void tablero(char c[3][3]);
void inusr(char c[3][3]);
void seudoai(char c[3][3]);
int win(char c[3][3]);

int main()
{
char c[3][3];
mainloop(c);

system("pause");
return 0;
}

void mainloop(char c[3][3])
{
int j;
int i = 0;
inum(c);
tablero(c);

do
{
system("cls");
tablero(c);
if(i % 2 == 0)
{
inusr(c);
}
else
{
seudoai(c);
}
j = win(c);
++i;
}while(i <= 9 && j == 2);


if(j == 0)
{
printf("Ganaste!\n\n");
}
else if(j == 1)
{
printf("Perdiste!\n\n");
}
else
{
printf("Empate!\n\n");
}

}

void inum(char c[3][3])
{
int i, j;
char aux = '0';

for(i = 0; i < 3; ++i)
{
for(j = 0; j < 3; ++j)
{
c[i][j] = ++aux;
}
}
}

void inusr(char c[3][3])
{
char aux;
int i, j, k;

do
{
do
{
printf("Introduce ficha: ");
fflush(stdin);
scanf("%c", &aux);
}while(aux < '1' || aux > '9');

k = 0;

switch(aux)
{
case '1':{
i = 0;
j = 0;
if (c[i][j] == 'X' || c[i][j] == 'O')
{
k = 1;
printf("Casilla ocupada!\n\n");
}
break;
}
case '2':{
i = 0;
j = 1;
if (c[i][j] == 'X' || c[i][j] == 'O')
{
k = 1;
printf("Casilla ocupada!\n\n");
}
break;
}
case '3':{
i = 0;
j = 2;
if (c[i][j] == 'X' || c[i][j] == 'O')
{
k = 1;
printf("Casilla ocupada!\n\n");
}
break;
}
case '4':{
i = 1;
j = 0;
if (c[i][j] == 'X' || c[i][j] == 'O')
{
k = 1;
printf("Casilla ocupada!\n\n");
}
break;
}
case '5':{
i = 1;
j = 1;
if (c[i][j] == 'X' || c[i][j] == 'O')
{
k = 1;
printf("Casilla ocupada!\n\n");
}
break;
}
case '6':{
i = 1;
j = 2;
if (c[i][j] == 'X' || c[i][j] == 'O')
{
k = 1;
printf("Casilla ocupada!\n\n");
}
break;
}
case '7':{
i = 2;
j = 0;
if (c[i][j] == 'X' || c[i][j] == 'O')
{
k = 1;
printf("Casilla ocupada!\n\n");
}
break;
}
case '8':{
i = 2;
j = 1;
if (c[i][j] == 'X' || c[i][j] == 'O')
{
k = 1;
printf("Casilla ocupada!\n\n");
}
break;
}
case '9':{
i = 2;
j = 2;
if (c[i][j] == 'X' || c[i][j] == 'O')
{
k = 1;
printf("Casilla ocupada!\n\n");
}
break;
}
}
}while(k == 1);

c[i][j] = 'X';
}

void seudoai(char c[3][3])
{
int i, j, k;
//char aux;
srand(time(NULL));

do
{
i = rand() % 3; // n rand entre 0 y 2
j = rand() % 3;
k = 0;

if(c[i][j] == 'X' || c[i][j] == 'O')
{
k = 1;
}
}while(k == 1);
c[i][j] = 'O';
}

void tablero(char c[3][3])
{
int i, j;

for(i = 0; i < 3; ++i)
{
for(j = 0; j < 3; ++j) //replace ++j with ++i, and have fun!
{
if(j < 2)
{
printf(" %c |", c[i][j]);
}
else
{
printf(" %c ", c[i][j]);
}
}
if(i < 2)
{
printf("\n-----------\n");
}
}
printf("\n\n");
}

int win(char c[3][3])
{
if(c[0][0] == 'X' || c[0][0] == 'O')
{
if(c[0][0] == c[0][1] && c[0][0] == c[0][2])
{
if(c[0][0] == 'X')
{
return 0;
}
else
{
return 1;
}
}
else if(c[0][0] == c[1][0] && c[0][0] == c[2][0])
{
if(c[0][0] == 'X')
{
return 0;
}
else
{
return 1;
}
}
}
if(c[1][1] == 'X' || c[1][1] == 'O')
{
if(c[1][1] = c[0][0] && c[1][1] == c[2][2])
{
if(c[1][1] == 'X')
{
return 0;
}
else
{
return 1;
}
}
if(c[1][1] == c[1][0] && c[1][1] == c[1][2])
{
if(c[1][1] == 'X')
{
return 0;
}
else
{
return 1;
}
}
if(c[1][1] == c[2][0] && c[1][1] == c[0][2])
{
if(c[1][1] == 'X')
{
return 0;
}
else
{
return 1;
}
}
if(c[1][1] == c[0][1] && c[1][1] == c[2][1])
{
if(c[1][1] == 'X')
{
return 0;
}
else
{
return 1;
}
}
}
if(c[2][2] == 'X' || c[2][2] == 'O')
{
if(c[2][2] == c[2][0] && c[2][1] == c[2][1])
{
if(c[2][2] == 'X')
{
return 0;
}
else
{
return 1;
}
}
if(c[2][2] == c[0][2] && c[2][2] == c[1][2])
{
if(c[2][2] == 'X')
{
return 0;
}
else
{
return 1;
}
}
}
return 2;
}
#21
Pues tengo un programa el cual escribe esto:
Ñandú áéíóú
pero envés de salir eso sale esto:
?and? ?????
Solo he encontrado soluciones las cuales sólo funcionan en VS studio, en este caso lo necesito para g++
Es un std:ofstream.
#22
Programación C/C++ / Leer archivo CSV
3 Noviembre 2018, 02:50 AM
Hola, tengo este problema...
Tengo un archivo CSV, el cúal tiene esto:
Auto,4343,5832
Auto2,5343,8720
y necesito mostrar cada uno de esos valores que están separados por comas. (se podría guardar en un vector)
Todo lo que he encontrado no me ha funcionado.
Saludos
edit:
en realidad lo necesitaba para C++, pero olvide especificarlo :facepalm:, asi que es mi culpa, tendré que poortear mi código de C++ a C, para que me funcione. no me odien por mi estupidez...
#23
Tengo un
Código (cpp) [Seleccionar]
std::vector<int> a;
Cómo puedo añadir un elemento a él? Que alguien me explique.
Saludos
#24
Intento buscar todos los videos de Youtube donde he comentado, para después borrar mis comentarios.
Es posible eso?
Saludos
Vale ya lo he solucionado, solo había que dar click en comentarios en el historial... xD
#25
Tengo este código, el cual funciona, pero tiene un error garrafal.

Código (cpp) [Seleccionar]

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <ctime>

typedef struct
{
int precio;
int id;
char name[255];
char adc[512]; // caracteristicas adicionales
} prod;

void addpr(prod *a);
void db(prod *a);

unsigned int pos = 0;
unsigned int nume = 0;

int main()
{
int op = 0;

// Necesitamos una estructura llamada pres y una llamada *punpress
// la cual apuntara a pres.
prod pres[512], *punpres; // <- creando 512 estructuras??? ineficiente!!!
punpres = pres;
do
{
printf("[1]A%cadir producto [3]Ver base de datos [4]Salir\n", 164);
std::cout << "-> ";
std::cin >> op;
switch (op)
{
case 1:
addpr(punpres);
break;
case 3:
db(punpres);
break;
case 4:
return 0;
default:
std::cout << "Opcion invalida!" << std::endl;
break;
}

} while (! std::cin.fail());
return 0;
}

void addpr(prod *estr)
{
fflush(stdin);
srand(time(NULL));
std::cout << "Inserte nombre del producto: ";
std::cin.getline(estr[pos].name, 100, '\n');
std::cout << "Inserte precio: ";
std::cin >> estr[pos].precio;
estr[pos].id = rand();
++pos;
++nume;
}

void db(prod *a)
{
for (pos = 0; pos < nume; ++pos)
{
printf("Nombre: %s\n", a[pos].name);
printf("Precio: $ %i\n", a[pos].precio);
printf("ID: %i", a[pos].id);
printf("\n------------------------\n");
}
}


En el mismo código se comenta el error, pues el cual es que estoy creando 512 estructuras, por lo cúal hay un límite de productos que se pueden ingresar. Pero me gustaría hacerlo dinámico, osea que el número de estructuras sea proporcional al número de productos. O(n)?
Ya le he tratado de hacer, con malloc, pero no era lo que buscaba...
Saludos :)
PD: Si compilo esto con g++, todo bien (también probé compilando con el standard C++11 y sigue funcionando), pero si compilo con cl (el compiler de VS Studio), al ejecutarlo y elegir la opción 1, se bugea y se salta el campo de ingresar nombre a ingresar precio.
#26
Tengo este código:
Código (cpp) [Seleccionar]

#include <iostream>

void add();
void db();

typedef struct {
int price;
int id;
char name[50];
}prod;

prod a;

int main()
{
int op;

do
{
std::cout << "[1]Añadir [2]Remover [3]Ver base de datos [4]Salir" << std::endl;
std::cout << "Opcion: ";
std::cin >> op;
switch (op)
{
case 1:
add();
break;

case 3:
db();
break;
case 4:
return 0;
}
}while (1 < 5);

return 0;
}

void add()
{
std::cout << "Inserte precio del producto: ";
std::cin >> a.price;
std::cout << "Inserte ID del producto: ";
std::cin >> a.id;
std::cout << "Inserte nombre del producto: ";
std::cin >> a.name;
}

void db()
{
std::cout << "Precio del producto: " << a.price << std::endl;
std::cout << "ID del producto: " << a.id << std::endl;
std::cout << "Nombre del producto: " << a.name << std::endl;
}

Funciona, pero quiero poder añadir más de un producto, ya que si una vez añadido un producto, y se vuelve a añadir otro completamente diferente este se sobreescribe.
Alguna idea?
Saludos :)
y... perdón por mi ignorancia.  :silbar:

También, si se llega a insertar un char en el precio, el programa se bugea, como evito eso?
#27
Programación C/C++ / Dudas con C++
22 Octubre 2018, 23:36 PM
Buenas, tengo un par de dudas con C++ que necesitan un poco de aclaración.
1: unsigned
He visto en algunos códigos que algunas variables tienen un unsigned antes de declarar el tipo de dato.
Por lo que se unsigned es que no tenga signo (vaya), a si que un integer regular tendría un rango de -2147483648 al 2147483647 y un unsigned de 0 al 4294967295.
Pero para que se utilizan? En que momento se utilizan? No solo lo he visto en integers, si no en chars también.

2: std::string o char[]
En C un string se declara usando char[], pero en C++ usando std::string.
He visto códigos de C++ usando char[], pero para operar con ellos se usaba cstring.
Cúal de los dos debo usar en C++?

3: Cuando se deben usar los punteros?
Se que los punteros son variables que usan la misma dirección de memoria que otra variable y que si esta otra variable cambia, la variable puntero también cambia.
Pero en que ocasiones de deben usar, y que utilidades prestan?

4: Como puedo convertir un std::string a minúscula?
Saludos.  :)
#28
Buenas, tengo este código:
Código (cpp) [Seleccionar]

#include <iostream>

using namespace std;

int sum(int num1, int num2);

int sum(int num1, int num2)
{
return num1 + num2;
}

int main()
{
int i = sum(5, 4, 6, 7, 8); // <= como le haria para eso?

cout << i << endl;
}

Pero me gustaría poder pasarle multiples números (argumentos) a la función sum().
Como podría hacer esto?
Saludos  :)
#29
Pues estoy en Windows 10, y abriendo el administrador de tareas veo que tengo un montón de procesos que estoy seguro de que son inútiles (no son de sistema).
Me consume muchos recursos, y me gustaría saber como eliminarlos.
Saludos.
#30
Eso, que quiero aprender C++, actualmente ya se programar en C.
Ya se que en este mismo subforo hay temas con chincheta, dónde se muestran varios libros para descargar, pero no funcionan los links, apartes que son algo viejos.
De preferencia que este en español.
Saludos  :)
#31
PyConio (Python console I/O) es un módulo que provee funciones útiles para trabajar con la I/O de la consola.

Todas las funciones de PyConio tienen el similar comportamiento que conio.h.

Y lo mejor es que es Cross Platform. (osea que funciona en todas las plataformas)
Este módulo esta bajo la licencia GNU GPL v2.


Instalación
Simplemente ejecuta esto:
Código (bash) [Seleccionar]
pip3 install pyconio
en modo administrador o sudo, dependiendo de tu sistema operativo.

Funciones
Colorear texto (paleta de 4 Bits, 16 colores):



Código (python) [Seleccionar]

from pyconio import *
textcolor(Red)
print("El texto esta en rojo!")
textbackground(Green) # Color de texto se mantiene
print("Esto es un texto con fondo verde!")

textcolor(Red)
textbackground(Green)
print("spam")
reversevideo()
# Ahora el color de texto es verde y fondo es rojo
normvideo()
# Reinicia la consola a sus configuraciones por defecto


Lista de colores de la paleta de 4 Bits:
Black, Blue, Green, Red, Yellow, Cyan, Magenta, White, Gray, LightRed, LightGreen, LightBlue, LightWhite, LightYellow, LightCyan y LightMagenta.

Coloreando texto (paleta extendida de 8 Bits, 256 colores)
Código (python) [Seleccionar]


from pyconio import *

textcolor(69, 8)
print("Here")
textcolor(34, 8)
print("using")
textcolor(208, 8)
print("the")
textcolor(196, 8)
print("256")
textcolor(226, 8)
print("color")
textcolor(87, 8)
print("palette!")
   


Puedes encontrar más info aquí.

Coloreando texto (24 Bits paleta True RGB, 16,777,216 colores)
Código (python) [Seleccionar]

from pyconio import *
import colorsys as clsy
   
for i in range(256):
    color = clsy.hsv_to_rgb(i / 255, 1, 1)
    color = int(color[0] * 255), int(color[1] * 255), int(color[2] * 255)
    rgb_backgroundcolor(color[0], color[1], color[2]) # R, G, B

print()
pause()


La paleta de 8 Bits y RGB sólo están disponibles para sistemas POSIX (GNU/Linux, GNU Hurd, MacOSX, Android, etc) y sólo para Windows 10 TH2 en adelante.
Nota: Cuando el programa termina, se reinicia los colores automátcamente

Controlando la posición del cursor:
Código (python) [Seleccionar]

from pyconio import *
gotoxy(5, 5)
print("El cursor está ahora en x:5 and y:5")



Leer teclado:
Código (python) [Seleccionar]

from pyconio import *
c = getch()
print("Presionaste: %s" % c)

getch():
Lee una tecla del teclado sin esperar que el usuario presione enter y retorna la tecla.
getche():
Al igual que getch(), pero imprime la tecla presionada.
getchar():
Lee una letra del teclado, pero espera hasta que el usuario presione enter.
kbhit():
Detecta si una tecla ha sido presionada.


Colocando título a la consola:
Código (python) [Seleccionar]

from pyconio import *
title("eggs")


Pausar la ejecución del programa:
Código (python) [Seleccionar]

from pyconio import *
pause()
pause("Programa pausado ")



Escondiendo y mostrado el cursor:
Código (python) [Seleccionar]

from pyconio import *
hidecur() # El cursor está oculto
showcur() # Ahora el cursor no lo está


Limpiar la pantalla:
Código (python) [Seleccionar]

from pyconio import *
clrscr()


Obtener el tamaño de la consola:
Código (python) [Seleccionar]

from pyconio import *
a = gettermsz()

Retorna: tupla con tamaño X & Y de la consola.

Ejemplos
Un (muy) simple juego hecho usando PyConio.

PD: el código de este "juego" está en la misma repo (pyconio/demo/Walk.py), y viene incluido con el módulo.
Si quieren pueden enviarme por MP lo que hagan con este módulo, y lo pondré aquí.

Compatibilidad
Este módulo ha sido probado en Windows (10), en GNU/Linux (Ubuntu, Debian y Ubuntu WSL) y en Android usando Pydroid 3.



Cualquier problema o sugerencia, comuníquenla atravez de un MP.
La repo está acá, en caso de que quieran contribuir, o si tienen un problema, aunque preferiblemente si el problema será escrito en español, mejor escríbanme un MP como dije anteriormente.
Espero que mi "trabajo" les sea útil.
Saludos! :)
#32
Scripting / Librería pyANSI by konniskatt
19 Agosto 2018, 04:17 AM
borren este tema
#33
Soulcionado, gracias