2009-12-28 2 views
0

привет У меня есть следующий код ...с размером одного массива в другой

int *a, *b; 
    int *d; 
    int N = 2000; 
    size_t size = N*sizeof(int); 

    a = (int *) malloc(size); 
    b = (int *) malloc(size); 
    ... 
    cudaMalloc((void **) &d, size); 

это работает просто отлично ... Теперь предположим, я следующий

char **t = malloc(2000* sizeof *t); 
    for(...) 
    { 
    ... 
    t[i] = (char *)malloc(sizeof(char)*changing_length); 
    ... 
    } 

как сделать cudaMalloc для t, как если бы он был одномерным массивом (с учетом того, что каждый элемент имеет разный размер)?

ответ

1

Если у вас есть регулярный 2D массив символов вы можете рассчитать размер с ...

width * height * sizeof(char) 

Если у вас есть нерегулярный 2D массив (некоторые строки имеют разную длину), то вам придется либо отслеживать общее количество символов в другом месте или прокручивать и подсчитывать, сколько символов у вас есть до того, как вы сделаете cudaMalloc.

+0

так вы имеете в виду, если, например, у меня есть 200 элементов, а общее количество символов всех тезисов элементов, скажем, равна N, то размер size_t = 200 * N * SizeOf (Char); ? – asel

+0

Я так думаю. Я думаю о цифровой картинке 1024x1024. Он имеет 1024 строки, и каждая строка имеет 1024 элемента. Общее количество элементов - 1024 * 1024. – Pace

+0

скажем, у меня есть следующее изображение, где у моего массива всего три элемента. a [0] хранит 15 символов, а [1] хранит 3 символа, а [2] хранит 5 символов. Таким образом, общее число элементов становится равным 15 + 3 + 5. Это? Или это (15 + 3 + 5) * sizeof (char)? – asel

0

Если я вас правильно понимаю, вы просто должны таНосом СУММЫ все меньшего mallocs

char** t = malloc(2000 * sizeof(*t) + sizeof(char)*sum_of_changing_lengths); 

Тогда установка т [х], чтобы указать на более поздние части распределения

char *p = (char*)(&t[2000]); 
for (...) 
{ 
    t[i] = p; 
    p += changing_length; 
} 
0

Я думаю, вы смотрите, как получить адрес указателя t [i]. Так как я не уверен в порядке оценки, я бы попробовал &(t[i]), однако &t[i] тоже должен работать. Если оба не работают, вам нужно самостоятельно определить позицию указателя. Это будет что-то вроде &t + i*sizeof *t

char **t = malloc(2000* sizeof *t); 
for(...) 
{ 
    ... 
    cudaMalloc((void **) &(t[i]), sizeof(char)*changing_length); 
    ... 
} 
Смежные вопросы