Evanz159 Ответов: 2

Может ли кто-нибудь помочь мне преобразовать это, что находится в Python на языке C++, или порекомендовать мне программу, которая может это сделать? Есть 2 программы ..


import sys
from lib_readPL4 import readPL4
from lib_readPL4 import convertType
from lib_readPL4 import getVarData
import numpy as np

def main(args):
	
	# Call the library
	dfHEAD,data,miscData = readPL4(sys.argv[1])

	# Give some information to the user
	print ("PL4 Header info:")
	print (miscData)
	
	print ("Data shape:")
	print (np.shape(data))
	
	# Convert the header type
	convertType(dfHEAD)
	
	# EXAMPLES
	###############################################################
	# Get time
	time = data[:,0]
	
	# Get some variable, remember ATP's variable has a maximum of 6 characters
	# Check for var types in github wiki
	# ~ sel_data = getVarData(dfHEAD,data,'TYPE','FROM','TO')
	
	# Launch ipython session
	import IPython as ipy
	ipy.embed()
	
	return 0

if __name__ == '__main__':
	import sys
	sys.exit(main(sys.argv))

**************************************************************************************
//////////////////////////////////////////////////////////////////////////////////////
def readPL4(pl4file):

	import mmap
	import struct
	import pandas as pd
	import numpy as np

	miscData = {
		'deltat':0.0,
		'nvar':0,
		'pl4size':0,
		'steps':0,
		'tmax':0.0
	}

	# open binary file for reading
	with open(pl4file, 'rb') as f:
		pl4 = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ)

		# read DELTAT
		miscData['deltat'] = struct.unpack('<f', pl4[40:44])[0]
	
		# read number of vars
		miscData['nvar'] = struct.unpack('<L', pl4[48:52])[0] / 2
		
		# read PL4 disk size
		miscData['pl4size'] = struct.unpack('<L', pl4[56:60])[0]-1
		
		# compute the number of simulation miscData['steps'] from the PL4's file size
		miscData['steps'] = (miscData['pl4size'] - 5*16 - miscData['nvar']*16) / ((miscData['nvar']+1)*4)
		miscData['tmax'] = (miscData['steps']-1)*miscData['deltat']
		
		# generate pandas dataframe	to store the PL4's header
		dfHEAD = pd.DataFrame()
		dfHEAD['TYPE'] = ''
		dfHEAD['FROM'] = ''
		dfHEAD['TO'] = ''

		for i in xrange(0,miscData['nvar']):
			pos = 5*16 + i*16
			h = struct.unpack('3x1c6s6s',pl4[pos:pos+16])
			dfHEAD = dfHEAD.append({'TYPE': int(h[0]),\
			                        'FROM': h[1],\
			                        'TO': h[2]}, ignore_index=True)
		
		# Check for unexpected rows of zeroes
		# See https://github.com/ldemattos/readPL4/issues/2
		expsize = (5 + miscData['nvar'])*16 + miscData['steps']*(miscData['nvar']+1)*4
		nullbytes = 0
		if miscData['pl4size'] > expsize: 
			nullbytes = miscData['pl4size']-expsize
		
		# read and store actual data, map it to a numpy read only array
		data = np.memmap(f,dtype=np.float32,mode='r',shape=(miscData['steps'],miscData['nvar']+1),offset=(5 + miscData['nvar'])*16 + nullbytes)
			
		return dfHEAD,data,miscData
		
# Convert types from integers to strings
def convertType(df):	
	df['TYPE'] = df['TYPE'].apply(lambda x: 'V-node' if x == 4 else x)
	df['TYPE'] = df['TYPE'].apply(lambda x: 'E-bran' if x == 7 else x)
	df['TYPE'] = df['TYPE'].apply(lambda x: 'V-bran' if x == 8 else x)
	df['TYPE'] = df['TYPE'].apply(lambda x: 'I-bran' if x == 9 else x)
	
	return 0
	
# Get desired variable data
def getVarData(dfHEAD,data,Type,From,To):
	
	# Search for desired data in header
	df = dfHEAD[(dfHEAD['TYPE'] == Type) & (dfHEAD['FROM'] == From) & (dfHEAD['TO'] == To)]
				
	if not df.empty:
		data_sel = data[:,df.index.values[0]+1] # One column shift given time vector
		
	else:
		print ("Variable %s-%s of %s not found!"%(From,To,Type))
		return(None)

	return(data_sel)


Что я уже пробовал:

Растрата фитона-это хороший вариант?

Dave Kreskowiak

Дайте определение слову "помощь". Потому что прямо сейчас это выглядит так, как будто вы хотите, чтобы кто-то преобразовал код eh для вас.

Нет никаких инструментов для преобразования между Python и C++.

ZurdoDev

Вы захотите сделать это сами.

Evanz159

не могли бы вы, пожалуйста, изменить его на c++, и вы очень добры, если вы также дадите мне несколько советов о том, как это сделать .. спасибо

ZurdoDev

Нет. Потому что нет прямого обращения. Например, ваш код использует печать. Это показывает данные пользователю. Есть миллион различных способов сделать это.

Просто перепиши его и будь готов.

2 Ответов

Рейтинг:
1

Afzaal Ahmad Zeeshan

Прежде всего, программы не просто переводятся на другой язык. За этим стоит целая куча математики.

Во-вторых, даже если вы преобразуете этот скрипт Python в программу на C++, как вы преобразуете пакеты Python в библиотеки C++? Пакеты, такие как numpy и т. д. есть ли у них аналоги в C++, такие как Библиотека Математического Ядра[^], но это требует, чтобы вы также переписали использование этих библиотек в своем коде. Эти языки полностью отличаются от своего ядра вплоть до внешнего представления. Существуют как онлайн, так и оффлайн инструменты, которые могут решить эту вашу проблему, но они принесут больше проблем, чем они попытаются решить; если таковые имеются.


Рейтинг:
1

Stefan_Lang

Мое предложение состоит в том, чтобы переписать его с нуля, а не пытаться преобразовать один к одному. Это был бы самый эффективный подход.

Альтернатива заключается в том, чтобы:
1. Для каждого языка Python пакет, поиск для C++ библиотеки, которые охватывают большую часть своей функциональности
2. Напишите адаптеры для адаптации поведения функций библиотеки C++ к вызовам Python, которые вы хотите использовать.
3. Напишите некоторые служебные функции, чтобы помочь со встроенной функциональностью Python, которой нет в C++ (см. ниже)
4. переведите код с помощью этих адаптеров.
5. всякий раз, когда вы натыкаетесь на утверждения, которые нетривиально перевести, вернитесь к 3.

ИМХО, это легко займет в 5-10 раз больше времени, чем просто переписывание вашей программы с нуля, в зависимости от того, насколько хорошо найденные вами библиотеки C++ соответствуют пакетам Python.