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

初めて投稿させて頂きます。よろしくお願い致します。
現在、以下のような、2次元配列による動的なメモリの確保を意図して、コードをC/C++にて記述しています。
(コンパイラはMINGW32のg++ 3.4.5)

//mallocによるメモリ動的確保
data = (char **)malloc(num * sizeof(char*));
for(i=0; i<rowNum; i++){
data[i] = (char *)malloc(sizeof(char)*256);
}

//newによるメモリ動的確保
data = new char*[rowNum];
for(i=0; i<rowNum; i++){
data[i] = new char;
}

C++で書くのならば、
「mallocによるメモリ確保は辞め、newによるメモリ確保をしなさい」
という指摘が、書籍でもwebでもありましたので、
両方書き、両者を比べているのですが、理由がイマイチ分かりません。

10万行ほどのテキストデータで実験させてみたのですが、
mallocによる記述の方が、動作が数秒速いようなのです。

それで、new やmalloc で実際何をやっているのか、コードを見ようと思ったのですが、

newでは、

void* operator new(std::size_t) throw (std::bad_alloc);
void* operator new[](std::size_t) throw (std::bad_alloc);
void* operator new(std::size_t, const std::nothrow_t&) throw();
void* operator new[](std::size_t, const std::nothrow_t&) throw();
inline void* operator new(std::size_t, void* __p) throw() { return __p; }
inline void* operator new[](std::size_t, void* __p) throw() { return __p; }

というnewファイルの記述で行き詰まり、

malloc は malloc_allocator.hというファイルで行き詰りました。

以上を踏まえて、
1)そもそも、上記のメモリ動的確保記述はスマートな書き方なのか
2)実際に、newやmallocは、どういった手法でメモリ領域を確保しているのか

以上の2点について、ご教授下さい。よろしくお願い致します。

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

A 回答 (9件)

まあ, operator new[] は operator delete[] のための管理情報を追加しなきゃならないのでどうしても malloc より遅くなる (少なくとも「速くなることだけはない」) んですけどね....


どうしても速度が欲しいなら malloc, お手軽を求めるなら std::vector を使うのが普通かな. ああ, 今どき 3.4.5 もどうかと思うので 4.3.3 なり 4.4.2 にするってのも考えるべきかと.
    • good
    • 0
この回答へのお礼

vectorで同様の処理を書いていたこともあったのですが、処理が重たくなり過ぎてしまったので、今はやっていません。

コード残しておけば良かったですが。。。どうやって書いてたかな。

MINGW32の標準は3.4.5で、4.x以降は開発版だとどこかで読んでいたので、3.4.5で開発していました。
4.xも検討してみます。

ご回答ありがとうございました。

お礼日時:2009/10/30 01:57

> ごめんなさい、理解できません。


> arrayの要素数は静的に決まるかと。

私自身、少し混乱があったようです。
何を考えていたかというと...

配列を動的に割り付けたい動機というのは、サイズを可変にしたいか、記憶域期間の問題をクリアしたいか、どのどちらかのケースが多いと思います。
そこで、後者の場合であれば、

array<array<char, 256>, 10>* data = new array<array<char, 256>, 10>;

で済むのではないかと考えていました。
ただ、最初の話の流れでは、

vector<vector<char> > data;

とすることを(私自身)想定していましたので、一貫性を失っていますね。
もちろん、vectorを使った場合でも、記憶域期間の問題をクリアするには、

vector<vector<char> >* data = new vector<vector<char> >;

とすることになるのでしょうが。
    • good
    • 0
この回答へのお礼

実は記憶域期間の問題も抱えていて、別の形で質問させて頂こうと思っています。

STL等が十分に使える環境では、積極的にvectorを使ったほうが良さそうですね。

コメント頂いたキーワードから、知識の幅が広がりました。みなさん、ご回答ありがとうございました。

お礼日時:2009/11/01 01:36

> 単に動的に割り付けたいだけなら、十分かと思います。



ごめんなさい、理解できません。
arrayの要素数は静的に決まるかと。
    • good
    • 0

> arrayは固定長なのでmalloc/newの代わりにはなりません。



可変サイズにするならそうですね。
単に動的に割り付けたいだけなら、十分かと思います。
    • good
    • 0

> std::tr1::arrayでもよいと思います。



arrayは固定長なのでmalloc/newの代わりにはなりません。
    • good
    • 0

freeとdeleteを間違うようなプログラマは、(もっと紛らわしい)deleteとdelete[]を確実に使い分けられるとは思えません。


理想をいえば、そんなプログラマを使わないのが一番ですが、そうもいかないのであれば、配列形式のnewは全廃したほうがよいでしょう。
代わりはstd::vectorが最有力ですが、TR1が使える環境であれば、std::tr1::arrayでもよいと思います。std::vectorやstd::dequeを使う場合、push_backやinsert後に反復子が無効になるので、フールプルーフを考えると、std::tr1::arrayのほうがよいかもしれません。
    • good
    • 1
この回答へのお礼

プログラムは専門ではないのですが、freeとdeleteはきちんと使い分けています。
配列のときは、delete [] x; として開放しています。

恥ずかしながら、TR1の存在は知りませんでした。
vectorやdequeについても、少し検索してみましたが、とてもデータを扱いやすそうですね。

勉強になります。ありがとうございます。

お礼日時:2009/10/30 22:19

> 「mallocによるメモリ確保は辞め、newによるメモリ確保をしなさい」


> という指摘が、書籍でもwebでもありましたので、
> 両方書き、両者を比べているのですが、理由がイマイチ分かりません。

newで確保したメモリはfree()で解放してはいけない
malloc()で確保したメモリはdeleteで解放してはいけない
という制約があります。
このため、1つのプロジェクトの中で、何の方針もなく
mallocによるメモリ確保とnewによるメモリ確保が入り乱れていると
後で解放する時にfreeすべきかdeleteすべきかを間違える可能性があり、
バグのもとになるとされています。

このことから、どちらかに統一すべきであり、
統一するなら、言語レベルでサポートされていて高機能である
newで統一すべきということが一般論として言われています。

(参考)
http://ja.wikipedia.org/wiki/Malloc#C.2B.2B.E3.8 …
    • good
    • 0
この回答へのお礼

wikipedia にmallocに関する記事があるとは、盲点でした。
勉強になりました。

ご回答ありがとうございました。

お礼日時:2009/10/30 13:02

newはmallocには無い機能があります。


例えばインスタンスをnewで生成する場合には、
引数付のコンストラクタを呼び出せます。
Hoge *h = new Hoge(1);
他にはnewは失敗した場合、例外を投げることができます。
new[]は他の回答者さんの仰る通りvectorを使う方がお手軽ですが、
STLを使いたくない等の理由がある場合は、new[]を普通に使います。
    • good
    • 0
この回答へのお礼

newにはそんな使い方もできたのですね。
これは知りませんでした。
malloc単体では例外を投げることが出来ないのも納得です。
STLは出来れば避けたいので、newでやってみようと思います。

ご回答、ありがとうございました!

お礼日時:2009/10/30 02:17

GCCの場合、operator newはmallocを用いて実装されています。

mallocに失敗した場合にstd::set_new_handlerで登録した関数を呼び出し、(通常)例外を送出する処理を行うことになるため、どうしてもmallocより遅くなります。

C++ではmallocを使ってはいけないのではなく、非C互換型に対してmallocを使ってはならないと考えたほうがよいでしょう。ただし、正しく使い分けられないのであれば、newに統一したほうが無難なことは確かです。

あと、配列形式のnewも、どうしてもそれを使わなければならない理由がない限りは避けたほうがよいでしょう。普通はstd::vectorを使います。bool型のようにstd::vectorが適切でない場合には、std::dequeを使うとよいでしょう。

MinGWのバージョンに関しては、現状の最新版は4.4.0ですが、-finput-charsetだったか-fexec-charsetだったかが正しく動作しなかったように記憶しています。これでは日本語がまともに使えないので、古いバージョンを使ったほうがましでしょう。
自分でコンパイルし直す手間を惜しまないなら、それもよいとは思いますが...
    • good
    • 0
この回答へのお礼

gccでは、newの中でもmallocを用いているんですね。
例外処理などで、安全性を高めるためにnewが実装されていると。
なるほど。

std::vectorだと、扱うデータが大きく処理速度が落ち過ぎるようなので、敬遠しています。std::dequeについては知りませんでしたので、勉強させて頂きます。

3.4.5でも、-finput-charsetや-fexec-charsetはきちんと動作してくれませんでした。今はその都度、エスケープしています。

逆に言えば、4.4.0にアップグレードしても、不安要素はそのくらいということですか・・・なら、アップグレードしてしまったほうがいいですね^^;

ご回答ありがとうございました!

お礼日時:2009/10/30 02:12

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

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

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

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

Qファイルやディレクトリの存在確認を行う方法

ファイルをオープンするのはfopenでOKですが、ファイルやディレクトリの存在確認を行う方法が知りたいです。

何か組み合わせて作るものなのでしょうか?
perlとか便利な演算子があるのですが、C/C++って器用ではないですね。
これは処理系?依存の内容ですか?

私の環境は VC6, VC2005 Windows2000です。

Aベストアンサー

int access(const char* path, int mode);
int stat(const char* path, struct stat* sb);

かな?
MSDN を引くと _access_s() を使えとか書いてあるけど。

QLNK2019: 未解決の外部シンボルのエラーが出る

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自キャラのデータ
Point2D g_jikipos = {40, 400};//自キャラの座標

//画像ハンドル
int g_jikiimage[11];

//色々なファイルの読み込み
int LoadFiles(){
//画像ファイル読み込み
if(LoadDivGraph("media\\player01.bmp",
11,11,1,64,64,g_jikiimage) == -1) return -1;

return 1;
}


 mymain.h
//他から呼び出させるMyMainの関数
void MyMain();
int LoadFiles();


 myhelper.h(サンプルなので打ちミスはない)
#include "DxLib.h"
#include <limits.h>
#include <math.h>

//構造体宣言
//座標またはベクトルを記録する構造体
struct Vector{
float x,y;
};
typedef Vector Point2D;
//線を記録する構造体
struct Line2D{
Point2D startpos, endpos;
float katamuki;//傾きをラジアン値で記録
Vector speed;//移動している場合は速度をセット
};
//球体を記録する構造体
struct Ball2D{
Point2D position;
float hankei;//半径
};
//四角形を記録する構造体
struct Rect2D{
Point2D lefttop;
Point2D rightbottom;
float width;
float height;
};


//ライブラリ関数
Point2D PosInView(Point2D in);
int XInView(float inx);
int YInView(float iny);
void ScrollToLeft(float jikiposx);
void ScrollToRight(float jikiposx);
void ScrollToUp(float jikiposy);
void ScrollToDown(float jikiposy);
void DrawLineInView(float x1, float y1, float x2, float y2, int Color, int Thickness);
void DrawCircleInView(float x, float y, float r, int Color, int FillFlag);
void DrawAnimation(float x, float y, double ExtRate, double Angle,int TurnFlag,
int *imgarray, int allframe, float fps);
//ベクトル関数
Vector CreateVector(Vector in, float veclen);
Vector AddVector(Vector v1, Vector v2);
Vector SubVector(Vector v1, Vector v2);
Vector AddVectorInFrameTime(Vector pos, Vector speed);
Vector AddVectorInFrameTime2(Vector pos, Vector speed, Vector accel);
Vector Normalize(Vector in);
Vector RotateVector(Vector in, float radian);
float VectorLengthSquare(Vector in);
float DotProduct(Vector v1, Vector v2);
float CrossProduct(Vector v1, Vector v2);
void SetLine2DKatamuki(Line2D *in);
void DrawLine2D(Line2D in, int Color, int Thickness);
void DrawBall2D(Ball2D in, int Color, int Fill);
//当たり判定関数
bool HitTestLineAndBall(Line2D linein, Ball2D ballin);
bool IsPointAtLineFace(Line2D linein, Point2D ptin);
bool HitTestLineAndLine(Line2D line1, Line2D line2);
bool HitTestBallAndBall(Ball2D a, Ball2D b);
bool HitTestPointAndBox(Rect2D rect, Point2D pt);
//タイマー関数
void SetSimpleTimer(int idx, int time);
int GetPassedTime(int idx);


//グローバル変数
extern float g_frametime;
extern Rect2D g_framerect;//画面領域(当たり判定)
extern Point2D g_current_field_pos;//現在の左上座標
extern Rect2D g_stagesize;//ステージサイズ

//定数宣言
const float ZEROVALUE = 1e-10f;
const float PIE = 3.1415926f;
const int SCROLL_LIMIT = 200;
----------------------------------------------------------------
 エラー内容
1>myhelper.obj : error LNK2019: 未解決の外部シンボル "void __cdecl MyMain(void)" (?MyMain@@YAXXZ) が関数 _WinMain@16 で参照されました
1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\my\Debug\my.exe : fatal error LNK1120: 外部参照 1 が未解決です
1>my - エラー 2、警告 0
ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ
----------------------------------------------------------------
画像を貼り付けときます
(見えにくい場合→http://www.dotup.org/uploda/www.dotup.org154142.jpg.html)
初心者なのでわかりやすくお願いします

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自...続きを読む

Aベストアンサー

ファイル構成から推測するに
mymain.cpp というファイルに
void MyMain(void) {
// ここに処理を書く
}
という関数が必要なようです。

QLPCWSTRとchar

質問なのです・・・

現在、私は[Visual Stdio.Net 2005]を使って、C++のプログラミングをしようと思いまして、今日参考書を見てやってみたのですが、

charの配列を使って、文字列を格納しそれを使おうとしたら、LPCWSTRのキャストが必要というエラーがでました。
参考書だと普通に通るらしいのですが・・・Visual Stdio.Net 2003と2005の違いなのでしょか?わかる方教えていただけませんでしょうか??

Aベストアンサー

補足です。
2005デフォルトのUNICODEを変更する方法は
プロジェクト->プロパティ->構成プロパティ->全般 の中にある
文字セットを[Unicode 文字セットを使用する]から[マルチバイト文字セットを使用する]
に変更することで可能です。

Qcout と cerrの違い

こんにちわ。
どうも初歩的な質問だと思うのですが、教えてください。

C++で、cerrとcoutの違いは何なのでしょうか?
どちらも同じように出力できますし。
自分でエラー表示を出力させたいような時にcerrを使えばよいのでしょうか?

使い分ける必要がいまいち分かりません。
お暇なときにでもお願いします。

Aベストアンサー

cerr:標準エラー出力 =C言語では stderr
cout:標準出力 =C言語では stdout

どちらもコンソールへの出力ですが、違いはハンドルが違うことです。
このため、リダイレクトやパイプのやり方が変わります。
http://www-or.amp.i.kyoto-u.ac.jp/algo-eng/db/stdinout.html

この違いを利用すると、通常の出力を標準出力に出力しエラーのみエラー出力に
しておくことで、リダイレクトやパイプを利用しているときでも、エラーは
コンソールに出力されるので便利になります。

尚、Windows系では、標準エラー出力へのリダイレクトは
abc 2> route.txt
のような書式になります。(#2さんの書式はWindows系では使えません)
http://www.monyo.com/technical/windows/04.html

参考URL:http://www-or.amp.i.kyoto-u.ac.jp/algo-eng/db/stdinout.html,http://www.monyo.com/technical/windows/04.html

cerr:標準エラー出力 =C言語では stderr
cout:標準出力 =C言語では stdout

どちらもコンソールへの出力ですが、違いはハンドルが違うことです。
このため、リダイレクトやパイプのやり方が変わります。
http://www-or.amp.i.kyoto-u.ac.jp/algo-eng/db/stdinout.html

この違いを利用すると、通常の出力を標準出力に出力しエラーのみエラー出力に
しておくことで、リダイレクトやパイプを利用しているときでも、エラーは
コンソールに出力されるので便利になります。

尚、Windows系では、標...続きを読む

Q構造体の初期化のmemsetの第三引数

memset(&lvitem, 0, sizeof(LVITEM));
memset(&lvitem, 0, sizeof(lvitem));
LVITEMに特化した質問ではなく構造体の初期化について、この2つの書き方によるソース管理やコンパイルでのメリットとデメリットを教えてください。

Aベストアンサー

(1)memset(&lvitem, 0, sizeof(LVITEM));
この書き方は、構造体LVITEMを初期化しているんだな、と分かりやすい。
(2)memset(&lvitem, 0, sizeof(lvitem));
この書き方はとにかく変数lvitemを初期化するんだな、という感じだが、型が分からないので宣言しているところを参照しなければならない。
それともう一つ、ただ単に何回も初期化するんでなければ、こういう書き方もできる。
(3)LVITEM lvitem = {0};

結局どれがいいのかといえば、個人的にはケースバイケースですねえ。初期化を1回すればいいような感じなら(3)、構造体名を明示した方が調べる手間がなくなるようなら(1)、そうでなければ(2)を使います。
コンパイルでのメリット、デメリットは特にないんじゃないかなあ。アセンブラがまだ全盛だった頃ならともかく、いまじゃどのコンパイラだって最適化オプションで同じようなコードはくでしょう。
気にするほどでもないと思うけど…

Qint型からchar型への変換

タイトル通り、int型からchar型への変換の仕方がわかりません!><
どうしたらいいのでしょうか?

Aベストアンサー

#include <stdio.h>


char buf[5];
int no;

no = 10;
sprintf(buf, "%d", no);

QC++ 構造体の一括初期化 {0}

構造体変数に {0} を代入すると、CString は空文字、 intは0に一括で初期化されるようです。
なんでこんなことが出来るのでしょう?
{0}は何?
仕組みを教えて下さい!!

Aベストアンサー

> 一括初期化関数でも作るしかなさそうですね
static変数を初期化用に用意しておくのはいかが?
http://oshiete.goo.ne.jp/qa/2658268.htmlより
>静的記憶域期間をもつオブジェクトを明示的に初期化しない場合、
>次の規定に従う。
>a) そのオブジェクトの型がポインタ型の場合、空ポインタに初期化する。
>b) そのオブジェクトの型が算術型の場合、(正または符号なしの)0に初期化する。
>c) そのオブジェクトが集成体の場合、各メンバにa)~d)の規定を(再帰的に)
>適用し初期化する。
>d) そのオブジェクトが共用体の場合、最初の名前つきメンバにa)~d)の規定を
>(再帰的に)適用し初期化する。

なので、zero初期化されていることが、規格で保証されます。

typedef struct hoge_struct
{
 int a;
 int b;
} hoge_struct;

static hoge_struct initializer; //初期化用変数。値は変えない。

int main(void)
{
 hoge_struct hoge;
 hoge = initializer;
 return 0;
}
真っ白に何度も初期化したいなら、こんな感じでどうでしょう?
関数を用意して初期化すると、構造体のメンバが増えると関数も修正しないといけない
ですが、これだと関数を変更しなくてすむし。

> 一括初期化関数でも作るしかなさそうですね
static変数を初期化用に用意しておくのはいかが?
http://oshiete.goo.ne.jp/qa/2658268.htmlより
>静的記憶域期間をもつオブジェクトを明示的に初期化しない場合、
>次の規定に従う。
>a) そのオブジェクトの型がポインタ型の場合、空ポインタに初期化する。
>b) そのオブジェクトの型が算術型の場合、(正または符号なしの)0に初期化する。
>c) そのオブジェクトが集成体の場合、各メンバにa)~d)の規定を(再帰的に)
>適用し初期化する。
>d) そのオブジェクトが共用...続きを読む

QLinuxのgccのインクルードパス?

Linuxのgccで、インクルードファイルやライブラリのパスを設定する方法が知りたいのですが、gccについて詳しい書籍やサイトがありましたら、教えてください。

gccとccの違いも知りたいです。

例)
#include "example.h"

このままだと、example.hが無いと表示されます。

Aベストアンサー

標準ライブラリのパスは、gccのインストール時に指定して、Cプリプロセッサの中に組み込まれます。

#include "example.h"
は、まずカレントディレクトリを探し、次に gccコマンドラインの -I オプションで指定したディレクトリを探し、最後に標準ライブラリが探されます。

#include <example.h>
は、カレントディレクトリを探さない点が異なります。

ccも基本的には同じですが、Unixの種類によって機能が異なる可能性があります。Linuxの場合はcc=gccです。

QDWORDの実際の型は何でしょうか

VC++.NETの環境です。
DOWRD dw1 = 1;
int i = 2; と定義し
ここで
if ( i > dw1 ){
何かの処理;
}
とコーディングすると
warning C4018: '>' : signed と unsigned の数値を比較しようとしました。
のワーニングがでます。
これは、DWORDがint型でなくunsigned int型のようにも見えます。
ある本によれば(VC++.V.NET逆引き大全500の極意)
DWORD はint型であると記述されています。
もし、int型ならこのワーニングはでないはずなのですが、
なぜでるのでしょうか。又、DWORDの実際の型は何なのでしょうか。ご存じのかたおりましたら、教えていただけませんでしょうか。

Aベストアンサー

型定義が知りたいのならば、宣言ファイルを見れば疑問を挟む余地もありません。
DWORD型はwindef.hで
"typedef unsigned long DWORD;"
と宣言されています。

Visual Studioを使っているのならば、知りたい型の上にマウスポインタを置いて右クリック、ポップアップメニューの「定義へ移動」または「宣言へ移動」で簡単に知ることが出来ます。

Qfatal error LNK1120: 外部参照 1 が未解決です

またわからないことが・・・
教えて下さい。
以下をVC++2005でコンパイルすると、

MSVCRTD.lib(crtexew.obj) : error LNK2019: 未解決の外部シンボル _WinMain@16 が関数 ___tmainCRTStartup で参照されました。
C:\Documents and Settings\tomato\My Documents\Visual Studio 2005\Projects\a\Debug\a.exe : fatal error LNK1120: 外部参照 1 が未解決です。

と警告がでて通りません。
何のことでしょうか。

#include<stdio.h>
#include<process.h>

struct meibo{
  char name[20];
  char tel[20];
  char address[20];
};

void message( void );
void input( FILE *fp, int cnt , struct meibo *a, int *end );

void main( void )
{
  struct meibo a[20];
  FILE *fp;
  int cnt, end;

  if( (fp=fopen( "meibo.dat", "w" ) ) == NULL ){
    printf( "Can not open the meibo.dat.\n" );
    exit( 1 );
  }

  message();

  fprintf( fp, "番号, 名前, TEL, 住所\n" );
  fflush( fp );

  cnt = 0;
  end = 0;
  while( end == 0 ){
    input( fp, cnt, &a[cnt], &end );
    cnt++;
    fflush( fp );
    if( cnt == 20 ){
      printf( "人数が一杯です.終了します.\n" );
      end = 1;
    }
  }
  fclose( fp );
}

void message( void )
{
  printf( "名前, TEL, 住所, endを入力してください.\n" );
  printf( "継続の時はend=0," );
  printf( "中止の時は,end=1と入力してください.\n" );
}

void input( FILE *fp, int cnt, struct meibo *a, int *end )
{
  printf( "名前-->" );
  scanf( "%s", a->name );
  printf( "TEL -->" );
  scanf( "%s", a->tel );
  printf( "住所-->" );
  scanf( "%s", a->address );
  printf( "Exit? Continue:0 Exit:1 -->" );
  scanf( "%d", end );
  printf( "\n" );
  fprintf( fp, "%2d, %s, %s, %s\n",
    cnt+1, a->name, a->tel, a->address );
}

またわからないことが・・・
教えて下さい。
以下をVC++2005でコンパイルすると、

MSVCRTD.lib(crtexew.obj) : error LNK2019: 未解決の外部シンボル _WinMain@16 が関数 ___tmainCRTStartup で参照されました。
C:\Documents and Settings\tomato\My Documents\Visual Studio 2005\Projects\a\Debug\a.exe : fatal error LNK1120: 外部参照 1 が未解決です。

と警告がでて通りません。
何のことでしょうか。

#include<stdio.h>
#include<process.h>

struct meibo{
  char name[20];
...続きを読む

Aベストアンサー

http://www.a.math.ryukoku.ac.jp/~hig/course/compsci2_2005/man/faq.html
にある現象と同じではないでしょうか、一度お試しください。


人気Q&Aランキング

おすすめ情報