Сделать массив строк...
char str1[]="111";
char str2[]="222";
char* strings[]={str1, str2};
Затем в другом cpp файле пишу:
extern char** strings
...
MessageBox(NULL, strings[0], strings[1], MB_OK);
Прога вылетает. В отладчике вижу, что он в MessageBox передаются не адреса строк, а сами строки (0x31727374, ...). Как это всё осуществить, а то задолбался уже, никак не получается. Компилятор - Intel C++ 7.1(Пишу в VC, т.к. компиляторы похожи).
Помогите осуществить такую вещь: мне нужно построить массив указателей на строки. делаю так:
char str1[]="111";
char str2[]="222";
char* strings[]={str1, str2};
Затем в другом cpp файле пишу:
extern char** strings
...
MessageBox(NULL, strings[0], strings[1], MB_OK);
Прога вылетает. В отладчике вижу, что он в MessageBox передаются не адреса строк, а сами строки (0x31727374, ...). Как это всё осуществить, а то задолбался уже, никак не получается. Компилятор - Intel C++ 7.1(Пишу в VC, т.к. компиляторы похожи).
Вообще-то, char** strings и char* strings[2] это переменные разных типов. Отсюда и все проблемы.
Можно сделать так:
char* strings[]={"111", "222"};
char** pStrings = strings;
=========================================
extern char** pStrings
Вот только зачем все так сложно? Зачем создавать эти массивы?
Вообще-то, char** strings и char* strings[2] это переменные разных типов. Отсюда и все проблемы.
Можно сделать так:
char* strings[]={"111", "222"};
char** pStrings = strings;
=========================================
extern char** pStrings
Вот только зачем все так сложно? Зачем создавать эти массивы?
Я по другому сделал - подсчитал число строк в массиве и написал extern char* strings[2], вроде всё нормально стало. Вообще по идее это одинаковые типы, не понятно, почему компилятор считает их разными.
Массивы создавать надо, т.к. я начал писать движок дизассемблера, и файл с данными(типа с инструкциями) в другой файл вынес, а то неудобно, когда всё в одну кучу(в один файл) свалено.
Я по другому сделал - подсчитал число строк в массиве и написал extern char* strings[2], вроде всё нормально стало. Вообще по идее это одинаковые типы, не понятно, почему компилятор считает их разными.
Повторяю, это разные типы, поэтому компилятор и считает их разными. Обратитесь к Страуструпу.
Массивы создавать надо, т.к. я начал писать движок дизассемблера, и файл с данными(типа с инструкциями) в другой файл вынес, а то неудобно, когда всё в одну кучу(в один файл) свалено.
Во-первых, использование extern для переменной это не есть хороший стиль программирования.
Во-вторых, зачем использовать переменные для константных литералов? Не проще ли использовать таблицы строк в ресурсах или на крайний случай просто макросы?
Повторяю, это разные типы, поэтому компилятор и считает их разными. Обратитесь к Страуструпу.
Лично что ли? Да ладно, сейчас объясню. Смотри:
str1 db "str1", 0
str2 db "str2", 0
strings dd offset str1, offset str2
strings - это указатель на массив указателей, т.е. char**, это одинаковые типы, а компилятор уж слишком заботиться о типах, поэтому и считает их разными.
Во-вторых, зачем использовать переменные для константных литералов? Не проще ли использовать таблицы строк в ресурсах или на крайний случай просто макросы?
Насчёт ресурсов - это действительно лучше. Надо будет переделать, а в секции данных DLL оставить только индексы для быстрого поиска инструкций по опкодам.
Лично что ли? Да ладно, сейчас объясню. Смотри:
str1 db "str1", 0
str2 db "str2", 0
strings dd offset str1, offset str2
strings - это указатель на массив указателей, т.е. char**, это одинаковые типы, а компилятор уж слишком заботиться о типах, поэтому и считает их разными.
А что же ты тогда называешь разными типами?
Выдержкой из асма ничего не объясняется, т.к. типовая безопасность это особенность языка, а не компилятора.
char*[2] и char** - это разные типы,
как разные char*[2] и char*[3].
А доказательство простое:
sizeof(char*[2]) != sizeof(char**)
или
typeid(char*[2]) != typeid(char**)
При использовании char*[2] там, где нужен char**, имеет место неявное преобразование типов, которое происходит иногда несовсем так, как хотелось бы. Например, в твоем случае. Для избежания подобного используется явное приведение, в твоем случае я предложил такое:
char** pStrings = strings;
Правильно сказано и о глобал-скоп переменных.
Я бы добавил, тоже и о массивах строк, вместо указателей.
typedef char * str;
str* str_pointer_array[];
Вот и всё.
Смотрите:
typedef char * str;
str* str_pointer_array[];
Вот и всё.
:D :D :D
Что всё?
Это все познания С++? :D
Смотри: 1+1=2, 2+2=4 и т.д.
P.S. Можно проще
char** str_pointer_array[];
Все равно, компилиться не будет!
теперь все мы не умрём невеждами
кул