Une fonction teste une expression et retourne un pointeur vers la fin de l'expression si elle est trouvée. J'aimerais qu'elle retourne en outre un pointeur vers le début de l'expression, soit deux pointeurs. Comment faire ça proprement?
Tu reçois donc un pointeur vers le début d'une chaîne de caractères (donc « char * ») et tu veux retourner deux pointeurs vers d'autres endroits de la même chaîne. Ces deux pointeurs de retour seront donc du même type que le paramètre. Évidemment, une fonction ne peux pas prendre deux valeurs différentes pour un même paramètre, donc il va falloir les encapsuler dans quelque chose d'autres. L'idée du tableau n'était donc pas mauvaise, mais ne sera pas la plus appropriée ici :
Tu ne peux pas retourner directement un tableau ni passer son contenu en paramètre parce qu'un tableau en C n'est pas à proprement parler un objet. C'est seulement l'instanciation de n variables du même type et consécutives en mémoire, ni plus ni moins. Il n'y a aucune méta-données associées qui te permette de savoir à l'exécution quelle est la taille du tableau, par exemple. Il y a donc seulement deux cas où un nom de tableau est traité comme tel : sizeof, qui te donne en octets la taille du tableau en mémoire… si elle est connue à la compilation, et l'opérateur unaire « & » qui t'en renvoie l'adresse : « tab » est alors équivalent à « &tab » et renvoie la même valeur. Dans tous les autres cas, le nom d'un tableau au sein d'une expression est développé en pointeur vers le premier élément, comme pour une chaîne de caractères (ou de n'importe quoi d'autre).
Ça veut dire que comme tu ne peux pas le transmettre directement en tant qu'objet, tu es obligé de l'allouer quelque part. Tu peux alors passer en argument un pointeur vers ce tableau pour qu'elle le remplisse. C'est ce qui se passe avec la fonction pipe(), par exemple.
Toutefois, le plus approprié ici reste la définition d'une structure : elle, est définie comme un nouveau type qui peut donner naissance à des variables. Elle contient un certain nombre de sous-variables. Ces membres sont en nombre fixe mais c'est bien le cas dans la situation qui t'occupe. Donc :
En dehors des usages triviaux, j'ai encore beaucoup de mal avec les pointeurs, aussi, la résolution de ce petit problème m'aiderait beaucoup.
Ben là, c'est un problème très particulier qui t'oblige en plus à suivre plusieurs lièvres à la fois. Donc clairement pas ce qu'il y a de plus didactique.
Pour commencer, et pour t'aider avec les pointeurs, as-tu une idée claire de ce qu'est une adresse mémoire ou pas ?
# Structure
Posté par Obsidian . En réponse au message retourner un pointeur vers un tableau de pointeurs. Évalué à 6.
Tu reçois donc un pointeur vers le début d'une chaîne de caractères (donc « char * ») et tu veux retourner deux pointeurs vers d'autres endroits de la même chaîne. Ces deux pointeurs de retour seront donc du même type que le paramètre. Évidemment, une fonction ne peux pas prendre deux valeurs différentes pour un même paramètre, donc il va falloir les encapsuler dans quelque chose d'autres. L'idée du tableau n'était donc pas mauvaise, mais ne sera pas la plus appropriée ici :
Tu ne peux pas retourner directement un tableau ni passer son contenu en paramètre parce qu'un tableau en C n'est pas à proprement parler un objet. C'est seulement l'instanciation de n variables du même type et consécutives en mémoire, ni plus ni moins. Il n'y a aucune méta-données associées qui te permette de savoir à l'exécution quelle est la taille du tableau, par exemple. Il y a donc seulement deux cas où un nom de tableau est traité comme tel : sizeof, qui te donne en octets la taille du tableau en mémoire… si elle est connue à la compilation, et l'opérateur unaire « & » qui t'en renvoie l'adresse : « tab » est alors équivalent à « &tab » et renvoie la même valeur. Dans tous les autres cas, le nom d'un tableau au sein d'une expression est développé en pointeur vers le premier élément, comme pour une chaîne de caractères (ou de n'importe quoi d'autre).
Ça veut dire que comme tu ne peux pas le transmettre directement en tant qu'objet, tu es obligé de l'allouer quelque part. Tu peux alors passer en argument un pointeur vers ce tableau pour qu'elle le remplisse. C'est ce qui se passe avec la fonction pipe(), par exemple.
Toutefois, le plus approprié ici reste la définition d'une structure : elle, est définie comme un nouveau type qui peut donner naissance à des variables. Elle contient un certain nombre de sous-variables. Ces membres sont en nombre fixe mais c'est bien le cas dans la situation qui t'occupe. Donc :
Ben là, c'est un problème très particulier qui t'oblige en plus à suivre plusieurs lièvres à la fois. Donc clairement pas ce qu'il y a de plus didactique.
Pour commencer, et pour t'aider avec les pointeurs, as-tu une idée claire de ce qu'est une adresse mémoire ou pas ?