IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

[Novice] Du C vers le C#..


Sujet :

C#

  1. #1
    Membre averti
    Inscrit en
    Novembre 2004
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 31
    Par défaut [Novice] Du C vers le C#..
    Bonjour,

    J'ai des connaissances assez empiriques en C/C++ et de même en .NET. Je dispose de code C (ci-dessous) et je voudrais savoir dans quelle mesure le faire fonctionner avec du C#. Une conversion pure et simple et possible ou... ?

    Pour info ceci est la definition de la structure de donnée du "pilote" d'une dalle tactile. A l'heure actuelle il s'agit d'une application console C++, mais je suppose qu'il serait plus "intéressant" et plus facile pour moi de ne programmer qu'en C#.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    # driver.h #
    
    #include "CSharedStruct.h"
    #include <stdio.h>
    #include <vector>
    
    #define MTOUCH_IPC_GUID "Global\\RNDPLUS_MTSharedData_10A0_A10AF_3124_0120"
    #define MTOUCH_EVENT_GUID "Global\\RNDPLUS_MTOUCHPOINT_IPC_INTERFACE_0401"
    #define MTOUCH_TOUCH_UP
    #define MTOUCH_TOUCH_DOWN
    #define MTOUCH_TOUCH_MOVE
    #define INACTIVE_COORDINATE 0x0000
    #define ACTIVE_COORDINATE 0x0001
    #define IMAGE_COORDINATE 0x0002
    
    typedef struct _MPoint
    {
    	WORD wStatus;
    	WORD wIndex;
    	WORD wXlength;
    	WORD wYlength;
           .....
    } MPointElement;
    
    #define MAX_MPOINTELEMENT_COUNT 100
    
    typedef struct _Shared
    {
    	DWORD dwState;
    	DWORD dwNumber;
    	DWORD dwNumberX;
    	DWORD dwNumberY;
        MPointElement mPpoints [MAX_MPOINTELEMENT_COUNT][MAX_MPOINTELEMENT_COUNT];
    } SharedData;
    
    DWORD ThreadProc(void);
    
    # driver.c #
    
    DWORD ThreadProc(void)
    {
    	HANDLE hTouch = INVALID_HANDLE_VALUE;	
    	while(hTouch == INVALID_HANDLE_VALUE)
    	{
    		hTouch = OpenEvent(EVENT_ALL_ACCESS, false, MTOUCH_EVENT_GUID);
            }
    ....
    }

  2. #2
    Expert confirmé

    Avatar de Philippe Vialatte
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juillet 2004
    Messages
    3 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 3 029
    Par défaut
    Citation Envoyé par Syrus Voir le message
    Une conversion pure et simple et possible ou... ?
    Salut,

    personnelement, je suis plutot partisan de la reecriture "from scratch" dans ces cas-la...

    Ne serait-ce que pour aborder un programme avec un état d'esprit .net plutôt que c++ (pas de .h/.c en .net, pas de struct a moins d'avoir une bonne raison, etc...)

    Mon Blog

    The Cake is still a lie !!!



    Vous voulez contribuer à la rubrique .NET ? Contactez-moi par MP.
    Vous voulez rédiger des articles pour la rubrique .NET ? Voici la procédure à suivre.

  3. #3
    Membre averti
    Inscrit en
    Novembre 2004
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 31
    Par défaut
    "from scratch" ?
    Ce qui me motive c'est que étant du issu du monde 100% objet (Java, AS3..), je devrais être beaucoup plus à l'aise en C#. Mais manipuler les structures de données C avec du C#... là je suis totalement dans le vide explicatif .

    J'ai oublié de préciser que actuellement mon code C/C++ utilise une "CSharedStruct" pour "partager" les données du pilote constructeur (je ne sais pas si je suis clair).

  4. #4
    Membre émérite Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Par défaut
    Salut !
    Le code qui tu as écrit ici est tout a fait traduisible en C#, cependant ...
    C'est un driver, donc un language système sera surement requis, et à ma connaissance le C# n'en n'est pas un. Tu risque fort (j'ai bien dit "risque", et non "vas") de te retrouver face à des choses que tu ne peux pas écrire en .Net comme de VRAI pointeurs, des fonctions à appeller qui n'ont pas leurs pendant .Net, des bouts de codes en ASM, ...
    Et puis par définition un driver doit être le plus rapide et léger possible tout en ayant le moins de dépendance possible. En partant sur du .Net tu va vers un language semi-compilé, donc terriblement lent pour un driver, et extrêment consommateur (pour un driver) et en prime qui repose sur tout un framework (et pas un petit) dont l'installation est totalement optionnelle même si elle est effectivement de plus en plus necessaire.
    Je ne trouve vraiment pas que ce soit une bonne idée d'écrire un driver en .Net.
    Si tu veux conserver une orientation objet, le C++ est ce qu'il y a de mieux dans un cas comme celui-la.
    Même si le C++ te permet d'écrire un programme comme si tu faisait du C (pas d'objets), rien ne t'oblige à faire ainsi, c'est même plutot déconseillé. Tu peux t'imposer une règle de codage pour te "limiter" à du tout objet.

  5. #5
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Salut

    Je partage tout a fait l'avis de ctxnop !
    Cependant ayant fait moi meme ce saut C vers C# il y a moins d'un an, je peux te dire que j'ai asser facilement retranscrit plusieurs sources C en C# et que je suis TRES satisfait du resultat

    Mais au début il faut effectivement se battre un peu pour "revoir" tout ce qui se faisait avec des pointeurs (et j'en étais particulierement friand)

    L'avantage du pointeur en C c'est qu'il est explicite en Csharp il y a des tas de choses qui sont implicitement passées en référence

    Mais franchement ca vaut la peine !

  6. #6
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    Citation Envoyé par olibara Voir le message
    en Csharp il y a des tas de choses qui sont implicitement passées en référence
    Tout ce qui est class ou ref struct en fait

    Bon sinon c'est clair, en C# on ne PEUT PAS faire de driver. Il ne s'agit pas de l'histoire de langage semi compilé (en fait, entièrement compilé en code machine mais juste avant l'exécution, pas à la compilation) mais plus du fait que c'est basé sur le Framework ... vous avez déjà essayé de faire tourner .NET et les WinForms en mode noyau ? .

    Ensuite, pour parler directement avec un driver ou utiliser des couches assez basses dans Windows, le C# c'est pas l'idéal parce que tu va te retrouver à réécrire la définition de toutes les classes/struct/interfaces/etc que tu utilises et ça fait un double travail. Dans ce genre de cas on préfère le C++/CLI : tu as toute la puissance de .NET tout en ayant la possibilité d'utiliser tout ce qui est possible en C++. Pour être vraiment tranquille en C# et parler au système il faut en général créer une dll "d'interop" (un wrapper quoi) pour faire la liaison entre win32 et .NET (qui pour l'instant est basé dessus mais on s'éloigne ).

    Par contre s'il s'agit d'utiliser des fonctions natives de temps en temps (mais vraiment, de temps en temps genre juste pour un petit MoveWindow par exemple), alors tu peut te servir du site pinvoke.net pour avoir la déclaration des fonctions à importer et t'en servir librement.

    Enfin, si tu veux faire une application qui est à un niveau raisonnable (pas le genre d'applis qui trafiquent en permanence sur tes fonctions de ntdll ou autres) alors le C# est beaucoup plus "simple" en pratique que le C/C++ (je parle surtout des pointeurs qui sont absents, la facilité avec les string, etc.) Bien sur, certains (malades comme dirait mon prof ) sont très à l'aise en C++ mais le C# évite beaucoup d'erreur que l'on peut rencontrer avec les pointeurs ou autre mais sur le point des applications "normales" le C# vaut le C++ mais il vaut mieux recommencer à 0 pour avoir quelque chose de propre et entièrement .NET et pas des choses mystérieuses héritées d'un code C++.

  7. #7
    Membre émérite Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Par défaut
    C'est bien résumé tout ca ^^
    Je fais partis des malades que tu décris, je préfère, de très très loin, le C++ au C#.
    Je reconnais au C# toutes ses qualités, mais surtout tous ses défaut (lenteur, charge mémoire, optimisation limitée, astuces/bidouilles limitées, ...)
    Aujourd'hui, dans ma boite, on developpe exclusivement en .Net (C# et VB.net uniquement) je n'ai donc plus une seule seconde pour dev en C++. Pour moi le C++ est le meilleur language pour débuter car sa rigueure impose de prendre de bonne habitudes qui restent valable dans les autres languages, ca apprend a optimiser, et puis je ne connais pas de language qui offre un concepte qui n'est pas faisable en C++

  8. #8
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    D'accord avec ctxnop

    Pratiquement tout ce qui est algo pointu, optimisé tripotage de malade, je le fais en C dans une dll
    Mais tout ce qui est interface, DB etc je le fais maintenant en C#

  9. #9
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    Citation Envoyé par ctxnop Voir le message
    lenteur, charge mémoire, optimisation limitée, astuces/bidouilles limitées, ...
    Remarques l'absence de bidouilles évite de se prendre la tête avec des Access Violation et autres pointeurs non valides. Quand à la lenteur ça deviens de plus en plus relatif. On peut très bien faire un programme en C# aussi rapide qu'en C++ (bon je l'accorde, c'est difficile ) mais la différence pour une utilisation "normale" deviens plus faible.
    Perso j'avais plus l'impression que le C++ était difficile pour les débutants (j'ai beaucoup d'exemples de mon entourage qui souffre avec les histoires de pointeurs ou la difficultés de comprendre comment utiliser les chaines de caractères), m'enfin ...
    Par contre là où je suis entièrement d'accord c'est que quasiment tout ce qui est possible en info peut se faire en C/C++ et c'est pour cela que le C++/CLI est le plus adapté lorsqu'on aime les magouilles et qu'on veut y mixer du .NET.

  10. #10
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Par défaut
    salut

    juste pour ajouter la pierre à ce "débat"...

    Driver => C/C++ : OK

    Pour le reste.. C# s'impose

    Performance => J'ai fait plusieurs simulateurs demandant un peu de perfo en C# et ça tourne très bien !

    Maintenance : Maintenir du code C#, C'est beaucoup plus simple que du code C++...

    C++ Rigueur etc... : Oui, à condition d'aimer programmer et de comprendre ce que l'on fait.. Parce que le nombre de programme en C++ que j'ai vu ou c'était vraiment pas terrible... Et puis, les fuites mémoires, plantage en release parce qu'un truc n'est pas initialisé... Rigueur oui...
    Mais à force d'avoir un langage qui te demande beaucoup de rigueur, tu oublies que le principal n'est pas le langage mais le métier que tu implémentes au travers de ton développement. Avec C#, je me concentre sur le fonctionnel et moins sur le langage pur en lui-même... (et pourtant, ca fait plus de 20 ans que je code et développe... donc, j'aime ça)... Mais quand tu vois la rapidité avec laquelle tu fais des usercontrol en C#.. C'est beaucoup plus rapide qu'en C++(MFC en l'occurence).

    donc, oui, la perfo est legèrement moins bonne dans la plulpart des cas...

    Après, les algo bidouillesques ou tu joues sur des chevauchements mémoires ou sur du partage mémoire (les unions par exemple ou les champs de bits) c'est pratique, mais bon, faut aussi savoir évoluer...

    Tout comme les gens sont pas forcément passer "simplement" de l'assembleur au C et du C au C++... passer du C++ au C# n'est pas sans efforts, mais le résultat est vraiment saisissant...


    Je suis un peu partial, mais crois moi... je me régale d'avantage à coder en C# parce que j'obtiens un résultat beaucoup plus rapidement (en terme de durée de dev) qu'en C++ (et je maitrise les deux)

    Voila

  11. #11
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    +1

  12. #12
    Membre averti
    Inscrit en
    Novembre 2004
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 31
    Par défaut
    Merci à tous pour vos contributions .

    Moi qui suis issu du monde des objets bien gras sans gestion de mémoire, le C/C++ c'est l'aventure pour moi.
    Je "sais" programmer donc j'arrive globalement à mes fins, mais j'ai une méthode de programmation assez "exploratoire" en C/C++ .
    Par exemple rien que convertir deux entiers en chaîne et les concaténer (en les séparant avec un caractère)... ça prend des proportions incroyables par rapport à ce que je ferrais ailleurs. Programmer en C/C++ ça demande vraiment des connaissances à part. Et aujourd'hui, ça reste aussi réservé à un certain type d'applications.

    Ah et pour conclure, j'ai continué à développer en C/C++. Je m'en sors suffisamment bien, même si ça me prend plus de temps.

  13. #13
    Membre émérite Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Par défaut
    Bof, ca prend pas plus de proportion que ca. C'est juste qu'en Java, .Net, .... beaucoup de fonctions sont déjà écrite. Dans ton exemple précis, convertir un entier en chaine, il exite une simple fonction pour ca (itoa()), pour la concacténation il existe également une autre simple fonction (strcat()).
    Après, quand tu developpe en C++ tu prend vite l'habitude de te coder de petites fonctions pour te simplifier la vie, a coup de surcharge d'opérateur et compagnie. En les conservant dans un coin tu peux les réutiliser dans n'importe quel autre projet juste en les important.

  14. #14
    Membre averti
    Inscrit en
    Novembre 2004
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 31
    Par défaut
    Une illustration de mon "noobisme" en C, mon problème de conversion de chaînes.

Discussions similaires

  1. Réponses: 0
    Dernier message: 22/08/2008, 14h22
  2. Réponses: 5
    Dernier message: 09/06/2008, 13h07
  3. Réponses: 2
    Dernier message: 09/06/2007, 14h50
  4. Réponses: 2
    Dernier message: 30/05/2002, 10h19
  5. Réponses: 1
    Dernier message: 13/05/2002, 09h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo