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

Apprendre le langage C et quelques questions

89 réponses
Avatar
heron maladroit
question :

Ne souhaitant pas passer trop de temps sur le langage C, =E7a fait 1 an
que j'ai commenc=E9 et je consid=E8re y donner encore 1 ann=E9e de plus (=
=E0
raison de 4 =E0 8 heures par semaine), je pense que ce n'est pas
n=E9cessaire de lire le K&R en profondeur pour un niveau en C que je
veux garder "basique". C'est bien de l'avoir sous le coude et par
moment pour voir un peu un style de programmation d=E9finitivement
brillant au niveau algorithmes.

En effet, =E9tant comptable, je ne sais pas tr=E8s bien =E0 quoi le langage
C pourrait me servir concr=E8tement. L'informatique occupe beaucoup mon
temps en dehors du temps de travail mais je ne vois pas pour le temps
que je peux y consacrer pour apprendre comment dans les conditions
actuelles du march=E9, trouver un travail dans ce domaine en qualit=E9
d'autididacte. Peut-=EAtre je peux envisager d'=E9crire des petites
applications sur des appareils mobiles ou des applications web ? On
dirait que les grands =E9diteurs mettent en place des outils de
d=E9veloppement maison pour les appareils Andro=EFd, iPhone...

Et =E9galement, j'utilise linux et je ne sais pas quel niveau en langage
C il faut pour appr=E9cier plus en profondeur cet OS ? J'ai vu que le
langage Shell est quelque chose d'utile pour personaliser Linux. Y-a-t-
il un pont entre le Shell (un des shell) et le langage C ?

J'ai quelques bases en C qu'on retrouve dans d'autres langages
(notamment au niveau algorithmique, pointeurs...), c'est pourquoi
j'envisage apr=E8s de me consacrer au C++. Mais je souhaite avant
consolider les bases et les aspects un peu d=E9licats de ce langage
assez =E9prouvant =E0 apprendre (mais j'ai commenc=E9 avec beaucoup de
sacrifices sur les loisirs, la vie de famille etc et je ne ferais pas
machine arri=E8re). Je garde professionnellement la t=EAte hors de l'eau,
je donne la priorit=E9 pour gagner de l'argent mais c'est beaucoup
d'=E9nergie... C=F4t=E9 francophone, l'initiative d'entreprendre et
=E9galement d'apprendre n'est pas tant encourag=E9e. Malheureusement, on
voit le r=E9sultat ; l'=E9tat en France pr=E9f=E8re une distribution Linux
anglo-saxonne au d=E9pit de Mandriva....C'est un autre d=E9bat.

Je voudrais savoir si jusqu'=E0 pr=E9sent la "route" que j'ai choisie est
coh=E9rente. Et surtout comment orienter la derni=E8re ann=E9e
d'apprentissage. Dans un livre, j'ai pu voir la biblioth=E8que Glib.
J'ai trouv=E9 que la programmation =E9tait assez diff=E9rente de celle de
stdio, stdlib. Faudrait-il que je me consacre =E0 cet biblioth=E8que afin
d'avoir une connaissance plus pratique de ce langage ? Ou est-ce que
c'est r=E9server =E0 un usage niveau expert du langage C, qui ne serait
pas tr=E8s "utile" lors d'une conversion vers C++, Python, Php,
Javascript des langages vers lesquels je souhaite m'orienter par la
suite. Des langages comme Vb net, C sharp m'int=E9resseraient =E9galement.
Avant, je consid=E8re passer approximativement le double du temps que
j'ai pass=E9 =E0 apprendre le C sur le C++ afin de comprendre la POO. Je
ne sais pas si c'est coh=E9rent.

Merci pour vos conseils (on dirait que ce groupe est de moins en moins
anim=E9 - faut-il s'exprimer en anglais pour retrouver les experts de ce
forum...)

10 réponses

5 6 7 8 9
Avatar
Marc Boyer
Le 28-05-2010, xtof.pernod a écrit :
Le 27/05/2010 14:11, Marc Boyer a fait rien qu'à écrire :
C'est un des pb que je rencontre en discutant avec des pros du dev
qui donnent leur avis sur l'enseignement de la programmation: comme
ils ont fait partie des 20% qui s'en sont sorti, ils trouvent que c'est
une bonne voie.



Oui, et c'est bien normal. Si tu t'en sort, alors tu penses que ta
Voie était bonne. Les 80 autres % pensent certainement l'inverse =)
Subjectif, tout ça, non..



Tout à fait. C'est pour ça que j'ai ce pb.
D'avoir enseigné à divers public (mais tous en formation initiale)
m'a permis d'expériementer sur les autres ;-) de ne pas m'en remettre
qu'à mes souvenirs personels.

(Note. 80-20, c'est pas une mesure, c'est un chiffre 'à l'arrache'
mais qui va bien, on le trouve un peu partout)



En effet.
Ca va avec la courbe de gauss, tout ça. Je suis pas spécialiste.

Bon, c'est dommage que l'OP donne pas son point de vue - des tas de
gens lui ont posé des tas de questions, sans réponse - mais je suis
tenté de dire que si au bout d'1 an, on en est toujours à tester des
malloc( 1 ) dans une boucle, c'est peut-être qu'on a visé un peu haut..



Ou que ce n'est pas la bonne voie.



Oui, si tu veux, mais je suis tenté de dire que si la /Bonne Voie/(c)(tm)
existait, alors on s'y engouffrerait tous, débutants comme pro's,
et tout serait bonheur de joie.



Sauf que le "bonne voie", elle est relative à une population de départ,
un objectif, et des moyens.
On ne fait pas la même chose avec des matheux en M1 qui découvrent
un clavier, des bacheliers qui entre en IUT Info Indus et un comptable
autodidacte seul devant son clavier. Et dans ces trois situations, on
ne fait pas non plus la même chose en 1980, en 1995 et en 2010.


> J'aime bien le concept de
la courbe d'apprentissage, qui trace la productivité par rapport
à l'effort d'apprentissage.



(Pinaise, heureusement que t'es pas mon chef =)

Bon, comment tu traces les 2 courbes: 'productivité' et 'effort
apprentissage' ? En x, on peut mettre le temps, je suppose ; et en y ?



Non, en y, productivité, en x, l'effort d'apprentissage.
En gros, avec une IHM souris (clickodrome), tu as une courbe qui ressemble
à un logarithme: avec très peu d'effort, tu fais déjà des trus, mais ça plafonne
vite.
Avec vi, tu as un truc du genre y = x + b, avec b assez gros.

Tu veux traiter des données ? Excel (sans macro) est simple, awk plus dur
mais te fera plus de choses, et SQL te fera passer à l'échelle.

Avec le C comme premier langage, la première marche est très haute.
Je pense qu'on peut aller aussi loin avec des démarches plus douces
en entrée de jeu.



Ah mais oui, si une méthode douce existe, pourquoi se faire inutilement
de mal, tout à fait..

Mais à l'inverse, le fait d'avoir pratiqué d'autres languages n'implique
pas que le C va rentrer comme dans du beurre. La marche est haute de
toutes façons, mais la pente est rose waf waf waf dès le matin..



Non: tu as plusieurs pb. L'algorithmique, les E/S, la gestion mémoire.
En 2010, on devrait pouvoir entrer un ÿ dans une chaine sans se soucier
des conversions char / unsigned char / int qui font que ton code s'arrête.
Un language ou tu peux faire x = y, puis avoir le test x == y qui renvoie
faux, c'est piégeant...

Et puis bon, en 2010, devoir se taper la gestion de la mémoire à
la main, n'est-ce pas un pb qu'on peut éviter dans 95% des cas ?



Euh. Qu'est-ce que tu entends, précisément, par 'à la main': au malloc(3) ?..
Parce que dans ce cas, en 2010 comme chaque année depuis 70 (au moins),
la mémoire se gère à la main, dans 95 ? 99 ? 100-O(1) % ? des cas,
le C n'ayant pas de mécanisme de ramassage des poubelles..



J'ai longtemps cru que C n'avait pas de gestion automatisée de la mémoire.
J'ai apris depuis qu'il existait des env de dev qui le font.
Et puis justement, je pensais à des langages plus évolués qui te permettent
d'écrire
String s = "toto";
s= s + " va à la mer";
sans avoir à te soucier de la gestion mémoire.

Du reste, c'est complètement dépendant de ce que tu implémentes.



Tout à fait. Le sujet de base, c'était "apprendre à programmer".
Si ça deviens "apprendre à programmer un système de plugin pour routeur
Cisco", on a plus les mêmes outils...

Marc Boyer
--
En prenant aux 10% des francais les plus riches 12% de leurs revenus,
on pourrait doubler les revenus des 10% les plus pauvres.
http://www.inegalites.fr/spip.php?article1&id_mot0
Avatar
Antoine Leca
JKB écrivit :
Le 27-05-2010, ? propos de
Re: Apprendre le langage C et quelques questions,
Antoine Leca ?crivait dans fr.comp.lang.c :
JKB a écrit :
Vi + gcc + gdb pour tout le monde ;-)


Heu.... C'est soit vi + sdb ou équivalent, soit emacs + gdb/dbx, sinon
tu mélanges les torchons et les serviettes...

Ok, hors charte, je sors :-)



Soit je n'ai pas vraiment compris



Euh, vu ta réponse et celle de Marc E., j'ai bien l'impression que la
plaisanterie était incompréhensible. Désolé.

Vi et emacs sont deux éditeurs de texte très puissants, avec d'énormes
possibilités mais aussi avec des cultes très forts, qui ont même mené à
des sortes de guerres de religion (du genre PC contre Mac, ou plus
récemment Linux contre Windows).

Pour moi, la grosse différence entre les deux (avec les machines
d'aujourd'hui), c'est que l'un utilise des commandes succinctes et
cryptiques et que l'autre est verbeux dans son langage de commande.


Si l'on regarde les débogueurs symboliques (ceux qui font abstraction de
la nécessité de toucher au langage machine, donc out adb, DEBUG et
compagnie), il y a la même opposition entre sdb d'un côté (commandes
cryptiques) et dbx_puis_gdb de l'autre (commandes verbeuses).


Maintenant, comme le fait bien remarquer Marc, sdb a totalement disparu
du paysage, probablement parce que ce qui compte, c'est la fonction, pas
le langage de commande ; et de toutes manières, aujourd'hui les
débogueurs sont souvent commandés au travers d'un EDI et donc souvent
d'une interface utilisateur rajoutée (clickodrome ou menus déroulants ou
que-sais-je) qui cache le plus souvent le programme qui tourne derrière.


Antoine
Avatar
espie
In article <hto17v$r51$,
Marc Boyer wrote:
Non: tu as plusieurs pb. L'algorithmique, les E/S, la gestion mémoire.
En 2010, on devrait pouvoir entrer un ÿ dans une chaine sans se soucier
des conversions char / unsigned char / int qui font que ton code s'arrête.
Un language ou tu peux faire x = y, puis avoir le test x == y qui renvoie
faux, c'est piégeant...



Faudra dire ca a intel, histoire qu'ils arretent de faire des registres
flottants sur 80 bits. ;-)
Avatar
espie
In article <hto23l$qm3$,
Antoine Leca wrote:
JKB écrivit :
Le 27-05-2010, ? propos de
Re: Apprendre le langage C et quelques questions,
Antoine Leca ?crivait dans fr.comp.lang.c :
JKB a écrit :
Vi + gcc + gdb pour tout le monde ;-)


Heu.... C'est soit vi + sdb ou équivalent, soit emacs + gdb/dbx, sinon
tu mélanges les torchons et les serviettes...

Ok, hors charte, je sors :-)



Soit je n'ai pas vraiment compris



Euh, vu ta réponse et celle de Marc E., j'ai bien l'impression que la
plaisanterie était incompréhensible. Désolé.



Ah si si, moi j'avais tres bien compris. Je faisais juste remarquer que je
n'avais helas pas le choix, vu que sdb ne tourne pas sur la plupart des
plateformes auxquelles j'ai affaire, et que je n'ai de toutes facons pas
l'intention de me plonger suffisamment dans de l'assembleur intel pour
reparer ca...
Avatar
Antoine Leca
JKB écrivit :
Non. Tu ne peux pas écrire en fortran un truc aussi imbitable pour
un débutant que :

inline char *
strcpy(char *out, char *int) {
char *r;
for(*out=*in; *++in==0; *++out=*in);



Mouais. C'est vrai que c'est impossible (à ma connaissance), mais pas
parce que c'est incompréhensible, seulement parce que cela fait appel à
une notion absente du Fortran, en l'occurrence l'utilisation du
caractère NUL pour représenter la fin d'une chaîne en mémoire.

Pour autant, il est très facile d'écrire du code Fortran bien
incompréhensible, que ce soit avec COMMON ou avec des trucs comme
DO2i=1,10
2 a(i,i)=1

(pas taper, pas testé...).



Moi non plus :-)


Antoine
Avatar
xtof.pernod
Le 28/05/2010 09:29, JKB a fait rien qu'à écrire :
Le 28-05-2010, ? propos de
Re: Apprendre le langage C et quelques questions,
xtof.pernod ?crivait dans fr.comp.lang.c :
[ramassage des poubelles..;]



En même temps, l'ultime et terminal ramasseur de poubelles, pour moi,
c'est exit(2). Robuste, efficace, économe, portable: incontournable !



Pourquoi ne mets-tu pas l'adresse de chaque bloc alloué dans une
liste chaînée avec un at_exit() qui balance un free() sur chaque
bloc encore alloué à la fin du programme ? ;-)



oooh, ben:

Pasque 1/ j'ai pas utilisé de liste chainée depuis ma lecture du K&R,
ou alors à mon insu
2/ le 1er & dernier coup que j'ai utilisé atexit(3), sizof(int)
retournait 2 et malloc(3) permettait d'allouer 65528 max.
3/ comme d'hab, je vois pas ta motivation, pour ton cas &
d'après ce que tu en dis, pour moi exit() s'en chargera =)

Ne rigolez pas, j'ai déjà dû utiliser de genre de chose... :-(



En même temps, on va pas chialer non plus.. pas pour une p'tit kludge !

JKB



--
christophe.
Avatar
JKB
Le 28-05-2010, ? propos de
Re: Apprendre le langage C et quelques questions,
Antoine Leca ?crivait dans fr.comp.lang.c :
JKB écrivit :
Non. Tu ne peux pas écrire en fortran un truc aussi imbitable pour
un débutant que :

inline char *
strcpy(char *out, char *int) {
char *r;
for(*out=*in; *++in==0; *++out=*in);



Mouais. C'est vrai que c'est impossible (à ma connaissance), mais pas
parce que c'est incompréhensible, seulement parce que cela fait appel à
une notion absente du Fortran, en l'occurrence l'utilisation du
caractère NUL pour représenter la fin d'une chaîne en mémoire.



Mon exemple était fait non pour l'utilisation des pointeurs ou du
nul en fin de chaîne, mais pour l'imbrication des opérations et le
gag du point-virgule après le 'for' qui est un grand classique du
piège à débutant.

Pour autant, il est très facile d'écrire du code Fortran bien
incompréhensible, que ce soit avec COMMON ou avec des trucs comme
DO2i=1,10
2 a(i,i)=1



Ouaips, mais là, on est en Fortran66 avec des boucles comme IBM les
avait créées. En 77, on écrirait plutôt :

DO I=1,10
CECI EST MON TABLEAU A DEUX DIMENSIONS(I,I)=1
END DO

modulo le formatage de la ligne. Ce que je veux dire, c'est qu'en
Fortran, il y a une instruction par ligne et une seule, et que mine
de rien, pour le débutant, c'est bien.

(pas taper, pas testé...).



Moi non plus :-)



JKB

--
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.
Avatar
JKB
Le 28-05-2010, ? propos de
Re: Apprendre le langage C et quelques questions,
xtof.pernod ?crivait dans fr.comp.lang.c :
Le 28/05/2010 09:29, JKB a fait rien qu'à écrire :
Le 28-05-2010, ? propos de
Re: Apprendre le langage C et quelques questions,
xtof.pernod ?crivait dans fr.comp.lang.c :
[ramassage des poubelles..;]



En même temps, l'ultime et terminal ramasseur de poubelles, pour moi,
c'est exit(2). Robuste, efficace, économe, portable: incontournable !



Pourquoi ne mets-tu pas l'adresse de chaque bloc alloué dans une
liste chaînée avec un at_exit() qui balance un free() sur chaque
bloc encore alloué à la fin du programme ? ;-)



oooh, ben:

Pasque 1/ j'ai pas utilisé de liste chainée depuis ma lecture du K&R,
ou alors à mon insu
2/ le 1er & dernier coup que j'ai utilisé atexit(3), sizof(int)
retournait 2 et malloc(3) permettait d'allouer 65528 max.
3/ comme d'hab, je vois pas ta motivation, pour ton cas &
d'après ce que tu en dis, pour moi exit() s'en chargera =)



J'ai un système sous la main qui ne fait pas ménage correctement à
la fin d'un programme. Ça motive. Le système en question, c'est un
truc hérité du DOS.

JKB

--
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.
Avatar
xtof.pernod
Le 28/05/2010 11:09, Marc Boyer a fait rien qu'à écrire :
Le 28-05-2010, xtof.pernod a écrit :
Le 27/05/2010 14:11, Marc Boyer a fait rien qu'à écrire :
(...)




D'avoir enseigné à divers public (mais tous en formation initiale)
m'a permis d'expériementer sur les autres ;-) de ne pas m'en remettre
qu'à mes souvenirs personels.



Ok, je vois...le point de vue de l'enseignant =)
Note que pour la question originale (dont le posteur semble se
désintéresser ?!), c'est p'tet' c'qui lui faut

(...)
Oui, si tu veux, mais je suis tenté de dire que si la /Bonne Voie/(c)(tm)
existait, alors on s'y engouffrerait tous, débutants comme pro's,
et tout serait bonheur de joie.



Sauf que le "bonne voie", elle est relative à une population de départ,
un objectif, et des moyens.



Ben, voui, en gros on est d'accord.. Non seulement la Voie n'existe pas,
mais en plus elle est relative.

On ne fait pas la même chose avec des matheux en M1 qui découvrent
un clavier, des bacheliers qui entre en IUT Info Indus et un comptable
autodidacte seul devant son clavier. Et dans ces trois situations, on
ne fait pas non plus la même chose en 1980, en 1995 et en 2010.



Ah, bah, heureusement que l'enseignement évolue !..


Bon, comment tu traces les 2 courbes: 'productivité' et 'effort
apprentissage' ? En x, on peut mettre le temps, je suppose ; et en y ?



Non, en y, productivité, en x, l'effort d'apprentissage.
En gros, avec une IHM souris (clickodrome), tu as une courbe qui ressemble
à un logarithme: avec très peu d'effort, tu fais déjà des trus, mais ça plafonne
vite.
Avec vi, tu as un truc du genre y = x + b, avec b assez gros.




Ok..
La question, c'est, après, comment tu places les élèves sur ce document !?

[plusieurs pb.] L'algorithmique, les E/S, la gestion mémoire.




En 2010, on devrait pouvoir entrer un ÿ dans une chaine sans se soucier
des conversions char / unsigned char / int qui font que ton code s'arrête.
Un language ou tu peux faire x = y, puis avoir le test x == y qui renvoie
faux, c'est piégeant...

Et puis bon, en 2010, devoir se taper la gestion de la mémoire à
la main, n'est-ce pas un pb qu'on peut éviter dans 95% des cas ?



Euh. Qu'est-ce que tu entends, précisément, par 'à la main': au malloc(3) ?..
Parce que dans ce cas, en 2010 comme chaque année depuis 70 (au moins),
la mémoire se gère à la main, dans 95 ? 99 ? 100-O(1) % ? des cas,
le C n'ayant pas de mécanisme de ramassage des poubelles..



J'ai longtemps cru que C n'avait pas de gestion automatisée de la mémoire.
J'ai apris depuis qu'il existait des env de dev qui le font.
Et puis justement, je pensais à des langages plus évolués qui te permettent
d'écrire
String s = "toto";
s= s + " va à la mer";
sans avoir à te soucier de la gestion mémoire.




Hmm. Je l'ai vue venir.. Mais je suis pas sur que ce soit le bon groupe !
[zut, mon trollmetre vient de segv & poser une bouse.. ca sera sans moi]

Du reste, c'est complètement dépendant de ce que tu implémentes.



Tout à fait. Le sujet de base, c'était "apprendre à programmer".
Si ça deviens "apprendre à programmer un système de plugin pour routeur
Cisco", on a plus les mêmes outils...



s/de plugin pour routeur.*"// =)


Marc Boyer



--
christophe.
Avatar
Antoine Leca
Marc Boyer écrit :
En même temps, le besoin d'informaticien est un besoin de masse. Il y a
2-3 ans, je me souviens d'une présentation d'un resp. de l'association
des indutriels informatique français, qui disait (je n'ai plus le chiffre
exact en tête) qu'entre les recrutements et l'ensemble des diplomés
"informatique", il y avait un manque de 20%.



En même temps, ce responsable avait un objectif économique : quand il y
a excès de demande sur l'offre, c'est l'offre qui fixe les prix, et son
intérêt est de le faire à la hausse ; quand il y a excès d'offre, les
prix baissent mécaniquement, en théorie jusqu'à atteindre le niveau de
la concurrence parfaite, soit ici le niveau des salaires moyens à ce
niveau de formation, sans aucune « prime » pour les informaticiens.

Et le ratio entre la variation de niveau d'offre ou de demande et les
prix (ratio qui s'appelle l'élasticité) est souvent supérieur à 1, et
j'ai en tête de l'ordre de 3 pour l'offre de travail : mais pour une
baisse de 10 % du manque (ce qui revient à former 10 % de plus
d'informaticiens), les prix (d'embauche) baisseraient de 30 %...
[je sais bien qu'économiquement, mon raisonnement est tiré par les
cheveux, mais l'idée de base reste valable ÀMHA.]
Comme on voit bien que ce n'est pas le cas en période de vaches maigres,
j'ai un gros doute sur la véracité du chiffre de 20 % de manque.

Comme par ailleurs j'entends ce discours sur le manque depuis 35 ans...
je pense sincèrement qu'il s'agit en fait d'un discours économique,
visant à convaincre les citoyens et à travers eux les décideurs
politiques d'investir largement dans la formation d'informaticiens, ce
qui aura pour effet de transformer cette fonction en une ressource
banalisée (comme par exemple les mécaniciens automobiles au début du XXe
siècle), ce qui permettra aux SSII d'acheter moins cher (la force de
travail) donc de faire de meilleures marges.
Évidemment, l'intérêt des ingénieurs informaticiens est exactement
l'inverse, celui de restreindre le plus possible l'arrivée de nouvelles
offres, afin de préserver les niveaux de salaire de la caste : c'est
d'ailleurs la même chose pour les médecins, les pharmaciens et toutes
les professions qui ont mis en place des /numerus clausus/...


De mon côté utilisateur, je trouve que les ordis plantent moins
de nos jours qu'il y a disons 15 ans. A l'époque, on pouvait pas
accuser Java.



Quels ordinateurs ? Il y a 15 ans, un mainframe (oui cela existait
encore à l'époque ; vous avez tous vu les photos des centres
informatiques dans des salles blanches ;-)) ne tombait jamais en panne,
donc il n'y a pas de différence à ce niveau ! Quant aux applications qui
tournent sur ces ordinateurs, il y a 15 ans on avait encore ces applis
en terminal 24×80 monochromes qui ÀMHA tombaient largement moins souvent
que les portails web qui les ont remplacées depuis. :-(

Une autre chose sont les ordinateurs personnels : il y a 15 ans,
c'étaient des micros tournant avec Windows 95 : plantaient effectivement
souvent (même si c'était nettement moins que la génération précédente
avec Windows 3.x) ; mais aujourd'hui, il faudrait comparer avec... les
smartphones et autres consoles de jeux ! Et pour le coup, je ne suis pas
convaincu que la comparaison soit aussi évidente... :^)


Antoine
5 6 7 8 9