🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

解決済

1回答

543閲覧

関数の引数が反映されていない?

ro_tose

総合スコア8

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

0グッド

0クリップ

投稿2019/11/28 02:28

編集2019/11/28 02:40

前提・実現したいこと

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に配列を用意すると動くのですが、後のプログラムとの兼ね合いがあるのでできれば引数で済ませたいと思っています。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ozwk

2019/11/28 02:34

ant[] はどこで定義されているんですか?
asm

2019/11/28 02:35

ソースコードを閉じる```がないので修正ねがいます。
ro_tose

2019/11/28 02:42

ant[]はtesb.hとtesb.cのstart_programで定義できていると思っていますが間違っていたらすいません。
ttyp03

2019/11/28 03:04

nはどこで定義しているのですか?
ro_tose

2019/11/28 03:18

もうしわけありません、プログラムを端折るときに誤って一緒に端折ってしまいました。start_programとeraceの間のファイル読み込みプログラムの中で定義していました
shiracamus

2019/11/28 03:25

> ant[]はtesb.hとtesb.cのstart_programで定義できていると思っていますが間違っていたらすいません。 tesb.h では extern で、外部にあるよ、と言ってるだけ。 tesb.c では代入してるだけで、変数宣言が見当たらない。 test.h で int nant; と書いてあるけど、ヘッダをインクルードしてるソース全部に同じ変数が複数個定義されることになるので危険。
guest

回答1

0

ベストアンサー

main()からstart_program()を呼ぶとき,nantの値がいくつになっているのでしょうか?
コードを見た感じだと0になっているのではないかと思います.

その場合,
ant=malloc(sizeof(ant_struct)*nant+sizeof(ant_struct *)*nant)
の箇所で,あなたの想定通りのメモリ確保ができていないという結果になっていそうです.

投稿2019/11/28 03:23

編集2019/11/28 03:25
fana

総合スコア11987

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ro_tose

2019/11/28 03:26

確認したところ、おっしゃる通りになっていたようです。ありがとうございます、おかげさまで解決できそうです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問