Запутался в "указателях на указатели"

Модератор: Fastman

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: Запутался в "указателях на указатели"

Непрочитанное сообщение paradox » 2009-05-19 12:10:01

ну тык new аля обьект и добавляешь в new массив
вообщем тема долгая

я тебя о другом просил
пример кода немного не соответсвтует тому что ты говоришь

ты приводил много кода
а в итоге все проигнорировал
а парсер самый лучший flexx & бизон

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

de-signer
сержант
Сообщения: 220
Зарегистрирован: 2007-05-11 14:39:01
Откуда: Отсюда :)

Re: Запутался в "указателях на указатели"

Непрочитанное сообщение de-signer » 2009-05-19 13:51:40

2paradox
с new понятно и так было, вопрос был как уложить. Ладно проехали.
Видимо приведённый код был "мыслями вслух". Может чего и не договорил...

А вот с парсером. Про flex & bison сейчас читаю.
---
"Если я рассуждаю логично, то это значит только то, что я не сумашедший, но вовсе не доказывает, что я прав" (с)И.П.Павлов

Аватара пользователя
Fastman
ст. лейтенант
Сообщения: 1236
Зарегистрирован: 2006-07-07 10:20:38
Откуда: Минск. РБ

Re: Запутался в "указателях на указатели"

Непрочитанное сообщение Fastman » 2009-05-19 17:15:40

Добрался до рабочего места, вот я прикинул что если правильно понял все, можно ка кто так сделать примерно.
Если это то что я подумал и это потащит для задачи - покажу как классы остальные реализованы

Код: Выделить всё

#include "Collector.h"
#include "Parent.h"
#include <vector>
#include <utility>
#include <iostream>
#include <string>

using namespace std;


int _tmain(int argc, _TCHAR* argv[])
{
    
    vector< pair<CParent , vector<CCollector>> > V3D;
    
    //Руками эмулируем наполнение и создание обьектов.
    //Если ввод из файла будет - тупо цикл внесения обьектов будет.
    //------------------------------------------------------------------
    CParent *BOX1;
    BOX1 = new CParent(1,2,3,"OBJ1");
    CParent *BOX2;
    BOX2 = new CParent(4,5,6,"OBJ2");

    vector<CCollector> vChildsVector;
    vector<CCollector> vChildsVector2;
    
    CCollector *cCls;
    cCls = new CCollector;
    cCls->m_pBox = new CBox(2, 4, 5, "BOX IN OBJ1");
    cCls->m_pShape = new CShape(6, 7, 8, "SHAPE IN OBJ1");
    vChildsVector.push_back(*cCls);

    CCollector *cCls2;
    cCls2 = new CCollector;
    cCls2->m_pShape = new CShape(10, 15, 20, "SHAPE IN OBJ2");
    vChildsVector2.push_back(*cCls2);

    pair<CParent , vector<CCollector>> pPair (*BOX1, vChildsVector);
    pair<CParent , vector<CCollector>> pPair2(*BOX2,vChildsVector2);
    V3D.push_back(pPair);
    V3D.push_back(pPair2);
    //------------------------------------------------------------------

    //Рисуем чего у нас получилось
    for (int it = 0; it < (int)V3D.size(); it++)
    {
         //Выводим верхний элемент
         cout << " " << endl;
         V3D.at(it).first.GetParam();
         //Если у него есть чилды - рисуем их
         if(!V3D.at(it).second.empty())
         {
            for(int it2 = 0; it2 < (int)V3D.at(it).second.size(); it2++)
            {

                CCollector CollectionOfChild;
                CollectionOfChild = V3D.at(it).second.at(it2);
                cout << "|" << endl; 
              
                if(CollectionOfChild.m_pBox != NULL)
                    CollectionOfChild.m_pBox->BoxParam();
                if(CollectionOfChild.m_pShape != NULL)
                    CollectionOfChild.m_pShape->ShapeParam();
            }
         }   
    }

    if (BOX1 != NULL)
        delete BOX1;
    if (BOX2 != NULL)
        delete BOX2;
    if (cCls !=NULL)
        delete cCls;
    if (cCls2 !=NULL)
        delete cCls2;
        
    return 0;
}
Выхлоп:
Вложения
c.PNG
c.PNG (3.64 КБ) 2993 просмотра
Главное в жизни здоровье и любовь, остальное я все куплю.

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: Запутался в "указателях на указатели"

Непрочитанное сообщение ProFTP » 2009-05-19 18:42:43

я извиняюсь, но указатели в некотроых случаях для убыстрения или нет?

если надо например, некоторые элементы переместить с одного массива в другой, то при перенесении переносится только ссылка, а не настоящие элементы! правильно?
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

Аватара пользователя
Fastman
ст. лейтенант
Сообщения: 1236
Зарегистрирован: 2006-07-07 10:20:38
Откуда: Минск. РБ

Re: Запутался в "указателях на указатели"

Непрочитанное сообщение Fastman » 2009-05-19 18:49:43

ProFTP писал(а):я извиняюсь, но указатели в некотроых случаях для убыстрения или нет?
если надо например, некоторые элементы переместить с одного массива в другой, то при перенесении переносится только ссылка, а не мастоящий элементы! правильно?
А причем тут убыстрение :)

юзать удобно:
-если есть объект, который нельзя или затруднительно копировать.
-инициалуизирется объекты в неопределенный заранее момент
- надо создать заранее неизвестное количество объектов
- полиморфизм
- функция может менять аргумент(лучше ссылка а не указатель)
Главное в жизни здоровье и любовь, остальное я все куплю.

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: Запутался в "указателях на указатели"

Непрочитанное сообщение ProFTP » 2009-05-19 19:18:45

там где не надо использовать указатели, то там их не использовать?

ну вот везде говорят что указатели быстре и на разных языках...

http://www.google.com.ua/search?q=%D1%8 ... rt=30&sa=N
http://www.relib.com/forums/Topic820817 ... x#bm821448
http://no-gritzko-here.livejournal.com/3725.html
http://www.realcoding.net/article/view/1094
http://www.xakep.ru/post/21539/?print=true
http://rtfm.adamant.net/programming/ker ... ode70.html
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: Запутался в "указателях на указатели"

Непрочитанное сообщение paradox » 2009-05-19 19:20:13

так ProFTP
ты не сяшник) так что не флуди

Аватара пользователя
Fastman
ст. лейтенант
Сообщения: 1236
Зарегистрирован: 2006-07-07 10:20:38
Откуда: Минск. РБ

Re: Запутался в "указателях на указатели"

Непрочитанное сообщение Fastman » 2009-05-19 19:27:04

ProFTP писал(а):там где не надо использовать указатели, то там их не использовать?
ну вот везде говорят что указатели быстре и на разных языках...
Не слушай бред. в java нет допустим указателей.
Указатели - грубо говоря: механизм работы с памятью.
Главное в жизни здоровье и любовь, остальное я все куплю.

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: Запутался в "указателях на указатели"

Непрочитанное сообщение ProFTP » 2009-05-19 19:38:41

paradox писал(а):так ProFTP
ты не сяшник) так что не флуди
не сишник, но в предкомпиляции может буду писать для ускорения работы прогарммы!
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: Запутался в "указателях на указатели"

Непрочитанное сообщение paradox » 2009-05-19 19:41:42

кого кого ты будешь писать? O_o

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: Запутался в "указателях на указатели"

Непрочитанное сообщение ProFTP » 2009-05-19 20:00:27

для ускорения работы программы можно прямо в ней писать на Си и на других языках через JIT

вот еще увидел Qt4 надо будет разобратся, попробовать http://www.opennet.ru/base/dev/cpp_perl_class.txt.html
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: Запутался в "указателях на указатели"

Непрочитанное сообщение paradox » 2009-05-19 20:02:52

ProFTP писал(а):для ускорения работы программы можно прямо в ней писать на Си и на других языках через JIT

вот еще увидел Qt4 надо будет разобратся, попробовать http://www.opennet.ru/base/dev/cpp_perl_class.txt.html
это просто пипец дочего извратили
лучше из перла никакого С++ не трогать ))))

Аватара пользователя
Fastman
ст. лейтенант
Сообщения: 1236
Зарегистрирован: 2006-07-07 10:20:38
Откуда: Минск. РБ

Re: Запутался в "указателях на указатели"

Непрочитанное сообщение Fastman » 2009-05-19 20:13:48

ProFTP писал(а):для ускорения работы программы можно прямо в ней писать на Си и на других языках через JIT
вот еще увидел Qt4 надо будет разобратся, попробовать http://www.opennet.ru/base/dev/cpp_perl_class.txt.html
Я тоже не выдержу и откомменчу.
Не майся дурью..не скрещивай технологии которые все равно работать вместе не будут.
Твой мозг мне не жалко.. Жалко будет наш мозг если у тебя вопросы по этому говну появятся.

P.S.
Ну что за народ пошел... ну почему просто нельзя принцип KISS юзать и не трахать себе мозг.
Главное в жизни здоровье и любовь, остальное я все куплю.

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: Запутался в "указателях на указатели"

Непрочитанное сообщение ProFTP » 2009-05-20 5:40:48

спасибо, хорошо, я не про qt спрашивал, вообще-то...
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

de-signer
сержант
Сообщения: 220
Зарегистрирован: 2007-05-11 14:39:01
Откуда: Отсюда :)

Re: Запутался в "указателях на указатели"

Непрочитанное сообщение de-signer » 2009-05-20 9:54:13

2fastman
Интересно, но не слишком сложно для моего случая?
pBox и pShape у тебя разные поля класса?
Не знаю будет ли проще у меня, но хотелось сделать что-то вроде:

Код: Выделить всё

#define doidPointLight	6	// light information

class dataObject {
public:
	int iId;
	char *name;
              dataObject *next, *data;
...
}

class doPointLight : public dataObject {
public:
	float intensity, color[3], location[3], radius;
	bool on;
...
}
// и т.д.

// где-нибудь в коде:
dataObject *sceneObjects;
// наполнение по принципу однонаправленного списка юзая *next
// всё что внутри (включая чилдов) юзаю *data

// теперь, чтобы всё это выкопать
dataObject *z = dataObjects;
doPointLight *pl; // это времянка, чтобы много текста в коде не писать
switch (z->iId) {
  case doidPointLight:
    pl = (doPointLight*)z;
    if ( pl->on ) { /* что-то делаем */ }
   ...
    // если будут чилды
    if ( !pl->data ) {
      // так же разыменовываем чилды
    }
   break;
...
}
Вроде не так сложно...

Кстати никак не найду какого-нибудь внятного примера как парсером flexx&bison пользоваться.
Нужно всего лишь вложенные скобки вывернуть наизнанку, чтобы сначала чилд шёл, а за ним парент.
---
"Если я рассуждаю логично, то это значит только то, что я не сумашедший, но вовсе не доказывает, что я прав" (с)И.П.Павлов

Аватара пользователя
Fastman
ст. лейтенант
Сообщения: 1236
Зарегистрирован: 2006-07-07 10:20:38
Откуда: Минск. РБ

Re: Запутался в "указателях на указатели"

Непрочитанное сообщение Fastman » 2009-05-20 11:12:20

Может на первый взгляд непривычно, но ничего сложного.
Ниже реализация остальных классов приведена.
Шэйп и бокс как видишь не просто поля класса, это указатели на объект.
Я не говорю что то что я привел в пример нужно брать за основу, можно подсмотреть принцип )
Зато при таком подходе будешь иметь понятный быстрый произвольный доступ ко всем элементам своей структуры данных.

Тут можно конечно спросить для чего же Тогда CCollector, если можно и без него обойтись. Но я бы например оставил его.
Ну очень удобно в нем будет реализовать например перегрузку операторов сложения и вычитания координат объектов итд.
Очень даже красиво получиться:))

Код: Выделить всё

#pragma once
#include "Box.h"
#include "Shape.h"

using namespace std;

class CCollector
{
    public:
        CCollector(void)
        {
            m_pBox   = NULL;
            m_pShape = NULL;
        };
        ~CCollector(void);

    CBox   *m_pBox;
    CShape *m_pShape;
};

Код: Выделить всё

#pragma once
#include <string>
#include <iostream>

using namespace std;

class CShape
{
    int x, y, z;
    string cName;
    
    public:
        CShape() {x = y = z = 0;};
        CShape(int nx, int ny, int nz, const string ccName) {x = nx; y = ny; z = nz; cName = ccName;}
        void ShapeParam()
            {
            cout<< "Name:" << cName
                << " Coordinates "
                << x <<":"
                << y <<":"
                << z << endl;
            }
        ~CShape(void);
};

Код: Выделить всё

#pragma once
#include <string>
#include <iostream>

using namespace std;

class CBox
{
    int x, y, z;
    string cName;
    
    public:
        CBox() {x = y = z = 0;}
        CBox(int nx, int ny, int nz, const string ccName) {x = nx; y = ny; z = nz; cName = ccName;}
        void BoxParam()
            {
            cout<< "Name:" << cName
                << " Coordinates "
                << x <<":"
                << y <<":"
                << z << endl;
            }
        ~CBox(void);
};
Главное в жизни здоровье и любовь, остальное я все куплю.

de-signer
сержант
Сообщения: 220
Зарегистрирован: 2007-05-11 14:39:01
Откуда: Отсюда :)

Re: Запутался в "указателях на указатели"

Непрочитанное сообщение de-signer » 2009-05-20 16:39:52

Укопался в парсере... 2-ой день уже. :st: Ткните плиз в ошибку.
temp.lex

Код: Выделить всё

%{
	#include <stdio.h>
	#include <string.h>
	#include "common.h"
	#include "temp.tab.h"
%}

floatdigit		[0-9,.]
constant		{floatdigit}+

%option noyywrap

%%
NAME		{
			yylval.name = strdup(yytext);
			return NAME;
		}

constant	{
			sscanf(yytext, "%f", &yylval.floatval);
			return VAL;
		}

#.*$
[\n\r\t ]+
.		{
			return *yytext;
		}
%%
temp.y

Код: Выделить всё

%{
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "common.h"

%}

%union {
	float floatval;
	char *name;
	ExprPair *pair;
}

%token <floatval> VAL
%token <name> NAME
%type <pair> expr

%%
start:	| start line;
line:	'\n' | expr '\n';
expr:	NAME '=' VAL {
		exprpair = new ExprPair();
		char *name = (char*)malloc(strlen($1));
		yylval.floatval = $3;
		exprpair->SetPair($1, yylval.floatval);
		return NAME;
	}

%%
main

Код: Выделить всё

#include "common.h"

ExprPair* exprpair = 0;

#include "lex.yy.c"
#include "temp.tab.c"

void ExprPair::SetPair(char *iname, float ivalue) {
	name = iname;
	value = ivalue;
}


int main(int argc, char** argv) {
	printf("%d\n",  yyparse());
	if (exprpair) {
		printf("%s %.2f\n",  exprpair->name, exprpair->value);
		delete exprpair;
	}
}
Что не напишу - на всё syntax error
Последний раз редактировалось de-signer 2009-05-20 16:45:30, всего редактировалось 1 раз.
---
"Если я рассуждаю логично, то это значит только то, что я не сумашедший, но вовсе не доказывает, что я прав" (с)И.П.Павлов

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: Запутался в "указателях на указатели"

Непрочитанное сообщение paradox » 2009-05-20 16:43:58

пример выполнения кода
что не так
и как компиляешь
добавь

de-signer
сержант
Сообщения: 220
Зарегистрирован: 2007-05-11 14:39:01
Откуда: Отсюда :)

Re: Запутался в "указателях на указатели"

Непрочитанное сообщение de-signer » 2009-05-20 16:47:50

run

Код: Выделить всё

gcc -Wall -o main -I/usr/local/include main.c++ && chmod 754 main && ./main

Код: Выделить всё

%bison -d temp.y
%flex temp.lex
%./run
name=5
syntax error
1
%  
---
"Если я рассуждаю логично, то это значит только то, что я не сумашедший, но вовсе не доказывает, что я прав" (с)И.П.Павлов

de-signer
сержант
Сообщения: 220
Зарегистрирован: 2007-05-11 14:39:01
Откуда: Отсюда :)

Re: Запутался в "указателях на указатели"

Непрочитанное сообщение de-signer » 2009-05-20 16:49:39

Мой ввод:
name=5
единица в конце - это результат printf из main.c++::main
---
"Если я рассуждаю логично, то это значит только то, что я не сумашедший, но вовсе не доказывает, что я прав" (с)И.П.Павлов

de-signer
сержант
Сообщения: 220
Зарегистрирован: 2007-05-11 14:39:01
Откуда: Отсюда :)

Re: Запутался в "указателях на указатели"

Непрочитанное сообщение de-signer » 2009-05-20 16:55:34

Добавляю
#define YYERROR_VERBOSE
получаю:
syntax error, unexpected $undefined, expecting $end or NAME or '\n'

от этого ни теплее ни холоднее
---
"Если я рассуждаю логично, то это значит только то, что я не сумашедший, но вовсе не доказывает, что я прав" (с)И.П.Павлов

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: Запутался в "указателях на указатели"

Непрочитанное сообщение paradox » 2009-05-20 16:57:43

а ты там случайно не

Код: Выделить всё

name
=
5
парсишь?

вообще возьми примеры где все работает
так легче будет разобраться