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++/CLI Discussion :

C++ NetCDF et chaine de caract�res


Sujet :

C++/CLI

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    40
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 40
    Par d�faut C++ NetCDF et chaine de caract�res
    Bonjour,
    Je cherche � faire des chaines de caract�res de longueurs non constantes, par exemple:

    Ce cas l� fonctionne bien:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    static const int NX = 12;
    static const int NY = 7;
    NcFile dataFile("simple_xy.nc", NcFile::Replace);
    NcDim* xDim = dataFile.add_dim("x", NX);
    NcDim* yDim = dataFile.add_dim("y", NY);
    NcVar *monChar = dataFile.add_var("monChar", ncChar, xDim, yDim);
    char* monCharUn[] = {"aaaaaa","bbbbbb","cccccc","dddddd", "eeeeee", "ffffff", "gggggg", "hhhhhh", "iiiiii", "jjjjjj", "kkkkkk", "llllll"};
    monChar->put(&monCharUn[0][0], NX, NY);
    J'obtiens dans le NetCDF:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     monChar =
      "aaaaaa",
      "bbbbbb",
      "cccccc",
      "dddddd",
      "eeeeee",
      "ffffff",
      "gggggg",
      "hhhhhh",
      "iiiiii",
      "jjjjjj",
      "kkkkkk",
      "llllll" ;
    Par contre si je fais :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    static const int NX = 12;
    static const int NY = 7;
    NcFile dataFile("simple_xy.nc", NcFile::Replace);
    NcDim* xDim = dataFile.add_dim("x", NX);
    NcDim* yDim = dataFile.add_dim("y", NY);
    NcVar *monChar = dataFile.add_var("monChar", ncChar, xDim, yDim);
    char* monCharUn[] = {"aaaaaa","bbb","cccccc","dddddd", "eeeeee", "ffffff", "gggggg", "hhhhhh", "iiiiii", "jjjjjj", "kkkkkk", "llllll"};
    monChar->put(&monCharUn[0][0], NX, NY);
    �a me donne:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     monChar =
      "aaaaaa",
      "bbb\000ccc",
      "ccc\000ddd",
      "ddd\000eee",
      "eee\000fff",
      "fff\000ggg",
      "ggg\000hhh",
      "hhh\000iii",
      "iii\000jjj",
      "jjj\000kkk",
      "kkk\000lll",
      "lll\000\000\000*" ;
    snif, comment faire pour avoir des �l�ments de longueurs diff�rentes, sachant que quand je fais le NetCDF � la main (ncgen) �a marche bien :/

    merci d'avance!!

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    40
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 40
    Par d�faut
    J 'ai un peu avanc� mais c'est moche moche moche: J'ai ajout� des \0 pour compl�ter la longueur de la cha�ne
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    static const int NX = 12;
    static const int NY = 7;
    NcFile dataFile("simple_xy.nc", NcFile::Replace);
    NcDim* xDim = dataFile.add_dim("x", NX);
    NcDim* yDim = dataFile.add_dim("y", NY);
    NcVar *monChar = dataFile.add_var("monChar", ncChar, xDim, yDim);
    char* monCharUn[] = {"aaaaaa","bbb\0\0\0","cccccc","dddddd", "eeeeee", "ffffff", "gggggg", "hhhhhh", "iiiiii", "jjjjjj", "kkkkkk", "llllll"};
    monChar->put(&monCharUn[0][0], NX, NY);
    �a fonctionne, je ne l'explique pas mais je trouve �a hyper laid... vous en pensez quoi?

  3. #3
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    J'ai l'impression que l'original �tait d�j� super-sale:
    Citation Envoy� par [URL=http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-cxx/Class-NcVar.html]La doc[/URL]
    NcBool put(const char* vals, long c0, long c1, long c2, long c3, long c4) Write scalar or 1 to 5-dimensional arrays by providing enough arguments. The vals argument points to a contiguous block of values in memory to be written. This means if you allocate each row of an array with a �new� call for example, you must not write more than one row at a time, because the rows may not be contiguous in memory. Other arguments are edge lengths, and their number must not exceed variable's dimensionality. Start corner is [0,0,..., 0] by default, but may be reset using the set_cur() member function for this variable. FALSE is returned if type of values does not match type for variable. For more than 5 dimensions, use the overloaded n-dimensional form of the put member function.
    (mise en gras par moi)

    Ta d�claration char* monCharUn[] = {"aaaaaa","bbbbbb" ... } est �quivalent � plusieurs allocations s�par�es: le fait que �a ait march� avec ce compilateur-l� sur cette plate-forme l� est une pure co�ncidence.

    Par contre, ceci devrait �tre fiable:
    Code C++ correct : S�lectionner tout - Visualiser dans une fen�tre � part
    char monCharUn[][7] = {"aaaaaa","bbb","cccccc","dddddd", "eeeeee", "ffffff", "gggggg", "hhhhhh", "iiiiii", "jjjjjj", "kkkkkk", "llllll"};

    PS: Cette question, qu'a-t-elle � voir avec le langage C++/CLI utilis� pour .Net?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    40
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 40
    Par d�faut
    Citation Envoy� par M�dinoc Voir le message
    J'ai l'impression que l'original �tait d�j� super-sale:

    (mise en gras par moi)

    Ta d�claration char* monCharUn[] = {"aaaaaa","bbbbbb" ... } est �quivalent � plusieurs allocations s�par�es: le fait que �a ait march� avec ce compilateur-l� sur cette plate-forme l� est une pure co�ncidence.
    �a ne m'�tonne pas trop
    Citation Envoy� par M�dinoc Voir le message
    Par contre, ceci devrait �tre fiable:
    Code C++ correct : S�lectionner tout - Visualiser dans une fen�tre � part
    char monCharUn[][7] = {"aaaaaa","bbb","cccccc","dddddd", "eeeeee", "ffffff", "gggggg", "hhhhhh", "iiiiii", "jjjjjj", "kkkkkk", "llllll"};
    malheureusement �a ne fonctionne pas non plus pourtant je trouve ta solution logique!
    Voici le r�sultat:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     monChar =
      "aaaaaa",
      "\000bbb",
      "\000\000cccc",
      "cc\000ddd",
      "ddd\000ee",
      "eeee\000f",
      "fffff",
      "gggggg",
      "\000hhhhh",
      "h\000iiii",
      "ii\000jjj",
      "jjj\000kk" ;
    Citation Envoy� par M�dinoc Voir le message
    PS: Cette question, qu'a-t-elle � voir avec le langage C++/CLI utilis� pour .Net?
    Exact, je me suis tromp� :/

  5. #5
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Comment obtiens-tu ce r�sultat? En rechargeant le fichier ensuite?

    Puis-je voir ton code de chargement?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    40
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 40
    Par d�faut
    Citation Envoy� par M�dinoc Voir le message
    Comment obtiens-tu ce r�sultat? En rechargeant le fichier ensuite?

    Puis-je voir ton code de chargement?
    bonjour,
    ok je montre tout:
    le fichier cpp:
    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
         #include <iostream>
         #include <netcdfcpp.h>
     
         using namespace std;
     
         static const int NX = 12;
         static const int NY = 6;
         static const int NZ = 1;
     
    int main(void)
    {
        NcFile dataFile("testTabChar.nc", NcFile::Replace);
     
        NcDim* xDim = dataFile.add_dim("x", NX);
        NcDim* yDim = dataFile.add_dim("y", NY);
        NcDim* zDim = dataFile.add_dim("z", NZ);
     
        NcVar *monChar = dataFile.add_var("monChar", ncChar, xDim, yDim);
     
        char monCharUn[][7] = {"aaaaaa","bbb","cccccc","dddddd", "eeeeee", "ffffff", "gggggg", "hhhhhh", "iiiiii", "jjjjjj", "kkkkkk", "llllll"};
     
        monChar->put(&monCharUn[0][0], NX, NY);
     
        return 0;
    }
    le script de compilation/�dition des liens/execution/�dition ^^:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    #!/bin/sh
     
    g++ -c -g -I $HOME/local/netcdf_cxx/cxx4/ testTabChar.cpp && g++ -o testTabChar testTabChar.o -L $HOME/local/netcdf_cxx/cxx4/.libs/ -lnetcdf_c++ -lnetcdf -lm && ./testTabChar && ncdump testTabChar.nc > testTabChar.cdl && gedit testTabChar.cdl&
    Je suis sous linux et je compile avec g++ (Debian 4.4.5-8) 4.4.5

    le r�sultat:
    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
    netcdf testTabChar {
    dimensions:
    	x = 12 ;
    	y = 6 ;
    	z = 1 ;
    variables:
    	char monChar(x, y) ;
    data:
     
     monChar =
      "aaaaaa",
      "\000bbb",
      "\000\000cccc",
      "cc\000ddd",
      "ddd\000ee",
      "eeee\000f",
      "fffff",
      "gggggg",
      "\000hhhhh",
      "h\000iiii",
      "ii\000jjj",
      "jjj\000kk" ;
    }

  7. #7
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Donc c'est ncdump qui te donne cette sortie...

    Enfin, je pense avoir trouv� la cause de l'erreur: NY est myst�rieusement pass� de 7 � 6...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    40
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 40
    Par d�faut
    Citation Envoy� par M�dinoc Voir le message
    Donc c'est ncdump qui te donne cette sortie...

    Enfin, je pense avoir trouv� la cause de l'erreur: NY est myst�rieusement pass� de 7 � 6...
    Ouaaaaaa! merci, c'est exact! je comprend mieux et �a marche !!!
    par contre je ne comprend pas pourquoi il faut mettre 7 alors que la chaine la plus longue ne fait que 6 caract�res de long. Je pense que c'est li� au \0 mais je trouve �a tellement �trange !

    Mon code :
    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
         #include <iostream>
         #include <netcdfcpp.h>
     
         using namespace std;
     
         static const int NX = 12;
         static const int NY = 7;
         static const int NZ = 1;
     
    int main(void)
    {
        NcFile dataFile("testTabChar.nc", NcFile::Replace);
     
        NcDim* xDim = dataFile.add_dim("x", NX);
        NcDim* yDim = dataFile.add_dim("y", NY);
        NcDim* zDim = dataFile.add_dim("z", NZ);
     
        NcVar *monChar = dataFile.add_var("monChar", ncChar, xDim, yDim);
     
        char monCharUn[][NY] = {"aaaaaa","bbb","cccccc","dddddd", "eeeeee", "ffffff", "gggggg", "hhhhhh", "iiiiii", "jjjjjj", "kkkkkk", "llllll"};
     
        monChar->put(&monCharUn[0][0], NX, NY);
     
        return 0;
    }

  9. #9
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    C'est bien �a, c'est li� au \0.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. R�ponses: 9
    Dernier message: 23/12/2013, 16h40
  2. Crypter une chaine de caract�res
    Par Yabo dans le forum R�seau
    R�ponses: 18
    Dernier message: 19/11/2004, 23h04
  3. R�ponses: 9
    Dernier message: 17/01/2003, 11h45
  4. Lire Une Chaine De Caract�res
    Par Jonathan_Korvitch dans le forum C
    R�ponses: 12
    Dernier message: 07/01/2003, 05h37
  5. R�ponses: 2
    Dernier message: 06/12/2002, 07h50

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