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 :

passage par pointeur sur char, propre si possible


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 35
    Points : 25
    Points
    25
    Par défaut passage par pointeur sur char, propre si possible
    hello
    quelqu'un aurait-il un lien qui explique super bien les pointeurs de caractères, le passage par je-ne-sais-plus-quoi: j'aimerais modifier une chaîne de caractères (char* donc) via une procédure (sans avoir à faire le return d'un char*) tout en nettoyant le travail ( en effaçant les chaînes temporaires)? SVP ne me donnez pas les premiers liens que vous trouverez, parceque je les ai déjà essayés (soit trop simple, des pointeurs mais pas sur des caractères, soit trop compliqué, avec template machins). Donc si quelqu'un voit de quoi je parle, qu'il se manifeste!

    Pour l'instant, tout mon code se trouve dans le main et l'exécution gratte à mort la RAM

  2. #2
    Membre éclairé

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Points : 877
    Points
    877
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Si c'est du c++, pourquoi ne pas utiliser une simple string, ou même un vecteur de char ?

    Et tout dans le main ?!

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 35
    Points : 25
    Points
    25
    Par défaut
    c'est une idée... faudrait que je modifie tout le code (il y a du char* un peu partout) mais bon c'est une idée, j'imagine que String est accompagné d'outils, je verrai tout ça
    Bon, je vais pas me relancer dessus tout de suite, alors, en attendant, s'il y en a une âme charitable qui a un bout de code propre et pas trop compliqué qui manipule des char*, je suis aussi preneur

  4. #4
    Membre éclairé

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Points : 877
    Points
    877
    Billets dans le blog
    1
    Par défaut
    Je n'ai pas de lien, mais cherche plus du côté du langage C, eux sont habitués à ce genre de pratique

    Sinon,

    std::string est LA classe c++ pour manipuler les chaînes de caractères.

    Il faut presque oublier les tableaux de pointeurs sur des chars ou autre.
    Plein d'outils très efficasses sont disponibles dans la librairie standard.

    Si tous est dans le main, un remplacement des char* en string peut être très rapide. (Sauf 3000 lignes..)

    Est-il possible de voir le code ?

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 35
    Points : 25
    Points
    25
    Par défaut
    alors, un peu pêle-mêle:
    dans le main:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    readResult = SP->ReadData(incomingData,dataLength);
    chaine = (concat(chaine,incomingData));
    LLONG = longueurChaine(chaine);
    if(LLONG>250)
         chaine = subChar(chaine);
    txt(ecran,10,90,chaine);
    [...]
    if(chaine[i] == '.' && 0 <= a && a <= 9 &&
    [...]
    chaine = (chaine + 10);
    chaine = (chaine + i);
    [...]
    avec:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    char* concat(char* c1, char*c2)
    {
     	  char* c3 = new char[strlen(c1)+strlen(c2)+1];
     	  strcpy(c3, c1);
     	  strncat(c3,c2,strlen(c2));
     	  *(c3+strlen(c1)+strlen(c2)) = '\0';
      //    realloc(c3,strlen(c1)+strlen(c2)+1);
          return c3;
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    char* subChar(char* t)
    {
    	if(longueurChaine(t)>200)
    	{
    	int i = 0;
    	char* tt = new char[200];
    	while(t[i] != '\0' && i < 200)
    			   tt[i] = t[i++];
    	tt[199] = 0;
    	delete [] t;
    	return tt;
    }
    else return t;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void txt(SDL_Surface *surf, int a, int b, char *text)
    {
            position.x = a;
            position.y = b;
            SDL_Surface *texte = TTF_RenderText_Blended(police, subChar(text), couleurNoire);
            SDL_BlitSurface(texte, NULL, surf, &position);  
    }
    Donc, la partie qui est dans le main, j'aimerais bien la mettre dans une procédure
    L'appel à subChar fait monter l'utilisation de la RAM, malgré le delete. Quant à concat, je sais plus (j'ai pas encore fini de travailler la trame proprement, je crois que je la lis à l'envers)
    Il y a d'autres passage avec des char* mais bon, si je comprenais, je pourrais faire les modifs. C'est ça ou String, de toute façon...
    Bon j'ai déjà essayé un peu au pif, du genre &(*t+i), *&t+i, char&, finalement ça fait beaucoup de combinaison...

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    avant d'aller plus loin, tu supprimes tous ces char* et tu passes immédiatement à des std::string
    la gestion de char* est des plus compliqués et ne fera qu'entraîner des erreurs/crash en cascade à cause de la manipulation mémoire nécessaire particulièrement ardue

    ensuite, SDL est un peu obsolète (à moins que tu utilises SDL2 ? on dirait pas)
    là encore, il vaudrait mieux passer à SFML qui est récent, à jour et écrit en C++
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  7. #7
    Membre éclairé

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Points : 877
    Points
    877
    Billets dans le blog
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #include <string>
     
    std::string s1("Du text");
    std::string s2;
    std::string s3 = str1 + str2; //remplace : char* concat(char* c1, char*c2) {...}
    if(s3.size() > 200) s3.erase(s3.begin() + 200, str.end()); //remplace : char* subChar(char* t){...}
    std::string a une fonction .c_str() qui renvoie un const char* pour sdl :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void txt(SDL_Surface *surf, int a, int b, const std::string& str)
    {
            position.x = a;
            position.y = b;
            SDL_Surface *texte = TTF_RenderText_Blended(police, str.c_str(), couleurNoire);
            SDL_BlitSurface(texte, NULL, surf, &position);  
    }
    En gros tu ne te soucis plus des pointeurs pour le texte.
    La taille est recuperable en faisant string.size()
    Voici l'interface qu'elle propose.

    edit Je plussoie Bousk, sfml est une excellente librairie graphique, avec pas mal de docs en français, et tellement plus facile à manipuler !

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 35
    Points : 25
    Points
    25
    Par défaut
    une MAJ s'impose on dirait...

Discussions similaires

  1. Réponses: 2
    Dernier message: 15/03/2014, 20h18
  2. Réponses: 10
    Dernier message: 10/01/2010, 16h24
  3. [Console] Pointeur sur char
    Par archipel_k dans le forum C
    Réponses: 4
    Dernier message: 04/08/2006, 14h32
  4. Sizeof d'un pointeur sur char ...
    Par Mike888 dans le forum C
    Réponses: 8
    Dernier message: 03/11/2005, 13h04
  5. [allegro]passage de pointeur sur image
    Par Gonath dans le forum Autres éditeurs
    Réponses: 3
    Dernier message: 13/12/2003, 18h47

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