Превод с фортрана на СИ
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
Ребят ситуация такая, имеется программа на бумаге написаная на фортране, что позволили мои познания в програмировании я сделал, но остались большие пробелы с некоторыми циклами и преобразованиями форматов данных, сознаюсь это мои слабые стороны, в мозгу представляю а как написать затрудняюсь. Кто сможет посмотреть и объяснить как исправить, буду очень признателен
- Вложения
-
[Расширение txt было запрещено, вложение больше недоступно.]
-
[Расширение txt было запрещено, вложение больше недоступно.]
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Данный форумный раздел предназначен для вопросов "Как это сделать?", либо "Объясните, что это такое?". Просьбы типа "Сделайте плизз", должны быть адресованы в другой раздел.
Боюсь, что такое большое количество кода, в который нужно предварительно вникнуть, отлаживать и исправлять за просто так никто не станет.
Если готов заплатить я могу перенести в "Вакансии и заказы".
Если не готов, могу перенести в "Решите мне задачку" (но там при таком объёме кода и формул скорее всего никто не откликнется).
Боюсь, что такое большое количество кода, в который нужно предварительно вникнуть, отлаживать и исправлять за просто так никто не станет.
Если готов заплатить я могу перенести в "Вакансии и заказы".
Если не готов, могу перенести в "Решите мне задачку" (но там при таком объёме кода и формул скорее всего никто не откликнется).
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
не пока переносить не нужно, я наверно неправильно тему сформулировал.
Попробую так, есть фортрановский цикл
do 110 j=ny1,my
do 113 i=i,nx
t[j][k]=t2
113 continue
110 continue
если его сделать так
do
{ j=1;
do
{ i=1;
t[i,j,k]=t1;
}
while(i=nx);
}
while(i=ny);
это будет верно ? у меня просто выдает ошибку error C2440: '=' : cannot convert from 'double' to 'double [50][200]'
--------------------------------------------------------------------------------
Добавлено сообщение
--------------------------------------------------------------------------------
и вторая глобальная проблема.
i=mx;
k=2;
t[j][k]=f[mx][j];
m155: i=i-1;
t[j][k]=e[j]*t[i+1][j][k]+f[j];
if (i=1) goto m160;
goto m155;
m160: j=j+1;
if (j==(my)) goto 200;
if (j==(my-1)) goto 170;
k=1;
tsr=(t[1][j][k]+t[2][j][k])/2;
l211=tf(tsr);
tsr=(t[1][j][k]+t[1][j+1][k])/2;
на первый иф не ругается на два остальных ругается
в чем причина не могу понять пишет error C2059: syntax error : 'constant' из того что предпринимал: скобки убирал, ставил и = и ==, эффект нулевой
Попробую так, есть фортрановский цикл
do 110 j=ny1,my
do 113 i=i,nx
t[j][k]=t2
113 continue
110 continue
если его сделать так
do
{ j=1;
do
{ i=1;
t[i,j,k]=t1;
}
while(i=nx);
}
while(i=ny);
это будет верно ? у меня просто выдает ошибку error C2440: '=' : cannot convert from 'double' to 'double [50][200]'
--------------------------------------------------------------------------------
Добавлено сообщение
--------------------------------------------------------------------------------
и вторая глобальная проблема.
i=mx;
k=2;
t[j][k]=f[mx][j];
m155: i=i-1;
t[j][k]=e[j]*t[i+1][j][k]+f[j];
if (i=1) goto m160;
goto m155;
m160: j=j+1;
if (j==(my)) goto 200;
if (j==(my-1)) goto 170;
k=1;
tsr=(t[1][j][k]+t[2][j][k])/2;
l211=tf(tsr);
tsr=(t[1][j][k]+t[1][j+1][k])/2;
на первый иф не ругается на два остальных ругается
в чем причина не могу понять пишет error C2059: syntax error : 'constant' из того что предпринимал: скобки убирал, ставил и = и ==, эффект нулевой
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Вот это другое дело 
1. Используй форму t[j][k].
2. Метка должна быть идентификатором. Идентификатор - это группа символов, состоящая из цифр, букв и знаков подчёркивания, причём первый символ не может быть цифрой. Такое ограничение введено для того, чтобы можно было отличить идентификатор от константного численного значения. Так что добавь любой символ перед 200 и 170.

1. Используй форму t[j][k].
2. Метка должна быть идентификатором. Идентификатор - это группа символов, состоящая из цифр, букв и знаков подчёркивания, причём первый символ не может быть цифрой. Такое ограничение введено для того, чтобы можно было отличить идентификатор от константного численного значения. Так что добавь любой символ перед 200 и 170.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
void main()
{
double e[50][200], f[50][200], t[50][50][200],b1,b2,b,b3,b4,b5,a1,a2,t1,l122,t2,l111,l112,l121,l211,l222,l221,l212,c,tsr,tw,rrx,rry,rr,tau,r,dy,dx,df,deltax,deltaf1,deltay,deltaf2;
int x1,y1,tl,tlfx,tlfy,nx,mx,ny,my,nnx,nny,ny1,nx1,kfs,sumtau,j,k,i,bn,rf,mws,kj,mks,ts;
a1=4.95E-6;
a2=5.78E-6;
deltax=x1/1000;
deltaf1=tlfx/1000;
dx=sqrt(6*a1*tau);
df=sqrt(4*a2*tau);
nx=(deltax/dx)+1;
mx=(deltaf1/df)+nx+1;
nnx=mx-nx;
deltaf2=tlfy/1000;
deltay=y1/1000;
dy=sqrt(4*a1*tau);
ny=(deltay/dy)+1;
my=(deltaf2/df)+ny+1;
nny=my-ny;
осталось 4 последни предепреждения warning C4244: '=' : conversion from 'double' to 'int', possible loss of data. если nx mx ny my сделать типа double то вылазит 102 ошибки. в чем причина?
{
double e[50][200], f[50][200], t[50][50][200],b1,b2,b,b3,b4,b5,a1,a2,t1,l122,t2,l111,l112,l121,l211,l222,l221,l212,c,tsr,tw,rrx,rry,rr,tau,r,dy,dx,df,deltax,deltaf1,deltay,deltaf2;
int x1,y1,tl,tlfx,tlfy,nx,mx,ny,my,nnx,nny,ny1,nx1,kfs,sumtau,j,k,i,bn,rf,mws,kj,mks,ts;
a1=4.95E-6;
a2=5.78E-6;
deltax=x1/1000;
deltaf1=tlfx/1000;
dx=sqrt(6*a1*tau);
df=sqrt(4*a2*tau);
nx=(deltax/dx)+1;
mx=(deltaf1/df)+nx+1;
nnx=mx-nx;
deltaf2=tlfy/1000;
deltay=y1/1000;
dy=sqrt(4*a1*tau);
ny=(deltay/dy)+1;
my=(deltaf2/df)+ny+1;
nny=my-ny;
осталось 4 последни предепреждения warning C4244: '=' : conversion from 'double' to 'int', possible loss of data. если nx mx ny my сделать типа double то вылазит 102 ошибки. в чем причина?
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Чтобы избавится от warnings напиши:
Зачем нужен 0.5? Дело в том, что обычный каст к типу int совершает truncation (отбрасывание дробной части). Прибавление 0.5 позволяет превратить truncation в rounding (округление).
Почему смена типа переменной на double даёт 102 ошибки я не знаю. Ошибки какого вида?
Код: Выделить всё
nx = (int)((deltax/dx) + 0.5) + 1;
Почему смена типа переменной на double даёт 102 ошибки я не знаю. Ошибки какого вида?
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
error C2664: 'ro' : cannot convert parameter 1 from 'double (*)[50][200]' to 'double'
error C2108: subscript is not of integral type
такие в основном
--------------------------------------------------------------------------------
Добавлено сообщение
--------------------------------------------------------------------------------
хм наверно я всетаки чтото не то сделал, ошибок нету предупреждений тожже, но прога не стартует даже на запрос данных, вылетает с ошибкой. что это может быть?
error C2108: subscript is not of integral type
такие в основном
--------------------------------------------------------------------------------
Добавлено сообщение
--------------------------------------------------------------------------------
хм наверно я всетаки чтото не то сделал, ошибок нету предупреждений тожже, но прога не стартует даже на запрос данных, вылетает с ошибкой. что это может быть?
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
О, так это реальная проблема. У тебя где-то объявлен трёхмерный массив а ты ему указываешь два индекса, в результате получаешь указатель и интерпретируешь этот указатель, как число.
Это как раз тот случай, когда исправление warning позволяет избежать логической ошибки. Меняй нужные переменные на тип double, а потом отслеживай все ошибки указанного вида и исправляй их.
Это как раз тот случай, когда исправление warning позволяет избежать логической ошибки. Меняй нужные переменные на тип double, а потом отслеживай все ошибки указанного вида и исправляй их.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
таак вот терь наверно нада переносить, потому что я не допонимаю чего он от меня хотит.
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Давай сюда непонятные ошибки и строки из программы, на которые он ругается.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.