중첩 된 C 구조체의 배열을 업데이트하는 올바른 방법은 무엇입니까?

맡은 일

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 초보자를 도울 수있을만큼 충분히 포괄적 이길 바랄 뿐이다. 여기에 도움을 청하기 전에 다양한 접근 방식을 시도했습니다 ...

Bjorn A.

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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

개체에서 중첩 된 컬렉션을 반환하는 올바른 방법은 무엇입니까?

분류에서Dev

중첩 된 개체를 배열로 바꾸는 방법은 무엇입니까?

분류에서Dev

Vue.js의 중첩 배열에서 올바른 객체를 얻는 방법은 무엇입니까?

분류에서Dev

특정 키의 값이 동일한 경우 값을 중첩 된 객체 배열로 업데이트하는 방법은 무엇입니까?

분류에서Dev

Android의 개조 응답에서 중첩 된 json 객체 및 배열을 얻는 방법은 무엇입니까?

분류에서Dev

객체의 다른 배열을 가리키는 중첩 된 객체 배열을 반복적으로 반복하는 방법은 무엇입니까?

분류에서Dev

중첩 된 개체에서 중첩 된 배열을 만드는 방법은 무엇입니까?

분류에서Dev

Mongoose의 다른 배열에 중첩 된 배열에 요소를 추가하는 방법은 무엇입니까?

분류에서Dev

중첩 된 fields_for에 올바른 색인을 설정하는 방법은 무엇입니까?

분류에서Dev

중첩 된 매개 변수 확장을 인용하는 올바른 방법은 무엇입니까?

분류에서Dev

PySpark : 배열 내부의 구조체에 중첩 된 구조체에서 변수를 추출하는 방법은 무엇입니까?

분류에서Dev

Nestjs-중첩 된 json 객체를 변환하기 위해 DTO 파일을 만드는 올바른 방법은 무엇입니까?

분류에서Dev

C에서 구조체없이 중첩 된 이중 포인터를 갖는 방법은 무엇입니까?

분류에서Dev

underscorejs를 사용하여 중첩 된 객체의 내부 배열을 얻는 방법은 무엇입니까?

분류에서Dev

배열에서 개체를 업데이트하는 올바른 방법은 무엇입니까?

분류에서Dev

내부 배열의 길이가 다른 중첩 배열을 작성하는 방법은 무엇입니까?

분류에서Dev

Twig에서 중첩 배열을 반복하는 올바른 방법은 무엇입니까?

분류에서Dev

node.js에서 SQL 데이터베이스를 반복하면서 중첩 된 json 배열을 올바르게 만드는 방법은 무엇입니까?

분류에서Dev

Swift를 사용하여 중첩 된 JSON 데이터를 구문 분석하는 올바른 방법은 무엇입니까?

분류에서Dev

구조체 배열에 중첩 된 구조체 배열을 정렬하는 방법 C

분류에서Dev

fb-hydra : 2 개의 중첩 된 구조화 구성을 구현하는 방법은 무엇입니까?

분류에서Dev

C #의 MongoDB-다중 필터링을 수행하는 올바른 방법은 무엇입니까

분류에서Dev

중첩 된 json을 Javascript에서 객체 배열로 변환하는 방법은 무엇입니까?

분류에서Dev

중첩 된 JSON 배열을 구문 분석하는 방법은 무엇입니까?

분류에서Dev

중첩 된 개체 바인딩이 변경된 경우 JavaFX TableView를 업데이트하는 방법은 무엇입니까?

분류에서Dev

중첩 된 foreach의 모든 배열을 설정 해제하는 방법은 무엇입니까?

분류에서Dev

C ++에서 QML 객체를 업데이트하는 올바른 방법은 무엇입니까?

분류에서Dev

플랫 JavaScript 객체 배열을 중첩 된 계층 적 JSON 구조로 변환하는 방법은 무엇입니까?

분류에서Dev

pyspark를 사용하여 구조체의 중첩 된 열에서 값을 업데이트하는 방법

Related 관련 기사

  1. 1

    개체에서 중첩 된 컬렉션을 반환하는 올바른 방법은 무엇입니까?

  2. 2

    중첩 된 개체를 배열로 바꾸는 방법은 무엇입니까?

  3. 3

    Vue.js의 중첩 배열에서 올바른 객체를 얻는 방법은 무엇입니까?

  4. 4

    특정 키의 값이 동일한 경우 값을 중첩 된 객체 배열로 업데이트하는 방법은 무엇입니까?

  5. 5

    Android의 개조 응답에서 중첩 된 json 객체 및 배열을 얻는 방법은 무엇입니까?

  6. 6

    객체의 다른 배열을 가리키는 중첩 된 객체 배열을 반복적으로 반복하는 방법은 무엇입니까?

  7. 7

    중첩 된 개체에서 중첩 된 배열을 만드는 방법은 무엇입니까?

  8. 8

    Mongoose의 다른 배열에 중첩 된 배열에 요소를 추가하는 방법은 무엇입니까?

  9. 9

    중첩 된 fields_for에 올바른 색인을 설정하는 방법은 무엇입니까?

  10. 10

    중첩 된 매개 변수 확장을 인용하는 올바른 방법은 무엇입니까?

  11. 11

    PySpark : 배열 내부의 구조체에 중첩 된 구조체에서 변수를 추출하는 방법은 무엇입니까?

  12. 12

    Nestjs-중첩 된 json 객체를 변환하기 위해 DTO 파일을 만드는 올바른 방법은 무엇입니까?

  13. 13

    C에서 구조체없이 중첩 된 이중 포인터를 갖는 방법은 무엇입니까?

  14. 14

    underscorejs를 사용하여 중첩 된 객체의 내부 배열을 얻는 방법은 무엇입니까?

  15. 15

    배열에서 개체를 업데이트하는 올바른 방법은 무엇입니까?

  16. 16

    내부 배열의 길이가 다른 중첩 배열을 작성하는 방법은 무엇입니까?

  17. 17

    Twig에서 중첩 배열을 반복하는 올바른 방법은 무엇입니까?

  18. 18

    node.js에서 SQL 데이터베이스를 반복하면서 중첩 된 json 배열을 올바르게 만드는 방법은 무엇입니까?

  19. 19

    Swift를 사용하여 중첩 된 JSON 데이터를 구문 분석하는 올바른 방법은 무엇입니까?

  20. 20

    구조체 배열에 중첩 된 구조체 배열을 정렬하는 방법 C

  21. 21

    fb-hydra : 2 개의 중첩 된 구조화 구성을 구현하는 방법은 무엇입니까?

  22. 22

    C #의 MongoDB-다중 필터링을 수행하는 올바른 방법은 무엇입니까

  23. 23

    중첩 된 json을 Javascript에서 객체 배열로 변환하는 방법은 무엇입니까?

  24. 24

    중첩 된 JSON 배열을 구문 분석하는 방법은 무엇입니까?

  25. 25

    중첩 된 개체 바인딩이 변경된 경우 JavaFX TableView를 업데이트하는 방법은 무엇입니까?

  26. 26

    중첩 된 foreach의 모든 배열을 설정 해제하는 방법은 무엇입니까?

  27. 27

    C ++에서 QML 객체를 업데이트하는 올바른 방법은 무엇입니까?

  28. 28

    플랫 JavaScript 객체 배열을 중첩 된 계층 적 JSON 구조로 변환하는 방법은 무엇입니까?

  29. 29

    pyspark를 사용하여 구조체의 중첩 된 열에서 값을 업데이트하는 방법

뜨겁다태그

보관