Как я изменяю местоположения исходных файлов в файле символов (pdb)

Это интересная проблема, потому что она кажется трудной, но тщательная мысль дает элегантное, исправленное решение.

Как уже отмечалось, его можно решить грубо -force в O (N ^ 2) времени. Для каждой записи в массиве (или списке), итерации по всем предыдущим записям, чтобы получить min или max в зависимости от того, найти ли проблему наибольший коэффициент усиления или потери.

Вот как думать о решении в O (N): каждая запись представляет собой новый возможный максимум (или мин). Затем все, что нам нужно сделать, это сохранить предыдущий мин (или максимум) и сравнить diff с током и предыдущим мин (или max). Легкий peasy.

Вот код, в Java как тест JUnit:

import org.junit.Test;

public class MaxDiffOverSeriesProblem {

    @Test
    public void test1() {
        int[] testArr = new int[]{100, 80, 70, 65, 95, 120, 150, 75, 95, 100, 110, 120, 90, 80, 85, 90};

        System.out.println("maxLoss: " + calculateMaxLossOverSeries(testArr) + ", maxGain: " + calculateMaxGainOverSeries(testArr));
    }

    private int calculateMaxLossOverSeries(int[] arr) {
        int maxLoss = 0;

        int idxMax = 0;
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] > arr[idxMax]) {
                idxMax = i;
            }

            if (arr[idxMax] - arr[i] > maxLoss) {
                maxLoss = arr[idxMax] - arr[i];
            }           
        }

        return maxLoss;
    }

    private int calculateMaxGainOverSeries(int[] arr) {
        int maxGain = 0;

        int idxMin = 0;
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] < arr[idxMin]) {
                idxMin = i;
            }

            if (arr[i] - arr[idxMin] > maxGain) {
                maxGain = arr[i] - arr[idxMin];
            }           
        }

        return maxGain;
    }

}

В случае вычисления наибольшей потери мы отслеживаем максимальное количество в списке (цена покупки) до текущей записи. Затем мы вычисляем разницу между максимальным и текущим. Если max - current> maxLoss, то мы сохраняем этот diff как новый maxLoss. Так как индекс max гарантированно меньше индекса тока, мы гарантируем, что дата «buy» меньше даты «sell».

В случае вычисления наибольшего выигрыша все обращается вспять. Мы отслеживаем мин в списке до текущей записи. Мы вычисляем разность между минимумом и током (изменяем порядок в вычитании). Если current - min> maxGain, то мы сохраняем этот diff как новый maxGain. Опять же, индекс «buy» (min) приходит перед индексом текущего («продавать»).

Нам остается только отслеживать maxGain (или maxLoss), а индекс min или макс, но не оба, и нам не нужно сравнивать индексы, чтобы подтвердить, что «покупка» меньше, чем «продать», поскольку мы получаем это естественно.

21
задан David Arenburg 20 August 2015 в 21:49
поделиться

3 ответа

Можно использовать исходную функцию индексации Средств отладки для Windows, который сохранит ссылки на соответствующие изменения файлов в исходном репозитории как альтернативный поток в файле PDB.

11
ответ дан 29 November 2019 в 21:47
поделиться

Если Вы обращаетесь, более универсальны о путях, встроенных в pdb файл, Вы могли сначала использовать команду MS-DOS subst для отображения конкретной папки на букву диска.

subst N: <MyRealPath>

Тогда открывают Ваш проект относительно N: управляйте и восстановите его. Ваши файлы PDB сошлются на исходные файлы на N:. Теперь не имеет значения, куда Вы помещаете тот определенный набор исходных файлов, пока Вы впоследствии называете корневой каталог "N": как Вы сделал, когда Вы создали его.

Эта практика рекомендуется John Robbins в его превосходной книге, Приложения Отладки для Microsoft.NET и Microsoft Windows .

8
ответ дан 29 November 2019 в 21:47
поделиться

Это, конечно, возможно, как На Freund уже указал. Но если это только так, чтобы источники могли быть расположены и загружены во время отладки, затем лучший путь состоял бы в том, чтобы установить исходный путь соответственно. После того, как установленный в отладчике, это будет предварительное обучение иностранных военных стажеров в США все твердые кодированные пути в PDBs.

В windbg (например):

.srcpath + path_to_source_root
или это (в случае, если Вы отлаживаете удаленно):
.lsrcpath + path_to_source_root
1
ответ дан 29 November 2019 в 21:47
поделиться
Другие вопросы по тегам:

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