• [^] # Re: Qu'est-ce qui te bloque?

    Posté par . En réponse au message Shell script-->langage C. Évalué à 1. Dernière modification le 23 novembre 2015 à 14:45.

    C'est bon début !

     /* charge les déclarations de fopen,fclose,fprintf */
    #include <stdio.h>
    

    Tu rajouteras ici aussi les autres entêtes pour stat() et cie, cf. suite.
    Aussi stdlib.h pour utiliser exit() dans la gestion des erreurs...

    int main()
    {
    int p; char tab[max_N];

    max_N ?
    1) c'est une définition non standard
    2) admettons que cela équivaut à INT_MAX ou autre provenant de /usr/include/limits.h,
    tu risque au pire d'allouer beaucoup de mémoire sur la pile pour rien, au mieux d'exploser la pile directement...
    Tu pourrais utiliser PATH_MAX, mais bon essayons de calculer au plus juste :

    #define GPIO_DIRECTORY_FORMAT "/sys/class/gpio/gpio%d/"
    /* Cela marche jusqu'à gpio <= 99 */
    /* invariant: strlen("direction") > strlen("value"), cf. plusbàs */
    char tab[sizeof(GPIO_DIRECTORY_FORMAT)+sizeof("direction")]
    

    int gpio = 26;
    p=open("/sys/class/gpio/export", O_WRONLY);
    sprintf(tab, "%d", gpio);
    write(p, tab, strlen(tab));
    close(p);

    On peut remplacer write par fprintf, pas besoin de créer une chaîne temporaire du coup. Cela devient:

    FILE *f = fopen("/sys...", O_WRONLY);
    fprintf(f,"%d", gpio);
    fclose(f);
    

    sprintf(tab, "/sys/class/gpio/gpio%d/direction", gpio);

    Toujours éviter les fonctions de formatage et d'io qui ne sont non-bornées pour éviter un dépassement de tampon.

    -> snprintf(tab,sizeof(tab), GPIO_DIRECTORY_FORMAT "direction", gpio);

    p = open(tab, O_WRONLY);
    write(p, "out", 1);

    le 1 n'est pas bon...

    write(p, "in", 3);
    close(p);

    Idem j'utiliserais plustôt le IO haut niveau, open -> fopen, write -> fputs/fprintf.

    if [ -d "$GPIOPIN" ] then

    devient:

    #include <sys/types.h>
    #include <sys/stat.h>
    #include <unistd.h>
    struct stat sb;
    if (0 != stat("....", &sb)) {
     /* traiter l'erreure... */
    }
    if ((sb.mode & S_IFMT) == S_IFREG) {
    

    fprintf ("Blinking LED connected to Pin $PIN ...")

    fprintf -> printf ou fprint(stdout,...)
    }
    else {
    

    else
    // echo $PIN > /sys/class/gpio/export

    Idem, couple fopen, fprintf/fputs, fclose...

    fprintf("Blinking LED connected to Pin $PIN ...")
    idem, fprintf prent un FILE* comme premier argument, printf utilise stdout implicitement.

    //sleep 1
    usleep () ???

    else

    Utilise systématiquement des accolades quand tu imbriques les instructions de contrôles, cela est plus lisible et moins sujet à se tromper.

    while (true) do
    {

    sprintf(tab, "/sys/class/gpio/gpio%d/value", gpio);

    Déplace cela hors de la boucle, pas besoin de recalculer le chemin à chaque itération
    -> snprintf(tab,sizeof(tab), GPIO_DIRECTORY_FORMAT "/value", gpio);

    p = open(tab, O_WRONLY);
    write(p, "1", 1);

    write(p, "0", 1);
    close(p);

    ok

    return 0;
    }

    Pour apprendre, rien de mieux que de consulter les manpages de toutes les fonctions/headers mentionnés précedemment.
    genre sur manpages.debian.net ou sur ton système (man 2 xx ou man 3 xx).