2011-12-20 4 views
0

У меня есть следующая проблема: вызывается следующая функция с конфликтом, инициализированным значением NULL.Передача указателя на массив указателей в качестве параметра

В конце foo конфликт принимает правильные значения. В случае этого примера * конфликт должен содержать значения 4, 8 и 2. Что он делает, в соответствии с fprintfs.

Однако, когда я снова тестирую функцию, вызывающую foo (см. Второй фрагмент кода), массив конфликтов не был изменен. Я не уверен, почему, поскольку я передаю указатель на массив, тем более, что этот метод хорошо работает для multiDB и рекурсивных указателей. Любая помощь будет оценена по достоинству. (кстати, это не полный код, я только показал соответствующие части). Благодаря!

int foo(
    /*==================*/ 
    uchar* buf, 
    uint* multiDB, 
    uint* recursive, 
    uint** conflict) { 

select_consistent= conflict; 
bool finished; 

if (((start_of_scan == 1) && (*multiDB != 1)) || ((start_of_scan== 0) && (select_consistent == NULL))) { 
    fprintf(stderr, "Not doing select consistent \n "); 

    finished = TRUE; 
} 
else { 
    *multiDB=0; 
    fprintf(stderr, "Doing select consistent \n "); 
    finished = FALSE; 
    uint n; 
    int i = 0 ; 
    if (select_consistent == NULL) { /*This is the first round */ 
      next_round = FALSE; 
     fp = popen("./algorithm '[t(1,[t(2,||),t(3,[t(8,||),t(10,||)])]).t(1,[t(4,||),t(6,||)]).t(1,[t(2,||),t(7,||)])]'", "r"); /* Issue the command.  */ 
     finished = FALSE; 
    } 
    if (next_round == TRUE) { 
     goto parse_records; 
    } 

     fscanf(fp, "%lu", &n); 
     uint* conflict_ ; 
     if (n!=0) conflict_ = (uint*) malloc(sizeof (uint) * n); 
     conflict = &conflict_; 
     next_round = TRUE; 
     int j= 0 ; 
     while (fscanf(fp, "%lu", &n) != EOF) { 
      if (n == 0) { 
       select_consistent=conflict; 
       goto parse_records; 
      } 
      else { 
       (*conflict)[j] = n; 
      } 
      i++; 
      j++; 

     } 
     finished = TRUE;  
} 
parse_records:; 
int error; 

.... [other code] foo2(multiDB, recursive); 

fprintf(stderr, "Array states %lu %lu \n ", (*conflict)[0], (*conflict)[1]); 
fprintf(stderr, "Array states %lu %lu \n ", (*select_consistent)[0], (*select_consistent)[1]); 



return error 
} 

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

uint** conflict = NULL ; 
    error = foo(buf, multiDB, recursive, conflict); 
    fprintf(stderr, "value is %lu \n", (*conflict)[0]); //This is still unitialised. 

ответ

0

Оказывается, что код имеет некоторые проблемы указатель косвенного предоставления. Похоже, что предназначен для одномерного массива uint. Если да, то начальная декларация должна быть:

uint* conflict = NULL; 

Затем передать его так:

foo(... &conflict); 

Затем в foo передать его следующим образом:

*conflict = (uint*)malloc(...); 

Или, если вы все еще хотите для использования conflict_, назначьте его следующим образом:

*conflict = conflict_; 
Смежные вопросы