Pages : 1
#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 ? 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
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 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
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 !!!!
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
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
Pages : 1