# Aide pour développer en C++ sous Mac OS.



## Museforever (19 Mai 2008)

Bonjour.

Je suis actuellement en IUT R&T et nous faisons un peu de programmation. Bien sûr, sous Windows ...

Or pour travailler dans de bonne conditions, je suis obligé de rebooter sous windows (pas de virtualisation avec paralells), ce qui commence à m'agacer.

De plus, je peux ouvrir mon programme avec xcode, et je trouve que la présentation est très agréable. J'aimerai donc pouvoir le développer sous Mac OS.

La programmation n'étant pas le but de notre formation, nous restons dans des choses simples et tout nos programmes fonctionnent dans une fenêtre dos. J'utilise habituellement dev C++ pour travailler.

Notre premier programme fut un Pacman, et nous réalisons actuellement un logiciel de traitement d'image basique (pas d'affichage dans la fenêtre, juste des lignes de commande à taper pour les différents traitements (agrandir, supprimer une couleur ...)).

Est-ce donc possible de développer mon programme sous Mac OS et qu'il fonctionne sous Windows ?

Merci !


----------



## ntx (19 Mai 2008)

Si tu n'utilises que des librairies qui fonctionnent sur les deux plate-formes, oui.


----------



## PA5CAL (19 Mai 2008)

Bonsoir

Tant qu'on en reste aux choses très basiques, on peut développer et exécuter les programmes sous Mac OS X, puis les recompiler et les exécuter sous Windows.

Par contre les limitations sont nombreuses.

Il est inutile de préciser qu'à moins de développer totalement "en aveugle" (sans pouvoir tester), on ne doit pas utiliser l'API Windows, ni même les autres interfaces spécifiques à l'OS de Microsoft (système de fichier, console, accès au matériel, DLL, etc.).

En revanche, ce qui est moins évident, c'est que comme Microsoft  a pris l'habitude de ne pas respecter les standards, il ne faut pas non plus s'attendre à pouvoir recompiler un programme créé dans les règles de l'art avec un compilateur de Microsoft (MSVCxx et consort) sans subir quelques incidents.

Mais si je ne m'abuse, Dev-C++ est basé sur Mingw, qui est un portage sous Windows du compilateur GCC qu'on trouve sur Mac OS X. Je ne sais pas ce que cela donne au juste, mais ça paraît plutôt encourageant.

Il faudrait essayer pour voir. (Désolé de ne pouvoir t'en dire plus).


----------



## Museforever (20 Mai 2008)

Merci pour vos réponses.

Voici les libraires que j'utilise :

#include <iostream>
#include <iomanip>
#include <fstream>
#include <sstream>
#include <myconio.h>
#include <limits>

Je ne sais pas à quoi la dernière sert, je pense que je ne l'utilise pas.

Pascal, tu me parles d'API mais je ne sais même pas ce que c'est donc je ne sais pas si ça peut poser un problème. Je n'utilise pas de dll ou autres, j'ai juste mon fichier cpp avec ton mon programme dedans. Quand je compile sous Windows, ça me fait un .exe. Quand je le lance le programme, il s'ouvre dans une fenêtre de commande (comme quand on tape cmd dans exécuter).

Je me doute que si je le compile avec xcode il ne va pas me sortir un .exe et ne marchera pas sous Windows. Ce que j'aimerai faire, c'est le continuer sous xcode et le tester sous mac os. Une fois que j'aurai complètement terminé mon programme je n'auraii plus qu'à copier le code dans dev c++ pour qu'il me le compile pour Windows.

Je joint mon programme, si quelqu'un aurait la gentillesse de voir s'il est possible de le faire marcher sous Mac OS ça serait très très gentil de sa part !


----------



## PA5CAL (20 Mai 2008)

L'include <myconio.h> n'existe pas, mais ne semble pas non plus être utilisé (j'ai donc éliminé la ligne). D'ailleurs, comme je le disais plus haut, ce qui concerne la console poserait probablement des problèmes.

En tout cas, ça compile et ça tourne sous XCode (ou en tout cas ça semble tourner vu le peu que j'ai fait avec, puisque je n'ai pas vraiment regardé toutes les commandes qu'on pouvait entrer au prompt).


----------



## Museforever (20 Mai 2008)

Merci de ta réponse !

Pour les commandes ce n'est pas un problème je les testerai, déjà le fait que le programme se lance est un grand pas pour moi !

En effet, quand j'ouvre mon fichier .cpp (en double cliquant directement dessus) les options build run et tout sont grisées ! Y'a-t-il quelque chose à faire ?


----------



## PA5CAL (20 Mai 2008)

Museforever a dit:


> En effet, quand j'ouvre mon fichier .cpp (en double cliquant directement dessus) les options build run et tout sont grisées ! Y'a-t-il quelque chose à faire ?


Dans Xcode, il faut en fait commencer par créer un projet :
- faire menu "File" > "New Project..."
- sélectionner "Command Line Utility"/"C++ Tool" puis faire "Next"
- choisir le nom du projet (et éventuellement changer le dossier dans lequel il sera créé), puis faire "Finish".
Par défaut, le dossier du projet est créé sous le dossier principal du compte (la "maison" 
	

	
	
		
		

		
			





).


On peut directement éditer le fichier _main.cpp_ créé par défaut en double-cliquant dessus dans la liste. Mais on peut aussi le supprimer et ajouter le fichier qu'on désire en faisant click droit (ou Ctrl+click) sur le dossier des sources dans la barre latérale (à gauche) et faire "Add" > "Existing Files..." et en choisissant son fichier, de préférence préalablement recopié dans le dossier du projet (c'est plus propre que d'en mettre partout).


----------



## PA5CAL (20 Mai 2008)

Pour lancer la compilation et vérifier les erreurs, il suffit de cliquer sur le bouton "Build".

Pour compiler puis exécuter le programme dans une console XCode, il faut cliquer sur le bouton "Build and Go".


----------



## Museforever (20 Mai 2008)

Ok maintenant je peux compiler !

Le problème est qu'il me fait des erreurs : -myconio.h (je l'ai donc supprimée).

Ensuite j'ai eu un problème dans les 2 dernières fonctions, parce que je déclarais 2 fois les mêmes variables (i et j, une fois au début et une fois dans la boucle).

Maintenant il m'indique qu'il y a 4 erreurs, mais je ne sais pas où elles sont ! Je n'ai aucun message qui apparaît dans la fenêtre pour coder ...

Edit : Ok c'est bon j'ai trouvé, j'avais supprimé les & dans les paramètres des fonctions après le main mais pas dans les prototypes.

Le programme compile bien, mais quand je fais build and go j'ai une fenêtre qui s'ouvre, avec marqué "stop executable" et dedans il y a le nom de mon projet.

Edit 2 : Okayy j'ai trouvé ! Fallait juste cliquer sur la petite fenêtre noir au dessus du code ...

Enfin, je n'ai plus besoin de retourner sous Windows pour continuer mon programme, merci !

Petite question : c'est possible d'avoir xcode en français ?


----------



## ntx (20 Mai 2008)

Museforever a dit:


> Petite question : c'est possible d'avoir xcode en français ?


Non, et de toute manière si tu comptes poursuivre dans la programmation tu ferais mieux de te mettre rapidement à l'Anglais


----------



## PA5CAL (21 Mai 2008)

I do agree with ntx.


----------



## tatouille (21 Mai 2008)

pourquoi as tu supprime tes variables passees par reference?


----------



## Museforever (21 Mai 2008)

Car je me suis aperçu qu'elles ne servaient à rien, on ne réutilise pas les modifications apportées en dehors de la fonction.

Ensuite pour l'anglais, j'ai un bon niveau, mais bon en français c'est toujours plus agréable.


----------



## Museforever (21 Mai 2008)

Encore besoin d'aide !

Lorsque je teste mon programme, je fais build and go, ça ça marche nickel.

Sauf que parfois, j'oublie de stopper le programme et modifie le code directement. Donc quand je refais build and go, il m'ouvre une fenêtre qui me propose de fermer l'ancien programme. Je clique donc sur OK, et là il me dit que le projet n'a pas pu être sauvegardé (j'ai mis la sauvegarde automatique pour ne pas avoir à cliquer à chaque fois sur save).

Et une fois que cela est arrivé, impossible de recompiler ou de sauvegarder mon programme, il me sort cettee erreur. Et je n'ai pas d'autre solution que de relancer xcode ...

Je fais certainement mal quelque chose, mais quoi ?


----------



## tatouille (21 Mai 2008)

Museforever a dit:


> Car je me suis aperçu qu'elles ne servaient à rien, on ne réutilise pas les modifications apportées en dehors de la fonction.
> 
> Ensuite pour l'anglais, j'ai un bon niveau, mais bon en français c'est toujours plus agréable.



alors pourquoi existaient-elles ?


----------



## tatouille (21 Mai 2008)

Museforever a dit:


> Encore besoin d'aide !
> 
> Lorsque je teste mon programme, je fais build and go, ça ça marche nickel.
> 
> ...



normale un coup a prendre pomme +s on the left end hand + never multi tache with xcode


----------



## Museforever (21 Mai 2008)

tatouille a dit:


> alors pourquoi existaient-elles ?



Parce qu'à l'origine, je modifiais l'image dans le tableau de la structure, et l'utilisateur devait après appeler une autre fonction pour sauvegarder l'image. Comme je suis fainéant, j'ai ajouté une ligne à la fin de la fonction pour qu'elle sauvegarde l'image directement, sans que l'utilisateur ait à le faire. Et comme ça se fait dans la fonction, plus besoin du passage par référence, donc je l'ai supprimé.


Sinon, je ferai donc attention à bien fermer le programme avant de modifier le code ... Mais bon je pense qu'il doit y avoir un moyen de régler ça, je ne suis certainement pas le 1er à être tombé dans le piège.


Enfin, je viens de me rappeler à quoi sert la bibliothèque myconio.h !

Parfois j'ai besoin d'afficher certaines valeurs du tableau, et comme je ne suis pas superman, j'utilisais la fonction Sleep(1000) qui permettait de mettre en pause le programme pendant 1 seconde, me permettant de lire tranquillement les valeurs et vérifier le bon fonctionnement. Seulement, cette fonction se trouve dans myconio.h (pas myconio). Je me souviens que j'avais du la télécharger et la mettre dans le dossier des librairies de dev c++. Je l'ai ajoutée dans le dossier des librairies de xcode, mais il me sort plein d'erreurs :

Line Location main.cpp:648: error: 'Sleep' was not declared in this scope
Line Location myconio.h:22: error: conio.h: No such file or directory
Line Location myconio.h:27: error: windef.h: No such file or directory
Line Location myconio.h:28: error: winbase.h: No such file or directory
Line Location myconio.h:29: error: wincon.h: No such file or directory
Line Location myconio.h:137: error: myconio.cpp: No such file or directory

Y'a-t-il une autre fonction qui permet de mettre en pause le programme pendant un certain temps ?

Merci !


----------



## Mala (21 Mai 2008)

Museforever a dit:


> Y'a-t-il une autre fonction qui permet de mettre en pause le programme pendant un certain temps ?



Dans le terminal, tu tapes "man 3 sleep" et tu obtiens:


> SLEEP(3)                 BSD Library Functions Manual                 SLEEP(3)
> 
> NAME
> sleep -- suspend thread execution for an interval measured in seconds
> ...


----------



## Museforever (22 Mai 2008)

Donc par exemple, si je veux faire un sleep de 1 seconde, je dois ajouter sleep(1).

Or si je fais ça, j'ai un trait qui clignote, il ne se passe rien.


----------



## tatouille (22 Mai 2008)

Museforever a dit:


> Donc par exemple, si je veux faire un sleep de 1 seconde, je dois ajouter sleep(1).
> 
> Or si je fais ça, j'ai un trait qui clignote, il ne se passe rien.



clear flush buffered / unbuffered output ca te dit quelque chose?


----------



## Museforever (22 Mai 2008)

tatouille a dit:


> clear flush buffered / unbuffered output ca te dit quelque chose?



Pas du tout


----------



## PA5CAL (22 Mai 2008)

Sous Mac OS X, tout comme sous Windows, la console communique avec l'utilisateur au travers de flux standards (_stdin_ pour l'entrée au clavier, _stdout_ pour la sortie des textes à l'écran, _strerr_ pour la sortie des textes d'erreur, tous manipulés par les fonctions définis dans _<stdio.h>_).

Or, ces flux transitent souvent par défaut par un tampon mémoire (buffer) de sorte que les données n'atteignent leur destination finale qu'en certains moments opportuns, et en une seule fois.

Dans le cas présent, le programme remplit le tampon de sortie, mais sans que les données n'apparaissent encore à l'écran parce que l'événement qui provoque leur affichage n'est pas encore survenu.

Pour que les données apparaissent en cours de traitement, le plus simple est de provoquer le vidage normal mais anticipé du tampon, en utilisant la fonction standard _*fflush*()_ qui est également définie dans _<stdio.h>_. On peut faire _fflush(sdtout)_ ou bien _fflush(0)_ avant de lancer _sleep()_ :

```
[COLOR="DarkRed"]#include <stdio.h>

#ifdef WIN32
[COLOR="Green"]// Ici déclarations spécifiques Windows
[/COLOR]    #include "windows.h"
[COLOR="Green"]    // Attente (en secondes), utilise Sleep (en millisecondes)
[/COLOR]    #define sleep(t) Sleep(1000*(t))

#else
[COLOR="Green"]// Ici déclarations POSIX (Mac et autres Unix)
[/COLOR]    #include <unistd.h>

#endif[/COLOR]

[COLOR="SlateGray"]...[/COLOR]

        printf( [COLOR="SlateGray"]...[/COLOR] );
        fflush( stdout );
        sleep( [COLOR="Navy"]1[/COLOR] );
```


----------



## p4bl0 (22 Mai 2008)

PA5CAL a dit:


> On peut faire _fflush(sdtout)_ ou bien _fflush(0)_


'me semble que 0 c'est stdin et que stdout c'est 1 (stderr c'est 2), du moins sous UNIX


----------



## PA5CAL (22 Mai 2008)

p4bl0 a dit:


> 'me semble que 0 c'est stdin et que stdout c'est 1 (stderr c'est 2), du moins sous UNIX


_fflush(0)_ (ou plus exactement _fflush(NULL)_, mais cela revient au même) provoque le flush sur tous les flux de sortie ouverts.

C'est clairement spécifié dans la doc de BSD ( faire '_man fflush_' ) ainsi que dans celle de Microsoft.

L'assignation des flux standards à des chiffres telle que tu la décris correspond aux redirections (pipes) dans les lignes de commandes sur la console. Par exemple '_ma_commande 2> log.txt_' redirige la sortie _stderr_ (=2) vers le fichier '_log.txt_'.

Sous BSD, il est en tout cas certain que _stdin_ ne correspond pas à un pointeur nul.


----------



## tatouille (22 Mai 2008)

PA5CAL a dit:


> _fflush(0)_ (ou plus exactement _fflush(NULL)_, mais cela revient au même) provoque le flush sur tous les flux de sortie ouverts.
> 
> C'est clairement spécifié dans la doc de BSD ( faire '_man fflush_' ) ainsi que dans celle de Microsoft.
> 
> ...



tout a fait ce que pointe pascal est important et il y a une confusion entre le file descriptor number fd et les constantes stdout stderr stdin qui sont des pointeurs sur une structure FILE de type stream

qui ont respectivement

FILE *stdin->fd = 0
FILE *stdout->fd = 1
FILE *stderr->fd = 2



voir stdio.h pour le detail


----------



## p4bl0 (22 Mai 2008)

PA5CAL a dit:


> _fflush(0)_ (ou plus exactement _fflush(NULL)_, mais cela revient au même) provoque le flush sur tous les flux de sortie ouverts.
> 
> C'est clairement spécifié dans la doc de BSD ( faire '_man fflush_' ) ainsi que dans celle de Microsoft.
> 
> ...


Ah okay, je pensais que ça serait pareil pour les redirections de flux en ligne de commande et  pour fflush 

EDIT: 





			
				tatouille a dit:
			
		

> voir stdio.h pour le detail


j'y suis !

EDIT2 : dans le premier stdio.h sur lequel je suis tombé en googlant (la flemme de pomme-tabber pour aller dans iTerm) :

```
/* Define ISO C stdio on top of C++ iostreams.
(...)
/* Standard streams.  */
extern FILE *stdin;		/* Standard input stream.  */
extern FILE *stdout;		/* Standard output stream.  */
extern FILE *stderr;		/* Standard error output stream.  */
/* C89/C99 say they're macros.  Make them happy.  */
#define stdin stdin
#define stdout stdout
#define stderr stderr
```


----------



## tatouille (22 Mai 2008)

```
$> man fileno
```

bafouille


----------



## p4bl0 (23 Mai 2008)

tatouille a dit:


> ```
> $> man fileno
> ```
> 
> bafouille


très intéressant ton article, j'ai du le râté parce que je l'avais pas lu pourtant je suis abonné à ton blog 
Enfin bon maintenant je l'ai lu


----------



## Museforever (23 Mai 2008)

Fiou un chtit peu compliqué tout ça. J'ai réussi à débugger mon programme heureusement je n'ai plus besoin du sleep(). Si jamais j'en ai encore besoin, je me pencherai plus dessus.

Merci à tous pour votre aide !


----------

