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

  FORUM HardWare.fr
  Programmation
  C

  Dissocier les fonctions

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Dissocier les fonctions

n°1521301
dRfELL
I want to believe.
Posté le 27-02-2007 à 22:08:25  profilanswer
 

Voila j'ai le code suivant dont je n'arrive pas à faire des fonctions indépendantes, à cause de l'allocation dynamique des matrices...
si quelqu'un pourrait m'aider ca serait supre sympa ;)

Code :
  1. // Projet2A.cpp : Defines the entry point for the console application.
  2. //
  3. #include "stdafx.h"
  4. #include "stdio.h"
  5. #include "stdlib.h"
  6. #include "malloc.h"
  7. int main()
  8. {
  9. int **ini, **min, **regret, nbrVilles=0, ligne=0, k=0, min_i, min_j;
  10. int carac;
  11. FILE *ptrFichier;
  12. if((ptrFichier=fopen("D:\\Projet\\CP2\\Projet\\resultats.txt","r" ))==NULL)
  13.  exit(-1);
  14. while(carac!='\n')
  15. {
  16.  carac=fgetc(ptrFichier);
  17.  if(carac=='\t')
  18.   nbrVilles++;
  19. }
  20. rewind(ptrFichier);
  21. // on alloue dynamiquement les matrices en fonction du nombre de ville
  22. if( (ini=(int **)malloc(nbrVilles*sizeof(int *))) == NULL ) exit(-1);
  23. for( int j=0;j<nbrVilles;j++)
  24. {
  25.  if( (*(ini + j)=(int *)malloc(nbrVilles*sizeof(int))) == NULL ) exit(-1);
  26. }
  27. if( (regret=(int **)malloc(nbrVilles*sizeof(int *))) == NULL ) exit(-1);
  28. for( j=0;j<nbrVilles;j++)
  29. {
  30.  if( (*(regret + j)=(int *)malloc(nbrVilles*sizeof(int))) == NULL ) exit(-1);
  31. }
  32. // on alloue dynamiquement une matrice en fonction du nombre de ville + la colonne pour le min pr partir de chaque ville + ligne pour min en colonne
  33. if( (min=(int **)malloc( (nbrVilles+1)*sizeof(int *)) ) == NULL ) exit(-1);
  34. for(j=0;j<=nbrVilles;j++)
  35. {
  36.  if( (*(min + j)=(int *)malloc( (nbrVilles+1)*sizeof(int)) ) == NULL ) exit(-1);
  37. }
  38. for(int i=0;i<=nbrVilles;i++)
  39.  min[i][nbrVilles]=0;
  40. for(j=0;j<=nbrVilles;j++)
  41.  min[nbrVilles][j]=0;
  42. // on rempli la matrice initiale avec les distances
  43. for(i=0;i<nbrVilles;i++)
  44. {
  45.  for(j=i+1;j<nbrVilles;j++)
  46.  {
  47.   fscanf(ptrFichier,"%d",&ini[i][j]);
  48.   ini[j][i]=ini[i][j];
  49.  }
  50. }
  51. // initialisation de la matrice min
  52. for(i=0;i<nbrVilles;i++)
  53. {
  54.  printf("\n" );
  55.  for(j=0;j<nbrVilles;j++)
  56.  {
  57.   min[i][j]=ini[i][j];
  58.  }
  59. }
  60. // calcul du minimum
  61. for( i=0;i<nbrVilles;i++ )
  62. {
  63.  j=0;
  64.  if(i!=j) min[i][nbrVilles]=ini[i][j];
  65.  else min[i][nbrVilles]=ini[i][j+1];
  66.  for( j=1;j<nbrVilles;j++ )
  67.  {
  68.   if( i!=j && ini[i][j]<min[i][nbrVilles] ) min[i][nbrVilles]=ini[i][j];
  69.  }
  70. }
  71. printf("\n" );
  72. //calcul min pour partir de chaque ville
  73. for(i=0;i<nbrVilles;i++)
  74. {
  75.  for(j=0;j<nbrVilles;j++)
  76.   if(i!=j) min[i][j]-=min[i][nbrVilles];
  77. }
  78. //calcul du min par colonne et du total
  79. for( j=0;j<nbrVilles;j++ )
  80. {
  81.  i=0;
  82.  if(i!=j) min[nbrVilles][j]=min[i][j];
  83.  else min[nbrVilles][j]=min[i+1][j];
  84.  for( i=1;i<nbrVilles;i++ )
  85.   {
  86.    if(i!=j && min[i][j]<min[nbrVilles][j] ) min[nbrVilles][j]=min[i][j];
  87.   }
  88. }
  89. for( i=0;i<nbrVilles;i++)
  90. {
  91.  min[nbrVilles][nbrVilles]+=min[i][nbrVilles];
  92. }
  93. for( j=0;j<nbrVilles;j++)
  94. {
  95.  min[nbrVilles][nbrVilles]+=min[nbrVilles][j];
  96. }
  97. //calcul du regret
  98. for( i=0;i<nbrVilles;i++)
  99. {
  100.  for (j=0;j<nbrVilles;j++)
  101.  {
  102.   if( min[i][j]==0 && i!=j )
  103.   {
  104.    min_i=min[nbrVilles][nbrVilles];
  105.    for( int e=0;e<nbrVilles;e++ )
  106.    {
  107.     if(min[i][e]<min_i && e!=j && e!=i)  min_i=min[i][e];
  108.    }
  109.    min_j=min[nbrVilles][nbrVilles];
  110.    for( int f=0;f<nbrVilles;f++ )
  111.    {
  112.     if(min[f][j]<min_j && f!=i && f!=j)  min_j=min[f][j];
  113.    }
  114.    regret[i][j]=min_i+min_j;
  115.   }
  116.  }
  117. }
  118. // on affiche la matrice min pour partir de chaque ville relativement a Di
  119. printf("\n\n\nMatrice des distances separant les villes\n" );
  120. for(i=0;i<nbrVilles;i++)
  121. {
  122.  printf("\n" );
  123.  for(j=0;j<nbrVilles;j++)
  124.  {
  125.   if(i==j && i<nbrVilles && j<nbrVilles) printf("\t" );
  126.   else printf("%d \t",ini[i][j]);
  127.  }
  128. }
  129. // on affiche la matrice min pour partir de chaque ville relativement a Di
  130. printf("\n\n\nMatrice min pour partir de chaque ville relativement a Di\n" );
  131. for(i=0;i<=nbrVilles;i++)
  132. {
  133.  printf("\n" );
  134.  for(j=0;j<=nbrVilles;j++)
  135.  {
  136.   if(i==j && i<nbrVilles && j<nbrVilles) printf("\t" );
  137.   else printf("%d \t",min[i][j]);
  138.  }
  139. }
  140. // on affiche la matrice regret
  141. printf("\n\n\nMatrice des regrets\n" );
  142. for(i=0;i<nbrVilles;i++)
  143. {
  144.  printf("\n" );
  145.  for(j=0;j<nbrVilles;j++)
  146.  {
  147.   if(min[i][j]!=0) printf("\t" );
  148.   else printf("%d \t",regret[i][j]);
  149.  }
  150. }
  151. printf("\nIl y a %d villes\n",nbrVilles);
  152. system("PAUSE" );
  153. return 0;
  154. }

mood
Publicité
Posté le 27-02-2007 à 22:08:25  profilanswer
 

n°1521304
Emmanuel D​elahaye
C is a sharp tool
Posté le 27-02-2007 à 22:24:37  profilanswer
 

dRfELL a écrit :

Voila j'ai le code suivant dont je n'arrive pas à faire des fonctions indépendantes, à cause de l'allocation dynamique des matrices...
si quelqu'un pourrait m'aider ca serait supre sympa ;)


  • Le fichier source devrait s'appeler .c et non .cpp. Sinon, tu risques de ne pas compiler en C.
  • "stdafx.h" : fichier inconnu
  • "stdio.h" etc. n'existent pas. C'est <stdio.h> etc.
  • <malloc.h> n'est pas standard et inutile ici.
  • si une fonction n'a pas de paramètres, on le précise avec (void)
  • 'ligne' et 'k' ne sont pas utilisés
  • 'carac' est lu avant d'avoir été initialisé; Comportement indéfini.
  • les cast des malloc() sont inutiles
  • exit (-1); n'est pas portable. C'est exit (EXIT_FAILURE);
  • for (int j=0;j<nbrVilles;j++) est correct en C99, mais pas en C90
  • *(ini + j) est une façon compliquée d'écrire ini[j]


Voici de meilleures bases pour démarrer un découpage :

 

Fait de ton mieux. Des structures de données peuvent aider...

Code :
  1. struct tab2D
  2. {
  3.    int ni;
  4.    int nj,
  5.    int **tab;
  6. };


Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main (void)
  4. {
  5.    int **ini, **min, **regret, nbrVilles = 0, min_i, min_j;
  6.    int carac;
  7.    FILE *ptrFichier;
  8.    if ((ptrFichier =
  9.         fopen ("D:\\Projet\\CP2\\Projet\\resultats.txt", "r" )) == NULL)
  10.       exit (-1);
  11.    while ((carac = fgetc (ptrFichier)) != '\n')
  12.    {
  13.       if (carac == '\t')
  14.          nbrVilles++;
  15.    }
  16.    rewind (ptrFichier);
  17. // on alloue dynamiquement les matrices en fonction du nombre de ville
  18.    if ((ini = malloc (nbrVilles * sizeof *ini)) == NULL)
  19.       exit (EXIT_FAILURE);
  20.    {
  21.       int j;
  22.       for (j = 0; j < nbrVilles; j++)
  23.       {
  24.          if ((ini[j] = malloc (nbrVilles * sizeof *ini[j])) == NULL)
  25.             exit (EXIT_FAILURE);
  26.       }
  27.    }
  28.    if ((regret = malloc (nbrVilles * sizeof *regret)) == NULL)
  29.       exit (EXIT_FAILURE);
  30.    {
  31.       int j;
  32.       for (j = 0; j < nbrVilles; j++)
  33.       {
  34.          if ((regret[j] = malloc (nbrVilles * sizeof *regret[j])) == NULL)
  35.             exit (EXIT_FAILURE);
  36.       }
  37.    }
  38. // on alloue dynamiquement une matrice en fonction du nombre de ville + la colonne pour le min pr partir de chaque ville + ligne pour min en colonne
  39.    if ((min = malloc ((nbrVilles + 1) * sizeof *min)) == NULL)
  40.       exit (EXIT_FAILURE);
  41.    {
  42.       int j;
  43.       for (j = 0; j <= nbrVilles; j++)
  44.       {
  45.          if ((min[j] = malloc ((nbrVilles + 1) * sizeof *min[j])) == NULL)
  46.             exit (EXIT_FAILURE);
  47.       }
  48.    }
  49.    {
  50.       int i;
  51.       for (i = 0; i <= nbrVilles; i++)
  52.          min[i][nbrVilles] = 0;
  53.    }
  54.    {
  55.       int j;
  56.       for (j = 0; j <= nbrVilles; j++)
  57.          min[nbrVilles][j] = 0;
  58.    }
  59. // on rempli la matrice initiale avec les distances
  60.    {
  61.       int i;
  62.       for (i = 0; i < nbrVilles; i++)
  63.       {
  64.          int j;
  65.          for (j = i + 1; j < nbrVilles; j++)
  66.          {
  67.             fscanf (ptrFichier, "%d", &ini[i][j]);
  68.             ini[j][i] = ini[i][j];
  69.          }
  70.       }
  71.    }
  72. // initialisation de la matrice min
  73.    {
  74.       int i;
  75.       for (i = 0; i < nbrVilles; i++)
  76.       {
  77.          int j;
  78.          printf ("\n" );
  79.          for (j = 0; j < nbrVilles; j++)
  80.          {
  81.             min[i][j] = ini[i][j];
  82.          }
  83.       }
  84.    }
  85. // calcul du minimum
  86.    {
  87.       int i;
  88.       for (i = 0; i < nbrVilles; i++)
  89.       {
  90.          int j = 0;
  91.          if (i != j)
  92.             min[i][nbrVilles] = ini[i][j];
  93.          else
  94.             min[i][nbrVilles] = ini[i][j + 1];
  95.          for (j = 1; j < nbrVilles; j++)
  96.          {
  97.             if (i != j && ini[i][j] < min[i][nbrVilles])
  98.                min[i][nbrVilles] = ini[i][j];
  99.          }
  100.       }
  101.    }
  102.    printf ("\n" );
  103. //calcul min pour partir de chaque ville
  104.    {
  105.       int i;
  106.       for (i = 0; i < nbrVilles; i++)
  107.       {
  108.          int j;
  109.          for (j = 0; j < nbrVilles; j++)
  110.             if (i != j)
  111.                min[i][j] -= min[i][nbrVilles];
  112.       }
  113.    }
  114. //calcul du min par colonne et du total
  115.    {
  116.       int j;
  117.       for (j = 0; j < nbrVilles; j++)
  118.       {
  119.          int i = 0;
  120.          if (i != j)
  121.             min[nbrVilles][j] = min[i][j];
  122.          else
  123.             min[nbrVilles][j] = min[i + 1][j];
  124.          for (i = 1; i < nbrVilles; i++)
  125.          {
  126.             if (i != j && min[i][j] < min[nbrVilles][j])
  127.                min[nbrVilles][j] = min[i][j];
  128.          }
  129.       }
  130.    }
  131.    {
  132.       int i;
  133.       for (i = 0; i < nbrVilles; i++)
  134.       {
  135.          min[nbrVilles][nbrVilles] += min[i][nbrVilles];
  136.       }
  137.    }
  138.    {
  139.       int j;
  140.       for (j = 0; j < nbrVilles; j++)
  141.       {
  142.          min[nbrVilles][nbrVilles] += min[nbrVilles][j];
  143.       }
  144.    }
  145. //calcul du regret
  146.    {
  147.       int i;
  148.       for (i = 0; i < nbrVilles; i++)
  149.       {
  150.          int j;
  151.          for (j = 0; j < nbrVilles; j++)
  152.          {
  153.             if (min[i][j] == 0 && i != j)
  154.             {
  155.                min_i = min[nbrVilles][nbrVilles];
  156.                {
  157.                   int e;
  158.                   for (e = 0; e < nbrVilles; e++)
  159.                   {
  160.                      if (min[i][e] < min_i && e != j && e != i)
  161.                         min_i = min[i][e];
  162.                   }
  163.                }
  164.                min_j = min[nbrVilles][nbrVilles];
  165.                {
  166.                   int f;
  167.                   for (f = 0; f < nbrVilles; f++)
  168.                   {
  169.                      if (min[f][j] < min_j && f != i && f != j)
  170.                         min_j = min[f][j];
  171.                   }
  172.                }
  173.                regret[i][j] = min_i + min_j;
  174.             }
  175.          }
  176.       }
  177.    }
  178. // on affiche la matrice min pour partir de chaque ville relativement a Di
  179.    printf ("\n\n\nMatrice des distances separant les villes\n" );
  180.    {
  181.       int i;
  182.       for (i = 0; i < nbrVilles; i++)
  183.       {
  184.          int j;
  185.          printf ("\n" );
  186.          for (j = 0; j < nbrVilles; j++)
  187.          {
  188.             if (i == j && i < nbrVilles && j < nbrVilles)
  189.                printf ("\t" );
  190.             else
  191.                printf ("%d \t", ini[i][j]);
  192.          }
  193.       }
  194.    }
  195. // on affiche la matrice min pour partir de chaque ville relativement a Di
  196.    printf
  197.       ("\n\n\nMatrice min pour partir de chaque ville relativement a Di\n" );
  198.    {
  199.       int i;
  200.       for (i = 0; i <= nbrVilles; i++)
  201.       {
  202.          int j;
  203.          printf ("\n" );
  204.          for (j = 0; j <= nbrVilles; j++)
  205.          {
  206.             if (i == j && i < nbrVilles && j < nbrVilles)
  207.                printf ("\t" );
  208.             else
  209.                printf ("%d \t", min[i][j]);
  210.          }
  211.       }
  212.    }
  213. // on affiche la matrice regret
  214.    printf ("\n\n\nMatrice des regrets\n" );
  215.    {
  216.       int i;
  217.       for (i = 0; i < nbrVilles; i++)
  218.       {
  219.          int j;
  220.          printf ("\n" );
  221.          for (j = 0; j < nbrVilles; j++)
  222.          {
  223.             if (min[i][j] != 0)
  224.                printf ("\t" );
  225.             else
  226.                printf ("%d \t", regret[i][j]);
  227.          }
  228.       }
  229.    }
  230.    printf ("\nIl y a %d villes\n", nbrVilles);
  231.    system ("PAUSE" );
  232.    return 0;
  233. }


Message cité 1 fois
Message édité par Emmanuel Delahaye le 27-02-2007 à 23:04:50

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1521314
dRfELL
I want to believe.
Posté le 27-02-2007 à 22:43:15  profilanswer
 

Emmanuel Delahaye a écrit :

Analyse en cours ...

 

  • Le fichier source devrait s'appeler .c et non .cpp. Sinon, tu risques de ne pas compiler en C.

du à Visual Studio (on utilise ça, ce n'est pas mon choix...)

  • "stdafx.h" : fichier inconnu

du à Visual Studio (on utilise ça, ce n'est pas mon choix...)

  • "stdio.h" etc. n'existent pas. C'est <stdio.h> etc.

du à Visual Studio (on utilise ça, ce n'est pas mon choix...)

  • <malloc.h> n'est pas standard et inutile ici.

je l'utilise pour l'allocation dynamique des tableaux... y a t-il une autre solution ?

  • for (int j=0;j<nbrVilles;j++) est correct en C99, mais pas en C90

peux-tu expliquer ? je ne sais pas ce qu'est la différence...



en tout cas, merci pour ton aide ;)

n°1521327
Emmanuel D​elahaye
C is a sharp tool
Posté le 27-02-2007 à 23:15:00  profilanswer
 

dRfELL a écrit :

   * Le fichier source devrait s'appeler .c et non .cpp. Sinon, tu risques de ne pas compiler en C.
    * "stdafx.h" : fichier inconnu
    * "stdio.h" etc. n'existent pas. C'est <stdio.h> etc.

 

du à Visual Studio (on utilise ça, ce n'est pas mon choix...)

 

Je ne veux pas entendre ça. Si c'est vrai, change de compilateur. Mais tu as toujours le choix... Il suffit de mettre le bon code. Ne te laisse pas impressionner par ce que croit savoir Visual C++.

 
  • Créée un projet C
  • Sans fichiers
  • Créée un fichier vierge (xxx.c)
  • Met ce que tu veux dedans.
  • Ajoute le au projet

Non mais.

Citation :


    * <malloc.h> n'est pas standard et inutile ici.

 

je l'utilise pour l'allocation dynamique des tableaux... y a t-il une autre solution ?


Il y a déjà tout ce qu'il faut dans <stdlib.h>

 
Citation :

   * for (int j=0;j<nbrVilles;j++) est correct en C99, mais pas en C90

 

peux-tu expliquer ? je ne sais pas ce qu'est la différence...


Le C a connu 3 grandes phase d'évolution :

 
  • La naissance dans les années 70. C'est le C K&R. Il a permis d'écrire les premiers Unix...
  • La normalisation en 89/90. C'est ce C là (dit C90) qui est utilisé partout (98%)
  • La modernisation en 99. (C99) Tellement moderne qu'il n'est pas encore implémenté correctement. A éviter...


Message édité par Emmanuel Delahaye le 27-02-2007 à 23:50:38

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1521330
Taz
bisounours-codeur
Posté le 27-02-2007 à 23:27:40  profilanswer
 

/me efface vite le drapeau

n°1521533
dRfELL
I want to believe.
Posté le 28-02-2007 à 11:27:50  profilanswer
 

ok...
mon probleme est plus pour le moment de séparer mes fonctions de la fct main...

n°1521541
Emmanuel D​elahaye
C is a sharp tool
Posté le 28-02-2007 à 11:31:22  profilanswer
 

dRfELL a écrit :

ok...
mon probleme est plus pour le moment de séparer mes fonctions de la fct main...


Certes, mais il fallait préparer le travail. Alors quel est le problème ? Quels sont tes essais ?
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1521594
dRfELL
I want to believe.
Posté le 28-02-2007 à 12:16:30  profilanswer
 

oui, je sais, j'ai fait le travail à l'envers :/
 
le probleme est que j'aimerais faire un passage par référence, et je n'y arrive pas du tout,  
j'ai bien essayé de dibouillé des trucs, genre avec un pointeur triple, mais je n'y arrive pas :sweat:

n°1521614
Emmanuel D​elahaye
C is a sharp tool
Posté le 28-02-2007 à 12:34:04  profilanswer
 

dRfELL a écrit :

oui, je sais, j'ai fait le travail à l'envers :/
 
le probleme est que j'aimerais faire un passage par référence, et je n'y arrive pas du tout,  
j'ai bien essayé de dibouillé des trucs, genre avec un pointeur triple, mais je n'y arrive pas :sweat:


Normal, les passages par références, ça n'existe pas en C...
 
Un peu de lecture...
 
http://mapage.noos.fr/emdel/tad.htm
 
Pose des questions si tu ne comprends pas.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1521797
dRfELL
I want to believe.
Posté le 28-02-2007 à 16:07:44  profilanswer
 

je ne vois pas comment ça peut résoudre mon probleme ?
le probleme est peut etre, que je suis pas dans une école d'info et donc la maniere dont on nous apprend le C a peut etre un manque de rigueur...
 
est-ce possible de séparer toutes les fonctions et d'en faire des fonctions autonomes (en dehors de main) ?

mood
Publicité
Posté le 28-02-2007 à 16:07:44  profilanswer
 

n°1521918
Emmanuel D​elahaye
C is a sharp tool
Posté le 28-02-2007 à 18:43:29  profilanswer
 

dRfELL a écrit :

je ne vois pas comment ça peut résoudre mon probleme ?
le probleme est peut etre, que je suis pas dans une école d'info et donc la maniere dont on nous apprend le C a peut etre un manque de rigueur...
 
est-ce possible de séparer toutes les fonctions et d'en faire des fonctions autonomes (en dehors de main) ?


Oui bien sûr. C'est la compilation séparée. La méthode de base est celle-ci :
 
http://mapage.noos.fr/emdel/codage [...] ser_source
http://mapage.noos.fr/emdel/codage.htm#organiser


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1523449
dRfELL
I want to believe.
Posté le 04-03-2007 à 20:26:24  profilanswer
 

merci pour la lecture, mais l'inverter de l'écran de portable à lâcher, je lirai ça dès que je le pourrai :)
 
merci!


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

  Dissocier les fonctions

 

Sujets relatifs
[C++] Problème avec les fonctions virtuellesFonctions
[ PHP ] fonctions mail en local[ PHP ] pb de reconnaissance de fonctions. Help!!!
[Résolu] Matrice et fonctions[Résolu] Pointeurs et fonctions
Classes, fonctions, comment décrire leur syntaxe ?Personne n'appelle les fonctions nul part?!!!!!
code source fonctions PHP[PHP]contourner des fonctions bloquées(serveur Free)
Plus de sujets relatifs à : Dissocier les fonctions


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