Home Forums Wiki Doc Install Extras Screenshots IRC Projects Blog Users Groups Register
Glx-Dock / Cairo-Dock List of forums Cairo-Dock cafe | Café Cairo-Dock Le post dédié à l' apprentissage du C
The latest stable release is the *3.2.1* : How to install it here.
Cairo-Dock cafe | Café Cairo-Dock

Subjects Author Language Messages Last message
Le post dédié à l' apprentissage du C
Page : 1 2 3 4 ...18 19 20
nochka85 Français 388 nochka85 [Read]
24 January 2010 à 19:27

nochka85, Saturday 27 September 2008 à 17:27


Subscription date : 29 November 2007
Messages : 7420
Exemple :
toto (à ladresse 0x123AB) pointe vers titi (à l'adresse 0xAB123)

&toto => 0x123AB
*toto => 0xAB123


(Ou un truc du genre, je confonds souvent & et *, mais ça doit être ça)


D'après ce que j'ai compris, c'est plutôt (si titi = 25 par exemple) :

&titi = 0xAB123
titi = 25
&toto = Ox123AB <- Mon pointeur vers titi
toto = &titi = 0xAB123
*toto = 25


... ou alors j'ai rien compris

Sincèrement, je vois pas d'intérêt à cette exercice, si tu code des applets tu ne va jamais "voir" les adresses de pointeurs que tu utilise. Et je crois que c'est %x pour afficher une adresse de variable en hexa.


En fait, c'était pas dans un exercice, mais juste pour information ... le truc, c'est que je ne comprends pas trop pourquoi cela ne marche pas chez moi (sauf pour l'hexa du coup <- Maintenant que je sais que l'adresse est APRES le 0x ) avec %ld alors que sur le tuto, oui

Jackass059, Saturday 27 September 2008 à 19:34


Subscription date : 08 February 2008
Messages : 163
heu, pour ton ld ça semble fonctionner, l'adresse telle qu'elle est mapée en mémoire, est pas franchement déchiffrable pour nous humains ^^.
J'ai pas tenté la conversion hex -> déc, mais on peut avoir des nombres signés en héxa, donc ça me surprend pas comme résultat .

Pour les &, * je confonds toujours, mais le & ne sert pratiquement jamais, donc c'est soit * soit rien ce qui restreint les choix.
Autre chose utile à savoir, le seg fault (erreur de segmentation) vient (toujours?) d'un pointeur

[edit]
Et les pointeurs servent très souvent pour les chaînes de caractères (type qui n'existe pas en C).
Soit on utilise un tableau de char (lorsqu'on connaît la taille de la chaîne) quitte à utiliser un malloc - realloc, soit un pointeur de char (char *) qui nous permet de créer un tableau de caractères (et donc une chaîne ).

nochka85, Saturday 27 September 2008 à 20:59


Subscription date : 29 November 2007
Messages : 7420
Autre chose utile à savoir, le seg fault (erreur de segmentation) vient (toujours?) d'un pointeur


Je m'en suis déjà rendu compte avec les tableaux -> Quelle idée de commencer à compter à 0 ??

Et les pointeurs servent très souvent pour les chaînes de caractères (type qui n'existe pas en C). Soit on utilise un tableau de char...quitte à utiliser un malloc - realloc, ...

Pour les chaînes de caractères (je suis en plein dedans), je pense avoir compris le truc .... par contre, le malloc et le realloc me font plus penser à un médicament contre les maux d'estomac pour l'instant

nochka85, Saturday 27 September 2008 à 22:54


Subscription date : 29 November 2007
Messages : 7420
Euh une petite question sûrement très "con" : Pourquoi dans tous les tutos du Zéro que je fais jusqu'à présent, le "main" contient tout le temps "int main(int argc, char *argv[])" alors que mon IDE (Code::Blocks) me génère un fichier de départ avec seulement "int main()" (donc sans argument entre les parenthèses) ??? <- Et pourtant, les 2 marchent très bien

Ouranos999, Sunday 28 September 2008 à 00:28


Subscription date : 29 April 2008
Messages : 106
L'autre nuit j'ai rêvé que j'étais une référence, et que je devais aller à mon adresse définie, en évitant les tirs des space invaders sur le côté ( ), et pis d'un seul coup y z'ont sorti leur chef, qui me barrait la route. Il m'a tiré dessus et....

Segmentation Fault

Jackass059, Sunday 28 September 2008 à 00:54


Subscription date : 08 February 2008
Messages : 163
nochka85 :
Euh une petite question sûrement très "con" : Pourquoi dans tous les tutos du Zéro que je fais jusqu'à présent, le "main" contient tout le temps "int main(int argc, char *argv[])" alors que mon IDE (Code::Blocks) me génère un fichier de départ avec seulement "int main()" (donc sans argument entre les parenthèses) ??? <- Et pourtant, les 2 marchent très bien


Parce qu'il existe 2 déclarations pour le main :

int main 
(void)

et 

int main 
(int argcchar **argv)

(
char ** == char[] *)


sachant que argc contient le nombre de paramètres fournis à ton programme et argv le tableau des paramètres avec à l'indice 0 l'appel du dit programme (par exemple ./mon_prog)

Par contre, je sais plus si argc est toujours >= 1

nochka85, Sunday 28 September 2008 à 01:35


Subscription date : 29 November 2007
Messages : 7420
Parce qu'il existe 2 déclarations pour le main :

int main (void)

et

int main (int argc, char argv)

(char
== char[] *)

sachant que argc contient le nombre de paramètres fournis à ton programme et argv le tableau des paramètres avec à l'indice 0 l'appel du dit programme (par exemple ./mon_prog)

Par contre, je sais plus si argc est toujours >= 1


J'ai pas compris .... et pourquoi avec main() cela marche tout de même si il n'y a que 2 type de déclaration de main ???? -> Bref, faut mettre quoi pour être "puriste" ?

Mav, Sunday 28 September 2008 à 02:59


Subscription date : 29 November 2007
Messages : 3145
main () gère un programme tout bête alors que main (argc, argv) gère des arguments en entrée (exemple : cairo-dock -o )

fabounet, Sunday 28 September 2008 à 04:30


Subscription date : 30 November 2007
Messages : 16693
c'est très simple en fait, je te fais un résumé :

double x=0;
x <=> sa valeur
&x <=> son adresse en mémoire.

double *y=NULL;
y <=> l'adresse (un emplacement en mémoire)
  • y <=> la valeur contenue à cette adresse

&y <=> l'adresse de l'adresse

si tu fais f(x) tu passeras 0 à la fonction sans toucher à x
si tu fais g(y) tu passeras l'adresse à la focntion, qui donc pourra aller écrire en mémoire à cette adresse, pour modifier la valeur de y.

les tableaux ou les chaînes sont des pointeurs car c'est l'adresse du 1er élément (les autres sont après à la queue-leu-leu)

nochka85, Sunday 28 September 2008 à 11:38


Subscription date : 29 November 2007
Messages : 7420
Là j'ai tout compris ! .... sauf peut être :

si tu fais f(x) tu passeras 0 à la fonction sans toucher à x
si tu fais g(y) tu passeras l'adresse à la focntion, qui donc pourra aller écrire en mémoire à cette adresse, pour modifier la valeur de y.


... j'ai pas encore du arriver à çà

nochka85, Sunday 28 September 2008 à 15:32


Subscription date : 29 November 2007
Messages : 7420
J'ai un petit problème que je ne comprends pas :

J'ai créé une variable struct nommée Personne :

typedef struct Personne Personne;
struct Personne
{
char nom[100];
char prenom[100];
char adresse[1000];

long age;
long garcon; // Booléen : 1 = garçon, 0 = fille

};

Pour initialiser les différentes variables qu'elle contient, je me suis créé une fonction void :

void initialiserPersonne(Personne* personne)
{
sprintf((*personne).nom, " nom vide ");
sprintf((*personne).prenom, " prenom vide ");
sprintf((*personne).adresse, " adresse vide ");

(*personne).age = 20;
personne->garcon = 1;
}


Mon problème, c'est que tant que je mets ma fonction "initialiserPersonne" dans mon main.c, cela marche très bien (y compris en mettant mon prototype "void initialiserPersonne(Personne* personne);" au début du main.c et ma fonction en fin) ... Cependant, dès que je veux sortir cette fonction de mon main.c pour le mettre dans un init.c + son prototype dans init.h (en mettant bien sûr mon #define "init.h" dans main.c ) , cela ne compile plus

J'ai cette erreur qui apparaît :

/home/.../init.c|1|erreur: expected «)» before «*» token


.... Bref, pourquoi cela ne marche pas (alors que cela fonctionne très bien quand tout est dans le main.c) ??

necropotame, Sunday 28 September 2008 à 15:50


Subscription date : 29 November 2007
Messages : 1584
Le fichier init.h doit connaitre tout ce qui s'y trouve, comme la structure Personne. Donc regarde si cette structure est accessible depuis ton header.

Au niveau de ta structure, long pour un booléen, c'est pas un peut trop grand ? short doit largement suffire. De plus, tu devrais définir des define pour gérer les valeurs. SEX_MALE (qui équivaut à 1) et SEX_FEMALE qui équivaut à 2. Comme ça, c'est beaucoup plus lisible. Tu écrit SEX_MALE à la place de 1. Je te conseil aussi de rajouter SEX_UNKNOWN qui équivaut à 0 quand on ne connait pas le sexe de la personne.

#define SEX_UNKNOWN 0
#define SEX_MALE 1
#define SEX_FEMALE 2


Comme ça, pour initialiser ton type, tu fait ça :

personne->garcon SEX_UNKNOWN;


Ce genre de chose évite d'oublier à quoi correspond 0,1,2 ...

Des fois, quand je reviens sur mon code et que je vois que $topicState = 2, je ne comprend pas tout de suite que ça veux dire que le sujet est résolut

Edit : Oui bah j'ai programmé la gestion des sexe dans ElementSpeak il n'y à pas très longtemps, donc j'ai pas pu m'en empêcher

nochka85, Sunday 28 September 2008 à 20:32


Subscription date : 29 November 2007
Messages : 7420
Le fichier init.h doit connaitre tout ce qui s'y trouve, comme la structure Personne. Donc regarde si cette structure est accessible depuis ton header.


Bah j'ai bien mis mon prototype dans init.h + mon #include "init.h" dans main.c

Au niveau de ta structure, long pour un booléen, c'est pas un peut trop grand ? short doit largement suffire.


short ?? Je croyais qu'il n'y avait que char,int,long,float et double ?? .... De plus, quand je mets "int"(ils conseillent d'utiliser long pour les variables "standards" et int pour les variables de type booléen sur le site du Zéro <- Afin de les reconnaître ) , cela ne marche pas

.... bref, là, je nage complètement -> Je vois pas ce qui cloche

Mav, Sunday 28 September 2008 à 20:34


Subscription date : 29 November 2007
Messages : 3145
Bah j'ai bien mis mon prototype dans init.h


Tout bêtement, as tu bien mis un ; après ton prototype ?

nochka85, Sunday 28 September 2008 à 21:03


Subscription date : 29 November 2007
Messages : 7420
Oui...

D'ailleurs , voici le contenu de mes fichiers :

main.c :

#include <stdio.h>
#include <stdlib.h>
#include "init.h"

int main(int argc, char *argv[])
{
long joueursMax = 2;
Personne joueur[2];

long i;
for (i=0 ; i<joueursMax ; i++)
{
initialiserPersonne(&joueur[i]);
// printf("Joueur %ld après init : %s %s\n", (i+1), joueur[i].prenom, joueur[i].nom);
// printf("Age du joueur %ld : %ld\n", (i+1), joueur[i].age);
// printf("Sexe joueur %ld : %ld\n", (i+1), joueur[i].garcon);

printf("Nom du joueur %ld ? ",(i+1));
scanf("%s", joueur[i].nom);
printf("Prénom du joueur %ld ? ",(i+1));
scanf("%s", joueur[i].prenom);
printf("Age du joueur %ld ? ",(i+1));
scanf("%ld", &joueur[i].age);
printf("Joueur %ld est-il un homme(1) ou une femme (0)? ",(i+1));
scanf("%ld", &joueur[i].garcon);
}

for (i=0 ; i<joueursMax ; i++)
{
printf("Joueur %ld : %s %s\n", (i+1), joueur[i].prenom, joueur[i].nom);
printf("Age du joueur %ld : %ld\n", (i+1), joueur[i].age);

if (joueur[i].garcon)
{
printf("Joueur %ld est un homme !\n\n", (i+1));
}
else
{
printf("Joueur %ld est une femme !\n\n", (i+1));
}

}

return 0;
}


init.h :

#ifndef DEF_INIT_H
#define DEF_INIT_H

typedef struct Personne Personne;
struct Personne
{
char nom[100];
char prenom[100];
char adresse[1000];

long age;
int garcon; // Booléen : 1 = garçon, 0 = fille

};

void initialiserPersonne(Personne* personne);

#endif


et pour finir, init.c :

void initialiserPersonne(Personne* personne)
{
sprintf((*personne).nom, " nom vide ");
sprintf((*personne).prenom, " prenom vide ");
sprintf((*personne).adresse, " adresse vide ");

(*personne).age = 20;
personne->garcon = 1;
}


... et donc cela me renvoit l'erreur "erreur: expected «)» before «*» token" sur la ligne "void initialiserPersonne(Personne* personne);" de l'init.c

necropotame, Sunday 28 September 2008 à 21:17


Subscription date : 29 November 2007
Messages : 1584
Tu doit aussi inclure init.h dans init.c !

nochka85, Sunday 28 September 2008 à 21:26


Subscription date : 29 November 2007
Messages : 7420
Tu doit aussi inclure init.h dans init.c !


C'était çà !!! -> Mais c'est bizarre : J'ai fait un autre exercice en incluant un essai.h uniquement dans main.c et ce qu'il y avait dans essai.c marchait pourtant très bien

fabounet, Monday 29 September 2008 à 13:19


Subscription date : 30 November 2007
Messages : 16693
dans les .h tu déclares les trucs : les structures, les types, les fonctions.
pour les rendre visibles dans un .c, tu inclus le .h dedans et c'est bon.

bon alors dis-moi tu es sur quelle applet ?

nochka85, Monday 29 September 2008 à 18:10


Subscription date : 29 November 2007
Messages : 7420
bon alors dis-moi tu es sur quelle applet ?


J'ai même pas commencé à regarder le wiki pour la création d'applet .... ni même commencer à regarder les applets déjà créer pour voir comment elle fonctionnait

... tiens au fait, je viens d'aborder le sujet des manipulation de fichier -> Vous vous servez "réellement" des commandes C pour manipuler un fichier texte (=fichiers de config) (puts, gets , fprintf, etc ...) ou est-ce que vous vous servez de commandes sed ( <- Je sais, c'est pas très propre ... d'ailleurs, je ne sais même pas si c'est possible : Comment on lance une application externe depuis un programme C ?) ? <- Je peux voir çà où ?

necropotame, Monday 29 September 2008 à 18:20


Subscription date : 29 November 2007
Messages : 1584
pour lancer une application externe, tu peut utiliser system('command');

Cairo-Dock cafe | Café Cairo-Dock

Subjects Author Language Messages Last message
Le post dédié à l' apprentissage du C
Page : 1 2 3 4 ...18 19 20
nochka85 Français 388 nochka85 [Read]
24 January 2010 à 19:27


Glx-Dock / Cairo-Dock List of forums Cairo-Dock cafe | Café Cairo-Dock Le post dédié à l' apprentissage du C Haut de page

Online users :

Powered by ElementSpeak © 2007 Adrien Pilleboue, 2009-2012 Matthieu Baerts.
Dock based on CSS Dock Menu (Ndesign) with jQuery. Icons by zgegball
Cairo-Dock is a free software under GNU-GPL3 licence.
Many thanks to TuxFamily for the web Hosting