java言語をc言語に変換したいのですが・・・

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
かづき

java言語をc言語に変換したいのですが・・・

#1

投稿記事 by かづき » 12年前

javaで書かれた文書をcに変換することを目的としております。
ただ、java、c共に知識が乏しく、1月の中旬までに仕上げる必要があり非常に苦戦している状況です。

コード:


package com.sonycsl.echo.node;

import java.io.IOException;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.sonycsl.echo.Echo;
import com.sonycsl.echo.EchoUtils;
import com.sonycsl.echo.eoj.EchoObject;
import com.sonycsl.echo.eoj.device.DeviceObject;
import com.sonycsl.echo.eoj.device.airconditioner.*;
import com.sonycsl.echo.eoj.device.audiovisual.*;
import com.sonycsl.echo.eoj.device.cookinghousehold.*;
import com.sonycsl.echo.eoj.device.health.*;
import com.sonycsl.echo.eoj.device.housingfacilities.*;
import com.sonycsl.echo.eoj.device.managementoperation.*;
import com.sonycsl.echo.eoj.device.sensor.*;
import com.sonycsl.echo.eoj.profile.*;


public final class EchoNode {
	private NodeProfile mNodeProfile;
	private Map<Short, List<DeviceObject>> mDeviceGroups;
	private InetAddress mAddress;
	
	private long mUpdatedTime = 0;
	
	private boolean mProxy = true;
	
	private boolean mInitialized = false;
	
	private boolean mActive = true;
	
	public EchoNode(NodeProfile profile, DeviceObject[] devices) throws IOException {
		initialize(EchoUtils.getLocalIpAddress(), profile, devices, false);
		
	}
	
	public EchoNode(InetAddress address, List<Integer> echoObjectCodeList) {
		ArrayList<DeviceObject> list = new ArrayList<DeviceObject>();
		if(echoObjectCodeList != null) {
			for(int code : echoObjectCodeList) {
				short echoClassCode = (short)((code >> 8) & 0xFFFF);
				byte instanceCode = (byte)(code & 0xFF);
				DeviceObject device = createDeviceProxy(echoClassCode, instanceCode);
				if(device != null) list.add(device);
			}
		}
		initialize(address, new NodeProfile.Proxy(), list.toArray(new DeviceObject[]{}), true);
	}

	public EchoNode(InetAddress address, DeviceObject[] devices) {
		initialize(address, new NodeProfile.Proxy(), devices, true);
	}
	
	private void initialize(InetAddress address, NodeProfile profile, DeviceObject[] devices, boolean proxy) {
		if(mInitialized) return;
		mAddress = address;
		mNodeProfile = profile;
		
		mDeviceGroups = new HashMap<Short, List<DeviceObject>>();
		
		mProxy = proxy;
		
		addDevices(devices);
		
		Echo.addNode(this);
		mInitialized = true;
		mNodeProfile.initialize(this);
		if(devices == null) return;
		for(DeviceObject dev : devices) {
			dev.initialize(this);
		}
	}
	
	public NodeProfile getNodeProfile() {
		return mNodeProfile;
	}
	
	public void addDevices(DeviceObject[] devices) {
		if(devices == null) return;
		for(DeviceObject dev : devices) {
			addDevice(dev);
		}
	}
	
	public void addDevice(DeviceObject device) {
		if(device == null) return;
		if(device.getNode() != null) return;
		short code = device.getEchoClassCode();
		if(mDeviceGroups.containsKey(code)) {
			List<DeviceObject> deviceList = mDeviceGroups.get(code);
			if(deviceList.size() > 0x7F) return;
			deviceList.add(device);
		} else {
			List<DeviceObject> deviceList = new ArrayList<DeviceObject>();
			deviceList.add(device);
			mDeviceGroups.put(code, deviceList);
		}
		if(mInitialized) device.initialize(this);
	}
	
	public void addDevice(short echoClassCode, byte instanceCode) {
		if(containsInstance(echoClassCode, instanceCode)) return;
		DeviceObject device = createDeviceProxy(echoClassCode, instanceCode);
		addDevice(device);
	}
	
	/*
	public void remove(DeviceObject device) {
		if(device == null) return;
		if(device.getNode() != this) return;
		List<DeviceObject> list = mDeviceGroups.get(device.getEchoClassCode());
		if(list == null) return;
		if(!list.contains(device)) return;
		list.set(list.indexOf(device), null);
	}
	*/
	
	public boolean containsInstance(byte classGroupCode, byte classCode, byte instanceCode) {
		short echoClassCode = EchoUtils.getEchoClassCode(classGroupCode, classCode);
		return containsInstance(echoClassCode, instanceCode);
	}
	
	public boolean containsInstance(short echoClassCode, byte instanceCode) {
		if(NodeProfile.ECHO_CLASS_CODE == echoClassCode
				&& NodeProfile.INSTANCE_CODE == instanceCode) return true;
		if(!mDeviceGroups.containsKey(echoClassCode)) return false;
		List<DeviceObject> list = mDeviceGroups.get(echoClassCode);
		if(list == null) return false;
		for(DeviceObject device : list) {
			if(device != null) {
				if(device.getInstanceCode() == instanceCode) return true;
			}
		}
		return false;
	}
	
	public boolean containsNodeProfile(NodeProfile profile) {
		return profile.getNode() == this;
	}
	
	public boolean containsDevice(DeviceObject device) {
		if(device == null) return false;
		if(device.getNode() != this) return false;
		if(!mDeviceGroups.containsKey(device.getEchoClassCode())) return false;
		List<DeviceObject> list = mDeviceGroups.get(device.getEchoClassCode());
		if(list == null) return false;
		return list.contains(device);
	}
	
	public EchoObject getInstance(byte classGroupCode, byte classCode, byte instanceCode) {
		return getInstance(EchoUtils.getEchoClassCode(classGroupCode, classCode), instanceCode);
	}
	
	public EchoObject getInstance(short echoClassCode, byte instanceCode) {
		if(NodeProfile.ECHO_CLASS_CODE == echoClassCode) return mNodeProfile;
		if(!mDeviceGroups.containsKey(echoClassCode)) return null;
		List<DeviceObject> list = mDeviceGroups.get(echoClassCode);
		if(list == null) return null;
		for(DeviceObject device : list) {
			if(device != null) {
				if(device.getInstanceCode() == instanceCode) return device;
			}
		}
		return null;
	}
	
	public DeviceObject getDevice(byte classGroupCode, byte classCode, byte instanceCode) {
		return getDevice(EchoUtils.getEchoClassCode(classGroupCode, classCode), instanceCode);
	}
	
	public DeviceObject getDevice(short echoClassCode, byte instanceCode) {
		if(!mDeviceGroups.containsKey(echoClassCode))
			return null;
		List<DeviceObject> list = mDeviceGroups.get(echoClassCode);
		for(DeviceObject device : list) {
			if(device != null && device.getInstanceCode() == instanceCode) {
				return device;
			}
		}
		return null;
	}
	
	public DeviceObject[] getDevices(byte classGroupCode, byte classCode) {
		return getDevices(EchoUtils.getEchoClassCode(classGroupCode, classCode));
	}
	
	public DeviceObject[] getDevices(short echoClassCode) {
		if(!mDeviceGroups.containsKey(echoClassCode))
			return null;
		List<DeviceObject> deviceList = new ArrayList<DeviceObject>(mDeviceGroups.get(echoClassCode));
		deviceList.remove(null);
		return deviceList.toArray(new DeviceObject[]{});
	}
	
	public DeviceObject[] getDevices() {
		ArrayList<DeviceObject> ret = new ArrayList<DeviceObject>();
		for(List<DeviceObject> devices : mDeviceGroups.values()) {
			//List<DeviceObject> list = new ArrayList<DeviceObject>(devices);
			//list.remove(null);
			//ret.addAll(list);
			for(DeviceObject dev : devices) {
				if(dev.isActive()) ret.add(dev);
			}
		}
		return (DeviceObject[]) ret.toArray(new DeviceObject[]{});
	}
	
	private DeviceObject[] getAllDevices() {
		ArrayList<DeviceObject> ret = new ArrayList<DeviceObject>();
		for(List<DeviceObject> devices : mDeviceGroups.values()) {
			ret.addAll(devices);
		}
		return (DeviceObject[]) ret.toArray(new DeviceObject[]{});
	}
	
	public void setActive(boolean active) {
		mActive = active;
	}
	
	public boolean isActive() {
		return mActive;
	}

	public byte getDeviceNumber(DeviceObject device) {
		if(device == null) return -1;
		List<DeviceObject> list = mDeviceGroups.get(device.getEchoClassCode());
		if(list == null) return -1;
		return (byte) ((list.indexOf(device) + 1) & 0xFF);
	}
	
	public byte[] getNumberOfSelfNodeClasses() {
		byte[] ret = new byte[2];
		//int size = getDeviceGroupList().size();
		// number of classes (contains NodeProfile)
		int size = getDeviceGroupList().size() + 1;
		ret[0] = (byte)((size >> 8) & 0xFF);
		ret[1] = (byte)(size & 0xFF);
		return ret;
	}
	
	public byte[] getSelfNodeClassList() {
		
		List<DeviceObject[]>  groupList = getDeviceGroupList();
		int size = groupList.size();
		byte[] ret;
		if(size > 8) {
			ret = new byte[17];
		} else {
			ret = new byte[size * 2 + 1];
		}
		ret[0] = (byte)(size & 0xFF);
		for(int i = 0; i < 8 && i < size; i++) {
			ret[i*2+1] = groupList.get(i)[0].getClassGroupCode();
			ret[i*2+2] = groupList.get(i)[0].getClassCode();
		}
		return ret;
	}
	
	private List<DeviceObject[]> getDeviceGroupList() {

		List<DeviceObject[]> ret = new ArrayList<DeviceObject[]>();
		for(short code : mDeviceGroups.keySet()) {
			List<DeviceObject> list = new ArrayList<DeviceObject>(mDeviceGroups.get(code));
			//list.remove(null);
			//if(!list.isEmpty()) {
			//	ret.add(list.toArray(new DeviceObject[]{}));
			//}
			ret.add(list.toArray(new DeviceObject[]{}));
		}
		return ret;
	}
	
	public void updateDevices(List<Integer> echoObjectCodeList) {
		//ArrayList<DeviceObject> list = new ArrayList<DeviceObject>();
		if(echoObjectCodeList == null) return;
		for(int code : echoObjectCodeList) {
			short echoClassCode = (short)((code >> 8) & 0xFFFF);
			byte instanceCode = (byte)(code & 0xFF);
			if(!containsInstance(echoClassCode, instanceCode)) {
				DeviceObject device = createDeviceProxy(echoClassCode, instanceCode);

				addDevice(device);
			}
		}
		DeviceObject[] devices = getAllDevices();
		for(DeviceObject dev : devices) {
			boolean active = false;
			for(int code : echoObjectCodeList) {
				if(code == dev.getEchoObjectCode()) {
					active = true;
					break;
				}
			}
			if(active) {
				dev.update();
			} else {
				dev.setActive(false);
			}
		}
	}
	
	private static DeviceObject createDeviceProxy(short echoClassCode, byte instanceCode) {
		switch(echoClassCode) {
		case ActivityAmountSensor.ECHO_CLASS_CODE: return new ActivityAmountSensor.Proxy(instanceCode);
		case AirPollutionSensor.ECHO_CLASS_CODE: return new AirPollutionSensor.Proxy(instanceCode);
		case AirSpeedSensor.ECHO_CLASS_CODE: return new AirSpeedSensor.Proxy(instanceCode);
		case BathHeatingStatusSensor.ECHO_CLASS_CODE: return new BathHeatingStatusSensor.Proxy(instanceCode);
		case BathWaterLevelSensor.ECHO_CLASS_CODE: return new BathWaterLevelSensor.Proxy(instanceCode);
		case BedPresenceSensor.ECHO_CLASS_CODE: return new BedPresenceSensor.Proxy(instanceCode);
		case CallSensor.ECHO_CLASS_CODE: return new CallSensor.Proxy(instanceCode);
		case CigaretteSmokeSensor.ECHO_CLASS_CODE: return new CigaretteSmokeSensor.Proxy(instanceCode);
		case CO2Sensor.ECHO_CLASS_CODE: return new CO2Sensor.Proxy(instanceCode);
		case CondensationSensor.ECHO_CLASS_CODE: return new CondensationSensor.Proxy(instanceCode);
		case CrimePreventionSensor.ECHO_CLASS_CODE: return new CrimePreventionSensor.Proxy(instanceCode);
		case CurrentValueSensor.ECHO_CLASS_CODE: return new CurrentValueSensor.Proxy(instanceCode);
		case DifferentialPressureSensor.ECHO_CLASS_CODE: return new DifferentialPressureSensor.Proxy(instanceCode);
		case EarthquakeSensor.ECHO_CLASS_CODE: return new EarthquakeSensor.Proxy(instanceCode);
		case ElectricEnergySensor.ECHO_CLASS_CODE: return new ElectricEnergySensor.Proxy(instanceCode);
		case ElectricLeakSensor.ECHO_CLASS_CODE: return new ElectricLeakSensor.Proxy(instanceCode);
		case EmergencyButton.ECHO_CLASS_CODE: return new EmergencyButton.Proxy(instanceCode);
		case FireSensor.ECHO_CLASS_CODE: return new FireSensor.Proxy(instanceCode);
		case FirstAidSensor.ECHO_CLASS_CODE: return new FirstAidSensor.Proxy(instanceCode);
		case FlameSensor.ECHO_CLASS_CODE: return new FlameSensor.Proxy(instanceCode);
		case GasLeakSensor.ECHO_CLASS_CODE: return new GasLeakSensor.Proxy(instanceCode);
		case GasSensor.ECHO_CLASS_CODE: return new GasSensor.Proxy(instanceCode);
		case HumanBodyLocationSensor.ECHO_CLASS_CODE: return new HumanBodyLocationSensor.Proxy(instanceCode);
		case HumanDetectionSensor.ECHO_CLASS_CODE: return new HumanDetectionSensor.Proxy(instanceCode);
		case HumiditySensor.ECHO_CLASS_CODE: return new HumiditySensor.Proxy(instanceCode);
		case IlluminanceSensor.ECHO_CLASS_CODE: return new IlluminanceSensor.Proxy(instanceCode);
		case MailingSensor.ECHO_CLASS_CODE: return new MailingSensor.Proxy(instanceCode);
		case MicromotionSensor.ECHO_CLASS_CODE: return new MicromotionSensor.Proxy(instanceCode);
		case OdorSensor.ECHO_CLASS_CODE: return new OdorSensor.Proxy(instanceCode);
		case OpenCloseSensor.ECHO_CLASS_CODE: return new OpenCloseSensor.Proxy(instanceCode);
		case OxygenSensor.ECHO_CLASS_CODE: return new OxygenSensor.Proxy(instanceCode);
		case PassageSensor.ECHO_CLASS_CODE: return new PassageSensor.Proxy(instanceCode);
		case RainSensor.ECHO_CLASS_CODE: return new RainSensor.Proxy(instanceCode);
		case SnowSensor.ECHO_CLASS_CODE: return new SnowSensor.Proxy(instanceCode);
		case SoundSensor.ECHO_CLASS_CODE: return new SoundSensor.Proxy(instanceCode);
		case TemperatureSensor.ECHO_CLASS_CODE: return new TemperatureSensor.Proxy(instanceCode);
		case VisitorSensor.ECHO_CLASS_CODE: return new VisitorSensor.Proxy(instanceCode);
		case VOCSensor.ECHO_CLASS_CODE: return new VOCSensor.Proxy(instanceCode);
		case WaterFlowRateSensor.ECHO_CLASS_CODE: return new WaterFlowRateSensor.Proxy(instanceCode);
		case WaterLeakSensor.ECHO_CLASS_CODE: return new WaterLeakSensor.Proxy(instanceCode);
		case WaterLevelSensor.ECHO_CLASS_CODE: return new WaterLevelSensor.Proxy(instanceCode);
		case WaterOverflowSensor.ECHO_CLASS_CODE: return new WaterOverflowSensor.Proxy(instanceCode);
		case WeightSensor.ECHO_CLASS_CODE: return new WeightSensor.Proxy(instanceCode);
		case AirCleaner.ECHO_CLASS_CODE: return new AirCleaner.Proxy(instanceCode);
		case AirConditionerVentilationFan.ECHO_CLASS_CODE: return new AirConditionerVentilationFan.Proxy(instanceCode);
		case ElectricHeater.ECHO_CLASS_CODE: return new ElectricHeater.Proxy(instanceCode);
		case FanHeater.ECHO_CLASS_CODE: return new FanHeater.Proxy(instanceCode);
		case HomeAirConditioner.ECHO_CLASS_CODE: return new HomeAirConditioner.Proxy(instanceCode);
		case Humidifier.ECHO_CLASS_CODE: return new Humidifier.Proxy(instanceCode);
		case PackageTypeCommercialAirConditionerIndoorUnit.ECHO_CLASS_CODE: return new PackageTypeCommercialAirConditionerIndoorUnit.Proxy(instanceCode);
		case PackageTypeCommercialAirConditionerOutdoorUnit.ECHO_CLASS_CODE: return new PackageTypeCommercialAirConditionerOutdoorUnit.Proxy(instanceCode);
		case VentilationFan.ECHO_CLASS_CODE: return new VentilationFan.Proxy(instanceCode);
		case BathroomHeaterAndDryer.ECHO_CLASS_CODE: return new BathroomHeaterAndDryer.Proxy(instanceCode);
		case Battery.ECHO_CLASS_CODE: return new Battery.Proxy(instanceCode);
		case Buzzer.ECHO_CLASS_CODE: return new Buzzer.Proxy(instanceCode);
		case ColdOrHotWaterHeatSourceEquipment.ECHO_CLASS_CODE: return new ColdOrHotWaterHeatSourceEquipment.Proxy(instanceCode);
		case ElectricallyOperatedShade.ECHO_CLASS_CODE: return new ElectricallyOperatedShade.Proxy(instanceCode);
		case ElectricLock.ECHO_CLASS_CODE: return new ElectricLock.Proxy(instanceCode);
		case ElectricShutter.ECHO_CLASS_CODE: return new ElectricShutter.Proxy(instanceCode);
		case ElectricStormWindow.ECHO_CLASS_CODE: return new ElectricStormWindow.Proxy(instanceCode);
		case ElectricToiletSeat.ECHO_CLASS_CODE: return new ElectricToiletSeat.Proxy(instanceCode);
		case ElectricWaterHeater.ECHO_CLASS_CODE: return new ElectricWaterHeater.Proxy(instanceCode);
		case FloorHeater.ECHO_CLASS_CODE: return new FloorHeater.Proxy(instanceCode);
		case FuelCell.ECHO_CLASS_CODE: return new FuelCell.Proxy(instanceCode);
		case GasMeter.ECHO_CLASS_CODE: return new GasMeter.Proxy(instanceCode);
		case GeneralLighting.ECHO_CLASS_CODE: return new GeneralLighting.Proxy(instanceCode);
		case HouseholdSolarPowerGeneration.ECHO_CLASS_CODE: return new HouseholdSolarPowerGeneration.Proxy(instanceCode);
		case InstantaneousWaterHeater.ECHO_CLASS_CODE: return new InstantaneousWaterHeater.Proxy(instanceCode);
		case LPGasMeter.ECHO_CLASS_CODE: return new LPGasMeter.Proxy(instanceCode);
		case PowerDistributionBoardMetering.ECHO_CLASS_CODE: return new PowerDistributionBoardMetering.Proxy(instanceCode);
		case SmartElectricEnergyMeter.ECHO_CLASS_CODE: return new SmartElectricEnergyMeter.Proxy(instanceCode);
		case SmartGasMeter.ECHO_CLASS_CODE: return new SmartGasMeter.Proxy(instanceCode);
		case Sprinkler.ECHO_CLASS_CODE: return new Sprinkler.Proxy(instanceCode);
		case WaterFlowmeter.ECHO_CLASS_CODE: return new WaterFlowmeter.Proxy(instanceCode);
		case WattHourMeter.ECHO_CLASS_CODE: return new WattHourMeter.Proxy(instanceCode);
		case ClothesDryer.ECHO_CLASS_CODE: return new ClothesDryer.Proxy(instanceCode);
		case CombinationMicrowaveOven.ECHO_CLASS_CODE: return new CombinationMicrowaveOven.Proxy(instanceCode);
		case CookingHeater.ECHO_CLASS_CODE: return new CookingHeater.Proxy(instanceCode);
		case ElectricHotWaterPot.ECHO_CLASS_CODE: return new ElectricHotWaterPot.Proxy(instanceCode);
		case Refrigerator.ECHO_CLASS_CODE: return new Refrigerator.Proxy(instanceCode);
		case RiceCooker.ECHO_CLASS_CODE: return new RiceCooker.Proxy(instanceCode);
		case WasherAndDryer.ECHO_CLASS_CODE: return new WasherAndDryer.Proxy(instanceCode);
		case WashingMachine.ECHO_CLASS_CODE: return new WashingMachine.Proxy(instanceCode);
		case Weighing.ECHO_CLASS_CODE: return new Weighing.Proxy(instanceCode);
		case Controller.ECHO_CLASS_CODE: return new Controller.Proxy(instanceCode);
		case Switch.ECHO_CLASS_CODE: return new Switch.Proxy(instanceCode);
		case Display.ECHO_CLASS_CODE: return new Display.Proxy(instanceCode);
		case Television.ECHO_CLASS_CODE: return new Television.Proxy(instanceCode);
		default: return null;
		}
	}
	
	public InetAddress getAddress() {
		return mAddress;
	}
	
	public boolean isProxy() {
		return mProxy;
	}
	
	public void update() {
		mUpdatedTime = System.currentTimeMillis();
		setActive(true);
	}
	
	public long getUpdatedTime() {
		return mUpdatedTime;
	}
	
	

}

このjavaで記されているimportはc言語でいう何に変換すべきか、等比較として参考になる書物、サイトを教えていただけないでしょうか?
変換をする際にはどこから手をつけていいのかさえ解らない状況です。
また、同様にあと4点のプログラムを変換する必要があり、時間に詰まっている状況です。
もしよろしければ上記のプログラムの変換例を教えていただけないでしょうか。
他のプログラムを変換するときに是非参考にさせて頂きたいのです。
長文のプログラムかつ丸投げに近い形になってしまいまして申し訳ありません。できれば今年中に終わらせたいので・・・
アドバイスだけでも構わないのでよろしければお願いします。

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

Re: java言語をc言語に変換したいのですが・・・

#2

投稿記事 by h2so5 » 12年前

OpenECHOというライブラリを使用しているようですが、これはJava専用でC言語では使えません。
そのため、C言語に変換するためにはまずOpenECHOをC言語用に書きなおさないといけないことになります。
つまりこのコードの変換だけでは済みません。

たいちう
記事: 418
登録日時: 14年前

Re: java言語をc言語に変換したいのですが・・・

#3

投稿記事 by たいちう » 12年前

仕事ですよね?
成果物に責任を負う必要を考えると、以下の事をする必要があります。

1)Javaについての十分な学習
2)C言語についての十分な学習
3)このプログラムが何をしているかの完全な理解
4)同じ機能を持つCプログラムの作成
5)同じ機能を持つことを証明するテストの設計と実行

掲示板で少々アドバイスをもらった程度では不可能ではないですか?
一刻も早く上司と相談するべきではないでしょうか。

beatle
記事: 1281
登録日時: 13年前
住所: 埼玉
連絡を取る:

Re: java言語をc言語に変換したいのですが・・・

#4

投稿記事 by beatle » 12年前

米Google、JavaコードをObjective-Cに変換するツール「J2ObjC」を公開
こんな記事をふと思い出したので貼っておきます。
これはJavaからObject-Cへの変換で、正確にはC言語とは異なるものです。
C言語への変換ツールは知りませんね。

h2so5さん、たいちうさんの言うとおりです。

JavaとC言語はかなり文法、機能が異なりますので、構文だけをみて機械的に変換することは非常に難しいと思います。
importはC言語の◯◯に対応し、for ( hoge : foo )はC言語の□□に対応する、というような変換規則はないということです。(もちろん、構文が同じ部分は無くはないので、その部分は変換可能だと思います)
すなわち、たいちうさんの言うとおり、ソースコードの変換には、意味的な変換、つまり変換元のJavaプログラムがどんな動作をしていて、その動作を真似るC言語プログラムはどうなるか、というのを考える能力が求められます。

CとJavaの知識が乏しい=CとJavaでまともなプログラムは組めない、という状況ですと、変換するのは非常に厳しいといえます。

一つ道があるとすれば、プログラマにお金を払って変換してもらうことです。
卒論や修論なら使えない方法かもしれませんけども。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: java言語をc言語に変換したいのですが・・・

#5

投稿記事 by softya(ソフト屋) » 12年前

OpenECHOはECHONET Liteと言う規格のパッケージみたいですが、これのC言語版ライブラリは用意できていらっしゃいますか?
「ECHONET Lite - Wikipedia」
http://ja.wikipedia.org/wiki/ECHONET_Lite

これを作るとなると何ヶ月かかる分からないと思います。

【補足】
ネットで検索する限りは、C言語版はミドルウェア・パッケージとして販売されている例は見当たりますがオープンソースは無さそうです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

かづき

Re: java言語をc言語に変換したいのですが・・・

#6

投稿記事 by かづき » 12年前

迅速な返信ありがとうございます。

もう少し文章を具体的に書くべきでしたね・・・申し訳ありません。
仕事ではなく、卒業論文のための研究に使用するためのものであり、正確な動作を目的とはしていません(それでも正確な動作に近づけたいものですが)。

卒業論文の内容としては、通常c言語しか読み取らないArudinoという基盤に、java言語の文書をc言語に変換したものを読み込ませ
実際の動作がどうなるか、どのような改善を必要とするかといった研究です。

失敗したら失敗したという結果をまとめて論文にするつもりですが、先ほどのjava分を変換するにあたって
特別な手順を踏む必要があるのでしょうか。
単純にこのプログラムをc言語に変換させるだけで構いません。
それでも何ヶ月もかかってしまうのでしょうか。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: java言語をc言語に変換したいのですが・・・

#7

投稿記事 by softya(ソフト屋) » 12年前

Arudinoじゃなくて Arduino ですね。
存在しないライブラリ相手のプログラムを組むというのも不思議ですがコンパイル・リンクも通りませんよ。

あと
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
辺も自分で用意する必要があるでしょう。

>単純にこのプログラムをc言語に変換させるだけで構いません。

C++でも違いがあり面倒なのにC言語は色々と変えるところが多いです。
Arduino はC++も使えるのでC++も検討すべきです。
【補足】 逆に理解することが増えるので良い選択肢とは言えないんですね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

トントン
記事: 100
登録日時: 14年前

Re: java言語をc言語に変換したいのですが・・・

#8

投稿記事 by トントン » 12年前

無理くりやるという話であれば、
僕ならC言語からJavaのメソッドを呼び出す方法を考えます。
が、内容を見る限り駄目そうですね。

変換コードを書くことが目的であれば

仕事でなくとも、たいちうさんが言っている
1)Javaについての十分な学習
2)C言語についての十分な学習
3)このプログラムが何をしているかの完全な理解
4)同じ機能を持つCプログラムの作成
5)同じ機能を持つことを証明するテストの設計と実行
が必要になってくると思います。

また、C言語版のOpenECHOを持っている必要があると思います。
でも、話の流れを見る限りだとC言語版のOpenECHOもないっぽいんですよね?
となると、全て自作する必要がでてきます。
なので、機械的に変換は無理です。

今年中。一日10時間計算でも、土日頑張っても60時間ぐらいしか時間がとれませんよね?
かなり頑張るなら15時間ぐらいいけそうですか?
90時間とれるなら、まぁ、妥協するレベルによってはいけそうな気がしますけど途中で死にそうです。

ライブラリを自作することから考えても、今年中に全てを終わらせることは無理だと思うのでゴールを変えたほうが良いと思います。

たいちう
記事: 418
登録日時: 14年前

Re: java言語をc言語に変換したいのですが・・・

#9

投稿記事 by たいちう » 12年前

卒論でしたか。

> 失敗したら失敗したという結果をまとめて論文にするつもりですが、

とありますが、『拡張子を*.javaから*.cに変えた結果、
コンパイルエラーになりました』、という論文は書けませんよね?
C言語への変換に失敗したら論文以前の問題だと思いますが、違うのですか?


> 先ほどのjava分を変換するにあたって
> 特別な手順を踏む必要があるのでしょうか。
> 単純にこのプログラムをc言語に変換させるだけで構いません。

仕事でないなら、私の書いた5)のテストは省けるかもしれません。
(仕事より研究の方がいい加減でも良いということではないので、
ご自分で判断してください。)

特別な手順は必要無いですが、元のプログラムを理解する、
ということは最低限必要ですよね?
特殊なライブラリを使っているので、そのライブラリの仕様の理解も当然必要です。

まずは、このプログラムが何をしているか、完全に理解してみて下さい。


> それでも何ヶ月もかかってしまうのでしょうか。

1週間で出来る人もいれば、何年かけても出来ない人もいます。
この質問内容からのみ判断すると、最低でも何ヶ月もかかると思います。
もしJavaとCに精通した友人がいれば、実質的には全て友人にやってもらう事で、
年内にでも出来るでしょう。そのつもりで掲示板を使っていますか?

たかぎ
記事: 328
登録日時: 14年前
住所: 大阪
連絡を取る:

Re: java言語をc言語に変換したいのですが・・・

#10

投稿記事 by たかぎ » 12年前

ECHONET LiteのC言語のソースコードは下記辺りで提供しているようですが(有償でしょうね)...
http://www.co-nss.co.jp/p-org/enetlite.html

ただ、上記ページの一番下にROM/RAMサイズが書かれていますが、Arduino MEGA 2560でも、いやArduino Dueでさえ到底収まらないぐらい大きなものです。
となると、ECHONET Liteについては主にPC側で動作させ、USB(シリアルポート)経由でその機能を呼び出すようにするしかないでしょう。
あるいは、もっと大きなメモリを使えるサブプロセッサを搭載したシールドを自作するかです。

ところで、Arduinoのスケッチは、C言語ではなくArduino言語です。
これは実質的なC++で、関数原型の前方参照などが可能になるほか、一部のテンプレート機能が制限されたりします。
どうしてもC言語で、ということであれば、ソースファイルを分割して、Arduino言語のsetupおよびloop関数からそれらを呼び出すようにするしかありません。
その場合は、言語結合など、CとC++のインタフェースに関する知識も当然必要になってきます。

たかぎ
記事: 328
登録日時: 14年前
住所: 大阪
連絡を取る:

Re: java言語をc言語に変換したいのですが・・・

#11

投稿記事 by たかぎ » 12年前

たかぎ さんが書きました:ただ、上記ページの一番下にROM/RAMサイズが書かれていますが、Arduino MEGA 2560でも、いやArduino Dueでさえ到底収まらないぐらい大きなものです。
全部は無理ですが、一部の機能だけなら収まる可能性はありますね。
もっとも、Arduino UNOやLeonardoでは無理で、MEGAが必要になるとは思いますが...。

あと、AVRはハーバードアーキテクチャですので、ROMに格納したデータは普通の変数のようにアクセスすることができません。
結果、普通にconst修飾子を付けて静的なオブジェクトを宣言してもRAMに格納されてしまいますので、RAMの使用量が思った以上に増えてしまいます。
その点は十分に注意してください。

beatle
記事: 1281
登録日時: 13年前
住所: 埼玉
連絡を取る:

Re: java言語をc言語に変換したいのですが・・・

#12

投稿記事 by beatle » 12年前

一応変換例を載せてみますね。

コード:

    public boolean containsDevice(DeviceObject device) {
        if(device == null) return false;
        if(device.getNode() != this) return false;
        if(!mDeviceGroups.containsKey(device.getEchoClassCode())) return false;
        List<DeviceObject> list = mDeviceGroups.get(device.getEchoClassCode());
        if(list == null) return false;
        return list.contains(device);
    }

コード:

int EchoNode_containsDevice(EchoNode *this, DeviceObject *device) {
    if(device == NULL) return 0;
    if(DeviceObject_getNode(device) != this) return 0;
    if(!Short_DeviceObjectList_Map_containsKey(this->mDeviceGroups, DeviceObject_getEchoClassCode(device))) return 0;
    DeviceObject_List *list = Short_DeviceObjectList_Map_get(this->mDeviceGroups, DeviceObject_getEchoClassCode(device));
    if(list == NULL) return 0;
    return DeviceObject_List_contains(list, device);
}
無理やり変換してみるとこんな感じでしょうか。
ポイントは、JavaのクラスはC言語の構造体+グローバル関数に変換することです。

Aというクラスがあったら、構造体Aを作って、
A.foo(int bar)というメンバ関数に対して
A_foo(A *this, int bar)というグローバル関数を作ります。

C言語にはリスト構造とかマップ構造などは用意されていませんので、自分で作ります。
Short_DeviceObjectList_Map_containsKey, DeviceObject_List_containsなどを自分で書く必要があるということです。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: java言語をc言語に変換したいのですが・・・

#13

投稿記事 by softya(ソフト屋) » 12年前

いちおう、JavaからC変換ツールはあります。
「Java2C プロジェクト日本語トップページ - SourceForge.JP」
http://sourceforge.jp/projects/sfnet_java2c/
つかった事がないので、どの程度使えるかわかりません。
まぁ、この手のやつは変換後の調整に大変手間がかかると言うのが常識です。それでも良かったら試してください。
arduinoの形式にはならないので色々とやることは多いはずです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

かづき

Re: java言語をc言語に変換したいのですが・・・

#14

投稿記事 by かづき » 12年前

ご回答ありがとうございます。
とても参考になります。
いろいろと理解不足だったみたいですね・・・

単純な変換は学習時間を含める多大な時間が必要みたいですね。
やり方を少し変えてこのjava文と同等の動作を行うc言語の文を作り出すことを目的に変えます。
現在の文書を完全に理解しなければなりませんね・・・見直してみます。

変換、ツールの紹介もありがとうございます。
いろいろ試行錯誤させていただきます。

nil
記事: 428
登録日時: 13年前

Re: java言語をc言語に変換したいのですが・・・

#15

投稿記事 by nil » 12年前

横から失礼します。
>同等の動作を行う
これの定義がいまいちわからないです。
内部動作まで完全に同じ  =ライブラリから同じ物を使う。
見た目だけでも完全に同じ =ライブラリは違うものを使う。
どちらでしょうか?
今までのやり取りから鑑みても前者は大変そうなので後者でしょうか。

beatle
記事: 1281
登録日時: 13年前
住所: 埼玉
連絡を取る:

Re: java言語をc言語に変換したいのですが・・・

#16

投稿記事 by beatle » 12年前

今まで何人かから出ている質問に未だに答えてもらっていないのですが、Arduinoに搭載できるOpenECHOライブラリ(または類似ライブラリ)はお持ちなのでしょうか?
これが用意できていないと、たとえソースコードがC言語にできたとしても、Arduinoで動作させられないと思います。
最後の最後で「あ、ライブラリがない」となると卒論がぽしゃりますよ。

ソースコードをC言語に変換する事自体は、JavaとCの知識があれば楽です。
C言語から使えるOpenECHOライブラリ(または類似ライブラリ)があるかどうか、それが一番大きな問題だと思います。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: java言語をc言語に変換したいのですが・・・

#17

投稿記事 by softya(ソフト屋) » 12年前

かづき さんが書きました: やり方を少し変えてこのjava文と同等の動作を行うc言語の文を作り出すことを目的に変えます。
現在の文書を完全に理解しなければなりませんね・・・見直してみます。
どちらかと言うと変換より大変です。
仕様が分かっていればC言語で組むだけで済みますが、それも理解されていると思えません。
※ それが出来ているなら移植するという話にはならないからです。

「Arduinoに搭載できるOpenECHOライブラリ」
結局、これが無いとどの話もポシャります。

【補足】
それと「ECHONET Lite」に付いて開発経験があり内容を知っている専門家でないと、1月中旬までの短期間では何も出来ないでしょう。
プロに依頼するとしても、そんなヒトを探しだす事やら予算レベルで困難です。
つまり、私の目から見ても行き詰って何ともしようがない状態だと思いますので今のうちに方向転換したほうが良いでしょう。
一番良いのは、Arduinoを使わずにPCを使いJavaのまま動作させるです。
それならJavaのコードを必要に応じてカスタマイズするだけで済む可能性があります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

Re: java言語をc言語に変換したいのですが・・・

#18

投稿記事 by ISLe » 12年前

Javaだとガベージコレクションがあるし、インスタンスを作って戻り値にするといったことを当たり前にやりますが、C/C++ではその辺スマートポインタ等に包んでやるとかフレームワーク的な設計や実装の知識も必要なのではないでしょうかね。
Javaのソースコードを参考にするのであれば、ですが。

閉鎖

“C言語何でも質問掲示板” へ戻る