IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

[Débutant]Liste Chaînés et pointeurs


Sujet :

C

  1. #1
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut [Débutant]Liste Chaînés et pointeurs
    Bonsoir tout le monde ,

    J'apprends le langage C cette année et bien sur je passe par leçon incourtounable sur les pointeurs etc ...

    J'ai simplement une question à poser . Juste savoir si mon code est bon ou pas car j'ai un doute . Je vous expose mon code . C'est simplement une fonction qui remplit une liste chaînée à partir d'un tableau donné

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    typedef struct Bidon {
    	int numDossard;
      	char *nom;
      	char *prenom;
      	int age;
      	float note;
    	struct Bidon *ptr_sv;
    }SKIEUR;
     
    // Tableau de skieurs à entrer dans la liste chaînée
     
    SKIEUR tabskieur[] = {
    {1515,"Zagoridis","Constantin",68,12.5},
    {1984,"Dambakizi","Apollinaire",45,8.25},
    {1789,"Weisberger","Aristide",18,11.75},
    {1793,"Bianchini","Dominique",78,7.5},
    {1968,"Younsi","Abdelkader",14,8.25},
    {1418,"Thalabarski","Igor",71,12.5},
    {1111,"Dupont","Marcel",73,13.},
    {9969,"Bianchini","Ange",81,7.5}
    };
     
    int nbSkibis = 8;
     
    // Fonction qui créé une liste chaînée et qui renvoie le pointeur de début de la liste
    SKIEUR* CreationListeChainee (){ 
     
    	SKIEUR *debut, *a;
    	int i;
    	debut = (SKIEUR*) malloc(sizeof(SKIEUR));
    	a = debut; 
     
    	// Remplissage de la liste chaînée avec les données du tableau tab
    	for (i=0;i<nbSkibis;i++){
    		a->numDossard = tabskieur[i].numDossard;
    		a->nom = tabskieur[i].nom;
    		a->prenom = tabskieur[i].prenom;
    		a->age = tabskieur[i].age;
    		a->note = tabskieur[i].note;
    		a->ptr_sv = (SKIEUR*) malloc(sizeof(SKIEUR)); // Création de l'élément suivant
    		a = a->ptr_sv;
    	}
    	a->ptr_sv = NULL; // Fin de chaînage
    	return debut;
    }
    En C , on a appris que l'on ne peut pas faire chaine1 = chaine 2. et qu'il fallait passer par strcpy(ch1,ch2).

    Dans ma fonction j'ai mis directement a->nom = tab[i].nom et cela semble fonctionner . Est ce bon?

    Merci pour vos réponses

  2. #2
    Membre expérimenté Avatar de Lethal
    Profil pro
    Développeur Java
    Inscrit en
    Février 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Février 2006
    Messages : 194
    Par défaut
    Le strcpy(x,y) est utilisé qd tu veux recopier la chaine pointé par y par la chaine pointé par x;

    quand tu fais x=y tu ne recopie pas la chaine, mais x pointe au même endroit en mémoire que y.

    Donc si par après tu fais strcpy(y,z) tu changera aussi la chaine pointée par x vu que c'est la même zone en mémoire.

    strcpy(x,y) est utilisé car tu ne peux pas faire *x = *y

    Sinon oui ca marche (sauf si tu va modifier les valeurs par après dans ton tableau )

  3. #3
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Il n'y a pas lieu de faire une liste chainée si tu as un tableau à coté
    Donc, non, faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    a->nom = tabskieur[i].nom;
    n'est pas problematique puisque les chaines de ta liste chainée seront les chaines du tableau et on suppose qu'elle vont pas bouger.

    Si par contre ton tableau est susceptible de changer, oui il faudrait copier les chaines.
    La solution n°1 est moins couteuse en memoire mais plus lourde en complexité : allouer une zone de taille suffisante pour y placer une copie de la chaine
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    tmplg = strlen(tabskieur[i].nom);
    a->nom = (char *) malloc (tmplg + 1);
    strcpy (a->nom, tabskieur[i].nom);
    Il ne faudra pas oublier de liberer ces zones, et cela pourrait etre fait par exemple dans ta fonction de liberation de la liste chainée (en meme temps que tu liberes les maillons, libere les zones contenant les chaines copiées)

    La solution n°2 est moins complexe : il suffirait que les champs textuels de ta structure soient des tableaux de caracteres de taille fixe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #define NOM_MAX_LG 50
    #define PRENOM_MAX_LG 50
    typedef struct Bidon {
       int numDossard;
         char nom[NOM_MAX_LG + 1];
         char prenom[PRENOM_MAX_LG + 1];
         int age;
         float note;
       struct Bidon *ptr_sv;
    }SKIEUR;
    En revanche, je sais pas si on a le droit d'initialiser des tableaux de caractere avec des chaines literales (ce que tu fais qd tu initialise le tableau tabskieur).
    Apres, il suffit de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    strncpy (a->nom, tabskieur[i].nom, NOM_MAX_LG);
    a->nom[NOM_MAX_LG] = '\0';

  4. #4
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par Gruik
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    tmplg = strlen(tabskieur[i].nom);
    a->nom = (char *) malloc (tmplg + 1);
    strcpy (a->nom, tabskieur[i].nom);
    Il ne faut pas faire un cast lorsqu'on a fait un malloc et il faut tester le retour de malloc.

    Citation Envoyé par Gruik
    En revanche, je sais pas si on a le droit d'initialiser des tableaux de caractere avec des chaines literales (ce que tu fais qd tu initialise le tableau tabskieur).
    Bien sûr que si, n'as-tu jamais fait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char s[16] = "Bonjour";
    Jc

  5. #5
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Citation Envoyé par fearyourself
    Il ne faut pas faire un cast lorsqu'on a fait un malloc et il faut tester le retour de malloc.
    Ah, et que comptes tu faire si ça retourne NULL?
    Faire un exit?
    Quelle difference entre faire un exit et planter par segmentation fault? Car c'est exactement ce qu'il va se passer : tentative d'acces à l'adresse 0x0.
    Sinon, j'ai toujours vu le castage au retour du malloc mais je crois effectivement, que ça compile sans warning sans castage.


    Citation Envoyé par fearyourself
    Bien sûr que si, n'as-tu jamais fait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char s[16] = "Bonjour";
    Y me semblait bien que c'était possible ^^. Mais j'evite instinctivement cette pratique.
    En fait, les constantes chaines litterales j'ai plutot tendance à les mettre dans des const char * et si j'ai besoin de faire un traitement dessus, je les copie ou en copie un bout dans un buffer

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 391
    Par défaut
    Citation Envoyé par Gruik
    Ah, et que comptes tu faire si ça retourne NULL?
    Faire un exit?
    Quelle difference entre faire un exit et planter par segmentation fault? Car c'est exactement ce qu'il va se passer : tentative d'acces à l'adresse 0x0.
    Sauf qu'en testant le retour de malloc() tu peux mettre un message d'erreur explicite "plus de mémoire", et comme autres différences: Tu peux faire du nettoyage avant de quitter (plutôt que de quitter "à la porc") : Fermeture de fichiers ouverts, écritures de logs, etc.
    Citation Envoyé par Gruik
    Sinon, j'ai toujours vu le castage au retour du malloc mais je crois effectivement, que ça compile sans warning sans castage.
    Le cast est nécessaire en C++ (encore qu'en C++, on n'utilise pas malloc()). En C, il est inutile et peut être source d'erreurs, car il peut cacher un oubli d'inclusion de <stdlib.h>.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par Gruik
    Citation Envoyé par fearyourself
    Il ne faut pas faire un cast lorsqu'on a fait un malloc et il faut tester le retour de malloc.
    Ah, et que comptes tu faire si ça retourne NULL?
    Faire un exit?
    Quelle difference entre faire un exit et planter par segmentation fault?
    1) C'est une question d'esthétique, il est tout de même plus propre de sortir d'un programme avec un exit qu'un segmentation fault.

    2) Si jamais j'ai un programme qui appelle un autre programme, je préfère que ce dernier sorte avec un code d'erreur à la place d'un segmentation fault... Au moins, je peux gérer l'erreur...

    3) Lorsque je programme, j'ai souvent des données importantes, je préfère avoir l'occasion de les sauvegarder dans un fichier à la place de tout recommencer

    4) Enfin, ce n'est pas toujours dramatique que malloc ne puisse pas allouer de la mémoire, si c'est le cas, je peux faire un swap avec mes propres données, faire un free et ensuite retenter le malloc.

    Y me semblait bien que c'était possible ^^. Mais j'evite instinctivement cette pratique.
    En fait, les constantes chaines litterales j'ai plutot tendance à les mettre dans des const char * et si j'ai besoin de faire un traitement dessus, je les copie ou en copie un bout dans un buffer
    Attention, lorsqu'on écrit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char s[16] = "Bonjour";
    ce qui se trouve dans le tableau s n'est plus une constante littérale mais bien une chaîne de caractères parfaitement modifiable.

    Lorsque tu fais

    C'est une autre histoire...

    Jc

  8. #8
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Gruik
    Citation Envoyé par fearyourself
    Il ne faut pas faire un cast lorsqu'on a fait un malloc et il faut tester le retour de malloc.
    Ah, et que comptes tu faire si ça retourne NULL?
    Faire un exit?
    En tout cas, ne pas invoquer de comportement indéfini, car tout peut arriver
    Quelle difference entre faire un exit et planter par segmentation fault? Car c'est exactement ce qu'il va se passer : tentative d'acces à l'adresse 0x0.
    Tu m'as l'air bien sûr de toi... Le langage C ne sait pas ce qu'est un 'segmentation fault'. Il parle de comportement indéfini. Encore une fois tout peut arriver, y compris un fonctionnement qui a l'air correct (le pire des cas !).
    Sinon, j'ai toujours vu le castage au retour du malloc mais je crois effectivement, que ça compile sans warning sans castage.
    'Toujours' ? Tu as 'tout' vu ? Ouah! Quelle expérience ! Tu dois au moins avoir 104 ans...

    http://emmanuel-delahaye.developpez....tes.htm#malloc

    Citation Envoyé par fearyourself
    Bien sûr que si, n'as-tu jamais fait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char s[16] = "Bonjour";
    Y me semblait bien que c'était possible ^^. Mais j'evite instinctivement cette pratique.
    Pourtant elle est tout à fait valide et n'est pas répertoriée comme 'Bad practice'
    En fait, les constantes chaines litterales j'ai plutot tendance à les mettre dans des const char * et si j'ai besoin de faire un traitement dessus, je les copie ou en copie un bout dans un buffer
    En l'occurence, ce n'est pas une constante, mais un tableau de char modifiable initialisé. C'est peut être le choix du concepteur...

    Quand à ta pratique,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const char *ps = "Bonjour";
    elle est courante, mais elle peut se simplifier en supprimant un pointeur inutile :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static char const s[] = "Bonjour";

  9. #9
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Merci pour ces bonnes raisons de test de retour de malloc. Enfin tout depend du niveau de robustesse qu'on se fixe.


    Citation Envoyé par fearyourself
    Attention, lorsqu'on écrit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char s[16] = "Bonjour";
    ce qui se trouve dans le tableau s n'est plus une constante littérale mais bien une chaîne de caractères parfaitement modifiable.

    Lorsque tu fais

    C'est une autre histoire...

    Jc
    J'ai bien compris 8)

  10. #10
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Tu m'as l'air bien sûr de toi... Le langage C ne sait pas ce qu'est un 'segmentation fault'. Il parle de comportement indéfini. Encore une fois tout peut arriver, y compris un fonctionnement qui a l'air correct (le pire des cas !).
    Mais si on connait l'architecture sur laquelle on travaille, on sait que sous Linux par exemple, acceder à l'adresse 0 est toujours interdit. Mais je comprends que c'est pas bien, car on casse le niveau d'abstraction du langage.

    Citation Envoyé par Emmanuel Delahaye
    'Toujours' ? Tu as 'tout' vu ? Ouah! Quelle expérience ! Tu dois au moins avoir 104 ans...
    J'ai pas dit que mon experience était exemplaire

  11. #11
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    elle est courante, mais elle peut se simplifier en supprimant un pointeur inutile :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static char const s[] = "Bonjour";
    Et qu'est ce que ça apporte d'avoir un tableau de taille indefinie à la place d'un pointeur? Est ce qu'on peut utiliser sizeof?

  12. #12
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Gruik
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static char const s[] = "Bonjour";
    Et qu'est ce que ça apporte d'avoir un tableau de taille indefinie à la place d'un pointeur?
    La taille est parfaitement définie, et ce ne manière automatique par le compilateur. Le 0 final est lui aussi placé automatiquement.
    Est ce qu'on peut utiliser sizeof?
    Oui, c'est un tableau. La longueur de la chaine est sizeof - 1 et c'est une expression constante. Gain de temps, d'espace, de code...

  13. #13
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    Merci pour vos réponses.

    J'avais eu un souci lorsque j'avais mis directement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcpy(a->nom,tabskieur[i].nom)
    , je partais en segment default.

    Donc si j'ai bien compris il faut d'abord allouer la mémoire à a->nom

    Par contre peut on faire directement a->nom = malloc(sizeof(tabskieur[i].nom)) au lieu de passer par strlen(tabskieur[i].nom) ?

  14. #14
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Gruik
    Citation Envoyé par Emmanuel Delahaye
    Tu m'as l'air bien sûr de toi... Le langage C ne sait pas ce qu'est un 'segmentation fault'. Il parle de comportement indéfini. Encore une fois tout peut arriver, y compris un fonctionnement qui a l'air correct (le pire des cas !).
    Mais si on connait l'architecture sur laquelle on travaille, on sait que sous Linux par exemple, acceder à l'adresse 0 est toujours interdit. Mais je comprends que c'est pas bien, car on casse le niveau d'abstraction du langage.
    Raisonnement absurde. Le codage ne doit dépendre de l'architecture (Je travaille sur au moins 5 architectures différentes...)

  15. #15
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par mikedavem
    Merci pour vos réponses.

    J'avais eu un souci lorsque j'avais mis directement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcpy(a->nom,tabskieur[i].nom)
    , je partais en segment default.

    Donc si j'ai bien compris il faut d'abord allouer la mémoire à a->nom

    Merci ++
    Exact (avec la solution statique proposée ou la solution dynamique proposée)

    Jc

  16. #16
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par mikedavem
    Merci pour vos réponses.

    J'avais eu un souci lorsque j'avais mis directement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcpy(a->nom,tabskieur[i].nom)
    , je partais en segment default.

    Donc si j'ai bien compris il faut d'abord allouer la mémoire à a->nom

    Merci ++
    Un pointeur non initialisé ou initialisé avec NULL pointe vers un espace mémoire invalide. Tout déréférencement invoque un comportement indéfini (Tout peut arriver).

    Pour qu'un pointeur soit valide, il faut l'initialiser correctement, c'est à dire avec
    • L'adresse d'une variable
    • la valeur retournée par malloc() (si non NULL)
    • la valeur d'un pointeur si elle est valide

    http://emmanuel-delahaye.developpez.....htm#pointeurs

  17. #17
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    Ok , je vous remercie pour vos réponses

Discussions similaires

  1. [Struts] - débutante - liste déroulante
    Par alexx dans le forum Struts 1
    Réponses: 3
    Dernier message: 18/04/2005, 15h01
  2. Réponses: 2
    Dernier message: 15/11/2004, 15h12
  3. Réponses: 10
    Dernier message: 04/05/2004, 16h00
  4. [ JSP ][ Débutant ] Liste déroulante + actualisation de page
    Par captainpouet dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 17/04/2004, 19h51
  5. [LG]Listes chainées avec pointeur
    Par PaowZ dans le forum Langage
    Réponses: 2
    Dernier message: 17/02/2004, 19h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo