2016-05-29 2 views
1

Я пытаюсь получить массив двумерных указателей в вызывающей функции. I называется функцией подмножество из основной функции, то функция подмножества будет возвращать 2D массивполучить 2d-указательный массив в вызывающей функции

int **subsets(int *A, int n1, int *len1) 
{ 
    int **arr; 
    num = pow(2, n1); 
    *len1 = num; 
    arr = (int **) malloc(num * sizeof(int *)); 
    for (i = 0; i < num; i++) 
    { 
     arr[i] = (int *)malloc(sizeof(int)); 
    } 
    return arr; 
} 

указателя В этой функции я заявляю 2D-массив динамически int **arr, а затем пытается получить этот обратный массив в основном функция. Обратите внимание, чем в *len1 я назначаю строки ценят 2D массива и значения столбцов 2D-массива будут различные базы на подмножествах, как для данного array[1,2,3] это будет выглядеть следующим образом:

[ 
    [], 
    [1], 
    [1, 2], 
    [1, 2, 3], 
    [1, 3], 
    [2], 
    [2, 3], 
    [3], 
] 

Я в основном выполняя задачу подмножества, но не в состоянии получить 2D-возвращаемый массив в основной функции, может кто-нибудь, пожалуйста, скажите мне, как получить этот 2D-указательный массив в вызывающей функции.

Цените ответ .. :)


[обновить from comment:]

Это, как я пытался позвонить ей из main функции, но это не так:

int **res = subsets(A, n1, &len1); 

int i = 0, j = 0; 

for(i = 0; i < len1; i++) 
{ 
    for(j = 0; j < n1; j++) 
    { 
     printf("%d", res[i][j]); 
    } 
    printf("\n"); 
} 

Поскольку значение n1 (column) будет отличаться для каждой строки.

+1

«Заметьте, что в * len1 ...» - где именно мы должны были это отметить? –

+0

Не могли бы вы объяснить, для чего (на земле) используется аргумент 'int * A'? –

+0

Кроме того, объясните, что «невозможно получить 2D-возвращаемый массив в основной функции». Где именно в коде, который вы предоставляете, есть ли какие-либо попытки сделать это? Мы должны догадаться, в чем проблема? –

ответ

0

Я не совсем уверен, что вы хотите достичь, но я полагаю, следующий код может помочь вам:

#include <stdio.h> 
#include <stdlib.h> 

int **subsets(int A); 

int main(void) 
{ 
    int **arr = subsets(3); 
    int i, j; 
    for(i = 0; i < 1 << 3; i++) 
    { 
     for(j = 0; arr[i][j]; j++) 
     { 
      printf("%d", arr[i][j]); 
     } 
     putchar('\n'); 
    } 
} 

int **subsets(int A) 
{ 
    int **arr = malloc(sizeof (int *) * (1 << A)); 
    int i; 
    for(i = 0; i < 1 << A; i++) 
    { 
     arr[i] = malloc(sizeof (int) * A); // Can be smaller 
     int *ptr = arr[i]; 
     int j; 
     for(j = 0; j < A; j++) 
     { 
      if(i & (1 << j)) 
      { 
       *ptr++ = j + 1; 
      } 
     } 
     *ptr = 0; 
    } 
    return arr; 
} 

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

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