2012-03-07 5 views
1

Я работаю с некоторыми действительно большими кубами изображения, которые являются x * y * z в измерении.3d массив, проходящий по ссылке в C

В настоящее время я занимаюсь с ними как таковой

int ***input = malloc(sizeof(int **)*(lines)); 
int d; 
int i; 
for(i = 0 ; i<lines ; i++) { 
    input[i] = malloc(sizeof(int *)*bands); 

    for(d = 0 ; d<bands ; d++) { 
     *input[i][d] = malloc(sizeof(int)*(samples)); 
    } 
} 

Это работало отлично для меня, но теперь я переписывать некоторые из кода и хотели бы иметь возможность передать массив по ссылке

Я думал сделать это необходимо мне прохождение таких как foo(&input)

где функция выглядит следующим образом:

foo(int ****input) { 
    *input = malloc(sizeof(int **)*(lines)); 
    int d; 
    int i; 
    for(i = 0 ; i<lines ; i++) { 
     *input[i] = malloc(sizeof(int *)*bands); 

     for(d = 0 ; d<bands ; d++) { 
      *input[i][d] = malloc(sizeof(int)*(samples)); 
     } 

    } 
} 

Однако я, кажется, получаю seg-ошибки после того, как он вступает в первый цикл for(i...). Любые предложения были бы очень полезными, спасибо.

+0

'int **** input' ... o_O – Mankarse

+1

В C нет« передачи по ссылке », вы всегда проходите по значению. В этом случае ваше значение является указателем. Семантика, может быть, но может помочь вам лучше понять, что вы делаете ... Кроме того, вы считали «typedef's? Ах, и, пожалуйста, проверьте неудачи 'malloc', пожалуйста! – littleadv

+0

@ Mankarse lol, я знаю, это кажется смешным, но разве это не правильный синтаксис? – Ponml

ответ

5

Это нормально, когда входной указатель на 3D вектора:

/* original */ 
input[i] = malloc(sizeof(int *)*bands); 

Когда вход становится Int ****: указатель на вектор указатель, это изменение неверно:

/* original */ 
*input[i] = malloc(sizeof(int *)*bands); 

Вы хотите:

/* original */ 
(*input)[i] = malloc(sizeof(int *)*bands); 

В C *x[y] означает *(x[y]).

Намного проще всего было бы использовать локальную переменную:

void function(int ****pinput) 
{ 
    int ***input = malloc(/* ... */); 
    /*...code stays the same as before...*/ 
    *pinput = input; /* place it in the location specified by caller */ 
} 

Кроме того, давайте сделаем несколько стилистические коррективы в оригинале. (Не обращая внимания на отсутствие проверки отказа таНоса):

int ***input = malloc(lines * sizeof *input); 

int d; 
int i; 

for(i = 0 ; i<lines ; i++) { 
    input[i] = malloc(bands * sizeof *input[0]); 

    /* Noticed an error here: you have *input[i][d] = ... 
     but input[i][d] the pointer to the band; 
     *input[i][d] is input[i][d][0]! */ 
    for(d = 0 ; d<bands ; d++) 
     input[i][d] = malloc(samples * sizeof *input[0][0]); 
} 

Я просто взял некоторые ненужные скобки и изменил расчет SIZEOF так, что вместо того, чтобы повторять (int **), и т.д., он базируется типом выражения указателя быть назначен к.

+0

+1. Индекс имеет приоритет над де-ссылкой. Http: //en.cppreference.com/w/cpp/language/operator_precedence – littleadv

+0

Или, в более общем плане, постфиксные операторы имеют более высокий приоритет, чем унарный. – Kaz

+0

Большое спасибо, я испытаю это, когда смогу вернуться к рабочему коду. Приветствия. – Ponml

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