質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.06%

配列の初期化がうまくいかない

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 393

ro_tose

score 8

前提・実現したいこと

配列、pheromoneを初期化したい。

発生している問題・エラーメッセージ

initial_pheromoneでの
セグメントエラー

該当のソースコード

ファイル as.c
#include <stdio.h>
#include <math.h>
#include <limits.h>    
#include <assert.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>

#include "sub.h"

double pheromone_0;
 double alpha;
 double beta;
 double rho;
 double q_0; 
 int n;
 int nant;

void erace(void){        

 alpha=1.0;
 beta=1.0;                       //ヒューリスティック情報の優先度
 rho=0.5;                         //フェロモン蒸発率
 q_0=0;

 pheromone_0=1.0;
printf("pheromone_0;%f\n",pheromone_0);
 initial_pheromone( pheromone_0);
printf("%f\n",pheromone[0][0]);
}

int main(int argc, char *argv[]){

 int i;

 n=51;

 nant=10;                         //アリの数


 start_program();

  erace();






 for(i=0;i<n;i++){
   free(pheromone[i]);
   free(total[i]);
 }
 free(total);
 free(pheromone);
   return(0);
}
sub.c

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <limits.h>

#include "tesb.h"

ant_struct *ant;      
ant_struct *bestant;

double **pheromone;
double **total;

void initial_pheromone(double initial_trail) //フェロモンの初期化

{
    long int i, j;

    for ( i = 0 ; i < n ; i++ ) {
    for ( j =0 ; j <=i ; j++ ) {
      pheromone[i][j] = initial_trail;
        pheromone[j][i]=pheromone[i][j];

    }
    }
}


void start_program(void)
{
  int i,j;
   if((ant=malloc(sizeof(ant_struct)*nant+sizeof(ant_struct *)*nant))==NULL){
   printf("out of memory,exit");
  exit(1);
 }

  for(i=0;i<nant;i++){
    ant[i].tour=calloc(n+1,sizeof(int));
    ant[i].visited=calloc(n,sizeof(char));
  }
  if((bestant=malloc(sizeof(ant_struct)))==NULL){
   printf("out of memory,exit");
  exit(1);
 }
  bestant->tour=calloc(n+1,sizeof(int));
  bestant->visited=calloc(n,sizeof(char));

 pheromone=malloc(sizeof(double *)*n);
  for(i=0;i<n;i++){
    pheromone[i]=malloc(sizeof(double*)*n);
  }

  total=malloc(sizeof(double *)*n);
  for(i=0;i<n;i++){
    total[i]=malloc(sizeof(double*)*n);
  }
}
ファイル sub.h
typedef struct {
  int  *tour;
  char      *visited;
  int  tour_length;
} ant_struct;


extern ant_struct *ant;      
extern ant_struct *bestant;   

extern double   **pheromone;

extern int nant;


extern double rho;      //フェロモン蒸発率
extern double alpha;    //フェロモンの重要性
extern double beta;     //ヒューリスティックの重要性
extern double q_0;      //最良の道を選ぶ確率

int *best_ant_score;

void compute_total(void);



void initial_pheromone(double initial_trail);

void start_program(void);


extern double pheromone_0;

extern int n;

extern double **pheromone;
extern double **total;

試したこと

配列が問題なのかと思って配列を表示してみたりしたのですが配列のメモリもしっかり用意できていました。
修正してみたのですがまだエラーがでてしまいます。明日またmallocを使わない方法でやってみようと思います

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+1

あなたの提示されたソースをコンパイルしたのですが、以下のエラーがでます。
(CentOs7.5 gcc バージョン 4.8.5)
gcc -o as as.c sub.c
as.c:29:1: エラー: 不明な型名 ‘iint’ です
iint main(int argc, char *argv[]){
^
as.c: 関数 ‘main’ 内:
as.c:39:15: エラー: ‘optimal’ が宣言されていません (この関数内での最初の使用)
scanf("%\n",&optimal);
^
as.c:39:15: 備考: 未宣言の識別子は出現した各関数内で一回のみ報告されます
as.c:56:9: エラー: ‘total’ が宣言されていません (この関数内での最初の使用)
free(total[i]);

エラーの発生しないソースを提示していただけませんでしょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/11/29 12:17

    はい。最後まで正常に終了しました。

    キャンセル

  • 2019/11/29 12:27

    ありがとうございます。こちらが変なことをしていてそれが原因でエラーが起きていそうなので確認させていただきます。

    キャンセル

  • 2019/11/29 13:29

    解決できました、ありがとうございます!

    キャンセル

+1

double **pheromone;
pheromone=malloc(sizeof(int *)*n);

なんでdoubleなのにintポインタのサイズで確保している?
そこらへんがそもそもダメダメですね

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/11/28 20:03

    確かにそこからおかしいですね。ご指摘ありがとうございます

    キャンセル

  • 2019/11/29 11:22

    コードの意味は変ですが、double * も int * も char * も void * もポインタのサイズは同じなので悪影響はありません。

    キャンセル

  • 2019/11/29 11:36

    おなじ「はず」だから、そんでいいとかやってたら、
    > for(i=0;i<n;i++){
    > pheromone[i]=malloc(sizeof(double*)*n);
    > }
    これもサイズが「おなじ」だからOKOKとするんでしょうか
    まあ、そこらへんはうごいてんだからいいぢゃん、という考え方もありますがw

    キャンセル

0

start_program()内のpheromone=malloc(sizeof(int *)*n);の時点での,nの値は想定した値になっていますか?


ところで,malloc()でメモリ確保するのはmustなのでしょうか?
とりあえず最初は各要素の数を固定した状態で作ってみる段階を経てみてはどうでしょうか.
例えば,

#define N 30
#define N_ANT 10

double pheromone[N][N];
ant_struct ant[N_ANT];


みたいな形.

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/11/28 20:10

    malloc()についてまだよくわかっていないのでそちらで試して見るのもいいですかね。
    他の方のアドバイスも試してダメでしたらそちらの方法も試してみます。

    キャンセル

  • 2019/11/29 11:51

    固定した値でやってみたのですがそれでもエラーが出たのでもしかしたら配列自体が用意されていないとかではなくて別の部分でエラーがでているんでしょうか・・・

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.06%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る