Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/64: Рейтинг темы: голосов - 64, средняя оценка - 4.78
1 / 1 / 0
Регистрация: 15.02.2020
Сообщений: 23

Переписать программу с Python на C++

15.02.2020, 19:21. Показов 13592. Ответов 15

Студворк — интернет-сервис помощи студентам
Доброго времени суток, уважаемые форумчане, необходима помощь в переводе программы с языка Python на C++. Исходный код решает следующую задачу:
1. Открыть бинарный файл.
2. Выделить из потока нулевой и первый канал, сформировать и сохранить на диск один файл формата csv. Примечание: каждый байт представляет собой 1 отсчёт восьми каналов данных с параллельной шины, таким образом нулевому каналу соответствует нулевой бит, первому каналу - первый бит и тд.. В csv-файле 3 колонки : нулевой канал, первый канал, нулевой канал логически умноженный на первый канал; одна строчка = один отсчёт.
3. Декодировать информационный поток , т.е. выполнить дискретизацию сигнала относительно середины интервала между синхроимпульсами.
Результат работы - csv файл с одной колонкой, с отсчётами декодированного потока (т.е. значение 0 или 1 ), одна строчка = один отсчёт.
Примечание: нулевой и первый канал представляют собой информационный поток кода нулей и единиц (активный уровень нулевого канала = 0, активный уровень первого канала = 1), в обоих каналах присутствуют синхроимпульсы, предназначенные для определения точки сэмплирования.
4. Выделить из декодированного информационного потока кадры ТЕЛЕМЕТРИЧЕСКОЙ ИНФОРМАЦИИ, каждый из которых начинается с синхромаркера. В качестве синхромаркера используется 32-х разрядная последовательность: 0001 1010 1100 1111 1111 1100 0001 1101
4.1. Определить размер кадра телеметрической информации
4.2. Сформировать пакеты ТМИ из полученных бит (от старшего к младшему) включая синхромаркер.
4.3. Записать полученные пакеты в бинарный файл out.bin

Вот код на Python, который решает эту задачу:
Python
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
import struct
def findsync(fileobj,updown=1,stepsize=1):
    while 1:
        byte = fileobj.read(stepsize) 
        if not byte:
            return None
        comb = (byte[0]&1)&((byte[0]>>1)&1)
        if (comb==updown):
             return fileobj.tell()
def sample(fileobj,synclen,bsynclen):
    syncpos = findsync(fileobj,updown=1,stepsize=synclen//4)
    if syncpos==None:
        return syncpos
    f.seek(synclen+bsynclen//2,1)
    byte = fileobj.read(1)
    if not byte:
        return None
    f.seek(synclen+bsynclen//4,1)
    return 0 if  (byte[0]&1==1) else 1
 
f = open("udk_dump.bin", 'rb')
ss,se =findsync(f,1),findsync(f,0)
synclen = se-ss
ss = findsync(f,1)
bsynclen = ss-se
sync =0b00011010110011111111110000011101
samples= 0
while (True):
    s =sample(f,synclen,bsynclen)
    if (s==None):
        break
    samples|=s
    if samples==sync:
            break
    samples = (samples<<1)&0xffffffff
out = open("out.bin","wb")
out.write(struct.pack(">I",samples))
 
counter=0
byte=0
while (True):
    s =sample(f,synclen,bsynclen)
    if (s==None):
        break
    byte|=s
    counter+=1
    if (counter==8):
        counter = 0
        out.write(struct.pack("B",byte))
        byte=0
    byte=byte<<1
out.close()
Вот код на 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
#include<iostream>
#include<fstream>
using std::cout;
using std::endl;
using std::ifstream;
using std::ofstream;
 
int findSync(ifstream& fin, int upDown = 1, int stepSize = 1)
{
    cout << "start findSync\n";
    char *byte = new char;
 
    while(!fin.eof())
    {
        fin.read(byte, stepSize);
        int comb = ((*byte & (1 << 0) >> 0) & 1) & ((*byte & (1 << 1) >> 1) & 1);
        if(comb == upDown)
            return fin.tellg();
    }
 
    delete byte;
    cout << "finish findSync\n";
}
 
int sample(ifstream& fin, int syncLen, int bSyncLen)
{
    cout << "start sample\n";
    int syncPos = findSync(fin, 1, (syncLen / 4));
    
    if (syncPos == 0)
        return syncPos;
 
    fin.seekg((syncLen + bSyncLen)/2, std::ios::cur);
    char *byte = new char;
    fin.read(byte, 1);
    fin.seekg((syncLen + bSyncLen)/4, std::ios::cur);
    
    if(((*byte & (1 << 0) >> 0) & 1) == 1)
    {
        delete byte;
        return 0;
    }
    else
    {
        delete byte;
        return 1;
    }
 
    delete byte;
    cout << "finish sample\n";
}
 
int main()
{
    ifstream fin("udk_dump.bin", std::ios::binary);
    
    if(fin.fail())
    {
        cout << "Error! Can't get access to the file\n";
        exit(1);
    }
    cout << "start of program\n";
    int ss = findSync(fin, 1), se = findSync(fin, 0);
    int syncLen = ss - se;
    ss = findSync(fin, 1);
    int bSyncLen = ss - se;
    int sync = 0b00011010110011111111110000011101;
    int samples = 0;
    int s;
    while(!fin.eof())
    {
        s = sample(fin, syncLen, bSyncLen);
        if(s == 0)
            break;
        samples |= s;
        if(samples == sync)
            break;
        samples = (samples << 1) & 0xffffffff;
    }
 
    ofstream fout("out.bin", std::ios::binary);
    if(fout.fail())
    {
        cout << "Error! Can't get access to the file\n";
        exit(1);
    }
    fout << samples;
 
    int counter = 0;
    char byte = 0;
    fin.seekg(0, std::ios::beg);
    while(!fin.eof())
    {
        s = sample(fin, syncLen, bSyncLen);
        if(s == 0)
            break;
        byte |= s;
        counter++;
        if(counter == 8)
        {
            counter = 0;
            fout << byte;
            byte = 0;
        }
        byte = byte << 1;
    }
    fout.close();
    fin.close();
    
    cout << "finish of program\n";
    return 0;
}
Прошу помочь правильно переписать код с python на плюсы. Благодарю за оказанное внимание и помощь.

Добавлено через 4 часа 28 минут
Переработал код на С++, теперь он выполняется и выводит данные в файл, но выводит только единственный ноль
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
#include<iostream>
#include<fstream>
using std::cout;
using std::endl;
using std::ifstream;
using std::ofstream;
 
int findSync(ifstream& fileObj, int upDown = 1, int stepSize = 1)
{
    char *byte = new char;
    while(true)
    {
        fileObj.read(byte, stepSize);
        if(not byte)
            return 0;
        int comb = (byte[0]&1)&((byte[0]>>1)&1);
        if(comb == upDown)
            return fileObj.tellg();
    }
}
 
int sample(ifstream& fileObj, int syncLen, int bSyncLen)
{
    int syncPos = findSync(fileObj, 1, syncLen/4);
    if(syncPos == 0)
        return syncPos;
    ifstream f;
    f.seekg(syncLen + bSyncLen/2, std::ios::cur);
    char *byte = new char;
    fileObj.read(byte, 1);
    if(not byte)
        return 0;
    f.seekg(syncLen+bSyncLen/4, std::ios::cur);
    if((byte[0] & 1) == 1)
        return 0;
    else
        return 1;
}
 
int main()
{
    ifstream f("udk_dump.bin", std::ios::binary);
    int ss = findSync(f, 1), se = findSync(f, 0);
    int syncLen = se - ss;
    ss = findSync(f, 1);
    int bSyncLen = ss - se;
    int sync = 0b00011010110011111111110000011101;
    int samples = 0;
    while(true)
    {
        int s = sample(f, syncLen, bSyncLen);
        if (s == 0)
            break;
        samples |= s;
        if(samples == sync)
            break;
        samples = ((samples << 1) & 0xffffffff);
    }
 
    ofstream out("out.bin", std::ios::binary);
    out << samples;
 
    int counter = 0;
    int byte = 0;
    while(true)
    {
        int s = sample(f, syncLen, bSyncLen);
        if (s == 0)
            break;
        byte |= s;
        counter += 1;
        if(counter == 8)
        {
            counter = 0;
            out << byte;
            byte = 0;
        }
        byte = byte<<1;
    }
    out.close();
}
Все еще нужна помощь, в корректировке кода.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.02.2020, 19:21
Ответы с готовыми решениями:

Переписать программу с python на C++
вот программа : https://pastebin.com/aHyHLYt5 total_disponibil = 123.00 debug = True def simulare(nume_produs): produs =...

Переписать программу из Pascal на Python
Дана действительная квадратная матрица порядка n, все элементы которой различны. Найти наибольший элемент среди стоящих на главной и...

Переписать программу с Pascal на Python ^-^
Привет всем))) помогите, пожалуйста, написать ту же самую программу на Python, пожалуйста, Pascal я не знаю, вот и проблемы выходят))) ...

15
 Аватар для Recrut_rf
388 / 334 / 65
Регистрация: 14.10.2014
Сообщений: 1,463
15.02.2020, 21:10
Цитата Сообщение от DrFaust1729 Посмотреть сообщение
if(not byte)
а что это за инструкция такая? из последнего (С++17) стандарта что ли?

Добавлено через 9 минут
если прога:
Цитата Сообщение от DrFaust1729 Посмотреть сообщение
выводит только единственный ноль
в файл, судя по всему, значит косяк в строках с 49 по 58 - надо следить, что приходит в samples. Ведь он отправляется в файл.

Добавлено через 4 минуты
А, стоп - что вообще прога должна делать?

Цитата Сообщение от DrFaust1729 Посмотреть сообщение
4.2. Сформировать пакеты ТМИ из полученных бит (от старшего к младшему) включая синхромаркер.
4.3. Записать полученные пакеты в бинарный файл out.bin
А не надо ли записывать данные в файл в самом цикле while? - ну то есть в начале цикла обнуляем переменную. Далее она получает значение, которое потом отправляем в файл.
1
1 / 1 / 0
Регистрация: 15.02.2020
Сообщений: 23
15.02.2020, 22:10  [ТС]
Цитата Сообщение от Recrut_rf Посмотреть сообщение
а что это за инструкция такая? из последнего (С++17) стандарта что ли?
Все прозаичнее, это конструкция является убогой версией такой же конструкции в python
Цитата Сообщение от Recrut_rf Посмотреть сообщение
А не надо ли записывать данные в файл в самом цикле while? - ну то есть в начале цикла обнуляем переменную. Далее она получает значение, которое потом отправляем в файл.
Код на python работает верно и там это происходит вне цикла, поэтому и на плюсах написано также, не исключено, что на плюсах должно быть иначе.
0
 Аватар для Recrut_rf
388 / 334 / 65
Регистрация: 14.10.2014
Сообщений: 1,463
15.02.2020, 22:29
Цитата Сообщение от DrFaust1729 Посмотреть сообщение
Код на python работает верно и там это происходит вне цикла
С питоном не знаком и как он работает я не знаю. Здесь же ноль записывается в файл (вместо конструкции not byte - использовал просто byte) потому как функция sample (51 строка) возвращает 0, условие 52 строки выполняется и мы попадаем в инструкцию break - и выходим из цикла. Ну а дальше samples, содержащий в себе 0, отправляется в файл.
Значит - или ошибка в функции samples, или неверно составлен код (неверно в данном случае означает - не соответствует алгоритму)
1
1 / 1 / 0
Регистрация: 15.02.2020
Сообщений: 23
15.02.2020, 22:46  [ТС]
Цитата Сообщение от Recrut_rf Посмотреть сообщение
С питоном не знаком и как он работает я не знаю
Такая же проблема.
Цитата Сообщение от Recrut_rf Посмотреть сообщение
Здесь же ноль записывается в файл (вместо конструкции not byte - использовал просто byte) потому как функция sample (51 строка) возвращает 0, условие 52 строки выполняется и мы попадаем в инструкцию break - и выходим из цикла. Ну а дальше samples, содержащий в себе 0, отправляется в файл.
Я перепробовал
C++
1
not byte
,
C++
1
byte
,
C++
1
byte == 0
,
C++
1
byte == nullptr
- результат один
0
 Аватар для Recrut_rf
388 / 334 / 65
Регистрация: 14.10.2014
Сообщений: 1,463
15.02.2020, 22:56
Кажись один косяк обнаружил - по крайней мере у меня он точно есть - в функции main() в первой строке, создается файловый поток (объект ifstream f("udk_dump.bin", std::ios::binary)) Но у меня то, точно такого файла нет, а значит и объект нулевой. Далее из него по коду вы пытаетесь из этого файла что-то считать. А раз у меня его нет, значит все функции вернут 0. У вас (если есть этот файл) результат может быть другой - нужно проверять, читаются ли данные из файла или нет.
1
1 / 1 / 0
Регистрация: 15.02.2020
Сообщений: 23
15.02.2020, 23:02  [ТС]
После открытия файла вставил код
C++
1
2
3
4
5
If(f.fail())
{
cout << "Error! Can't get access to the file\n";
exit(1);
}
Ошибку программа не выдает
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
15.02.2020, 23:02
Цитата Сообщение от DrFaust1729 Посмотреть сообщение
Все прозаичнее, это конструкция является убогой версией такой же конструкции в python
Цитата Сообщение от DrFaust1729 Посмотреть сообщение
Цитата Сообщение от Recrut_rf Посмотреть сообщение
С питоном не знаком и как он работает я не знаю.
Такая же проблема.

Цитата Сообщение от Recrut_rf Посмотреть сообщение
а что это за инструкция такая? из последнего (С++17) стандарта что ли?
Всегда было, как альтернативное представление "!".
0
1 / 1 / 0
Регистрация: 15.02.2020
Сообщений: 23
15.02.2020, 23:05  [ТС]
То, что отрицание обозначается как
C++
1
!
- ясно, вопрос в том, уместна ли конструкция
C++
1
not byte
в данном контексте
0
 Аватар для Recrut_rf
388 / 334 / 65
Регистрация: 14.10.2014
Сообщений: 1,463
15.02.2020, 23:14
Лучший ответ Сообщение было отмечено DrFaust1729 как решение

Решение

Цитата Сообщение от avgoor Посмотреть сообщение
Всегда было, как альтернативное представление "!".
да это то мне известно, но я чёт сглючил - мой косяк , но я не уверен в том, что здесь подразумевается именно отрицание
я вообще не совсем понимаю, как работает алгоритм.

DrFaust1729,
для проверки файла я использую:
C++
1
2
3
    ifstream f("udk_dump.bin", std::ios::binary);
    if (!f)
        cout << "not file\n";
а так как у меня файла udk_dump.bin точно нет, то и программа отработает по-другому. Даже если я сам создам этот файл

Добавлено через 3 минуты
DrFaust1729, мой вердикт - если у вас есть файл udk_dump.bin, запускайте прогу в отладке и смотрите, что из него читается и что с этим происходит далее. Других вариантов у меня нет.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
15.02.2020, 23:16
Цитата Сообщение от DrFaust1729 Посмотреть сообщение
То, что отрицание обозначается как
Альтернативное представление "!" как not зарезервировано в стандарте минимум с 2003 (просто более древнего у меня нет, а так это тянется с самого начала).
Фэйспалм-то был на тему сравнения конструкций в питоне и крестах с выводом об ущербности оной в крестах. Я тоже питон не знаю (ну как не знаю, код как в первом сообщении я напишу. Нюансов не знаю), но уж логическое отрицание в обоих языках сравнить могу.
0
 Аватар для Recrut_rf
388 / 334 / 65
Регистрация: 14.10.2014
Сообщений: 1,463
15.02.2020, 23:22
Цитата Сообщение от avgoor Посмотреть сообщение
но уж логическое отрицание в обоих языках сравнить могу
проблема то только в том, а нужно ли оно там? Может этот байт на что то другое проверять нужно...

А вообще, я спрашивал про данную конструкцию, потому что ТС написал:
Цитата Сообщение от DrFaust1729 Посмотреть сообщение
теперь он выполняется и выводит данные в файл
То есть у него код, судя по этому тексту, отрабатывал. А меня студия на это место естественно заругалась. Ну я и подумал, студия у меня 15 Коммьюнити, а сейчас уже вроде как 17 стандарт плюсов вышел, может чего нового и добавили.
1
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
15.02.2020, 23:30
Лучший ответ Сообщение было отмечено DrFaust1729 как решение

Решение

Цитата Сообщение от Recrut_rf Посмотреть сообщение
Может этот байт на что то другое проверять нужно...
На первый взгляд - да. В питоне bool от пустой строки вернет False. В С++ надо как-то по другому ввод из файла обрабатывать.
1
1 / 1 / 0
Регистрация: 15.02.2020
Сообщений: 23
15.02.2020, 23:34  [ТС]
Цитата Сообщение от Recrut_rf Посмотреть сообщение
DrFaust1729, мой вердикт - если у вас есть файл udk_dump.bin, запускайте прогу в отладке и смотрите, что из него читается и что с этим происходит далее. Других вариантов у меня нет
Ок, спасибо, попробую.
0
 Аватар для Recrut_rf
388 / 334 / 65
Регистрация: 14.10.2014
Сообщений: 1,463
15.02.2020, 23:42
Лучший ответ Сообщение было отмечено DrFaust1729 как решение

Решение

Судя по заданию (если я его правильно понял), нужно вытащить данные из одного файла и, предварительно обработав по протоколу, записать в другой. Без понимания работы протокола (ну или алгоритма) и без нужного файла сложно ТСу чем то помочь.

Не по теме:


как то я попробовал перенести код C# на С++, в формате 1 к 1, то есть код С# переписал в синтаксисе С++. Замучился искать косяки потом. В общем, без полного понимания, что происходит в коде, так лучше не делать

1
1 / 1 / 0
Регистрация: 15.02.2020
Сообщений: 23
16.02.2020, 00:11  [ТС]
Спасибо за уделенное внимание
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.02.2020, 00:11
Помогаю со студенческими работами здесь

Можете переписать программу is Basic в Python?
10 PRINT 'РЕШЕНИЕ СИСТЕМ ЛИНЕЙНЫХ УРАВНЕНИЙ МЕТОДОМ’ 20 PRINT ‘ГАУССА С ВЫБОРОМ ГЛАВНОГО ЭЛЕМЕНТА’ 30 INPUT ‘ЗАДАЙТЕ ЧИСЛО УРАВНЕНИЙ N...

Переписать с Python в JavaScript
Ребятки, не знаю Piton, помогите переписать в JavaScript!!! def f(x): import math return 10*math.e**(math.log(0.5)/5.27 * x) ...

Переписать код из Python в С
str = raw_input() def rec(i, depth): if i &lt; len(str): c = str cnt = 0 if c == '(' or c == '?': cnt +=...

Переписать код c Python
Уважаемые программисты Python. Мне требуется переписать код программы с python на другой язык программирования. С этим языком (Python) я...

Переписать функцию с Python на С++
Имеется такая функция, написанная на Питоне. Нужно ее переделать на C++. def bingo(data): # Первый проход. max = len(data) -...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru