【问题标题】:Function not working, argument passing fail函数不工作,参数传递失败
【发布时间】:2015-02-16 00:35:19
【问题描述】:
  • 注意:似乎代码本身不是问题,而是链接/编译器问题。第一个代码块位于名为 mesorti.cpp 的文件中。函数 merge 和 mesort 都在那里。编译它的命令是:g++ -Wall -Wextra -I. -std=c++11 -fpermissive -c -o mesorti.o mesorti.cppg++ -Wall -Wextra -I. -std=c++11 -fpermissive -o 1 main.o mesorti.o

我已按原样复制文件 mesorti.cpp。

下面的函数应该使用一个向量然后对其进行排序。我创建了它,以便它应该对向量进行排序,并返回它对它进行排序所花费的时间。但它没有返回排序后的数组,花费的时间表明它确实没有对它进行排序。函数本身确实在工作,(它在函数内部指定时对本地数组进行排序)所以这与参数传递有关。

这是函数,它是一个归并排序算法,递归调用自身并使用另一个函数,merge

#include <inc.h>
void merge(vector<int>& array, vector<int>& array1, vector<int>& array2) 
{
    array.clear();

    int i, j, k;
    for( i = 0, j = 0, k = 0; i < array1.size() && j < array2.size(); k++)
    {
        if(array1.at(i) <= array2.at(j))
        {
            array.push_back(array1.at(i));
            i++;
        } else if(array1.at(i) > array2.at(j))
        {
            array.push_back(array2.at(j));
            j++;
        }
        k++;
    }

    while(i < array1.size())
    {
        array.push_back(array1.at(i));
        i++;
    }

    while(j < array2.size())
    {
        array.push_back(array2.at(j));
        j++;
    }
}

double mesorti(intv &array) 
{
    auto t0 =chrono::high_resolution_clock::now();
    if (1 < array.size()) 
    {
        intv array1(array.begin(), array.begin() + array.size() / 2);
        mesorti(array1);
        cout<<"wola";
        intv array2(array.begin() + array.size() / 2, array.end());
        mesorti(array2);
        merge(array, array1, array2);
    }
    auto t1 = chrono::high_resolution_clock::now();
    double T = chrono::duration_cast<chrono::nanoseconds>(t1-t0).count();
    return T;
}

这是ma​​in的一部分:

#include <iostream>
#include <vector>
#include <chrono>
using namespace std;

typedef vector<int> intv;
typedef vector<float> flov;
typedef vector<double> douv;

double mesorti(intv &vii);

int main()
{
    size_t t;
    int i;
    intv vi;
    cout << "Size: \n";
    cin >> t;
    vi=vectori(0,t);   // This function creates a vector.
    for(i=0; i<t; ++i)
    {
        cout << vi[i] <<"\n";
    }

    time=mesorti(vi);      
    for(i=0; i<t; ++i)
    {
        cout << vi[i] <<"\n";
    }
}

但这不是对数组进行排序,最后一个 cout 只是返回相同的数组,而我是通过引用传递它,它不应该工作吗?

【问题讨论】:

  • 请使用更好的变量名,因为很难一眼看出arrayarray1array2 到底是什么意思。制作后两个 const 引用可以帮助我更快地理解哪些是输入参数。
  • 在纠正了代码中的各种错误后,它对我来说有效(我的意思是排序),在 mac 上使用 clang 编译。

标签: c++


【解决方案1】:

您的代码没有问题。尝试将您的 main 重写为:

int main() {

    intv vi { 3, 2, 1, 5, 4 };
    size_t t = vi.size();
    int i;
    cout << "Original: \n";
    for(i=0; i<t; ++i) cout << vi[i] << ' ';
    cout << '\n';

    double time=mesorti(vi);      
    cout << "Sorted: \n";
    for(i=0; i<t; ++i) cout << vi[i] << ' ';
    cout << '\n';

    return 0;
}

如果您仍然遇到问题,则可能是您遇到了链接问题(例如,链接到旧的 .o 文件。)

输出:

Original: 
3 2 1 5 4 
Sorted: 
1 2 3 4 5 

注意:为简单起见,我使用 C++11 样式的向量初始化。如果您没有 C++11 编译器,请以其他方式对其进行初始化。


编辑:这是为我编译和运行的完整单文件 main.cpp 文件:

#include <iostream>
#include <vector>
#include <chrono>
using namespace std;

typedef vector<int> intv;
typedef vector<float> flov;
typedef vector<double> douv;

void merge(vector<int>& array, vector<int>& array1, vector<int>& array2) {
     array.clear();

     int i, j, k;
     for( i = 0, j = 0, k = 0; i < array1.size() && j < array2.size(); k++){
        if(array1.at(i) <= array2.at(j)){
            array.push_back(array1.at(i));
            i++;
        }else if(array1.at(i) > array2.at(j)){
            array.push_back(array2.at(j));
            j++;
        }
        k++;
    }

    while(i < array1.size()){
        array.push_back(array1.at(i));
        i++;
    }

    while(j < array2.size()){
        array.push_back(array2.at(j));
        j++;
    }
}

double mesorti(intv &array) {
auto t0 =chrono::high_resolution_clock::now();
if (1 < array.size()) {
    intv array1(array.begin(), array.begin() + array.size() / 2);
        mesorti(array1);
        intv array2(array.begin() + array.size() / 2, array.end());
        mesorti(array2);
        merge(array, array1, array2);
    }
auto t1 = chrono::high_resolution_clock::now();
double T = chrono::duration_cast<chrono::nanoseconds>(t1-t0).count();
return T;
}

int main() {

    intv vi { 3, 2, 1, 5, 4 };
    size_t t = vi.size();
    int i;
    cout << "Original: \n";
    for(i=0; i<t; ++i) cout << vi[i] << ' ';
    cout << '\n';

    double time=mesorti(vi);      
    cout << "Sorted: \n";
    for(i=0; i<t; ++i) cout << vi[i] << ' ';
    cout << '\n';

    return 0;
}

【讨论】:

  • 嗯,我试过了,还是不行……我觉得确实是链接问题。我正在使用 Makefile 编译项目,我将对其进行调查。
  • 第一个代码块位于名为 mesorti.cpp 的文件中。函数 merge 和 mesort 都在那里。编译它的命令是:g++ -Wall -Wextra -I. -std=c++11 -fpermissive -c -o mesorti.o mesorti.cpp g++ -Wall -Wextra -I. -std=c++11 -fpermissive -o 1 main.o mesorti.o
猜你喜欢
  • 2014-11-29
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多