Je fais un programme en C visant a former un mot aléatoirement, mais je rencontre un petit soucis.
J'ai fais dans un premier temps ce code ne python, mais le multi-threading étant bloqué par le GIL je me retrouve à le transposer en C.
Le code :
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <string.h>
#include <math.h>
int max = 3;
char a[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
int main()
{
int i = 0;
int ii = 0;
char m[] = "\n";
int h = 0;
for (i = 0 ; i < 1 ; i++)
{
for (ii = 1; ii <= max; ii++)
{
h = rand() % strlen(a) - 1;
printf("h = %d", h);
printf("%s\n", m);
m[ii] = a[h];
}
}
}
Je fais donc prendre à ma case m[ii] la lettre qui se trouve à la case a[h].
Problème : eh bien ca m'affiche un caractère étrange. Je suis au courant de la la table ascii, mais quand j'affiche ma variable a (contenant l'alphabet) lettres par lettres, elles s'affichent bien toutes.
Resultat dans l'invite de commande :
h = 40
h = 6
O
h = 41
O)
Process returned 0 (0x0) execution time : 0.018 s
Press any key to continue.
(l'espace entre h = 40 et h = 6 est du à "\n" contenu dans m[0]
1) ton tableau m a une taille de 2 (indice 0 et 1) et toi tu vas écrire dans les cases d'indice 2 et 3 ! Tu es donc hors tableau ! Là bonjour les dégâts !
2) Les chaîne de caractère ont la particularité de ce terminer par un caractère de fin de chaîne le '\0' or toi tu ne le mets pas lors de la construction de ta chaîne.
Pour le 1er cas, j'avais initiatiliser la taille de mon tableau via la constance max :
--> char m[max] = "\n"
Mais je reçois ce code d'erreur : "error: variable-sized object may not be initialized|"
Pour la construction de la chaîne, je savais aps du tout qu'on devait mettre nous même le \0, il me semblait qu'il se mettait automatiquement, mais merci du coup !
Tu saurais pourquoi j'obtiens ces signes bizarres ?
De plus, j'ai essayé avec un pointeur, CA MARCHE !
Mais seul problème, j'arrive pas à pointer vers une case précise (par exemple à pointer sur la 15 case de a[]), du coup j'obtient que des aaaaaaaa
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <string.h>
#include <math.h>
char a[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\0";
int main()
{
int max = 3;
int i = 0;
int ii = 0;
char m[3] = "\n";
int h = 0;
char *pointeur_alphabet = &a;
for (i = 0 ; i < 1 ; i++)
{
for (ii = 1; ii <= max; ii++)
{
h = rand() % strlen(a) - 1;
printf("h = %d", h);
m[ii] = *pointeur_alphabet;
printf("%s\n", m);
}
}
}
Le resultat en IC :
h = 40
a
h = 6
aa
h = 41
aaa @
Process returned 0 (0x0) execution time : 0.019 s
Press any key to continue.
On voit bien qu'il y a que des a qui ont été insérés...
EDIT :
Je viens de modifier la fin de la variable comme tu l'avais dis, avec \0 :
char m[6] = "\n\0";
Mais petite question : Si je souhaite un mot de 3 caracteres je dois donc créer un char de 6 cases ?
Pour le 1er cas, j'avais initiatiliser la taille de mon tableau via la constance max :
--> char m[max] = "\n"
Ce n'est pas ce qu'il y a dans ton code :
char m[] = "\n";
Dans ton nouveau code :
char m[3] = "\n";
Tableau de 3 cases donc avec les indices 0, 1, 2 or toi tu va toujours écrire dans la case d'indice 3 qui est hors tableau !
Le '\0' ne se met pas automatiquement, il faut donc le mettre, ce que tu n'as toujours pas fait.
Ça met toujours la première lettre car ton pointeur pointeur_alphabet pointe toujours sur la première lettre de ton tableau a. C'est ce que tu as demandé ligne 18, et que tu aurais du écrire sans l’esperluette devant le a soit :
char *pointeur_alphabet = a;
Edit : 3 caractères + le '\0' si tu souhaites en faire une chaîne de caractère, c'est au minimum 4 (le '\0' compte pour un caractère, et si tu veux le '\n' en plus il t'en faut un de plus.
char m[6] = "\n\0";
Le problème ici, c'est que tu va l'écraser le '\0' quand tu va écrire dans le tableau (le '\n' aussi d'ailleurs). Il faut qu'il soit à la fin le '\0'.
Pour définir la taille maxi du tableau, plutôt que
int max = 4;
tu peux utiliser :
#define max 4
Là 'max' est vraiment une constante (c'est 4) donc tu peux déclarer correctement le tableau :
char m[max] ;
(Pas besoin de l'initialiser puisque ce sera fait dans la boucle qui suit.)
Ensuite, comme les indices vont de 0 à max - 1, il me semble que la boucle devrait plutôt être :
for (ii = 0; ii < max; ii++)
{
h = rand() % strlen(a) ; // ==> valeurs entre 0 et strlen(a) - 1
printf("h = %d", h);
printf("%s\n", m);
m[ii] = a[h];
}
Puis il faut remplacer m[max-1] par '\0' pour terminer la chaîne. (Du coup la condition de bouclage est même ii < max - 1 : pour un tableau de 4 caractères, on ira de 0 à 2.)
Ça affiche que des a car ton pointeur comme je t'ai dit pointe sur la première case de ton tableau et il n'en change jamais. (l'esperluette ne corrige pas ce problème, ça rend juste l'écriture correcte de ton affectation, je ne rentre pas dans les détails sur ce sujet, on va pas en rajouter). Mais vu que tu as beaucoup de difficultés avec les tableaux, tu n'aurais peut-être pas du mettre ce pointeur, qui ne fait que augmenter la difficulté et rester sur l'utilisation classique des tableaux.
Pourquoi ne pas définir une variable qui recevrait le résultat de strlen() et que tu utiliserais avec rand(). C'est un petit détail sur l'efficacité, mais c'est facile à faire.
Le Tout est souvent plus grand que la somme de ses parties.
Petite question, par rapoort au multi-processing(ou threading).
Le parallélisme permet de faire plusieurs taches en même temps, mais peut on attribuer plusieurs threads a une seule et même tache de manière a ce que ca aille plus vite ?
J'ai fais ca comme parallélisme... Mais pas très utile pour l'instant, je prefererais que plusieurs coeur bosses sur le même code, quelqu'un saurait quel bibli importer ?
pthread_t threads[NUM_THREADS];
for (p = 0; p < NUM_THREADS; p++)
{
p1 = pthread_create(threads, NULL, coucou(), NULL);
}
Petite question, par rapoort au multi-processing(ou threading).
Le parallélisme permet de faire plusieurs taches en même temps, mais peut on attribuer plusieurs threads a une seule et même tache de manière a ce que ca aille plus vite ?
J'ai fais ca comme parallélisme... Mais pas très utile pour l'instant, je prefererais que plusieurs coeur bosses sur le même code, quelqu'un saurait quel bibli importer ?
pthread_t threads[NUM_THREADS];
for (p = 0; p < NUM_THREADS; p++)
{
p1 = pthread_create(threads, NULL, coucou(), NULL);
}
Attends.... tu n'es pas capable d'écrire un code tout simple, et tu veux te lancer dans la programmation multi-thread ?
- Edité par edgarjacobs 20 janvier 2021 à 19:27:29
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
Attends.... tu n'es pas capable d'écrire un code tout simple, et tu veux te lancer dans la programmation multi-thread ?
- Edité par edgarjacobs il y a 13 minutes
De base la programmation m'attire pas énormément, je m'y mets de temps en temps pour tester des trucs, je suis plutot réseau que programmation, d'où le fais que je sois une vraie quiche (notamment parce que je ne fais plus de C, j'utilise que python, et l'écriture est vraiment différente, notamment au niveau des tableaux).
J'avais prévenu que de base j'ai fais un code sur python et que je le tranpose en C pour pouvoir utiliser le multi-threading qui est bloqué par le GIL sous python
Mais du coup je vais créer un nouveau fil, Merci pour toute l'aide !
Bon courage ! Du coup on ne sait même pas si notre aide a été bénéfique ? Si c'est une partie d'un gros projet, Sache que le C ne pardonne pas, tu peux avoir des erreurs présentent que tu ne vois pas et qui vont surgir à un moment ou un autre et quand le projet sera gros deviendront difficile à cerner !
Bon courage ! Du coup on ne sait même pas si notre aide a été bénéfique ? Si c'est une partie d'un gros projet, Sache que le C ne pardonne pas, tu peux avoir des erreurs présentent que tu ne vois pas et qui vont surgir à un moment ou un autre et quand le projet sera gros deviendront difficile à cerner !
Ahah, je sais pas si on peut appeler ca un gros projet, mais c'est un projet !
Le Tout est souvent plus grand que la somme de ses parties.
Affichage de lettres érroné
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Le Tout est souvent plus grand que la somme de ses parties.
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
Le Tout est souvent plus grand que la somme de ses parties.