c pas la peine, j'ai rassemblé le code. mais avant tu doit créer un fichier text (input.txt) dont voici le contenu :
P1on/B_P1,P2off/B_P2,COU_CAB0,TF/B_TF,CF/B_CF,FR/B_FR,V/B_V CTT,CCVD,CCVG,!CTO,CTFG,CTVD,CTVG,!CCTO,!CCADD,!CCADG,CCARD,CCARG
P1on/B_P1,P2off/B_P2,COU_CAB0,TF/B_TF,CF/B_CF,FR/B_FR,V/B_V CTT,CCVD,CCVG,!CTO,CTFG,CTVD,CTVG,!CCTO,!CCADD,!CCADG,CCARD,CCARG
P1on/B_P1,P2off/B_P2,COU_CAB0,TF/B_TF,CF/B_CF,FR/B_FR,V/B_V CTT,CCVD,CCVG,!CTO,CTFG,CTVD,CTVG,!CCTO,!CCADD,!CCADG,CCARD,CCARG
maintenant le code ; ( n'oublie de mettre ton path ! au début de main() )
/*
main.c
-----------
Première modification : 19/07/06
Dernière modification : 27/07/06
Description : Modification du fichier input.txt (carte capteurs)
*/
#include <stdio.h> // directives de préprocesseur
#include <stdlib.h>
#include <string.h>
typedef struct
{
long Dim; // Taille du tableau
char **Tab; // Tableau de chaines ("Sol1-1", "Sol1-2"..)
} _Tabs, *_pTabs;
//-----------------------------------------------------------------
// Extraction des mots d'une ligne à partir d'un séparateur
//-----------------------------------------------------------------
char** split( char* str, const char* separateur)
{
size_t sizeSeparateur = strlen( separateur );
char** currentSplit = 0;
size_t nbSep = 0, sizeSplit = 0, currentSep = 0;
char* pos = str, *currentPos = str;
// Compte le nombre séparateur, et le séparateur par des '\0'
while( pos = strstr( pos, separateur ) )
{
memset( pos, '\0', sizeSeparateur );
++nbSep;
currentPos = (pos += sizeSeparateur);
}
// Calcul la taille du tableau final
sizeSplit = nbSep+1 ;
if ( !sizeSplit )
return 0;
// Alloue le tableau des pointeurs
currentSplit = malloc( (sizeSplit+1) * sizeof(char*) );
if ( !currentSplit )
return 0;
currentSplit[sizeSplit] = 0; // ça permettra après (ds main.c) de faire le test: for(i=0;tab[i];i++)
// Affecte les entrées du tableau
pos = str;
while( currentSep < sizeSplit )
{
currentSplit[currentSep++] = pos;
while( *pos++ );
pos += sizeSeparateur - 1;
}
return currentSplit;
}
//-----------------------------------------------------------------
// Afficher les sol
//-----------------------------------------------------------------
void AfficherSol(_pTabs Tabs, long Index[], long Niveau, long MAXTAB, long *pNbrSol)
{
long IdxEle, Idx;
static long nbrSol=0;
if ( Niveau == MAXTAB )
{
(*pNbrSol)++;
for (Idx=0; Idx < MAXTAB; Idx++)
{
if(Idx != MAXTAB-1)
printf ("%s,", Tabs[Idx].Tab[Index[Idx]]);
else
printf ("%s", Tabs[Idx].Tab[Index[Idx]]);
}
puts("");
return; // retourner à l'appel de fonction (en bas ; ***)
}
for (IdxEle=0; IdxEle < (*(Tabs+Niveau)).Dim; IdxEle++ )
{
Index[Niveau] = IdxEle;
AfficherSol (Tabs, Index, Niveau+1, MAXTAB, pNbrSol); // ***
}
}
int main(int argc, char *argv[])
{
char input[255];
FILE *fic=NULL;
long i, j, nbrCouples=0, tailleStr=255, nbrEtats=0, nbrValsParEtat=0, TailleEtat, IdxEle, nbr2Sol=0;
int premiereLigne=1;
char *coupleEtatsCapteurs=NULL, *Element=NULL;
char **cpsCouple=NULL, **cpsEtats=NULL, **cpsCapteurs=NULL, **cpsMemeEtat=NULL;
_pTabs Tabs=NULL; // au lieu de : "_Tabs Tabs[MAXTAB];"
long *Index=NULL; // au lieu de : "SubTab Index;" équivalent à : "long Index[MAXTAB]"
// pour info : MAXTAB=nbrEtats & MAXRAND=nbrValsParEtat
// ----------- Initialisations ----------------
const char *chemin = "c:\\................................\\"; // n'oublie de mettre ton path !
sprintf(input, "%sinput.txt", chemin);
fic = fopen(input,"r"); // ouverture du fichier input en mode lecture
if(fic == NULL)
exit(0);
coupleEtatsCapteurs = malloc( (tailleStr) * sizeof(*coupleEtatsCapteurs) ); // sizeof(char)
if (coupleEtatsCapteurs == NULL) // Si l'allocation a échoué
exit(0);
// ----------------------------------------------------------------------
// ----------- Lecture des paramètres du fichier "fic" ----------------
rewind(fic); // repositionner le curseur au début de "fic"
nbrCouples = 0; // Réinitialisation ( au cas où ! )
while( fgets(coupleEtatsCapteurs, tailleStr, fic) != NULL )
{ // On lit fic (ligne par ligne) tant qu'on ne reçoit pas d'erreur (NULL)
if( strcmp(coupleEtatsCapteurs, "\n") )
{ // Si ligne non vide
// Virer l'\n à la fin (de la ligne lue)
coupleEtatsCapteurs[strlen(coupleEtatsCapteurs) - 1] = '\0';
// Séparer les couples Etats/Capteurs en 2 chaines :
// l'ensemble des états et l'ensemble des valeurs capteurs
cpsCouple = split(coupleEtatsCapteurs, "\t");
// Extraire les différents états d'un couple
cpsEtats = split(cpsCouple[0], ",");
// Calculer la taille du tableau : cpsEtats
nbrEtats = 0; // réinitialisation
while(cpsEtats[nbrEtats++]);
nbrEtats--; // ne pas oublier de retrancher le dernier
// Après avoir calculé nbrEtats (MAXTAB), on Alloue
if ( (Tabs = malloc(nbrEtats * sizeof(_Tabs))) == NULL)
exit(0);
for(i=0; cpsEtats[i]; i++)
{ // Traiter les "nbrEtats" Etats d'un couple (ligne de fic)
// Extraire les différentes vals d'un même état
cpsMemeEtat = split(cpsEtats[i], "/");
for(j=0; cpsMemeEtat[j]; j++)
printf("%ld : %s\n", j, cpsMemeEtat[j]);
// Calculer la taille du tableau : cpsMemeEtat
nbrValsParEtat = 0; // réinitialisation
while(cpsMemeEtat[nbrValsParEtat++]);
nbrValsParEtat--; // ne pas oublier de retrancher le dernier
// Calculer le nbre max de caractère pour les val d'un même état
j = 0; TailleEtat=0; // réinitialisation
while(cpsMemeEtat[j])
{
if ( strlen(cpsMemeEtat[j]) > TailleEtat )
TailleEtat = strlen(cpsMemeEtat[j]) ;
j++;
};
// Après avoir calculé TailleEtat, on Alloue
if(i==0 && premiereLigne)
{
if ( (Element = malloc(TailleEtat * sizeof(char))) == NULL )
exit(0);
printf("1ere ligne - TailleEtat = %ld\n\n", TailleEtat);
}
else
{
if ( (Element = realloc(Element, TailleEtat * sizeof(char))) == NULL )
exit(0);
printf("TailleEtat = %ld\n\n", TailleEtat);
}
//--------------- Création des tableaux ---------------------------------
Tabs[i].Dim = nbrValsParEtat ; // MAXRAND = nbrValsParEtat
if ( (Tabs[i].Tab = (char **) malloc (sizeof(char *)*Tabs[i].Dim)) == NULL)
exit(0);
for (IdxEle=0; IdxEle < Tabs[i].Dim; IdxEle++) // = for(j=0; cpsMemeEtat[j]; j++)
{
if( (Tabs[i].Tab[IdxEle] = (char *) malloc (sizeof(char)*TailleEtat)) == NULL )
exit(0);
else
{
sprintf (Element, "%s", cpsMemeEtat[IdxEle]);
strcpy (Tabs[i].Tab[IdxEle], Element);
}
}
//free(Element); ça plantais aussi!
}// fin de : for(i=0; cpsEtats[i]; i++)
//-------------- Afficher les tableaux : ---------------------------------
for (i=0; i < nbrEtats; i++) // MAXTAB = nbrEtats;
{
printf ("Tableau numero %ld : ", i+1);
for ( IdxEle = 0; IdxEle < Tabs[i].Dim; IdxEle++)
printf ("%s ", Tabs[i].Tab[IdxEle]);
puts("");
}
puts("");
//-------------- Affichage de la solution -------------------------------
if ( (Index = malloc(nbrEtats * sizeof(long))) == NULL )
exit(0);
AfficherSol(Tabs, Index, 0, nbrEtats, &nbr2Sol);
printf("\n\nnbr2Sol : %ld\n", nbr2Sol);
// Extraire les différents valeurs Capteurs d'un couple
cpsCapteurs = split(cpsCouple[1], ",");
for(i=0; cpsCapteurs[i]; i++)
{
//printf("%d : %s\n", i, cpsCapteurs[i]);
}
free(cpsEtats); // important : libérer
free(cpsMemeEtat);
free(cpsCapteurs);
free(cpsCouple);
free(Tabs);
free(Index);
//free(Element); // ça blante !!!!!!!
nbrCouples++; // compter le nombres de couples (= lignes non vides)
}// fin de : if( strcmp(coupleEtatsCapteurs, "\n") )
premiereLigne = 0; // fin de la 1ere ligne
}// fin de : while( fgets(coupleEtatsCapteurs, tailleStr, fic) != NULL )
printf("\nnbre de couples : %ld\n", nbrCouples);
// ----------------------------------------------------------------------
getchar();
free(Element); // ça blante aussi !!!!!!!!!!!!!!!!!!!!!!!
printf("\nça plante !!!!!!!!!!\n");
free(coupleEtatsCapteurs);
fclose(fic);
}