logo

Knowledge Is Power

 
 

- Reinit des nouveaux posts -

- Recherche -

Messages Privés - Derniers posts
S'enregistrer - Login - Liste des membres
Vous logger : Login Pass

Programmation - Langages de Programmation >> aidez-moi, svp ! (c++, programme tout con) Newtopic | Reply
1 | 2 | 3 | Page suivante
poster txt
Nothing2Do
Inscrit le 17-04-2006
Posté le 13-05-2007 22:36

j'ai fait un programme en c++ (je ne sais pas bien si c'est utile le c++, mais comme je ne connais que lui ...). Voila le programme :
Code:

#include <iostream>
#include <string>
#define LIMIT 65535
using namespace std;
int main(int argc, char argv[]){
int bcl=0;

string bdd[LIMIT][2]; /* 1er pour le mots, 2 pour le nombre */
int sp=0; /* Stack Pointer */
int search(char mot){
int tmp, oui;
for (tmp=0; tmp<argc; tmp++){
if(bdd[tmp, 1]=mot) {bdd[tmp, 2]++;oui=1
};
if ((oui=0)&&(tmp=argc)) {
bdd[sp++,1]=mot;
};
};
return 0;
};

for (bcl=0; bcl<argc; bcl++){
int tmp;
switch (search(argv[bcl])=tmp){
case -1 : break; /* si erreur */
default : search(argv[bcl]); /* sinon */
};
};
/* affichage */
cout<<"il y a "<<sp<<" mots, et, en moyenne, ils apparaissent "<<sp/argc<<" fois \n";
}



Et voila l'erreur :

discourama.cpp: In function ‘int main(int, char*)’:
discourama.cpp:10: erreur: a function-definition is not allowed here before ‘{’ token
discourama.cpp:24: erreur: no matching function for call to ‘search(char&)’
discourama.cpp:26: erreur: no matching function for call to ‘search(char&)’


voila, en fait le programme était censé écrire tout les mots qui apparaissent en argument (utilisation normal : discourame `cat text`). Pourriez-vous m'aider ? je suis perdu avec ces "référence" et ces "déréférence" ! Merci

_________________________
On ne vois des anges que le dos ...<font size="-1">[ Ce Message a été édité par: Nothing2Do le 2007-05-13 22:39 ]</font>

[ Ce Message a été édité par: tweakie le 2007-05-14 09:48 ]
profil | mail | Website | AIM | ICQ | Yahoo | MSN | edit | quote
space-kro
Inscrit le 11-01-2007
Posté le 13-05-2007 22:54

déjà le test d'égalité dans la plupart des langages c'est == et pas simplement =

enfin j'ai pas lu ton code, mais corrige déjà les erreurs de base et on verra ce que ça veut faire ensuite
profil | edit | quote
Nothing2Do
Inscrit le 17-04-2006
Posté le 13-05-2007 23:02

merci space-kro, mais j'ai corrigé les 2 [3, encore pardon] = conditionnel et rien n'a changé...

_________________________
On ne vois des anges que le dos ...

[ Ce Message a été édité par: Nothing2Do le 2007-05-13 23:03 ]
profil | mail | Website | AIM | ICQ | Yahoo | MSN | edit | quote
atn
Inscrit le 17-03-2007
Posté le 13-05-2007 23:17

les fonctions ne se declarent elle pas en dehors du main ?
profil | edit | quote
MeiK
Inscrit le 20-11-2002
Posté le 13-05-2007 23:23

Oula, deja ya trop d'accolades dans ton code, puis un return en plein milieu ce qui fait que tout ce qui suit n'est pas evalue...
Deja faudrait commencer a le coder en espacant BIEN BIEN, et pour bien delimiter, je te deconseille fortement la presentation du genre

Code:
for (blabla) {



Parce que du coup quand on relit, on voit pas du premier coup d'oeil ou est le debut et ou est la fin de ton bloc.
_________________________

profil | mail | edit | quote
Nothing2Do
Inscrit le 17-04-2006
Posté le 13-05-2007 23:25

j'avais "indenter" les blocs mais le copier-coller n'aime pas ...
_________________________
On ne vois des anges que le dos ...
profil | mail | Website | AIM | ICQ | Yahoo | MSN | edit | quote
MeiK
Inscrit le 20-11-2002
Posté le 13-05-2007 23:28

utilise les balises "code", en theorie elles conservent ton indentation...
_________________________

profil | mail | edit | quote
Chalk
Inscrit le 14-07-2004
Posté le 14-05-2007 09:18

Tu as déclaré ta fonction search() à l'intérieur de ton main, je suis pas sûr que ce soit très autorisé
En lisant les messages du compilo tu le trouves tout de suite ...
profil | Website | edit | quote
tweakie
Inscrit le 01-02-2002
Posté le 14-05-2007 09:55

On peut declarer une fonction a l'interieur d'une autre (du moins ca ne pose pas de problemes a visual C++), mais il faut la definir a l'exterieur.

Il laisserait donc int search(char mot); dans le main et sa definition ensuite, apres le main.

Mais ca n'est bien evidemment pas la solution a privilegier (en fait, meme si c'est autorise' je ne vois pas trop ce que ca apporte...)
_________________________
Un peu de science vaut mieux que beaucoup de dévotion
profil | Website | edit | quote
Chalk
Inscrit le 14-07-2004
Posté le 14-05-2007 11:38

Je ne pensais pas qu'on pouvait déclarer une fonction A dans une fonction B, et lui faire utiliser les variables locales à B.

Et puis y'a pas mal de trucs bizarres dans ce code, genre le "search(argv[bcl])=tmp" ... et si c'était pour une comparaison, le tmp n'étant pas initialisé, je comprend pas non plus.

Ca m'a l'air bien compliqué pour pas grand chose tout ça
(et c'est quoi ce stack pointer ? )
profil | Website | edit | quote
Chalk
Inscrit le 14-07-2004
Posté le 14-05-2007 11:49

Petit programme en C pour faire ce que tu veux (pas compilé pour tester )
Code:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>

int main(int argc, char *argv[]) {
int i, j;
int nb=0;
int count=0;
char **mots;
char found;

mots = calloc(sizeof(char*), argc);

mots[0] = strdup(argv[1]);
count++;
nb++;

for(i=2; i<argc; i++) {
found=0;
for(j=0; j<count; j++)
if(!strcmp(mots[j], argv[i])) found=1;
if(!found) {
mots[count++]=strdup(argv[i]);
nb++;
}
}

printf("Il y a %d mots qui apparaissent en moyenne %.02f fois !\n", nb, (float)nb/argc);

return 0;
}


profil | Website | edit | quote
MeiK
Inscrit le 20-11-2002
Posté le 14-05-2007 11:54

alors deja t'as un segfault quand argc == 1
Puis sinon ya ca qui est pas super:

Code:

meik@devmail % ./toto "a la claire fontaine" [(0) /tmp]
Il y a 1 mots qui apparaissent en moyenne 0.50 fois !



et ensuite tu liberes jamais la memoire:

==16114== LEAK SUMMARY:
==16114== definitely lost: 41 bytes in 5 blocks.
==16114== possibly lost: 0 bytes in 0 blocks.
==16114== still reachable: 0 bytes in 0 blocks.
==16114== suppressed: 0 bytes in 0 blocks.

(avec comme parametres: "a la claire fontaine")

Oublie pas de liberer ta memoire ;-) (je sais, la c'etait un prog d'exemple, mais faut toujours y penser)

_________________________


[ Ce Message a été édité par: MeiK le 2007-05-14 11:57 ]
profil | mail | edit | quote
Chalk
Inscrit le 14-07-2004
Posté le 14-05-2007 12:07

En effet, les guillemets sont pas gérés, il va considérer ça comme un seul mot et faut diviser par (argc - 1) à la fin.
Et j'ai pas fait les vérifs d'usage sur argc, mais bon, c'est effectivement un prog d'exemple tapé rapidement sans l'avoir testé.

Pour la mémoire, de toute façon la page allouée au programme est libérée une fois l'exécution terminée non ?
Par contre j'aimerais bien savoir avec quel soft tu repères les memory leaks

[ Ce Message a été édité par: Chalk le 2007-05-14 12:09 ]
profil | Website | edit | quote
MeiK
Inscrit le 20-11-2002
Posté le 14-05-2007 13:05

Sinon le memleak je l'ai repere de tete la, vu que j'ai vu un calloc mais pas de free, mais je l'ai mis en evidence avec Valgrind
_________________________

profil | mail | edit | quote
Nothing2Do
Inscrit le 17-04-2006
Posté le 14-05-2007 14:32

mais pourquoi vous ne voulez pas me dire ce qui coince au lieu de tout recommencer ?
et j'ai essayé ton code et : "discourama.cpp:25: erreur: invalid conversion from ‘void*’ to ‘char**’"
_________________________
On ne vois des anges que le dos ...
profil | mail | Website | AIM | ICQ | Yahoo | MSN | edit | quote
Chalk
Inscrit le 14-07-2004
Posté le 14-05-2007 14:49

Je t'aiderais bien, mais franchement, j'ai du mal à comprendre ton code ... tu pourrais le commenter pour comprendre ce que tu as voulu faire ?
Genre le "search(argv[bcl])=tmp", comme dit dans mon post précédent, je comprend pas ...
Et puis dans la boucle de ta fonction search, tu vérifies à chaque tour de boucle si oui est à 0, alors qu'il ne faut le vérifier qu'une fois, lorsque tu sors de la boucle.

Et ton switch pour 2 cas ... autant faire un if/else
profil | Website | edit | quote
Nothing2Do
Inscrit le 17-04-2006
Posté le 14-05-2007 15:04

"search(argv[bcl])=tmp", c'est juste pour ne pas l'appeler 2 fois la fonction.
"tu vérifies à chaque tour de boucle si oui est à 0, alors qu'il ne faut le vérifier qu'une fois, lorsque tu sors de la boucle.", exact, mais je ne pense pas que sa soit faisable (et je ne sais pas comment)
_________________________
On ne vois des anges que le dos ...
profil | mail | Website | AIM | ICQ | Yahoo | MSN | edit | quote
Chalk
Inscrit le 14-07-2004
Posté le 14-05-2007 15:36

Mais "search(argv[bcl])=tmp" ça veut rien dire ... là tu affectes à un retour de fonction la valeur de tmp qui n'est même pas initialisé ...
Et tu fais un test sur la valeur -1 dans ton switch alors que ta fonction ne retourne pas cette valeur !

A mon avis, c'est inutile d'utiliser une fonction search, autant tout mettre dans le main. Mais dans ce cas là impossible d'utiliser directement les variables locales de la fonction main, il faut les passer en paramètre par référence (je suis même pas sûr qu'en déclarant la fonction comme tu l'as fait tu aies le droit d'utiliser ces variables, mais passons).

Après, tu utilises un tableau à 2 dimensions de type string, et tu fais des incrémentations ("bdd[tmp, 2]++;") comme si c'était des entiers.

Pour ta boucle avec le oui, il suffit de faire :
Code:

for (tmp=0; tmp<argc; tmp++){
if(bdd[tmp, 1]==mot) {
bdd[tmp, 2]++;oui=1
}
}
if (oui==0) {
bdd[sp++,1]=mot;
}


Et là tu ne testes qu'une fois si le oui est à 0

On a le droit de faire directement des comparaisons sur des chaines en C++ (je connais mal) ?

En gros, pas mal de choses à corriger, inspire toi (algorithmiquement) de la source que j'ai mis plus haut pour refaire quelque chose de propre. (et adapte avec les remarques que Meik a fait )
profil | Website | edit | quote
tweakie
Inscrit le 01-02-2002
Posté le 14-05-2007 16:07

Quote:

Le 14-05-2007 11:38, Chalk a écrit :
___________________________________________________
Je ne pensais pas qu'on pouvait déclarer une fonction A dans une fonction B, et lui faire utiliser les variables locales à B.



Ah non, ca, on peut pas. Je repondais ponctuellement sur la declaration de fonction dans une autre fonction, mais je dois avouer que je n'ai pas pris le temps de lire le source au prealable.

Quote:

Et puis y'a pas mal de trucs bizarres dans ce code (...) Ca m'a l'air bien compliqué pour pas grand chose tout ça



Idem.
_________________________
Un peu de science vaut mieux que beaucoup de dévotion
profil | Website | edit | quote
Nothing2Do
Inscrit le 17-04-2006
Posté le 14-05-2007 18:32

je n'ai rien compris de ce que vous disiez donc, j'ai tout repris et là, j'ai une page d'erreur.
Mon nouveau code :
Code:

#include <iostream>
#include <string>
#define LIMIT 65535
using namespace std;
class analyse
{
static int nmots; /* le nombre de mots */
static int nmotsunik; /* le nombre de mots "unique" */
static string mots[LIMIT]; /* le conteneur de mots */
static int cmots[LIMIT]; /* combien de fois se mot apparait */
public:
analyse()
{
nmots=0;
}
int search(string tmpmots)
{
for (int bcl=0; bcl<nmots ; bcl++)
{
if (tmpmots==mots[bcl]) return bcl;
}
return 0;
}
int add(string tmpmots)
{
int tmp;
nmots++;
if (tmp=search(tmpmots))/* si il existe dans la liste */
{
cmots[tmp]++;
return tmp;
}
else /* sinon */
{
mots[nmots]=tmpmots;
nmotsunik++;
return 0;
}
}
int limit()
{
return nmots;
}
int print()
{
for (int bcl=0; bcl<nmots; bcl++)
{
cout<<mots[bcl]<<"("<<cmots[bcl]<<")";
}
}
};
int main(int argc, string argv[])
{
analyse premiere;
for (int bcl=0; bcl<argc-1; bcl++)
{
premiere.add(argv[bcl]);
}
premiere.print();
return 0;
}



Lq page d'erreur :
/tmp/ccyWWNjk.o: In function `analyse::analyse()':
discourama.cpp:(.text._ZN7analyseC1Ev[analyse::analyse()]+0x5): undefined reference to `analyse::nmots'
/tmp/ccyWWNjk.o: In function `analyse::search(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)':
discourama.cpp:(.text._ZN7analyse6searchESs[analyse::search(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)]+0x16): undefined reference to `analyse::mots'
discourama.cpp:(.text._ZN7analyse6searchESs[analyse::search(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)]+0x3a): undefined reference to `analyse::nmots'
/tmp/ccyWWNjk.o: In function `analyse::add(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)':
discourama.cpp:(.text._ZN7analyse3addESs[analyse::add(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)]+0x8): undefined reference to `analyse::nmots'
discourama.cpp:(.text._ZN7analyse3addESs[analyse::add(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)]+0x10): undefined reference to `analyse::nmots'
discourama.cpp:(.text._ZN7analyse3addESs[analyse::add(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)]+0x78): undefined reference to `analyse::cmots'
discourama.cpp:(.text._ZN7analyse3addESs[analyse::add(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)]+0x82): undefined reference to `analyse::cmots'
discourama.cpp:(.text._ZN7analyse3addESs[analyse::add(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)]+0x8f): undefined reference to `analyse::nmots'
discourama.cpp:(.text._ZN7analyse3addESs[analyse::add(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)]+0x98): undefined reference to `analyse::mots'
discourama.cpp:(.text._ZN7analyse3addESs[analyse::add(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)]+0xac): undefined reference to `analyse::nmotsunik'
discourama.cpp:(.text._ZN7analyse3addESs[analyse::add(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)]+0xb4): undefined reference to `analyse::nmotsunik'
/tmp/ccyWWNjk.o: In function `analyse::print()':
discourama.cpp:(.text._ZN7analyse5printEv[analyse::print()]+0x16): undefined reference to `analyse::cmots'
discourama.cpp:(.text._ZN7analyse5printEv[analyse::print()]+0x21): undefined reference to `analyse::mots'
discourama.cpp:(.text._ZN7analyse5printEv[analyse::print()]+0x66): undefined reference to `analyse::nmots'
collect2: ld a retourné 1 code d'état d'exécution

_________________________
On ne vois des anges que le dos ...

[ Ce Message a été édité par: Nothing2Do le 2007-05-14 18:34 ]
profil | mail | Website | AIM | ICQ | Yahoo | MSN | edit | quote
Newtopic | Reply 1 | 2 | 3 | Page suivante

Online : EVrcerCymn, Jerryurbaw, Lntdbithatly, Michaelcoofe, ScottFaike, Williamtus et 78 Guests


Retour Index NewFFR Repository : http://taz.newffr.com
Cagades à Stick : http://alcane.newffr.com
Forum HTML et Archive -> ici
ForumFR Sql/Xml (2006/04) (SF pas à jour du tout...) - Alive since 2001 Newffr.com
Pour toute plainte ou problème -> Contacter Borax, Hyatus, Tweakie ou Stick par message privé (ou Gueulez sur le forum :) )
Retour haut de page