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

#51
Es por la línea 103:
for( int i=0; i<argc; i++){
Lo que haces es usar argc en vez del valor conseguido por argv[1]
#52
Muy buenas. Prueba el siguiente código, he añadido unas líneas para controlar que los parámetros son más de uno:


// Comprobamos que existe más de un parámetro (el nombre) en la línea de comandos
if(argc < 3) {
   fprintf(stderr, "%s\n", "Debe introducir la longitud de la clave...");
   exit(EXIT_FAILURE);
}

/*El 1º parámetro siempre va a ser la longitud de la clave*/
if(sscanf(argv[1], "%u", &longitud_clave) == 0) {
    fprintf(stderr, "%s\n", "El primer parámetro debe ser un entero. Indica la longitud de la clave...");
    exit(EXIT_FAILURE);
}
#53
En según qué construcciones a mi me gusta usar la función fseek después de un scanf:


#include <stdio.h>

int main() {
    char str[1024];
    printf("> ");
    scanf("%1024[^\n]", str);
    printf("%s\n", str);
   
    fseek(stdin, 0, SEEK_END);
   
    puts("");
    printf("> ");
    scanf("%1024[^\n]", str);
    printf("%s\n", str);
}


fseek lleva el puntero al final del archivo stdin, pero como es un stream lo que ocurre es que se descarta todo su contenido y queda preparado para nuevas entradas. El ejemplo anterior funciona para gcc y su contrapartida MinGW64 de Windows. Desconozco si otros compiladores aceptan esta instrucción.
#54
Entiendo que cuándo eliges sí el problema es que no te pide otra cadena.

Cambia la cadena del scanf  de la selección por scanf("%d%*c", &op);

Un asterisco después del % hace que se consuma esa entrada pero no la cargue en ninguna variable. En este caso se consume el último carácter que es el '\n' del return. Si no lo haces se queda en la caché del teclado y el siguiente scanf (que en tu caso pide una nueva cadena) encuentra el carácter de nueva línea y lo carga en la variable.
#55
Si se me permite un inciso, y por lo que sé, todos los punteros en C (repito: punteros) tienen el mismo tamaño: un tamaño capaz de guardar una dirección de memoria.
Otra cosa es el tipo del puntero: éste le dice al compilador el tamaño del dato al que se apunta para que cuándo se dereferencíe tome tantos bytes de la memoria a partir de la dirección del puntero para trabajar con él.
Es decir, un puntero en sí da igual que sea int, long, unsigned, o una función de muchos parámetros, es solo una dirección de memoria.
Por eso el void* puede convertirse en cualquier cosa, porqué únicamente guarda la información de la dirección, no del tamaño del dato y por eso el compilador necesita el cast, para saber cuántos bytes toma el dato que se guarda allí.
En los sistemas en modo real un puntero puede apuntar a cualquier sitio: a la memoria gráfica, a alguna parte del sistema operativo, a otros programas... y lo peor es que dejaba escribir allí. Por eso durante tanto tiempo los punteros eran una cosa muy temida, no académicamente, sino porqué podían causar auténticos desastres. También los virus tenían más acceso a la máquina.
Ahora con las protecciones propias del procesador y del sistema operativo un puntero mal dirigido lo único que puede conseguir es que el sistema cierre el programa.
#56
Programación C/C++ / Re: Ayuda con codigo
22 Marzo 2021, 23:58 PM
Es más, eso no sería una variable sino una función ya que realiza un trabajo, no  guarda un valor per se.
#57
Me gustó tu ejercicio. Aquí una solución mía:


#include <stdio.h>
#include <stdbool.h>
#include <stdint.h>

uint64_t complemento_a_2(uint64_t num) {
    return (num ^ -1) + 1;
}

/**
* Devuelve el valor de una resta realizada con
* complemento a dos en forma humana. Los operandos deben
* ser positivos por trabajar a nivel de bits
* a: minuendo
* b: sustraendo
* c: puntero a la variable que contendrá el resultado
* retorna: true si el resultado es negativo; false si es positivo
*/
bool resta(uint64_t a, uint64_t b, uint64_t *resultado) {
    bool signo;

    *resultado = a + complemento_a_2(b);
    signo = *resultado >> (sizeof(uint64_t) * 8 - 1);
    if(signo) {
        *resultado = complemento_a_2(*resultado);
    }

    return signo;
}

int main() {
    uint64_t a = 3, b = 7, resultado;

    if(resta(a, b, &resultado)) {
        putchar('-');
    }
    printf("%I64u\n", resultado);
}
#58
Al igual que Linux tiene man, Microsoft tiene su propia documentación de su API. La de la función a que te refieres es la siguiente: https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-createthread
Está bien explicada, sus parámetros, su valor de retorno, un ejemplo explicado...
#59
Programación C/C++ / Re: Me pisotean las variables
12 Noviembre 2020, 17:17 PM
Pon el código que se encarga de leer todos los datos del fichero.
#60
Normalmente si buscas la API de los frameworks encuentras la respuesta. En este caso: https://docs.panda3d.org/1.10/cpp/programming/using-cpp/reference-counting