Aller au contenu

[C]Tableaux


Don_Angelo

Messages recommandés

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

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

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 :D

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

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

Il t'a pas dit return 0 mais return tab, c'est à dire ton pointeur, la référence à ton tableau :p

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 :D

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 :D ).

à 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 :p

édit: grilled by rjds ^^

Lien à poster

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

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

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... :p

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à :D)

Lien à poster

Je me suis littéralement éclaté avec les pointeurs de pointeurs (des matrices quoi :p ), 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 :D ) voir plus (représentation d'un gantt assez particluier :p ), 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" :D )

Diantre, une éternité que j'ai pas fait de C/C++ :lol

Haaa C#... :p

Lien à poster
×
×
  • Créer...