Simplifier prog.

F0ra Messages postés 111 Date d'inscription mardi 18 septembre 2007 Statut Membre Dernière intervention 29 décembre 2008 - 19 janv. 2008 à 11:06
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 - 19 janv. 2008 à 21:11
Bonjour,
Je cherche de l’aide pour simplifier mon programme au maximum
Voici, le contenu du fichier txt :

0 1 2 5 3 4 … 1 2 5
1 1 5 2 2 6 … 9 2 3
2 5 9 8 8 9 … 0 1 4

2 5 2 3 8 6 … 2 2 1

J’ai besoin de con
Et stoker les valeurs dans un tableau Map[][]

Voici ce que j’ai réalisé :
Ça fonctionne sauf que le programme est long et ne calcul pas le nombre de chiffre en Largeur et en Hauteur.

bool read_number(FILE* fp, int* number)
{
  char szWord[256];
  int i = 0;
  int b;
  *number = 0.0;
naître le nombre de chiffre en Largeur et en Hauteur.
Et stoker les valeurs dans un tableau Map[][]

Voici ce que j’ai réalisé :
Ça fonctionne sauf que le programme est long et ne calcul pas le nombre de chiffre en Largeur et en Hauteur.

bool read_number(FILE* fp, int* number)
{
  char szWord[256];
  int i = 0;
  int b;
  *number = 0.0;
  szWord[0] = '\0';
  while ( ((b=fgetc(fp))!=EOF) && (i<255) )
    {
      if( (b=='-') ||  (b=='.') ||
       (b=='0') ||  (b=='1') ||
       (b=='2') ||  (b=='3') ||
       (b=='4') ||  (b=='5') ||
       (b=='6') ||  (b=='7') ||
       (b=='8') ||  (b=='9') )
 {
     szWord[i++] = (char)b;  
 }
      else if(i>0) break;
    }
  szWord[i] = '\0';
  if(i==0) return false;
  *number = atof(szWord);
  return true;
}
//////////////////////
void Load_Objet(char* Files)
{
 int dNumber;
 FILE*   fp = NULL;
    char data[100];
 sprintf(data,"map/%s",Files);
 fp = fopen(data,"r");
 int tt=0;
 while( !feof(fp) )
 {
  for(int i =0; i < NbrMot; i++)
  {
   read_number(fp,&dNumber);
   Map[i][tt] =dNumber;
  }
  tt++;
 }
 _Objet_Max=tt-1;
}

Merci beaucoup
@+

13 réponses

F0ra Messages postés 111 Date d'inscription mardi 18 septembre 2007 Statut Membre Dernière intervention 29 décembre 2008
19 janv. 2008 à 11:18
Tien, ça bug dans le forum!!!
Il y a du mélange dans l'air.
J'ai besoin de connaître le nombre de chiffre en Largeur et en Hauteur dans un fichier txt.
Et stoker les valeurs dans un tableau Map[][]
0 1 2 5 3 4 .... 1 2 5
1 1 5 2 2 6 .... 9 2 3
2 5 9 8 8 9 .... 0 1 4
....
2 5 2 3 8 6 .... 2 2 1
0
mezaya Messages postés 202 Date d'inscription dimanche 18 mai 2003 Statut Membre Dernière intervention 6 mars 2010
19 janv. 2008 à 12:41
Salut

d'abord je suis étonné que ça compile erreur de cast :
*number = atof(szWord);
atof renvoie un double.

tu peut très dimplifier ton programme en passant par des ostreams :

void Load_Objet(char* Files)
{
char nomFichier[100];
strcpy_s( nomFichier, 100, "map/" );
strcat_s( nomFichier, 100, Files );

fstream fichier( nomFichier, ios::nocreate, filebuf::sh_read );
int index = 0;
while( !fichier.eof() )
{
int ligne = index % NbrMot;
int colonne = index / NbrMot;
fichier >> Map[ligne][colonne];
++index;
}
0
F0ra Messages postés 111 Date d'inscription mardi 18 septembre 2007 Statut Membre Dernière intervention 29 décembre 2008
19 janv. 2008 à 13:50
Je n'avais pas tout écrit :



bool

    read_number(FILE* fp, int* number);<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>





int
NbrMot=63;





int

   Map[500][500];





Bref..






 






J'ai un problème avec ton code,





strcpy_s, Nocreate, sh_read  undeclared identifier


 






j'ai rajouter :





#include
<fstream.h>





Cannot open include file: 'fstream.h': No such file or directory

 






Que faire merci





@+
0
mezaya Messages postés 202 Date d'inscription dimanche 18 mai 2003 Statut Membre Dernière intervention 6 mars 2010
19 janv. 2008 à 13:59
il faut inclure <fstream> et peut etre

#include // si nécessaire
#include <fstream>

le bout code fichier >> Map[ligne][colonne]; lit directement un entier écrit en mode texte et affecte la valeur dans le tableau. l'operateur ">>" lis le code texte en elevant les espaces, tabulations, saut de ligne automatiquement. ça marche pour toute les types de base :

fstream fichier;
float reel;

fichier >> reel; // on lit dans le fichier un reel en mode texte

// accepte le texte les fottants suivant : 0.1235 12 12.5 .25
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
F0ra Messages postés 111 Date d'inscription mardi 18 septembre 2007 Statut Membre Dernière intervention 29 décembre 2008
19 janv. 2008 à 14:31
re,
mon ancien code fonctionne, regard :
http://s.w.o.free.fr/Consol.jpg

ça fonctionne toujours pas. J'ai essayé de mélanger ta technique avec la mienne

 char nomFichier[100];
 FILE*   fp = NULL;
 sprintf(nomFichier,"map/%s",Files);
 fp = fopen(nomFichier,"r");



 int index = 0;
 while( fgetc(fp)!=EOF )
 {
  int ligne   = index % NbrMot;
  int colonne = index / NbrMot;
  MAP[ligne][colonne]>>fgetc(fp);
  index++;
 }

il n'y a pas de bug, mais, il y a pas les bonne valeurs dans MAP de plus elle sont identique.
Dans mon code NbrMot correspondais à 63 pour la ligne et la colonne que mon programme ne calculait pas tout seul.

donc, je ne peux pas avoir les bonne la valeur de ligne et colonne

int ligne   = index % NbrMot;
int colonne = index / NbrMot;

si tu as une autre solution ?
merci
@+
0
mezaya Messages postés 202 Date d'inscription dimanche 18 mai 2003 Statut Membre Dernière intervention 6 mars 2010
19 janv. 2008 à 15:55
pourquoi ça marche pas ? tu as une erreur de compilation, d'execution ?

essaye ça :

void Load_Objet(char* Files)
{
char nomFichier[100];
strcpy_s( nomFichier, 100, "map/" );
strcat_s( nomFichier, 100, Files );

fstream fichier( nomFichier, ios::nocreate, filebuf::sh_read );
int ligne = 0;
while( !fichier.eof() )
{
int colonne = 0;
while( fichier.peek() != '\n' )
{
fichier >> Map[ligne][colonne];
++colonne;
}
++ligne;
}
0
F0ra Messages postés 111 Date d'inscription mardi 18 septembre 2007 Statut Membre Dernière intervention 29 décembre 2008
19 janv. 2008 à 16:57
toujours le même problème avec ton code avec la ligne :
fstream fichier( nomFichier, ios::nocreate, filebuf::sh_read );
strcpy_s, Nocreate, sh_read  undeclared identifier
avec:
#include

<stdio.h>

#include <stdlib.h>

#include <math.h>

#include <time.h>

#include <string.h>

#include <stdio.h>

#include
// si nécessaire
#include <fstream>
fstream fichier;

float reel;
0
mezaya Messages postés 202 Date d'inscription dimanche 18 mai 2003 Statut Membre Dernière intervention 6 mars 2010
19 janv. 2008 à 17:14
tu ne compile pas sous visual 2005 ?
il y a une version gratuite si tu veux.

sinon donc strcpy_s --> strcpy( nomfichier, "maps/" );

et les fonctions fstream sont dans le namespace std;
decalration std::fstream fichier( nomFichier, std::ios::nocreate, std::filebuf::sh_read );

ou utilise un :
using namespace std;

avant de declarer fstream;
0
F0ra Messages postés 111 Date d'inscription mardi 18 septembre 2007 Statut Membre Dernière intervention 29 décembre 2008
19 janv. 2008 à 17:22
j'ai la version 2003
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
19 janv. 2008 à 19:10
J'espère que tu n'as PAS ca dans ton code: "int   Map[500][500];" sinon ca risque pas de marcher.
0
nickydaquick Messages postés 416 Date d'inscription vendredi 31 janvier 2003 Statut Membre Dernière intervention 19 décembre 2013 3
19 janv. 2008 à 20:07
Salut,
mezaya --> je doute kil programme en c++
luhtor --> si il est en mode release ca fonctionnera : int map[500][500];

Fora --> tu veux entrer des doubles dans un tableau deja alloue (non dynamiquement) sans savoir combien d'elements il y a . Ca ne marche pas.
j'ai 3 choses a te dire:
1- utilise un meilleur format de fichier qui te donne les dimensions de ta matrice
2- fixe toi un nombre MAX d'elements dans ta matrice ou utilise une matrice chainee (liste de liste)
3- utilise fgets (pour recuperer une ligne au complet) , puis double number = atof(chaine_de_caracteres_lues_avec_fgets) pour avoir ton nombre; le tout en verifiant a chaque iteration avec la valeur de feof(fp).

je suis heureux de faire partie d'une grande famille ...!
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
19 janv. 2008 à 21:10
Quelle différence y aurait il en release:
500*500*4 = 1000000
Pas question de mettre une telle quantité de mémoire sur la pile.

"3- utilise fgets (pour recuperer une ligne au complet) , puis double
number = atof(chaine_de_caracteres_lues_avec_fgets) pour avoir ton
nombre; le tout en verifiant a chaque iteration avec la valeur de
feof(fp)."

Imagine que ton fichier ai 10000 lignes. 10000 fgets + 10000 feof.

Lecture par bloc de plusieurs ko puis on navigue dans le buffer avec un pointeur.

C++ (@++)<!--
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
19 janv. 2008 à 21:11
[auteur/NICKYDAQUICK/43984.aspx nickydaquick]


int Map[500][500] ~= 1Mo => Donc non ca ne marchera pas sans faire un tour dans les config du projet.
0
Rejoignez-nous