双打编辑导致崩溃的二维向量

Posted

技术标签:

【中文标题】双打编辑导致崩溃的二维向量【英文标题】:2D Vector of Doubles editing causing crash 【发布时间】:2017-04-20 04:44:33 【问题描述】:

我正在研究一个由二维双精度向量组成的 C++ 类。我即将创建 2D 矢量,但是当我尝试编辑其中的值时,程序崩溃了。我尝试使用 [][] 运算符并将其设置为等于 myDub 并且我尝试使用类似 myMat.editSlot(i,j,myDub) 的类,并且两者都导致程序崩溃。

//n == # 行数和列数(所有矩阵都是正方形) //infile 正确打开文件

mat my_mat(n,n);

// Read input data
for (int i=0; i<n; i++) 
    for (int j=0; j<n; j++) 
        double myDub;
        inFile >> myDub;

        my_mat.editSlot(i,j,myDub);
    

这是课程:

class mat


    mat( int x , int y ) 
        int row = x;
        int col = y;
        vector<vector<double>> A( row , vector<double>( row , 0 ) );


        for ( int i = 0; i<row; i++ )
        
            for ( int j = 0; j<col; j++ )
            
                cout << setw( 6 ) << A[i][j];
            
            cout << endl;
        
    

    void editSlot( int x , int y , double val ) 
        A[x][y] = val;
    
    vector<vector<double>> A;

private:
    int n;

;

【问题讨论】:

请创建Minimal, Complete, and Verifiable Example 向我们展示。一个希望构建 哦,你应该想想A 是在哪里声明的,在什么范围内。 并且如果row != col会发生什么(考虑到本地变量A的初始化)。 也许你的意思是让向量有col 列,而不是row 好的,所以我更新了,所以它应该是复制我的问题所需的最少代码量。 Row 总是 == Col,因为我们给出的所有数据文件都是方形的。它的放置位置有什么问题?不是班级成员吗? @M.M 不,行和列是相同的。 【参考方案1】:

在我看来,您初始化A 的方式是错误的。试试这样的:

A = vector<vector<double>>( row , vector<double>( row , 0 ) );

另一件要考虑的事情是构造函数和编辑函数都没有声明为 public。

【讨论】:

虽然这将解决所提出的直接问题,但它仍然是复制粘贴编程的一个好(或坏,取决于观点)示例。只需复制粘贴该行并进行轻微编辑,您就会错过一个微妙但至关重要的错误,如果row != col 会发生这种错误。 @Someprogrammerdude - OP 已经提到数据是强类型且一致的,并且行将始终等于 col。在这种情况下,什么都不用担心。 虽然对于这个特定的测试用例是正确的,但如果存在使用某些功能的可能性,那么有一天它会被使用。 在某些时候,人们必须使用他们的大脑。由于明确说明了限制,任何不注意它们的人都将自担风险。不断地试图哄骗溺爱的人而不是让他们自己思考,这有点荒谬。【参考方案2】:

导致崩溃的主要问题是您在构造函数中更改了时间向量 A 的大小,而未触及您在类对象中声明为字段的向量。 我建议这样做:

mat(int x,int y) : A(y,vector<double>(x,0)) 
 int row = x;
 int col = y;  
    for(int i=0; i<row; i++)
            
                for(int j=0; j<col; j++)
                
                    cout<<setw(6)<<A[i][j];
                
                cout<<endl;
            
        

在这种情况下,您不会在构造函数中使用临时 A 对象隐藏类中的 A 字段。 另外请注意不要在函数中交换 x 和 y。例如,您的 editSlot 函数中有错误:

void editSlot( int x , int y , double val ) 
    A[x][y] = val;

,应该是:

A[y][x] = val;

根据构造函数。

【讨论】:

以上是关于双打编辑导致崩溃的二维向量的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin.Android 使用 ApkTool 编辑 apk 包名称导致崩溃

索引 2D 矢量正在使我的程序崩溃

一旦按下滑动删除按钮,删除功能(提交编辑样式功能)会导致应用程序崩溃

iOS Xcode - 编辑情节提要对象导致视图控制器场景复制另一个场景然后 Xcode 崩溃

如何取双打向量的平均值

在 iOS 14 中编辑 TextField 时 SwiftUI 崩溃