2015-03-31 13 views
-4

Я создал переменную char, называемую str, и я пытаюсь передать ее в функцию. Я продолжаю получать error cannot convert char (*)[1000] to char **. Я знаю, что для cannot convert char to char * вы просто используете & перед символом, но я не могу понять, что делать в этом случае. Я искал стек и Google и не повезло. Есть идеи?не может преобразовать char (*) [1000] в char **

char str2[1000]; 
      strcpy(str2, "/home/"); 
     strcat(str2, pw->pw_name); 
     strcat(str2, "/Documents/test4.txt"); 


    char bufTest[512]; 
    int link = GetSymbolicLinkTarget(&str2, bufTest, sizeof(bufTest)); 

Вот функция

int GetSymbolicLinkTarget(char *argv[], char *buf, size_t buf_size){ 
    int count = readlink(argv[1], buf, buf_size); 
    if (count >= 0) { 
     buf[count] = '\0'; 
    } 
    return count; 
} 
+0

"Я создал переменную char, называемую' str', и я пытаюсь передать ее в функцию "- какая функция? Единственными функциями, которые вы передаете в своем коде, являются 'strcpy()' и 'strcat()', ни одно из которых не может дать вам это сообщение об ошибке. –

+0

char * argv [] означает двумерный массив. Вы не можете преобразовать в char **, поскольку оба они разные. –

+0

Моей идеей было бы: если вы собираетесь писать C++, напишите реальный C++. Я бы начал с: 'std :: string GetSymbolicLinkTarget (std :: string const & input);' –

ответ

3

Основная проблема заключается в том, что тип первого аргумента GetSymbolicLinkTarget равен char* [] - массив указателей на символ.

Тип &str is char (*)[1000] - указатель на массив из 1000 знаков.

Это несоответствие, о котором говорит компилятор.

Вы можете решить, используя различные способы:

Вариант 1

Изменить тип первого аргумента GetSymbolicLinkTarget.

int GetSymbolicLinkTarget(char *argv, char *buf, size_t buf_size){ 

Это потребует изменений в использовании функции argv.

Затем, вы можете просто использовать:

GetSymbolicLinkTarget(str2, bufTest, sizeof(bufTest)); 

Вариант 2

Изменить тип первого аргумента GetSymbolicLinkTarget.

int GetSymbolicLinkTarget(char (*)argv[1000], char *buf, size_t buf_size){ 

Это также потребует внесения изменений в том, как использовать argv в функции.

Затем, вы можете использовать:

GetSymbolicLinkTarget(&str2, bufTest, sizeof(bufTest)); 

Вариант 3

Используйте переменную обертку в вызывающей функции.

char* argv[2] = {0}; 
argv[1] = str2; 
GetSymbolicLinkTarget(argv, bufTest, sizeof(bufTest)); 

Это не потребует каких-либо изменений, как использовать argv в функции.

+0

Спасибо, я искал обходное решение, подобное этому. – Aaron

0
int GetSymbolicLinkTarget(char *argv[], char *buf, size_t buf_size){ 
    int count = readlink(argv[1], buf, buf_size); 
    if (count >= 0) { 
     buf[count] = '\0'; 
    } 
    return count; 
} 

Weird. Эта функция принимает массив строк в качестве первого параметра, а затем смотрит только на второй. Итак, давайте создадим массив строк, где строка, которую мы хотим, чтобы это смотреть на это второй один:

... 
char* p[2]; 
p[1] = bufTest; 
GetSymbolicLinkTarget(p, ...); 

И там вы идете. Весьма странно, что GetSymbolicLinkTarget работает именно так, но вы должны назвать это тем, что он ожидает.

+0

Или просто измените функцию, чтобы принять один символ 'char *', так как он использует только один. –

+0

Или 'const char *', чтобы вы не ссорились с вызывающими, когда они не могут передать совершенно разумные аргументы. – chris

+0

Вы правильно определяете 'GetSymbolicLinkTarget()' как «странный», а затем публикуете решение, которое способствует этой странности. 'GetSymbolicLinkTarget()' должен быть определенно обновлен, чтобы принимать параметры правильных типов. –

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