🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

956閲覧

'1 duplicate symbol for architecture x86_64'

maleon

総合スコア13

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2021/03/07 11:47

エラーを解決できない

普段は別の言語を学んでいますが、ある本のサンプルコードがc言語だったため、c言語に初めて触れました。
文中のコードを写経したのですが、以下のエラーが出てしまいます。
どうすれば解決できるでしょうか?

発生している問題・エラーメッセージ

1 duplicate symbolfor architecture x86_64

該当のソースコード

c

1#include <stdio.h> 2#include <string.h> 3 4void main(){ 5 float data; 6 unsigned long buff; 7 int i; 8 char s[34]; 9 10 data = (float)0.75; 11 12 memcpy(&buff, &data, 4); 13 14 for(i = 33; i >= 0; i--){ 15 if(i == 1 || i == 10){ 16 s[i] = '-'; 17 }else{ 18 if(buff % 2 == 1){ 19 s[i] = '1'; 20 }else{ 21 s[i] = '0'; 22 } 23 buff /= 2; 24 } 25 } 26 27 s[34] = "¥n"; 28 29 printf("%s¥n", s); 30}

試したこと

エラーコードで検索して、関数名や変数名等に重複がある時に出るエラーだ、という風に理解しました。
しかし、何が重複しているのか分かりません。

補足情報(FW/ツールのバージョンなど)

OS:macOS catalina 10.15.7
xcode 12.4

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

質問のコードには多くの問題が含まれています。それら一つ一つを詳しく説明するには余りにも長くなってしまいますので、修正したコードを用意しました。こちらをお使いください。

C

1#include <stdio.h> 2#include <string.h> 3 4int main(void) 5{ 6 // assert(CHAR_BIT == 8); 7 // assert(sizeof(folat) == 4); 8 9 float data = 0.75f; 10 11 unsigned long buff = 0; 12 memcpy(&buff, &data, 4); 13 14 char s[35] = {0}; 15 for (int i = 33; i >= 0; i--) { 16 if (i == 1 || i == 10) { 17 s[i] = '-'; 18 } else { 19 if (buff % 2 == 1) { 20 s[i] = '1'; 21 } else { 22 s[i] = '0'; 23 } 24 buff /= 2; 25 } 26 } 27 28 printf("%s\n", s); 29}

上のコードをそのまま貼り付けて実行すれば、エラーはでなくなるはずです。


今後の方針としては、その本を捨ててください。

質問のコードには致命的な間違いが複数含まれています。エラーメッセージからエラーとなる部分は特定できませんが、コード自体の間違いの他、書き写し間違いや、実行時の勘違いなど、複数の問題がおきていると考えられます。ですが、**本に書かれていたというコード(質問文に書いているコード)そもそもがおかしいため、何がどうなっているのかを把握することすら困難です。**よって、その本自体が学習者に混乱をもたらしていると考えられます。

つまり、その本は役に立つどころか害悪であると私は判断します。即座に捨て内容を忘れることをお勧めします。


ここから先は蛇足の説明です。C言語がわかる人しかわからないないようですので、無視してください。

  1. Cの標準仕様ではmain関数の戻り値はintです。一部の古い環境ではvoidも許されますが、ほとんどの環境ではエラーまたは警告が表示されます。

  2. Cの関数定義で()内を省略することは、どのような引数も受け付けるという意味です。引数を受け取らないという意味ではありません。

  3. floatが32ビット(4バイト)であることが前提になっています。また、-の挿入位置はIEEE754単精度浮動小数点数を前提にしていますが、これも環境依存です。

  4. 32個の'0'または'1'と2個の'-'の計34の長さの文字列を配列sに格納するためには、sは35のサイズが必要です。

  5. sが初期化されておらず、'\0'の挿入も無いため、最後にNUL文字があるとは限りません。つまり、NUL終端文字列となっていない可能性があります。

  6. s[34] = "¥n";は無名な静的文字列"¥n"へのポインターをsの34番目に文字として代入しているという意味不明なコードです。

  7. 「\」(U++5C)と「¥」(U+00A5)は違います。Windowsで「¥」を入力する方法は非常に限られているため問題になりませんが、MacのJISキーボードでは「¥」と書かれた所を押すと「¥」になります。**まともな入門書では、この「\」と「¥」の違いが最初に詳しく書いています。**もし、それが書いていないのであれば、「初心者が読むには難しい難度が高い本」または「入門向けと書かれているが不親切で役に立たない悪書」のどちらかです。

投稿2021/03/07 12:57

編集2021/03/08 09:22
raccy

総合スコア21737

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ikadzuchi

2021/03/07 16:59

この回答の内容は質問の主題であるエラーに関係無いように見えます。
raccy

2021/03/08 09:20 編集

> ikadzuchi さん 結論を急ぐ余り、質問の回答にはならないような回答になってしまっていて申し訳ありません。解決方法としては、「全面的に見直してまともなコードを使う」以外に無いと考えており、それがわかるように回答を書き直しました。
maleon

2021/03/08 11:10

raccyさん ご回答ありがとうございます。 ご回答いただいたコードを、ターミナルでコンパイル、実行すれば、期待していた結果が得られました。 元のコードを見返しましたが、本に記載の通りでした。 ご回答内容をもとに見直してみようと思います。
ikadzuchi

2021/03/08 17:03

>raccyさん いえ、このコードは確かにまともでないにせよ、コンパイルは通り動作はするはずなんですよ。(同じ環境が無いのでgccで試して動作した) なのでコードを変えてもエラーが出ることの解決にはならないのではないかと思っていました。 ですが直ったようなのでコードにもエラーの原因があったのでしょうかね…。
guest

0

エラーメッセ―ジは省略せず全部貼り付けてください。
私は Xcode を使っていないのでよくわかりませんが、
duplicate symbol _main in: というメッセージがありませんか?
コンパイルはどのようにしていますか?
間違って複数のソースファイルを指定したため
main が重複しているというのではありませんか?

投稿2021/03/08 01:49

kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maleon

2021/03/08 11:06

kazuma-sさん ご回答ありがとうございます。 エラーメッセージは全て貼り付けています。 xcodeにて"ビルド"ボタンがありまして、それをクリックして実行していました。 コード自体にも誤りがあるようですが、kazuma-sさんの仰る通り、コンパイルの仕方にも問題があったようです。 コードを修正後、ターミナルでコンパイル、実行すれば上手くできました。 xcodeの仕様等、もう一度よく確認しようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問