[ C / C++ ] — начинающим: задаем вопросы (архивная - 2015)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by _Great_, 26 May 2007.

Thread Status:
Not open for further replies.
  1. Fata1ex

    Fata1ex Elder - Старейшина

    Joined:
    12 Dec 2006
    Messages:
    703
    Likes Received:
    300
    Reputations:
    38
    Отличный пример того, как не стоит называть переменные в запутанных кодах.

    Glazz, эээ....нулевой указатель?

    Хотя да...логика кода неверна:

    Code:
    	node* _node = 0;
    
    	_node->C(_node);
    
    ...
    
    	_node = new node;
    	_node->data = 5;
    
    Короче твои переменные сами тебя и погубили :) Функция еще не успела создать новый _node, он еще нулевой, а ты его уже используешь. Вроде так. Хотя все равно твой код отдает руническими письменами.
     
    #3321 Fata1ex, 27 Jul 2009
    Last edited: 27 Jul 2009
  2. horlyk

    horlyk Elder - Старейшина

    Joined:
    2 Dec 2007
    Messages:
    132
    Likes Received:
    6
    Reputations:
    0
    Имена то так, я по быстренькому тестовую прогу написал, так как в основной проге с этой проблемой столкнулся. Идея должна быть вот примерно такая: из мэйна я передаю указатель в метод, который принимает этот указатель и ему присваивается новый адрес оператором new. Далее изменяется значение data указателя. Дальше возврат в мэйн и вывод измененного значения на экран. Но значение остается прежним.

    Следовательно, как мне из другого метода, изменить адрес указателя, который передавался.

    Code:
    class node
    {
    public:
    	node() { cout << "constructor...\n"; }
    	~node() { cout << "destructor...\n"; }
    	void func(node* Mynode);	
    	node(node&) { cout << "copy-constructor...\n"; }
    	int data;	
    };
    void main()
    {
    	node* Mynode = new node;
    	
    	Mynode->func(Mynode);
    	cout << Mynode->data << endl;
    }
    void node::func(node *Mynode)
    {
    	Mynode->data = 5;
    	Mynode = new node;
    	Mynode->data = 7;
    }
    То есть чтоб вывелось на экран значение 7, а не 5.
    Не используя return в func
     
    #3322 horlyk, 27 Jul 2009
    Last edited: 27 Jul 2009
  3. razb

    razb Active Member

    Joined:
    24 Mar 2009
    Messages:
    658
    Likes Received:
    133
    Reputations:
    18
    Из-за такого бреда может лопнуть моск ))
    В классе создаешь метод типа push() или какой нибуть сеттер, далее в мейне создаешь экземпляр класса(в стеки/в куче как хочешь) и уже к нему обращаешься.
     
    1 person likes this.
  4. Fata1ex

    Fata1ex Elder - Старейшина

    Joined:
    12 Dec 2006
    Messages:
    703
    Likes Received:
    300
    Reputations:
    38
    ааа, ты тоже заметил :(

    мда. Почитай литературу лучше...

    Вообщем не есть хорошая практика пытаться писать слова, пока не освоил алфавит. Попробуй работать пока без ООП, которое ты пытаешься сейчас применить, потому как преимуществ и особенностей его ты еще не понимаешь.
     
    #3324 Fata1ex, 27 Jul 2009
    Last edited: 27 Jul 2009
    1 person likes this.
  5. razb

    razb Active Member

    Joined:
    24 Mar 2009
    Messages:
    658
    Likes Received:
    133
    Reputations:
    18
    Во первых в классе есть неявный указатель на экземпляр this
    Во вторых, переменная data является открытой и доступна вне класса
    В третьих, у тебя тут Mynode = new node; будет утечка памяти.

    В общем как сказал товарищ Fata1ex, лучше сейчас потрать больше времени на прочтение литературы и это в будущем тебе сэкономит уйму времени )
     
    #3325 razb, 27 Jul 2009
    Last edited: 27 Jul 2009
  6. Glazz

    Glazz Elder - Старейшина

    Joined:
    9 Aug 2008
    Messages:
    116
    Likes Received:
    7
    Reputations:
    0
    а тут еще случайно память не утекает? new вызываются да вызываются , а delete я так и не видел.
     
    1 person likes this.
  7. horlyk

    horlyk Elder - Старейшина

    Joined:
    2 Dec 2007
    Messages:
    132
    Likes Received:
    6
    Reputations:
    0
    Блин, сложно что-ли показать как нужно сделать, вместо того, чтоб придераться к тому, что меня на данном этапе не интересует. Про операторы делет я знаю, в основной программе их применяю. Я же сразу сказал что это тестовая прога и интересует меня пока именно этот момент. А про то, что моск лопается от кода - папки могли бы решить эту проблему и написать правильный пример. Раздел же называется для новичков, потому я и выясняю то что мне не понятно было в книге. Вместо того говорят литературу читать лучше... ппц :mad:
     
  8. Fata1ex

    Fata1ex Elder - Старейшина

    Joined:
    12 Dec 2006
    Messages:
    703
    Likes Received:
    300
    Reputations:
    38
    horlyk, люди хотят помочь, не стоит обижаться. Прислушайся, все равно придется вернуться к азам.

    Вот именно, раздел "для новичков", а не "лабораторные работы". Если тебе нужна готовая программа, пиши туда. Здесь советы по обучению и синтаксису.

    Ага, все бы за тебя сделали, а ты бы так и остался на своем уровне. Тебе же предлагают учиться самому и развиваться. Ужас правда?
     
    #3328 Fata1ex, 27 Jul 2009
    Last edited: 27 Jul 2009
  9. horlyk

    horlyk Elder - Старейшина

    Joined:
    2 Dec 2007
    Messages:
    132
    Likes Received:
    6
    Reputations:
    0
    Ну во первых - это не лабораторная работа. Я сейчас джесса либерти читаю(освой с++ за 21 день) Дошел до списков. Там на том примере понять списки не реально. Потому начал искать информацию о списках в интернете и тут. Вроде как понял. Сейчас пишу программу с использованием списков - поиск в нем, добавление узла, удаление и т.д. И там у меня такая проблема появилась. Я хотел разбить все на методы, разбил, но при вызове метода, который должен был создавать узлы и заполнять их данными у меня появилась проблема - при возврате данные все теряются, хотя при отладке смотрел, что на в процессе создания все отлично, а при выходе из этого метода все теряется. Начал думать и решать эту проблему. Написал код, который уже окрестили кодом, от которого лопается моск. Он работает, памяти больше не занимает... Вот я и попросил помощи с тем вариантом, что у меня с самого начала не заработал.

    Я же придумал рабочий вариант, но его, как я написал выше, окрестили кодом, от которого лопается моск. лучшего придумать не смог и написал чтоб помогли.
     
    #3329 horlyk, 27 Jul 2009
    Last edited: 27 Jul 2009
  10. Ra$cal

    Ra$cal Elder - Старейшина

    Joined:
    16 Aug 2006
    Messages:
    670
    Likes Received:
    185
    Reputations:
    78
    если ты хочешь изменить значение указателя, переданного параметром, то нада использовать ссылку на указатель. вообще такого кода лучше избегать в твоем примере, ибо это излишне усложнит код. примерно будет так.

    Code:
    #include <iostream>
    using namespace std;
    
    class node
    {
    public:
    	node() { cout << "constructor...\n"; }
    	~node() { cout << "destructor...\n"; }
    	static void func(node* &Mynode);	
    	node(node&) { cout << "copy-constructor...\n"; }
    	int data;	
    };
    void main()
    {
    	node* Mynode = new node;
    	Mynode->data = 5;
    
    	node::func(Mynode);
    	cout << Mynode->data << endl;
    }
    void node::func(node* &Mynode)
    {
    	delete Mynode;
    	Mynode = new node;
    	Mynode->data = 7;
    }
    метод func статический ибо иначе в твоем примере получится стремная конструкция delete this;
    вообще простой совет - такие конструкции не используй никада, если уж совсем не припрет.
     
  11. horlyk

    horlyk Elder - Старейшина

    Joined:
    2 Dec 2007
    Messages:
    132
    Likes Received:
    6
    Reputations:
    0
    Ra$cal, спасибо, теперь понял. А лучший выход из такой ситуации какой?
     
  12. alex912

    alex912 New Member

    Joined:
    7 Jun 2009
    Messages:
    8
    Likes Received:
    0
    Reputations:
    0
    Все просто :)
    При передаче указателя в функцию, создается копия данного указателя, который указывает в тоже самое место что и настоящий указатель. Поэтому Mynode->data = 5 срабатывает. Далее этот указатель указывает на новое место и Mynode->data = 7 уже относится к совершенно другому объекту. Как уже выше написали, если нужно изменить указатель - юзай ссылки.
     
  13. Ra$cal

    Ra$cal Elder - Старейшина

    Joined:
    16 Aug 2006
    Messages:
    670
    Likes Received:
    185
    Reputations:
    78
    я не понимаю, что именно делает твой метод. чисто логически не могу понять. если ты хочешь изменить поле data, то зачем тебе перевыделять память? ты должен или напрямую изменить data, или сделать его приватной переменной и добавить геттеры и сеттеры и юзать их.
     
  14. SeNaP

    SeNaP Elder - Старейшина

    Joined:
    7 Aug 2008
    Messages:
    378
    Likes Received:
    69
    Reputations:
    20
    Проблема такая.
    Как проверить на существоание дериктории, если она есть, то определить путь.
    Помогите пожалуйсто :)
     
  15. razb

    razb Active Member

    Joined:
    24 Mar 2009
    Messages:
    658
    Likes Received:
    133
    Reputations:
    18
    Если unix like система, то смотри man readdir
     
  16. bons

    bons Elder - Старейшина

    Joined:
    20 Dec 2007
    Messages:
    286
    Likes Received:
    121
    Reputations:
    21
    надеюсь, ты имеешь в виду исходя из пути к папке проверить ее наличие.
    Конечно можно проверить существование какой-то директории без пути к ней, но ведь же рекурсивный поиск юзать для этого надо.
    а в первом случае подойдет такой код:
    Code:
    #include <stdio.h>
    #include <windows.h>
    
    int exist_directory(const char* path)
    {
    	WIN32_FIND_DATA find_data;
    	HANDLE find_handle;
    	
    	if((find_handle = FindFirstFile(path, &find_data)) == INVALID_HANDLE_VALUE) {
    		return 0;
    	} else {
    		FindClose(find_handle);
    		return 1;
    	}
    }
    
    int main(int argc, char** argv)
    {
    	if(argc < 2) return EXIT_FAILURE;
    	if(exist_directory(argv[1])){
    		printf("exist\n");
    	} else {
    		printf("not exist\n");
    	}
    	return 0;
    }
    P.S. да, это только для как бы win-систем
     
    #3336 bons, 29 Jul 2009
    Last edited: 29 Jul 2009
  17. SeNaP

    SeNaP Elder - Старейшина

    Joined:
    7 Aug 2008
    Messages:
    378
    Likes Received:
    69
    Reputations:
    20
    bons, спс, щас буду сидеть разбираться ))

    ЗЫ: Кто может ссылку дать, на сорцы кокого нибудь вирус, который сам распростроняется, чисто для изучения :)
     
    #3337 SeNaP, 29 Jul 2009
    Last edited: 29 Jul 2009
  18. horlyk

    horlyk Elder - Старейшина

    Joined:
    2 Dec 2007
    Messages:
    132
    Likes Received:
    6
    Reputations:
    0
    После пары мучительных дней, я все же добил однонаправленные списки. У меня вышло создать список, просмотреть его, искать в нем нужные данные, удалить полностью весь список, удалить конкретный узел списка, добавить новый узел в конец списка, добавить новый узел в любую другую позицию, сортировать его по данным и номерам узлов. Для этого использовал все свои знания.

    Если кому не лень - проанализируйте плз мои труды и посоветуйте, что можно было бы сделать иначе, то есть оптимальнее:
    исходник - cpp
    готовый exe файл программы

    З.Ы. Сообщение о вирусе игнорируйте, так как это мой сайт и я даю гарантию в 100% о безопасности файлов.
     
    #3338 horlyk, 29 Jul 2009
    Last edited: 29 Jul 2009
  19. Ra$cal

    Ra$cal Elder - Старейшина

    Joined:
    16 Aug 2006
    Messages:
    670
    Likes Received:
    185
    Reputations:
    78
    рекомендация простая - у тебя получилась модульная программа, только заменой модулей на классы. как таковой класс списка не выполняет роль управления списком. точнее он управляет всеми подряд списками. и код, который использует этот класс списка, обязан знать все детали реализации класса Node, хотя вся задача класса List в том, чтобы никто не знал, как он реализован.
    Вот тебе простые условия, чтобы список стал нормальным членом ОО общества:
    1) Список не должен принимать в паблик методах параметры типа Node
    2) Список не должен возвращать в паблик методах параметры типа Node
    3) Так как класс List управляет списком, почему среди его членов даннхы нету собственно списка? Точнее головы
    4) Работу с вводом-выводом вынеси в отдельный класс. Назови его ListMenu или на свое усмотрение, но в классе списка не должно быть методов, которые не связаны с управлением сущностью.

    Ну а так для начала вполне неплохо(в том смысле что это работает =) )
     
  20. horlyk

    horlyk Elder - Старейшина

    Joined:
    2 Dec 2007
    Messages:
    132
    Likes Received:
    6
    Reputations:
    0
    Ra$cal, еще раз спасибо за советы и за потраченное время на разборку кода моей программы :rolleyes:

    З.Ы. тоесть получается я еще не понимаю преимущества ооп. Что можно почитать чтоб понять чем оно лучше?
     
    #3340 horlyk, 29 Jul 2009
    Last edited: 29 Jul 2009
Thread Status:
Not open for further replies.