2017-05-03 7 views
-2

방금 ​​구조체를 시작했고 그래프 관련 알고리즘 구현에 사용할 인접 행렬을 만들기 위해 구조체를 구현하는 데 관심이있었습니다. 그래서 그래프에서 포인터 변수에 대한 포인터를 만들어 2D 매트릭스의 기본 주소로 사용했습니다. 그러나 배열에 메모리를 할당하려고하면 오류가 표시됩니다.구조체의 포인터에 대한 포인터를 사용하여 2 차원 배열 만들기

Conversion to non-scalar type requested

아무도 도와 줄 수 있습니까? 나는 다음에 전체 코드를 게시하고있다 : -

struct graph{ 
    int v; 
    int e; 
    struct graph **admat; 
}; 

void main() 
{ 
    int x,i,y,z=1,n; 
    struct graph *G=(struct graph **)malloc(sizeof(struct graph)); 
    printf("\nenter number of vertices: "); 
    scanf("%d",&G->v); 
    printf("\nenter number of edges: "); 
    scanf("%d",&G->e); 
    G->admat=(struct graph **)malloc(G->v * sizeof(struct graph *)); 
    for(i=0;i<G->v;i++) 
    { 
     G[i]=(struct graph)malloc(G->v * sizeof(int));//here is the main error 
    } 
    for(x=0;x<i;x++) 
    { 
     for(y=0;y<i;y++) 
     { 
      G[x][y]=z++; 
     } 
    } 
    for(x=0;x<i;x++) 
    { 
     for(y=0;y<i;y++) 
     { 
      printf(" %d ",G[x][y]); 
     } 
     printf("\n"); 
    } 
} 
+1

'malloc'에서 캐스트를 제거하십시오. 그리고 만약 당신이 'int'를 잡고 싶다면,'struct graph ** admat;'->'int ** admat;' – BLUEPIXY

+0

G는 하나의 포인터이지만 두 번 포인터를 형변환하고 있습니다. 그건 옳지 않아. 나는 G가 double pointer가되어야하는지 아니면 struct element admat가 double pointer인지에 대해 혼란스러워한다고 생각합니다. 그것은 명확히해야합니다. –

+0

G [x] [y] = z 지정이 올바르지 않습니다. G는 구조체입니다. z 값을 저장하는 구조 요소가 필요합니다. –

답변

1

이 코드 조각은 문제 :

struct graph *G=(struct graph **)malloc(sizeof(struct graph)); 
printf("\nenter number of vertices: "); 
scanf("%d",&G->v); 
printf("\nenter number of edges: "); 
scanf("%d",&G->e); 
G->admat=(struct graph **)malloc(G->v * sizeof(struct graph *)); 
for(i=0;i<G->v;i++) 
{ 
    G->admat[i]=(struct graph)malloc(G->v * sizeof(int));//here is the main error 
} 

당신은으로 변경해야합니다 제거해야

struct graph *G = malloc(sizeof(struct graph)); 
if (G == null) 
    printf("Error allocating memory"); 

printf("\nenter number of vertices: "); 
scanf("%d",&G->v); 
printf("\nenter number of edges: "); 
scanf("%d",&G->e); 

G->admat=malloc(G->v * sizeof(struct graph *)); // I guess you mean G->admat=malloc(sizeof(struct graph *)); 
if (G->admat == null) 
    printf("Error allocating memory"); 
for(i = 0; i<G->v; i++) 
{ 
    G[i] = malloc(G->v * sizeof(int)); 
    if (G[i] == null) 
     printf("Error allocating memory"); 
} 

, Gint을 할당하려고 시도하면 struct graph에 대한 이중 포인터입니다. 그것은 아무 의미가 없습니다.

또한 의 결과를 캐스팅하지 말아야 할 이유에 대해서는 this link을 읽어보십시오.

+1

'G [i] = (구조체 그래프) malloc (G-> v * sizeof (int)); 'G-> admat [i] = malloc (G-> v * sizeof (구조체 그래프));',하지만 OP는 int를 보유하고 싶을 수도 있습니다. – BLUEPIXY

+0

@BLUEPIXY이 (가) 편집했습니다. 감사합니다. – Marievi

+0

'G [i] = malloc (G-> v * sizeof (int)); '는 범위를 벗어납니다. – BLUEPIXY

0

admat에 2D 행렬 데이터가 있다고 가정하면 이 코드입니다. 새로운 변수 z가 도입되어 값 z를 저장합니다.

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

struct graph{ 
    int v; 
    int e; 
    int z; 
    struct graph **admat; 
}; 

void main() 
{ 
    int x,i,y,z=1,n; 
    struct graph *G= malloc(sizeof(struct graph)); 
    printf("\nenter number of vertices: "); 
    scanf("%d",&G->v); 
    printf("\nenter number of edges: "); 
    scanf("%d",&G->e); 

    G->admat=malloc(G->v * sizeof(struct graph *)); 
    for(i=0;i<G->v;i++) 
    { 
     G->admat[i]=malloc(G->v * sizeof(struct graph));//here is the main error 
    } 
    for(x=0;x<i;x++) 
    { 
     for(y=0;y<i;y++) 
     { 
      G->admat[x][y].z=z++; 
     } 
    } 
    for(x=0;x<i;x++) 
    { 
     for(y=0;y<i;y++) 
     { 
      printf(" %d ",G->admat[x][y].z); 
     } 
     printf("\n"); 
    } 
}