Cannot convert `double*' to `double' – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Cannot convert `double*' to `double' – C / C++ – Fórum – Programujte.comCannot convert `double*' to `double' – C / C++ – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
mateo0
Duch
24. 7. 2011   #1
-
0
-

Zdravím, zaseknul jsem se u jedné chyby při psaní programu. Chci předat funkci pole jako parametr, což by měla být jednoduchá záležitost a postupuji stejně jako zde: http://www.cplusplus.com/…rial/arrays/ . Našel jsem sice dotazy ohledně stejné chybové hlášky na anglických stránkách, ale jejich řešení nebo důvod, proč k tomu došlo, mi nepřijde aplikovatelný na mojí situaci. Mohl byste mi někdo poradit co s tím? Kdyby to někoho zajímalo, tak se jedná o řešení rovnice geodetiky z obecní teorie relativity ve Schwarzshildově metrice pomocí numerické metody Runge-Kutta čtvrtého řádu. Vím, že kód je zatím neefektivní, vylepšovat to budu, až bude funkční. Díky za odpověď.

#include <cstdlib>
#include <iostream>
#include <math.h>

using namespace std;

// c=1, G=1

const double PI = 3.1415926535;
const int Dim = 4;
const double M=1;             //hmotnost v geometrizovaných jednotkách
typedef double IVektor[Dim];  // vlastni typ pro predavani ve funkcich
 

void derivs (double x[Dim], double v[Dim], double &dx, double &dv, int a) {
    
    double r = x[1];
    double theta = x[2];
    double g = (1.0-2.0*M/r);
    
    if(g<=0) {
          cout << "HORIZONT!" << g;   
          exit(1);
          }         
     
    dx = v[a];           
    
    switch(a) {
      case 0:
         dv= -2.0*M/(r*r)/g*v[0]*v[1];
         break;
      case 1:   
         dv= -2.0*M/(r*r)*g*v[0]*v[0]+M/(r*r*g)*v[1]*v[1]+(r-2*M)*v[2]*v[2]+(r-2*M)*sin(theta)*sin(theta)*v[3]*v[3];
         break;
      case 2:   
         dv= -2.0/r*v[1]*v[2]+sin(theta)*cos(theta)*v[3]*v[3];
         break;
      case 3:
         dv= -2.0/r*v[1]*v[3]-2.0*cos(theta)/sin(theta)*v[2]*v[3];
         break;
      }   
}

void RK4 (void derivs(double , double , double &, double &, int), IVektor &x, IVektor &v, double dt) {
     
IVektor dx1,dx2,dx3,dx4,dv1,dv2,dv3,dv4; // 4vektory pro vypocet
double p[Dim], q[Dim]; // pomocna pole pro predani parametrem
int i,j;


      for(j = 0; j < Dim; j++) {
          p[j]=j;
          q[j]=j; 
          }

   for(i=0; i<Dim; i++)   derivs(p,q,dx1[i],dv1[i],i); // zde je prvni chyba    // a pak u dalsich volani derivs()
   
      for (j = 0; j < Dim; j++) {
          p[j]=x[j]+0.5*dt*dx1[j];
          q[j]=v[j]+0.5*dt*dv1[j]; 
          }
     
   for (i = 0; i < Dim; i++)  derivs(p,q,dx2[i],dv2[i],i);
     
     for (j = 0; j < Dim; j++) {
          p[j]=x[j]+0.5*dt*dx2[j];
          q[j]=v[j]+0.5*dt*dv2[j]; 
          }
     
   for (i = 0; i < Dim; i++)  derivs(p,q,dx3[i],dv3[i],i);
   
     for (int j = 0; j < Dim; j++) {
          p[j]=x[j]+dt*dx3[j];
          q[j]=v[j]+dt*dv3[j]; 
          }
          
   for (i = 0; i < Dim; i++)  derivs(p,q,dx4[i],dv4[i],i);
 
   for (i = 0; i < Dim; i++) {
     x[i]+=dt*(dx1[i]+2*(dx2[i]+dx3[i])+dx4[i])/6;
     v[i]+=dt*(dv1[i]+2*(dv2[i]+dv3[i])+dv4[i])/6;
     }
}
int main(int argc, char *argv[])
{
    IVektor x,v;
                                //pocatecni podminky    
    x[1] = 10;           // souradnice v r
    x[2] = PI/2;
    x[3] = 0;            // souradnice v fi
    x[0] = 0;            // souradnice v case
    
    double g1 = (1-2.0*M/x[1]);
    
    v[1] = 0;            // rychlost v r
    v[2] = 0;
    v[3] = 0.065;         // rychlost v fi
    v[0] = sqrt(1.0/g1+v[1]*v[1]/(g1*g1)+x[1]*x[1]*v[2]*v[2]/g1+x[1]*x[1]*v[3]*v[3]*sin(x[2])*sin(x[2])/g1);            // rychlost v case
    
    double tau = 0;
    double dtau = 1.0/1000;
    int a = 0;
    
    while (tau<100) {
           if (a % 1000 == 0)      cout << tau << " " << x[1]*cos(x[3]) << " " << x[1]*sin(x[3]) << " " << v[1] << endl;
           RK4(derivs,x,v,dtau);
           tau+=dtau;           
           a++;    
    }      
    
    
    return EXIT_SUCCESS;
}
Nahlásit jako SPAM
IP: 88.101.70.–
Reklama
Reklama
Řešení
KIIV+42
God of flame
24. 7. 2011   #2
-
0
-
Vyřešeno Nejlepší odpověď

zdar, problem bych asi videl:

void RK4 (void derivs(double , double , double &, double &, int), IVektor &x, IVektor &v, double dt) {

mas tam sice zminku o tom ze se predava pointer na funkci - ale uplne si zlikvidoval parametry.

Doporucuju prejmenovat si to derivs v ramci RK4 na neco jineho, aby se ti to nepletlo s tou globalni funkci.

A pak opravit ty datove typy na aspon  double[] nebo double *

Nahlásit jako SPAM
IP: 94.112.35.–
Program vždy dělá to co naprogramujete, ne to co chcete...
mateo0
Duch
24. 7. 2011   #3
-
0
-

#2 KIIV
Díky, problém byl v těch parametrech v pointru na fci. Taky jsem si toho mohl všimnout sám.

Nahlásit jako SPAM
IP: 88.101.70.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 41 hostů

Podobná vlákna

Zaokrouhlení double — založil vollf82

Problem s double — založil braba

Non scientific double — založil Tereza

Double (float) — založil jack22

Float X double — založil Hurys

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý