découpage d'un char (C++) - C++ - Programmation
Marsh Posté le 13-05-2016 à 00:15:25
Tu devrais activer les warnings de ton compilateur...
C'est quoi déjà un char? Un seul caractère...
Si tu veux découper une chaîne de caractères (soit char chaine[]="abc"; ) c'est juste une histoire de boucle et de memcpy avec les bons offsets+longeurs. Simule le avec papier+crayon, c'est simple.
Marsh Posté le 13-05-2016 à 08:29:56
Bonjour,
Déjà merci de ton intérêt pour mon cas,
En réalité il n'y a bien que 1charecter dans le char (ce que j'ai écrit n'était qu'un exemple mal formuler je m'excuse)
Mon problème est qu'une partie de mon programme doit utiliser qu'une partie de cette chaîne. Un peut comme le explode de PHP mais celon un certain nombre de caractères (par groupe de 10 en gros )
Je connais assez peu le c++ , je suit quelques cours sur le web en même temps mais je travaille surtout avec du PHP, et la transition est assez brutale pour moi
Je vous remercie d'avance
Cordialement Thomas
Marsh Posté le 13-05-2016 à 15:25:11
Commencer le C++ en s'attaquant à du threading, ca va piquer, oui
Pars plutôt de là, pour ton problème
Code :
|
Assure-toi que ton compilateur est bien compatible avec C++11 ou plus récent.
Marsh Posté le 13-05-2016 à 19:32:38
theshockwave a écrit : Commencer le C++ en s'attaquant à du threading, ca va piquer, oui |
Effectivement...
J'avais pas vu qu'il est question de C++, du coup je me tais... Dans ce language il y a certainement quelque chose de mieux adapté et de plus élégant mais je ne connais pas.
Marsh Posté le 14-05-2016 à 01:37:50
Non mais déjà la première ligne est probablement fausse:
char chars[]={'GT','CSS','etc', ..... ,'voila','fin'}; // en vrais on s'en fou du contenu ...
en C++, 'GT' est de type char mais sa valeur est implementation defined et probablement pas ce que tu attends.
char chars[]={'G', T','C', 'S', 'S'};
ça aurait bien plus de sens ici par exemple.
A+,
Marsh Posté le 14-05-2016 à 10:14:27
Bonjour,
Deja merci de vos réponses,
Effectivement je commence en ayant les yeux plus gros que le ventre ^^
Pour ce qui est du char je suis d'accord qu'il y a une erreur (j'avez réécrit les lignes à voler)
Cette ligne ressemble plus à
char chars[]={'G', T','C', 'S', 'S'};
Comme le dit gilou,
Mon compilateur est effectivement régler sur "GNU g++11" , et changer avec ou sans GNU ne m'a rien changer ^^
Et pour ce qui est de mon problème je vais reformuler ^^
J'ai un
char chars[]={'G', T','C', 'S', 'S'};
Et je voudrai le découper en plusieurs partie,
Par exemple en 2 me donnerai
char chars1[]={'G', T'};
char chars2[]={'C', 'S', 'S'};
Voilà,
Cordialement Thomas
Marsh Posté le 14-05-2016 à 12:47:47
Bon, puisque tu insistes sur tes chars...
Citation : Et je voudrai le découper en plusieurs partie, |
Sous cette forme là ce n'est pas possible car il faut connaître le nombre de variables à l'avance. Par contre avec du malloc()...
Si j'ai bien compris tu cherches un truc genre
Code :
|
Je ne parle pas C++ mais le truc compile et tourne sans warnings avec -Wall, donc ça doit être bon... Par contre faudra remplacer le 59 par une constante (c'est plus propre) et revoir la gestion d'erreurs bien sûr.
Citation : Mon compilateur est effectivement régler sur "GNU g++11" , et changer avec ou sans GNU ne m'a rien changer ^^ |
Le C++11 c'est pour le vector-bidule dont parlait theshockwave, pas pour les char[], ça c'est du classique...
Marsh Posté le 14-05-2016 à 17:18:07
Merci de cette réponse ,
Je teste ce soir et je vous tien au courant ^^
Marsh Posté le 14-05-2016 à 20:11:46
Citation : J'ai un |
Sauf que ça, c'est pas du C++ mais du C
En C++, tu vas travailler avec une string.
Code :
|
(Noter que ça marchera pas bien sur si la chaîne est plus petite que le nombre de morceaux qu'on veut la découper, mais j'allais pas filer un truc a 100% finalisé... )
Note: si j'avais un prototype
std::vector<std::string> split(std::string str, int parts);
plutôt qu'un avec un passage de paramètre par référence,
std::vector<std::string> split(const std::string &str, int parts);
ça doublerait le temps d’exécution (sur ma machine en tout cas)
Par contre le compilo semble suffisamment intelligent (g++) pour optimiser le push_back d'un objet temporaire (svec.push_back(str.substr(pos, partsize)); ) sans que j'aie besoin de faire un move pour qu'il ne fasse pas de copie (svec.push_back(std::move(str.substr(pos, partsize))); )
Tandis que si tu veux utiliser des char[] (comme tu en connais pas la taille au départ, ca sera des char * en fait), c'est du C et pas du C++.
Code :
|
(la pareil, c'est pas blindé, on teste pas la valeur de retour des mallocs... mais je vais pas tout paufiner)
A+,
Marsh Posté le 16-05-2016 à 15:06:26
ok ok ...
j'avoue ne pas avoir tout compris, mais le gros est rentrer,
je croit effectivement que je vais retourner a mes petit cours pour mieu comprendre, ce cera mieu que de patauger comme je le fait ^^
en tout cas je te remercie gilou de m'avoir ainsi éclairé, et aussi rat de combat qui m'a donner un morceau de code qui fait EXACTEMENT ce que je cherchait ^^ ainsi qu'aux autres
en tout cas problème régler, j'ai enfin pue avancer ^^ et même faire tourner mon morceau de programme avec du theading grâce a vous ^^,
je vous remercie encore et vous souhaite une bonne journée.
Cordialement Thomas
Marsh Posté le 16-05-2016 à 19:02:37
Tiens, une version optimisée (memcpy), en C99:
Code :
|
C'est une version qui suppose que tes chaines sont des chaînes C, terminées par un 0.
Si tu travailles vraiment avec des buffers de caractères et non des chaînes C, c'est juste une variation sur ce thème:
Code :
|
A+,
Marsh Posté le 12-05-2016 à 23:11:30
bonjour,
j'ai commencer depuis peu le C++ et je me suis lancer sur un petit projet, mais je suis aussi (et surtout ) tomber sur un "bloquage" qui est pourtant tout con ^^
il s'agit de découper une variable CHAR
en gros voila la portion de codes utile pour se cas :
en gros, selon le nombre de "tread" utiliser (il s'agit de calcule en parallèle ^^ ) je voudrais découper la chaine de 59 valeurs (char) en part (presque) égale, et faire un truc du genre :
5 tread, donc 59/5=11.8, sa met 12 morceau dans le 1er, 12 pour le 2eme etc.. et le dernier se prend le reste
voila, je vous remercie d'avance,
cordialement Thomas