Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос по char* 
:(
    Опции темы
GrafF812
Дата 9.9.2010, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 205
Регистрация: 3.12.2009

Репутация: нет
Всего: нет



Код

char *str = "aaa";
    str[0] = 'q';

Подскажите пожалуйста можно ли изменять значения индексов массива str при таком объявлении массива? 
PM MAIL   Вверх
mes
Дата 9.9.2010, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(GrafF812 @  9.9.2010,  08:51 Найти цитируемый пост)
зменять значения индексов

 smile 


Цитата(GrafF812 @  9.9.2010,  08:51 Найти цитируемый пост)
char *str = "aaa";

некорректная запись, допустимая "благодаря" наследию С

возьмите в привычку, присваивать строковой литерал указателю на константу :

Код

const char *str = "aaa";



--------------------
PM MAIL WWW   Вверх
azesmcar
Дата 9.9.2010, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(GrafF812 @  9.9.2010,  09:51 Найти цитируемый пост)
Подскажите пожалуйста можно ли изменять значения индексов массива str при таком объявлении массива?  

нет, текст "aaa" компилятор поместит в константную область памяти и присвоит твоему указателю адрес.

Добавлено через 1 минуту и 23 секунды
Цитата(mes @  9.9.2010,  09:54 Найти цитируемый пост)
возьмите в привычку, присваивать строковой литерал указателю на константу :

или если надо менять - то так
Код

char str[] = "aaa";
str[0] = 'q';


Это сообщение отредактировал(а) azesmcar - 9.9.2010, 09:55
PM   Вверх
GrafF812
Дата 9.9.2010, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 205
Регистрация: 3.12.2009

Репутация: нет
Всего: нет



azesmcar, однако компилятор Borland C++ Compiler 5.5 позволяет менять константную область памяти, меня это и смутило.
PM MAIL   Вверх
azesmcar
Дата 9.9.2010, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(GrafF812 @  9.9.2010,  10:11 Найти цитируемый пост)
azesmcar, однако компилятор Borland C++ Compiler 5.5 позволяет менять константную область памяти, меня это и смутило. 

это значит он поместил данные в НЕ-константную область памяти smile
PM   Вверх
GrafF812
Дата 9.9.2010, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 205
Регистрация: 3.12.2009

Репутация: нет
Всего: нет



azesmcar, видимо да, а подскажите пожалуйста почему в этом примере:
Код

#include <windows.h>
#include <iostream>
#include <iomanip.h>

using namespace std;

void shuffle(int[][13]);
void deal(int[][13], const char*[], const char*[]);

void main ()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    
    char *suit[] = {"Черви","Бубны","Трефы","Пики"};
    const char *face[] = {"Туз","Двойка","Тройка","Четверка",
                      "Пятерка","Шестерка","Семерка","Восьмерка",
                      "Девятка","Десятка","Валет","Дама","Король"};
    int deck[4][13] = {0};
    
    srand(time(NULL));
    shuffle(deck);
    deal(deck,suit,face);
    
    cin.get();
}
//---------------------------------------------------------------
void shuffle(int deck[][13] )
{
    for(short i = 1; i <=52; i++)
    {
        int column = rand() % 13;
        int row = rand() % 4;
        
        while(deck[row][column] != 0)
        {
            column = rand() % 13;
            row = rand() % 4;
        }
        deck[row][column] = i;
    }
}
//---------------------------------------------------------------
void deal(int deck[][13], const char *suit[], const char *face[])
{
    for(short i = 1; i <= 52; i++)
    {
        for(short j = 0; j < 4; j++)
        {
            for(short k = 0; k < 13; k++)
            {
                if(deck[j][k] == i)
                    cout << setiosflags(ios::right) << setw(6) << suit[j] 
                         << " масти  " << face[k] << endl;
            }
        }
    }
}

Появляется ошибка:
Код

Cannot convert 'char **' to 'const char **' ?  

Т.е получается, что нельзя передать двумерный массив suit как указатель на константные данные?
PM MAIL   Вверх
bsa
Дата 9.9.2010, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



GrafF812, ты внимательно посмотри, в какой строчке ошибка. Думаю, она в строке 15 - ты пытаешься создать массив неконстантных указателей, а инициализируешь константными. Вот он и ругается.
PM   Вверх
GrafF812
Дата 9.9.2010, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 205
Регистрация: 3.12.2009

Репутация: нет
Всего: нет



bsa, ошибка в 44 строке, когда я пытаюсь принять не константный массив - константной переменной. Если из заголовка функции убрать const, то все работает.
PM MAIL   Вверх
azesmcar
Дата 9.9.2010, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



GrafF812


bsa прав, замени

Цитата(GrafF812 @  9.9.2010,  12:20 Найти цитируемый пост)
char *suit[] = {"Черви","Бубны","Трефы","Пики"};

на
Код

const char *suit[] = {"Черви","Бубны","Трефы","Пики"};

PM   Вверх
djamshud
Дата 9.9.2010, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 4
Всего: 39



bsa, azesmcar, с каких это пор неконстанту нельзя передать (читай, беспроблемно кастовать) в функцию, как константу?


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
bsa
Дата 9.9.2010, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(djamshud @ 9.9.2010,  14:28)
bsa, azesmcar, с каких это пор неконстанту нельзя передать (читай, беспроблемно кастовать) в функцию, как константу?

Читай наши посты внимательно, мы о том же.  smile 
PM   Вверх
borisbn
Дата 9.9.2010, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



согласен с djamshud, непонятно, почему так можно
Код

void foo( const char * s ) {}

char * s = "qwerty";
foo( s );

а так нельзя
Код

void foo( const char * s[] ) {}

char * s[] = { "" };
foo( s );

?


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
azesmcar
Дата 9.9.2010, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(borisbn @  9.9.2010,  14:59 Найти цитируемый пост)
а так нельзя

почему бы просто не проверить?
PM   Вверх
bsa
Дата 9.9.2010, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



borisbn, char *[] и const char *[] - это массивы разных указателей. ты можешь преобразовать один тип к другому, но ты не можешь легко преобразовать указатель на один тип к указателю на другой (указатель на константу видимо имеет серьезные отличия от указателя на неконстанту). Думаю, в этом дело.
PM   Вверх
borisbn
Дата 9.9.2010, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



azesmcar, перед тем, как отправлять сюда я проверил. И то, что нельзя - это не вопрос, а утверждение. А вот почему ?
кстати. интересно, что такое ( см. ниже ) работает
Код

void foo( const char * const s[] ) {}

char * s[] = { "qwerty" };
foo( s );

т.е. в определении функции не хватало const после const char *

и ещё. Первый const можно убрать и тоже всё компиляется
Код

void foo( char * const s[] ) {}

char * s[] = { "qwerty" };
foo( s );


Это сообщение отредактировал(а) borisbn - 9.9.2010, 17:14


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0790 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.