Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1369 connectés 

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°564382
Master_Jul
Posté le 11-11-2003 à 21:34:11  profilanswer
 

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

mood
Publicité
Posté le 11-11-2003 à 21:34:11  profilanswer
 

n°564384
kadreg
profil: Utilisateur
Posté le 11-11-2003 à 21:36:14  profilanswer
 

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 !
n°564398
Master_Jul
Posté le 11-11-2003 à 21:44:15  profilanswer
 

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

n°564419
chrisbk
-
Posté le 11-11-2003 à 21:51:55  profilanswer
 

la, la et la

n°564426
chrisbk
-
Posté le 11-11-2003 à 21:52:53  profilanswer
 

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

n°564442
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 11-11-2003 à 21:57:00  profilanswer
 

[:taz]


---------------
J'ai un string dans l'array (Paris Hilton)
n°564454
Master_Jul
Posté le 11-11-2003 à 22:01:14  profilanswer
 


 
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
n°564457
chrisbk
-
Posté le 11-11-2003 à 22:02:18  profilanswer
 

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])

n°564459
chrisbk
-
Posté le 11-11-2003 à 22:03:24  profilanswer
 

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

n°564462
Master_Jul
Posté le 11-11-2003 à 22:04:16  profilanswer
 

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

mood
Publicité
Posté le 11-11-2003 à 22:04:16  profilanswer
 

n°564464
chrisbk
-
Posté le 11-11-2003 à 22:04:46  profilanswer
 

ah ben oui

n°564466
Master_Jul
Posté le 11-11-2003 à 22:05:01  profilanswer
 

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

n°564473
chrisbk
-
Posté le 11-11-2003 à 22:06:53  profilanswer
 

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

n°564478
Master_Jul
Posté le 11-11-2003 à 22:09:19  profilanswer
 

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.

n°564481
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 11-11-2003 à 22:11:24  profilanswer
 

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

n°564485
kadreg
profil: Utilisateur
Posté le 11-11-2003 à 22:12:18  profilanswer
 

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 !
n°564490
Master_Jul
Posté le 11-11-2003 à 22:14:24  profilanswer
 

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".

n°564638
Master_Jul
Posté le 12-11-2003 à 00:00:55  profilanswer
 

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
n°564653
Kristoph
Posté le 12-11-2003 à 00:27:39  profilanswer
 

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.

n°564656
Master_Jul
Posté le 12-11-2003 à 00:35:41  profilanswer
 

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:

n°564659
Master_Jul
Posté le 12-11-2003 à 00:38:11  profilanswer
 

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
n°564691
geffs
Posté le 12-11-2003 à 08:07:40  profilanswer
 

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;
}

n°564721
nraynaud
lol
Posté le 12-11-2003 à 09:34:20  profilanswer
 

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
n°564739
chrisbk
-
Posté le 12-11-2003 à 10:16:05  profilanswer
 

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

n°564826
jagstang
Pa Capona ಠ_ಠ
Posté le 12-11-2003 à 13:01:17  profilanswer
 

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

n°564829
nraynaud
lol
Posté le 12-11-2003 à 13:08:55  profilanswer
 

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
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

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

 

Sujets relatifs
Problème de liens entre diverses versions de gccPetit probleme; pas de php => pas d'include. Que choisir ?Framset ?
[Java] Problème avec JPopupMenu [résolu]Problème de conversion avec les fonctions pack & unpack
[PHP] Probleme sur la fonction header()Problème de <TABLE>
[C] petit probleme sur un prog tout simple !!probleme avec les slashes en upload
Probleme avec Dev cpp[XSL] Problème d'apostrophe
Plus de sujets relatifs à : Problème (surrement très con) pour passer une chaine en paramètre.


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR