- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我要提前为庞大的代码块道歉——我已尽力将其简化为测试用例。
我的程序在 vectorTest.cpp
中抛出段错误, 在标有注释的行上。我一直追踪段错误到内部 Matrix.h::Matrix< T >::operator[]
,如那里的评论所示。
问题似乎是我无法访问O.rref()::rrefMatrix._values
.这很奇怪,因为你可以从 vectorTest.cpp
的其余部分看到, 我访问 M._values
没问题, M.rref()::rrefMatrix._values
, 或 O._values
.只有当我使用 append()
Matrix< T >::rref()
函数后跟我遇到了我的错误。
我快要穷途末路了。有人可以给我一个解释吗?
vectorTest.cpp:
#include "Vector.h"
#include "Polynomial.h"
#include "Matrix.h"
#include <iostream>
using namespace std;
int main( int argc, char* argv[] )
{
Matrix< float > M( 3, 3 );
M.setValues( { 1, 2, 3, 4, 5, 6, 7, 8, 8 } );
cout << M << endl;
cout << M.rref() << endl;
Matrix< float > N( 3, 1 );
N.setValues( { 2, -2, 5 } );
Matrix< float > O = append( M, N );
cout << O << endl;
cout << O.rref() << endl; //Segfault!
return 0;
}
矩阵.h:
#ifndef __INCL_MATRIX_H__
#define __INCL_MATRIX_H__
#include "Vector.h"
#include <iterator>
#include <algorithm>
#include <utility>
#include <initializer_list>
#include <type_traits>
#include <iomanip>
#include <sstream>
#include <cassert>
template < class T >
class Matrix
: Vector< T >
{
public:
Matrix() :
Vector< T >::Vector()
{};
Matrix( const Matrix< T >& cMatrix ) :
Vector< T >::Vector( cMatrix ),
_numRows( cMatrix._numRows ),
_numColumns( cMatrix._numColumns )
{};
Matrix( const unsigned int r, const unsigned int c ) :
_numRows( r ),
_numColumns( c )
{
_values.reserve( r * c );
for( unsigned int r = 0; r < _numRows; r++ )
for( unsigned int c = 0; c < _numColumns; c++ )
_values[ r * _numColumns + c ] = T( 0 );
}
Matrix< T >& operator= ( const Matrix< T >& );
template < class InputIterator >
typename std::enable_if< std::is_same< T, typename std::iterator_traits< InputIterator >::value_type >::value, void >::type
setValues( InputIterator, InputIterator );
void setValues( std::initializer_list< T > );
T* operator[] ( const unsigned int );
const T* operator[] ( const unsigned int ) const;
unsigned int numRows() const;
unsigned int numColumns() const;
Matrix< T > rref() const;
protected:
void swapRows( const unsigned int, const unsigned int );
private:
using Vector< T >::_values;
unsigned int _numRows;
unsigned int _numColumns;
};
template < class T >
Matrix< T >& Matrix< T >::operator= ( const Matrix< T >& cMatrix )
{
_numRows = cMatrix._numRows;
_numColumns = cMatrix._numColumns;
_values = cMatrix._values;
return *this;
}
template < class T >
template < class InputIterator >
typename std::enable_if< std::is_same< T, typename std::iterator_traits< InputIterator >::value_type >::value, void >::type Matrix< T >::setValues( InputIterator begin, InputIterator end )
{
_values.clear();
for( auto it = begin; it != end; it++ )
if( _values.size() < _numRows * _numColumns )
_values.push_back( *it );
}
template < class T >
void Matrix< T >::setValues( std::initializer_list< T > iList )
{
setValues( iList.begin(), iList.end() );
}
template < class T >
T* Matrix< T >::operator[] ( const unsigned int r )
{
return &( _values[ r * _numColumns ] ); //This is the thorn in my paw.
}
template < class T >
const T* Matrix< T >::operator[] ( const unsigned int r ) const
{
return &( _values[ r * _numColumns ] );
}
template < class T >
unsigned int Matrix< T >::numRows() const
{
return _numRows;
}
template < class T >
unsigned int Matrix< T >::numColumns() const
{
return _numColumns;
}
template < class T >
constexpr T abs( const T a )
{
return ( a < 0 ) ? -a : a;
}
template < class T >
constexpr T gcd( const T a, const T b )
{
return ( a == b || b == 0 ) ? a : ( ( a < b ) ? gcd( abs( b ), abs( a ) ) : gcd( abs( a ) - abs( b ), abs( b ) ) );
}
template < typename T, typename... Ts >
constexpr T gcd( const T a, const T b, const Ts... others )
{
return gcd( gcd( a, b ), others... );
}
template < class T >
Matrix< T > Matrix< T >::rref() const
{
Matrix< T > rrefMatrix = (*this);
unsigned int p = rrefMatrix._numColumns;
T mult = 0, mult1 = 0, mult2 = 0;
for( unsigned int r1 = 0; r1 < rrefMatrix._numRows; r1++ )
{
p = rrefMatrix._numColumns;
for( unsigned int r2 = r1; r2 < rrefMatrix._numRows; r2++ )
{
for( unsigned int c = 0; c < rrefMatrix._numColumns; c++ )
{
if( rrefMatrix[r2][c] != T( 0 ) ) // Why is this segfaulting?
{
p = c;
break;
}
}
if( p != rrefMatrix._numColumns )
{
if( r2 > r1 )
{
rrefMatrix.swapRows( r1, r2 );
}
break;
}
}
if( p == rrefMatrix._numColumns )
break;
for( unsigned int r2 = 0; r2 < rrefMatrix._numRows; r2++ )
{
if( r1 == r2 ) continue;
mult = gcd( rrefMatrix[r1][p], rrefMatrix[r2][p] );
mult1 = mult * rrefMatrix[r2][p];
mult2 = mult * rrefMatrix[r1][p];
for( unsigned int c = 0; c < rrefMatrix._numColumns; c++ )
{
rrefMatrix[r1][c] *= mult1;
rrefMatrix[r2][c] *= mult2;
}
for( unsigned int c = 0; c < rrefMatrix._numColumns; c++ )
{
rrefMatrix[r2][c] -= rrefMatrix[r1][c];
rrefMatrix[r1][c] /= mult1;
}
}
}
for( unsigned int r = 0; r < rrefMatrix._numRows; r++ )
{
p = _numColumns;
for( unsigned int c = 0; c < rrefMatrix._numColumns; c++ )
{
if( rrefMatrix[r][c] != 0 )
{
p = c;
break;
}
}
if( p == rrefMatrix._numColumns ) continue;
mult = rrefMatrix[r][p];
for( unsigned int c = 0; c < rrefMatrix._numColumns; c++ )
rrefMatrix[r][c] /= mult;
}
return rrefMatrix;
}
template < class T >
void Matrix< T >::swapRows( const unsigned int r1, const unsigned int r2 )
{
for( unsigned int c = 0; c < _numColumns; c++ )
std::swap( (*this)[r1][c], (*this)[r2][c] );
}
template < class T >
unsigned int strLength( T& item )
{
std::stringstream ss;
ss << item;
return ss.str().length();
}
template < class T >
std::ostream& operator<< ( std::ostream& out, const Matrix< T >& cMatrix )
{
unsigned int maxLength = 0, currLength = 0;
for( unsigned int r = 0; r < cMatrix.numRows(); r++ )
for( unsigned int c = 0; c < cMatrix.numColumns(); c++ )
{
currLength = strLength( cMatrix[r][c] );
if( currLength > maxLength )
maxLength = currLength;
}
for( unsigned int r = 0; r < cMatrix.numRows(); r++ )
{
for( unsigned int c = 0; c < cMatrix.numColumns(); c++ )
out << std::setw( maxLength ) << cMatrix[r][c] << ' ';
out << std::endl;
}
return out;
}
template < class T >
Matrix< T > append( const Matrix< T >& lhs, const Matrix< T >& rhs )
{
Matrix< T > appendMatrix( lhs.numRows(), lhs.numColumns() + rhs.numColumns() );
for( unsigned int r = 0; r < appendMatrix.numRows(); r++ )
{
for( unsigned int c = 0; c < lhs.numColumns(); c++ )
{
appendMatrix[r][c] = lhs[r][c];
}
for( unsigned int c = 0; c < rhs.numColumns(); c++ )
{
appendMatrix[r][ c + lhs.numColumns() ] = rhs[r][c];
}
}
return appendMatrix;
}
#endif
vector .h:
#ifndef __INCL_VECTOR_H__
#define __INCL_VECTOR_H__
#include <vector>
#include <iostream>
#include <iterator>
#include <initializer_list>
#include <type_traits>
#include <assert.h>
struct VectorBase {};
template < class T >
class Vector
: public VectorBase
{
public:
Vector()
{};
Vector( const Vector< T >& cVector ) :
_values( cVector._values )
{};
template < class InputIterator >
Vector( InputIterator first, InputIterator last ) :
_values( first, last )
{};
Vector( std::initializer_list< T > iList ) :
_values( iList.begin(), iList.end() )
{};
protected:
std::vector< T > _values;
};
#endif
输出:
1 2 3
4 5 6
7 8 8
1 -0 -0
-0 1 -0
0 0 1
1 2 3 2
4 5 6 -2
7 8 8 5
Segmentation fault (core dumped)
最佳答案
在这个构造函数中:
Matrix( const unsigned int r, const unsigned int c ) :
_numRows( r ),
_numColumns( c )
{
_values.reserve( r * c );
for( unsigned int r = 0; r < _numRows; r++ )
for( unsigned int c = 0; c < _numColumns; c++ )
_values[ r * _numColumns + c ] = T( 0 );
}
改变这个:
_values.reserve( r * c );
对此:
_values.resize( r * c );
请参阅 std::vector<>::reserve() 的文档为什么。它设置容量;不是尺寸。这只是意味着您可以将 vector 增长到规定的容量,而不会触发内部重新分配和潜在的对象被复制。
注意:我会认真考虑重组以构造基于r
和c
的预定大小的 vector 。
关于c++ - 从此指针复制后尝试访问基类的成员时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16128683/
我已经使用 vue-cli 两个星期了,直到今天一切正常。我在本地建立这个项目。 https://drive.google.com/open?id=0BwGw1zyyKjW7S3RYWXRaX24tQ
您好,我正在尝试使用 python 库 pytesseract 从图像中提取文本。请找到代码: from PIL import Image from pytesseract import image_
我的错误 /usr/bin/ld: errno: TLS definition in /lib/libc.so.6 section .tbss mismatches non-TLS reference
我已经训练了一个模型,我正在尝试使用 predict函数但它返回以下错误。 Error in contrasts<-(*tmp*, value = contr.funs[1 + isOF[nn]])
根据Microsoft DataConnectors的信息我想通过 this ODBC driver 创建一个从 PowerBi 到 PostgreSQL 的连接器使用直接查询。我重用了 Micros
我已经为 SoundManagement 创建了一个包,其中有一个扩展 MediaPlayer 的类。我希望全局控制这个变量。这是我的代码: package soundmanagement; impo
我在Heroku上部署了一个应用程序。我正在使用免费服务。 我经常收到以下错误消息。 PG::Error: ERROR: out of memory 如果刷新浏览器,就可以了。但是随后,它又随机发生
我正在运行 LAMP 服务器,这个 .htaccess 给我一个 500 错误。其作用是过滤关键字并重定向到相应的域名。 Options +FollowSymLinks RewriteEngine
我有两个驱动器 A 和 B。使用 python 脚本,我在“A”驱动器中创建一些文件,并运行 powerscript,该脚本以 1 秒的间隔将驱动器 A 中的所有文件复制到驱动器 B。 我在 powe
下面的函数一直返回这个错误信息。我认为可能是 double_precision 字段类型导致了这种情况,我尝试使用 CAST,但要么不是这样,要么我没有做对...帮助? 这是错误: ERROR: i
这个问题已经有答案了: Syntax error due to using a reserved word as a table or column name in MySQL (1 个回答) 已关闭
我的数据库有这个小问题。 我创建了一个表“articoli”,其中包含商品的品牌、型号和价格。 每篇文章都由一个 id (ID_ARTICOLO)` 定义,它是一个自动递增字段。 好吧,现在当我尝试插
我是新来的。我目前正在 DeVry 在线学习中级 C++ 编程。我们正在使用 C++ Primer Plus 这本书,到目前为止我一直做得很好。我的老师最近向我们扔了一个曲线球。我目前的任务是这样的:
这个问题在这里已经有了答案: What is an undefined reference/unresolved external symbol error and how do I fix it?
我的网站中有一段代码有问题;此错误仅发生在 Internet Explorer 7 中。 我没有在这里发布我所有的 HTML/CSS 标记,而是发布了网站的一个版本 here . 如您所见,我在列中有
如果尝试在 USB 设备上构建 node.js 应用程序时在我的树莓派上使用 npm 时遇到一些问题。 package.json 看起来像这样: { "name" : "node-todo",
在 Python 中,您有 None单例,在某些情况下表现得很奇怪: >>> a = None >>> type(a) >>> isinstance(a,None) Traceback (most
这是我的 build.gradle (Module:app) 文件: apply plugin: 'com.android.application' android { compileSdkV
我是 android 的新手,我的项目刚才编译和运行正常,但在我尝试实现抽屉导航后,它给了我这个错误 FAILURE: Build failed with an exception. What wen
谁能解释一下?我想我正在做一些非常愚蠢的事情,并且急切地等待着启蒙。 我得到这个输出: phpversion() == 7.2.25-1+0~20191128.32+debian8~1.gbp108
我是一名优秀的程序员,十分优秀!