cosmobob
Messages postés700Date d'inscriptionmardi 30 décembre 2003StatutMembreDernière intervention27 janvier 2009
-
9 août 2004 à 01:04
longshot41
Messages postés17Date d'inscriptionlundi 28 février 2005StatutMembreDernière intervention14 janvier 2021
-
24 avril 2007 à 13:47
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
longshot41
Messages postés17Date d'inscriptionlundi 28 février 2005StatutMembreDernière intervention14 janvier 2021 24 avril 2007 à 13:47
De mon coter, ce que j'ai compris des pointeurs, en gros c'est ça.
Une variable c'est une sorte de boite que l'on va remplire, mais dont le contenu est accessible uniquement dans la fonction qui l'initialize le tout est stocker dans une partie de la mémoire.
Faire un poiteur c'est donner directement les coordonées de la partie de la mémoire ou ce trouve stocké le contenu de la variable.
Donc on passe cette adresse aux fonctions qui vont directement modifier la mémoire. (c'est quand même assez dangereux comme truc quand on y pense, mais c'est absolument génial !!!)
Voilà, j'espère avoir expliqué juste, ça peut aidé certainement quelques personnes qui n'avait pas compris ça. Faut dire que dans les livres, c'est pas tellement expliqué, on te dit juste fais ça comme ça, et tu ne comprends rien, tu ne fait qu'appliquer.
longshot41
Messages postés17Date d'inscriptionlundi 28 février 2005StatutMembreDernière intervention14 janvier 2021 24 avril 2007 à 13:37
Et à la place des If elseif... un switch ne serait pas plus approprié?
Mais je trouve cool déjà le code que tu as "pondu" pour un début, je ne pense pas que j'en serais capable pour le moment.
Et c'est cool de le publier ainsi que les critiques utiles des autres programmeurs
longshot41
Messages postés17Date d'inscriptionlundi 28 février 2005StatutMembreDernière intervention14 janvier 2021 24 avril 2007 à 13:34
cs_djl
Messages postés3011Date d'inscriptionjeudi 26 septembre 2002StatutMembreDernière intervention27 novembre 20047 10 août 2004 à 16:35
tu vois, le mieux c'est d'apprendre avec un bouquin car le c comprend beaucoup de mythe :D
cs_Kirua
Messages postés3006Date d'inscriptiondimanche 14 avril 2002StatutMembreDernière intervention31 décembre 2008 10 août 2004 à 16:33
mince, j'ai en effet 7 octets pour str1 et les 4 octets d'une adresse pour str2, eh beh... si jm'étais douté! ^^ merci d'avoir eu la patience de m'expliquer, me voilà devant le fait ^^ merci bcp :)
cs_djl
Messages postés3011Date d'inscriptionjeudi 26 septembre 2002StatutMembreDernière intervention27 novembre 20047 10 août 2004 à 16:25
et ben c'est faux, str1 est un tableau, c'est une constante contenant l'adresse de sont premier element, c'est bien sur une l-value
quand tu passe un tableau en parametre, son adresse est copié dans un pointeur
cs_Kirua
Messages postés3006Date d'inscriptiondimanche 14 avril 2002StatutMembreDernière intervention31 décembre 2008 10 août 2004 à 16:20
mais... ça existe pas les tableaux en C, si ?? par exemple, tu pourras jamais passer un tableau en paramètre, c'est tjs un pointeur vers un "tableau", ce qui est en fait juste une zone mémoire. tu passes tjs un pointeur vers le premier élément du tableau, et éventuellement le nb d'éléments qu'il contient.
dans les deux cas, j'ai bien une adresse, donc str1 autant que str2 est un pointeur. tableau ça existe pas, en tt cas c'est ce qu'on me bourre ds le crane depuis tjs.
cs_djl
Messages postés3011Date d'inscriptionjeudi 26 septembre 2002StatutMembreDernière intervention27 novembre 20047 10 août 2004 à 16:07
non, un pointeur et un tableau sont deux choses differentes
cs_Kirua
Messages postés3006Date d'inscriptiondimanche 14 avril 2002StatutMembreDernière intervention31 décembre 2008 10 août 2004 à 16:06
ça répond pas à ma question, est-ce que ça:
char *str = "sdfdsf";
c'est équivalent à ça:
char str[] = "sdfdsf";
?
cs_djl
Messages postés3011Date d'inscriptionjeudi 26 septembre 2002StatutMembreDernière intervention27 novembre 20047 10 août 2004 à 16:02
const char *str = "ohojhjhjk";
str est un pointeur contenant l'adresse du tableau de caractere static contenant la chaine "ohojhjhjk", le const c'est parce que le standard ne peus pas assurer que cette chaine soit placer dans une zone en lecture seul
char str[] = "ohojhjhjk";
str est un tableau local initialiser avec la chaine litteral "ohojhjhjk"
cs_Kirua
Messages postés3006Date d'inscriptiondimanche 14 avril 2002StatutMembreDernière intervention31 décembre 2008 10 août 2004 à 15:56
ben la différence c'est le const, ça change rien de mettre * ou [], ou bien j'ai encore rien compris (??).
j'aurais pas dû utiliser les <string> tout de suite, finalement j'ai loupé une partie de mon apprentissage :/
cs_djl
Messages postés3011Date d'inscriptionjeudi 26 septembre 2002StatutMembreDernière intervention27 novembre 20047 10 août 2004 à 15:53
const int a = 5; //restera
rien du tout, const n'a aucune repercution dans le code généré, c'est just une "securité" du compilateur, libre à toi de l'utiliser, ca ne changera rien
je comprend pas l'interet de ces exemples, mais tu a comprisla diffrenece entre
char str[] = "ohojhjhjk";
et
const char *str = "ohojhjhjk";
?
et pour quoi du dis ca ?
"ça n'a rien à voir avec les chaînes littérales."
cs_Kirua
Messages postés3006Date d'inscriptiondimanche 14 avril 2002StatutMembreDernière intervention31 décembre 2008 10 août 2004 à 15:46
c'est ridicul de changer le * et le [].
void foo()
{
const int a = 5; //restera
//de même que:
static int b = 5; //mais c'est pas pareil, b est variable, c'est juste que sa valeur reste au prochain appel de la fonction, alors que pour a, c'est en dur dans l'exécutable.
}
void bar()
{
int a = 5; sera détruit lorsqu'on sortira de sa portée, càd de la fonction
}
ça n'a rien à voir avec les chaînes littérales.
cs_djl
Messages postés3011Date d'inscriptionjeudi 26 septembre 2002StatutMembreDernière intervention27 novembre 20047 10 août 2004 à 15:41
str contient l'adresse d'un tableau static de caractere, ce qui est absurde c'est de croire que ce tableau sera detruit, tu crois qua lea chaine litteral "ohojhjhjk" tombe du ciel ?
par contre
void func()
{
char str[] = "ohojhjhjk";
...
}
str est un tableau de caractere dont la duree de vie est celle de l'appel de la fonction (et meurt donc avec)
cs_Kirua
Messages postés3006Date d'inscriptiondimanche 14 avril 2002StatutMembreDernière intervention31 décembre 2008 10 août 2004 à 15:36
tu veux dire que" le tableau ne meurt pas à la fin de l'exécution de la fonction? ce serait absurde!
cs_djl
Messages postés3011Date d'inscriptionjeudi 26 septembre 2002StatutMembreDernière intervention27 novembre 20047 10 août 2004 à 15:28
c'est un tableau static de caractere non modifiable, sa durrée de vie est celle du programme (c'est en dur) et donc pas un tableau crée pour l'usage immediat
cs_Kirua
Messages postés3006Date d'inscriptiondimanche 14 avril 2002StatutMembreDernière intervention31 décembre 2008 10 août 2004 à 15:16
mais cette chaîne elle est crée avant d'en retourner l'adresse, et une chaîne c'est un tableau, non (??)
cs_djl
Messages postés3011Date d'inscriptionjeudi 26 septembre 2002StatutMembreDernière intervention27 novembre 20047 10 août 2004 à 14:22
surtout pas, c'est un pointeur sur l'adresse du la chaine litterale qui est crée, pas un tableau
cs_Kirua
Messages postés3006Date d'inscriptiondimanche 14 avril 2002StatutMembreDernière intervention31 décembre 2008 10 août 2004 à 14:09
djl, ça veut qd même dire qu'un tableau est créé en mémoire pour l'usage immédiat. de la même façon que quand tu passes un argument par valeur, la valeur passée est créée en mémoire (dans la pile je suppose, mais là je vais pas me prononcer).
DeAtHCrAsH
Messages postés2670Date d'inscriptionvendredi 25 janvier 2002StatutMembreDernière intervention 6 février 2013 10 août 2004 à 11:24
Pour comparer 2 chaines ya strcmp() en C qui le fait.
Sinon tu peux te créer ta propre fonction compare tes deux chaines éléments par éléments.
Mais bon comme la dis djl, ya un problème d'incompréhension des pointeurs et tableau.
Shell
cs_djl
Messages postés3011Date d'inscriptionjeudi 26 septembre 2002StatutMembreDernière intervention27 novembre 20047 10 août 2004 à 09:51
"dir" est une chaine litterale et est donc l'adresse de cette chaine en zone statique, mais ca ne change rien au fait que ce soit faux et que ca cache un gros probleme de comprehension des pointeurs et tableaux
cs_Kirua
Messages postés3006Date d'inscriptiondimanche 14 avril 2002StatutMembreDernière intervention31 décembre 2008 10 août 2004 à 02:37
snip8 tu peux pas faire tmp == "dir", c'est faux.
tmp est un pointeur sur un tableau de caractères, et "dir" retournera un pointeur sur un tableau créé temporairement. ça ne peut pas être la même adresse, donc ce sera tjs faux.
cs_ekinoks
Messages postés139Date d'inscriptionlundi 7 janvier 2002StatutMembreDernière intervention15 novembre 2005 10 août 2004 à 02:21
snip8 > effectivement il y a pas mal de truck dont je doit faire la corection maintenent que tu le dit ^^ ...
par contre pour la fonction dir... je ne peu ni utilisé :
if(tmp == "dir")
car j'ai rajouté une option que MS-DOS ne le fait pas en filtant la recherche... un "dir *.exe" afficheré tout les .exe du repertoir dans le quel on se trouve...
Ni utiliser :
if(tmp[0] == 'd' && tmp[1] == 'i' && tmp[2] == 'r' && tmp[3] == '\0')
sur la fonction dir, car l'utilisateur peu faire un "dir" pour affichier tout les fichiers/dossiers sans exeption. par contre pour les autre fonction, je pence qu'il serait plus judicieu d'utilisé l'une des ces deux fonction ;)
Merci pour tes remarques, je fairais une corection demain en y prennent compte .
snip8
Messages postés12Date d'inscriptionsamedi 31 juillet 2004StatutMembreDernière intervention11 août 2004 9 août 2004 à 18:38
Dans le main(), pourquoi ne pas utiliser :
if(tmp == "dir")
car si l'utilisayeur tappe "direction" par exmple sa passe dans la fonction.
Ou alors tu mets :
if(tmp[0] == 'd' && tmp[1] == 'i' && tmp[2] == 'r' && tmp[3] == '\0')
mais c'est quand même plus propre :
if(tmp == "dir")
Pour rester dans les if du main() :
if(!strcmp(tmp, "exit"))
piur quoi utiliser strcmp() ici alors qu'avant tu compare chaque case du tableau ?
Le mieux c'est encore :
if(tmp == "exit")
l'avantage c'est que tu n'as pas besoin d'appeler une fonction. Enfin c'est à toi de voir, mais soit coérant an adoptant une convention pour que ton code soit plus simple à lire.
A ce propos lorsque tu as un if inutile de mettre des acolades pour une intruction :
if(condition)
action1;
else
action2;
Lorsque tu n'as pas besoin des acolades autant les éviter, sa rend plus difficile la lecture du code.
Toujours dans le main() puisque tu fais une boucle infinie et que tu ne passes jamais au return 0, au lieu de : int main(int argc, char *argv[]),
void main(int argc, char *argv[])
et tu enlève le return 0.
Dans dir() à la place de dir(char *d2, char tmpcd[30]) :
void dir(char *d2, char tmpcd[])
ou
dir(char *d2, char *tmpcd)
parait plus adapté.
Sinon sa m'a l'air plutot pas mal.
Bonne continuation.
cs_ekinoks
Messages postés139Date d'inscriptionlundi 7 janvier 2002StatutMembreDernière intervention15 novembre 2005 9 août 2004 à 16:27
ha ! ok je ne savais pas tout cela, je vais sur le champs corriger c'est erreur ;)
merci de me l'avoir fait remarqué
cs_djl
Messages postés3011Date d'inscriptionjeudi 26 septembre 2002StatutMembreDernière intervention27 novembre 20047 9 août 2004 à 02:27
quand tu met pa de type retour, ta fonction retourne un int par defaut (type implicite) et à la fin de ta fonction tu retourne rien (void), si tu active les warning, le compilo gueule
cosmobob
Messages postés700Date d'inscriptionmardi 30 décembre 2003StatutMembreDernière intervention27 janvier 20094 9 août 2004 à 01:04
Une convention en C/C++ est que les fichiers .h ne contiennent que les entetes des fonctions donc on veut se servir dans les .c ou les .cpp et non les fonctions completes ! (sinon ca genere une erreur lorsque tu essaies d'inclure le meme .h dans deux fichiers .c ou .cpp du meme projet). Les fonctions completes se trouvent dans d'autres .c ou .cpp.
Meme si en C c'est accepté, mieux vaut toujours mettre un type de retour pour tes fonctions ou procédures, quitte a mettre 'void' (tu le fais pas pour 'dir(char *d2, char tmpcd[30])' par ex, et d'autres encore ...)
Et sinon quand tu décris ta source, tu pourrais eviter de faire des fautes d'orthographe!!
24 avril 2007 à 13:47
Une variable c'est une sorte de boite que l'on va remplire, mais dont le contenu est accessible uniquement dans la fonction qui l'initialize le tout est stocker dans une partie de la mémoire.
Faire un poiteur c'est donner directement les coordonées de la partie de la mémoire ou ce trouve stocké le contenu de la variable.
Donc on passe cette adresse aux fonctions qui vont directement modifier la mémoire. (c'est quand même assez dangereux comme truc quand on y pense, mais c'est absolument génial !!!)
Voilà, j'espère avoir expliqué juste, ça peut aidé certainement quelques personnes qui n'avait pas compris ça. Faut dire que dans les livres, c'est pas tellement expliqué, on te dit juste fais ça comme ça, et tu ne comprends rien, tu ne fait qu'appliquer.
24 avril 2007 à 13:37
Mais je trouve cool déjà le code que tu as "pondu" pour un début, je ne pense pas que j'en serais capable pour le moment.
Et c'est cool de le publier ainsi que les critiques utiles des autres programmeurs
24 avril 2007 à 13:34
http://www.siteduzero.com/tuto-3-8-0-apprenez-a-programmer-en-c-c.html?sesid=132dcf68c08800e9fd994ca9459bd3ef38595396&sesmid=-407
Je débute totalement, mais dans ce que je lit, j'ai l'impression qu'il y a pas mal de mélange entre le C et le C++ ??
10 août 2004 à 16:35
10 août 2004 à 16:33
10 août 2004 à 16:25
str2 est un pointeur...
char str1[] = "blabla";
cout << sizeof str1 << '\n';
char *str2 = "blabla";
cout << sizeof str2 << '\n';
quand tu passe un tableau en parametre, son adresse est copié dans un pointeur
10 août 2004 à 16:20
j'viens de coder ça juste pour voir:
char str1[] = "blabla";
cout << (void*)str1 << endl;
char *str2 = "blabla";
cout << (void*)str2 << endl;
dans les deux cas, j'ai bien une adresse, donc str1 autant que str2 est un pointeur. tableau ça existe pas, en tt cas c'est ce qu'on me bourre ds le crane depuis tjs.
10 août 2004 à 16:07
10 août 2004 à 16:06
char *str = "sdfdsf";
c'est équivalent à ça:
char str[] = "sdfdsf";
?
10 août 2004 à 16:02
str est un pointeur contenant l'adresse du tableau de caractere static contenant la chaine "ohojhjhjk", le const c'est parce que le standard ne peus pas assurer que cette chaine soit placer dans une zone en lecture seul
char str[] = "ohojhjhjk";
str est un tableau local initialiser avec la chaine litteral "ohojhjhjk"
10 août 2004 à 15:56
j'aurais pas dû utiliser les <string> tout de suite, finalement j'ai loupé une partie de mon apprentissage :/
10 août 2004 à 15:53
rien du tout, const n'a aucune repercution dans le code généré, c'est just une "securité" du compilateur, libre à toi de l'utiliser, ca ne changera rien
je comprend pas l'interet de ces exemples, mais tu a comprisla diffrenece entre
char str[] = "ohojhjhjk";
et
const char *str = "ohojhjhjk";
?
et pour quoi du dis ca ?
"ça n'a rien à voir avec les chaînes littérales."
10 août 2004 à 15:46
void foo()
{
const int a = 5; //restera
//de même que:
static int b = 5; //mais c'est pas pareil, b est variable, c'est juste que sa valeur reste au prochain appel de la fonction, alors que pour a, c'est en dur dans l'exécutable.
}
void bar()
{
int a = 5; sera détruit lorsqu'on sortira de sa portée, càd de la fonction
}
ça n'a rien à voir avec les chaînes littérales.
10 août 2004 à 15:41
{
const char *str = "ohojhjhjk";
....
}
str contient l'adresse d'un tableau static de caractere, ce qui est absurde c'est de croire que ce tableau sera detruit, tu crois qua lea chaine litteral "ohojhjhjk" tombe du ciel ?
par contre
void func()
{
char str[] = "ohojhjhjk";
...
}
str est un tableau de caractere dont la duree de vie est celle de l'appel de la fonction (et meurt donc avec)
10 août 2004 à 15:36
10 août 2004 à 15:28
10 août 2004 à 15:16
10 août 2004 à 14:22
10 août 2004 à 14:09
10 août 2004 à 11:24
Sinon tu peux te créer ta propre fonction compare tes deux chaines éléments par éléments.
Mais bon comme la dis djl, ya un problème d'incompréhension des pointeurs et tableau.
Shell
10 août 2004 à 09:51
10 août 2004 à 02:37
tmp est un pointeur sur un tableau de caractères, et "dir" retournera un pointeur sur un tableau créé temporairement. ça ne peut pas être la même adresse, donc ce sera tjs faux.
10 août 2004 à 02:21
par contre pour la fonction dir... je ne peu ni utilisé :
if(tmp == "dir")
car j'ai rajouté une option que MS-DOS ne le fait pas en filtant la recherche... un "dir *.exe" afficheré tout les .exe du repertoir dans le quel on se trouve...
Ni utiliser :
if(tmp[0] == 'd' && tmp[1] == 'i' && tmp[2] == 'r' && tmp[3] == '\0')
sur la fonction dir, car l'utilisateur peu faire un "dir" pour affichier tout les fichiers/dossiers sans exeption. par contre pour les autre fonction, je pence qu'il serait plus judicieu d'utilisé l'une des ces deux fonction ;)
Merci pour tes remarques, je fairais une corection demain en y prennent compte .
9 août 2004 à 18:38
if(tmp == "dir")
car si l'utilisayeur tappe "direction" par exmple sa passe dans la fonction.
Ou alors tu mets :
if(tmp[0] == 'd' && tmp[1] == 'i' && tmp[2] == 'r' && tmp[3] == '\0')
mais c'est quand même plus propre :
if(tmp == "dir")
Pour rester dans les if du main() :
if(!strcmp(tmp, "exit"))
piur quoi utiliser strcmp() ici alors qu'avant tu compare chaque case du tableau ?
Le mieux c'est encore :
if(tmp == "exit")
l'avantage c'est que tu n'as pas besoin d'appeler une fonction. Enfin c'est à toi de voir, mais soit coérant an adoptant une convention pour que ton code soit plus simple à lire.
A ce propos lorsque tu as un if inutile de mettre des acolades pour une intruction :
if(condition)
action1;
else
action2;
Lorsque tu n'as pas besoin des acolades autant les éviter, sa rend plus difficile la lecture du code.
Toujours dans le main() puisque tu fais une boucle infinie et que tu ne passes jamais au return 0, au lieu de : int main(int argc, char *argv[]),
void main(int argc, char *argv[])
et tu enlève le return 0.
Dans dir() à la place de dir(char *d2, char tmpcd[30]) :
void dir(char *d2, char tmpcd[])
ou
dir(char *d2, char *tmpcd)
parait plus adapté.
Sinon sa m'a l'air plutot pas mal.
Bonne continuation.
9 août 2004 à 16:27
merci de me l'avoir fait remarqué
9 août 2004 à 02:27
9 août 2004 à 01:04
Meme si en C c'est accepté, mieux vaut toujours mettre un type de retour pour tes fonctions ou procédures, quitte a mettre 'void' (tu le fais pas pour 'dir(char *d2, char tmpcd[30])' par ex, et d'autres encore ...)
Et sinon quand tu décris ta source, tu pourrais eviter de faire des fautes d'orthographe!!
a+, continue bien ;)