- kevin kevin rowe
- PowerBuilder
- Friday, 24 February 2023 04:53 PM UTC
i have a code module that was working fine,
I have had to add a section of code to it to place a database field of (up to) 1000 characters in 4 dot matrix report fields of flat 70 characters.
To do this I created a subroutine that would read the field in from the database, chunk it into words, then pack the words into the available space in the print fields and exit if it ran out of fields, or text to pack in.
This turned into a nightmare of random IDE crashes and random .exe crashes when the code is executed.
IDE is PB 2017 R3 Build 1915.
I have looked into debug logs and the fault is always c0000005 in PBSH170.DLL offset 000C34C0 in the IDE and if the compiled .exe is run, then it is offset 00060E95.
Nothing I have tried has resolved this issue, as it is random if it fails in the IDE, and when it does, it takes the IDE down. It always fails in the .exe in some way, but usually an immediate app crash.
Can anyone see an obvious cause for this in the code?
If I debug step this code in the IDE it works fine. If I run it, it randomly crashes. Compiled exes invariably crash.
// pack words from memo into each item of printfields up to ailength until no room left or out of words
string lsPrintFields[4]
int liMaxRows = 4
string lsWords[500]
int liMaxword = 500
string ls_parm = "", c
int liPrintLineLen = 0
int liLineCount = 1
int i = 0, li_idx = 0
int liPrintLength = 70
string ls_memo
int limemolen
//ids_1 is a object level datastore the is packed in the calling routine from the data for the report.
ls_memo = ids_1.getitemstring(1, "fdcompinvmemo")
limemolen = Len (ls_memo)
for i = 1 to limemolen
c = Mid (ls_memo, i, 1)
// match whitespace chars
choose case c
case "~t", "~r", "~n", " "
if (li_idx >= liMaxword) then
exit
else
if ls_parm <> "" then
li_idx ++
lsWords[li_idx] = ls_parm
ls_parm = ""
end if
end if
case "&"
ls_parm += '&'
ls_parm += c
case "'", "~""
ls_parm += '~~'
ls_parm += c
case else
ls_parm += c
end choose
next
if (li_idx < liMaxword) then
if ls_parm <> "" then
li_idx ++
lsWords[li_idx] = ls_parm
end if
end if
lsprintfields[liLineCount] = ""
for i = 1 to limaxword
if lswords[i] = "" or isnull(lswords[i]) then
exit
end if
// if there is enough room left add word/block
if (liPrintLineLen + len(lsWords[i]) + 1) < liPrintLength then
if len(lsprintfields[liLineCount]) > 0 then
lsprintfields[liLineCount] = lsprintfields[liLineCount] + " "
end if
lsprintfields[liLineCount] = lsprintfields[liLineCount] + lsWords[i]
liPrintLineLen = len(lsprintfields[liLineCount])
else
//go to next line unless we're out of space
if (liLineCount >= liMaxRows) then
exit
else
liLineCount++
lsprintfields[liLineCount] = lsWords[i] + " "
liPrintLineLen = len(lsprintfields[liLineCount])
end if
end if
next
//copy lines into memo fields if not blank
// report datawindow contains text fields t_memo1, ... t_memo4
limaxrows = 0
for i = 1 to 4
if lsprintfields[i] <> "" then
limaxrows++
ids_1.Modify ("t_memo" + string(i)+ ".Text='"+ lsprintfields[i] + "'")
end if
next
return limaxrows
Find Questions by Tag
Helpful?
If a reply or comment is helpful for you, please don’t hesitate to click the Helpful button. This action is further confirmation of their invaluable contribution to the Appeon Community.