2017-06-05 211 views
1

所以我试图实现的是从函数返回一个指向二维数组的指针,以便它可以在main()中访问。我知道有一些C++库可以帮你实现,比如std::vector,但是我试图避免动态内存分配,因为我在嵌入式主板(STM32)上工作,所以我会坚持使用普通的指针和数组。 (也为一些原因,我不能在KEIL uVision,这也是为什么我被迫与指针/阵列工作使用std::array从函数返回指向二维数组的指针 - C++

此外,据我所知,一个指针返回到本地阵列int arr[2][2]定义函数内部不是一个好主意,因为它在函数返回后将不再有效,这就是为什么我创建test_array,在类中声明并在函数中定义它(作为全局变量),所以我认为这应该这不是一个问题。你们有什么感想?但是,做这种方式提供了一个错误“标量初始化多余元素”

#include <iostream> 
#include "file.hpp" 

int main() { 

    myClass class_object; 

    class_object.value = class_object.foo(); 


} 

//file.hpp 

#include <stdio.h> 

class myClass{ 

    int array[2][2]; 
    int (*foo())[2]; 
    int (*value)[2]; 

    int test_array[2][2]; //declaring here! 

}; 

//file.cpp 

#include "file.hpp" 

int (*myClass::foo())[2]{ 

    test_array[2][2]={ {10,20}, {30, 40} }; //defining here - ERROR!! 

    int arr[2][2]= { 
     {1, 10}, 
     {20, 30} 
    }; 


return arr; 


} 
+2

'int(* myClass :: foo())[2] {'这是一种做功能声明的新方法,我还没有涉及到呢?它看起来像gobbledegook!你还在返回你所说的你不知道的地方。最后,告诉我们错误发生的地方怎么样? – John3136

+3

为什么人们如此痴迷C语言数组? :( –

+2

@Baum因为无能的教授正在教他们这些是重要的,工业可以通过摆脱这些人来节省一大笔钱 –

回答

0

如果你真的想用C-阵列工作,使用的typedef 正常语法:

class myClass{ 
    public: 
    using array2 = int[2][2]; 

    myClass() { 
     test_array[0][0] = 0; 
     test_array[0][1] = 1; 
     test_array[1][0] = 2; 
     test_array[1][1] = 3; 
    } 

    const array2& getArray() const { return test_array; } 
    array2& getArray() { return test_array; } 

private: 
    array2 test_array; 
}; 
+0

我不知道这似乎有点困惑。另外我不想初始化一个数组里面的数组,但是在函数内部,因为我在里面实现了一些数学函数 – Doej

+0

@Doej如果这是嵌入式平台,并且约束很紧,那么为什么不彻底移除动态内存呢?为什么不为所有可能的结果保留全局内存(假设你知道**该应用程序最多可以产生100个2x2 int数组,所以只需要在编译时将结果的1600字节内存固定为全局,并给它的函数目标指针应该做它的计算,而不是返回一些不切实际的指向C数组的指针(它通常很快衰减到普通的'int *',失去了以数组类型开始的任何优点)。 – Ped7g

1

眼前的问题:

test_array[2][2]={ {10,20}, {30, 40} }; //defining here - ERROR!! 

没有定义。 test_array定义在myClass。这试图分配给test_array的单个元素,特别是不存在的[2][2]。什么特别冒犯编译器不是越界访问,但={ {10,20}, {30, 40} };试图将数组填充到单个数组元素中。编译器期待一个单一的数字,所以四个数字肯定是过剩的。

不幸的是,我不知道你想做什么的好方法。您可以使用初始化程序列表初始化一个数组,但不能从其中进行分配。

所以

class myClass{ 
public: 

    myClass(); 
    void foo(); 

    int test_array[2][2]; //declaring here! 
}; 

// you can do this: 
myClass::myClass(): test_array{ {10,20}, {30, 40} } 
{ 

} 

void myClass::foo() 
{ 
    // but you can't do this: 
    test_array = { {10,20}, {30, 40} }; 
} 

取决于你做什么test_array,在构造函数初始化可能会为你工作。如果你不得不在每次调用数组重置为foo,也许是一个自动变量是你

void myClass::foo() 
{ 
    int temp_array[2][2] = { {10,20}, {30, 40} }; 

    // use temp_array 

    // maybe copy temp_array to test_array with good ol' memcpy here if you 
    // need to carry the state for some reason. 
} 

更适合沉默的大象在房间里and gain access to std::array, give this a try.注:我从来没有这样做。对我所知的所有人来说,这可能是一场绝对的灾难性灾难,所以拿一粒盐来吧。