|
|
|
gcc и const char**
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. invalid conversion from 'char**' to 'const char**' Что неправильно? Вроде ж ничего криминального в таком присванивании нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2006, 20:20 |
|
||
|
gcc и const char**
|
|||
|---|---|---|---|
|
#18+
так у тебя константный указатель на указатель на чар. а ты его менять хочешь :) разве менять константу не криминал? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2006, 21:26 |
|
||
|
gcc и const char**
|
|||
|---|---|---|---|
|
#18+
alex_kтак у тебя константный указатель на указатель на чар. а ты его менять хочешь :) разве менять константу не криминал? Криминал. А разве s - это константный указатель? Если бы это было так, то, во-первых, компилятор бы ругнался (наверное) на строчку Код: plaintext А во-вторых, в коде Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Я хотел объявить s указателем на указатель на константу типа char. Если я ошибаюсь и s - это не то, что я о нем думаю, то как правильно его объявить? Кстати, проблемный фрагмент без нареканий компилирует старенький BC3.1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.07.2006, 09:22 |
|
||
|
gcc и const char**
|
|||
|---|---|---|---|
|
#18+
Вообще-то, чему либо константному, что либо присваивать не хорошо! Во втором случае константы меняются между собой данными, но не перестают быть константами. Это сделано только из-за того, чтобы была возможность передавать их куда-нибудь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.07.2006, 09:45 |
|
||
|
gcc и const char**
|
|||
|---|---|---|---|
|
#18+
AkhВообще-то, чему либо константному, что либо присваивать не хорошо! Во втором случае константы меняются между собой данными, но не перестают быть константами. Это сделано только из-за того, чтобы была возможность передавать их куда-нибудь. Я сильно сомневаюсь, что константы имеют возможность меняться между собой данными, как бы сильно ни хотелось их куда бы то ни было передать. Я только изучаю c++ (собственно, и вопрос-то возник при попытке решить упражнения к разделу 5 из книги Страуструпа) и весьма возможно, что я ошибаюсь, считая s указателем на указатель на константу типа char, но осмелюсь утверждать, что s - уж точно никакой не константный указатель. Если бы он был константным указателем, то выглядел бы так char **const s; и тогда, как и положено, компилятор заругался бы на "неинициализированую константу" в объявлении s. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.07.2006, 10:25 |
|
||
|
gcc и const char**
|
|||
|---|---|---|---|
|
#18+
Есть простое правило чтобы не путаться в константных указателях. Если const стоит слева от звездочки, то "константность" относится к данным на которые указывает указатель (пардон за масло масляное). Если справа, то к самому указателю. пример: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.07.2006, 10:58 |
|
||
|
gcc и const char**
|
|||
|---|---|---|---|
|
#18+
redskin А что можете сказать по сути проблемы? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.07.2006, 11:04 |
|
||
|
gcc и const char**
|
|||
|---|---|---|---|
|
#18+
BlessЯ сильно сомневаюсь, что константы имеют возможность меняться между собой данными, как бы сильно ни хотелось их куда бы то ни было передать. Ну, во первых это видно на предыдущем примере. Во вотрых, еще пример: данных в функцию с константным параметром. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.07.2006, 11:06 |
|
||
|
gcc и const char**
|
|||
|---|---|---|---|
|
#18+
Bless redskin А что можете сказать по сути проблемы? :) Хм, так я все сказал в пред. сообщении :) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.07.2006, 11:19 |
|
||
|
gcc и const char**
|
|||
|---|---|---|---|
|
#18+
В принципе исходный код можно "поправить", обманув компилер и явно приведя указатель к нужному нам типу: s=(const char **)(&st); Но тогда программа будет вести себя странно. const char ** означает указатель на указатель на константный char. Т.е. после разыменования мы получим доступ к константной строке, которая не должна меняться, по крайней мере этого будут ожидать пользователи. А что на самом деле: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.07.2006, 11:32 |
|
||
|
gcc и const char**
|
|||
|---|---|---|---|
|
#18+
Поэтому правильнее, наверное, менять тип не у s, a у st. Код: plaintext 1. 2. 3. Теперь s и &st имеют одинаковый тип, можно присваивать сколько душе угодно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.07.2006, 11:43 |
|
||
|
gcc и const char**
|
|||
|---|---|---|---|
|
#18+
redskin Но тогда программа будет вести себя странно. const char ** означает указатель на указатель на константный char. Т.е. после разыменования мы получим доступ к константной строке, которая не должна меняться, по крайней мере этого будут ожидать пользователи. А что на самом деле: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Неубедительно :) Применяя вашу логику, странным будет и нижеследующий пример: Код: plaintext 1. 2. 3. 4. 5. 6. 7. Ведь const char * - константная строка, "которая не должна меняться, по крайней мере этого будут ожидать пользователи". Хотя ничего странного в этом нет. Все, на что может рассчитывать пользователь, это на то, что эта строка не будет изменена посредством s, не более того. В общем, я нашел себе удовлетворяющий меня ответ: из книги Страуструпа The C++ Programming Language (Third Edition) раздел C.6.2.3 "Pointer and Reference Conversions" касательно неявных преобразований указателей сказано, что: 1) можно любой указатель (за исключение указателей на функции и члены)преобразовать к void* 2) можно указатель на класс потомок преобразовать к классу предку 3) константное выражение, равное нулю может быть преобразование к любому указателю. 4) T* может быть неявно преобразован к const T*. Все. Больше никаких других неявный преобразований(я надеюсь, Страуструп ничего не упустил) в c++ ПРОСТО НЕТ, сколь бы логичными мне эти другие ни казались. Из этих пунктов только последний мог бы подойти к моему примеру. НО Преобразуем фрагмент Код: plaintext 1. 2. 3. Код: plaintext 1. 2. 3. 4. 5. Код: plaintext 1. 2. 3. 4. 5. 6. Отсюда видно, что строка s=pst, где pst имеет тип T*, будет корректной только если s (согласно пункту 4 неявных соглашений) имеет тип const T*, т.е Код: plaintext а никак не Код: plaintext Спасибо за пример, давший толчок в нужном направлении. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.07.2006, 15:22 |
|
||
|
|

start [/forum/topic.php?fid=57&fpage=342&tid=2030771]: |
0ms |
get settings: |
9ms |
get forum list: |
23ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
47ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
59ms |
get tp. blocked users: |
3ms |
| others: | 252ms |
| total: | 411ms |

| 0 / 0 |
