crashing bug fix

This commit is contained in:
dickelbeck 2008-03-18 04:04:17 +00:00
parent 9e9a8fcf21
commit 6a3a1085ac
5 changed files with 65 additions and 37 deletions

View File

@ -5,6 +5,17 @@ Started 2007-June-11
Please add newer entries at the top, list the date and your name with
email address.
2008-Mar-17 UPDATE Dick Hollenbeck <dick@softplc.com>
================================================================================
+pcbnew
* Fixed a crashing bug which occured when you run the module editor, select
"Update module in current board" and then run the DRC checker after that.
* Changed to void CreateSortedPadListByXCoord( BOARD* aBoard, std::vector<D_PAD*>* aVector )
So caller can safely forget to delete the array of pad pointers and the vector's
destructor handles this automatically.
2008-Mar-14 UPDATE Dick Hollenbeck <dick@softplc.com>
================================================================================
+eeschema

View File

@ -542,20 +542,15 @@ static int SortPadsByXCoord( const void* pt_ref, const void* pt_comp )
}
/****************************************************/
LISTE_PAD* CreateSortedPadListByXCoord( BOARD* pcb )
/****************************************************/
/* Create a sorted list of pointers to pads.
* This list is sorted by X ccordinate value.
* The list must be freed by user
*/
/*****************************************************************************/
void CreateSortedPadListByXCoord( BOARD* aBoard, std::vector<D_PAD*>* aVector )
/*****************************************************************************/
{
LISTE_PAD* pad_list = (LISTE_PAD*) MyMalloc( pcb->m_NbPads * sizeof(D_PAD*) );
aVector->resize( aBoard->m_NbPads );
memcpy( pad_list, pcb->m_Pads, pcb->m_NbPads * sizeof( D_PAD*) );
qsort( pad_list, pcb->m_NbPads, sizeof( D_PAD*), SortPadsByXCoord );
return pad_list;
memcpy( &(*aVector)[0], aBoard->m_Pads, aBoard->m_NbPads * sizeof( D_PAD*) );
qsort( &(*aVector)[0], aBoard->m_NbPads, sizeof( D_PAD*), SortPadsByXCoord );
}
@ -570,14 +565,14 @@ void WinEDA_BasePcbFrame::reattribution_reference_piste( int affiche )
* We search a connection between a track segment and a pad: if found : this segment netcode is set to the pad netcode
*/
{
TRACK* pt_piste,
* pt_next;
int a_color;
char new_passe_request = 1, flag;
LISTE_PAD* pt_mem;
BOARD_ITEM* PtStruct;
int masque_layer;
wxString msg;
TRACK* pt_piste;
TRACK* pt_next;
int a_color;
char new_passe_request = 1, flag;
std::vector<D_PAD*> sortedPads;
BOARD_ITEM* PtStruct;
int masque_layer;
wxString msg;
if( m_Pcb->m_NbPads == 0 )
return;
@ -595,7 +590,7 @@ void WinEDA_BasePcbFrame::reattribution_reference_piste( int affiche )
/**************************************************************/
/* Pass 1: search the connections between track ends and pads */
/**************************************************************/
pt_mem = CreateSortedPadListByXCoord( m_Pcb );
CreateSortedPadListByXCoord( m_Pcb, &sortedPads );
if( affiche )
Affiche_1_Parametre( this, -1, wxEmptyString, wxT( "Conn Pads" ), a_color );
@ -619,7 +614,7 @@ void WinEDA_BasePcbFrame::reattribution_reference_piste( int affiche )
/* Search for a pad on the segment starting point */
pt_piste->start = SuperFast_Locate_Pad_Connecte( m_Pcb,
pt_mem,
&sortedPads[0],
pt_piste->m_Start.x,
pt_piste->m_Start.y,
masque_layer );
@ -631,7 +626,7 @@ void WinEDA_BasePcbFrame::reattribution_reference_piste( int affiche )
/* Search for a pad on the segment ending point */
pt_piste->end = SuperFast_Locate_Pad_Connecte( m_Pcb,
pt_mem,
&sortedPads[0],
pt_piste->m_End.x,
pt_piste->m_End.y,
masque_layer );
@ -643,7 +638,6 @@ void WinEDA_BasePcbFrame::reattribution_reference_piste( int affiche )
}
}
MyFree( pt_mem );
/*****************************************************/
/* Pass 2: search the connections between track ends */

View File

@ -635,6 +635,11 @@ void DrcDialog::OnStartdrcClick( wxCommandEvent& event )
wxBeginBusyCursor();
// running the module editor and selecting "Update module in current board"
// causes the list to become obsolete because of the new pads from the
// revised module.
m_Parent->build_liste_pads();
// run all the tests, with no UI at this time.
m_tester->RunTests();

View File

@ -197,7 +197,7 @@ void DRC::RunTests()
testTracks();
// test zone clearances to other zones, pads, tracks, and vias
testZones(m_doZonesTest);
testZones( m_doZonesTest );
// find and gather unconnected pads.
if( m_doUnconnectedTest )
@ -251,33 +251,35 @@ void DRC::testTracks()
void DRC::testPad2Pad()
{
LISTE_PAD* pad_list_start = CreateSortedPadListByXCoord( m_pcb );
LISTE_PAD* pad_list_limit = &pad_list_start[m_pcb->m_NbPads];
LISTE_PAD* ppad;
std::vector<D_PAD*> sortedPads;
CreateSortedPadListByXCoord( m_pcb, &sortedPads );
// find the max size of the pads (used to stop the test)
int max_size = 0;
for( ppad = pad_list_start; ppad<pad_list_limit; ppad++ )
for( unsigned i=0; i<sortedPads.size(); ++i )
{
D_PAD* pad = *ppad;
D_PAD* pad = sortedPads[i];
if( pad->m_Rayon > max_size )
max_size = pad->m_Rayon;
}
// Test the pads
for( ppad = pad_list_start; ppad<pad_list_limit; ppad++ )
{
D_PAD* pad = *ppad;
D_PAD** listEnd = &sortedPads[ sortedPads.size() ];
if( !doPadToPadsDrc( pad, ppad, pad_list_limit, max_size ) )
for( unsigned i=0; i<sortedPads.size(); ++i )
{
D_PAD* pad = sortedPads[i];
if( !doPadToPadsDrc( pad, &sortedPads[i], listEnd, max_size ) )
{
wxASSERT( m_currentMarker );
m_pcb->Add( m_currentMarker );
m_currentMarker = 0;
}
}
free( pad_list_start );
}

View File

@ -5,10 +5,26 @@
#ifndef PROTO_H
#define PROTO_H
#include <vector>
/***************/
/* PAD_CONNECT.CPP */
/***************/
LISTE_PAD* CreateSortedPadListByXCoord( BOARD* pcb );
class D_PAD;
/**
* Function CreateSortedPadListByXCoord
* first empties then fills the vector with all pads and sorts them by
* increasing x coordinate. The vector only holds pointers to the pads and
* those pointers are only references to pads which are owned by the BOARD
* through other links.
* @param aBoard Which board to gather pads from.
* @param aVector Where to put the pad pointers.
*/
void CreateSortedPadListByXCoord( BOARD* aBoard, std::vector<D_PAD*>* aVector );
/* Create a sorted list of pointers to pads.
* This list is sorted by X ccordinate value.