Пользовательский ввод выдает NegativeArraySizeException; работает тот же номер в жестком коде (ОБА ПОЗИТИВНО)

Вот самый быстрый способ решить проблему в Windows.

Рядом с исполняемым файлом создайте файл qt.conf (если он еще не существует) и добавьте следующее:

[Platforms]
WindowsArguments = dpiawareness=0

При увеличении масштаба окно будет размыто. Большим преимуществом этого решения является то, что Windows делает масштабирование, а не Qt. Поэтому наличие артефактов минимизировано. Кроме того, это может относиться к уже распределенному приложению, так как оно не требует перестройки.

Конечно, это не самый приятный результат, но самый быстрый способ избавить вас от неприятностей в краткосрочной перспективе, позволяя вы разрабатываете «настоящую» версию с поддержкой DPI без давления.

0
задан Andrew 28 March 2019 в 06:01
поделиться

2 ответа

Я попытался запустить твой код. Это бежало отлично. Вот вывод на консоль.

How many numbers would you like to generate? 
(More Numbers = Longer Sort): 17

[303, 394, 315, 436, 196, 212, 629, 139, 666, 519, 4, 182, 36, 108, 129, 490, 174]
[4, 36, 108, 129, 139, 174, 182, 196, 212, 303, 315, 394, 436, 490, 519, 629, 666]

Нет исключений:)

0
ответ дан akmkbkk 28 March 2019 в 06:01
поделиться

Это не имеет ничего общего с получением информации с консоли. Вместо этого в вашем коде есть ошибка.

int mid = left_start + curr_size - 1;
int right_end = Math.min(left_start + 2*curr_size - 1, n-1);

Рассмотрим выше, чтобы линии. Всякий раз, когда left_start + 2*curr_size - 1 достаточно больше, чем n-1, значение right_end становится меньше, чем mid.

В этом случае значение n2 в методе merge () становится отрицательным. Отсюда и ошибка. Как только вы исправите это, вы решите проблему.

ОБНОВЛЕНИЕ Я добавил несколько if условий. Вот рабочий код.

public static void mergeSort(int arr[])
{
    int n = arr.length;
    // For current size of subarrays to
    // be merged curr_size varies from
    // 1 to n/2
    int curr_size;

    // For picking starting index of
    // left subarray to be merged
    int left_start;


    // Merge subarrays in bottom up
    // manner. First merge subarrays
    // of size 1 to create sorted
    // subarrays of size 2, then merge
    // subarrays of size 2 to create
    // sorted subarrays of size 4, and
    // so on.
    for (curr_size = 1; curr_size <= n-1;
                curr_size = 2*curr_size)
    {

        // Pick starting point of different
        // subarrays of current size
        for (left_start = 0; left_start < n-1;
                    left_start += 2*curr_size)
        {
            // Find ending point of left
            // subarray. mid+1 is starting
            // point of right
            int mid = left_start + curr_size - 1;

            int right_end = Math.min(left_start
                        + 2*curr_size - 1, n-1);

            if(right_end<mid)
                right_end=mid;

            // Merge Subarrays arr[left_start...mid]
            // & arr[mid+1...right_end]
            merge(arr, left_start, mid, right_end);
        }
    }
}

public static void merge(int arr[], int l, int m, int r)
{
    int i, j, k;
    int n1 = m - l + 1;
    int n2 = r - m;

    /* create temp arrays */
    int L[] = new int[n1];
    int R[] = new int[n2];

    /* Copy data to temp arrays L[]
    and R[] */
    for (i = 0; i < n1; i++)
        if(l+i<arr.length)
        L[i] = arr[l + i];
    for (j = 0; j < n2; j++)
        if(l+j<arr.length)
        R[j] = arr[m + 1+ j];

    /* Merge the temp arrays back into
    arr[l..r]*/
    i = 0;
    j = 0;
    k = l;
    while (i < n1 && j < n2)
    {
        if (L[i] <= R[j])
        {
            arr[k] = L[i];
            i++;
        }
        else
        {
            arr[k] = R[j];
            j++;
        }
        k++;
    }

    /* Copy the remaining elements of
    L[], if there are any */
    while (i < n1 && i<n1 && k<arr.length)
    {
        arr[k] = L[i];
        i++;
        k++;
    }

    /* Copy the remaining elements of
    R[], if there are any */
    while (j < n2)
    {
        arr[k] = R[j];
        j++;
        k++;
    }
}

Я чувствую, что вы можете упростить код, хотя.

0
ответ дан raviiii1 28 March 2019 в 06:01
поделиться
Другие вопросы по тегам:

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