IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Quelques précisions. . .


Sujet :

C

  1. #81
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    309
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 309
    Par défaut
    Citation Envoyé par Thierry Chappuis Voir le message
    Rien à voir avec les nombres premiers
    Mes pensées se sont embrouillées, c'est corrigé.

  2. #82
    Membre confirmé Avatar de Array
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    210
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 210
    Par défaut
    Je comprends maintenant ce qu'est le complément à deux.
    Cependant, questions...


    Question 1:

    Il faut inverser les chiffres en fonction du nombre de bits, c'est cela?

    Par exemple, sur une machine à 8 bit, "-13" sera : 1111 0011
    Sur une machine à 10 bit, cependant, "-13" sera : 11111 10011



    Question 2:


    Sur ma calculatrice, le bit de signe ne fonctionne pas. Cependant, le complément à 2 fonctionne [ma calculatrice est une sharp 10 bit scientifique]. Est-ce normal où est-ce moi qui n'a pas compris le bit de signe?!


    Question 3:

    Si j'ai bien compris le bit de signe, la représentation se fait également en fonction du nombre de bits de la machine.

    Par exemple, sur du 8 bit, "-13" sera : 1000 1101
    Sur du 10 bit, "-13" sera : 10000 01101

    C'est bien cela?

  3. #83
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    309
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 309
    Par défaut
    Citation Envoyé par Array Voir le message
    Question 1:

    Il faut inverser les chiffres en fonction du nombre de bits, c'est cela?

    Par exemple, sur une machine à 8 bit, "-13" sera : 1111 0011
    Sur une machine à 10 bit, cependant, "-13" sera : 11111 10011
    Quand on souhaite définir une représentation des nombres relatifs on doit bien entendu définir un nombre de bits fixe pour pouvoir les représenter. Donc quand on parle d'inverser les bits on dit bien d'inverser tous les bits.
    Le nombre -13 codé sur 32 bits en complément à 2 donne ça :
    1111 1111 1111 1111 1111 1111 1111 0011


    Citation Envoyé par Array Voir le message
    Question 2:

    Sur ma calculatrice, le bit de signe ne fonctionne pas. Cependant, le complément à 2 fonctionne [ma calculatrice est une sharp 10 bit scientifique]. Est-ce normal où est-ce moi qui n'a pas compris le bit de signe?!
    Le bit de signe c'est l'une des trois techniques de représentation ds nombres relatifs (avec le complément à 2 et à 1), si ta calculette utilise le complément à 2 pour représenter les nombres relatifs le bit de poids fort te dira que c'est un nombre négatif ou pas, mais inverser sa valeur ne donnera pas la valeur opposé du nombre qu'il représente.
    La technique de bit de signe n'est pas très utilisé parce qu'elle crée deux représentations du 0 (1000 0000 et 0000 0000 représentent respectivement -0 et +0- et que l'addition est plus difficile.


    Citation Envoyé par Array Voir le message
    Question 3:

    Si j'ai bien compris le bit de signe, la représentation se fait également en fonction du nombre de bits de la machine.

    Par exemple, sur du 8 bit, "-13" sera : 1000 1101
    Sur du 10 bit, "-13" sera : 10000 01101

    C'est bien cela?
    Bien entendu, il serait idiot sur un nombre en 32 bits de laisser le bit de signe sur le 8ème bit pour représenter les nombres négatifs, ça rendrait le calcul du nombre beaucoup plus difficile. Donc on utilise toujours le bit de poids fort, parce que plus logique pour les humains.

  4. #84
    Membre confirmé Avatar de Array
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    210
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 210
    Par défaut
    Merci. Je comprend finalement.
    Cepenant, ce que je voulais dire à la question deux c'est que si ma calculatrice utilise le complément à deux, elle n'utilise paas la bit de signe.

    Par exemple, sur une machine 8 bit qui utilisserais le bit de signe, -13 serait égal à 1000 1101. Cependant, sur une machine huit bit utilisant le complément à deux, 1000 1101 équivaudra pour cette machine à un nombre autre que -13.


    Suis-je exact?

    Array

  5. #85
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    309
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 309
    Par défaut
    Oui c'est ça.

    De la même manière que 11 en décimal n'est pas égal à 11 en binaire, 11 en octal et 11 en hexadécimal :
    Décimal : 11
    Binaire : 11b = 3
    Octal : 11o = 9
    Hexadécimal : 11x = 17

  6. #86
    Membre confirmé Avatar de Array
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    210
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 210
    Par défaut
    Eh bien, voilà ça de compris!

    J'aurais maintenant une autre question... héhé.

    Voici un code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    #include <stdio.h>
     
    int main(void) {
    function("Bonjour!");
    return 0;
    }
     
    void function(char tab[15]) {
    int i;
    for (i = 0; i < 15 && tab[i] != '\0'; ++i)
             tab[i] = 283+i;       /* Cette seule ligne provoque une erreur fatale */
    for (i = 0; i < 15 && tab[i] != '\0'; ++i)
             printf("%d\n", tab[i]);
    }
    Comment faire pour mettre des nombres entiers dans un tableau de type "char" sans causer une erreur?


    Merci,

    Sincèrement,

    Array

  7. #87
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    309
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 309
    Par défaut
    C'est tout simple... t'essayes de modifier une constante !
    Pour commencer, on ne met pas de taille de tableau pour les tableaux à une dimension dans les paramètres d'une fonction, il faut mettre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void function(char tab[])
    Ensuite, il faut donner le prototype avant le main, ou alors mettre la fonction avant.
    Quand tu écris une chaîne de caractères comme ça "Bonjour!" c'est une constante, donc tu peux rien modifier dedans ! D'où le Bus error. il te faut une autre variable modifiable pour la contenir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char tab[] = "Bonjour!";
    function(tab);
    Et il faut utiliser [] et non pas * pour le type de tab, car sinon c'est comme si tu passais directement la chaîne littérale à la fonction.

    À part ça je ne comprends pas l'intérêt de passer un paramètre à la fonction si c'est pour modifier sa valeur de manière totalement indépendante !

  8. #88
    Membre confirmé Avatar de Array
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    210
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 210
    Par défaut
    Merci ça fonctionne xD

    Mais...
    Autre problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    #include <stdio.h>
    #include <string.h>
    #include <ctype.h>
    #include <stdlib.h>
     
    #define VSTORE_SZ 100
     
    void function(int vstore[]);
     
    int main(void) {
    	char fggc[100];
    	putchar('\n');
    	strcpy(fggc, "hello");
    	function((int *)fggc);
    	putchar('\n');
    	return 0;
    }
     
    void function(int vstore[]) {
    	int i;
    	i = 0;
    	while (vstore[i] != '\0') {
    		printf("%c", vstore[i]);
    		++i;
    	}
    }
    Selon moi, ce code serait supposé d'écrire "hello".
    Mais il y a un bug que je ne peux m'expliquer.

    En attendant je lis la partie de mon bouqin traitant de ce sujet, mais... Je ne suis pas arrivé là où je pourrais trouvr une explication... Et il se peut que cela soit relativement loin...


    Merci,

    Array!

  9. #89
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 411
    Par défaut
    Ben non, ça risque pas d'écrire "hello".
    Surtout en castant l'adresse du tableau de char en adresse de tableau de int...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #90
    Membre confirmé Avatar de Array
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    210
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 210
    Par défaut
    ...ne voit tu pas que je l'ai deviné?

    Ce que je veux savoir, c'est s'il est possible de donner la valeur "int" au tableau, et de soummettre au pointeur un tableau de type "char".

    poSSIBL3?

  11. #91
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 411
    Par défaut
    Qu'appelles-tu "donner la valeur \"int\" au tableau" ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  12. #92
    Membre confirmé Avatar de Array
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    210
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 210
    Par défaut
    lol.
    Je tacherai d'être plus clair.

    Ce que je veux dire, c'est cela :

    Soit une fonction "function()" qui a pour prototype:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int function(int tab[])
    Je voudrais passer à cette fonction le tableau "fggc", qui est un tableau de type "char" déclaré en main().

    cela donnerait, dans la fonction main() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    int main(void) {
          char fggc[15];
          strcpy(fggc, "hello");
          [...]
          function(fggc);
          [...]
          return 0;
    }
    Comment faire pour que "function()" accepte un tableau de type "char"?


    Merci beauoup,

    Sincèrement,

    Array

  13. #93
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Array Voir le message
    Soit une fonction "function()" qui a pour prototype:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int function(int tab[])
    Je voudrais passer à cette fonction le tableau "fggc", qui est un tableau de type "char" déclaré en main().
    Tu veux mettre un tableau de char dans un tableau d'int ? Arrête de fumer la moquette, les acariens, ça grille le cerveau...

  14. #94
    Membre confirmé Avatar de Array
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    210
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 210
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Arrête de fumer la moquette, les acariens, ça grille le cerveau...
    LoooL!

    J'en déduis que c'est impossible?

    Donc, il va fallor que j'alloue deux tableaux, un charm un int, à la place d'un seul... Dommage, moi qui voulait économiser les ressources.

    @+

    Merci, même si ta réponse, Emmanuel, était quelque peu déplacée, et peu flatante [Correction : flatteuse | Merci à Emmanuel pour la correction exhaustive de ce post].

    Array

  15. #95
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    309
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 309
    Par défaut
    Quel en est seulement l'intérêt ?

  16. #96
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Array Voir le message
    Merci, même si ta réponse, Emmanuel, était quelque peu déplacée, et peu flatante.
    Avant de faire du C, essaye déjà d'apprendre à parler français... 'flatteuse'...

  17. #97
    Membre confirmé Avatar de Array
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    210
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 210
    Par défaut
    Citation Envoyé par PsychoH13
    Quel en est seulement l'intérêt ?
    J'aimerais que la fonction soit valable pour les tableaux de type "char" et "integer".

    Tu vois, j'aurais à faire deux fonction, ou à allouer deux tableaux, un qui sera copié dans l'autre.


    Array
    Il va falloir que j'en fasse une pour les type "char" et une pour les "int"...
    S'il n'y a pas d'autre moyen...

    N'y a-t-il pas possibilité de changer le type d'un tableau?

  18. #98
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    309
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 309
    Par défaut
    En C, non, ou alors tu fais une sorte de généricité. Tu passes à ta fonction un pointeur sur void qui sera ton tableau et la taille de tes données, et là tu pourras la faire fonctionner avec n'importe quoi...
    Le problème c'est que ce genre de manipulations est périlleuse et pas forcément utile.
    Le truc c'est qu'on va pas manipuler un tableau de nombres de la même manière qu'une chaîne de caractères... Quel intérêt d'ailleurs ? Sur une chaîne de caractères, tu vas par exemple essayer de lire un prénom et un nom et de le mettre dans un carnet d'adresse. Ça n'aurait aucun sens de faire ce genre de manipulation avec un tableau d'entiers.

    De même, avec un tableau d'entiers tu peux faire l'addition de toutes les valeurs qui y sont contenues et aussi la moyenne... Est-ce que faire la somme ou la moyenne des caractères contenus dans une chaîne a sens ?
    Non bien évidemment...

    C'est pour ça que chercher à traiter une chaîne de caractères comme un tableau d'entiers n'a pas de sens... Surtout qu'une chaîne de caractères C est terminée par le caractère NUL '\0', alors qu'un tableau d'entier est en général limité par une taille donnée.

    Je ne pourrais même pas te faire une fonction viable et qui aurait un quelconque intérêt...

  19. #99
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par Array Voir le message
    J'aimerais que la fonction soit valable pour les tableaux de type "char" et "integer".
    Voici un exemple dans lequel je traite un tableau de manière générique. La fonction call_for_each() utilise une fonction de rappel pour effectuer un traitement (ici, on fait de l'affichage) sur chaque élément du tableau:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    #include <stdio.h>
     
    #define NB_ELEMS(a) ( sizeof (a) / sizeof *(a) )
     
    void call_for_each(void *array, size_t elem_size, size_t n_elems,
                       void (*fp) (void *));
    void print_char(void *c);
    void print_int(void *n);
     
    int main(void)
    {
        char array_of_char[] = "Hello world!";
        int array_of_int[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
     
        call_for_each(array_of_char, sizeof *array_of_char,
                      NB_ELEMS(array_of_char), print_char);
        printf("\n");
        call_for_each(array_of_int, sizeof *array_of_int, NB_ELEMS(array_of_int),
                      print_int);
        printf("\n");
        return 0;
    }
     
    void print_char(void *c)
    {
        if (c != NULL)
        {
            int character = *((unsigned char *) c);
            printf("%c ", character);
        }
    }
     
    void print_int(void *n)
    {
        if (n != NULL)
        {
            int number = *((int *) n);
            printf("%d ", number);
        }
    }
     
    void call_for_each(void *array, size_t elem_size, size_t n_elems,
                       void (*fp) (void *))
    {
        if (array != NULL && fp != NULL)
        {
            size_t i;
            unsigned char *arr = array;
     
            for (i = 0; i < n_elems; i++)
            {
                fp(arr + i * elem_size);
            }
        }
    }
    qsort(), déclarée dans le fichier d'en-tête standard stdlib.h, fonctionne selon le même principe et permet de trier les données d'un tableau de manière générique.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  20. #100
    Membre confirmé Avatar de Array
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    210
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 210
    Par défaut
    Thierry, pour ta fonction, je vais l'enregistrer dans un fichier, mais il me reste à aborder les pointeurs, et donc, j'ai de la difficulté à la comprendre, faute de connaissances... Je tâcherai de lire...
    Merci,

    Cordialement,

    Array

Discussions similaires

  1. Réponses: 1
    Dernier message: 23/12/2007, 19h44
  2. Entrées.. Sorties.. quelques précisions..
    Par Djef-69 dans le forum SL & STL
    Réponses: 2
    Dernier message: 28/11/2007, 23h16
  3. [Fabrique] Quelques Précisions
    Par djflex68 dans le forum Design Patterns
    Réponses: 8
    Dernier message: 20/12/2006, 13h34
  4. Quelques "précisions" sur Struts
    Par Atma_ dans le forum Struts 1
    Réponses: 19
    Dernier message: 03/11/2006, 15h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo