Contenu | Rechercher | Menus

Annonce

Si vous rencontrez des soucis à rester connecté sur le forum (ou si vous avez perdu votre mot de passe) déconnectez-vous et reconnectez-vous depuis cette page, en cochant la case "Me connecter automatiquement lors de mes prochaines visites". Attention, le forum rencontre actuellement quelques difficultés. En cas d'erreur 502, il ne faut pas re-valider l'envoi d'un message ou l'ouverture d'une discussion, au risque de créer un doublon.

La section divers se réorganise ! De nouvelles sous-sections à venir. (plus d'infos + donner son avis)

#1 Le 20/02/2013, à 10:49

kboo

[Résolu] NetCDF C++

Bonjour
je galère beaucoup pour la génération de variables de type ncChar dans la format netCDF,
précédemment j'ai réussi à générer une variable ncChar de la sorte:

     #include <iostream>
     #include <netcdfcpp.h>
     #include <vector>
     #include <string>
     #include <cstring>
     
     using namespace std;

     static const int NY = 4;
     static const int NZ = 1;

int main(void)
     {
        NcFile dataFile("chaine.nc", NcFile::Replace);

        NcDim* yDim = dataFile.add_dim("y", NY);
        NcDim* zDim = dataFile.add_dim("z", NZ);
        NcVar *monCharSimple2 = dataFile.add_var("monCharSimple2", ncChar, zDim, yDim);

        vector<string> dataOut2Vec;
        string toto2 = "toto";
        toto2.resize(4);  //ça fonctionne sans pour une variable, mais dans le cas d'un vecteur de "string" cette ligne est obligatoire, donc je préfère la laisser par précaution
        monCharSimple2->put_rec(zDim, &toto2[0], 0);

        return 0;
     }

Ce qui a pour résultat:

netcdf chaine {
dimensions:
	y = 4 ;
	z = 1 ;
variables:
	char monCharSimple2(z, y) ;
data:

 monCharSimple2 =
  "toto" ;
}

mais là où ça se corse c'est que je dois générer un netcdf de ce genre:

netcdf chaineSimple {
dimensions:
	y = 4 ;
variables:
	char monCharSimple2(y) ;
data:
 monCharSimple2 = "toto" ;
}

car ici toto à une dimension (nbr) alors que je n'arrive pas à créer de ncChar à moins de deux dimensions!

alors même en lisant la doc je ne trouve pas comment faire:

     #include <iostream>
     #include <netcdfcpp.h>
     #include <vector>
     #include <string>
     #include <cstring>
     
     using namespace std;

     static const int NY = 4;
//     static const int NZ = 1;

int main(void)
     {
        NcFile dataFile("chaineSimple.nc", NcFile::Replace);

        NcDim* yDim = dataFile.add_dim("y", NY);
//        NcDim* zDim = dataFile.add_dim("z", NZ);
//        NcVar *monCharSimple2 = dataFile.add_var("monCharSimple2", ncChar, zDim, yDim);
        NcVar *monCharSimple2 = dataFile.add_var("monCharSimple2", ncChar, yDim);

        vector<string> dataOut2Vec;
        string toto2 = "toto";
        toto2.resize(4);
        monCharSimple2->put_rec(&toto2[0]);

        return 0;
     }

Donne ça:

netcdf chaineSimple {
dimensions:
	y = 4 ;
variables:
	char monCharSimple2(y) ;
data:

 monCharSimple2 = "t" ;
}

Des idées? merci d'avance pour votre aide !!

Dernière modification par kboo (Le 20/02/2013, à 14:59)

Hors ligne

#2 Le 20/02/2013, à 11:22

grim7reaper

Re : [Résolu] NetCDF C++

Salut,

Ce code fonctionne :

#include <netcdfcpp.h>
#include <string>

static const int NY = 4;

int main()
{
    NcFile dataFile("chaineSimple.nc", NcFile::Replace);

    NcDim* yDim = dataFile.add_dim("y", NY);
    NcVar *monCharSimple2 = dataFile.add_var("monCharSimple2", ncChar, yDim);

    std::string toto2 = "toto";
    monCharSimple2->put(toto2.c_str(), NY);

    return 0;
}

Au passage, le using namespace sur std c’est une mauvaise pratique.
Et std::string à une fonction c_str pour accéder au char* sous-jacent.

Je pense (j’utilise plutôt la nouvelle interface, donc je ne connais pas trop les fonctions de celle-là) que put_rec c’est juste pour écrire un scalaire. Là tu veux écrire un vecteur de ncChar.
Sinon je vois que tu utilises la vieille interface C++, si tu en as la possibilité jette un œil à la nouvelle comme je te le conseillai ici.

Hors ligne

#3 Le 20/02/2013, à 11:40

kboo

Re : [Résolu] NetCDF C++

Salut grim7reaper!
merci beaucoup c'est tout simplement parfait !!!!!!!

En ce qui concerne la nouvelle interface NetCDF, je suis en effet très intéressé mais sais tu comment forcer la compilation pour utiliser la nouvelle et pas l'ancienne, sachant que je ne peux pas être root sur ma machine hmm ? c'est peut être dans les includes?!  sachant que j'ai déjà compilé la dernière version de la bibli en locale
voilà comment je compile:

g++ -c -g -I $HOME/local/netcdf_cxx/cxx4/ chaineSimple.cpp && g++ -o chaineSimple chaineSimple.o -L $HOME/local/netcdf_cxx/cxx4/.libs/ -lnetcdf_c++ -lnetcdf -lm

Hors ligne

#4 Le 20/02/2013, à 11:46

grim7reaper

Re : [Résolu] NetCDF C++

De rien.

Ta ligne de compilation me semble correcte. Tu as des erreurs ?
Sachant que ton code devra être un peu modifié (nom de fonctions un poil différent, et #include <netcdf> au lieu de #include <netcdfcpp.h>)

Dernière modification par grim7reaper (Le 20/02/2013, à 11:48)

Hors ligne

#5 Le 20/02/2013, à 12:28

kboo

Re : [Résolu] NetCDF C++

Exact, tout simplement une histoire d'include smile
Alors j'ai essayé ça (j'ai tenté avec et sans namespace.... mais je galère)

//#include <netcdfcpp.h>
#include <netcdf>
#include <string>

using namespace netCDF;

static const int NY = 7;

int main()
{
    NcFile dataFile("chaineSimple.nc", NcFile::replace);
/*
//    NcFile dataFile("chaineSimple.nc", NcFile::Replace);//avant

    NcDim yDim = dataFile.addDim("y", NY);
//    NcDim* yDim = dataFile.add_dim("y", NY); //avant

    NcVar monCharSimple2 = dataFile.addVar("monCharSimple2", ncChar, yDim);
//    NcVar *monCharSimple2 = dataFile.add_var("monCharSimple2", ncChar, yDim);//avant

    std::string toto2 = "toto";
    monCharSimple2.putVar(&toto2);
//    monCharSimple2->put(toto2.c_str(), NY);//avant
*/
    return 0;
}

et ça ne compile pas du tout hmm
ça me donne ça:

chaineSimple.o: In function `main':
/home/kboo/Documents/projet/ValoFlex/tests/test/chaineSimple.cpp:11: undefined reference to `netCDF::NcFile::NcFile(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, netCDF::NcFile::FileMode)'
/home/kboo/Documents/projet/ValoFlex/tests/test/chaineSimple.cpp:11: undefined reference to `netCDF::NcFile::~NcFile()'
/home/kboo/Documents/projet/ValoFlex/tests/test/chaineSimple.cpp:25: undefined reference to `netCDF::NcFile::~NcFile()'
collect2: ld returned 1 exit status

une idée? en tout cas merci encore !

Hors ligne

#6 Le 20/02/2013, à 13:00

grim7reaper

Re : [Résolu] NetCDF C++

Quand tu fais l’édition des liens tu utilises bien

-lnetcdf_c++4

au lieu de

-lnetcdf_c++

?

Hors ligne

#7 Le 20/02/2013, à 13:51

kboo

Re : [Résolu] NetCDF C++

Exact!
je remplace donc la ligne de commande par:

g++ -c -g -I $HOME/local/netcdf_cxx/cxx4/ chaineSimple.cpp && g++ -o chaineSimple chaineSimple.o -L $HOME/local/netcdf_cxx/cxx4/.libs/ -lnetcdf_c++4 -lnetcdf -lm

mais là nouvelle surprise:

error while loading shared libraries: libnetcdf_c++4.so.1: cannot open shared object file: No such file or directory

or j'ai bien mis

g++ -o chaineSimple chaineSimple.o -L $HOME/local/netcdf_cxx/cxx4/.libs/ -lnetcdf_c++4 -lnetcdf -lm

et dans "$HOME/local/netcdf_cxx/cxx4/.libs/" j'ai bien ça:

Kboo@monLinux:~/local/netcdf_cxx/cxx4/.libs$ ls -l
total 11220
-rw-r--r-- 1 Kboo monGroupe 4710614 31 janv. 17:13 libnetcdf_c++4.a
lrwxrwxrwx 1 Kboo monGroupe      20 31 janv. 17:13 libnetcdf_c++4.la -> ../libnetcdf_c++4.la
-rw-r--r-- 1 Kboo monGroupe     976 31 janv. 17:13 libnetcdf_c++4.lai
lrwxrwxrwx 1 Kboo monGroupe      23 31 janv. 17:13 libnetcdf_c++4.so -> libnetcdf_c++4.so.1.0.2
lrwxrwxrwx 1 Kboo monGroupe      23 31 janv. 17:13 libnetcdf_c++4.so.1 -> libnetcdf_c++4.so.1.0.2
-rwxr-xr-x 1 Kboo monGroupe 1992689 31 janv. 17:13 libnetcdf_c++4.so.1.0.2
-rw-r--r-- 1 Kboo monGroupe  158848 31 janv. 17:13 ncAtt.o
-rw-r--r-- 1 Kboo monGroupe   45496 31 janv. 17:13 ncByte.o
-rw-r--r-- 1 Kboo monGroupe   45064 31 janv. 17:13 ncChar.o
-rw-r--r-- 1 Kboo monGroupe  281528 31 janv. 17:13 ncCheck.o
-rw-r--r-- 1 Kboo monGroupe  133208 31 janv. 17:13 ncCompoundType.o
-rw-r--r-- 1 Kboo monGroupe   85392 31 janv. 17:13 ncDim.o
-rw-r--r-- 1 Kboo monGroupe   45160 31 janv. 17:13 ncDouble.o
-rw-r--r-- 1 Kboo monGroupe   97112 31 janv. 17:13 ncEnumType.o
-rw-r--r-- 1 Kboo monGroupe  683568 31 janv. 17:13 ncException.o
-rw-r--r-- 1 Kboo monGroupe   68120 31 janv. 17:13 ncFile.o
-rw-r--r-- 1 Kboo monGroupe   45096 31 janv. 17:13 ncFloat.o
-rw-r--r-- 1 Kboo monGroupe   78824 31 janv. 17:13 ncGroupAtt.o
-rw-r--r-- 1 Kboo monGroupe 1417856 31 janv. 17:13 ncGroup.o
-rw-r--r-- 1 Kboo monGroupe   45096 31 janv. 17:13 ncInt64.o
-rw-r--r-- 1 Kboo monGroupe   44992 31 janv. 17:13 ncInt.o
-rw-r--r-- 1 Kboo monGroupe   88488 31 janv. 17:13 ncOpaqueType.o
-rw-r--r-- 1 Kboo monGroupe   45096 31 janv. 17:13 ncShort.o
-rw-r--r-- 1 Kboo monGroupe   45160 31 janv. 17:13 ncString.o
-rw-r--r-- 1 Kboo monGroupe   78168 31 janv. 17:13 ncType.o
-rw-r--r-- 1 Kboo monGroupe   45096 31 janv. 17:13 ncUbyte.o
-rw-r--r-- 1 Kboo monGroupe   45160 31 janv. 17:13 ncUint64.o
-rw-r--r-- 1 Kboo monGroupe   45064 31 janv. 17:13 ncUint.o
-rw-r--r-- 1 Kboo monGroupe   45160 31 janv. 17:13 ncUshort.o
-rw-r--r-- 1 Kboo monGroupe  105240 31 janv. 17:13 ncVarAtt.o
-rw-r--r-- 1 Kboo monGroupe  797600 31 janv. 17:13 ncVar.o
-rw-r--r-- 1 Kboo monGroupe   93912 31 janv. 17:13 ncVlenType.o

je comprend pas trop... j'ai du me planter dans l'édition des liens mais je ne vois pas du tout!

Merci smile

Hors ligne

#8 Le 20/02/2013, à 14:01

grim7reaper

Re : [Résolu] NetCDF C++

L’erreur que tu as, c’est bien à l’exécution, non ?
Dans ce cas, il faut que tu joues avec la variable d’environnement LD_LIBRARY_PATH, du genre :

LD_LIBRARY_PATH="$HOME/local/netcdf_cxx/cxx4/.libs/" ./chaineSimple

Tu pourrais éventuellement donner la valeur à LD_LIBRARY_PATH dans le bashrc (si tu utilises Bash), puis l’exporter.

Où alors (pas testé) ajouter cela lorsque tu fais l’édition des liens.

-Wl,-rpath,$($HOME/local/netcdf_cxx/cxx4/.libs/)

(En cas de soucis, essaye de remplacer $HOME par son contenu car je suis pas sûr que ça passe).

Hors ligne

#9 Le 20/02/2013, à 14:36

kboo

Re : [Résolu] NetCDF C++

Ça marche !!!! big_smile
Oui l'erreur était lros de l'execution! j'ai rien vu car j'avais fait un script bash pour enchainer la compilation, l'execution et ncdum pour voir le contenu du netCDF,
sinon j'ai choisi la solution du LD_LIBRARY_PATH qui fonctionne à merveille !
En tout cas tu maitrises bien !

Merci pour tout!

Dernière modification par kboo (Le 20/02/2013, à 14:38)

Hors ligne

#10 Le 20/02/2013, à 14:55

grim7reaper

Re : [Résolu] NetCDF C++

De rien smile
Je fais pas mal de NetCDF aussi en ce moment (via Python ou C++, selon les besoins), ceci expliquant cela.

Pense à passer ton sujet en résolu wink

Hors ligne

Haut de page ↑