Указатель влияет на вызов функции там, где он не должен быть - PullRequest
2 голосов
/ 14 февраля 2011

Я вызываю функцию ниже, которая вычисляет значение, указанное в переданных переменных. Однако при запуске функции (calculate_distance) данные, содержащиеся в переменной (loc_ptr), которая передается в функцию, похоже, изменяются.

Я прошел по коду и обнаружил, что переменная loc_ptr влияет на вызов функции, а не внутри самой функции.

Функция вызывается в цикле while. Первая итерация цикла while вычисляется правильно, проблема возникает только на последующих итерациях.

_Note: location является структурой с определением типа, содержащей имя char *, двойную широту, двойную долготу. options - массив двойных чисел ._

double calculate_distance(location from, location to) {
    return to.latitude - from.latitude;
}

main() {
    location current_location = {"Plymouth", 50.378565, -4.134339};
    location locations[3] = {{"Padstow", 50.5384, -4.9378}, 
                            {"Newquay", 50.412, -5.0757}, 
                            {"Boscastle", 50.684, -4.6929}};

    // create a pointer to an array of locations.
    location* loc_ptr;
    loc_ptr = &locations[0];

    double options[3];
    int i = 0;
    int position = 3;

    while (i < position) {
        // calculate the distance between the current and other locations
        options[position] = calculate_distance(current_location,
                                                loc_ptr[position]);
        position--;
    }
    // handle the rest of the algorithm
}

Примечание: код является частью более крупного алгоритма, он сокращен, поскольку он будет довольно длинным. После завершения цикла while массив loc_ptr перестраивается для удаления одного из элементов.

Ответы [ 5 ]

2 голосов
/ 14 февраля 2011

Разрушение стека?проверьте размеры опций [] location [] массивов.Также полезно использовать утверждения, чтобы избежать исчерпания границ.

Итак, теперь я вижу проблему с индексами.В массиве location [] есть 3 элемента, но вы получаете доступ к четвертому в течение первого цикла (loc_ptr [position] -> loc_ptr [3]), то же самое с параметрами [].

2 голосов
/ 14 февраля 2011

Ваш пример кода ...

  • не компилируется по разным причинам, опечаткам и упущениям;и

  • не содержит явных ошибок, которые могли бы объяснить наблюдаемое вами поведение.

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

В любом случае,никто не мог сказать, потому что вы не дали достаточно информации.

Попробуйте эту маленькую технику отладки .

Редактировать: После того, как вы обновили свой вопрос,по крайней мере, ваш пример кода компилируется правильно (после того, как я добавил typedef).Он обращается к неопределенной памяти в первом цикле (поскольку массив, определенный, например, как options[3], имеет элементы options[0] .. options[2], но не options[3]).То, что не происходит, так это то, что значение loc_ptr изменяется любым образом (как я проверял с использованием отладчика).Таким образом, либо вы все еще видите призраков, либо ваш пример кода не демонстрирует проблему, с которой вы столкнулись (в качестве примера это бесполезно).Моя рекомендация (см. Ссылку выше) остается.

1 голос
/ 14 февраля 2011

Сформировав код, кажется, что первый вызов в несуществующих местах элементов [3].Это важно?

0 голосов
/ 14 февраля 2011

Кажется, проблема в

loc_ptr = &locations[0];

locations, кажется, массив location элементов.Получение адреса первого элемента этого массива даст вам указатель на этот элемент.

Почему бы просто не сделать locations[position] вместо создания дополнительного loc_ptr для хранения той же информации?Я почти уверен, что проблема связана с содержимым locations, что также не входит в область вашего фрагмента кода.

0 голосов
/ 14 февраля 2011

Вы не можете получить доступ к местоположению [3], так как самый высокий индекс в этом массиве равен 2. Возможно, вы хотели:

for (int i = 2;i >= 0;i--) 
    options[i] = calculate_distance(current_location, locations[i]);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...