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
Bonjour, je souhaite créer une fonction qui vérifie si 2 pointeurs de string possèdent les même mots. Mais je n'arrive pas à compiler mon code source.

#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, egual = 1;
	
	do{
		if(temp1 != temp2) equal = 0;
		else cpt++;
		temp1 = *(s+cpt), temp2 = *(t+cpt);
		
	}while ((*s != '\0') && (*t != '\0') || (equal == 1));
	
	
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;
}


lors de la compilation je reçois cette erreur:

ex3Part2.c:33: warning: passing arg 1 of 'equals' makes pointer from integer without a cast
ex3Part2.c:33: warning: passing arg 2 of 'equals' makes pointer from integer without a cast



Merci
A voir également:

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
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
0
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:


#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?
0
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
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).
0
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à :)
0
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
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>
0