前提・実現したいこと
ant_struct *aにant[0]を引数として渡そうとしたのですがcity_emptyにant[0]が引数として渡されていないのかセグメントエラーになります。
長いプログラムの途中のエラーなのでかなり端折っていますがそのせいで解答ができないという場合は申し訳ありません。
発生している問題・エラーメッセージ
セグメントエラー
該当のソースコード
C言語
1ファイル tes.c 2#include <stdio.h> 3#include <stdlib.h> 4#include <math.h> 5#include <time.h> 6#include <limits.h> 7 8 9#include "tesb.h" 10 11 12void erace(void){ 13 int i; 14 15 ntours=1; //経路作成数 16 17printf("5\n"); 18 bestant->tour_length = LONG_MAX; //最良解 19 nant=30; //アリの数 20 alpha=1.0; //ヒューリスティック情報の優先度 21 rho=0.5; //フェロモン蒸発率 22 q_0=0; 23 printf("6\n"); 24 25 pheromone_0=1/((rho)*(double)nntour()); 26 initial_pheromone(pheromone_0); 27} 28 29int main(int argc, char *argv[]){ 30 31 int i; 32 int ntry; //試行数 33 int maxtries=10; //試行回数 34 int maxtours=30; //繰り返し数 35 int optimal; //最適解 36 clock_t start,end; 37 char tsp_file[]=TSPFILE; 38 39 40 start_program(); 41 42 43 44 erace(); 45 46 47 free(bestant->tour); 48 free(bestant->visited); 49 for(i=0;i<nant;i++){ 50 free(ant[i].tour); 51 free(ant[i].visited); 52 } 53 free(ant); 54 return(0); 55}
ファイル tesb.c #include <stdio.h> #include <stdlib.h> #include <math.h> #include <assert.h> #include <limits.h> #include <time.h> #include "tesb.h" void city_empty( ant_struct *a ) { int i; for( i = 0 ; i < n ; i++ ) { a->visited[i]=0; } } int nntour(void) { int phase; int help; int i; city_empty(&ant[0]); // 以下プログラムが続く ); return help; } void start_program(void) { int i; 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)); }
ファイル tesb.h typedef struct { int *tour; char *visited; } ant_struct; extern ant_struct *ant; int nant; void start(void); extern int n;
試したこと
関数nn_tourで*aに配列を用意すると動くのですが、後のプログラムとの兼ね合いがあるのでできれば引数で済ませたいと思っています。
ant[] はどこで定義されているんですか?
ソースコードを閉じる```がないので修正ねがいます。
ant[]はtesb.hとtesb.cのstart_programで定義できていると思っていますが間違っていたらすいません。
nはどこで定義しているのですか?
もうしわけありません、プログラムを端折るときに誤って一緒に端折ってしまいました。start_programとeraceの間のファイル読み込みプログラムの中で定義していました
> ant[]はtesb.hとtesb.cのstart_programで定義できていると思っていますが間違っていたらすいません。
tesb.h では extern で、外部にあるよ、と言ってるだけ。
tesb.c では代入してるだけで、変数宣言が見当たらない。
test.h で int nant; と書いてあるけど、ヘッダをインクルードしてるソース全部に同じ変数が複数個定義されることになるので危険。
回答1件
あなたの回答
tips
プレビュー