この文章の書き方があってるのか、わからいのですが、基礎からキッチリ覚えたいと思っていますので、暇なときにでも、よろしくお願いします。

今、フリーのC言語のコンパイラソフトを使用して、本を片手に
ソースを実行して基礎を学んでいる最中です。

そこで質問なんですが、ソースを書いて実行する方法、(今はソフトを使っているのですが)その仕組みは、知っておくべきでしょうか?

あと、現在、AFP(金融関係)の資格を勉強しており、将来、携帯端末を利用した提案書のサービスができるようになりたいと思っています。
これを実現させるには、JAVAのほうが近道のような気がしながら、基礎だと思ってC言語から始めましたが、実際はどうなんでしょうか?
それとも、どんな仕組みで携帯から動作しているのか?そういう所から詳しくなっていったほうが、いいのでしょうか?

今は両方、同時進行でやっています。言語のほうは、だんだんわかってくると感じるのですが、仕組みになると初歩の段階から、かなり専門的で困っています。

長々、まとまりのない文章になってしまいましたが、職業として真剣に考えていますので、助言いただきたいです。

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

A 回答 (1件)

こんにちは、制御系組込みソフトの開発を業としております。



> ソースを書いて実行する方法、(今はソフトを使っているのですが)その仕組みは、知っておくべきでしょうか?

ちょっと意味がよく分からないので適当に解釈させていただきますが、

・ソースから実行コードを作成する作業手順(コンパイラやリンカの使い方)
→これは当然、熟知しておく必要があります。C コンパイラ(特に組込みソフト用)には様々なオプションがあり、その指定次第で全く異なったオブジェクトが生成されます。応用分野や作業フェーズ(デバッグ中なのか出荷版なのか等)によって、これらを適切に使い分けないと、仕事になりません。つまり、コンパイラは単に、人間に分かりやすい言語(C)を機械語に翻訳する手助けをしてくれるツールに過ぎないということです。

・コンパイラの仕組み
→コンパイラのアルゴリズムは別に理解する必要はありませんが、C のソースがどういうオブジェクト(つまり機械語)に変換されているかということは、やはり熟知していなければなりません。マイクロ秒単位で性能を争う組込みソフトの世界では、コンパイラの癖やバグ等を知り尽くした上で、最適なコードを書く必要があるし、デバッグの時(特に性能測定など)には、どうしてもアセンブラ語レベルでデバッグする局面も、避けては通れません。

あと、Java と C についてですが、これは単純にどちらか優れているという結論は出せません。応用分野次第ということになります。
Java の最大のメリットは、共通プラットフォーム(Java VM)の上で異機種間でのアプリのポータビリティが保証されるということと、ユーザ側でも簡単にアプリを開発できる仕組みが簡単に作れるということでしょう。このことは、既に携帯電話のiアプリで実証されていますよね。
その代償として、性能(実行スピード)は、同じ機能を C で書いた場合に比べて、恐ろしく遅くなります。

また、Java は言語として C より堅牢(安全)とも言われていますが、裏を返せば「融通が利かない」ということでもあります。特に制御系組込みソフトにおいては、ポインタが無いというのが致命的といっても良い欠点ですね。
したがって、専用のハードウェアの上で作りつけのソフトだけを組み込むということでしたら、Java より C の方が、一般的には適していると思います。たとえアプリを多数品揃えするにしても、C 言語ベースの共通プラットフォームを構築しておけば済むことですから。

何かまとまりのない回答になってしまいましたが、いずれにしても、開発されるシステムが何を目的とするかをしっかり把握した上で、開発言語を選ぶということが大切だと思います。
    • good
    • 0
この回答へのお礼

お返事ありがとうございます。
かなり専門的にされておられる方に回答していただいて、自分のあまりの知識のなさに申し訳なく感じてしまいました。
 わからないなりに調べて理解したつもりなんですが、現在、使っているソフトは以下のような感じの解説です。

標準的なC言語ソースプログラムをコンパイル・実行するソフトウェアです。
独自に作成したプリプロセッサ・コンパイラ・リンカを備えており、(仮想機械用コードを出力し、実行する)C言語の学習向け処理系です。

 これがysk6406さんの言われている組み込みソフトってことですよね?
そして、このソフトは、独自のソースから実行コードを作成する作業手順、を持っていて、独自の結果が反映される。この作業は理解する必要があり、私が聞きたかったのも、この部分です。
 そしてコンパイラの処理手順の理解はいらないけど、結果として出てきた言語は理解が必要である。
 こんな感じで理解を深めたんですが、あってますでしょうか?
現在、考えているのが iアプリで提供できるサービスです。JAVAだと無料配布でほとんど作れてしまいそうなので、やっぱりJAVAかなと思うのですが、将来的なことも考えてC言語をやるべきではないか?とも思ってます。
 まだまだ勉強しなければ。。。。
 

お礼日時:2001/12/07 11:52

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

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

QC言語のソースをC++言語に変換したい

C言語で書かれていたソースをC++言語に変換したいのですが
どのような点に気をつければよいでしょうか

現在、プログラムの主な構造は構造体とそれを扱う関数が実装されていて、
これらをクラスを使用して書き換えようと思います。
それ以外に気にしておくものはありますか。

例えば、ヘッダファイルで<stdio.h>をインクルードしているところがありますが、
これは<cstdio>に書き換えたほうがよいかもしれない、と言われたことはあります。
printfなどはprintfのまま使用しても大丈夫ですか。
std::printfに書き換えたり、iostreamを使用する方法に書き換えたほうがいいですか。
規格としてはどのようになっているのでしょうか。
(「過去との互換性のためにあるだけであり、非推奨」とかあったりしますか。)

Aベストアンサー

まず <stdio.h> などは言われるように「非推奨」なので「最終的には変更する」ことを前提にした方がいいでしょうね (たぶん C++1y までは大丈夫だと思うけど). とはいえ, 単純に
<cstdio> を #include しててきとうに std:: を付ける
だけでもだいたいいけますが. あえて <iostream> に直す必要はないです.

まあ, ヘッダ以外は「とりあえず拡張子だけ変えてコンパイルエラーが出たら考える」という行きあたりばったりな方法でもなんとかなっちゃいますけどね.

QC言語のソース

初心者です。100ステップ位で理解するのにちょうどいいソースプログラムはホームページ上に無いでしょうか?

Aベストアンサー

こんにちは。

Cのソースといっても、
幅が広いです。

既にご承知かもしれませんが、
参考URLを参照し、
必要な箇所のサンプルを参照して下さい。

参考URL:http://www.kumei.ne.jp/c_lang/

QC言語の仕組み

C言語の仕組み

printfという命令で画面に文字を表示できますが、文字が表示される画面はMS-DOSの画面や開発プログラムの実行ウィンドウの中ですよね。
もしC言語がPCに直接命令できるのであれば、画面全体が真っ暗になって、そこに文字が表示されるべきなのではないかと思いました(つまり、OS上で動くべきではない)。
しかし、仮に全く最初から文字を打つとしたら、ディスプレイの仕組みを理解して、ドットで文字を表示させなければなりません。
いったいprintfというのはどこに対して命令しているものなのでしょうか

Aベストアンサー

誤解があるようですが、printf関数は『画面には出力していません』

正確には「標準出力」と呼ばれる出力装置へ文字列を出力する関数です。
その「標準出力」が、DOS窓だったり実行ウィンドウだったりするので、それぞれの画面に出力しているように見えるだけです。
リダイレクト機能を使って 「コマンド > file.txt」とすれば「標準出力」は file.txtというファイルになるし
パイプ機能を使って「コマンドA | コマンドB」とすれば、コマンドAの標準出力先はコマンドBの「標準入力」になります。

これらの動作はOSを通して行うものです。
>OS上で動くべきではない
というのは大きな考え違いです。

ついでに言えば、scanfやgetc等もキーボードからではなく「標準入力」から入力する関数です。


以上は、Cの標準ライブラリの「標準入出力関数」を使った場合の話。
自前で「直接画面に出力するprintf関数」を作成した場合はこの限りではありません。
printfはあくまで「標準ライブラリに含まれる関数」であって、「C言語」の一部ではないのです。

誤解があるようですが、printf関数は『画面には出力していません』

正確には「標準出力」と呼ばれる出力装置へ文字列を出力する関数です。
その「標準出力」が、DOS窓だったり実行ウィンドウだったりするので、それぞれの画面に出力しているように見えるだけです。
リダイレクト機能を使って 「コマンド > file.txt」とすれば「標準出力」は file.txtというファイルになるし
パイプ機能を使って「コマンドA | コマンドB」とすれば、コマンドAの標準出力先はコマンドBの「標準入力」になります。

これらの動作はO...続きを読む

QC言語ゲーム製作中 ソース公開

プレイヤーが画面を四方八方に移動までです。コードを一通り見ていただきたいです
現在、定番で見やすいプログラムを意識しています。又、今後質問が宜しく願います

以下よりダウンロードです(実行ファイル、ソースコード(268ステップ)等)
http://gamdev.org/up/img/10406.lzh

環境
OS:VISTS、統合開発環境:VC++2005 EE、言語:C
ライブラリ:DXライブラリ、

-----------------------------------------------------------------
前回の質問時の修正としてコメント、マジックナンバー、メイン3分割等を行った。

ファイルは分割せずに1ファイルにまとめています。
-----------------------------------------------------------------
聞きたい優先順位(下に行くほど無視してもよいです)

1:
以下の164行目と166行目のマジックナンバーを#define or typedef enum or それ以外の方法はあるのか…

          赤、緑、青
SetTransColor( 255 , 255 , 255 ) ;// 透過色を変更

*strclr = GetColor( 255 , 255 , 255 ) ;// 白色の値を取得
2:
WinMain関数で多くのローカル変数を宣言しているが他の関数でやったほうがいいか
struct player ply や int KeyStat[KET_MAX] を他のローカルで宣言するとstaticに
しなければいけないとか考えてしまいます。メインで宣言したほうが都合が良さそうと思っていますが…


他に気になった点、こうしたほうがいい等、色々な意見を願います <(_ _)>

プレイヤーが画面を四方八方に移動までです。コードを一通り見ていただきたいです
現在、定番で見やすいプログラムを意識しています。又、今後質問が宜しく願います

以下よりダウンロードです(実行ファイル、ソースコード(268ステップ)等)
http://gamdev.org/up/img/10406.lzh

環境
OS:VISTS、統合開発環境:VC++2005 EE、言語:C
ライブラリ:DXライブラリ、

-----------------------------------------------------------------
前回の質問時の修正としてコメント、マジックナンバー、メイン3分割...続きを読む

Aベストアンサー

前回のURLも張っておきますね。
http://oshiete.nikkeibp.co.jp/qa3460149.html

No2さんが指摘されているKeyBoardですが、
渡しているのは配列なので、少し誤認があるようです。

配列にアクセスする場合に、KeyBoardでは
*(KeyStat + KEY_UP) = 0;と行っているのに対し、
PlayerSyoriではpkenGraph[ply->direc]としています。
どちらかに統一する方が良いと思います。

直感的に、渡されるものがポインタであるか、配列であるかを
呼び出し元を確認しないでも良いように、KeyBoardには
int KeyBoard( int *KeyStat, int ArraySize )のように
配列のサイズを渡すようにしたり(今回は特に必要ないですが。。。)
関数の引数説明をコメントとして入れるほうが良いかと。

>1:
用法によると思います。
変更する必要が無ければ
#define SET_COL_RED 255
#define SET_COL_GREEN 255
#define SET_COL_BULE 255
程度で良いでしょうし、動的に変更する必要があるならば、
変数を使う方が良いかもしれませんね。
C++では定数定義はconst変数を使用して行われます。
const int SET_COL_REG = 255;
const int SET_COL_GREEN = 255;
const int SET_COL_BULE = 255;
const変数は定義後の値の代入を許さないので定数として扱われます。
これは殆どがGlobalに定義されるため、Cなどでは
グローバル変数をタブーとする為defineを使っている事が多いです。

>2:
KeyStatやgwafはWinMainの中では使用されていないので、
MainProcで定義することで引数を2つ減らすことが出来ますね。
これらは、状態を保持する必要が無く毎回MainProcの中で
更新されている値です。それ以上のスコープを持っても、
持たなくても、結局MainProcの中で書き換えられているものですので
MainProcで定義しましょうstaticは不要です。
そうしないと、MainProc内で無駄に「*」の使用が増えてしまいますし
逆に関数に渡す時には「&」がつきますが、引数の数はスタックサイズなどにも微妙に影響すると思うので、必要な変数は必要なスコープに
置くように心がける方がいいと思います。

前回、最後に書いた一言は、ズバリNo1さんが指摘している
ところで、今回はply->pspd = P_MV_SPD;とせっかく代入してるのに、
ply->px -= P_MV_SPD ;とここでは定数を使っています。

とこのくらいでしょうか

前回のURLも張っておきますね。
http://oshiete.nikkeibp.co.jp/qa3460149.html

No2さんが指摘されているKeyBoardですが、
渡しているのは配列なので、少し誤認があるようです。

配列にアクセスする場合に、KeyBoardでは
*(KeyStat + KEY_UP) = 0;と行っているのに対し、
PlayerSyoriではpkenGraph[ply->direc]としています。
どちらかに統一する方が良いと思います。

直感的に、渡されるものがポインタであるか、配列であるかを
呼び出し元を確認しないでも良いように、KeyBoardには
int KeyBoar...続きを読む

QC言語 タイマーのソースについて

C言語でタイマーを使ってprintf文を記述することで
「1秒経過」、「2秒経過」、「3秒経過」のように表示させたいのですが、どのように表示させるのでしょうか?
タイマーの間隔は、できれば1 [ms]だとうれしいてす。
回答お願いします

Aベストアンサー

> まずはC言語のプログラミングでの動作を実証してみてから、
> マイコンへの書き込みを考えています。

といわれても、処理のロジックをパソコンのCで実証するということはありますけど、タイマのようなシステムよりというか、ハードウエアよりのものは、なかなか。

とはいえ、パソコンで秒単位ということであれば、

#include <stdio.h>
#include <time.h>

int main()
{
time_t last = time(0);
time_t next;
int pastSec = 0;

while(1)
{
if (time(&next) != last)
{ last = next;
pastSec++;
printf("%d 秒経過\n", pastSec);
}
}

return 0;
}

こんなので可能です。
同じように標準の time.h や time() 関数があれば、同じように動きますが。

と書きましたが、実際の所、このコードも、http://oshiete.goo.ne.jp/qa/6396223.html で書いたコードもそっくりさんではあるのですね。

time() 関数が1秒ごとに異なる数値を返せば、とりあえず、このプログラムは動くわけです。
たとえば、


volatile int m10Count;

void m10Int() // この関数は 10ms 間隔で割り込まれる
{
m10Count++;
m10Count %= 10000; // オーバーフロー対策(時間の長さによってはこれ必須)
}

time_t time(time_t *timer)
{
*timer = m10Count / 100;
return *timer;
}

とすれば、1秒単位程度であれば、main() は、同じコードで動かすことができます。

> まずはC言語のプログラミングでの動作を実証してみてから、
> マイコンへの書き込みを考えています。

といわれても、処理のロジックをパソコンのCで実証するということはありますけど、タイマのようなシステムよりというか、ハードウエアよりのものは、なかなか。

とはいえ、パソコンで秒単位ということであれば、

#include <stdio.h>
#include <time.h>

int main()
{
time_t last = time(0);
time_t next;
int pastSec = 0;

while(1)
{
if (time(&next) != last)
{ last = next;
...続きを読む


人気Q&Aランキング

おすすめ情報