Simulateur de fourmis

cs_nemson Messages postés 2 Date d'inscription mercredi 3 février 2010 Statut Membre Dernière intervention 3 mai 2010 - 3 mai 2010 à 13:30
Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 - 3 mai 2010 à 14:30
bonjour a tous,
j'ai fais mon projet sur la simulation des fourmis mais au dernier moment mon encadrant me dit d'utiliser la bibliothèque SDl pourtant j'utilisais ALLEGRO.
mon problème est de convertir mon fichier d'initialisation que j'écrivais en utilisant ALLEGRO en celle qui pourrait correspondre en SDl juste pour me faire gagner en temps.voici mon code source
ceci correspond au fichier ini.h

#define INI_H

//les mode de bordure du terrain
#define BOUNDARY 0
#define SPHERICAL 1
#define KILL_ANT 2
// variabes qui seront initialisés à partir de "INI file" :
extern int Ants;
extern int L_W, L_H, Land_Mode, Sniff_Radius, Sniff_Angle;
extern float Evaporate_Rate,
Max_Pher,
Diffuse_Rate,
Food_Strength,
Nest_Strength,
Food_Strength_Decay,
Nest_Strength_Decay;

// lit et analyse le fichier:
int readini (char *filename);
#endif
***************************************************************************
ceci correspond à mon fichier ini.c

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#include "ini.h"

#define NOFILE 1
#define MISSING 2
#define CMD_ERR 3
#define VALUE_ERR 4
#define BAD_VALUE 5
#define RANGE_ERR 6

#define lower(c) ((c >= 'A')? (c <= 'Z')? c | 0x20 : c : c)

//variables par defaut pour INI.
int Ants = 50;
int L_W 100, L_H 100,
Land_Mode = BOUNDARY,
Sniff_Radius = 5,
Sniff_Angle = 32;

float Evaporate_Rate = 0.97,
Max_Pher = 100.0,
Food_Strength = 100.0,
Nest_Strength = 100.0,
Food_Strength_Decay = 0.95,
Nest_Strength_Decay = 0.95;

typedef struct filestat filestat;
struct filestat
{
FILE *fp; /* pointeur sur un fichier*/
int line, /* nombre de ligne */
c; /* dernier caractère lu*/
};

/*============================================================================
ini_err : appelée quand une erreur suvient dans le fichier INI.
--------------------------------------------------------------------------*/
void ini_err (filestat *f, /* structure du fichier */
int errno, /* nombre d'erreur */
char *msg)
{
/* ferme le fichier d'entrée*/
if (f->fp)
fclose (f->fp);

fprintf (stderr, "Error processing INI file.\n");

switch (errno)
{
case NOFILE : fprintf (stderr, "File not found"); break;
case MISSING : fprintf (stderr, "Missing setting"); break;
case CMD_ERR : fprintf (stderr, "Unknown command"); break;
case VALUE_ERR : fprintf (stderr, "Value expected"); break;
case BAD_VALUE : fprintf (stderr, "Bad value"); break;
case RANGE_ERR : fprintf (stderr, "Range error"); break;
} /* (switch) */

if (msg)
fprintf (stderr, " (%s)", msg);

if (errno >= CMD_ERR)
/* liée à l'erreur du fichier */
fprintf (stderr, " : line %d", ++f->line);
fprintf (stderr, ".\n");
exit (1);
}


/*============================================================================
compare : compare deux chaînes de caractères,s1 et s2.s2 est la plus petite chaîne. la comparaison ignore le cas de s1.
-------------------------------------------------------------------------*/
int compare (char *s1, char *s2)
{
while (*s1 && *s2) {

if (lower (*s1) != *s2)

return (0);
s1++;
s2++;
}

return (*s1 == *s2);
}


/*============================================================================
skip_null : fait un saut vide d'une ligne dans le fichier d'entrée.
--------------------------------------------------------------------------*/
void skip_null (filestat *f)
{
f->c = getc (f->fp);
while (f->c == '\n') {
f->line++;
f->c = getc (f->fp);
}
ungetc (f->c, f->fp);

}


/*============================================================================
ignore_line : ignore une ligne.
--------------------------------------------------------------------------*/
void ignore_line (filestat *f)
{
do
f->c = getc (f->fp);
while ((f->c != EOF) && (f->c != '\n'));
f->line++;

}


/*============================================================================
readstring : lit une chaîne de caractère dans le fichier d'entrée.
--------------------------------------------------------------------------*/
void readstring (filestat *f, char **s)
{
char temp[81];
fscanf (f->fp, "%80s", temp);
if (*s)
free (*s);
*s = strdup (temp);
}


/*============================================================================
readint : lit un entier dans le fichier d'entrée.
--------------------------------------------------------------------------*/
void readint (filestat *f, int *i)
{
fscanf (f->fp, "%d", i);
}


/*============================================================================
readfloat : lit un nombre en virgule flottant dans le fichier d'entrée.
--------------------------------------------------------------------------*/
void readfloat (filestat *f, float *v)
{
fscanf (f->fp, "%f", v);
}


/*============================================================================
range_check : permet de verifier que 'val' est entre 'min' et 'max'. sinon un message d'erreur est emit

--------------------------------------------------------------------------*/
void range_check (filestat *f, float val, float min, float max, char *msg) {
if ((val < min) || (val > max))
ini_err (f, RANGE_ERR, msg);
}


/*============================================================================
parse_line : Parses a line of the input file.
--------------------------------------------------------------------------*/
int parse_line (filestat *f)
{
int t;
char temp[21]; // variable temporaire pour la commande.

// lire une commande :
fscanf (f->fp, "%20s", temp);

// regarde la première lettre :
switch (lower(temp[0])) {
case 'a':
if (compare (temp, "ants")) {
readint (f, &Ants);
range_check (f, (float)Ants, 1.0, 500.0, temp);
}
else
ini_err (f, CMD_ERR, temp);
break;

case 'e':
if (compare (temp, "evaporate")) {
readfloat (f, &Evaporate_Rate);
range_check (f, Evaporate_Rate, 0.0, 1.0+1e-3, temp);
}
else
ini_err (f, CMD_ERR, temp);
break;

case 'f':
if (compare (temp, "foodstrength")) {
readfloat (f, &Food_Strength);
}
else
if (compare (temp, "foodstrdecay")) {
readfloat (f, &Food_Strength_Decay);
range_check (f, Food_Strength_Decay, 0.0, 1.0+1e-3, temp);
}
else
ini_err (f, CMD_ERR, temp);
break;

case 'h':
if (compare (temp, "height")) {
readint (f, &L_H);
range_check (f, (float)L_H, 10.0, 200.0, temp);
}
else
ini_err (f, CMD_ERR, temp);
break;

case 'l':
if (compare (temp, "landmode")) {
readint (f, &Land_Mode);
range_check (f, Land_Mode, 0, 2, temp);
}
else
ini_err (f, CMD_ERR, temp);
break;

case 'm':
if (compare (temp, "maxpher")) {
readfloat (f, &Max_Pher);
range_check (f, Max_Pher, 0.0, 1e6, temp);
}
else
ini_err (f, CMD_ERR, temp);
break;

case 'n':
if (compare (temp, "neststrength")) {
readfloat (f, &Nest_Strength);
}
else
if (compare (temp, "neststrdecay")) {
readfloat (f, &Nest_Strength_Decay);
range_check (f, Nest_Strength_Decay, 0.0, 1.0+1e-3, temp);
}
else
ini_err (f, CMD_ERR, temp);
break;

case 's':
if (compare (temp, "sniffradius")) {
readint (f, &Sniff_Radius);
range_check (f, Sniff_Radius, 0, 128, temp);
}
else
if (compare (temp, "sniffangle")) {
readint (f, &Sniff_Angle);
range_check (f, Sniff_Angle, 0, 128, temp);
}
else
ini_err (f, CMD_ERR, temp);
break;

case 'w':
if (compare (temp, "width")) {
readint (f, &L_W);
range_check (f, (float)L_W, 10.0, 320.0, temp);
}
else
ini_err (f, CMD_ERR, temp);
break;
default : // commande inconnu:
ini_err (f, CMD_ERR, temp);
}

return (0);
}


/*============================================================================
readini : lit le fichier .INI file, parsing each line.
--------------------------------------------------------------------------*/
int readini (char *filename)
{
filestat fs = {NULL, 0, 0};

fs.fp = fopen (filename, "rt");

// si le fichier d'entré n'est pas trouvé alors les valeur par defauts seront utilisées.
if (!fs.fp) return 0;

do {
skip_null (&fs);
// voir le caractère qui était caché :
switch (fs.c)
{
case EOF :
break;

case ';' : /* Comment */
ignore_line (&fs);
break;

default : /* Parse command */
parse_line (&fs);
} /* (switch) */
}
while (fs.c != EOF);
fclose (fs.fp);

return (1);
}


Merci d'avance et surtout pour votre bonne comprehension

1 réponse

Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 10
3 mai 2010 à 14:30
Bonjour,

Ton code ressemble furieusement à du C/C++ mais certainement à du VB et en plus tu postes dans la catégorie des bugs de CS, ce qui n'est pas assurément le cas.

Si tu veux avoir une réponse postes plutôt dans la bonne catégorie (celle du langage utilisé que tu connais mieux que moi.


Calade
0
Rejoignez-nous