Автор Тема: Програмирование на C++  (Прочитано 76923 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн HoRRoR

  • Пользователь
  • Сообщений: 983
  • Пол: Мужской
  • Ромхакер
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #210 : 20 Март 2011, 13:55:39 »
Да твою мать, перечитай ещё раз! Указатель там, а не структура! new может возвращать только указатель.

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #211 : 20 Март 2011, 14:43:30 »
HoRRoR, не сердись  :) Там просто другая проблема возникает (ну помимо того что надо всюду делать операцию стрелка) с контруктором копии...
если оставить всё как есть в прошлом коде то тогда он будет указывать на тот же участок памяти (ну и при повторном удалении конечно же будет ошибка), хотя я уже  исправил и теперь программа выглядит так:
//Программа создаёт структру, запрашивает данные для её заполнения после
//чего производит поиск по структуре введённых данных

# include <iostream>
# include <iomanip>
# include <windows.h>
using namespace std;

const int size=3;

class Test
{
public:
    Test()
    {
        abc = new PRICE;
        numberOfClass++;
    }

    Test(Test &right)
    {
        abc= new PRICE;
        strcpy(abc->name,right.abc->name);
        strcpy(abc->shop,right.abc->shop);
        abc->cost=right.abc->cost;
    }

    ~Test()
    {
        cout<<"Дестуктор был запущен";
        delete abc;
    }

    void setName(char a[])
    {
        strcpy(abc->name,a);
    }

    void setShop(char a[])
    {
        strcpy(abc->shop,a);
    }

    char *getShop()
    {
        return abc->shop;
    }

    void setCost(double a)
    {
        if (a>0)
         abc->cost=a;
        else
        {
            cout<<"Введена направильная цена, цена установлена в 1\n";
            abc->cost=1;
        }
    }


    void search(char a[]) // Ищет есть ли в структуре элементы с нужным нам именем
    {
        if (!(strcmp(a,abc->name)))
        {
            cout<<"Нужный вам товар есть в магазине  "<<abc->shop
            <<"\nЕго цена составляет: "<<abc->cost<<" грн"<<"\n\n";
            resultOfSeach=1;
        };
    }

    static int searchs()
    {
        return resultOfSeach;//Возвращает результат поисков
    }

    static int numberOfClass;
private:
    struct PRICE
    {
        char name[30];// название товара
        char shop[30];//;// название магазина
        double cost;// цена товара
    };
    PRICE *abc;
    static int resultOfSeach;// Нужна чтобы знать был ли найден товар для хоть одного класса
};

int Test::resultOfSeach=0;
int Test::numberOfClass=0;


int main()
{
    setlocale(LC_ALL, "Russian");
    char search[30];
    char temp[30];
    int result=0;
    double cost;
    int n;
    cout<<"Введите колличество магазинов: ";
    cin>>n;
    Test *a=new Test [n];
    for (int i=0;i<n;i++)
    {
        cout<<"-----Магазин N"<<i+1<<"-----\n";
        cout<<"Введите название товара: ";
        cin>>temp;
        a[i].setName(temp);
        cout<<"Введите название магазина:";
        cin>>temp;
        a[i].setShop(temp);
        cout<<"Введите цену товара :";
        cin>>cost;
        a[i].setCost(cost);
    }
    cout<<"\nВведите имя интересущего вас товара: ";
    cin>>search;
    for (int i=0;i<n;i++)
     a[i].search(search);
    if (!(a[0].searchs()))
     cout<<"Указанный товар в магазинах не найден\n";
    Test b=a[0];
    delete a;
    cout<<"\nКонструктор копии работает и мы можем увидеть название магазина N1\nдаже после удаления оригинала a: "<<b.getShop()<<'\n';
    cout<<"Всего было магазинов: "<<Test::numberOfClass<<'\n';
    system("pause");
    return EXIT_SUCCESS;
}
ТЕ: в конструкторе копии я через strcpy построчно копирую все данные из одной структуры в другую, жаль что нельзя посредством присваивания как-то указать что нужно скопировать все данные из тех участков памяти, а не указывать на тот же участок.

Оффлайн HoRRoR

  • Пользователь
  • Сообщений: 983
  • Пол: Мужской
  • Ромхакер
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #212 : 20 Март 2011, 16:47:43 »
Цитата
Там просто другая проблема возникает (ну помимо того что надо всюду делать операцию стрелка)
А необходимость набирать код для тебя не проблема?

Цитата
если оставить всё как есть в прошлом коде то тогда он будет указывать на тот же участок памяти (ну и при повторном удалении конечно же будет ошибка)
А что тебе мешает написать конструктор копии, в котором ты будешь нормально создавать копию?

Цитата
жаль что нельзя посредством присваивания как-то указать что нужно скопировать все данные из тех участков памяти, а не указывать на тот же участок.
Можно. Структура скопируется полностью как надо, т.к. память здесь не выделяемая, а фиксированная.

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #213 : 20 Март 2011, 17:52:07 »
Цитата: HoRRoR
А что тебе мешает написать конструктор копии, в котором ты будешь нормально создавать копию?
Так я же и написал его:
   Test(Test &right)
    {
        abc= new PRICE;
        strcpy(abc->name,right.abc->name);
        strcpy(abc->shop,right.abc->shop);
        abc->cost=right.abc->cost;
    }
Цитата: HoRRoR
Можно. Структура скопируется полностью как надо, т.к. память здесь не выделяемая, а фиксированная.
Нет, ну я же переделал по твоему совету чтобы был указатель abc (ну чтобы деструктору было чем заняться  :) ) так что память теперь выделяемая.

Хотя там программа то уже как видишь работает и в ней всё ок, а вот теперь мне надо переделать ту где динамическая структура (та которая двунаправленный список), вот в ней то и начинается всё интересное.
Просто эта динам. структура (я ещё тогда переделал твой вариант вытянув все функции из структуры в класс и поправив указатели, в структуре лишь оставил конструктор по умолчанию) ведёт себя слегка странно.
 Вариант 1 всё работает хорошо:
#include <iostream>
#include <cstring>
using namespace std;


class Test
{
public:
    struct ListItem;

    // Конструктор по умолчанию
    Test(string data)
    {
        abc=new ListItem(data);
    }



// Печать списка
void print_list()
{
    ListItem* item = this->abc;
    while(item)
    {
        cout << item->data;
        item = item->next;
        if(item) cout << " ";
    }
    cout << endl;
}

// Удаляет первые символы в строках
void assigned()
{
    ListItem* item=this->abc;
    while (item)
    {
        item->data.assign(&item->data[1]);
        item=item->next;
    }
}

//Добавляет инвертированный список
void plus_invert ()
{
    ListItem *item=this->getTail();
    while (item)
    {
        this->addToTail(item->data);
        item = item->prev;
    }
}


    ListItem* getTail()
    {
        ListItem* item = abc;
        while(item->next)
            item = item->next;
        return item;
    }

    ListItem* addToTail(const string data)
    {
        ListItem *item = new ListItem(data), *last = getTail();
        item->prev = last;
        last->next = item;
        return item;
    }

    ListItem* findLastItem(const string data)
    {
        ListItem* item = abc, *last = NULL;
        while(item->next)
        {
            if(item->data == data)
            {
                last = item;
            }
            item = item->next;
        }
        return last;

    }
    bool insertAfterLastItem(const string data, Test list)
    {
        ListItem* last = findLastItem(data), *next_item, *prev_item, *list_last;
        if(!last) return false;
        next_item = last->next;
        list_last = getTail();
        list_last->next = next_item;
        if(next_item)
            next_item->prev = list_last;
        list.abc->prev = last;
        last->next = list.abc;
        return true;
    }
struct ListItem
{
    string data;       // Хранимые в элементе списка данные
    ListItem *prev, *next;  // Указатели на предыдущий и следующий элементы

    // Конструктор
    ListItem(const string data):prev(NULL),next(NULL)
    {
        this->data = data;
    }

    ~ListItem()
    {
        if(next) delete next;
    }
};
 ListItem *abc;
};




int main()
{
    Test a("aa1");
    a.addToTail("aa2");
    a.addToTail("aa3");
    a.addToTail("aa4");
    cout << "List a: ";
    a.print_list();


    Test b("bb1");
    b.addToTail("bb2");
    b.addToTail("bb3");
    b.addToTail("bb4");
    cout << "List b: ";
    b.print_list();

    a.insertAfterLastItem("aa3", b);
    cout << "Merged: ";
    a.print_list();
    a.assigned();
    cout<<"After deleting first symbol: ";
    a.print_list();
    a.plus_invert();
    cout<<"After inverting (and append): ";
    a.print_list();
    return 0;
}


И тут я добавляю деструктор  что удаляет мой указатель abc на структру ...
#include <iostream>
#include <cstring>
using namespace std;


class Test
{
public:
    struct ListItem;

    // Конструктор по умолчанию
    Test(string data)
    {
        abc=new ListItem(data);
    }

    ~Test()
    {
        cout<<"Destructor runs";
        delete abc;
    }

// Печать списка
void print_list()
{
    ListItem* item = this->abc;
    while(item)
    {
        cout << item->data;
        item = item->next;
        if(item) cout << " ";
    }
    cout << endl;
}

// Удаляет первые символы в строках
void assigned()
{
    ListItem* item=this->abc;
    while (item)
    {
        item->data.assign(&item->data[1]);
        item=item->next;
    }
}

//Добавляет инвертированный список
void plus_invert ()
{
    ListItem *item=this->getTail();
    while (item)
    {
        this->addToTail(item->data);
        item = item->prev;
    }
}


    ListItem* getTail()
    {
        ListItem* item = abc;
        while(item->next)
            item = item->next;
        return item;
    }

    ListItem* addToTail(const string data)
    {
        ListItem *item = new ListItem(data), *last = getTail();
        item->prev = last;
        last->next = item;
        return item;
    }

    ListItem* findLastItem(const string data)
    {
        ListItem* item = abc, *last = NULL;
        while(item->next)
        {
            if(item->data == data)
            {
                last = item;
            }
            item = item->next;
        }
        return last;

    }
    bool insertAfterLastItem(const string data, Test list)
    {
        ListItem* last = findLastItem(data), *next_item, *prev_item, *list_last;
        if(!last) return false;
        next_item = last->next;
        list_last = getTail();
        list_last->next = next_item;
        if(next_item)
            next_item->prev = list_last;
        list.abc->prev = last;
        last->next = list.abc;
        return true;
    }
struct ListItem
{
    string data;       // Хранимые в элементе списка данные
    ListItem *prev, *next;  // Указатели на предыдущий и следующий элементы

    // Конструктор
    ListItem(const string data):prev(NULL),next(NULL)
    {
        this->data = data;
    }

    ~ListItem()
    {
        if(next) delete next;
    }
};
 ListItem *abc;
};




int main()
{
    Test a("aa1");
    a.addToTail("aa2");
    a.addToTail("aa3");
    a.addToTail("aa4");
    cout << "List a: ";
    a.print_list();


    Test b("bb1");
    b.addToTail("bb2");
    b.addToTail("bb3");
    b.addToTail("bb4");
    cout << "List b: ";
    b.print_list();

    a.insertAfterLastItem("aa3", b);
    cout << "Merged: ";
    a.print_list();
    a.assigned();
    cout<<"After deleting first symbol: ";
    a.print_list();
    a.plus_invert();
    cout<<"After inverting (and append): ";
    a.print_list();
    return 0;
}

И получаю очень интересную картину...
Если честно то у меня разрыв шаблона: я всегда думал что программа при попытке обратиться к памяти где данные другой программы то получит отказ, а оно во как.

Добавлено позже:
Ну как я понимаю у меня что-то не так с insertAfterLastItem (после её работы здесь такое начинается), но почему без написания моего деструктора проблем нет мне непонятно. И в итоге непонятно с insertAfterLastItem что-то не так или с деструктором что-то не так.

Добавлено позже:
Такс, нашёл одну из ошибок (я балда амперсант не поставил и там передавалась копия этой insertAfterLastItem вместо оригинала), но теперь программа не доходит до конца и после запуска деструктора зависает, притом зависает не всегда, а в процентах 70%  o_0 Пытается освободить уже освобождённую память где-то чтоль? Так почему не каждый раз тогда зависает ...
#include <iostream>
#include <cstring>
using namespace std;


class Test
{
public:
    struct ListItem;

    // Конструктор по умолчанию
    Test(string data)
    {

        abc=new ListItem(data);
    }

    ~Test()
    {
        cout<<"DESTRUCTOR RUNS\n";
        delete abc;
    }

// Печать списка
void print_list()
{
    ListItem* item = this->abc;
    while(item)
    {
        cout << item->data;
        item = item->next;
        if(item) cout << " ";
    }
    cout << endl;
}

// Удаляет первые символы в строках
void assigned()
{
    ListItem* item=this->abc;
    while (item)
    {
        item->data.assign(&item->data[1]);
        item=item->next;
    }
}

//Добавляет инвертированный список
void plus_invert ()
{
    ListItem *item=this->getTail();
    while (item)
    {
        this->addToTail(item->data);
        item = item->prev;
    }
}


    ListItem* getTail()
    {
        ListItem* item = abc;
        while(item->next)
            item = item->next;
        return item;
    }

    ListItem* addToTail(const string data)
    {
        ListItem *item = new ListItem(data), *last = getTail();
        item->prev = last;
        last->next = item;
        return item;
    }

    ListItem* findLastItem(const string data)
    {
        ListItem* item = abc, *last = NULL;
        while(item->next)
        {
            if(item->data == data)
            {
                last = item;
            }
            item = item->next;
        }
        return last;

    }
    bool insertAfterLastItem(const string data, Test &list)
    {
        ListItem* last = findLastItem(data), *next_item, *prev_item, *list_last;
        if(!last) return false;
        next_item = last->next;
        list_last = getTail();
        list_last->next = next_item;
        if(next_item)
            next_item->prev = list_last;
        list.abc->prev = last;
        last->next = list.abc;
        return true;
    }
struct ListItem
{
    string data;       // Хранимые в элементе списка данные
    ListItem *prev, *next;  // Указатели на предыдущий и следующий элементы

    // Конструктор
    ListItem(const string data):prev(NULL),next(NULL)
    {
        this->data = data;
    }

    ~ListItem()
    {
        if(next) delete next;
    }
};
 ListItem *abc;
};




int main()
{
    Test a("aa1");
    a.addToTail("aa2");
    a.addToTail("aa3");
    a.addToTail("aa4");
    cout << "List a: ";
    a.print_list();


    Test b("bb1");
    b.addToTail("bb2");
    b.addToTail("bb3");
    b.addToTail("bb4");
    cout << "List b: ";
    b.print_list();

    a.insertAfterLastItem("aa3", b);
    cout << "Merged: ";
    a.print_list();
    a.assigned();
    cout<<"After deleting first symbol: ";
    a.print_list();
    a.plus_invert();
    cout<<"After inverting (and append): ";
    a.print_list();
    return 0;
}


Добавлено позже:
Да что же это такое, я же деструктор то оставил в самой структуре и ему заняться  нечем кроме как освобождения повторно памяти, во туплю сегодня.

Оффлайн HoRRoR

  • Пользователь
  • Сообщений: 983
  • Пол: Мужской
  • Ромхакер
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #214 : 20 Март 2011, 18:06:10 »
Цитата
Нет, ну я же переделал по твоему совету чтобы был указатель abc (ну чтобы деструктору было чем заняться   ) так что память теперь выделяемая.
Аргх!
        abc= new PRICE;
        *abc = *(right.abc);

Цитата
Если честно то у меня разрыв шаблона: я всегда думал что программа при попытке обратиться к памяти где данные другой программы то получит отказ, а оно во как.
В смысле? Архитектура не даст тебе залезть в память другого приложения.

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #215 : 20 Март 2011, 18:49:00 »
HoRRoR,воот, а почему тогда уходил на печать список запущенных/установленных приложений, информация о процессоре  (я картинку убрал так как теперь по контексту не подходит, но могу ещё раз прикрепить если ты её не видел) ?

Добавлено позже:
Кстати финальный результат моей работы:
#include <iostream>
#include <cstring>
using namespace std;


class Test
{
public:
    struct ListItem;

    // Конструктор по умолчанию
    Test(string data)
    {

        abc=new ListItem(data);
    }

    ~Test()
    {
        cout<<"DESTRUCTOR RUNS\n";
        delete abc;
    }

    Test(Test &right)
    {
        ListItem* item = right.abc;
        abc=new ListItem (item->data);
        item=item->next;
        while (item)
        {
            this->addToTail(item->data);
            item=item->next;
        }


    }

// Печать списка
void print_list()
{
    ListItem* item = this->abc;
    while(item)
    {
        cout << item->data;
        item = item->next;
        if(item) cout << " ";
    }
    cout << endl;
}

// Удаляет первые символы в строках
void assigned()
{
    ListItem* item=this->abc;
    while (item)
    {
        item->data.assign(&item->data[1]);
        item=item->next;
    }
}

//Добавляет инвертированный список
void plus_invert ()
{
    ListItem *item=this->getTail();
    while (item)
    {
        this->addToTail(item->data);
        item = item->prev;
    }
}


    ListItem* getTail()
    {
        ListItem* item = abc;
        while(item->next)
            item = item->next;
        return item;
    }

    ListItem* addToTail(const string data)
    {
        ListItem *item = new ListItem(data), *last = getTail();
        item->prev = last;
        last->next = item;
        return item;
    }

    ListItem* findLastItem(const string data)
    {
        ListItem* item = abc, *last = NULL;
        while(item->next)
        {
            if(item->data == data)
            {
                last = item;
            }
            item = item->next;
        }
        return last;

    }
    bool insertAfterLastItem(const string data, Test &list)
    {
        ListItem* last = findLastItem(data), *next_item, *prev_item, *list_last;
        if(!last) return false;
        next_item = last->next;
        list_last = getTail();
        list_last->next = next_item;
        if(next_item)
            next_item->prev = list_last;
        list.abc->prev = last;
        last->next = list.abc;
        return true;
    }
struct ListItem
{
    string data;       // Хранимые в элементе списка данные
    ListItem *prev, *next;  // Указатели на предыдущий и следующий элементы

    // Конструктор
    ListItem(const string data):prev(NULL),next(NULL)
    {
        this->data = data;
    }
};
 ListItem *abc;
};




int main()
{
    Test *a=new Test("aa1");
    a->addToTail("aa2");
    a->addToTail("aa3");
    a->addToTail("aa4");
    cout << "List a: ";
    a->print_list();


    Test b("bb1");
    b.addToTail("bb2");
    b.addToTail("bb3");
    b.addToTail("bb4");
    cout << "List b: ";
    b.print_list();

    a->insertAfterLastItem("aa3", b);
    cout << "Merged: ";
    a->print_list();
    a->assigned();
    cout<<"After deleting first symbol: ";
    a->print_list();
    a->plus_invert();
    cout<<"After inverting (and append): ";
    a->print_list();
    Test c=*a;
    delete a;
    cout<<"After deleting a we still can see our elements,\nso constructor of copy work correct:\n";
    c.print_list();
    return 0;
}
Теперь уже вылетов и ситуаций когда программа иногда виснет за счёт того что освобождает уже освобождённую память нет  :)

Оффлайн DeniSS

  • Пользователь
  • Сообщений: 1088
  • Пол: Мужской
  • Сама скрытность
    • ВКонтакте
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #216 : 20 Март 2011, 20:28:18 »
Это открытый урок? :D

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #217 : 20 Март 2011, 21:42:06 »
DeniSS,ага. HoRRoR лекции читает, у него это хорошо получается  :)

Оффлайн HoRRoR

  • Пользователь
  • Сообщений: 983
  • Пол: Мужской
  • Ромхакер
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #218 : 20 Март 2011, 22:15:45 »
Цитата
HoRRoR,воот, а почему тогда уходил на печать список запущенных/установленных приложений, информация о процессоре  (я картинку убрал так как теперь по контексту не подходит, но могу ещё раз прикрепить если ты её не видел) ?
А хрен знает. Мусор, наверное. Т.е. выделяется память под приложение - естественно, она не очищается. Далее, ты сам либо забываешь заменить данные на свои, либо же вылезаешь за пределы - т.е. внутри выделенной под приложение памяти затрагиваешь не выделенные участки памяти, которые до этого не были использованы программой, т.е. данные в них остались старые. А в них может быть что угодно - т.е. любые данные работы предыдущих программ или системы.

Абстрактный пример - запустил ты программу, она записала в память "Hello World!". Закрыл программу, открыл твою - система распределила память так, что частично или полностью блок памяти, использовавшийся в первой программе, используется и в этой. В ней ты выделил память под строку, она волей случая совпала с началом "Hello World!". Далее у тебя какой-то сбой, при котором ты либо не туда пишешь свои данные, либо вовсе забываешь записать их в строку, но выводишь её. В результате, при выводе строки получаешь "Hello World!".
Или же ты записываешь данные в строку, но при выводе что-то путаешь (вылезаешь за пределы) и попадаешь на "Hello World!".

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #219 : 22 Март 2011, 22:14:54 »
Читаю о наследовании и возник вопрос:
вот есть у нас класс abc унаследовавший от xyz его функции, при этом в abc у нас есть функция void print() и в xyz у нас есть функция void print(). Есть main, которая тестирует наш новый класс abc и при вызове из main получается вызывается функция print() из abc, так? Если да то можно ли вызвать ту старую print() что была в xyz, ну мне так чисто интересно  :) ?

Оффлайн HoRRoR

  • Пользователь
  • Сообщений: 983
  • Пол: Мужской
  • Ромхакер
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #220 : 22 Март 2011, 22:52:46 »
abc_v.xyz::print();

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #221 : 23 Март 2011, 00:18:41 »
Там через пару страниц есть пример, это я поспешил с вопросом  :)

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #222 : 27 Март 2011, 12:34:01 »
Если вы смотрели фильм "Начало" то ...

Я ржал как конь, вспоминая один из примеров к лабам преподаватальници по с++ и недавнюю лекцию по поводу того как правильно читать объявления вроде char *(*(**foo[][8])())[]  :lol:

Оффлайн Mortal Hero

  • Пользователь
  • Сообщений: 1570
  • Пол: Мужской
  • Явился, не запылился... :)
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #223 : 27 Март 2011, 18:23:23 »
Цитата
недавнюю лекцию по поводу того как правильно читать объявления вроде char *(*(**foo[][8])())[]

Ха, сегодня в 6 утра читал об этом на хабре.  ^_^



Кстати, а тут с С# никто не работал?

Оффлайн BmpCorp

  • Пользователь
  • Сообщений: 1413
  • Пол: Мужской
  • Серьёзнее не бывает
    • Steam
    • Youtube
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #224 : 27 Март 2011, 18:31:39 »
Цитата: Mortal Hero
Кстати, а тут с С# никто не работал?
Я работал, хотя конечно мастером этого языка назвать себя не могу.

Оффлайн Mortal Hero

  • Пользователь
  • Сообщений: 1570
  • Пол: Мужской
  • Явился, не запылился... :)
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #225 : 27 Март 2011, 18:34:15 »
Очень хотел выучить С++, но так задолбался с памятью, указателями и прочими структурами - что забросил и когда попробывал C# - то уже слезть с него не могу. Вот, диплом пишу на C#... Но сложно то, что нет знакомых, которые могли бы помогать с глупыми вопросами - а на специализированных форумах - все очень важные, или не всегда смогут ответить вовремя.

Оффлайн HoRRoR

  • Пользователь
  • Сообщений: 983
  • Пол: Мужской
  • Ромхакер
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #226 : 27 Март 2011, 18:41:22 »
C# и C++ - принципиально разные вещи, их даже сравнивать не всегда стоит. Вот сравнивать C# и Java - уже ближе к правде.

Оффлайн BmpCorp

  • Пользователь
  • Сообщений: 1413
  • Пол: Мужской
  • Серьёзнее не бывает
    • Steam
    • Youtube
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #227 : 27 Март 2011, 18:41:43 »
Ха, для меня тоже после С++ глотком свежего воздуха стал С#. И тоже в основном из-за указателей, хотя вроде и сложного-то в них ничего нет. Ну и ещё для меня большой плюс - ActionScript и C# во многом похожи, а первый язык я лучше всего знаю :)

Оффлайн Mortal Hero

  • Пользователь
  • Сообщений: 1570
  • Пол: Мужской
  • Явился, не запылился... :)
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #228 : 27 Март 2011, 18:54:40 »
Цитата
C# и C++ - принципиально разные вещи, их даже сравнивать не всегда стоит. Вот сравнивать C# и Java - уже ближе к правде.

Да, ты прав. Но я тогда не знал об этих тонкостях, и я их каталогизировал как "Си-подобные языки" :)

Добавлено позже:
Цитата
ActionScript
- это который во флеше? :) Я кстати с него начинал путь программирования, может поэтому и си шарп для меня показался отрадой )))

Оффлайн BmpCorp

  • Пользователь
  • Сообщений: 1413
  • Пол: Мужской
  • Серьёзнее не бывает
    • Steam
    • Youtube
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #229 : 27 Март 2011, 18:58:47 »
Цитата: Mortal Hero
- это который во флеше?  Я кстати с него начинал путь программирования, может поэтому и си шарп для меня показался отрадой )))
Ага, это Флэш. Правда, я писал именно про 3-ю версию, потому что она больше всего похожа на C#, да и вообще сильно отличается от первых двух.

PS: Оффтопим :)

Оффлайн Mortal Hero

  • Пользователь
  • Сообщений: 1570
  • Пол: Мужской
  • Явился, не запылился... :)
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #230 : 27 Март 2011, 19:02:05 »
И плавно перейду к другой теме - кто то работал с базами данных? :)
Я вот в замешательстве: имеется DataGridView - не знаю как сохранить данные - или в виде XML сериализации или в MS Access.

Добавлено позже:
Цитата
PS: Оффтопим
Ну почему же? :) Есть сложить два плюса от С++ то получится решетка #. ^_^

Оффлайн AjaxVS

  • Пользователь
  • Сообщений: 305
    • Youtube
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #231 : 27 Март 2011, 19:26:04 »
Если вы смотрели фильм "Начало" то ...
http://s010.radikal.ru/i314/1103/bc/d673347a52f0.jpg
Я ржал как конь, вспоминая один из примеров к лабам преподаватальници по с++ и недавнюю лекцию по поводу того как правильно читать объявления вроде char *(*(**foo[][8])())[]  :lol:
обалденный комикс! главное - правда :lol:

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

И плавно перейду к другой теме - кто то работал с базами данных? :)
Я вот в замешательстве: имеется DataGridView - не знаю как сохранить данные - или в виде XML сериализации или в MS Access
все эти "Grid"-ы изначально задумывались как средства для визуализации баз данных, никакой XML рядом не стоит, о чем речь.. да и SQL рулит, если проекты серьезные. если сам делаешь какую-нибудь оболочку для мелкого бизнеса, вообще можно на свой формат перейти.

кстати, тут как раз аудитория подходящая.. вы какие книжки читали (читаете?) по С++ "не начального" уровня? а то недавно решил прочесть первую книжку по программированию до конца (ни разу как-то не получалось :D) - прочел Страустрапа, хоть ничего нового и не узнал, но мысли как-то после многих лет php/vb6 упорядочились. хочу еще что-нибудь. посоветует мб кто?

Оффлайн Mortal Hero

  • Пользователь
  • Сообщений: 1570
  • Пол: Мужской
  • Явился, не запылился... :)
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #232 : 27 Март 2011, 19:47:50 »
Цитата
все эти "Grid"-ы изначально задумывались как средства для визуализации баз данных, никакой XML рядом не стоит, о чем речь..

Да, это визуализация базы данных, но вот изначально у нас есть в проекте пустой DataGrid - мы заполняем его данными. Сохранить результат работы можно как в различные базы методом Update() или же можно в формат XML - что кстати довольно таки просто и в последнее время тоже приобретает популярность. Как раз мне надо для "мелкого" предприятия. :)

Цитата
да и SQL рулит, если проекты серьезные.
А он тут причем? Это язык запросов, а не формат сохранения баз данных. Его можно использовать примерно и так


Ах да, я всё это время говорил о C#.  ^_^

Цитата
хочу еще что-нибудь. посоветует мб кто?
Архангельского осилил? Крупная книга. :)

Оффлайн AjaxVS

  • Пользователь
  • Сообщений: 305
    • Youtube
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #233 : 27 Март 2011, 20:12:08 »
ну у меня очень скептическое отношение к SQL + XML. мб даже сильно предвзятое, будущее покажет.

глянул Архангельского. но там почти все про Builder, для начинающих и очень много воды :(
мне бы черную магию  :D

Оффлайн Mortal Hero

  • Пользователь
  • Сообщений: 1570
  • Пол: Мужской
  • Явился, не запылился... :)
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #234 : 28 Март 2011, 18:24:23 »
Цитата
мне бы черную магию 
Скандалы, интриги, расследования?  :D

Насколько я знаю, интересные куски кода и необычное мышление в программирование есть в хакерских книгах. Там необязательно коды взлома и вирусы - часто просто прикольные утилиты и всё в это духе. Есть так же сайты, для программистов - с сложными задачами. Дается какое то задание написать какую то специфическую программу используя ограниченные средства и библиотеки, или вообще без них - или допустим какие то задачи по куску кода... Вообщем тоже тренирует. :)


Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #235 : 28 Март 2011, 18:47:49 »
Оказывается есть даже функции с динамическим числом параметров (сегодня преподша на лекции немножко о них вспомнила и сказала мол это сложно - оно вам не надо, подробно читать о них ничего не буду), мне интересно что это и удобно ли это. Где можно почитать (чтобы понятно было, сайт MS не пойдёт) и стоит ли читать о них и разбираться что это подробно? Может и правда они только усложняют код и особой ценности не представляют.  :)

Оффлайн AjaxVS

  • Пользователь
  • Сообщений: 305
    • Youtube
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #236 : 28 Март 2011, 19:49:54 »
эллипсис, что ли?
http://www.cyberguru.ru/programming/cpp/cpp-language-straustrup2-page66.html

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

про черную магию - это я о таком:



конечно, сейчас эта функция не представляет собой никакой ценности. но уметь делать такие фишки полезно.
« Последнее редактирование: 28 Март 2011, 19:52:04 от AjaxVS »

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #237 : 03 Апрель 2011, 01:02:27 »
Хотел тут сделать задание по наследованию, но до него что-то не дошло.
Проблема: никак не могу заставить класс подключить библиотеку cstring, где я затупил?  :(
Также вопрос: не люблю делать .h файлы к классам, начинать любить или оно и дальше будет так просто без них обходиться?

Оффлайн HoRRoR

  • Пользователь
  • Сообщений: 983
  • Пол: Мужской
  • Ромхакер
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #238 : 03 Апрель 2011, 02:10:31 »
Цитата
Проблема: никак не могу заставить класс подключить библиотеку cstring, где я затупил?
В смысле "заставить класс подключить библиотеку"? Что не так?

Цитата
Также вопрос: не люблю делать .h файлы к классам, начинать любить или оно и дальше будет так просто без них обходиться?
Начинай любить. Иначе как ты их будешь использовать более чем в одном файле?

Добавлено позже:
Не заметил прикреплённые сорцы. Скажу сразу, CPP-ФАЙЛЫ НЕ ИНКЛЮДЯТ! Знай разницу между объектным файлом и заголовком.

Оффлайн Mr2

  • Пользователь
  • Сообщений: 1605
  • Пол: Мужской
  • Free roaming sorcerer
    • Facebook
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #239 : 03 Апрель 2011, 09:01:13 »
Хотел тут сделать задание по наследованию, но до него что-то не дошло.
Проблема: никак не могу заставить класс подключить библиотеку cstring, где я затупил?  :(
Также вопрос: не люблю делать .h файлы к классам, начинать любить или оно и дальше будет так просто без них обходиться?
В объявлении класса указывай пространство имён.(std::string)
« Последнее редактирование: 03 Апрель 2011, 09:04:47 от Mr2 »