2014-02-13 2 views
-1

Так, в JavaScript (CoffeeScript), у меня есть некоторый код, который выглядит следующим образом:как заполнить массив переменных длины строк

"BRIGHT": 
    min: 1 
    max: 4 
    step: 1 
    value: 3 

bluetooth: 
    options: [ 'off', 'on' ] # SOMETIMES I NEED ARRAY 
    callback: -> 
    rangeFinder.bluetooth = rangeFinder.getSetting().value 

mode: 
    options: [ 'basic', 'advanced', 'config' ] # OF DIFFERENT LENGTHS 
    callback: -> 
    rangeFinder.lastMode = rangeFinder.getSetting().value 

Как сделать что-то подобное в C++?

У меня есть массив из 3-х объектов, подобных яркость

#include "setting.cpp" 

class GlobalMenu { 

    public: 

    MenuSetting settings[3]; 
    int setting; 
    GlobalMenu(); 

}; 

GlobalMenu::GlobalMenu(void){ 

    // What is the currently selected setting? 
    this -> setting = 0; 

    this -> settings[0].name = "BRIGHT"; 
    this -> settings[0].min = 1; 
    this -> settings[0].max = 4; 
    this -> settings[0].step = 1; 
    this -> settings[0].value = 3; 

    this -> settings[1].name = "BLUETOOTH"; 
    // HOW DO I GET VARIABLE LENGTH ARRAYS HERE? 

} 

и setting.cpp

class MenuSetting { 

    public: 

    char *name; 
    int min; 
    char options[][5]; 
    int max; 
    int step; 
    int value; 

}; 

где-то еще, этот код изменяет настройки (и работу)

void RangeFinder::changeSetting(int dir) { 

    this -> data.global.settings[this -> data.global.setting].value += 
    (dir ? 1 : -1) * 
    this -> data.global.settings[this -> data.global.setting].step; 

    this -> enforceMinMax(); 

    this -> render(); 
} 

также если вы можете найти способ его очистки u р, который поможет

Таким образом, я, вероятно, может понять, как определить, если опции имеет длину, но у меня возникают проблемы, назначая любое количество опций в массиве опций

Решение не может использовать STD.

Насколько я знаю, микроконтроллер atmega32 не может использовать std lib.

+1

Вопрос был с двумя тегами с C и C++; теперь он был изменен, поэтому он помечен только C, основанный на обсуждении в комментариях к [Zac Howland] (http://stackoverflow.com/users/529761/zac-howland) [ответ] (http: //stackoverflow.com/a/21765997/15168). Очевидно, что код в вопросе должен быть C++ ('class GlobalMenu'), который оставляет тег C выглядящим странным. Все очень смутно! –

+0

его не помечено знаком c в любом из моих прав. его C++. – Funkodebat

ответ

0

Лучшие вариантов для вас, чтобы избежать несколько ошибок вы перешедшие:

  1. Использования зОго :: строки вместо символьных указателей и буфера
  2. Использования станд :: вектор вместо компилятора размера массивы

Это сделает ваш класс выглядеть:

class MenuSetting 
{ 
public: 
    std::string name; 
    int min; 
    std::vector<std::string> options; 
    int max; 
    int step; 
    int value; 
}; 

Вы можете найти информацию о том, как различные операции как для std::string, так и для std::vector.

+0

Я избегал использования std, потому что он не найден, когда я его включаю. – Funkodebat

+0

Вы должны указать '' и' 'и ** not ** иметь' using namespace std; 'объявлено, если вы хотите использовать' std :: string'. –

+0

он не находит '' он может найти string.h, но тогда std не имеет строки. Я не уверен, что это связано с моим make-файлом, я приложил его к вопросу – Funkodebat

2

В C++ канонического способа обработки массива переменного размера является использование vector

std::vector<std::string> options; 

options.push_back("First option"); 
options.push_back("Second option"); 
options.push_back("Third option"); 

, то вы можете использовать options.size() знать, сколько элементов есть.

Вы также сделаете одолжение, прочитав good C++ book от обложки до крышки, прежде чем начинать использовать этот язык. C++ не является правильным языком, чтобы узнать экспериментально по нескольким причинам, наиболее важными из которых являются:

  1. иногда C++ является нелогичным (из-за своей истории) и независимо от того, насколько вы умны, вы не можете угадать историю. Вам нужно изучить его.
  2. , когда вы совершаете ошибку, вы не можете рассчитывать на язык, который вам поможет (нет ангелов с ошибками во время выполнения, только демонов неопределенного поведения).
0

его невозможно ... ответ заключается в том, чтобы создавать операторы case и hard code more.

0

Самый простой способ будет использовать массив указателей
и не забудьте удалить указатели;)

class MenuSetting { 

public: 

char *name; 
int min; 
char* options[5]; 
int max; 
int step; 
int value; 

}; 

, то вы можете присвоить ему этот путь

bool MenuSetting::setOption(char *str, unsigned int pos) 
{ 
    if(c && p <5) 
    { 
     options[pos]=str; 
     return true; 
    } 
    return false; 
} 

Я думаю, поможет вам больше всего, если вы использовали умный указатель (простой не так уж сложно реализовать) и я думаю, вы можете сослаться на этот сайт Implementing a simple smart pointer in C++ для пример.

Также я думаю, что этот ответ будет работать для вас https://stackoverflow.com/a/279032/2689696

+0

'options [] [5]' означает список опций с неизвестной длиной, содержащий много строк длиной 5. так..[ «На», «от»] или [ «да», «нет», «может быть»] – Funkodebat

+0

вы можете сделать класс для вариантов вместо гольца сказать 'опции класса { частного: символа * строки [/ * Некоторые размеры * /]; int numberOfStrings; public: int getNoOfString(); char * getString (индекс int); bool setStringIndex // blah blah blah } ' или что-то лучше;) – tejas

0

Вы действительно должны использовать стандартную библиотеку шаблонов. Это сделает вашу жизнь намного более значимой, и у вас будет много свободного времени, чтобы задокументировать ваш код! С последними библиотек Std, и C++ 11, код может быть упрощен, чтобы выглядеть чистым, как Фрагмент кода JavaScript:

#include <string> 
#include <vector> 

std::vector<std::string> bluetoothOptions = {"on", "off"}; 
std::vector<std::string> modeOptions  = {"basic", "advanced", "config"}; 

// Example usage: 
assert (bluetoothOptions[1] == "off"); // exanple to access strings by index 
assert (modeOptions.size() == 3);  // example to determine size of vector 

Если вы хотите обеспечить, чтобы эти строки и векторы не могут изменить, а затем использовать следующие (это было бы моим преимуществом):

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