Menu

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

Messages postés
7
Date d'inscription
vendredi 29 décembre 2017
Dernière intervention
3 janvier 2019
- - Dernière réponse : [Dal]
Messages postés
4873
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
18 janvier 2019
- 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;
        }

  }
Afficher la suite 

Votre réponse

2 réponses

Messages postés
7230
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 janvier 2019
430
0
Merci
bonjour, "j'arrive pas": message d'erreur, comportement inattendu, ?
elkaderr
Messages postés
7
Date d'inscription
vendredi 29 décembre 2017
Dernière intervention
3 janvier 2019
-
Bonjour , oui !
elkaderr
Messages postés
7
Date d'inscription
vendredi 29 décembre 2017
Dernière intervention
3 janvier 2019
-
fonctionnement mais pas normale !
[Dal]
Messages postés
4873
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
18 janvier 2019
930 -
@elkaderr : yg_be te demande de décrire le message d'erreur et le comportement inattendu
Commenter la réponse de yg_be
Messages postés
4873
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
18 janvier 2019
930
0
Merci
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
Commenter la réponse de [Dal]