OVH Cloud OVH Cloud

Quel tutoriel pour débuter ?

202 réponses
Avatar
Migrec
Bonjour,

Je cherche un tutoriel imprimable sur le web pour apprendre le C avant
d'acheter un bouquin "de référence".
Je suis débutant en programmation mais je connais les scripts shell
(linux), le HTML ou encore un peu de PHP.

Quel tutoriel imprimable me conseillez-vous pour débuter ? Les 560 pages
de celui du site du zéro
(http://www.siteduzero.com/tuto-29-8-0-apprenez-a-programmer-en-c.html)
découragent un peu mon imprimante, même avec le recto-verso
automatique... Mais le style me plaît ! Existe-t-il quelque chose dans
le même esprit mais en plus condensé ?

--
Migrec

10 réponses

Avatar
Thierry B.
--{ Wykaaa a plopé ceci: }--

Ceci dit, j'ai fait de la musique en Fortran IV (dans les années 70).



Il ne te resterais pas les sources de MUSIC V au fond d'une bande ?

--
Math problems? Call 1-800-[(10x)(13i)2]-[sin(xy)/2.362x].
Avatar
Thierry B.
--{ Wykaaa a plopé ceci: }--

Toi tu fais allusion au .h externe, celui qui est #inclus par les
consomateurs de l'objet (.h que tu vois unique par objet).
Personnellement, je faisais référence aux véritables .h situés au même
niveau que les .c, avec la vraie structure des « objets ».
Le préprocesseur C tel que normalisé a d'ailleurs un mécanisme prêt pour
cela, les #include avec <totatu.h> ou "objet_toto.h".



Enfin cette distinction établit une priorité dans les règles de
recherche des librairies.



Je ne vois pas trop pourquoi des subtilités de compilation au
niveau des .h entraineraient une "priorité" dans les règles de
recherche des bibiothèques, qui relèvent plutôt de l'édition
de liens. Quelque chose doit m'échapper...


--
C'est assez juste. Faire polytechnique pour finir dans la finance et
croire pouvoir faire rentrer le monde dans un tableau excel, il faut
effectivement être un peu taré. --{ fr.sci.physique }--
Avatar
Wykaaa
Francois a écrit :
Encore une question de béotien, parque pour l'instant c'est très
théorique tout ça. :-)

Pourrais-je avoir s'il vous plaît un exemple de code *en C* où l'on a
l'instanciation d'un objet "compteur" ... d'une manière orienté objet
donc ?

Par exemple, on pourrait imaginer que l'objet compteur :
- possède un attribut de donnée interne x qui est la valeur du compteur
valant 0 au départ juste après instanciation
- possède une méthode-propriété qui affiche la valeur de x
- possède une méthode-action qui incrémente la valeur de x
- possède une méthode-action qui initialise à 0 la valeur de x

J'aimerais bien voir la tête que ça peut avoir un exemple simple comme
celui-là en C.

Merci d'avance.



Voilà les fichiers avec le code. J'ai aussi un constructeur et un
destructeur.

J'ai fait ça à la volée, je n'ai pas vérifié que ça compilait. Il peut y
avoir des erreurs mais enfin, voilà le principe.

****** Fichier compteur_interface.h ******

#ifndef COMPTEUR_INTERFACE_H_
#define COMPTEUR_INTERFACE_H_

#include "compteur.h"


extern Compteur new_Compteur();

#endif /*COMPTEUR_INTERFACE_H_*/


****** Fichier compteur.h ******

#ifndef COMPTEUR_H_
#define COMPTEUR_H_

/* Private attributes of Class Compteur */
typedef struct Compteur_private_attributes *Compteur_private_attributes;

/* Definition of class Compteur */
typedef struct Compteur
{
Compteur_private_attributes attributes;

void (*afficher) (struct Compteur *this);
void (*incrementer) (struct Compteur *this);
void (*initialiser) (struct Compteur *this);
void (*free) (struct Compteur *this);
} *Compteur;

#endif /*COMPTEUR_H_*/

****** Fichier compteur.c ******

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

/****************************/
/* Class Compteur */
/****************************/
/* Definition of the Compteur private attributes structure*/
struct Compteur_private_attributes
{
int val;
};

/* Afficher */
void compteur_afficher(const Compteur this)
{
printf("valeur du compteur : %dn", this->attributes->val);
}

/* incrementer */
void compteur_incrementer(const Compteur this)
{
(this->attributes->val)++;
}

/* initialiser */
void compteur_initialiser(const Compteur this)
{
this->attributes->val = 0;
}

/* destructeur */
void compteur_free(const Compteur this)
{
free(this->attributes);
free(this);
}

/* constructeur */
static Compteur Compteur_constructeur(Compteur this)
{
this->attributes->val = 0;
this->free = compteur_free;
this->afficher = compteur_afficher;
this->incrementer = compteur_incrementer;
this->initialiser = compteur_initialiser;
return this;
}

Compteur new_Compteur()
{
Compteur this = (Compteur)malloc(sizeof(struct Compteur));
if (this != NULL)
{
this->attributes =
(Compteur_private_attributes)malloc(sizeof(structCompteur_private_attributes));
if(this->attributes != NULL)
{
Compteur_constructeur(this);
}
else exit(EXIT_FAILURE);
}
else exit(EXIT_FAILURE);
return this;
}

****** Fichier main ******

#include "compteur_interface.h"

int main()
{
Compteur monCompteur = new_Compteur();
monCompteur->afficher(monCompteur);
monCompteur->incrementer(monCompteur);
monCompteur->initialiser(monCompteur);
}

Bonne lecture
Avatar
Wykaaa
Thierry B. a écrit :
--{ Wykaaa a plopé ceci: }--

Ceci dit, j'ai fait de la musique en Fortran IV (dans les années 70).



Il ne te resterais pas les sources de MUSIC V au fond d'une bande ?



Aïe. Tu touches un point douloureux...

Je les avais sur cartes perforées...
J'ai déménagé il y a 2 ans et je me suis dit que ça ne serait jamais
possible de relire ça alors je les ai jetées :-(

J'ai quand même toujours le bouquin de Max Mathews "The Technology of
Computer Music" de 1969 (MIT Press)

Si tu veux écouter un exemple de musique faite à l'époque avec mon
programme Fortran voilà un lien :
http://pagesperso-orange.fr/jacti/jacti/Biographie_files/3min20sec.mp3
Avatar
Wykaaa
Thierry B. a écrit :
--{ Wykaaa a plopé ceci: }--

Toi tu fais allusion au .h externe, celui qui est #inclus par les
consomateurs de l'objet (.h que tu vois unique par objet).
Personnellement, je faisais référence aux véritables .h situés au même
niveau que les .c, avec la vraie structure des « objets ».
Le préprocesseur C tel que normalisé a d'ailleurs un mécanisme prêt pour
cela, les #include avec <totatu.h> ou "objet_toto.h".


Enfin cette distinction établit une priorité dans les règles de
recherche des librairies.



Je ne vois pas trop pourquoi des subtilités de compilation au
niveau des .h entraineraient une "priorité" dans les règles de
recherche des bibiothèques, qui relèvent plutôt de l'édition
de liens. Quelque chose doit m'échapper...




la norme (du moins WG14/N1124 Committee Draft — May 6, 2005 ISO/IEC
9899:TC2) :

6.10.2 Source file inclusion
Constraints
1 A #include directive shall identify a header or source file that can
be processed by the
implementation.

Semantics

2 A preprocessing directive of the form
# include <h-char-sequence> new-line
searches a sequence of implementation-defined places for a header
identified uniquely by
the specified sequence between the < and > delimiters, and causes the
replacement of that
directive by the entire contents of the header. How the places are
specified or the header
identified is implementation-defined.

3 A preprocessing directive of the form
# include "q-char-sequence" new-line
causes the replacement of that directive by the entire contents of the
source file identified
by the specified sequence between the " delimiters. The named source
file is searched
for in an implementation-defined manner. If this search is not
supported, or if the search
fails, the directive is reprocessed as if it read
# include <h-char-sequence> new-line

Voilà, voilà.
Avatar
Wykaaa
Wykaaa a écrit :
Francois a écrit :
Encore une question de béotien, parque pour l'instant c'est très
théorique tout ça. :-)

Pourrais-je avoir s'il vous plaît un exemple de code *en C* où l'on a
l'instanciation d'un objet "compteur" ... d'une manière orienté objet
donc ?

Par exemple, on pourrait imaginer que l'objet compteur :
- possède un attribut de donnée interne x qui est la valeur du
compteur valant 0 au départ juste après instanciation
- possède une méthode-propriété qui affiche la valeur de x
- possède une méthode-action qui incrémente la valeur de x
- possède une méthode-action qui initialise à 0 la valeur de x

J'aimerais bien voir la tête que ça peut avoir un exemple simple comme
celui-là en C.

Merci d'avance.



Voilà les fichiers avec le code. J'ai aussi un constructeur et un
destructeur.

J'ai fait ça à la volée, je n'ai pas vérifié que ça compilait. Il peut y
avoir des erreurs mais enfin, voilà le principe.

****** Fichier compteur_interface.h ******

#ifndef COMPTEUR_INTERFACE_H_
#define COMPTEUR_INTERFACE_H_

#include "compteur.h"


extern Compteur new_Compteur();

#endif /*COMPTEUR_INTERFACE_H_*/


****** Fichier compteur.h ******

#ifndef COMPTEUR_H_
#define COMPTEUR_H_

/* Private attributes of Class Compteur */
typedef struct Compteur_private_attributes *Compteur_private_attributes;

/* Definition of class Compteur */
typedef struct Compteur
{
Compteur_private_attributes attributes;

void (*afficher) (struct Compteur *this);
void (*incrementer) (struct Compteur *this);
void (*initialiser) (struct Compteur *this);
void (*free) (struct Compteur *this);
} *Compteur;

#endif /*COMPTEUR_H_*/

****** Fichier compteur.c ******

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

/****************************/
/* Class Compteur */
/****************************/
/* Definition of the Compteur private attributes structure*/
struct Compteur_private_attributes
{
int val;
};

/* Afficher */
void compteur_afficher(const Compteur this)
{
printf("valeur du compteur : %dn", this->attributes->val);
}

/* incrementer */
void compteur_incrementer(const Compteur this)
{
(this->attributes->val)++;
}

/* initialiser */
void compteur_initialiser(const Compteur this)
{
this->attributes->val = 0;
}

/* destructeur */
void compteur_free(const Compteur this)
{
free(this->attributes);
free(this);
}

/* constructeur */
static Compteur Compteur_constructeur(Compteur this)
{
this->attributes->val = 0;
this->free = compteur_free;
this->afficher = compteur_afficher;
this->incrementer = compteur_incrementer;
this->initialiser = compteur_initialiser;
return this;
}

Compteur new_Compteur()
{
Compteur this = (Compteur)malloc(sizeof(struct Compteur));
if (this != NULL)
{
this->attributes =
(Compteur_private_attributes)malloc(sizeof(structCompteur_private_attributes));

if(this->attributes != NULL)
{
Compteur_constructeur(this);
}
else exit(EXIT_FAILURE);
}
else exit(EXIT_FAILURE);
return this;
}

****** Fichier main ******

#include "compteur_interface.h"

int main()
{
Compteur monCompteur = new_Compteur();
monCompteur->afficher(monCompteur);
monCompteur->incrementer(monCompteur);
monCompteur->initialiser(monCompteur);
}

Bonne lecture


Oooops
Il manque return 0; dans le main.
Avatar
Francois
Wykaaa a écrit :
Francois a écrit :

Pourrais-je avoir s'il vous plaît un exemple de code *en C* où l'on a
l'instanciation d'un objet "compteur" ... d'une manière orienté objet
donc ?



[couic]

J'ai fait ça à la volée, je n'ai pas vérifié que ça compilait. Il peut y
avoir des erreurs mais enfin, voilà le principe.

[couic]



Génial ! Merci beaucoup. :-)

Donc on peut programmer parfaitement orienté objet en C, c'est juste
plus long. Je trouve ça excellent. :-)


--
François
Avatar
Mickaël Wolff
Francois a écrit :

Donc on peut programmer parfaitement orienté objet en C, c'est juste
plus long. Je trouve ça excellent. :-)



Pas forcément, imagine des macros du genre :

#define OOCALL(obj, callback, ...) (obj)->(callback)((obj), __VA_ARGS__)

Et comme ça tu fais un truc tout beau :

OOCALL(monCompteur, afficher) ;

Mais à ce compte là, autant passer au C++ (ou ObjectiveC, ou ...).

--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
Avatar
Jean-Marc Bourguet
Francois writes:

Wykaaa a écrit :
Francois a écrit :

Pourrais-je avoir s'il vous plaît un exemple de code *en C* où l'on a
l'instanciation d'un objet "compteur" ... d'une manière orienté objet
donc ?



[couic]

J'ai fait ça à la volée, je n'ai pas vérifié que ça compilait. Il peut y
avoir des erreurs mais enfin, voilà le principe.

[couic]



Génial ! Merci beaucoup. :-)

Donc on peut programmer parfaitement orienté objet en C, c'est juste plus
long. Je trouve ça excellent. :-)



Cherche la page de Laurent Deniau, il a plusieurs framework OO en C.

A+

--
Jean-Marc
FAQ de fclc: http://www.isty-info.uvsq.fr/~rumeau/fclc
Site de usenet-fr: http://www.usenet-fr.news.eu.org
Avatar
Wykaaa
Francois a écrit :
Wykaaa a écrit :
Francois a écrit :

Pourrais-je avoir s'il vous plaît un exemple de code *en C* où l'on a
l'instanciation d'un objet "compteur" ... d'une manière orienté objet
donc ?



[couic]

J'ai fait ça à la volée, je n'ai pas vérifié que ça compilait. Il peut
y avoir des erreurs mais enfin, voilà le principe.

[couic]



Génial ! Merci beaucoup. :-)



De rien

Donc on peut programmer parfaitement orienté objet en C, c'est juste
plus long. Je trouve ça excellent. :-)



Mais tu sais, même en assembleur on peut programmer objet, mais là je ne
produirai pas d'exemple...