Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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 - Fatal编程技术网

C++ 仅使用数组的一部分

C++ 仅使用数组的一部分,c++,arrays,C++,Arrays,我有一个动态分配的浮点数组,我需要将这个数组作为一个参数传递给三个不同的函数,但是每个函数需要获得不同的数组范围。是否有某种方法可以将包含元素0到23的数组发送到一个函数,将元素24到38发送到另一个函数,将元素39到64发送到第三个函数 在某些语言中(如python),您可以执行以下操作: somefunction(my_array[0:23]); somefunction(my_array[24:38]); somefunction(my_array[39:64]); somefuncti

我有一个动态分配的浮点数组,我需要将这个数组作为一个参数传递给三个不同的函数,但是每个函数需要获得不同的数组范围。是否有某种方法可以将包含元素0到23的数组发送到一个函数,将元素24到38发送到另一个函数,将元素39到64发送到第三个函数

在某些语言中(如python),您可以执行以下操作:

somefunction(my_array[0:23]);
somefunction(my_array[24:38]);
somefunction(my_array[39:64]);
somefunction(my_array, my_array + 24);
somefunction(my_array + 24, my_array + 39);
somefunction(my_array + 39, my_array + 65);
<>但是我使用C++,我不知道在C++中有什么方法可以做到这一点。 有人知道怎么做吗


somefunction();是API中的函数,因此我无法修改它所使用的参数。

如果您编写的函数是在一对正向迭代器上操作,而不是在数组上操作,则可以像这样传递它:

somefunction1(my_array, my_array + 24);
somefunciton2(my_array + 24, my_array + 39);
somefunction3(my_array + 39, my_array + 65);

指针是正向迭代器,这将允许函数在向量、队列或其他STL容器的部分上使用。

没有上限范围检查,因此您必须自己处理。但您可以将&my_数组[0]传递给一个函数,将&my_数组[24]传递给另一个函数。也许可以在函数中添加一个len参数来处理上限。

无论如何,函数都需要某种方法来确定数组的大小。我建议您使用标准库算法的风格,将函数设置为开始和结束迭代器,如下所示:

template<typename I>
void somefunction(I begin, I end);

有两种方法可以做到这一点:

void useArray(int array[], size_t len) { ... }
...
useArray(myArray, 24);
useArray(&myArray[24], 15);
useArray(&myArray[39], 26);

第一种是C方式,第二种是C++方式。注意,第二种方式是,范围是< > > [代码] >代码> >代码>结束>代码>,在C++中,不包括在范围内。


编辑:您编辑帖子时提到您正在使用
glTexCoordPointer()
。在这种情况下,将数组的开头传递给
glTexCoordPointer()
,它将是
myArray
myArray+24
myArray+39

但是,数组的大小仍然需要知道,并传递给函数,如
glDrawArrays
glDrawElements()
,然后这些函数将开始从数组中读取。如果使用
glDrawArrays()
,数组的长度将作为第二个参数传递。因此,您的代码可能类似于:

glTexCoordPointer(..., ..., ..., my_array);
...
glDrawArrays(..., 0, 24);

glTexCoordPointer(..., ..., ..., my_array + 24);
...
glDrawArrays(..., 0, 15);

glTexCoordPointer(..., ..., ..., my_array + 39);
...
glDrawArrays(..., 0, 26);

您可以重构函数以使用“迭代器”:指向您感兴趣的数组范围的开始和结束的指针:

 void somefunction( int* begin, int* end ) {
    for( int* i=begin; i != end; ++i ) {
       //stuff with *i
    }
 }


 // usage:
 somefunction( my_array+0, my_array+23 );
 somefunction( my_array+24, my_array+38 );
 somefunction( my_array+39, my_array+64 );
优点:如果将函数设置为模板,也可以将其与其他迭代器一起使用:

 template<typename T>
 void somefunction( T begin, T end ) {
    for( T i=begin; i != end; ++i ) {
       //stuff with *i
    }
 }

 vector<int> values(100);
 somefunction( values.begin(), values.end() );
 somefunction( values.rbegin(), values.rend() );
模板
void somefunction(T开始,T结束){
for(ti=开始;i!=结束;++i){
//用*我
}
}
向量值(100);
somefunction(values.begin()、values.end());
somefunction(values.rbegin(),values.rend());

python示例正在制作副本。如果您的用例可以这样做,您可以这样做(我将用std::vector替换普通数组):

但听起来你不能使用std::vector,因为somefunction()有一个你不能更改的签名。幸运的是,你可以做类似的练习,只需手动复制数组的一部分,如下所示:

#include <iostream>
#include <string.h>

void somefunction(int v[], int len) {
    std::cout << "vector has " << len << " elements,"
        << " first value is " << v[0] << ","
        << " last value is " << v[len-1] << std::endl;
}

int main() {
    int a[65];
    for (int i=0; i<65; i++) {
        a[i] = i;
    }
    int b[23];
    memcpy(b, a, 23*sizeof(int));
    somefunction(b, 23);
    int c[15];
    memcpy(c, a+23, 15*sizeof(int));
    somefunction(c, 15);
    int d[27];
    memcpy(d, a+38, 27*sizeof(int));
    somefunction(d, 27);
}

我将返回或执行类似于
std::pair
的操作,其中包含
{Begin\u Pointer,End\u Pointer}
,因此,如果我们需要用特定的部分/块切片一个原始数组(在C/C++中,只有一个指针)

pointer_type element_begin = raw_array+begin;
pointer_type element_end = raw_array+end;
std::pair<pointer_type, pointer_type> = std::make_pair(element_begin, element_end);
pointer\u type element\u begin=raw\u array+begin;
指针\类型元素\末端=原始\数组+末端;
std::pair=std::make_pair(元素开始,元素结束);

我将有一个方便的函数,我给这些
begin
end
非负值,它将返回一个
std::pair

如何
somefunction
知道数组有多大?somefunction();是glTexCoordPointer();从OpenGLif使用
glTexCoordPointer())
只需传递
my_array+n
@PgrAm:在看到您现在提到
glTexCoordPointer()后,刚刚编辑了我的答案如果你在设置纹理之后有其他的绘制代码的代码,你应该把它添加到你的问题中。+ 1强调有一个“更多的C++方式”。个人来说,我喜欢让第一个例子与下面的例子一致:<代码>使用(MyLaS+ 0,MyLaS+ 23)。
我不能这样做,因为我不能修改somefunction();@AusCBloke
glTexCoordPointer(…,…,…,我的数组+24);
显示为除了旋转texture@PgrAm:我对OpenGL的东西不太确定,但是传递
my_array+24
会使它看起来好像是数组的开始。如果第二个参数表示常规的
end()
iterator,你是不是错了一个?@Rob:这类函数将第二个参数解释为“最后一个元素的一个”。STL就是这样处理迭代器的。@xtofl:是的,这就是他的意思-偏移量是24、39、65,而不是23、38、64。我不能这样做,因为我不能修改某个函数();我不能这样做,因为我不能修改somefunction();@PgrAm:然后回答你问题下面GMan的评论,因为当你把一个数组传递给一个函数时,它会衰减为一个指针,大小也会丢失。somefunction();是glTexCoordPointer();来自OpenGLI的不能这样做,因为我不能修改somefunction();
vector has 23 elements, first value is 0, last value is 22
vector has 15 elements, first value is 23, last value is 37
vector has 27 elements, first value is 38, last value is 64
#include <iostream>
#include <string.h>

void somefunction(int v[], int len) {
    std::cout << "vector has " << len << " elements,"
        << " first value is " << v[0] << ","
        << " last value is " << v[len-1] << std::endl;
}

int main() {
    int a[65];
    for (int i=0; i<65; i++) {
        a[i] = i;
    }
    int b[23];
    memcpy(b, a, 23*sizeof(int));
    somefunction(b, 23);
    int c[15];
    memcpy(c, a+23, 15*sizeof(int));
    somefunction(c, 15);
    int d[27];
    memcpy(d, a+38, 27*sizeof(int));
    somefunction(d, 27);
}
vector has 23 elements, first value is 0, last value is 22
vector has 15 elements, first value is 23, last value is 37
vector has 27 elements, first value is 38, last value is 64
pointer_type element_begin = raw_array+begin;
pointer_type element_end = raw_array+end;
std::pair<pointer_type, pointer_type> = std::make_pair(element_begin, element_end);