Страница 1 из 2

Превод с фортрана на СИ

Добавлено: 01 ноя 2009, 21:26
grigzema
Ребят ситуация такая, имеется программа на бумаге написаная на фортране, что позволили мои познания в програмировании я сделал, но остались большие пробелы с некоторыми циклами и преобразованиями форматов данных, сознаюсь это мои слабые стороны, в мозгу представляю а как написать затрудняюсь. Кто сможет посмотреть и объяснить как исправить, буду очень признателен

Re: Превод с фортрана на СИ

Добавлено: 02 ноя 2009, 10:13
Romeo
Данный форумный раздел предназначен для вопросов "Как это сделать?", либо "Объясните, что это такое?". Просьбы типа "Сделайте плизз", должны быть адресованы в другой раздел.

Боюсь, что такое большое количество кода, в который нужно предварительно вникнуть, отлаживать и исправлять за просто так никто не станет.

Если готов заплатить я могу перенести в "Вакансии и заказы".

Если не готов, могу перенести в "Решите мне задачку" (но там при таком объёме кода и формул скорее всего никто не откликнется).

Re: Превод с фортрана на СИ

Добавлено: 02 ноя 2009, 11:21
grigzema
не пока переносить не нужно, я наверно неправильно тему сформулировал.
Попробую так, есть фортрановский цикл
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' из того что предпринимал: скобки убирал, ставил и = и ==, эффект нулевой

Re: Превод с фортрана на СИ

Добавлено: 02 ноя 2009, 12:00
Romeo
Вот это другое дело :)

1. Используй форму t[j][k].

2. Метка должна быть идентификатором. Идентификатор - это группа символов, состоящая из цифр, букв и знаков подчёркивания, причём первый символ не может быть цифрой. Такое ограничение введено для того, чтобы можно было отличить идентификатор от константного численного значения. Так что добавь любой символ перед 200 и 170.

Re: Превод с фортрана на СИ

Добавлено: 02 ноя 2009, 12:57
grigzema
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 ошибки. в чем причина?

Re: Превод с фортрана на СИ

Добавлено: 02 ноя 2009, 13:57
Romeo
Чтобы избавится от warnings напиши:

Код: Выделить всё

nx = (int)((deltax/dx) + 0.5) + 1;
Зачем нужен 0.5? Дело в том, что обычный каст к типу int совершает truncation (отбрасывание дробной части). Прибавление 0.5 позволяет превратить truncation в rounding (округление).

Почему смена типа переменной на double даёт 102 ошибки я не знаю. Ошибки какого вида?

Re: Превод с фортрана на СИ

Добавлено: 02 ноя 2009, 15:12
grigzema
error C2664: 'ro' : cannot convert parameter 1 from 'double (*)[50][200]' to 'double'
error C2108: subscript is not of integral type
такие в основном
--------------------------------------------------------------------------------
Добавлено сообщение
--------------------------------------------------------------------------------
хм наверно я всетаки чтото не то сделал, ошибок нету предупреждений тожже, но прога не стартует даже на запрос данных, вылетает с ошибкой. что это может быть?

Re: Превод с фортрана на СИ

Добавлено: 02 ноя 2009, 15:38
Romeo
О, так это реальная проблема. У тебя где-то объявлен трёхмерный массив а ты ему указываешь два индекса, в результате получаешь указатель и интерпретируешь этот указатель, как число.

Это как раз тот случай, когда исправление warning позволяет избежать логической ошибки. Меняй нужные переменные на тип double, а потом отслеживай все ошибки указанного вида и исправляй их.

Re: Превод с фортрана на СИ

Добавлено: 02 ноя 2009, 15:55
grigzema
таак вот терь наверно нада переносить, потому что я не допонимаю чего он от меня хотит.

Re: Превод с фортрана на СИ

Добавлено: 03 ноя 2009, 16:06
Romeo
Давай сюда непонятные ошибки и строки из программы, на которые он ругается.