• ベストアンサー

外部シンボルが未解決

本に載っていたソースなんですが,外部シンボル 'drand48()' が未解決(C:\NYU.OBJ が参照)というエラーが出てなかなかコンパイルできません。drand48という関数はstdlib.hに含まれていると思うのですが,何故だか分かりません。どなたか分かる方,是非ともお力をお貸しください。 環境はbcc55です。元のソースはC++Builder4で作られたそうです。字数の関係ですべて載せることができませんが,よろしくお願いします! #include <stdio.h> #include <math.h> #include <string.h> #include <locale.h> #include <stdlib.h> #define Iunits 14 #define Hunits 200 #define Ounits 2 #define Rlow -0.30 #define Rhigh 0.30 #define A 1.4 #define B 0.3 #define fout(x) ( 1 / (1 + exp( -(x) ) )) #define urand() ( drand48() * (Rhigh - Rlow) + Rlow ) ~中略 void initialize()/*各ユニットに乱数で重みを振り当てる*/ { int i,j; for (i = 0; i < Hunits; i++){ for (j = 0; j < Iunits; j++){ wih[i][j] = urand(); } shikiih[i] = urand(); } for (i = 0; i < Ounits; i++){ for (j = 0; j < Hunits; j++){ who[i][j] = urand(); } shikiio[i] = urand(); } } ~少略

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

  • ベストアンサー
回答No.3

> なんとかwindowsでできないでしょうか? ↓これでいかがでしょ。 static long long x=0x1234ABCD330E; double drand48() /* 0.0以上1.0未満 */ { x = x*0x5DEECE66D + 0xB; return (x&0xFFFFFFFFFFFF)*(1.0/281474976710656.0); } long lrand48() /* 0以上2147483647以下 */ { x = x*0x5DEECE66D + 0xB; return(long)(x>>17)&0x7FFFFFFF; } long mrand48() /* -2147483648以上214748367以下 */ { x = x*0x5DEECE66D + 0xB; return(long)(x>>16)&0xFFFFFFFF; } void srand48(long s) { x = s; x = (x<<16)+0x330E; }

marsvolta
質問者

お礼

なんとかコンパイルできました。まだ問題が発生してexeファイルは実行できませんが,もう一度全体を見直してみます。ありがとうございました!

その他の回答 (2)

回答No.2

drand48はUNIX/Linux系の関数です。 どんなコンパイラ(ライブラリ)でも提供されるものではないでしょう。

marsvolta
質問者

お礼

回答ありがとうございます。UNIX/LINUX系ですか・・・。度々質問して申し訳ないのですががなんとかwindowsでできないでしょうか?

  • phoenix343
  • ベストアンサー率15% (296/1946)
回答No.1

drand48?そんな関数名は無いと思ったけど… 標準の関数じゃないのは確かだね。スペルミスってことはないよね?

marsvolta
質問者

お礼

回答ありがとうございます。スペルミスということはないです。

関連するQ&A

  • 外部シンボル未解決

    学習のため勉強していますが test3.obj : error LNK2001: 外部シンボル ""int * g_array" (?g_array@@3PAHA)" は未解決です。 となります。リンクエラーだと解りましたが、どこに問題があるのかわかりません。 ソースは以下のとおりです。よろしくお願いします。 【stdafx.h】 #include "targetver.h" #include <tchar.h> #ifndef _TEST4_H_ #define _TEST4_H_ #include <stdio.h> #include <stdlib.h> #include <time.h> const int MAXARRAY = 30; extern int g_array[MAXARRAY]; void printArray(); #endif #include "stdafx.h" 【test3.h】 int _tmain(int argc, _TCHAR* argv[]) { //配列の初期化 srand((unsigned int)time(NULL)); for(int i = 0; i < MAXARRAY; i++) { g_array[i] = rand() % 1000; } printArray(); return 0; } 【test4.h】 #include "stdafx.h" void printArray() { for(int y = 0; y < MAXARRAY/10; y++) { for(int x = 0; x < 10; x++) { int i = y * 10 + x; printf("%3d ", g_array[i]); } printf("\n"); } }

  • 配列について

    Visual c++なのですが #include<stdio.h> #include<stdlib.h> int main(){ FILE *fin,*fout; int HAP[135135][14];   long i,j; long x=135135,y=14; ・・・ のときは実行可能なのですが、 #include<stdio.h> #include<stdlib.h> int main(){ FILE *fin,*fout; int HAP[135135][14];   long i,j; long x=135135,y=14; ・・・ のときはビルトは可能できますが、デバックすると動作を停止してしまいます。なぜできないのかわからないで悩んでいます。是非教えてください。 ・・・の部分はほぼ同文です

  • 九九表について

    C言語で九九表を書いているのですが #include <stdio.h> #include <stdlib.h> int main(){ int i, j; int resultOf9x9[] = ???; for (i = 1; i <= 9; i++) { for (j = 1; j <= 9; j++){ printf("%d ", resultOf9x9[i*j]); } printf("¥n"); } exit(0); } 初期値の設定の???の部分をどう宣言していいかわかりません。 よろしくお願いします。

  • C言語でファイルから複素数の値を読み込んで表示させるプログラムを作って

    C言語でファイルから複素数の値を読み込んで表示させるプログラムを作っています。 扱う値が実数のみの場合に関しては問題ないのですが、 複素数を読み込む時には、実数のみの場合や、虚数のみの場合もあり、 どう読み込んでいいか分からず、アドバイスを戴きたいと考えております。 それ以外のデータの取り扱い自体は問題ないと思います。 下は実数の値を読み込むプログラムとデータセット、 それを拡張した複素数の値を読み込むプログラムとデータセットになっております。 アドバイス、よろしくお願いいたします。 -------------------------------------------------------------------------------- /*データセット sample.dat*/ 4 3.5 -2 9 12 37.8 65.4 0.4 79.5 3 23.4 5.3 -------------------------------------------------------------------------------- /*プログラム本体 read.c*/ #include <stdio.h> #include <stdlib.h> #define LOW 3 #define COLUMN 4 int main(void){ int i,j; double x[LOW][COLUMN]; if((fp = fopen("sample.dat","r"))==NULL){ printf("The file is not found. : sample.dat \n"); exit(1); } for(i=0;i<LOW;i++){ for(j=0;j<COLUMN;j++){ fscanf(fp,"%lf",&x[i][j]); } } for(i=0;i<LOW;i++){ for(j=0;j<COLUMN;j++){ printf("%lf\n",x[i][j]); } } return 0; } -------------------------------------------------------------------------------- /*データセット sample_C.dat*/ 4+i i -2 9+i 12 37.8-i 65.4i 0.4+i 79.5 3+i 23.4 5.3 -------------------------------------------------------------------------------- /*プログラム本体 read_C.c*/ #include <stdio.h> #include <stdlib.h> #define LOW 3 #define COLUMN 4 typedef struct{ double re; double im; }C_double; int main(void){ int i,j; C_double x[LOW][COLUMN]; if((fp = fopen("sample_C.dat","r"))==NULL){ printf("The file is not found. : sample_C.dat \n"); exit(1); } /*改良したい読み込み部分*/ for(i=0;i<LOW;i++){ for(j=0;j<COLUMN;j++){ fscanf(fp,"%lf",&x[i][j].re); fscanf(fp,"%lf",&x[i][j].im); } } for(i=0;i<LOW;i++){ for(j=0;j<COLUMN;j++){ if(x[i][j].re!=0){ if(x[i][j].im!=0){ printf("x[%d][%d]=%lf+%lfi\n",i,j,x[i][j].re,x[i][j].im); } else{ printf("x[%d][%d]=%lf\n",i,j,x[i][j].re); } } else{ if(x[i][j].im!=0){ printf("x[%d][%d]=%lfi\n",i,j,x[i][j].im); } else{ printf("x[%d][%d]=0\n",i,j); } } } } return 0; }

  • 2次元配列  CXX0030というエラーの解決について

    おいそがしいところを失礼します。 visual C++2005で、巨大な2次元配列c[][]のプログラムを作成してエラーが出て進まないところです。 データが多すぎるのかとも思っていますが、デバックで確認するとcの値が出ません。 というのは、cの値が”cxx0030;エラーです;式を表記できません”という表示が出てしまいます。 ビルドでは通るのですが、デバックしてもcで引っかかってしまい、実行できません。 巨大処理のため、mallocを使う方法を考えていますので double** c; という宣言をしています。 下記のような簡単なソースにしてもCXX0030の表記が出ます。 どなたかアドバイスありましたらどうかよろしくお願いします。 //////////////////////////////////////////////////////// #include<stdafx.h> #include<stdio.h> #include<math.h> #include<string.h> #include<conio.h> #include<stdlib.h> #include<time.h> #include <locale.h> int main() { double a[10000]; double b[10000]; double **c; return 0; } ///////////////////////////////////////////////////////////

  • Cでオセロゲームプログラム

    Cでオセロゲームのプログラムを作ろうと思ってますが 下記のプログラムに構造体、2分木(ゲーム木)、リスト構造、ミンマックス法、バックトラック法等を含みたいのですが どのように書いていったらいいかわかりません。 どなたかわかる方いましたらよろしくお願いします。 #include <stdlib.h> #include <stdio.h> #define BOARD_SIZE 8 #define WALL '*' #define BLACK 'x' #define WHITE 'o' #define NONE ' ' char board[ BOARD_SIZE+2 ][ BOARD_SIZE+2 ] ; void board_initialize() { int i , j ; /* 周囲を壁で囲む */ for( i = 0 ; i < BOARD_SIZE+2 ; i++ ) { board[ 0 ][ i ] = WALL ; board[ BOARD_SIZE+1 ][ i ] = WALL ; board[ i ][ 0 ] = WALL ; board[ i ][ BOARD_SIZE+1 ] = WALL ; } /* 内部を何もない状態にする */ for( i = 1 ; i <= BOARD_SIZE ; i++ ) { for( j = 1 ; j <= BOARD_SIZE ; j++ ) { board[ i ][ j ] = NONE ; } } /* オセロの初期状態の配置 */ board[ BOARD_SIZE/2 ][ BOARD_SIZE/2 ] = WHITE ; board[ BOARD_SIZE/2+1 ][ BOARD_SIZE/2+1 ] = WHITE ; board[ BOARD_SIZE/2 ][ BOARD_SIZE/2+1 ] = BLACK ; board[ BOARD_SIZE/2+1 ][ BOARD_SIZE/2 ] = BLACK ; } void board_print() { int i , j ; printf( " " ) ; for( i = 1 ; i <= BOARD_SIZE ; i++ ) printf( "%2d" , i ) ; printf( "\n" ) ; for( j = 1 ; j <= BOARD_SIZE ; j++ ) { printf( "%2d:" , j ) ; for( i = 1 ; i <= BOARD_SIZE ; i++ ) { switch( board[ j ][ i ] ) { case WALL : printf( "■" ) ; break ; case BLACK : printf( "●" ) ; break ; case WHITE : printf( "○" ) ; break ; case NONE : printf( "+" ) ; break ; } } printf( "\n" ) ; } } int main(void) { board_initialize() ; board_print() ; }

  • 関数宣言

    3次元で領域を確保するプログラムをmalloc関数を用いて書きました。しかし、プログラムが長いので関数宣言をしなさいといわれたために、以下のプログラムを書きました。しかし、途中でつまづいてしまい、どのように関数を用いたり、関数を定義すれば良いのか混乱しています。初心者ですが、どうかお願いします。 /*ソース*/ #include<stdio.h> #include<stdlib.h> int main(){ double ***C; f3Malloc(C,.,.); //数値を代入(関数の使い方?) f3Free(C,.,.); } /*3次元配列(返し方?)*/ double*** f3Malloc(C,,){ int i,j,x,y,z; x = 2; y = 3; z = 4; C=(double***)malloc(sizeof(double**)*x*y*z); for(i=0;i<y;i++){ C[i]=(double**)malloc(sizeof(double*)*y*z); for(j=0;j<z;j++){ C[i][j]=(double*)malloc(sizeof(double)*z); } } } /*メモリの解放(返し方?)*/ void f3Free(C,.,.){ int i,j,x,y; x = 2; y = 3; for(i=0;i<x;i++){ for(j=0;j<y;j++){ free(C[i][j]); } free(C[i]); } free(C); }

  • 「外部シンボルが未解決」について教えてください

    BCCを使ってます。windowsのプログラムで、『外部シンボル 'MyCreateFontが未解決』と言うメッセージが出たのですが、リンクエラーなのでしょうか? また、『外部シンボル○○が未解決』と表示された場合、どのような処置をすればいいですか。アドバイスをお願いします。 D:\borland\bcc55\lesson>bcc32 -W -w-8057 timer.cpp Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland timer.cpp: Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland Error: 外部シンボル 'MyCreateFont(int, unsigned long, const char *)' が未解決(D:\BORLAND\BCC55\LESSON\TIMER.OBJ が参照 ) こちらが、宣言の部分です。 #include <windows.h> #define ID_MYTIMER 100 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); ATOM InitApp(HINSTANCE); BOOL InitInstance(HINSTANCE, int); HFONT MyCreateFont(int, DWORD, LPCTSTR); char szClassName[] = "clock"; //ウィンドウクラス int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow)

  • 「外部シンボル '__inp' が未解決」

    Borland C++CompilerとCPad for Borland C++Compilerをつかってdllを作ろうとしているのですが、 コンパイルがうまく行きません。 ------------------------------<Dio32c.c>------------------------------ #include "jni.h" #include <stdio.h> #include <conio.h> JNIEXPORT long JNICALL Java_IO32_InpB(JNIEnv *env, jobject obj, long port) { return _inp(port); } JNIEXPORT void JNICALL Java_IO32_OutB(JNIEnv *env, jobject obj, long port, long data) {_outp(port, data); return; } ---------------------------------------------------------------------- というプログラムに対し、コンパイル時パラメータを「-WD」と指定してコンパイルすると、以下のメッセージが返ってきちゃいます。 ---------------------------------------------------------------------- ■C:\My Documents\C> bcc32 -WD Dio32jc.c Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland Dio32jc.c: ==<警告文は字数制限のため割愛させていただきました。by taropoo>== Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland Error: 外部シンボル '__inp' が未解決(C:\MY DOCUMENTS\C\DIO32JC.OBJ が参照) Error: 外部シンボル '__outp' が未解決(C:\MY DOCUMENTS\C\DIO32JC.OBJ が参照) ---------------------------------------------------------------------- どなたか、原因&対策、分かりませんでしょうか?

  • csvファイルを読み込んで二次元配列に格納したい

    200×250のある数字と文字の入力されたcsvファイル(またはtxtファイル)を読み込んで2次元配列に格納したいのです。 色々調べるとカンマの処理が必要ということがわかりましたが、どのようにソースを書けばよいかわかりません。使用言語はC言語です。 また、実際にcsvファイルを読み込むようにプログラムを書いてみましたが、すべて-858993460となって表示されます。 プログラミング初心者で勉強中なため困っています。 回答よろしくお願いします。 #include <stdio.h> #include <stdlib.h> #define row 200 #define column 250 int main() { int i, j; int data[row][column]; FILE *fp; fp = fopen("sample.csv", "r"); if (fp == NULL){ printf("ファイルがありません\n"); return 1; } for (i = 0; i < row; i++){ for (j = 0; j < column; j++){ fscanf(fp, "%lf", &data[i][j]); } } for (i = 0; i<row; i++){ for (j = 0; j < column; j++){ printf("%3d ", data[i][j]); } printf("\n"); } fclose(fp); return 0; }

専門家に質問してみよう