2014-12-09 2 views
6

포인터 및 구조체와 함께 C에서 몇 가지 문제점이 있습니다. Signal 구조체 2 개와 엔티티 중 하나를 저장하는 포인터 activeSignal이 있습니다. 자, 내 구조체 printParameters()에이 "stored"엔티티를 사용하여 내 구조체의 값을 인쇄하고 싶습니다. 불행히도, 내 마이크로 컨트롤러 디스플레이는 내 가치 대신에 일부 상형 문자를 인쇄합니다. 나는 완전히 포인터 연산을보고 있지 않다는 것을 인정해야한다. ...함수에 사용 된 구조체에 대한 포인터

struct SigParameter { 
    char *name; 
    int value; 
}; 

struct Signal { 
    struct SigParameter signalchar; 
}; 

int main(void) { 
    struct Signal s1; 
    struct Signal s2; 
    s1.signalchar.name = "Sinus"; 
    s2.signalchar.name = "Rect"; 
    struct Signal *activeSignal = &s1; 

    printParameters(activeSignal); 
} 

void printParameters(struct Signal *s) { 
    lcdPrintf(0,11,9,"%s", s->signalchar.name); 
} 
+1

나는 C 전문가는 아니지만 이것이 나에게 맞는 것처럼 보입니다. 's-> signalchar.name'을 간단히''Hello "'로 바꾸면 올바르게 동작합니까? –

+0

잠깐 나에게 유머 감히'printf ("% s", s-> signalchar.name);'시도해보십시오. 코드는 나에게 잘 보입니다. 'name'은 리터럴을 할당하는 경우'const char *'이어야합니다. – Bathsheba

+0

'lcdPrintf'는 정상적으로 작동합니까? 'lcdPrintf (0,11,9, "% s", "Sinus");를 시도 했습니까? 구조체에 세미콜론을 추가하십시오. –

답변

1

여기에 약간의 실수가있다. 나는 그것이 오식이라고 생각한다.

  1. printParameters()에 대한 전달 선언이 없습니다.
  2. main()이고, 호출 할 함수는 printParameter()이며 printParameters()이어야합니다.
  3. 없는 세미콜론 그러나 struct SigParameter signalchar

후, 난 당신이 단순히 값을 인쇄 할 경우 struct Signal *activeSignal = &s1;을 사용하기위한 논리가 표시되지 않습니다.

아래 코드를 확인할 수 있습니다.

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


struct SigParameter { 
char *name; 
int value; 
}; 

struct Signal { 
struct SigParameter signalchar; 
}; 

void printParameters(struct Signal s); 

int main(void) { 
struct Signal s1; 
struct Signal s2; 
s1.signalchar.name = "Sinus"; 
s2.signalchar.name = "Rect"; 

printParameters(s2); 
    return 0; 
} 

void printParameters(struct Signal s) { 
    printf("%s\n", s.signalchar.name); 
} 

내가 대신 lcdPrintf()의 간단한 printf()을 사용했지만, 그것을 잘 작동합니다.

는 출력이 세미콜론

[sourav @ 넓은 칼 온도] $ ./a.out

사각형

+0

음, 이것은 단지 내 코드의 발췌문이었습니다. printParameters (s2)를 사용하면 잘 작동합니다. 하지만 좀 더 역동적 인, 그래서 그것을 구조체에 해당 포인터로 시도했다 그것을 구현하고 싶습니다 –

+0

@ JulianHerbel 어떻게 동적? 값 및/또는 메모리 할당을 변경하는 것과 같습니까? 그 이외의 모든 유형의 작업에 대해 코드 위에 _ 잘 작동합니다. –

+0

@JulianHerbel 1) 값을 수정하려면 단순히'& s1' 또는'& s2'를 전달하십시오. 2) 문자열 리터럴은 대개 읽기 전용입니다. –

0
struct SigParameter signalchar 

가 배치되지 않는다. 실수 일 수 있습니다.

그런 다음 문자 포인터에 값을 할당하는 동안 해당 포인터의 메모리를 할당해야합니다. 그렇지 않으면 레지스터 메모리에 값을 저장합니다.

s1.signalchar.name = "Sinus"; 
s2.signalchar.name = "Rect"; 

포인터 변수에 대한 메모리를 할당하고 그에 대한 작업을 수행 할 수 있습니다. 그런 다음

당신은 기능

printParameter(activeSignal); 

를 호출하지만 기능은,이 GCC-4.8.1에 나를 위해 작동

printParameters(activeSignal); 
+0

음,'s1.signalchar.name = "Sinus";에 문제가 없습니다. –

0
#include <stdio.h> 
typedef struct{ 
    char *name; 
    int value; 
}SignalParameters; 

typedef struct{ 
    SignalParameters signalchar; 
}Signal; 
void printSignal(Signal* s); 
int main(void) { 
    Signal s; 
    s.signalchar.name = "Sinus"; 
    printSignal(&s); 
    return 0; 
} 

printSignal(Signal * s) { 
    printf("%s", s->signalchar.name); 
} 

, 그래서 아무 문제는 포인터가 없다 산술. 아마도 마이크로 컨트롤러의 clib와 관련이있을 것입니다. 더 유용한 답변을 얻으려면 사용중인 마이크로 컨트롤러를 알아야하며 lcdPrintf의 정의가 필요합니다.
그건 그렇고, typedef는 C로 많은 타이핑을 안전합니다 ;-).

관련 문제