Loading...
RaUndreundre avatar RaUndreundre 54 Точки

Reference

#include <iostream>
#include <vector>


int minSearch(std::vector<int> vct, int& foundAtIndex) {
    for(auto it = vct.begin(); it != vct.end(); ++it) {
        if(*it < vct[foundAtIndex]) {
        foundAtIndex = (it - vct.begin());
        }
    }
    return vct[foundAtIndex];
}

int main() {
    std::vector<int> vct {4,6,4,65, 3, 76, 456,654};
    int foundAtIndex = 0;
    minSearch(vct, foundAtIndex);
    std::cout << minSearch << " " << foundAtIndex << "\n";
    return 0;
}

Очаквах да получа отговор

3 4

а получих

1 4

Малко помощ няма да ми е излишна...

Тагове:
0
C++ Programming
MartinBG avatar MartinBG 4803 Точки
Best Answer

Не пазите резултата от извикването на minSearch(vct, foundAtIndex).

Опитайте така:

    int result = minSearch(vct, foundAtIndex);
    std::cout << result<< " " << foundAtIndex << "\n";

Или направо така:

    std::cout << minSearch(vct, foundAtIndex) << " " << foundAtIndex << "\n";

 

Между другото, minSearch винаги ще прави копие на вектора, с който се извиква, а това е лоша идея.

За да го избегнете, променете сигнатурата на функцията на:

int minSearch(const std::vector<int>& vct, int& foundAtIndex)

 

2
29/01/2023 04:06:16
RaUndreundre avatar RaUndreundre 54 Точки

Благодаря, схванах къде греша.

А сега се чудя защо пък ще върне именно 1 а не нещо друго, т.е. от къде идва тая единица?

0
kolioi avatar kolioi 641 Точки

Зависи от компилатора. Името на функцията, без скоби след него, не е валиден statement и различните компилатори го интерпретират по различен начин. Например:

clang++ генерира следния warning

main.cpp:18:18: warning: address of function 'minSearch' will
      always evaluate to 'true' [-Wpointer-bool-conversion]
    std::cout << minSearch << " " << foundAtIndex << "\n";
              ~~ ^~~~~~~~~
main.cpp:18:18: note: prefix with the address-of operator to
      silence this warning
    std::cout << minSearch << " " << foundAtIndex << "\n";
                 ^
                 &
1 warning generated.

и програмата отпечатва 1 и 4. Обяснено е ето тук 

g++ генерира нещо подобно

prog.cc: In function 'int main()':
prog.cc:18:18: warning: the address of 'int minSearch(std::vector<int>, int&)' will never be NULL [-Waddress]
   18 |     std::cout << minSearch << " " << foundAtIndex << "\n";
      |                  ^~~~~~~~~
prog.cc:5:5: note: 'int minSearch(std::vector<int>, int&)' declared here
    5 | int minSearch(std::vector<int> vct, int& foundAtIndex) {
      |     ^~~~~~~~~

и отново извежда 1 и 4. Повече подробнсти тук 

Visual C++ обаче инерпретира името на функцията като нейния адрес в code (text) сегмента и отпечатва нещо такова

00007FF73D3A100F 4

 

3
kolioi avatar kolioi 641 Точки

Да обобщя - името на функцията е пойнтер и в първите два случая компилаторите просто проверяват дали е валиден (различен от nullptr) и съответно отпечатват true (1). Майкрософтския компилатор просто отпечатва този пойнтер (адреса на функцията) въпреки, че адреса се взема с &minSearch

2
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.