[ 前へ | 目次 | 次へ ]
Now Loading...
ダウンロード
PC (※スマートフォンでは動きません) でダウンロードし、ZIPファイルを右クリックメニューから展開して、できたフォルダ内の「 VCSSL.bat(バッチファイル) 」をダブルクリックすると起動します。 Linux等では「 VCSSL.jar 」をコマンド実行してください。
» 詳しい使用方法や、エラーで展開できない際の対応方法などはこちら

C言語のプログラムをGUIで包む(3: アプリ風の画面を作る編)

VCSSLで制作したGUI画面から、C言語のプログラムを呼び出して入力値を渡し、結果を画面に表示します。

前回 も処理内容は同じでしたが、 値の入力方法と表示方法は、簡易的なものでした。

今回はその発展として、きちんとGUIのアプリ画面を作って、その上で値の入力・プログラム実行・結果の表示をできるようにしたバージョンです。

使用方法

ダウンロードと展開(解凍)

まず、PC(スマホは未対応)で上の画面の「 ダウンロード 」ボタンを押してください。 するとZIP形式で圧縮されたファイルがダウンロードされます。

Windows をご使用の方は、ここでまずZIPファイルを右クリックし、「プロパティ」を選んで開かれる画面で、 下の方にあるセキュリティ項目の「許可する」にチェックを入れて「OK」で閉じてください。 これを行わないと、ZIP展開やソフト起動時に、警告メッセージが出て展開完了/起動できない場合があります。

その後、ZIPファイルを右クリックして「すべて展開」や「ここに展開」などで展開(解凍)してください。 展開が成功すると、ZIPファイルと同じ名前のフォルダができ、その中にZIPファイルの中身が入っています。

» 展開がエラーで止まってしまう場合や、ファイル名が文字化けしてしまう場合は…

プログラムの起動

Windows をご使用の場合

上記でZIPファイルを展開したフォルダ内にある、以下のバッチファイルをダブルクリック実行してください:

VCSSL__ダブルクリックでプログラム実行.bat

もしプログラムを書き変えながら使いたい場合は、代わりに「 VCSSL_Editor__プログラム編集はこちら.bat 」を実行してください。

正常に起動できると、初回のみ、Java実行環境を入手するか等を尋ねられるので、適時答えて済ませると、プログラムが起動します。 2回目以降はすぐに起動します。

» うまく起動できずにエラーになってしまう場合は…

Linux 等をご使用の場合

ZIPファイルを展開したフォルダ内へコマンドライン端末で cd して、以下の通り入力して実行してください:

java -jar VCSSL.jar
(プログラムの内容を書き変えながら使いたい場合は、代わりに VCSSL_Editor.jar を実行)

» javaコマンドが使用できない等のエラーが表示される場合は…

起動後

このVCSSLプログラムを実行すると、以下のようなアプリ風の画面(VCSSLのGUI機能を用いて制作されています)が表示されます:

画面上部の3つの入力欄に、C言語プログラムに渡すパラメータ値を入力します。

そして「実行」ボタンを押すと、内部でC言語プログラム「program.exe」が呼び出されて実行されます。

その際、初めて実行する時は以下のようなセキュリティ警告が表示されるので、「はい」を押して続行してください。

※ 今回扱う「外部プログラムの実行」処理は、VCSSLのセキュリティの監視範囲の外側で動作するため、何でも行えてしまいます。それを認めますか?という意味です。信頼できないプログラムでは安易に「はい」は押さないようにしましょう。

なお、このメッセージは起動後の初回実行時に毎回出ますが、それがうっとうしい場合は、VCSSLの画面の上から「セキュリティ」>「システムコマンドの実行を許可」にチェックを入れると出なくなります。

続行すると、画面下部の「出力内容」エリアに、C言語プログラムが標準出力に吐いた内容が表示されます:

-- C言語プログラムからの出力内容 --
引数[0]の内容: C:\...(略)...\program.exe
引数[1]の内容: aaa
引数[2]の内容: bbbb
引数[3]の内容: ccccc

また、「エラー内容」エリアには、C言語プログラムが標準エラー出力に吐いた内容が表示されます。サンプルでは、あえてダミーのエラーメッセージを吐くようにしています:

これはダミーのエラーメッセージです

操作方法や動作については、以上の通りです。

program.exe の元になっている、C言語のソースコード「program.c」も同梱されているので、書き換えて&再コンパイルして色々試してみてくださいね!

題材解説

VCSSLのような簡易的なスクリプト言語のプログラムから、C言語のような「別の言語」で書いたプログラムを呼び出したい、といった場面はよくあります。

典型例としては、ちょっとしたGUIツールを作る際、

  • ユーザーが操作する画面の部分を、スクリプト言語で書く
  • 複雑で重い内部処理などを、C言語などで書く

といった場合が挙げられます。

上のようなテーマで、前々回からの連載企画として、「C言語プログラムを包む、VCSSL製のGUIアプリ」の実装について解説しています。これまでの流れは:

  • 第1回である前々回 は、単に「Hello, World!」を表示するだけのC言語プログラムを、VCSSLから呼んで出力を拾ってみました。
  • 第2回である前回 は、上記を少し改修し、VCSSL側からC言語側へ、パラメータ値を渡しつつ実行する例を扱いました。

そして第3回である今回は、第2回の内容をさらに発展させ、いよいよアプリ風のGUI画面を作ってかぶせる、といった拡張を行いました。

今回のコードは、非常によくある

処理のパラメータ値を、コマンドライン引数で受け取るC言語プログラム

に対して、幅広く適用可能です。

パラメータの個数などをカスタムする必要はありますが、改造・流用は自由なので、ぜひ色々と使ってみてくださいね!

そういった改造・流用の際、今ページの最後付近にある

のセクションもぜひご参考にしてみてください。最近はAIがだいぶサポートしてくれます。

コード解説

メインのプログラムは、VCSSLで書かれています。VCSSLはC言語系のシンプルな文法を採用しているので、C言語ユーザーの方なら普通に読み書きできると思います。

また、今回のコードは、前回のコードの応用編のような内容です。お急ぎでなければ、先に前回の記事を一読しておくとスムーズです:

加えて、今回はVCSSLのGUI機能を用いた開発となっています。この機能については、以下に公式ガイドがありますので、必要に応じてご参照ください:

それではコード解説に入りましょう!

コード全体

まずVCSSLのコードを見てみましょう。以下がコード内容の全体です:

- GUIWrapperWindow.vcssl -

coding UTF-8;

// 必要なライブラリの読み込み
import GUI;
import File;
import Process;


// 画面部品のGUIコンポーネントIDを格納するグローバル変数を、まとめて宣言
int window = NULL;       // ウィンドウ
int aField = NULL;       // 値Aの入力欄
int aLabel = NULL;       // 値Aの入力欄のラベル
int bField = NULL;       // 値Bの入力欄
int bLabel = NULL;       // 値Bの入力欄のラベル
int cField = NULL;       // 値Cの入力欄
int cLabel = NULL;       // 値Cの入力欄のラベル
int runButton   = NULL;  // 実行ボタン
int outputArea  = NULL;  // 出力内容の表示欄
int outputLabel = NULL;  // 出力内容の表示欄のラベル
int errorArea   = NULL;  // エラー内容の表示欄
int errorLabel  = NULL;  // エラー内容の表示欄のラベル


// プログラムの処理はここから始まる(エントリーポイント)
void main() {

	// GUI部品を組み立てて画面を作る
	initGUI();

	// VCSSLコンソール(黒い画面)は使わないので非表示化
	hide();

	// ※ 起動時の処理はこれだけで終わり。
	//    ボタンを押した際の処理は、onButtonClick イベントハンドラを起点に始まり、
	//    本コードの最後の方にある executeProgram() 関数が実行される。
}


// GUI部品を組み立てて画面を作る関数
void initGUI() {

	// ウィンドウを作る
	// ※ 引数は「左上端のX, Y, 幅, 高さ, 画面タイトル」
	window = newWindow(0, 0, 540, 530, "GUI Wrapper Window");

	// 値Aの入力欄とラベルを作って配置
	// ※ 引数は「左上端のX, Y, 幅, 高さ, ラベル値 or デフォルト値」
	aLabel = newTextLabel(10, 10, 50, 30, "値A:");
	aField = newTextField(60, 10, 450, 30, "aaa");
	mountComponent(aLabel, window);
	mountComponent(aField, window);

	// 値Bの入力欄とラベルを作って配置
	bLabel = newTextLabel(10, 50, 50, 30, "値B:");
	bField = newTextField(60, 50, 450, 30, "bbbb");
	mountComponent(bLabel, window);
	mountComponent(bField, window);

	// 値Cの入力欄とラベルを作って配置
	cLabel = newTextLabel(10, 90, 50, 30, "値C:");
	cField = newTextField(60, 90, 450, 30, "ccccc");
	mountComponent(cLabel, window);
	mountComponent(cField, window);

	// 実行ボタンを作って配置
	runButton = newButton(10, 130, 500, 50, "実行");
	mountComponent(runButton, window);

	// 出力内容の表示欄とラベルを作って配置
	outputArea = newTextArea(10, 220, 500, 150, "");
	outputLabel = newTextLabel(10, 200, 500, 20, "出力内容:");
	mountComponent(outputArea, window);
	mountComponent(outputLabel, window);

	// エラー内容の表示欄とラベルを作って配置
	errorArea = newTextArea(10, 400, 500, 80, "");
	errorLabel = newTextLabel(10, 380, 500, 20, "エラー内容:");
	mountComponent(errorArea, window);
	mountComponent(errorLabel, window);

	// 画面の再描画
	paintComponent(window);
}


// ボタンが押された時に呼ばれるイベントハンドラ関数
void onButtonClick(int id, string text) {

	// 押されたのが実行ボタンなら、プログラムを実行
	if (id == runButton) {
		executeExternalProgram();
	}
	
	// ※ 他にもボタンがある場合、上のように if 文で判定して処理する
}


// 画面に入力されてる値をパラメータとして、C言語製の外部プログラム「program.exe」を実行する関数
void executeExternalProgram() {

	// 実行するC言語プログラムファイルの絶対パスを取得
	string programPath = getFilePath("program.exe");

	// C言語プログラムを起動する際の、コマンド内容を格納する配列を用意
	string commandWords[4];

	// 最初の要素は、実行するプログラムの絶対パスを詰める
	commandWords[0] = programPath;

	// それ以降の要素は、プログラムに渡すパラメータ値であるため、画面から取得
	commandWords[1] = getComponentText(aField);  // 値Aの入力値
	commandWords[2] = getComponentText(bField);  // 値Bの入力値
	commandWords[3] = getComponentText(cField);  // 値Cの入力値

	// プログラムを実行可能な状態に用意する(ここで上記で用意したコマンド内容を渡す)
	int processID = newProcess(commandWords);

	// 日本語の文字化けを防ぐため、文字コードを指定
	// (逆に文字化けしてしまう場合は、"UTF-8" などを指定する)
	setProcessInputEncoding(processID, "CP932");
	setProcessOutputEncoding(processID, "CP932");
	setProcessErrorEncoding(processID, "CP932");

	// プログラムを実行し、終了を待機する
	startProcess(processID);
	waitForProcess(processID);

	// プログラムの出力内容を取得し、画面に表示
	string outputContent = getProcessOutput(processID);
	setComponentText(outputArea, outputContent);

	// プログラムのエラー内容を取得し、画面に表示
	string errorContent = getProcessError(processID);
	setComponentText(errorArea, errorContent);
}


// ウィンドウが閉じられた時に呼ばれるイベントハンドラ関数
void onWindowClose(int id) {

	// このVCSSLプログラムの実行を終了する
	exit();
}
GUIWrapperWindow.vcssl

ところで、このコードは、内部でC言語製のサンプルプログラム「program.exe」(Windows用にコンパイル済み)を呼び出して実行します。こちらのソースコードは以下の通りです:

- program.c -

#include 

// 以下の引数 argv に、VCSSL側からの入力値が渡される
// ※ argv[0] にはプログラムの名前やパスが格納されているが、それはC言語側の仕様
int main(int argc, char *argv[]) {

	printf("-- C言語プログラムからの出力内容 --\n");

	// 引数を全て標準出力に表示する
	for (size_t iarg=0; iarg<argc; iarg++) {
		printf("引数[%zu]の内容: %s\n", iarg, argv[iarg]);
	}

    // ダミーのエラーメッセージを出力する
	fprintf(stderr, "これはダミーのエラーメッセージです");
}
program.c

このC言語製のプログラムは、直接実行すると、main 関数に渡された argv の内容を、そのまま出力します。

例えば、以下のようにコマンドラインで実行したとしましょう:

program.exe aaa bbbb ccccc

この場合の出力内容は以下の通りです:

-- C言語プログラムからの出力内容 --
argv[0]の内容: C:\(...略...)\program.exe
argv[1]の内容: aaa
argv[2]の内容: bbbb
argv[3]の内容: ccccc

実用上の意味はないプログラムですが、VCSSLからC言語プログラムに値を渡し、きちんと受け取れたか確認する という点では便利です。つまり、今回はあくまでもそういうサンプルです。

手元環境できちんと動く事を確認できたら、ぜひ意味のあるC言語プログラムに差し替え or 書き換えして、気軽に改造・流用してみてください。

ライブラリのインポート

それでは、VCSSLのコードに戻り、先頭からピックアップしながら呼んでいきましょう。

まずは先頭で、このコードが文字コード「UTF-8」で書かれている事を宣言し(誤読対策)、続いて必要なライブラリを読み込んでいます:


coding UTF-8;

// 必要なライブラリの読み込み
import GUI;
import File;
import Process;
import.txt

「GUI」は、今回の画面を作るのに必要な、GUI周りの機能を提供するライブラリです。

「File」は、ファイルパスの取得や変換などを行うライブラリです。今回は実行対象プログラムの絶対パスを取得するのに使用しています。

「Process」は、外部プログラムの実行や制御を行うためのライブラリです。

画面部品のID格納用のグローバル変数

次のパートを見てみましょう。ここでは、画面上に配置する、色々な部品の管理番号「GUIコンポーネントID」を格納する変数を宣言しています:


// 画面部品のGUIコンポーネントIDを格納するグローバル変数を、まとめて宣言
int window = NULL;       // ウィンドウ
int aField = NULL;       // 値Aの入力欄
int aLabel = NULL;       // 値Aの入力欄のラベル
int bField = NULL;       // 値Bの入力欄
int bLabel = NULL;       // 値Bの入力欄のラベル
int cField = NULL;       // 値Cの入力欄
int cLabel = NULL;       // 値Cの入力欄のラベル
int runButton   = NULL;  // 実行ボタン
int outputArea  = NULL;  // 出力内容の表示欄
int outputLabel = NULL;  // 出力内容の表示欄のラベル
int errorArea   = NULL;  // エラー内容の表示欄
int errorLabel  = NULL;  // エラー内容の表示欄のラベル
globalvar.txt

このIDは、すぐ後のパートで、部品を生成した際に発行されます。 その部品を配置したり、値を設定・取得する際に、このIDが必要となります。

プログラムの実行開始時に、画面を構築する処理

次です。

VCSSLでは、main 関数を宣言しておくと、プログラムの実行開始時に自動で呼び出されます。C言語と同じですね。

今回は、この main 関数を起点とする処理で、GUI部品を組み立てて画面を作っています。

といっても、そういった処理を main 関数内にベタ書きしてしまうと、拡張時に処理フローの見通しが悪くなります。そこで initGUI 関数に切り分けて、main 関数からはそれを呼ぶようにしています:


// プログラムの処理はここから始まる(エントリーポイント)
void main() {

	// GUI部品を組み立てて画面を作る
	initGUI();

	// ※ 起動時の処理はこれだけで終わり。
	//    ボタンを押した際の処理は、onButtonClick イベントハンドラを起点に始まり、
	//    本コードの最後の方にある executeProgram() 関数が実行される。
}


// GUI部品を組み立てて画面を作る関数
void initGUI() {

	// ウィンドウを作る
	// ※ 引数は「左上端のX, Y, 幅, 高さ, 画面タイトル」
	window = newWindow(0, 0, 540, 530, "GUI Wrapper Window");

	// 値Aの入力欄とラベルを作って配置
	// ※ 引数は「左上端のX, Y, 幅, 高さ, ラベル値 or デフォルト値」
	aLabel = newTextLabel(10, 10, 50, 30, "値A:");
	aField = newTextField(60, 10, 450, 30, "aaa");
	mountComponent(aLabel, window);
	mountComponent(aField, window);

	// 値Bの入力欄とラベルを作って配置
	bLabel = newTextLabel(10, 50, 50, 30, "値B:");
	bField = newTextField(60, 50, 450, 30, "bbbb");
	mountComponent(bLabel, window);
	mountComponent(bField, window);

	// 値Cの入力欄とラベルを作って配置
	cLabel = newTextLabel(10, 90, 50, 30, "値C:");
	cField = newTextField(60, 90, 450, 30, "ccccc");
	mountComponent(cLabel, window);
	mountComponent(cField, window);

	// 実行ボタンを作って配置
	runButton = newButton(10, 130, 500, 50, "実行");
	mountComponent(runButton, window);

	// 出力内容の表示欄とラベルを作って配置
	outputArea = newTextArea(10, 220, 500, 150, "");
	outputLabel = newTextLabel(10, 200, 500, 20, "出力内容:");
	mountComponent(outputArea, window);
	mountComponent(outputLabel, window);

	// エラー内容の表示欄とラベルを作って配置
	errorArea = newTextArea(10, 400, 500, 80, "");
	errorLabel = newTextLabel(10, 380, 500, 20, "エラー内容:");
	mountComponent(errorArea, window);
	mountComponent(errorLabel, window);

	// 画面の再描画
	paintComponent(window);
}
create.txt

画面構築を行う initGUI 関数内では、延々と new〜 関数で画面部品を作って配置していっていますね。

このあたりの詳しい解説は、公式ガイドの以下をご参照ください:

プログラム起動時に実行される、main 関数からの処理の流れは、ここで完了です。あとはユーザーが実行ボタンを押すまで、何も行われません。

ボタンが押された場合に反応する処理

さて、次は「ユーザーが実行ボタンを押した」際に発生する処理の流れに入っていきましょう。

VCSSLのGUI機能では、そのような画面操作のタイミングで、「イベントハンドラ関数」という関数が自動で実行される決まりになっています。

詳細は以下で解説しています:

今回のように「ユーザーがボタンを押した」タイミングで処理を行うには、onButtonClick 関数を宣言し、行いたい処理をコードとして記述します:


// ボタンが押された時に呼ばれるイベントハンドラ関数
void onButtonClick(int id, string text) {

	// 押されたのが実行ボタンなら、プログラムを実行
	if (id == runButton) {
		executeExternalProgram();
	}
	
	// ※ 他にもボタンがある場合、上のように if 文で判定して処理する
}
event.txt

今回はボタンは1個しかありませんが、複数ある場合、どのボタンを押しても上の onButtonClick 関数が実行されます。そして、引数 id に、押されたボタンのGUIコンポーネントIDが渡されます。

従って、上のように if 文でIDによって分岐し、それぞれのボタンに応じた処理を記述するのが、典型的なコードです。

今回の「実行」ボタンのIDはグローバル変数 runButton に控えてあるので、上のようなコードで、押されたら executeExternalProgram() 関数(※ すぐ下で解説)を呼び出すようにしています。

C言語のプログラムを呼んで実行する処理

続いて、上記のイベントハンドラから呼ばれる、C言語プログラムを実行する処理です。これは executeExternalProgram 関数として記述されています:


// 画面に入力されてる値をパラメータとして、C言語製の外部プログラム「program.exe」を実行する関数
void executeExternalProgram() {

	// 実行するC言語プログラムファイルの絶対パスを取得
	string programPath = getFilePath("program.exe");

	// C言語プログラムを起動する際の、コマンド内容を格納する配列を用意
	string commandWords[4];

	// 最初の要素は、実行するプログラムの絶対パスを詰める
	commandWords[0] = programPath;

	// それ以降の要素は、プログラムに渡すパラメータ値であるため、画面から取得
	commandWords[1] = getComponentText(aField);  // 値Aの入力値
	commandWords[2] = getComponentText(bField);  // 値Bの入力値
	commandWords[3] = getComponentText(cField);  // 値Cの入力値

	// プログラムを実行可能な状態に用意する(ここで上記で用意したコマンド内容を渡す)
	int processID = newProcess(commandWords);

	// 日本語の文字化けを防ぐため、文字コードを指定
	// (逆に文字化けしてしまう場合は、"UTF-8" などを指定する)
	setProcessInputEncoding(processID, "CP932");
	setProcessOutputEncoding(processID, "CP932");
	setProcessErrorEncoding(processID, "CP932");

	// プログラムを実行し、終了を待機する
	startProcess(processID);
	waitForProcess(processID);

	// プログラムの出力内容を取得し、画面に表示
	string outputContent = getProcessOutput(processID);
	setComponentText(outputArea, outputContent);

	// プログラムのエラー内容を取得し、画面に表示
	string errorContent = getProcessError(processID);
	setComponentText(errorArea, errorContent);
}
execute.txt

この関数のコードは、大半が、前回のコードを関数で包んだだけです。従って、詳しくは前回のコード解説をご参照ください:

今回が前回と異なるのは、

  • C言語プログラムに渡すパラメータ値を、画面上のテキストフィールドから取得している
    (※ 前回は input 関数でユーザーに尋ねていた)
  • C言語プログラムからの出力内容を、画面上のテキストエリアにセットしている
    (※ 前回は単純に println していた)

という点です。これはコードではそれぞれ:


	// それ以降の要素は、プログラムに渡すパラメータ値であるため、画面から取得
	commandWords[1] = getComponentText(aField);  // 値Aの入力値
	commandWords[2] = getComponentText(bField);  // 値Bの入力値
	commandWords[3] = getComponentText(cField);  // 値Cの入力値
}
input.txt

の部分と、


	// プログラムの出力内容を取得し、画面に表示
	string outputContent = getProcessOutput(processID);
	setComponentText(outputArea, outputContent);
output.txt

の部分となっています。

このように、GUI部品から値を取得・設定する操作は、以下で詳しく解説しています:

特に今回用いている setComponentText と getComponentText は、非常によく用います。

ウィンドウを閉じた時の終了処理

さて、今回のコードの最後です。

自前で構築したGUIのウィンドウが閉じられた時点で、VCSSLプログラムの実行を終了するように、イベントハンドラを定義しています:


// ウィンドウが閉じられた時に呼ばれるイベントハンドラ関数
void onWindowClose(int id) {

    // このVCSSLプログラムの実行を終了する
    exit();
}
close.txt

このように明示的にイベントハンドラで終了処理を実装しない限り、ウィンドウを閉じただけでは、VCSSLプログラムの実行は終了されません。

特に今回のように、VCSSLコンソールが表示されないようにしている場合は、上記のように自前で終了処理を実装しておかないと、タスクマネージャなどで落とすしかない、厄介なプログラムになってしまいます。

発展: 今回のようなテーマではAIを活用してみよう!

今回のコード内容の解説は以上で、これ以降はオマケです。

ChatGPT上で動作する、VCSSLの公式サポートAI「VCSSLアシスタント」

今回のコードでの initGUI 関数のように、「たくさんのGUI部品を生成して配置していく」という処理は、書いていて特に楽しくもなく、ひたすら面倒で退屈なものです。

そういった場合に、VCSSLの公式サポートAI「VCSSLアシスタント」を活用すると便利かもしれません:

VCSSLアシスタントはChatGPT上で動作するサービスなので、安心して使えます。

ただし、2026年3月現在、実用レベルの精度を出すには、ChatGPTの有料サービス「ChatGPT Plus」に登録してログインした状態で使う必要があります。無料アカウントだと、精度がぜんぜん出ません。

画面をゼロから作ってもらう

実際に、今回の initGUI 関数に相当する内容を、試しにAIに依頼してみましょう:

(依頼文)

以下のGUI構築コードを、initGUI関数として記述してください。 よろしくお願いします!

  • 画面上部に、「値A,B,C」の3つのテキストフィールドがある(ラベル付き)
  • その下に「実行」ボタンがある
  • その下に、「出力内容」を表示するテキストエリアがある(ラベル付き)
  • その下に、「エラー内容」を表示するテキストエリアがある(ラベル付き)

すると、AIが書いてくれたのは下記のコードです(※ モデルは GPT-5.2 Thinking を使用):

この initGUI 関数を呼び出して実行してみると、以下のような画面が構築されます:

少しレイアウトが間延びしていますが、まぁ使えるのは一応使えるといった感じですね。自分だけが使う即席ツールなら全然アリでしょう。

今回の画面を改造してもらう(入力値を増やす)

もう一つ、今回のコード全体を見せて、それを改造し、パラメータの数を5つに増やす という事をやってもらいましょう:

(依頼文)

以下のコードを改造して、値の入力値を3つから5つ(値A〜E)に増やしてください。
よろしくお願いします!

---

(ここに今回のコードを記載)

で、AIが書いてくれたのは下記のコードです(※ モデルは GPT-5.2 Thinking を使用):

実行してみると、一発でエラーなしで走り、以下の画面が立ち上がりました:

おぉ、今度はレイアウトも整っていますね! C言語プログラムの方も編集しつつ検証してみると、5つの入力値も、ちゃんと program.exe に渡せていました。

これはほぼ完璧で、人間が編集したのと同レベルの品質の結果が得られました。

このように、ある程度土台を作ったコードを渡して、それを改造してもらう、みたいなシーンでは結構うまくやってくれます。これは人間も同じですね。前提とするノリや空気みたいなものが読めるからでしょう。

その他、できる事と注意点など

以上のように、「GUI画面のコードを改造する」程度なら、VCSSLアシスタントさんは既に結構やってくれます。人間にとって面倒な部分なので、ぜひ活用してみてください。

他にも、VCSSLの全てのガイドを読めるので、質問にもかなり答えてくれます。ライブラリ仕様書も同様で、特定の関数の仕様などを聞いても、抜粋して教えてくれます。

ただ、難しく長いプログラムになると、やはりまだミスや混乱が生じます。単純なミスもあれば、そもそもVCSSLでは文法的におかしいコードを書く・存在しない機能を使う、等々です。

そのため、チェックや人力デバッグは、現状まだ必要です。日々少しずつ成長していってるので、現状の限界に留意しつつ、暖かい目で見守っていただけると嬉しいです。

さて、今回の内容はこれで以上です。次回は、標準入力を用いて、C言語のプログラムと対話的にやり取りするコードを解説します。

ライセンス

このVCSSL/Vnanoコード( 拡張子が「.vcssl」や「.vnano」のファイル )は実質的な著作権フリー(パブリックドメイン) である CC0 の状態で公開しています。 記事中にC言語/C++/Java言語などでのサンプルコードが掲載されいてる場合は、それらについても同様です。 そのままでのご利用はもちろん、改造や流用などもご自由に行ってください。

※ ただし、このコードの配布フォルダ内には、ダウンロード後すぐに実行できるように、 VCSSLの実行環境も同梱されており、そのライセンス文書は「 License 」フォルダ内に同梱されています (要約すると、商用・非商用問わず自由に使用できますが、使用の結果に対して開発元は一切の責任を負いません、といった具合の内容です)。 配布フォルダ内の各構成物の一覧やライセンスについては「 ReadMe_使用方法_必ずお読みください.txt 」をご参照ください。

※ Vnano の実行環境については、別途スクリプトエンジンのソースコードも一般公開しており、 何らかのソフトウェア内に組み込んでご利用いただく事も可能です。詳細はこちらをご参照ください。


この記事の著者

松井 文宏
[ RINEARN代表, 博士(理学), 応用情報技術者 ]
VCSSLやリニアングラフ3D、その他諸々を開発しています。ガイド類や記事も書いています。


スポンサーリンク



[ 前へ | 目次 | 次へ ]
C言語のプログラムをGUIで包む(3: アプリ風の画面を作る編)

VCSSLで制作したGUIの画面から、C言語のプログラムを呼び出して入力値を渡し、結果を画面に表示します。
C言語のプログラムをGUIで包む(2: 入力値をコマンド引数で渡す編)

VCSSLから、パラメータを引数で渡しつつ、C言語のプログラムを呼び出すサンプルです。
C言語のプログラムをGUIで包む(1: Hello World 編)

VCSSLから、C言語の「Hello, World」プログラムを呼び出し、結果を画面に表示します。
この階層の目次
RINEARN からのお知らせ
※ VCSSL は RINEARN が開発しています。

ExevalatorのVer.2.4をリリース—MCPをサポートし、AI用の計算ツールとしても使用可能に
2025-11-15 - 式計算ライブラリExevalatorのVer.2.4をリリースしました。今回から、AIとやり取りするためのプロトコルである「MCP」をサポートし、AI用の計算ツールとしても使用可能になりました!

Exevalatorの最新版Ver.2.3をリリース、新たにPythonで使用可能に
2025-11-04 - 式計算ライブラリExevalatorのVer.2.3をリリースしました。今回から、新たにPython製のプログラムでも使用可能になりました!AI用ツール開発需要などの背景も踏まえて、詳細をお知らせします。

Exevalatorをアップデート、エラーメッセージの日本語化が手軽に
2025-10-31 - 式計算ライブラリExevalatorのVer.2.2.2をリリースしました。今回から、エラーメッセージを手軽に日本語化できるようになりました。数件のバグ修正&微調整も作んでいます。詳細をお知らせします。

関数電卓RINPn(りんぷん)オンライン版の内部構造を解説
2025-10-22 - 先日登場した、関数電卓ソフトRINPn(りんぷん)のオンライン版の内部構造を解説します。オープンソースなので、自由に改造・流用して、自分だけのWeb電卓を作る事も可能!(かもしれない)

関数電卓RINPn(りんぷん)、どこでもすぐ使えるオンライン版が登場!
2025-10-21 - フリー関数電卓ソフトRINPn(りんぷん)に、Web上でどこでもすぐ使える「オンライン版」が新登場しました!PCだけでなく、スマホでも利用可能です。詳細をお知らせします!

VCSSLのサポートAIが登場!ただし実用品質にはChatGPT有料アカウント(Plus)での利用推奨
2025-08-19 - プログラミング言語VCSSLについての質問対応や、コーディング作業を手伝ってくれるAIさんが登場しました!使用までの流れや推奨事項を解説し、実際の回答例や生成コード例などもたくさん紹介します!

各ソフトやVCSSLの英語版ドキュメント整備がほぼ完了
2025-06-30 - RINEARNでは2年前から、AIの補助による英語版ドキュメントの大幅拡充計画を進めてきました。今回、主要ドキュメント&コンテンツの英訳がほぼ完了し、一応の目標水準に達しました。詳細をお知らせします。

VCSSLの最新版をリリース:外部プログラムとの連携機能を少し強化、他
2025-05-25 - VCSSL3.4.52をリリースしました。外部プログラム(C言語製の実行ファイル等)との連携機能を少し強化し、文字化け対策やOS判別などを可能にしました。他にも細かい機能追加があります。詳細をお知らせします。

VCSSLの最新版をリリース、Java24上での非互換な挙動を対処
2025-04-22 - VCSSL3.4.50をリリースしました。Java24環境上でのネットワークドライブ関連のファイルパス解決で、従来環境とは異なる挙動が生じていたのを解消しました。詳細をお知らせします。

リニアングラフやVCSSLの最新版をリリース、目盛りの位置や内容を自由に指定可能に!
2024-11-24 - リニアングラフ3D/2Dを更新し、自由な位置に、自由な表記内容の目盛りを描けるようになりました!併せて、Java言語やVCSSLでの、プログラム制御用APIも拡張しています。詳細をお知らせします。