Pointeur en paramètre de fonction
Fermé
linquisiteur
-
4 août 2013 à 14:08
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 4 août 2013 à 22:14
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 4 août 2013 à 22:14
A voir également:
- Pointeur en paramètre de fonction
- Fonction si et - Guide
- Netflix paramètre compte - Guide
- Remettre parametre usine pc - Guide
- Parametre windows - Guide
- Changer parametre dns - Guide
4 réponses
ElementW
Messages postés
4816
Date d'inscription
dimanche 12 juin 2011
Statut
Contributeur
Dernière intervention
5 octobre 2021
1 228
Modifié par gravgun le 4/08/2013 à 14:12
Modifié par gravgun le 4/08/2013 à 14:12
Salut, retire les * de equals(* nom1, * nom2);, nom1 et nom2 sont déjà des pointeurs, et mettre des étoiles devant leur nom reviendrait à récupérer leur valeur pointée; ici un vulgaire char, or ta fonction veut un pointeur de char.
from human import idiocy
del idiocy
from human import idiocy
del idiocy
Merci, bon j'avais encore une faute de frappe dans le code mais j'ai trouver ^^
J'ai compiler et tester et il fait son boulot mais boucle. Plus que à trouver pourquoi :)
EDIT:
mon code s'execute comme voulu mais il boucle pourtant le print("ici") s'écrit bien ce qui me dit que equal devrait être à zéro et me permettre de sortir de la boucle. Pourquoi je ne sors pas?
J'ai compiler et tester et il fait son boulot mais boucle. Plus que à trouver pourquoi :)
EDIT:
#include <stdio.h> #include <stdlib.h> /**pré: s et t pointent chacun sur un string initialisé // post: les strings pointents par s et t sont inchangés //résultat: 1 si les strings pointés par t et s sont égaux, 0 sinon **/ int equals( char * s, char * t){ char temp1 = *s, temp2 = *t; int cpt=0, equal = 1; do{ printf("temp1 %c = temp2 %c\n", temp1, temp2); if(temp1 != temp2) {equal = 0; printf("\t ici");} else cpt++; temp1 = *(s+cpt), temp2 = *(t+cpt); }while (((*s != '\0') && (*t != '\0') && (equal == 1)) || (equal == 0)); return equal; } int main (void){ char * nom1 = "toto"; char * nom2 = "totor"; char * nom3 = "toti"; char * nom4 = (char*) malloc(5) ; *nom4 = *nom1; char * nom5 = nom1; int equal = equals( nom1, nom2); if (equal) printf("les noms sont identique"); else printf("les noms ne sont pas identique"); return 0; }
mon code s'execute comme voulu mais il boucle pourtant le print("ici") s'écrit bien ce qui me dit que equal devrait être à zéro et me permettre de sortir de la boucle. Pourquoi je ne sors pas?
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
4 août 2013 à 21:17
4 août 2013 à 21:17
Bonjour,
Dans ton while, il faut revoir ta condition. Tu reboucles lorsque les chaînes sont différentes (equal=0) et cpt n'a pas été modifié => Boucle infinie.
Essaie plutôt :
}while (((*s != '\0') && (*t != '\0') && (equal == 1)));
char * nom4 = (char*) malloc(5) ; *nom4 = *nom1;
Que veux-tu faire ici ? Cette ligne permet d'allouer une zone dans le heap et de dire que nom4 commencera par la même lettre que nom1. Si tu veux copier la chaîne (sans perdre la zone allouée), il faut utiliser strcpy (strcpy(nom4, nom1);)
Tu peux même utiliser :
char *nom4=malloc(strlen(nom1)+1); (c'est plus portable, puisqu'on récupère la taille de nom1. Et pas besoin de (char*), c'est superflu.
Si tu veux récupérer juste la première lettre, alors il faut terminer la chaîne : *nom4=*nom1; (que tu peux écrire : nom4[0]=nom1[0]; plus simple quand on débute) et nom4[1]='\0' (pour terminer la chaîne).
Ou tout simplement : char *nom4=nom1; (pointe sur la chaîne nom1).
Dans ton while, il faut revoir ta condition. Tu reboucles lorsque les chaînes sont différentes (equal=0) et cpt n'a pas été modifié => Boucle infinie.
Essaie plutôt :
}while (((*s != '\0') && (*t != '\0') && (equal == 1)));
char * nom4 = (char*) malloc(5) ; *nom4 = *nom1;
Que veux-tu faire ici ? Cette ligne permet d'allouer une zone dans le heap et de dire que nom4 commencera par la même lettre que nom1. Si tu veux copier la chaîne (sans perdre la zone allouée), il faut utiliser strcpy (strcpy(nom4, nom1);)
Tu peux même utiliser :
char *nom4=malloc(strlen(nom1)+1); (c'est plus portable, puisqu'on récupère la taille de nom1. Et pas besoin de (char*), c'est superflu.
Si tu veux récupérer juste la première lettre, alors il faut terminer la chaîne : *nom4=*nom1; (que tu peux écrire : nom4[0]=nom1[0]; plus simple quand on débute) et nom4[1]='\0' (pour terminer la chaîne).
Ou tout simplement : char *nom4=nom1; (pointe sur la chaîne nom1).
Merci fiddy je vais vérifier cela. pour le main ce n'est pas le mien mais celui de l'exercice. Il s'agit de cas que je dois tester et analyser. Au moins maintenant je comprend cette ligne là :)
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
4 août 2013 à 22:14
4 août 2013 à 22:14
Bah le main est con ^^. Car si tu compares nom4 avec nom4, ton programme fera une boucle infinie puisque nom4 ne se termine pas par un \0 ^^.
En plus, il manque un free(nom4); <mode=faillot>Fais-le remarquer à ton prof, tu marqueras des points :-p</mode>
En plus, il manque un free(nom4); <mode=faillot>Fais-le remarquer à ton prof, tu marqueras des points :-p</mode>