質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

3回答

268閲覧

地図表示プログラムの書き換えをしたい

key00

総合スコア10

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2019/04/04 09:10

前提・実現したいこと

現在地図表示のプログラムを作成しています。
C言語で書かれているプログラムをC#に書き換えようとしているのですが、C#は初めてなので、どのように書き換えたらいいかわかりません。
ファイルは下記サイトなどのDMファイルを用いています。
http://www.gsi.go.jp/kiban/

発生している問題

書き換え方が分からないため、教えていただきたいです。

該当のソースコード

C

1#include<stdio.h> 2#include<stdlib.h> 3#include<string.h> 4 5#include "graphics.h" 6 7// 地図サイズは 2000m × 1500m 8#define WINDOW_WIDTH 1000 9#define WINDOW_HEIGHT 750 10 11#define MAXLINE 100 12#define FIELD_SIZE 7 13 14#define MAXENTITY 60000 15#define MAXPOINT 300000 16 17typedef struct entity { 18 int shape; //種類 19 int type; //分類 20 int start; //座標データ 21 int n; //座標データ数 22}ENTITY; 23 24// 要素データの記録 25int geIndex = 0; 26ENTITY gEntity[MAXENTITY]; 27// 座標データの記録 28int gpIndex = 0; 29POINT gPoint[MAXPOINT]; 30 31void display(void) 32{ 33 int i; 34 35 for (i = 0; i < geIndex; i++) //記録されているすべての要素データ 36 { 37 if (gEntity[i].shape == 1) //面 38 { 39 glColor3d(0.5, 0.0, 0.0); 40 drawPolygon(gPoint[gEntity[i].start], gEntity[i].n); 41 } 42 else //線 43 { 44 glColor3d(0.2, 0.2, 0.2); 45 drawLines(&gPoint[gEntity[i].start], gEntity[i].n); 46 } 47 } 48} 49 50int main(int argc, char *argv[]) 51{ 52 FILE *fp; 53 char buff[MAXLINE]; 54 char str[10]; 55 int i, n, nn; 56 57 if (fopen_s(&fp, argv[1], "r") == NULL) 58 { 59 fprintf(stderr, " Error: File Open - %s\n", argv[1]); 60 exit(1); 61 } 62 63 while (fgets(buff, MAXLINE, fp) != NULL) 64 { 65 if (buff[0] != 'E') //要素データ以外は読み飛ばす 66 continue; 67 68 switch (buff[1]) 69 { 70 case '1': //面と線のみを処理 71 case '2': 72 73 //要素データの処理 74 gEntity[geIndex].shape = buff[1] - '0'; 75 76 strncpy(str, &buff[2], 4); 77 str[4] = '\0'; 78 gEntity[geIndex].type = atoi(str); 79 80 gEntity[geIndex].start = gpIndex; 81 82 strncpy(str, &buff[27], 4); 83 str[4] = '\0 '; 84 gEntity[geIndex].n = atoi(str); 85 86 n = gEntity[geIndex].n; 87 88 while (n > 0) 89 { 90 nn = n; 91 if (nn > 6) 92 nn = 6; //行のデータ数を最大の個以下に制限16 93 n -= nn; 94 95 fgets(buff, MAXLINE, fp); 96 97 for (i = 0; i < nn; i++) 98 { 99 // 座標の取得X 100 strncpy(str, &buff[0 + (FIELD_SIZE)* i * 2], FIELD_SIZE); 101 str[FIELD_SIZE] = '\0'; 102 gPoint[gpIndex].y = atoi(str) / 100 / 2; // X −> Y 103 104 // 座標の取得Y 105 strncpy(str, &buff[FIELD_SIZE + FIELD_SIZE * i * 2], FIELD_SIZE); 106 str[FIELD_SIZE] = '\0'; 107 gPoint[gpIndex].x = atoi(str) / 100 / 2; // Y −> X 108 109 if (++gpIndex >= MAXPOINT)// 座標データ配列のオーバーフロー確認 110 { 111 fprintf(stderr, "ERROR: Point Array Overflow !\n "); 112 exit(2); 113 } 114 } 115 } 116 117 if (++geIndex >= MAXENTITY)// 要素データ配列のオーバーフロー確認 118 { 119 fprintf(stderr, "ERROR: Entity Array Overflow !\n"); 120 exit(3); 121 } 122 123 break; 124 default: // 面、線以外は処理しない 125 continue; 126 } 127 } 128 fclose(fp); 129 130 initGraphics(argc, argv, WINDOW_WIDTH, WINDOW_HEIGHT); 131 glutMainLoop(); 132 133 return 0; 134} 135

補足情報(FW/ツールのバージョンなど)

Visual Studio 2017
Windows フォームアプリケーション(.NET Framework)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

"graphics.h"の内容も分かりませんし、グラフィックは得意じゃないので、とりあえずになっちゃいますが、コンソールでDMファイルのパース部分(mainのinitGraphicsの手前まで)

こういう縦に続いてくるデータはパースがしんどいですね。完全に自作でいくしかない。途中で色々あって思ったんですが座標値が"0"、"0"であるとき、必ず計測データが終端している、という暗黙の前提を置いています。が、仕様書PDFでは、そこが読み取れませんでした。

csharp

1void Main() 2{ 3 var es = System.IO.File.ReadLines("06oc5708.dm"); 4 //https://www.city.toyonaka.osaka.jp/machi/doro/daityou/digitalmap/sanple.htmlを借用(国土地理院はユーザ登録を求められたため 5 var seq = 0; 6 var ListEnt = new List<Entity>(); 7 Entity temp = null; 8 foreach(var e in es) 9 { 10 if(!e.StartsWith("E1") && !e.StartsWith("E2") && seq == 0) { continue; } 11 if(seq == 0) 12 { 13 temp = Entity.Parse(e); 14 ListEnt.Add(temp); 15 seq = temp.N; 16 continue; 17 } 18 foreach(var p in Point.Parse(e)) 19 { 20 temp.Points.Add(p); 21 seq--; 22 } 23 } 24} 25 26class Entity 27{ 28 public static Entity Parse(string line) 29 { 30 var shape = (int)char.GetNumericValue(line[1]); 31 var type = int.Parse(line.Substring(2, 4)); 32 var n = int.Parse(line.Substring(27, 4)); 33 return new Entity(shape,type,n); 34 } 35 public int Shape {get;set;} = 0; 36 public int Type {get;set;} = 0; 37 public int N {get;set;} = 0; 38 public List<Point> Points {get;set;} = new List<Point>(); 39 public Entity(int shape, int type, int n) 40 { 41 Shape = shape; Type = type; N = n; 42 } 43} 44class Point 45{ 46 public static IEnumerable<Point> Parse(string line) 47 { 48 var pos = 0; 49 var unit = 7; 50 while(pos < line.Length) 51 { 52 var strY = line.Substring(pos, unit).Trim(); 53 pos += unit; 54 var strX = line.Substring(pos, unit).Trim(); 55 pos += unit; 56 if(strY == "0" && strX == "0") { break; } 57 var y = int.Parse(strY) / 200.0; 58 var x = int.Parse(strX) / 200.0; 59 yield return new Point(x, y); 60 } 61 } 62 public double X {get;set;} = 0.0; 63 public double Y {get;set;} = 0.0; 64 public Point(double x, double y) 65 { 66 X = x; Y = y; 67 } 68}

余談ですが、C#が分からないのに、なぜC#にしようと思ったのか疑問しかないです。
また、Cが分かるなら、やってることの解説をお願いします(私はCは分からないので。もちろん回答者様の中にはCもC#も分かる人がいらっしゃいますが、リーチする範囲を広くすることは質問者様にとってメリットとなり得るはず)

投稿2019/04/04 14:52

papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

既に回答がついていますが、
C言語から、C# は厳しいです。構文の類似度は、ごまかせる範囲と思いますが、
文字列の扱いと、グラフィックスは、まったく別物です。

提示のコードを見る限り、文字列は、単なるバイト列と扱っているので、そういう理解で移植するする必要があります。 (ちょっと頑張れば、多分 OK)
グラフィックスは、C言語に標準なんてなかったと思うので、使っている方法を理解し、C# (正確には、.NET)のやり方を理解する必要があります。
必要な機能だけ、理解すれば、良いですが、元のCコードが何をしているか理解できていないと、何が必要か判断するのは、難しいと思います。

それをここに書ける範囲で説明できる人は多分、いないと思います。

まずは、簡単な C#入門から始めてはどうでしょうか。

投稿2019/04/04 14:26

pepperleaf

総合スコア6383

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

C#は初めてなので

であれば、書き換え想像がつくくらいまで、入門レベルから順次技術を身に着けていくしかないのではないでしょうか。
別言語の書き換えって、例え近い存在であってもおいそれと簡単に手を出せるものではありません。

同じ言語の別フレームワークへの乗せかえでさえ調査に何ヶ月もかけることだってあります。

代替の機能があるかないか、なければ相応の機能を自作しなければいけない、
その前に「そもそも乗せかえが可能なのか」というところから検討していく必要があります。
特に一度出来上がったものであれば尚更ですね。

と、なると、元の言語と同程度まで書き換え言語ができるようになっていないと難しいわけです。

まずはC#に入門するところから始めましょう。

投稿2019/04/04 12:52

m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問