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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с классом 
:(
    Опции темы
kolesnle
Дата 25.3.2013, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Упертый сишник
*


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

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



Код

#ifndef CNBTAKEOUTER_H
#define CNBTAKEOUTER_H
#include <fstream>
#include <string>
using namespace std;
class CnbTakeouter
{
public:
    CnbTakeouter()
    {

    }
    void setFileName(string& _fileName)
    {
        fileName = _fileName;
    }
    string* getInf() const
    {
        return inf;
    }
    setDirectives(string* _directives_b, string* _directives_e)
    {
        directives_b = _directives_b;
        directives_e = _directives_e;
    }
    void setCount(int _n)
    {
        n = _n;
    }
    ~CnbTakeouter()
    {

    }
protected:
    string fileName;
    virtual void eff()
    {
        const string inform;
        ifstream cnbFile(fileName.c_str());
        char* cinform;
        cnbFile>>cinform;
        copy(inform.begin(), inform.end(), cinform);
        int posBegins[n] = getArrayPos(inform, directives_b);
        int posEnds[n] = getArrayPos(inform, directives_e);
        string _result[n] = getArrayString(posBegins, posEnds, inform);
        inf = _result;
    }


    string* inf;
private:
    string* directives_b;
    string* directives_e;
    size_t n;

    unsigned int* getArrayPos(string* _inform, string* directives)
    {
        unsigned int pos[n];
        for(size_t i = 0; i < n; i++)
            pos[i] = posInf(_inform, directives[i]);
        return pos;
    }
    string getString(unsigned int& _begin, unsigned int& _end, string& baseString)
    {
        char* resultStr;
         int lengthStr = _end - _begin + 1;
        for(size_t i = 0; i < lengthStr; i++)
            resultStr[i] = baseString.c_str[_begin+i];
        return resultStr;
    }
    string* getArrayString(unsigned int* _begins,unsigned int* _ends, string& baseString )
    {
        string strings[n];
        for (size_t i=0; i < n; i++)
            strings[i] = getString(_begins[i], _ends[i], baseString);
        return strings;
    }
    unsigned int posInf(string& _inform, string& directive)
    {
        return  _inform.find(directive)+
                    directive.length();
    }
};

#endif

При компиляции выдает ошибки:
Код

|21|error: ISO C++ forbids declaration of 'setDirectives' with no type [-fpermissive]|
In member function 'int CnbParser::setDirectives(std::string*, std::string*)':|
|25|warning: no return statement in function returning non-void [-Wreturn-type]|
In member function 'virtual void CnbParser::eff()':|
|45|error: no matching function for call to 'CnbParser::getArrayPos(const string&, std::string*&)'|
|45|note: candidate is:|
|58|note: unsigned int* CnbParser::getArrayPos(std::string*, std::string*)|
|58|note:   no known conversion for argument 1 from 'const string {aka const std::basic_string<char>}' to 'std::string* {aka std::basic_string<char>*}'|
|45|error: variable-sized object 'posBegins' may not be initialized|
|46|error: no matching function for call to 'CnbParser::getArrayPos(const string&, std::string*&)'|
|46|note: candidate is:|
|58|note: unsigned int* CnbParser::getArrayPos(std::string*, std::string*)|
|58|note:   no known conversion for argument 1 from 'const string {aka const std::basic_string<char>}' to 'std::string* {aka std::basic_string<char>*}'|
|46|error: variable-sized object 'posEnds' may not be initialized|
|47|error: no matching function for call to 'CnbParser::getArrayString(int [(((sizetype)(((ssizetype)((CnbParser*)this)->CnbParser::n) + -1)) + 1)], int [(((sizetype)(((ssizetype)((CnbParser*)this)->CnbParser::n) + -1)) + 1)], const string&)'|
|47|note: candidate is:|
|73|note: std::string* CnbParser::getArrayString(unsigned int*, unsigned int*, std::string&)|
|73|note:   no known conversion for argument 3 from 'const string {aka const std::basic_string<char>}' to 'std::string& {aka std::basic_string<char>&}'|
|47|error: variable-sized object '_result' may not be initialized|
In member function 'unsigned int* CnbParser::getArrayPos(std::string*, std::string*)':|
|62|error: no matching function for call to 'CnbParser::posInf(std::string*&, std::string&)'|
|62|note: candidate is:|
|80|note: unsigned int CnbParser::posInf(std::string&, std::string&)|
|80|note:   no known conversion for argument 1 from 'std::string* {aka std::basic_string<char>*}' to 'std::string& {aka std::basic_string<char>&}'|
|60|warning: address of local variable 'pos' returned [enabled by default]|
||In member function 'std::string CnbParser::getString(unsigned int&, unsigned int&, std::string&)':|
|69|warning: comparison between signed and unsigned integer expressions [-Wsign-compare]|
|70|error: invalid types '<unresolved overloaded function type>[unsigned int]' for array subscript|
||In member function 'std::string* CnbParser::getArrayString(unsigned int*, unsigned int*, std::string&)':|
|75|warning: address of local variable 'strings' returned [enabled by default]|
||=== Build finished: 9 errors, 4 warnings (0 minutes, 2 seconds) ===|

Не могу понять в чем проблема. Вернее я понимаю, что она есть и что так писать нельзя, но не понимаю, как можно

Это сообщение отредактировал(а) kolesnle - 25.3.2013, 15:42
PM MAIL   Вверх
bsa
Дата 25.3.2013, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



1. если ты используешь передачу параметров по ссылке, и не меняешь их внутри функции, то используй константную ссылку: const string&
2. нет смысла передавать стандартные числовые типы и указатели по ссылке, если ты их не меняешь внутри функции.
3. внимательно изучай сообщения об ошибках, в частности, параметры функций приведенные в них.
PM   Вверх
kolesnle
Дата 25.3.2013, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Упертый сишник
*


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

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



Огромное спасибо! Попробую исправить...

Добавлено @ 16:06
У меня возник вопрос по ошибке


Код

|45|error: no matching function for call to 'CnbTakeouter::getArrayPos(const string&, std::string*&)'|



У меня написано:
Код

unsigned int* getArrayPos(const string* _inform, const string* directives)


Откуда?

Это сообщение отредактировал(а) kolesnle - 25.3.2013, 16:08
PM MAIL   Вверх
borisbn
Дата 25.3.2013, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



kolesnle, выкинь это. В этом больше ошибок, чем строк. Лучше расскажи, что есть на входе, что должно быть на выходе, и что должна делать программа, чтобы получить этот выход. По русски. Без программирования


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
kolesnle
Дата 25.3.2013, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Упертый сишник
*


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

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



На входе должен быть файл. В котором  должно быть написано что-то вроде:
Код

 DIRECTIVE1informaton1END_DIRECTIVE1DIRECTIVE2information2END_DIRECTIVE2

Эти "директивы" я хотел передать в виде массива. Ну а на выходе массив в котором information1, information2

PM MAIL   Вверх
borisbn
Дата 25.3.2013, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Конец директивы тоже передавать или программа может сама добавить END_ ?


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
kolesnle
Дата 25.3.2013, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Упертый сишник
*


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

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



тоже передавать
PM MAIL   Вверх
borisbn
Дата 25.3.2013, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



лови. http://liveworkspace.org/code/1KiuHb$4
нужно сделать ввод строки из файла (он у тебя тоже неправильный) и передать её в parseStirng.
погугли на предмет "чтение всего файла в std::string"


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
kolesnle
Дата 25.3.2013, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Упертый сишник
*


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

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



спасибо
PM MAIL   Вверх
kolesnle
  Дата 26.3.2013, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Упертый сишник
*


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

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



Вообщем я переписал код(у меня вчера не работал liveworkspace )
Код

    vector<string> takeof(const string &fileName, const vector<string> &directives_b, const vector<string> &directives_e)
    {
          vector<string> resultVector;
          //string inf;;
          std::ifstream ifs(fileName.c_str());
          std::string inf(
         (std::istreambuf_iterator<char>(ifs))
         ,std::istreambuf_iterator<char>());

           size_t bsize = directives_b.size();
           size_t esize = directives_e.size();
           if (bsize == 0 || esize == 0||bsize!=esize)
              while(true);

            vector<unsigned int> pos_b(bsize);
            vector<unsigned int> pos_e(esize);

            for(size_t i = 0; i < bsize; i++)
                pos_b[i] = inf.find(directives_b[i])+directives_b[i].length();

            for(size_t i = 0; i < esize; i++)
                pos_e[i] = inf.find(directives_e[i])+directives_e[i].length();

            for(size_t i = 0; i < bsize; i++)
                resultVector[i] = inf.substr(pos_b[i], pos_e[i]);
             return resultVector;
    }

Теперь все компилируется, но не работает, когда я передаю ему директивы и пытаюсь это вывести на экран gdb пишет: 
"Program received signal SIGSEGV, Segmentation fault.", я не понимаю откуда? Я же памятью не кидался тут особо

Это сообщение отредактировал(а) kolesnle - 26.3.2013, 12:42
PM MAIL   Вверх
borisbn
Дата 26.3.2013, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



1) 
Цитата(kolesnle @  26.3.2013,  12:12 Найти цитируемый пост)
pos_b[i] = inf.find(directives_b[i])+directives_b[i].length();

нужно так
Код
pos_b.push_back( inf.find(directives_b[i])+directives_b[i].length() );

для pos_e аналогично

2) тебе нужно, чтобы в результате была информация И конечная директива ? Если нет, то
Цитата(kolesnle @  26.3.2013,  12:12 Найти цитируемый пост)
pos_e[i] = inf.find(directives_e[i])+directives_e[i].length();

выделенное - лишнее

3) неплохо было бы проверять, что директива найдена. нет ?

4)
Цитата(kolesnle @  26.3.2013,  12:12 Найти цитируемый пост)
if (bsize == 0 || esize == 0||bsize!=esize)
              while(true);

 smile 
тогда уж
Код
throw(std::length_error("bla bla"));


а вообще - гораздо лучше )



P.S. kolesnle, признавайся, сам(а) делал(а) ?

Это сообщение отредактировал(а) borisbn - 26.3.2013, 12:48


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
kolesnle
Дата 26.3.2013, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Упертый сишник
*


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

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



Сам.

Код

    vector<string> takeof(const string &fileName, const vector<string> &directives_b, const vector<string> &directives_e)
    {
          vector<string> resultVector;
          //string inf;;
          std::ifstream ifs(fileName.c_str());
          std::string inf(
         (std::istreambuf_iterator<char>(ifs))
         ,std::istreambuf_iterator<char>());

           size_t bsize = directives_b.size();
           size_t esize = directives_e.size();
           if (bsize == 0 || esize == 0||bsize!=esize)
              throw(std::length_error("Error! Something is not right"));

            vector<unsigned int> pos_b(bsize);
            vector<unsigned int> pos_e(esize);

            for(size_t i = 0; i < bsize; i++)
                pos_b.push_back(inf.find(directives_b[i]));

            for(size_t i = 0; i < esize; i++)
                pos_e.push_back(inf.find(directives_e[i]));

            for(size_t i = 0; i < bsize; i++)
                resultVector.push_back(inf.substr(pos_b[i], pos_e[i]));
            return resultVector;
    }

Переписал, все равно не работает, хотя никаких ошибок памяти не выдает
Если бы не сам делал - ошибок бы не было smile Если присмотреться, мой почерк просматривается. А как проверять так, чтобы не особо ветвить код? А то как-то smile

Это сообщение отредактировал(а) kolesnle - 26.3.2013, 13:11
PM MAIL   Вверх
borisbn
Дата 26.3.2013, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(borisbn @  26.3.2013,  12:44 Найти цитируемый пост)
нужно так

пардон. неправильно. не заметил, что ты векторы ресайзишь при создании
Цитата(kolesnle @  26.3.2013,  13:03 Найти цитируемый пост)
 vector<unsigned int> pos_b(bsize);

вот рабочий код
Код
vector<string> takeof(const string &/*fileName*/, const vector<string> &directives_b, const vector<string> &directives_e)
{
      vector<string> resultVector;
      //string inf;;
      //std::ifstream ifs(fileName.c_str());
      //std::string inf(
     //(std::istreambuf_iterator<char>(ifs))
     //,std::istreambuf_iterator<char>());
       std::string inf = "DIRECTIVE1informaton1END_DIRECTIVE1DIRECTIVE2information2END_DIRECTIVE2";
       size_t bsize = directives_b.size();
       size_t esize = directives_e.size();
       if (bsize == 0 || esize == 0||bsize!=esize)
          throw(std::length_error("Error! Something is not right"));
        vector<unsigned int> pos_b(bsize);
        vector<unsigned int> pos_e(esize);
        for(size_t i = 0; i < bsize; i++)
            pos_b[ i ] = inf.find(directives_b[i]) + directives_b[i].length();
        for(size_t i = 0; i < esize; i++)
            pos_e[ i ] = inf.find(directives_e[i]);
        for(size_t i = 0; i < bsize; i++)
            resultVector.push_back(inf.substr(pos_b[i], pos_e[i] - pos_b[i] ));
        return resultVector;
}

int main() {
    vector< string > res = takeof( "", { "DIRECTIVE1", "DIRECTIVE2" }, { "END_DIRECTIVE1", "END_DIRECTIVE2" } );
    for ( const string & s : res ) {
        cout << s << endl;
    }
}

Цитата
informaton1
information2


http://liveworkspace.org/code/23TbLo$10

Это сообщение отредактировал(а) borisbn - 26.3.2013, 13:30


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
kolesnle
Дата 26.3.2013, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Упертый сишник
*


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

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



Вечная слава тебе, о borisbn!  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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