C言語でのLU分解を用いた連立一次方程式のプログラムエラーの解決方法

このQ&Aのポイント
  • C言語でLU分解を用いた連立一次方程式のプログラムを起動させる際にエラーが発生してしまいます。解決方法を教えてください。
  • C言語のプログラムでLU分解を用いた連立一次方程式を実行するとエラーが出てしまいます。どのようにしたら正常に動作させることができますか?
  • C言語でLU分解を使った連立一次方程式のプログラムを起動させたいのですが、エラーが発生します。どのようにすればエラーを解決できますか?
回答を見る
  • ベストアンサー

下記のc言語のプログラム(LU分解を用いた連立一次方程式)を起動させた

下記のc言語のプログラム(LU分解を用いた連立一次方程式)を起動させたいのですがエラーがでてしまいます。 どのようにしたら動作しますか? #include <stdio.h> #include <stdlib.h> #include <float.h> #define MAX_DIM 10 #define MIN_DIM 1 int get_dimension(int, int); double *get_matrix( int ); double *get_vector( int ); void set_matrix( int, double* ); void set_vector( int, double* ); void LU( int, double*, double*, double* ); void L_equ( int, double*, double*, double* ); void U_equ( int, double*, double*, double* ); void pr_vector( int, double* ); void matrixcpy( int, double*, double* ); void make_I( int, double* ); void main( void ) { int n , i ; double *A, *b ; double *L, *U ; double *c, *x ; n = get_dimension( MAX_DIM, MIN_DIM ); if( ( A = get_matrix( n ) ) == (double *) NULL || ( L = get_matrix( n ) ) == (double *) NULL || ( U = get_matrix( n ) ) == (double *) NULL || ( b = get_vector( n ) ) == (double *) NULL || ( c = get_vector( n ) ) == (double *) NULL || ( x = get_vector( n ) ) == (double *) NULL ) { fprintf( stderr, "メモリ所得エラーです!!\n" ); } else { set_matrix( n, A ); set_vector( n, b ); LU( n, A, L, U ); L_equ( n, L, c, b ); U_equ( n, U, x, c ); printf( "解は、" ) ; pr_vector( n, x ) ; } }

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

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

> warning C4101: 'i' : ローカル変数は 1 度も使われていません。 変数iが宣言されているけど、どこでも使われてないという警告です。iが確かに必要無いなら無視して構いません。(該当する宣言を削除すると、この警告は出なくなります) > error LNK2019: 未解決の外部シンボル "void __cdecl pr_vector(int,double *)" (?pr_vector@@YAXHPAN@Z) が関数 _main で参照されました。 「pr_vector(int,double *)」という呼出形式の関数がmain関数内で呼び出されていますが、この関数の実体はどこにも見当たらないと言っています。 「関数の実体がソース中に記述されていない」or「関数を含むライブラリがリンクされていない」ということです。プロトタイプ宣言だけでは関数は使えません。関数の実体をきちんと記述するなりライブラリを正しくリンクしてください。 以下、各関数に対して同様のエラーです。

kaiak18782
質問者

お礼

ありがとうございます。

その他の回答 (1)

  • k_kota
  • ベストアンサー率19% (434/2186)
回答No.1

このmain関数はほとんど関数呼び出しだけなのは分かりますか? おそらく関数内部でエラーが発生していますのでこれだけでは分かりません。 あと、どのようなエラーになったのかは最低でも記入して下さい。 本来であれば自分で解析して分からない部分まで切り分けるべきです。 おそらく大学の研究関連でしょう。 素直にまわりの人に聴いてください。

kaiak18782
質問者

補足

エラー内容です。 エラー 10、警告 1 warning C4101: 'i' : ローカル変数は 1 度も使われていません。 error LNK2019: 未解決の外部シンボル "void __cdecl pr_vector(int,double *)" (?pr_vector@@YAXHPAN@Z) が関数 _main で参照されました。 error LNK2019: 未解決の外部シンボル "void __cdecl U_equ(int,double *,double *,double *)" (?U_equ@@YAXHPAN00@Z) が関数 _main で参照されました。 error LNK2019: 未解決の外部シンボル "void __cdecl L_equ(int,double *,double *,double *)" (?L_equ@@YAXHPAN00@Z) が関数 _main で参照されました。 error LNK2019: 未解決の外部シンボル "void __cdecl LU(int,double *,double *,double *)" (?LU@@YAXHPAN00@Z) が関数 _main で参照されました。 error LNK2019: 未解決の外部シンボル "void __cdecl set_vector(int,double *)" (?set_vector@@YAXHPAN@Z) が関数 _main で参照されました。 error LNK2019: 未解決の外部シンボル "void __cdecl set_matrix(int,double *)" (?set_matrix@@YAXHPAN@Z) が関数 _main で参照されました。 error LNK2019: 未解決の外部シンボル "double * __cdecl get_vector(int)" (?get_vector@@YAPANH@Z) が関数 _main で参照されました。 error LNK2019: 未解決の外部シンボル "double * __cdecl get_matrix(int)" (?get_matrix@@YAPANH@Z) が関数 _main で参照されました。 error LNK2019: 未解決の外部シンボル "int __cdecl get_dimension(int,int)" (?get_dimension@@YAHHH@Z) が関数 _main で参照されました。 fatal error LNK1120: 外部参照 9 が未解決です。

関連するQ&A

  • 部分行列の抜き出し(C言語)

    部分行列の抜き出し(C言語) ある行列から、任意の部分行列を抜き出すような関数を作りたいのですが、わからないので手助けをお願いしたいです。 たとえば4行4列の行列Aがあった場合、その2行2列、2行3列、3行2列、3行3列目の 4つの(2行2列の)要素を抜き出すような関数です。 枠組みは出来ているので載せておきます。 #include <stdio.h> #include <stdlib.h> #include <math.h> typedef struct matrix{ double *data; int size[2]; }MATRIX; MATRIX create_matrix(int m,int l,int a); //行列の作成 void print_matrix(MATRIX A); //行列の表示 MATRIX submatrix(MATRIX matrix_A,int m,int n,int l,int k); //任意の部分行列の抜き出し int main(int argc,char **argv) { //構造体の初期化 MATRIX matrix_A={NULL,NULL,NULL}; MATRIX matrix_B={NULL,NULL,NULL}; MATRIX matrix_C={NULL,NULL,NULL}; int m=0; //行列の行 int l=0; //行列の列 int a=1; //要素 double det=0; //行列計算 //行列Aの作成 m=4;//行 l=4;//列 matrix_A = create_matrix( m, l, a); //関数 matrix_C = submatrix(matrix_A,2,2,3,3); //行列結果出力 printf("\n\tmatrix input"); print_matrix(matrix_A); printf("\n\tmatrix output"); print_matrix(matrix_C); //行列の開放 free(matrix_A.data); matrix_A.data=NULL; free(matrix_C.data); matrix_C.data=NULL; printf("終了!\n\n"); return 0; } MATRIX create_matrix(int m,int l,int a) { MATRIX matrix_A={NULL,NULL,NULL}; int i=0; //サイズの確保 行;size[0] 列;size[1] matrix_A.size[0]=m; matrix_A.size[1]=l; //メモリの確保 matrix_A.data=(double *)malloc(sizeof(double)*matrix_A.size[0]*matrix_A.size[1]); if(matrix_A.data == NULL){ printf("メモリ確保失敗!![matrix_A]\n"); exit(1); } //行列Aの作成 for(i=0; i<((matrix_A.size[0])*(matrix_A.size[1])) ;i++){ *(matrix_A.data+i)=a+i; } return(matrix_A); } /*行列の表示*/ void print_matrix(MATRIX matrix_A) { int i=0; int j; //行 int k; //列 printf("\n行列の表示\n"); //行列Aのプリント for(j=0;j<matrix_A.size[0];j++){ for(k=0;k<matrix_A.size[1];k++){ printf("%f\t",*(matrix_A.data+k*matrix_A.size[0]+j)); } printf("\n"); } return; } MATRIX submatrix(MATRIX matrix_A,int m,int n,int l,int k) { MATRIX matrix_C = {NULL,NULL,NULL}; int i,j; //サイズの確保 行;size[0] 列;size[1] matrix_C.size[0]=l-m+1; matrix_C.size[1]=k-n+1; //メモリの確保 matrix_C.data=(double *)malloc(sizeof(double)*matrix_C.size[0]*matrix_C.size[1]); if(matrix_C.data == NULL){ printf("メモリ確保失敗!![matrix_C]\n"); exit(1); } //任意の部分行列の抜き出し (ここがわかりません。) } よろしくお願いします。

  • ガウスの掃き出し法によるC++プログラム

    大学で、ガウスーヨルダンの掃き出し法により連立方程式を解き、係数マトリクスの逆行列と解を表示するプログラムを作れ、という課題が出ました。 4s+t+3u+2v=23 s+4t+3u+3v=30 5s+5t+10u+5v=65 4s+4t+2u+6v=42 という問題です。 まったく素人の状態から4時間ほどやったくらいでこの問題が出たので、解き方が全くわからなかったのですが、いろいろなサイトを巡ってこのようなプログラムを作りました。 #include <stdio.h> #include <float.h> #define N 4 /* 行列の行数および列数 */ double A[N][N] = { { 4.0,1.0,3.0,2.0}, /* 係数行列 A の定義 */ {1.0,4.0,3.0,3.0}, {5.0,5.0,10.0,5.0}, {4.0,4.0,2.0,6.0}}; double b[N] = {23.0,30.0,65.0,42.0}; /* 定数ベクトル b の定義 */ void Gauss_J( int, double*, double* ); void main( void ) { int i; /* カウンタ */ printf( "%d元連立一次方程式\n", N ); for( i = 0; i < N ; i++ ) { printf( "%g s + %g t + %g u + %g v = %g \n", A[i][0], A[i][1], A[i][2],A[i][3], b[i] ); } printf("の解は,\n" ); Gauss_J( N, (double *)A, (double *)b ); /* ガウス・ジョルダン法で解く */ printf( "s = %g \n", b[0] ); printf( "t = %g \n", b[1] ); printf( "u = %g \n", b[2] ); printf( "v = %g \n", b[3] ); } void Gauss_J( int n, double *a, double *b ) { int p, i, j, l ; /* カウンタ */ double pivot, c ; /* ピボット値 */ for ( p = 0 ; p < n ; p++ ) /* 1行目から n行目まで繰り返す */ { pivot = a[ p*n + p ]; /* ピボットを取得する */ for ( i = p ; i < n ; i++ ) /* p行目の p列目から n列目まで */ { a[ p*n + i ] /= pivot; /* 係数行列の p行を pivotで割る */ } b[ p ] /= pivot; /* 定数ベクトルの p行を pivotで割る */ for ( l = 0 ; l < n ; l++ ) /* 1行目から n行目まで */ { if ( l != p ) /* p行を除いて */ { c = a[ l*n + p ]; /* 掃き出す */ for ( j = p ; j < n ; j++ ) { a[ l*n + j ] -= c * a[ p*n + j ]; } b[ l ] -= c * b[ p ]; } } } return ; } これで行列の解は出るようになったのですが、逆行列が表示されてません。 どうすれば表示されるようになるのでしょうか?

  • 【C言語・BLAS】 行列ベクトル積におけるエラー

    今、BLASを使って行列ベクトル積を計算するのにどれくらい時間がかかるか計測しようとしています。 しかし、短いプログラムにも関わらずC用インターフェースのスレッド並列版BLASを呼び出す部分でFloating point exceptionエラーが出てしまいます。 なぜエラーが出るのか全く分からないので、どなたか分かる方ご意見いただけないでしょうか? #define SEED 1 #define N 100 /* extern void dgemv(char transa, int m, int n, double alpha, double *a, int lda, double *x, int incx, double beta, double *y, int incy); */ int main( int argc, char *argv[] ){  char TRANS = 'T';  int INC = 1;  double ALPHA = 1.0;  double BETA = 0.0;  int i, j, n1, n2;  double **matrix;  double *vector;  double *result;  double start_time;  double end_time;  fprintf( stdout, "____performance evaluation start____\n" );  srand(SEED);  matrix = Malloc2DDouble( N, N );  vector = (double *) malloc ( sizeof(double) * N );  result = (double *) malloc ( sizeof(double) * N );  n1 = N; n2 = N;  #pragma omp parallel  {   #pragma omp for private(j)   for( i=0; i<n1; i++ ){    for( j=0; j<n2; j++ ){     matrix[i][j] = ( ( rand() / (double)RAND_MAX ) - 0.5 );    }    vector[i] = ( ( rand() / (double)RAND_MAX ) - 0.5 );    result[i] = 0.0;   }  }  start_time = GetTime();  dgemv( TRANS, n2, n1, ALPHA, matrix[0], n2, vector, INC, BETA, result, INC );  end_time = GetTime();  return EXIT_SUCCESS; }

  • C言語の質問です!

    #include "stdafx.h" #include <iostream> #include <string> #include <stdio.h> #include <math.h> #include <string.h> #include <stdlib.h> #include <time.h> #include <conio.h> using namespace std; double arrayMin(double array[][], int n){ double Min=9999999999999999999999.999999; for(int N=0;N<n;N++){ if(array[N][0]!=NULL&&array[N][0]<Min){ Min=array[N][0]; } } return Min; } double arrayMax(double array[][], int n){ double Max=-9999999999999999999999.999999; for(int N=0;N<n;N++){ if(array[N][0]!=NULL&&array[N][0]<Max){ Max=array[N][0]; } } return Max; } int main(){ double data[3][10] = {{2.0, 1.0, 5.0, 3.0, 2.0, 21.0, 4.0, 5.0, 4.0, 28.0}, {1.0, 1.0, 5.0, 3.0, 2.0, 21.0, 4.0, 5.0, 4.0, 28.0}, {3.0, 1.0, 5.0, 3.0, 2.0, 21.0, 4.0, 5.0, 4.0, 28.0}}; double min, max; min=arrayMin(data, 3); max=arrayMax(data, 3); printf("min = %lf, max = %lf\n", min, max); return 0; } 二次元配列の1行目の配列の最大値と最小値を求めることを考え,上のようなプログラムを書いたのですが, 1>.\maxmin.cpp(12) : error C2087: 'array' : 添字がありません。 1>.\maxmin.cpp(21) : error C2087: 'array' : 添字がありません。 1>.\maxmin.cpp(34) : error C2059: 構文エラー : ']' 1>.\maxmin.cpp(35) : error C2664: 'arrayMax' : 1 番目の引数を 'double [3][10]' から 'double [][1]' に変換できません。(新しい機能 ; ヘルプを参照) 1> 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。 というようなエラーが出てしまいます. 途中のarray[N][0]!=NULLは二次元配列dataが3行より少ない場合に対応させています. どなたかアドバイスをいただけますでしょうか? よろしくお願いいたします!

  • LU分解について

    こんにちは。 行列のLU分解のcによるプログラムを勉強している者です。 LU分解のcによるプログラムについてお尋ねしたいことがございます。 ニューメリカルレシピに、LU分解の方法として 以下のようなコードが記載せれておりました。 void ludcmp(double **a, int n, int *indx, double *d) { int i,imax,j,k; double big,dum,sum,temp; double *vv; // 各行の暗黙のスケーリングを記録する. vv=vector(n); *d=1.0; // まだ行交換していない. for (i=0;i<n;i++) { // 行についてループし,暗黙のスケーリングの情報を得る. big=0.0; for (j=0;j<n;j++) if ((temp=fabs(a[i][j])) > big) big=temp; if (big == 0.0) printf("Singular matrix in routine ludcmp\n"); // 最大要素が0なら特異行列である. vv[i]=1.0/big; // スケーリングを記録する. } for (j=0;j<n;j++) { // Crout法,列についてのループ for (i=0;i<j;i++) { // 方程式(2.3.12)のi=j以外 sum=a[i][j]; for (k=0;k<i;k++) sum -= a[i][k]*a[k][j]; a[i][j]=sum; } big=0.0; for (i=j;i<n;i++) { sum=a[i][j]; for (k=0;k<j;k++) sum -= a[i][k]*a[k][j]; a[i][j]=sum; if ( (dum=vv[i]*fabs(sum)) >= big) { big=dum; imax=i; } } if (j != imax) { for (k=0;k<n;k++) { dum=a[imax][k]; a[imax][k]=a[j][k]; a[j][k]=dum; } *d = -(*d); vv[imax]=vv[j]; } indx[j]=imax; if (a[j][j] == 0.0) a[j][j]=TINY; if (j != n) { dum=1.0/(a[j][j]); for (i=j+1;i<n;i++) a[i][j] *= dum; } } free_vector(vv); } 例えば、LU分解させたい行列3×3の({4,7,6}{2,5,9}{3,1,8})だとしたら、 メイン関数にどのように書いたらLU分解を実行できるでしょうか? ニューメリカルレシピを買って読んでみたものの、よく理解できず、質問させていただきます。 稚拙な質問かもしれませんが、どうぞよろしくお願いいたします。

  • c言語 片方向連結リスト

    c言語の片方向連結リストのプログラムについて質問があります. 下記のプログラムの関数int get_index(ListPtr l, int value)に以下のようなコードを書く.リストl において値value を持つセルの位置を返す.返り値は,最初のセルが値value を持っていれば0,次のセルが値value を持っていれば1,...,値value を持っているセルが存在しなければ–1とする. また,関数void add(ListPtr l, int index, int value)に以下のようなコードを書く.リストl の位置index に値value を持つセルを挿入.挿入前のリストに対して:index が0 のときは先頭に挿入,index が1 のときは(0から数えて)1番目のセルの前に挿入,index が2 のときは(0から数えて)2番目のセルの前に挿入,...,index がリストのサイズと等しいときはリストの末尾に挿入,それ以外の場合は何もしなくてよい. これらのコードはどのように書けばよいのでしょうか? #include <stdio.h> #include <stdlib.h> #include <assert.h> /* 連結リスト中のノードの構造体 */ struct node { int val; /* 値 */ struct node *next; /* 次ノード */ }; /* セルとそのポインタの型 */ typedef struct node Node; typedef Node *NodePtr; /* セルを一つ生成 */ NodePtr create_node(int v) { NodePtr n = NULL; n = malloc(sizeof(Node)); n->val = v; n->next = NULL; return n; } /* セルを表示 */ void print_node(NodePtr n) { if (n != NULL) { printf("<%d>", n->val); } else { printf("(null)"); } } /* 連結リストの構造体 */ struct list { /* 先頭セルへのポインタ */ NodePtr head; }; /* 連結リストとそのポインタの型 */ typedef struct list List; typedef List *ListPtr; /* 空の連結リストを生成 */ ListPtr create_list(void) { ListPtr l = NULL; l = malloc(sizeof(List)); l->head = NULL; return l; } /* 連結リスト l が空かどうか判定 */ int is_empty(ListPtr l) { return (l->head == NULL); } /* リスト l の内容を表示 */ void print_list(ListPtr l) { NodePtr n = NULL; if (is_empty(l)) { printf("(empty)\n"); return; } n = l->head; while (n != NULL) { print_node(n); n = n->next; } printf("\n"); } /* リスト l の先頭にセルを挿入 */ void add_first(ListPtr l, int val) { NodePtr n = NULL; n = create_node(val); n->next = l->head; l->head = n; } /* リスト l の先頭セルを削除 */ int delete_first(ListPtr l) { NodePtr n = NULL; int v; /* リストが空なら -1 を返す(負の値はリストに含まれないと仮定)*/ if (is_empty(l)) return -1; v = l->head->val; n = l->head; l->head = l->head->next; free(n); n = NULL; return v; } /* 連結リスト l のサイズを取得 */ int get_list_size(ListPtr l) { NodePtr n = NULL; int size; size = 0; n = l->head; while (n != NULL) { size++; n = n->next; } return size; } /* * 連結リスト l における index 番目のセルの値を取得 * (そのようなセルが存在しなければ -1 を返す) */ int get_value(ListPtr l, int index) { NodePtr n = NULL; if (index < 0) return -1; n = l->head; while (index > 0 && n != NULL) { n = n->next; index--; } return (n == NULL) ? -1 : n->val; } /* リスト l 中の全セルを削除(ループ版)*/ void delete_all(ListPtr l) { NodePtr n = NULL, m = NULL; n = l->head; while (n != NULL) { m = n; n = n->next; free(m); } l->head = NULL; } /* セル n 以降を全て削除(内部処理用の再帰関数)*/ void delete_rest(NodePtr n) { if (n->next != NULL) delete_rest(n->next); free(n); } /* リスト l 中の全セルを削除(再帰版)*/ void delete_all_recursively(ListPtr l) { if (l->head == NULL) return; delete_rest(l->head); l->head = NULL; } /* リスト l 全体を削除 */ #define delete_list(l) (delete_list0(l),l=NULL) void delete_list0(ListPtr l) { delete_all(l); free(l); } /* リスト l において値 val を持つセルの位置を返す */ int get_index(ListPtr l, int value) { return -1; } /* リスト l の位置 index に値 val を持つセルを挿入 */ void add(ListPtr l, int index, int value) { } /* 連結リストの使用例 */ int main(void) { FILE *fp = NULL; char buf[10]; int age; ListPtr l = NULL; l = create_list(); add_first(l, 28); add_first(l, 40); add_first(l, 33); add_first(l, 15); print_list(l); delete_first(l); print_list(l); delete_first(l); print_list(l); delete_first(l); print_list(l); delete_first(l); print_list(l); return 0; }

  • C言語について

    以下のプログラムについて alice.txtからテキストを読み込みその中の異なる単語の数を求めるプログラムです #include<stdio.h> #include<stdlib.h> #include<string.h> #include<stddef.h> #include<ctype.h> #define NMAX 80 #define LMAX 5000 void count(int); void all_words(void); FILE *fp, *fp2; char *fn="alice.txt"; char *fn2="total word.txt"; const char *ignore="\n !?()*-;:.,_\"[]"; int main(void){ int p=0, x=0, c, l, t=0; char word3[LMAX][NMAX]; char word1[NMAX]; char word2[NMAX]; char *tp; char *tp2; if((fp=fopen(fn,"r"))==NULL){ printf("Can't open '%s'.\n",fn); return -1; } if((fp2=fopen(fn2,"w"))==NULL){ printf("Can't open '%s'.\n",fn2); return -1; } for(c=0;c<LMAX;c++){ if(fgets(word3[c],NMAX,fp)==NULL) break; p++; } for(c=0;c<p;c++){ for(x=0;x<NMAX;x++){ word1[x]=tolower(word3[c][x]); } tp=word1; while((tp2=(char*)strtok(tp,ignore))!=NULL){ if(*tp2=='\''){ if(*(tp2+1)=='`'){ t=1; } tp2++; } strcpy(word2,tp2); l=strlen(word2)-1; if(word2[l]=='\''){ word2[l]='\0'; } if(word2[l]==l){ word2[l]='\0'; } if(word2[0] =='\'' &&t==0){ if(word2[1]!='\0'){ fputs(word2+1,fp2); fputc('\n',fp2); } } else{ if(word2[0]!='\0'){ fputs(word2,fp2); fputc('\n',fp2); } } tp=NULL; } } fclose(fp); fclose(fp2); all_words(); return 0; } void all_words(void){ char word3[NMAX]; int n=0; if((fp2=fopen(fn2,"r"))==NULL){ printf("Can't open '%s'.\n", fn2); return; } for(;;){ if(fgets(word3, NMAX,fp2)==NULL){ break; } n++; } fclose(fp2); count(n); } void count(int n){ int c, x, y=0; char *m=(char *)malloc(n*NMAX); char *xp; char *yp; if((fp2=fopen(fn2,"r"))==NULL){ printf("Can't open '%s'.\n", fn2); free(m); return; } for(c=0,xp=m; c<n;c++,xp+=NMAX){ fgets(xp,NMAX,fp2); } qsort(m,n,NMAX,(int (*)(const void*, const void*))strcmp); c=1; for(x=0,xp=m,yp=m+NMAX;x<n-1;xp+=NMAX,yp+=NMAX,x++){ if(strcmp(xp,yp)==0){ y++; c++; } else{ c=1; } } printf("%d\n",n-y); free(m); fclose(fp2); } このプログラムを実行するとメモリリークになってしまうのですが 確保していないメモリ領域に代入しているのが原因らしいのですが いろいろ試してみたのですがメモリリークが直りません どうしたらよいでしょうか? よろしくお願いします

  • C言語について

    以下のプログラムについて alice.txtからテキストを読み込みその中の異なる単語の数を求めるプログラムです #include<stdio.h> #include<stdlib.h> #include<string.h> #include<stddef.h> #include<ctype.h> #define NMAX 80 #define LMAX 5000 void count(int); void all_words(void); FILE *fp, *fp2; char *fn="alice.txt"; char *fn2="total word.txt"; const char *ignore="\n !?()*-;:.,_\"[]"; int main(void){ int p=0, x=0, c, l, t=0; char word3[LMAX][NMAX]; char word1[NMAX]; char word2[NMAX]; char *tp; char *tp2; if((fp=fopen(fn,"r"))==NULL){ printf("Can't open '%s'.\n",fn); return -1; } if((fp2=fopen(fn2,"w"))==NULL){ printf("Can't open '%s'.\n",fn2); return -1; } for(c=0;c<LMAX;c++){ if(fgets(word3[c],NMAX,fp)==NULL) break; p++; } for(c=0;c<p;c++){ for(x=0;x<NMAX;x++){ word1[x]=tolower(word3[c][x]); } tp=word1; while((tp2=(char*)strtok(tp,ignore))!=NULL){ if(*tp2=='\''){ if(*(tp2+1)=='`'){ t=1; } tp2++; } strcpy(word2,tp2); l=strlen(word2)-1; if(word2[l]=='\''){ word2[l]='\0'; } if(word2[l]==l){ word2[l]='\0'; } if(word2[0] =='\'' &&t==0){ if(word2[1]!='\0'){ fputs(word2+1,fp2); fputc('\n',fp2); } } else{ if(word2[0]!='\0'){ fputs(word2,fp2); fputc('\n',fp2); } } tp=NULL; } } fclose(fp); fclose(fp2); all_words(); return 0; } void all_words(void){ char word3[NMAX]; int n=0; if((fp2=fopen(fn2,"r"))==NULL){ printf("Can't open '%s'.\n", fn2); return; } for(;;){ if(fgets(word3, NMAX,fp2)==NULL){ break; } n++; } fclose(fp2); count(n); } void count(int n){ int c, x, y=0; char *m=(char *)malloc(n*NMAX); char *xp; char *yp; if((fp2=fopen(fn2,"r"))==NULL){ printf("Can't open '%s'.\n", fn2); free(m); return; } for(c=0,xp=m; c<n;c++,xp+=NMAX){ fgets(xp,NMAX,fp2); } qsort(m,n,NMAX,(int (*)(const void*, const void*))strcmp); c=1; for(x=0,xp=m,yp=m+NMAX;x<n-1;xp+=NMAX,yp+=NMAX,x++){ if(strcmp(xp,yp)==0){ y++; c++; } else{ c=1; } } printf("%d\n",n-y); free(m); fclose(fp2); } このプログラムを実行するとメモリリークになってしまうのですが 確保していないメモリ領域に代入しているのが原因らしいのですが いろいろ試してみたのですがメモリリークが直りません どうしたらよいでしょうか? よろしくお願いします

  • 因数分解プログラム(C言語)について(1)

    ”因数分解を行うプログラムについて”の質問と同じ者です。 みなさんのご回答を参考にして、作ってみたのですが、 ポインタとかの使い方などがわからず、実行すると、 不正な処理を行ったので終了しますとなってしまいます。 どなたか、具体的にどこが悪いのか、 そしてどのように直せば正しく実行されるのか、 教えて下さい。お願いします。 以下↓がプログラムです。 800文字以上のため二つに分割しました。 #include <stdio.h> #include <math.h> #include <process.h> /*関数プロトタイプ宣言*/ int input(int *,int *,int *); int judge(int *,int *,int *); int bunkai1(int *,int *,int *,int *,int *,float *); int bunkai2(int *,int *,int *,int *,int *,float *); int yakubun1(int *,int *,int *,int *,int *,int *,int *); int yakubun2(int *,int *,int *,int *,int *,int *,int *); int output(int *,int *,int *,int *); /*関数の呼び出し*/ int main(void) { int a,b,c,q,n1,m1,min1,flag,i,d,e,m2,n2,min2,f,g; float D; input(&a,&b,&c); judge(&a,&b,&c); bunkai1(&a,&b,&q,&n1,&m1,&D); bunkai2(&a,&b,&q,&n2,&m2,&D); yakubun1(&m1,&n1,&min1,&flag,&i,&d,&e); yakubun2(&m2,&n2,&min2,&flag,&i,&f,&g); output(&d,&e,&f,&g); return (0); } /*数値入力関数*/ int input(int *a,int *b,int *c) { printf("a*x^2+b*x+c=0で,a,b,cを入力して下さい。\n"); printf("a="); scanf("%d",a); printf("b="); scanf("%d",b); printf("c="); scanf("%d",c); if(*a == 0){ printf("a = 0なので因数分解できません。\n"); exit(1); } return 0; } つづく

  • C言語のプログラムについて。

    C言語のプログラミングについて質問です。 入力されたデータの配列とデータ数を渡すと配列に格納された値を逆順にして、格納し直す関数reverse関数を書き結果を出力せよ、というものなのですが下のように書いたのですが、うまく作動しません。どこがいけないのでしょうか...?教えていただきたいです。 #include <stdio.h> void reverse(int *data[], int n); #define MAX 100 int main() { int data[MAX]; int n, i; scanf("%d", &n); if (n >= MAX) n = MAX; for (i = 0; i < n; i ++){ scanf("%d", &data[i]); } reverse(data, n); for (i = 0; i < n; i ++) { printf("%d\n", data[i]); } return 0; } void reverse(int *data[], int n) { int c, i; for (i = 0; i < n; i ++) { c = *data[i]; *data[i] = *data[n - (i + 1)]; *data[n - (i + 1)] = c; } }

専門家に質問してみよう