Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > C++ > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 03.04.2012, 15:04   #1
minor
 
Регистрация: 22.12.2008
Сообщений: 8
Репутация: 10
По умолчанию Связь фортрана и С++

Здравствуйте!У меня стоит задача перевода с фортрана на с++!подскажи плиз как переменные такого типа будут обьявляться в С++

COMPLEX X,CXCS,HOLD,XA

и что делает такой оператор

EQUIVALENCE (CXCS,CS)
minor вне форума   Ответить с цитированием
Старый 03.04.2012, 15:46   #2
Vago
Участник клуба
 
Регистрация: 15.01.2010
Сообщений: 943
Репутация: 355
По умолчанию

Цитата:
Сообщение от minor Посмотреть сообщение
как переменные такого типа будут обьявляться в С++

COMPLEX X,CXCS,HOLD,XA
Код:
...
#include <complex>
using namespace std;
   ...
   complex<float> X, CXCS, HOLD, XA ;  // Или <double>
Цитата:
Сообщение от minor
и что делает такой оператор

EQUIVALENCE (CXCS,CS)
А вот и пресловутый п... Который, как известно, подкрадывается незаметно...

Этот оператор "приказывает" транслятору расположить переменные CXCS и CS в одном и том же месте в ОП. Как следствие, при выполнении все операции над второй переменной отражаются на первой и наоборот:
Код:
       ...
       INTEGER A, B
       EQUIVALENCE (A,B)
       ...
       A = 1
       B = A
       B = B+1
       PRINT *, A
выведет 2 !

Аналогичного ОПЕРАТОРА в C/C++ НЕТ! Нужно делать нечто такое:
Код:
   ...
   int   a ;
   int*  b ; 

   b = &(a) ;
   a = 1 ;
   *b +=  1 ;

   printf( "%d\n", a ) ;
Vago вне форума   Ответить с цитированием
Старый 03.04.2012, 16:28   #3
minor
 
Регистрация: 22.12.2008
Сообщений: 8
Репутация: 10
По умолчанию

а еще вопрос
есть такой текст на фортране
IF (SIGN) 10,10,5
5 DELTA=1./(T*FLOAT(NMAX))
10 MSK(1)=NMAX/2
DO 15 I=2,NPOW
15 MSK(I)=MSK(I-1)/2
NN=NMAX
MM=2
Мне условие if не совсем понятно что делает в этом случае
minor вне форума   Ответить с цитированием
Старый 03.04.2012, 16:50   #4
Vago
Участник клуба
 
Регистрация: 15.01.2010
Сообщений: 943
Репутация: 355
По умолчанию

Это так называемый "арифметический оператор IF". Если выражение в скобках строго меньше нуля, идём на метку, указанную первой, если равно нулю - на вторую, ежели больше нуля - на третью. В 98% случаев две из этих трёх меток совпадают, и, таким образом, арифметический IF можно заменить более удобочитаемым логическим:
Код:
       IF ( SIGN .LE. 0. ) GOTO 10
         DELTA=1./(T*FLOAT(NMAX))
   10 MSK(1)=NMAX/2
либо вообще воспользоваться "нормальными" управляющими структурами, появившимися в Фортране 77:
Код:
IF ( SIGN .GT. 0. ) THEN
   DELTA=1./(T*FLOAT(NMAX))
ENDIF
MSK(1)=NMAX/2

Последний раз редактировалось Vago; 03.04.2012 в 19:23. Причина: Пардон, недоглядел, в какую сторону нестрогое неравенство.
Vago вне форума   Ответить с цитированием
Старый 03.04.2012, 18:00   #5
Гром
Профессионал
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
Репутация: 473

icq: 482-373-277
По умолчанию

Цитата:
Сообщение от Vago Посмотреть сообщение
[CODE]Аналогичного ОПЕРАТОРА в C/C++ НЕТ!
Я фортран не знаю, но судя по описанию - ссылки, нет?

Код:
int a;
int& b = a;
a = 3;
std::cout << b;
__________________
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума   Ответить с цитированием
Старый 03.04.2012, 18:57   #6
Vago
Участник клуба
 
Регистрация: 15.01.2010
Сообщений: 943
Репутация: 355
По умолчанию

Гром, Вы знаете, я могу ошибиться (потому что, связывая C с Фортраном, я всегда ограничивал себя чётко Сишным синтаксисом), но, судя по вот этому (я понимаю, конечно, что это - ДИЗассемблирование):
Код:
7:       int   a ;
8:       int&  b = a ;
00401028   lea         eax,[ebp-4]
0040102B   mov         dword ptr [ebp-8],eax
9:
10:      a = 1 ;
0040102E   mov         dword ptr [ebp-4],1
11:      b = 2 ;
00401035   mov         ecx,dword ptr [ebp-8]
00401038   mov         dword ptr [ecx],2
в C++, для того чтобы b "стало эквивалентно" a, должно хоть что-то, хоть 2 ассемблерные командочки, но выполниться! А в Фортране переменные, указанные в EQUIVALENCE, в одно и то же место памяти помещает транслятор. Там, вообще адреса памяти одинаковые:
Код:
3:           integer A, B
4:           equivalence (A, B)
5:
6:           A = 1
0040101D   mov         eax,1
00401022   mov         dword ptr [A (00455558)],eax
7:           B = 2
00401028   mov         edx,2
0040102D   mov         dword ptr [A (00455558)],edx
Vago вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C Фортрана в Delphi SPD Софт 9 09.11.2011 12:12
Компилятор Фортрана Скарам Софт 5 21.12.2010 18:30
Синтаксис Фортрана Каптюк Помощь студентам 2 15.05.2010 06:32
Перевод фортрана в С varsus Общие вопросы C/C++ 4 10.01.2009 15:18


23:14.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.