faire un return d'un tableau - C - Programmation
Marsh Posté le 13-03-2017 à 22:30:50
J'ai pas essayé de comprendre le code, c'est pas très digeste et je vois des choses douteuses genre sprintf(chainebinaire,((char*)(decimal%2)));.
De manière générale: Impossible de retourner un tableau depuis une fonction. On peut retourner un pointeur issu de malloc comme tu le fais mais ce n'est pas forcément très propre car il faut penser à libérer la mémoire ailleurs (ce que tu ne fais pas, en tout cas je ne vois pas de free()).
Tu peux passer un pointeur vers un espace mémoire déjà réservé(!!) à ta fonction.
Après si il faut absolument retourner des tableaux on peut les mettre dans un struct mais c'est pas forcément très élégant... (et inutile içi).
edit: Tu devrais activer (et prendre en compte) les warnings de ton compilateur!
> "gcc" "t.c" -Wall -O3 -c -std=c99
t.c:20:6: warning: return type of 'main' is not 'int' [-Wmain]
t.c: In function 'menus':
t.c:43:9: warning: implicit declaration of function 'scanf_s' [-Wimplicit-function-declaration]
t.c: In function 'decalage':
t.c:148:13: warning: format '%d' expects argument of type 'int *', but argument 2 has type 'short int *' [-Wformat]
t.c:156:13: warning: format '%d' expects argument of type 'int *', but argument 2 has type 'short int *' [-Wformat]
t.c: In function 'affBin':
t.c:216:5: warning: return from incompatible pointer type [enabled by default]
t.c:216:5: warning: function returns address of local variable [enabled by default]
t.c:184:9: warning: unused variable 'i' [-Wunused-variable]
t.c: In function 'envoichaine2':
t.c:257:5: warning: passing argument 1 of 'affBin' makes integer from pointer without a cast [enabled by default]
t.c:179:7: note: expected 'int' but argument is of type 'char *'
t.c:224:9: warning: unused variable 'decim2' [-Wunused-variable]
Marsh Posté le 13-03-2017 à 23:02:01
Désolé, je viens de regarder le début de ton code et pour moi c'est disons pas au point...
P.ex.
Code :
|
Ceci
taille=strlen(chaine);
chaine[taille+1]='\0';
c'est dangereux: Si l'utilisateur entre 14 ou plus de caractères strlen() retourne 14 et donc taille+1=15 et donc out of bound...
Tu veux enlèver un éventuell '\n' c'est ça?
Alors
Code :
|
fgets() termine toujours avec un '\0', pas de soucis de ce côté.
Ensuite
commandeLCD(1,chaine[i]);//on envoie caractère tant qu'on n'est pas arrivé au caractère 0 de fin de chaine
La fonction est définie ainsi:
void commandeLCD(int booleen,unsigned char adresse)
Donc tu passe un caractère (imprimable) comme adresse? Ou c'est plutôt une donnée et le nom est mal choisi? Sans parler du problème de signedness (char vs unsigned char)... Petite remarque: Le mot c'est boolean.
La condition de la boucle n'est pas fausse mais pas très lisible, plutôt un classique while(chaine[i]!='\0') ou même while(chaine[i]).
Ceci
fflush(stdin);
a un résultat indéfini (source K&R 2nd ed. page 242).
Vu les warnings il y a forcément d'autres problèmes...
EDIT: Aie!
char Menu; scanf("%s",&Menu); (dans void decalage())
Refléchis à ce qui va se passer si l'utilisateur entre iosfiposdfiodsfimdspfioidsof p.ex...
Comme je pense que c'est un projet universitaire je ne vais pas corriger d'avantage.
Marsh Posté le 13-03-2017 à 23:14:09
void envoichaine2()
{
short i=0;
short taille;
int size;
char decim[10];
int decim2=0;
char chaine1[100]={"Entrez un nombre: "};
char chaine2[100]={"decimal: "};
char conversionbinaire[10];
char conversionhexa[10];
taille=strlen(chaine1);
commandeLCD(0,0x80);//on se positionne sur la première ligne du lcd pour envoyer entrez un nombre
while (chaine1[i]!=chaine1[taille])
{
commandeLCD(1,chaine1[i]);//on envoie caractère tant qu'on n'est pas arrivé au caractère 0 de fin de chaine
i++;
}
commandeLCD(0,0xC0);//on se place sur la deuxième ligne pour envoyer la phrase decimal:
taille=strlen(chaine2);
while (chaine2[i]!=chaine2[taille])
{
commandeLCD(1,chaine2[i]);//on envoie caractère tant qu'on n'est pas arrivé au caractère 0 de fin de chaine
i++;
}
//saisie du nombre decim à convertir et envoi sur l'ecran lcd
fflush(stdin);
fgets(decim,8,stdin);
size=strlen(decim);
//commandeLCD(0,0xC0);//je suis déjà sur la deuxième ligne ?? ça va ecrire à la suite de decimal:????
i=0;
do
{
commandeLCD(1,decim[i]);
i++;
}while (decim[i] !=decim[size]);
decim2=atoi(decim);//conversion du char en int car itoa attend un int
itoa (decim2,decim,10);//conversion d'un entier en char en base 10
printf ("decimal: %s\n",decim);
itoa (decim2,conversionhexa,16);//conversion d'un entier en char en base 16
printf ("hexadecimal: %s\n",conversionhexa);
itoa (decim2,conversionbinaire,2);// conversion d'un entier en char en base 16
printf ("binaire: %s\n",conversionbinaire);
commandeLCD(0,0x01);//effacer l'ecran avant d'afficher les conversions et se place sur la première ligne du lcd
int size2=strlen(conversionbinaire);
i=0;
do
{
commandeLCD(1,conversionbinaire[i]);
i++;
}while (conversionbinaire[i] !=conversionbinaire[size2]);
commandeLCD(0,0xC0);// se placer sur la deuxième ligne de l'ecran lcd
int size3=strlen(conversionhexa);
i=0;
do
{
commandeLCD(1,conversionbinaire[i]);
i++;
}while (conversionbinaire[i] !=conversionbinaire[size3]);
}
Marsh Posté le 13-03-2017 à 23:14:48
j'ai supprimé la fonction affBin qui me cassait la tete et j'ai tout fait à la suite dans une seule fonction
pour le caractère de fin de chaine '0' ça va pas sur le lcd car il le connait pas et affiche un caractère inconnu .... j'ai esssayé sur le lcd en labo
pour adresse j'avais mal choisi le nom
ç'est juste un petit labo pas un projet on a 5 labos à faire ...
Marsh Posté le 13-03-2017 à 23:29:18
Citation : pour le caractère de fin de chaine '0' ça va pas sur le lcd car il le connait pas et affiche un caractère inconnu |
Déjà je suppose que c'est une faute de frappe de ta part, il y a une grosse différence entre '0' et '\0'! Bien sûr faut pas envoyer '\0' au LCD mais un code bien fait (while(string[i]!='\0')) ne le fera pas!?!
Citation : ç'est juste un petit labo pas un projet on a 5 labos à faire ... |
Mais il y a bien une note au but? Alors ça revient au même.
C'est quoi comme études que tu fais et en quelle année?
Marsh Posté le 13-03-2017 à 23:32:12
je suis en haute école. je suis en deuxième et j'ai 2 cours de première qui me restent.
ce labo fait partie d'un cours de première
je pense que ç'est mieux la deuxième façon car je m'y retrouve mieux et elle est plus simple et je pense qu'il y a pas d'erreurs dans la fonction envoichaine2()??
Marsh Posté le 13-03-2017 à 23:33:18
ç'est pas coté y a juste le dernier labo qui est plus dur qui est coté sur le robot voiture
ç'est pas noté(ah en français pas en belge) y a juste le dernier labo qui est noté (robot)
Marsh Posté le 13-03-2017 à 23:45:51
bjs a écrit : je suis en haute école. |
Ah d'accord, c'est en Belgique, je ne connais pas leur système.
Citation : je pense qu'il y a pas d'erreurs dans la fonction envoichaine2()?? |
Il n'y a rien qui va faire planter le PC à première vue mais c'est loin d'être propre!
Déjà c'est quoi ces machins, tu veux faire quoi??
Code :
|
C'est parfaitement inutile. chaine1 contient déjà un '\0' au bon endroit et si il y en avait pas il ne faudrait surtout pas utiliser strlen()! Les {} ne sont pas nécessaires comme l'indication d'une taille à moins de vouloir modifier le contenu plus tard et d'avoir besoin de plus de place.
Ensuite tu mélanges les while() et les do while() et il n'y a pas de gestion d'erreurs, que se passe-t-il si l'utilisateur entre autre chose qu'un nombre?
En plus je répète: fflush(stdin) est indéfini.
Aussi tu utilises des constantes un peu partout, c'est mieux (plus lisible et/ou plus sûr) d'utiliser des #define (ou des const, aucune idée pourquoi le #define est si répandu pour ce genre de trucs...) ou selon la situation un truc genre typedef enum.
Marsh Posté le 13-03-2017 à 23:57:59
ok merci pour tes conseils, j'ai enlevé les do while et j'ai remplacé par un while.
j'ai enlevé les accolades pour l'initialisation de la chaine à envoyer au lcd(ça doit être comme l'exemple de la capture de l'ecran lcd du cahier de labo)
ç'est un petit labo et les autres cours de première y a bcp de blindage des saisies donc il le demande pas ici et on suppose que l'user est intelligent
Marsh Posté le 13-03-2017 à 21:45:08
Bonjour,
je fais une conversion entier vers binaire (l'entier doit avoir valeur entre 0 et 255) et je veux récuperer ça dans une autre fonction pour l'envoyer au lcd. je voudrais récuperer le resultat de la conversion dans un tableau de char.
voici le code ça marche sauf pour conversion et envoi au lcd (ç'est incomplet)
Message édité par bjs le 13-03-2017 à 22:12:18