Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 04/06/2006, à 22:09

darkangel6669

Erreur en c++

Bonjour a tous,
Alors voila je suis en train de faire un programme permettant de resoudre les sudokus...tous les sudokus même ceux a 12carrés sur 12 ... 13 sur 13 ... etc ...
Mon programme accepte en paramètre un fichier texte avec tout d'abord le nombre de "grands carrés" qu'il y a dans une ligne puis tous les chiffres de la grilles(0 quand le chiffre n'est pas trouvé).
Malheuresement j'ai une erreur(a la compilation)que je n'arive pas a comprendre et donc pas a résoudre! voila le programme :

#include <iostream>
#include <fstream>
using namespace std;
int nbre;
int taille;
int sudo[taille][taille];
int tmp[taille][taille];

void recopieResultat(int tmp[taille][taille],int sudo[taille][taille],int chiffre)
{
    for(int i=0;i<taille;i++)
        for(int j=0;j<taille;j++)
            if(tmp[i][j]==chiffre)
                sudo[i][j]=chiffre;
}

bool colonneOK(int tmp[taille][taille],int ligne,int chiffre)
{
    for(int colonne=0;colonne<taille;colonne++)
        if(tmp[colonne][ligne]==chiffre)
            return false;
    return true;
}

bool ligneOK(int tmp[taille][taille],int colonne,int chiffre)
{
    for(int ligne=0;ligne<taille;ligne++)
        if(tmp[colonne][ligne]==chiffre)
            return false;
    return true;
}

bool carreOK(int tmp[taille][taille],int colonne,int ligne, int chiffre)
{
    //on se place en haut a droite du carré
    int c=colonne-colonne%3;
    int l=ligne-ligne%3;
   
    for(int c2=c;c<c+nbre;c++)
        for(int l2=l;l<l+nbre;l++)
            if(tmp[c2][l2]==chiffre)
                 return false;
    return true;
}

bool ok(int tmp[taille][taille],int colonne,int ligne,int chiffre)
{
    if(colonneOK(tmp,ligne,chiffre))
        if(ligneOK(tmp,colonne,chiffre))
            if(carreOK(tmp,colonne,ligne,chiffre))
                return true;
}

void recur(int tmp[taille][taille],int taille,int colonne,int chiffre)
{
    if(colonne==taille+1)
        recopieResultat(tmp,sudo,chiffre);
    else
    {
        for(int ligne=0;ligne<taille;ligne++)
        {
            if(tmp[colonne][ligne]==0)
                if(ok(tmp,colonne,ligne,chiffre))
                {
                    tmp[colonne][ligne]=chiffre;
                    recur(tmp,ligne,colonne+1,chiffre);
                }
        }
    }
}



void copie()
{
    for(int i=0;i<taille;i++)
        for(int j=0;j<taille;j++)
            tmp[i][j]=sudo[i][j];
}

void afficherSudo()
{
    cout << endl << endl << endl;
    for(int i=0;i<taille;i++)
        for(int j=0;j<taille;j++)
        {
            if(sudo[i][j]!=0) //si la valeur est egual a 0 c'est que le nombre n'est pas trouvé
            cout << sudo[j][i] << " | ";
            else cout << "  | ";
        }
        cout << endl << "___________________________________" << endl;
}

int main(int argc, char* argv[])
{
    //initialisation du tableau
    ifstream fichier (argv[1]);
    if (!fichier)
    {
               cout << "Erreur : impossible d'ouvrir le fichier en lecture..." << endl;
            return -1;
       }
    if( ! fichier.eof() )
       {
        fichier>>nbre;
    taille=nbre*nbre;
        do
        {
            for(int a=0;a<taille;a++)
            for(int b=0;b<taille;b++)
                fichier>>sudo[a][b];

        }
        while ( ! fichier.eof() );
       }
    fichier.close();
   
    int x; //x=chiffre a trouvé
    for(int x=1;x<=taille;x++)
        for(int i=0;i<taille;i++)
            for(int j=0;j<taille;j++)
            {
                if(sudo[i][j]==0)
                {
                    copie();
                    recur(tmp,taille,i,x);
                }
            }
    afficherSudo();
    return 0;
}

Dernière modification par darkangel6669 (Le 04/06/2006, à 22:10)

Hors ligne

#2 Le 04/06/2006, à 22:38

gene69

Re : Erreur en c++

c'est quoi la ligne de compilation?

---

inutile de tapper sur microsoft. y son des jolis produits et des tas de clients qui ont des sous.

Dernière modification par gene69 (Le 04/06/2006, à 22:53)


Quand le berger est lâche, le loup chie de la laine.
A (draft) guide to UFO Alien-Invasion

Hors ligne

#3 Le 04/06/2006, à 22:46

gene69

Re : Erreur en c++

Bon c'est simple. Tu crois faire un tableau comme ça:

int tmp[taille][taille];

sauf qu'à cette endroit là, le mot ou symbole taille n'est pas défini. Soit plus précis quand tu postes.

Si tu tiens vraiment à faire du C++ regade quand même là pour créer un tableau.
Remplace la fonction malloc par l'operateur NEW et la fonction free par l'operateur DELETE


Quand le berger est lâche, le loup chie de la laine.
A (draft) guide to UFO Alien-Invasion

Hors ligne

#4 Le 04/06/2006, à 22:51

gene69

Re : Erreur en c++

j'ajouterai aussi que une petite modification qui te feras passer à l'erreur suivante.

const int taille = 100;

apres il te restera:
gcc -Wall  extrait.cpp -o main
extrait.cpp: In function `bool ok(int (*)[100], int, int, int)':
extrait.cpp:52: attention : contrôle a atteint la fin non void de la fonction
extrait.cpp: In function `int main(int, char**)':
extrait.cpp:106: erreur: assignment of read-only variable `taille'
extrait.cpp:118: attention : variable « x » inutilisée

mais là ne compte pas sur moi, se soir je tente d'attraper un canard.


Quand le berger est lâche, le loup chie de la laine.
A (draft) guide to UFO Alien-Invasion

Hors ligne

#5 Le 06/06/2006, à 21:45

darkangel6669

Re : Erreur en c++

Merci gene69.
Par contre je n'ai pas les erreurs que tu cite ci dessus. Surement car j'ai un peu modifié mon prog.
Par contre j'ai d'autre erreur comme celle-ci :

recurave.cc:6: erreur: «taille» was not declared in this scope

Je sais très bien ce que cela signifie mais je ne comprend pas comment faire pour faire passer la variable taille dans la procédure. neutral Vu que apparament je ne peux la declarer comme variable globale
Quelqu'un pour m'aider?
Voici la dernière source :

#include <iostream>
#include <fstream>
using namespace std;
int nbre;

void recopieResultat(int tmp[taille][taille],int sudo[taille][taille],int chiffre)
{
    for(int i=0;i<taille;i++)
        for(int j=0;j<taille;j++)
            if(tmp[i][j]==chiffre)
                sudo[i][j]=chiffre;
}

bool colonneOK(int tmp[taille][taille],int ligne,int chiffre)
{
    for(int colonne=0;colonne<taille;colonne++)
        if(tmp[colonne][ligne]==chiffre)
            return false;
    return true;
}

bool ligneOK(int tmp[taille][taille],int colonne,int chiffre)
{
    for(int ligne=0;ligne<taille;ligne++)
        if(tmp[colonne][ligne]==chiffre)
            return false;
    return true;
}

bool carreOK(int tmp[taille][taille],int colonne,int ligne, int chiffre)
{
    //on se place en haut a droite du carré
    int c=colonne-colonne%3;
    int l=ligne-ligne%3;
   
    for(int c2=c;c<c+nbre;c++)
        for(int l2=l;l<l+nbre;l++)
            if(tmp[c2][l2]==chiffre)
                 return false;
    return true;
}

bool ok(int tmp[taille][taille],int colonne,int ligne,int chiffre)
{
    if(colonneOK(tmp,ligne,chiffre))
        if(ligneOK(tmp,colonne,chiffre))
            if(carreOK(tmp,colonne,ligne,chiffre))
                return true;
}

void recur(int tmp[taille][taille],int taille,int colonne,int chiffre, int sudo[taille][taille])
{
    if(colonne==taille+1)
        recopieResultat(tmp,sudo,chiffre);
    else
    {
        for(int ligne=0;ligne<taille;ligne++)
        {
            if(tmp[colonne][ligne]==0)
                if(ok(tmp,colonne,ligne,chiffre))
                {
                    tmp[colonne][ligne]=chiffre;
                    recur(tmp,ligne,colonne+1,chiffre);
                }
        }
    }
}



void copie(int sudo[taille][taille], int tmp[taille][taille])
{
    for(int i=0;i<taille;i++)
        for(int j=0;j<taille;j++)
            tmp[i][j]=sudo[i][j];
}

void afficherSudo(int sudo[taille][taille])
{
    cout << endl << endl << endl;
    for(int i=0;i<taille;i++)
        for(int j=0;j<taille;j++)
        {
            if(sudo[i][j]!=0) //si la valeur est egual a 0 c'est que le nombre n'est pas trouvé
            cout << sudo[j][i] << " | ";
            else cout << "  | ";
        }
        cout << endl << "___________________________________" << endl;
}

int main(int argc, char* argv[])
{
    //initialisation du tableau
    ifstream fichier (argv[1]);
    if (!fichier)
    {
               cout << "Erreur : impossible d'ouvrir le fichier en lecture..." << endl;
            return -1;
       }
    if( ! fichier.eof() )
       {
        fichier>>nbre;
    int taille=nbre*nbre;
    int sudo[taille][taille];
    int tmp[taille][taille];
        do
        {
            for(int a=0;a<taille;a++)
            for(int b=0;b<taille;b++)
                fichier>>sudo[a][b];

        }
        while ( ! fichier.eof() );
       }
    fichier.close();
   
    int x; //x=chiffre a trouvé
    for(int x=1;x<=taille;x++)
        for(int i=0;i<taille;i++)
            for(int j=0;j<taille;j++)
            {
                if(sudo[i][j]==0)
                {
                    copie(sudo,taille);
                    recur(tmp,taille,i,x,sudo);
                }
            }
    afficherSudo(sudo);
    return 0;
}

PS :

Remplace la fonction malloc par l'operateur NEW et la fonction free par l'operateur DELETE

???

PS 2:

gene69 a écrit :

inutile de tapper sur microsoft. y son des jolis produits et des tas de clients qui ont des sous.

Jolis produits? faudra que tu me dise lesquels j'en est jamais vu. lol:P

Dernière modification par darkangel6669 (Le 06/06/2006, à 21:49)

Hors ligne

#6 Le 06/06/2006, à 23:55

gene69

Re : Erreur en c++

pour être particulièrement honnete, je n'ai jamais fait du C++ de ma vie. Que du C.


et en C la ligne suivante est tres moche voir invalide.

void afficherSudo(int sudo[taille][taille]) {}

sudo[x][y] est un tableau à deux dimentions d'entiers. Ok !
or tu déclares que sudo[x][y] est un entier "int  sudo[x][y]" mais dans se cas pourquoi pas le nommer directement "int cellule " ?

AJOUT:
mea culpa, j'ai pas vu que tu as viré la déclaration du mot taille dans ta deuxieme version. Tu t'étonnes apres de recevoir des erreurs? J'ai des explications confuses au point de te dire qu'il faut enlever une déclaration de variable?

Rappelle toi que pour chaque mot dans le code source il doit y avoir une description explicite quelque part pour le compilateur. Soit c'est un type de base depuis une bibliotheque, soit c'est un type, variable, pointeur, opérateur, fonction perso défini par tes soins.


En fait ce que tu veux faire c'est passer un tableau. en C  je ferais comme ceci:

void afficherSudo(int** sudo) {}

en C++ avec les references tu dois pouvoir faire autrement, passer la reférence (du genre

void afficherSudo(int &sudo) {}

que tu appelles comme ça dans les deux cas.

afficherSudo(tableauDeuxDimentions);

mais je le rappelle je n'ai jamais trop fait de C++... et je gere mal ce genre de question délicate.


Pour les messages d'erreurs qui sont différents en fait tout dépend de gcc, j'ai mis une extention cpp et j'ai laisser faire. (normalement ça à compilé avec g++ mais bon...)

~$ gcc -v
Utilisation des specs internes.
Cible : i486-linux-gnu
Configuré avec: ../src/configure -v --enable-languages=c,c++,java,f95,objc,ada,treelang --prefix=/usr --enable-shared --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --enable-nls --program-suffix=-4.0 --enable-__cxa_atexit --enable-clocale=gnu --enable-libstdcxx-debug --enable-java-awt=gtk-default --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.4.2-gcj-4.0-1.4.2.0/jre --enable-mpfr --disable-werror --with-tune=pentium4 --enable-checking=release i486-linux-gnu
Modèle de thread: posix
version gcc 4.0.3 (Ubuntu 4.0.3-1ubuntu5)

Dernière modification par gene69 (Le 07/06/2006, à 00:12)


Quand le berger est lâche, le loup chie de la laine.
A (draft) guide to UFO Alien-Invasion

Hors ligne

#7 Le 06/06/2006, à 23:57

gene69

Re : Erreur en c++

[Hors Sujet]

Jolis produits? faudra que tu me dise lesquels j'en est jamais vu.

eux non... mais quand je vois avec quelle facilité ils dominent la boite ou je stagie, et le nombre de beau soft qui ne sont pas porté sous linux. Snif... je suis amer mais à 100% sous linux. [/Hors Sujet]

Dernière modification par gene69 (Le 06/06/2006, à 23:58)


Quand le berger est lâche, le loup chie de la laine.
A (draft) guide to UFO Alien-Invasion

Hors ligne

#8 Le 07/06/2006, à 00:04

gene69

Re : Erreur en c++

Remplace la fonction malloc par l'operateur NEW et la fonction free par l'operateur DELETE

Oui en fait ce que tu essaye de faire c'est un tableau à taille variable. J'ai besoin de 20*20 je reserve 400 case, j'ai besoin de 9 par 9 je reserve 81 cases.

Pour celà tu as l'obligation de passer par un tableau "dynamique". le lien que je te donnais expliquait comment faire.

en C

int ** sudo = malloc(81*sizeof(int));

en C++ (ne pas mixer new et malloc) (en se basant sur une syntaxe java)

int** sudo = new int[9][9];

PS: sudo correspondant à une commande de ta distribution favorite c'est un TRES mauvais choix de variable... mais bon, je ne mord pas.


Quand le berger est lâche, le loup chie de la laine.
A (draft) guide to UFO Alien-Invasion

Hors ligne

#9 Le 07/06/2006, à 19:59

darkangel6669

Re : Erreur en c++

Alors j'ai essayé l'allocation dynamique ... dur dur hmm
J'ai pas tout compris. Sinon sa ne règle pas les erreurs que j'avais avant neutral
J'en ai même en plus yikes mais bon j'ai du faire une connerie car comme je l'ai dit j'ai pas bien compris l'allocation dynamique.

#include <iostream>
#include <fstream>
using namespace std;
int nbre;

void recopieResultat(int **tmp[taille][taille],int **[taille][taille],int chiffre)
{
	for(int i=0;i<taille;i++)
		for(int j=0;j<taille;j++)
			if(tmp[i][j]==chiffre)
				grille[i][j]=chiffre;
}

bool colonneOK(int **tmp[taille][taille],int ligne,int chiffre)
{
	for(int colonne=0;colonne<taille;colonne++)
		if(tmp[colonne][ligne]==chiffre)
			return false;
	return true;
}

bool ligneOK(int **tmp[taille][taille],int colonne,int chiffre)
{
	for(int ligne=0;ligne<taille;ligne++)
		if(tmp[colonne][ligne]==chiffre)
			return false;
	return true;
}

bool carreOK(int **tmp[taille][taille],int colonne,int ligne, int chiffre)
{
	//on se place en haut a droite du carré
	int c=colonne-colonne%3;
	int l=ligne-ligne%3;
	
	for(int c2=c;c<c+nbre;c++)
		for(int l2=l;l<l+nbre;l++)
			if(tmp[c2][l2]==chiffre)
				 return false;
	return true;
}

bool ok(int **tmp[taille][taille],int colonne,int ligne,int chiffre)
{
	if(colonneOK(tmp,ligne,chiffre))
		if(ligneOK(tmp,colonne,chiffre))
			if(carreOK(tmp,colonne,ligne,chiffre))
				return true;
}

void recur(int **tmp[taille][taille],int taille,int colonne,int chiffre, int **grille[taille][taille])
{
	if(colonne==taille+1)
		recopieResultat(tmp,grille,chiffre);
	else
	{
		for(int ligne=0;ligne<taille;ligne++)
		{
			if(tmp[colonne][ligne]==0)
				if(ok(tmp,colonne,ligne,chiffre))
				{
					tmp[colonne][ligne]=chiffre;
					recur(tmp,ligne,colonne+1,chiffre);
				}
		}
	}
}



void copie(int **grille[taille][taille], int **tmp[taille][taille])
{
	for(int i=0;i<taille;i++)
		for(int j=0;j<taille;j++)
			tmp[i][j]=grille[i][j];
}

void afficherSudo(int **grille[taille][taille]) 
{
	cout << endl << endl << endl;
	for(int i=0;i<taille;i++)
		for(int j=0;j<taille;j++) 
		{
			if(grille[i][j]!=0) //si la valeur est egual a 0 c'est que le nombre n'est pas trouvé
			cout << grille[j][i] << " | ";
			else cout << "  | ";
		}
		cout << endl << "___________________________________" << endl;
}

int main(int argc, char* argv[])
{
	int **grille;
	//initialisation du tableau
	ifstream fichier (argv[1]);
	if (!fichier)
	{
       		cout << "Erreur : impossible d'ouvrir le fichier en lecture..." << endl;
        	return -1;
   	}
	if( ! fichier.eof() )
   	{
        fichier>>nbre;
	int taille=nbre*nbre;
    int** grille = new int[taille][taille];
    int** tmp = new int[taille][taille];
    
		
        do
        {
        	for(int a=0;a<taille;a++)
			for(int b=0;b<taille;b++)
				fichier>>grille[a][b];
 
        }
        while ( ! fichier.eof() );
   	}
 	fichier.close();
	
	int x; //x=chiffre a trouvé
	for(int x=1;x<=taille;x++) 
		for(int i=0;i<taille;i++)
			for(int j=0;j<taille;j++)
			{
				if(grille[i][j]==0)
				{
					copie(grille,tmp);
					recur(tmp,taille,i,x,grille);
				}
			}
	afficherSudo(grille);
	return 0;
}

Voila la liste complète des erreurs que m'afiche mon compilateur :

recurc~1.cc:6: error: `taille' was not declared in this scope
recurc~1.cc:6: error: `taille' was not declared in this scope
recurc~1.cc:6: error: `taille' was not declared in this scope
recurc~1.cc:6: error: `taille' was not declared in this scope
recurc~1.cc: Dans function « void recopieResultat(int) »:
recurc~1.cc:8: error: `taille' undeclared (first use this function)
recurc~1.cc:8: error: (Each undeclared identifier is reported only once for
   each function it appears in.)
recurc~1.cc:10: error: `tmp' undeclared (first use this function)
recurc~1.cc:11: error: `grille' undeclared (first use this function)
recurc~1.cc: Dans function « int main(int, char**) »:
recurc~1.cc:105: error: cannot convert `int (*)[((taille - 1) + 1)]' to `int**'
   in initialization
recurc~1.cc:106: error: cannot convert `int (*)[((taille - 1) + 1)]' to `int**'
   in initialization
recurc~1.cc:72: error: too many arguments to function `void copie()'
recurc~1.cc:127: error: at this point in file
recurc~1.cc:79: error: too many arguments to function `void afficherSudo()'
recurc~1.cc:131: error: at this point in file

Hors ligne

#10 Le 07/06/2006, à 20:25

hello_world

Re : Erreur en c++

Salut!

Je ne pense pas, contrairement à ce qui t'as été proposé, que tu doive passer par de l'allocation dynamique, surtout si tu ne comprends pas ce que c'est. Peut-être devrait tu lires un peu plus de doc. Je suis prêt à t'aider si tu veux, mais je ne suis pas sur qu'une partie de ping-pong sur un forum soit une bonne idée.

Sinon, en gros, l'allocation dynamique permet de modifier la taille d'un tableau après l'avoir créer. Dans ton programme, tu conais déjà la taille du tableau au moment de le créer, c'est pourquoi je ne pense pas que ce soit necessaire de faire de l'allocation dynamique qui est tout de même un peu plus compliquée.

Bonne chance!

++

Hors ligne

#11 Le 07/06/2006, à 20:47

fantomas62

Re : Erreur en c++

Je suis un peu pareil que gene69. Je n'ai pratiqué que le C, pas le C++. Mais bon, je vais tenter de t'aider.

recurc~1.cc:6: error: `taille' was not declared in this scope

signifie que la variable taille n'est pas déclarée dans le bloc ou tu l'utilise. Donc avant de l'utiliser, essaye de déclarer cette variable, en ajoutant quelque chose dans le style :

const int taille = 10;// J'ai vu ca dans un tutoriel de C++
// ou
int taille = 10; // en C
// ou encore
#define TAILLE 10 // en C aussi

Ensuite, concernant cette ligne :

void recopieResultat(int **tmp[taille][taille],int **[taille][taille],int chiffre)

Ca ne veut strictement rien dire!!!:D
Pour déclarer passer un tableau à deux dimensions de taille dynamique, il n'y a pas besoin de rajouter la taille!!!(c'est dynamique non?). Tu devrais plutot l'écrire de cette maniére :

void recopieResultat(int **tmp, int **grille, int chiffre) {
    ...
}

Il y a encore d'autres erreurs, mais je ne les corrigerais pas. C'est en cherchant soit même ses erreurs que l'on s'améliore.

Je ne veux pas être mechant, mais tu semble être un débutant total en C comme en C++. Ne serait-il pas plus judicieux que tu apprennes ces languages avant de coder un programme?
De nombreux livres existent sur le sujet. Pour le C, il y à l'ouvrage de référence "Le langage C", de Kernighan et Richie, qui est, je trouve trés accessible pour les débutants. Pour le C++, on m'a dit beaucoup de bien de l'ouvrage "Le language C++", de Bjarne Stroustrup.
On peut trouver de plus de nombreux tutoriaux sur internet(google est ton ami).

Voilà, bon courage!!!

Hors ligne

#12 Le 08/06/2006, à 00:14

gene69

Re : Erreur en c++

je te dis de completer ta déclaration de taille comme ça:

const int taille = 9;

et tu l'enleves;
quand je te propose

void afficherSudo(int** sudo) {}

tu balances

void afficherSudo(int **grille[taille][taille]){}

à la limite ce qui suit est plus juste puisque le crochet peut indiquer un déférencement comme l'étoile:

void afficherSudo(int grille[][]){}
/* OU */
const int taille = 9;
/*maintenant taille est un symbole/mot/variable/espace-mémoire déclaré*/
void afficherSudo(int grille[taille][taille]){}

mad
la prochaine fois je mors !

recurc~1.cc:6: error: `taille' was not declared in this scope

ce message veut dire que ton compilateur ne sais pas ce que c'est que "taille". Moi je te pose la question


Pour l'allocation dynamique laisse tomber. démare sur une version qui marche pour un tableau qui à toujours 9 cases apres on vera pour les ambitions dynamique... parce que ce que tu as une contrainte géométrique ...

perso pour résoudre les sudoku automatiquement à partir des grilles qu'on trouves dans les journals, ayant remarqué qu'il y a parfois plusieurs solutions sur mon brouillon y'a une pile à générer (pour faire le parcours du graphe des possibilité).

Si notre ami darkangel6669 veut avoir une méthode plus rapide et plus simple il peut coder en prolog. C'est un langage qui est fait pour ce genre de chose, qui est français à l'origine et qui est assez détesté par la masse des développeurs parce qu'il faut être super fort en récursion, et que la syntaxe est assez proche du Lisp ou du Scheme. Ya que la logique à écrire.

Il me semble qu'il manque de bases pour faire du C++. Je lui conseille de potasser les notion de pile d'excution et de pointeurs, et de valeur de retour. Parce que sans celà il risque de perseverer dans l'erreur.

Pour une correction de la syntaxe je ne peut rien te proposer avant ce week end parce que je n'ai pas le temps. dsl

Dernière modification par gene69 (Le 08/06/2006, à 00:16)


Quand le berger est lâche, le loup chie de la laine.
A (draft) guide to UFO Alien-Invasion

Hors ligne

#13 Le 08/06/2006, à 12:57

darkangel6669

Re : Erreur en c++

Désolé gene69 mais je ne comprend pas ce que tu essaye de m'expliquer. Mais bon c'est pas grave j'ai réussi a corriger toute mes erreurs smile !(Avec une allocation dynamique big_smile que j'ai enfin compris).


J'ai juste maintenant un petit problème de boucle infini(le programme tourne en boucle et fini jamais).
Quelqu'un connait un bon debugueur(facile a utiliser)? J'ai deja utilisé quelques fois ddd mais je ne l'aime pas du tout.

Hors ligne

#14 Le 08/06/2006, à 13:36

Link31

Re : Erreur en c++

darkangel6669 a écrit :

Quelqu'un connait un bon debugueur(facile a utiliser)? J'ai deja utilisé quelques fois ddd mais je ne l'aime pas du tout.

Tu fais comme moi, tu mets des cout << "debug" << xxx << endl; un peu partout (avec des xxx différents à chaque fois) et tu regardes pour quel xxx ça coince.
Beaucoup plus simple d'emploi qu'un débogueur lol

Hors ligne

#15 Le 09/06/2006, à 01:29

vogia

Re : Erreur en c++

bonjour,

quand on décrit une fonction, dans l'entete, si il y a un tableau, tu ne peut absolument pas envoyer le tableau en entier par valeur! car les paramètres sont passés dans la pile. alors tu imagine la pile après!
il faut envoyer l'adresse du tableau (parametre formel) et ensuite dans la fonction, déclarer une variable tabeau image du tableau d'origine (toute ses dimentions) et faire coincider l'adresse de la variable tabeau déclarée avec l'adresse du tableau d'origine.
c'est comme une chaine de caratères envoyée comme paramètre, il faut l'envoyer en paramètre formel (par adresse).

#16 Le 09/06/2006, à 02:14

Link31

Re : Erreur en c++

vogia a écrit :

quand on décrit une fonction, dans l'entete, si il y a un tableau, tu ne peut absolument pas envoyer le tableau en entier par valeur! car les paramètres sont passés dans la pile. alors tu imagine la pile après!
il faut envoyer l'adresse du tableau (parametre formel) et ensuite dans la fonction, déclarer une variable tabeau image du tableau d'origine (toute ses dimentions) et faire coincider l'adresse de la variable tabeau déclarée avec l'adresse du tableau d'origine.
c'est comme une chaine de caratères envoyée comme paramètre, il faut l'envoyer en paramètre formel (par adresse).

En gros, il vaut mieux passer un pointeur vers le tableau, plutôt que le tableau lui-même (si j'ai bien compris wink)

Hors ligne

#17 Le 09/06/2006, à 13:29

gene69

Re : Erreur en c++

c'est ça . un tableau ça peut être gros, un pointeur c'est toujours 4octets (sauf en 64 bits...)

Pour le débugeur j'utilise GDB
$ gdb mon_programme
gdb> break fichier.c:numéro_de_ligne
gdb> r (run)
gdb>s (step)
gdb> c (continue)
gdb> p variable (print)
gdb> p &variable
gdb> p *pointeur 

çà me suffit. GDB n'est pas génial avec les thread mais ça marche.


Quand le berger est lâche, le loup chie de la laine.
A (draft) guide to UFO Alien-Invasion

Hors ligne