Что может быть более эффективным способом хранения переменных? - PullRequest
0 голосов
/ 30 сентября 2018

Я работаю над музыкальной программой, которая вызывает заметки из хроматической шкалы на основе интервалов.Эти интервальные переменные (h - полшага, w - всего шага и wh - всего с половиной шага) будут использоваться для определения инерций масштаба (Major = WWHWWWH) и позже будут использоваться для измерения длин интервалов по вектору строк, чтобы потенциальноизмерения выходного сигнала, такие как «3 целых шага и полшага».

Мне интересно, что было бы более эффективным способом хранения простых переменных, поскольку в конечном итоге я хотел бы сделать из них приложение для мобильного телефона ихотите, чтобы на батарее / памяти было как можно проще.,И я все еще учусь.Вот мои мысли:

int H = 1;
int W = 2;
int WH = 3;
Int Fiv = 5;
Int Sev = 7;

или

int H = 1;  
int W = H+H;  
int WH = W + H; 
int Fiv = WH+W; 
int Sev = Fiv + W;

Int H = 1; int W = H*2; int WH = W+H; etc..

Меня в первую очередь интересует, как дифференцирование инициализации повлияет на память и производительность, если вообще будет?

Я знаю, что у меня не должно быть всего в основном, но это незавершенная работа, и я, очевидно, новичок в программировании - поэтому, пожалуйста, посмотрите на макет ... вот код, который в настоящее время используется в..

#include <algorithm> 
#include <iostream>
#include <iterator>
#include <string>
#include <sstream>
#include <vector> 
#include <map>

const std::vector<std::string> st_sharps{"C","C#","D","D#","E","F","F#","G","G#","A","A#","B" };
const std::vector<std::string> st_flats{"C","Db","D","Eb","E","F","Gb","G","Ab","A","Bb","B" };

struct steps{ int maj = 0; int min = 0;} step;
constexpr int H = 1;
constexpr int W = 2;
constexpr int Tre = 3;
constexpr int Fif = 5;
constexpr int Sev = 7;
const int size = st_flats.size();
const std::vector<int> Major = { W, W, H, W, W, W, H };

struct circle{
std::stringstream sharp;
std::stringstream flat;
std::stringstream minor;
std::stringstream dimin; };

struct scales{
circle fifths;
std::stringstream maj;
std::stringstream min; } scale;

int main(){
    //Circle of Fifths
   for (int j = 0; j < size; j++){
        int five = j * Sev;
        scale.fifths.sharp << st_sharps[five % size] << " ";        
        scale.fifths.flat << st_flats[five % size] << " ";
        scale.fifths.minor << st_sharps[((size - Tre) + five) %  size] << " ";
        scale.fifths.dimin << st_sharps[((size - H) + five) % size] << " ";
    }

    std::cout << "Circle of Fifths:\n";
    std::cout << "Major >> Relative Minor >> Diminished " << std::endl;
    std::cout << "Maj: " << scale.fifths.sharp.str() << std::endl;
    std::cout << "Min: " << scale.fifths.minor.str() << std::endl;
    std::cout << "Dim: " << scale.fifths.dimin.str() << std::endl;
    std::cout << "\nflats: " << scale.fifths.flat.str() << "\n" << std::endl;

    //Major and Minor Scales
    for (int i = 0; i < Major.size(); i++) {
        scale.maj << st_sharps[step.maj] << " ";
        scale.min << st_flats[((size - Tre) + step.min) % size] << " ";
        step.maj += Major[i];
        step.min += Major[(i + Fif) % Major.size()];
    }
    std::cout << "C Major:\n" << scale.maj.str() << "\n" << std::endl;
    std::cout << "A Minor:\n" << scale.min.str() << "\n" << std::endl;
    return 0;
}

1 Ответ

0 голосов
/ 30 сентября 2018

Я бы лучше выбрал версию, в которой "W" - двойная буква "H" ".Поэтому мой предпочтительный способ будет таким:

constexpr int H = 1;
constexpr int W = 2*H;
constexpr int WH = W+H;

Обратите внимание, что ваша версия int W = H++ не та, что вы, вероятно, намереваетесь, поскольку H++ не равен H+1;на самом деле оно равно int W = H; H = H + 1.

...