• ベストアンサー

VisualStudio.netでmemcmp関数が使えない?

以前VC++6.0で作ったプログラムをVisualStudio.net_pro_ver2003でコンパイルしようと思っています。 VC++の空プロジェクトを作り、既存項目の追加で以前作成したソースファイルを挿入し、 それをコンパイルしました。 すると、初めにmemcmp関数が「'/clr'オプションを持つCコンパイラで完全なプロトタイプ関数が必要です」と表示され、 memcmpのある全ての行に対し、「関数へのポインタを通して実行される呼び出しに対する引数が多過ぎます」いうエラーが出てしまいます。 strings.hもインクルードしておりますし、VC++では問題なくコンパイルが通っていたので原因が良く分かりません。 そもそもVC時代から良く分からずに使っていたので基本が出来ていないようですが、 宜しく御願い致します。

noname#92327
noname#92327

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

VisualStudio.net_pro_ver2003 の cl を使ってコンソールプログラムをコンパイルしてみたところ問題なくmemcmp が使用できましたので、ver2003で使えないということではないです。 待てば、もっと詳しい人が答えてくれると思いますが・ おそらくランタイムライブラリの指定オプションの指定が必要か /clr オプション云々ということなので、 .NET用コンパイルをしているということなんで、 String.Compare に置き換えるか、 /clr オプションを無効にするとか 検討違いだったらごめんなさい。

noname#92327
質問者

お礼

すみません。 プロジェクトに追加したファイルの中に別のソースが混じっており、 main関数が2つ出来ていたのが原因でした。 memcmpは別のソースのmain関数に含まれていました。 ケアレスミスでお手をお掛けいたしまして申し訳ありませんでした。

その他の回答 (2)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

念の為確認したいんですが, インクルードしているのは strings.h ですか? それとも string.h ですか?

noname#92327
質問者

お礼

すみません。 プロジェクトに追加したファイルの中に別のソースが混じっており、 main関数が2つ出来ていたのが原因でした。 memcmpは別のソースのmain関数に含まれていました。 ケアレスミスでお手をお掛けいたしまして申し訳ありませんでした。 それとstring.hでしたね。 includeは間違えておりませんでした。 重ね重ね申し訳ありません。 申し訳ありませんが、ポイントは回答の順番とさせて頂きます。すみません。

回答No.2

もしかして、関数ポインタを使ったりはしていませんか?  void (*func)(void) ← このようなもの もしくは、C++のコンポーネント等を使ってはいませんか? これだけでは推測するのが困難なので、 memcmp()を実際にどのように使っているかを記述してください。

noname#92327
質問者

お礼

すみません。 プロジェクトに追加したファイルの中に別のソースが混じっており、 main関数が2つ出来ていたのが原因でした。 memcmpは別のソースのmain関数に含まれていました。 ケアレスミスでお手をお掛けいたしまして申し訳ありませんでした。 申し訳ありませんが、ポイントは回答の順番とさせて頂きます。本当にすみません。

関連するQ&A

  • VisualStudioでC関数の呼び出し

    VisualStudio2008のなんらかのプロジェクトから C関数の呼び出しを行いたいのですが、 現在、VC++とMFCでWindowsForm等を作成して そこからextern"C"でC言語の関数をcallしているのですが MFC自体、無くなりつつあり、VS2008EXPRESSではサポートされていません。できれば無料版のEXPRESSで実現したいのですが どういう方法があるでしょうか? ダイアログとボタン程度のWindowsFormは使用したいのですが。

  • プロトタイプ宣言について

    C言語で関数を作成しプロトタイプ宣言するときの質問です。 関数実体の引数に構造体のポインタを宣言します。 プロトタイプ宣言には,構造体のポインタを宣言したのと同じ位置にvoid *を宣言します。 関数実体とプロトタイプ宣言は,異なるファイルです。 このように作成した関数は,VC++2008では,コンパイルできるのですが, なぜ関数実体の宣言とプロトタイプ宣言の型が異なるのにコンパイルできるのでしょうか? また,この関数を別ファイルの関数から呼び出した場合,正しく引数を理解し,正しく処理されます。 これは,言語仕様として正しい書き方なのでしょうか? それとも環境依存の書き方なのでしょうか? ご存知の方がいましたらお答えお待ちしています。

  • GCCで関数の引数が渡らない

    gcc Ver2.9 でSH-2の開発をしています。 通常に関数を作成し、引数を渡しているのですが、引数が渡らないという現象が起きています。 現象は、 1.引数はポインタではなく値渡しである 2.引数の値が0の時だけ正しく渡らない。値が0以外の時は正常にわたる 3.引数の型は一致している 4.引数は複数あるが、後半のいくつかがだめ(何個とまでは詳しく調べていません) 5.ある特定の関数の特定の呼び出しのみがだめで全てだめというわけではない 6.コンパイルオプションに -m2 をつけるとだめだが、-m1 オプションだと問題ない 7.最適化オプションをなくしても同じだった といった状況です。 上記5からある特定の記述方法とか順序になるとだめになるのではないかといろいろ試してみたのですが見つけられません。6から記述方法に誤りがあるとも考えにくい状況です。コンパイラのバグといって片付けていいものなのかどうかです。どなたか同じような経験をされた方はいらっしゃいませんか。また関数呼び出しの場合、コンパイラがどうやって引数を渡すかご教授願えませんか。

  • borlandでコンパイルすると、「プロトタイプ宣言のない関数 'exit' の呼び出し」という警告が出てきます。

    borlandでコンパイルすると、「プロトタイプ宣言のない関数 'exit' の呼び出し」という警告が出てきます。 一応ソースの文頭には、 #include<stdio.h> を入れているのですが、この警告を出なくするのにはどの様にしたらいいのでしょうか?

  • メンバー関数ポインタ

    非常に基礎的なことで申し訳ないですが。 クラスのメンバー関数へのポインタ変数へ 代入しようとすると 関数呼び出しには引数リストがありません。 とエラーがでます。 何がわるいでしょうか? 以下のような感じのコードです。 void (classname::*P_func)() = classname::func; 定義しただけと思いますが。。 VCです。 よろしくお願いします。

  • Borland C++ Compiler 5.5でland関数がコンパイルできません

    初歩的な質問ですみません。C言語のプログラミングの質問です。 タイトルどおり、Borland C++ Compiler 5.5でland関数がコンパイルできません。OSはWindows XPで、「c言語を始めよう!」を使ってプログラムを作っています。 今まで学校でunixを使っていたので、その時は何の設定もせずに使えたので普通に使ったのですが、”プロトタイプ宣言のない関数 'rand' の呼び出し”や”プロトタイプ宣言のない関数 'srand' の呼び出し”というエラーが出ます。 timeを使うために#include <time.h>が必要だったり、そのようなunixでは不必要だった下準備が必要なのでしょうか?

  • 関数のプロトタイプ宣言

    #include <stdio.h> #define N 3 #define M 4 int sum(int [][M]); (関数のプロトタイプ宣言) int main(){   ・   ・   ・ return(0); } int sum(int x[][M]){    ・    ・ } 以上のプログラムより、関数のプロトタイプ宣言や、関数内の 行列の定義でint sum(int [][M]);や int sum(x[][M]){}となっていますが なぜ、列にMだけを代入することだけでよいのでしょうか? また、教科書に関数のプロトタイプ宣言ではint sum(int [][]);だけでもよいと書かれていたのですが 実際、コンパイルしてみたところ 'int[]' 型のサイズは未知あるいはゼロとエラーがでました。 これは、コンパイラによってできるものとできないものがあるのでしょうか?? よろしくお願いします。

  • 関数に値の代入 [C言語]

    C言語初心者です。関数とポインタについて勉強していたのですが、ふと関数の型を知りたくなってVC++で型を調べてみたんです。そしたら、void型で引数のない関数の型は void (__cdecl*)() となっていました。voidと__cdeclはわかります。 そしてこれ型に*が入ってるじゃないですか。ということは関数はポインタということになると思います。なので私はもしかしたら値の代入ができるのではないか、と思ったのです。早速、 f1=f2;(f1とf2は型と内容の同じ関数) や、 (*f1)=(*f2); としてポインタの中身や参照先の関数の実態の値を処理中に書き換えてみようとしました。ですが、多分そうなるとは思ったのですが、コンパイルエラーが出ました。 《エラーの内容》 error C2106:'=':左のオペランドが、左辺値になっていません。 warning C4550:式は引数リストのない関数として評価します。 関数を書き換えようとすること自体馬鹿げていることは重々承知です。でも、微かにいけそうな気がするんですよ。代入させたくないなら関数の型は一律constにすると思うし(実際関数をconstをつけて宣言してもOKだった、(プロトタイプ有り無しでも))、関数への代入は問答無用で駄目なのならばそういうエラーメッセージを出すと思うんです。 関数の書き換えは100%無理でしょうか?それとも関数を書き換える方法があるでしょうか?回答よろしくお願いします。

  • 関数ポインタを返す関数の型をtypedefする方法

    C言語について質問します。 ある関数を定義するとします。 その関数は引数としてintを一つ取り、返値としてその関数と同じ型の関数へのポインタを返すようにしたいのですが、どのように書けばよいのでしょうか? そして、その関数の型をtypedefで定義したいです。 例えば、FNをtypedefしたいその関数の型だとすると、 typedef FN (*FN)(int); のようなFNを定義したいのですが、上のように書いても当然コンパイラ(VC9)に怒られます。 最悪、 typedef void* (*FN)(int); とvoidポインタを返すように定義しておいて、そのポインタを返値として受け取った側でFNにキャストし直す方法で対処できなくもないですが、ちょっと強引過ぎる気がします。 何かいい方法はあるのでしょうか? boost::functionあたりを使えばできそうな、そうでもないような気がしますが、できれば純粋なCでの解決法を望みます。 よろしくお願いします。

  • C言語 関数プロトタイプ宣言の引数に配列を入れたいのですが

    関数プロトタイプ宣言(自作関数)の引数に、A[4][4]というような配列を入れたいのですが、コンパイル時にエラーでincompatibleといわれてしまいます。 A[0][0]からA[3][3]までを個別に引数に指定してもエラーになります。 良い方法は無いでしょうか?