Форум программистов
 
Регистрация на форуме тут, о проблемах пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль

Купить рекламу на форуме 15-35 тыс рублей в месяц

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы Поиск в этой теме
Старый 30.05.2009, 02:02   #1
artush1984
Форумчанин
 
Аватар для artush1984
 
Регистрация: 27.04.2009
Сообщений: 184
По умолчанию Просто не понимаю б чём проблема!!!!!!!(char* && index)

Здраствуйте!!!!! помогите пожлуста разобраца!!!!! выдоёт ошибку "инструкция по какому то адрессу обратилас к памяти по какому то адрессу памят не может быт read"

Код:
/ Class automatically generated by Dev-C++ New Class wizard
#ifndef STRINGS_H
#define STRINGS_H

/*
 * No description
 */
class strings
{
	public:
		strings(char *p_string,int p_partSize = 128);
		~strings();
		char &operator[](int index); 
		void Add(char value);
		void Print(void);
		int GetSize(){return m_logicSize;};
	private:
       		 int m_logicSize;
      		  int m_partSize;
       		 int m_realSize;
       		 char *m_string;
       		 void Reallocate(void);
};

#endif // STRINGS_H
Код:
#include <iostream>
#include "strings.h"

using namespace std;

int main(int argc, char *argv[])
{
    strings *toh = new strings("artush");
    toh->Add('a');
    toh->Print();
    std::cout<<toh->GetSize()<<std::endl;
    system("PAUSE");
    return EXIT_SUCCESS;
}
Код:
#include "strings.h"
#include<iostream>
#define _INDEX_CONTROL
// class constructor
strings::strings(char *p_string,int p_partSize)
{
        if(p_partSize<=0)
        {
                m_partSize = 32;
        }
        else
        {
                m_partSize = p_partSize;
        }
        
        for(int i =0;p_string[i] != 0;i++)
        {m_logicSize = (i+1);}
        m_realSize = m_logicSize + p_partSize;
        if(m_logicSize>0)
        {
                m_string = p_string;
        }
        else
        {
                m_string = NULL;
                m_realSize = 0;
        }
}

// class destructor
strings::~strings()
{
	if (m_string !=NULL)
        	delete []m_string;
}

char &strings::operator[](int index) ///??????????????????????????????????????
{
#ifdef _INDEX_CONTROL
    assert(index > 0 && index <= m_logicSize);
#endif
    return m_string[index];    
}
void strings::Reallocate(void)
{
    char newstrings[m_realSize + m_partSize];
    m_realSize += m_partSize;
    for(int i = 0;i < m_logicSize;i++)
    {
        newstrings[i] = m_string[i];
    }
    delete []m_string;
    m_string = newstrings;
}
void strings::Add(char value)
{
    if(m_realSize == m_logicSize)
        Reallocate();
    m_logicSize++;
    m_string[m_logicSize - 1] = value;
    
}
void strings::Print(void)
{
    for(int i = 0; i < m_logicSize;i++)
    std::cout<<m_string[i]<<std::endl;
}
Модератор: использование аттачей для исходного кода запрещено!
Hа C я могy пpосто делать ошибки, на C++ я могy их наследовать!

Последний раз редактировалось Sazary; 30.05.2009 в 02:17.
artush1984 вне форума Ответить с цитированием
Старый 30.05.2009, 02:10   #2
vasek123
Заблокирован
 
Регистрация: 21.11.2008
Сообщений: 4,988
Сообщение

Код:
#include <iostream>
#include "strings.h"
using namespace std;
int main(int argc, char *argv[])
{
    strings *toh = new strings("artush");
    toh->Add('a');
    toh->Print();
    std::cout<<toh->GetSize()<<std::endl;
    system("PAUSE");
    return EXIT_SUCCESS;
    delete toh;
    toh=NULL;//По моему не мешает
    вставить
}
Упс... На файл s.txt не глянул... Перепишите свой код, заключив его в теги, а то без стакана не разобраться!

Последний раз редактировалось vasek123; 30.05.2009 в 02:17.
vasek123 вне форума Ответить с цитированием
Старый 30.05.2009, 02:11   #3
artush1984
Форумчанин
 
Аватар для artush1984
 
Регистрация: 27.04.2009
Сообщений: 184
По умолчанию

Вообшем создаёт обект Print()иGetSize() работают а когда дело доходит до Add('a') то ERROR!!!!!!
Hа C я могy пpосто делать ошибки, на C++ я могy их наследовать!
artush1984 вне форума Ответить с цитированием
Старый 30.05.2009, 02:14   #4
artush1984
Форумчанин
 
Аватар для artush1984
 
Регистрация: 27.04.2009
Сообщений: 184
По умолчанию

Извени но я нечего не понял!!!!!!!Но помоему тоже должно работать
Hа C я могy пpосто делать ошибки, на C++ я могy их наследовать!
artush1984 вне форума Ответить с цитированием
Старый 30.05.2009, 02:39   #5
vvviperrr
Тупой студент
Форумчанин
 
Аватар для vvviperrr
 
Регистрация: 12.05.2007
Сообщений: 614
По умолчанию

Код:
void strings::Reallocate(void)
{
    char newstrings[m_realSize + m_partSize];
    m_realSize += m_partSize;
    for(int i = 0;i < m_logicSize;i++)
    {
        newstrings[i] = m_string[i];
    }
    delete []m_string;
    m_string = newstrings;
}
ты объявил ЛОКАЛЬНЫЙ СТАТИЧЕСКИЙ (эти слова важны, поэтому капс лок) массив newstrings. в конце своей функции ты ка бы сохраняешь указатель на этот массив. но после выхода их функции твой массив уничтожается, и указатель становится недействительным. вот и все. код писать не буду - сам потренируйся.
vvviperrr вне форума Ответить с цитированием
Старый 30.05.2009, 02:45   #6
artush1984
Форумчанин
 
Аватар для artush1984
 
Регистрация: 27.04.2009
Сообщений: 184
По умолчанию

сапсибо!!!! За совет!!!!! А За то што код не написали большое спасибо!!!!
Hа C я могy пpосто делать ошибки, на C++ я могy их наследовать!
artush1984 вне форума Ответить с цитированием
Старый 30.05.2009, 02:46   #7
vasek123
Заблокирован
 
Регистрация: 21.11.2008
Сообщений: 4,988
Сообщение

Из листинга ясно что вы размещаете класс strings в динамической памяти но, потом, по завершению программы, не освобождаете память...
vasek123 вне форума Ответить с цитированием
Старый 30.05.2009, 02:50   #8
vvviperrr
Тупой студент
Форумчанин
 
Аватар для vvviperrr
 
Регистрация: 12.05.2007
Сообщений: 614
По умолчанию

2vasek123 в данном случае это делать не обязательно, т.к конец программы, система сама освободит всю занятую приложением память
vvviperrr вне форума Ответить с цитированием
Старый 30.05.2009, 02:51   #9
artush1984
Форумчанин
 
Аватар для artush1984
 
Регистрация: 27.04.2009
Сообщений: 184
По умолчанию

сапсибо!!!! учту обязательно!!!!! !!
Hа C я могy пpосто делать ошибки, на C++ я могy их наследовать!
artush1984 вне форума Ответить с цитированием
Старый 30.05.2009, 02:58   #10
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

vvviperrr +1

Но тут до Reallocate дело вообще не дойдет.
Программа вылетает на строчке
Код:
m_string[m_logicSize - 1] = value;
в функции Add. И неудивительно.

В конструкторе m_string присваивается константа:
Код:
strings::strings(char *p_string,int p_partSize)
................
m_string = p_string;
В функции Add, для данного примера, вот сюда мы не зайдем:
Код:
if(m_realSize == m_logicSize)
        Reallocate();
А перескочим прямо сюда:
Код:
m_string[m_logicSize - 1] = value;
Но m_string - указатель на константу. Вот и выкидывает.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Ответ
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
if && assert artush1984 Общие вопросы C/C++ 2 25.05.2009 02:29
C++ && eval() in PHP Saniok Общие вопросы C/C++ 12 05.11.2008 17:55
Проблема с MVC++ 2005 && 2008 на висте NetGod Софт 1 09.08.2008 17:14
Delphi & Access & Ole vodila БД в Delphi 0 15.07.2008 11:11
Не понимаю в чём ошибка Editor Общие вопросы Delphi 4 24.04.2008 08:00