Eroare C++: Simboluri nedefinite pentru arhitectura x86_64 (Programare, C++, C++11, Vector, Permutare)

Timur Ridjanovic a intrebat.

Încerc să învăț C++ și încercam să rezolv o problemă în care, dat fiind un număr de trepte și numărul de moduri posibile în care poți urca pe trepte, să dau toate permutările posibilelor moduri în care poți urca pe trepte. Astfel, de exemplu, dacă sunt 5 trepte de urcat și pot urca fie 1 treaptă pe rând, fie 2 trepte pe rând, fie 3 trepte pe rând, ar trebui să tipăresc toate permutările lui 1, 2 și 3 care însumează 5: [1, 1, 1, 1, 1], , [1, 1, 1, 2], , ….

Am început cu acest cod (încă nu este gata), dar primesc această eroare:

Undefined symbols for architecture x86_64:
  "_num_steps(int, std::__1::vector<int, std::__1::allocator<int> >, std::__1::vector<std::__1::vector<int, std::__1::allocator<int> >, std::__1::allocator<std::__1::vector<int, std::__1::allocator<int> > > >, std::__1::vector<std::__1::vector<int, std::__1::allocator<int> >, std::__1::allocator<std::__1::vector<int, std::__1::allocator<int> > > >)", referenced from:
      num_steps(int, std::__1::vector<int, std::__1::allocator<int> >) in num_steps-FTVSiK.o
ld: symbol(s) not found for architecture x86_64

Chiar nu înțeleg ce fac greșit. Aș aprecia dacă m-ați putea ajuta. Mulțumesc!

#include <iostream>
#include <vector>
#include <string>
#include <cmath>

using namespace std;

//prototypes
void _num_steps(int amount, vector<int> possible_steps, vector<vector<int>> steps_list,             vector<vector<int>> result);
int sum(vector<int> steps_list);
void num_steps(int amount, vector<int> possible_steps);
//
//
// 


void num_steps(int amount, vector<int> possible_steps) {
    vector<vector<int>> result;
    _num_steps(amount, possible_steps, {{}}, result);
    //print_result(result);
}


int sum(vector<int> steps_list) {
    int sum_of_steps(0);
    for (auto step: steps_list) {
        sum_of_steps += step;
    }
    return sum_of_steps;
}

void _num_steps(int amount, vector<int> possible_steps, vector<int> steps_list,  vector<vector<int>> result) {
    if (sum(steps_list) == amount) {
        result.push_back(steps_list);
        return;
    } 
    else if (sum(steps_list) >= amount) {
        return; 
    }
    for (auto steps: possible_steps) {
        auto steps_list_copy = steps_list;
        steps_list_copy.push_back(steps);
        _num_steps(amount, possible_steps, steps_list_copy, result);
    }
    cout << "yeah" << endl;
    return;
}


int main(int argc, char* argv[]) {
    num_steps(5, {1, 2, 3});
    return 0;
} 

Comentarii

  • Te-ai uitat la alte mesaje care conțin exact această eroare? Deși nu toate ar putea fi despre subiectul tău exact, toate conțin o explicație a ceea ce cauzează eroarea și informații despre cum să o corectezi, oricare dintre acestea putând fi (cu o cantitate minoră de gândire) aplicate la propriul tău cod aici. Dacă există deja câteva zeci de postări în care se întreabă același lucru și se primește același răspuns, pare destul de redundant să se adauge încă una. (A se vedea Related din dreapta acestei întrebări pentru cel puțin 9 dintre aceste alte linkuri, de exemplu). –  > Por Ken White.
2 răspunsuri
jhaight

Eroarea compilatorului dvs. provine din faptul că semnătura dvs. pentru declarația forward a lui _num_steps nu se potrivește cu semnătura definiției dvs. de _num_steps. tipul de steps_list nu se potrivește

Schimbați linia prototipului dvs. în:

void _num_steps(int amount, vector<int> possible_steps, vector<int> steps_list, vector<vector<int>> result);

David Zech

Tipurile din lista de argumente din declarația unei funcții și din definiția acesteia trebuie să fie identice.

Ale tale nu se potrivesc.

Declarația:

void _num_steps(int amount, vector<int> possible_steps, vector<vector<int>> steps_list, vector<vector<int>> result);

Definiție:

void _num_steps(int amount, vector<int> possible_steps, vector<int> steps_list,  vector<vector<int>> result) { /* ... */ }