掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.29409

構造体の配列の領域をmallocで確保しようとしています
投稿者---yoshi(2007/01/11 23:39:42)


現在、構造体の領域の確保をしようとしているのですが、コンパイラの時点で上手くいきません。どなたか原因が分かる人が居ましたら、ご指導よろしくお願いします。

プログラムの説明
 ・argv[1](CSVファイル)をget_data関数で配列に格納し、その配列をcalc_dis関数に送り、argv[2](CSVファイル)で出力する。

現在の状況
 ・コンパイラの時点で上手くいきません。
 ・エラーの該当箇所は、分かっているところは、*p[cnt].weight = weight;  ←浮動小数点の不正な使用というエラーが出ます。
 
改善しようとする点
 ・dat_line dat[20000000]の構造体の配列を取りたい。

環境 OS;WindowsMe
   コンパイラ;Borland C++5.5

長いので、次の投稿にプログラムを載せます。



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:構造体の配列の領域をmallocで確保しようとしています 29410 yoshi 2007/01/11 23:43:01


No.29410

Re:構造体の配列の領域をmallocで確保しようとしています
投稿者---yoshi(2007/01/11 23:43:01)


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

#define MAX 20000000
#define CLUSTER 100
#define CLUSTER_LT 100
        
/* 構造体の定義 */
typedef struct data_line{
    
    int file;    /* ファイル名 最大10000 整数 */
    long word;  /* 単語名 最大10000000 整数 */
    double weight;  /* tfidf値 小数 */

} data_line;

/* 関数のプロトタイプ宣言 */
int get_data(char* buf, int* a, long* b, double* c);
FILE* calc_dis(data_line dat[], long n, double temp, FILE* arg_fp);

/* main関数 */
int main(int argc, char *argv[]){
    
    /* 変数の宣言 */
    FILE* fp_a;
    FILE* fp_b;
    data_line *p;
    
    char buf[256];
    long cnt;            /* 行の総数 */
    int file;
    long word;
    double weight;
    double arg_temp;

    p = malloc(sizeof(data_line)*MAX);
    
    if(p == NULL) {
      printf("メモリが確保できません\n");
      exit(1);
    }
      
    *p = dat[MAX];  
     
    if (argc != 4) {
        printf("引数の数が違います。\n");
        return -1;
    }
    
    fp_a = fopen(argv[1], "r");
    if ( fp_a==NULL )
    {
        printf("ファイルオープンに失敗しました\n tfidf.csv \n");
        return 1;
    }
    
    /* 変数の初期化 */
    cnt = 0;
    
    /* ファイルから1行分のデータを読み込む */
    while (fgets(buf, 256, fp_a) != NULL)
    {
        /* データの取り出し */
        get_data(buf, &file, &word, &weight);
        
        /* 構造体にデータを代入 */
        *p[cnt].file = file;
        *p[cnt].word = word;
        *p[cnt].weight = weight;                        /***** ←浮動小数点の不正な使用というエラーが出ます *****/
    
        /* 配列がオーバーしていないか? */
        cnt = cnt + 1;
        if (cnt >= MAX)
        {
            printf("配列の最後に到達しました。\nファイルの読み込みを中止します。\n");
            
            break;
        }
    }
    
    /* ファイルを閉じる */
    fclose(fp_a);
    
    fp_b = fopen(argv[2], "a");
    if ( fp_b==NULL )
    {
        printf("ファイルオープンに失敗しました\n cluster_g \n");
        return 1;
    }
    
    arg_temp = atof(argv[3]);
    if(arg_temp > 1 || arg_temp < 0)
    {
        printf("類似度の値を0〜1間の値で再設定してください\n");
        return 1;
    }   
    /* クラスタリングを行う */
    calc_dis(p, cnt, arg_temp, fp_b);
    
    
    /* ファイルを閉じる */
    fclose(fp_b);
    
    
    return 0;
}


/* get_data関数 */
int get_data(char* buf, int* a, long* b, double* c)
{
    char* token; /* トークン */
    
    /* 最初のデータ */
    token = strtok(buf, ",");
    *a = atoi(token);
    
    /* 2つ目のデータ */
    token = strtok(NULL, ",");
    *b = atoi(token);
    
    /* 3つ目のデータ */
    token = strtok(NULL, ",");
    *c = atof(token);
    
    return 0;
}

/* calc_dis関数 */
FILE* calc_dis( data_line dat[], long n, double temp, FILE* arg_fp)
{
        省略
    return arg_fp;
}
    



この投稿にコメントする

削除パスワード

No.29412

Re:構造体の配列の領域をmallocで確保しようとしています
投稿者---akg(2007/01/12 00:11:29)


>    *p = dat[MAX];

ここで、コンパイルエラーが出ていませんか?
datはどこで定義しているのでしょうか?

>        /* 構造体にデータを代入 */
>        *p[cnt].file = file;
>        *p[cnt].word = word;
>        *p[cnt].weight = weight;

'*'を付けているのはなぜでしょうか?




この投稿にコメントする

削除パスワード

No.29414

Re:構造体の配列の領域をmallocで確保しようとしています
投稿者---yoshi(2007/01/12 00:41:58)


>> *p = dat[MAX];

>ここで、コンパイルエラーが出ていませんか?
>datはどこで定義しているのでしょうか?

>>>akgさん、確かにそのとおりでした。ご指摘ありがとうございます。

> /* 構造体にデータを代入 */
> *p[cnt].file = file;
> *p[cnt].word = word;
> *p[cnt].weight = weight;

'*'を付けているのはなぜでしょうか?

>>>この点については、ポインタについての勘違いです。意味はありません。スミマセンでした。

以下に修正した部分のプログラムを載せます。

/* main関数 */
int main(int argc, char *argv[]){
    
    /* 変数の宣言 */
    FILE* fp_a;
    FILE* fp_b;
    data_line *p;
    data_line dat[MAX];  /* 追加部分 */
    char buf[256];
    long cnt;            /* 行の総数 */
    int file;
    long word;
    double weight;
    double arg_temp;

    p = malloc(sizeof(data_line)*MAX);
    
    if(p == NULL) {
      printf("メモリが確保できません\n");
      exit(1);
    }
      
    *p = dat[MAX];  
     
    if (argc != 4) {
        printf("引数の数が違います。\n");
        return -1;
    }
    
    fp_a = fopen(argv[1], "r");
    if ( fp_a==NULL )
    {
        printf("ファイルオープンに失敗しました\n tfidf.csv \n");
        return 1;
    }
    
    /* 変数の初期化 */
    cnt = 0;
    
    /* ファイルから1行分のデータを読み込む */
    while (fgets(buf, 256, fp_a) != NULL)
    {
        /* データの取り出し */
        get_data(buf, &file, &word, &weight);
        
        /* 構造体にデータを代入 */
        p[cnt].file = file;    /* 修正しました */
        p[cnt].word = word;    /* 修正しました */
        p[cnt].weight = weight;   /* 修正しました */   
    

修正したところ、コンパイラは無事に通りましたが、起動はしませんでした。
構造体dat_line型の変数dat[20000000]の配列をmallocで取りたいのですが、良い案がありましたら、どなたかよろしくお願いいたします。




この投稿にコメントする

削除パスワード

No.29418

Re:構造体の配列の領域をmallocで確保しようとしています
投稿者---akg(2007/01/12 09:53:12)


>     data_line *p;
>     data_line dat[MAX];  /* 追加部分 */

同じ大きさの領域が2つ必要な理由は何でしょうか?

>     *p = dat[MAX];

この文の意味がわかりません。説明してください。





この投稿にコメントする

削除パスワード

No.29419

Re:構造体の配列の領域をmallocで確保しようとしています
投稿者---si(2007/01/12 14:28:28)


data_line dat[MAX]; この部分で
セグメンテーション違反です
とメッセージが出るはずです。


この投稿にコメントする

削除パスワード

No.29424

Re:構造体の配列の領域をmallocで確保しようとしています
投稿者---yoshi(2007/01/13 03:19:47)


>> *p = dat[MAX]; ?1
>> *p[cnt].file = file; ?2
>> *p[cnt].word = word;
>> *p[cnt].weight = weight;
>>>>コードを見ると、p は配列へのポインタですよね
>>>>なのに ?1 箇所は
>>>>?2 *p[index].id = value って、どこに代入してるの

>>data_line dat[MAX]; この部分で
>>セグメンテーション違反です
>>とメッセージが出るはずです。

siさん、*p部分は、勘違いですので修正しました。ご指摘ありがとうございます。たしかに、セグメンテーション違反となりました。領域を取りすぎてるようです。 

>> data_line *p;
>> data_line dat[MAX]; /* 追加部分 */

>>同じ大きさの領域が2つ必要な理由は何でしょうか?

>> *p = dat[MAX];

>>この文の意味がわかりません。説明してください。

akgさん、同じ大きさの領域を2つは、1つだけ領域を取りたかったのですが、コンパイルでエラーが出たので、加えてしまいました。
考えているのは、mallocで確保した領域に構造体の配列を入れようとしています。
以下に、mallocで確保する前のプログラム部分を載せたいと思います。

実際、mallocを利用する場合は、どの程度が限界となるのでしょうか。
どなたか参考になるようなものでも、ご存知の方が、いましたら、教えていただけないでしょうか?





この投稿にコメントする

削除パスワード

No.29425

Re:構造体の配列の領域をmallocで確保しようとしています
投稿者---yoshi(2007/01/13 03:25:14)


malloc使用前のプログラム
data_line dat[MAX]の構造体の領域をdat[15000000]ほど採ろうと、考えたので、mallocを使用しようとしています。

/* main関数 */
int main(int argc, char *argv[]){
    
    /* 変数の宣言 */
    FILE* fp_a;
    FILE* fp_b;
    data_line dat[MAX];
    char buf[256];
    long cnt;            /* 行の総数 */
    int file;
    long word;
    double weight;
    double arg_temp;
 
    if (argc != 4) {
        printf("引数の数が違います。\n");
        return -1;
    }
    
    fp_a = fopen(argv[1], "r");
    if ( fp_a==NULL )
    {
        printf("ファイルオープンに失敗しました\n tfidf.csv \n");
        return 1;
    }
    
    /* 変数の初期化 */
    cnt = 0;
    
    /* ファイルから1行分のデータを読み込む */
    while (fgets(buf, 256, fp_a) != NULL)
    {
        /* データの取り出し */
        get_data(buf, &file, &word, &weight);
        
        /* 構造体にデータを代入 */
        dat[cnt].file = file;            
        dat[cnt].word = word;            
        dat[cnt].weight = weight;         
    
        /* 配列がオーバーしていないか? */
        cnt = cnt + 1;
        if (cnt >= MAX)
        {
            printf("配列の最後に到達しました。\nファイルの読み込みを中止します。\n");
            
            break;
        }
    }
    
    /* ファイルを閉じる */
    fclose(fp_a);





この投稿にコメントする

削除パスワード

No.29426

Re:構造体の配列の領域をmallocで確保しようとしています
投稿者---si(2007/01/13 11:33:45)


Winやbccは、知らないので、間違っているかも知れませんが、
通常、1つのプロセスに許可されるメモリの大きさは、32bit環境の場合、2Gbytes
また、
int func(){
char *p = malloc(size);
char q[size];
static r[size];
}
のように、メモリの確保の仕方で、それぞれサイズに制限があるかもしれない。


この投稿にコメントする

削除パスワード

No.29494

Re:構造体の配列の領域をmallocで確保しようとしています
投稿者---yoshi(2007/01/19 02:26:34)


返事が遅くなってしまい、申し訳ありません。
あれから自分でも調べてみて、mallocの領域を部分的にとっていくように出来ました。
>>siさん、参考になりました。
>>教えていただいて、ありがとうございます。


この投稿にコメントする

削除パスワード

No.29413

Re:構造体の配列の領域をmallocで確保しようとしています
投稿者---si(2007/01/12 00:21:28)


> *p = dat[MAX]; ?1
> *p[cnt].file = file; ?2
> *p[cnt].word = word;
> *p[cnt].weight = weight;
コードを見ると、p は配列へのポインタですよね
なのに ?1 箇所は
?2 *p[index].id = value って、どこに代入してるの


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧