;Affecter des adresses IP et des noms aux machine sur un reseau on utilisant les

Fermé
elkaderr Messages postés 7 Date d'inscription vendredi 29 décembre 2017 Statut Membre Dernière intervention 3 janvier 2019 - 3 janv. 2019 à 12:04
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 - 3 janv. 2019 à 15:25
Bonjour :):)
j'arrive pas a resoudre un ennance :(,telque j'ai rencontre des problemes lors de la manipulation des pointeurs et de la liste lui meme ;
voici l'ennance :


:) et bien sure j'ai essayé de le resoudre donc voila ma solution :
#include <stdio.h>
#include <stdlib.h>

typedef int bool;
#define true 1
#define false 0
 // definir la structure AdresseIp
typedef struct  AdresseIp   Ip;
struct AdresseIp
{
    int val1;
    int val2;
    int val3;
    int val4;
};


typedef struct Machine pc;
struct Machine
{
    Ip A_Ip;
    char Nom [10];

    pc *nxt;
};


typedef struct Liste Liste;
struct Liste
{
    pc *premier;
};

//ajouter la premiere machine dans la liste
Liste *initialisation()
{
    Liste *liste = malloc(sizeof(*liste));
    pc *machine = malloc(sizeof(*machine));

    if (liste == NULL || machine == NULL)
    {
        exit(EXIT_FAILURE);
    }

     machine->A_Ip.val1 = 0;
     machine->A_Ip.val2 = 0;
     machine->A_Ip.val3 = 0;
     machine->A_Ip.val4 = 0;
     for (int i = 0; i < 10; ++i){
	         machine->Nom[i]="";
        }
    machine->nxt = NULL;
    liste->premier = machine;

    return liste;

}

Ip remplir_ip(Ip ip ,int *nbr1,int *nbr2,int *nbr3,int *nbr4){

ip.val1=*nbr1;
ip.val2=*nbr2;
ip.val3=*nbr3;
ip.val4=*nbr4;
return ip;
}




 void Ajouter_Machine(Liste *liste )
{
    /* Création du nouvel élément */
    pc *nouveau = malloc(sizeof(*nouveau));
    if (liste == NULL || nouveau == NULL)
    {
        exit(EXIT_FAILURE);
    }
    bool ok=true;
    char dec='o';
    int nombre=0;
    int ip_int [4];
    while(ok==true){

    	printf("Nouvel adresse Ip\n");
    	for (int i = 0; i < 4; ++i)
    	{
    		printf("enter le %d entier de cette adresse :\n",i+1);
	    	scanf("%d ",&nombre);
	    	ip_int[i]=nombre;
	    	}
	    	//afficher l'adresse
        for (int j = 0; j < 4; ++j)
        {
            printf("%d",ip_int[j]);
            printf(".");
        }
        //affecter l'adresse
    	remplir_ip(nouveau->A_Ip,&ip_int[0],&ip_int[1],&ip_int[2],&ip_int[3]);

        /* Insertion de l'élément au début de la liste */
        nouveau->nxt = liste->premier;
        liste->premier = nouveau;

     printf("vouliez vous ajouter une autre : o? oui ,n?non\n");

        scanf("%c",&dec);
        if (dec!='o')
        {
            printf(" ok ok \n");
        	ok=false;
        }

}
}

int main(int argc, char **argv)
{

    printf("Initialisation \n");
     Liste *Liste=initialisation();;
    printf("Debut :\n");

        //printf("entrer le nom de cette machine \n");
        //scanf("%c",chaine );

        Ajouter_Machine(Liste);


        printf("affichage des machine ");

        while(Liste!=NULL){
                char o[]="t tout le ";
           printf("%s la machine \n",&(Liste->premier->A_Ip)) ;
           Liste=Liste->premier->nxt;
        }

  }
A voir également:

2 réponses

yg_be Messages postés 23361 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 29 novembre 2024 Ambassadeur 1 556
3 janv. 2019 à 13:23
bonjour, "j'arrive pas": message d'erreur, comportement inattendu, ?
0
elkaderr Messages postés 7 Date d'inscription vendredi 29 décembre 2017 Statut Membre Dernière intervention 3 janvier 2019
3 janv. 2019 à 14:12
Bonjour , oui !
0
elkaderr Messages postés 7 Date d'inscription vendredi 29 décembre 2017 Statut Membre Dernière intervention 3 janvier 2019
3 janv. 2019 à 14:13
fonctionnement mais pas normale !
0
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092
3 janv. 2019 à 14:31
@elkaderr : yg_be te demande de décrire le message d'erreur et le comportement inattendu
0
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092
Modifié le 3 janv. 2019 à 15:51
Salut elkaderr,

Il y a beaucoup de problèmes dans ton code.

Tu devrais compiler avec les warnings et corriger les causes des avertissements signalés.

Par ailleurs, tu ne devrais pas écrire près de 150 lignes de code sans tester au fur et à mesure que ce que tu écris est correct. Sinon, tu arrives au résultat que tu as : un code très embrouillé et difficile à déboguer.

Ta
struct Machine
(que tu désignes par l'alias
pc
) est ton type chaîné. Tu n'as pas besoin d'une
struct Liste
en plus.

Par contre, tu peux juste déclarer
pc * premier;
pour y garder l'adresse vers le début de ta liste, histoire de pouvoir la parcourir plus d'une fois. Cela sera ton point d'entrée.

La partie la plus visible des problèmes affectant ton code et qui provoque son plantage à l'exécution, est que ton allocation de mémoire ne va pas, en raison du fait que tu ne déclares pas assez d'espace pour chaque
pc
(
struct Machine
)

Ainsi, ton code :
pc *machine = malloc(sizeof(*machine));

- calcule la taille de
*machine
qui renvoie la taille d'une adresse mémoire pour ton compilateur sur ton ordinateur (en principe 4 octets sur un compilateur et ordinateur 32 bits ou 8 octets sur 64 bits)
- réserve un espace mémoire de cette taille
- met l'adresse de cet espace dans la variable pointeur "machine"

4 ou 8 octets sont très insuffisants pour stocker le contenu d'une
struct Machine
, et ton programme plante avec une erreur de segmentation de mémoire, car il essaye par la suite d'écrire dans une zone mémoire non allouée au programme.

Pour déclarer un pointeur sur ton type
pc
(
struct Machine
) auquel tu affectes l'adresse mémoire d'une zone allouée au programme permettant de stocker un
pc
(
struct Machine
) tu dois faire :

pc * machine = malloc(sizeof(pc));

Il y a de nombreux autres problèmes... mais commence déjà par ceux là.

Dal
0