PRO SyncArgs, A0,A1,A2,A3,A4,A5,A6,A7,A8,A9 @compile_opt.pro ; On error, return to caller nP = n_params() CASE nP OF 0 : message, 'No arguments specified 1 : RETURN ELSE: IF nP GT 10 then message, 'Too many arguments specified ENDCASE ; Get number of dimensions (sE), types (sT) and ; total # elements (sN) of all arguments A = size(A0) sE = A[0] sT = A[A[0]+1] sN = A[A[0]+2] FOR i=1,nP-1 DO BEGIN R = execute('A = size(A'+strcompress(i,/rem)+')') sE = [sE,A[0]] sT = [sT,A[A[0]+1]] sN = [sN,A[A[0]+2]] ENDFOR IF max(sT) EQ 0 THEN RETURN ; None of the arguments exist sA = where(sT EQ 0) ; Create non-existing arguments as byte scalars IF sA[0] NE -1 THEN $ FOR i=0,n_elements(sA)-1 DO $ R = execute('A'+strcompress(sA[i],/rem)+' = 0B') sT = sT > 1 sN = sN > 1 ; Update types and # elements N = max(sE) ; Largest # dimensions IF N EQ 0 THEN RETURN ; All arguments are scalars sA = where(sE EQ 0) ; Change scalars to arrays IF sA[0] NE -1 THEN $ FOR i=0,n_elements(sA)-1 DO $ R = execute('A'+strcompress(sA[i],/rem)+' = [A'+strcompress(sA[i],/rem)+']') N = max(sN) ; # elements in largest array sA = where(sN EQ N) ; arguments with max # elements ; Find target array structure R = execute('A = size(A'+strcompress(sA[0],/rem)+')') sE = A[0] s = A[1:sE] ; # dimensions and structure target array FOR i=1,n_elements(sA)-1 DO BEGIN ; Reform args with same # elements as target R = execute('A = size(A'+strcompress(sA[i],/rem)+')') IF A[0] NE sE THEN $ ; Different # dimensions sync = 1 $ ELSE IF (where(A[1:A[0]] NE s))[0] NE -1 THEN $ sync = 1 $ ; Same # dimensions, but different array structure ELSE $ sync = 0 ; Reform to target type IF sync THEN BEGIN message, /info, who_am_i(/caller)+', WARNING: varying array structures detected' R = execute('A'+strcompress(sA[i],/rem)+' = reform(A'+strcompress(sA[i],/rem)+',s)') ENDIF ENDFOR sA = where(sN NE N) ; Source args needing padding IF sA[0] EQ -1 THEN RETURN ; All arrays have N elements FOR i=0,n_elements(sA)-1 DO BEGIN sync = (N mod sN[sA[i]]) EQ 0 ; # elements in source must be a factor of # elements in target IF sync THEN BEGIN ; Get size of source arg R = execute('A = size(A'+strcompress(sA[i],/rem)+')') sync = A[0] LE sE ; # dims source must be <= # dims target IF sync AND A[0] LT sE THEN sync = A[A[0]+2] EQ 1 OR (where(A[1:A[0]] NE s[0:A[0]-1]))[0] eq -1 ENDIF IF sync THEN BEGIN R = execute('SyncArgsSub, A'+strcompress(sA[i],/rem)+', N, s') ;CASE sA[i] OF ;0: SyncArgsSub, A0, N, s ;1: SyncArgsSub, A1, N, s ;2: SyncArgsSub, A2, N, s ;3: SyncArgsSub, A3, N, s ;4: SyncArgsSub, A4, N, s ;5: SyncArgsSub, A5, N, s ;6: SyncArgsSub, A6, N, s ;7: SyncArgsSub, A7, N, s ;8: SyncArgsSub, A8, N, s ;9: SyncArgsSub, A9, N, s ;ENDCASE ENDIF ELSE BEGIN R = 'help, A0' FOR j=1,nP-1 DO R += ',A'+strcompress(j,/rem) R = execute(R) message, who_am_i(/caller)+", Sorry, don't know how to sync array #"+strcompress(sA[i]) ENDELSE ENDFOR RETURN & END