2015-03-26 2 views
0

Я пытаюсь правильно назначить указатель из программ **argv. Когда я назначаю data в основной функции, он работает нормально, но когда я пытаюсь поместить эту логику в отдельную функцию, это не так.Назначить указатель из argv в функции

Что я здесь делаю неправильно?

void parse_args(char *argv[ ], unsigned char *data, *data_len, *nprocs){ 

    data = (unsigned char *)argv[1]; 
    *data_len = strlen(argv[1]); 
    *nprocs = atoi(argv[2]); 
} 

int main(int argc, char **argv) { 
    unsigned char *data; 
    int data_len; 
    int nprocs; 

    // this doesnt work (for data) 
    parse_args(argv, data, &data_len, &nprocs) 

    // this works (for data) 
    data = (unsigned char *)argv[1]; 
} 

ответ

1

ваша функция должна быть принята char * [] (что эквивалентно char** в качестве аргумента Спецификация). Вы не должны указать тип при вызове функции, которые должны были дать вам ошибку компилятора (char * не будет использоваться здесь!)

// this doesnt work (for data) 
parse_args(char *argv, data, &data_len) 

должен быть заменен

parse_args(argv, data, &data_len) 

Итак, Затем вы передаете указатель data, но вы передаете этот указатель по значению, т. е. ваш parse_args получает хорошую копию этого указателя (который, технически, является просто адресом, хранящимся в переменной), а затем вы изменяете эту копию. Вы можете передать его как data_len:

void parse_args(char *argv[ ], unsigned char **data, *data_len, *nprocs){ 
.. 
parse_args(argv, &data, &data_len, &nprocs) 

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

+0

Argh Я не видел «адрес» перед данными! Работаю сейчас. Если бы у меня было больше времени, я бы исследовал то, о чем вы говорили. @Marcus üller – ojhawkins

2

Эта линия

data = (unsigned char *)argv[1]; 

изменяет локальную копию main «s местного data, поскольку все параметры, включая указатели, которые передаются по значению. Если вы хотели бы изменить data внутри main, передать его через указатель (то есть вам нужен указатель на указатель сейчас):

void parse_args(char *argv[ ], unsigned char **data_ptr, int *nprocs) { 
    ... 
    *(data_ptr) = (unsigned char *)argv[1]; 
    ... 
} 
+0

пытается сейчас @dasblinkenlight – ojhawkins