questions qu'on me pose souvent

je reçois pas mal de courrier (merci à tous, surtout pour les compliments bien entendu) et j'essaye d'y répondre rapidement. J'ai regroupé ici les réponses aux questions les plus fréquentes ou d'intérêt général.


index :



Eric (cea.fr) wrote:

> > tout d'abord bonjour, et bravo pour ce petit livre sur le C > > ma question est la suivante : > Pourquoi le langage C est plus rapide que les autres langages style > cobol etc.. > > merci bonjour et merci Le C est le seul langage qui permet tous les niveaux de programmation : - langage structuré : il possède toutes les structures de programmation des langages structurés : au niveau du code (boucles, tests, sous-programmes, récursivité) mais en plus il a prévu des instructions de type "Goto" en sélectionnant celles qui permettent d'optimiser un programme sans embrouiller le code (break, continue, switch...) ainsi qu'au niveau des données (structures, pointeurs, tableaux statiques et dynamiques...) avec une utilisation optimale des pointeurs (équivalence d'écriture pointeurs - tableaux), ainsi qu'une possibilité de clarté par la définition de nouveaux types (typedef). - langage de bas niveau : il possède presque toutes les instructions directement existantes en assembleur sur tous les matériels, tout en restant portable : si une instruction de base n'existe pas directement sur un matériel donné, elle sera néanmoins traduite (compilée) sur tout matériel. - langages orientés objets : il en possède les principales possibilités (C++), tout en permettant un mélange avec des instructions des deux niveaux précédents Mais attention : il n'est plus rapide que si l'on sait ce que l'on fait : par exemple la possibilité d'utiliser des instructions de bas niveau n'est optimale que si l'on connaît l'assembleur (sinon on ne sait pas quelle est la solution à choisir). Exemple : quand on écrit i=i+1 (existant dans tous les langages, le compilateur cherche la valeur de i, appelle le sous-programme d'addition entre deux entiers (en général 3 tops d'horloge sur un micro-processeur) puis stocke le résultat dans i. Alors que i+=1 permet au compilateur de ne chercher qu'une seule fois l'adresse de i au lieu de 2. Mais i++ est encore plus efficace : en effet tous les assembleurs ont une instruction permettant d'ajouter 1 à un entier, bien plus rapide (1 top d'horloge) qui a été optimisée car le processeur en a souvent besoin (par exemple pour passer à la ligne suivante du programme). Sur un matériel actuel, on a gagné environ 10 puissance -8 seconde entre i=i+1 et i++, ce qui peut paraître ridicule, mais on a aussi divisé le temps par trois, ce qui est moins ridicule. néanmoins on ne sera plus rapide que si l'on connait le fonctionnement des matériels. par exemple pour multiplier un entier par 8 (2 puissance 3) il vaut mieux utiliser i<<3 qui signifie rajouter trois 0 en binaire derrière le nombre, comme nous le faisons en décimal pour multiplier par 103. En conclusion, on peut faire en C tout ce qu'on peut faire dans les autres langages, on peut en plus optimiser le programme, mais uniquement si on est expérimenté. Le principal avantage est que l'on peut mélanger les deux (n'optimiser que ce qui le mérite, c'est à dire l'intérieur des boucles imbriquées). Par contre, du fait de toutes ses possiblités, le C est un langage plus compliqué,il a tellemnt de possibilités que tous les signes habituels signifient plusieurs choses suivant l'endroit où on les utilise (par exemple * signifie multiplier, mais aussi déclare un pointeur ou signifie "objet pointé"), sans compter la possiblité de surcharge en C++ (on peut redéfinir * pour les tableaux par exemple).

Guy (ican.net, Quebec) wrote:

> > Bonjour Patrick > > Je m'intéresse depuis peu à l'informatique mais j'aimerais accéder par > moi-même au domaine de la programmation. J'ai vu et lu avec intérêt votre > site sur internet traitant de c++, Pascal, algorithmes, etc. Ma question > puisque vous permettez la copie dans votre préambule) concerne la > possibilité de télécharger votre cours au complet sur mon disque afin de > libérer internet, car je devrai passer de nombreuses heures à occuper le > réseau et la ligne téléphonique. Comment faire, car je suis novice en > informatique mais rempli d'espoir. > > Merci à l'avance > > Guy, Québec Vous pouvez télécharger le document PDF sur C par http://ptrau.free.fr/ftp/tpc.pdf, et celui sur l'algorithmique et l'infographie sur http://ptrau.free.fr/ftp/algo.pdf Il y a d'autres documents disponibles sur http://ptrau.free.fr/ftp/ (en format word et pdf).

Thierry (univ-brest.fr) wrote:

> > Bonjour, > > Je vois que vous travaillez dans le domaine du grafcet, aussi ayant > quelques travaux a effectuer mais ne sachant par ou commencer mes > recherches, je me permets de vous poser quelques questions. > > Je recherche de la documentation et des references sur les methodes pour > passer d'un schema de type grafcet a un schema de type langage cable. > Ceci afin d'effectuer une traduction ulterieure dans un langage compris > par des api, langage du TSX 07 de telemecanique. > > Merci. Bonjour, Pour cabler un Grafcet, il faut utiliser des bascules (RS par exemple). On utilise une bascule par étape. Elle est activée (entrée Set) si l'étape précédente est active et la transition est vraie. Pour la désactivation (entrée Reset), il suffit en général de la relier à la sortie de l'étape suivante (l'étape est donc réinitialisée tant que l'étape suivante est active). Ceci ne fonctionnne pas si deux étapes successives peuvent être actives en même temps (ça existe, voir par exemple http://ptrau.free.fr/autom/grafce06.htm#Heading8). Dans ce cas il faut soit insérer une bascule entre les deux étapes, soit utiliser des bascules Maître-Esclave (voir http://ptrau.free.fr/autom/autom08.htm#Heading32). Le problème vient du fait qu'il faut toujours vérifier que l'étape suivante a bien recu l'information d'activation avant de désactiver l'étape en cours. Pour le passage sur automate programmable, il est inutile de prévoir un tel câblage. Plutôt que d'utiliser des bascules, on va utiliser le fait que l'automate exécute les lignes de programme de manière séquentielle. Un programme sera donc une suite ORDONNEE d'instructions combinatoires. Je présente dans http://ptrau.free.fr/autom/automat.htm des méthodes pour créer de tels programmes sur n'importe quel API (méthodes générales). Mais d'habitude on peut obtenir un programme plus compact en utilisant les spécificités du problème que l'on désire mettre en oeuvre, et celles de l'automate (je détaille les TSX et Step7 Siemens dans mes documents).

Clavv (aol.com) wrote:

> > Aslut ! > > j'etais le 69e visiteur de ta page sur comment programmer en asm... mais > je cherche des explications un peu moins techniques, pour un debutant comme > moi... pourrais-tu m'aider ? > > bye > ;) réponse : je n'ai pas pour l'instant prévu de créer des documents plus pédagogiques en asm, j'ai d'autres documents à créer actuellement. De plus l'assembleur n'est plus une bonne solution sur PC, il vaut mieux utiliser un bon langage (C par exemple). L'assembleur ne reste utilisé que sur microcontrôleur (et encore, on peut trouver de très bons compilateurs dans divers langages). Mais je suis disponible pour des questions précises, dans la mesure de mes compétences (je ne programme plus en asm depuis quelque temps, je ne suis donc pas au courant des dernières évolutions, en particulier les spécificités des nouveaux processeurs ou Windows).

Noutsey (aol.com) wrote:

> > Bonjours. > Voila, j'ai 26 ans, j'ai un BTS en maintenance industrielle et une envie > folle de progresser dans beaucoup de domaines techniques. Pour cela, je > recherche une edition sur les automates programmables et l'automatisme en > generale pour un niveau initie - . En connaissez vous une? je vous remercie > d'avance et a bientot. > noutsey Bonjour Je suis désolé de ne pas pouvoir vous aider. Dans le domaine des automatismes, il y a une très grande quantité de livres "scolaires" très bien faits, en général prévus pour les IUT. Mais avec un BTS MAI vous avez surement déjà vu ces ouvrages, je ne pense pas qu'il y en ait des plus poussés mais qui restent généraux. Pour les automates, je n'en connais pas qui soit général, personellement j'utilise plutôt les docs des constructeurs des matériels dont je dispose. Il y a mon cours sur ce sujet (j'utilisais des TSX, maintenaqnt des Siemens), et si son niveau ne vous suffit pas je pense que la seule manière de vous améliorer consiste en de la pratique, et ce sur n'importe quel automate, une fois que l'on a acquis les principes de fonctionnement d'un matériel le passage à un autre constructeur ne devrait pas poser trop de problèmes.

Jerome (univ-ubs.fr) wrote:

> > Bonjour Monsieur Trau, > > Je recherche une methode de tri de tableau d'environ 10000 nombres en > langage FORTRAN la plus rapide et la plus efficace possible. > Pour cela j'ai pense au tri shell. Est-ce le meilleur? > Pouvez-vous me fournir un algorithme ou un programme permettant > d'effectuer ce tri. > > Je vous remercie a l'avance. > l'efficacité d'un tri dépend de plusieurs paramètres : - état initial du fichier (un fichier de 10000 valeurs n'a jamais été saisi de manière vraiment aléatoire mais dans un certain ordre) - les données à déplacer mais qui n'influent pas le tri (par exemple fichier de noms et d'adresses, trié uniquement par le nom) : tout calcul supplémentaire qui permet d'éviter un déplacement sera intéressant à condition que ce calcul prend moins de temps que le-dit déplacement. Il est rare qu'il n'y ai pas de telles données à déplacer (mais souvent ces données peuvent être limitées à un pointeur ou un entier du genre "numéro d'enregistrement"). - de l'ordinateur et du compilateur que vous utilisez. Toutes les instructions prennent un temps variable suivant votre configuration (mais fixe pour une configuration donnée). Sur tout compilateur il est plus lent d'utiliser : SI (T[I] différent de 0) ALORS X=X+T[I] à la place de X=X+T[I] si T[I] et X sont des entiers. Par contre sur des réels ca dépend de la configuration (à condition d'avoir beaucoup de T[I] nuls bien évidement). En conclusion : il n'y a pas de réponse unique à votre problème (et s'il y en avait une on la connaîtrait, vu le nombre de personnes qui se sont penchées sur ce problème). Le tri shell est effectivement un bonne méthode pour un tableau initialement aléatoire, avec aucune donnée supplémentaire à déplacer, mais je ne suis pas sur que le tri par selection, bien programmé en fonction de votre configuration, ne soit pas plus rapide. Pour des exemples, je n'en ai de disponibles qu'en C, mais à priori vous devriez pouvoir les comprendre. Regardez : http://ptrau.free.fr/program/algo03.htm#Heading11

Marie (insa-lyon.fr) wrote:

> Votre site est très intéressant et m'a beaucoup servi. Je m'interesse > plus particulièrement aux graphes. Pourriez vous me donner la > description d'un algorithme de recherche du plus court chemin dans un > graphe. J'ai entendu le nom de l'algorithme de Dijkstra. Le > connaissez-vous? E.W. Dijkstra a bien publié un article de "plus court chemin" dans le premier numéro de Numerische Mathematik (1959 !!!). Je travaille pas spécifiquement sur les graphes actuellement, les seules informations que je peux vous donner nécessiteraient que je me replonge en détail dans des livres d'algorithmique, autant que ce soit vous qui le fassiez. Par exemple, "Algorithms in C", par Robert Sedgewick, de chez Addison Wesley Publishing Company, y consacre un chapitre (je crois qu'il y a eu une traduction de JM Moreau, Mines de St Etienne) amicalement

André wrote: (club-internet.fr)

> > Bonjour je débute en pascal et je n'arrive pas à faire ce problème > > Enoncé du problème: > Le programme que vous réaliserez devra classer par ordre croissant et > décroissant une séquence de 5 chiffres compris entre 0 et 100. > Vous devrez sécuriser votre programme afin qu'aucun utilisateur ne > puisse effectuer des manoeuvres indésirables. > > Pouvez me donner la solution? Certainement pas. Ce problème est vraiment le minimum à savoir faire si l'on veut programmer. Vous donner la solution serait certainement une bien mauvaise idée. Par contre je peux vous donner quelques pistes. 1) les 5 valeurs doivent être stockées dans un tableau d'entiers 2) pour trier vous pouvez utiliser un second tableau (5 valeurs ne prennent pas beaucoup de place en mémoire). Vous recherchez le plus petit (mini<-1; pour i<-1 à 5 si tab[i]plus petit que tab[mini] alors mini<-i) Le mettre dans le second tableau et le remplacer par 101 dans le premier, recommencer 5 fois. 3) pour sécuriser il suffit de vérifier la saisie des 5 valeurs. Remplacez le readln par une boucle (répéter readln jusqu'à >=0 et <=100) bon travail

Yvan (cyceron.fr) wrote:

> > Bonjour, > > j'ai beau chercher et rechercher, je n'arrive pas a trouver la facon > d'allouer la place memoire pour un tableau triple pointeurs (voire plus) > du type unsigned char ***tab car je ne trouve de renseignements que pour > des tableaux a 1 ou 2 dimensions (quand on utilise des pointeurs). > Pourriez-vous m'aider? Je vous en serais tres reconnaissant. > Si le problème est celui que vous me posez, je n'ai aucune réponse à donner, je ne sais pas. Quand aves un problème pratique, et que vous essayez de trouver le meilleur modèle possible (modèle = manière de représenter les choses) alors peut-être que vous tomberez sur un "truc *** tab" mais moi je n'écris jamais celà ! exemple : typedef unsigned char caract; typedef caract texte[80]; typedef caract * mot; typedef mot * paragraphe; typeded paragraphe * document; mot cree_mot(void) { texte tampon; mot m; puts ("entre ton mot"); gets(tampon); m=(mot)malloc((strlen(texte)+1)*sizeof(caract)); strcpy(m,tampon); return(m); } paragraphe cree_paragraphe(void) { int n,i; paragraphe p; puts("combien de mots ?") scanf ("%d",&n); p=(paragraphe)malloc(n*sizeof(mot)); for(i=0;i<n;i++)p[i]=cree_mot(); return(p); } etc .... (en particulier cree_document) Donc je n'ecris jamais char *** document, bien que ce soit la même chose. En conclusion : tu veux traiter un problème. Tu décides quelles informations importantes tu dois stocker. Puis tu regardes si tu peux en faire une représentation arborescente (un point c'est 3 coordonnées, une ligne c'est deux points, un rectangle c'est 4 lignes ou 2 points si tu préfères économiser de la place mais recalculer les lignes à chaque fois). Tu regroupes tout ce qui a une raison logique d'être regroupé (en structure ou tableau) mais pour l'instant tu ne cherches pas la meilleure solution du point de vue informatique mais logique. Ensuite tu décides de ton modèle. C'est la partie la plus importante dans un projet en C car une fois décidé tu ne pourras plus revenir en arrière (rajouter une fonctionalité à un programme revient en général à rajouter un sous-programme, mais modifier le modèle (passer de tableau à structure par exemple) nécessite de TOUT réécrire, sauf en programmation objets). Puis tu déclares les types (typedef, en global), et tu déclares tes variables (à priori en local). Dans cette partie tu prends en compte le point de vue informatique (par exemple choisir une liste chaînée si tu vas faire beaucoup d'insertions). A partir de là tu vas créer ton code. Si tu veux un code clair, utilise une notation qui corresponde à l'opération que tu veux faire : **x si x est contient l'adresse d'un pointeur, x[i][j] si x est une matrice (bien que les deux écritures soient équivalentes). Amicalement

Marc (Canada) wrote:

> > Bonjour, > J'ai 13 ans et je voudrait apprendre le C++,dorénavant,j'ai découvert > qu'il falais apprendre le C d'abort..alors je croix que je vais m'y > lancer..... > Vous avez parler d'un programme appeller Turbot C .. si vous > l'avez..pourriez-vous me l'envoyer svp... > > Merci du font du coeur,... Bonjour Je suis désolé, mais Turbo C est un logiciel commercial, te l'envoyer serait donc du vol. Mais il existe des compilateurs en freeware ou opensource , en particulier DEVC++ (hérité de Turbo C), gcc, ... Sous Windows j'utilise CodeBlocks

Jonathan a écrit :

> > bonjour, je suis étudiant en 1ère année en fac de sciences et je > cherche a me procurer > le language de programmation pascal. est il possible de se le procurer > gratuitement en > le telechargeant par ex sur internet ? si oui pouvez vous m'indiquer > où ? > merci Dans mes cours, il y a généralement une page de liens (dans l'intro ou la conclusion), dans laquelle je propose aussi des adresses de compilateurs. Sous Windows je vous recommande particulièrement le compilateur (gratuit) CodeBlocs. Si vous êtes sous Unix vous savez surement que les meilleurs compilateurs sont chez GNU : http://www.gnu.org/home.fr.html


P. TRAU, E-Mail :