アプリ版:「スタンプのみでお礼する」機能のリリースについて

プログラムの学習を行っていた時に出たエラーの原因について教えて頂きたいです。
状況は下記の通りです。

int main ( void )
{
int A[8] = { 0xff, 0xf7, 0xeb, 0xdd, 0xdd, 0xc1, 0xdd, 0xdd };
...

と書いた時にはコンパイルエラー undefined reference to '_memcpy' と出たのですが、
下記のように修正すると出なくなりました。

int A[8] = { 0xff, 0xf7, 0xeb, 0xdd, 0xdd, 0xc1, 0xdd, 0xdd };

int main ( void )
{
...

何故main文から出しただけでこのエラーが直ったのか知りたいです。
詳しい方よろしくお願い致します。

A 回答 (5件)

原因は予想できていますが、念のため処理系を教えてください。

この回答への補足

すみません、処理系の意味が間違っているかもしれませんが、
コンパイラのことで良いのでしょうか…。
使用しているコンパイルソフトは「Cygwin」というものです。

よろしくお願いします。

補足日時:2011/05/28 00:34
    • good
    • 0

> 使用しているコンパイルソフトは「Cygwin」というものです。



Cygwinはコンパイラではありません。
CygwinのGCCでしょうか?
それとも、別のターゲット用のクロスコンパイラでしょうか?
(おそらく後者だと踏んでいます)

この回答への補足

色々と間違っていたみたいで、申し訳ありません。
コンパイラじゃなく開発ツールでした。
調べてみた結果、h8300-hms-gcc を使用していました。
別のターゲット用のクロスコンパイラで間違いないです。
Windowsで作ったプログラムをH8マイコンへ書き込んで使用しています。

無知なため何度も申し訳ありませんがよろしくお願い致します。

補足日時:2011/05/28 13:02
    • good
    • 0

一口にC言語といっても様々なバージョンが存在します。



K&Rといわれていた古い版ではその記法がエラーとされる事もありました。

C言語の仕様上、ANSI C(C89)以降使える様に変わっています。

でも、今使われているgccならANSI C以降の仕様のはずだけどな。
だとしたら、コンパイラにそういう指示をしているのではないかな。

マイコン制御とかで-nostdlibオプション使ったりしてませんか。

その場合、標準関数使うためには-lcでcライブラリ(標準関数)使う様にリンクしてやれば良さそうな気がします。


> 書いた時にはコンパイルエラー undefined reference to '_memcpy' と出たのですが、

コンパイルエラーではなくてリンクエラーですね。

この回答への補足

勉強になります。ありがとうございます。

>マイコン制御とかで-nostdlibオプション使ったりしてませんか。

makefile見たら使ってました…。リンクする時にオプション指定してます。
ご指摘頂いた事は自分でも調べながら理解出来るようにしているのですが、
再度疑問が出てきたので質問させて下さい。

-nostdlibオプションは【コンパイラが標準のライブラリを自動的に参照しないよう指定します】と
あったのですが、この意味だと標準関数は全く使えないことになるように受け取れました。
ですが実際、main文から初期化付きの配列を出すとリンク出来てしまうのがよく分かりません。

補足日時:2011/05/28 13:39
    • good
    • 0

main「文」ってのはどうにかならないものでしょうか。


ちゃんとmain「関数」って書いてほしいなぁ、なんて思ったり。
    • good
    • 0
この回答へのお礼

どうも初めてC言語を教えて下さった方がそういう言い方をしていたので、
うつってしまったようで…不快にさせてしまい申し訳ありません。
今のうちに直しておきます。

お礼日時:2011/05/28 19:21

変数領域の確保する場所ややり方、初期化のしかたが、それぞれで違うからです。


どのように違うかは、「記憶クラス」をキーワードに検索する等してください。

おもいっきり雑な言い方をすれば。
外に書いたものは、初期化された領域に、変数を割り当てる(から、特にコピーなどはしない)
中に書いたものは、変数に領域を割り当てて、そこを初期化する(その際に、今お使いのものでは、標準ライブラリのmemcpyを利用しているようだ)
ということです。

この回答への補足

そういうことでしたか!
ようやく分かりました。ありがとうございます。

以前、変数領域についても調べたことがあったのでkmeeさんの内容で理解出来ました。
中に書いた変数って書き換えられる領域にコピーしてから使用するんでしたっけ。
その時に標準ライブラリを使用していたのですか…。
確かにそれだと-nostdlib 指定していても問題なかった理由が分かります。

もう一度、記憶クラスの内容を理解しておこうと思います。
本当にありがとうございました。

補足日時:2011/05/28 19:17
    • good
    • 0

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