Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.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_Function_Arduino_Arduino Ide - Fatal编程技术网

C++ 从函数返回数组或多个变量

C++ 从函数返回数组或多个变量,c++,arrays,function,arduino,arduino-ide,C++,Arrays,Function,Arduino,Arduino Ide,我做错了什么?有人能解释为什么我的代码错了吗? 为什么它不返回数组并修改其内容呢?我读过其他关于指针的文章,但我不明白它们是如何工作的。数组通过引用传递给函数。 如果修改函数中的数组,则这些更改将在函数调用后保持不变 int arrays[2] = {0,1}; void setup () { Serial.begin(9600); pinMode(2,INPUT); } void loop () { int buttonstate = digitalRead(2

我做错了什么?有人能解释为什么我的代码错了吗?

为什么它不返回数组并修改其内容呢?我读过其他关于指针的文章,但我不明白它们是如何工作的。

数组通过引用传递给函数。
如果修改函数中的数组,则这些更改将在函数调用后保持不变

int arrays[2] = {0,1}; 

void setup () {
    Serial.begin(9600);
    pinMode(2,INPUT);
}

void loop () {

    int buttonstate = digitalRead(2); //reads I/O pin 2
    if (buttonstate==HIGH) {          //if I/O pin 2 is HIGH do following

        arrays[] = function(arrays);      //calls function "function"
        Serial.println(arrays[0]);        //prints out arrays[0]
        Serial.println(arrays[1]);        //prints out arrays[1]

    }
}

int function (int arrays [2]) {   

    int holder = arrays[1];           //switches place the values on the array
    arrays[1] = arrays[0];
    arrays[0] = holder;
    return arrays[];                  //return the modified array

}
如果不想修改现有数组,则需要传递另一个数组

int arrays[2] = {0, 1};

void setup() {
    Serial.begin(9600);
    pinMode(2, INPUT);
}

void loop() {

    int buttonstate = digitalRead(2); //reads I/O pin 2
    if (buttonstate == HIGH) {          //if I/O pin 2 is HIGH do following

        function(arrays);      //calls function "function"
        Serial.println(arrays[0]);        //prints out arrays[0]
        Serial.println(arrays[1]);        //prints out arrays[1]

    }
}

void function(int arrays[]) {   

    int holder = arrays[1];           //switches place the values on the array
    arrays[1] = arrays[0];
    arrays[0] = holder;

}

您需要确保数组具有适当的大小,因为如果您在数组的范围外写入/读取,将不会引发任何显式错误,但您可能会发现一些难以调试的奇怪行为。

好吧,你最大的误解是认为C允许你传递一个完整的数组作为参数或返回值

首先,你不能做像这样的作业

int arrays[2] = {0, 1};
int arrays2[3];

void setup() {
    Serial.begin(9600);
    pinMode(2, INPUT);
}

void loop() {

    int buttonstate = digitalRead(2); //reads I/O pin 2
    if (buttonstate == HIGH) {          //if I/O pin 2 is HIGH do following

        function(arrays, arrays2);      //calls function "function"
        Serial.println(arrays2[0]);        //prints out arrays2[0]
        Serial.println(arrays2[1]);        //prints out arrays2[1]
        Serial.println(arrays2[2]);        //prints out arrays2[2]

    }
}

void function(int arrays[], int arrays_return[]) {   

    arrays_return[0] = arrays[1];
    arrays_return[1] = arrays[0];
    arrays_return[2] = arrays[0] + arrays[1];

}
这是不正确的,因为无法将阵列作为一个整体引用。您可以返回对数组的引用,例如:

arrays[] = function(...);
函数始终返回指向整数的有效指针,并且始终将
数组
变量声明为
int*数组。但这还有另一个问题。。。指针不会为指向的值分配内存

最好的解决方案是使用数组引用将其传递给函数,然后使函数在数组上正确操作。喜欢

arrays = function(...);
当然,您可以返回对原始数组的引用,这在某些表达式中可能会有所帮助,但请始终记住,您处理的是同一个数组

void function(int arrays[])
{
    int temporary = arrays[0];
    arrays[0] = arrays[1];
    arrays[1] = temporary;
    /* no return as function is declared void */
}

您有一个声明为返回
int
的函数,并且您认为您正在返回一个数组。恐怕这是最重要的错误。另外,
arrays[]
不是有效的表达式,因为它不是引用数组的方式<代码>[]
仅用于访问元素,您必须在元素之间放置表达式。要返回数组(如果可能的话),您应该
返回数组
void function(int arrays[])
{
    int temporary = arrays[0];
    arrays[0] = arrays[1];
    arrays[1] = temporary;
    /* no return as function is declared void */
}
int *function(int *arrays) /* this parameter declaration is equivalent to the last one */
{
    int temporary = arrays[0];
    arrays[0] = arrays[1];
    arrays[1] = temporary;
    return arrays; /* reference to the first array element */
}