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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Строки C++. Правильно ли я делаю? проверьте пожалуйста, правильность кода 
:(
    Опции темы
Forsaken
Дата 25.4.2009, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Здравствуйте
Я только начал изучать C++. Проверьте, пожалуйста, правильно ли я работаю с массивом указателей на строки.
В общем, я делаю массив указателей на строки (другими словами массив строк), таким вот образом:

Код

TCHAR* psMessage [1000]; //глобальный массив


А затем я написал функцию которая прокручивает массив сторк освобождая элемент [0] и добавляет туда новую строку из параметра psName -переданного как аргумент в функцию.

Вот код функции:

Код

void AddMessage(TCHAR** psMessage, TCHAR* psName)
{
    for(int i= 999; i>=0; i--)
    {
        if(psMessage[i] != NULL)
        {
            psMessage[i+1] = psMessage[i];
        }
    }
    int cstrlen = _tcslen(psName) + 1;

    if(psMessage[0] != NULL)
        delete [] psMessage[0];

    psMessage[0] = new TCHAR [cstrlen]; 
    _tcscpy_s(psMessage[0], cstrlen, psName);
}


Подскажите пожалуйста правильно ли я делаю и можно ли это сделать оптимальнее?
Благодарю всех кто прочел мой пост!
PM MAIL   Вверх
Anikmar
Дата 25.4.2009, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Вы прокручиваете список, сдвигая его к концу и на место первого элемента вставляете свою строчку. Тогда почему вы освобождаете память бывшего первого элемента (который всего лишь стал вторым) вместо того, чтобы освободить последний элемент, который ушел за границу массива?
PM MAIL ICQ   Вверх
Forsaken
Дата 25.4.2009, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Anikmar, 
Спасибо Вам за помощь Anikmar!
Облажался с этим и еще за границы массива вышел.. 

Вот так вроде бы правильно будет:
Код

void AddMessage(TCHAR** psMessage, TCHAR* psName)
{
    if(psMessage[999]!=NULL)
        delete [] psMessage[999];

    for(int i= 998; i>=0; i--)
    {
        if(psMessage[i] != NULL)
        {
            psMessage[i+1] = psMessage[i];
        }
    }
    int cstrlen = _tcslen(psName) + 1;
        
    psMessage[0] = new TCHAR [cstrlen]; 
    _tcscpy_s(psMessage[0], cstrlen, psName);
}


Это сообщение отредактировал(а) Forsaken - 25.4.2009, 20:06
PM MAIL   Вверх
Forsaken
Дата 25.4.2009, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Подскажите, пожалуйста, еще -нужно ли удалять глобальный массив указателей на строки при завершении программы или все память (в месте с массивом) освободится автоматически?
PM MAIL   Вверх
Dov
Дата 25.4.2009, 23:25 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

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



Цитата(Forsaken @  25.4.2009,  20:05 Найти цитируемый пост)
Вот так вроде бы правильно будет:

Думаю, что правильно будет так:
Код
void AddMessage(TCHAR** psMessage, TCHAR* psName)
{
    for(int i= 998; i>=0; i--)
        psMessage[i+1] = psMessage[i];    
    
    psMessage[0] = psName; 
}


Ты же память не выделял, значит и возвращать её не нужно. Используешь так, например:
Код
int main()
{
    TCHAR * psMessage [1000] = {"0", "11","222", "3333","44444", "555555"};
    TCHAR * buf = "9999999999";

    for(int i = 0; i < 1000; i++)
        if(psMessage[i])
            cout << psMessage[i] << endl;

    cout << endl;

    AddMessage(psMessage, buf);

    for(i = 0; i < 1000; i++)
        if(psMessage[i])
            cout << psMessage[i] << endl;

    return 0;
}




--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
Forsaken
Дата 26.4.2009, 07:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Dov, 
Да! Так действительно правильно! И у в Вашем варианте точно ничего удалять ненужно и все очень хорошо.
Спасибо Вам за помощь Dov, к сожалению немогу нажать "+", но как только наберу 100 постов обязательно нажму!) 
Еще раз спасибо Вам!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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