2015-08-21 3 views
1

Этот код не будет компилироваться:Trouble объявления массива с помощью символьной константы

#ifndef RemoteControl_h 
#define RemoteControl_h 

#include "Arduino.h" 

class RemoteControl 
{ 
    public: 
     RemoteControl(); 
     ~RemoteControl(); 

     static void prev_track(); 
     static void next_track(); 
     static void play_pause_track(); 
     static void mute(); 
     static void vol_up(); 
     static void vol_down(); 

     void respond(int code); 
     void add_code(int code, void (*func)()); 
    private: 
     boolean active = true; 
     struct pair { 
      int _code; 
      void (*_func)(); 
     }; 
     const int max = 1000; 
     int database_length = 0; 
     pair database[max]; //This line doesn't compile unless I use a literal constant instead of "max" 

}; 
#endif 

Но если я ставлю ниже раздел в конструкторе для класса вместо этого он работает отлично.

const int max = 1000; 
int database_length = 0; 
pair database[max]; 

Мне не разрешено объявлять массив внутри класса в C++ и использовать виртуальную константу как длину? Я работаю в arduino, если это имеет значение, но я ожидаю, что я не понимаю что-то с языком C++, так как это стандартный .h-файл. О, и проблема не в файле .cpp, потому что я полностью удалил его с теми же результатами: компилируется с постоянной константой, а не с виртуальной постоянной длиной.

ответ

1

В C или C++, попробуйте использовать malloc() в stdlib.h, cstdlib для C++. Не забывайте free()

const int max = 1000; 
struct pair *ptr = malloc(sizeof(pair) * max); // allocated 1000 pairs 
free(ptr); // when the amount of memory is not needed anymore 
+1

arduino не поддерживает использование «нового» ключевого слова, по крайней мере, насколько я могу судить. Для первого примера вы затем предлагаете мне это сделать? \t \t const int max = 1000; \t \t int database_length = 0; \t \t int * ptr = (int *) malloc (sizeof (int) * max); \t \t int database []; \t \t database = ptr; –

+0

, то вы можете использовать 'ptr' как массив @j_v_wow_d – snr

+0

Я немного ржавый. В основном я добавляю смещение к ptr, затем разыгрываю и назначаю это право? Назначьте 3 индексу 2 следующим образом ?: * (ptr + 2) = 3 –

1

Позвольте мне сначала прояснить вам кое-что.

  1. В C, переменная const рассматривается как const -qualified, это не время компиляции постоянное значение (в отличие от целого числа буквального, что время компиляции постоянная величина). Таким образом, в соответствии с правилами стандартной спецификации размера массива в этом случае вы даже не можете использовать переменную const.

  2. В C мы может иметь положение, чтобы использовать VLA, который позволяет нам использовать синтаксис как pair database[max] даже если max не const переменной, но это опять-таки некоторые дополнительная функция компилятора (по C11).

  3. В C++, мы можем использовать переменную const как размер массива, как в C++, A const переменными является постоянная время компиляции.

Таким образом, чтобы ответить на ваш вопрос:

  • В C, ваш код будет нормально, если ваш компилятор поддерживает VLA. и даже если max не const.
  • В C++ нет VLA, но это возможно поддерживается как расширение gnu. Если max - const, все будет в порядке.
+0

компилятор Arduino не поддерживает его в теле класса, как это кажется, но это работает внутри конструктора. –

0

Самое простое решение, чтобы просто взять

const int max = 1000; 

из класса и поставить его выше класса.

Еще лучше было бы, чтобы убедиться, что он является константой во время компиляции, как так:

constexpr int max = 1000; 
Смежные вопросы