Failed to get data from BaseContainer



  • Hi,
    I use the plugin to store some data to the Base Container, but it always crashes when I read it again from the Base Container.

    return ...ge_container.h(293): CRITICAL: Stop

    Thanks for any help!

    this is code

    //function ToBc
    static maxon::Result<void> ToBC(BaseContainer& bc_local_pos,maxon::BaseArray<maxon::BaseArray<maxon::BaseArray<Vector>>>& local_pos)
    {
    	//Convert a 3 dimensions BaseArray to a 3 dimensions BaseContainer
    
    	Int32 all_cnt = local_pos.GetCount(), i,x = 0,x_id ;
    	for (i = 0;i < all_cnt;++i)
    	{
    		BaseContainer per_bc_local_pos;
    		Int32 per_local_cnt = local_pos[i].GetCount(), l;
    		for (l = 0;l < per_local_cnt;++l)
    		{
    			BaseContainer per_per_bc_local_pos;
    			Int32 per_per_local_cnt = local_pos[i][l].GetCount(), p_l;
    			for (p_l = 0;p_l < per_per_local_cnt;++p_l)
    			{
    				per_per_bc_local_pos.SetVector(p_l, local_pos[i][l][p_l]);
    			}
    			
    			per_bc_local_pos.SetContainer(l, per_per_bc_local_pos);
    			
    			//test
    			BaseContainer test = per_bc_local_pos.GetContainer(l);
    			x = 0;
    			while (true)
    			{
    				x_id = test.GetIndexId(x++);
    				if (x_id == NOTOK)
    					break;
    				else
    				{
    					Vector vec = test.GetVector(x_id);
    					DiagnosticOutput("Vector:@", vec);
    				}
    
    			}
    			
    		}
    		bc_local_pos.SetContainer(i, per_bc_local_pos);
    
    
    	}
    
    
    	return maxon::OK;
    }
    //function ToArr
    static maxon::Result<void> ToArr(BaseContainer& bc_local_pos, maxon::BaseArray<maxon::BaseArray<maxon::BaseArray<Vector>>>& local_pos)
    {
    	//convert 3 dimensions BaseContainer to 3 dimensions BaseArray
    
    	iferr_scope;
    	Int32 x = 0, y = 0, z = 0;
    	x = 0;
    	while (true)
    	{
    		const Int32 x_id = bc_local_pos.GetIndexId(x++);
    		if (x_id == NOTOK)
    			break;
    		else
    		{
    			BaseContainer per_bc_local_pos = bc_local_pos.GetContainer(x_id);
    			maxon::BaseArray<maxon::BaseArray<Vector>> per_local_pos;
    			y = 0;
    			while (true)
    			{
    				const Int32 y_id = per_bc_local_pos.GetIndexId(y++);
    				if (y_id == NOTOK)
    					break;
    				else
    				{
    					BaseContainer per_per_bc_local_pos = per_bc_local_pos.GetContainer(y_id);
    					z = 0;
    					maxon::BaseArray<Vector> per_per_local_pos;
    					while (true)
    					{
    						const Int32 z_id = per_per_bc_local_pos.GetIndexId(z++);
    						if (z_id == NOTOK)
    							break;
    						else
    						{
    							per_per_local_pos.Append(per_per_bc_local_pos.GetVector(z_id)) iferr_return;
    
    						}
    
    					}
    					per_local_pos.Append(per_per_local_pos) iferr_return;
    				}
    
    			}
    			local_pos.Append(per_local_pos) iferr_return;
    		}
    
    	}
    	return maxon::OK;
    }
    
    //    local_pos, new_local_pos ----> 3 dimension BaseArray<Vector>
    //    test_bc ----> BaseContainer
    
    ToBC(test_bc, local_pos)
    
    ToArr(test_bc,new_local_pos)
    
    


  • Hi chuanzhen, thanks for reaching out us.

    With regard to the issue reported, I'm not able to hit the Critical Stop mentioned in the initial post.
    I've tested your code using

    	maxon::BaseArray<maxon::BaseArray<maxon::BaseArray<maxon::Vector>>> ba_3d, ba_3d2;
    
    	ba_3d.Resize(2) iferr_return;
    	ba_3d[0].Resize(2) iferr_return;
    	ba_3d[1].Resize(2) iferr_return;
    	ba_3d[0][0].Resize(2) iferr_return;
    	ba_3d[0][1].Resize(2) iferr_return;
    	ba_3d[1][0].Resize(2) iferr_return;
    	ba_3d[1][1].Resize(2) iferr_return;
    	ba_3d[0][0][0] = maxon::Vector(0, 0, 0);
    	ba_3d[0][0][1] = maxon::Vector(0, 0, 1);
    	ba_3d[0][1][0] = maxon::Vector(0, 1, 0);
    	ba_3d[0][1][1] = maxon::Vector(0, 1, 1);
    	ba_3d[1][0][0] = maxon::Vector(1, 0, 0);
    	ba_3d[1][0][1] = maxon::Vector(1, 0, 1);
    	ba_3d[1][1][0] = maxon::Vector(1, 1, 0);
    	ba_3d[1][1][1] = maxon::Vector(1, 1, 1);
    	
    	BaseContainer bc_3d;
    	ToBC(bc_3d, ba_3d) iferr_return;
    	ToArr(bc_3d, ba_3d2) iferr_return;
    	for (int i = 0; i < 2; i++)
    		for (int j = 0; j < 2; j++)
    			for (int k = 0; k < 2; k++)
    				DiagnosticOutput("[@][@][@]: ba_3d -> @\nba_3d2 -> @", i, j, k, ba_3d[i][j][k], ba_3d2[i][j][k]);
    	
    	return maxon::OK;
    

    and this was the output reported in the console - the lines starting with "Vector:" were from your code -

    Vector:(0.000,0.000,0.000)
    Vector:(0.000,0.000,1.000)
    Vector:(0.000,1.000,0.000)
    Vector:(0.000,1.000,1.000)
    Vector:(1.000,0.000,0.000)
    Vector:(1.000,0.000,1.000)
    Vector:(1.000,1.000,0.000)
    Vector:(1.000,1.000,1.000)
    [0][0][0]: ba_3d -> (0.000,0.000,0.000)
    ba_3d2 -> (0.000,0.000,0.000)
    [0][0][1]: ba_3d -> (0.000,0.000,1.000)
    ba_3d2 -> (0.000,0.000,1.000)
    [0][1][0]: ba_3d -> (0.000,1.000,0.000)
    ba_3d2 -> (0.000,1.000,0.000)
    [0][1][1]: ba_3d -> (0.000,1.000,1.000)
    ba_3d2 -> (0.000,1.000,1.000)
    [1][0][0]: ba_3d -> (1.000,0.000,0.000)
    ba_3d2 -> (1.000,0.000,0.000)
    [1][0][1]: ba_3d -> (1.000,0.000,1.000)
    ba_3d2 -> (1.000,0.000,1.000)
    [1][1][0]: ba_3d -> (1.000,1.000,0.000)
    ba_3d2 -> (1.000,1.000,0.000)
    [1][1][1]: ba_3d -> (1.000,1.000,1.000)
    ba_3d2 -> (1.000,1.000,1.000)
    

    Two things to mention:

    • the Critical Stop you hit is caused by the fact that the BaseContainer::GetContainer() method is attempted to run on an entry which is actually not containing a BaseContainer.
    • if you need to simply transfer the content of a BaseArray to a BaseContainer you can consider to use BaseContainer::SetMemory() as shown in in the BaseContainer Manual.
    • finally I recommend rewriting your method signatures ordering the parameters and taking advantage of the const qualifier as:
    static maxon::Result<void> ToBC(const maxon::BaseArray<maxon::BaseArray<maxon::BaseArray<Vector>>>& local_pos, BaseContainer& bc_local_pos)
    {}
    
    static maxon::Result<void> ToArr(const BaseContainer& bc_local_pos, maxon::BaseArray<maxon::BaseArray<maxon::BaseArray<Vector>>>& local_pos)
    

    Best, Riccardo



  • Hi chuanzhen, thanks for reaching out us.

    With regard to the issue reported, I'm not able to hit the Critical Stop mentioned in the initial post.
    I've tested your code using

    	maxon::BaseArray<maxon::BaseArray<maxon::BaseArray<maxon::Vector>>> ba_3d, ba_3d2;
    
    	ba_3d.Resize(2) iferr_return;
    	ba_3d[0].Resize(2) iferr_return;
    	ba_3d[1].Resize(2) iferr_return;
    	ba_3d[0][0].Resize(2) iferr_return;
    	ba_3d[0][1].Resize(2) iferr_return;
    	ba_3d[1][0].Resize(2) iferr_return;
    	ba_3d[1][1].Resize(2) iferr_return;
    	ba_3d[0][0][0] = maxon::Vector(0, 0, 0);
    	ba_3d[0][0][1] = maxon::Vector(0, 0, 1);
    	ba_3d[0][1][0] = maxon::Vector(0, 1, 0);
    	ba_3d[0][1][1] = maxon::Vector(0, 1, 1);
    	ba_3d[1][0][0] = maxon::Vector(1, 0, 0);
    	ba_3d[1][0][1] = maxon::Vector(1, 0, 1);
    	ba_3d[1][1][0] = maxon::Vector(1, 1, 0);
    	ba_3d[1][1][1] = maxon::Vector(1, 1, 1);
    	
    	BaseContainer bc_3d;
    	ToBC(bc_3d, ba_3d) iferr_return;
    	ToArr(bc_3d, ba_3d2) iferr_return;
    	for (int i = 0; i < 2; i++)
    		for (int j = 0; j < 2; j++)
    			for (int k = 0; k < 2; k++)
    				DiagnosticOutput("[@][@][@]: ba_3d -> @\nba_3d2 -> @", i, j, k, ba_3d[i][j][k], ba_3d2[i][j][k]);
    	
    	return maxon::OK;
    

    and this was the output reported in the console - the lines starting with "Vector:" were from your code -

    Vector:(0.000,0.000,0.000)
    Vector:(0.000,0.000,1.000)
    Vector:(0.000,1.000,0.000)
    Vector:(0.000,1.000,1.000)
    Vector:(1.000,0.000,0.000)
    Vector:(1.000,0.000,1.000)
    Vector:(1.000,1.000,0.000)
    Vector:(1.000,1.000,1.000)
    [0][0][0]: ba_3d -> (0.000,0.000,0.000)
    ba_3d2 -> (0.000,0.000,0.000)
    [0][0][1]: ba_3d -> (0.000,0.000,1.000)
    ba_3d2 -> (0.000,0.000,1.000)
    [0][1][0]: ba_3d -> (0.000,1.000,0.000)
    ba_3d2 -> (0.000,1.000,0.000)
    [0][1][1]: ba_3d -> (0.000,1.000,1.000)
    ba_3d2 -> (0.000,1.000,1.000)
    [1][0][0]: ba_3d -> (1.000,0.000,0.000)
    ba_3d2 -> (1.000,0.000,0.000)
    [1][0][1]: ba_3d -> (1.000,0.000,1.000)
    ba_3d2 -> (1.000,0.000,1.000)
    [1][1][0]: ba_3d -> (1.000,1.000,0.000)
    ba_3d2 -> (1.000,1.000,0.000)
    [1][1][1]: ba_3d -> (1.000,1.000,1.000)
    ba_3d2 -> (1.000,1.000,1.000)
    

    Two things to mention:

    • the Critical Stop you hit is caused by the fact that the BaseContainer::GetContainer() method is attempted to run on an entry which is actually not containing a BaseContainer.
    • if you need to simply transfer the content of a BaseArray to a BaseContainer you can consider to use BaseContainer::SetMemory() as shown in in the BaseContainer Manual.
    • finally I recommend rewriting your method signatures ordering the parameters and taking advantage of the const qualifier as:
    static maxon::Result<void> ToBC(const maxon::BaseArray<maxon::BaseArray<maxon::BaseArray<Vector>>>& local_pos, BaseContainer& bc_local_pos)
    {}
    
    static maxon::Result<void> ToArr(const BaseContainer& bc_local_pos, maxon::BaseArray<maxon::BaseArray<maxon::BaseArray<Vector>>>& local_pos)
    

    Best, Riccardo



  • Hi, @r_gigante
    Thank you for your reply. With your help, I finally traced the source of the problem. As you said, the reason for the error(Critical Stop) is that there is no Container at all. Because of a very hidden error in somewhere, I wrote the wrong data type to BaseContainer.


Log in to reply