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

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

ただいまの
回答率

88.58%

起点ノードから他のノードへの距離を計算したい

受付中

回答 1

投稿 編集

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

rft3

score 7

キューを用いた幅優先探索、構造体のソートの勉強をしています。起点ノードから他のノードへの距離を計算するために、 calc_distance関数の引数やキューの要素をNode構造体へのポインタとして、Nodeのメンバ変数degree, adj_nodes, nameを用いたプログラムを作りたいのですが、エラーが出てしまいコンパイルが出来ません。どこが間違えているか教えていただきたいです。

#include <stdio.h>
#include <stdlib.h>
#include "graph_struct.h"
#include "queue.h"

Node** nodes_ptr;

int *disV; //距離ベクトル
Queue queue; //幅優先探索用のキュー
int adj_nodes;
Node degree;
Node name;

int init_value(){
  init_queue(&queue, N);
  disV = (int *) malloc(sizeof(int)*N);
}
void calc_distance(nodes_ptr origin){
  queue.first = queue.last = 0;
  enq(&queue, origin);

  for(int i = 0; i < N; i++) disV[i] = id-1;
  disV[id-1] = 0;

  int maxD = 0; //最大距離
  for(int d = 0; ; d++){
    int h1 = queue.first, h2 = queue.last;
    for(int h = h1; h < h2; h++){

      nodes_ptr node = deq(&queue);
      for(int k = 0; k < degree[node]; k++){
    nodes_ptr adj_node = adj_nodes[node][k];
    if(degree[adj_node] == -1){
      disV[adj_node] = d+1;
      enq(&queue, adj_node);
    }
      }
    }
    if(queue.first == N || queue.first == queue.last){ maxD = d; break; }
  }
  return maxD;
}


void print_distance(char *fn, int D){
  FILE *fp = fopen(fn, "w");
  int *hashV = (int *) calloc(D+1, sizeof(int));
  for(int i = 0; i < N; i++) hashV[disV[i]] += 1;
  int **hashM = (int **) malloc(sizeof(int *)*(D+1));
  for(int d = 0; d <= D; d++)
  hashM[d] = (int *) malloc(sizeof(int)*hashV[d]);
  for(int d = 0; d <= D; d++) hashV[d] = 0;
  for(int i = 0; i < N; i++){
  int d = disV[i]; hashM[d][hashV[d]++] = i;
}




  for(int d = 0; d <= D; d++){
    fprintf(fp, "d=%d (%d駅)\n", d, hashV[d]);
    for(int j = 0; j < hashV[d]; j++)
      fprintf(fp, "%s ", name[hashM[d][j]]);
    fprintf(fp, "\n-----------------------\n");
  }
  fclose(fp);
}

queue.hの中身

typedef struct{
  Node** nodes_ptr;
  int first;
  int last;
} Queue;

void init_queue(Queue *queue, Node n){
  queue->nodes_ptr = (Node **) calloc(n, sizeof(Node));
  queue->first = queue->last = 0; 

}

void enq(Queue queue, int nodes_ptr){
  queue->arr[queue->last++] = input;
}

int deq(Queue *queue){
  nodes_ptr output = queue->arr[queue->first++];
  return output;

}


```
エラーメッセージ
In file included from cpgm/distance.c:4:0:
cpgm/queue.h: In function ‘init_queue’:
cpgm/queue.h:8:39: error: incompatible type for argument 1 of ‘calloc’
queue->nodes_ptr = (Node **) calloc(n, sizeof(N
^
In file included from cpgm/distance.c:2:0:
/usr/include/stdlib.h:468:14: note: expected ‘size_t {aka long unsigned int}’ but argument is of type ‘Node {aka struct <anonymous>}’
extern void *calloc (size_t nmemb, size_t s
^
In file included from cpgm/distance.c:4:0:
cpgm/queue.h: In function ‘enq’:
cpgm/queue.h:14:8: error: invalid type argument of ‘->’ (have ‘Queue {aka struct <anonymous>}’)
queue->arr[queue->last++] = input;
^
cpgm/queue.h:14:19: error: invalid type argument of ‘->’ (have ‘Queue {aka struct <anonymous>}’)
queue->arr[queue->last++] = input;
^
cpgm/queue.h:14:31: error: ‘input’ undeclared (first use in this function)
queue->arr[queue->last++] = input;
^
cpgm/queue.h:14:31: note: each undeclared identifier is reported only once for each function it appears in
cpgm/queue.h: In function ‘deq’:
cpgm/queue.h:18:3: error: unknown type name ‘nodes_ptr’
nodes_ptr output = queue->arr[queue->first++]
^
cpgm/queue.h:18:27: error: ‘Queue {aka struct <anonymous>}’ has no member named ‘arr’
nodes_ptr output = queue->arr[queue->first++]
^
cpgm/distance.c: In function ‘init_value’:
cpgm/distance.c:15:22: error: incompatible type for argument 2 of ‘init_queue’
init_queue(&queue, N);
^
In file included from cpgm/distance.c:4:0:
cpgm/queue.h:7:6: note: expected ‘Node {aka struct <anonymous>}’ but argument is of type ‘int’
void init_queue(Queue *queue, Node n){
^
cpgm/distance.c: At top level:
cpgm/distance.c:18:20: error: expected declaration specifiers or ‘...’ before ‘nodes_ptr’
void calc_distance(nodes_ptr origin){
^
cpgm/distance.c: In function ‘print_distance’:
cpgm/distance.c:63:30: error: subscripted value is neither array nor pointer nor vector
fprintf(fp, "%s ", name[hashM[d][j]]);
^
cpgm/distance.c: In function ‘main’:
cpgm/distance.c:74:14: warning: implicit declaration of function ‘calc_distance’ [-Wimplicit-function-declaration]
int maxD = calc_distance(origin);

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • y_waiwai

    2020/06/14 23:09

    エラーメッセージを提示しよう

    キャンセル

回答 1

0

void init_queue(Queue *queue, Node n){
queue->nodes_ptr = (Node **) calloc(n, sizeof(Node));

callocの第一引数はsize_tだけどそうなってませんな。
これをどうにかしよう

void enq(Queue queue, int nodes_ptr){
queue->arr[queue->last++] = input;
}

queue->なんたら、という表現はポインタじゃないとできません
これもどうにかしよう

そもそもの話になるけど、ヘッダファイルにコードは書くもんじゃありません。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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