Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Сделать массив строк...

424
10 августа 2003 года
(C)dragon
307 / / 04.12.2002
Помогите осуществить такую вещь: мне нужно построить массив указателей на строки. делаю так:

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, т.к. компиляторы похожи).
3
10 августа 2003 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by (C)dragon
Помогите осуществить такую вещь: мне нужно построить массив указателей на строки. делаю так:

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

Вот только зачем все так сложно? Зачем создавать эти массивы?

424
10 августа 2003 года
(C)dragon
307 / / 04.12.2002
Цитата:
Originally posted by Green


Вообще-то, char** strings и char* strings[2] это переменные разных типов. Отсюда и все проблемы.
Можно сделать так:

char* strings[]={"111", "222"};
char** pStrings = strings;

=========================================

extern char** pStrings

Вот только зачем все так сложно? Зачем создавать эти массивы?



Я по другому сделал - подсчитал число строк в массиве и написал extern char* strings[2], вроде всё нормально стало. Вообще по идее это одинаковые типы, не понятно, почему компилятор считает их разными.

Массивы создавать надо, т.к. я начал писать движок дизассемблера, и файл с данными(типа с инструкциями) в другой файл вынес, а то неудобно, когда всё в одну кучу(в один файл) свалено.

3
10 августа 2003 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by (C)dragon

Я по другому сделал - подсчитал число строк в массиве и написал extern char* strings[2], вроде всё нормально стало. Вообще по идее это одинаковые типы, не понятно, почему компилятор считает их разными.



Повторяю, это разные типы, поэтому компилятор и считает их разными. Обратитесь к Страуструпу.

Цитата:
Originally posted by (C)dragon

Массивы создавать надо, т.к. я начал писать движок дизассемблера, и файл с данными(типа с инструкциями) в другой файл вынес, а то неудобно, когда всё в одну кучу(в один файл) свалено.



Во-первых, использование extern для переменной это не есть хороший стиль программирования.

Во-вторых, зачем использовать переменные для константных литералов? Не проще ли использовать таблицы строк в ресурсах или на крайний случай просто макросы?

424
10 августа 2003 года
(C)dragon
307 / / 04.12.2002
Цитата:
Originally posted by Green


Повторяю, это разные типы, поэтому компилятор и считает их разными. Обратитесь к Страуструпу.



Лично что ли? Да ладно, сейчас объясню. Смотри:

str1 db "str1", 0
str2 db "str2", 0

strings dd offset str1, offset str2

strings - это указатель на массив указателей, т.е. char**, это одинаковые типы, а компилятор уж слишком заботиться о типах, поэтому и считает их разными.


Цитата:
Во-первых, использование extern для переменной это не есть хороший стиль программирования.

Во-вторых, зачем использовать переменные для константных литералов? Не проще ли использовать таблицы строк в ресурсах или на крайний случай просто макросы?



Насчёт ресурсов - это действительно лучше. Надо будет переделать, а в секции данных DLL оставить только индексы для быстрого поиска инструкций по опкодам.

3
10 августа 2003 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by (C)dragon

Лично что ли? Да ладно, сейчас объясню. Смотри:

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;

3.6K
11 августа 2003 года
void_123
11 / / 30.06.2003
Типы данных, конечно, разные, как говорит зелёный.
Правильно сказано и о глобал-скоп переменных.
Я бы добавил, тоже и о массивах строк, вместо указателей.
4.9K
16 августа 2003 года
Freeze.MANiAC
3 / / 16.08.2003
Смотрите:

typedef char * str;
str* str_pointer_array[];

Вот и всё.
3
16 августа 2003 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by Freeze.MANiAC
Смотрите:

typedef char * str;
str* str_pointer_array[];

Вот и всё.



:D :D :D
Что всё?
Это все познания С++? :D
Смотри: 1+1=2, 2+2=4 и т.д.

P.S. Можно проще
char** str_pointer_array[];
Все равно, компилиться не будет!

3.6K
17 августа 2003 года
void_123
11 / / 30.06.2003
2замороженный маньяк
теперь все мы не умрём невеждами
кул
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог