2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 Код не запускается без ошибок в c++builder
Сообщение24.07.2009, 15:58 


07/02/09
4
Код не запускается без ошибок в 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 
Заслуженный участник


28/04/09
1933
Что касается 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 


21/03/06
1545
Москва
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 
Заслуженный участник


28/04/09
1933
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 
Заслуженный участник


04/05/09
4582
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 
Заслуженный участник


28/04/09
1933
venco
venco в сообщении #230983 писал(а):
Так умеет, например, gcc.

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

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

 Профиль  
                  
 
 Re: Код не запускается без ошибок в c++builder
Сообщение24.07.2009, 21:57 


07/02/09
4
Спасибо за ответы. Я использовал компилятор 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 
Заслуженный участник


04/05/09
4582
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 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group