#1 Le 20/02/2013, à 11:49
[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, à 15:59)
Hors ligne
#2 Le 20/02/2013, à 12:22
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, à 12:40
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
? 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 -lmHors ligne
#4 Le 20/02/2013, à 12:46
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, à 12:48)
Hors ligne
#5 Le 20/02/2013, à 13:28
Re : [Résolu] NetCDF C++
Exact, tout simplement une histoire d'include ![]()
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 ![]()
ç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 statusune idée? en tout cas merci encore !
Hors ligne
#6 Le 20/02/2013, à 14:00
Re : [Résolu] NetCDF C++
Quand tu fais l’édition des liens tu utilises bien
-lnetcdf_c++4au lieu de
-lnetcdf_c++?
Hors ligne
#7 Le 20/02/2013, à 14:51
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 -lmmais là nouvelle surprise:
error while loading shared libraries: libnetcdf_c++4.so.1: cannot open shared object file: No such file or directoryor j'ai bien mis
g++ -o chaineSimple chaineSimple.o -L $HOME/local/netcdf_cxx/cxx4/.libs/ -lnetcdf_c++4 -lnetcdf -lmet 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.oje comprend pas trop... j'ai du me planter dans l'édition des liens mais je ne vois pas du tout!
Merci ![]()
Hors ligne
#8 Le 20/02/2013, à 15:01
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/" ./chaineSimpleTu 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, à 15:36
Re : [Résolu] NetCDF C++
Ça marche !!!! ![]()
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, à 15:38)
Hors ligne
#10 Le 20/02/2013, à 15:55
Re : [Résolu] NetCDF C++
De rien ![]()
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 ![]()
Hors ligne