2014-01-28 2 views
2

У меня есть метод, который я пытаюсь вызвать. Прототип выглядит примерно так:Невозможно преобразовать из 'char **' в 'char * []'

void MyMethod(const char* names[]) 

Я хочу, чтобы построить массив полукокса *, чтобы перейти к этому методу, но я не могу тренировки синтаксиса. О лучшем, что я могу сделать:

char* names[] = new char*[numNames]; 

Но это не скомпилировано. Есть идеи?

Примечание: Я не могу изменить объявление MyMethod, которое установлено в камне.

+2

'char ** names = new char * [numNames];' –

+0

Как насчет 'char * names [numNames];'? – Svalorzen

+0

@Svalorzen C++ является VLA-дефицитным (расширения gcc не выдерживают) – WhozCraig

ответ

2

в то время как все остальные здесь, кажется, вешали на (правильно) адресация синтаксис (задн []) Я подозреваю, ваш вопрос вы В настоящее время я боролся с тем, как передать указатель-на-указатель-на-const-char. Исходный синтаксис, который вы указали, неверен, но при этом делается следующее:

char **names = new char *[numNames]; 

// populate names[] 

MyMethod(names); 

не решит вашу проблему. Вы получите сообщение об ошибке «no matching function call», потому что передаваемый вами параметр имеет определенный тип (указатель на указатель на символ), в то время как функция ожидает нетривиально-конвертируемого другого типа (указатель на указатель на сопзЬ-голец).

Простой факт: вы не можете сделать это от char **. See this question/answers по причинам, но длинным и коротким, это типы, которые просто несовместимы. Если вы хотите сделать это без изменения этого прототипа вы собираетесь иметь, чтобы сделать что-то вроде этого:

int numNames = 5; 
char **names = new char *[numNames]; 

// populate your names[], then... 

const char **ro_names = new const char *[numNames]; 
std::copy(names, names+numNames, ro_names); 

MyMethod(ro_names); 

delete [] ro_names; 
// clean up names[] elements, then... 
delete [] names; 

Hideous Я знаю. Вы можете значительно очистить его с помощью вектора (который вы должны использовать в любом случае, кстати), но я сохранил динамику дрожания, поскольку они были тем, с чего вы начали.

+0

Спасибо, это подтолкнуло меня в правильном направлении. У меня был char ** в более ранней итерации кода, и я полагал, что const должен просто быть выведен, но, похоже, нет. PS Кажется, я могу уйти без std :: copy, если я добавлю const к своему первоначальному новому. – MrMoDoJoJr

+0

@MrMoDoJoJr Правда, это просто утомительно, чтобы инициализировать новый (* ваш * новый, а не код выше). Я бы упомянул об этом, но был достаточно убежден, что вам нужен доступный для записи контент в вашем массиве, и знал, что вышеупомянутое будет работать независимо. В любом случае, Рад, что это помогло. – WhozCraig

0

У меня есть следующая мысль:

char** names = new char*[numNames]; 

Кстати следующие объявления функций декларировать ту же функцию,

void MyMethod(const char* names[]); 
void MyMethod(const char** names); 
void MyMethod(const char* names[10]); 
0
char** names = new char*[numNames]; 

с синтаксисом вкратце:

если массив был просто е массив полукокса мы бы сказали:

char* arr = new char[10] 
^^   ^
T P    T 

T - тип

P - указатель (потому что new возвращает указатель (в случае успеха, или бросает bad_alloc))

таким образом, массив полукокса * это:

char* * arr = new char*[10] 
^ ^   ^
T P    T 
Смежные вопросы