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