2016-12-09 1 views
4

int numbers [5]와 같은 배열이 있다면 숫자 [0] = 1 또는 numbers [3] = 4로 값을 할당 할 수 있습니다.구조체와 그 값 전달

struct structName 
{ 
    int number0; 
    int number1; 
    int number2; 
}; 

다음 (주이 작동하지 않는 코드) 같은 것을 할 수있는 방법이 말을 someNumber을 할당 할 이름 [변수] = someNumber을 작성하는 방법이있다

int main(void) 
{ 
    struct structName name; //how could i declare this to do the following 
    for(int i = 0; i < 2; i++) 
    { 
     name[i] = i; //maybe name.[i] 
    } 
} 

그렇게된다 number0 (변수가 0 인 경우) 또는 number2 (변수가 2 인 경우). ive는 일을 찾고 있었고 이것을하지 않는 것을 찾을 수 없습니다.

+1

if struct structName {int num [3]; };'then'name. – BLUEPIXY

+2

http://ideone.com/x1pz4Z – BLUEPIXY

답변

5

다음

아니 뭔가를 할 수있는 방법이있다 (어쩌면 난 그냥 무엇을 찾아야할지 모르겠), 인덱스 구조의 필드에 액세스 할 수있는 방법이 없습니다. 당신은, 인덱스 값에 액세스하는 대신 배열을 사용하려면이 구조에 포함 될지라도,

struct structName name; 
name.number0 = someNumber; 
name.number1 = someOtherNumber; 

: 다음

struct structName 
{ 
    int numbers[3]; 
    // other fields here 
}; 

당신이 말할 수있는 당신은 대신 필드의 이름을 사용 :

struct structName name; 
for (int i = 0; i <= 2, i++) { 
    name.numbers[i] = i; 
} 
1

예, 이상하고 부적절한 메모리 조작이 있습니다. 배열을 사용하는 것이 훨씬 낫습니다.

struct structName 
{ 
    int numbers[3]; 
}; 

int main(void) 
{ 
    struct structName name; 
    for(int i = 0; i <= 2; i++) 
    { 
     name.numbers[i] = i; 
    } 
} 

또한 당신이 당신의 for 루프 및 off-by-one 오류 일부 구문 오류를 가지고 있습니다.

4

인덱스로 필드에 액세스 할 수있는 switch 문을 사용하는 함수를 작성할 수 있습니다. 예 :

#include<stdio.h> 

struct structName{ 
    int number0; 
    int number1; 
    int number2; 
}; 

void assign(struct structName * name, int i, int j){ 
    switch(i){ 
     case 0: 
      name->number0 = j; 
      break; 
     case 1: 
      name->number1 = j; 
      break; 
     case 2: 
      name->number2 = j; 
      break; 
    } 
} 

int main(void){ 
    int i; 
    struct structName name; 
    for(i = 0; i <= 2; i++){ 
     assign(&name,i,i); 
    } 
    //test: 
    printf("%d\n",name.number0); 
    printf("%d\n",name.number1); 
    printf("%d\n",name.number2); 
    return 0; 
} 

(예상대로 0,1,2를 인쇄합니다).

없이 문제의 구조체는 이미 API의 일부 또는 이미 일부로 정의하지 않는 (단지 배열 인 필드를 가진 반대로)이 일에 많은 지점이없는, 말을 쉽게 리팩토링되지 않는 코드베이스. (2) 등이 될 및 것 인수

+0

@BLUEPIXY는 원래 질문에 대한 주석의 링크 뒤에 OP의 문제에 대한 매크로 솔루션을 숨겼습니다. –

-1

매크로

#define name(x) x 

그래서 이름 (1) 1. 이름이 될 것입니다 작동합니다.

+1

이 매크로를 사용하여 OP의'struct'의'number2' 필드와 같은 값을 어떻게 할당 할 것을 제안합니까? –

-1

C에는 숟가락이 없습니다. 당신이 name.number0의 값을 확인하면

struct structName name; 
int *idx = &name; // First we need a memory address to the struct 
for (int i = 0; i < sizeof(name)/sizeof(*idx); ++i) { 
    // idx[i] == name.numberX 
    idx[i] = i; 
} 

지금, name.number1, name.number2 당신은 그들이 올바른 값이 포함되어 표시됩니다.

이것은 구조체를 사용하는 아주 좋은 방법은 아니지만 맨 앞의 응답에서 불가능하다고 주장한 후에 대답하도록 강요 받았습니다.

+1

이 해결책은 효과가있을 수도 있고 작동하지 않을 수도 있습니다 -'struct's는 당신이 고려하지 않은 패딩을 포함 할 수 있습니다. 이것은 구현에 의존하는 세부 사항입니다. –

+0

struct는 패딩이없는 3 개의 정수로만 구성됩니다. 인덱스가 조심스럽게 관리되는 한 항상 인덱스로 구조체 데이터에 액세스 할 수 있습니다. 이 경우에는 정수 크기만큼 반복하는 것이 가장 좋습니다. – interputed