programmation en c

Tout ce qui se rapporte à l'informatique en général
Répondre
Avatar du membre
tristesire
Zone privée MT Libristes
Zone privée MT Libristes
Messages : 365
Enregistré le : 01 juin 2008, 00:05
Localisation : st etienne

programmation en c

Message par tristesire »

Je m'initie progressivement à la programmation en Cn et j'avoue que j'en chie pas mal, mais à force de persévérence, je finit par arriver à sortir un code qui fonctionne.
En revanche, y a un truc qui m'orripile, c'est lorsque je tente de compiler sous Windows un code réalisé pous Linux. Le résultat n'est pas le même, alors que le code est identique, ainsi que le compilateur (j'utilise code blocks).
Savez-vous d'où ca peut provenir?
Image
Avatar du membre
Florimond
Zone privée MT Libristes
Zone privée MT Libristes
Messages : 182
Enregistré le : 30 décembre 2008, 13:24
Localisation : Liège

Re : programmation en c

Message par Florimond »

Quelles librairies utilises-tu? Les librairies standards devraient se comporter de la même manière. Par contre rien n'est garanti pour les autres. Par exemple, la version de Curses pour Linux me donnait des résultats un peu différents de la version Windows. Une librairie multi plateforme signifie qu'on a fait une version par plateforme. Idéalement elles se comporte de manière comparable sur toutes les plateformes supportées, mais ce n'est pas toujours le cas en pratique. Il faut donc un peu de travail d'adaptation quand même de la part de l'utilisateur de la lib.

Le site du zero est excellent pour acquérir de bonnes bases en C.
Modifié en dernier par Florimond le 21 août 2010, 16:27, modifié 1 fois.

Évènement sponsorisé par: Google, Cisco, SourceForge, HP, Linux Magazine, Codeplex, Qualocomm, Belnet, et le LPI !
Avatar du membre
tristesire
Zone privée MT Libristes
Zone privée MT Libristes
Messages : 365
Enregistré le : 01 juin 2008, 00:05
Localisation : st etienne

Re : programmation en c

Message par tristesire »

je programme avec les librairies standards, et dérivées de la SDL. A priori, ce qui semble clocher porterai sur un code standard.

if (event.button.x > iconededuche.x && event.button.x iconededuche.y && event.button.y 0)
                                {
                                    d--;
                                }
                                switch (d)
                                {
                                    case 1:
                                    texteduche = SDL_LoadBMP ("arlatt/duchedefer.bmp");
                                    SDL_BlitSurface (texteduche,NULL,ecran,&positiontexteduche);
                                    SDL_Flip (ecran);
                                    break;

                                    case 2:
                                    texteduche = SDL_LoadBMP ("arlatt/duchedefelici.bmp");
                                    SDL_BlitSurface (texteduche,NULL,ecran,&positiontexteduche);
                                    SDL_Flip (ecran);
                                    break;

                                    case 3:
                                    texteduche = SDL_LoadBMP ("arlatt/duchedesaristo.bmp");
                                    SDL_BlitSurface (texteduche,NULL,ecran,&positiontexteduche);
                                    SDL_Flip (ecran);
                                    break;

                                    case 4:
                                    texteduche = SDL_LoadBMP ("arlatt/duchedefrostheim.bmp");
                                    SDL_BlitSurface (texteduche,NULL,ecran,&positiontexteduche);
                                    SDL_Flip (ecran);
                                    break;

                                    case 5:
                                    texteduche = SDL_LoadBMP ("arlatt/duchedenardjar.bmp");
                                    SDL_BlitSurface (texteduche,NULL,ecran,&positiontexteduche);
                                    SDL_Flip (ecran);
                                    break;
                                }
                            }

Voilà la partie de code qui se comporte différemment. Après compilation sous Linux,  chaque fois que je clique sur l'icone avec le bouton droit, comme avec le bouton gauche, la variable d s'incrémente ou se decremente correctement. On le constate à l'affichage puisque chaque clic génére un case avec l'affichage adéquat.
Sous Windows, on passe du case 1 au case 5, c'est assez zarbi.
Donc ca veux dire que je vais devoir retravailler le code sur chaque plateforme pour les parties discordantes? Bon ok merci.
Sinon oui c'est la bas que j'ai commencé à acquérir mes connaissances, en achatnt le livre de M Nebra.
Image
Avatar du membre
Florimond
Zone privée MT Libristes
Zone privée MT Libristes
Messages : 182
Enregistré le : 30 décembre 2008, 13:24
Localisation : Liège

Re : programmation en c

Message par Florimond »

On dirait que lors d'un clique il n'enregistre pas qu'un évènement. En fait, je ne connais pas SDL (la dernière fois que j'ai géré la souris en C c'était directement avec l'API de Windows :/) mais la question que je me pose c'est "est ce que tu es en train de vérifier qu'il y a eu un clique gauche/droit ou est ce que tu vérifie que le bouton gauche/droit est enfoncé?" parce que c'est très différent. Dans le second cas l'évènement pourrait être généré plusieurs fois rapidement au cours d'un seul clique - le nombre de fois dépendant du temps que tu laisses le bouton enfoncé... vois-tu ce que je veux dire? Mais c'est peut-être une fausse piste...

Sinon pourquoi fais tu deux IF au lieu d'un IF/ELSE IF? les deux boutons peuvent être enfoncés en même temps?

Et surtout, dans ce genre de cas je préfère produire un code automatique que de partir dans des longs Switch. Ici tu peux faire une fonction contenant

                                    texteduche = SDL_LoadBMP (chemin);
                                    SDL_BlitSurface (texteduche,NULL,ecran,&positiontexteduche);
                                    SDL_Flip (ecran);
                                    break;

Et passer le chemin en paramètre. Mais tu peux faire encore beaucoup mieux! Charger tous les chemins possibles dans un vecteur, de 1 à 5
Je n'ai pas fait de C depuis quelque temps mais un truc comme ça devrait marcher...

char* fichier[6];
fichiers[1] = "arlatt/duchedefer.bmp";
fichier[2] = "..."
...

et puis ton switch se réduit à

                                    texteduche = SDL_LoadBMP (fichier[d]);
                                    SDL_BlitSurface (texteduche,NULL,ecran,&positiontexteduche);
                                    SDL_Flip (ecran);

Ici le système est présenté avec une donnée. Mais tu pourrais faire la même chose si ton switch appelait des fonctions différentes à chaque "case". Sauf que dans ton vecteur tu aurais dans chacune des cases un pointeur de fonction.

Bon courage pour ton bug
Modifié en dernier par Florimond le 21 août 2010, 18:30, modifié 1 fois.

Évènement sponsorisé par: Google, Cisco, SourceForge, HP, Linux Magazine, Codeplex, Qualocomm, Belnet, et le LPI !
Avatar du membre
tristesire
Zone privée MT Libristes
Zone privée MT Libristes
Messages : 365
Enregistré le : 01 juin 2008, 00:05
Localisation : st etienne

Re : programmation en c

Message par tristesire »

Je sens que tu maitrises là :p.
Le code est plus long que celà en fait. Je part d'un SDL_MOUSEBUTTONDOWN qui vérifie si l'un des boutons de la souris est enfoncé.
La seconde condition vérifié cumule la vérification du clic gauche et d'une collision avec une surface (une variable  bouton) et une autre condition bouton droit de la souris et collision. Dans le premier cas, la variable d est incrémente, dans la seconde elle est decremente. Selon la valeur qu'elle prend, j'appliuqe un résultat.
Je t'accorde que le code est peu optimisé et que je pourrait faire plus de fonctions pour l'alléger.  :penseur:
Je vais réflechir à ta solution qui me semble très synthétique, histoire de voir si ca change quelque chose
En tout cas merci pour tes conseils.   
Image
Avatar du membre
jip
Administrateur
Administrateur
Messages : 2607
Enregistré le : 22 février 2008, 21:00
Localisation : Toulouse
Contact :

Re : programmation en c

Message par jip »

bon en dehors de l'écriture du code proprement dite (car y'a aussi la possibilité d'une initialisation de tableau statique avec { "fichier1.bmp", "fichier2.bmp" },

ce qui serait pas mal, comme elle est pas mal utilisée et manipulée, de voir la déclaration de la variable d (son type entre autre), ainsi que son initialisation ....

car une variable non initialisée, ça peut vite être la fête ...

et se méfier aussi des conversions implicites. et donc du comportement des opérateurs.

edit : ah aussi, pour des questions d'écritures indépendantes des optimisations des compilateurs (car le compilo réécrira en principe pour plus opti), essaye quand ça n'a pas d'importance (ce qui est ton cas là) de faire plutôt ++d et --d, au lieu de d++ et d--. la répétition du chemin de base aussi("arlatt/"), pas top, une déclaration de constante serait pas mal (ou éventuellement un #define). et le case n'a pas de "default" ? y'a un "SDL_FreeSurface(texteduche)" quelque part ?
Modifié en dernier par jip le 21 août 2010, 20:25, modifié 1 fois.
Un synonyme, c'est un mot qu'on écrit pour remplacer celui dont on ne connait pas l'orthographe. (source inconnue). L'imagination est plus importante que le savoir. (Albert Einstein)

[align=center]Image[/align]

BoincLibristes, FreeTorrent, Ma brute
Avatar du membre
Florimond
Zone privée MT Libristes
Zone privée MT Libristes
Messages : 182
Enregistré le : 30 décembre 2008, 13:24
Localisation : Liège

Re : Re : programmation en c

Message par Florimond »

jip a écrit : car une variable non initialisée, ça peut vite être la fête ...
qu'est-ce qu'on se prend la tête pour des bêtises comme ça au début  :murbric:
Mais bon, si c'est ça il n'y a pas de raison que ça fonctionne mieux sous Linux...

Sinon je ne vois pas pourquoi tu veux qu'il fasse une pré incrémentation à la place d'une post... après vérification avec turbo c compiler... comme on pouvait s'y attendre le code généré est exactement le même! un "inc si" dans les deux cas... alors pourquoi cette préférence si ce n'est pas pour la performance?


_main proc near
push si
; ?debug L 4
inc si
; ?debug L 5
inc si
@1:
; ?debug L 6
pop si
ret

Tu sais moi j'ai même eu un prof qui voulait qu'on écrive "i = i + 1" parce qu'il trouvait ça plus lisible, alors que là le code compilé est moins performant (quand le compilo est pas malin)...
Modifié en dernier par Florimond le 21 août 2010, 21:17, modifié 1 fois.

Évènement sponsorisé par: Google, Cisco, SourceForge, HP, Linux Magazine, Codeplex, Qualocomm, Belnet, et le LPI !
Avatar du membre
jip
Administrateur
Administrateur
Messages : 2607
Enregistré le : 22 février 2008, 21:00
Localisation : Toulouse
Contact :

Re : programmation en c

Message par jip »

parce que là tu regarde le code généré par une optimisation du compilateur.

or en post-incrémentation, sans optimisation, tu as création d'une variable temporaire, car il te faut, sur l'instruction, la valeur courante et la valeur incrémentée. avec qu'avec la pré-incrémentation, tu incrémente directement la variable utilisée. dans le cas que tu montre, tu ne sais pas si le résultat est de ton fait ou le résultat de l'optimisation du processeur. par exemple avec les fonctions, un compilo peut très bien remplacer par du inline alors que tu ne l'as pas déclaré. il optimise en vitesse en économisant des sauts et des empilements.

c'est une habitude qu'ont plusieurs programmeurs système et qu'on voit encore aussi dans l'embarqué. et dans ces 2 cas on ne compte pas forcément sur le fait que la plupart des compilos actuels font les optimisations a ta place.

du reste dans l'embarqué faut même jongler entre taille et vitesse. comme je m'y remet doucement, j'ai abusé des directives "inline" et des macro de pré-processeur, mais quand j'ai atteins la limite mémoire, je me suis un peu calmé de ce coté là. faut trouver le juste milieu.

sinon, coté lisibilité on peut s'amuser :


SDL_BlitSurface (texteduche = SDL_LoadBMP(fichier[((event.button.button == SDL_BUTTON_LEFT && d 0) ? --d :  d))]), NULL, ecran, &positiontexteduche);

:evil: :evil: :grin: :grin: :grin:

mais à ne pas reproduire car là en lisibilité c'est pourri.

pour ce qui est du pb de variable non initialisée, là c'est pareil, suivant l'os et le compilo, les valeurs initiales par défaut ne sont pas toujours identiques.

donc on a dû te dire en cours que toute variable doit être initialisé par ses soins et de ne pas compter sur des valeurs par défaut hypothétiques.

je te parle même pas du cas d'un pointeur non initialisé qui référence une zone mémoire aléatoire ... le nombre de bugs qu'on voit encore avec ça ...

y'a aussi les débordements de tableaux, où quelques compilateurs proposent de compenser ou d'alerter.

c'est sûr que si tu te repose toujours sur les spécificité d'un compilo, coté portage ça peut devenir amusant.

et là entre autre avec code::blocks, il est dans le cas de 2 compilo différents je pense (mingw et gcc peut-être, non ?).
Modifié en dernier par jip le 21 août 2010, 21:55, modifié 1 fois.
Un synonyme, c'est un mot qu'on écrit pour remplacer celui dont on ne connait pas l'orthographe. (source inconnue). L'imagination est plus importante que le savoir. (Albert Einstein)

[align=center]Image[/align]

BoincLibristes, FreeTorrent, Ma brute
Avatar du membre
Florimond
Zone privée MT Libristes
Zone privée MT Libristes
Messages : 182
Enregistré le : 30 décembre 2008, 13:24
Localisation : Liège

Re : programmation en c

Message par Florimond »

Vu pour la pré/post (mon compilo est malin même sans que je ne lui demande pas d'optimisation  :grin:)

Oui tristesire, puisque jip l'utilise dans son exemple... tu connais l'opérateur ternaire

condition? réponse si TRUE:réponse si FALSE

c'est pas sur le site du zéro mais je trouve ça très élégant dans certains cas  :smiley:



heuuu oui mais non, c'est pas que les valeurs par défaut sont différentes selon le compilo ou l'os, c'est juste que tu chopes les valeurs du programme qui a tourné avant sur l'emplacement mémoire que tu viens de réserver. Et que tu déclares une variable automatiquement ou que tu l'aloues toi même, quelque soit le compilateur, en C, la zone mémoire n'est jamais initialisée (sauf bien sûr emploi de calloc etc)... [en tout cas je voudrais bien voir un compilo C qui initialise les zones mémoires à 0!]

Enfin, oui sous windows avec codeblocks il utilise normalement ming, contre évidemment gcc sous linux; mais théoriquement ming "is a port of the GNU Compiler Collection (GCC), and GNU Binutils"
Modifié en dernier par Florimond le 21 août 2010, 22:16, modifié 1 fois.

Évènement sponsorisé par: Google, Cisco, SourceForge, HP, Linux Magazine, Codeplex, Qualocomm, Belnet, et le LPI !
Avatar du membre
jip
Administrateur
Administrateur
Messages : 2607
Enregistré le : 22 février 2008, 21:00
Localisation : Toulouse
Contact :

Re : programmation en c

Message par jip »

Florimond a écrit : Oui tristesire, puisque jip l'utilise dans son exemple... tu connais l'opérateur ternaire
c'est beau dit comme ça.  :grin: :wink: ça me rappelle quand je lisais des bouquins. ceci étant c'est bon à savoir quand on utilise la STL ou la lib Boost car c'est une terminologie qui est utilisée (notamment pour le traitement dans les conteneurs.).


tu verras que certains compilos (me rappelle pas exactement lesquels), initialisent, par exemple, les entiers, signés ou non, à 0 à la déclaration, et certains ne le font pas.

sinon, tu verras que tous les compilos déclarent qu'ils sont 100% conformes au C ou au C++ ... et après y'a la réalité ... sinon, on s'embêterait pas autant pour les portages ... (sans parler des pbs little et big endia ...).

enfin bon on va pas épiloguer sur les joies de la prog, multi-compilo ou multi-os.

sinon, pour son prg, sans plus de code que ça, difficile de donner de vrai pistes, surtout si le pb se niche ailleurs, ou dans une option de compilo qui est différente entre les versions win ou linux ...
Modifié en dernier par jip le 21 août 2010, 22:26, modifié 1 fois.
Un synonyme, c'est un mot qu'on écrit pour remplacer celui dont on ne connait pas l'orthographe. (source inconnue). L'imagination est plus importante que le savoir. (Albert Einstein)

[align=center]Image[/align]

BoincLibristes, FreeTorrent, Ma brute
Avatar du membre
Florimond
Zone privée MT Libristes
Zone privée MT Libristes
Messages : 182
Enregistré le : 30 décembre 2008, 13:24
Localisation : Liège

Re : Re : programmation en c

Message par Florimond »

jip a écrit : sinon, tu verras que tous les compilos déclarent qu'ils sont 100% conformes au C ou au C++ ... et après y'a la réalité ... sinon, on s'embêterait pas autant pour les portages ... (sans parler des pbs little et big endia ...).
C'est ce que j'étais en train de me demander (confirmé par un ami sans que j'aie consulté moi-même le K&R ... faudra que je m'y mette ^^), l'initialisation des variables ferait sortir le compilateur de la norme AINSI C...
bref comme tu dis...

Évènement sponsorisé par: Google, Cisco, SourceForge, HP, Linux Magazine, Codeplex, Qualocomm, Belnet, et le LPI !
Avatar du membre
tristesire
Zone privée MT Libristes
Zone privée MT Libristes
Messages : 365
Enregistré le : 01 juin 2008, 00:05
Localisation : st etienne

Re : programmation en c

Message par tristesire »

et bien que de reactions :p
Faut que je note tout ca pour tester à froid. Sinon, oui, la variable d est initialisée à 0 de sortes que chaque incrementation donne la valeur désirée.
Et oui, il y a deux compilateurs différents, gcc sous Linux mingw sous Windows. Je connaissais l'ecriture ternaire, mais je l'emploie encore trop peu, c'est mon premier véritable projet et bie nque je bloque souvent, j'arrive à trouver des solutions satisfaisantes du point de vue du resultat.
Pour l'optimisation, j'en suis encore loin, j'avoue que c'est pas encore mon objectif.
Je pourrais mettre le code, mais  ya pas une option du fofo pour pas alourdir? Sinon, je semble avoir déjà la confirmation que les réactions peuvent diverger d'un OS à l'autre donc il faudra que je le rebosse sous chaque version.
Mais le pire risque de venir car je souhaitrais  compiler une verison mac, et j'ai pas de mac. Alors si les reactions divergent aussi sous Mac, je suis pas rendu :p
Image
Avatar du membre
Florimond
Zone privée MT Libristes
Zone privée MT Libristes
Messages : 182
Enregistré le : 30 décembre 2008, 13:24
Localisation : Liège

Re : programmation en c

Message par Florimond »

Code : Tout sélectionner

si tu utilises les balises "code" il devrait te mettre des ascensseurs à partir d'une certaine longueur, non?
Sinon il y a toujours http://pastebin.com/

Mais bon, ça dépend si tu voulais juste la confirmation qu'il y a toujours un peu de travail d'adaptation ou si tu voulais que quelqu'un t'aide à résoudre ton problème...

Edition: si on faisait un site original où on peut poster du code et le commenter un peu comme sur pastebin, mais par projet complet avec l'arborescence dans un panneau latéral et tout?!
Modifié en dernier par Florimond le 22 août 2010, 00:34, modifié 1 fois.

Évènement sponsorisé par: Google, Cisco, SourceForge, HP, Linux Magazine, Codeplex, Qualocomm, Belnet, et le LPI !
Avatar du membre
jip
Administrateur
Administrateur
Messages : 2607
Enregistré le : 22 février 2008, 21:00
Localisation : Toulouse
Contact :

Re : programmation en c

Message par jip »

@tristesire : ben juste du source en gzip en fichier joint, ici ça passerait. mais bon ça dépend de la taille globale, et aussi, si tu poste plusieurs version ça va scorer à force.

@florimond : t'as pas de l'espace web dispo toi ? des noms de domaines ? envie de développer web sans trop savoir quoi faire exactement ? ben t'as  un sujet et un objectif là. à toi.
Un synonyme, c'est un mot qu'on écrit pour remplacer celui dont on ne connait pas l'orthographe. (source inconnue). L'imagination est plus importante que le savoir. (Albert Einstein)

[align=center]Image[/align]

BoincLibristes, FreeTorrent, Ma brute
Avatar du membre
tristesire
Zone privée MT Libristes
Zone privée MT Libristes
Messages : 365
Enregistré le : 01 juin 2008, 00:05
Localisation : st etienne

Re : programmation en c

Message par tristesire »

Bon la programmation en SDL a ses limites. J'avais mis de côté mon petit projet pour faire autre chose.
Là, je viens de me replonger dans le langage de programmation et en lisant plusieurs choses, je suis tombé sur les bibliothèques natives. Entre autre l'api win 32 pour Windows et Xlib pour Linux.
Les principes généraux sont assez proches de la SDL (dans les grandes lignes bien sûr), bien que plus long à coder et plus compliqué.
Par contre, je bute sur un problème que j'ai du mal à résoudre sur le Xlib, je m'explique :
dans les premières lignes de code, il semble nécessaire d'établir une connection avec le serveur X. J'ai essayé des codes, mais la plupart du temps, il semble y avoir des problèmes sur cette **** de connection X.
L'un d'entre vous aurait déjà eu l'occasion de programmer avec Xlib et de m'aiguiller un poil?
Image
Répondre