WWW.ИСХОДНИКИ.РУ cpp.sources.ru
java.sources.ru web.sources.ru soft.sources.ru
jdbc.sources.ru asp.sources.ru api.sources.ru

  Форум на исходниках
  C / C++ / Visual C++
  Выход за границы Массива

СПРОСИТЬ  ОТВЕТИТЬ
профайл | регистрация | faq

Автор Тема:   Выход за границы Массива
zlelik опубликован 24-01-2002 23:18 MSK   Click Here to See the Profile for zlelik   Click Here to Email zlelik  
Как отследить выход за границы массива (out of bounds). CArray не катит, нужны чистые

int lpArray[];

Flex Ferrum опубликован 24-01-2002 23:45 MSK     Click Here to See the Profile for Flex Ferrum  Click Here to Email Flex Ferrum     
В таком случае - никак...
Glite опубликован 25-01-2002 03:08 MSK     Click Here to See the Profile for Glite  Click Here to Email Glite     
1. Можно хранить ещё и размер массива.
2. Как в строках - выбрать какой-то граничный элемент и в конце ставить его, потом проверять. Единственное, его ты потом использовать в массиве не сможешь.
ADK опубликован 25-01-2002 06:11 MSK     Click Here to See the Profile for ADK  Click Here to Email ADK     
2FlexFerrum: как понять "никак", ведь класс "безопасного массива" приводится в любом нормальном руководстве по C++. Да и самому написать за полчаса можно, перегрузи операции [], добавь свои и т.д. Насчёт строк - вот мой самопальный класс CSimpleStrArray, который пока удовляетворяет мои скромные потребности. Когда что-то понадобится, я его расширяю...

class CSimpleStrArray
{
public:
int IndexOf(LPCSTR szString);
void Clear();
bool Contains(LPCSTR szString);
void RemoveAll();
CSimpleStrArray(int nNewSize = 0, int nGrowBy = 1);
virtual ~CSimpleStrArray();
void Add(LPCSTR szString);
void AddToBegin(LPCSTR szString);
bool SetSize(int nNewSize, int nGrowBy);
LPSTR operator[](int nIndex)
{
ASSERT(nIndex >= 0 && nIndex < m_nSize);
return m_szStrings[nIndex];
}

int GetUpperBound(){return m_nUpperBound;}
bool OneOfBeginsWith(const CString& str);

private:
CSimpleStrArray(const CSimpleStrArray&){}
operator = (const CSimpleStrArray&){}

TCHAR ** m_szStrings;
int m_nUpperBound, m_nSize, m_nGrowBy;
};


// Реализация

CSimpleStrArray::CSimpleStrArray(int nNewSize, int nGrowBy)
{
m_nUpperBound = -1;
m_szStrings = NULL;
SetSize(nNewSize, nGrowBy);
}

CSimpleStrArray::~CSimpleStrArray()
{
Clear();
}

void CSimpleStrArray::Add(LPCSTR szString)
{
m_nUpperBound++;

if(m_nUpperBound >= m_nSize)
{
TCHAR** szNewStrings = new TCHAR* [m_nSize + m_nGrowBy];
ASSERT(szNewStrings);

if(m_nSize)
{
CopyMemory(szNewStrings, m_szStrings, m_nSize * sizeof(TCHAR*));
}

delete [] m_szStrings;
m_nSize += m_nGrowBy;
m_szStrings = szNewStrings;
}

m_szStrings[m_nUpperBound] = new TCHAR[strlen(szString) + 1];
strcpy(m_szStrings[m_nUpperBound], szString);
}

void CSimpleStrArray::AddToBegin(LPCSTR szString)
{
TCHAR** szNewStrings = new TCHAR* [m_nSize + 1];
ASSERT(szNewStrings);
szNewStrings[0] = new TCHAR[strlen(szString) + 1];
strcpy(szNewStrings[0], szString);

if(m_nSize)
{
CopyMemory(szNewStrings + 1, m_szStrings, m_nSize * sizeof(TCHAR*));
}

delete[] m_szStrings;
m_szStrings = szNewStrings;
m_nSize++;
m_nUpperBound++;
}


void CSimpleStrArray::Clear()
{
for(int i = 0; i <= m_nUpperBound; i++)
{
delete[] m_szStrings[i];
}

delete[] m_szStrings;

m_nUpperBound = -1;
m_szStrings = NULL;
m_nSize = 0;
}


bool CSimpleStrArray::SetSize(int nNewSize, int nGrowBy)
{
ASSERT(nNewSize >= 0 && nGrowBy > 0);
ASSERT(m_szStrings == NULL);

if(nNewSize)
{
m_szStrings = new TCHAR* [nNewSize];
ASSERT(m_szStrings);
if(!m_szStrings) return false;
}

m_nSize = nNewSize;
m_nGrowBy = nGrowBy;
return true;

}

void CSimpleStrArray::RemoveAll()
{
for(int i = 0; i <= m_nUpperBound; i++)
{
delete[] m_szStrings[i];
}

delete[] m_szStrings;
m_nSize = 0;
m_nUpperBound = -1;
m_szStrings = NULL;
}

bool CSimpleStrArray::Contains(LPCSTR szString)
{
for(int i = 0; i <= m_nUpperBound; i++)
{
if(!lstrcmp(m_szStrings[i], szString)) return true;
}

return false;
}

// -1, åñëè íåò âõîæäåíèÿ

int CSimpleStrArray::IndexOf(LPCSTR szString)
{
for(int i = 0; i <= m_nUpperBound; i++)
{
if(!lstrcmp(m_szStrings[i], szString)) return i;
}

return -1;
}


bool CSimpleStrArray::OneOfBeginsWith(const CString &str)
{
static char szBuf[50];
int nLength;

for(int i = 0; i <= m_nUpperBound; i++)
{
nLength = lstrlen(m_szStrings[i]);
//TRACE("Äëèíà òðèãåðà = %d\n", nLength);
lstrcpyn(szBuf, str, (nLength < sizeof(szBuf) ? nLength + 1 : sizeof(szBuf)));

//TRACE("Òðèããåðû: %s è %s\n", szBuf, m_szStrings[i]);
if(!lstrcmpi(szBuf, m_szStrings[i])) return true;
}

return false;
}

ADK опубликован 25-01-2002 06:18 MSK     Click Here to See the Profile for ADK  Click Here to Email ADK     
Ни о какой универсальности речь не идёт, делал для себя. Насчёт TCHAR: хотел начале поддержать UNICODE, но потом расхотел...
Flex Ferrum опубликован 25-01-2002 09:34 MSK     Click Here to See the Profile for Flex Ferrum  Click Here to Email Flex Ferrum     
ADK: Человек ясно написал, что варианты с классами для него не кактят. Потому и получил такой ответ. А то, что задача создания "безопастного" массива решаятеся практически в каждой книжке по С++ - это мне известно. У любой подобной реализации есть один "маленький" недостаток - очень много (в том смысле, что в некоторых случаях непозволительно много) времени тратится на индексирование...
ADK опубликован 25-01-2002 10:33 MSK     Click Here to See the Profile for ADK  Click Here to Email ADK     
А я понял, что челу не катит MFC, нужны чистые API. За удобство, понятно, следует расплата.
zlelik опубликован 25-01-2002 21:35 MSK     Click Here to See the Profile for zlelik  Click Here to Email zlelik     
Мне не катят классы потому что прогу надо будет компилить под DSP процессор! А в том компиляторе С наверняка нет классов вообще и скорость нужна.

СПРОСИТЬ  ОТВЕТИТЬ
Перейти:


E-mail | WWW.ИСХОДНИКИ.RU

Powered by: Ultimate Bulletin Board, Freeware Version 5.10a
Purchase our Licensed Version- which adds many more features!
© Infopop Corporation (formerly Madrona Park, Inc.), 1998 - 2000.