Есть ли способ «сбросить» переменные функций?

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

double closestval (double num1, int amountofnums, double *comps){

double storagecomps[amountofnums];


for (int i = 0; i < amountofnums; i++){


storagecomps[i] = {comps[i]};
/* Storing the array of numbers for later as I will be changing them */
}



double smallval = 0.0001; /* tiny value used to increment/decrement
values in the array to the comparison variable.*/

int_fast64_t compi [amountofnums]; /* this variable keeps track of how many times it needs to decrement/increment the values in the array to approach the variable*/

for (int i = 0; i < amountofnums; i++){

compi[i] = 0;
}


for (int i = 0; i <= amountofnums; i++){

while (comps[i] > num1){

comps[i] -= smallval;
compi[i]++;

}
while (comps[i] < num1){


comps[i] += smallval;
compi[i]++;

}

double recholder[3] = {10000000, 0,};

// This area finds the 
for (int i = 0; i < amountofnums; i++){

if (compi[i] < recholder[0]){
recholder[0] = compi[i];
recholder [1] = i;
recholder[2] = storagecomps[i]; /* if the amount of iterations to approach the single variable is less than the previous record holder, it becomes the new one.
*/
}

}

return recholder[2];


}

Я относительно уверен, что это потому, что (так или иначе) переменные в функции не переопределяются должным образом или вообще не переопределяются. Большое спасибо, если вы можете показать мне, где я пошел не так!

Не существует такой вещи, как сброс значения переменной. Если вы хотите вернуть переменной какое-то значение по умолчанию, вам нужно будет присвоить ей это значение.

Jonathan Wood 16.05.2022 22:31

Использование правильного отступа было бы очень полезно, если вы хотите, чтобы кто-нибудь прочитал ваш код.

Nate Eldredge 16.05.2022 22:38

Один из ваших циклов выходит за пределы: for (int i = 0; i <= amountofnums; i++) должен быть for (int i = 0; i < amountofnums; i++) как остальные

Kevin 16.05.2022 22:41

Вы должны указать минимальный воспроизводимый пример, чтобы продемонстрировать проблему. Нет необходимости «сбрасывать» переменные в функции. Если вы не объявите их как static, эти переменные существуют только на время работы функции и будут создаваться заново при каждом ее вызове.

Miles Budnek 16.05.2022 22:58
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
4
47
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Чтобы предотвратить изменения, вы должны использовать ключевое слово const:

double closestval (double num1, int amountofnums, const double *comps){

а затем исправьте ошибки, которые выдает вам компилятор.

Если вы хотите изменить композицию внутри функций, но не повлиять на значения вне функций, вам следует использоватьstd::vector, чтобы вы могли передать их по значению, и компилятор скопирует их:

double closestval (double num1, int amountofnums, std::vector<double> comps){

Вы все равно должны это сделать, так как вы должны забыть все о массивах в стиле C, пока не станете экспертом.

Другие вопросы по теме