マンガでよめる痔のこと・薬のこと

現在C言語にて構築したプログラムをネットワーク上でも実行できるようにするため、ASP.NETを利用しようと思っています。
そのために、ASP.NETで利用できるC#に変換できるツールがあるか探しています。
C言語からC#へ変換するソフトウェアというものはありますか?

OSはWindowsXPです。
回答よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

> .NETに組み込むまでの手順を是非教えていただけないでしょうか。



.NET言語から呼べるよう、クラスライブラリの体裁を整えて完了。
# それがわからんとなると掲示板では無理があります。

この回答への補足

DLLを作成するということでしょうか?
DLLを作成してVB側で呼び出すようにしてみたいと思います。

補足日時:2006/10/07 17:24
    • good
    • 0

> C言語からC++/CLIに変換するツールはありますか?



変換の必要はありません。
Visual C++ 2005 (VC++8) でre-compileするだけ。

この回答への補足

回答ありがとうございます。
VC++2005はExpressEditionでもかまいませんか?
一応ExpressEditionでエラーが出ないように書き換えました。
この先、.NETに組み込むまでの手順を是非教えていただけないでしょうか。
よろしくお願いします。

補足日時:2006/10/05 09:24
    • good
    • 0

> C++のコードで組んだものをインターネット上で実行できるようにすることはできますか?



C++/CLIはC/C++を呼ぶことができ
.NET言語(C#/VB.NET/etc)から呼べるアセンブリ
を生成します。
呼ぶ側からみれば、C#/VB.NETで書かれたアセンブリと
区別が付きません。

ASP.NETからC#/VB.NETのアセンブリが呼べるなら、
C++/CLIのアセンブリが呼べます。

この回答への補足

ありがとうございます。
ということはC++/CLIに変換すれば、.NET MatrixでWebアプリケーションにすることが可能なのですね。
C言語からC++/CLIに変換するツールはありますか?

補足日時:2006/10/04 13:11
    • good
    • 0

C++/CLIではダメですか?

この回答への補足

回答ありがとうございます。
最終的にネットワーク上で実行させたいので、ASP.NETで利用できるC#もしくはVB.NETのコードに直したいと思っています。
ただし、結果的に現在あるCで組んだプログラムと同じ動作をインターネット上で実行できればどのような方法でもかまいません。
C++のコードで組んだものをインターネット上で実行できるようにすることはできますか?

具体的には最短経路探索のプログラムで、入り口のIC名と出口のIC名を入れるとその最短の経路などが表示されるというものです。
Cで組んであるものは完全に動作しています。

重ねて質問すみません。
よろしくお願いします。

補足日時:2006/10/04 00:39
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QC言語→C#に変換

C言語→C#に変換

C言語からC#に変換したいのですが、わからないところがあります。
コマンドライン引数からファイル名とキーワードを入力して、キーワードがある行をアウトプットファイルに書き込むという処理です。
C言語のソースは、

main(int argc,char *argv[]){
FILE *fp;
FILE *fpp;
int i;
char KEYWORD[256];
char buf[256];

//(1)アウトプットファイルのオープン
fpp=fopen("output.txt","w");


for(i=1;i<argc-1;i++){
if(strcmp(argv[i],"-a")==0){
//(2)入力ファイルのオープン
if((fp=fopen(argv[i],"r"))==NULL){
printf("open error!\n");
exit(1);
}
}
//(3)キーワードの代入
if(strcmp(argv[i],"-b")==0){
strcpy(KEYWORD,argv[i]);
}
}
//(4)一行読み込む
while(fgets(buf,sizeof(buf),fp)!=NULL){
//(5)キーワードの条件で文字列抽出
if(strstr(buf,KEYWORD)!=NULL){
//(6)アウトプットファイルに出力
fprintf(fpp,"%s",buf);
}
}
//ファイルクローズ
fclose(fp);
fclose(fpp);
}

です。

(3)キーワードの代入と、(5)文字列抽出の部分がネットなどで調べてもよくわかりません。
分かる方いらっしゃいましたら教えていただけると幸いです。
宜しくお願いします。

.

C言語→C#に変換

C言語からC#に変換したいのですが、わからないところがあります。
コマンドライン引数からファイル名とキーワードを入力して、キーワードがある行をアウトプットファイルに書き込むという処理です。
C言語のソースは、

main(int argc,char *argv[]){
FILE *fp;
FILE *fpp;
int i;
char KEYWORD[256];
char buf[256];

//(1)アウトプットファイルのオープン
fpp=fopen("output.txt","w");


for(i=1;i<argc-1;i++){
if(strcmp(argv[i],"-a")==0){
//(2)入力ファイルのオープン
if((fp=fopen(argv[...続きを読む

Aベストアンサー

変換というよりは「仕様を理解して作り直し」に近いでしょうねぇ。

コマンドライン引数を取るのは以下のURL参照。
http://dobon.net/vb/dotnet/programing/commandline.html

このURLでは見ての通りfor eachを使っていますが、これでは「今見ている引数の次の引数」が取れないので配列のプロパティcountを使ってforで回しましょう。

(5)は文字列の抽出というか、文字列内文字列走査ですね。

こちらはString.IndexOfを使って実現すればいいでしょう。
http://msdn.microsoft.com/ja-jp/library/k8b1470s(v=VS.80).aspx

QC#で構造体の配列を持った構造体を使いたいのですが

C#で構造体の配列を持った構造体を使いたいのですが
Cならば
struct xyz {
struct abc _abc[32];
int index;
};
struct abc {
int a;
int b;
int c;
};

struct xyz _xyz[8];
xyz[0]._abc[3].b = 1;

のような使い方で という感じで やっていた事を C#で 同じような事をやろうとしても うまくいきません
うまくやる方法をどなたかご存知ないでしょうか

Visual Studio 2005行った場合
コンパイルで
構文エラーです。不適切な配列の宣言子です。マネージ配列を宣言するには、次元指定子を変数の識別子の前に指定します。固定サイズ バッファ フィールドを宣言するには、フィールド型の前に fixed キーワードを使用します
となり

fixed をつけると

固定サイズ バッファの型は次のうちの 1 つでなければなりません: bool、byte、short、int、long、char、sbyte、ushort、uint、ulong、float または double

となってしまいます

C#で構造体の配列を持った構造体を使いたいのですが
Cならば
struct xyz {
struct abc _abc[32];
int index;
};
struct abc {
int a;
int b;
int c;
};

struct xyz _xyz[8];
xyz[0]._abc[3].b = 1;

のような使い方で という感じで やっていた事を C#で 同じような事をやろうとしても うまくいきません
うまくやる方法をどなたかご存知ないでしょうか

Visual Studio 2005行った場合
コンパイルで
構文エラーです。不適切な配列の宣言子です。マネージ配列を宣言するに...続きを読む

Aベストアンサー

C# では、配列は「単なる連続したメモリ領域」ではなくて「添字によってオブジェクトを格納できるオブジェクト」であることに注意しなくてはいけません。つまり、C では配列は一種の構造体でしたが、C# では配列は参照型のオブジェクトです。
よって、C のように予めサイズを固定しておくということは基本的にできません。配列の大きさは配列のインスタンスが作られるときに動的に決まります。

C# では、参照型のオブジェクトを構造体のメンバにすることはあまりありません。null 値の扱いが面倒だからです。
また、C# では構造体の大きさは大きくとも 20 バイト程度までにします。C# では基本的に「構造体へのポインタ」はありません。巨大な構造体をそのまま扱うのはメモリの使い方の観点からいって非効率的です。

今回の件では、構造体ではなくクラスにするのがよいかと思われます。

QLNK2019: 未解決の外部シンボルのエラーが出る

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自キャラのデータ
Point2D g_jikipos = {40, 400};//自キャラの座標

//画像ハンドル
int g_jikiimage[11];

//色々なファイルの読み込み
int LoadFiles(){
//画像ファイル読み込み
if(LoadDivGraph("media\\player01.bmp",
11,11,1,64,64,g_jikiimage) == -1) return -1;

return 1;
}


 mymain.h
//他から呼び出させるMyMainの関数
void MyMain();
int LoadFiles();


 myhelper.h(サンプルなので打ちミスはない)
#include "DxLib.h"
#include <limits.h>
#include <math.h>

//構造体宣言
//座標またはベクトルを記録する構造体
struct Vector{
float x,y;
};
typedef Vector Point2D;
//線を記録する構造体
struct Line2D{
Point2D startpos, endpos;
float katamuki;//傾きをラジアン値で記録
Vector speed;//移動している場合は速度をセット
};
//球体を記録する構造体
struct Ball2D{
Point2D position;
float hankei;//半径
};
//四角形を記録する構造体
struct Rect2D{
Point2D lefttop;
Point2D rightbottom;
float width;
float height;
};


//ライブラリ関数
Point2D PosInView(Point2D in);
int XInView(float inx);
int YInView(float iny);
void ScrollToLeft(float jikiposx);
void ScrollToRight(float jikiposx);
void ScrollToUp(float jikiposy);
void ScrollToDown(float jikiposy);
void DrawLineInView(float x1, float y1, float x2, float y2, int Color, int Thickness);
void DrawCircleInView(float x, float y, float r, int Color, int FillFlag);
void DrawAnimation(float x, float y, double ExtRate, double Angle,int TurnFlag,
int *imgarray, int allframe, float fps);
//ベクトル関数
Vector CreateVector(Vector in, float veclen);
Vector AddVector(Vector v1, Vector v2);
Vector SubVector(Vector v1, Vector v2);
Vector AddVectorInFrameTime(Vector pos, Vector speed);
Vector AddVectorInFrameTime2(Vector pos, Vector speed, Vector accel);
Vector Normalize(Vector in);
Vector RotateVector(Vector in, float radian);
float VectorLengthSquare(Vector in);
float DotProduct(Vector v1, Vector v2);
float CrossProduct(Vector v1, Vector v2);
void SetLine2DKatamuki(Line2D *in);
void DrawLine2D(Line2D in, int Color, int Thickness);
void DrawBall2D(Ball2D in, int Color, int Fill);
//当たり判定関数
bool HitTestLineAndBall(Line2D linein, Ball2D ballin);
bool IsPointAtLineFace(Line2D linein, Point2D ptin);
bool HitTestLineAndLine(Line2D line1, Line2D line2);
bool HitTestBallAndBall(Ball2D a, Ball2D b);
bool HitTestPointAndBox(Rect2D rect, Point2D pt);
//タイマー関数
void SetSimpleTimer(int idx, int time);
int GetPassedTime(int idx);


//グローバル変数
extern float g_frametime;
extern Rect2D g_framerect;//画面領域(当たり判定)
extern Point2D g_current_field_pos;//現在の左上座標
extern Rect2D g_stagesize;//ステージサイズ

//定数宣言
const float ZEROVALUE = 1e-10f;
const float PIE = 3.1415926f;
const int SCROLL_LIMIT = 200;
----------------------------------------------------------------
 エラー内容
1>myhelper.obj : error LNK2019: 未解決の外部シンボル "void __cdecl MyMain(void)" (?MyMain@@YAXXZ) が関数 _WinMain@16 で参照されました
1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\my\Debug\my.exe : fatal error LNK1120: 外部参照 1 が未解決です
1>my - エラー 2、警告 0
ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ
----------------------------------------------------------------
画像を貼り付けときます
(見えにくい場合→http://www.dotup.org/uploda/www.dotup.org154142.jpg.html)
初心者なのでわかりやすくお願いします

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自...続きを読む

Aベストアンサー

ファイル構成から推測するに
mymain.cpp というファイルに
void MyMain(void) {
// ここに処理を書く
}
という関数が必要なようです。

QC#にて別クラスの関数を使いたい

C#にて、別クラスの関数を使用する方法を教えてほしいです。

下記のような、構造体を受け取るメソッドを作りました。

*****************************
private struct MyPoint
{
public int x;
public int y;
}

private void proc1(MyPoint pt)
{
MessageBox.Show("座標:" ; pt.x + "," + pt.y + "実行結果");
}

private void button1_Click(object sender ,System.EventArgs e)
{

MyPoint pt;
pt.x = 10;
pt.y = 20;
proc(pt);
}
*****************************

別のフォームのクラスから、proc1を呼び出したいのですが、やり方がわかりません。
どうか、教えてください。

Aベストアンサー

同じ定義をしたとしても別の名前空間に書いた構造体は同一とはみなされません。

呼び出し先クラスでの構造体を private では無く、public で宣言して下さい。

呼び出し元では、

MyClass.MyPoint pt;

のようにして実体を作ります。

QC#.net Define文

C#.net でプログラムを作成中です。

C++では定数等を#defineで定義していましたが、C#ではDefineは無いとの事です。

C#でC++の#Define に相当する事は出来ないのでしょうか。
やりたい事は 長い同じコマンドを別の文字で代替する事です。

もしC#に#Define文があったとして、以下の様な事を行いたいのです。

#Define NL printf("\n");

NL

このコーディングが展開した時、
 pritf("\n");
と展開される。

この様な事が出来る文をご存知の方、若しくはこの様な事は出来ないと言う事をご存知の方、よろしく御回答下さい。

よろしくお願い致します。

Aベストアンサー

定数の定義では無く、どちらかというと「マクロ」としての機能をC#で使いたいと言うことですね。

結論から言うと、C++の#defineを使ったマクロは、C#では利用できません。
このようなマクロはバグの元になりやすいため、意図的にC#から削られています。

もし、汎用的に使えるような引数を渡したい…という事であれば、ジェネリックなどを使うと良いですよ。


ちなみに、単純な定数の定義であればconst、列挙体であればenumを使って定義できます。

QC#「オブジェクト参照が必要です」(初心者)

Visual C# 2008を学習中なんですが、とりあえず何か作ってみようと思って、パラパラマンガに挑戦してみました。
Form1にpictureBox1を作り、waitを入れてイメージを書き換えるという単純なものです。
ところが実行しようと思ったら、「静的でないフィールド、メソッド、またはプロパティ’WindowsFormApplication1.Form1.pictureBox1’でオブジェクト参照が必要です」というエラーが出ます。その際のフォーカスは、main()内の
Form1.pictureBox1.image = Image.FromFile("motion1.png");
”Form1.pictureBox1”に当てられています。

何が原因と考えられるでしょうか。
もし情報不足であればご指摘いただくか、あるいはこの目的においてやらなければいけないこと、を大雑把に教えていただくだけでも幸いです。
よろしくお願いします。

Aベストアンサー

main()内に記述されているとのことですので、たぶん、
Form1.pictureBox1.Image=Image.FromFile("motion1.png");
Application.Run(new Form1());
と書いているのではないでしょうか?

連載 改訂版 C#入門 第3章 クラスとインスタンス
http://www.atmarkit.co.jp/fdotnet/csharp_abc2/csabc2_003/cs2_003_01.html#cs0302

ここであるように、オブジェクト指向にはクラスとインスタンスという概念があります。
今のコードでは、Form1クラスを操作しようとしているのでそのようなエラーが出ます。

具体的な解決方法としては、PictureBoxに初期画像を設定する処理をForm1のコンストラクタでやるのがいいと思います。
その際、redfox63さんがおっしゃられるように
this.pictureBox1
と記述することが必要です。(thisは自分自身のインスタンスを指します)

後は、Windowsフォームで一定間隔での処理をするための「Timerコンポーネント」について調べてみたらいいと思います。

タイマにより一定時間間隔で処理を行うには?(Windowsタイマ編)
http://www.atmarkit.co.jp/fdotnet/dotnettips/372formstimer/formstimer.html

MSDNライブラリ Timerクラス
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.timer.aspx

参考URL:http://www.atmarkit.co.jp/fdotnet/csharp_abc2/index/

main()内に記述されているとのことですので、たぶん、
Form1.pictureBox1.Image=Image.FromFile("motion1.png");
Application.Run(new Form1());
と書いているのではないでしょうか?

連載 改訂版 C#入門 第3章 クラスとインスタンス
http://www.atmarkit.co.jp/fdotnet/csharp_abc2/csabc2_003/cs2_003_01.html#cs0302

ここであるように、オブジェクト指向にはクラスとインスタンスという概念があります。
今のコードでは、Form1クラスを操作しようとしているのでそのようなエラーが出ます。

具...続きを読む

Qファイルやディレクトリの存在確認を行う方法

ファイルをオープンするのはfopenでOKですが、ファイルやディレクトリの存在確認を行う方法が知りたいです。

何か組み合わせて作るものなのでしょうか?
perlとか便利な演算子があるのですが、C/C++って器用ではないですね。
これは処理系?依存の内容ですか?

私の環境は VC6, VC2005 Windows2000です。

Aベストアンサー

int access(const char* path, int mode);
int stat(const char* path, struct stat* sb);

かな?
MSDN を引くと _access_s() を使えとか書いてあるけど。

QC# インスタンスの破棄

C#でインスタンスの破棄を明示的に行いたいのですが、
実際の開発現場では、どのように行っているのでしょうか?

自分で調べると「ガベージコレクタ」が暗黙的に行っているようですが明示的には行わないのが普通なのでしょうか?
もしくは、「Dispose」を使用して明示的に行うのが普通なのでしょうか?

実際に開発されている方からすると簡単な事かもしれませんが教えて頂けると助かります。

以上ですが、よろしくお願いいたします。

Aベストアンサー

結論から言うと、どちらでも良いです。
できれば生成から破棄まで考えて開発できると良いですね。

ガベージコレクションが実行されることで自動開放されますから、
一切.close()や.dispose()を使わなかったとしてもプログラムが
不正終了してしまう事はほとんどありません。

実際の開発では使わなくなったものを使わなくなった時点で
明示的に破棄することが多いです。正確には明示的に破棄するもの、
明示的に破棄しないもの、の2種類に分類しています。

例えばファイルを読み書きするストリーム系のオブジェクトや
データベースとのコネクションなどです。これは開発会社や
開発チーム、案件によって若干違っていて、徹底するところや
適当なところもあります。個人的には徹底したい派ですが。。。

ガベージコレクションが発生するとプログラムの実行動作が
遅くなり、また瞬間的に大きな負担がかかることがあります。
そのため全てをガベージコレクタに任せるのではなく、
明示的に開放できるもの、メモリを大量に消費するものは
その都度、適切に開放していくことで処理効率が良くなります。

プログラミング関連の調べ物で、サンプルソース等を見ることが
あるかと思います。この時サンプルで明示的に開放していたら、
それは明示的に開放したほうが良いもの、と思いましょう。
これだけでもステップアップになりますね。

結論から言うと、どちらでも良いです。
できれば生成から破棄まで考えて開発できると良いですね。

ガベージコレクションが実行されることで自動開放されますから、
一切.close()や.dispose()を使わなかったとしてもプログラムが
不正終了してしまう事はほとんどありません。

実際の開発では使わなくなったものを使わなくなった時点で
明示的に破棄することが多いです。正確には明示的に破棄するもの、
明示的に破棄しないもの、の2種類に分類しています。

例えばファイルを読み書きするストリーム...続きを読む

QC# DLL エントリ ポイントが見つかりません。

C#で作成したDLLをC#から呼出したいのですが、うまくいきません。

// トリガ
private void button2_Click(object sender, EventArgs e)
{
string ans = DLL.moji();
MessageBox.Show(ans);
}

// DLL呼出し用クラス
class DLL
{
[DllImport("LibCsharp.dll")]
public static extern string moji();
}

// DLL(LibCsharp.dll内容)
class AddClass
{
public static string moji()
{
return ("テスト");
}
}

上記で実行すると「EntryPointNotFoundException DLL 'LibCsharp.dll' の 'moji' というエントリ ポイントが見つかりません。」となります。

プロジェクトの参照設定にはLibCsharpを追加しています。
Web上で調べたのですが、解決には至っておりません。

申し訳ありませんが、よろしくお願いします。

C#で作成したDLLをC#から呼出したいのですが、うまくいきません。

// トリガ
private void button2_Click(object sender, EventArgs e)
{
string ans = DLL.moji();
MessageBox.Show(ans);
}

// DLL呼出し用クラス
class DLL
{
[DllImport("LibCsharp.dll")]
public static extern string moji();
}

// DLL(LibCsharp.dll内容)
class AddClass
{
public static string moji()
{
...続きを読む

Aベストアンサー

#1です。

私もc#で簡易な独自ライブラリを構築しようとしていたので調べてみました。
結果として参照の追加でdllを直接、指定するだけで使用可能だと分かりました。
(「参照設定」右クリック→「参照の追加」→「参照」タブ選択→DLLを選択)


まず基本的な知識としてdllには3種類あると覚えて下さい。

・レガシー(古い遺産)dll
・active-x dll
・.net dll


私はレガシーdll時代の知識しかありませんでした。
この頃のdllを使用するためには、dll本体以外に以下のファイルが必要でした。

・ヘッダファイル
・ライブラリ(lib)ファイル
・defファイル(場合による)


c#で作られたdllは[.net dll]となり、[.net freamwork]上で動作する各種の言語で使用出来るようにするため、煩わしいlibファイルやヘッダファイル等を削除する方向でdllが進化しているのだと思われます。

ネット検索をしていて見つけたのですが、[.net dll]で作成されたFTPクライアントのライブラリがありました。
(.NET用FTPクラスライブラリ (TKFP.DLL) )

どの言語で作られているのか分かりませんが、[.net dll]で作られているため、c#およびvbで使用可能のようです。
追加したdll内に含まれているクラスや関数に対してオブジェクトブラウザで概要が表示出来るようにXMLファイルで概要を記述出来るようなのですが、詳細まで調べることが出来ませんでした。
(申し訳ありません。)

#1です。

私もc#で簡易な独自ライブラリを構築しようとしていたので調べてみました。
結果として参照の追加でdllを直接、指定するだけで使用可能だと分かりました。
(「参照設定」右クリック→「参照の追加」→「参照」タブ選択→DLLを選択)


まず基本的な知識としてdllには3種類あると覚えて下さい。

・レガシー(古い遺産)dll
・active-x dll
・.net dll


私はレガシーdll時代の知識しかありませんでした。
この頃のdllを使用するためには、dll本体以外に以下のファイルが必要でした。

・...続きを読む

Q現在、C/C++ で作成したプログラムを C# に移植しているのですが

現在、C/C++ で作成したプログラムを C# に移植しているのですが
基本的な部分が分からずに困っています。

C# のバイト配列に対し、C/C++ で言う memmove 関数を行う方法
が知りたいのです

C/C++ で下記のような事を
char a[] = {1,2,3,4,5};
char b[5];
memset( b,0x00,sizeof(b));
memmove( &b[2], &a[3],2);

C# のバイト配列でやる場合
byte[] a = { 1, 2, 3, 4, 5 };
byte[] b = new byte[5];
memmove( &b[2], &a[3], 2);
memmove の部分はどのようにして行うのでしょうか?

Aベストアンサー

Array.Copy( a, 2, b, 3, 2);

のような感じでできると思います。


人気Q&Aランキング