Skip to content

Commit 07e6eae

Browse files
committed
Alt/Bus: fix Lines/Loads/PCElements/PDElements when multiple elements are present
Previous elements in the result were not being preserved. `Alt_Bus_Get_PDElements` also had an off-by-one error.
1 parent c87fb07 commit 07e6eae

File tree

3 files changed

+15
-12
lines changed

3 files changed

+15
-12
lines changed

docs/changelog.md

+1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
## Version 0.14.2 (to be released)
2121

22+
- Alt/Bus: fix Lines/Loads/PCElements/PDElements when multiple elements are present
2223
- Alt/CE: Fix `Alt_CE_Get_RegisterValues` in the C header.
2324
- Alt/PDE: Check for missing solution in a few functions.
2425
- Commands/`CalcLaplacian`: Give proper error message instead of crashing or giving "access violation" messages.

src/CAPI/CAPI_Alt.pas

+7-6
Original file line numberDiff line numberDiff line change
@@ -2617,7 +2617,8 @@ procedure _Alt_Bus_Get_XElements(DSS: TDSSContext; var ResultPtr: PPointer; Resu
26172617
maxTerm: Integer = 1;
26182618
Result: PPointerArray0;
26192619
begin
2620-
Result := DSS_RecreateArray_PPointer(ResultPtr, ResultCount, ResultCount^ + 1);
2620+
// Initially allocate a buffer for 10 elements.
2621+
Result := DSS_RecreateArray_PPointer(ResultPtr, ResultCount, 10);
26212622
ResultCount[0] := 0;
26222623
SetLength(nodes, pBus.NumNodesThisBus);
26232624
for i := 1 to pBus.NumNodesThisBus do
@@ -2662,16 +2663,16 @@ procedure _Alt_Bus_Get_XElements(DSS: TDSSContext; var ResultPtr: PPointer; Resu
26622663

26632664
if pdes then
26642665
begin
2665-
elemBus := AnsiLowerCase(StripExtension(elem.GetBus(t)));
2666+
elemBus := AnsiLowerCase(StripExtension(elem.GetBus(t + 1)));
26662667
if (t = 0) then
2667-
elemBus2 := AnsiLowerCase(StripExtension(elem.GetBus(t + 1)))
2668+
elemBus2 := AnsiLowerCase(StripExtension(elem.GetBus(t + 2)))
26682669
else
2669-
elemBus2 := AnsiLowerCase(StripExtension(elem.GetBus(t - 1)));
2670+
elemBus2 := AnsiLowerCase(StripExtension(elem.GetBus(t)));
26702671

26712672
if elemBus = elemBus2 then
26722673
break;
26732674
end;
2674-
Result := DSS_RecreateArray_PPointer(ResultPtr, ResultCount, ResultCount^ + 1);
2675+
Result := DSS_RecreateArray_PPointer(ResultPtr, ResultCount, ResultCount^ + 1, true);
26752676
Result[ResultCount^ - 1] := elem;
26762677
break;
26772678
end;
@@ -2702,7 +2703,7 @@ procedure _Alt_Bus_Get_XElements(DSS: TDSSContext; var ResultPtr: PPointer; Resu
27022703
break;
27032704
end;
27042705

2705-
Result := DSS_RecreateArray_PPointer(ResultPtr, ResultCount, ResultCount^ + 1);
2706+
Result := DSS_RecreateArray_PPointer(ResultPtr, ResultCount, ResultCount^ + 1, true);
27062707
Result[ResultCount^ - 1] := elem;
27072708
break;
27082709
end;

src/CAPI/CAPI_Utils.pas

+7-6
Original file line numberDiff line numberDiff line change
@@ -89,13 +89,13 @@ procedure DSS_RecreateArray_PSingle(var res: PSingleArray0; var p: PSingle; cnt:
8989
procedure DSS_RecreateArray_PDouble(var res: PDoubleArray0; var p: PDouble; cnt: PAPISize; const incount: TAPISize; const nr: TAPISize=0; const nc: TAPISize=0);
9090
procedure DSS_RecreateArray_PInteger(var res: PIntegerArray0; var p: PInteger; cnt: PAPISize; const incount: TAPISize; const nr: TAPISize=0; const nc: TAPISize=0);
9191
procedure DSS_RecreateArray_PPAnsiChar(var res: PPAnsiCharArray0; var p: PPAnsiChar; cnt: PAPISize; const incount: TAPISize);
92-
procedure DSS_RecreateArray_PPointer(var res: PPointerArray0; var p: PPointer; cnt: PAPISize; const incount: TAPISize);
92+
procedure DSS_RecreateArray_PPointer(var res: PPointerArray0; var p: PPointer; cnt: PAPISize; const incount: TAPISize; preserve: Boolean=false);
9393
function DSS_RecreateArray_PByte(var p: PByte; cnt: PAPISize; const incount: TAPISize): PByteArray;
9494
function DSS_RecreateArray_PSingle(var p: PSingle; cnt: PAPISize; const incount: TAPISize; const nr: TAPISize=0; const nc: TAPISize=0): PSingleArray0;
9595
function DSS_RecreateArray_PDouble(var p: PDouble; cnt: PAPISize; const incount: TAPISize; const nr: TAPISize=0; const nc: TAPISize=0): PDoubleArray0;
9696
function DSS_RecreateArray_PInteger(var p: PInteger; cnt: PAPISize; const incount: TAPISize; const nr: TAPISize=0; const nc: TAPISize=0): PIntegerArray0;
9797
function DSS_RecreateArray_PPAnsiChar(var p: PPAnsiChar; cnt: PAPISize; const incount: TAPISize): PPAnsiCharArray0;
98-
function DSS_RecreateArray_PPointer(var p: PPointer; cnt: PAPISize; const incount: TAPISize): PPointerArray0;
98+
function DSS_RecreateArray_PPointer(var p: PPointer; cnt: PAPISize; const incount: TAPISize; preserve: Boolean=false): PPointerArray0;
9999
// MATLAB doesn't handle pointers that well,
100100
// this just gets a single string from the pointer of strings
101101
function DSS_Get_PAnsiChar(var p: Pointer; Index: TAPISize): PAnsiChar; CDECL;
@@ -470,7 +470,7 @@ procedure DSS_RecreateArray_PPAnsiChar(var res: PPAnsiCharArray0; var p: PPAnsiC
470470
end;
471471

472472
//------------------------------------------------------------------------------
473-
function DSS_RecreateArray_PPointer(var p: PPointer; cnt: PAPISize; const incount: TAPISize): PPointerArray0;
473+
function DSS_RecreateArray_PPointer(var p: PPointer; cnt: PAPISize; const incount: TAPISize; preserve: Boolean): PPointerArray0;
474474
begin
475475
if (cnt[1] < incount) then
476476
begin
@@ -480,12 +480,13 @@ function DSS_RecreateArray_PPointer(var p: PPointer; cnt: PAPISize; const incoun
480480
end;
481481
cnt[0] := incount;
482482
Result := PPointerArray0(p);
483-
FillByte(Result^, incount * sizeof(Pointer), 0); // needs to zero it for compatibility
483+
if not preserve then // If we have capacity, decide if we will preserve existing data
484+
FillByte(Result^, incount * sizeof(Pointer), 0);
484485
end;
485486

486-
procedure DSS_RecreateArray_PPointer(var res: PPointerArray0; var p: PPointer; cnt: PAPISize; const incount: TAPISize);
487+
procedure DSS_RecreateArray_PPointer(var res: PPointerArray0; var p: PPointer; cnt: PAPISize; const incount: TAPISize; preserve: Boolean);
487488
begin
488-
res := DSS_RecreateArray_PPointer(p, cnt, incount);
489+
res := DSS_RecreateArray_PPointer(p, cnt, incount, preserve);
489490
end;
490491

491492
//------------------------------------------------------------------------------

0 commit comments

Comments
 (0)