Les liens sur des fichiers de code (cx00.0, …) n'existent plus. Le cours est passé de prof à prof sans être mis à jour et sans que tout soit inclus.
Concernant les exercices cx17, cx25, je vous conseille vivement d’élaborer une synthèse qui va reprendre les astuces les plus importantes du wiki, les consignes proposées dans les pdfs : guide de travail, recommandations de présentation, ainsi que celles éparpillées dans le support de cours. Beaucoup d'informations capitales sont disséminées dans ces trois documents, ce travail de recherche d'informations devrait vous permettre de répondre aux exigences du professeur et ainsi gagner de précieux points.
Globalement, la validation de l'EC programmation impérative nécessite l'envoi :
Abstraction : utiliser le compteur de type int et la condition while. La plupart de l'exercice est résolue dans le cours ; il s'agit seulement de s'habituer à des conventions d'écriture et à observer le comportement en réponse.
Plutôt facile si l'on connaît l'opérateur d'incrémentation. En cas de segmentation fault, il serait bon de se rappeler l'existence de la valeur NULL.
Faut-il s'amuser à trouver un moyen de gérer 2 str de suite en input avec “lucky luke” ? Sans doute que non … ou si vous trouvez une solution, donnez une piste ici :) Propositions :
La fonction “compare” du pdf fonctionne, il me semble, sauf qu'elle renvoie des warnings et ça vous n'en voulez vraiment pas dans un exo à rendre. Si vous faites man qsort vous allez voir qu'il y a un problème de typage des arguments de la fonction compare. Il faut donc changer ça. Mais alors la fonction compare ne fonctionne plus du tout. Il va falloir rétablir, à l'intérieur de la fonction compare, les arguments E1 et E2, qui sont au départ des structures, dans l'exercice de leur plein droit. La méthode pour y parvenir est (assez bien) expliquée dans le poly (en anglais) sur les pointeurs cité au bas de cette page. Il faut bien comprendre le type de données qu'on attend et qu'on envoie…et qu'on veut utiliser qsort pour trier les données d'un struct! C'est peut etre encore mieux expliqué ici : http://www.bien-programmer.fr/qsort.htm
“adapter votre solution de [cx17.6] pour utiliser la bibliothèque créée pour [cx18.6].” Si vos fonctions créées pour le 18.6 sont différentes, adaptez simplement en fonction de votre série cx17. L'idée et de montrer qu'on peut créer une bibliothèque.
Il semble qu'un Makefile soit requis par l'enseignant (même si je n'ai pas réussi à trouver de trace de cette consigne). Au cas, fort improbable, ou le poly ne vous suffirait pas:
Il faut sans doute trouver un moyen dynamique pour calculer la taille de l'array :) Cette video est très bien faite (pour itérer l'array comme demandé dans la première partie de la question. Mais bien sûr, on peut quand même s'amuser à faire une length() version Lisp)
N'essayez pas de créer une fonction qui crée et retourne la table. C'est bien plus simple de la créer dans main, d'envoyer à la fonction la liste et la table et d'avoir la fonction qui rempli la table avec la liste. De cette manière, c'est plus facile de la faire “à la lisp” assez facilement.
le N caculé sur cette ligne est erroné :
int i, dec, N = sizeof(val);
il faut :
int i, dec, N = sizeof(val) / sizeof(*val) ;
Si vous souhaitez éviter une erreur, il faut aussi remplacer :
char * romain = $[1] ;
par :
const char * romain = $[1] ;
L'erreur en question en compilant avec gcc -g -std=iso9899:2018 -pedantic -pedantic-errors -W -Wall:
error: initialization discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]
char * romain = argv[1] ;
si vous voulez vraiment faire la partie “incluant la conversion en majuscule par masquage du bit 2”, il faut regarder la 2ème partie de la note “Le problème de l'effet secondaire” page 91. De plus, il semblerait qu'il faille mieux garder l'incrémentation une fois le masquage de bit effectué. ( while (*$) { *$ =(*$++) & 0xDF ;
} –>pas bon apparemment)
#include <stdio.h>
void montre(int *, int);
void vite (int *, int, int);
int partition (int *, int, int);
int main (){
int val[] = {4, 9, 1, 6, 0, 5, 8, 2, 3, 7} ;
int max = sizeof (val) / sizeof (int) - 1 ;
vite(val, 0, max) ;
montre(val, max) ;
return 0 ;
}
void montre(int * val, int max){
int x = 0 ;
while (x <= max)
printf("%i ", val[x++]) ;
puts("") ;
}
void vite (int val[], int gauche, int droite){
int pivot = partition(val, gauche, droite) ;
if (gauche < pivot)
vite(val, gauche, pivot - 1) ;
if (droite > pivot)
vite(val, pivot + 1, droite) ;
}
int partition (int val[], int gauche, int droite){
int valpiv = val[gauche] ;
while (gauche < droite){
while ((val[droite] >= valpiv) && (gauche < droite))
droite-- ;
if (gauche != droite){
val[gauche] = val[droite] ;
gauche++ ;
}
while ((val[gauche] <= valpiv) && (gauche < droite))
gauche++ ;
if (gauche != droite){
val[droite] = val[gauche] ;
droite-- ;
}
}
val[gauche] = valpiv ;
return gauche ;
}
Faisable en introduisant une option utilisateur, par exemple -s pour des chaînes de caractères, -l pour des nombres réels, et en dupliquant le code pour chaque type. Est-ce le but recherché par l'exercice ? Pas sûr…
Si ce n'est déjà fait pensez à télécharger le module de développement de python. avec la commande :
apt-get install python-dev
Une fois votre module pour python créer dans un dossier build grâce à la commande donnée dans le cours :
python sreverse.setup build
Vous devenez coller ce module dans le site package de votre version de python. (j'ai utilisé python2.7). Cela étant il faut trouver le PYTHON PATH, pour cela lancer un interpréteur python importez le module sys et affichez la variable sys.path. Sys.path est un tableau qui contient tous les chemins que python parcourt quand il recherche un module.
Vous pouvez également installer directement votre module dans le site package avec la commande suivante :
python sreverse.setup install
Les droits d’administrateur seront peut être nécessaire. Cette commande vous installera directement votre module. Chez moi il s'est installé dans /usr/local/lib/python2.7/dist-packages avec des droits d'utilisateurs restreint. Il est judicieux de vérifier après l'installation que votre module puisse être lisible et exécutable par tout le monde.
Les liens vers la documentation ne sont plus bon, voici le nouveau, plus un autre lien vers une page qui m'a aidé : https://docs.python.org/fr/2.7/extending/ http://apprendre-python.com/page-python-path-pythonpath
Pour ceux qui utilisent Python3, il faut créer une structure PyModuleDef dans le code sreverse.c, qui contient le code suivant :
static struct PyModuleDef sreversedef = {
PyModuleDef_HEAD_INIT,
"sreverse",
NULL,
-1,
sreversemethods };
puis remplacer cette ligne :
void initsreverse() {Py_InitModule("sreverse",sreversemethods) ; }
par la suivante :
PyMODINIT_FUNC PyInit_sreverse(void)
{return PyModule_Create(&sreversedef) ;}
Le chapitre 13 d'architecture des ordinateurs (ADO) mentionné dans le cours a été largement remanié en 2021 et s'appelle maintenant le chapitre 10.
Indiquer les mnémoniques qui correspondent aux valeurs suivantes dans la mémoire. Commenter le programme. Que fait-il ?
adresse | valeur | valeur |
---|---|---|
50 | 49 | 70 |
52 | 40 | 70 |
54 | 48 | 71 |
56 | 48 | 72 |
58 | 00 | 5E |
5A | 48 | 8d |
5C | 10 | 74 |
5E | 40 | 71 |
60 | 48 | 72 |
62 | 40 | 70 |
64 | 48 | 71 |
66 | 00 | 6C |
68 | 48 | 8d |
6A | 10 | 74 |
6C | 41 | 71 |
6E | 10 | 6E |
70 | 00 | |
71 | 00 | |
72 | 00 | |
73 | 00 | |
74 | 00 | 00 |
76 | 48 | 73 |
78 | 40 | 71 |
7A | 12 | 88 |
7C | 21 | 01 |
7E | 48 | 71 |
80 | 40 | 73 |
82 | 60 | 72 |
84 | 48 | 73 |
86 | 10 | 78 |
88 | 40 | 73 |
8a | 48 | 71 |
8c | 10 | 00 |
Exercice 13.8 : (Assez difficile) Dans la mémoire, on trouve de l’adresse 30 à 45 les valeurs suivantes : 10 3a 00 31 40 32 60 33 48 32 49 33 40 33 22 ff 12 34 41 32 10 44. Dans PC se trouve 30. Que fera ce programme quand l’ordinateur en papier va tourner et l’exécuter ?
L‘ancien prof (Mariage) avait des exigences assez précises sur ce qu'il attendait, mais elles sont loin d'être mentionnées explicitement dans les documents du cours. En fonction des retours des autres étudiants, on peut essayer d'en créer une liste pour aider les étudiants à survivre. Aucune idée sur la manière de noter de la nouvelle prof (si c’est bien une prof). Hésitez pas à modifier cette page si vous avez des infos.
C'est dit nulle part, mais apparemment il faut :
Il faut sous peine de se voir retirer des points :
Les déclarations en C sont particulièrement difficiles et source d'erreurs. Par exemple, quelle-est la différence entre ces déclarations ?
char * txt;
const char * txt;
char const * txt;
const char const * txt;
char * const txt;
const char * const txt;
La règle (standardisée) est la suivante:
Donc:
char * txt; // un pointeur sur des caractères
const char * txt; // un pointeur sur des caractères constants
char const * txt; // La même chose: un pointeur sur des caractères constants
const char const * txt; // La même chose mais un des deux const est redondant.
char * const txt; // Un pointeur constant sur des caractères (non constants)
const char * const txt; // Un pointeur constant sur des caractères constants
Pour vous aider, il y a un site très pratique: https://cdecl.org. Par exemple:
Et quoi penser du typedef utilisé par plusieurs profs de l'IED ?
typedef char * str;
Que va donner la déclaration suivante qui utilise ce typedef ?
const str txt;
txt
est un pointeur sur une chaine constante, comme en C++ (argument mis en avant par l'un des profs) ? Pas du tout ! str
un le type « pointeur sur des caractères ». Donc const str
c'est un pointeur constant sur des caractères non-constants. Alors comment écrire correctement avec le typedef ? On ne peut pas ! Il y a deux solutions: soit créer deux typedef, soit ne pas utiliser de typedef. Pour donner des exemples, Microsoft a choisi la première solution (extrait des sources de Windows):
typedef CHAR * LPSTR;
typedef WCHAR * LPWSTR;
typedef const CHAR * LPCSTR;
typedef const WCHAR * LPCWSTR;
Linux (Linus Torvalds) a choisi la deuxième solution (extrait des sources du Kernel Linux):
int of_at91_get_clk_range(struct device_node *np, const char *propname, struct clk_range *range);
Et si vous pensez que c'est compliqué, il a pire:
const char * f(const char * (*)(const char *))