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 11/10/2008, à 11:50

guiguitoutch

Pb langage C, lien entre fonction et main, pb .h

Bonjour, je suis en train de programmer un jeu de taquin en C pour l'école, seulement je n'arrive pas à creer des fichier .h qui fonctionnent.

Pour l'instant, j'ai mon main.c, un tabelau.h et un tableau.c

et dans mon main, j'ai une fonction ini_tableau() qui est contenue dans tableau.c, mais je n'arrive pas à compiler le programme,

le compilateur me dit :

guillaume@guillaumeportable:~$ gcc main.c -o main
/tmp/ccOuiBC1.o: In function `main':
main.c:(.text+0x124): undefined reference to `ini_tableau'
collect2: ld a retourné 1 code d'état d'exécution


Pour etre plus précis, je programme sous ubuntu, avec gedit, et toutes mes pages de programmes sont dans mon dossier perso.

Est ce que quelqu'un saurait comment je peux faire?

On m'a dit qu'il fallait que je forme un projet, mais sous gedit, je n'ai pas toruvé comment faire. (avec devc++ c'est très simple)


Il faut aussi que je puisse le faire fonctionner sous mandrake avec kwrite car je serais noté avec les PC de l'école.

Merci d'avance.

Voici ma fonction principale

//fonction principale
#include "tableau.h"
#include <stdio.h>


main()
{
    void ini_tableau();
    int choix,quit=0;
    char x;

//Animation de depart  
    system("clear");
	printf("        /////// 							\n");
	printf("       (  @ @ )								\n");
	printf("----oOOo--(_)-oOOo--------------------------------------------------	\n");
	printf("			         Jeu de Taquin				\n");
	printf("  	 GOOD			Par Mariama Diallo			\n");
	printf(" 	 LUCK			& Guillaume Brion			\n");
	printf("---------------Ooooo------------------------------------------------	\n");
	printf("               (   )							\n");
	printf("      ooooO     ) /							\n");
	printf("      (   )    (_/							\n");
	printf("       | (								\n");
	printf("        |_)    								\n");

//Boucle pour le menu de depart
do
{  
    printf("\t \t========================\n");
    printf("\t \t| 1-Jouer une partie   |\n");
    printf("\t \t| 2-Manuel\t       |\n");
    printf("\t \t| 3-Charger une partie |\n");
    printf("\t \t| 4-Quitter\t       |\n");
    printf("\t \t========================\n\n");

    scanf("%d",&choix);

    switch(choix)
    {
        case 1: ini_tableau();
                break;
        //case 2:manuel();
                //break;
        //case 3: load(plateau);
                //start_game(plateau);
                //break;
        case 4:
		system("clear");
                printf("Etes vous certain de vouloir quitter? (o/n)\n");
		scanf("%c",&x);
                if(x=='o') quit=1;
    }
}while(quit==0);    
   
    system("clear");
    printf("    Merci et à bientot\n");
    
    system("PAUSE");
    return(0);
}

voici mon tableau.c

#include "tableau.h"

#include <stdlib.h>

#include <stdio.h>





//declaration de la variable pour le nombre de case du tableau de jeu

int x,drapeau=0;

int choix;



//fonction permettant de choisir le nieveau de jeu souhaite et de creer le tableau de jeu voulu

//entree : rien

//sortie : le tableau

void ini_tableau()



do

{



drapeau=0;

//affichage des choix possibles de niveaux

printf("Choisir le niveau de jeu souhaite ?");

printf("\nDebutant      : 1");

printf("\nIntermediaire : 2");

printf("\nEleve         : 3\n\n\n");

scanf("%d",&choix);



switch(choix)

    {

        case 1:x=2; 

                break;

        case 2:x=3; 

                break;

        case 3:x=4; 

                break;

        default: printf("\tmauvaise saisie \n");  drapeau=1; 

    }



}while(drapeau==1);



//declaration du tableau de jeu

int tableau[x][x];

int y=0;

y=(x*x);

printf("\nLe tableau de jeu comportera %d cases",y);



//declaration du tableau rempli par la fonction aleatoire pour eviter les repetitions

int repetition[y];

int i,j,c,k,m=0,v=1;

int trouve=0;

srand(time(NULL));



//remplissage du tableau

for(i=0;i<x;i++)

{

	for(j=0;j<x;j++)

	//fonction qui va placer aleatoirement les chiffres dans le tableau

	{

		//Permet de choisir un nombre aleatoire different a chaque fois

		do

		{

            	trouve=0;

	        c=rand()%y+1;

		    //il faut regarder dans repetition[] si le chiffre n'a pas deja ete tire

		    for(k=0;k<m;k++)

	            {

			if(repetition[k]==c)

				{

				trouve=1;

				break;

				}

		    }

                }while(trouve==1); 



//le chiffre trouve n avait pas encore ete tire donc on l insere dans notre tableau de jeu et dans repetition

repetition[m]=c;

m++;

tableau[i][j]=c;

v++;

      }

}  



printf("\nTableau rempli");



//affichage du tableau de jeu en cherchant le chiffre maximum pour faire office de case vide

for(i=0;i<x;i++)

	{

	printf("\n\t\t");

	for(j=0;j<x;j++)

		{

		if(tableau[i][j]!=y)

			{

			if(tableau[i][j]<10)

			printf("   %d",tableau[i][j]);

			else printf("  %d",tableau[i][j]);

			}

		else printf("  --"); //case vide

		}

	}



printf("\n");

system("pause");

Et voici mon tableau.h


#ifndef TABLEAU_H
#define TABLEAU_H

void ini_tableau();

#endif

#2 Le 11/10/2008, à 12:25

claudius01

Re : Pb langage C, lien entre fonction et main, pb .h

Bonjour,

L'erreur est normale car 'gcc main.c -o main' ne compile que 'main.c' et ton 'ini_tableau()' est dans le fichier 'tableau.c' qu'il faudrait aussi compiler.
Je te propose donc en 1ère solution:

gcc main.c ini_tableau.c -o my_exec

Faire ensuite:

./my_exec

Cordialement, A+
--
Claudius

Hors ligne

#3 Le 12/10/2008, à 15:00

guiguitoutch

Re : Pb langage C, lien entre fonction et main, pb .h

Je te remercie, ca fonctionne beaucoup mieu comme ca.

Par contre, j'ai une autre question, comme vous pouvez le voir dans mon programme, je désire envoyer un tableau[x][x] dans des fonctions, sauf que le "x" en question étant variable en fontion du niveau de jeu, cela ne fonctionne pas.

Je me suis dit qu'il falalit alors que je refasse mon programme, en déclarant mes trois tableaux différents, et que j'envoie suivant le niveau choisi le tableau souhaité à une fonction qui lui correspond.

exemple :

j'envoi mon tableau4[2][2] à ma fonction ini_tableau4
                   tableau9[3[3]  à ma fonction ini_tableau9
et mon tableau16[4][4] à ma fonction ini_tableau16


alors que ce que je souhaitais faire, c'était savoir tout d'abord le niveau souhaité qui sera inclu dans mon "x", et ensuite, travailler dans tout le programme avec mon tableau[x][x], que j'enverrais à une seule fonction ini_tableau et qui ferait comme si mon x était un nombre!


est ce que quelqu'un saurait si je peux y arriver ou si je dois faire mon programme avec plusieurs tableaux?

J'ai entendu parler des pointeurs, mais je ne sais pas si ils peuvent me servir dans ce cas, et ils me parraissent très compliqué à mettre en place.

Merci

#4 Le 12/10/2008, à 16:10

claudius01

Re : Pb langage C, lien entre fonction et main, pb .h

Bonjour,

Si j'ai bien compris, le niveau du jeux correspond à la taille n x n dudit tableau
En fait, je te conseille de travailler sur un unique tableau 'tableau[n][n]' utilisé par toutes les procédures, dont ini_tableau() avec en argument le n correspondant au niveau

Pour reprendre ton exemple:
j'envoi mon tableau4[2][2] à ma fonction ini_tableau4
                   tableau9[3[3]  à ma fonction ini_tableau9
et mon tableau16[4][4] à ma fonction ini_tableau16

cela se traduira simplement par:
j'envoi mon tableau (adresse de tableau[0][0] équivalent à '&tableau[0][0]' équivalent à 'tableau') à ma fonction ini_tableau(niveau correspondant à la taille n_max x n_max)

le 'void ini_tableau();' est donc à étendre comme 'void ini_tableau(int n_max);'

En espérant t'avoir aidé...


Cordialement, A+
--
Claudius

Hors ligne

#5 Le 12/10/2008, à 16:27

guiguitoutch

Re : Pb langage C, lien entre fonction et main, pb .h

Merci d'avoir répondu, je ne comprends pas bien ce que tu veux me faire faire, est ce que je dois faire seuelemtn un tableau de la taille du plus grand utilisé, et ne remplir seulement quelques cases pour les niveaux infèrieurs?

Cela me parait relativement compliqué à manipuler pour les niveau infèrieurs.

Ou est ce que tu me demande d'utiliser les pointeurs?

Quelqu'un pourrait me dire si un pointeur qui fait reference a mon x pourrait faire office?
je m'exlique, est ce que je peux déclarer mon pointeur :
*ptr=x

demander la valeur de mon x

le pointeur désignera donc une allocation contenant ma valeur de mon x

et ensuite, déclarer mon tableau[ptr][ptr] dans mon main

et l'envoyer dans mes fonctions
par exemple ini_tableau(tableau[ptr][ptr]


cela risque t'il de fonctionner ou un pointeur n'est pas du tout ce dont je parle?

merci

#6 Le 12/10/2008, à 17:30

morphoneo69

Re : Pb langage C, lien entre fonction et main, pb .h

Tu peux t'en sortir avec un malloc.
Est-il possible d'avoir une petite archive des sources  ?

Hors ligne

#7 Le 12/10/2008, à 18:26

guiguitoutch

Re : Pb langage C, lien entre fonction et main, pb .h

Des sources? j'ai mis mon code au dessus, je n'ai rien à mettre d'autre!
Je vais essayer d'utiliser un pointeur, mais si vous aviez quelques exemples concrets, ou meme directement comment l'insérer dans mes lignes je veux bien, parce que j'ai lu mon bouquin de C donné par l'école, et je ne comprends pas grand chose.

#8 Le 12/10/2008, à 19:00

claudius01

Re : Pb langage C, lien entre fonction et main, pb .h

Bonsoir,

A propos du code ci-dessus, sauf erreur de ma part, les lignes de 'tableau.c'

int x = 0;
int tableau[x][x];

sont syntaxiquement incorrectes en C (la taille d'un tableau doit être connue à la compilation)
Maintenant, si tu tiens absolument à utiliser des pointeurs, je te propose

int *ptableau;
...
ptableau = (int *)malloc(x*x*sizeof(int));

Maintenant, bonjour pour accéder à tableau[n][m] qui devrait être *(ptableau + n*x + m) ou *(ptableau + n + m*x)
c'est comme tu veux cool


Cordialement, A+
--
Claudius

Hors ligne

#9 Le 12/10/2008, à 21:06

morphoneo69

Re : Pb langage C, lien entre fonction et main, pb .h

Je suis en train de lire ton code et il y a quelques petites choses à dire :
Le tableau "répétition" est égale au tableau "tableau". Pourquoi pas rechercher directement dans "tableau" si le nombre n'existe pas. Tu gagneras en mémoire.
Ou si ta vraiment de très gros tableau, fait un tableau répétition mais trié et tu pourras utiliser des algorithmes de recherche plus rapide. A toi de voir si vaut mieux utiliser un peu plus de mémoire ou pas.

Ensuite la fonction ini_tableau crée un tableau très bien, mais sa signature n'est pas bonne.
Il faut que tu utilises une signature du type :
void ini_tableau(int ** tableau, int size_tab); 
int ini_tableau(int ** tableau); 
int ** ini_tableau(int size_tab);
Comme cela tu pourras utiliser dans ton main, le tableau et tu aura aussi sa taille.

Evite les variables globales dans tableau.c surtout qu'elles sont pas utiles.

Crée une fonction d'affichage de ton tableau, t'en aura surement besoin par la suite, au moins pour controler son évolution.

J'ai utilisé des pointeurs, c'est pas méchant à utiliser mais il faut juste bien comprendre comment ça fonctionne. Pour cela : faire des petits dessins, faire des petits programmes test, lire des cours (sur developpez par exemple)
http://c.developpez.com/faq/?page=tableaux

Pour le moment c'est tout.

Hors ligne