Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1516 connectés 

  FORUM HardWare.fr
  Programmation
  C

  [Résolu] Défine préprocesseur contenant un point

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Résolu] Défine préprocesseur contenant un point

n°1666159
utb diablo
.: :. 4 ever xo0
Posté le 04-01-2008 à 20:17:09  profilanswer
 

Salut les gens,
 
vala, j'aurais besoin de définir une constante préprocesseur nommée S_un.S_addr à s_addr
 
J'avais éssayé
 

Code :
  1. #define S_un.S_addr  s_addr


 
mais gcc n'aime pas trop, il plante à la compil
 

Citation :

103.c:210: error: expected identifier before ‘.’ token


 
Voici mon code original
 

Code :
  1. struct sockaddr_in addr_in;
  2. addr_in.sin_addr.S_un.S_addr=inet_addr(argv[1]);


 
J'aurais aimé qu'après le passage du préprocesseur, ca donne un truc du genre
 

Code :
  1. struct sockaddr_in addr_in;
  2. addr_in.sin_addr.s_addr=inet_addr(argv[1]);


 
Le but, c'est de porter un soft codé pour win32 utilisant de facon basique les sockets win32, sur un système *nix.
 
Si quelqu'un a une idée pour mes défines ou autres, je suis preneur.
Merci davans

Message cité 1 fois
Message édité par utb diablo le 05-01-2008 à 19:27:37

---------------
Au royaume des aveugles, les borgnes sont rois xo0
mood
Publicité
Posté le 04-01-2008 à 20:17:09  profilanswer
 

n°1666160
matafan
Posté le 04-01-2008 à 22:08:23  profilanswer
 

On ne peut pas mettre un point dans un #define.
 
Ce que tu peux faire (même si c'est très sale), c'est te définir une struct sockaddr_in_win32 identique à ton struct sockaddr_in, mais avec une union S_un autour du champs s_addr. Ensuite tu fais un #define sockaddr_in sockaddr_in_win32 de manière à ce que toutes tes structures utilisent ta définition, et voilà. Evidemment c'est pas portable puisque ça te met la définition d'un sockaddr_in en dur dans ton code.

n°1666161
black_lord
Truth speaks from peacefulness
Posté le 04-01-2008 à 22:38:52  profilanswer
 

je déplace sur prog


---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
n°1666162
black_lord
Truth speaks from peacefulness
Posté le 04-01-2008 à 22:39:13  profilanswer
 

Ce sujet a été déplacé de la catégorie OS Alternatifs vers la categorie Programmation par Black_lord


---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
n°1666167
utb diablo
.: :. 4 ever xo0
Posté le 04-01-2008 à 22:48:11  profilanswer
 

black_lord a écrit :

Ce sujet a été déplacé de la catégorie OS Alternatifs vers la categorie Programmation par Black_lord


 
:o,  sry l'habitude
 

matafan a écrit :

On ne peut pas mettre un point dans un #define.
 
Ce que tu peux faire (même si c'est très sale), c'est te définir une struct sockaddr_in_win32 identique à ton struct sockaddr_in, mais avec une union S_un autour du champs s_addr. Ensuite tu fais un #define sockaddr_in sockaddr_in_win32 de manière à ce que toutes tes structures utilisent ta définition, et voilà. Evidemment c'est pas portable puisque ça te met la définition d'un sockaddr_in en dur dans ton code.


 
D'après ce que j'ai compris, ça semble être une bonne idée, mais, heum, comment dire ...
         Comment on fait ? :p


---------------
Au royaume des aveugles, les borgnes sont rois xo0
n°1666355
Emmanuel D​elahaye
C is a sharp tool
Posté le 05-01-2008 à 12:29:38  profilanswer
 

utb diablo a écrit :

Le but, c'est de porter un soft codé pour win32 utilisant de facon basique les sockets win32, sur un système *nix.


Je ne sais pas trop ce que tu cherches à bricoler, mais ici, il y a des exemples de code socket portable...
 
http://mapage.noos.fr/emdel/reseaux.htm


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1666356
Emmanuel D​elahaye
C is a sharp tool
Posté le 05-01-2008 à 12:30:09  profilanswer
 

matafan a écrit :

On ne peut pas mettre un point dans un #define.


 [:arrakys]  


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1666367
utb diablo
.: :. 4 ever xo0
Posté le 05-01-2008 à 13:11:29  profilanswer
 

Emmanuel Delahaye a écrit :


Je ne sais pas trop ce que tu cherches à bricoler, mais ici, il y a des exemples de code socket portable...
 
http://mapage.noos.fr/emdel/reseaux.htm


 
 
D'habitude je code plutôt portable, mais j'ai récupéré une centaine de code, le plus souvent codé pour Win32 avec WSADATA toussa,
 
Et pis bon, j'avais un peu la flemme de modifier une centaine de code à la main, j'ai créé un fichier windows.h dans /usr/include avec ceci dedans
 

Code :
  1. #ifndef __WIN__
  2. #define __WIN__
  3. #include <unistd.h>
  4. #include <sys/socket.h>
  5. #include <sys/types.h>
  6. #include <arpa/inet.h>
  7. #include <netinet/in.h>
  8. #include <netdb.h>
  9. #define SOCKET                  int
  10. #define WSADATA                 int
  11. #define DWORD                   unsigned long
  12. #define SOCKADDR                struct sockaddr
  13. #define SOCKADDR_IN             struct sockaddr_in
  14. #define sockaddr_in sockaddr_in_win32
  15. #define NULL                    0
  16. #define INVALID_SOCKET          -1
  17. #define SOCKET_ERROR            -1
  18. #define WSAConnect(a,b,c,d,e,f,g)       connect(a,b,c)
  19. #define WSAStartup(a,b)                 0
  20. #define WSAGetLastError()               0
  21. struct sockaddr_in_win32 {
  22.               :s
  23. };
  24. #endif


 
Un peu bourrin, mais ca marche, si je règle le problème de S_un.S_addr, je devrais être capable de compiler tout (presque) mes programmes dans problème


---------------
Au royaume des aveugles, les borgnes sont rois xo0
n°1666374
Joel F
Real men use unique_ptr
Posté le 05-01-2008 à 13:44:22  profilanswer
 

ya des define qui ferait mieux d'etre des typedef ou des static const néanmoins

n°1666378
utb diablo
.: :. 4 ever xo0
Posté le 05-01-2008 à 14:01:02  profilanswer
 

Oui je sais :) mais je recherche pas la propreté
 
Pour l'instant, j'essaie juste de faire en sorte que mes codes compilent sous *nix, et apparemment, la solution de matafan est bonne.
 
Si on pouvait se concentrer là-dessus :) Parce que bon, en C j'ai juste les bases, donc tout ce qui est structure, union etc  J'y comprends pas grand chose :D
 
Si quelqu'un pouvait lire la réponse de matafan et me dire ce que je dois faire :) ce serait sympa :)
 
Merci


---------------
Au royaume des aveugles, les borgnes sont rois xo0
mood
Publicité
Posté le 05-01-2008 à 14:01:02  profilanswer
 

n°1666386
Emmanuel D​elahaye
C is a sharp tool
Posté le 05-01-2008 à 14:16:49  profilanswer
 

utb diablo a écrit :

Oui je sais :) mais je recherche pas la propreté


Au revoir.
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1666390
utb diablo
.: :. 4 ever xo0
Posté le 05-01-2008 à 14:25:53  profilanswer
 

Bon ok :). Et si je fais ça :

 
Code :
  1. #define NULL 0
  2. typedef int SOCKET;
  3. typedef int WSADATA;
  4. typedef unsigned long DWORD;
  5. typedef struct sockaddr SOCKADDR;
  6. typedef struct sockaddr_in SOCKADDR_IN;
  7. const int INVALID_SOCKET = -1;
  8. const int SOCKET_ERROR  = -1;
  9. int WSAConnect(a,b,c,d,e,f,g) {return connect(a,b,c);}
  10. int WSAStartup(a,b)  {return 0;}
  11. int WSAGetLastError()  {return 0;}
 

Vous voulez bien m'aider ? :) siouplait


Message édité par utb diablo le 05-01-2008 à 15:47:09

---------------
Au royaume des aveugles, les borgnes sont rois xo0
n°1666440
Olivier51
Posté le 05-01-2008 à 16:34:42  profilanswer
 

Pourquoi te casser la tete pour une seule ligne qui te cachera la vraie structure (et qui pourrait etre plus tard source de bogue) ?
Pourquoi ne pas utliser une condition du style  

Code :
  1. #if defined (WIN32)
  2. addr_in.sin_addr.S_un.S_addr=inet_addr(argv[1]);
  3. #else
  4. addr_in.sin_addr.s_addr=inet_addr(argv[1]);
  5. #endif

n°1666444
utb diablo
.: :. 4 ever xo0
Posté le 05-01-2008 à 16:37:14  profilanswer
 

Ca m'oblige à modifier mes 100 bouts de code, ce qui est impensable :)


---------------
Au royaume des aveugles, les borgnes sont rois xo0
n°1666466
tpierron
Posté le 05-01-2008 à 17:03:23  profilanswer
 

utb diablo a écrit :

Ca m'oblige à modifier mes 100 bouts de code, ce qui est impensable :)


Bah, t'as pas l'air de connaitre l'axiome numéro 1 en informatique : La machine est là pour travailler.
 
Primo, tu te fais un script qui fait du chercher/remplacer (à tester en local avant de mettre sur un truc de prod...)
 
Deuxio, sous Win32 le code "addr_in.sin_addr.s_addr=inet_addr(argv[1]);" fonctionne aussi, vu que s_addr est définie comme un alias à S_un.S_addr.  
 
Bref, rends service à tout le monde et vire ce putain de code qu'un gizmo a ramassé sur le premier trou du cul du web sans se servir du peu de neurone qui lui restait pour savoir si c'était portable ou pas  :fou: .

n°1666519
utb diablo
.: :. 4 ever xo0
Posté le 05-01-2008 à 19:27:08  profilanswer
 

J'ai réglé ça par un script de find/replace, sed powa :)
 
Merci a tous pour votre aide et à bientôt :)


---------------
Au royaume des aveugles, les borgnes sont rois xo0
n°1666525
Emmanuel D​elahaye
C is a sharp tool
Posté le 05-01-2008 à 19:47:36  profilanswer
 

tpierron a écrit :

vire ce putain de code qu'un gizmo a ramassé sur le premier trou du cul du web sans se servir du peu de neurone qui lui restait pour savoir si c'était portable ou pas  :fou: .


Joli !
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1666542
matafan
Posté le 05-01-2008 à 20:38:37  profilanswer
 


Tu peux expliciter STP ?

n°1666543
Emmanuel D​elahaye
C is a sharp tool
Posté le 05-01-2008 à 20:43:32  profilanswer
 

matafan a écrit :


Tu peux expliciter STP ?


Pourquoi on ne pourrait pas mettre de . dans une macro ?

 


Message édité par Emmanuel Delahaye le 05-01-2008 à 20:43:47

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1666557
matafan
Posté le 05-01-2008 à 21:34:08  profilanswer
 

Dans un nom de macro ? Parce que dans un nom de macro on ne peut mettre que des lettres, des chiffres (ailleurs qu'en tête) et des underscores. M'enfin ça tu le sais. Je parlais des noms de macro.

n°1666559
Emmanuel D​elahaye
C is a sharp tool
Posté le 05-01-2008 à 21:38:01  profilanswer
 

matafan a écrit :

Dans un nom de macro ? Parce que dans un nom de macro on ne peut mettre que des lettres, des chiffres (ailleurs qu'en tête) et des underscores. M'enfin ça tu le sais. Je parlais des noms de macro.


Ah, dans le nom, OK...
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  [Résolu] Défine préprocesseur contenant un point

 

Sujets relatifs
[Resolu] [Bash] Ecrire le résultat d'une commande dans un fichier HTMLrécupérer le chemin du fichier interprété ? [résolu]
[RESOLU] [MySQL] Gérer une exception dans le tri d'une requête[RESOLU] Conversion au format Coplat: "à plat"
[Resolu] .NET : Equivalent de ensureVisible sur un webcontrol?Symbole "&" de batch --> vbs [ résolu ]
[RESOLU] Ne compter dans classement seulement WHERE count > 5[EXCEL/VBA] Intersection avec une courbe lissée [RESOLU]
[CSS] [resolu] menu vertical déroulant en CSS sous FF et IE7[Resolu] Transformation d'un fichier en liste doublement chainée
Plus de sujets relatifs à : [Résolu] Défine préprocesseur contenant un point


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR