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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Массив указателей на структуры. 
:(
    Опции темы
Mal Hack
Дата 19.8.2007, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


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

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



Чую я, что упускаю какую-то мелочь, лиюо мысль пошла не в том направлении...
Суть задачи. В программу водится 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&)

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

Заранее спасибо...
PM ICQ   Вверх
bsa
Дата 19.8.2007, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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

PM   Вверх
zkv
Дата 19.8.2007, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

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



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

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

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

PM MAIL   Вверх
Mal Hack
Дата 19.8.2007, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


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

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



Спасибо, учел. Но на ошибки, это не повлияло.

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

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

Прошу прощения, если несколько не так выражаюсь.
PM ICQ   Вверх
Xenon
Дата 19.8.2007, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



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


--------------------
user posted image  
PM MAIL   Вверх
Mal Hack
Дата 19.8.2007, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


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

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



Xenon, а как тогда? Структур - n, следовательно надо объявлять массив структур из n элементов, следовательно указатель.
PM ICQ   Вверх
zkv
Дата 19.8.2007, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

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



чего то я не понимаю, вот пример:
Код

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. Что стандарт по этому поводу говорит - не знаю.
PM MAIL   Вверх
Mal Hack
Дата 19.8.2007, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


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

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



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

Чем?

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

Так я вроде бы так и делаю...
Ошибка-то завязано на конструкторе класса, как я понимаю.
PM ICQ   Вверх
Fazil6
Дата 19.8.2007, 21:03 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



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

а почему не пользоваться std::vector ? Код в конструкторе вкорне неправильный. Обращение к нулевому элементу без всяких выделений памяти под какие-то нибыло элементы.
по поводу ошибки, скорее всего дело в отсутствии где-то в конце объявления класса ;
PM MAIL   Вверх
zkv
Дата 19.8.2007, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

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



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

PM MAIL   Вверх
Mal Hack
Дата 19.8.2007, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


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

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



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

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

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

Это что?

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

А new же там есть? Конструктор сейчас так, для теста с таким кодом идет.
PM ICQ   Вверх
Xenon
Дата 19.8.2007, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Mal Hack, std::vector - динамический контейнерю


--------------------
user posted image  
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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