マイコンのROMに書いてある関数を呼び出すのに、次のような方法を使っています。
 1000番地のsub1と言う関数を呼ぶのにアセンブラで次のように書き、リンカで結合しています。
sub1: EQU 1000

 これをアセンブラを介せずC言語だけで行う方法は無いでしょうか。
イメージ的には次のような感じで1000番地のプログラムを呼びたいのです。
 この方法では上手く行かないのは分かっていますが、それを何とかしたいと思っています。

#define sub1 1000
sub1() ;

 宜しくお願いします。

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

A 回答 (8件)

定数を関数へのポインタにキャストすれば良い。



#define sub1 1000
main()
{
int i;
int i;
i = ((int (*)(int,int))sub1)(10,20); /*intの引数が2つあってintを返す関数*/
}
    • good
    • 0
この回答へのお礼

 やった! 有難う御座います。

 コンパイルすると、下記の結果になりました。

-------------------------------------------
#define sub1 0x1000
int i;
((void (*)(void ))sub1)( );
i = ((int (*)(int,int))sub1)(0x10,0x20);
-------------------------------------------
JSR @H'01000:24
MOV.W #H'0020:16,E0
MOV.W #H'0010:16,R0
JSR @H'01000:24
------------------------------------------

 更に次のようにすると、普通の関数と変わり無く使えるのが分かりました。

----------------------------------------------
#define sub2((void (*)(void ))0x2000)
sub2();
#define sub3((int (*)(int,int))0x3000)
i = sub3(0x30, 0x40);
---------------------------------------------
JSR @H'02000:24
MOV.W #H'0040:16,E0
MOV.W #H'0030:16,R0
JSR @H'03000:24
---------------------------------------------

 このような複雑な書き方はI/Oポートの構造体とか、C言語のクイズのような物で見るだけで、解説本には見かけないと思います。

 どうも有難う御座いました!

お礼日時:2009/05/18 23:39

蛇足ですが。



>更に次のようにすると、普通の関数と変わり無く使えるのが分かりました。
>#define sub2 ((void (*)(void ))0x2000)
>#define sub3 ((int (*)(int,int))0x3000)

ROMの内容は不変だと思いますので、ROMの関数のアドレスも不変だと思います。

なので、これらのROM関数の定義を以下のようにヘッダーファイル rom.h に書いて、いつもそれを使うと良いでしょう。

---rom.h---
#define InitSerialPort ((void (*)(void))0x1200)
#define ResetSerialPort ((void (*)(void))0x1258)
#define ReadSerialPort ((char (*)(void))0x12A2)
#define WriteSerialPort ((void (*)(char))0x12E4)
(以下略)
※関数名とアドレスは架空の物です。実在の関数名とアドレスとは一切関係ありません。

名前も、sub1とかsub2ではなく、上記のように「意味がある名前」にしましょう。

そうすれば、実際に使う場合、以下のように書くだけで良く、毎回#defineを書かずに済みます。

#include <rom.h>
void main(void)
{
  int r;
  char readbuf[10];
  InitSerialPort();
  ResetSerialPort();
  WriteSerialPort('R');
  WriteSerialPort('0');
  WriteSerialPort('1');
  WriteSerialPort('S');
  readbuf[0] = ReadSerialPort();
  readbuf[1] = ReadSerialPort();
  readbuf[2] = ReadSerialPort();
(以下略)
    • good
    • 0
この回答へのお礼

 分かりました。
 色々と有難う御座いました。

 また何か有りましたら宜しくお願いします。

お礼日時:2009/05/20 04:42

>別にアセンブリしたりサブ・コマンドファイルの変更などが有り。


ここら辺は工程をバッチファイル化したり、ROM側のリンク時にシンボルファイルを書き出してJavascript/VBScriptなどで加工してアセンブラソースに加工するってのが定番です。


C言語だけでやると問題としては、
1.関数にパラメータがあるとキャストがめんどくさい。
2.リンカだけで解決するよりコードがわずかだが肥大化する。
3.関数ポインタの初期化を忘れてもエラーが出ない。リンクならエラーが出るからすぐ分かる。
    • good
    • 0
この回答へのお礼

 再度回答ありがとう御座います。

 今までの方法が、最良だったという事ですね。

お礼日時:2009/05/17 15:02

>#1さん



確かに関数ポインタを使えばよいですが、だからといって

>void(*sub1)(void) = 1000;

これはないでしょう。

# 本当に専門家?
    • good
    • 0
この回答へのお礼

 回答有難う御座います。

 名前はパラグアイの首都アスンシオンですか?

 20年前にアスンシオンの友人の家に数ヶ月滞在していたので、懐かしいなと思って。

お礼日時:2009/05/17 13:25

私もjactaさんと同じでリンカでの解決が良いと思います。


アセンブラによるのですが、
_sub1:: EQU 1000
とか外部シンボルになる定義を行ってください。
※ この場合::が外部シンボルの意味となる。そのほかexternと書くものや色々アセンブラによって違います。アンダーバーが必要かもC言語コンパイラの仕様によって変わります。

C言語側では、
extern void sub1(void);
と宣言して、
sub1();
と呼び出すだけです。
    • good
    • 0
この回答へのお礼

 早速の回答ありがとう御座います。

 秋月電商のH8キットでプログラムを作っているのですが、printf 関数は大きくてRAMに入りません。
 それでROMに書き込んで呼び出しています。

 現在zwiさんの回答と同じ方法でリンカで解決しているのですが、C言語の機能を引き出してC言語で解決できる道を探しています。

お礼日時:2009/05/17 13:09

C言語の枠を外れる話ですが、組み込み系のCコンパイラなら、そのコンパイラでどう記述するか機能が提供されていると思うので、コンパイラのマニュアルを見ましょう。


見つからなければ、だめもとで#1の方の書いた方法。
    • good
    • 0
この回答へのお礼

 早速の回答ありがとう御座います。

 秋月電商のH8キットの安いコンパイラを使っています。
 コンパイル時間が短いので気に入っています。

 シンプルな所が気に入っています。
 シンプルだから、基本的な事しか出来ません

お礼日時:2009/05/17 12:59

一番確実なのは、アセンブリ言語のソースで、関数名が外部結合のシンボルになるような擬似命令を記述することです。


関数へのポインタを使えばほとんどの場合動作しますが、規格上保証されているわけではありませんので。
    • good
    • 0
この回答へのお礼

 早速の回答有難う御座います。

 現在はアセンブリ言語の EQU を使って結合しているのですが、C言語だけで行う方法を探っています。

 アセンブリ言語が絡んでくると、別にアセンブリしたりサブ・コマンドファイルの変更などが有り、ミスが増えそうなのでC言語だけで処理出来ないかなと思っています。

お礼日時:2009/05/17 12:46

関数ポインタを使えば可能です。


void(*sub1)(void) = 1000;
sub1();

この回答への補足

 下記のお礼の補足です。

 使っているコンパイラが秋月電商のH8マイコン用です。
 機能が小さくて、C言語機能全体をカバーしていないかも知れません。

補足日時:2009/05/17 12:02
    • good
    • 0
この回答へのお礼

 早速の回答有難う御座います。
 このような回答を待っていました。

 しかし次のプログラムを書いてコンパイルしたのですが、
2129(E) ILLEGAL INITIALIZER TYPE
と言う、エラーメッセージが出てしまいます。

void test(void)
{
void(*sub1)(void) = 1000;
sub1();
}

 次のようにしても同じでした。

void(*sub1)(void) = 1000;
void test(void)
{
sub1();
}

 関数ポインタという機能を調べて、自分でも実験してみます。

お礼日時:2009/05/17 11:57

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

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

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

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

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

Qエクセルで種類を数える関数が無いのは何故?

エクセルで種類を数える関数が無いのは何故なんでしょうか?

エクセルで種類を数えるには、いくつかの関数を組み合わせるのが一般的ですよね?
直接数える関数が無いのは、訳があるんでしょうか?

Aベストアンサー

>>エクセルで種類を数える関数が無いのは何故なんでしょうか?

やっぱり、そういう関数が必要な方が全体からみたら少数派だと、エクセルの開発者たちが考えているからではないかと思います。
また、既存の関数を組み合わせたら、対処可能だから、無理して新しい関数を作る必要性もない、開発の優先順位が低いって判断もあるでしょうね。

私は、エクセルの表を作ったり、エクセルVBAでプログラムを作ったりしますけど、そういう関数が必要になったことが全くありませんし。

Qprintfで0x600000番地の次の0x600001番地の値を出力したい。

H8マイコンの0x600000番地につながるSRAMメモリの内容を見たくて、

#define SRAM_BASE_ADDR0x600000

#defineSRAM_TEST_ADDR*((volatile u8 *)SRAM_BASE_ADDR)

printf("data:%X addr:%p\n\r", SRAM_TEST_ADDR,(void*)&SRAM_TEST_ADDR);

このような形でアドレス0x600000番地のデータをprintf関数で出力してUARTで確認していたのですが、次の0x600001番地のデータをみたい場合はprintf関数をどのように書いたらよいのでしょうか?

Aベストアンサー

((volatile u8 *)SRAM_BASE_ADDR)[1]
とか.

Qエクセルの関数で

エクセルの関数辞典を見ていたら、CUMPRINC関数というのがありました。
しかし、エクセルの「挿入」→「関数」→関数の分類で「財務」というのを選択したのですが、一覧表に載っていません。
どこに載っているのでしょうか?
どうすればこの関数を使えますか?
ちなみにシートの上でやっても関数の反応をしませんでした。

Aベストアンサー

Yahooで検索してみると、参考URLが引っかかりました。

参考になりませんか?

参考URL:http://money-sense.net/doc/20041215_224257.php

Q【#define】 defineで定義した値を配列のサイズに使う事は可能?

タイトルの通り、defineで定義した値を配列のサイズ指定に使いたいと考えています。
この場合、次のような使い方をしても問題ないのでしょうか?

/* サンプルここから */
#define SIZE_A 10
#define SIZE_B 20
#define SIZE_ALL (SIZE_A * SIZE_B)

cahr ARR[SIZE_ALL];
/* サンプルここまで */

コンパイル時にワーニング等はありませんが、int型という型を宣言していないSIZE_ALLを要素数として使用するのが不安に感じるのですが問題ないのでしょうか?

int SIZE_int = SIZE_ALL;
とdefineした値を明示的にint型変数に代入した上で、
cahr ARR[SIZE_int];
とすべきなのでしょうか?

初歩的な質問ですが、ご教示お願いします。

Aベストアンサー

★特に問題ありません。
・普通に define された定数を掛け算などして新しい記号定数を定義します。
 そしてその記号定数を配列などの添え字に使います。
 そもそも define された定数は通常は int 型と同じになります。
 #define SIZE_A 10…int型
 #define SIZE_A 10L…long型
 #define SIZE_A 10LL…long long型
 となります。
 『L』や『LL』のサフィックスを付けないとすべて int 型に解釈されます。
 つまり、プリプロセッサ命令は単純な文字列の置換ですのでサフィックスを
 付けないと int 型になるわけですよ。
・もし char 型にしたいならキャストを指定します。
 例えば
 #define SIZE_A ((char)(10))
 とします。
・もう既に回答がありますが
>int SIZE_int = SIZE_ALL;
>とdefineした値を明示的にint型変数に代入した上で、
>cahr ARR[SIZE_int];
>とすべきなのでしょうか?
 ↑
 この方法は新しい記述方法です。
 1999年の最新のC言語の規格です。
 この C99 にすべてのコンパイラが対応しているわけではないため使わない方が
 良いかもしれません。この記述が利用できれば便利なこともありますが…。
・最後にカッコをつけた方が良いですよ。
 #define SIZE_A (10)
 #define SIZE_B (20)
 #define SIZE_ALL (SIZE_A * SIZE_B)
 という風に SIZE_A、SIZE_B に括弧を付けます。
 これは今後 SIZE_A を『10 + 20』と定義した際に括弧がないと計算式が
 正しくなくなるので付けるように習慣を付けておいた方が良いということです。
 つまり今後
 #define SIZE_A 10 + 20
 #define SIZE_B 20 * 3
 #define SIZE_ALL (SIZE_A * SIZE_B)
 と定義したとします。
 すると SIZE_ALL は (10 + 20 * 20 * 3) と置換されますが計算式が掛け算を先に
 する数学上のルールより意図しない結果になります。正しくは SIZE_ALL=1800 に
 なるべくところが SIZE_ALL=1210 となってしまいます。
・これを防ぐには2つ。
 #define SIZE_A (10 + 20)
 #define SIZE_B (20 * 3)
 #define SIZE_ALL (SIZE_A * SIZE_B)
 もしくは
 #define SIZE_A 10 + 20
 #define SIZE_B 20 * 3
 #define SIZE_ALL ((SIZE_A) * (SIZE_B))
 と定義します。
 どちらにカッコを付けても同じですが私はすべてにカッコを付ける派です。
・参考にして下さい。

★特に問題ありません。
・普通に define された定数を掛け算などして新しい記号定数を定義します。
 そしてその記号定数を配列などの添え字に使います。
 そもそも define された定数は通常は int 型と同じになります。
 #define SIZE_A 10…int型
 #define SIZE_A 10L…long型
 #define SIZE_A 10LL…long long型
 となります。
 『L』や『LL』のサフィックスを付けないとすべて int 型に解釈されます。
 つまり、プリプロセッサ命令は単純な文字列の置換ですのでサフィックスを
 付けないと ...続きを読む

Qエクセルの関数 ネスト

エクセルの関数 ネスト

エクセルの関数で、ネストさせるときがあるとおもうのですが、

関数を内側に書いたらよいのか外側に書いたらよいのか分からなくなる時があります。

エクセルの関数に関してわかりやすく書いてあるページなどありますか。

Aベストアンサー

こんばんは

Excel2003までは、ネストが7まで、2007では64までが可能です。
http://www.google.co.jp/search?hl=ja&source=hp&q=excel+%E3%83%8D%E3%82%B9%E3%83%88%E3%80%802003%E3%80%802007&aq=f&aqi=&aql=&oq=&gs_rfai=

「仕様上は可能」でも、複雑なネストは間違いが生じやすいですし、変更もしにくくなります。「出来るだけネストはしない」「適宜、中間結果をセルに出力する」という方法を採った方が、間違いが少なく、柔軟性のあるシステムになると思います。

>エクセルの関数に関してわかりやすく書いてあるページなどありますか。
関数の個別の機能ならば、Webサイトも書籍も多数あるのですが、「組み合わせて使う」というのはその場その場での発想になってしまうと思います。

Q別ソースファイル、同クラス名、同メンバ関数名で片方の関数しか呼ばれない

環境は
OS:Windows XP
コンパイラ:C++Builder6 に付属の bcc32.exe
です。

下の3つのソースファイルがあります。
bcc32 -c t1
bcc32 -c t2
bcc32 t t1.obj t2.obj
でできる t.exe を実行すると、
f in t1.cpp
f in t1.cpp
と出力されます。
リンクエラーになるか、または
f in t1.cpp
f in t2.cpp
と出力されることを期待したのですが・・・。

【質問】
複数のソースファイルで、同名のクラス、同名のメンバ関数を存在させたい
のですがどうしたらよいでしょうか?

---------------------------------------- t1.cpp
#include<iostream.h>
class A { public: void f(void); };
voidA::f(void) { cout << "f in t1.cpp\n"; }
void sub1(void) {
Aa;
a.f();
}
---------------------------------------- t2.cpp
#include<iostream.h>
class A { public: void f(void); };
voidA::f(void) { cout << "f in t2.cpp\n"; }
void sub2(void) {
Aa;
a.f();
}
---------------------------------------- t.cpp
externvoid sub1(void), sub2(void);
void main(void) {
sub1();
sub2();
}

環境は
OS:Windows XP
コンパイラ:C++Builder6 に付属の bcc32.exe
です。

下の3つのソースファイルがあります。
bcc32 -c t1
bcc32 -c t2
bcc32 t t1.obj t2.obj
でできる t.exe を実行すると、
f in t1.cpp
f in t1.cpp
と出力されます。
リンクエラーになるか、または
f in t1.cpp
f in t2.cpp
と出力されることを期待したのですが・・・。

【質問】
複数のソースファイルで、同名のクラス、同名のメンバ関数を存在させたい
のですがどうしたらよいでしょうか?

-----------------...続きを読む

Aベストアンサー

それぞれのクラスを、違うnamespaceで定義するというのは
どうでしょうか?
namespaceは(C++では)比較的新しい機能なので、
古いC++コンパイラで動かないかもしれません。
以下、FreeBSD 4.10-RELEASEのgccで動作確認しました。
---------------------------------------- t1.cpp
#include <iostream.h>
namespace t1 {
class A { public: void f(void); };
void A::f(void) { cout << "f in t1.cpp\n"; }
}
void sub1(void) {
t1::A a;
a.f();
}
---------------------------------------- t2.cpp
#include <iostream.h>
namespace t2 {
class A { public: void f(void); };
void A::f(void) { cout << "f in t2.cpp\n"; }
}
void sub2(void) {
t2::A a;
a.f();
}
---------------------------------------- t.cpp
extern void sub1(void);
extern void sub2(void);
void main(void) {
sub1();
sub2();
}
---------------------------------------- 実行結果
>./t
f in t1.cpp
f in t2.cpp

それぞれのクラスを、違うnamespaceで定義するというのは
どうでしょうか?
namespaceは(C++では)比較的新しい機能なので、
古いC++コンパイラで動かないかもしれません。
以下、FreeBSD 4.10-RELEASEのgccで動作確認しました。
---------------------------------------- t1.cpp
#include <iostream.h>
namespace t1 {
class A { public: void f(void); };
void A::f(void) { cout << "f in t1.cpp\n"; }
}
void sub1(void) {
t1::A a;
a.f();
}
-------------------------------...続きを読む

Qエクセル関数の解読サイトなんてありますか?

エクセル関数の解読サイトなんてありますか?

いつもお世話になっております<(_ _)>

エクセルファイルに関数の入った数式が入力されています。
セルごとに複数の関数が入っていますが、私にはちっともわかりません。

そこで質問です。
こんなとき「エクセル関数を解読」してくれるようなサイトってありませんか?

たとえば検索窓があってそこに「=SUM(S1:S13)」わからなくて困っている関数式を入力。
すると答えの別ボックスに「S1~S13までの数値の合計」と出てくるようなサイト。

それに近いサイトでも良いので知っている方がいらっしゃればぜひ、教えてください<(_ _)>

Aベストアンサー

もし、

=IF(E14="","",IF(O14="",(IF(E14>"18:00"*1,"18:00",E14)-IF(C14<="8:00"*1,"8:00",C14))*24*1300,(IF(E14>"18:00"*1,"18:00",E14)-IF(C14<="8:00"*1,"8:00",C14))*24*1625))

だったら、どういう文章が出て欲しいのでしょうか?

もしE14が空白だったら、
 空白、
そうじゃなかったから、
 もしO14が空白だったら、
  (もしE14が18:00より大きかったら18:00、そうじゃなかったらE14)-(もしC14が8:00以下だったら8:00、そうじゃなかったらC14)×24×1300
 そうじゃなかったら、
  (もしE14が18:00より大きかったら18:00、そうじゃなかったらE14)-(もしC14が8:00以下だったら8:00、そうじゃなかったらC14)×24×1625

って感じですか?
数式をそのまま読解したほうが解りやすくないですか?

Qリンカのコマンドライン

こんにちは。
C言語の勉強をしているのですが、リンカができなくて困っています。

環境:
OS:windows2000
コンパイラ:Borland C++ 5.5
(他に必要な環境があれば、ご教授ください)

まず、main()関数と作成した関数をコンパイルします。
Borland C++ 5.5のヘルプを参照して、
「bcc32 main.obj make.obj pro.lib」
これでリンクしようとしたのですが、
「ファイル pro.libが開けません」
とプロンプトに出力されます。

(main()関数→main.obj
作成した関数→make.obj
関数プロトタイプ宣言するファイル→pro.lib)
 保存は(main.obj→main.cpp、make.obj→make.cpp、pro.lib→pro.h)

と以上のようになっております。

コーディングミスは参考書を散々読み直したので、間違いないと思っております。

ただ、参考書が間違っていたら、取り付く島もありません。

どうぞ、お願いいたします。

こんにちは。
C言語の勉強をしているのですが、リンカができなくて困っています。

環境:
OS:windows2000
コンパイラ:Borland C++ 5.5
(他に必要な環境があれば、ご教授ください)

まず、main()関数と作成した関数をコンパイルします。
Borland C++ 5.5のヘルプを参照して、
「bcc32 main.obj make.obj pro.lib」
これでリンクしようとしたのですが、
「ファイル pro.libが開けません」
とプロンプトに出力されます。

(main()関数→main.obj
作成した関数→make.obj
関数プロトタイプ宣言...続きを読む

Aベストアンサー

質問に質問を返して申し訳ないのですが,pro.libというファイルは既に存在しますか?

→Yesの場合
pro.libがコンパイル&アーカイブ済みのライブラリで,main.cppかmake.cppでpro.libに含まれる(exportされている)関数を使っているケースでは,質問文の通り,pro.libをリンクする必要があります。
カレントフォルダにpro.libが存在するのに,リンカがそれを開けないということは考えずらいのですが,pro.libが正しいライブラリファイルでない可能性があります。(リンカはフォルダ指定の無い.libファイルを指定されると,まずカレントフォルダを探し,見付からない場合には環境変数やコマンドラインで指定されたライブラリパスを探しに行きます)

→Noの場合
コマンドラインからpro.libを取り除くとうまくいきませんか?
pro.hにプロトタイプ宣言した関数が,main.cppかmake.cppに実装された関数,および“C/C++で黙って使える関数”(暗黙のライブラリの関数)だけである場合,.libファイルを明示的にリンクする必要はありません。
質問の解釈が間違っていたらごめんなさい。もしもtororinnさんが,pro.hというヘッダを書いたら,pro.libというライブラリができると思われているのであれば,それは間違いです。この場合のプロトタイプ宣言は,“どこかの”.objや.libに含まれている関数を利用するためのもので,コンパイルしてもファイル(実体)にはなりません(実体は別な場所に格納されているので)。

質問に質問を返して申し訳ないのですが,pro.libというファイルは既に存在しますか?

→Yesの場合
pro.libがコンパイル&アーカイブ済みのライブラリで,main.cppかmake.cppでpro.libに含まれる(exportされている)関数を使っているケースでは,質問文の通り,pro.libをリンクする必要があります。
カレントフォルダにpro.libが存在するのに,リンカがそれを開けないということは考えずらいのですが,pro.libが正しいライブラリファイルでない可能性があります。(リンカはフォルダ指定の無い.libファイルを...続きを読む

Qエクセル関数を、書き写して分析できるツールはある?

タイトルの件、質問します。

エクセルの関数を分析する際に、エクセルの数式バーや、セルに入っている関数を
F2を教えて見るのでは、見にくい場合があります。

現在は、私は、メモ帳に関数をコピーして、分析したり、修正したりしています。
エクセルの機能or他ソフトで、関数を分析できるツールはあるのでしょうか??

【エクセルバージョン】
2003、2007

Aベストアンサー

難解な数式を理解したいとき,最も便利に利用できるのは,2003ではツールメニューのワークシート分析にある「数式の検証」です。
2007では数式タブにあります。

メンドクサイ数式のセルで数式の検証を使い,どの関数やどのカッコから計算が進んでいくのかを1ステップずつトレースして理解します。また意図しない結果がどの段階で発生しているのか追跡します。

このやり方は勿論間違った数式(意図しない結果が出てきた場合)を追跡するのにも使いますが,むしろ誰かに教わった「正しい数式」を理解する時に便利な方法です。
そもそも計算が通っていない(たとえばカッコの対応が間違えていて,Enterしても受け付けてくれないようなミスをしている場合)には使えません。



また,数式バーの中で数式の「中」にカーソルを入れて左右の矢印キーでカーソルを動かしていったときに,「(」や「)」をまたいだ瞬間に,対応する「閉じカッコ」「始まりのカッコ」が色つきで強調表示されるのを確認しながら,カッコの対応がまちがえてないかなどを調べるのも簡易な良い方法です。


あまり使わない方法ですが,数式の中で適宜ALT+Enterを打って「セル内改行」してしまい,数式を縦に分解して書いてみるのも整理しやすい方法のひとつです。

難解な数式を理解したいとき,最も便利に利用できるのは,2003ではツールメニューのワークシート分析にある「数式の検証」です。
2007では数式タブにあります。

メンドクサイ数式のセルで数式の検証を使い,どの関数やどのカッコから計算が進んでいくのかを1ステップずつトレースして理解します。また意図しない結果がどの段階で発生しているのか追跡します。

このやり方は勿論間違った数式(意図しない結果が出てきた場合)を追跡するのにも使いますが,むしろ誰かに教わった「正しい数式」を理解する時に便利...続きを読む

QC言語のコンパイラ、リンカ

はじめまして。
独学でC言語の勉強をしています。
そこで、実際に簡単なプログラミングをしてみたいのですが、フリーのコンパイラ、リンカはあるでしょうか?
知っている方がいました宜しくお願いします。

Aベストアンサー

VC++やBCCが有名ですね。
私はVisual Studioを使っています。学習用途なら、無償のExpressエディションでも十分な機能です。

Visual C++ 2008 Express Edition
http://www.microsoft.com/japan/msdn/vstudio/express/

ただし、最初はコマンドラインからコンパイルする練習もした方が良いかもしれません。
その場合、V++よりもBCCの方が簡単です。
http://www.codegear.com/jp/downloads/free/cppbuilder


人気Q&Aランキング