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

时间:2017-05-28 04:30:15

标签: 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); //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

}

我在这里做错了什么?有人可以解释为什么我的代码错了吗? 为什么它不返回数组并修改其内容?我已阅读其他关于指针的文章,但我无法理解它们是如何工作的。

2 个答案:

答案 0 :(得分:1)

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

首先,你不能做像

这样的作业
arrays[] = function(...);

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

arrays = function(...);

始终您的函数会返回有效的 POINTER TO INTEGER ,并始终将您的arrays变量声明为int *arrays;。但这有另一个问题......指针不会为指向的值分配内存。

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

function(arrays);  /* you should have function exchanged the arrays values properly */
for (i = 0; i < 2; i++) /* print arrays contents and check values have been exchanged */ 
    printf("arrays[%d] == %d\n", i, arrays[i]);

在这种情况下,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 */
}

答案 1 :(得分:0)

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

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;

}

如果您不想修改现有阵列,则需要传递另一个阵列。

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];

}

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