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

#331
En C++?
Si el & está en el prototipo de la función ese argumento será una referencia: la función puede modificar el valor en la función llamante. Sin el & el argumento es una copia, es decir, la función no puede modificar el valor en la función llamante.
#332
La función acepta un único altelta, en cambio tu le pasas un array entero.
#333
La única forma que se me ocurre es que mientras desconozcas el sistema operativo del cual se trata sean punteros a void. Ya que los punteros siempre tienen el mismo tamaño no habrá quejas por parte del compilador en ningún caso. Una vez conozca el tipo de sistema operativo que se trata puedes generar de forma dinámica el tipo de estructura que requieras mediante malloc. Lo único que tendrás que tener en cuenta es que debes liberarlo cuando cierres el programa en la función de limpiar recursos, en el main o con atexit, según hagas la limpieza.

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

int main() {
    void* pointer;

    pointer = malloc(sizeof(int));
    *(int*)pointer = 3;
    printf("%d\n", *(int*)pointer);
    free(pointer);

    pointer = malloc(sizeof(char)*(strlen("Una cadena")+1));
    strcpy((char*)pointer, "Una cadena");
    printf("%s\n", (char*)pointer);
    free(pointer);
}


Sí, el código es un poco feo, pero en C es la forma de tener un tipo de objeto genérico.
#334
Sé específico pues la explicación genérica no se entiende.
Por otra parte no se puede obtener el valor de una operación si antes no se ha hecho.
Ya te digo, expón el problema de forma más específica y a lo mejor encontramos otra forma de atacarlo.
#335
Sin el trozo de código es difícil decir.
#336
A mi me ha dado la impresión de que lo que quiere es saber si una fecha va antes de otra y que desconocía que con time.h se puede hacer.
#337
No puedes definir enums dentro de una estructura, debes hacerlo fuera. Las estructuras son variables reunidas de forma lógica, por tanto no tiene sentido crear ese tipo de dato dentro. Lo que puedes hacer es sacarlos fuera y crear sus variables dentro del struct.
#338
Y qué tal si de hace con time.h, que ya tiene todo eso pensado?
#339
A ver, muchas cosas.
¿Estás usando C++ para compilar C?

En C no hay valores por defecto en los argumentos, así que esto
int generateRandom(int number = '1'){
está mal.

C no tiene el tipo de dato bool por defecto (tampoco false ni true), hay que incluir la librería stdbool para ello.

Inicializar cadenas:
char lxr[101];
strcat(lxr, "/home/");
strcat(lxr, user);
strcat(lxr, "/");
strcat(lxr, "readme.txt");

Todo esto se puede sustituir por una familia función de la familia printf:
char lxr[101];
sprintf(lxr, "/home/%s/readme.txt);

Por otra parte
// Global
char boot[21];
// ...
// Local en una función
strcat(boot, "/");
strcat(boot, "etc");
strcat(boot, "/");
strcat(boot, "rc.d");
strcat(boot, "/");
strcat(boot, "rc.local");

Podrías cambiarlo por
strcpy(boot, "/etc/rc.d/rc.local");
Y así reducir el tamaño del código y quede mejor a la vista. Aparte de que no pasas tanto tiempo llamando a funciones. Fíjate que que he hecho strcpy y no strcat porque aquí te salvas porque las cadenas globales se inicializan a 0. Pero si fuera una local o ya tuviera algo dentro copiaría la dirección al final de lo que hubiera causando un fallo. Usando esta técnica de strcat sucesivos asegúrate que el primero sea un strcpy.
De todas formas como sólo vas a usar esa variable de forma local puedes inicializar la variable de esta forma:
char boot[21] = "/etc/rc.d/rc.local";
Aunque también usando la característica de que en definiciones C te calcula el tamaño del array
char boot[] = "/etc/rc.d/rc.local";
Y apurando un poco más, ya que estás trabajando con una cadena literal y no vas a modificarla puedes dársela directamente a un puntero
char* boot = "/etc/rc.d/rc.local";

Código redundante:
if(remove(lxr) == 0){
   remove(lxr);
}

En el if ya has llamado a remove y dices que si ha tenido éxito en borrar lo llame otra vez.

Arrays de punteros:
void wn(void){
   char *path[432];
   strcat(*path, "C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs\\StartUp\\");
}

Así no puedes construir una cadena porque cada elemento del array son punteros a char, no son char. Esto te podría dar fallos multiorgásmicos (palabro intencionado :D).

Comparar cadenas:
if (OS == "Linux"){
   lx();
}
else if (OS == "Windows"){
   wn();
}
else if (OS == "Mac"){
   mc();
}


El == no compara cadenas tipo C. Pero aquí te salvas por una característica de C: todas las cadenas literales iguales tienen una única copia en memoria y todas sus apariciones en el código apuntan al mismo sitio, así C ahorra memoria (y esta es la causa por la que una cadena literal no puede ser modificada). Por tanto si comparas dos cadenas literales, dos punteros que hayan sido definidos con la misma cadena o un de estos punteros con la misma cadena literal C devolverá cierto.
#340
Programación C/C++ / Re: Código strtok
16 Julio 2018, 17:51 PM
Imagínate que strtok esta construida así (no es realmente así pero sirve para que veas como podría funcionar):

char* mi_strtok(char *str, const char *delim) {
    char *ret_dir;
    static char *intermedio;
    static char *fin;

    if(str) {
        ret_dir = str;
        fin = str+strlen(str)+1;
    }
    else
        ret_dir = intermedio+1;

    if(ret_dir >= fin)
        return NULL;

    intermedio = strpbrk(ret_dir, delim);
    if(intermedio)
        *intermedio = '\0';
    else
        intermedio = fin;

    return ret_dir;
}