OS:WinNT4.0
環境:VC++6.0 MFC

コンパイル時に次のエラーが出て来ました。

error C2664: 'qsort' : 4 番目の引数を 'int (const void *,const void *)' から 'int (__cdecl *)(const void *,const void *)' に変換できません。 (新しい機能 ; ヘルプを参照)スコープ内でこの名前を持つ関数でターゲット型に一致するものはありません。

qsort関数の引数関数を'int xxxxxxx(const void *,const void *)に宣言したところこのエラーが出てきました。
何がなんだかさっぱりわかりません。
ぜひお願いします。

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

A 回答 (3件)

 まず、CとC++では動作のメカニズムが異なるため、Cでコンパイルされた関数をC++から呼び出す場合には、その旨をC++コンパイラに指示する必要があります。



 qsort関数はCのライブラリ関数であり、qsortが内部から呼び出す比較関数もCでコンパイルされたものでなければなりません。
 ところが比較関数はC++ソース内に記述され、C++としてコンパイルされるため、qsortからは呼び出せないというエラーが出ているのです。

 一体何がそんなに違うのかというと、内部的な関数名や、引数の処理の仕方(スタックのクリア方法)などが大きく異なるのです。これを指定するのが「関数呼び出し規約」と言われるものです。ちなみにCにはありません。
 C++内でのCの呼び出し規約は「__cdecl(C default callの略)」というキーワードで表されます。異なる呼び出し規約への変換は出来ないため、質問のようなエラーが出たのでしょうね。

 確かに比較関数に__cdeclをつけて宣言すれば直ると思いますが、普通は「リンケージ指定」を使って、
  extern "C" int comp(const void *a, const void *b);

  extern "C"
  {
    int comp(const void *a, const void *b)
    {
      // コード
    }
  }
のように書いて、そこだけCとしてコンパイルします。
 また比較関数に関するコードだけ、.cのファイルに記述しても同様の効果があります。

 __cdeclなどは推奨されたキーワードではないため、自分ではなるべく使わない方が良いでしょう。
    • good
    • 0

こんにちは。

itohhといいます。

qsort関数は、メンバ関数として定義しては行けません。
静的関数として定義しましょう。

例.
void CTest::m_qsort()
{
qsort(buf, num, len, ::xxxxxx );
}

static int __cdecl xxxxxx(LPCVOID a, LPCVOID b)
{
}
    • good
    • 0

こんにちは。


エラーメッセージ内に (__cdecl *) がありますよね。
これは関数の呼び出し規約が __cdecl ですよーと言う意味です。
VC++6.0 でプロジェクトを作るとデフォルトの呼び出し規約が
__cdecl になっていて問題なくビルドが通ると思いますが、
呼び出し規約を変えませんでした?

呼び出し規約の変更はメニューから、
プロジェクト(P)→設定(S)→C/C++タブ→カテゴリ[コード生成]
にあります。

確認してみて下さい。
    • good
    • 0

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

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

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

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

Q404ERROR の 意味の統一はいつからですか?

こんばんは~! ネットワークのカテゴリーのエキスパートな方々!回答宜しく~^^

質問はタイトルの通りなのですが、『404 ERROR』はいつ頃から共通に利用されてるのですか?
仮に最初に統一した人がいるのなら、使用許諾や使用に当っての利点若しくは、お金が来てるの?

Aベストアンサー

HTTPエラーコード404。
Not Found:要求されたURIに対するマッチする情報が見つからない(RFC1945)
通信規約上の約束です。

RFC(Request For Comment:ご意見お待ちしてます)はインターネット標準案と標準規約を記述したメモで、誰でも参照して利用することが出来ます。

いつから?と問われればRFC1945に制定されたメモが発表された1996年からです。

Q44行目: パラメータ '__format' は const signed char * 型として定義されているので int は渡せない(関数 main )

☆--------------ソース--------------☆
#include <stdio.h>

struct seiseki {
int no;
char fname[20];
char lname[20];
int val[3];
}seito;

int main(void)
{
int i,total;
FILE *fp;
FILE *file;
struct seiseki seito[20];
char buf[1024];
fp = fopen("in.txt", "r");
i=0;
while( fgets(buf, sizeof(buf), fp) ){
struct seiseki tmp;
sscanf(buf,"%d %s %s %d %d %d",&tmp.no,tmp.lname,tmp.fname,&tmp.val[0],&tmp.val[1],&tmp.val[2]);
seito[i++] = tmp;
}
printf("ID / NAME / 数(1) / 数(2) / 数(3) \n");
for(i = 0; i < 3; i++) {
printf("%d / %s %s / %d / %d / %d\n",
seito[i].no,seito[i].lname,seito[i].fname, seito[i].val[0], seito[i].val[1], seito[i].val[2]);

}
file = fopen("output.html","w");
fprintf(file ,"<HTML><HEAD></HEAD><BODY><table border=1 bodercolor=black cellspacing=0 width=700>\n");
fprintf(file ,"<tr bgcolor=#FF7575><td>ID</td><td>氏名</td><td>数(1)</td><td>数(2)</td><td>数(3)</td><td>合計点</td><td>平均点</td><td>偏差値</td><td>順位</td></tr>\n");
for(i = 0; i < 3; i++) {
fprintf(file ,seito[i].lname);
fprintf(file ,seito[i].fname);
☆省略☆
fprintf(file ,seito[i].val[0]);
☆省略☆

}
fprintf(file ,"\n</table></BODY></HTML>\n");
return 0;
}

☆--------------ソース--------------☆
#include <stdio.h>

struct seiseki {
int no;
char fname[20];
char lname[20];
int val[3];
}seito;

int main(void)
{
int i,total;
FILE *fp;
FILE *file;
struct seiseki seito[20];
char buf[1024];
fp = fopen("in.txt", "r");
i=0;
while( fgets(buf, sizeof(buf), fp) ){
struct seiseki tmp;
sscanf(buf,"%d %s %s %d %d %d",&tmp.no,tmp.lname,tmp.fname,&tmp.val[0],&tmp.val[1],&tmp.val[2]);
seito[i++] = tmp;
}
printf("I...続きを読む

Aベストアンサー

fprintf(file ,seito[i].val[0]);を
fprintf(file ,"%d",seito[i].val[0]);
にしてみて下さい。

Q404 Error Not Found と出てしまします

初めてホームページを作ろうとしている者なので、専門用語ではなく、わかりやすく教えて下さいませm(__)m
「HETEMULU」を使って、ホームページを作り、半年かけて、やっと完成しました^^;
そして、無料だと聞いたので、「忍者ホームページ」サイトで、
「NINJA TOOLS」?という所で、IDやパスワードを取得し、なんとか出来たと思ったのですが、

登録されているあなたのURL

とい所をクリックすると、

404 Error Not Found と出てしまします。

何故ですか??

色々触ってみたけど、わかりません^^;

もう一つ質問ですが、無料素材屋さんから、画像をダウンロードして、
「名前をつけて保存」と書いてあったので、例えば「鉢植え」と保存しました。「HETEMULU」で画像の挿入をクリックすると、「鉢植え」の後ろに.gifと付き、問題ないように思っているのですが、日本語で保存しているから、404 Error Not Found と出てしまうのでしょうか?それともそれはまったく関係ないのでしょうか?
慣れていらっしゃる方にはおバカな質問かもしれませんが、どうかどなたか教えて下さい!説明が足りなければ補足しますので、どうかよろしくお願いします!!!

初めてホームページを作ろうとしている者なので、専門用語ではなく、わかりやすく教えて下さいませm(__)m
「HETEMULU」を使って、ホームページを作り、半年かけて、やっと完成しました^^;
そして、無料だと聞いたので、「忍者ホームページ」サイトで、
「NINJA TOOLS」?という所で、IDやパスワードを取得し、なんとか出来たと思ったのですが、

登録されているあなたのURL

とい所をクリックすると、

404 Error Not Found と出てしまします。

何故ですか??

色々触ってみたけど、わか...続きを読む

Aベストアンサー

作成したHTMLファイルをサーバーにアップロード(転送)済みで
しょうか?
トップページは必ず「index.html」または「index.htm」である
必要があります。
「index.htm」にする場合は、元からある「index.html」を削除
(※下記ページ参照)
http://www.ninja.co.jp/faq/a/37/

おすすめのFTPソフト
「FFFTP」
http://www2.biglobe.ne.jp/~sota/

日本語ファイルは表示されない場合もあるので、英数字のファイル名
が推奨されています。
http://www.ninja.co.jp/faq/a/79/

Q44行目: パラメータ '__format' は const signed char * 型として定義されているので int は渡せない(関数 main )

たびたび、Cについてご質問させて頂いていますが件名のようなエラーで行き詰まっています。

内容は、textファイルを読み込み、htmlファイルを生成するといったものです。成績管理みたいなことをしたいと考えています。とりあえず、44行目に
fprintf(file ,seito[i].val[0]);
で数(1)の点数をHTMLに書き込みたいのですが、
件名のエラーが表示されうまくコンパイルができない状態です。お助けくださいませ。よろしくお願いいたします。

Aベストアンサー

fprintfは、引数として
ファイルポインタ、出力書式文字列、変数並び
をとります。
質問文の場合、出力書式文字列がありません。
"%d"のような感じで書きます。

出力書式については、調べてみて下さい。

Q教えて下さい!なぜ【WebApp: Error 404】のページが出る?

JDK + apache + mod_webapp.so + tomcat + PostgreSQLをインストール・設定しました。

JDK     j2sdk-1_3_1_11-linux-i586
apache    apache1.3.31
mod_webapp.so
tomcat    jakarta-tomcat-4.1.30
PostgreSQL    postgresql-7.2.3

(1)
http://localhost:8080/index.jsp
【tomcat】のページが出ます。

(2)
http://localhost/
【あなたの予想に反して、このページが見えているでしょうか?】のページが出ます。

(3)
http://localhost:8080/examples/jsp/index.html
【JSP Samples】のページが出ます。

(4 問題点)
http://localhost/examples/jsp/index.html
【WebApp: Error 404】のページが出ます。
希望 → (3)と同じページが出る。

起動は tomcat → apache の順です。

なぜ【WebApp: Error 404】のページが出るのでしょうか?
教えて下さい。
お願いします。
(初心者なので出来ればわかりやすくお願いします)

JDK + apache + mod_webapp.so + tomcat + PostgreSQLをインストール・設定しました。

JDK     j2sdk-1_3_1_11-linux-i586
apache    apache1.3.31
mod_webapp.so
tomcat    jakarta-tomcat-4.1.30
PostgreSQL    postgresql-7.2.3

(1)
http://localhost:8080/index.jsp
【tomcat】のページが出ます。

(2)
http://localhost/
【あなたの予想に反して、このページが見えているでしょうか?】のページが出ます。

(3)
http://localhost:...続きを読む

Aベストアンサー

設定内容が書いていないので
いかんともあれなんですが。。。(^^;
以下の手順をご確認下さい。

1.mod_webapp.soをapacheのlibexecに配置している。

2.apacheのhttpd.confに以下を記述している。
------------------------------------------------------
LoadModule webapp_module libexec/mod_webapp.so
AddModule mod_webapp.c

<IfModule mod_webapp.c>
WebAppConnection warpConnection warp localhost:8008
WebAppDeploy examples warpConnection /examples
WebAppInfo info
</IfModule>
------------------------------------------------------

3.tomcatのserver.xmlに以下を記述している。
------------------------------------------------------
<Service name="Tomcat-Apache">

<Connector className="org.apache.catalina.connector.warp.WarpConnector"
port="8008" minProcessors="5" maxProcessors="75"
enableLookups="true" appBase="webapps"
acceptCount="10" debug="0"/>

<Engine className="org.apache.catalina.connector.warp.WarpEngine"
name="Apache" debug="0">

<Logger className="org.apache.catalina.logger.FileLogger"
prefix="apache_log." suffix=".txt"
timestamp="true"/>

<Realm className="org.apache.catalina.realm.MemoryRealm" />

</Engine>

</Service>
------------------------------------------------------

4.tomcat、apacheの順で再起動

どう?

設定内容が書いていないので
いかんともあれなんですが。。。(^^;
以下の手順をご確認下さい。

1.mod_webapp.soをapacheのlibexecに配置している。

2.apacheのhttpd.confに以下を記述している。
------------------------------------------------------
LoadModule webapp_module libexec/mod_webapp.so
AddModule mod_webapp.c

<IfModule mod_webapp.c>
WebAppConnection warpConnection warp localhost:8008
WebAppDeploy examples warpConnection /examples
WebAppInfo info
</IfModule...続きを読む

Qエラー「invalid conversion from `void (*)()' to `void (*)(int)'」

皆様、よろしくお願いしたします。RedHat9上で
次のような「鬼ごっこのプログラム」server.cをコンパイルしています。

$ g++ -o server server.c
server.c: function 内の `void session_init(int, char, int, int, char, int,
int)':
server.c:134: invalid conversion from `void (*)()' to `void (*)(int)'

というエラーが出てしまいます。
134行というと
「 signal(SIGINT, die);」
なのですが何が間違っているんでしょうか?

Aベストアンサー

die の宣言を
void die(int sig);
にしたのであれば, session_loop の中で die を呼出すときにも引数は必要ですよ.

また, 最後の die の定義のところでも引数を取るようにしていますよね? ←念の為.

QError!! HTTP status code=404

Error!! HTTP status code=404

いつもお知恵拝借、ありがとうございますm(_ _)m

さて、最近当社で中古XP (prof.)パソコンを2台導入しました。sp3にupしております。

取引先のサイトにアクセスし、IDとpasswordでログインして「取引明細」をダウンロードしようとしましたが、ファイルのアイコンをクリックしたら上記のようなエラーメッセージが出ます。

2台とも同じエラーが出ます。

「教えてgoo」や他のサイトで検索してもなかなか、コレというページが見あたりません。

以前からあるもう一台のXPからはアクセスでき、見ること・プリントすることが出来ます。

アクセスしようとしたファイルは拡張子が".ilf"で、検索の結果どうやら電子帳票のファイルのようです。

このようなトラブルは初体験なので、皆さんのお知恵を是非拝借したいと思います。どうかよろしくお願いいたしますm(_ _)m

Aベストアンサー

ILFのことについてはわかりませんが、単純にHTTP のエラーコード404は、
Not Foundですね。

要するに、指定のページやファイルが見当たらないということ。

先方のシステム内で、指定されたファイルがないということではないですか?
それを先方のWEBサーバーと連携したILFのシステムが応えていると・・・

先方の担当者に聞いた方がいいと思いますが。
特定のシステム内のことですので、担当者以外は本当のことはわかりません。

Q「void ( *signal(int sig, void (*func)(int)) ) (int)」の (int)

signal関数の書式についてですが、

  void ( *signal(int sig, void (*func)(int)) ) (int);

最後に付く(int)は一体何でしょうか?
このような関数の書式ははじめて見ました。
UNIX系の何かでしょうか。
回答よろしくお願いします。

Aベストアンサー

typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t sighandler);
より後半部分のtypedefを置き換えると
sighandler_t signal(int signum, void (*sighandler)(int));
つぎに戻り値の部分のtypedefを置き換えると
void (*signal(int signum, void (*sighandler)(int)))(int);
となります。
(
sighandler_t signal(int signum, void (*sighandler)(int));
の「signal(int signum, void (*sighandler)(int))」をAと置き換えて
sighandler_t A;
からtypedefを置き換えると
void (*A)(int);
となり、Aを戻すと
void (*signal(int signum, void (*sighandler)(int)))(int);
となる。
)

typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t sighandler);
より後半部分のtypedefを置き換えると
sighandler_t signal(int signum, void (*sighandler)(int));
つぎに戻り値の部分のtypedefを置き換えると
void (*signal(int signum, void (*sighandler)(int)))(int);
となります。
(
sighandler_t signal(int signum, void (*sighandler)(int));
の「signal(int signum, void (*sighandler)(int))」をAと置き換えて
sighandler_t A;
からtypedefを置き換...続きを読む

QHTTP 404 error

Vine Linux,Tomcat5で
(1)webapps/conf/server.xml
...
<HOST>
<Context path="/apress" docBase="apress" debug="0" reloadable="true" />
...
(2)webbapps/apress/login.jsp
...
<table width="500" border="0" cellspacing="0" cellpadding="0">
<form name="loginForm" method="post" action="servlet/chapter2.login">
<tr><td width="402"><div align="right">User Name: </div></td>
<td width="399"><input type="text" name="username"></td>
</tr>
...
(3)webapps/apress/WEB-INF/web.xml
...
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>chapter2.login</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
...
(4)webapps/apress/WEB-INF/classes/chapter2/login.java
package chapter2;

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;

public class login extends HttpServlet {
private String target = "/welcome.jsp";
private String getUser(String username, String password) {
// Just return a statice name
// If this was reality, we would perform a SQL lookup
return "Bob";
}
....
(4)現象:
http://xxx.xxx.xxx.xxxx:8080/apress/login.jsp
でsubmit action 後、次のエラーが出てきました:
HTTP 404 error,
The requested resource (/apress/servlet/chapter2.login) is not available.

この問題はどこにあるでしょうか教えてください。

Vine Linux,Tomcat5で
(1)webapps/conf/server.xml
...
<HOST>
<Context path="/apress" docBase="apress" debug="0" reloadable="true" />
...
(2)webbapps/apress/login.jsp
...
<table width="500" border="0" cellspacing="0" cellpadding="0">
<form name="loginForm" method="post" action="servlet/chapter2.login">
<tr><td width="402"><div align="right">User Name: </div></td>
<td width="399"><input type="text" name="username"></td>
</tr>
...
(3)webapps/apress/WEB-INF/web....続きを読む

Aベストアンサー

パスの指定が間違ってるからだと思いますが。

/apress/servlet/chapter2.login

このパスにちゃんと存在してますか?

Q関数の引数をvoid*でキャストする

最近見かけたCのプログラムで、関数の引数の型は void* なのですが、その関数を使うときに 引数をvoid*でキャストしていました。
例えば、
func ( (void*) p );
こういうことです。

私の知っている知識では、
void* と 任意の型のポインタは キャストなしに相互に代入可能です。

関数の引数でも、キャストは要らないものだと思っていました。
そうすると、引数を void* でキャストするのは無意味だと思うのですが、・・・
違うのでしょうか。処理系によるとか。

逆に、関数の引数の型がchar*などで、渡すものが void* のときはどうなのでしょうか。

下のプログラムは、関数byte_orderの引数の型はvoid*ですが、int型へのポインタ( &a )を設定しています。私の環境では、コンパイルエラーも警告もないし、動作も正常です。

#include <stdio.h>
#include <string.h>

void byte_order(void *vp)
{
char char_array[4];
strncpy(char_array, vp, 4);
printf("出力します:%x %x %x %x\n", char_array[0], char_array[1], char_array[2], char_array[3]);
}

int main(void)
{
int a = 0x12345678;
byte_order(&a);

return 0;
}

このプログラムは単なる一例であって、質問はバイトオーダに関するものではありません。
また、C言語の質問であって、C++ではありません。

最近見かけたCのプログラムで、関数の引数の型は void* なのですが、その関数を使うときに 引数をvoid*でキャストしていました。
例えば、
func ( (void*) p );
こういうことです。

私の知っている知識では、
void* と 任意の型のポインタは キャストなしに相互に代入可能です。

関数の引数でも、キャストは要らないものだと思っていました。
そうすると、引数を void* でキャストするのは無意味だと思うのですが、・・・
違うのでしょうか。処理系によるとか。

逆に、関数の引数の型がchar*...続きを読む

Aベストアンサー

>私の知っている知識では、
>void* と 任意の型のポインタは キャストなしに相互に代入可能です。

そのとおりです。
キャストの必要はありません。
あってもなくてもかまいません。


>関数の引数でも、キャストは要らないものだと思っていました。
>そうすると、引数を void* でキャストするのは無意味だと思うのですが、・・・
>違うのでしょうか。処理系によるとか。

明示的に”void*にしているよ!”ということを示したい場合などに私はよく書きます。
まぁ、書いても書かなくても一緒ってことですけど。

>逆に、関数の引数の型がchar*などで、渡すものが void* のときはどうなのでしょうか。

こちらに関しては、Cではエラーは出ませんが、C++ではエラーになります。


人気Q&Aランキング

おすすめ情報