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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Локальные классы - как реализовать правильно!? 
V
    Опции темы
SaNioK
Дата 1.4.2010, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте уважаемые форумчане!
 
Код

// Класс одномерных массивов строк, каждая строка задается длиной и указателем на выделенную для нее память.

#include <new>
#include <cstdlib>
#include <cstring>
#include <iostream>
using namespace std;

void *operator new(size_t sz) {
  return operator new(sz,nothrow);
}
void *operator new[](size_t sz) {
  return operator new[](sz,nothrow);
}

class sArray
{
private:
    char ** mPtr;
    unsigned int mSize;
    void Clear();

public:
    sArray();
    sArray(unsigned int sizeArray);
    sArray(const sArray & sA);
    ~sArray();

    sArray & operator = (const sArray &sA);
    friend sArray & operator + (const sArray &sA, const sArray &sB);
    const char * operator[](unsigned int i) const;
    

    unsigned int getSize() const;
    unsigned int getStringLen(unsigned int i) const;

    void set(const sArray & sA, bool f);
    bool setAt(unsigned int i, const char *str);

    void output();
    bool find(const char *f);

};

void sArray::Clear()
{
    if(mSize && mPtr == NULL)
    {
        for(unsigned int i=0; i < mSize; i++)
            if(mPtr[i])
            {
                delete [] mPtr[i];
                mPtr[i]=NULL;
            }
        delete [] mPtr;
        mPtr = NULL;
        mSize = 0;
    }
}
sArray::sArray()
{
   mPtr = NULL;
   mSize = 0;
}
sArray::sArray(unsigned int sizeArray)
{
    mSize = sizeArray;
    mPtr = new char * [mSize];
    if (mPtr == 0) { cerr << "Ошибка выделения памяти" << endl; abort(); }

    for(unsigned int i=0; i < mSize; i++)
        mPtr[i] = NULL;
}
sArray::sArray(const sArray & sA)
{
    set(sA, 1);
}
sArray::~sArray()
{
    Clear();
}
sArray & sArray::operator = (const sArray &sA)
{
    set(sA,1);
}
sArray & operator + (const sArray &sA,const sArray &sB)
{
    unsigned int cnt = sA.getSize();
    unsigned int k = cnt + sB.getSize();

    sArray temp(k);

    temp.set(sA,0);

    for (unsigned int i=0; i < sB.getSize()-1; i++)
    {
        if (!temp.find(sB[i]))
        {
            cerr << cnt+i << " " << sB.getSize() << " " << k << endl;
            temp.setAt(cnt+i,sB[i]);
            cnt++;
        }
    }

    return temp;
}
const char * sArray::operator[] (unsigned int i) const
{
    if (i < mSize)
        return mPtr[i];
    return "Ошибка! Выход за пределы массива!\n";
}
unsigned int sArray::getSize() const
{
    return mSize;
}
unsigned int sArray::getStringLen(unsigned int i) const
{
    if(i < mSize)
        return strlen(mPtr[i]);
    cerr << "Error! " << i << " >= " << mSize << endl;
    abort();
}
void sArray::set (const sArray &sA, bool f)
{
    if (f)
    {
        Clear();
        mSize = sA.getSize();
        mPtr = new char *[mSize];
        if (mPtr == 0) { cerr << "Ошибка выделения памяти" << endl; abort(); }
    }


    int sizeString;
    for(unsigned int i=0; i < sA.getSize(); i++)
    {
        sizeString = sA.getStringLen(i);
        if(sizeString>0)
        {
            mPtr[i]=new char[sizeString+1];
            if (mPtr[i] == 0) { cerr << "Ошибка выделения памяти" << endl; abort(); }
            strcpy(mPtr[i], sA[i]);
        }
    }
}
bool sArray::setAt(unsigned int i, const char *str)
{
    if (i < mSize)
    {
        if (!this->find(str))
        {
            if(mPtr[i])
                delete [] mPtr[i];
            mPtr[i] = new char [strlen(str)+1];
            if (mPtr[i] == 0) { cerr << "Ошибка выделения памяти" << endl; abort(); }
            strcpy(mPtr[i], str);
            return 1;
        }
        cerr << "Ошибка присваивания! Данная строка уже есть в массиве!\n";
        return 0;
    }
    cerr << "Ошибка в присваивании! Выход за пределы массива!\n";
    return 0;
}
void sArray::output()
{
   if (mSize == 0)
        cerr << "Ошибка! Массив строк пуст!";

   cerr << endl;
   for (unsigned int i=0; i < mSize; i++) { cerr << mPtr[i]; }
   cerr << endl;
}
bool sArray::find(const char* f)
{
    int k = 0;
    for (unsigned int i=0; i < mSize; i++)
    {
        k = strcoll(f, mPtr[i]);
        if ( k == 0 )
            return 1;
    }
    return 0;
}

int main()
{
    sArray sa(2);
    sa.setAt(0,"Hello, ");
    sa.setAt(1,"World!");

    sArray ka(3), kb;
    ka.setAt(0,"\nHi ");
    ka.setAt(1,"my ");
    ka.setAt(2,"world!");
    kb = sa + ka;
    kb.output();

    return 0;
}


Собственно две проблемы:
1) Как правильно реализовать перегрузку + (создаю sArray и возвращаю указатель на локальную переменную sArray temp) ?
Код

sArray & operator + (const sArray &sA,const sArray &sB)
{
    unsigned int cnt = sA.getSize();
    unsigned int k = cnt + sB.getSize();
    sArray temp(k);
    temp.set(sA,0);
    for (unsigned int i=0; i < sB.getSize()-1; i++)
    {
        if (!temp.find(sB[i]))
        {
            cerr << cnt+i << " " << sB.getSize() << " " << k << endl;
            temp.setAt(cnt+i,sB[i]);
            cnt++;
        }
    }
    return temp;
}

2) Почему вылетает прога на сравнении strcoll метода find!?
Код

bool sArray::find(const char* f)
{
    int k = 0;
    for (unsigned int i=0; i < mSize; i++)
    {
        k = strcoll(f, mPtr[i]);
        if ( k == 0 )
            return 1;
    }
    return 0;
}


Заранее благодарен за ответ!

Это сообщение отредактировал(а) SaNioK - 1.4.2010, 22:23
PM MAIL   Вверх
GoldFinch
Дата 1.4.2010, 22:54 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



SaNioK, 
1) возвращать надо значение, а не ссылку
ссылки на локальные нестатические переменные возвращать нельзя, они разрушаются при возврате из функции

2)для таких вопросов есть отладчик
PM MAIL ICQ   Вверх
SaNioK
Дата 1.4.2010, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



GoldFinch, 
Огромное спасибо за ответ! С первым разобрался.

По-поводу второго сейчас буду копать.
Решено! 
Еще раз огромное спасибо GoldFinch за быстрый и наводящий ответ!  smile 

Это сообщение отредактировал(а) SaNioK - 2.4.2010, 00:30
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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