Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

transmettre chaines de caracteres en C-ANSI

74 réponses
Avatar
Salut à tous, je souhaiterais transmettre un tableau de chaines de
caracteres d'une fonction à une autre. comment faire ?

Merci d'avance
Nico

PS : si je suis sur le mauvais forum, merci de m'en indiquer un qui
correspondrait mieux à ma question. :-)

10 réponses

1 2 3 4 5
Avatar
AMcD®
Cours de C. Chapitre Tableaux. Sous-chapitre. Pointeurs de tableaux.

--
AMcD®

http://arnold.mcdonald.free.fr/
Avatar
Vincent Burel
"AMcD®" wrote in message
news:424ed7c9$0$15099$
Cours de C. Chapitre Tableaux. Sous-chapitre. Pointeurs de tableaux.



y'a pas de tableau en "C" , y'a des pointeur typés avec possibilité
d'accrocher un indice, mais y'a pas de variable de type tableau. Donc y'a
pas de chapitre tableau dans une cours de "C". (Attention j'adore ce troll
::-)

Par contre pour "pointeur de chaine de caractère", oui ! doit y avoir un
chapitre :-)

VB
Avatar
Matt
Vincent Burel a écrit :
"AMcD®" wrote in message
news:424ed7c9$0$15099$

Cours de C. Chapitre Tableaux. Sous-chapitre. Pointeurs de tableaux.




y'a pas de tableau en "C"



C'est nouveau ça !!!

Matt...
Avatar
Matt
none a écrit :
Salut à tous, je souhaiterais transmettre un tableau de chaines de
caracteres d'une fonction à une autre. comment faire ?

Merci d'avance
Nico

PS : si je suis sur le mauvais forum, merci de m'en indiquer un qui
correspondrait mieux à ma question. :-)




Bonsoir,

#include <stdio.h>

void fonction2(int *titi, size_t taille)
{
size_t i;

printf("Fonction 2 : Visu du tableau.n");
for(i=0; i < taille; i++)
printf("Indice %d : %dn", i, titi[i]);

return;
}

void fonction1()
{
const int taille = 10;
int toto[taille];
size_t i;

printf("Fonction 1 : Initialisation du tableau.nnn");
for(i=0; i < taille; i++)
toto[i] = (i * i);

fonction2(toto, taille);

return;
}

int main()
{
fonction1();
return 0;
}

Si ca peut d'aider,

Matt...
Avatar
AMcD®
Vincent Burel wrote:
"AMcD®" wrote in message
news:424ed7c9$0$15099$
Cours de C. Chapitre Tableaux. Sous-chapitre. Pointeurs de tableaux.



y'a pas de tableau en "C" , y'a des pointeur typés avec possibilité
d'accrocher un indice, mais y'a pas de variable de type tableau. Donc
y'a pas de chapitre tableau dans une cours de "C". (Attention j'adore
ce troll
:-)





Troll ? Hum, encore faudrait-il qu'il y ait matière à. Il y a des tableaux
en C. Pas de type tableau si tu veux, quoique typedef c'est pas non plus
pour les buses, mais bon, dans n'importe quel livre de C tu verras un
chapitre intitulé "tableaux". Dans le Delannoy, le Willms ou n'importe quel
autre, regarde au chapitre "structures de données" ou même... "tableaux".

--
AMcD®

http://arnold.mcdonald.free.fr/
Avatar
Vincent Burel
"AMcD®" wrote in message
news:424f0acb$0$15075$
Vincent Burel wrote:
> "AMcD®" wrote in message
> news:424ed7c9$0$15099$
>> Cours de C. Chapitre Tableaux. Sous-chapitre. Pointeurs de tableaux.
>
> y'a pas de tableau en "C" , y'a des pointeur typés avec possibilité
> d'accrocher un indice, mais y'a pas de variable de type tableau. Donc
> y'a pas de chapitre tableau dans une cours de "C". (Attention j'adore
> ce troll
>> :-)

Troll ? Hum, encore faudrait-il qu'il y ait matière à. Il y a des tableaux
en C. Pas de type tableau si tu veux, quoique typedef c'est pas non plus
pour les buses, mais bon, dans n'importe quel livre de C tu verras un
chapitre intitulé "tableaux". Dans le Delannoy, le Willms ou n'importe


quel
autre, regarde au chapitre "structures de données" ou même... "tableaux".



ha oui mais ca c'est parce que tu es beaucoup plus intelligent que les buses
de fr.comp.lang.c ou c++, je me rappelle de débats houleux sur le sujet :-)

VB
Avatar
AMcD®
Vincent Burel wrote:

ha oui mais ca c'est parce que tu es beaucoup plus intelligent que
les buses de fr.comp.lang.c ou c++, je me rappelle de débats houleux
sur le sujet :-)



fclc++ ! Non merci ! Je m'y suis abonné plusieurs fois dans le temps. Un
repaire de dogmatiques furieux :-). J'aime bien la précision parfois, mais
faut pas pousser tout de même. Là-bas, tu ranges une valeur dans un WORD
alors qu'un BYTE aurait suffit, t'es excommunié ! Au minimum...

--
AMcD®

http://arnold.mcdonald.free.fr/
Avatar
Stephane Legras-Decussy
Vincent Burel a écrit dans le message :
424ee33f$0$3132$
y'a pas de tableau en "C" , y'a des pointeur typés avec possibilité
d'accrocher un indice, mais y'a pas de variable de type tableau.



int tab[10];

sizeof(tab) / sizeof *(tab) donne le nombre d'élément, soit 10...

c'est pas mal pour un langage qui connait pas les tableaux...

tab n'est pas un pointeur, c'est bien un tableau, CQFD...
Avatar
Vincent Burel
"Stephane Legras-Decussy" wrote in message
news:424f588d$0$28545$

Vincent Burel a écrit dans le message :
424ee33f$0$3132$
> y'a pas de tableau en "C" , y'a des pointeur typés avec possibilité
> d'accrocher un indice, mais y'a pas de variable de type tableau.

int tab[10];

sizeof(tab) / sizeof *(tab) donne le nombre d'élément, soit 10...

c'est pas mal pour un langage qui connait pas les tableaux...

tab n'est pas un pointeur, c'est bien un tableau, CQFD...



ha ouai, y'a en encore des gens qui utilise "CQFD" sans savoir ce que cela
veut dire !

Alors Ce Qu'il Faut Démontrer :
1- tab nest pas un pointeur !? pourtant &tab = tab, et tab est utilisable en
tant que pointeur de votre liste d'élément.
2- sizeof(tab) / sizeof *(tab) !? fonctionne si tab n'est pas un argument de
fonction, si vous utilisiez sizeof avec des type plutot qu'avec des variable
vous ne vous feriez pas avoir.
3- pour que tab soit un variable de type tableau, il faudrait pouvoir la
passer par copie à une fonction.

le type suivant est un type tableau. et toute variable déclarée avec ce type
aura le même propriétés que tout autre variable.

typedef struct tagMON_TABLEAU
{
int tab[10];
} T_MON_TABLEAU, *PT_MON_TABLEAU;

Il faut faire la différence entre ce que votre compilateur vous permet de
faire et ce que vous déclarez réellement. Ce qui est une commodité
d'écriture et ce qui réellement est un type de variable.

quand vous écrivez int tab[10]; vous demander au compilo de vous allouer de
la place mémoire pour 10 int dont le premier est pointer par tab.

Et vous pouvez passez d'une écriture à l'autre sans problème, parce
qu'encore une fois la notion de tableau en "C" est une commodité d'écriture.

int tab[10];
int * p;
p=tab;
p[5]=0;

c'est pourquoi je dis qu'il n'y a pas de tableau en "C" , parce que y'a pas
de type tableau proprement dit.

VB
Avatar
Pierre Maurette
none a écrit :
Salut à tous, je souhaiterais transmettre un tableau de chaines de
caracteres d'une fonction à une autre. comment faire ?


Je reprends en partie ce qui vous a été répondu, non pas en expert mais
comme ayant tâté récemment de ces problèmes.
- Une chaîne de caractère:
char ch1[] = "bonjour";
char* ch2 = "bonjour";
Attention, ch1 est modifiable (c'est un tableau), ch2 est une chaîne
constante. Modifier un caratère dans ch1 est possible, dans ch2 c'est
interdit. Selon le compilateur, ça crashera ou pas. Si ça ne crashe pas,
ce n'estg que de la chance. Ce n'est pas votre question, mais ça peut
être utile.

- Il y a des tableaux en C. Prenons un exemple en choisissant le tableau
de pointeurs qui permet des chaînes de tailles variées:
char* jours1[] = {"lundi", "mardi", "mercredi", "jeudi"};
Il s'agit là d'un tableau de 4 pointeurs const char*. Pour initialiser
des chaînes non constantes comme ch1[], ce sera:
char* jours2[4] = {NULL};
ou
char* jours2[4] = {ch1, chx, chx, chx};
puis:
jours2[n] = ch1;

En revanche, un
char jours3[][9] = {"lundi", "mardi", "mercredi", "jeudi"};
sera un char jours3[4][9], faites:
printf("%dt%dn", sizeof jours1, sizeof jours3);
pour lire (windows, 32 bits)
16 36
jours1 est un tableau de 4 pointeurs, jours3 un tableau de 4 fois 9 char.

- Un rappel: en C, il n'y a de passage de paramètre que par valeur.
Libre au programmeur de passer un pointeur (par valeur). MAIS ...

- ... Mais il faut admettre (et non pas expliquer, on ne s'en sort pas)
une particularité des tableaux. Quand on passe un tableau à une
fonction, le compilateur passe d'autorité son pointeur. Je dis qu'il
faut admettre une certaine incohérence, parce que siu vous passez une
structure, elle sera passée par valeur. Et si le seul élément de cette
structure est un tableau, il sera passé par valeur. Regardez ce bout de
code:

void test(char* tab)
{
printf("Dans la fonction: %dn", sizeof tab);
}
.....
/* main() */
char tab[100] = {0};
printf("Dans le main(): %dn", sizeof tab);
test(tab);

pour lire (windows, 32 bits)
Dans le main(): 100
Dans la fonction: 4

Certains disent "c'est normal, parce que bla bla ...". Je préfère "c'est
troublant, mais faut faire avec".

Ça veut dire que dans un prototype de fonction, char* tab, char tab[] et
char tab[12] seront équivalents (le 12 ne sert à rien, c'est
regrettable). Dans l'appel, tab et &tab[0] seront équivalent. Il faut
retenir que la donnée "taille du tableau" ne sera pas transmise
automatiquement à la fonction. Il vous faut donc la passer "en plus" ou
la supposer connue.

Pour en revenir à votre question, comment passer un tableau de chaînes ?
Ça dépend de comment se présente le tableau. Normalement, au plus
simple, c'est un tableau à une dimension de pointeurs (constants):
char* ListeChaines[TailleListe];
C'est donc un char** qu'attend la fonction. Mais vous avez un certain
nombre de solutions, selon que les chaînes sont à taille fixe ou non (à
priori, c'est non), que le nombre de chaines est connu ou pas. Précisez
votre problème si vous voulez du code. Pour les jours de la semaine, ce
serait:

void f(char** Liste, size_t NbreChaines)
{
int i;
for(i = 0; i < NbreChaines; i++)
{
printf("%sn", Liste[i]);
}
}

(remplacer sizez_t par int ou caster si ça gueule)

Et l'appel:
char* jours1[] = {"lundi", "mardi", "mercredi", "jeudi"};
f(jours1, sizeof jours1 / sizeof (char*));

Si vous connaissez NbreChaines, c'est plus simple.



PS : si je suis sur le mauvais forum, merci de m'en indiquer un qui
correspondrait mieux à ma question. :-)


fr.comp.lang.c en ISO/ANSI C
fr.comp.lang.c++ en ISO/ANSI C++
(et ne pas confondre les deux ;-))

--
Pierre
1 2 3 4 5