web-dev-qa-db-fra.com

Erreur C ++: symboles non définis pour l'architecture x86_64

J'essaie d'apprendre le C++ et essayais de résoudre un problème où, étant donné un certain nombre de marches et le nombre de façons possibles de monter les marches, donne toutes les permutations des façons possibles de monter les marches. Ainsi, par exemple, s'il y a 5 marches à gravir et que je peux monter d'une marche à la fois, 2 marches à la fois ou 3 marches à la fois, je devrais imprimer toutes les permutations de 1, 2 et 3 qui ajouter jusqu'à 5: [1, 1, 1, 1, 1], [1, 1, 1, 2], ....

J'ai commencé avec ce code (ce n'est pas encore fait), mais j'obtiens cette erreur:

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

Je ne comprends vraiment pas ce que je fais mal. J'apprécierais si je pouvais obtenir de l'aide. Merci!

#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;
} 
13
Timur Ridjanovic

Votre erreur de compilation vient du fait que votre signature pour la déclaration avant de _num_steps ne correspond pas à la signature de votre définition de _num_steps. le type de steps_list ne correspond pas

Changez votre ligne de prototype en:

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

Les types dans la liste d'arguments d'une déclaration de fonction et sa définition doivent être les mêmes.

Les vôtres ne correspondent pas.

Déclaration:

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

Définition:

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