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 :

Que renvoie la fonction fopen?


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 38
    Points : 16
    Points
    16
    Par défaut Que renvoie la fonction fopen?
    Bonjour, voila, j'ai un problème dans mon code, je pense que cela touche cette partie:
    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
    FILE* Test = NULL;
    Test = fopen("config.cfg", "r");
    if (Test != NULL)
    { 
             while (fgets(chaine, 1000, Test) != NULL)
             {
              sprintf(ChaineTestx, "%s", chaine);
              strcat(ChaineTest, ChaineTestx);
             }
             FILE* Copie = NULL;
             printf("%s", ChaineTest);
             Copie = fopen("save/config.cfg", "w+");
             fprintf(Copie, "%s", ChaineTest);
             fclose(Copie);
    }
    fclose(Test);
    Pour moi, si le fichier config.cfg n'existe pas, la variable Test reste a NULL, or, dans le if, cela ne marche pas, mon programme plante si le fichier config.cfg n'est pas créé (mais marche parfaitement si il est la...).
    Merci de m'éclairer

  2. #2
    Membre éclairé Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Points : 858
    Points
    858
    Par défaut
    Citation Envoyé par PorkyFighter
    Bonjour, voila, j'ai un problème dans mon code, je pense que cela touche cette partie:
    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
    FILE* Test = NULL;
    Test = fopen("config.cfg", "r");
    if (Test != NULL)
    { 
             while (fgets(chaine, 1000, Test) != NULL)
             {
              sprintf(ChaineTestx, "%s", chaine);
              strcat(ChaineTest, ChaineTestx);
             }
             FILE* Copie = NULL;
             printf("%s", ChaineTest);
             Copie = fopen("save/config.cfg", "w+");
             fprintf(Copie, "%s", ChaineTest);
             fclose(Copie);
    }
    fclose(Test);
    Pour moi, si le fichier config.cfg n'existe pas, la variable Test reste a NULL, or, dans le if, cela ne marche pas, mon programme plante si le fichier config.cfg n'est pas créé (mais marche parfaitement si il est la...).
    Merci de m'éclairer

    Le problème est que tu appelles "fclose" dans tous les cas, c'est à dire même lorsque le ficher n'existe pas.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 590
    Points
    41 590
    Par défaut
    Euh...
    On peut voir où et comment sont déclarées et initialisées les variables ChaineTestx et ChaineTest ?
    Car là, je flaire le GROS dépassement de buffer, si buffer il y a...

    Edit: En effet, il y a aussi le problème du fclose() : fclose(NULL) est garanti planter dans les dernières versions de la C Run-Time Library de Microsoft...

  4. #4
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 38
    Points : 16
    Points
    16
    Par défaut
    Ah ui pas bête mdr
    Merci

  5. #5
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 38
    Points : 16
    Points
    16
    Par défaut
    Euhh bah je vais vous donner tout mon code alors les commentaires sont les bienvenus
    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    ////////////////////////////////
    //  PorkyFighter              //
    //  Logiciel de location de   //
    //  terrains pour le TCG      //
    //  2006                      //
    //  porkyfighter@hotmail.com  //
    ////////////////////////////////
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
     
    void DeclarationSemaine();
     
    int main (int argc, char *argv[])
    {
    DeclarationSemaine();
    system("PAUSE");
    return EXIT_SUCCESS;
    }
     
     
    void DeclarationSemaine()
    {
    typedef struct journee journee;
    struct journee
    {
    int d8a9;
    int d9a10;
    int d10a11;
    int d11a12;
    int d12a13;
    int d13a14;
    int d14a15;
    int d15a16;
    int d16a17;
    int d17a18;
    int d18a19;
    int d19a20;
    };
    journee Lundi[3];
    journee Mardi[3];
    journee Mercredi[3];
    journee Jeudi[3];
    journee Vendredi[3];
    journee Samedi[3];
    journee Dimanche[3];
    int iL, iM, iMe, iJ, iV, iS, iD, u;
    char ChaineTest[1000] = {0};
    char chaine[1000];
    char ChaineTestx[1000];
    //Declaration des differentes heures de cours sur chaque terrain, chaque tableau contient les 3 terrains, 0 est le terrain 1, 1 le terrain 2, 2 le terrain 3.
    //Utilisation d'un booleen pour le statut des terrains, 0 si le terrain est libre, 1 si il est pris. Cela sera plus facile plus tard pour tester la disponibilité des terrainst
    for (iL = 0; iL < 3 ; iL++)
    {
    Lundi[iL].d8a9 = 0;
    Lundi[iL].d9a10 = 0;
    Lundi[iL].d10a11 = 0;
    Lundi[iL].d11a12 = 0;
    Lundi[iL].d12a13 = 0;
    Lundi[iL].d13a14 = 0;
    Lundi[iL].d14a15 = 0;
    Lundi[iL].d15a16 = 0;
    Lundi[iL].d16a17 = 0;
    Lundi[iL].d17a18 = 1;
    Lundi[iL].d18a19 = 1;
    Lundi[iL].d19a20 = 1;
    }
    for(iM = 0; iM < 3 ; iM++)
    {
    Mardi[iM].d8a9 = 0;
    Mardi[iM].d9a10 = 0;
    Mardi[iM].d10a11 = 0;
    Mardi[iM].d11a12 = 0;
    Mardi[iM].d12a13 = 0;
    Mardi[iM].d13a14 = 0;
    Mardi[iM].d14a15 = 0;
    Mardi[iM].d15a16 = 0;
    Mardi[iM].d16a17 = 0;
    Mardi[iM].d17a18 = 1;
    Mardi[iM].d18a19 = 1;
    Mardi[iM].d19a20 = 1;
    }
    for(iMe = 0; iMe < 3 ; iMe++)
    {
    Mercredi[iMe].d8a9 = 0;
    Mercredi[iMe].d9a10 = 0;
    Mercredi[iMe].d10a11 = 0;
    Mercredi[iMe].d11a12 = 0;
    Mercredi[iMe].d12a13 = 0;
    Mercredi[iMe].d13a14 = 1;
    Mercredi[iMe].d14a15 = 1;
    Mercredi[iMe].d15a16 = 1;
    Mercredi[iMe].d16a17 = 1;
    Mercredi[iMe].d17a18 = 1;
    Mercredi[iMe].d18a19 = 1;
    Mercredi[iMe].d19a20 = 1;
    }
    for(iJ = 0; iJ < 3 ; iJ++)
    {
    Jeudi[iJ].d8a9 = 0;
    Jeudi[iJ].d9a10 = 0;
    Jeudi[iJ].d10a11 = 0;
    Jeudi[iJ].d11a12 = 0;
    Jeudi[iJ].d12a13 = 0;
    Jeudi[iJ].d13a14 = 0;
    Jeudi[iJ].d14a15 = 0;
    Jeudi[iJ].d15a16 = 0;
    Jeudi[iJ].d16a17 = 0;
    Jeudi[iJ].d17a18 = 1;
    Jeudi[iJ].d18a19 = 1;
    Jeudi[iJ].d19a20 = 1;
    }
    for(iV = 0; iV < 3 ; iV++)
    {
    Vendredi[iV].d8a9 = 0;
    Vendredi[iV].d9a10 = 0;
    Vendredi[iV].d10a11 = 0;
    Vendredi[iV].d11a12 = 0;
    Vendredi[iV].d12a13 = 0;
    Vendredi[iV].d13a14 = 0;
    Vendredi[iV].d14a15 = 0;
    Vendredi[iV].d15a16 = 0;
    Vendredi[iV].d16a17 = 0;
    Vendredi[iV].d17a18 = 1;
    Vendredi[iV].d18a19 = 1;
    Vendredi[iV].d19a20 = 1;
    }
    for(iS = 0; iS < 3; iS++)
    {
    Samedi[iS].d8a9 = 0;
    Samedi[iS].d9a10 = 0;
    Samedi[iS].d10a11 = 0;
    Samedi[iS].d11a12 = 0;
    Samedi[iS].d12a13 = 0;
    Samedi[iS].d13a14 = 1;
    Samedi[iS].d14a15 = 1;
    Samedi[iS].d15a16 = 1;
    Samedi[iS].d16a17 = 1;
    Samedi[iS].d17a18 = 1;
    Samedi[iS].d18a19 = 1;
    Samedi[iS].d19a20 = 1;
    }
    for(iD = 0; iD < 3; iD++)
    {
    Dimanche[iD].d8a9 = 0;
    Dimanche[iD].d9a10 = 0;
    Dimanche[iD].d10a11 = 0;
    Dimanche[iD].d11a12 = 0;
    Dimanche[iD].d12a13 = 0;
    Dimanche[iD].d13a14 = 0;
    Dimanche[iD].d14a15 = 0;
    Dimanche[iD].d15a16 = 0;
    Dimanche[iD].d16a17 = 0;
    Dimanche[iD].d17a18 = 0;
    Dimanche[iD].d18a19 = 0;
    Dimanche[iD].d19a20 = 0;
    }
    FILE* Test = NULL;
    Test = fopen("config.cfg", "r");
    if (Test != NULL)
    { 
             while (fgets(chaine, 1000, Test) != NULL)
             {
              sprintf(ChaineTestx, "%s", chaine);
              strcat(ChaineTest, ChaineTestx);
             }
             FILE* Copie = NULL;
             Copie = fopen("save/config.cfg", "w+");
             fprintf(Copie, "%s", ChaineTest);
             fclose(Copie);
             fclose(Test);
    }
     
    // Si le fichier existe, le sauvegarder dans le sous dossier \sauvegarde
    ////Ecriture dans le fichier
    FILE* Fichier = NULL;
    Fichier = fopen("config.cfg", "w+");
    for (u = 0; u < 3 ; u++)
    {
    //Lundi
    fprintf(Fichier,"%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n", Lundi[u].d8a9, Lundi[u].d9a10, Lundi[u].d10a11, Lundi[u].d11a12, Lundi[u].d12a13, Lundi[u].d13a14, Lundi[u].d14a15, Lundi[u].d15a16, Lundi[u].d16a17, Lundi[u].d17a18, Lundi[u].d18a19, Lundi[u].d19a20);
    //Mardi
    fprintf(Fichier,"%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n", Mardi[u].d8a9, Mardi[u].d9a10, Mardi[u].d10a11, Mardi[u].d11a12, Mardi[u].d12a13, Mardi[u].d13a14, Mardi[u].d14a15, Mardi[u].d15a16, Mardi[u].d16a17, Mardi[u].d17a18, Mardi[u].d18a19, Mardi[u].d19a20);
    //Mercredi
    fprintf(Fichier,"%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n", Mercredi[u].d8a9, Mercredi[u].d9a10, Mercredi[u].d10a11, Mercredi[u].d11a12, Mercredi[u].d12a13, Mercredi[u].d13a14, Mercredi[u].d14a15, Mercredi[u].d15a16, Mercredi[u].d16a17, Mercredi[u].d17a18, Mercredi[u].d18a19, Mercredi[u].d19a20);
    //Jeudi
    fprintf(Fichier,"%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n", Jeudi[u].d8a9, Jeudi[u].d9a10, Jeudi[u].d10a11, Jeudi[u].d11a12, Jeudi[u].d12a13, Jeudi[u].d13a14, Jeudi[u].d14a15, Jeudi[u].d15a16, Jeudi[u].d16a17, Jeudi[u].d17a18, Jeudi[u].d18a19, Jeudi[u].d19a20);
    //Vendredi
    fprintf(Fichier,"%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n", Vendredi[u].d8a9, Vendredi[u].d9a10, Vendredi[u].d10a11, Vendredi[u].d11a12, Vendredi[u].d12a13, Vendredi[u].d13a14, Vendredi[u].d14a15, Vendredi[u].d15a16, Vendredi[u].d16a17, Vendredi[u].d17a18, Vendredi[u].d18a19, Vendredi[u].d19a20);
    //Samedi
    fprintf(Fichier,"%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n", Samedi[u].d8a9, Samedi[u].d9a10, Samedi[u].d10a11, Samedi[u].d11a12, Samedi[u].d12a13, Samedi[u].d13a14, Samedi[u].d14a15, Samedi[u].d15a16, Samedi[u].d16a17, Samedi[u].d17a18, Samedi[u].d18a19, Samedi[u].d19a20);
    //Dimanche
    fprintf(Fichier,"%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n", Dimanche[u].d8a9, Dimanche[u].d9a10, Dimanche[u].d10a11, Dimanche[u].d11a12, Dimanche[u].d12a13, Dimanche[u].d13a14, Dimanche[u].d14a15, Dimanche[u].d15a16, Dimanche[u].d16a17, Dimanche[u].d17a18, Dimanche[u].d18a19, Dimanche[u].d19a20);
    }
    fclose(Fichier);
    printf("Semaine remise a zero\n");
    }

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 590
    Points
    41 590
    Par défaut
    Et ça compile, ça ??

    Tu définis une fonction dans une autre fonction!!

    En plus:
    • Tu ne devrais pas déclarer ainsi les structures dans une fonction, ça apporte plus de confusion qu'autre chose...
    • Tu devrais aussi te définir un type booléen (ou utiliser celui de <stdbool.h> si tu as un compilateur compatible C99) plutôt que des entiers.
    • Pourquoi utiliser des tableaux de trente entiers alors que tu n'en utilises qu'un seul (ou plutôt, tu utilises le tableau comme entier) à chaque fois ?
    • Pas de sprintf() sur un FILE*
    • C'est quoi tous ces guillemets sortis de nulle part ?

    Bref, un joli code très digne de la première partie de ton pseudo. As-tu déjà suivi le moindre cours de C avant d'écrire ça ?

    Edit: Bon, soit tu as fait un edit, soit le code est mieux affiché et il y avait un bug dans le forum. C'est déjà mieux comme ça...
    Mais il y a toujours le problème selon lequel tu ne vérifies absolument pas tes tailles de buffer alors que tu fais une concaténation massive...

  7. #7
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 38
    Points : 16
    Points
    16
    Par défaut
    Euh je pense que tu as vu le premier code source, j'ai édité apres, j'avais mis une ancienne version, qui je l'avoue est toute pourrie ^^...
    Mais oui, je débute, ca marchais, j'étais plutôt content que ça marche...
    Je suis le tutoriel C du site .
    -Oui, plus tard, j'aurais mis mes fonctions et mes defines dans un header, c'était juste un petit bout de code pour voir si ma vision du programme pourrait marcher...
    -Okay merci, je ne connaissais pas les types booleens, j'utiliserais celui de <stdbool.h> la prochaine fois
    -Pour les tableaux non utilisés, je pense que c'est corrigé depuis l'edit
    -Pour le sprintf() sur le FILE* je pense que c'est corrigé aussi
    -Pour les guillemets, c'est n'importe quoi, un bête reflexe, que j'ai corrigé presque tout de suite dans l'edit

    Edit: Comment verifier la taille du buffer? Le problème c'est au niveau de mes declarations de variables? Pour la concatenation, je me suis dis que ca allait et ne me suis pas demandé si il y avais une autre solution... Bref je ne suis pas encore pret a developper un truc "potable", mais j'ai de la motivation et je compte bien y arriver un jour!

    Merci pour toutes ces critiques et d'avoir passé du temps a lire mon code source

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 590
    Points
    41 590
    Par défaut
    Le problème de dépassement de buffer est au niveau des sprintf+strcat.
    Déjà, le premier sprintf() est inutile (il fait une bête copie de chaine dans ChaineTestx) mais surtout, le problème vient de tes strcat().
    Tu devrais vérifier à chaque fois la taille du buffer et la taille déja prise (avec strlen()).

    Ou bien, tu peux tout simplement ouvrir les deux FILE* avant la boucle et mettre tes fprintf() dans la boucle avec le reste: Ainsi, tu n'auras pas besoin de strcat().

    PS: Tu ne vérifies pas la valeur de retour du dernier fopen()...

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 590
    Points
    41 590
    Par défaut
    Et pour un tableau de taille 3, les indices ne vont que de 0 à 2...

  10. #10
    Expert éminent sénior
    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
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par PorkyFighter
    Pour moi, si le fichier config.cfg n'existe pas, la variable Test reste a NULL, or, dans le if, cela ne marche pas, mon programme plante si le fichier config.cfg n'est pas créé (mais marche parfaitement si il est la...).
    Problème récurrent. Si fopen() echoue, il renvoi NULL. Or fclose (NULL) produit un comportement indéfini. Il faut donc mettre le fclose dans le if().
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
       FILE* = fopen ("config.cfg", "r");
       if (Test != NULL)
       { 
          <...>
          fclose(Test);
       }

  11. #11
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 38
    Points : 16
    Points
    16
    Par défaut
    Okay, merci pour toutes vos critiques, j'en prends note, mon projet arriveras peut-être un jour
    C'est pour mon club de tennis, ca aurait été pour mon club de tennis, un logiciel pour reserver des terrains online
    Un copain connais plusieurs langages et m'a dit que ce serait beaucoup plus simple de le programmer en PHP, je vais donc étudier un peu le PHP pour me faire une idée.
    A plus

  12. #12
    Expert éminent sénior
    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
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par PorkyFighter
    un logiciel pour reserver des terrains online
    <...> PHP
    +1

    Savoir choisir le bon outil fait partie de ce métier.

    XHTML + PHP + MySQL

Discussions similaires

  1. [Toutes versions] Est-il possible de formater ce que renvoie une fonction ?
    Par siril dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 22/07/2014, 22h45
  2. Question : Que renvoie une fonction ou un Sub
    Par Swiper dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 12/07/2007, 15h36
  3. [applet]récupérer ds un post ce que renvoie une méthode java
    Par BouB dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 28/02/2006, 12h37
  4. va_arg, va_start, va_end, que font ces fonctions???
    Par richard_sraing dans le forum C
    Réponses: 5
    Dernier message: 11/02/2006, 19h46
  5. [PLSQL HP3000] Fonction FOPEN
    Par anaon dans le forum Oracle
    Réponses: 6
    Dernier message: 06/10/2005, 10h50

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