Affichage des articles dont le libellé est Programmation. Afficher tous les articles
Affichage des articles dont le libellé est Programmation. Afficher tous les articles

jeudi 24 janvier 2008

Tableaux à deux dimensions et passages de paramètres en langage C

Dans le langage C, les crochets que l'on utilise pour encadrer les index d'un tableau ne sont, en réalité, qu'une façon de déréférencer un pointeur.
Si ptr est un pointeur, et n un nombre entier, alors l'expression ptr[n] est strictement équivalente à *(ptr + n). Vous pourrez vérifier que ces deux notations sont équivalentes par vous-même.
Ces deux notations permettent de déréférencer un pointeur sur un tableau à une dimension. Intéressons-nous maintenant au cas d'un tableau à deux dimensions défini de la manière suivante :
int matrice[NB_LIGNES][NB_COLONNES]
Dans ce cas, l'expression matrice[ligne][colonne] est strictement équivalente à :
matrice[(NB_COLONNES * ligne) + colonne]
elle-même strictement équivalente à :
*(matrice + (NB_COLONNES * ligne) + colonne)
Ainsi, le compilateur a besoin du nombre de colonnes d'un tableau à deux dimensions pour pouvoir réinterpréter une notation du type matrice[ligne][colonne]. C'est pourquoi cette dimension doit être précisée lors du passage d'un tableau à deux dimensions comme paramètre d'une fonction.
En fait, lors de la transmission d'un vrai tableau à deux dimensions, le paramètre effectivement transmis est un pointeur sur le premier sous-tableau, et non un pointeur sur le premier élément.
Le passage du tableau matrice à une fonction devra donc se faire de la façon suivante :
void fonction(int (*matrice)[NB_COLONNES]) ;
Une autre notation possible, bien qu'elle masque la véritable nature du paramètre transmis (ce qui n'est pas bien), est :
void fonction(int matrice[][NB_COLONNES]) ;
L'inconvénient évident est que les fonctions ainsi définies ne sont absolument pas générales puisqu'elles ne peuvent manipuler qu'un tableau de NB_COLONNES. Le prix de la généricité est l'abandon du vrai tableau au profit de l'allocation dynamique.

samedi 15 décembre 2007

Diffuser une application sous Linux

En raison de la prolifération des distributions des systèmes Unix (et Linux) la diffusion d'une application, que l'on a programmé, pose de réels problèmes, bien plus que sous Windows. Vous trouverez sur Internet de nombreux articles intéressant traitant du sujet comme : Deploying an Application on Qt/X11.

La solution que je propose ici n'est pas très élégante, mais elle possède l'avantage d'être simple et fonctionnelle. Cette solution consiste à utiliser la commande ldd pour connaître toutes les dépendances de l'application et à diffuser l'application accompagnée de toutes ses dépendances.

Voici un petit script qui réalise tout cela automatiquement.

Il fonctionne de la manière suivante :
./gen_package.sh \ou\est\le\program \ou\generer\le\package
Dans le répertoire \ou\generer\le\package vous trouverez :
  • un répertoire contenant toutes les librairies dont dépend l'application ;
  • l'application en question désignée par \ou\est\le\program au script ;
  • un script portant le même nom que l'application, permettant de lancer l'application et rendant accessible le répertoire où se trouvent les librairies dont dépend l'application. C'est donc ce script qu'il faut appeler pour lancer l'application. Le répertoire ainsi créé peut êtrer diffusé sans problème.

mardi 30 octobre 2007

Cours : Logiques du raisonnement valide

Le but de la logique est de calculer des conclusions sûres. Le langage naturel s'avère trop imprécis et riche pour permettre des développements simples et rigoureux.
La logique est un outil pour parler et raisonner dans un domaine déterminé. Différents domaines ont différentes logiques. C'est un problème à la fois philosophique et mathématique que de savoir si une logique donnée est adéquate pour un domaine particulier.
Les logiques classiques (la logique des propositions et la logique des prédicats) ont été créées pour raisonner sur des objets mathématiques. Comme ces objets sont conceptuellement assez simple, ces logiques le sont aussi. Tout comme en mathématiques, les systèmes déductifs de la logique classique se limitent à la formalisation du raisonnement valide.

Table des matières :
  • Logique des propositions
  • Logique des prédicats
  • Programmation logique : PROLOG