Signaler

Explication de code svp :) [Résolu]

Posez votre question Reinhardr 2Messages postés mercredi 14 septembre 2016Date d'inscription 14 septembre 2016 Dernière intervention - Dernière réponse le 23 sept. 2016 à 18:34
Bonjour je suis passé en examen pour expliquer un code tiré au hasard x) ... malheureusement sa s'est mal passée j'ai pu expliaué les fonctions au dessus mais le main avec ces paramètres étaient plus difficile à expliquer. Si vous pouviez m'expliquer le main ligne par ligne par ligne x) pour savoir au moins ce que cela signifiait. J'ai aucune idée de la fonction du code.
#include <unistd.h>
 
void    ft_putchar(char c)
{
    write(1, &c, 1);
}
 
void    ft_putstr(char *str)
{
    int index;
 
    index = 0;
    while (str[index] != '\0')
    {
        ft_putchar(str[index]);
        index = index + 1;
    }
}
 
int     main(int argc, char **argv)
{
    int i;
    int j;
 
    i = 1;
    if (argc != 10)
    {
        ft_putstr("Erreur\n");
        return (0);
    }
    while (i < 10)
    {
        j = 0;
        while (j < 9)
        {
            ft_putchar(argv[i][j]);
            ft_putchar(' ');
            j = j + 1;
        }
        ft_putchar('\n');
        i = i + 1;
    }
    return (0);
}

Merci :)
Afficher la suite 
Utile
+0
moins plus
Salut,

Mets dans des balises "C" stp.
Reinhardr 2Messages postés mercredi 14 septembre 2016Date d'inscription 14 septembre 2016 Dernière intervention - 14 sept. 2016 à 09:31
C'est bon ?
Répondre
Pierre1310 6979Messages postés lundi 21 décembre 2015Date d'inscription 23 septembre 2016 Dernière intervention - 14 sept. 2016 à 10:40
Non, il faut que tu mettes ton code dans des balises codes C
Répondre
Ajouter un commentaire
Utile
+0
moins plus
Salut,

en gros ce code va ecrire dans un fichier le contenu de argv, si argc à une valeur de 10 . (donc 9 arguments)

Ce qui est bizarre c'est qu'il faut que argv soit un tableau minimum de 10*9 (sinon ca ira lire dans la mémoire avec des chances de planter).

après
write(1, &c, 1);
m'étonne car on donne un id de fichier ouvert fixe (1) ... c'est peu être un trick que je ne connais pas mais bon.

naga
nagaD.scar 3867Messages postés samedi 8 septembre 2007Date d'inscription 20 septembre 2016 Dernière intervention - 15 sept. 2016 à 10:48
Ce que j'ai dis est pas très clair. En gros ton main check qu'il y a bien 9 arguments en commande de lancement et va écrire les 9 premiers caractères de chaque argument ( 9 + 1 qui est le nom de l exe) dans un fichier qui n'est jamais ouvert (d après le code en tout cas), chaque caractères séparés par un espace, chaque arguent par un saut de ligne.
Répondre
Rocailleux 389Messages postés mercredi 9 mars 2016Date d'inscription 21 septembre 2016 Dernière intervention - 15 sept. 2016 à 13:20
1 = stdout
ce qui revient à faire un simple
putchar(c);

(ce qui est le but de la fonction)
Répondre
nagaD.scar 3867Messages postés samedi 8 septembre 2007Date d'inscription 20 septembre 2016 Dernière intervention - 15 sept. 2016 à 13:25
ok merci je connaissais pas ce petit trick ;)
Répondre
Ajouter un commentaire
Utile
+0
moins plus
Ce programme écrit, comme l'a dit nagaD.scar, les 9 premiers caractères des 9 premiers arguments du programme.

Cependant on observe plusieurs problèmes majeurs dans le programme (je ne sais pas s'il faisait partie de l'exercice de les décler ;-) ), qui en font un code de très mauvaise qualité.

1. Le message d'erreur correspondant au nombre de paramètres n'est pas clair. Il ne dit pas quelle est l'erreur.

2. La ligne suivante, on observe un code de retour 0 pour une erreur (il devrait être 1, ou, mieux, EXIT_FAILURE).

2. Il n'y a pas du tout de vérification que les arguments du programme font au moins 9 caractères. Il faut absolument en mettre une.

3. Aucune vérification d'erreur non plus pour l'appel-système write.

4. Des équivalents aux fonctions ft_putstr et ft_putchar existent déjà dans la bibliothèque standard (printf, par exemple, remplace les deux). La création de ces fonctions, en plus de complexifier le programme pour rien, le rend non-portable (le header <unistd.h> n'existe que sous les systèmes UNIX).

5. Et beaucoup de questions de style, dont
index = index + 1;
qui devrait plutôt être écrit
index++;
.

Sinon, le programme expliqué ligne par ligne:

#include <unistd.h> // On inclue le header <unistd.h> pour la fonction write()
 
void    ft_putchar(char c) // Définition de la fonction ft_putchar, qui affiche un caractère
{
    write(1, &c, 1); // On écrit le caractère sur le flux de sortie standard (de file descriptor 1).
}
 
void    ft_putstr(char *str) // Définition de la fonction ft_putchar, qui affiche une chaîne de caractères
{
    int index; // Définition de la variable index
 
    index = 0; // Initialisation de la variable index à 0
    while (str[index] != '\0') // Tant que nous ne tombons pas sur le caractère \0 (qui indique la fin d'une chaîne de caractères)...
    {
        ft_putchar(str[index]); // On affiche le caractère à l'index
        index = index + 1; // On incrémente l'index pour qu'il corresponde au caractère suivant
    }
}
 
int     main(int argc, char **argv) // Définition de la fonction main
{
    int i; // Définition de la variable i
    int j; // Définition de la variable j
 
    i = 1; // Initialisation de la variable i à 1
    if (argc != 10) // S'il n'y a pas 10 arguments (note: le premier correspond à l'emplacement du programme, ou plus précisément à la commande qui a été écrite dans le shell pour l'exécuter)
    {
        ft_putstr("Erreur\n"); // On affiche "Erreur"
        return (0); // On arrête le programme et on retourne un code de... succès (oui, c'est très incohérent) !
    }
    while (i < 10) // Tant que i est inférieur à 10 (notons au i correspond à l'argument actuel)
    {
        j = 0; // On initialise j à 0
        while (j < 9) // Tant que ju est inférieur à 9 (notons que j correspond au caractère actuel)
        {
            ft_putchar(argv[i][j]); // on affiche le caractère
            ft_putchar(' '); // on affiche un espace
            j = j + 1; // on incrémente j
        }
        ft_putchar('\n'); // On affiche un retour à la ligne
        i = i + 1; // On incrémente i
    }
    return (0); // On retourne 0 (code de succès, fin du programme)
}


Ajouter un commentaire

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !