C99에서 중첩 된 구조체 배열의 멤버를 변경하는 올바른 방법을 찾는 데 문제가 있습니다 (배열을 다른 함수에 전달한 후). 배열은 main () 내에서 선언되었으므로 스택에 있다고 생각합니까? -그리고 코드의 관련 부분 만 보여줄 수도 있습니다.
typedef struct
{
uint32_t x, y;
} point;
typedef struct
{
uint32_t r, g, b, a;
} rgba;
typedef struct
{
point a, b, c;
rgba p;
} tri;
그것들은 구조체입니다. 무작위 삼각형을 만드는 방법은 다음과 같습니다 (프로그램의 다른 부분에서 필요한 기능).
tri triangle()
{
tri t;
t.a.x = rand() % xres;
t.a.y = rand() % yres;
t.b.x = rand() % xres;
t.b.y = rand() % yres;
t.c.x = rand() % xres;
t.c.y = rand() % yres;
t.p.r = rand() % 256;
t.p.g = rand() % 256;
t.p.b = rand() % 256;
t.p.a = rand() % 256;
return t;
}
그리고 여기에 내가 배열을 선언하고 채우는 부분 (무시할 수있는 일부 줄)이 있습니다.
int main(int argc, char *argv[])
{
init(argc, argv[1]);
uint32_t img[xres][yres];
copyInputImage(img);
srand(time(NULL));
tri trigons[NUM_TRIGONS];
for (int i = 0; i < NUM_TRIGONS; i++)
{
trigons[i] = triangle();
}
모든 것이 성공적으로 나에게 임의의 삼각형 배열을 얻습니다.
이제 내 문제가 있습니다. 프로그램 매개 변수에 따라 때로는 텍스트 파일의 데이터로 배열을 즉시 다시 채우고 싶습니다. 텍스트 형식은 간단합니다. 모든 줄에 하나의 부호없는 문자가 있습니다. 다음은 해당 파일에서 단일 픽셀에 대한 데이터의 예입니다.
0
40
0
5
37
31
134
64
167
100
이것이 삼각형 구조체가 궁극적으로 필요로하는 10 가지 기본 요소의 예입니다. 모든 숫자 문자열은 3 자리 이하이지만 fgets () 를 사용한 루프 에는 줄 종결 자와 널 종결자를 허용하는 5 자 버퍼가 포함됩니다.
이를 수행하는 함수는 다음과 같습니다.
void read_SVG(char* filename, tri* ts)
{
FILE* fp = fopen(filename, "r");
char str[5];
for (int i = 0; i < NUM_TRIGONS; i++)
{
tri *t = &(ts[i]);
point *a = &(ts[i]).a;
point *b = &(ts[i]).b;
point *c = &(ts[i]).c;
rgba *p = &(ts[i]).p;
while (fgets(str, 5, fp) != NULL)
{
a->x = (uint32_t) strtol(str, NULL, 10);
a->y = (uint32_t) strtol(str, NULL, 10);
b->x = (uint32_t) strtol(str, NULL, 10);
b->y = (uint32_t) strtol(str, NULL, 10);
c->x = (uint32_t) strtol(str, NULL, 10);
c->y = (uint32_t) strtol(str, NULL, 10);
p->r = (uint32_t) strtol(str, NULL, 10);
p->g = (uint32_t) strtol(str, NULL, 10);
p->b = (uint32_t) strtol(str, NULL, 10);
p->a = (uint32_t) strtol(str, NULL, 10);
}
t->a = *a;
t->b = *b;
t->c = *c;
t->p = *p;
}
fclose(fp);
}
마지막으로 이것이 main () 의 컨텍스트 내에 표시된 read_SVG ()를 호출하는 방법 입니다.
if (argc > 2)
{
read_SVG(argv[2], trigons);
draw(screen, trigons);
SDL_Flip(screen);
SDL_SaveBMP(screen, "wtf.bmp");
exit(0);
}
이 read_SVG () 내에서 배열을 출력하면 예상 한 데이터처럼 보입니다. 그러나 main () 에서 다시 살펴보면 처음에 입력 한 임의의 값처럼 보입니다.
따라서 초기 배열이 전혀 업데이트되지 않은 것 같습니다. 내가 뭘 잘못했는지, 누구든지 이러한 유형의 중첩 구조체 전달 및 업데이트 문제를 처리하는 전반적으로 더 나은 방법을 제안 할 수 있습니까?
나는 이것에 대해 많은 질문을 받았을 것이라고 확신합니다. 나는 내 것이 다른 C 초보자를 도울 수있을만큼 충분히 포괄적 이길 바랄 뿐이다. 여기에 도움을 청하기 전에 다양한 접근 방식을 시도했습니다 ...
a, b, c, p는 이미 t가 가리키는 동일한 메모리를 가리 키기 때문에이 부분은 중복됩니다.
t->a = *a;
t->b = *b;
t->c = *c;
t->p = *p;
그러나 그것은 단지 멍청한 일입니다. ;) 중요한 주석은 아마도 fgets ()가 첫 번째 항목에 대한 모든 파일 내용을 읽고 나머지 항목에 대해서는 아무것도 읽지 않는다는 것입니다. 어쩌면 s / while / if /?
명확하게 편집하십시오 : 다음은 read_SVG () 함수의 대체 버전입니다.
void read_SVG(char* filename, tri* ts)
{
FILE* fp = fopen(filename, "r");
char str[5];
int i = 0;
while (i < NUM_TRIGONS && fgets(str, 5, fp) != NULL) {
uint32_t val = (uint32_t) strtol(str, NULL, 10);
ts[i].a.x = ts[i].a.y =
ts[i].b.x = ts[i].b.y =
ts[i].c.x = ts[i].c.y =
ts[i].p.r = ts[i].p.g = ts[i].p.b = ts[i].p.a = val;
i++;
}
fclose(fp);
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다