ページ 1 / 1
コンパイラによる違い
Posted: 2008年6月28日(土) 23:02
by 翡翠
管理人さん、この掲示板を利用しているみなさん、はじめまして。
この掲示板には、今までもそこそこ来ていたのですが、見ていただけでした。が、どうしてもお聞きしたい事がありましたので、質問させていただきます。
それでは本題について。
私は大学一年生で、学校の宿題でプログラミングの問題が出ました。講義ではOSはLinuxで、emacsを使用してプログラミングをしています。が、今週の宿題として、関数の利用が出ました。その中で、多次元配列の受け渡しがあったのですが、これがどうしてもできなかったのです。担当の先生に質問してみたところ、私の入力がおかしいとの事でした。が、使用している参考書に擬似問題があったので、それを打ち込んでもコンパイルエラーがおきました。コンパイルすると、「互換性のないポインタを~」みたいなものが出ます。
しかし、どうにも納得できないのでWindowsでVisual C++ 2008 を使用してみたところ、配列の受け渡しは問題なくできました。
これはどういう事でしょうか? コンパイラによって表記が違うのでしょうか? どなたかお教え頂けたらと思います。
長々とすみません。
いい機会なので、管理人さんに質問、というよりお願いです。
簡潔に言うと、私のホームページにリンクを張らせて頂きたいのです。リンクを張る際は掲示板に一言、とありましたので。
シューティングゲームの館を参考にして、STGを作ろうとしています。知識不足で、いつになるかはわかりませんが。
どうか、前向きな回答をお聞かせください。
Re:コンパイラによる違い
Posted: 2008年6月28日(土) 23:52
by tk-xleader
できればそのコードを載せていただけないでしょうか?
Re:コンパイラによる違い
Posted: 2008年6月29日(日) 00:06
by たかぎ
C++ではなくCの場合、ポインタの型が違っていてもコンパイルエラーにはなりません。
エラーになるとすれば、コンパイラの拡張機能を用いて、警告をエラーにするように設定した場合ぐらいです。
エラーが出るコンパイラは何なのか(多分GCCだと思いますが)、コンパイルに用いた命令(プログラム名とオプション)は何か、そしてエラーメッセージの全文を補足してください。
念のため確認しますが、C++ではなくCですよね。
Re:コンパイラによる違い
Posted: 2008年6月29日(日) 09:54
by 翡翠
返信が遅れてしまい、申し訳ありません。
説明不足だったようで、重ね重ね申し訳ありません。
コードは、ここでは不必要なものが多すぎると思ったので載せませんでしたが、全文を載せた方がわかりやすそうなので、載せることにします。
>tkmakwins15 さん
インデントできているか不安ですが、
#include <stdio.h>
void mat_add(const int ma[2][3], const int mb[2][3], int mc[2][3])
{
int i,j;
for(i=0; i<2; i++)
for(j=0; j<3; j++)
mc[j]=ma[j]+mb[j];
}
int main(void)
{
int i,j;
int ma[2][3]={{1,2,3},{4,5,6}};
int mb[2][3]={{6,3,4},{5,1,2}};
int mc[2][3]={0};
mat_add(ma, mb, mc);
for(i=0;i<2;i++){
for(j=0;j<3;j++)
printf("%3d",mc[j]);
printf("\n");
}
return(0);
}
です。簡単にいえば、行列の和を求めて表示するプログラムです。
>たかぎ さん
コンパイラは、お察しのとおりGCCだと思います。
GNOME コマンド・ライン端末で、
gcc ○○○○○.c
と打つので、GCCですよね?
その結果、
○○○○○.c: 関数 'main' 内:
○○○○○.c:17: 警告: 互換性のないポインタ型からの引数 1 個の 'mat_add' を渡しますです
○○○○○.c:17: 警告: 互換性のないポインタ型からの引数 2 個の 'mat_add' を渡しますです
と、表示されます。
正直に言って、ポインタをまだ習っていないので、ポインタ型なんてものは、全く知りません。ポインタというのが、C言語を学ぶ上で当たる壁だとは聞いたことがありますが……
どうでしょうか? 何か足りないことがあれば、指摘いただければ補足いたします。
Re:コンパイラによる違い
Posted: 2008年6月29日(日) 09:58
by 翡翠
って、インデントできてない……
コードを"<pre>"と"</pre>"で囲むんですよね? ここは全角ですが、投稿時は半角で打ちました。どなたかお教えお願いします。
いろいろとすみません。
Re:コンパイラによる違い
Posted: 2008年6月29日(日) 09:59
by tk-xleader
<pre>タグは使っているようですが、インデントがされていないようです。
引数のconstを外すとどうなりますか?
Re:コンパイラによる違い
Posted: 2008年6月29日(日) 09:59
by tk-xleader
プログラムを書くときにインデントはしてますよね?
Re:コンパイラによる違い
Posted: 2008年6月29日(日) 10:09
by tk-xleader
というか、GCCで
g++ paste.cc
でコンパイルしても通りますが…。
逆に、
gcc paste.c
としてCのコードとしてコンパイルしたほうが警告が出て、C++のコードとして通した時は全く警告が出ませんよ。
("paste.c"というファイル名で、その後、"paste.cc"という名前に変更して実験)
Re:コンパイラによる違い
Posted: 2008年6月29日(日) 10:29
by 翡翠
>tkmakwins15 さん
いろいろとありがとうございます。
インデントをして
タグを入れると、インデントを二回する事になる、と思っていましたので、プログラムの方のインデントはすべて外してしまいました。きっとそのせいですね。以後、気をつけます。
GCCでのコンパイル方法としては、
gcc ○○○○○.c の方法しか習っておりません。
g++ ○○○○○.cc とは、C++のコードのコンパイル方法ですか?
ということは、上記の
mat_add(ma, mb, mc);
という書き方は、C++の書き方なのでしょうか?
プログラムが読みにくいため、やり直します。以下、上記のプログラムと同じです。これでインデントがされるのでしょうか?
[pre]
#include <stdio.h>
void mat_add(const int ma[2][3], const int mb[2][3], int mc[2][3])
{
int i,j;
for(i=0; i<2; i++)
for(j=0; j<3; j++)
mc[j]=ma[j]+mb[j];
}
int main(void)
{
int i,j;
int ma[2][3]={{1,2,3},{4,5,6}};
int mb[2][3]={{6,3,4},{5,1,2}};
int mc[2][3]={0};
mat_add(ma, mb, mc);
for(i=0;i<2;i++){
for(j=0;j<3;j++)
printf("%3d",mc[j]);
printf("\n");
}
return(0);
}
Re:コンパイラによる違い
Posted: 2008年6月29日(日) 10:46
by tk-xleader
>gcc ○○○○○.c の方法しか習っておりません。
>g++ ○○○○○.cc とは、C++のコードのコンパイル方法ですか?
そうです、C++の場合、拡張子が.ccだったり.cppだったりします。
>という書き方は、C++の書き方なのでしょうか?
そうではないです。Cとしてコンパイルしても成功はします。警告は出ますけど…
Linux上ではなくWindows上のCygwinでやってますが、たぶんgccの構文解析は同じはずなので、たぶん大丈夫のはずです。
Re:コンパイラによる違い
Posted: 2008年6月29日(日) 12:06
by 管理人
このHPを作っている管理人です。リンクの件ありがとうございます。もちろんOKですよ。
Re:コンパイラによる違い
Posted: 2008年6月29日(日) 15:40
by 翡翠
>tkmakwins15 さん
ありがとうございます!
Linux上でも、コンパイルできてました。警告が出るだけで、コンパイル自体は成功しているのですね。ちゃんと確認していなかった私のミスです。本当にすみませんでした。そして、ありがとうございます。
しかし、警告の出ない多次元配列の渡し方って、ないものですかね?
>管理人さん
リンクの件、ありがとうございます。数日中に張る事に致します。