プログラムの学習を行っていた時に出たエラーの原因について教えて頂きたいです。
状況は下記の通りです。
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文から出しただけでこのエラーが直ったのか知りたいです。
詳しい方よろしくお願い致します。
No.2
- 回答日時:
> 使用しているコンパイルソフトは「Cygwin」というものです。
Cygwinはコンパイラではありません。
CygwinのGCCでしょうか?
それとも、別のターゲット用のクロスコンパイラでしょうか?
(おそらく後者だと踏んでいます)
この回答への補足
色々と間違っていたみたいで、申し訳ありません。
コンパイラじゃなく開発ツールでした。
調べてみた結果、h8300-hms-gcc を使用していました。
別のターゲット用のクロスコンパイラで間違いないです。
Windowsで作ったプログラムをH8マイコンへ書き込んで使用しています。
無知なため何度も申し訳ありませんがよろしくお願い致します。
No.3
- 回答日時:
一口にC言語といっても様々なバージョンが存在します。
K&Rといわれていた古い版ではその記法がエラーとされる事もありました。
C言語の仕様上、ANSI C(C89)以降使える様に変わっています。
でも、今使われているgccならANSI C以降の仕様のはずだけどな。
だとしたら、コンパイラにそういう指示をしているのではないかな。
マイコン制御とかで-nostdlibオプション使ったりしてませんか。
その場合、標準関数使うためには-lcでcライブラリ(標準関数)使う様にリンクしてやれば良さそうな気がします。
> 書いた時にはコンパイルエラー undefined reference to '_memcpy' と出たのですが、
コンパイルエラーではなくてリンクエラーですね。
この回答への補足
勉強になります。ありがとうございます。
>マイコン制御とかで-nostdlibオプション使ったりしてませんか。
makefile見たら使ってました…。リンクする時にオプション指定してます。
ご指摘頂いた事は自分でも調べながら理解出来るようにしているのですが、
再度疑問が出てきたので質問させて下さい。
-nostdlibオプションは【コンパイラが標準のライブラリを自動的に参照しないよう指定します】と
あったのですが、この意味だと標準関数は全く使えないことになるように受け取れました。
ですが実際、main文から初期化付きの配列を出すとリンク出来てしまうのがよく分かりません。
No.5ベストアンサー
- 回答日時:
変数領域の確保する場所ややり方、初期化のしかたが、それぞれで違うからです。
どのように違うかは、「記憶クラス」をキーワードに検索する等してください。
おもいっきり雑な言い方をすれば。
外に書いたものは、初期化された領域に、変数を割り当てる(から、特にコピーなどはしない)
中に書いたものは、変数に領域を割り当てて、そこを初期化する(その際に、今お使いのものでは、標準ライブラリのmemcpyを利用しているようだ)
ということです。
この回答への補足
そういうことでしたか!
ようやく分かりました。ありがとうございます。
以前、変数領域についても調べたことがあったのでkmeeさんの内容で理解出来ました。
中に書いた変数って書き換えられる領域にコピーしてから使用するんでしたっけ。
その時に標準ライブラリを使用していたのですか…。
確かにそれだと-nostdlib 指定していても問題なかった理由が分かります。
もう一度、記憶クラスの内容を理解しておこうと思います。
本当にありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- その他(プログラミング・Web制作) 十進BASICでの再帰についての質問です。 2 2022/11/18 09:17
- C言語・C++・C# プログラミングを教えて欲しいです。 配列aは、int a[9]={7,6,12,8,3,5,10,9 4 2022/12/19 23:27
- C言語・C++・C# ポインタの型変換、どうやるんでしたっけ? 2 2022/03/28 11:00
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# 至急教えてください! プログラミングの問題です! お願いします! 出力2と全く同じ出力をするように、 2 2022/06/22 23:10
- C言語・C++・C# プログラミングペーパーテスト 次の問題の実行結果を答えろ #include int x[ ] = { 1 2022/06/16 21:49
- C言語・C++・C# c言語 5 2023/04/27 13:20
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
python エラー
-
エクセルのエラーメッセージ「4...
-
バッチからsqlplusの接続エラー...
-
適切な変換関数が存在しない???
-
Handlesについて
-
fortranでプログラムを実行する...
-
コンパイルできません。
-
sys/time.hのインクルードがで...
-
エラー: ‘inval’ の記憶サイズ...
-
エクセルでマクロを実行すると...
-
fatal error LNK1112
-
フォームの作成中にエラーが発...
-
ビルド失敗 指定されたファイ...
-
レコードセットをcloseする所で...
-
visual C++ でビルドの中止がで...
-
Excelのエラーで困ってます。
-
デバッグ中のエラーのことで教...
-
c言語をgcc.exeにコンパイルし...
-
MakeSureDirectoryPathExists
-
Fortran コンパイルエラーについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
python エラー
-
エクセルのエラーメッセージ「4...
-
適切な変換関数が存在しない???
-
Excelのエラーで困ってます。
-
バッチからsqlplusの接続エラー...
-
fortranでプログラムを実行する...
-
HEWを使用しているのですが、こ...
-
コンパイルできません。
-
デバッグ中のエラーのことで教...
-
visual C++ でビルドの中止がで...
-
BC30002: 型 'ListItem' が定義...
-
Handlesについて
-
sys/time.hのインクルードがで...
-
ビルド失敗 指定されたファイ...
-
VB2008で定数に色の設定をした...
-
RightとLeft関数のライブ...
-
multiple definitionというエラー
-
WindowsからLinuxへの移植
-
HANDLEの宣言でのエラー
-
レコードセットをcloseする所で...
おすすめ情報