Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : probleme programme [ Divers / Général ] (maciass)

vendredi 9 mai 2008 à 22:20:56 | probleme programme

maciass

slt est ce que qlq un peut me dire pkoi le programme suivant ne marche pas:


#include <stdio.h>
#include <conio.h>
#define GRAPHSIZE 2048
#define INFINITY GRAPHSIZE*GRAPHSIZE
#define MAX(a, b) ((a > b) ? (a) : (b))

 

int e; /* The number of nonzero edges in the graph */
int n; /* The number of nodes in the graph */
long dist[GRAPHSIZE][GRAPHSIZE]; /* dist[i][j] is the distance between node i and j; or 0 if there is no direct connection */
long d[GRAPHSIZE]; /* d[i] is the length of the shortest path between the source (s) and node i */

void printD() {
 int i;
 for (i = 1; i <= n; ++i)
  printf("%10d", i);
 printf("\n");
 for (i = 1; i <= n; ++i) {
  printf("%10ld", d[i]);
 }
 printf("\n");
}

void dijkstra(int s) {
 int i, k, mini;
 int visited[GRAPHSIZE];

 for (i = 1; i <= n; ++i) {
  d[i] = INFINITY;
  visited[i] = 0; /* the i-th element has not yet been visited */
 }

 d[s] = 0;

 for (k = 1; k <= n; ++k) {
  mini = -1;
  for (i = 1; i <= n; ++i)
   if (!visited[i] && ((mini == -1) || (d[i] < d[mini])))
    mini = i;

  visited[mini] = 1;

  for (i = 1; i <= n; ++i)
   if (dist[mini][i])
    if (d[mini] + dist[mini][i] < d[i])
     d[i] = d[mini] + dist[mini][i];
 }
}

 main() {
 int i, j;
 int u, v, w;

 FILE *fin ;
 
    fin= fopen("dist11.txt", "r");
 fscanf(fin, "%d", &e);
 for (i = 0; i < e; ++i)
  for (j = 0; j < e; ++j)
   dist[i][j] = 0;
 n = -1;
 for (i = 0; i < e; ++i) {
  fscanf(fin, "%d%d%d", &u, &v, &w);
  dist[u][v] = w;
  n = MAX(u, MAX(v, n));
 }
 fclose(fin);

 dijkstra(1);
 printD();


 getch();
}
il m affiche le message suivant mon projet.exe a rencontré un probleme et doit se fermé
qlq un a la solution?
merci d avance


samedi 10 mai 2008 à 01:36:34 | Re : probleme programme

SAKingdom

Membre Club
for (k = 1; k <= n; ++k)
etc. etc. etc.

Un tableau commence toujours à 0 et se termine donc à l'indice taille-1

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

C++ (@++)


samedi 10 mai 2008 à 01:36:47 | Re : probleme programme

The_Snail

Bonjour,

Je n'ai pas trop regarder ton code, mais ça m'étonnerais pas que ton problème viennent de ton tableau dist qui doit prendre trop de place dans la pile (j'ai déjà eu ce genre de problème, ça fait planter le programme à l'exécution).

La seule solution que je connaisse c'est d'allouer l'espace mémoire dynamiquement (dans le tas). Après je dis peut être des bêtises et si c'est le cas, on me corrigera . J'espère que ça pourra t'aider.

++

samedi 10 mai 2008 à 01:52:49 | Re : probleme programme

The_Snail

Rebonjour,

Bon apparament je t'ai dit des bêtises ne prend pas en compte mon message, je viens de test ce qu'a dit SAKingdom et ça marche très bien. Ca m'apprendra à lire le code en speed

++

samedi 10 mai 2008 à 11:03:45 | Re : probleme programme

maciass

a part les reponses betes y a il qlq un de vous capable de trouver la cause du probleme parce que la vous dites vraiment n importe koi

samedi 10 mai 2008 à 11:23:00 | Re : probleme programme

jfrancois

Bonjour,

Il faudrait le contenu du fichier dist11.txt pour tester un peu ! (au moins un exemple minimal du contenu)

Jean-François


samedi 10 mai 2008 à 12:20:37 | Re : probleme programme

BruNews

Administrateur CodeS-SourceS
for (i = 1; i <= n; ++i) {
  d[i] = INFINITY;
  ...
}

comme dit par SAK, tu écris hors du tableau.
Commence par corriger les indexations erronées et tu verras ensuite de quel coté se trouvaient les bêtises.

ciao...
BruNews, MVP VC++

samedi 10 mai 2008 à 13:09:46 | Re : probleme programme

The_Snail

Salut,

Un conseille, lorsque tu ouvres un fichier pense à regarder si l'ouverture s'est bien passée.
Pour ton cas :

if(fin == NULL)
{
    printf("Erreur de lors de l'ouverture du fichier");
    exit(1);
}


Sans se test, si fopen n'arrive pas à ouvrir le fichier pour une raison ou une autre, ton programme plantera.

samedi 10 mai 2008 à 13:53:13 | Re : probleme programme

jfrancois

1) Il y a aussi l'initilisation de la matrice qui est faux :

for (i=0 ; i<e ; ++i)
   for (j=0 ; j<e ; ++j)
      dist[i][j] = 0;

e = nombre d'arcs décrits dans le fichier. C'est sur GRAPHSIZE qu'il faut tourner en i et en j pour initialiser dist, pas sur e qui peut valoir jusqu'à (GRAPHSIZE * GRAPHSIZE) : Dans un graphe de 2048 sommets (GRAPHSIZE), où tous les sommets sont reliés entre eux, on a 4194304 arcs (e) listés dans le fichier !

for (i=0 ; i<GRAPHSIZE ; ++i)
   for (j=0 ; j<GRAPHSIZE ; ++j)
      dist[i][j] = 0;


2) Il y a aussi le fait que la numérotation des sommets commence à 0 dans le parcours des boucles comme dans l'utilisation des indices des tables ! J'imagine que dans le fichier, les sommets sont numérotés par rapport à 1 et quand on appel dijkstra(1) c'est pour chercher les distances les plus courtes par rapport au premier sommet et non par rapport au deuxième !

3) Dans l'algorithme de Dijkstra, les arcs non renseignés (sommets non connectés) sont sensés être à INFINI, pas à 0. Dans ce programme le 0 est pris en compte comme l'INFINI dans l'algorithme, donc, a priori, c'est pas génant. Seulement voilà ! Un arc à 0 est une valeur tout à fait possible dans un graphe !!!

Jean-François


lundi 12 mai 2008 à 21:02:57 | Re : probleme programme

maciass

en fait ce n est pas ce projet n est pas le mien mais d un ami qui m a demandé de le poster ici pour trouver une solution mais il a decidé de le laisser tomber

merci pour vos reponses



1 2

Cette discussion est classé dans : int, for, mini, dist, graphsize


Répondre à ce message

Sujets en rapport avec ce message

Le plus proche... [ par Sniper_binaire ] Bonjours !Voila je viens avec un petit problème qui me cause des gros soucis : Un bug !Voila ce que ce code est censé faire : il prend nos coordonnés question sur c++ [ par mohamed1985 ] je veux savoir la difference entre f(const int &i) et f( int &i)et aussi la difference entre for(int i=0;i<n;i++) et for(int i=0;i<n;++i) un programme qui tourne pas [ par youssefmahdia ] bonjour,voila, ce programme ne tourne pas,#include  #include  main() { int i,j; int s[5][5]; for(i=0;i {for(j=0;j s[i][j]=(j/(int)pow( problème boucle for C++ : [ par Pilotwings ] Bonjour à toutes et à tous, j'essaye de m'exercer sur des exos que je n'arrive pas à terminer comme il faut. On me demande de remplir le programme sui class matrice [ par ciaonataha ] J'ai ecrit le programme classe matrice...mais j'ai les error comme:"matrice.cpp:269: error: no match for 'operator=' in 'b = matrice::Mat_decomposer(a aide code mot anagramme [ par sahbibenayed ] bonjour;je travaille sur borland C++;je souhaite coder un programme permattant de scanner une chaine de caractere, puis afficher dans chaque ligne les algorithme de greedy [ par starbluesky ] <link rel="Fi aidez-moi s'il vous plait !!!!!!!! [ par starbluesky ] Salut a tous! aidez-moi s'il vous plait  !! Je suis un étudiant en mastè Return tableau? [ par zut69 ] Bonjour,Je suis en train d'écrire un petit programme sur les matrices en C, mais vu que je veux faire quelque chose d'assez général, j'ai besoin que d Problème de boucle for [ par blue01 ] Bonjour tout le monde,    je fais actuellement un programme pour résoudre et générer des sudoku pour me faire la main.Mon compilateur compile en c++ (


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,530 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.