Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 23/05/2006, à 08:15

Premium

[Résolu]Problème de type

Bonjour,

en compilant le code ci-dessus, j'obtiens le msessage suivant :

Tableau.c: In function ‘main’:
Tableau.c:63: attention : assignment from incompatible pointer type

Cette ligne :  liste[nb] = ip;

Le problème est qu'il faut que j'utilise un tableau d'entier pour vérifier qu'on a bien une adresse IP valide mais je veux stocker ensuite l'IP sous forme de chaine de caractere : "232.54.34.234"

Le problème est qu'avec le code que j'ai écris cela ne fonctionne pas.

Est-ce que vous pourriez m'aider à le modifier pour que cela fonctionne.

Merci



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

#define F "fichier"

static void purge(FILE *fp)
{
  int c;
  while ((c = fgetc(fp)) != '\n' && c != EOF)
    {
    }
}

static void clean (char *s, FILE *fp)
{
  char *p = strchr (s, '\n');
  if (p != NULL)
    {
      *p = 0;
    }
  else
    {
      purge (fp);
    }
}

int main()
{
  FILE *fp = fopen(F, "r");
  int nb = 0, size = 1;
  char **liste;
  
  
  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 *= 2;
		      liste = realloc(liste, size * sizeof(*liste));
		      if(liste == NULL)
			{
			  perror("erreur allocation");
			  exit(1);
			}
		    }
		  
		  int ip[4];
		  sscanf(p, "%d.%d.%d.%d", ip, ip + 1, ip + 2, ip + 3);
		  liste[nb] = ip; // l'erreur est ici
		  
		  printf ("%d %c %c %c\n", ip[0], ip[1], ip[2], ip[3]);
		  nb++;
		}
	      else
		{
		  printf ("format error\n");
		  break;
		}
	    }
	  else
	    {
	      printf ("format error\n");
	      break;
	    }
	}
      fclose (fp), fp = NULL;
    }
  else
    {
      perror (F);
    }
  assert (fp == NULL);
  
  return 0;
}

Dernière modification par Premium (Le 26/05/2006, à 19:40)

Hors ligne

#2 Le 23/05/2006, à 09:53

bobuse

Re : [Résolu]Problème de type

Je n'ai pas la réponse à ta question, mais franchement pour ce genre de traitement je ne saurai te recommander d'utiliser un langage plus simple, genre du python (au hasard).

À moins que tu exécutes ton programme de manière intensive, tu n'es peut-être pas regardant sur un pouillème de performance en moins ... Ça demande un petit investissement au départ de prendre ses repères, mais ensuite tu gagnes un temps monstrueux !!

A y regarder de plus près ton code, on dirai que tu veux mettre un int * dans un char * ... le problème vient peut-être de là ;-)

Hors ligne

#3 Le 23/05/2006, à 11:18

kritchek

Re : [Résolu]Problème de type

Quelques commentaires dans le code n'auraient pas été superflus...

En ce qui concerne ton erreur, tu essaies d'affecter unb pointeur sur int à un pointeur sur char*. Ca ne peut pas marcher comme ça. Ce qu'il faudrait faire, c'est convertir les entiers en chaines de caractères (regarde la fonction itoa). Ef fait attention, à mon avis la taille que tu déclare pour le ointeur liste n'est pas bonne.

Hors ligne

#4 Le 23/05/2006, à 23:38

gene69

Re : [Résolu]Problème de type

non non non
pas de itoa() ! burk
est ce que snprintf ne serait as mieux?

par exemple comme ça:

/* on reserve un buffer  ou size est une constante numérique par exemple 15 pour une IP;)*/
char tmp[size+1];
snprintf(tmp , size , "%d.%d.%d.%d",127,0,0,0);   /* 127.0.0.0 localhost quoi*/

/* ...
code long et compliqué
*/

/* oh magie ! la chaine est déjà formatée */
printf(temp);
/* oh prudence ! ceci est mieux parait -il */
printf("%s",temp);

-> pas de probleme de compatibilité
-> pas de dépassement de mémoire tampon.
-> voilà de quoi faire un sujet que je vais bientôt rajouter à mon blog wink

Dernière modification par gene69 (Le 23/05/2006, à 23:42)


Quand le berger est lâche, le loup chie de la laine.
A (draft) guide to UFO Alien-Invasion

Hors ligne

#5 Le 24/05/2006, à 00:05

Premium

Re : [Résolu]Problème de type

Salut,

lorsque tu dis en commentaire :
code long et compliqué, c'est si on n'utilise pas le snprintf?

Est-ce que tu pourrais m'indiquer comment ne pas prendre en considération des IPs non-valide ainsi que les * * *
Les IPs non-valides sont les suivantes

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

Dernière modification par Premium (Le 24/05/2006, à 00:06)

Hors ligne