PETITE CONSOL

cosmobob
Messages postés
700
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
- 9 août 2004 à 01:04
longshot41
Messages postés
17
Date d'inscription
lundi 28 février 2005
Statut
Membre
Dernière intervention
14 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.

https://codes-sources.commentcamarche.net/source/25266-petite-consol

longshot41
Messages postés
17
Date d'inscription
lundi 28 février 2005
Statut
Membre
Dernière intervention
14 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és
17
Date d'inscription
lundi 28 février 2005
Statut
Membre
Dernière intervention
14 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és
17
Date d'inscription
lundi 28 février 2005
Statut
Membre
Dernière intervention
14 janvier 2021

24 avril 2007 à 13:34
Très bon site d'apprentissage du C/C++
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++ ??
cs_djl
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
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és
3006
Date d'inscription
dimanche 14 avril 2002
Statut
Membre
Dernière intervention
31 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és
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
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

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
cs_Kirua
Messages postés
3006
Date d'inscription
dimanche 14 avril 2002
Statut
Membre
Dernière intervention
31 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.

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.
cs_djl
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
10 août 2004 à 16:07
non, un pointeur et un tableau sont deux choses differentes
cs_Kirua
Messages postés
3006
Date d'inscription
dimanche 14 avril 2002
Statut
Membre
Dernière intervention
31 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és
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
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és
3006
Date d'inscription
dimanche 14 avril 2002
Statut
Membre
Dernière intervention
31 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és
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
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és
3006
Date d'inscription
dimanche 14 avril 2002
Statut
Membre
Dernière intervention
31 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és
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
10 août 2004 à 15:41
void func()
{
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)
cs_Kirua
Messages postés
3006
Date d'inscription
dimanche 14 avril 2002
Statut
Membre
Dernière intervention
31 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és
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
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és
3006
Date d'inscription
dimanche 14 avril 2002
Statut
Membre
Dernière intervention
31 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és
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
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és
3006
Date d'inscription
dimanche 14 avril 2002
Statut
Membre
Dernière intervention
31 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és
2670
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Derniè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és
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
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és
3006
Date d'inscription
dimanche 14 avril 2002
Statut
Membre
Dernière intervention
31 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és
139
Date d'inscription
lundi 7 janvier 2002
Statut
Membre
Dernière intervention
15 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és
12
Date d'inscription
samedi 31 juillet 2004
Statut
Membre
Dernière intervention
11 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és
139
Date d'inscription
lundi 7 janvier 2002
Statut
Membre
Dernière intervention
15 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és
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
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és
700
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
4
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!!

a+, continue bien ;)