Форум программистов, компьютерный форум CyberForum.ru

Перевести из Java на C++ - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Мега Ксю
 Аватар для Мега Ксю
3 / 3 / 0
Регистрация: 02.03.2013
Сообщений: 56
19.04.2013, 01:23     Перевести из Java на C++ #1
Всем доброй ночи! Я уже разок обращалась за помощью на этот форум, и сейчас, набравшись немножко наглости, хочу обратиться ещё раз
Есть программа на Java
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.sql.SQLOutput;
import java.util.Scanner;
 
public class Solution {
    private static double q = 1.6;
    private static double eps0 = 8.85;
    private static double eps = 13;
    private static double nd = 1;
    private static double d = 2;
    private static double phi0 = 0.8;
    private static double k = 8.62 * Math.pow(10, -5);
    private static double T = 293;
 
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        computeEilerWithVolumeCharge(n) ;
 
        double[] phiEiler = computeEilerSimple(n);
        double[] phiEilerVolumeCharge = computeEilerWithVolumeCharge(n);
        try {
            OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream("KMP_compare.txt"));
            boolean flag = false;
            double h = d / n;
            for (int i = 0; i < phiEiler.length; i++) {
                writer.write(h * i + " " + phiEiler[i] + " " + phiEilerVolumeCharge[i] + "\n");
            }
            writer.close();
        } catch (IOException exc) {
            exc.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }
    }
 
    private static double[] computeEilerSimple(int n) {
        double h = d / n;
        double[] e = new double[n];
        double[] phi = new double[n];
        double v = 2 * q * nd * phi0 * 10;
        e[0] = -Math.pow((v / (eps * eps0)), 0.5) * 10;
        phi[0] = -phi0;
 
        for (int i = 1; i < phi.length; i++) {
            double temp = h * (q * nd / (eps * eps0)) * 1000;
            e[i] = e[i - 1] + temp;
            phi[i] = phi[i - 1] - h * (e[i]);
        }
 
        try {
            OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream("KMP_eiler_simple.txt"));
            boolean flag = false;
            for (int i = 0; i < phi.length; i++) {
                writer.write(h * i + " " + phi[i] + "\n");
            }
            writer.close();
        } catch (IOException exc) {
            exc.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }
        return phi;
    }
 
    private static double[] computeRungeKuttSimple(int n) {
        double h = d / n;
        double[] e = new double[n + 1];
        double[] phi = new double[n];
        e[0] = -Math.pow(((2 * q * nd * phi0 * 10) / (eps * eps0)), 0.5) * 10;
        phi[0] = -phi0;
 
        // Если пересчитать формулу Рунге-Кутта для простого случая - получим тоже, что и в Эйлере
        for (int i = 1; i < e.length; i++) {
            double temp = h * (q * nd / (eps * eps0)) * 1000;
            e[i] = e[i - 1] + temp;
        }
 
        for (int i = 1; i < phi.length; i++) {
            double k0 = e[i];
            double k1 = (e[i] + e[i + 1]) / 2;
            double k2 = (e[i] + e[i + 1]) / 2;
            double k3 = (e[i + 1]);
 
            phi[i] = phi[i - 1] - (h * (k0 + 2 * k1 + 2 * k2 + k3)) / 6;
 
        }
 
        try {
            OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream("KMP_runge_kutt_simple.txt"));
            boolean flag = false;
            for (int i = 0; i < phi.length; i++) {
                writer.write(h * i + " " + phi[i] + "\n");
            }
            writer.close();
        } catch (IOException exc) {
            exc.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }
        return phi;
    }
 
    private static double[] computeEilerWithVolumeCharge(int n) {
        double[] phiStarted = computeEilerSimple(n);
        double h = d / n;
        double[] e = new double[n];
        double[] phi = new double[n];
        double v = 2 * q * nd * phi0 * 10;
        e[0] = -Math.pow((v / (eps * eps0)), 0.5) * 9.9;
        phi[0] = -phi0;
        for (int j = 0; j < 3; j++) {
            for (int i = 1; i < phi.length; i++) {
                double a = q * phiStarted[i - 1] / (k * T);
                double v1 = 1 - Math.exp(a);
                double temp = h * (q * nd * v1 / (eps * eps0)) * 1000;
                e[i] = e[i - 1] + temp;
                phi[i] = phi[i - 1] - h * (e[i]);
            }
            phiStarted = phi;
        }
        try {
            OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream("KMP_eiler_with_volume_charge.txt"));
            boolean flag = false;
            for (int i = 0; i < phi.length; i++) {
                writer.write(h * i + " " + phi[i] + "\n");
                if(phi[i] >=0){
                    System.out.println("Phi > 0, phi equals "+ phi[i]);
                }
            }
            writer.close();
        } catch (IOException exc) {
            exc.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }
        return phi;
    }
}


и я её хочу перевести на C++.. Вот что я напереводила..
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
#include <iostream>
#include <vector>
#include <fstream>
 
#define q 1.6;
#define eps0 8.85;
#define eps 13;
#define nd 1;
#define d 2;
#define phi0 0.8;
#define k 0.0000862
#define t 293;
 
template <class T> inline static std::vector<T> computeEilerSimple(T N); /** метод Эйлера */
template <class T> inline static std::vector<T> computeEilerWithVolumeCharge(T N); /** метод Эйлера с объемным зарядом */
template <class T> inline static std::vector<T> computeRungeKuttSimple(T N); /** метод Рунге-Кутта */
template <class T> inline static T pow(T base, unsigned n);
template <class T> inline static T exp(T base);
 
int main(int argc, char const **argv)
{
  int N;
  std::cout << "N -> ";
  std::cin >> N;
 
  computeEilerWithVolumeCharge(N) ;
  
  std::vector<float> phiEiler = computeEilerSimple(N);
  std::vector<float> phiEilerVolumeCharge = computeEilerWithVolumeCharge(N);
 
  std::ofstream outputFile("KMP compare.txt");
  std::ofstream outFile("Eiler simple.txt");
  if(!outFile.is_open())
    std::cout << "File open error:( Please, check that file's path is accessible" << std::endl;
  else
    for (int i = 0; i < phiEiler.length; i++)
      outputFile << h * i << " " << phiEiler.at(i) << " " << phiEilerVolumeCharge.at(i) + "\n");
  return 0;
}
 
template <class T>
inline std::vector<T> computeEilerSimple(T N)
{
  T h = d / N;
  T v = 2 * q * nd * phi0 * 10;
  
  std::vector<T> e(N);
  std::vector<T> phi(N);
 
  std::vector<T>::iterator it;
  
  e.at(0) = pow((v / (eps * eps0)), 0.5 * 10;
  phi.at(0) = -phi0;
 
  for (int i = 1; i < phi.size(); i++) 
  {
    T temp = h * (q * nd / (eps * eps0)) * 1000;
    e.at(i) = e.at(i - 1) + temp;
    phi.at(i) = phi.at(i - 1) - h * (e.at(i));
  }
 
  std::ofstream outFile("Eiler simple.txt");
  if(!outFile.is_open())
    std::cout << "File open error:( Please, check that file's path is accessible" << std::endl;
  else
  {
    for(int i = 0; i < phi.size(); i++)
      outFile << h * i << " -> " << phi.at(i) << "\n";
  }
  outFile.close();
 
  return phi;
}
 
template <class T>
inline std::vector<T> computeEilerWithVolumeCharge(T N)
{
  std::vector<T> phiStarted = computeEilerSimple(N);
  T h = d / n;
  std::vector<T> e(N);
  std::vector<T> phi(N);
  T v = 2 * q * nd * phi0 * 10;
  e.at(0) = pow((v / (eps * eps0)), 0.5) * 9.9;
  phi.at(0) = -phi0;
  
  for (int j = 0; j < 3; j++) 
  {
    for (int i = 1; i < phi.size(); i++) 
    {
      T v1 = 1 - exp(q * phiStarted.at(i - 1) / (k * T));
      T temp = h * (q * nd * v1 / (eps * eps0)) * 1000;
      e.at(i) = e.at(i - 1) + temp;
      phi.at(i) = phi.at(i - 1) - h * (e.at(i));
    }
    phiStarted = phi;
  }
 
  std::ofstream outFile("Eiler With Volume Charge.txt");
  if(!outFile.is_open())
    std::cout << "File open error:( Please, check that file's path is accessible" << std::endl;
  else
  {
    for (int i = 0; i < phi.size(); i++) 
    {
      outFile << h * i << " -> " << phi.at(i) << "\n";
      if(phi.at(i) >=0)
        std::cout << "Phi > 0, phi equals " + phi.at(i);
    }
  }
  outFile.close();  
    
  return phi;
}
 
template <class T>
inline std::vector<T> computeRungeKuttSimple(T N)
{
  T h = d / n;
  std::vector<T> e(N + 1);
  std::vector<T> phi(N);
  
  e.at(0) = -pow(((2 * q * nd * phi0 * 10) / (eps * eps0)), 0.5) * 10;
  phi.at(0) = -phi0;
 
  for (int i = 1; i < e.size(); i++) 
    e.at(i) = e.at(i - 1) + (h * (q * nd / (eps * eps0)) * 1000);
 
  for (int i = 1; i < phi.size(); i++) 
  {
    T k0 = e.at(i);
    T k1 = (e.at(i) + e.at(i + 1)) / 2.0;
    T k2 = (e.at(i) + e.at(i + 1)) / 2.0;
    T k3 = (e.at(i + 1)]);
 
    phi.at(i) = phi.at(i - 1) - (h * (k0 + 2.0 * k1 + 2.0 * k2 + k3)) / 6.0;
  }
 
  std::ofstream outFile("Eiler simple.txt");
  if(!outFile.is_open())
    std::cout << "File open error:( Please, check that file's path is accessible" << std::endl;
  else
  {
    for(int i = 0; i < phi.size(); i++)
      outFile << h * i << " -> " << phi.at(i) << "\n";
  }
  outFile.close();
  
  return phi;
}
 
template <class T>
inline static T pow(T base, unsigned n)
{    
  T result;
  for (result = 1; n != 0; result *= base, n--);
  return result;
}
 
template <class T> 
inline static T exp(T x)
{
  T s = 1, next = 1, n = 0;
  do
  {
    ++n;
    next = (next * x) / n;
    s += next;
  }
  while (next < 0.0000001);
  return s;
}


конечно понимаю, мой код ужасен и безобразен, но тем не менее вопрос: как заставить его работать? Как понимаю ошибка у меня в синтаксисе, т.к. компилятор ругается на такие штучки: такую < и такую >

Вот ругательства компилятора..
Кликните здесь для просмотра всего текста
Microsoft Windows [Version 6.1.7601]
(c) Корпорация Майкрософт (Microsoft Corp.), 2009. Все права защищены.

C:\Users\Ksu\Dropbox\Лабораторные работы\КМП>g++ Solution.cpp
Solution.cpp: В функции <int main(int, const char**)>:
Solution.cpp:28:53: ошибка: запрошено преобразование от <std::vector<int, std::allocator<int> >> к нескалярном
у типу <std::vector<float>>
Solution.cpp:29:75: ошибка: запрошено преобразование от <std::vector<int, std::allocator<int> >> к нескалярном
у типу <std::vector<float>>
Solution.cpp:36:34: ошибка: <class std::vector<float>> has no member named <length>
Solution.cpp:37:21: ошибка: нет декларации <h> в этой области видимости
Solution.cpp:37:91: ошибка: invalid operands of types <float> and <const char [2]> to binary <operator+>
Solution.cpp:37:95: ошибка: expected <;> before <)> token
Solution.cpp: В функции <std::vector<T> computeEilerSimple(T)>:
Solution.cpp:44:11: ошибка: expected primary-expression before </> token
Solution.cpp:45:17: ошибка: invalid type argument of unary <*> (have <int>)
Solution.cpp:45:22: ошибка: invalid type argument of unary <*> (have <double>)
Solution.cpp:45:29: ошибка: invalid type argument of unary <*> (have <int>)
Solution.cpp:50:3: ошибка: need <typename> before <std::vector<T>::iterator> because <std::vector<T>> is a dep
endent scope
Solution.cpp:50:28: ошибка: expected <;> before <it>
Solution.cpp:52:23: ошибка: expected <)> before <;> token
Solution.cpp:52:23: ошибка: expected <)> before <;> token
Solution.cpp:52:23: ошибка: expected <)> before <;> token
Solution.cpp:52:29: ошибка: invalid type argument of unary <*> (have <double>)
Solution.cpp:52:33: ошибка: expected primary-expression before <)> token
Solution.cpp:52:33: ошибка: expected <;> before <)> token
Solution.cpp:57:19: ошибка: expected <)> before <;> token
Solution.cpp:57:23: ошибка: invalid type argument of unary <*> (have <int>)
Solution.cpp:57:26: ошибка: expected primary-expression before </> token
Solution.cpp:57:29: ошибка: expected <)> before <;> token
Solution.cpp:57:35: ошибка: invalid type argument of unary <*> (have <double>)
Solution.cpp:57:39: ошибка: expected primary-expression before <)> token
Solution.cpp:57:39: ошибка: expected <;> before <)> token
Solution.cpp: В функции <std::vector<T> computeEilerWithVolumeCharge(T)>:
Solution.cpp:79:11: ошибка: expected primary-expression before </> token
Solution.cpp:79:13: ошибка: нет декларации <n> в этой области видимости
Solution.cpp:82:17: ошибка: invalid type argument of unary <*> (have <int>)
Solution.cpp:82:22: ошибка: invalid type argument of unary <*> (have <double>)
Solution.cpp:82:29: ошибка: invalid type argument of unary <*> (have <int>)
Solution.cpp:83:23: ошибка: expected <)> before <;> token
Solution.cpp:83:23: ошибка: expected <)> before <;> token
Solution.cpp:83:23: ошибка: expected <)> before <;> token
Solution.cpp:83:29: ошибка: invalid type argument of unary <*> (have <double>)
Solution.cpp:83:33: ошибка: expected primary-expression before <)> token
Solution.cpp:83:33: ошибка: expected <;> before <)> token
Solution.cpp:90:22: ошибка: expected <)> before <;> token
Solution.cpp:90:55: ошибка: expected primary-expression before <)> token
Solution.cpp:90:56: ошибка: expected <;> before <)> token
Solution.cpp:91:21: ошибка: expected <)> before <;> token
Solution.cpp:91:25: ошибка: invalid type argument of unary <*> (have <int>)
Solution.cpp:91:36: ошибка: expected <)> before <;> token
Solution.cpp:91:42: ошибка: invalid type argument of unary <*> (have <double>)
Solution.cpp:91:46: ошибка: expected primary-expression before <)> token
Solution.cpp:91:46: ошибка: expected <;> before <)> token
Solution.cpp: В функции <std::vector<T> computeRungeKuttSimple(T)>:
Solution.cpp:118:11: ошибка: expected primary-expression before </> token
Solution.cpp:118:13: ошибка: нет декларации <n> в этой области видимости
Solution.cpp:122:24: ошибка: expected <)> before <;> token
Solution.cpp:122:24: ошибка: expected <)> before <;> token
Solution.cpp:122:24: ошибка: expected <)> before <;> token
Solution.cpp:122:28: ошибка: invalid type argument of unary <*> (have <int>)
Solution.cpp:122:33: ошибка: invalid type argument of unary <*> (have <double>)
Solution.cpp:122:40: ошибка: invalid type argument of unary <*> (have <int>)
Solution.cpp:122:42: ошибка: expected <;> before <)> token
Solution.cpp:122:53: ошибка: invalid type argument of unary <*> (have <double>)
Solution.cpp:122:57: ошибка: expected primary-expression before <)> token
Solution.cpp:122:57: ошибка: expected <;> before <)> token
Solution.cpp:126:35: ошибка: expected <)> before <;> token
Solution.cpp:126:35: ошибка: expected <)> before <;> token
Solution.cpp:126:39: ошибка: invalid type argument of unary <*> (have <int>)
Solution.cpp:126:42: ошибка: expected primary-expression before </> token
Solution.cpp:126:45: ошибка: expected <)> before <;> token
Solution.cpp:126:51: ошибка: invalid type argument of unary <*> (have <double>)
Solution.cpp:126:55: ошибка: expected primary-expression before <)> token
Solution.cpp:126:55: ошибка: expected <;> before <)> token
Solution.cpp:133:24: ошибка: expected <)> before <]> token
Solution.cpp: В функции <std::vector<T> computeEilerWithVolumeCharge(T) [with T = int]>:
Solution.cpp:26:33: instantiated from here
Solution.cpp:90:24: ошибка: invalid type argument of unary <*> (have <int>)
Solution.cpp:91:28: ошибка: invalid type argument of unary <*> (have <int>)
Solution.cpp: В функции <std::vector<T> computeEilerSimple(T) [with T = int]>:
Solution.cpp:28:53: instantiated from here
Solution.cpp:50:3: ошибка: dependent-name <std::vector<T>::iterator> is parsed as a non-type, but instantiatio
n yields a type
Solution.cpp:50:3: замечание: задайте <typename std::vector<T>::iterator>, если подразумевается тип

C:\Users\Ksu\Dropbox\Лабораторные работы\КМП>


Очень надеюсь на вашу помощь...

P.S. Конечно выглядит ужасно, но я пыталась использовать шаблоны.. (это я так написала, чтобы было понятно, что вообще я пыталась сделать)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ssXXss
263 / 185 / 10
Регистрация: 15.01.2011
Сообщений: 668
19.04.2013, 01:56     Перевести из Java на C++ #2
возможно поможет вдумчивое чтение текста ошибок и построчный их разбор .

Добавлено через 19 минут
может стоит переносить не все сразу, а попробовать одну две func, набить руку и потом уже все остальное.
Мега Ксю
 Аватар для Мега Ксю
3 / 3 / 0
Регистрация: 02.03.2013
Сообщений: 56
19.04.2013, 03:46  [ТС]     Перевести из Java на C++ #3
ssXXss, если вам не сложно, то переведете одну функцию? дальше я уже сама по аналогии сделаю
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
template <class T> inline static std::vector<T> computeEilerSimple(T N);
 
int main(int argc, char const **argv)
{
}
 
template <class T>
inline std::vector<T> computeEilerSimple(T N)
{
  T h = d / N;
  T v = 2 * q * nd * phi0 * 10;
  
  std::vector<T> e(N);
  std::vector<T> phi(N);
 
  std::vector<T>::iterator it;
  
  e.at(0) = pow((v / (eps * eps0)), 0.5 * 10;
  phi.at(0) = -phi0;
 
  for (int i = 1; i < phi.size(); i++) 
  {
    T temp = h * (q * nd / (eps * eps0)) * 1000;
    e.at(i) = e.at(i - 1) + temp;
    phi.at(i) = phi.at(i - 1) - h * (e.at(i));
  }
 
  std::ofstream outFile("Eiler simple.txt");
  if(!outFile.is_open())
    std::cout << "File open error:( Please, check that file's path is accessible" << std::endl;
  else
  {
    for(int i = 0; i < phi.size(); i++)
      outFile << h * i << " -> " << phi.at(i) << "\n";
  }
  outFile.close();
 
  return phi;
}
просто я не знаю, как сделать, чтобы функция возвращала std::vector<T>... просто правильно синтаксически оформить надо..
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
19.04.2013, 07:38     Перевести из Java на C++ #4
C++
1
2
3
4
5
6
7
8
#define q 1.6;
#define eps0 8.85;
#define eps 13;
#define nd 1;
#define d 2;
#define phi0 0.8;
#define k 0.0000862
#define t 293;
Уберите точки с запятой.
Мега Ксю
 Аватар для Мега Ксю
3 / 3 / 0
Регистрация: 02.03.2013
Сообщений: 56
19.04.2013, 15:17  [ТС]     Перевести из Java на C++ #5
Ошибок поубавилось, но все равно самая страшная ошибка осталась...
запрошено преобразование от <std::vector<int, std::allocator<int> >> к нескалярному типу <std::vector<float>>
как её исправить?
Кликните здесь для просмотра всего текста
Microsoft Windows [Version 6.1.7601]
(c) Корпорация Майкрософт (Microsoft Corp.), 2009. Все права защищены.

C:\Users\Ksu\Dropbox\Лабораторные работы\КМП>g++ Solution.cpp
Solution.cpp: В функции <int main(int, const char**)>:
Solution.cpp:28:53: ошибка: запрошено преобразование от <std::vector<int, std::allocator<int> >> к нескалярном
у типу <std::vector<float>>
Solution.cpp:29:75: ошибка: запрошено преобразование от <std::vector<int, std::allocator<int> >> к нескалярном
у типу <std::vector<float>>
Solution.cpp:36:34: ошибка: <class std::vector<float>> has no member named <length>
Solution.cpp:37:21: ошибка: нет декларации <h> в этой области видимости
Solution.cpp:37:91: ошибка: invalid operands of types <float> and <const char [2]> to binary <operator+>
Solution.cpp:37:95: ошибка: expected <;> before <)> token
Solution.cpp: В функции <std::vector<T> computeEilerSimple(T)>:
Solution.cpp:50:3: ошибка: need <typename> before <std::vector<T>::iterator> because <std::vector<T>> is a dep
endent scope
Solution.cpp:50:28: ошибка: expected <;> before <it>
Solution.cpp:52:45: ошибка: expected <)> before <;> token
Solution.cpp: В функции <std::vector<T> computeEilerWithVolumeCharge(T)>:
Solution.cpp:79:13: ошибка: нет декларации <n> в этой области видимости
Solution.cpp:90:55: ошибка: expected primary-expression before <)> token
Solution.cpp: В функции <std::vector<T> computeRungeKuttSimple(T)>:
Solution.cpp:118:13: ошибка: нет декларации <n> в этой области видимости
Solution.cpp:133:24: ошибка: expected <)> before <]> token
Solution.cpp: В функции <std::vector<T> computeEilerSimple(T) [with T = int]>:
Solution.cpp:28:53: instantiated from here
Solution.cpp:50:3: ошибка: dependent-name <std::vector<T>::iterator> is parsed as a non-type, but instantiatio
n yields a type
Solution.cpp:50:3: замечание: задайте <typename std::vector<T>::iterator>, если подразумевается тип

C:\Users\Ksu\Dropbox\Лабораторные работы\КМП>
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
19.04.2013, 15:55     Перевести из Java на C++ #6
Мега Ксю, ну так все верно говорит, вы создаете вектор типа float и пытаетесь присвоить ему вектор типа int.
Тип переменной N - int, функции computeEilerSimple и computeEilerWithVolumeCharge инстанцируются соответственно как computeEilerSimple< int >() и computeEilerWithVolumeCharge< int >(), соответственно и векторы в них имеют тот же тип.
C++
1
2
std::vector<float> phiEiler = computeEilerSimple(N);  //здесь возвращается vector< int >
std::vector<float> phiEilerVolumeCharge = computeEilerWithVolumeCharge(N); // и здесь возвращается vector< int >
А зачем Вы используете шаблонные функции? Может Вам следует сначала попробовать без них?
stima
430 / 285 / 16
Регистрация: 22.03.2011
Сообщений: 928
Завершенные тесты: 1
19.04.2013, 16:28     Перевести из Java на C++ #7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <vector>
#include <iostream>
 
template <typename T>
std::vector<T> euler(T(*func)(const T&, const T&), const T& zero, const T& start, const T& end, const T& step)
  {
  std::vector<T> ret;
 
  ret.push_back(zero);
  for (T t = start; t < end; t += step)
    ret.push_back(ret.back() + step * func(t, ret.back()));
 
  return ret;
  }
 
template <typename T>
std::ostream& operator<< (std::ostream& out, const std::vector<T>& v)
  {
  if (v.empty())
    return out;
 
  auto last = --v.end();
  for (auto it = v.begin(); it != last; ++it)
    out << *it << " ";
  return out << *last;
  }
 
template <typename T>
T MyFunc(const T&, const T&)
  {
  return -1;
  }
 
 
int main()
  {
  std::vector<double> e = euler<double>(MyFunc, 100, 0, 100, 1);
  std::cout << e << std::endl;
 
  return 0;
  }
Остальное сами
Мега Ксю
 Аватар для Мега Ксю
3 / 3 / 0
Регистрация: 02.03.2013
Сообщений: 56
20.04.2013, 13:40  [ТС]     Перевести из Java на C++ #8
Цитата Сообщение от Toshkarik Посмотреть сообщение
ну так все верно говорит, вы создаете вектор типа float и пытаетесь присвоить ему вектор типа int.
обладая поверхностными знаниями в области программирования, я примерно понимаю, что это значит, но не понимаю как это исправить. Если вам не сложно, то исправьте ошибку в одной функции, а дальше я по аналогии все сама сделаю.. А насчет разных типов, то вроде шаблонные функции для этого и предназначены, чтобы написать один алгоритм, который можно использовать с разными типами, поэтому там и есть универсальный тип данных T.. Конечно это может показаться для вас смешным, но я именно так все это себе представляю
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
template <class T>
inline std::vector<T> computeEilerWithVolumeCharge(T N)
{
  std::vector<T> phiStarted = computeEilerSimple(N);
  T h = d / n;
  std::vector<T> e(N);
  std::vector<T> phi(N);
  T v = 2 * q * nd * phi0 * 10;
  e.at(0) = pow((v / (eps * eps0)), 0.5) * 9.9;
  phi.at(0) = -phi0;
  
  for (int j = 0; j < 3; j++) 
  {
    for (int i = 1; i < phi.size(); i++) 
    {
      T v1 = 1 - exp(q * phiStarted.at(i - 1) / (k * T));
      T temp = h * (q * nd * v1 / (eps * eps0)) * 1000;
      e.at(i) = e.at(i - 1) + temp;
      phi.at(i) = phi.at(i - 1) - h * (e.at(i));
    }
    phiStarted = phi;
  }
 
  std::ofstream outFile("Eiler With Volume Charge.txt");
  if(!outFile.is_open())
    std::cout << "File open error:( Please, check that file's path is accessible" << std::endl;
  else
  {
    for (int i = 0; i < phi.size(); i++) 
    {
      outFile << h * i << " -> " << phi.at(i) << "\n";
      if(phi.at(i) >=0)
        std::cout << "Phi > 0, phi equals " + phi.at(i);
    }
  }
  outFile.close();  
    
  return phi;
}
stima, спасибо вам большое, только у меня даже ваш код не компилируется (компилятор GCC 4.6.1).. у вас вроде он написан на C++11 (если так конечно можно выражаться) но все равно спасибо вам большое

P.S. У меня ошибка скорее всего тут
C++
1
2
template <class T>
inline std::vector<T> computeEilerWithVolumeCharge(T N)
но найти я её не могу
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
20.04.2013, 13:49     Перевести из Java на C++ #9
Цитата Сообщение от Мега Ксю Посмотреть сообщение
универсальный тип данных T
Но он никак не должен относится к типу размерности. А у Вас он напрямую зависит от него.
Замените везде тип параметра передаваемого в функцию на std::size_t или просто int. Пример:
C++
1
2
3
4
5
template <class T>
inline std::vector<T> computeEilerWithVolumeCharge( std::size_t N )
{
  ...
}
А функции вызывайте вот так с явным указанием специализации, примеры:
C++
1
std::vector<T> phiStarted = computeEilerSimple< T >( N );
в main():
C++
1
std::vector<float> phiEiler = computeEilerSimple< float >( N );
tzeentch
 Аватар для tzeentch
25 / 25 / 2
Регистрация: 13.04.2013
Сообщений: 79
20.04.2013, 13:51     Перевести из Java на C++ #10
Чуть-чуть подправил код stima, работает.

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <vector>
#include <iostream>
 
template <typename T>
  std::vector<T> euler(T(*func)(const T&, const T&), const T& zero, const T& start, const T& end, const T& step) {
    std::vector<T> ret;
 
    ret.push_back(zero);
    for (T t = start; t < end; t += step)
      ret.push_back(ret.back() + step * func(t, ret.back()));
 
    return ret;
  }
 
template <typename T>
  std::ostream& operator<< (std::ostream& out, const std::vector<T>& v) {
    if (v.empty())
      return out;
 
    for( int i = 0; i < v.size()-1; ++i )
      out << v[i] << " ";
    return out << v[v.size()-1];
  }
 
template <typename T>
  T MyFunc(const T&, const T&) {
    return -1;
  }
 
int main() {
  std::vector<double> e = euler<double>(MyFunc, 100, 0, 100, 1);
  std::cout << e << std::endl;
 
  return 0;
}
stima
430 / 285 / 16
Регистрация: 22.03.2011
Сообщений: 928
Завершенные тесты: 1
20.04.2013, 14:05     Перевести из Java на C++ #11
К сожалению Вы даже не посмотрели как мой код оформлен. А именно:
1. В нем вынесена исследуемая функция (MyFunc).
2. В нем "вынесена функция" печати.

В Вашем же случае (как и в коде на Java) намешано все. 3 раза подряд тот-же код функции и тот-же код записи в файл, что делает его абсолютно не читаемым.
Мега Ксю
 Аватар для Мега Ксю
3 / 3 / 0
Регистрация: 02.03.2013
Сообщений: 56
10.05.2013, 16:53  [ТС]     Перевести из Java на C++ #12
stima, извините, но я, к сожалению, не программистка..
Цитата Сообщение от stima Посмотреть сообщение
В нем вынесена исследуемая функция (MyFunc).
если вам не сложно, то можете подсказать, как с помощью, вами предложенного способа, решить такой уравнение:
http://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{mdv}{dt} = eE - \frac{mv}{\tau }
немного преобразовываем
http://www.cyberforum.ru/cgi-bin/latex.cgi?m\frac{dv}{dt} = eE - m\frac{v}{\tau }
и окончательно выглядит так
http://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{dv}{dt} = \frac{eE}{m} - \frac{v}{\tau }
это уравнение как то решается методом Эйлера, там оно рассматривается как функция двух переменных f(v, t)
остальные значения (e, E, m и тау) известны.
Начальные условия тоже (можно для примера взять v = v0 и t = t0)
мне только оформить функцию MyFunc в вашем коде, а дальше сама попробую и так уже стыдно, что люди свое время на меня тратят...
stima
430 / 285 / 16
Регистрация: 22.03.2011
Сообщений: 928
Завершенные тесты: 1
10.05.2013, 18:39     Перевести из Java на C++ #13
А я не математик

Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <vector>
#include <iostream>
#include <stdexcept>
 
template <typename T>
  std::vector<T> euler(T(*func)(const T&, const T&), const T& zero, const T& start, const T& end, const T& step) {
    std::vector<T> ret;
 
    ret.push_back(zero);
    for (T t = start; t < end; t += step)
      ret.push_back(ret.back() + step * func(t, ret.back()));
 
    return ret;
  }
 
template <typename T>
  std::ostream& operator<< (std::ostream& out, const std::vector<T>& v) {
    if (v.empty())
      return out;
 
    std::vector<T>::const_iterator cit = v.begin(), clast = --v.end();
    for ( ; cit != clast; ++cit)
      out << *cit << " ";
 
    return out << *clast;
  }
 
static
const double e       = 1.f,
             tau     = 1.f,
             weight  = 1.f,
             energy  = 1.f;
 
template <typename T>
  T func(const T& /*curr_time*/, const T& curr_value) {
    return (e * energy) / weight - curr_value / tau;
  }
 
int main() {
  std::vector<double> e = euler<double>(func, 1, 0, 100, 1);
  std::cout << e << std::endl;
 
  std::cin.get();
 
  return 0;
}
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
10.05.2013, 19:15     Перевести из Java на C++ #14
Часть с computeEulerSimple, может пригодится
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <iostream>
#include <fstream>
#include <iomanip>
#include <vector>
#include <cmath>
 
 
double const q      = 1.6;
double const eps0   = 8.85;
double const eps    = 13;
double const nd     = 1;
double const d      = 2;
double const phi0   = 0.8;
 
 
std::vector<double> compute_euler_simple(std::size_t n);
void write_euler_simple(std::ostream & ostream, std::vector<double> const& eulerSimple);
 
 
int main() {
   std::size_t n;
   std::cin >> n;
 
   std::vector<double> const eulerSimple = compute_euler_simple(n);
 
   std::ofstream ostream("KMP_eiler_simple.txt");
   write_euler_simple(ostream, eulerSimple);
}
 
 
std::vector<double> compute_euler_simple(std::size_t const n) {
   static double const epsilon = eps * eps0;
   static double const q_nd    = q * nd;
 
   double const h     = d / n;
   double const v     = 20 * q_nd * phi0;
   double const temp  = 1000 * h * h * (q_nd / epsilon);
 
   double e = -10 * h * std::sqrt(v / epsilon) + temp;
   
   std::vector<double> phi(n);
 
   phi[0]  = -phi0;
   for (std::size_t i = 1; i < phi.size(); ++i, e += temp) {
      phi[i] = phi[i - 1] - e;
   }
 
   return phi;
}
 
void write_euler_simple(std::ostream & ostream, std::vector<double> const& eulerSimple) {
   double const h = d / eulerSimple.size();
 
   for (std::size_t i = 0; i != eulerSimple.size(); ++i) {
      ostream << std::setw(6) << std::left
        << (h * i) << " " << eulerSimple[i] << std::endl;
   }
}
Мега Ксю
 Аватар для Мега Ксю
3 / 3 / 0
Регистрация: 02.03.2013
Сообщений: 56
11.05.2013, 02:03  [ТС]     Перевести из Java на C++ #15
спасибки за помощь stima и gray_fox и за то, что нашли время для ответа на мои довольно банальные вопросы буду разбираться в коде..

P.S. Похоже я ещё успею замучить вас своими глупыми вопросами..
Мега Ксю
 Аватар для Мега Ксю
3 / 3 / 0
Регистрация: 02.03.2013
Сообщений: 56
24.06.2013, 22:13  [ТС]     Перевести из Java на C++ #16
@stima, что то я ваш код не могу запустить.. он пишет такие ошибки..
все выходные мучалась, ничего толком придумать не смогла..

вот код
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <vector>
#include <iostream>
#include <stdexcept>
 
template <typename T>
  std::vector<T> euler(T(*func)(const T&, const T&), const T& zero, const T& start, const T& end, const T& step) {
    std::vector<T> ret;
 
    ret.push_back(zero);
    for (T t = start; t < end; t += step)
      ret.push_back(ret.back() + step * func(t, ret.back()));
 
    return ret;
  }
 
template <typename T>
  std::ostream& operator<< (std::ostream& out, const std::vector<T>& v) {
    if (v.empty())
      return out;
 
    std::vector<T>::const_iterator cit = v.begin(), clast = --v.end();
    for ( ; cit != clast; ++cit)
      out << *cit << " ";
 
    return out << *clast;
  }
 
static
const double e       = 1.f,
             tau     = 1.f,
             weight  = 1.f,
             energy  = 1.f;
 
template <typename T>
  T func(const T& /*curr_time*/, const T& curr_value) {
    return (e * energy) / weight - curr_value / tau;
  }
 
int main() {
  std::vector<double> e = euler<double>(func, 1, 0, 100, 1);
  std::cout << e << std::endl;
 
  std::cin.get();
 
  return 0;
}


вот ошибки...
Кликните здесь для просмотра всего текста
e.cpp: В функции «std::ostream& operator<<(std::ostream&, const std::vector<T>&)»:
e.cpp:21:5: ошибка: need «typename» before «std::vector<T>::const_iterator» because «std::vector<T>» is a dependent scope
e.cpp:21:36: ошибка: expected «;» before «cit»
e.cpp:22:13: ошибка: нет декларации «cit» в этой области видимости
e.cpp:22:20: ошибка: нет декларации «clast» в этой области видимости
e.cpp:25:20: ошибка: нет декларации «clast» в этой области видимости
e.cpp: In instantiation of «std::ostream& operator<<(std::ostream&, const std::vector<T>&) [with T = double; std::ostream = std::basic_ostream<char>]»:
e.cpp:41:16: required from here
e.cpp:21:5: ошибка: dependent-name «std::vector<T>::const_iterator» is parsed as a non-type, but instantiation yields a type
e.cpp:21:5: замечание: задайте «typename std::vector<T>::const_iterator», если подразумевается тип


которые не исправляются..

P.S. использовала компилятор g++
Вложения
Тип файла: zip e.cpp.zip (556 байт, 2 просмотров)
tzeentch
 Аватар для tzeentch
25 / 25 / 2
Регистрация: 13.04.2013
Сообщений: 79
24.06.2013, 22:19     Перевести из Java на C++ #17
@Мега Ксю, я добавил перед std::vector<T>::const_iterator команду typename: работает то есть:
C++
1
    typename std::vector<T>::const_iterator cit = v.begin(), clast = --v.end();
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.06.2013, 22:02     Перевести из Java на C++
Еще ссылки по теме:

Перевести код из Java в C++ C++
C++ Перевести код с Java на C++
Как перевести с Java на C++? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Мега Ксю
 Аватар для Мега Ксю
3 / 3 / 0
Регистрация: 02.03.2013
Сообщений: 56
25.06.2013, 22:02  [ТС]     Перевести из Java на C++ #18
Ребят, помогите пожалуйста.. не получается ничего..
Есть уравнение
http://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{d{v}_{d}}{dt} = \frac{eE}{m} - \frac{{v}_{d}}{\tau }

его надо как то решить методом Эйлера..

я делаю так.

1. Задаю время, допустим 10 секунд (time = 10)
2. Задаю шаг (step = 0.0001)
3. Нахожу количество точек N (N = time/step);
4. Задаю начальное условие vd = 0;

далее в цикле от 0 до N вычисляю значение vd
C++
1
vd = vd + step * ((e * E) / m - vd / tau);
и вывожу всё в файл.

для времени 10 сек и шаге 0,0001 получается такой выходной файл
Код
i * step	  Vd
0			      7.32601e+13
0.0001			-2.442e+22
0.0002			8.14001e+30
0.0003			-2.71334e+39
0.0004			9.04445e+47
0.0005			-3.01482e+56
0.0006			1.00494e+65
0.0007			-3.3498e+73
0.0008			1.1166e+82
0.0009			-3.722e+90
0.001			  1.24067e+99
0.0011			-4.13555e+107
0.0012			1.37852e+116
0.0013			-4.59506e+124
0.0014			1.53169e+133
0.0015			-5.10562e+141
0.0016			1.70187e+150
0.0017			-5.67291e+158
0.0018			1.89097e+167
0.0019			-6.30323e+175
0.002			  2.10108e+184
0.0021			-7.00359e+192
0.0022			2.33453e+201
0.0023			-7.78177e+209
0.0024			2.59392e+218
0.0025			-8.64641e+226
0.0026			2.88214e+235
0.0027			-9.60712e+243
0.0028			3.20237e+252
0.0029			-1.06746e+261
0.003			3.55819e+269
0.0031			-1.18606e+278
0.0032			3.95355e+286
0.0033			-1.31785e+295
0.0034			4.39283e+303
0.0035			-inf
0.0036			-nan
0.0037			-nan
0.0038			-nan
и далее всё также идет -nan
вот мой код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <iostream>
#include <vector>
#include <fstream>
 
static const double e = 1.6E-19;
static const double m = 1.092E-31;
static const double E = 500000;
static const double tau = 3E-13;
 
int main(int argc, char *argv[])
{
  double time;
  double step;
  double vd = 0;
  int k = 0, count = 1000;
 
  std::cout << "TIME -> ";
  std::cin >> time;
 
  std::cout << "STEP -> ";
  std::cin >> step;
 
  int N = time/step;
  
  std::ofstream file("data.txt");
  if (file.is_open())
  {
    file << "Кинетика. Задача 1\ntime = " << time << "\tstep = " << step << "\tN = " << N << "\n\ni * step\tVd\n";
    for (int i = 0; i < N; i++, k++)
    {
      vd = vd + step * ((e * E) / m - vd / tau);
      if (k = count)
      {
        file << i * step << "\t\t\t" << vd << "\n";
        k = 0;
      }
    }
  }
 
  file.close();
  
  return 0;
}
где могла быть ошибка, что получаются такое огромные числа? типа 4.39283e+303 и т.д.
Yandex
Объявления
25.06.2013, 22:02     Перевести из Java на C++
Ответ Создать тему
Опции темы

Текущее время: 16:44. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru