| | Premium | Posté le 30/05/2006 @ 13:56 | Petit astucien
205 Messages
| Salut,
à la compilation d'un programme, j'ai cette erreur :
[code]
/tmp/ccycgID8.o: dans la fonction « parsing »:
parsing.c:(.text+0x22a): référence indéfinie vers « correctIP »
collect2: ld a retourné 1 code d'état d'exécution[/code]
Je ne comprends pas très bien ou est le problème car dans le fichier parsing.c, j'ai bien mis le .h qui contient la fonction correctIP
| | |
| |
| Publicité |
|
| | breizhbugs | Posté le 30/05/2006 à 14:29 | Astucien
3001 Messages
| [hello]
Code source? | | | | | Premium | Posté le 30/05/2006 à 15:05 | Petit astucien
205 Messages
| Salut, voici les différents fichiers
En même temps, si tu pouvais également me dire si des améliorations sont à effectuer sur le code, n'hésite pas.
Merci d'avance
parsing.c
[code]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include "verifIP.h"
#define F "fichier"
void purge(FILE *fp)
{
int c;
while ((c = fgetc(fp)) != '\ //ici c'est \n
' && c != EOF)
{
}
}
void clean (char *s, FILE *fp)
{
char *p = strchr (s, '\ //ici c'est \n
');
if (p != NULL)
{
*p = 0;
}
else
{
purge (fp);
}
}
char **parsing(FILE *fp)
{
char **tab;
int nb = 0 ,size = 5;
tab = malloc (size * sizeof * tab);
if(tab == NULL)
{
perror("erreur allocation\n");
exit(1);
}
if (fp != NULL)
{
char line[BUFSIZ];
while(fgets(line, sizeof line, fp) != NULL)
{
clean(line, fp);
char *p = strtok(line," ");
if (p != NULL)
{
p = strtok(NULL," ");
if (p != NULL)
{
if(nb == size)
{
size += 16;
tab = realloc(tab, size * sizeof *tab);
if (tab == NULL)
{
perror("erreur allocation\n");
free(tab); tab = NULL;
return tab;
}
}
int ip[4];
int n = sscanf(p,"%d.%d.%d.%d",ip,ip+1,ip+2,ip+3);
if(n == 4)
{
tab[nb] = malloc((strlen(p)+1) * sizeof * tab[nb]);
if (tab[nb] == NULL)
{
perror("erreur allocation\n");
free(tab); tab = NULL;
return tab;
}
if(!correctIP(p))
{
strcpy(tab[nb],p);
nb++;
}
}
}
else
{
printf ("format error\n");
break;
}
}
else
{
printf ("format error\n");
break;
}
}
fclose (fp), fp = NULL;
tab[nb] = NULL;
}
else
{
perror (F);
}
assert (fp == NULL);
return tab;
}
[/code]
parsing.h
[code]
#ifndef H_PARSING
#define H_PARSING
#include <stdio.h>
void purge(FILE *fp);
void clean (char *s, FILE *fp);
char **parsing(FILE *fp);
#endif
[/code]
verifIP.c
[code]
#include <stdio.h>
#include <stdlib.h>
// Si une IP est nulle
int ip_null(int ip[4])
{
size_t i;
for (i = 0; i < 4; i++)
{
if (ip[i] == 0)
{
return 0;
}
}
return 1;
}
// Si une IP égale une autre IP
int ip_equal(int ip1[4], int ip2[4])
{
size_t i;
for (i = 0; i < 4; i++)
{
if (ip1[i] == ip2[i])
{
return 0;
}
}
return 1;
}
// Si une IP inf une autre IP
int ip_inf(int ip1[4], int ip2[4])
{
size_t i;
for (i = 0; i < 4; i++)
{
if (ip1[i] > ip2[i])
{
return 0;
}
}
return 1;
}
// Si une IP sup une autre IP
int ip_sup(int ip1[4], int ip2[4])
{
size_t i;
for (i = 0; i < 4; i++)
{
if (ip1[i] < ip2[i])
{
return 0;
}
}
return 1;
}
//Verifie si une IP est correcte
int Verife(int ip[4])
{
typedef struct {
int deb[4];
int fin[4];
}t_plageIP;
static t_plageIP tabPlage[]= {
{{10, 0, 0, 0}, {10, 255, 255, 255}},
{{172, 16, 0, 0}, {172, 31, 255, 255}},
{{192, 168, 0, 0}, {192, 168, 255, 255}},
{{224, 0, 0, 0}, {239, 255, 255, 255}},
{{240, 0, 0, 0}, {255, 255, 255, 255}},
{{0, 0, 0, 0}, {0, 0, 0, 0}}
};
t_plageIP *ptPlage;
// Balayage des plages
for (ptPlage=tabPlage; ip_null(ptPlage->deb) != 0; ptPlage++)
{
if (ip_sup(ip, ptPlage->deb) && ip_inf(ip, ptPlage->fin))
// IP appartient plage interdite
return 1;
}
// IP appartient pas plage interdite
return 0;
}
//Verifie si la chaine est une IP correcte
int correctIP(char *chaine){
int *ip = malloc (sizeof * ip * 4);
if(ip == NULL)
{
perror("erreur allocation\n");
return 1;
}
int n = sscanf(chaine, "%d.%d.%d.%d", ip, ip + 1, ip + 2, ip + 3);
if(n != 4)
{
printf("erreur\n");
free(ip);
return 1;
}
if(!Verife(ip))
{
free(ip);
return 1;
}
return 0;
}
[/code]
verifIP.h
[code]
#ifndef H_VERIFIP
#define H_VERIFIP
// Si une IP est nulle
int ip_null(int ip[4]);
// Si une IP égale une autre IP
int ip_equal(int ip1[4], int ip2[4]);
// Si une IP inf une autre IP
int ip_inf(int ip1[4], int ip2[4]);
// Si une IP sup une autre IP
int ip_sup(int ip1[4], int ip2[4]);
//Verifie si une IP est correcte
int Verife(int ip[4]);
//Verifie si la chaine est une IP correcte
int correctIP(char *chaine);
#endif
[/code]
main.c
[code]
#include <stdio.h>
#include <stdlib.h>
#include "parsing.h"
int main()
{
FILE *file = fopen("fichier","r");
char **tab;
char **pt;
tab = parsing(file);
if(tab == NULL)
{
perror("erreur\n");
exit(1);
}
for(pt = tab; *pt != NULL; pt++)
printf("%s\n",*pt);
free(tab); tab = NULL;
return 0;
}
[/code]
un fichier pour tester
[code]
1 122.145.4.3 15.341 ms * 6.454 ms
2 * * *
3 143.213.43.45 14.447 ms 15.199 ms 40.861 ms
4 254.65.34.176 18.966 ms 15.861 ms 16.480 ms
5 176.56.65.134 16.612 ms * 19.449 ms
6 245.45.2.15 20.819 ms 13.349 ms *
7 143.154.154.56 17.262 ms 22.436 ms 18.365 ms
8 * * *
9 * * *
10 176.91.154.178 15.788 ms 18.069 ms 19.986 ms
[/code]
Modifié par Premium le 30/05/2006 15:09 | | | | | breizhbugs | Posté le 30/05/2006 à 16:34 | Astucien
3001 Messages
| Il manque le makefile. | | | | | Premium | Posté le 30/05/2006 à 16:40 | Petit astucien
205 Messages
| breizhbugs a écrit :
Il manque le makefile.
Je n'ai pas fait de Makefile.
En faite, c'était un problème tout simple, je n'avais pas compilé en ajoutant les fichiers verifIP.c et verifIP.h [idee]
Le problème est résolu une fois que j'ajoute ces 2 fichiers [bigsmile] | | | | | breizhbugs | Posté le 30/05/2006 à 17:07 | Astucien
3001 Messages
| Premium a écrit :
En faite, c'était un problème tout simple, je n'avais pas compilé en ajoutant les fichiers verifIP.c et verifIP.h [idee]
C'est ce que je voulais voir dans le makefile.
Fais toi un makefile, c'est plus "classe" (et pis si les profs veulent compiler ton programme, ils ne chercheront pas autre chose!) | | | |
| | Haut de la page |
| | Inscrivez-vous ! |
- Posez vos questions
- Résolvez vos problèmes
- Aidez les autres
- Participez et créez vos discussions
- Dialoguez en privé avec d'autres membres
- Suivez vos sujets préférés
- Affichez les signatures des membres
|
|