Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Массив указателей на структуры.


Автор: Mal Hack 19.8.2007, 20:07
Чую я, что упускаю какую-то мелочь, лиюо мысль пошла не в том направлении...
Суть задачи. В программу водится n функций  (пример: sin(PI)*34-34), затем должен быть произведен разбор каждой функции и ее вычисление.

Каждая функция со своими параметрами пишется в структуру:
Код
enum fncType {X,Y};

struct stFnc
{
    int index;
    string name;
    string code;
    string code_wfnc;
    string code_wbrakes;
    fncType type;
    
    string Stack[];    
};

Так вот. Кол-во функций, а следовательно и массив этих структур - динамические.
Объявляю, как:    
Код

struct stFnc *fnc[];

внутри private раздела своего класса, .h которого выглядит так:
Код
class clsFncParse
{
    public:
    clsFncParse(void);
    
    private:
    void parseFnc(int i);
    void parseStdFunctions(struct stFnc *);
    struct stFnc *fnc[];
}

Так описываю конструктор:
Код
clsFncParse::clsFncParse(void)
{
    fnc[0] = new stFnc();
    
    fnc[0]->index = 0;
    fnc[0]->code = "sin(x)+23+34.34*23*(2+2)";
    fnc[0]->code_wfnc=fnc[0]->code;
    
    parseFnc(0);
}

При компиляции (Linux Debian stable, qmake, make QDevelop Qt4) получаю совершенно не понятные мне ошибки...
Цитата
/usr/include/qt4/QtCore/qglobal.h:567: error: two or more data types in declaration of ‘qint8’
/usr/include/qt4/QtCore/qglobal.h:567: error: long, short, signed or unsigned invalid for ‘qint8’
/usr/include/qt4/QtCore/qdatastream.h: In member function ‘QDataStream& QDataStream::operator<<(quint8)’:
/usr/include/qt4/QtCore/qdatastream.h:195: error: no matching function for call to ‘clsFncParse::clsFncParse(quint8&)’
src/functionparsing.h:23: note: candidates are: clsFncParse::clsFncParse()
src/functionparsing.h:21: note:                 clsFncParse::clsFncParse(const clsFncParse&)

Ошибки - первые, поэтому, я сомневаюсь, что они - следствие предыдущих или каки-то других...
Вроде бы, конструктор описан в соответствии с заголовочным файлом.
В чем я мог наврать?

Заранее спасибо...

Автор: bsa 19.8.2007, 20:11
Вообще-то так:
Код
struct stFnc *fnc[];
нестатические члены класса я бы не определял. Попробуй для начала:
Код
struct stFnc **fnc;

Автор: zkv 19.8.2007, 20:19
Цитата(Mal Hack @  19.8.2007,  20:07 Найти цитируемый пост)
Так вот. Кол-во функций, а следовательно и массив этих структур - динамические.

думаю, что этим словам должна соответствовать такая запись:
Код

class clsFncParse
{
public:
    clsFncParse(void);
    
private:
    void parseFnc(int i);
    void parseStdFunctions(struct stFnc *);
    stFnc *fnc;
};

Автор: Mal Hack 19.8.2007, 20:26
Спасибо, учел. Но на ошибки, это не повлияло.

Добавлено через 1 минуту и 43 секунды
Цитата(zkv @  19.8.2007,  20:19 Найти цитируемый пост)
    stFnc *fnc;

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

Прошу прощения, если несколько не так выражаюсь.

Автор: Xenon 19.8.2007, 20:31
Mal Hack, ну тогда тебе указатель на указатель нужен. И нужно знать количество структур, если они распологаются в массиве.

Автор: Mal Hack 19.8.2007, 20:36
Xenon, а как тогда? Структур - n, следовательно надо объявлять массив структур из n элементов, следовательно указатель.

Автор: zkv 19.8.2007, 20:45
чего то я не понимаю, вот пример:
Код

int f( int *pInt ); //прототип некоторой функции
//...
int *arrInt = new int[10]; //вот динамический массив из 10 элементов типа int
arrInt[0] = 5; //обращение к первому элементу
f( &arrInt[0] ); //передача в функцию

а по существу вопроса, эта строка меня смущает: 
Цитата(Mal Hack @  19.8.2007,  20:07 Найти цитируемый пост)
   string Stack[];   

вспоминаю, что в мсдн была запись что такую конструкцию можно употреблять в качестве последнего члена структуры, но это microsoft specific. Что стандарт по этому поводу говорит - не знаю.

Автор: Mal Hack 19.8.2007, 20:52
Цитата(zkv @  19.8.2007,  20:45 Найти цитируемый пост)
а по существу вопроса, эта строка меня смущает: 

Чем?

Цитата(zkv @  19.8.2007,  20:45 Найти цитируемый пост)
чего то я не понимаю, вот пример:

Так я вроде бы так и делаю...
Ошибка-то завязано на конструкторе класса, как я понимаю.

Автор: Fazil6 19.8.2007, 21:03
Цитата(Mal Hack @  19.8.2007,  20:36 Найти цитируемый пост)
Структур - n, следовательно надо объявлять массив структур из n элементов, следовательно указатель.

а почему не пользоваться std::vector ? Код в конструкторе вкорне неправильный. Обращение к нулевому элементу без всяких выделений памяти под какие-то нибыло элементы.
по поводу ошибки, скорее всего дело в отсутствии где-то в конце объявления класса ;

Автор: zkv 19.8.2007, 21:04
Mal Hack, собрал твой пример в студии (VS2005), в таком виде:
Код

#include <string>

using namespace std;

enum fncType 
{
    X,
    Y
};

struct stFnc
{
    int index;
    string name;
    string code;
    string code_wfnc;
    string code_wbrakes;
    fncType type;
    
    string Stack[];    
};

class clsFncParse
{
public:
    clsFncParse(void);
    
private:
    void parseFnc(int i);
    void parseStdFunctions(struct stFnc *);
    struct stFnc *fnc[];
};

clsFncParse::clsFncParse(void)
{
    fnc[0] = new stFnc();
    
    fnc[0]->index = 0;
    fnc[0]->code = "sin(x)+23+34.34*23*(2+2)";
    fnc[0]->code_wfnc=fnc[0]->code;
    
    parseFnc(0);
}

void clsFncParse::parseFnc(int i)
{
    return;
}

int main()
{
    clsFncParse p;
}

только пару warning'ов выдает:
Цитата

.\main.cpp(21) : warning C4200: nonstandard extension used : zero-sized array in struct/union
        Cannot generate copy-ctor or copy-assignment operator when UDT contains a zero-sized array
.\main.cpp(32) : warning C4200: nonstandard extension used : zero-sized array in struct/union
        Cannot generate copy-ctor or copy-assignment operator when UDT contains a zero-sized array

Автор: Mal Hack 19.8.2007, 21:27
Цитата(Fazil6 @  19.8.2007,  21:03 Найти цитируемый пост)
по поводу ошибки, скорее всего дело в отсутствии где-то в конце объявления класса ; 

Так и оказалось... Блин, бывае же :(
Спасибо.

Цитата(Fazil6 @  19.8.2007,  21:03 Найти цитируемый пост)
а почему не пользоваться std::vector ?

Это что?

Цитата(Fazil6 @  19.8.2007,  21:03 Найти цитируемый пост)
Код в конструкторе вкорне неправильный. Обращение к нулевому элементу без всяких выделений памяти под какие-то нибыло элементы.

А new же там есть? Конструктор сейчас так, для теста с таким кодом идет.

Автор: Xenon 19.8.2007, 21:30
Mal Hack, std::vector - динамический контейнерю

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)