Как обрабатывать пустые zip-файлы с помощью C # ZipFile

Ваша адресация пикселей кажется неправильной.

width - [ваша переменная] для ширины экрана, которая является 64. Но в вашем примере битмап имеет ширину 512 и высоту 256 [которые являются значениями по умолчанию в mars].

Итак, вам нужно либо изменить геометрию отображения в mars или установите для параметра width значение. То же самое для высоты.

Примечание: mars выполняет not сохранение установленных вами значений, поэтому, если вы хотите использовать геометрию, отличную от значения по умолчанию , вам нужно будет установить каждое время. Итак, возможно, простой способ - использовать значения по умолчанию mars.


UPDATE:

Я изменил значения, чтобы они совпадали с ошибками по умолчанию, но все же. Я думаю, может быть, мне нужно что-то изменить в коде setpixel. N также добавить счетчик где-нибудь

blockquote>

. Боюсь, что появилось множество ошибок. В основном, ваши функции сделали не сохранение / восстановление $ra в стеке и сделать jr $ra в конце.

Также мне показалось, что ваш октант код отражения был намного сложнее [и, следовательно, подвержен ошибкам], чем это необходимо.

Я создал две версии. Первый - это ваш оригинальный код с аннотациями о [некоторых] ошибках. Второй - полная переделка, которая работает.


Вот аннотированная версия [пожалуйста, помилуй о бесплатной стильной очистке]:

    .data
    # midpoint circle algorithm variables

radius:     .word       10
err:        .word       -10
colour:     .word       0x00FFFFFF
    # yvalue = radius

bmp:        .space      0x80000
dpy_width:  .word       512
dpy_height: .word       256
dpy_base:   .word       0x10040000

    .text

    lw      $a0,radius              # x
    li      $a1,0                   # y

# BUG: this bge has no meaning since, either way, it goes to "loading"
# probably should be "end_loading"
drawn:
    bge     $a0,$a1,loading

# BUG: this falls through into the plot8points function
loading:
    lw      $t1,err
    jal     plot8points

    add     $t1,$t1,$a1             # err += y
    addi    $a1,$a1,1               # y++
    add     $t1,$t1,$a1             # err + = y

    bltz    $a0,drawn

    sub     $t1,$t1,$a0             # err -= x
    addi    $a0,$a0,-1              # x--
    sub     $t1,$t1,$a0             # err-= x

# BUG: this is a function but has no return and does _not_ save $ra
plot8points:
    lw      $t3,radius              # xcenter
    li      $t4,0                   # ycenter

    move    $t7,$a0                 # x
    move    $t8,$a1                 # y

    jal     plot4points
# BUG: we're in a function but this jumps to a label outside the function
    blt     $a0,$a1,end_loading

    jal     plot4points
    jal     plot4morepoints

    # jal exit

end_loading:
    jr      $ra

# BUG: this is a function but has no return and does _not_ save $ra
plot4points:
    add     $a0,$t7,$t3
    add     $a1,$t8,$t4
    jal     setpixel

    sub     $a0,$t3,$t7
    add     $a1,$t4,$t8
    jal     setpixel

    add     $a0,$t3,$t7
    sub     $a1,$t4,$t8
    jal     setpixel

    sub     $a0,$t3,$7
    sub     $a1,$t4,$t8
    jal     setpixel

# BUG: this is a function but has no return and does _not_ save $ra
plot4morepoints:
    add     $a0,$t3,$t8
    add     $a1,$t4,$t7
    jal     setpixel

    sub     $a0,$t3,$t8
    add     $a1,$t4,$t7
    jal     setpixel

    add     $a0,$t3,$t8
    sub     $a1,$t4,$t7
    jal     setpixel

    sub     $a0,$t3,$t8
    sub     $a1,$t4,$t7
    jal     setpixel

# setpixel -- draw pixel on display
#
# arguments:
#   a0 -- X coord
#   a1 -- Y coord
setpixel:
    lw      $t0,colour              # color
    lw      $s4,dpy_width           # display width
    lw      $s2,dpy_base            # display base address

    mul     $t6,$a1,$s4             # get y * width
    add     $t6,$t6,$a0             # get (y * width) + x
    sll     $t6,$t6,2               # convert to offset
    add     $t6,$t6,$s2             # add in base address

    sw      $t0,($t6)               # store pixel
    jr      $ra

    # exit:
    li      $v0,10
    syscall

Вот очищенная , отредактированная рабочая версия.

Когда я сделал переделку, я попытался использовать алгоритм со страницы wikipedia для алгоритма круга, но либо их версия сломана, либо I сломал ее , Он не создает круг, а образец алмаза / шестиугольника. Итак, я оставил его в качестве опции.

Итак, я добавил версию Джону Кеннеди [Santa Monica College] [с сайта OSU]. Он работает.

Я также добавил некоторые опции для автоматического отображения на дисплей и автоматического вычисления центроида. Проверьте значения дисплея, так как он предполагает 512x256 и «статический» базовый адрес дисплея.

Я также добавил некоторые опции, позволяющие рисовать концентрические круги, только для развлечения.

# breshenham circle algorithm

    .data
radius:     .word       10
center_x:   .word       0
center_y:   .word       0
dpy_color:  .word       0x00FFFFFF
    # midpoint circle algorithm variables

bmp:        .space      0x80000
dpy_width:  .word       512
dpy_height: .word       256
dpy_base:   .word       0x10010000
    .eqv    dpy_margin      8

ask_diamond:    .word   0
ask_radmin: .word       0
ask_radinc: .word       16

msg_nl:     .asciiz     "\n"
msg_comma:  .asciiz     ","

    .text

    .globl  main

main:
    .eqv    dflg            $fp
    li      dflg,0                  # clear debug flag

    # prompt user for ask_diamond value
    la      $a0,_S_000              # prompt user
    li      $v0,4                   # print string
    syscall
    li      $v0,5
    syscall
    sw      $v0,ask_diamond

    # prompt user for ask_radmin value
    la      $a0,_S_001              # prompt user
    li      $v0,4                   # print string
    syscall
    li      $v0,5
    syscall
    sw      $v0,ask_radmin

    lw      $t0,ask_radmin
    beqz    $t0,main_skipinc

    # prompt user for ask_radinc value
    la      $a0,_S_002              # prompt user
    li      $v0,4                   # print string
    syscall
    li      $v0,5
    syscall
    sw      $v0,ask_radinc

main_skipinc:
    lw      $t0,ask_radmin

    # compute circle center from display geometry
    lw      $s6,dpy_width
    srl     $s6,$s6,1
    sw      $s6,center_x

    lw      $s5,dpy_height
    srl     $s5,$s5,1
    sw      $s5,center_y

    # set radius to min((width / 2) - 16,(height / 2) - 16)
    move    $s0,$s6
    blt     $s6,$s5,main_gotradius
    move    $s0,$s5

main_gotradius:
    subi    $s0,$s0,dpy_margin      # give us some margin
    sw      $s0,radius

main_loop:
    # output circle
    jal     kdraw
    jal     radbump

    # output diamond/hexagon
    lw      $t0,ask_diamond         # is it enabled?
    beqz    $t0,main_next           # if no, skip
    jal     wdraw
    jal     radbump

main_next:
    bnez    $v0,main_loop           # done with concentric circles? if no, loop

main_done:
    li      $v0,10
    syscall

# wdraw -- draw circle (wikipedia)
#
# NOTES:
#   (1) this is wikipedia's algorithm for a circle, but it is more like a
#       diamond or polygon
#   (2) https://en.wikipedia.org/wiki/Midpoint_circle_algorithm
#   (2) either it's "broken" or _I_ broke it
#
# registers:
#   s0 -- x
#   s1 -- y
#   s2 -- decision/error term (err)
#
# * void
# * DrawCircle(int x0,int y0,int radius)
# * {
# *     int x = radius;
# *     int y = 0;
# *
# *     // Decision criterion divided by 2 evaluated at x=r, y=0
# *     int decisionOver2 = 1 - x;
# *
# *     while (y <= x) {
# *         DrawPixel(x + x0,y + y0);       // Octant 1
# *         DrawPixel(y + x0,x + y0);       // Octant 2
# *         DrawPixel(-x + x0,y + y0);      // Octant 4
# *         DrawPixel(-y + x0,x + y0);      // Octant 3
# *         DrawPixel(-x + x0,-y + y0);     // Octant 5
# *         DrawPixel(-y + x0,-x + y0);     // Octant 6
# *         DrawPixel(x + x0,-y + y0);      // Octant 7
# *         DrawPixel(y + x0,-x + y0);      // Octant 8
# *
# *         y++;
# *
# *         // Change in decision criterion for y -> y+1
# *         if (decisionOver2 <= 0) {
# *             decisionOver2 += 2 * y + 1;
# *         }
# *
# *         // Change for y -> y+1, x -> x-1
# *         else {
# *             x--;
# *             decisionOver2 += 2 * (y - x) + 1;
# *         }
# *     }
# * }
wdraw:
    subi    $sp,$sp,4
    sw      $ra,0($sp)

    lw      $s0,radius              # x = radius
    li      $s1,0                   # y = 0

    # get initial decision (err = 1 - x)
    li      $s2,1                   # err = 1
    sub     $s2,$s2,$s0             # err = 1 - x

wdraw_loop:
    bgt     $s1,$s0,wdraw_done      # y <= x? if no, fly (we're done)

    # draw pixels in all 8 octants
    jal     draw8

    addi    $s1,$s1,1               # y += 1

    bgtz    $s2,wdraw_case2         # err <= 0? if no, fly

# change in decision criterion for y -> y+1
#   err += (2 * y) + 1
wdraw_case1:
    sll     $t0,$s2,1               # get 2 * y
    addu    $s2,$s2,$t0             # err += 2 * y (NOTE: this can overflow)
    add     $s2,$s2,1               # err += 1
    j       wdraw_loop

# change for y -> y+1, x -> x-1
#   x -= 1
#   err += (2 * (y - x)) + 1
wdraw_case2:
    subi    $s0,$s0,1               # x -= 1
    sub     $t0,$s1,$s0             # get y - x
    sll     $t0,$t0,1               # get 2 * (y - x)
    addi    $t0,$t0,1               # get 2 * (y - x) + 1
    add     $s2,$s2,$t0             # add it to err
    j       wdraw_loop

wdraw_done:
    lw      $ra,0($sp)
    addi    $sp,$sp,4
    jr      $ra

# kdraw -- draw circle (john kennedy)
#
# NOTES:
# (1) this is John Kennedy's algorithm from:
#     http://web.engr.oregonstate.edu/~sllu/bcircle.pdf
#
# registers:
#   s0 -- x
#   s1 -- y
#   s2 -- raderr
#   s3 -- xchg
#   s4 -- ychg
#
# * void
# * PlotCircle(int CX, int CY, int r)
# * {
# *     int x;
# *     int y;
# *     int xchg;
# *     int ychg;
# *     int raderr;
# *
# *     x = r;
# *     y = 0;
# *
# *     xchg = 1 - (2 * r);
# *     ychg = 1;
# *
# *     raderr = 0;
# *
# *     while (x >= y) {
# *         draw8(x,y);
# *         y += 1;
# *
# *         raderr += ychg;
# *         ychg += 2;
# *
# *         if (((2 * raderr) + xchg) > 0) {
# *             x -= 1;
# *             raderr += xchg;
# *             xchg += 2;
# *         }
# *     }
# * }
kdraw:
    subi    $sp,$sp,4
    sw      $ra,0($sp)

    lw      $s0,radius              # x = radius
    li      $s1,0                   # y = 0

    # initialize: xchg = 1 - (2 * r)
    li      $s3,1                   # xchg = 1
    sll     $t0,$s0,1               # get 2 * r
    sub     $s3,$s3,$t0             # xchg -= (2 * r)

    li      $s4,1                   # ychg = 1
    li      $s2,0                   # raderr = 0

kdraw_loop:
    blt     $s0,$s1,kdraw_done      # x >= y? if no, fly (we're done)

    # draw pixels in all 8 octants
    jal     draw8

    addi    $s1,$s1,1               # y += 1
    add     $s2,$s2,$s4             # raderr += ychg
    addi    $s4,$s4,2               # ychg += 2

    sll     $t0,$s2,1               # get 2 * raderr
    add     $t0,$t0,$s3             # get (2 * raderr) + xchg
    blez    $s2,kdraw_loop          # >0? if no, loop

    subi    $s0,$s0,1               # x -= 1
    add     $s2,$s2,$s3             # raderr += xchg
    addi    $s3,$s3,2               # xchg += 2
    j       kdraw_loop

kdraw_done:
    lw      $ra,0($sp)
    addi    $sp,$sp,4
    jr      $ra

# draw8 -- draw single point in all 8 octants
#
# arguments:
#   s0 -- X coord
#   s1 -- Y coord
#
# registers:
#   t8 -- center_x
#   t9 -- center_y
draw8:
    subi    $sp,$sp,4
    sw      $ra,0($sp)

    #+drawctr $t8,$t9
    lw      $t8,center_x            #+
    lw      $t9,center_y            #+
    #+

    # draw [+x,+y]
    add     $a0,$t8,$s0
    add     $a1,$t9,$s1
    jal     setpixel

    # draw [+y,+x]
    add     $a0,$t8,$s1
    add     $a1,$t9,$s0
    jal     setpixel

    # draw [-x,+y]
    sub     $a0,$t8,$s0
    add     $a1,$t9,$s1
    jal     setpixel

    # draw [-y,+x]
    add     $a0,$t8,$s1
    sub     $a1,$t9,$s0
    jal     setpixel

    # draw [-x,-y]
    sub     $a0,$t8,$s0
    sub     $a1,$t9,$s1
    jal     setpixel

    # draw [-y,-x]
    sub     $a0,$t8,$s1
    sub     $a1,$t9,$s0
    jal     setpixel

    # draw [+x,-y]
    add     $a0,$t8,$s0
    sub     $a1,$t9,$s1
    jal     setpixel

    # draw [+y,-x]
    sub     $a0,$t8,$s1
    add     $a1,$t9,$s0
    jal     setpixel

    lw      $ra,0($sp)
    addi    $sp,$sp,4
    jr      $ra

# setpixel -- draw pixel on display
#
# arguments:
#   a0 -- X coord
#   a1 -- Y coord
#
# clobbers:
#   v0 -- bitmap offset/index
#   v1 -- bitmap address
# trace:
#   v0,a0
setpixel:
    bnez    dflg,setpixel_show      # debug output? if yes, fly

setpixel_go:
    lw      $v0,dpy_width           # off = display width

    mul     $v0,$a1,$v0             # off = y * width
    add     $v0,$v0,$a0             # off += x
    sll     $v0,$v0,2               # convert to offset

    lw      $v1,dpy_base            # ptr = display base address
    add     $v1,$v1,$v0             # ptr += off

    lw      $v0,dpy_color           # color
    sw      $v0,($v1)               # store pixel
    jr      $ra

setpixel_show:
    move    $a2,$a0
    move    $a3,$a1

    # print x
    li      $v0,1
    move    $a0,$a2
    syscall

    # print comma
    li      $v0,4
    la      $a0,msg_comma
    syscall

    # print y
    li      $v0,1
    move    $a0,$a3
    syscall

    # print newline
    li      $v0,4
    la      $a0,msg_nl
    syscall

    move    $a0,$a2
    move    $a1,$a3
    j       setpixel_go

# radbump -- bump down radius
#
# RETURNS:
#   v0 -- 1=more to do, 0=done
#
# registers:
#   t0 -- radius value
radbump:
    lw      $t0,radius
    lw      $t1,ask_radinc
    sub     $t0,$t0,$t1

    lw      $v0,ask_radmin          # do multiple rings?
    beqz    $v0,radbump_store       # if no, fly

    slt     $v0,$v0,$t0             # radius < ask_radmin?

radbump_store:
    beqz    $t0,radbump_safe
    sw      $t0,radius

radbump_safe:
    jr      $ra

    #+dfnc
    #+

    .data
_S_000:     .asciiz     "output diamond pattern? "
_S_001:     .asciiz     "minimum radius (0=single) > "
_S_002:     .asciiz     "radius decrement > "
_S_003:     .asciiz     "dpy_width"
_S_004:     .asciiz     "dpy_height"
_S_005:     .asciiz     "radius"

Недавно я получил ответ MIPS для структурированного / связанного списка. Я также добавил много предложений о том, как хорошо писать код MIPS. Это может помочь вам понять, что я здесь сделал. См .: Связанный с MIPS список

0
задан Erik Dahlen 15 January 2019 в 14:53
поделиться

1 ответ

Вы можете попробовать это:

if (!string.IsNullOrEmpty(dirName) && Directory.Exists(dirName))
{
    try
    {
        System.IO.Compression.ZipFile.ExtractToDirectory(fileName, dirName);
    }
    catch (ArgumentException ex)
    {
        // file is empty (as we already checked for directory)
        File.Delete(fileName);
    }


    // OR

    if (new FileInfo(fileName).Length == 0)
    {
        // empty
        File.Delete(fileName);
    }
    else
    {
        System.IO.Compression.ZipFile.ExtractToDirectory(fileName, dirName);
    }
}

Как проверить, пуст ли файл

0
ответ дан Simonca 15 January 2019 в 14:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: