2016-08-23 4 views
0

Я определил массив как это:Как скопировать массив

uint8_t brightnessvariants[4][101]={{1,2,...},{3,4,...},{5,6,...},{7,8,...}}; 

Теперь для моего приложения я должен заполнить еще один массив с одним из 4-х массивов:

uint8_t brightnesstable[] = brightnessvariants[index][]; 

Но что Безразлично Не работай. Index отсчитывается от 0 до 3.

brightnesstable и brightnessvariants определены в файле заголовка, как экстерном

Как я могу сделать это правильно?

+0

Зачем вам это нужно? – EOF

+0

просто используйте петлю для доступа к содержимому подмассива и скопируйте каждое значение в новый массив. –

+2

@johnelemans: Что случилось с 'memcpy'? – Olaf

ответ

1

Просто сделать

uint8_t brightnesstable[101]; 
memcpy(brightnessstable, brightnessvariants[index], 101*sizeof(uint8_t)); 

brightnessvariants[index] является адрес первого элемента в (index+1)nth строке и число байтов, которые вы хотите скопировать в ROWSIZE*sizeof(ITEM_SIZE).

+0

Предложить «memcpy (яркость, brightvariants [index], sizeof brightnesstable); – chux

1

Это действительно зависит от того, что вам нужно сделать. Если вам нужно создать отдельное хранилище для дублирования одной из строк brightnessvariants, вы можете просто объявить отдельный массив и скопировать значения, как описано в комментариях и другом ответе.

Если вам просто нужно получить доступ к одной из строк brightnessvariants в текущей области, тогда нет необходимости в отдельном хранилище и копировании. Все, что требуется, - объявить указатель и назначить начальный адрес нужной строки. Затем вы можете получить доступ к нужной строке brightnessvariants, как если бы это был отдельный массив. например

uint8_t brightnessvariants[4][101] = {{0}}, *btable = NULL; 

Выше btable (короткий для brightnesstable) просто uint8_t указатель. Ему может быть присвоен адрес любой из строк в brightnessvariants. например для второго ряда

btable = brightnessvariants[1]; 

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

#include <stdio.h> 
#include <stdint.h> 

int main (void) { 

    uint8_t brightnessvariants[4][101] = {{0}}, *btable = NULL; 
    int nrows = sizeof brightnessvariants/sizeof *brightnessvariants; 

    for (int i = 0; i < 101; i++) { 
     brightnessvariants[0][i] = i + 1; 
     brightnessvariants[1][i] = i + 3; 
     brightnessvariants[2][i] = i + 5; 
     brightnessvariants[3][i] = i + 7; 
    } 

    for (int i = 0; i < nrows; i++) { 
     printf ("\nbrightnesstable[%d] :\n\n", i); 
     btable = brightnessvariants[i]; 
     for (int j = 0; j < 101; j++) { 
      if (j && j % 10 == 0) putchar ('\n'); 
      printf (" %3hhu", btable[j]); 
     } 
     putchar ('\n'); 
    } 

    return 0; 
} 

Пример использования/вывода

$ ./bin/ptrtobtable 

brightnesstable[0] : 

    1 2 3 4 5 6 7 8 9 10 
    11 12 13 14 15 16 17 18 19 20 
    21 22 23 24 25 26 27 28 29 30 
    31 32 33 34 35 36 37 38 39 40 
    41 42 43 44 45 46 47 48 49 50 
    51 52 53 54 55 56 57 58 59 60 
    61 62 63 64 65 66 67 68 69 70 
    71 72 73 74 75 76 77 78 79 80 
    81 82 83 84 85 86 87 88 89 90 
    91 92 93 94 95 96 97 98 99 100 
101 

brightnesstable[1] : 

    3 4 5 6 7 8 9 10 11 12 
    13 14 15 16 17 18 19 20 21 22 
    23 24 25 26 27 28 29 30 31 32 
    33 34 35 36 37 38 39 40 41 42 
    43 44 45 46 47 48 49 50 51 52 
    53 54 55 56 57 58 59 60 61 62 
    63 64 65 66 67 68 69 70 71 72 
    73 74 75 76 77 78 79 80 81 82 
    83 84 85 86 87 88 89 90 91 92 
    93 94 95 96 97 98 99 100 101 102 
103 

brightnesstable[2] : 

    5 6 7 8 9 10 11 12 13 14 
    15 16 17 18 19 20 21 22 23 24 
    25 26 27 28 29 30 31 32 33 34 
    35 36 37 38 39 40 41 42 43 44 
    45 46 47 48 49 50 51 52 53 54 
    55 56 57 58 59 60 61 62 63 64 
    65 66 67 68 69 70 71 72 73 74 
    75 76 77 78 79 80 81 82 83 84 
    85 86 87 88 89 90 91 92 93 94 
    95 96 97 98 99 100 101 102 103 104 
105 

brightnesstable[3] : 

    7 8 9 10 11 12 13 14 15 16 
    17 18 19 20 21 22 23 24 25 26 
    27 28 29 30 31 32 33 34 35 36 
    37 38 39 40 41 42 43 44 45 46 
    47 48 49 50 51 52 53 54 55 56 
    57 58 59 60 61 62 63 64 65 66 
    67 68 69 70 71 72 73 74 75 76 
    77 78 79 80 81 82 83 84 85 86 
    87 88 89 90 91 92 93 94 95 96 
    97 98 99 100 101 102 103 104 105 106 
107 

Посмотрите вещи снова и дайте мне знать, если у вас есть какие-либо вопросы. Если вам нужен пример копирования вместо использования указателя, дайте мне знать, и я буду рад помочь.

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