【無料配信♪】Renta !全タテコミ作品第1話

現在、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 の部分はどのようにして行うのでしょうか?

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

A 回答 (2件)

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



のような感じでできると思います。
    • good
    • 1
この回答へのお礼

出来ました、
ありがとうございます

お礼日時:2010/07/12 09:55

memmove( &b[2], &a[3], 2);



for( int i=0; i < 2 ; ++ i) {
b[2+i] = a[3+i] ;
}
    • good
    • 0
この回答へのお礼

回答ありがとうございます
No2 の方のやり方で出来ました。

お礼日時:2010/07/12 09:57

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

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

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

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

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

QDWORDの実際の型は何でしょうか

VC++.NETの環境です。
DOWRD dw1 = 1;
int i = 2; と定義し
ここで
if ( i > dw1 ){
何かの処理;
}
とコーディングすると
warning C4018: '>' : signed と unsigned の数値を比較しようとしました。
のワーニングがでます。
これは、DWORDがint型でなくunsigned int型のようにも見えます。
ある本によれば(VC++.V.NET逆引き大全500の極意)
DWORD はint型であると記述されています。
もし、int型ならこのワーニングはでないはずなのですが、
なぜでるのでしょうか。又、DWORDの実際の型は何なのでしょうか。ご存じのかたおりましたら、教えていただけませんでしょうか。

Aベストアンサー

型定義が知りたいのならば、宣言ファイルを見れば疑問を挟む余地もありません。
DWORD型はwindef.hで
"typedef unsigned long DWORD;"
と宣言されています。

Visual Studioを使っているのならば、知りたい型の上にマウスポインタを置いて右クリック、ポップアップメニューの「定義へ移動」または「宣言へ移動」で簡単に知ることが出来ます。

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

Q複数桁10進数の*桁目だけを抽出したい

タイトルがすべてと言えてしまうのですが、
例えば、int宣言された"4287"(この値は変動します)という数値があったとして、1桁目の"7"だけを別の変数へ引き抜きたいのですが、その場合にはANDによるマスク処理による演算で処理可能なのでしょうか?
また、他に良い方法などありましたら教えていただけますでしょうか?

Aベストアンサー

★10進数ですので AND は使えませんね。
・簡単なサンプルを載せますので読み取って下さい。

サンプル1:
int value = 4287;
int a[ 4 ];

a[0] = (value % 10); value /= 10; // 1桁目を取り出す
a[1] = (value % 10); value /= 10; // 2桁目を取り出す
a[2] = (value % 10); value /= 10; // 3桁目を取り出す
a[3] = (value % 10); value /= 10; // 4桁目を取り出す

サンプル2:
int value = 4287;
int a;

a = (value % 10);
value -= a;

value → 4280
a → 7
になります。

QC#で共有変数の定義をするには

C#で共有変数の定義をするには、どうしたらよいでしょうか。具体的には、起動パラメータで、任意の文字列(3~4バイト)を渡して、C#アプリケーションを、起動し、プログラムの任意の場所で、そのパラメータを参照したいと考えています。起動パラメータの受け取りは、できるのですが、そのパラメータを、プログラムのどこからも参照できる領域(ここの定義方法が不明)に格納するには、どうしたらよいでしょうか。(2重起動を許す前提です。実行時に1つの目のプログラムにはパラメータ"XYZ"を渡し、2つ目のプログラムを起動時にはパラメータ"ABCD"を渡し、その値により、プログラムの動作を制御したいと思っています)
Windows-xp visual-studio2008 C#でwindowsアプリケーションを作成しています。

Aベストアンサー

namespace test1
{
  static class Program
  {
    /// <summary>
    /// アプリケーションのメイン エントリ ポイントです。
    /// </summary>
    [STAThread]
    static void Main(string[] args)
    {
      if (args.Length > 0)
      {
        strArg = args[0];
      }
      Application.EnableVisualStyles();
      Application.SetCompatibleTextRenderingDefault(false);
      Application.Run(new Form1());
    }
    // ここに記述
    static public string strArg = null;
  }
}

メインクラスのメンバーとしてスコープが有効な場所に記述します

namespace test1
{
  static class Program
  {
    /// <summary>
    /// アプリケーションのメイン エントリ ポイントです。
    /// </summary>
    [STAThread]
    static void Main(string[] args)
    {
      if (args.Length > 0)
      {
        strArg = args[0];
      }
      Application.EnableVisualStyles();
      Application.SetCompatibleTextRenderingDefault(false);
      Application.Run(n...続きを読む

QC#からC++/CLIにサンプルソースを書き換えたい。

VC++/CLIは、過去のソースをそのまま利用できる(マネージ・アンマネージ混在可能)?ので、C++/CLIで作成したく、
以下のURLにC#のサンプルソースはあるので、
http://www.geocities.jp/hatanero/socket1.html

これからVC++/CLIに書き換えたいのですが、ここは全然違うというものがありましたら、教えて下さい。

C#からVC++/CLIに変換できるツールはあるのでしょうか?

Aベストアンサー

はっきりいってC#とCは全く別言語です。
CとC++のような互換性はありませんし、
エディタの"すべて置換"機能で機械的にバンバン置き換えれば完成!
というほど、甘く見ないほうがよいと思います。

きちんとC#及びC++/CLIを学習することを強く勧めます。

>C#からVC++/CLIに変換できるツールはあるのでしょうか?

ツールの存在は未確認です。
しかし、あったとしても頼り切らない方がいいと考えます。

MicrosoftとしてはC#とC++を役割分担させたい方向のようです。
http://blogs.msdn.com/somasegar/archive/2007/08/08/visual-c-futures.aspx
(英語です)
具体的には
C++はネィティブ開発に特化させ、.NETの開発はC#を主力にしたい模様です。

この様に、言語の特性が違う以上、
対応する機能(クラス等)が存在しなかったりすると考えられます。
無理やり変換しても、とても非効率、読みにくいコードで、
改修も一苦労ということになりかねません。
参考程度で、結局は人が介入せざるを得ないと思います。

はっきりいってC#とCは全く別言語です。
CとC++のような互換性はありませんし、
エディタの"すべて置換"機能で機械的にバンバン置き換えれば完成!
というほど、甘く見ないほうがよいと思います。

きちんとC#及びC++/CLIを学習することを強く勧めます。

>C#からVC++/CLIに変換できるツールはあるのでしょうか?

ツールの存在は未確認です。
しかし、あったとしても頼り切らない方がいいと考えます。

MicrosoftとしてはC#とC++を役割分担させたい方向のようです。
http://blogs.msdn.com/somase...続きを読む

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を使って定義できます。

Qインスタンス参照でアクセスできない。代わりに型名?

画面上に、
名前を入力するTextBoxがひとつと、
顧客情報を入力するDataGridViewがひとつあり、
そのDataGridViewには、連番、名前、メールアドレスの3列, 20行のデータがあります。

この2つのコントロールから入力されたデータをDBに登録したり、
DBから読み込んだ値を表示しようとしています。
(ほかにもいろいろ処理するのですが。)

データを一時的に保持しておくクラスを作ろうと考え、
わざわざインスタンスを作るまでもないと思ったので、
staic public なメンバを使用して、
以下のようなクラスを作ってみました。

  class Data {
   public class Customer
   {
    static public int no = 0;
    static public string name = "";
    static public string mailAddr = "";
   }

   static public string name = "";
   static public Customer[] customers = new Customer[20];
  }

ところが、たとえば、

  customers[0].no = 1;

のようにしようとすると、

  「インスタンス参照でメンバー 'Data.Customer.no' にアクセスできません。代わりに型名を使用してください。」


となります。
どういう意味でしょう?
また、どうすれば static public の配列を持てるでしょうか?
(そもそもこういうやりかたはしない?)

よろしくお願いします。

画面上に、
名前を入力するTextBoxがひとつと、
顧客情報を入力するDataGridViewがひとつあり、
そのDataGridViewには、連番、名前、メールアドレスの3列, 20行のデータがあります。

この2つのコントロールから入力されたデータをDBに登録したり、
DBから読み込んだ値を表示しようとしています。
(ほかにもいろいろ処理するのですが。)

データを一時的に保持しておくクラスを作ろうと考え、
わざわざインスタンスを作るまでもないと思ったので、
staic public なメンバを使用して、
以下のようなクラスを作っ...続きを読む

Aベストアンサー

   public class Customer
   {
    static public int no = 0;
    static public string name = "";
    static public string mailAddr = "";
   }
と書いたとき、no 等が定義されるのはそのインスタンス(new 等で生成したモノ)ではなくクラスそのものになります。一方、customers 自体はともかくcustomers[0] に入っているモノはインスタンスです。
したがって、そのインスタンスで定義されていない no へのアクセスはできません。

Customer の定義を
   public class Customer
   {
    public int no = 0;
    public string name = "";
    public string mailAddr = "";
   }
と変えましょう。

……でもこの修正をしてもコンパイル時じゃなくって実行時にエラーが出るんじゃないかなぁ?

   public class Customer
   {
    static public int no = 0;
    static public string name = "";
    static public string mailAddr = "";
   }
と書いたとき、no 等が定義されるのはそのインスタンス(new 等で生成したモノ)ではなくクラスそのものになります。一方、customers 自体はともかくcustomers[0] に入っているモノはインスタンスです。
したがって、そのインスタンスで定義されていない no へのアクセスはできません。

Customer の定義を
   public class Customer
 ...続きを読む

QGetPrivateProfileStringでiniファイル読込む処理を詳しく知りたいのですが・・・

お世話になっています。

iniファイルを読込み、各変数に代入するC言語のDLLを作成したいのです。
このサイトの投稿や、MSDNなどにも載っていたのですが、
少し理解に苦しみます。

現在まで、理解した点がwindows.hのインクルードを
記述するところ辺りです。
iniファイルは下記のようなレイアウトです。

---<mst.ini>----------------------------
[user]
name=username
ID=userid
[pc]
pcname=FMV
----------------------------------------

#include<windows.h>は記述することまでは
分かりましたが、以下から進みません。。。

GetPrivateProfileString("")

初心者で申し訳ありませんが、お助け願います。

Aベストアンサー

こんにちは。itohhといいます。

サンプルを載せておきます。

mst.iniファイル内の[user]セクションのnameキーの値を取得する。
DWORD dwLen=0;
char strBuf[100];
dwLen = GetPrivateProfileString("user",       // セクション名
                "name",       // キー名
                "soushi_ni",     // デフォルト値
                strBuf,       // 読み込んだ値を格納するエリア
                sizeof(strBuf),   // 上記のエリアのサイズ
                "mst.ini" );     // iniファイル名

解説:
iniファイル名をフルパスで指定しないとWindowsのディレクトリにあるものと判断されます。
Win9xなら「c:\windows」、WinNT系なら「c:\WinNT」。

[user]セクションのnameキーがないときは、デフォルト値で指定した値が設定させます。

復帰値「dwLen」は実際に設定した値(文字列)の長さが返されます。

こんにちは。itohhといいます。

サンプルを載せておきます。

mst.iniファイル内の[user]セクションのnameキーの値を取得する。
DWORD dwLen=0;
char strBuf[100];
dwLen = GetPrivateProfileString("user",       // セクション名
                "name",       // キー名
                "soushi_ni",     // デフォルト値
                strBuf,       // 読み込んだ値を格納するエリア
             ...続きを読む

Qラッパーって何なんでしょう・・・?

C++を勉強し始めたのですが、何とも難しい言葉が多くて、書いてあることが本当に理解できません。
ラッパーって?
ハンドルって??
と、次から次へと理解不能な言葉が・・・
読んでいるのは、C++Builderの開発者ガイドと、プログラミング言語C++の本です。
具体的なイメージが浮かばず、概念自体もピンときません。
わかりやすい本などあったら教えてください。
また、とりあえずラッパーとハンドルがどうしても気になるので、この2つの意味教えてください!!
よろしくお願いします。

Aベストアンサー

ラッパーは、wrapper で包み込むものの意味です。
wrap ラップはサランラップのラップですね。
wrappingラッピングといえば、プレゼントを包むやつですね。

つまり、たとえばある関数を使いたいと思ったとします。
しかし、その関数を呼び出すには、いろんな手続きをしないといけない、また呼ぶときに渡す引数をたくさん設定しなければならないなど、使用するのが面倒な場合があります。
これはその関数が汎用的に使えるように、動作に自由度を持たせていると、面倒になる傾向にあります。

そんな時、引数なし、又は簡単な引数で呼び出せるような関数を作ってあげれば楽になります。
この場合は、ある程度用途が決まっているので、その関数を呼び出すときの手続きを省略してくれるような関数ですね。
それがラッパーというわけです。

あと良くあるのが、C言語で書かれたライブラリなどをC++の機能を使って使いたいときに、ラッパーを作ったりします。
この場合は逆に機能を追加して使いやすくするイメージですね。

ハンドル(handle)はつまり何かを操作するときのハンドル(車のハンドルと同じ)です。

この概念は良く使われます。
たとえば、ハードディスクにはファイルがたくさん入っています。
その中のファイルを開いて何か処理しようとします。するとディスクアクセスの処理をしなければなりませんが、それを自分で書くのは大変なので、ライブラリを使います。
ライブラリでは、
・指定されたファイルを開く関数
・指定されたファイルの中身を読み出す関数
・指定されたファイルに指定の文字を書き出す関数
などなどたくさん用意します。

ここで一つ問題が生じます。もし複数のファイルを同時に処理したい場合どうやったらよいでしょう。
いちいちファイル名で指定する方法も考えられますが、ファイルを開くときに一つのハンドルという名前の変数を用意し、その変数の中にどのファイルであるという情報、そのファイルのサイズ、そのほか必要な情報を一つにまとめておくと、ファイルを操作するときにはその変数を引数として渡すだけで、ファイルがどれであるのかという指示が簡単に出来ます。

いまファイルハンドルを例にあげましたが、他にもWindowsではたくさんのWindowを開きますので、それら一つ一つにもハンドルが用意されています。

基本的に、

・同種のものが複数ある
・上記に対して操作する関数が複数ある

という条件を満たすようなものに対しては、ハンドルという概念でコントロールすることがよくあります。

ラッパーは、wrapper で包み込むものの意味です。
wrap ラップはサランラップのラップですね。
wrappingラッピングといえば、プレゼントを包むやつですね。

つまり、たとえばある関数を使いたいと思ったとします。
しかし、その関数を呼び出すには、いろんな手続きをしないといけない、また呼ぶときに渡す引数をたくさん設定しなければならないなど、使用するのが面倒な場合があります。
これはその関数が汎用的に使えるように、動作に自由度を持たせていると、面倒になる傾向にあります。

そんな時、引...続きを読む

QCStringとString

MFCプログラミングでは、CStringがよく使われていますが、Stringクラスも使用することはできますよね!?

普段使うにはどっちがいいのでしょうか?
CStringは、Stringを機能拡張したものと考えていいのでしょうか?

Aベストアンサー

ひょっとして .NET Framework の System::String のコト?


人気Q&Aランキング