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

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

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

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

1222閲覧

外部ファイルの値をハンドルで操作する方法(アルゴリズム)

hiru.jp

総合スコア11

C

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/04/14 14:46

編集2021/04/14 14:55

C++言語を勉強しています。
メインファイルから外部ファイルの値をハンドルで操作する方法が知りたいです。
例えば下のソースコードではMV1LoadModel()関数で取得した戻り値(モデルハンドル)を使用して、MV1DrawModel()関数でモデルを描画しています。これはおそらくMV1LoadModel()でMV1ファイルのデータを構造体に確保し、何らかの方法でそれを静的化し、
MV1DrawModel()関数で引数として受け取ったモデルハンドルを使用し、何らかの方法でMV1LoadModel()で取得した構造体のデータと合致させ使用しているのだと考えたのですがどうでしょうか?

下のソールコードのように、メインファイル内でハンドルのみで描画したり、値を変えたりという操作をしたいのですが、exturnやネットで調べた方法などを試してもうまくいきませんでした。
どのようにハンドルを使用し、外部ファイルの値とリンク?合致させているのでしょうか?

下のソースコードの原理やメインファイルから外部ファイルの値をハンドルと合致させる方法や参考サイトなど、ご存じの方がいらっしゃいましたら、ご教授していただければ幸いです。<(_ _)>

参考資料が見つからずC言語の質問でDXライブラリのコードを持ってきてしまってすみません。<(_ _)>
DXライブラリ

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

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

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

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

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

guest

回答1

0

ベストアンサー

...たとえばこんなカンジかしら。コタエになってますか?

C++

1// foo.cpp 2 3#include <iostream> 4#include <vector> 5#include <fstream> 6#include <string> 7 8// 利用者には隠しておく(ここから) 9namespace detail { 10 class Module { 11 std::ifstream stream_; 12 public: 13 Module(const std::string& path) : stream_(path) {} 14 std::string get() { std::string line; std::getline(stream_, line); return line; } 15 }; 16 17 std::vector<Module> mods; // Module集合 18} 19// 利用者には隠しておく(ここまで) 20 21/* Moduleを生成し modsに追加。*/ 22int LoadModule(const std::string& path) { 23 int handle = detail::mods.size(); 24 detail::mods.emplace_back(path); 25 return handle; 26} 27 28/* Module::get() をcallし、ファイルから一行読んで返す */ 29std::string GetLine(int handle) { 30 return detail::mods.at(handle).get(); 31} 32 33int main(){ 34 int handle = LoadModule("foo.cpp"); 35 for ( int i = 0; i < 4; ++i ) { 36 std::string line = GetLine(handle); 37 std::cout << line << std::endl; 38 } 39}

[追記] コンパイル単位を分けてみた:

C++

1// Module.h 2#pragma once 3 4#include <string> 5 6int LoadModule(const std::string& path); 7std::string GetLine(int handle);

C++

1// Module.cpp 2#include "Module.h" 3#include <vector> 4#include <fstream> 5 6namespace { 7 class Module { 8 std::ifstream stream_; 9 public: 10 Module(const std::string& path) : stream_(path) {} 11 std::string get() { std::string line; std::getline(stream_, line); return line; } 12 }; 13 14 std::vector<Module> mods; // Module集合 15} 16 17/* Moduleを生成し modsに追加。*/ 18int LoadModule(const std::string& path) { 19 int handle = mods.size(); 20 mods.emplace_back(path); 21 return handle; 22} 23 24/* Module::get() をcallする */ 25std::string GetLine(int handle) { 26 return mods.at(handle).get(); 27}

C++

1// foo.cpp 2#include <iostream> 3#include "Module.h" 4 5int main(){ 6 int handle = LoadModule("foo.cpp"); 7 for ( int i = 0; i < 4; ++i ) { 8 std::string line = GetLine(handle); 9 std::cout << line << std::endl; 10 } 11}

投稿2021/04/14 23:39

編集2021/04/15 19:49
episteme

総合スコア16612

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

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

hiru.jp

2021/04/15 10:32

epistemeさんご返答ありがとうございます(^^)/ main()を拝見しましたが、私が求めていたそれでした。 namespaseでこんなことができるとは驚きました。 namespaseを使用し自作する方法の知識があまりありませんが、頑張って勉強してepistemeさんがご享受してくださった方法を早く試してみたいです。 とても読みやすいソースコードで分かりやすくて、とてもためになりました。 ありがとうございました。(人''▽`)
episteme

2021/04/15 11:25

あ、namespace に隠す機能はありませんよ。
hiru.jp

2021/04/15 14:09

そうなんですか? 私の中ではこんな感じなのかなぁ~というものがあるんですが、 まだよくわからないので、epistemeさんが提供してくれたソースコードを参考に調べて頑張ってみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問