旅行好きのおしりトラブル対策グッズ3選

C言語でWeb系のプログラムを作成している者です。
以前まで、OSはFreeBSD 4.11-RELEASE-p12・gccのバージョンは2.95.4でコンパイルできていたプログラムが、OSはFreeBSD 5.4-RELEASE-p8・gccのバージョンは・gccのバージョンは 3.4.2で、今まで出なかったようなエラーが沢山出現し、コンパイルできなくなってしまいました。

OSをインストールし直すのは、既に稼働中のサイトですので厳しく、GCCのバージョンを下げるかソースを書き換えるかして対処する方向で行きたいと考えております。
しかし、gccの2.95.4の圧縮ファイルはもう、gccの公式サイトに落ちておらず、バージョンダウンは難しそうです。

gccのバージョンによるコンパイルエラーを乗り越えた方、ご指摘など有りましたらお教えくださると幸いです。

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

A 回答 (5件)

> ソースコードの添付は、会社のものですのでちょっと厳しいので、部分的に…



全文は必要ないのです。エラーが発生した部分を、エラーが再現可能な形で提示してもらえれば、おそらく問題点を指摘できます。

> int a = 0;
> char b[2] = "";
> char *c[256] = {0};
> こういった、宣言の指定部分で特にエラーが出ているようですので、こちらの表記が問題なのでしょうか。

上記の表記自体は問題ありません。ただ、同じ変数に対する初期化が複数回行われていると、

error: redefinition of parameter '○○'
error: previous definition of '○○' was here

ということになります。
具体的には、

int a = 1;
/* 別の宣言並び */
int a = 1;

のように、同じ変数を二回初期化した場合です。
    • good
    • 0
この回答へのお礼

jactaさん、ご回答有難うございます。
エラーの行が多すぎて、エラー箇所を特定できないのが現状です。
もしかしますと、初期化を二回行ってしまっているかも知れません・・・。
特に、他の関数で使われている、同名の変数でエラーが発生しているみたいですので、この辺をチェックし、もう一度ソースを見直してみることに致します。

お礼日時:2006/02/07 09:39

GCCで、2.95.4から3.4.2までのバグフィックスに目を通せば


大概のことは書いていますよ。

私も同様の状況になり、上記の方法で解決しました。

お手軽な方法だと、確かコンパイル時にオプションで
指定バージョンに落とせたと思いましたが、どうでしょう。。。
    • good
    • 0
この回答へのお礼

f_attckさん、ご回答有難うございました。
バグフィクスですね。どうも英語が得意でなくて、避けておりましたが・・・それじゃ駄目ですよね。
これからは、ソフトの仕様も把握してから致します。
バージョンダウン、そんなに簡単にできるのですか!
お教えくださって有難うございます。
もう一度、gccのサイトを調査してみます。

お礼日時:2006/02/07 09:43

C99規格やC++では宣言の位置に関する規定が無くなって(?)いますが、


見易さを考慮すると宣言は一箇所にまとめたほうがいいと思います。
また、ひとつの関数はひとつの仕事だけをするようにすれば、宣言の重複もおきにくくなると思います。
    • good
    • 0
この回答へのお礼

Trick--o--さん、再度ご教授を有難うございます。
同じような関数が何個も存在しているため、細かなミスが随所にあるのかも知れません。
人の作ったプログラムでしたので、あまり弄ることができず・・・。
この辺も、慣れてゆくしかないですよね。

お礼日時:2006/02/07 09:41

バージョンが2.xから3.xに変わったときに出るコンパイルエラーの多くは、処理系の癖に依存するコーディングをしていたことが原因です。

具体的なエラーメッセージとソースコードがわからないと正確なことは何もわかりません。

他に、コンパイルエラーは出なくても、部分式の評価順序が変わっていたりするので、規格上、「不定」にあたる動作した実装をしていると、実行時に振る舞いが変わったりします。

バージョンダウンはできると思いますが、将来にわたって不安を残すことになるので、この機に修正することをお勧めします。なお、gccの最新バージョンは4.0.2です。3.xと4.xではまた異なるので、「不定」や「未定義」に依存しないコードを目指してください。加えて、GNU拡張に依存するより、C99に対応させる方が幾らか安全です。

今回のことは、gccが悪いのではなく、元々内在していた不具合が顕在化しただけと考えてください。
    • good
    • 0
この回答へのお礼

jactaさん、ご回答有難うございます。
ソースコードの添付は、会社のものですのでちょっと厳しいので、部分的に…

int a = 0;
char b[2] = "";
char *c[256] = {0};
こういった、宣言の指定部分で特にエラーが出ているようですので、こちらの表記が問題なのでしょうか。
普段PHPを使用している為、未定義・不定でも動いてしまうプログラミングばかり書いており、C言語の未定義・不定義をあまり意識していなかったのが問題かも知れません。
今後のこともありますので、正しい書き方をもう一度調べてみたいと思います。

お礼日時:2006/02/06 11:15

どの様なエラーが出るのでしょう?


基本的に、「正しい」プログラミングをしていればあまりないとは思うのですが……
旧版には入れていた追加ライブラリを新版に入れていない、というようなことはありませんか?

OS自体を変更しているようなので、そこに特化した書き方をしているとコンパイルできなくなるかもしれませんね。

この回答への補足

慌ててしまってすみません。エラーの内容を添付しようと思い返し、修正できないことに気付きました。
Trick--o--さん、有難うございます。

具体的なエラーは以下のような感じです。
OSに特化した部分は特にないと思いますものの、以前までsyntaxerrorの出なかった部分がエラーになっていたりと、コンパイラの仕様が変わっているような印象を受けました。

もし、何か気付く点などありましたら、ご教授頂けると幸いです。

mms_send_v2.1.c:101: error: previous definition of 'sql' was here
mms_send_v2.1.c:270: error: parameter `cmd' is initialized
mms_send_v2.1.c:275: error: parameter `haisin_date_tmp' is initialized
mms_send_v2.1.c:276: error: parameter `start_date_tmp' is initialized
mms_send_v2.1.c:277: error: parameter `buf' is initialized
mms_send_v2.1.c:279: error: conflicting types for 'numrows'
mms_send_v2.1.c:103: error: previous definition of 'numrows' was here
mms_send_v2.1.c:281: error: redefinition of parameter 'i'
mms_send_v2.1.c:104: error: previous definition of 'i' was here
mms_send_v2.1.c:283: error: parameter `count' is initialized
mms_send_v2.1.c:286: error: parameter `buffer' is initialized
mms_send_v2.1.c:287: error: parameter `logstr' is initialized
mms_send_v2.1.c:288: error: parameter `file_name' is initialized
mms_send_v2.1.c:290: error: parameter `seg_flg' is initialized
mms_send_v2.1.c:291: error: parameter `seg_tmp_p' is initialized
mms_send_v2.1.c:294: error: parameter `seg_tmp_count' is initialized
mms_send_v2.1.c:297: error: parameter `car_num' is initialized
mms_send_v2.1.c:308: error: syntax error before "sprintf"
mms_send_v2.1.c:1035: error: redefinition of parameter 'row'
mms_send_v2.1.c:267: error: previous definition of 'row' was here
mms_send_v2.1.c:1036: error: redefinition of parameter 'text_tmp'
mms_send_v2.1.c:273: error: previous definition of 'text_tmp' was here
mms_send_v2.1.c:1041: error: parameter `hit_text' is initialized
mms_send_v2.1.c:1042: error: parameter `hit_sub' is initialized
mms_send_v2.1.c:1043: error: parameter `to' is initialized
mms_send_v2.1.c:1044: error: parameter `buf' is initialized
mms_send_v2.1.c:1044: error: redefinition of parameter 'buf'
mms_send_v2.1.c:277: error: previous definition of 'buf' was here
mms_send_v2.1.c:1045: error: redefinition of parameter 'buffer'
mms_send_v2.1.c:286: error: previous definition of 'buffer' was here
mms_send_v2.1.c:1046: error: parameter `cmd' is initialized
mms_send_v2.1.c:1046: error: redefinition of parameter 'cmd'
mms_send_v2.1.c:270: error: previous definition of 'cmd' was here
mms_send_v2.1.c:1047: error: parameter `kujiurl' is initialized
mms_send_v2.1.c:1048: error: parameter `kensyourl' is initialized
mms_send_v2.1.c:1049: error: parameter `tyusen_num' is initialized
mms_send_v2.1.c:1052: error: parameter `sql' is initialized
mms_send_v2.1.c:1052: error: redefinition of parameter 'sql'
mms_send_v2.1.c:269: error: previous definition of 'sql' was here
mms_send_v2.1.c:1053: error: parameter `text_log1' is initialized
mms_send_v2.1.c:1054: error: parameter `text_log2' is initialized
mms_send_v2.1.c:1055: error: redefinition of parameter 'title_tmp'
mms_send_v2.1.c:273: error: previous definition of 'title_tmp' was here
mms_send_v2.1.c:1056: error: parameter `start_count' is initialized
mms_send_v2.1.c:1057: error: parameter `nowcount' is initialized
mms_send_v2.1.c:1058: error: redefinition of parameter 'i'
mms_send_v2.1.c:281: error: previous definition of 'i' was here
mms_send_v2.1.c:1058: error: parameter `j' is initialized
mms_send_v2.1.c:1058: error: redefinition of parameter 'j'
mms_send_v2.1.c:282: error: previous definition of 'j' was here
mms_send_v2.1.c:1059: error: parameter `num' is initialized
mms_send_v2.1.c:1059: error: redefinition of parameter 'num'

補足日時:2006/02/06 10:53
    • good
    • 1

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

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

Qgccのバージョンを下げる方法

Fedoraでgcc 4.3.0-8を使っています。
訳あって、バージョンを3.4.6に下げたいのですが、
どのようにすればいいでしょうか。
よろしくお願いします。

Aベストアンサー

gccのメジャーバージョンNoが異なる場合は、作成される
実行モジュールの互換性が無い場合が有ります。
止めた方が良いでしょう。
過去の例では、古いバージョンのgccが別名称で用意され
ていた事がありますので、該当する物が無いか探すのも
一つの方法です。
#Fedoreでは常にgccの最新版を使用してるので、一部の
#プログラムで対応しきれない物が出てくる場合が時々
#有り、旧版が同梱されている事もあります。

もしくは
http://unicus.jp/wp/archives/39
yamcha 0.33 が fedora 9 (gcc 4.3) で make できない、そんなとき
にある様に
>つまるところ、gcc 4.2 以前と gcc 4.3 の違いに起因するようです。

>gcc 4.2 以前では、string.h や stdlib.h のようなヘッダ
>ファイルは明示的にインクルードしていなくても、そのヘッダ
>ファイルでプロトタイプ宣言されている関数を呼び出すことが
>できました。

>gcc 4.3 では明示的なインクルードが必要です。
にある様に、必要なヘッダファイルを追加してみて下さい。

gccのメジャーバージョンNoが異なる場合は、作成される
実行モジュールの互換性が無い場合が有ります。
止めた方が良いでしょう。
過去の例では、古いバージョンのgccが別名称で用意され
ていた事がありますので、該当する物が無いか探すのも
一つの方法です。
#Fedoreでは常にgccの最新版を使用してるので、一部の
#プログラムで対応しきれない物が出てくる場合が時々
#有り、旧版が同梱されている事もあります。

もしくは
http://unicus.jp/wp/archives/39
yamcha 0.33 が fedora 9 (gcc 4.3) ...続きを読む

QC言語 配列の長さの上限

C言語で配列Array[N]の長さNの上限っていくらなんでしょうか?
もし可能なのであれば上限を2147483647にしたいのですが、方法を教えてください。

Aベストアンサー

そもそもWindowsの32bit版はアプリが仮想メモリ空間を2GBしか使えません。2GBを超えるには64bit版が必要です。
たとえ64bit版OSだとしても添え字が2147483647って、単純なintの配列だとしても4x2147483647=8GB必要ですね。実メモリ16GBとかのPCを用意しますか?
そもそも配列で2147483647個必要なアルゴリズムに問題ありだと思います。

Q「ご連絡いたします」は敬語として正しい?

連絡するのは、自分なのだから、「ご」を付けるのは
おかしいのではないか、と思うのですが。
「ご連絡いたします。」「ご報告します。」
ていうのは正しい敬語なのでしょうか?

Aベストアンサー

「お(ご)~する(いたす)」は、自分側の動作をへりくだる謙譲語です。
「ご連絡致します」も「ご報告致します」も、正しいです。

文法上は参考URLをご覧ください。

参考URL:http://www.nihongokyoshi.co.jp/manbou_data/a5524170.html

Qポインター引数の関数でコンパイルエラーが出る。

現在ATmega88というアトメル社製のマイコンのプログラミングを行っています。コンパイラはwin_avrを使用しています。

現在void tx_test(cc1101_client * client)というcc1101_clientポインターを引数とした関数を作成したのですが、この関数内でu16 tx_fifo_set(txfifo_data * txfifo)という txfifo_dataポインターを引数とする関数を呼び出したいと思っているのですが、これをコンパイルすると

error: incompatible type for argument 1 of 'tx_fifo_set'というエラーが出力されコンパイルできない状態になります。なぜこのようなエラーになるのでしょうか?





u16 tx_fifo_set(txfifo_data * txfifo)
{


-------------------(中略)-------------------------------------------------------------


}








void tx_test(cc1101_client * client)
{
u8 i=0;
u8 new_input_data=0;

-------------------(中略)-------------------------------------------------------------


while(1)
{
switch(status)
{


-------------------(中略)-------------------------------------------------------------

case FIFO_SETUP:
if(cnt_sent_packet > 100)
{
status = DATA_WAVEOUT_QUIT;
break;
}


//alert_data_get(&client);

cc1100_cmd_flush_tx();
cc1100_cmd_idle();

cc1100_cmd_calibrate();
cc1100_cfg_gdo0(CC1100_GDOx_SYNC_WORD);
mdelay(5);

client->status.sessionflag = 0x02;//SYN flag set
client->status.ivent_flag = 0xa5;


//tx_length = tx_fifo_set(client);
//tx_fifo_set(&client);
tx_fifo_set(client->txfifo);


udelay(10);

#if 1
cc1100_read_reg_uartout((CC1100_REG_TXBYTES | CC1100_ACCESS_STATUS));
#endif

status = DATA_WAVEOUT;
break;


-------------------(中略)-------------------------------------------------------------


}

現在ATmega88というアトメル社製のマイコンのプログラミングを行っています。コンパイラはwin_avrを使用しています。

現在void tx_test(cc1101_client * client)というcc1101_clientポインターを引数とした関数を作成したのですが、この関数内でu16 tx_fifo_set(txfifo_data * txfifo)という txfifo_dataポインターを引数とする関数を呼び出したいと思っているのですが、これをコンパイルすると

error: incompatible type for argument 1 of 'tx_fifo_set'というエラーが出力されコンパイルできない状態になり...続きを読む

Aベストアンサー

struct _cc1101_client_ で、

> txfifo_data txfifo;

と定義されてるんだから、client->txfifoはtxfifo_data*じゃなくてtxfifo_dataでしょう。

> tx_fifo_set(&client->txfifo);

とすればいいのでは?

> これらのポインター構造を乗せさせて頂きます。

という言い回しも意味不明だし、ポインターについての理解が不足しているのではないですか?

Qmakeコマンドのエラーについて(

UNIX(Linux)系のOSやC言語には不慣れなのですが、よろしくお願いします。

普段はWindows7(Home Ed.)を利用しているのですが、
いくつかのlinux系のソフトを利用する際にcygwinも利用しています。


==========================================================
cygwinにソフトウェアをインストールしようとする際に、
ときどき遭遇するエラーなのですが

仮にsoftware.tar.gzというソースファイルからインストールしようとして、

> gunzip -c software.tar.gz | tar xvf -
> cd software
> ./configure
> make
.....
make: *** [all-recursive] error

というエラーが生じて、makeが通らない時があります。
=========================================================


これまで何度か、どういうエラーなのか調べようとする度に挫折し、
何回かやり直している内に、たまたまmakeがすんなり通って
インストールできてしまったりしていたので、
なんとなくうやむやにしていました。

そもそも、この"all-recursive"に全くピンとこないのですが、
これはどういった場合に生じるエラーを示しているのでしょうか?
recursive(再帰的な)だから、関数かなにかの呼び出しに失敗している、
とかそういうことなのでしょうか?


エラーの内容はケースバイケースだし、
漠然とした質問になって申し訳ないのですが、
ちょっとしたアドバイスでもいいので、ご回答をお願いします。

UNIX(Linux)系のOSやC言語には不慣れなのですが、よろしくお願いします。

普段はWindows7(Home Ed.)を利用しているのですが、
いくつかのlinux系のソフトを利用する際にcygwinも利用しています。


==========================================================
cygwinにソフトウェアをインストールしようとする際に、
ときどき遭遇するエラーなのですが

仮にsoftware.tar.gzというソースファイルからインストールしようとして、

> gunzip -c software.tar.gz | tar xvf -
> cd software
> ./configure
> make
...続きを読む

Aベストアンサー

お腹痛いのに、一生懸命違うところを診察しているようなものですかね。

make[2]: *** [tvsetf.o] Error 1
この行より上全部じゃないですか?
WARNINGとかも出てますしね。

仰るとおりケースバイケースではありますが、例えば自分で作ったプログラムでの話ならばプログラムのミスが考えられますが、どこかの出来合いのフリーウェアをmakeしてエラーで落ちる場合は、環境が整っていない場合があります。(○○がインストールされていないとか…)

その辺は全てconfigureやmake時に出てくるメッセージをちゃんと見ることです。

なぜ最後に出てくるall-recursiveだけに注目してるのか知りませんが、見なくてもいいものをずっと見ていても問題は解決しません。

QGetPrivateProfileStringでiniファイル読込む処理を詳しく知りたいのですが・・・

お世話になっています。

iniファイルを読込み、各変数に代入するC言語のDLLを作成したいのです。
このサイトの投稿や、MSDNなどにも載っていたのですが、
少し理解に苦しみます。

現在まで、理解した点がwindows.hのインクルードを
記述するところ辺りです。
iniファイルは下記のようなレイアウトです。

---<mst.ini>----------------------------
[user]
name=username
ID=userid
[pc]
pcname=FMV
----------------------------------------

#include<windows.h>は記述することまでは
分かりましたが、以下から進みません。。。

GetPrivateProfileString("")

初心者で申し訳ありませんが、お助け願います。

Aベストアンサー

こんにちは。itohhといいます。

サンプルを載せておきます。

mst.iniファイル内の[user]セクションのnameキーの値を取得する。
DWORD dwLen=0;
char strBuf[100];
dwLen = GetPrivateProfileString("user",       // セクション名
                "name",       // キー名
                "soushi_ni",     // デフォルト値
                strBuf,       // 読み込んだ値を格納するエリア
                sizeof(strBuf),   // 上記のエリアのサイズ
                "mst.ini" );     // iniファイル名

解説:
iniファイル名をフルパスで指定しないとWindowsのディレクトリにあるものと判断されます。
Win9xなら「c:\windows」、WinNT系なら「c:\WinNT」。

[user]セクションのnameキーがないときは、デフォルト値で指定した値が設定させます。

復帰値「dwLen」は実際に設定した値(文字列)の長さが返されます。

こんにちは。itohhといいます。

サンプルを載せておきます。

mst.iniファイル内の[user]セクションのnameキーの値を取得する。
DWORD dwLen=0;
char strBuf[100];
dwLen = GetPrivateProfileString("user",       // セクション名
                "name",       // キー名
                "soushi_ni",     // デフォルト値
                strBuf,       // 読み込んだ値を格納するエリア
             ...続きを読む

Qchar型にint型の数値を代入する。

たとえば、
int num;
char box; 

numに何らかの整数値が入っているときに、そのnumの中に入っている値をchar型に文字列として代入したいときはどのようにすればいいのでしょうか?

Aベストアンサー

sprintf()っていう関数がありますよ。書式は

sprintf(char型の配列の先頭ポインタ,フォーマット,変数...)

二番目の引数以降はprintf()の引数と同じです。たとえば

int num;
char box[256];
num=100;
sprintf(box,"%d",num);
printf("%s",box);

→100と出力される

Qcc と gcc の違い

CCとGCCの違いについて教えてください。
どちらも、コンパイラという点では同じだと思うのですが、なぜ2つの方式ができたのでしょうか??

少し話がずれますが、プログラムを汎用性も持たせるなら、どのようなオプションをつけるべきでしょうか?
-ansi とか -Wall あたりをつける癖をつけておけば十分なのでしょうか??

G++とGCCの違いについても知っていれば教えて下さい
初歩的な質問ですがお願いします

Aベストアンサー

GCCはそのコンパイラの固有名詞です。
http://gcc.gnu.org/ このサイトに解説があります。
ccは多くの場合そのシステムに標準で突いているコンパイラです。
そのOSのベンダが提供しているばあいもあれば、FreeBSDのように
中身はgccというものもあります。

g++とgccの違いはデフォルトでC++のファイルとして扱うか
というところが違うだけだったはずです。(多分)

Qcygwinインストールでgccが利用できない

perlとgccを使いたいと思いcygwinをデフォルト設定
のままインストールしてセットアップしました。
しかし、perlは使えるもののgccが使えません。
デスクトップ上にできたアイコンからcygwinを
起動しgccと打つと、BASH: gcc: command not found
というエラーメッセージが出ます。
メッセージからしてパスが通っていないのかと思いましたが、
autoexec.batを調べてもパスは通っているようです。

インストール場所は、C:\cygwinというフォルダを作り、
ダウンロードしてきたものをその中に展開しました。
既存のパスに新たに;C:\cygwin\bin(cygwin1.dllのあるフォルダ)
を加えて保存して再起動しました。
OSはWindows Meです。ご助言宜しくお願いします。

Aベストアンサー

set | grep PATH
と打ってみて PATH=に/usr/bin がないと動かないと思います。
gcc が /usr/bin/gcc の場合
ちなみに PATH の設定は autoexec.bat ではないのでそこに設定してもだめです。.bashrc に設定しないと。

Qapt-get install ****** でinstallしたものをuninstallするには?

御世話になります。
vncserverだけをinstallするつもりが
誤って
apt-get install vncとうってしまいました。
これをuninstallしたいのですが
どのようにすればよろしいでしょうか?

教えて下さい。

Aベストアンサー

# apt-get remove パッケージ名
では、設定ファイルは削除されずに残ります。

完全に削除するときは、
# apt-get --purge remove パッケージ名
です。


人気Q&Aランキング

おすすめ情報