Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.75
insideone
Модератор
Автор FAQ
3638 / 916 / 49
Регистрация: 10.01.2010
Сообщений: 2,468
#1

new const char[x]. Копия - C++

26.01.2010, 00:20. Просмотров 1499. Ответов 6
Метки нет (Все метки)

Возможно ли сделать так как мне этого хочется?) Завис я как то, голову ломаю как бы сотворить чтобы можно было динамически выделять память под строки и они были const (т.к. эти строки будут потом отдаваться не как копии и их редактирование нежелательно)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class A{
public:
    // именно с const
    const char* data[3];
} a;
int main()
{
    const char* Str = "Какая то строка";
    // нужно поместить в a.data[0] копию Str
    // при этом Str - локальная переменная,
    // а данные из a не должны пропадать после
    // того как Str исчезнет
    return 0;
}
В общем то в стиле инициализации то что я хочу получить выглядело бы так
C++
1
a.data[0] = new const char[10] ("Новая строка"); // выделяем память под строку и заполняем её. Адрес отсылаем в переменную объекта
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.01.2010, 00:20     new const char[x]. Копия
Посмотрите здесь:

Ошибка E2034: Cannot convert 'char const[8]' to 'const wchar_t *' - C++ Builder
Прошу прощения за свой вопрос, но я никак не пойму где ошибка? использую c++ builder 10 (если это как то связано) выдает следующие...

Ошибка: E2034 Cannot convert 'char const[51]' to 'const wchar_t * - C++ Builder
Пытаюсь добавить в memo1 название файлов располагающихся в каталоге, в Console Application все отлично, а тут проблема. ...

Невозможно преобразовать параметр 1 из 'const char [3]' в 'const wchar_t * - Visual C++
void CprojectDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { // TODO: добавьте свой код обработчика сообщений или...

MessageBox - Cannot convert 'wchar_t const[45]' to 'const char *' - C++ Builder
Добро всем! :senor: MessageBox(NULL,(LPCWSTR)L"Данные не сохранены ! \nЗакрыть не сохранив ?", (LPCWSTR)L"Мое супер приложение", ...

Невозможно преобразовать параметр 2 из 'char' в 'const char * - Visual C++
Уважаемые господа программисты,как преобразовать тип переменной из 'char' в 'const char *'? Заранее спасибо

Invalid conversion from ‘char’ to ‘const char*’ - C++
void checkFlag(int currArg, char argv, int msg_size){ if (strcmp(argv, "-s") == 0) if ((msg_size = atoi(argv)) == 0) exitMe(); ...

Invalid conversion from 'const char*' to 'char' - C++
Здравствуйте. Смысл нижеприведенного кода - сосчитать количество запятых и точек во вводимом тексте. Редкостный быдлокод, неудивительно,...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,364
26.01.2010, 00:44     new const char[x]. Копия #2
Ну и? В чем проблема-то?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class A{
private:
        // именно с const
        const char* data[сколько-то];
 
public:
        A(сonst char* _data)
        {
            // тут код конструктора класса, копирующий содержимое _data в член data
        }
};
 
int main()
{
        A a = "Какая то строка";
 
        // а тут - какой-то еще код.....
 
        return 0;
}
insideone
Модератор
Автор FAQ
3638 / 916 / 49
Регистрация: 10.01.2010
Сообщений: 2,468
26.01.2010, 14:20  [ТС]     new const char[x]. Копия #3
Объект хранит множество строк, которые загружаются из других функций. Загрузить строки при инициализации объекта нежелательно, однако это и не возможно - входные данные - строки из файла.


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class StringGroup{
private:
    char* data[HASH_MAX_LEN];
public:
    StringGroup();
    char*& operator[] (const char* newKey);
};
 
StringGroup::StringGroup(){
    memset(&data, 0, sizeof(data));
}
 
char*& StringGroup::operator[] (const char* StringKey){
    unsigned short int IntKey = Math::Hash(StringKey);
return data[IntKey];
}
Тут загрузка:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
    // Загрузка строковых данных
    bool String(const char* FileName)
    {
        // Открываем файл
        std::fstream* CurFile = GetFile(FileName);
        if ( !CurFile ) {return false;}
 
 
        // Переменные для считываемых из файла значений
        std::string CURLINE, KEYWORD;
        while (!(CurFile->eof()))
        {
            // Читаем строку из файла
            std::getline((*CurFile), CURLINE);
            // Вырезаем все до первой табуляции\пробела\запятой - получаем ключевое слово
            KEYWORD = SW.CutBefore(&CURLINE, "\t ,");
 
            int Cur22 = CURLINE.find(0x22);
            // Обе кавычки найдены
            if ( CURLINE.find(0x22, Cur22+1) != 0xffffffff )
            {
                // В строке CURLINE оставить только то что находится между первыми двумя '"' (0x22 HEX)
                SW.CutBetween(&CURLINE, 0x22);
            }
            else
            {
                CURLINE = SW.CutBefore(&CURLINE, "\t ,\\/");
            }
 
            // Если строка пустая
            if (strcmp(KEYWORD.c_str(), "") == 0)
                continue;
            // Если комментарий
            if (strcmp(KEYWORD.c_str(), "\\\\") == 0)
                continue;
            
            // загружаем строку CURLINE в базу строк по индексом hash(KEYWORD)
            const char* Key = KEYWORD.c_str(); unsigned char len = CURLINE.length()+1;
 
            char*& CurStrInDB = Strings[Key];
            CurStrInDB = new char[len];
            memcpy(CurStrInDB, CURLINE.c_str(), len);
        }
        CurFile->close();       
    return true;
    }
Конкретнее в чем проблема: обеспечить аналогичную функциональность при StringGroup::data const char* [] а не char* [] как сейчас.
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,364
26.01.2010, 17:21     new const char[x]. Копия #4
const char* StringGroup::operator[] (const char* StringKey) const { ... }
Кстати, непонятно, зачем в неконстантной версии возвращается ссылка на указатель, а не сам указатель... В чем смысл?
insideone
Модератор
Автор FAQ
3638 / 916 / 49
Регистрация: 10.01.2010
Сообщений: 2,468
26.01.2010, 17:50  [ТС]     new const char[x]. Копия #5
Если без ссылки на указатель, тогда использование будет подобно:
C++
1
2
3
char* CurStrInDB = Strings[Key];
CurStrInDB = new char[len];
memcpy(CurStrInDB, CURLINE.c_str(), len);
Что не заполнит StringGroup никак.
Или же:
C++
1
Strings[Key] = new char[len];
то компилятор будет ругаться на то что "левый операнд должен быть левосторонним значением" что логично. Вот поэтому ссылка на указатель... Изначально ведь
C++
1
memset(&data, 0, sizeof(data));
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,364
26.01.2010, 17:57     new const char[x]. Копия #6
Что представляется крайне неудачным решением. За такие вещи в коде надо бить по рукам, и больно.
C++
1
2
3
4
5
char* CurStrInDB = Strings[Key];
CurStrInDB = new char[len];
memcpy(CurStrInDB, CURLINE.c_str(), len);
....
CurStrInDB = new char[len];     // на ровном месте получили утечку памяти. Вуаля.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.01.2010, 18:06     new const char[x]. Копия
Еще ссылки по теме:

Невозможно преобразовать из char в const char - C++
Добрый день! В строке вызова функции razdacha(Deck, Face, Suit); возникает ошибка invalid conversion from char** to const char**....

Сложение char и const char - C++ WinAPI
Вопрос до жути нубский, но как есть. hFind = FindFirstFile("D:\\testdir\\*.*", &fData); while(FindNextFile(hFind,...

const char и unsigned char - C++
Всем привет. Такое дело. Это даже проблемой не назовешь, но суть такая. Мне нужно записать const char в unsigned char через конструктор...

conversion from ‘char’ to ‘const char*’ - C++
Всем добрый вечер! Я хочу выполнить команду is.open(file_name, ios::binary); но функция open требует тип const char file_name, а...

Значение типа const char * нельзя присвоить сущности типа char * - Visual C++
Добрый день. Я новичок в c++ и столкнулся с проблемой при написании маленькой программы. Собственно у меня такая ошибка: значение типа...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
insideone
Модератор
Автор FAQ
3638 / 916 / 49
Регистрация: 10.01.2010
Сообщений: 2,468
26.01.2010, 18:06  [ТС]     new const char[x]. Копия #7
Да, утечка) И вы спрашивали почему я так не сделал))))
Кстати, непонятно, зачем в неконстантной версии возвращается ссылка на указатель, а не сам указатель... В чем смысл?
Я же возвращаю ссылку на указатель, чтобы в этот указатель записать указатель полученный при выделении памяти... разве можно как то по другому?

Добавлено через 4 минуты
В общем наверное то что я хочу получить не возможно. Чтобы инициализировать константу можно написать так
const int x = 10;
однако инициализировать массив с данными уже нельзя, получается выделить память под const char [] нет смысла т.к. оно то выделится да записать туда нельзя т.к. const ?
Yandex
Объявления
26.01.2010, 18:06     new const char[x]. Копия
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru