Derniers messages sur Zeste de Savoirhttps://zestedesavoir.com/forums/2015-05-23T14:03:43+02:00Les derniers messages parus sur le forum de Zeste de Savoir.LLDB se trompe de struct, message #581312015-05-23T14:03:43+02:00Luthaf/@Luthafhttps://zestedesavoir.com/forums/sujet/3240/lldb-se-trompe-de-struct/?page=1#p58131<p>Bon j'ai résolu ma segfault (les vecteurs n'était pas alloués, ou pas à la bonne taille …), mais le problème d'affichage dans LLDB reste le même. </p>
<p>Je marque comme résolu, mais je veux bien savoir ce qui se passe, si vous avez des idées !</p>LLDB se trompe de struct, message #580872015-05-22T21:56:11+02:00Luthaf/@Luthafhttps://zestedesavoir.com/forums/sujet/3240/lldb-se-trompe-de-struct/?page=1#p58087<p>Oui, en effet. En gros le code appelle le constructeur (sur le tas, au cas où cela ait une importance), puis la fonction read, qui cause cette segfault. Ces appels sont cachés dans une hiérarchie de classes, donc le code exact importe peu. </p>LLDB se trompe de struct, message #580782015-05-22T21:08:16+02:00pierre_24/@pierre_24https://zestedesavoir.com/forums/sujet/3240/lldb-se-trompe-de-struct/?page=1#p58078<p>Je fatigue peut être, mais faudrait pas le code du test en question ?</p>LLDB se trompe de struct, message #580742015-05-22T20:43:53+02:00Luthaf/@Luthafhttps://zestedesavoir.com/forums/sujet/3240/lldb-se-trompe-de-struct/?page=1#p58074<p>Dans le cadre de ma bibliothèque Chemharp, j'essaye d'intégrer un bibliothèque externe à la mienne. Cette bibliothèque est un <a href="http://www.ks.uiuc.edu/Research/vmd/plugins/molfile/">plugin de VMD</a>, dont l'interface est décrite dans <a href="https://github.com/Luthaf/VMD-Molfiles/blob/master/include/molfile_plugin.h">ce fichier</a>. </p>
<p>Seulement, quand je lance mon test, j'ai une segfault. J'utilise LLDB pour débugger, et voici la transcription d'une session :</p>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre> 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</pre></div></td><td class="code"><div class="codehilite"><pre>$ lldb ./tests/molfile
(lldb) target create "./tests/molfile"
Current executable set to './tests/molfile' (x86_64).
(lldb) run
Process 13976 launched: './tests/molfile' (x86_64)
Process 13976 stopped
* thread #1: tid = 0xef61, 0x00000001001988d6 libchemharp.0.1.0.dylib`harp::Molfile<(this=0x0000000100810420, timestep=0x00007fff5fbfd050, frame=0x00007fff5fbfd428)0>::molfile_to_frame(molfile_timestep_t const&, harp::Frame&) + 310 at Molfile.cpp:178, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x0)
frame #0: 0x00000001001988d6 libchemharp.0.1.0.dylib`harp::Molfile<(this=0x0000000100810420, timestep=0x00007fff5fbfd050, frame=0x00007fff5fbfd428)0>::molfile_to_frame(molfile_timestep_t const&, harp::Frame&) + 310 at Molfile.cpp:178
175
176 auto& positions = frame.positions();
177 for (size_t i=0; i<static_cast<size_t>(natoms); i++) {
-> 178 positions[i][0] = timestep.coords[3*i];
179 positions[i][1] = timestep.coords[3*i + 1];
180 positions[i][2] = timestep.coords[3*i + 2];
181 }
(lldb) print timestep
(molfile_timestep_t) $0 = {
abiversion = 16834048
type = 0x0000000000000000
name = 0x4170000041700000 ""
prettyname = 0x42b4000041700000 ""
author = 0x42b4000042b40000 ""
majorv = 0
minorv = 0
is_reentrant = 1606407208
}
(lldb) print timestep
(molfile_timestep_t) $1 = {
coords = 0x000000010100de00
velocities = 0x0000000000000000
A = 15
B = 15
C = 15
alpha = 90
beta = 90
gamma = 90
physical_time = 0
}
</pre></div>
</td></tr></table>
<p>Le problème, c'est que LLDB m'interprete le même objet comme provenant de 2 struct différentes … En effet le premier affichage correspond à un <code>vmd_plugin_t</code>, décrit <a href="https://github.com/Luthaf/VMD-Molfiles/blob/master/include/vmdplugin.h">ici</a>.</p>
<p>Mon code appelant (Attention, c'est encore en cours et pas finalisé!) : (Molfile.hpp)</p>
<div class="spoiler">
<p><table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre> 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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74</pre></div></td><td class="code"><div class="codehilite"><pre><span class="cm">/*</span>
<span class="cm"> * Chemharp, an efficient IO library for chemistry file formats</span>
<span class="cm"> * Copyright (C) 2015 Guillaume Fraux</span>
<span class="cm"> *</span>
<span class="cm"> * This Source Code Form is subject to the terms of the Mozilla Public</span>
<span class="cm"> * License, v. 2.0. If a copy of the MPL was not distributed with this</span>
<span class="cm"> * file, You can obtain one at http://mozilla.org/MPL/2.0/</span>
<span class="cm">*/</span>
<span class="cp">#ifndef HARP_FORMAT_MOLFILE_HPP</span>
<span class="cp">#define HARP_FORMAT_MOLFILE_HPP</span>
<span class="cp">#include "Format.hpp"</span>
<span class="cp">#include "Dynlib.hpp"</span>
<span class="cp">#include "TrajectoryFactory.hpp"</span>
<span class="cp">#include <memory></span>
<span class="k">extern</span> <span class="s">"C"</span> <span class="p">{</span>
<span class="cp">#include "vmdplugin.h"</span>
<span class="cp">#include "molfile_plugin.h"</span>
<span class="p">}</span>
<span class="k">namespace</span> <span class="n">harp</span> <span class="p">{</span>
<span class="k">enum</span> <span class="n">MolfileFormat</span> <span class="p">{</span>
<span class="n">PDB</span><span class="p">,</span>
<span class="n">LAMMPS</span><span class="p">,</span>
<span class="p">};</span>
<span class="cm">/*!</span>
<span class="cm"> * @class Molfile formats/Molfile.hpp formats/Molfile.cpp</span>
<span class="cm"> *</span>
<span class="cm"> * Use of VMD Molfile plugins as format reader/writer.</span>
<span class="cm"> */</span>
<span class="k">template</span> <span class="o"><</span><span class="n">MolfileFormat</span> <span class="n">F</span><span class="o">></span>
<span class="k">class</span> <span class="nc">Molfile</span> <span class="o">:</span> <span class="k">public</span> <span class="n">Format</span> <span class="p">{</span>
<span class="k">public</span><span class="o">:</span>
<span class="n">Molfile</span><span class="p">();</span>
<span class="o">~</span><span class="n">Molfile</span><span class="p">();</span>
<span class="k">virtual</span> <span class="kt">void</span> <span class="n">read</span><span class="p">(</span><span class="n">File</span><span class="o">*</span> <span class="n">file</span><span class="p">,</span> <span class="n">Frame</span><span class="o">&</span> <span class="n">frame</span><span class="p">)</span> <span class="k">override</span><span class="p">;</span>
<span class="k">virtual</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">description</span><span class="p">()</span> <span class="k">const</span> <span class="k">override</span><span class="p">;</span>
<span class="k">virtual</span> <span class="kt">size_t</span> <span class="n">nsteps</span><span class="p">(</span><span class="n">File</span><span class="o">*</span> <span class="n">file</span><span class="p">)</span> <span class="k">const</span> <span class="k">override</span><span class="p">;</span>
<span class="k">private</span><span class="o">:</span>
<span class="c1">/// Convert a molfile timestep to a chemharp frame</span>
<span class="kt">void</span> <span class="n">molfile_to_frame</span><span class="p">(</span><span class="k">const</span> <span class="kt">molfile_timestep_t</span><span class="o">&</span> <span class="n">timestep</span><span class="p">,</span> <span class="n">Frame</span><span class="o">&</span> <span class="n">frame</span><span class="p">);</span>
<span class="c1">/// Open the file at the given path if needed</span>
<span class="kt">void</span> <span class="n">open_file_if_needed</span><span class="p">(</span><span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&</span> <span class="n">path</span><span class="p">)</span> <span class="k">const</span><span class="p">;</span>
<span class="c1">/// Dynamic library associated with the VMD plugin</span>
<span class="n">Dynlib</span> <span class="n">lib</span><span class="p">;</span>
<span class="c1">/// VMD molfile plugin</span>
<span class="kt">molfile_plugin_t</span><span class="o">*</span> <span class="n">plugin</span><span class="p">;</span>
<span class="k">typedef</span> <span class="nf">int</span> <span class="p">(</span><span class="o">*</span><span class="kt">init_function_t</span><span class="p">)(</span><span class="kt">void</span><span class="p">);</span>
<span class="k">typedef</span> <span class="nf">int</span> <span class="p">(</span><span class="o">*</span><span class="kt">register_function_t</span><span class="p">)(</span><span class="kt">void</span><span class="o">*</span><span class="p">,</span> <span class="n">vmdplugin_register_cb</span><span class="p">);</span>
<span class="c1">/// Function to call at in the destructor</span>
<span class="kt">init_function_t</span> <span class="n">fini_fun</span><span class="p">;</span>
<span class="c1">/// The last file name</span>
<span class="k">mutable</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">last_file_name</span><span class="p">;</span>
<span class="c1">/// The file handler</span>
<span class="k">mutable</span> <span class="kt">void</span><span class="o">*</span> <span class="n">file_handler</span><span class="p">;</span>
<span class="c1">/// The number of atoms in the last trajectory read</span>
<span class="k">mutable</span> <span class="kt">int</span> <span class="n">natoms</span><span class="p">;</span>
<span class="n">REGISTER_FORMAT</span><span class="p">;</span>
<span class="p">};</span>
<span class="p">}</span>
<span class="cp">#endif</span>
</pre></div>
</td></tr></table>
</p>
</div>
<p>Et Molfile.cpp:</p>
<div class="spoiler">
<p><table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre> 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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212</pre></div></td><td class="code"><div class="codehilite"><pre><span class="cp">#include <map></span>
<span class="cp">#include <cstdlib></span>
<span class="cp">#include "formats/Molfile.hpp"</span>
<span class="cp">#include "Frame.hpp"</span>
<span class="k">using</span> <span class="k">namespace</span> <span class="n">harp</span><span class="p">;</span>
<span class="cm">/******************************************************************************/</span>
<span class="k">struct</span> <span class="kt">plugin_data_t</span> <span class="p">{</span>
<span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">format</span><span class="p">;</span>
<span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">lib_name</span><span class="p">;</span>
<span class="kt">bool</span> <span class="n">have_velocities</span><span class="p">;</span>
<span class="p">};</span>
<span class="k">static</span> <span class="n">std</span><span class="o">::</span><span class="n">map</span><span class="o"><</span><span class="n">MolfileFormat</span><span class="p">,</span> <span class="kt">plugin_data_t</span><span class="o">></span> <span class="n">molfile_plugins</span> <span class="p">{</span>
<span class="p">{</span><span class="n">PDB</span><span class="p">,</span> <span class="p">{</span><span class="s">"PDB"</span><span class="p">,</span> <span class="s">"pdbplugin.so"</span><span class="p">,</span> <span class="nb">false</span><span class="p">}},</span>
<span class="p">};</span>
<span class="k">struct</span> <span class="kt">plugin_reginfo_t</span> <span class="p">{</span>
<span class="kt">void</span><span class="o">*</span> <span class="n">plugin</span><span class="p">;</span>
<span class="p">};</span>
<span class="k">static</span> <span class="kt">int</span> <span class="nf">register_plugin</span><span class="p">(</span><span class="kt">void</span> <span class="o">*</span><span class="n">v</span><span class="p">,</span> <span class="kt">vmdplugin_t</span> <span class="o">*</span><span class="n">p</span><span class="p">)</span> <span class="p">{</span>
<span class="kt">plugin_reginfo_t</span> <span class="o">*</span><span class="n">r</span> <span class="o">=</span> <span class="k">static_cast</span><span class="o"><</span><span class="kt">plugin_reginfo_t</span> <span class="o">*></span><span class="p">(</span><span class="n">v</span><span class="p">);</span>
<span class="k">if</span> <span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="p">(</span><span class="n">MOLFILE_PLUGIN_TYPE</span><span class="p">)</span> <span class="o">!=</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="p">(</span><span class="n">p</span><span class="o">-></span><span class="n">type</span><span class="p">))</span>
<span class="k">throw</span> <span class="n">PluginError</span><span class="p">(</span><span class="s">"Wrong plugin type"</span><span class="p">);</span>
<span class="n">r</span><span class="o">-></span><span class="n">plugin</span> <span class="o">=</span> <span class="k">static_cast</span><span class="o"><</span><span class="kt">void</span> <span class="o">*></span><span class="p">(</span><span class="n">p</span><span class="p">);</span>
<span class="k">return</span> <span class="n">VMDPLUGIN_SUCCESS</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">static</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">libpath</span><span class="p">(</span><span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&</span> <span class="n">lib_name</span><span class="p">){</span>
<span class="c1">// First look for the CHRP_MOLFILES environement variable</span>
<span class="k">if</span><span class="p">(</span><span class="k">const</span> <span class="kt">char</span><span class="o">*</span> <span class="n">MOLFILE_DIR</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">getenv</span><span class="p">(</span><span class="s">"CHRP_MOLFILES"</span><span class="p">))</span> <span class="p">{</span>
<span class="k">return</span> <span class="n">MOLFILE_DIR</span> <span class="o">+</span> <span class="n">lib_name</span><span class="p">;</span>
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span> <span class="c1">// Use the compile-time macro CHRP_MOLFILES_DIR</span>
<span class="k">return</span> <span class="n">CHRP_MOLFILES_DIR</span> <span class="o">+</span> <span class="n">lib_name</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="cm">/******************************************************************************/</span>
<span class="k">template</span> <span class="o"><</span><span class="n">MolfileFormat</span> <span class="n">F</span><span class="o">></span> <span class="n">Molfile</span><span class="o"><</span><span class="n">F</span><span class="o">>::</span><span class="n">Molfile</span><span class="p">()</span>
<span class="o">:</span> <span class="n">plugin</span><span class="p">(</span><span class="k">nullptr</span><span class="p">),</span> <span class="n">fini_fun</span><span class="p">(</span><span class="k">nullptr</span><span class="p">),</span> <span class="n">last_file_name</span><span class="p">(</span><span class="s">""</span><span class="p">),</span> <span class="n">file_handler</span><span class="p">(</span><span class="k">nullptr</span><span class="p">),</span> <span class="n">natoms</span><span class="p">(</span><span class="mi">0</span><span class="p">){</span>
<span class="c1">// Open the library</span>
<span class="n">lib</span> <span class="o">=</span> <span class="n">Dynlib</span><span class="p">(</span><span class="n">libpath</span><span class="p">(</span><span class="n">molfile_plugins</span><span class="p">[</span><span class="n">F</span><span class="p">].</span><span class="n">lib_name</span><span class="p">));</span>
<span class="c1">// Get the pointer to the initialization function</span>
<span class="k">auto</span> <span class="n">init_fun</span> <span class="o">=</span> <span class="n">lib</span><span class="p">.</span><span class="n">symbol</span><span class="o"><</span><span class="kt">init_function_t</span><span class="o">></span><span class="p">(</span><span class="s">"vmdplugin_init"</span><span class="p">);</span>
<span class="k">if</span> <span class="p">(</span><span class="n">init_fun</span><span class="p">())</span>
<span class="k">throw</span> <span class="n">PluginError</span><span class="p">(</span><span class="s">"Could not initialize the "</span> <span class="o">+</span> <span class="n">molfile_plugins</span><span class="p">[</span><span class="n">F</span><span class="p">].</span><span class="n">format</span> <span class="o">+</span> <span class="s">" plugin."</span><span class="p">);</span>
<span class="c1">// Get the pointer to the registration function</span>
<span class="k">auto</span> <span class="n">register_fun</span> <span class="o">=</span> <span class="n">lib</span><span class="p">.</span><span class="n">symbol</span><span class="o"><</span><span class="kt">register_function_t</span><span class="o">></span><span class="p">(</span><span class="s">"vmdplugin_register"</span><span class="p">);</span>
<span class="c1">// Get the pointer to the freeing function</span>
<span class="n">fini_fun</span> <span class="o">=</span> <span class="n">lib</span><span class="p">.</span><span class="n">symbol</span><span class="o"><</span><span class="kt">init_function_t</span><span class="o">></span><span class="p">(</span><span class="s">"vmdplugin_fini"</span><span class="p">);</span>
<span class="kt">plugin_reginfo_t</span> <span class="n">reginfo</span><span class="p">;</span>
<span class="n">reginfo</span><span class="p">.</span><span class="n">plugin</span> <span class="o">=</span> <span class="k">nullptr</span><span class="p">;</span>
<span class="c1">// The first argument here is passed as the first argument to register_plugin ...</span>
<span class="k">if</span> <span class="p">(</span><span class="n">register_fun</span><span class="p">(</span><span class="o">&</span><span class="n">reginfo</span><span class="p">,</span> <span class="n">register_plugin</span><span class="p">))</span>
<span class="k">throw</span> <span class="n">PluginError</span><span class="p">(</span><span class="s">"Could not register the "</span> <span class="o">+</span> <span class="n">molfile_plugins</span><span class="p">[</span><span class="n">F</span><span class="p">].</span><span class="n">format</span> <span class="o">+</span> <span class="s">" plugin."</span><span class="p">);</span>
<span class="n">plugin</span> <span class="o">=</span> <span class="k">static_cast</span><span class="o"><</span><span class="kt">molfile_plugin_t</span><span class="o">*></span><span class="p">(</span><span class="n">reginfo</span><span class="p">.</span><span class="n">plugin</span><span class="p">);</span>
<span class="c1">// Check the ABI version of the loaded plugin</span>
<span class="k">if</span> <span class="p">(</span><span class="n">plugin</span><span class="o">-></span><span class="n">abiversion</span> <span class="o">!=</span> <span class="n">vmdplugin_ABIVERSION</span><span class="p">)</span>
<span class="k">throw</span> <span class="n">PluginError</span><span class="p">(</span><span class="s">"The ABI version does not match! Please recompile "</span>
<span class="s">"chemharp or provide another plugin"</span><span class="p">);</span>
<span class="c1">// Check that needed functions are here</span>
<span class="k">if</span> <span class="p">((</span><span class="n">plugin</span><span class="o">-></span><span class="n">open_file_read</span> <span class="o">==</span> <span class="nb">NULL</span><span class="p">)</span> <span class="o">||</span>
<span class="p">(</span><span class="n">plugin</span><span class="o">-></span><span class="n">read_next_timestep</span> <span class="o">==</span> <span class="nb">NULL</span><span class="p">)</span> <span class="o">||</span>
<span class="p">(</span><span class="n">plugin</span><span class="o">-></span><span class="n">close_file_read</span> <span class="o">==</span> <span class="nb">NULL</span><span class="p">))</span>
<span class="k">throw</span> <span class="n">PluginError</span><span class="p">(</span><span class="s">"The "</span> <span class="o">+</span> <span class="n">molfile_plugins</span><span class="p">[</span><span class="n">F</span><span class="p">].</span><span class="n">format</span> <span class="o">+</span>
<span class="s">" plugin does not have read capacities"</span><span class="p">);</span>
<span class="p">}</span>
<span class="k">template</span> <span class="o"><</span><span class="n">MolfileFormat</span> <span class="n">F</span><span class="o">></span> <span class="n">Molfile</span><span class="o"><</span><span class="n">F</span><span class="o">>::~</span><span class="n">Molfile</span><span class="p">(){</span>
<span class="k">if</span> <span class="p">(</span><span class="n">file_handler</span><span class="p">)</span> <span class="p">{</span>
<span class="n">plugin</span><span class="o">-></span><span class="n">close_file_read</span><span class="p">(</span><span class="n">file_handler</span><span class="p">);</span>
<span class="p">}</span>
<span class="n">fini_fun</span><span class="p">();</span>
<span class="p">}</span>
<span class="k">template</span> <span class="o"><</span><span class="n">MolfileFormat</span> <span class="n">F</span><span class="o">></span>
<span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">Molfile</span><span class="o"><</span><span class="n">F</span><span class="o">>::</span><span class="n">description</span><span class="p">()</span> <span class="k">const</span> <span class="p">{</span>
<span class="k">return</span> <span class="s">"Molfile-based reader for the "</span> <span class="o">+</span> <span class="n">molfile_plugins</span><span class="p">[</span><span class="n">F</span><span class="p">].</span><span class="n">format</span> <span class="o">+</span> <span class="s">"format"</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">template</span> <span class="o"><</span><span class="n">MolfileFormat</span> <span class="n">F</span><span class="o">></span>
<span class="kt">void</span> <span class="n">Molfile</span><span class="o"><</span><span class="n">F</span><span class="o">>::</span><span class="n">open_file_if_needed</span><span class="p">(</span><span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&</span> <span class="n">path</span><span class="p">)</span> <span class="k">const</span> <span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="n">path</span> <span class="o">!=</span> <span class="n">last_file_name</span><span class="p">){</span>
<span class="n">last_file_name</span> <span class="o">=</span> <span class="n">path</span><span class="p">;</span>
<span class="c1">// Cleanup</span>
<span class="k">if</span> <span class="p">(</span><span class="n">file_handler</span><span class="p">)</span> <span class="p">{</span>
<span class="n">plugin</span><span class="o">-></span><span class="n">close_file_read</span><span class="p">(</span><span class="n">file_handler</span><span class="p">);</span>
<span class="n">file_handler</span> <span class="o">=</span> <span class="k">nullptr</span><span class="p">;</span>
<span class="p">}</span>
<span class="n">file_handler</span> <span class="o">=</span> <span class="n">plugin</span><span class="o">-></span><span class="n">open_file_read</span><span class="p">(</span><span class="n">last_file_name</span><span class="p">.</span><span class="n">c_str</span><span class="p">(),</span> <span class="n">plugin</span><span class="o">-></span><span class="n">name</span><span class="p">,</span> <span class="o">&</span><span class="n">natoms</span><span class="p">);</span>
<span class="p">}</span>
<span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">file_handler</span><span class="p">)</span> <span class="p">{</span>
<span class="k">throw</span> <span class="n">FileError</span><span class="p">(</span><span class="s">"Could not open the file: "</span> <span class="o">+</span> <span class="n">path</span> <span class="o">+</span> <span class="s">" with VMD molfile"</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="k">template</span> <span class="o"><</span><span class="n">MolfileFormat</span> <span class="n">F</span><span class="o">></span>
<span class="kt">void</span> <span class="n">Molfile</span><span class="o"><</span><span class="n">F</span><span class="o">>::</span><span class="n">read</span><span class="p">(</span><span class="n">File</span><span class="o">*</span> <span class="n">file</span><span class="p">,</span> <span class="n">Frame</span><span class="o">&</span> <span class="n">frame</span><span class="p">){</span>
<span class="n">open_file_if_needed</span><span class="p">(</span><span class="n">file</span><span class="o">-></span><span class="n">filename</span><span class="p">());</span>
<span class="kt">molfile_timestep_t</span> <span class="n">timestep</span><span class="p">;</span>
<span class="n">timestep</span><span class="p">.</span><span class="n">coords</span> <span class="o">=</span> <span class="k">new</span> <span class="kt">float</span><span class="p">[</span><span class="n">natoms</span><span class="p">];</span>
<span class="k">if</span> <span class="p">(</span><span class="n">molfile_plugins</span><span class="p">[</span><span class="n">F</span><span class="p">].</span><span class="n">have_velocities</span><span class="p">)</span>
<span class="n">timestep</span><span class="p">.</span><span class="n">velocities</span> <span class="o">=</span> <span class="k">new</span> <span class="kt">float</span><span class="p">[</span><span class="n">natoms</span><span class="p">];</span>
<span class="k">if</span> <span class="p">(</span><span class="n">timestep</span><span class="p">.</span><span class="n">coords</span> <span class="o">==</span> <span class="nb">NULL</span> <span class="o">||</span>
<span class="p">(</span><span class="n">molfile_plugins</span><span class="p">[</span><span class="n">F</span><span class="p">].</span><span class="n">have_velocities</span> <span class="o">&&</span> <span class="n">timestep</span><span class="p">.</span><span class="n">velocities</span><span class="p">)</span>
<span class="p">)</span> <span class="k">throw</span> <span class="n">FormatError</span><span class="p">(</span><span class="s">"Error allocating memory. Sorry ..."</span><span class="p">);</span>
<span class="kt">int</span> <span class="n">result</span> <span class="o">=</span> <span class="n">plugin</span><span class="o">-></span><span class="n">read_next_timestep</span><span class="p">(</span><span class="n">file_handler</span><span class="p">,</span> <span class="n">natoms</span><span class="p">,</span> <span class="o">&</span><span class="n">timestep</span><span class="p">);</span>
<span class="k">if</span> <span class="p">(</span><span class="n">result</span> <span class="o">!=</span> <span class="n">MOLFILE_SUCCESS</span><span class="p">){</span>
<span class="k">delete</span><span class="p">[]</span> <span class="n">timestep</span><span class="p">.</span><span class="n">coords</span><span class="p">;</span>
<span class="k">delete</span><span class="p">[]</span> <span class="n">timestep</span><span class="p">.</span><span class="n">velocities</span><span class="p">;</span>
<span class="k">throw</span> <span class="nf">FormatError</span><span class="p">(</span><span class="s">"Error while reading the file "</span> <span class="o">+</span> <span class="n">last_file_name</span> <span class="o">+</span>
<span class="s">" using Molfile format "</span> <span class="o">+</span> <span class="n">molfile_plugins</span><span class="p">[</span><span class="n">F</span><span class="p">].</span><span class="n">format</span><span class="p">);</span>
<span class="p">}</span>
<span class="n">molfile_to_frame</span><span class="p">(</span><span class="n">timestep</span><span class="p">,</span> <span class="n">frame</span><span class="p">);</span>
<span class="k">delete</span><span class="p">[]</span> <span class="n">timestep</span><span class="p">.</span><span class="n">coords</span><span class="p">;</span>
<span class="k">delete</span><span class="p">[]</span> <span class="n">timestep</span><span class="p">.</span><span class="n">velocities</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">template</span> <span class="o"><</span><span class="n">MolfileFormat</span> <span class="n">F</span><span class="o">></span>
<span class="kt">size_t</span> <span class="n">Molfile</span><span class="o"><</span><span class="n">F</span><span class="o">>::</span><span class="n">nsteps</span><span class="p">(</span><span class="n">File</span><span class="o">*</span> <span class="n">file</span><span class="p">)</span> <span class="k">const</span> <span class="p">{</span>
<span class="n">open_file_if_needed</span><span class="p">(</span><span class="n">file</span><span class="o">-></span><span class="n">filename</span><span class="p">());</span>
<span class="kt">size_t</span> <span class="n">n</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="kt">int</span> <span class="n">result</span> <span class="o">=</span> <span class="n">MOLFILE_SUCCESS</span><span class="p">;</span>
<span class="k">while</span> <span class="p">(</span><span class="nb">true</span><span class="p">)</span> <span class="p">{</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">plugin</span><span class="o">-></span><span class="n">read_next_timestep</span><span class="p">(</span><span class="n">file_handler</span><span class="p">,</span> <span class="n">natoms</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">);</span>
<span class="k">if</span> <span class="p">(</span><span class="n">result</span> <span class="o">==</span> <span class="n">MOLFILE_SUCCESS</span><span class="p">)</span>
<span class="n">n</span><span class="o">++</span><span class="p">;</span>
<span class="k">else</span>
<span class="k">break</span><span class="p">;</span>
<span class="p">}</span>
<span class="c1">// We need to close and re-open the file</span>
<span class="n">plugin</span><span class="o">-></span><span class="n">close_file_read</span><span class="p">(</span><span class="n">file_handler</span><span class="p">);</span>
<span class="n">file_handler</span> <span class="o">=</span> <span class="n">plugin</span><span class="o">-></span><span class="n">open_file_read</span><span class="p">(</span><span class="n">last_file_name</span><span class="p">.</span><span class="n">c_str</span><span class="p">(),</span> <span class="n">plugin</span><span class="o">-></span><span class="n">name</span><span class="p">,</span> <span class="o">&</span><span class="n">natoms</span><span class="p">);</span>
<span class="k">return</span> <span class="n">n</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">template</span> <span class="o"><</span><span class="n">MolfileFormat</span> <span class="n">F</span><span class="o">></span>
<span class="kt">void</span> <span class="n">Molfile</span><span class="o"><</span><span class="n">F</span><span class="o">>::</span><span class="n">molfile_to_frame</span><span class="p">(</span><span class="k">const</span> <span class="kt">molfile_timestep_t</span><span class="o">&</span> <span class="n">timestep</span><span class="p">,</span> <span class="n">Frame</span><span class="o">&</span> <span class="n">frame</span><span class="p">){</span>
<span class="k">auto</span> <span class="n">cell</span> <span class="o">=</span> <span class="n">UnitCell</span><span class="p">(</span><span class="n">timestep</span><span class="p">.</span><span class="n">A</span><span class="p">,</span> <span class="n">timestep</span><span class="p">.</span><span class="n">B</span><span class="p">,</span> <span class="n">timestep</span><span class="p">.</span><span class="n">C</span><span class="p">,</span>
<span class="n">timestep</span><span class="p">.</span><span class="n">alpha</span><span class="p">,</span> <span class="n">timestep</span><span class="p">.</span><span class="n">beta</span><span class="p">,</span> <span class="n">timestep</span><span class="p">.</span><span class="n">gamma</span><span class="p">);</span>
<span class="n">frame</span><span class="p">.</span><span class="n">cell</span><span class="p">(</span><span class="n">cell</span><span class="p">);</span>
<span class="k">auto</span><span class="o">&</span> <span class="n">positions</span> <span class="o">=</span> <span class="n">frame</span><span class="p">.</span><span class="n">positions</span><span class="p">();</span>
<span class="k">for</span> <span class="p">(</span><span class="kt">size_t</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span><span class="o"><</span><span class="k">static_cast</span><span class="o"><</span><span class="kt">size_t</span><span class="o">></span><span class="p">(</span><span class="n">natoms</span><span class="p">);</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
<span class="n">positions</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">timestep</span><span class="p">.</span><span class="n">coords</span><span class="p">[</span><span class="mi">3</span><span class="o">*</span><span class="n">i</span><span class="p">];</span>
<span class="n">positions</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">timestep</span><span class="p">.</span><span class="n">coords</span><span class="p">[</span><span class="mi">3</span><span class="o">*</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">];</span>
<span class="n">positions</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="n">timestep</span><span class="p">.</span><span class="n">coords</span><span class="p">[</span><span class="mi">3</span><span class="o">*</span><span class="n">i</span> <span class="o">+</span> <span class="mi">2</span><span class="p">];</span>
<span class="p">}</span>
<span class="k">if</span> <span class="p">(</span><span class="n">molfile_plugins</span><span class="p">[</span><span class="n">F</span><span class="p">].</span><span class="n">have_velocities</span><span class="p">){</span>
<span class="k">auto</span><span class="o">&</span> <span class="n">velocities</span> <span class="o">=</span> <span class="n">frame</span><span class="p">.</span><span class="n">velocities</span><span class="p">();</span>
<span class="k">for</span> <span class="p">(</span><span class="kt">size_t</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span><span class="o"><</span><span class="k">static_cast</span><span class="o"><</span><span class="kt">size_t</span><span class="o">></span><span class="p">(</span><span class="n">natoms</span><span class="p">);</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
<span class="n">velocities</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">timestep</span><span class="p">.</span><span class="n">velocities</span><span class="p">[</span><span class="mi">3</span><span class="o">*</span><span class="n">i</span><span class="p">];</span>
<span class="n">velocities</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">timestep</span><span class="p">.</span><span class="n">velocities</span><span class="p">[</span><span class="mi">3</span><span class="o">*</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">];</span>
<span class="n">velocities</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="n">timestep</span><span class="p">.</span><span class="n">velocities</span><span class="p">[</span><span class="mi">3</span><span class="o">*</span><span class="n">i</span> <span class="o">+</span> <span class="mi">2</span><span class="p">];</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="c1">// TODO: topology</span>
<span class="p">}</span>
<span class="cm">/******************************************************************************/</span>
<span class="c1">// Instanciate the templates</span>
<span class="k">template</span> <span class="k">class</span> <span class="nc">harp</span><span class="o">::</span><span class="n">Molfile</span><span class="o"><</span><span class="n">PDB</span><span class="o">></span><span class="p">;</span>
<span class="c1">// Redefine the registering macros</span>
<span class="cp">#undef REGISTER</span>
<span class="cp">#undef REGISTER_EXTENSION</span>
<span class="cp">#define REGISTER(format_t, name) \</span>
<span class="cp">template<> bool format_t::_registered_format_ = \</span>
<span class="cp">TrajectoryFactory::register_format(name, { \</span>
<span class="cp"> FORMAT_CREATOR(format_t), \</span>
<span class="cp"> nullptr \</span>
<span class="cp">});</span>
<span class="cp">#define REGISTER_EXTENSION(format_t, extension) \</span>
<span class="cp">template<> bool format_t::_registered_extension_ = \</span>
<span class="cp">TrajectoryFactory::register_extension(extension, { \</span>
<span class="cp"> FORMAT_CREATOR(format_t), \</span>
<span class="cp"> nullptr \</span>
<span class="cp">});</span>
<span class="cm">/******************************************************************************/</span>
<span class="n">REGISTER</span><span class="p">(</span><span class="n">Molfile</span><span class="o"><</span><span class="n">PDB</span><span class="o">></span><span class="p">,</span> <span class="s">"PDB"</span><span class="p">);</span>
<span class="n">REGISTER_EXTENSION</span><span class="p">(</span><span class="n">Molfile</span><span class="o"><</span><span class="n">PDB</span><span class="o">></span><span class="p">,</span> <span class="s">".pdb"</span><span class="p">);</span>
</pre></div>
</td></tr></table>
</p>
</div>
<p>Et dans le même goût, mais encore plus fort, une autre session LLDB :</p>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21</pre></div></td><td class="code"><div class="codehilite"><pre>$ lldb ./tests/molfile
(lldb) target create "./tests/molfile"
Current executable set to './tests/molfile' (x86_64).
(lldb) run
Process 14008 launched: './tests/molfile' (x86_64)
Process 14008 stopped
* thread #1: tid = 0xf878, 0x00000001001988d6 libchemharp.0.1.0.dylib`harp::Molfile<(this=0x0000000100908510, timestep=0x00007fff5fbfd050, frame=0x00007fff5fbfd428)0>::molfile_to_frame(molfile_timestep_t const&, harp::Frame&) + 310 at Molfile.cpp:178, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x0)
frame #0: 0x00000001001988d6 libchemharp.0.1.0.dylib`harp::Molfile<(this=0x0000000100908510, timestep=0x00007fff5fbfd050, frame=0x00007fff5fbfd428)0>::molfile_to_frame(molfile_timestep_t const&, harp::Frame&) + 310 at Molfile.cpp:178
175
176 auto& positions = frame.positions();
177 for (size_t i=0; i<static_cast<size_t>(natoms); i++) {
-> 178 positions[i][0] = timestep.coords[3*i];
179 positions[i][1] = timestep.coords[3*i + 1];
180 positions[i][2] = timestep.coords[3*i + 2];
181 }
(lldb) print timestep.coords[0]
error: no member named 'coords' in '<anonymous struct>'
error: 1 errors parsing expression
(lldb) print timestep.coords[0]
(float) $0 = 0.416999996
(lldb)
</pre></div>
</td></tr></table>
<p>Voilà, je me demandais si vous aviez une idée pour avoir d'où pouvait provenir ce genre de bug, que je soupçonne d'être relié à ma segfault …</p>