Я неправильно использовал memcpy? - PullRequest
0 голосов
/ 05 апреля 2011

в следующем фрагменте я хочу, чтобы функция принимала двойной указатель (двумерный массив), который может иметь любой тип данных (в данном случае, целочисленный), и использовать memcpy для копирования одного элемента массива одновременно в другую переменную. , Он прошел компилятор, но все еще показывает нарушение прав доступа.

Я посмотрел всюду по форуму, но все еще не могу понять это правильно.

Любые советы приветствуются. Я почти опустошен сложностью C.

void ShowImg(void **ptr, IplImage *sample, char window_name[])
{
    int value;
    IplImage *sml_img= cvCreateImage(cvSize(sample->width,sample->height),IPL_DEPTH_8U, 1);
    for(int j=0; j<sample->height; j++)
        for(int i=0; i<sample->width; i++){
            memcpy(&value, ptr+i*sizeof(int)+j*sample->width*sizeof(int), sizeof(int));
            ((uchar *)(sml_img->imageData + sml_img->widthStep*j))[i] = value;
            printf("%d,%d\n", i, j);
        }
    cvNamedWindow(window_name);
    cvShowImage(window_name, sml_img);
    cvWaitKey(0);
    cvDestroyWindow(window_name);
    cvReleaseImage(&sml_img);

}

Ответы [ 2 ]

3 голосов
/ 05 апреля 2011

Я думаю, что здесь есть ошибка: ptr+i*sizeof(int), поскольку ptr имеет тип void** ptr + 1 - следующий элемент, означающий ptr+sizeof(void*), зачем вам умножать его на sizeof (int)?

например:

ptr = 0x00000000, 
sizeof(void*) = 4, 
sizeof(int) = 4
||
\/
ptr+1 = 0x00000004. 
ptr+1*sizeof(int) = 0x00000010.

и я не думаю, что ты этого хочешь. (то же самое о j*sample->width*sizeof(int))

1 голос
/ 05 апреля 2011

memcpy(3) действительно для копирования объектов, которые больше, чем примитивные типы.Вы могли бы заменить эту строку:

memcpy(&value, ptr+i*sizeof(int)+j*sample->width*sizeof(int), sizeof(int));

на эту строку:

value = ptr+i*sizeof(int)+j*sample->width*sizeof(int);

Масштаб sizeof(int) выбрасывает меня;вам это не нужно, если ваши типы данных известны компилятору во время компиляции.Почему ваш массив является void **, а не чем-то более конкретным, с чем может работать компилятор?(int ** было бы неплохо для начала, но я не очень хорош в многомерных массивах в C, поэтому я не уверен, что это было бы лучшей заменой. Но мне не нравится то, что у вас сейчас.*

...