* this example uses a call by reference, *but same result occurs with public/private vars direct updated * into the called procedure CLEAR ON ERROR ? m.k,MESSAGE() ? "***** ABRACADABRA DON'T CHANGE THE LEN: left addendum is ignored" FOR k=1 TO 103 AA=SPACE(m.k) AA = m.AA + ABRACADABRA0(@m.AA) IF LEN(m.AA)#m.k+1 ? m.k,'This line is not printed' ENDIF NEXT ? AA ? ? "***** ABRACADABRA RETURN NULL => left addendum and NULL are ignored" FOR k=1 TO 103 AA=SPACE(m.k) AA = m.AA + ABRACADABRA1(@m.AA) IF m.k<101 && copy concatenation : Result is NULL IF !ISNULL(m.AA) ? m.k,'This line is not printed' ENDIF ELSE && ON PLACE concatenation : Result is 'NEW SET'+REPLICATE('Z',m.k) IF LEN(m.AA)#7+m.k ? m.k,'This line is not printed' ENDIF ENDIF NEXT ? AA ? ? "***** ABRACADABRA CHANGE THE LEN OF THE STRING : when on place concatenation is used a error is fired" FOR k=1 TO 103 AA=SPACE(m.k) AA = m.AA + ABRACADABRA2(@m.AA) NEXT ? FOR k=1 TO 103 AA=SPACE(m.k) AA = m.AA + ABRACADABRA3(@m.AA) NEXT PROCEDURE ABRACADABRA0(ZZ) ZZ = REPLICATE('Z',LEN(ZZ)-1)+'?' RETURN '!' PROCEDURE ABRACADABRA1(ZZ) ZZ = 'NEW SET'+REPLICATE('Z',LEN(ZZ)) RETURN NULL PROCEDURE ABRACADABRA2(ZZ) ZZ = REPLICATE('Z',MAX(0,LEN(ZZ)-2)) RETURN '#' PROCEDURE ABRACADABRA3(ZZ) ZZ = REPLICATE('Z',LEN(ZZ))+'?!' RETURN ''OBSERVED BEHAVIOR:
AA=REPLICATE('A',200) * Case 1 *AA = m.AA + ABRACADABRA(@m.AA,100)+m.AA ? 'expected AA=',STUFF(m.AA,1,100,REPLICATE('Z',100))+'123456'+STUFF(m.AA,1,100,REPLICATE('Z',100)) * Case 2 *AA = m.AA + ABRACADABRA(@m.AA,250)+m.AA ? 'expected AA=',STUFF(m.AA,1,250,REPLICATE('Z',250))+'123456'+STUFF(m.AA,1,250,REPLICATE('Z',250)) PROCEDURE ABRACADABRA(ZZ,N) ZZ = REPLICATE('Z',N) RETURN '123456'