Mes pensées se sont embrouillées, c'est corrigé.
Version imprimable
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? :bug: :arf: :marteau: :wow:
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
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.
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.
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
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
Eh bien, voilà ça de compris!
J'aurais maintenant une autre question... héhé.
Voici un code :
Comment faire pour mettre des nombres entiers dans un tableau de type "char" sans causer une erreur?Code:
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]); }
Merci,
Sincèrement,
Array
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 :
Ensuite, il faut donner le prototype avant le main, ou alors mettre la fonction avant.Code:void function(char tab[])
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 :
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.Code:
1
2 char tab[] = "Bonjour!"; function(tab);
À 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 !
Merci ça fonctionne xD
Mais...
Autre problème :
Selon moi, ce code serait supposé d'écrire "hello".Code:
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; } }
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!
Ben non, ça risque pas d'écrire "hello".
Surtout en castant l'adresse du tableau de char en adresse de tableau de int...
...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?
Qu'appelles-tu "donner la valeur \"int\" au tableau" ?
lol.
Je tacherai d'être plus clair.
Ce que je veux dire, c'est cela :
Soit une fonction "function()" qui a pour prototype:
Je voudrais passer à cette fonction le tableau "fggc", qui est un tableau de type "char" déclaré en main().Code:int function(int tab[])
cela donnerait, dans la fonction main() :
Comment faire pour que "function()" accepte un tableau de type "char"?Code:
1
2
3
4
5
6
7
8
9 int main(void) { char fggc[15]; strcpy(fggc, "hello"); [...] function(fggc); [...] return 0; }
Merci beauoup,
Sincèrement,
Array
LoooL!:mouarf:
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
Quel en est seulement l'intérêt ?
J'aimerais que la fonction soit valable pour les tableaux de type "char" et "integer".Citation:
Envoyé par PsychoH13
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?
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...
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:
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.Code:
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); } } }
Thierry
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