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 :

Modifier la valeur d'un char


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 138
    Par défaut Modifier la valeur d'un char
    bonjour à tous

    j'ai un soucis vraiment tout bête, mais je trouve pas de solutions ... surement un manque de connaissances en c++, je débute totalement.

    je voudrai une chaine dont le contenu change dans une boucle for, de ce type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for (boucle2 = 0; boucle2 < nbr_char; boucle2++)
        str += "b";
    voila, je sais pas si je dois définir str comme char ou comme string (j'ai lu des choses sur les 2 types, string a l'air de gérer tout seul sa taille mais pas char). ensuite, comment faire pour que str se voit ajouter un b à la fin de la chaine, à chaque tour de ma boucle for ?

    désolé pour la question "bidon"

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 258
    Par défaut
    Citation Envoyé par Sephiroth Lune
    voila, je sais pas si je dois définir str comme char ou comme string (j'ai lu des choses sur les 2 types, string a l'air de gérer tout seul sa taille mais pas char).
    La FAQ est ton amie : http://c.developpez.com/faq/cpp/?page=strings

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 138
    Par défaut
    la FAQ, je l'ai déja lue, mais ils disent que modifier une valeur d'un string peut avoir des conséquences sur la mémoire pour les autres variables.

    voila un bout de code qui plante "au 2ème tour de la 1ère boucle for" :

    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
            string test = "";
        int ***case_state;
    
        // redimensionnement du tableau (map)
        case_state = (int ***)malloc(nb_maps * sizeof(int **));
    
        // boucle sur les fichiers .cfg (contient le nombre de colonnes / lignes sous la forme XXX/YYY)
        for (boucle = 1; boucle <= nb_maps; boucle++) {
    
            test += "test";
    
            cout << test << "[BLABLA]";
            //printf("Loading maps (%d / %d) %s\n", boucle, nb_maps, test);
    
            // lecture du nombre de cases (XXX/XXX)
            sprintf(file_name, "Maps/%d.cfg", boucle);
            fcfg = fopen(file_name, "rt");
            file_size = fsize(fcfg);
            fread(c_read_cfg, file_size, 1, fcfg);
            nbr_col  = atoi(strtok(c_read_cfg, "/"));
            nbr_line = atoi(strtok(NULL, "/"));
    
            // redimensionnement du tableau (colonnes)
            case_state[boucle] = (int **)malloc(nbr_col * sizeof(int *));
    
            for (boucle2 = 1; boucle2 <= nbr_line; boucle2++) {
                // redimensionnement du tableau (lignes)
                case_state[boucle][boucle2] = (int *)malloc(nbr_line * sizeof(int));
            } // for
    
            fclose(fcfg);
    
            // lecture des etats des cases de cette map (fichier .sta)
            sprintf(file_name, "Maps/%d.sta", boucle);
            fsta = fopen(file_name, "rt");
    
            // boucle sur les colonnes
            for (boucle2 = 1; boucle2 <= nbr_col; boucle2++) {
                // boucle sur les lignes
                for (boucle3 = 1; boucle3 <= nbr_line; boucle3++) {
                    fread(c_case_state, 1, 1, fsta);
                    case_state[boucle][boucle2][boucle3] = atoi(c_case_state);
                } // for
            } // for
    
            fclose(fsta);
    
        } // for
    actuellement, j'ai fait 3 tests :

    - variable type string + modification à chaque tour de boucle + 2eme ligne en gras active -> plantage
    - pas de variable type string + 2eme ligne en gras active -> tout est ok
    - variable type string + modification à chaque tour de boucle + 2eme ligne en gras supprimée -> fonctionne

    pourquoi quand je modifie ma variable type string, ça a des influences sur la 2eme ligne en gras ? je pige pas là

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 258
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    case_state = (int ***)malloc(nb_maps * sizeof(int **));
    for (boucle = 1; boucle <= nb_maps; boucle++) {
        case_state[boucle] = (int **)malloc(nbr_col * sizeof(int *));
    }
    Attention : les tableaux sont indéxés à partir de 0. Avec ton code ci-dessus, lorsque la variable boucle vaut nb_maps, tu tapes en dehors du tableau. Le comportement de ton programme devient indéfini, ce qui peut expliquer les plantages.

    Essaye aussi de poster un example minimal et compilable montrant ton problème, c'est plus facile pour voir ce qui peut planter.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 138
    Par défaut
    je sais que les tableaux son indexés depuis 0, et j'ai longement hésité avant de mettre des index "en partant de 1". finalement, c'était une mauvaise idée, il faut que je parte de 0.

    pour le nb_maps, je ne pense pas que ça vienne de là, vu que cette variable ne change pas entre le 1er passage et le 2eme passage de ma boucle. mon problème ne survient qu'au 2eme passage, lorsque j'ai changé la valeur de mon type string.

    sinon, tu peux télécharger mon projet (sous code blocks) :
    télécharger le projet

    c'est dans la fonction get_cases_states que se passe mon soucis. essaye de juste mettre la ligne test += "test"; en commentaire, tout fonctionne. si tu décommentes, ça foires. avec divers tests, j'en ai conclu que le plantage arrivait sur la 2eme ligne en gras du code copié au dessus, mais je me suis peut-être trompé.

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Hello !

    J'ai fait quelques petites modifs. Ca semble fonctionner chez moi.

    void get_cases_states() {
    // déclaration des variables
    int nb_maps = 0, file_size = 0, nbr_col = 0, nbr_line = 0, nbr_char = 100;
    int boucle, boucle2, boucle3;
    char c_nb_maps[2] = "", c_read_cfg[10] = "", c_case_state[2]="", *str;
    char file_name[MAX_PATH] = "";
    string test = "";
    FILE *fcfg, *fsta;

    // ouverture du fichier Config.cfg, qui contient le nombre de maps disponibles
    fcfg = fopen("Maps/Config.cfg", "rt");
    // recherche de la taille du fichier
    file_size = fsize(fcfg);
    // recherche du nombre de maps écrites dans le fichier
    fread(c_nb_maps, file_size,1, fcfg);
    nb_maps = atoi(c_nb_maps);
    // free(c_nb_maps); // On ne desalloue pas un tableau statique !!
    // fermeture du fichier
    fclose(fcfg);

    // redimensionnement du tableau (map)
    case_state = (int ***)malloc(nb_maps * sizeof(int **));

    // boucle sur les fichiers .cfg (contient le nombre de colonnes / lignes sous la forme XXX/YYY)
    for (boucle = 0; boucle < nb_maps; boucle++) { // On commence le tableau à partir de 0

    test += "test";

    printf("Loading maps (%d / %d) %s\n", boucle, nb_maps, test.c_str()); // utilisation de la méthode c_str

    // lecture du nombre de cases (XXX/XXX)
    sprintf(file_name, "Maps/%d.cfg", boucle+1); // boucle + 1
    fcfg = fopen(file_name, "rt");
    if (fcfg==NULL) printf("Erreur ouverture fichier\n");
    file_size = fsize(fcfg);
    printf("file_size : %d\n",file_size);
    fread(c_read_cfg, 1, file_size, fcfg);
    fclose(fcfg);

    nbr_col = atoi(strtok(c_read_cfg, "/"));
    nbr_line = atoi(strtok(NULL, "/"));
    // redimensionnement du tableau (colonnes)
    case_state[boucle] = (int **)malloc(nbr_col * sizeof(int *));
    for (boucle2 = 0; boucle2 < nbr_col; boucle2++) { // on commence à 0
    // redimensionnement du tableau (lignes)
    case_state[boucle][boucle2] = (int *)malloc(nbr_line * sizeof(int));
    } // for
    // lecture des etats des cases de cette map (fichier .sta)
    sprintf(file_name, "Maps/%d.sta", boucle+1); // boucle + 1
    fsta = fopen(file_name, "rt");
    // boucle sur les colonnes
    for (boucle2 = 0; boucle2 < nbr_col; boucle2++) {
    // boucle sur les lignes
    for (boucle3 = 0; boucle3 < nbr_line; boucle3++) {
    fread(c_case_state, 1, 1, fsta);
    c_case_state[1]=0; // un tableau "null-terminated" est préférable
    case_state[boucle][boucle2][boucle3] = atoi(c_case_state);
    } // for
    } // for
    fclose(fsta);

    // Ne pas oublier de desallouer la mémoire (pour les tests)
    for (boucle2=0; boucle2<nbr_col; boucle2++) {free(case_state[boucle][boucle2]);case_state[boucle][boucle2]=NULL;}
    free(case_state[boucle]); case_state[boucle]=NULL;
    // Fin desallocation mémoire

    } // for
    free(case_state);case_state=NULL;
    printf("Loading maps OK\n");
    } // get_cases_states

Discussions similaires

  1. [XSL] Comment modifier la valeur d'une variable?
    Par sorcer1 dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 17/02/2010, 13h26
  2. Réponses: 3
    Dernier message: 04/01/2006, 20h53
  3. Modifier la valeur d'un champ
    Par MJEFF dans le forum Access
    Réponses: 10
    Dernier message: 06/10/2005, 10h59
  4. Modifier la valeur d'un champ en fonction d'une autre...
    Par venividivici dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 25/08/2005, 14h28
  5. [C#] Modifier une valeur dans une DataTable
    Par Scorff dans le forum ASP.NET
    Réponses: 2
    Dernier message: 23/05/2005, 10h45

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