Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: Уроки по C++. Обсуждение.  (Прочитано 17594 раз)

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

Оффлайн peregrine

  • Автор темы
  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7203
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
Re: Уроки по C++. Обсуждение.
« Ответ #135 : 16 Сентября 2015, 16:09:56 »
alsoijw, в цикл можно и функцию запихнуть (строго говоря, привычный счётчик это лишь условность, можно практически что угодно делать, но не стоит в большинстве случаев).

Вот так в общем:
Код: (cpp) [Выделить]
#include<iostream>

int div(int A, int B)
{
return A/B;
}

int main()
{
int a=0, b=0;
for (int i=0; i<10; i++)
{
std::cout<<"text"<<std::endl;
}
std::cout<<a << " " << b<<std::endl;
a=0, b=0;
for (int i =0; b=10, a=5, a=div(b, a), i<10; i++)
std::cout<<a << " " << b<<std::endl;
}

Оффлайн alsoijw

  • Старожил
  • *
  • Сообщений: 4062
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
Re: Уроки по C++. Обсуждение.
« Ответ #136 : 30 Сентября 2015, 15:19:31 »
Столкнулся с проблемой. Компилятор VS 2012 ничего не пишет, g++ пишет предупреждение но собирает.
Код: (cpp) [Выделить]
#include <iostream>
using namespace std;

char* test() {
char arr[] = "текст\n";
return arr;
}

int main() {
cout << test();
return 0;
}
Вопросы: можно ли как-то бороться с самодеятельностью компилятора? Почему переменная возвращаемая функцией не уничтожается,а статический массив нет?
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Оффлайн SergeyIT

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5589
  • Все по палатам!
    • Просмотр профиля
Re: Уроки по C++. Обсуждение.
« Ответ #137 : 30 Сентября 2015, 16:47:47 »
Почему переменная возвращаемая функцией не уничтожается,а статический массив нет?
Не понял :(. Массив в стеке... его адрес
« Последнее редактирование: 30 Сентября 2015, 17:02:08 от SergeyIT »
Извините, я все еще учусь

Оффлайн alsoijw

  • Старожил
  • *
  • Сообщений: 4062
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
Re: Уроки по C++. Обсуждение.
« Ответ #138 : 30 Сентября 2015, 17:20:10 »
SergeyIT, статический массив уничтожается. Ты пробовал запустить код выше?
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Оффлайн SergeyIT

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5589
  • Все по палатам!
    • Просмотр профиля
Re: Уроки по C++. Обсуждение.
« Ответ #139 : 30 Сентября 2015, 19:18:12 »
alsoijw, теперь понял ;). Никогда так не писал, но интересный факт, то есть массив в функции инициализуется, его адрес возвращается, а в вызывающей функции его уже нет. Асм смотреть надо, однако...
Извините, я все еще учусь

Оффлайн unimix

  • Активист
  • *
  • Сообщений: 537
    • Просмотр профиля
Re: Уроки по C++. Обсуждение.
« Ответ #140 : 30 Сентября 2015, 22:01:04 »
Вопросы: можно ли как-то бороться с самодеятельностью компилятора? Почему переменная возвращаемая функцией не уничтожается,а статический массив нет?

Какая самодеяельность?

Код: (cpp) [Выделить]
int* test() {
   int a = 12;
   return &a;
}

Функция возвращает адрес на переменную. После завершения функции переменная удаляется, но адрес существует и вне функции. Прочитать по адресу переменную можно, но могут возникнуть ошибки (область памяти уже освободилась, но данные ещё не переписались).

Оффлайн SergeyIT

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5589
  • Все по палатам!
    • Просмотр профиля
Re: Уроки по C++. Обсуждение.
« Ответ #141 : 30 Сентября 2015, 22:22:53 »
unimix,
    #include <iostream>
    using namespace std;
     
    int* test() {
       int a = 12;
       return &a;
    }
     
    int main() {
            cout << *test();
            return 0;
    }
Работает правильно...
Раньше, помнится, и со строкой работало. (Си - pdp-11, на PC не знаю, глубоко не изучал)
Извините, я все еще учусь

Оффлайн alsoijw

  • Старожил
  • *
  • Сообщений: 4062
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
Re: Уроки по C++. Обсуждение.
« Ответ #142 : 01 Октября 2015, 00:21:05 »
unimix,
SergeyIT,
Задача: написать сериализацию, десериализацию. Проблема не в том что я не придумал как выкрутится. У меня уже было несколько вариантов когда я писал сюда. Начиная от глобальной переменной и кончая передачей чего-то типа string. Там есть конструкция типа
Код: (cpp) [Выделить]
t a, d;
/*d инициализируется
c сериализация
b десериализация*/
a = b(c(d));
Такой код не работает. А хочется чтобы он работал. Для меня это хакерская ценность. Если я буду возвращать указатель, то я не знаю как высвободить потом память. Среди вариантов был разделить сериализацию и десериализацию на разные строки, плюс временная переменная, которая потом уничтожается delete[]. Но мне он не нравится как и другие, так как они не красивы.
В чём самодеятельность? В том что компиллятор уничтожает статический массив(в отличии от любой другой переменной), но тем не менее собирает код. В случае 2012 студии без предупреждения, в случае с g++ (Debian 4.9.2-10) 4.9.2 или 2015 с предупреждением, но собирает. Понятное дело что ни в каком случае код верно не работает.
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Оффлайн SergeyIT

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5589
  • Все по палатам!
    • Просмотр профиля
Re: Уроки по C++. Обсуждение.
« Ответ #143 : 01 Октября 2015, 00:30:09 »
alsoijw, а что мешает описать массив как
  static char arr[] = "текст\n";

Извините, я все еще учусь

Оффлайн unimix

  • Активист
  • *
  • Сообщений: 537
    • Просмотр профиля
Re: Уроки по C++. Обсуждение.
« Ответ #144 : 01 Октября 2015, 02:50:57 »
Если я буду возвращать указатель, то я не знаю как высвободить потом память. Среди вариантов был разделить сериализацию и десериализацию на разные строки, плюс временная переменная, которая потом уничтожается delete[]. Но мне он не нравится как и другие, так как они не красивы.

Если я правильно понял, то для хранения сериализованных данных можешь использовать объект, очищающий память в своём деструкторе и в каком-нибудь методе.

Код: (cpp) [Выделить]
t a = b(c(d));
Получается, что функция b (десериализация) должна возвращать только один тип данных? На входе то всегда один тип от функции c (сериализации).

Кстати, вместо функций c и b можно использовать объекты одного типа.
Код: (cpp) [Выделить]
sometype c(d); // создание объекта сериализованных данных из объекта 'd'
t a = c(d); // создание объекта сериализованных данных из объекта 'd' и чтение сериализованных данных с помощью перегруженного метода '=' в типе 't'.
Это позволит реализовывать методы сериализации/десериализации внутри типа 't'.
« Последнее редактирование: 01 Октября 2015, 03:17:10 от unimix »

Оффлайн alsoijw

  • Старожил
  • *
  • Сообщений: 4062
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
Re: Уроки по C++. Обсуждение.
« Ответ #145 : 01 Октября 2015, 12:02:48 »
SergeyIT, ничего не мешает. Просто не понятно почему так не работает?
unimix, я учусь. Это не более чем учебный пример. Сериализация структуры. Мне не рекомендовали объявлять в структуре методы.
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Оффлайн SergeyIT

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5589
  • Все по палатам!
    • Просмотр профиля
Re: Уроки по C++. Обсуждение.
« Ответ #146 : 01 Октября 2015, 12:51:05 »
alsoijw, скомпили с листингом
g++ -S a.cpp
и увидишь, что массив в функции динамически генерится и при выходе его уже нет... реализовали так (это не нарушает стандарт языка)
Извините, я все еще учусь

Оффлайн unimix

  • Активист
  • *
  • Сообщений: 537
    • Просмотр профиля
Re: Уроки по C++. Обсуждение.
« Ответ #147 : 01 Октября 2015, 12:52:47 »
Мне не рекомендовали объявлять в структуре методы.

Структура и класс это почти одно и то же (отличие в дефолтном доступе). Да и конструктор в структуре не бывает лишним.

Если реализовывать сериализацию/десериализацию отдельной функцией, то при добавлении нового класса/структуры надо будет или изменять саму функцию, или вводить новую/перегруженную, или изменять класс объекта с данными сериализации.

Для класса, который будет сереализовываться, легче сделать родительский класс (можно абстрактный), имеющий методы работы с сериализацией. Потомки же будут реализовывать процесс сериализации/десериализации в соответствии со своими данными. Получится реализация полиморфизма, где можно работать с базовым классом.

Оффлайн alsoijw

  • Старожил
  • *
  • Сообщений: 4062
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
Re: Уроки по C++. Обсуждение.
« Ответ #148 : 01 Октября 2015, 13:43:46 »
SergeyIT, то есть ничего "плохого" тут нет? Типа не баг а фича?
unimix, спасибо, я это уже знаю. Пример не более чем учебный. А представление о красоте моё и преподавателя отличаются значительно. К тому же классы нам ещё не преподавали. Но я их знаю :)
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Оффлайн alsoijw

  • Старожил
  • *
  • Сообщений: 4062
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
Re: Уроки по C++. Обсуждение.
« Ответ #149 : 21 Октября 2015, 15:36:04 »
Код: (cpp) [Выделить]
#include <iostream>
#include <string>
#ifdef _MSC_VER
#include <Windows.h>
#endif
#include <map>
#include <vector>

using namespace std;


void parse(char * str) {
for(int i = 0; str[i]; i++) {
if(str[i] == '(') {
parse(str + i);
}
}
}


int main() {
#ifdef _MSC_VER
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
#endif
char code[] = "((()())())";
parse(code);
#ifdef _MSC_VER
system("pause");
#endif
return 0;
}
Падает от ошибки сегментирования. Почему?
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

 

Страница сгенерирована за 0.052 секунд. Запросов: 25.