Используйте сопоставимый интерфейс для сортировки общего связанного списка

IIRC, выравнивание стека - это когда переменные помещаются в стек, «выровненный» с определенным количеством байтов. Поэтому, если вы используете выравнивание по 16 бит, каждая переменная в стеке начнет с байта, который состоит из двух байтов из текущего указателя стека внутри функции.

Это означает, что если вы используете переменную, которая равна & lt; 2 байта, например char (1 байт), между ним и следующей переменной будет 8 бит неиспользуемого «дополнения». Это позволяет определенные оптимизации с допущениями на основе местоположений переменных.

При вызове функций один метод передачи аргументов следующей функции состоит в том, чтобы поместить их в стек (в отличие от их размещения непосредственно в регистры). Независимо от того, используется ли здесь выравнивание, важно, поскольку вызывающая функция помещает переменные в стек, чтобы считаться вызывающей функцией с помощью смещений. Если вызывающая функция выравнивает переменные, и вызываемая функция ожидает, что они будут не выровнены, тогда вызываемая функция не сможет их найти.

Кажется, что скомпилированный код msvc не согласен выравнивание переменных. Попробуйте выполнить компиляцию при выключенных оптимизациях.

-3
задан Amit Bera 19 March 2019 в 09:07
поделиться

2 ответа

Вы пытаетесь вычесть ссылки типа Object.

Ваш тип элемента должен реализовать Comparable:

public class ListElement<T extends Comparable<T>> implements Comparable<ListElement<T>> {
    public T wert;
    public ListElement<T> nachFolger;

    public ListElement(T wert, ListElement<T> nachFolger) {
        this.wert=wert;
        this.nachFolger=nachFolger;
    }

    @Override
    public int compareTo(ListElement<T> a) {
        return wert.compareTo(a.wert);
    }
}
0
ответ дан Eran 19 March 2019 в 09:07
поделиться

В Java операция вычитания применяется только к числовым литералам (и автоматически распакованным числовым объектам). Когда вы пытаетесь использовать его для нечислового типа Object, вы получаете ошибку. Если вы хотите сравнить два wert значения, вы можете сделать следующее:

  • Измените тип на number с Object, чтобы вы могли сравнивать, например: [1112 ]

    public Object wert;
    
    @Override
    public int compareTo(ListElement a) {
        return wert.compareTo(a.wert);
    }
    
  • Измените тип на Comparable, чтобы вы могли использовать compareTo для двух wert объектов

    public Comparable wert;
    
    @Override
    public int compareTo(ListElement a) {
        return wert.compareTo(a.wert);
    }
    
0
ответ дан Darshan Mehta 19 March 2019 в 09:07
поделиться
Другие вопросы по тегам:

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