2015-04-26 2 views
1

Я в значительной степени новичок с C++ и с трудом прокладываю себе путь через указатели.Получите строку из динамически выделенного двумерного указателя массива

//Define Colormaps (for brevity they are null) 
//256 rgb combinations in each colorMap 
uint8_t colorMap0[256][3]; 
uint8_t colorMap1[256][3]; 
//Insert Color Maps in to a storage array via pointer 
uint8_t *colorMaps[] = {*colorMap0, *colorMap1}; 

//Well define a current Map Index to read from colorMaps 
uint8_t colorMapIndex = 0; 
//We will define a pointer to the active array that we'll update in loop() 
uint8_t *currentColorMap; 

Иногда мы переназначить текущую карту цвета

currentColorMap = colorMaps[colorMapIndex]; 

и другие времена также получить значения из него

uint32_t c = GetColorFromMap(125); 

Мы нужны эти функции, а

// Create a 24 bit color value from B,G,R 
uint32_t Color(uint8_t r, uint8_t g, uint8_t b) 
{ 
    uint32_t c; 
    c = r; 
    c <<= 8; 
    c |= g; 
    c <<= 8; 
    c |= b; 
    return c; 
} 

uint32_t GetColorFromMap(byte indexValue) 
{ 
    uint8_t rgb = currentColorMap[indexValue]; 
    return Color(rgb[0], rgb[1], rgb[2]); 
} 

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

Текущий код дает мне 3 'invalid types 'uint8_t {aka unsigned char}[int]' for array subscript' ошибок в return Color(rgb[0],....

Я попытался указатели от currentColorMap но получить:

invalid type argument of unary '*' (have 'uint8_t {aka unsigned char}') 

Я должен использовать soultion с низкой печати ножной памяти, как это происходит на Arduino. Раньше я делал массив размером 256x3, который убивал мою динамическую память ... однако это скомпилировано. Если это не одно, то другое!

+1

Вы должны начать с обучения, что С и С ++ являются разными языками, C++ просто нравится чувствовать себя с, но она не может, с лучше. Поэтому, пожалуйста, выберите язык. И я предлагаю c, потому что, если вы выберете C++, они скажут вам использовать 'std ::' stuff. –

+0

Код C может быть скомпилирован как C++; они являются фундаментально родственными языками: их называют аналогично по причине.Кроме того, для CodeMode, я думаю, вы хорошо осведомлены о предмете, но, надеюсь, вы не будете выбирать язык, основанный на какой-то случайной необоснованной жалобе. Надеюсь, если вы изучите его, вы будете исследовать их обоих. – Cosine

+0

@iharob Технически среда разработки arduino - это C++, но я бы предпочел родное решение C, поскольку я боюсь так называемого std :: stuff – CodeMode

ответ

2

В C/C++ многомерный массив на самом деле не представляет собой набор из двух массивов, как на некоторых других языках. Скорее, int arr[a][b] - это то же самое, что и int arr[a*b], за исключением того, что он будет выполнять некоторую математику за кулисами. Если вы думаете об этом, это происходит с математической точки зрения. В частности, она позволяет писать int arr[x][y], который будет делать следующую операцию:

int arr[x*b+y] 

Подумайте об этом так: у вас есть каждый x ряд друг за другом, который каждый заполняется y с. Поэтому, если вы идете по длине строки x, вы можете получить доступ к этой конкретной записи. Итак, в вашем примере rgb равен indexValue-му цвету байт, который не является полным цветом.

Однако есть проблемы. У вас есть указатель currentColorMap, который является массивом, который вы сейчас хотите использовать. Но при копировании многомерного массива в указатель компилятор «забывает», каким он был. Таким образом, вы должны сделать для этого простую работу.

uint8_t *rgb = currentColorMap + indexValue * 3; 

Что мы здесь делаем? Мы просто принимаем указатель из currentColorMap и добавляем три раза индекс. Почему три раза? Потому что ваше второе измерение равно трем или потому, что есть три байта на цвет. Тогда ваш цвет на самом деле является указателем на реальный цвет. Теперь вы можете обращаться с ней, как вы делали раньше:

return Color(rgb[0], rgb[1], rgb[2]); 
+1

Чувак вы рок! Я склоняюсь перед вашим величием :) Я обнаружил, что 'return Color (rgb [index] [0] ....)' не работал, но второе решение получилось! – CodeMode

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