Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.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++_Arrays_Multidimensional Array_Mapping - Fatal编程技术网

C++ 将二维点阵列转换为一维阵列

C++ 将二维点阵列转换为一维阵列,c++,arrays,multidimensional-array,mapping,C++,Arrays,Multidimensional Array,Mapping,我正在努力将二维点数组转换为一维整数数组。我编写了一个包装器类来为我实现这一点(Array3D),它通过填充底层缓冲区来为我进行映射,但看起来索引是完全错误的,因为当我打印2D数组并比较缓冲区时,它会给我不同的输出 2D点阵列具有尺寸步数×机器人数量。因此,1D缓冲区具有 步长×机器人数量×2 我的想法是 buffer[index(x,y,0)] corresponds to points[index(x,y)].x buffer[index(x,y,1)] corresponds to poi

我正在努力将二维点数组转换为一维整数数组。我编写了一个包装器类来为我实现这一点(Array3D),它通过填充底层缓冲区来为我进行映射,但看起来索引是完全错误的,因为当我打印2D数组并比较缓冲区时,它会给我不同的输出

2D点阵列具有尺寸步数×机器人数量。因此,1D缓冲区具有 步长×机器人数量×2

我的想法是

buffer[index(x,y,0)] corresponds to points[index(x,y)].x
buffer[index(x,y,1)] corresponds to points[index(x,y)].y
输出是错误的,因为当我打印出2D点阵列和1D缓冲区时,输出应该是相同的。我从文件中读取了一行点,因此,它们应该完全相同

这些点来自文件读取的输入。如何做到这一点似乎并不重要。事实是,main.cpp的输出是:

(0, 4)  (0, 5)  (1, 5)  (2, 5)  (2, 4)  (3, 4)  (2, 4)  (2, 3)  (2, 2)  
(4, 0)  (4, -1) (4, 0)  (4, 1)  (3, 1)  (4, 1)  (4, 2)  (3, 2)  (2, 2)  

(0, 2)  (0, 3)  (1, 2)  (2, 2)  (2, 2)  (3, 3)  (2, 2)  (2, 2)  (2, 2)  
(1, 2)  (2, 2)  (2, 2)  (3, 3)  (2, 2)  (2, 2)  (2, 2)  (3, 3)  (2, 2)  
point.cpp

Point::Point(int a, int b) {
    x = a;
    y = b;
}
template<class T>
int Array3D<T>::index(int x,int y,  int z) {
    return (x * ydim + y) * zdim + z;
}

template<class T>
T Array3D<T>::get( int x,  int y, int z) {
    return buffer[index(x,y,z)];
}

template<class T>
void Array3D<T>::set( int x,  int y, int z ,T n) {
    buffer[index(x,y,z)] = n;
}
int Harvester::index(int t, int n) {
    return t*number_of_robots + n;
}

void Harvester::extract(Array3D<int> *array) {
    Point p;
    for(int t = 0; t < steps; t++ ) {
        for(int n = 0; n < number_of_robots; n++) {
            p = data[index(t,n)];
            array->set(t,n,0,p.x);
            array->set(t,n,1,p.x);
        }
    }
}

void Harvester::read_points(string filename) {
    string line;
    ifstream input;

    input.open(filename.c_str());

    input >> number_of_robots;

    int x, y;
    for(int n = 0; n < number_of_robots; n++) {
        if(input >> x >> y) {
            data[index(0,n)].x = x;
            data[index(0,n)].y = y;
            //cout << x << " " << y << endl;
        } else {
            cout << "Your file is bad, and you should feel bad!";
            return;
        }
    }
}

void Harvester::print_harvest() {
    for (int n = 0; n < number_of_robots; n++) {
        for (int t = 0; t < steps; t++) {
            data[index(t,n)].dump();
        }
        cout << endl;
    }
    cout << endl;
}
int main() {
    int mission_time;
    int number_of_robots;
    Point goal;
    string path;
    bool print = true;

    int choice = 2;    

    mission_time = 8;
    number_of_robots = 2;
    goal.x = 2;
    goal.y = 2;
    path = "robots_002.txt"; 

    int steps = mission_time + 1;

    Harvester h(mission_time, number_of_robots, goal);
    h.read_points("fixtures/" + path);
    h.run();


    int *buffer = new int[steps * number_of_robots * 2];
    Array3D<int> arr(steps, number_of_robots, 2, buffer);

    h.extract(&arr);

    h.print_harvest();
    for (int n = 0; n < number_of_robots; n++) {
        for (int t = 0; t < steps; t++) {
                printf("(%d, %d)\t", arr.get(t, n, 0), arr.get(t, n, 1));
        }
        cout << endl;
    }


    return 0;
}
Array3D.cpp

Point::Point(int a, int b) {
    x = a;
    y = b;
}
template<class T>
int Array3D<T>::index(int x,int y,  int z) {
    return (x * ydim + y) * zdim + z;
}

template<class T>
T Array3D<T>::get( int x,  int y, int z) {
    return buffer[index(x,y,z)];
}

template<class T>
void Array3D<T>::set( int x,  int y, int z ,T n) {
    buffer[index(x,y,z)] = n;
}
int Harvester::index(int t, int n) {
    return t*number_of_robots + n;
}

void Harvester::extract(Array3D<int> *array) {
    Point p;
    for(int t = 0; t < steps; t++ ) {
        for(int n = 0; n < number_of_robots; n++) {
            p = data[index(t,n)];
            array->set(t,n,0,p.x);
            array->set(t,n,1,p.x);
        }
    }
}

void Harvester::read_points(string filename) {
    string line;
    ifstream input;

    input.open(filename.c_str());

    input >> number_of_robots;

    int x, y;
    for(int n = 0; n < number_of_robots; n++) {
        if(input >> x >> y) {
            data[index(0,n)].x = x;
            data[index(0,n)].y = y;
            //cout << x << " " << y << endl;
        } else {
            cout << "Your file is bad, and you should feel bad!";
            return;
        }
    }
}

void Harvester::print_harvest() {
    for (int n = 0; n < number_of_robots; n++) {
        for (int t = 0; t < steps; t++) {
            data[index(t,n)].dump();
        }
        cout << endl;
    }
    cout << endl;
}
int main() {
    int mission_time;
    int number_of_robots;
    Point goal;
    string path;
    bool print = true;

    int choice = 2;    

    mission_time = 8;
    number_of_robots = 2;
    goal.x = 2;
    goal.y = 2;
    path = "robots_002.txt"; 

    int steps = mission_time + 1;

    Harvester h(mission_time, number_of_robots, goal);
    h.read_points("fixtures/" + path);
    h.run();


    int *buffer = new int[steps * number_of_robots * 2];
    Array3D<int> arr(steps, number_of_robots, 2, buffer);

    h.extract(&arr);

    h.print_harvest();
    for (int n = 0; n < number_of_robots; n++) {
        for (int t = 0; t < steps; t++) {
                printf("(%d, %d)\t", arr.get(t, n, 0), arr.get(t, n, 1));
        }
        cout << endl;
    }


    return 0;
}
main.cpp

Point::Point(int a, int b) {
    x = a;
    y = b;
}
template<class T>
int Array3D<T>::index(int x,int y,  int z) {
    return (x * ydim + y) * zdim + z;
}

template<class T>
T Array3D<T>::get( int x,  int y, int z) {
    return buffer[index(x,y,z)];
}

template<class T>
void Array3D<T>::set( int x,  int y, int z ,T n) {
    buffer[index(x,y,z)] = n;
}
int Harvester::index(int t, int n) {
    return t*number_of_robots + n;
}

void Harvester::extract(Array3D<int> *array) {
    Point p;
    for(int t = 0; t < steps; t++ ) {
        for(int n = 0; n < number_of_robots; n++) {
            p = data[index(t,n)];
            array->set(t,n,0,p.x);
            array->set(t,n,1,p.x);
        }
    }
}

void Harvester::read_points(string filename) {
    string line;
    ifstream input;

    input.open(filename.c_str());

    input >> number_of_robots;

    int x, y;
    for(int n = 0; n < number_of_robots; n++) {
        if(input >> x >> y) {
            data[index(0,n)].x = x;
            data[index(0,n)].y = y;
            //cout << x << " " << y << endl;
        } else {
            cout << "Your file is bad, and you should feel bad!";
            return;
        }
    }
}

void Harvester::print_harvest() {
    for (int n = 0; n < number_of_robots; n++) {
        for (int t = 0; t < steps; t++) {
            data[index(t,n)].dump();
        }
        cout << endl;
    }
    cout << endl;
}
int main() {
    int mission_time;
    int number_of_robots;
    Point goal;
    string path;
    bool print = true;

    int choice = 2;    

    mission_time = 8;
    number_of_robots = 2;
    goal.x = 2;
    goal.y = 2;
    path = "robots_002.txt"; 

    int steps = mission_time + 1;

    Harvester h(mission_time, number_of_robots, goal);
    h.read_points("fixtures/" + path);
    h.run();


    int *buffer = new int[steps * number_of_robots * 2];
    Array3D<int> arr(steps, number_of_robots, 2, buffer);

    h.extract(&arr);

    h.print_harvest();
    for (int n = 0; n < number_of_robots; n++) {
        for (int t = 0; t < steps; t++) {
                printf("(%d, %d)\t", arr.get(t, n, 0), arr.get(t, n, 1));
        }
        cout << endl;
    }


    return 0;
}
intmain(){
国际任务时间;
机器人的整数;
点目标;
字符串路径;
bool print=true;
int-choice=2;
任务时间=8;
机器人的数量=2;
目标x=2;
目标y=2;
path=“robots_002.txt”;
int steps=任务时间+1;
收获机h(任务时间、机器人数量、目标);
h、 读取点(“固定装置/”+路径);
h、 run();
int*buffer=new int[步数*机器人数量*2];
Array3D arr(步数、机器人数量、2个缓冲器);
h、 提取&arr;
h、 print_harvest();
对于(int n=0;n<机器人的数量;n++){
for(int t=0;tcout仍在查看,但观察很快。在Harverster::extract中,您将两者都设置为p.x

void Harvester::extract(Array3D<int> *array) {
    Point p;
    for(int t = 0; t < steps; t++ ) {
        for(int n = 0; n < number_of_robots; n++) {
            p = data[index(t,n)];
            array->set(t,n,0,p.x);
            array->set(t,n,1,p.x);  //<-- im thinking you want this to be p.y
        }
    }
}
void Harvester::extract(Array3D*数组){
p点;
for(int t=0;t集合(t,n,0,p.x);

数组->集合(t,n,1,p.x);//所以输出是错误的,但您没有显示输入,甚至没有解释输出是如何错误的。祝您好运……我认为很明显,当我要映射某个对象时,这两个对象的输出应该是相同的。我对此做了更多解释。您确定Array3D索引方法返回的是唯一索引吗在您的1D数组中(我无法在不知道ydim和zdim是什么的情况下对其进行完整的计算)。但在我看来,由于上述错误(Harvester::extract()将这两个值都设置为p.x)1D数组中的每个点的x和y都应该相等,但它们并不符合您的输出。这让我相信Array3d::index()的返回值没有针对每个唯一输入的唯一输出。我在谷歌上搜索了如何将一维数组索引为三维数组,这看起来是错误的。但是非常感谢你发现了我的愚蠢错误。我使用了+你的更改提示给我想要的输出。