Domanda

Ho un progetto in C ++ usando Marray Library. Per ora compila e funziona abbastanza bene con MINGW G ++ 4.7 e MSVC2010 su Windows 7 x64 e anche con G ++ 4.7 su Linux Mint X64. Ho deciso di provare a provare a Intel C ++ Compiler v. 12.1.4 per Linux. È stato in grado di compilare il codice ma quando cerca di eseguire qualsiasi linea infastidendo i modelli di espressione (come c= a + b dove tutti e tre i termini sono matrici) si rompe con il guasto di segmentazione. Questo problema influisce sul debug e delle versioni di rilascio dell'app.

Ho anche provato a compilare test unit test e codice tutorial per Biblioteca Marray e ancora, Intel C ++ compone il codice ma non riesce a eseguirlo se dispone di modelli di espressione. Intel C ++ è davvero male con i modelli profondi o mi manca qualcosa? Devo impostare qualsiasi flag di compilatore speciale per rendere le espressioni del modello funzionano? O forse è solo qualcosa di sbagliato nella particolare libreria che sto usando, non la tecnica dei modelli di espressione in generale?

Ho anche provato a impostare -FTemplate-Planplate-Proft- n flag usando un'ampia varietà su n Fino a valori ridicolmente grandi di 10 ^ 10 e non avevano ancora fortuna nel correre né la mia app né il mio intervallo di marate / tutorial senza l'errore di segmentazione.

Upd .: Ecco il registro GDB per il tutorial-Marray dalla libreria menzionata compilata con ICPC in modalità Debug.

GNU gdb (Ubuntu/Linaro 7.3-0ubuntu2) 7.3-2011.08
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
For bug reporting instructions, please see:
<http://bugs.launchpad.net/gdb-linaro/>...
Reading symbols from /home/dmitry/SOFT/Development/marray_orig/tutorial-marray...done.
(gdb) l 126
121                 size_t shape[] = {3, 4, 2};
122                 marray::Marray<int> a(shape, shape + 3, 2);
123                 marray::Marray<int> b(shape, shape + 3, 2);
124                 marray::Marray<int> c;
125
126                 ++a;
127                 --a;
128
129                 a += 2;
130                 a -= 2;
(gdb) break 126
Breakpoint 1 at 0x452de8: file /home/dmitry/SOFT/Development/marray_orig/marray/src/tutorial/tutorial.cxx, line 126.
(gdb) run
Starting program: /home/dmitry/SOFT/Development/marray_orig/tutorial-marray 
A(c,r,0) =
1 0 0 
0 0 0 
0 0 0 
0 0 0 

A(c,r,1) =
0 0 0 
0 0 0 
0 0 0 
0 0 2 

1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 

Breakpoint 1, main () at /home/dmitry/SOFT/Development/marray_orig/marray/src/tutorial/tutorial.cxx:126
126                 ++a;
(gdb) next
127                 --a;
(gdb) next
129                 a += 2;
(gdb) next
130                 a -= 2;
(gdb) next
131                 a /= 2;
(gdb) next
132                 a *= 2;
(gdb) next
134                 c = a + b;
(gdb) next

Program received signal SIGSEGV, Segmentation fault.
0x0000000000420fcf in marray::ViewExpression<marray::View<int, false, std::allocator<unsigned long> >, int>::operator marray::View<int, false, std::allocator<unsigned long> > const& (this=0x7fffffffcd88)
at /home/dmitry/SOFT/Development/marray_orig/marray/include/marray/marray.hxx:5409
5409            { return static_cast<const E&>(*this); }
(gdb) 
.

Sembra che il problema non provenga dalla tecnica del modello di espressione in generale, l'arithmetica array con i numeri funziona bene. Il problema sorge quando sto cercando di aggiungere un array all'altro.

Uper. 2: In realtà il tutto sembra come il problema menzionato qui < / a>. La soluzione dovrebbe essere nella riscrittura dell'operatore E & () {return static_cast (* questo); } in qualcosa come E & Get_ref () {return static_cast (* questo); } e la stessa cosa per riferimento const. E, naturalmente, cambia l'utilizzo di queste cose all'interno del codice. Lo proverò non appena posso e riportare i risultati.

È stato utile?

Soluzione

Il problema è simile a quello riportato qui .La ragione effettiva del problema è che il codice generato da compilatore Intel C ++ gestisce espressioni come questa:

operator E&() 
{ 
    return static_cast<E&>(*this); 
}
.

Come chiamate ricorsive di questo operatore.Una semplice soluzione alternativa è cambiare l'operatore in metodo come

E& get_ref()
{
    return static_cast<E&>(*this);
}
.

Lo svantaggio è che devi cambiare ogni riga di codice che ha utilizzato quell'operatore.Fortunatamente, non era troppo difficile con il menzionato Marray libreria, quindi ora sia la mia app cheI tutorial e i test unitario di quella biblioteca lavorano come un fascino con il compilatore Intel C ++.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top