Форум программистов, компьютерный форум CyberForum.ru

Различия компиляторов. В чем причина? - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Симметрия http://www.cyberforum.ru/cpp-beginners/thread413758.html
Многие из вас, вероятно, знакомы с понятием симметрии относительно прямой. Пусть на плоскости расположена прямая L и точка A. Точка B называется симметричной точке A относительно прямой L, если отрезок АВ перпендикулярен прямой L и делится пополам точкой пересечения с ней. В частности, если точка А лежит на прямой L, то точка B совпадает с точкой А. Задана прямая L, параллельная одной из осей...
C++ Определить max и min элементы матрицы Определить мах и мин элементы матрицы вещественных чисел размерностью 6х6 и поменять их местами Ввод элементов матрицы с клавиатуры а вывод на StringGrid вот что у меня получилось, и в итоге считает не правильно.. { float min, max, d, A; int i, j; for(i=0; i>6; i++) for(j=0; j>6; j++) http://www.cyberforum.ru/cpp-beginners/thread413757.html
C++ Найти элемент в массиве
Помогите пожалуйста!!! очень нужно!!! 1) В линейном массиве найти элемен, делящий массив на две равные по сумме части. 2) Преставить строки матрицы так, чтобы номера максимальных элементов образовывали неубывающую последовательность. 3) Заменить каждый элемент линейного массива, начиная со второго, средним арифметическим предыдущих элементов
C++ Помогите пожалуйста с программой
Задан список процессов, выполняющихся под управлением операционной системы. Каждый процесс характеризуется уникальным идентификатором, приоритетом (от 0 до 15), временем создания (часы, минуты, секунды), объемом доступной и занимаемой памяти, поиск по идентификатору, сортировку по приоритету и времени создания. ps решить нужно согласно теме "Структуры и объединения в С++"
C++ умножение матриц и упорядочение матрицы http://www.cyberforum.ru/cpp-beginners/thread413733.html
Добрый всем вечер! Уважаемые, если можно помогите пожалуйста. Имеются 2 задачки, которые очень надо решить... но умения в этом нету( Прошу помочь, если можно... Вот первая: Составить процедуру которая формируют матрицу H(m,m-1) из матрицы F(m,m) где m<13 путём вычеркивания минимального элемента каждой строки матрицы. Умножить исходную матрицу на полученную. В основной программе с помощью...
C++ как расписать функцию в с++ sn = n/f(x) в степени n sin (x+1) + 1/x x<0.5 F(x)= a*a + 1/x x>=0.5 код программы #include <iostream> подробнее

Показать сообщение отдельно
Питекантроп
 Аватар для Питекантроп
246 / 140 / 6
Регистрация: 14.06.2010
Сообщений: 340
21.12.2011, 18:28     Различия компиляторов. В чем причина?
есть небольшой код, который успешно компилируется в VS 2010
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <iostream>
 
template <class T>
class complex
{
public:
    T re, im;
    complex(T re = 0, T im = 0)
    {
        this->re = re;
        this->im = im;
    }
    complex(complex<T> & c)
    {
        this->re = c.re;
        this->im = c.im;
    }
 
    complex<T> operator + (complex<T> & c)
    {
        return complex<T>(re + c.re,im + c.im);
    }
 
    complex<T> operator - (complex<T> & c)
    {
        return complex<T>(re - c.re,im - c.im);
    }
    complex<T> & operator = (complex<T> & c)
    {
        this->re = c.re;
        this->im = c.im;
        return *this;
    }
    complex<T> operator + (T x)
    {
        return complex<T>(re + x,im);
    }
};
 
using namespace std;
int main(int argc, char* argv[])
{
    complex<double> a(1,3), b, c;
    c = a;
    b = a + c + 10;
    cout<<b.re<<" "<<b.im<<endl;
    cin.get();
    return 0;
}
При попытке переноса его на с++ builder 2010 возникают две ошибки:
1. Компилятору не нравится конструктор копирования. Интересно, что в старом добром builder 6 такой ошибки не возникает.
2. Не нравится вызов оператора = в строке
C++
1
b = a + c + 10;
Первое устраняется удалением конструктора копирования (он тут по сути и не нужен).
Второе - в передаче параметров оператора = через стек, а не по ссылке
C++
1
complex<T> & operator = (complex<T> c)
Просмотр дизассемблированного кода дает ожидаемые результаты: в VS передает в стек указетель, а билдер - копирует туда экземпляр класса (т.е. в случае double - в 4 раза больше).
Тестировал на компиляторе g++ - ему по душе билдеровский вариант.
Еще протестировал возврат результата по ссылке в случае с оператором +.
C++
1
2
3
4
    complex<T> & operator + (complex<T> & c)
    {
        return complex<T>(re + c.re,im + c.im);
    }
Билдер в этом случае не компилирует, а VS компилирует, но выдает неправильный результат (т.к. созданный локально стековый объект удаляется)

В чем же причина? Различные стандарты с++?
Или дело в неопределенном поведении, как, например, в таком случае?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 07:31. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru