2016-02-18 3 views
0

Я искал много ресурсов на C++ и массивах. Я узнал, что массивы действуют как указатели в C++, и я смущен тем, как создавать многомерный массив и присваивать значение индексам. Я обычно код в Java и Python, но знаю, что я работаю с Arduino, и мне нужно изучить C++.Arduino - Создание массива из экземпляров и назначение значения [C++]

Мой Arduino (с ++) код относительно этого массива:

#include "Arduino.h" 
#include "cell.h" 
#include <cell.h> 

cell maze[16][16]; 
cell * current = new cell(1, 1, 0, false, 0); 
cell * end_pt = new cell(1,1,1,true); 
maze[15][15] = end_pt; 

Мои .h и .cpp файлы;

#include "Arduino.h" 
#include "cell.h" 

#include "Arduino.h" 

cell::cell(){ 
    right = 0; 
} 

cell::cell(int r, int l, int f, bool inf){ 
    right = r; 
    left = l; 
    forw = f; 
    info = inf; 
    value = 70; 
    printf("%d\n", right); 
    printf("%d\n", left); 
    printf("%d\n", forw); 
    printf("%d\n", inf); 
    printf("%d\n", val); 
} 

cell::cell(int r, int l, int f, bool inf, int val){ 
    right = r; 
    left = l; 
    forw = f; 
    info = inf; 
    value = val; 
    printf("%d\n", right); 
    printf("%d\n", left); 
    printf("%d\n", forw); 
    printf("%d\n", inf); 
    printf("%d\n", val); 
} 

void cell::setR(int r){ 
    right = r; 
} 
void cell::setL(int l){ 
    left = l; 
} 
void cell::setF(int f){ 
    forw = f; 
} 
void cell::setI(bool inf){ 
    info = inf; 
} 
void cell::setV(int val){ 
    value = val; 
} 
int cell::getR(){ 
    return right; 
} 
int cell::getL(){ 
    return left; 
} 
int cell::getF(){ 
    return forw; 
} 
bool cell::getI(){ 
    return info; 
} 
int cell::getV(){ 
    return value; 
} 


#ifndef cell_h 
#define cell_h 

#include "Arduino.h" 
class cell{ 
    public: 
    cell(); 
    cell(int r, int l, int f, bool info); 
    cell(int r, int l, int f, bool info, int val); 
    void setR(int r); 
    void setL(int l); 
    void setF(int f); 
    void setI(bool inf); 
    void setV(int val); 
    int getR(); 
    int getL(); 
    int getF(); 
    bool getI(); 
    int getV(); 
    private: 
    int right; 
    int left; 
    int forw; 
    bool info; 
    int value; 
}; 

#endif 

'лабиринт' не назвал тип моей ошибкой. Пожалуйста, помогите и спасибо вам заранее!

ответ

1

Там проблема с этой линии:
maze[15][15] = end_pt;

maze[15][15] и любой другой объект в лабиринте, имеет тип cell
end_pt имеет тип cell*

Это означает, что вы пытаетесь присвоить два Различные типы.

Вместо этого:

cell end = cell(1,1,1,true); 
maze[15][15] = end; 

или просто

maze[15][15] = cell(1,1,1,true); 

Поскольку вы используете C++, подумайте в std::array вместо. И избегайте новых/удалять, когда это возможно.

+0

Когда я удалить звездочки, то у меня есть/скалярная задача нескалярной. Что это значит? –

+0

@MertKarakas Я предполагаю, что ваш код по-прежнему выглядит так: 'cell end_pt = new cell (1,1,1, true);'? Удалите ключевое слово 'new'. 'new' создает указатель. – DeathTails

+0

@DeathTails вы уверены, что можете скопировать два объекта? Я думаю, вы должны перегрузить оператор =, чтобы иметь возможность копировать их таким образом. – frarugi87

1

«лабиринт» не называет тип

В самом деле, «лабиринт» не называет тип. Это, действительно, объект.

На других языках вы можете писать инструкции вне функций, так как все тело файла считается «функцией». В C, однако, внешние функции вы можете писать декларации и определения глобальных переменных. Вы должны были написать:

#include "Arduino.h" 
#include "cell.h" 
#include <cell.h> 

cell maze[16][16]; 
cell * current = new cell(1, 1, 0, false, 0); 
cell * end_pt = new cell(1,1,1,true); 

void setup() 
{ 
    maze[15][15] = end_pt; 
} 

Теперь, как указывалось в другом ответе, вы не можете назначить указатель на значение. Если вы хотите сохранить лабиринты в качестве матрицы клеток, вы должны скопировать значение руку об руке:

void copyCell(cell *dst, cell src) 
{ 
    dst->right = src.right; 
    dst->left = src.left; 
    dst->forw = src.forw; 
    dst->info = src.info; 
    dst->value = src.value; 
} 

void setup() 
{ 
    copyCell(&(maze[15][15]), end_pt); 
} 

(или лучше просто включить функцию копирования в классе)

ИЛИ объявить лабиринт как клетка указатели матрица:

cell *maze[16][16]; 

Это зависит от того, как вы хотите реализовать программу

Смежные вопросы