• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Transformacja elementów w C++

Object Storage Arubacloud
0 głosów
300 wizyt
pytanie zadane 21 czerwca 2020 w C i C++ przez kupson3697 Użytkownik (610 p.)

Siemka. Napisałem taki program, u mnie wszystko śmiga. Niestety znów znalazł się jakiś głupi błąd, którego nie mogę znaleźć, a który znalazł wykładowca :-/ Jakby ktoś zerknął to będę baardzo wdzięczny, bo muszę to wysłać do jutra..

Treść zadania: 

Mój program: 

#include <iostream>
#include <vector>
#include <functional>


std::vector<int>::iterator transform(std::vector<int>::const_iterator b, std::vector<int>::const_iterator e,std::vector<int>::iterator f, std::function<int(int)> x){

    while(b<e){
        *f =  x(*b);
        b++;
        f++;
    }

    return f;
}

int main() {
   const std::vector<int> vector1 {-7, 5, 1, 2, 11, -1};
    std::vector<int> vector2(5);
    auto result = transform(vector1.cbegin(), vector1.cend(), vector2.begin(),[](int element) {return element * element;});
    for (auto iterator = vector2.cbegin(); iterator < result;) {
    std::cout << *iterator++ << " "; }
    std::cout << std::endl;
}


 

Kod błędu:

transform.cxx: In function ‘std::vector<int>::iterator transform(std::vector<int>::const_iterator, std::vector<int>::const_iterator, std::vector<int>::iterator, std::function<int(int)>)’:
transform.cxx:4:1: error: ‘inf’ was not declared in this scope
 inf
 ^

 

Oczywiście szukalem w google, na stack i zauważyłem, że błąd prawdopodobnie jest związany z tym, że coś rozbiega (infinite). Niestety nie mogę sobie z tym poradzić. 

 

Z góry dziękiuję za pomoc :-)

1
komentarz 21 czerwca 2020 przez tkz Nałogowiec (42,000 p.)
Wstawiłeś na pewno dobry kod, znaczy ten, który rzuca tym błędem?
komentarz 21 czerwca 2020 przez kupson3697 Użytkownik (610 p.)
Tak. Plus warto dodać, że to sprawdza najpierw sprawdzarka dla n elementów, później dopiero człowiek.
1
komentarz 21 czerwca 2020 przez tkz Nałogowiec (42,000 p.)
Jedyny błąd jaki znalazłem, to, że przy większej ilości danych drugi wektor się wsypuję przez free z C. Proponowałbym std::vector<int> vector2(5); zamienić na std::vector<int> vector2(vector1.size());
komentarz 21 czerwca 2020 przez kupson3697 Użytkownik (610 p.)

Słuszna uwaga. Niestety do mnie należy funkcja, która musi pasować do "przykładowego programu". Mówiąc w skrócie - Ja wysyłam samą funkcję. Po prostu spróbuje wysłac jeszcze raz, może sprawdzarka będzie tym razem łaskawsza laugh 

2 odpowiedzi

0 głosów
odpowiedź 21 czerwca 2020 przez Wiciorny Ekspert (270,190 p.)

To jest opisany błąd dosyć szeroko. Akurat w ten sposób zabezpiecza się " program- vector" przed wystąpieniem nieskończonej pętli, gdzie przy operacji na wskaźnikach jest to niebezpieczne.

Błąd jest wynikiem COMPILATORA- po prostu, a nie samego kodu. 
Też istnieje szansa na rozwiązanie przez zmiane typu z int ->> double? 
Ten temat jest szeroko opisany tutaj: 
https://github.com/grame-cncm/faust/issues/397

A const_iterator is an iterator that points to const value

ważna sprawa to też analizować to  co się pisze, zwróć uwagę, że operujesz na wskaźnikach przy STAŁYCH ITERATORACH, a te musza wskazywać zawsze to samo miejsce w pamięci ... co ciekawe obiekt w tym miejscu może być zmienny tzn jak zawartość pudełka, ale pudło  musi być zawsze to samo... 

 

komentarz 21 czerwca 2020 przez tkz Nałogowiec (42,000 p.)
Ma to sens przy pow, ponieważ przyjmuje na pierwszym miejscu liczbę zmiennoprzecinkową. Sam vector nie chroni się przed pętlą, jedyna obrona jaka istnieje to przy korzystaniu z .at(). cbegin, czy inny cIteraotr nie ma znaczenia przy tym błędzie, bo możesz go normalnie iterorować. Po za tym autor ich nie modyfikuje, na co i tak kompilator by nie pozwolił.
komentarz 21 czerwca 2020 przez kupson3697 Użytkownik (610 p.)

@Wiciorny, Musiałem użyć w argumentach funkcji iteratorów stałych, bo w wywołaniu w main użyte są iteratory stałe. Poza tym program jak widać jest bardzo prosty, tym bardziej dziwi mnie taki błąd.

0 głosów
odpowiedź 22 czerwca 2020 przez mokrowski Mędrzec (155,460 p.)

Przelicz ilość elementów w wektorze w przykładzie (treść zadania), w Twoim kodzie oraz w trakcie alokacji na wektor wynikowy (vector2). Kod poza tym błędem jest poprawny. Zakłada jednak że wektor wynikowy, powinien zawierać wystarczającą ilość elementów. Tu nie ma żadnej operacji na wskaźnikach. Tu są wywołania operatorów udających semantykę wskaźnika.

komentarz 23 czerwca 2020 przez kupson3697 Użytkownik (610 p.)
No własnie tak jest w funckji, do której musze się "dostosować" tj. podsyłam swoją funkcję do takiego przykładowego programu. Tez na to zwróciłem uwagę ale z poziomu funkcji nie mam żadnego wpływu na takie ograniczenie.
komentarz 23 czerwca 2020 przez mokrowski Mędrzec (155,460 p.)

Ile jest elementów w Twoim kodzie?

const std::vector<int> vector1 {-7, 5, 1, 2, 11, -1};

A ile jest elementów w kodzie zadania?

const std::vector<int> vector1 {-7, 5, 1, 2, 11};

A ile jest "miejsca" w kontenerze wynikowym?

std::vector<int> vector2(5);

W kodzie który napisałeś, dochodzi do próby dodania elementu poza ostatnim elementem dostępnym w kontenerze wynikowym. std::vector, w kodzie który masz, nie "rozszerzy się sam". Stąd, będziesz miał błąd w trakcie uruchomienia aplikacji.

Rozwiązania:

1. Zrób 5 elementów w kontenerze vector1

2. Zmień implementację swojej funkcji tak by wykrywała i bazowała na ilości dostępnych elementów w kontenerze wynikowym.

Podobne pytania

0 głosów
2 odpowiedzi 144 wizyt
pytanie zadane 8 września 2015 w C i C++ przez slawekh666 Początkujący (410 p.)
0 głosów
2 odpowiedzi 368 wizyt
pytanie zadane 12 grudnia 2020 w C i C++ przez nierozumiem Początkujący (250 p.)
+1 głos
2 odpowiedzi 450 wizyt

92,579 zapytań

141,432 odpowiedzi

319,663 komentarzy

61,964 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...