Как изменить массив чисел? [Дубликат]

Другой способ выполнения задания - использовать аналитическую функцию MAX () в предложении OVER PARTITION

SELECT t.*
  FROM
    (
    SELECT id
          ,rev
          ,contents
          ,MAX(rev) OVER (PARTITION BY id) as max_rev
      FROM YourTable
    ) t
  WHERE t.rev = t.max_rev 

. Другое решение OVER PARTITION, уже зарегистрированное в этом сообщении, -

SELECT t.*
  FROM
    (
    SELECT id
          ,rev
          ,contents
          ,ROW_NUMBER() OVER (PARTITION BY id ORDER BY rev DESC) rank
      FROM YourTable
    ) t
  WHERE t.rank = 1 

Этот 2 SELECT хорошо работает на Oracle 10g.

1
задан Oded 9 March 2011 в 21:45
поделиться

3 ответа

Ну, укажите начало массива с esi и end с edi, загрузите два. Элементы (?), поменяйте их, затем измените esi и edi соответственно и повторите до тех пор, пока .... подсказка: вы не нужно поменять что угодно, поскольку вы находитесь в сборке = P

1
ответ дан BlackBear 26 August 2018 в 00:02
поделиться

A pro будет использовать специальные строковые инструкции и регистры источника и адресата; но это, вероятно, будет похоже на то, что вы обманули свою домашнюю работу.

Ниже перечислены основные memonics, которые вы можете использовать для достижения своей цели:

  • MOV источник назначения MOV eax, массив загружает адрес массива в eax MOV edx, [eax] загружает значение, на которое указывает eax в edx
  • INC eax увеличивает значение в eax на один
  • OR eax, eax ( это устанавливает нулевой флаг, если eax равен нулю)
  • JZ label (перескакивает на метку, если установлен флаг нуля)

Метка устанавливается добавлением двоеточия ":" как label:

0
ответ дан Bernd Elkemann 26 August 2018 в 00:02
поделиться

Я не очень хорош в сборке, поэтому может быть лучший ответ (этот работает).

TITLE Reversing an array without using oneother array
INCLUDE Irvine32.inc

.data
    array1 DWORD 10d,20d,30d,40d,50d,60d,70d,80d,90d
.code
main PROC
        mov ESI, OFFSET array1  ;ESI now points to the first item of array1
        mov EDI, SIZEOF array1
        add EDI, OFFSET array1
        sub EDI, TYPE array1    ;EDI now points to the last item of array1

        mov ECX, LENGTHOF array1
        shr ECX, 1          ;now ecx is half the length of the array1
L1:     mov EAX, [ESI]          ;in this loop we reverse the items of the array
        mov EBX, [EDI]
        mov [EDI],EAX
        mov [ESI],EBX
        add ESI, TYPE array1
        sub EDI, TYPE array1
        LOOP L1

        mov ECX, LENGTHOF array1;here we just print the array
        mov ESI, OFFSET array1
L2:     MOV EAX, [ESI]
        call WriteInt
        call Crlf
        add ESI, TYPE array1
        LOOP L2
        exit        
main ENDP
END main
2
ответ дан captain monk 26 August 2018 в 00:02
поделиться
Другие вопросы по тегам:

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