complexのエラーについて。 include ファイルを開けません 'complex.h'

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
remon
記事: 5
登録日時: 10年前

complexのエラーについて。 include ファイルを開けません 'complex.h'

#1

投稿記事 by remon » 10年前

include ファイルを開けません 'complex.h':No such file or directory
と出て複素数が使えません。
グーグルで一通り検索し解決策を探しましたが解決できませんでした。
なぜでしょうか?
自宅のPCに落としたフリーのMicrosoft Visual Studio 2013で、できなくて
学校のPCのMicrosoft Visual Studio 2012でもできなかったので困り果てています。

メモ帳にコードを書いて.cの形で保存して VS2012ドプロンプトの開発者コマンドプロンプトでコンパイルいています。

コードは以下のとおりです。

コード:

#define _USE_MATH_DEFINES
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <math.h>
#include <complex.h>

#define BUFF_SIZE 200

int main()
{
double complex xx_w,xx_w_fin;
FILE *fp;
FILE *file;                                                // ファイルのポインタ
int i,j,k,ii,n,kk,NN;                                                    // 整数型変数
char *result;                                             // ファイルの読み込み結果を判定する変数
char buffer[BUFF_SIZE];                                  // 1行分を読み込むために用意したバッファ
char N[100],tt[100],at[100],bt[100],ct[100],et[100];     //各項目を入れる文字列
int Num;                                                 //項目の数字化
double tim,at_f,bt_f,ct_f,et_f;                          //項目の数字化
double t,w,h;
char filename[100];


if( (fp= fopen("fourier_data2011.csv","r"))==NULL )
  {
  printf("ファイルが見つかりません\n");                 // ファイルが見つからないときは
  return(1);                                            // 戻り値1(異常終了)でプログラム終了
  }

k=0;

fgets(buffer,BUFF_SIZE,fp);                        // 一行目の読み飛ばし

for(i=0; i<600; i++) 
  {
  result=fgets(buffer,BUFF_SIZE,fp);                   // 1レコード分をバッファ読み込み
  
  if(result==NULL)
    {
    i=ii;                                   //データ数の保存
    break;                                // ファイルの終端に来たら、for文を終了
    }
  }

fclose(fp);                                              // ファイルを閉じる



//ファイルの開きなおし



if( (fp= fopen("fourier_data2011.csv","r"))==NULL )
  {
  printf("ファイルが見つかりません\n");                 // ファイルが見つからないときは
  return(1);                                            // 戻り値1(異常終了)でプログラム終了
  }

k=0;

fgets(buffer,BUFF_SIZE,fp);                         //一行目の読み飛ばし


for(i=0; i<600; i++) 
  {
  result=fgets(buffer,BUFF_SIZE,fp);                   // 1レコード分をバッファ読み込み

  if(i==ii-1)
    {

    for(j=0; j<BUFF_SIZE; j++)
      {
      if( buffer[j]==',' || buffer[j]=='\0') break;
      N[j]=buffer[j];
      }

    N[j+1]='\0';                                    // 文字列の最後を設定

    k=j+1;

    for(j=0; j<BUFF_SIZE-k; j++)
      {
      if( buffer[j+k]==',' || buffer[j+k]=='\0' ) break;
      tt[j]=buffer[j+k];
      }

    tt[j]='\0';                                      // 文字列の最後を設定

    k=k+j+1;

    for(j=0; j<BUFF_SIZE-k; j++)
      {
      if( buffer[j+k]==',' || buffer[j+k]=='\0' ) break;

      at[j]=buffer[j+k];
      }

    at[j]='\0';

    k=k+j+1;

    for(j=0; j<BUFF_SIZE-k; j++)
      {
      if( buffer[j+k]==',' || buffer[j+k]=='\0' ) break;

      bt[j]=buffer[j+k];
      }

    bt[j]='\0';

    k=k+j+1;

    for(j=0; j<BUFF_SIZE-k; j++)
      {
      if( buffer[j+k]==',' || buffer[j+k]=='\0' ) break;

      ct[j]=buffer[j+k];
      }

    ct[j]='\0';

    k=k+j+1;

    for(j=0; j<BUFF_SIZE-k; j++)
      {
      if( buffer[j+k]==',' || buffer[j+k]=='\0' ) break;

      et[j]=buffer[j+k];
      }

    et[j]='\0';

    sscanf(N,"%d",&Num);              // 項目を数字に変換
    sscanf(tt,"%lf",&tim);              // 項目を数字に変換
    sscanf(at,"%lf",&at_f);              // 項目を数字に変換
    sscanf(bt,"%lf",&bt_f);              // 項目を数字に変換
    sscanf(ct,"%lf",&ct_f);              // 項目を数字に変換
    sscanf(et,"%lf",&et_f);              // 項目を数字に変換

    printf(" %d %f %f %f %f %f \n",Num,tim,at_f,bt_f,ct_f,et_f);         // 出力 


    break;                     //forの抜け出し
    }

NN=Num+1;                     //データ数(ii)
h=tim/Num;                    //時間の刻み幅

fclose(fp);                                              // ファイルを閉じる



//ファイルの開きなおし


sprintf(filename,"fourier.txt");
file=fopen(filename,"w");

if( (fp= fopen("fourier_data2011.csv","r"))==NULL )
  {
  printf("ファイルが見つかりません\n");                 // ファイルが見つからないときは
  return(1);                                            // 戻り値1(異常終了)でプログラム終了
  }

k=0;

fgets(buffer,BUFF_SIZE,fp);                       //  一行目の読み飛ばし

for(n=0; n<ii; n++)
  {

  for(j=0; j<BUFF_SIZE; j++)
    {
    if( buffer[j]==',' || buffer[j]=='\0') break;
    N[j]=buffer[j];
    }

  N[j+1]='\0';                                    // 文字列の最後を設定

  k=j+1;

  for(j=0; j<BUFF_SIZE-k; j++)
    {
    if( buffer[j+k]==',' || buffer[j+k]=='\0' ) break;
    tt[j]=buffer[j+k];
    }

  tt[j]='\0';                                      // 文字列の最後を設定

  k=k+j+1;

  for(j=0; j<BUFF_SIZE-k; j++)
    {
    if( buffer[j+k]==',' || buffer[j+k]=='\0' ) break;

    at[j]=buffer[j+k];
    }

  at[j]='\0';

  k=k+j+1;

  for(j=0; j<BUFF_SIZE-k; j++)
    {
    if( buffer[j+k]==',' || buffer[j+k]=='\0' ) break;

    bt[j]=buffer[j+k];
    }

  bt[j]='\0';

  k=k+j+1;

  for(j=0; j<BUFF_SIZE-k; j++)
    {
    if( buffer[j+k]==',' || buffer[j+k]=='\0' ) break;

    ct[j]=buffer[j+k];
    }

  ct[j]='\0';

  k=k+j+1;

  for(j=0; j<BUFF_SIZE-k; j++)
    {
    if( buffer[j+k]==',' || buffer[j+k]=='\0' ) break;

    et[j]=buffer[j+k];
    }

  et[j]='\0';

  sscanf(N,"%d",&Num);              // 項目を数字に変換
  sscanf(tt,"%lf",&tim);              // 項目を数字に変換
  sscanf(at,"%lf",&at_f);              // 項目を数字に変換
  sscanf(bt,"%lf",&bt_f);              // 項目を数字に変換
  sscanf(ct,"%lf",&ct_f);              // 項目を数字に変換
  sscanf(et,"%lf",&et_f);              // 項目を数字に変換

  xx_w=0;                              //初期化

  for(kk=0; kk<NN; kk++)
    {
    t=n*h;
    w=2*M_PI*kk/(NN*h);

    xx_w=xx_w+at*cexp(-I*w*t);
    }

  xx_w_fin=xx_w/NN;

  fprintf(file,"%f  %f \n",w,xx_w_fin*xx_w_fin);

  }




fclose(fp);                                              // ファイルを閉じる
fclose(file);                                              // ファイルを閉じる

return(0);
}



アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: complexのエラーについて。 include ファイルを開けません 'complex.h'

#2

投稿記事 by h2so5 » 10年前

マイクロソフトのコンパイラはC99に対応していないので複素数は利用できません。
gccなどのC99に対応しているコンパイラを使うかC++の複素数を使ってください。

ログインしてないremon

Re: complexのエラーについて。 include ファイルを開けません 'complex.h'

#3

投稿記事 by ログインしてないremon » 10年前

そーなんですね!
今回はフーリエ変換をしたかったのでオイラーの公式で、実部と虚部に分けて計算することにしました!
いまだに結果はうまくいかないですが-w
ここでずっと止まってたので助かりました。
ありかとうございます。

かずま

Re: complexのエラーについて。 include ファイルを開けません 'complex.h'

#4

投稿記事 by かずま » 10年前

sscanf を使うのなら、文字列を自分で切り出したりせずに、直接数値にできます。
また、同じファイルの先頭から読み直したいときは、fclose/fopen の代わりに
rewind が使えます。

コード:

#include <stdio.h>
#include <math.h>

#define BUFF_SIZE 200

int main(void)
{
    FILE *fp, *file;
    double xx_w_r, xx_w_i, xx_w_fin_r, xx_w_fin_i, re, im;
    double tim, at_f, bt_f, ct_f, et_f, t, w, h;
    int ii, n, kk, NN, Num;
    char buffer[BUFF_SIZE];

    fp = fopen("fourier_data2011.csv", "r");
    if (fp == NULL) { printf("ファイルが見つかりません\n"); return 1; }

    fgets(buffer, BUFF_SIZE, fp);  // 一行目の読み飛ばし
    for (ii = 0; fgets(buffer, BUFF_SIZE, fp); ii++) ;

    if (sscanf(buffer, "%d,%lf,%lf,%lf,%lf,%lf", 
            &Num, &tim, &at_f, &bt_f, &ct_f, &et_f) != 6) {
        printf("invalid format\n"); return 2;
    }
    printf(" %d %f %f %f %f %f \n", Num, tim, at_f, bt_f, ct_f, et_f);
    NN = Num + 1;   // データ数(ii)
    h = tim / Num;  // 時間の刻み幅

    rewind(fp);
    file = fopen("fourier.txt", "w");
    if (file == NULL) { printf("can't create file\n"); return 3; }

    fgets(buffer, BUFF_SIZE, fp);  // 一行目の読み飛ばし
    for (n = 0; n < ii; n++) {
        fgets(buffer, BUFF_SIZE, fp);
        if (sscanf(buffer, "%d,%lf,%lf,%lf,%lf,%lf", 
                &Num, &tim, &at_f, &bt_f, &ct_f, &et_f) != 6) {
            printf("invalid format\n"); return 4;
        }
        xx_w_r = xx_w_i = 0;
        for (kk = 0; kk < NN; kk++) {
            t = n * h;
            w = 2 * M_PI * kk / (NN * h);
            xx_w_r += at_f * cos(-w * t);
            xx_w_i += at_f * sin(-w * t);
        }
        xx_w_fin_r = xx_w_r / NN;
        xx_w_fin_i = xx_w_i / NN;
        re = xx_w_fin_r + xx_w_fin_r - xx_w_fin_i * xx_w_fin_i;
        im = 2 * xx_w_fin_r * xx_w_fin_i;
        fprintf(file, "%g  (%g, %g)\n", w, re, im);
    }
    fclose(fp);    
    fclose(file);
    return 0;
}

閉鎖

“C言語何でも質問掲示板” へ戻る