- ベストアンサー
[C++/CLI]マネージコードで配列を作成してネイティブコードの配列にコピーしたい
machongolaの回答
- machongola
- ベストアンサー率60% (434/720)
こんばんは。 うう~む、コンパイルには通せましたが・・・。 Hoge.txtの中身の並びと、其れがInt型の配列になった時にどんな感じになるのかを記載して頂ければ協力出切るかもしれません。
関連するQ&A
- C++/CLIでのDataGridViewの使い方
以前に質問させていただいたのですが、要点を得ていなかったため再度質問させていただいきます。 VC++2005のC++/CLIでプログラムを作成しています。 CSVファイルから内容を読み込み、DataGridVeiwに表示させたいと考えています。 CSVファイルを配列に読み込んで、表示するところまでは出来ています。 以下CSVファイルを読み込んで、コンソール出力するプログラムの一部 int i; StreamReader^ sr=gcnew StreamReader("hoge.csv"); String^ text=sr->ReadToEnd(); array<String^>^ line=text->Split(gcnew array<String^> {"\r\n", "\r", "\n"},StringSplitOptions::RemoveEmptyEntries); array<array<String^>^>^ table= gcnew array<array<String^>^>(line->Length); for (i=0; i<line->Length; i++) { table[i]=line[i]->Split(','); } for each (array<String^>^ output in table){ for(i=0; i<output->Length; i++){ Console::Write(output[i]); //行出力 } } 初歩的なことだとは思うのですが・・・ コンソール出力部分をDataGridViewで出力表示させるには どのように書けばいいでしょうか。 よろしくお願いします。
- ベストアンサー
- C・C++・C#
- C++/CLIのオブジェクト型配列
VC++/CLIで、オブジェクト型の配列data、ArrayData(String^ s, int a, int d, double c)でコンストラクタをつくり array<Object^>^ data = gcnew ArrayData(String^ s, int a, double b); でインスタンス化したいのですがうまくいきません。 さらに、他クラスから、d->data[i].aで、data[i]」の配列のうち、整数型変数aを参照したいたいと思っていますがそれも上手くいきません。 例えば data[0]= gcnew ArrayData("山田",30,45.2); data[1]= gcnew ArrayData("高橋",66,43.2); data[2]= gcnew ArrayData("田中",86,62.7); のdata配列を用意します. VC++2005で作成したファイルを載せますので、それに対応したコード(.hファイルと.cppファイル)を教えてくれるとありがたいです。 このままでは、エラーです。内容は、メンバ変数、ドット演算子など。 --File Name:ArrayData.h-- #pragma once using namespace::System; ref class ArrayData { public:array<object^>^ data; public: ArrayData(String^ name,int data1,double data2); }; --File Name:ArrayData.cpp-- #include "StdAfx.h" #include "ArrayData.h" ArrayData::ArrayData() { data= gcnew array<Object^>(5); data[0]= gcnew ArrayData("山田",30,45.2); data[1]= gcnew ArrayData("高橋",66,43.2); data[2]= gcnew ArrayData("田中",86,62.7); } --File Name Form1.h-- #pragma once #include"ArrayData.h" namespace TestDataArray { using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; /// <summary> /// Form1 の概要 /// /// 警告: このクラスの名前を変更する場合、このクラスが依存するすべての .resx ファイルに関連付けられた /// マネージ リソース コンパイラ ツールに対して 'Resource File Name' プロパティを /// 変更する必要があります。この変更を行わないと、 /// デザイナと、このフォームに関連付けられたローカライズ済みリソースとが、 /// 正しく相互に利用できなくなります。 /// </summary> public ref class Form1 : public System::Windows::Forms::Form { public: Form1(void) { InitializeComponent(); // //TODO: ここにコンストラクタ コードを追加します // ArrayData^ abc = gcnew ArrayData(); //ArrayDataクラスのインスタンス化 int bee= abc->data[0].data1; //data[0]配列のdata1の値(=30)を参照 String^ cee=bee.ToString(); //beeを文字列化 MessageBox::Show(cee); //メッセージボックスにceeを表示 } protected: /// <summary> /// 使用中のリソースをすべてクリーンアップします。 /// </summary> ~Form1() { if (components) { delete components; } } private: /// <summary> /// 必要なデザイナ変数です。 /// </summary> System::ComponentModel::Container ^components; #pragma region Windows Form Designer generated code /// <summary> /// デザイナ サポートに必要なメソッドです。このメソッドの内容を /// コード エディタで変更しないでください。 /// </summary> void InitializeComponent(void) { this->components = gcnew System::ComponentModel::Container(); this->Size = System::Drawing::Size(300,300); this->Text = L"Form1"; this->Padding = System::Windows::Forms::Padding(0); this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; } #pragma endregion }; } --File Name:TestDataArray.cpp-- // TestDataArray.cpp : メイン プロジェクト ファイルです。 #include "stdafx.h" #include "Form1.h" using namespace TestDataArray; [STAThreadAttribute] int main(array<System::String ^> ^args) { // コントロールが作成される前に、Windows XP ビジュアル効果を有効にします Application::EnableVisualStyles(); Application::SetCompatibleTextRenderingDefault(false); // メイン ウィンドウを作成して、実行します Application::Run(gcnew Form1()); return 0; }
- 締切済み
- C・C++・C#
- .NET C++/CLIのガーベジコレクションについて
.NET C++/CLIのガーベジコレクションについて .NET C++/CLIで、マネージピープの配列をネイティブDLLにポインタ引数として渡す動作で、 配列が正常に渡っていることは確認したのですが、ネイティブDLL側で配列の処理をしている最中に、 ガーベジコレクションが起こり、誤動作することはあるのでしょうか。 ちなみに、マーシャリングは以下のように行いました。 // マネージ側コード [DllImport("native.dll")] void ArraySet( [MarshalAs(UnmanagedType::LPArray)] array <int> ^ Data ); array <int> ^ Data = gcnew array <int>(64); ArraySet( Data ); // この中で配列の処理中にガーベジコレクションが起こると誤動作?
- ベストアンサー
- C・C++・C#
- D言語の連想配列をコピーしたい
D言語で連想配列をコピーしたいのですが、 int[char[]] x; int[char[]] y; for(char[] a,int b;x) { y[a]=b; } などと要素を一つ一つコピーするしかないのでしょうか。 もっと効率のよいコピーはないのでしょうか。
- 締切済み
- C・C++・C#
- 配列のコピーをして値を返したいが
//配列のコピーをして値を返したい import java.util.*; public class Test7_22 { static int[] arrayClone(int[] a){ int[] b = new int[a.length]; for(int i =0;i>a.length;i++) b[i] = a[i];//ここで代入されるはず return b; } public static void main(String[]args){ Scanner std = new Scanner(System.in); System.out.print("要素数:"); int n = std.nextInt(); int[] a = new int[n]; for(int i=0;i<n;i++){ System.out.print("a["+i+"]="); a[i] = std.nextInt(); } int[] x = arrayClone(a); for(int i=0;i<a.length;i++) System.out.println("x["+i+"]="+x[i]); } } //コンパイルするとb[0] = 0になる
- ベストアンサー
- Java
- これは試験にでるといわれたのでどなたおしえてもらえませんか
このソースファイル(Ex2DTest.java)は2次元の参照型配列を用いるプログラムである。3×3の2次元の参照型配列を用いることができるように完成しなさい class SamData{ int x,y,z; void print(){ System.out.println(x+y+z); } } class Ex2DTest{ public static void main (String[] args){ //配列の宣言とインスタンス化 for(int i=0; i<array2d.length;i++){ for(int i=0;i<array2d[i].length;i++){ array2d[i][j].x=i*j; array2d[i][j].y=i+j; array2d[i][j].z=i-j; array2d[i][j].print(); } } } } 分かる方いらっしゃれば是非教えてください! よろしくおねがいします。
- ベストアンサー
- Java
- 多元配列について(ANSI C)
動的多元配列で、 Voidポインタに、多種の型がぶら下がった多元配列を作り、 読み書きをしたいのですがどのようにしたらよろしいでしょうか。 具体的には、 x[0][1]は、intで「2」が入っている x[0][4]は、intで「9」が入っている x[1][2]は、charでしかも文字列の配列で「goo」が入っている x[1][5]は、charでしかも文字列の配列で「教えて」が入っている x[0]は、int型の配列。X[1]は、文字列型の配列。 というようなものです。 一応ソースは作ってみたのですが、int型では問題なくいくのですが、 文字列は、コンパイルはできますが、実行すると予期せぬことが起きます。 #include <stdio.h> #include <stdlib.h> #include <string.h> int main (void) { void **topPointa; int * iDataInput; int * iDataOutput ; char * chDataInput; char * chDataInput2; char * chDataOutput1 ; // ポインタアドレス用のメモリ確保 topPointa = (void *) calloc (10 , sizeof(void *)); if(topPointa == NULL) { printf("メモリが確保できません\n"); exit(-1); } //int配列のメモリ確保 iDataInput = (int * ) calloc (10 , sizeof(int)); if(iDataInput == NULL) { printf("メモリが確保できません\n"); exit(-1); } iDataInput[0] = 3 ; iDataInput[1] = 4 ; topPointa[0] = (void * ) &iDataInput; //int配列の取り出し iDataOutput = *(int *) topPointa[0]; printf( "int: %d\n", iDataOutput[0] ); printf( "int: %d\n", iDataOutput[1] ); //char配列 のメモリ確保 chDataInput = (char * ) calloc (10 , sizeof(char *)); if(chDataInput == NULL) { printf("メモリが確保できません\n"); exit(-1); } chDataInput2 = (char * ) calloc (10 , sizeof(char)); if(chDataInput2 == NULL) { printf("メモリが確保できません\n"); exit(-1); } strcpy(chDataInput2 , "hoe"); chDataInput[0] = &chDataInput2; topPointa[1] = (void * ) &chDataInput; //char配列の取り出し chDataOutput1 = *(char *) topPointa[1]; printf( "char: %S\n", chDataOutput1[0] ); free(iDataInput); free(chDataInput); free(chDataInput2); return 0; } 言語は、C言語ANCI Cでお願いします。 以上。よろしくお願いします。
- ベストアンサー
- C・C++・C#
- StreamReaderで読み込んだテキストの行数
テキストファイルを読み込んで行数文のクラスの配列を宣言したいと思っているのですが、 Wireless_unit Wireless_unit[32]; array<Wireless_unit_str^>^ Wireless_ID_str02 = gcnew array<Wireless_unit_str^>(32); 行数がわからないので、StreamReader^で宣言したreadで知る方法はありませんでしょうか? 下のような関数でファイルを読み込んでいます。 private: bool LoadCsvFile02( String^ path ) { StreamReader^ reader = gcnew StreamReader( path, System::Text::Encoding::GetEncoding("shift-jis")); ----(中略)------------------------------------------------
- ベストアンサー
- C・C++・C#
- C++でのtxtファイル読み込みについて
こんにちは。 C++でのtxtファイル読み込みについて質問させていただきます。 下記のようなコードを使ってtxtファイルを読み込もうとしています。 private: System::Void toolStripButton2_Click(System::Object^ sender, System::EventArgs^ e) { array<int>^ x=gcnew array<int>(103*300); array<int>^ y=gcnew array<int>(103*300); int num=int::Parse(numericUpDown4->Text); String^ fileName="outputx"+ num.ToString() +".txt"; String^ string1; StreamReader^ sreader1; StreamReader^ din = File::OpenText(fileName); array<String^>^ sub_string; //指定したファイル名でStreamReaderを設定する try{ sreader1=gcnew StreamReader(fileName); }catch(Exception^ ex){ MessageBox::Show("!"); return; } //x[i]の読み込み String^ str; int count = 0; while ((str = din->ReadLine()) != nullptr) { string1=sreader1->ReadLine(); //StreamReaderに1行読み込む sub_string=string1->Split(' '); //コンマで分割する x[count]=Convert::ToInt32(sub_string[1]); y[count]=Convert::ToInt32(sub_string[2]); count++; } Bitmap^ bmap_dst=gcnew Bitmap(104,301); for(int j=0;j<301;j++) for(int i=0;i<104;i++){ bmap_dst->SetPixel(i,j,Color::FromArgb(255,255,255));} for(int k=0;k<count;k++){ bmap_dst->SetPixel(x[k],y[k],Color::FromArgb(0,0,0));} pictureBox1->Image = bmap_dst; pictureBox2->Image = bmap_dst; //y座標 fileName="outputy"+ num.ToString() +".txt"; String^ string2; StreamReader^ sreader2; din = File::OpenText(fileName); array<String^>^ sub_string2; //指定したファイル名でStreamReaderを設定する try{ sreader2=gcnew StreamReader(fileName); }catch(Exception^ ex){ MessageBox::Show("!"); return; } //x[i]の読み込み String^ str2; count = 0; while ((str2 = din->ReadLine()) != nullptr) { string2=sreader2->ReadLine(); //StreamReaderに1行読み込む sub_string2=string2->Split(' '); //コンマで分割する x[count]=Convert::ToInt32(sub_string2[1]); y[count]=Convert::ToInt32(sub_string2[2]); count++; } Bitmap^ bmap_dst2=gcnew Bitmap(104,301); for(int j=0;j<301;j++) for(int i=0;i<104;i++){ bmap_dst2->SetPixel(i,j,Color::FromArgb(255,255,255));} for(int k=0;k<count;k++){ bmap_dst2->SetPixel(x[k],y[k],Color::FromArgb(0,0,0));} pictureBox3->Image = bmap_dst2; pictureBox4->Image = bmap_dst2; } また、読み込むtxtファイルは下記のようなものです。(長いので途中部分のみ) 1 287 1 288 2 107 2 108 2 109 2 110 これをビルドすると”入力文字列の形式が正しくありません”と出てしまいます。 また、下記のようなtxtファイルだと問題なく読み込むことができます。 9 164 9 165 9 166 10 151 10 152 10 153 10 154 プログラミングのどこがいけないのでしょうか? 説明不足かと思いますが、ご回答よろしくおねがいします。
- ベストアンサー
- C・C++・C#
- VC++2010で配列に文字列を使用する方法
array<String^,3>^ myMat = gcnew array<String^,3>(15,97,3338); このようにするとビルド出来るのですが、 array<String^,3>^ myMat = gcnew array<String^,3>("あ","か","さ"); とすると 1>d:\documents and settings\****\my documents\visual studio 2010\projects\****\Form1.h(220): error C2440: '初期化中' : 'const char [3]' から 'int' に変換できません。 1> この変換が可能なコンテキストはありません。 とエラーが出てしまいます どのようにすれば良いのでしょうか?
- 締切済み
- C・C++・C#
補足
遅くなって申し訳ありません; 回答ありがとうございました! hoge.txtの内容は以下のような感じです。 2547379780 6972206030 7920373017 実際のものとは違いますが、このように数値が並んでいます。 この例ではX=10,Y=3というように、XとYはファイルごとに成分数が違います。 このファイル内容をInt型の配列に1文字ずつ格納して、他のCのプログラムで参照できるようにしたいのです。 ファイル内容によって成分数を変えたくて、このような混在したコードを使おうと思った次第です; よろしくお願いします。