Don_Angelo 27 Posté(e) le 12 novembre 2007 Auteur Partager Posté(e) le 12 novembre 2007 J'ai essayé oui, et ça semble fonctionner. C'est ça que je comprends pas. Lien à poster
LapinGarou 0 Posté(e) le 12 novembre 2007 Partager Posté(e) le 12 novembre 2007 Ca dépend aussi des compilateurs et leur "permissivité" (certains initialisent à 0, d'autres prennent une valeur impossible à déterminer car changeante/aléatoire à chaque fois, c'est peut-être pour ça que ton programme compile et marche), mais théoriquement, si on ne connait pas la taille du tableau à la compilation/codage, on passe par les allocations dynamiques, c'est fait pour ça. Là, c'est hasardeux, et tu as de la chance que ça ne plante pas. Faudrait que j'essaye sous Visual, mais je suis presque sûr qu'il va me jeter. Lien à poster
Don_Angelo 27 Posté(e) le 14 novembre 2007 Auteur Partager Posté(e) le 14 novembre 2007 Ok je vois, en clair mon compilateur est gentil. Je me pose une dernière question. J'ai un tableau de type char de taille N. Je voudrais coder une fonction qui puisse initialiser tous ces éléments avec la même valeur ici -1, mais en écrasant le tableau déjà existant. Les pointeurs me semble bien adapté pour ça. J'ai donc codé cette fonction: char reset(char *tab) { int i,temp=sizeof(tab); for (i=0;i { tab[i]=-1; } return (*tab); } Elle ne fonctionne pas parce que sizeof() me retourne toujours 4. Ce qui est normal je crois, sauf que ce que j'aimerais c'est que ma fonction reset() puisse calculer la taille de mon tableau. Si ce n'est pas possible puis-je coder ma boucle de façon à ce qu'elle s'arrête à la fin de mon tableau? Je suis pas sûr que ça le soit même avec une boucle while. Qu'en pensez vous? [edit] J'aimerais ne pas avoir à passer la taille N en argument à reset(). [/edit] Lien à poster
rjds 0 Posté(e) le 14 novembre 2007 Partager Posté(e) le 14 novembre 2007 1. tu ne pourras pas eviter le passage d'argument à reset. Sauf à utiliser une variable globale... 2. Sizeof retourne la taille de l'element tab : tab est un pointeur, donc 32 bits, donc 4 octets. 3. Tu peux feinter et faire un while jusqu'a rencontrer une certaine valeur faisant office de fin dans le tableau, genre 0xFF, mais cela ne garantit pas que tu ne déborde pas. conclusion : le mieux est encore de passer un argument à ta fonction, c'est pas enorme a faire ps: ne pas faire return *tab, sinon tu retourne tab[0]. Fait juste return tab. D'ailleur pourquoi retourner le premier caractère du tableau dans ta fonction reset. j'aurai plutot fait un truc du genre : void reset(char *tab, int n) { for (i=0;i tab = -1; } Lien à poster
Don_Angelo 27 Posté(e) le 14 novembre 2007 Auteur Partager Posté(e) le 14 novembre 2007 rjds> return *tab parce qu'il me semblait qu'une fonction typée devait obligatoirement retourner une valeur. j'ai pas tout de suite pensé à return 0. :oups Merci pour ta solution, je vais faire comme ça, après tout c'est pas si important. J'aurais juste eu besoin de savoir calculer la taille de mon tableau pour savoir recoder strtoupper() de PHP par exemple. Lien à poster
rjds 0 Posté(e) le 14 novembre 2007 Partager Posté(e) le 14 novembre 2007 passage de la taille en argument. Ou alors puisque tu semble travailler sur des chaines, il suffit de chercher 0 de fin de chaine. mais il faut bien faire attention à ce que toutes tes fonctions le gère, et qu'il soit present à tous moment. Lien à poster
Dude76 19 Posté(e) le 14 novembre 2007 Partager Posté(e) le 14 novembre 2007 Il t'a pas dit return 0 mais return tab, c'est à dire ton pointeur, la référence à ton tableau Ensuite, tu ne couperas effectivement pas à la variable n à côté de ton tableau; Si tu passais en structure, en classe ou toute forme d'objet, tu définirais un membre Length ou Count ou autre, mais même là, dans la composition, il y a bien différentes variables Après sinon, faut que tu définisses uns fonction Length(char *) qui va partir en boucle tant que tab != '0' ^^ (remarque qu'elle est déjà presque écrite là hein ). à ceci je préciserais que c'est nettement plus couteux en temps puisque systématique tu parcourras tout ton tableau pour en connaître la dimension... c'est si simple et si rapide d'avoir une bête variable à côté à garder bien au chaud édit: grilled by rjds ^^ Lien à poster
Don_Angelo 27 Posté(e) le 14 novembre 2007 Auteur Partager Posté(e) le 14 novembre 2007 Oui, c'est comme ça que j'ai fait finalement, mais curieusement la première fois que j'ai testé avec la condition tab!='0' ça a pas fonctionné. En tout cas maintenant pas de soucis ça marche. Si je comprends bien ce que tu dis, je peux tomber sur des chaines qui ne possède pas de caractère de fin de chaine? Le c est moi ça a jamais fait bon ménage et j'en ai pas fait depuis tellement longtemps. Heureusement que ça revient avec le temps. ^^ Lien à poster
rjds 0 Posté(e) le 14 novembre 2007 Partager Posté(e) le 14 novembre 2007 et bien rien n'interdis d'avoir des chaines sans caractère de fin. tout dépend de ce que l'on fait, et de comment on le fait. certaines fonctions travaillent sans fin de chaine : la fonction bas niveau read par exemple. Si tu ouvre un descripteur de fichier sur stdin, et que fait des read, tu n'aura pas de 0 comme avec le scanf. Lien à poster
Don_Angelo 27 Posté(e) le 14 novembre 2007 Auteur Partager Posté(e) le 14 novembre 2007 Ok. Merci pour ces précisions. Je crois que je commence à bien comprendre la mécanique des pointeurs. C'est bien pratique quand on y pense. Dude76> Je crois qu'il y a pas de classe en C, et pour ce projet j'ai pas le droit d'utiliser de C++. Lien à poster
LapinGarou 0 Posté(e) le 15 novembre 2007 Partager Posté(e) le 15 novembre 2007 Tu peux toujours faire une structure, puisqu'il n'y a pas les classes... ou avec des pointeurs de fonction. (A vérifier, je ne suis pas sûr des cette astuce...) Un exemple bidon: struct MYTAB { int *pCurrent; int size; int *tab; } Mais comme le dis Dude76, une bête variable qui récupère la taille du tableau sera le plus simple, en globale (pas joli mais ça dépend si tu en auras besoin ailleurs) ou passée en paramètre à Reset(). Faut pas oublier que tu n'es pas à un concours de qui trouvera la solution ultime, il y a en a souvent plusieurs... J'adore les pointeurs, et quand j'ai affaire à un langage dans le quel il n'y en a pas, j'ai un peu de mal. (Heureusement qu'en C# ils sont là ) Lien à poster
stormbringer 0 Posté(e) le 15 novembre 2007 Partager Posté(e) le 15 novembre 2007 Le plus rigolo c'est quand on s'attaque à faire des pointeurs sur des pointeurs... Les développeurs qui y ont touché, s'ils veulent bien en dire un mot Lien à poster
Dude76 19 Posté(e) le 15 novembre 2007 Partager Posté(e) le 15 novembre 2007 Je me suis littéralement éclaté avec les pointeurs de pointeurs (des matrices quoi ), j'ai adoré les listes chaînées (qui peuvent fournir une implémentation de tableau dynamique, de file, de pile, etc), doubles chaînées (permet précédent-suivant sans avoir à chercher ) voir plus (représentation d'un gantt assez particluier ), les arbres binaires, équilibrés, bi-colores, ... et les graphes ^^ Tout en C/C++. Don Angelo: wé je le sais bien qu'il n'y a pas de classes en C, c'est pourquoi j'ai commencé par parler de structures, dans lesquelles tu peut définir des variables membres mais aussi des méthodes (un peu comme une classe entièrement publique). rjds: tu as tout à fait raison pour les chaînes sans '0', j'ai omis cette possibilité (oups :sorry ). Une chaîne de texte se termine toujours par '0', même vide (pas un flux hein, je parle bien d'un truc "blablabla" ) Diantre, une éternité que j'ai pas fait de C/C++ :lol Haaa C#... Lien à poster
Messages recommandés