Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从C++到C移植代码。_C++_C - Fatal编程技术网

如何从C++到C移植代码。

如何从C++到C移植代码。,c++,c,C++,C,我正在尝试移植到C。因为C中没有向量,所以我使用了一个普通数组,但我不知道如何处理第18行的远程循环 for (int u : d[i]) if (dfs(rev[u])) { par[i] = u; rev[u] = i; return true; } 完整代码: #include <iostream> #include <vector> #include <string> #include

我正在尝试移植到C。因为C中没有向量,所以我使用了一个普通数组,但我不知道如何处理第18行的远程循环

    for (int u : d[i]) if (dfs(rev[u])) {
        par[i] = u;
        rev[u] = i;
        return true;
    } 
完整代码:

#include <iostream>
#include <vector>
#include <string>
#include <sstream>

using namespace std;
const int Maxn = 200;
vector<int> d[Maxn];
int par[Maxn];
int rev[Maxn];
bool vs[Maxn];
bool dfs(int i) {
    if (i < 0) return true;
    if (vs[i]) return false;
    vs[i] = true;
    for (int u : d[i]) if (dfs(rev[u])) {
        par[i] = u;
        rev[u] = i;
        return true;
    }
    return false;
}
int main() {
    ios_base::sync_with_stdio(false);
    int n;
    cin >> n;
    string s;
    getline(cin, s);
    for (int i = 0; i < n; i++) {
        getline(cin, s);
        stringstream ss(s);
        vector<int> mk(n, 1);
        mk[i] = 0;
        int x;
        while (ss >> x)
            mk[x] = 0;
        for (int x = 0; x < n; x++)
            if (mk[x])
                d[i].push_back(x);
    }
    memset(par, -1, sizeof par);
    memset(rev, -1, sizeof rev);
    for (bool ok = true; ok; ) {
        ok = false;
        memset(vs, 0, sizeof vs);
        for (int i = 0; i < n; i++)
            if (par[i] < 0) {
                ok |= dfs(i);
            }
    }
    int ans = 0;
    for (int i = 0; i < n; i++)
        ans += (par[i] < 0);
    cout << ans;
}

假设d[i]是一个向量,这是一个类似的循环:

for (size_t s = 0; s < d[i].size(); s++)
{
    int u = d[i][s];
    if (dfs(rev[u]))
    {
        par[i] = u;
        rev[u] = i;
        return true;
    }
}
在C语言中,没有std::vector,闭包将是一个数组

int array[] = [ 1, 3, 5, 7, 9 ];

for(int i = 0; i < sizeof array / sizeof *array; ++i)
    printf("array[%d] = %d\n", i, array[i]);
编辑2

我注意到您已经发布了代码,并且d被声明为向量d[Maxn];。同时考虑到你最近的评论

这是一个向量数组。你知道我如何在C语言中使用数组吗

有两种方法可以转换C中的向量数组,但这取决于 根据你的需要。例如,如果你知道所有向量都有 相同大小,例如int vectsize=100,则可以创建一个两个 大小为1的多维数组

您可以创建指向int的指针数组,但必须保留 另一个int数组,长度为每个d[i]向量

但是,在某些情况下,您必须释放内存:

for(int i = 0; i < Maxn; ++i)
    free(d[i]);
在这种情况下,范围循环看起来与指针数组完全相同。 不过,释放内存有点不同:

for(int i = 0; i < Maxn; ++i)
    free(d[i]);
free(d);
free(vectsize);
它们也可能含有少于n种元素。这就是为什么我认为第三个 这里的解决方案更可取

注释

1在C99之前,不支持可变长度数组VLA,因此如果您有 在变量中,必须使用malloc来分配足够的内存。 C99支持VLA,但我不确定它们的支持程度和/或 您的编译器是否支持它们

我个人根本不在我的代码中使用它们,这就是为什么我真的不知道。我用GNU编译了这个例子 GCC6.4.0在linux上运行,运行良好

前两个选项使用VLA,如果编译器不支持,那么 您必须使用第三个选项

有关VLAs的更多信息:

以防你不知道 <> P> 2.如何真正获得这个值取决于原始C++代码。 到目前为止,我只对你的C++代码进行了简单的研究。使用中的值 我的示例get_length_for 0将返回10,get_length_for 1将返回1,
get_length_for 2将返回3,等等。

请不要在其他网站上发布带有代码的链接,请在您的问题中在此发布代码。对于int u=0;u// assuming that the variables i, par, rev are valid, i between 0 and Maxn-1 for(int j = 0; j < vectsize; ++j) { int u = d[i][j]; if (dfs(rev[u])) { par[i] = u; rev[u] = i; return true; } }
d[0].size() --> 10
d[1].size() --> 1
d[2].size() --> 3
...
int Maxn = 200;
int *d[Maxn]; // pointer to int[Maxn] arrays
int vectsize[Maxn];

// initializing with 0
memset(d, 0, sizeof d);
memset(vectsize, 0, sizeof vectsize);

// filling the data
for(int i = 0; i < Maxn; ++i)
{
    vectsize[i] = get_length_for(i);
    d[i] = malloc(vectsize[i] * sizeof *d[i]);
    if(d[i] == NULL)
        // error handling

    for(j = 0; j < vectsize[i]; ++j)
        d[i][j] = get_value_for(i, j); 
}
// assuming that the variables i, par, rev are valid, i between 0 and Maxn-1
for(int j = 0; j < vectsize[i]; ++j)
{
    int u = d[i][j];
    if (dfs(rev[u])) {
        par[i] = u;
        rev[u] = i;
        return true;
    } 
}
for(int i = 0; i < Maxn; ++i)
    free(d[i]);
int Maxn = get_some_maxn_value();
int **d, *vectsize;

d = malloc(Maxn * sizeof *d);
if(d == NULL)
    // error handling

vectsize = malloc(Maxn * sizeof *vectsize);
if(vectsize == NULL)
    // error handling,
    // if you exit the function, don't forget
    // to do free(d) first as part of the
    // error handling

// initialize all elements with 0
memset(d, 0, Maxn * sizeof *d);
memset(vectsize, 0, Maxn * sizeof *vectsize);

// filling the data (the same as above)
for(int i = 0; i < Maxn; ++i)
{
    vectsize[i] = get_length_for(i);
    d[i] = malloc(vectsize[i] * sizeof *d[i]);
    if(d[i] == NULL)
        // error handling

    for(j = 0; j < vectsize[i]; ++j)
        d[i][j] = get_value_for(i, j); 
}
for(int i = 0; i < Maxn; ++i)
    free(d[i]);
free(d);
free(vectsize);
if (mk[x])
    d[i].push_back(x);