2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Код не запускается без ошибок в c++builder
Сообщение24.07.2009, 15:58 
Код не запускается без ошибок в c++builder или в visual studio хотя работает в codebloks
код: [ скачать ] [ спрятать ]
Используется синтаксис C++
#include <stdio.h>
#include <math.h>
#include <iostream>
#include <fstream>
#include <ctime>
using namespace std;
int tau_1=5, tau_2=50,  g_slow=2;
   double k_tau=0.05;
   int g_fast=2;
   double tau_m=0.16, I_app=0.697;

double step(double h,int n,double y[2], double r1);

double f(int i,double y[],double r1){
switch (i){
    case 0:

return ((-y[0]+tanh(g_fast*y[0])-y[1]-I_app +0.1*r1)/tau_m);break;
case 1: return ((g_slow*y[0]-y[1])/(tau_2+(tau_1-tau_2)/(1+1/exp(y[0]/k_tau))));break;
default : break;
}
}
double step(double h,int n,double y[],double r1)
{
int i;

double yt[2];
double k1[2];
double k2[2];
double k3[2];
double k4[2];

for(i = 0; i <= n; i++)
{
    y[i];
k1[i] = h*f(i,y,r1);
}
for(i = 0; i <= n; i++)
{
yt[i] = y[i]+0.5*k1[i];
}
for(i = 0; i <= n; i++)
{
k2[i] = h*f(i,  yt,r1);
}
for(i = 0; i <= n; i++)
{
yt[i] = y[i]+0.5*k2[i];
}
for(i = 0; i <= n; i++)
{
k3[i] = h*f(i,  yt,r1);
}
for(i = 0; i <= n; i++)
{
yt[i] = y[i]+k3[i];
}
for(i = 0; i <= n; i++)
{
k4[i] = h*f(i,  yt,r1);
}
for(i = 0; i <= n; i++)
{
y[i] = y[i]+(k1[i]+2.0*k2[i]+2.0*k3[i]+k4[i])/6.0;

}
return y[2];

}
void spaik(double Y1[], double Y2[],double T[],int steps)
{
    double ArrayTime[steps-1];
    int j=0;
    ofstream out2;
    out2.open("Runge-Kutta2.txt");
for (int i=1;i<=steps-1;i++)
{
if ( Y1[i]>0.75 && Y1[i+1]>0.75 && Y1[i-1]>0.75)
        {
         if(Y1[i]>Y1[i+1] )
            {
                if(Y1[i]>Y1[i-1])
                {
                   if(T[i])

                   {
                    ArrayTime[j]=T[i];
                    j=j+1;
                    out2<<T[i]<<"\t"<<endl;
                   }
                }
            }
        }




}
double tauspike;
double ArrayTauSpike[steps-1];
for (int i1=0;i1<=j-2;i1++)
{
    tauspike=ArrayTime[i1+1]-ArrayTime[i1];
    ArrayTauSpike[i1]=tauspike;
   cout<<tauspike<<"\t"<<endl;

}

    }


void solvesystemrungekutta(double t,double t1,int steps,double y[]){
ofstream out;
    out.open("Runge-Kutta.txt");
srand(time(0));
double r[steps-1];
    double T[steps-1];
    double Y1[steps-1];
    double Y2[steps-1];
    double r1;
    int j=0;
for(int i = 1; i <= steps-1; i++)
{
y[2];
Y1[j]=y[0];
Y2[j]=y[1];
r[j]=1.0 * rand() / RAND_MAX;
r1=r[j];
step(((t1-t)/steps),2,y,r1);
T[j+1]=T[j]+((t1-t)/steps);
out<<T[j]<<"\t"<<Y1[j]<<"\t"<<Y2[j]<<endl;
j=j+1;



}
spaik(Y1,Y2,T,steps);
out.close();
}

int main(){
//первая координата
double temporaryresult[2]={0.1,0.1};
solvesystemrungekutta(1,500,10000,temporaryresult);

return 0;
}
 

в чем может быть проблема?
ошибки из builder
[C++ Warning] Unit1.cpp(23): W8066 Unreachable code
[C++ Warning] Unit1.cpp(24): W8066 Unreachable code
[C++ Warning] Unit1.cpp(27): W8070 Function should return a value
[C++ Error] Unit1.cpp(77): E2313 Constant expression required
[C++ Error] Unit1.cpp(105): E2313 Constant expression required
[C++ Error] Unit1.cpp(121): E2313 Constant expression required
[C++ Error] Unit1.cpp(122): E2313 Constant expression required
[C++ Error] Unit1.cpp(123): E2313 Constant expression required
[C++ Error] Unit1.cpp(124): E2313 Constant expression required
Почему в codeblocks все работает без проблем а в этих ide нет?

 
 
 
 Re: Код не запускается без ошибок в c++builder
Сообщение24.07.2009, 17:25 
Что касается Warning'ов, то они относятся к конструкции switch: в ней вы использовали 2 раза break после return (Unreachable code - недостижимый код), а на default-ветке return вообще не указали (Function must return a value - функция должна возвращать значение).
Все ошибки относятся к случаю типа
Код:
double ArrayTime[steps-1];

в котором размер массива задается переменной-формальным параметром функции. Этот случай различные компиляторы обрабатывают по-разному: некоторые допускают такую "вольность", другие следуют более строгим стандартам. Короче говоря, выделяйте память под массивы динамически (только не забывайте ее потом освобождать!) или используйте те же Code::Blocks (кстати, какой компилятор Вы используете совместно с ними?).

 
 
 
 Re: Код не запускается без ошибок в c++builder
Сообщение24.07.2009, 17:37 
EtCetera в сообщении #230972 писал(а):
...
Все ошибки относятся к случаю типа
Код:
double ArrayTime[steps-1];

в котором размер массива задается переменной-формальным параметром функции. Этот случай различные компиляторы обрабатывают по-разному: некоторые допускают такую "вольность", другие следуют более строгим стандартам. Короче говоря, выделяйте память под массивы динамически (только не забывайте ее потом освобождать!) или используйте те же Code::Blocks (кстати, какой компилятор Вы используете совместно с ними?).

Хм, а как компилятор может осознанно обработать ситуацию типа:

Код:
int a = 1 + rand()%100;
double ArrayTime[a];

и не выдать error?

 
 
 
 Re: Код не запускается без ошибок в c++builder
Сообщение24.07.2009, 18:18 
e2e4
e2e4 в сообщении #230974 писал(а):
Хм, а как компилятор может осознанно обработать ситуацию типа:
Код:
int a = 1 + rand()%100;
double ArrayTime[a];

и не выдать error?

Теоретически может. По крайней мере, у serge25 как-то смог (вот мне и интересно, что это за компилятор?). Как конкретно он (в смысле, компилятор) может это осуществить? Например, "догадаться", что в данном случае память стоит выделить динамически, а по завершении функции ее так же динамически освободить. Конечно, на такое "способен" далеко не каждый компилятор, но... Если я не ошибаюсь (хотя могу и ошибаться), стандарт C++ умалчивает о такого рода вещах, оставляя их на совести разработчиков компиляторов. Но что я знаю точно, так это то, что Visual Studio (как впрочем и Builder) используют не такие "умные" компиляторы...

 
 
 
 Re: Код не запускается без ошибок в c++builder
Сообщение24.07.2009, 18:21 
e2e4 в сообщении #230974 писал(а):
Хм, а как компилятор может осознанно обработать ситуацию типа:

Код:
int a = 1 + rand()%100;
double ArrayTime[a];

и не выдать error?

Выделяет в стеке необходимое количество памяти и запоминает указатель на неё.

-- Пт июл 24, 2009 11:25:43 --

EtCetera в сообщении #230982 писал(а):
Теоретически может. По крайней мере, у serge25 как-то смог (вот мне и интересно, что это за компилятор?). Как конкретно он (в смысле, компилятор) может это осуществить? Например, "догадаться", что в данном случае память стоит выделить динамически, а по завершении функции ее так же динамически освободить. Конечно, на такое "способен" далеко не каждый компилятор, но... Если я не ошибаюсь (хотя могу и ошибаться), стандарт C++ умалчивает о такого рода вещах, оставляя их на совести разработчиков компиляторов. Но что я знаю точно, так это то, что Visual Studio (как впрочем и Builder) используют не такие "умные" компиляторы...
Так умеет, например, gcc. Освобождать память в стеке специально не нужно, она и так при выходе из функции освободится. Да, это нестандартное расширение. У gcc их много. Стандарт это не умалчивает, а требует, чтобы размер массива везде, кроме heap, был 'compile-time constant'.

 
 
 
 Re: Код не запускается без ошибок в c++builder
Сообщение24.07.2009, 18:47 
venco
venco в сообщении #230983 писал(а):
Так умеет, например, gcc.

А я-то уже собирался кивать в сторону Intel C++ Compiler... Честно говоря, хотя и достаточно плодотворно общался с gcc, никогда такой возможностью не пользовался (просто как-то привык к тому, что в Visual Studio этого нет - и не надо...).
venco в сообщении #230983 писал(а):
Стандарт это не умалчивает, а требует, чтобы размер массива везде, кроме heap, был 'compile-time constant'.

Спасибо за информацию. Никогда сильно об этом не задумывался, чем и было вызвано мое заблуждение...

 
 
 
 Re: Код не запускается без ошибок в c++builder
Сообщение24.07.2009, 21:57 
Спасибо за ответы. Я использовал компилятор gcc. По поводу switch, значит правильнее для функции double f(int i,double y[],double r1) записать return (switch(i){case1:...;break;case2:...;break;});? или переписать через if ?

 
 
 
 Re: Код не запускается без ошибок в c++builder
Сообщение24.07.2009, 22:36 
serge25 в сообщении #231016 писал(а):
Спасибо за ответы. Я использовал компилятор gcc. По поводу switch, значит правильнее для функции double f(int i,double y[],double r1) записать return (switch(i){case1:...;break;case2:...;break;});? или переписать через if ?
Нет.
1. Надо убрать операторы break после return, т.к. после return код уже никогда не исполняется.
2. Надо добавить return либо в конце функции, либо после метки default. Посмотрите, что будет выполнятся если i равно, например, двум.

 
 
 [ Сообщений: 8 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group