Проблема с классом

 
0
 
C++
ava
kolesnle | 25.03.2013, 16:15

#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

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

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

Не могу понять в чем проблема. Вернее я понимаю, что она есть и что так писать нельзя, но не понимаю, как можно
Ответы (13)
ava
bsa | 25.03.2013, 15:56 #
1. если ты используешь передачу параметров по ссылке, и не меняешь их внутри функции, то используй константную ссылку: const string&
2. нет смысла передавать стандартные числовые типы и указатели по ссылке, если ты их не меняешь внутри функции.
3. внимательно изучай сообщения об ошибках, в частности, параметры функций приведенные в них.
ava
kolesnle | 25.03.2013, 16:00 #
Огромное спасибо! Попробую исправить...
ava
borisbn | 25.03.2013, 16:39 #
kolesnle, выкинь это. В этом больше ошибок, чем строк. Лучше расскажи, что есть на входе, что должно быть на выходе, и что должна делать программа, чтобы получить этот выход. По русски. Без программирования
ava
kolesnle | 25.03.2013, 16:51 #
На входе должен быть файл. В котором  должно быть написано что-то вроде:

DIRECTIVE1informaton1END_DIRECTIVE1DIRECTIVE2information2END_DIRECTIVE2

Эти "директивы" я хотел передать в виде массива. Ну а на выходе массив в котором information1, information2
ava
borisbn | 25.03.2013, 16:54 #
Конец директивы тоже передавать или программа может сама добавить END_ ?
ava
kolesnle | 25.03.2013, 16:55 #
тоже передавать
ava
borisbn | 25.03.2013, 17:23 #
лови. http://liveworkspace.org/code/1KiuHb$4
нужно сделать ввод строки из файла (он у тебя тоже неправильный) и передать её в parseStirng.
погугли на предмет "чтение всего файла в std::string"
ava
kolesnle | 25.03.2013, 17:28 #
спасибо
ava
kolesnle | 26.03.2013, 12:12 #
Вообщем я переписал код(у меня вчера не работал 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."
ava
borisbn | 26.03.2013, 12:44 #
1)
Цитата (kolesnle @  26.3.2013,  12:12 findReferencedText)
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 findReferencedText)
pos_e[i] = inf.find(directives_e[i])+directives_e[i].length();

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

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

4)
Цитата (kolesnle @  26.3.2013,  12:12 findReferencedText)
if (bsize == 0 || esize == 0||bsize!=esize)
      while(true);

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


а вообще - гораздо лучше )
ava
kolesnle | 26.03.2013, 13:03 #
Сам.


    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 Если присмотреться, мой почерк просматривается
ava
borisbn | 26.03.2013, 13:28 #
Цитата (borisbn @  26.3.2013,  12:44 findReferencedText)
нужно так

пардон. неправильно. не заметил, что ты векторы ресайзишь при создании
Цитата (kolesnle @  26.3.2013,  13:03 findReferencedText)
 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;
}


вот рабочий код
ava
kolesnle | 26.03.2013, 13:49 #
Вечная слава тебе, о borisbn!  smile 
Зарегистрируйтесь или войдите, чтобы написать.
Фирма дня
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Участники
ava  bsa ava  borisbn   kolesnle
advanced
Отправить