Problème (surrement très con) pour passer une chaine en paramètre.

Problème (surrement très con) pour passer une chaine en paramètre. - C++ - Programmation

Marsh Posté le 11-11-2003 à 21:34:11    

Je ne comprend pas pourquoi j'ai cette erreur, je veux simplement récupérer une chaine de caractères au clavier et la passer dans une fonction. Merci pour votre aide.
 

Code :
  1. void main(void)
  2. {
  3. char chaine[100];
  4. cout <<"Rentrez une chaine de caracteres : "<<flush;
  5. gets(chaine);
  6. chaine=suite_ab(chaine);
  7. cout <<"\nLa chaine contient "<< chaine <<" suites a...b.\n\n";
  8. }


 
E:\Script C++\chaine\chaine.cpp(17) : error C2664: 'suite_ab' : cannot convert parameter 1 from 'char [100]' to 'char'
        This conversion requires a reinterpret_cast, a C-style cast or function-style cast

Reply

Marsh Posté le 11-11-2003 à 21:34:11   

Reply

Marsh Posté le 11-11-2003 à 21:36:14    

regle numero 1 du C : si ça compile pas, rajoutre des *


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 11-11-2003 à 21:44:15    

les pointeurs c'est ma prochaine leçon, je sais pas trop où les mettre, une idée ?

Reply

Marsh Posté le 11-11-2003 à 21:51:55    

la, la et la

Reply

Marsh Posté le 11-11-2003 à 21:52:53    

bon, pour t'aider, ton code est plus ou moins equivalant a :
 
char *chaine = new char[100];

Reply

Marsh Posté le 11-11-2003 à 21:57:00    

[:taz]


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 11-11-2003 à 22:01:14    


 
Désolé oh grand maître de la prog, si dans le topic au dessous on a le droit de poser une question de newbie et pas ici. :/
 
Edit : J'attendrai le cours sur les pointeurs, je vais me contenter de passer la chaine toute prête et à tout hasard, j'ai mis une étoile ici
 
int suite_ab(char * chaine)
{
}
 
et ça marche :/


Message édité par Master_Jul le 11-11-2003 à 22:02:46
Reply

Marsh Posté le 11-11-2003 à 22:02:18    

en C++, chaine de caractere = std::string
 
pis la t'as quand meme un gros pb de base que tu devrais resoudre a cuop de bouquins :/
 
(et merde, kessje fous icyte ?[:neowen])

Reply

Marsh Posté le 11-11-2003 à 22:03:24    

pis on dit pas "oh grand maitre" mais "ô grand maitre"

Reply

Marsh Posté le 11-11-2003 à 22:04:16    

J'ai acheté O'Reilly, Programmation C++ par la pratique et le C++ par Stroustrup, ça devrait suffire je pense, maintenant faut lire.

Reply

Marsh Posté le 11-11-2003 à 22:04:16   

Reply

Marsh Posté le 11-11-2003 à 22:04:46    

ah ben oui

Reply

Marsh Posté le 11-11-2003 à 22:05:01    

chrisbk a écrit :

pis on dit pas "oh grand maitre" mais "ô grand maitre"


 
disons que ça n'a pas le même sens, "oh" c'est plus une interjection pour l'interpeller

Reply

Marsh Posté le 11-11-2003 à 22:06:53    

Master_Jul a écrit :


 
disons que ça n'a pas le même sens, "oh" c'est plus une interjection pour l'interpeller


 
ouais mais ca fait un peu facon "hola du navire" je trouve, tandis que Ô c'est cérémonieux

Reply

Marsh Posté le 11-11-2003 à 22:09:19    

J'avoue que je me suis planté de "Ô" mais c'était pour dire qu'il était quand même "correct".  
 
Ô merde, j'ai encore du code de newbie à taper pour demain.

Reply

Marsh Posté le 11-11-2003 à 22:11:24    

c'était pas une insulte hein, je faisais juste mon Taz pour te faire prendre conscience, petit scarabée, qu'utiliser "gets()" c'est très mal car on ne sait jamais à l'avance combien de caractères seront lus ! y'a aucun controle de dépassement du buffer et si ton utilisateur rentre une chaine plus grande que la taille de ton buffer, c'est DTC :o
 
vaut mieux utiliser fgets() [:hotshot]
 
et utiliser aussi les std::string, c'est plus mieux :o

Reply

Marsh Posté le 11-11-2003 à 22:12:18    

Master_Jul a écrit :

J'ai acheté O'Reilly, Programmation C++ par la pratique et le C++ par Stroustrup, ça devrait suffire je pense, maintenant faut lire.


 
Marrant, c'est les deux livres de C++ que j'utilise au bureau.


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 11-11-2003 à 22:14:24    

Harkonnen a écrit :

c'était pas une insulte hein, je faisais juste mon Taz pour te faire prendre conscience, petit scarabée, qu'utiliser "gets()" c'est très mal car on ne sait jamais à l'avance combien de caractères seront lus ! y'a aucun controle de dépassement du buffer et si ton utilisateur rentre une chaine plus grande que la taille de ton buffer, c'est DTC :o
 
vaut mieux utiliser fgets() [:hotshot]
 
et utiliser aussi les std::string, c'est plus mieux :o
 


 
merci :)
 
Je vais me renseigner sur les "std::string".

Reply

Marsh Posté le 12-11-2003 à 00:00:55    

Erf, mon programme marchait sans problème et juste avant de partir je le relance un dernier coup et rien à faire il plante sur un while, le i prend des valeurs completement folkloriques
 

Code :
  1. int suite_ab(char * chaine, int taille) // Nombre de suites
  2. {
  3. int i=0;
  4. int suite=0;
  5. for (i=0;i<taille;i++)
  6. {
  7.  if (chaine[i]=='a')
  8.  {
  9.   while(chaine[i]!='b' || chaine[i]!='\0') i++;
  10.   if (chaine[i]=='b') suite++;
  11.  }
  12. }
  13. return(suite);
  14. }


 
J'ai fait autrement :
 

Code :
  1. while(chaine[i]!='b' && i<taille) i++;


 
et ça marche, mais qqun pourrait m'expliquer mon erreur ? merci


Message édité par Master_Jul le 12-11-2003 à 00:33:23
Reply

Marsh Posté le 12-11-2003 à 00:27:39    

Deux remarques :
 
- tu modifies une variable de boucle for à l'interrieur de celui-ci. C'est ok mais c'est une grosse source d'erreure donc il faut faire super attention. Par exemple, le while incrémente i sans tenir compte de la limite i<taille.
- while (a != 0 || a != 1), ça a un autre nom : on appelle ça une boucle infinie :D Ton while est de cette catégorie et tu voulais probablement faire un while (a != 0 && a != 1) à la place.
- et en cadeau bonus : par besoin d'initialisé i avant le for car comme cela, tu écris 2 fois la valeur 0.

Reply

Marsh Posté le 12-11-2003 à 00:35:41    

Merci Kristoph, ta réponse est impec, ça cadre tout ce qu'il me fallait, j'ai trouvé mon erreur, juste après que tu aies posté (j'ai édité). Mais là j'ai toutes les explications, encore merci. :hello:

Reply

Marsh Posté le 12-11-2003 à 00:38:11    

d'après le débugger ça déconnait sévère, pour je ne sais trop quelle raison (la boucle infinie donc), le i atteignait 750 et à cette valeur, ma chaine valait "b", sans doute un hasard d'un emplacement mémoire, c'est ce qui m'induisait en erreur


Message édité par Master_Jul le 12-11-2003 à 00:38:55
Reply

Marsh Posté le 12-11-2003 à 08:07:40    

dans le cas ou ce que tu fais es du C++  
tu n as pas besion ni de (char*)  
ni de gets ...  
utilise  std::string;  
std::cin;  
si tu fais du C n utilise pas cout mais printf;
choisi ton camp camarade ;)  
 
 
int main ( void )  
{
std::string chaine;
std::cout << " un chaine stp " << std::endl;
std::cin >> chaine;
chaine = suite_ab( chaine );
std::cout << "La chaine contient "<< chaine <<" suites a...b." << std::endl;
return 0;
}

Reply

Marsh Posté le 12-11-2003 à 09:34:20    

Harkonnen a écrit :

y'a aucun controle de dépassement du buffer  

C'est un règle de base du langage.
 
C est un langage de desciption de buffer overflow, comme java est un langage de description d'interaction entre objets ou VHDL un langage de description de comportement de composants électroniques.
 
 [:nraynaud]


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 12-11-2003 à 10:16:05    

nraynaud a écrit :

C'est un règle de base du langage.
 
C est un langage de desciption de buffer overflow, comme java est un langage de description d'interaction entre objets ou VHDL un langage de description de comportement de composants électroniques.
 
 [:nraynaud]  


 
pas du tout, et ramener le C++ a ca serait allé un peu vite en besogne, il y a aussi tout l'aspect "J'ai un pointeur et je ne peux pas savoir si il pointe sur qqchose de valide"
 
Alors s'il vous plait, je vous en prie

Reply

Marsh Posté le 12-11-2003 à 13:01:17    

je te conseille de lire un petit bouqin de C avant d'attaquer le concept objet avec notre ami bjarne

Reply

Marsh Posté le 12-11-2003 à 13:08:55    

ou de commencer directement avec du vrai C++ (avec des chaines de caractères, des types opaques, une lib conséquente) et d'aller vers les pointeurs quand ça deviendra nécessaire.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed