포럼

Mac 할당은 캐스트 없이 정수에서 포인터를 만듭니다.

에게

쿠밥007

오리지널 포스터
2008년 7월 21일
  • 2008년 7월 29일
여보세요!

나는 그것이 일반적인 문제라는 것을 알고 있지만 많은 게시물을 읽었지만 여전히 내가 무엇을 잘못하고 있는지 모릅니다.
그것이 내 코드입니다.

코드: |_+_|
그리고 '할당은 캐스트 없이 정수에서 포인터를 만듭니다'라는 경고가 있지만 프로그램을 시작하고 이 기능을 사용하면 꺼집니다.
누군가가 나를 도와준다면 나는 감사할 것이다.

로비던칸

모더레이터 명예
2002년 7월 24일
해러게이트


  • 2008년 7월 29일
kubap007이 말했습니다: 코드: |_+_|

문제는 이 줄입니다. 정확히 무엇을 하고 있다고 생각하시나요? 제공된 형식을 사용하여 새 NSString을 생성하는 것은 아닙니다.

당신은 사용하고 싶어 문자열 포함 형식: 다음과 같은 NSString 메서드:

코드: |_+_|
문자열은 자동 해제된다는 점에 유의하십시오. 유지하고 싶을 수도 있습니다...

그나셔729

정지 된
2005년 11월 25일
  • 2008년 7월 29일
kubap007이 말했습니다: 안녕하세요!

나는 그것이 일반적인 문제라는 것을 알고 있지만 많은 게시물을 읽었지만 여전히 내가 무엇을 잘못하고 있는지 모릅니다.
그것이 내 코드입니다.

코드: |_+_|
그리고 '할당은 캐스트 없이 정수에서 포인터를 만듭니다'라는 경고가 있지만 프로그램을 시작하고 이 기능을 사용하면 꺼집니다.
누군가가 나를 도와준다면 나는 감사할 것이다.

다음과 같이 접근해야 하는 방법에 대해 (언젠가는 혼자가 될 것이기 때문에):

경고의 의미는 정확히 다음과 같습니다. 값을 할당하고 있습니다. 할당하는 값은 정수입니다. 할당하는 변수는 포인터입니다. 그것은 경고를 받을 가치가 있습니다(사실, gcc는 약간 멍청합니다. 이것은 경고가 되어서는 안되며, 하드 오류여야 합니다).

분명히 그것은 당신이 의도한 것이 아닙니다. 그러나 사실은 정수를 할당하고 있다는 것입니다. 당신이 할당하는 것은

코드: |_+_|
그래서 컴파일러는 그것이 정수라고 알려줍니다. 이제 이 표현이 의미하는 바가 무엇이라고 생각하십니까? Objective C 문자열 @'%d ', 그 뒤에 쉼표, 정수 및 모든 항목을 둘러싼 대괄호가 있습니다. 대괄호는 무시해도 됩니다. 대괄호 안에 있는 것은 소위 'comma-expression'입니다. 쉼표로 구분된 두 개의 표현식입니다. 쉼표 식에서 컴파일러는 첫 번째 식을 평가하고 결과를 버리고 두 번째 식을 평가하며 이것이 결과입니다. 그래서 당신은 실제로 코드를 할당하고 있습니다: |_+_| .

쉼표 표현식이 유용한 경우는 다음과 같습니다.

코드: |_+_|
x를 3*y + 1로 설정한 다음 x*x를 z에 저장합니다. 귀하의 경우 분명히 귀하가 원하는 것이 아닙니다. 실제로 하고 싶은 것이 무엇인지 파악하고 이를 수행하는 코드를 작성해야 합니다.

경고를 읽는 데 약간의 연습이 필요하지만 경고를 이해하는 것이 중요합니다. 코드에 경고가 전혀 없도록 하는 것이 좋습니다. 따라서 변경 후에 경고가 표시되면 이를 알아차리고 문제를 해결합니다. 매우 유혹적이고 매우 잘못된 것은 문제 대신 경고를 '수정'하려고 하는 것입니다. 귀하의 경우 다음을 작성할 수 있습니다.

코드: |_+_|
그리고 경고는 사라질 것입니다. 그러나 컴파일러에게 경고하지 않도록 지시했다는 점을 제외하면 문제는 여전히 존재합니다. (컴파일러는 정수 'val'을 취하고 정수 대신 NSString 객체에 대한 포인터인 것처럼 가장합니다. 결과는 매우, 매우 추악할 것입니다.)

한 가지 궁금한 점이 있습니다. 왜 코드를 약 -32000에서 +32000 사이의 'stock' 값으로 인위적으로 제한합니까? 이것은 어떤 목적에도 도움이 되지 않습니다. 에게

쿠밥007

오리지널 포스터
2008년 7월 21일
  • 2008년 7월 29일
덕분에 이제 작동하고 저도 뭔가를 배웁니다. NS

샌더

2008년 4월 24일
  • 2008년 7월 29일
gnasher729는 다음과 같이 말했습니다: 경고는 정확히 그것이 말하는 것을 의미합니다: 당신은 값을 할당하고 있습니다. 할당하는 값은 정수입니다. 할당하는 변수는 포인터입니다. 그것은 경고를 받을 가치가 있습니다(사실, gcc는 약간 멍청합니다. 이것은 경고가 되어서는 안되며, 하드 오류여야 합니다).

나는 그것에 대해 확실하지 않다. C99 사양은 (6.5.16.1) 그것이 유효한 C가 아니라고 구체적으로 명시하고 있지만 Objective-C가 이 표준보다 앞서 있다고 생각합니다. Microsoft Visual Studio 2005(여기에 최신 버전이 없습니다)는 C++ 코드로 컴파일할 때 오류라고 생각합니다(오류 C2440: '=': 'int'에서 'int *'로 변환할 수 없음). C로 컴파일할 때 경고를 발행합니다(경고 C4047: '=' : 'int *'는 'int'와 간접 참조 수준이 다름).

그냥 니피킹. 미디엄

미니맥린

2008년 3월 9일
  • 2008년 11월 24일
스레드를 약간 부딪힌 경우 죄송하지만 viewDidLoad에 정수가 선언되었습니다.
코드: |_+_| 그런 다음 UISegmentedControl의 섹션을 누르면 해당 정수가 1로 변경되기를 원하므로 이 작업을 수행했습니다.
코드: |_+_| 그러나 그것은 할당은 캐스트 없이 정수에서 포인터를 만듭니다. 오류,

그것을 고치는 방법, 위의 게시물을 읽었지만 이것이 어떻게 관련되어 있는지 알지 못합니다.

로비던칸

모더레이터 명예
2002년 7월 24일
해러게이트
  • 2008년 11월 24일
MiniMacLean은 다음과 같이 말했습니다: 내가 스레드를 조금 부딪쳤다면 죄송하지만 viewDidLoad에 정수가 선언되었습니다.
코드: |_+_|

기본적인 문제는 선언된 정수가 없다는 것입니다. 선언된 정수에 대한 포인터가 있습니다. 미디엄

미니맥린

2008년 3월 9일
  • 2008년 11월 24일
d'ya는 내가 .h에서 int를 delcare하는 경우를 의미합니다.
코드: |_+_| 나도 그렇게 했으니까, 그렇지 않다면 무슨 뜻이야?

로비던칸

모더레이터 명예
2002년 7월 24일
해러게이트
  • 2008년 11월 24일
MiniMacLean은 다음과 같이 말했습니다: d'ya는 .h에서 int를 delcare하는 경우를 의미합니다.
코드: |_+_| 나도 그렇게 했으니까, 그렇지 않다면 무슨 뜻이야?

좋습니다. 이것은 매우 거칠게 들릴 것입니다. 하지만 포인터가 무엇인지, 어디에 사용하고 무엇을 의미하는지 이해하는 데 근본적인 문제가 있으므로 기본 C를 배워야 합니다.

코드: |_+_|
지정된 이름을 사용하여 유형(특히 해당 유형의 데이터를 포함할 것으로 예상되는 메모리 공간)에 대한 포인터를 선언합니다. 유형의 변수를 선언하지 않습니다. 따라서 int를 선언하지 않고 int에 대한 포인터를 선언했습니다. 이 두 가지는 결정적으로 그리고 근본적으로 다릅니다.

lee1210

2005년 1월 10일
텍사스주 댈러스
  • 2008년 11월 24일
int *는 int와 근본적으로 다른 유형입니다.

TabNumber를 선언한 경우:
코드: |_+_|
그것은 int가 될 것이고 당신은 할 수 있습니다:
코드: |_+_|
int *로 선언했습니다.
코드: |_+_|
따라서 무언가를 저장하려면 메모리가 필요합니다.
코드: |_+_|
포인터와 구체적인 변수의 차이점을 아직 모르는 경우(공격 의도가 없으며 이것이 아직 배운 내용인지 확실하지 않음) 계속하기 전에 알아내야 합니다.

-읽다

편집하다: 로비던칸 펀치로 나를 때리고 같은 것에 대해 표현했습니다.

로비던칸

모더레이터 명예
2002년 7월 24일
해러게이트
  • 2008년 11월 24일
lee1210은 다음과 같이 말했습니다: 편집: 로비던칸 펀치로 나를 때리고 같은 것에 대해 표현했습니다.

하지만 당신은 훨씬 더 자세히 그것을했습니다 미디엄

미니맥린

2008년 3월 9일
  • 2008년 11월 24일
기본 C 언어에 대해 더 읽어보라고 말씀하시겠지만
이 정수를 둘 이상의 방법으로 사용할 수 있기를 원합니다.
하지만 이렇게 하면 경고: TabNumber의 로컬 선언이 인스턴스 변수를 숨깁니다.
제가 정말 바보였다면 죄송합니다만 이 경고에 대해 설명해 주시겠습니까?

크로뮬런트

2006년 10월 2일
희망과 영광의 땅
  • 2008년 11월 24일
MiniMacLean은 다음과 같이 말했습니다: 기본 C 언어에 대해 더 읽어보라고 말씀하시겠지만
이 정수를 둘 이상의 방법으로 사용할 수 있기를 원합니다.
하지만 이렇게 하면 경고: TabNumber의 로컬 선언이 인스턴스 변수를 숨깁니다.
제가 정말 바보였다면 죄송합니다만 이 경고에 대해 설명해 주시겠습니까?

그런 다음 메서드 사이에 정수를 전달해야 합니다. C에서는 다음과 같이 할 것입니다.

코드: |_+_|
Objective-C의 비슷한 개념은 약간 다른 구문으로 가정합니다.

lee1210

2005년 1월 10일
텍사스주 댈러스
  • 2008년 11월 24일
우리는 당신에게 답을 주는 것보다 당신에게 무언가를 가르치려고 노력하고 있습니다. TabNumber를 int로 선언하려면 선언에서 *를 빼면 됩니다.

-읽다 미디엄

미니맥린

2008년 3월 9일
  • 2008년 11월 24일
lee1210은 다음과 같이 말했습니다: 우리는 단지 당신에게 답을 주기보다는 당신에게 무언가를 가르치려고 노력하는 방향에서 약간 벗어났습니다. TabNumber를 int로 선언하려면 선언에서 *를 빼면 됩니다.

-읽다

감사 해요

노저스트제이

2003년 9월 19일
캐나다, 응?
  • 2008년 11월 24일
나는 강력히 추천한다 실용적인 C 프로그래밍 O'Reilly and Associates에서 발행한 소위 '암소 책'.

사본을 사고 싶지 않다면 가능하면 도서관에서 찾으십시오. 나는 이 책을 가이드로 삼아 C 프로그래밍을 스스로 가르칠 수 있었고, 그 이후에 객체지향 프로그래밍(C++)이 빠르게 등장했다. 내가 읽은 최고의 C 책이다. 미디엄

미니맥린

2008년 3월 9일
  • 2008년 11월 25일
notjustjay는 다음과 같이 말했습니다. 실용적인 C 프로그래밍 O'Reilly and Associates에서 발행한 소위 '암소 책'.

사본을 사고 싶지 않다면 가능하면 도서관에서 찾으십시오. 나는 이 책을 가이드로 삼아 C 프로그래밍을 스스로 가르칠 수 있었고, 그 이후에 객체지향 프로그래밍(C++)이 빠르게 등장했다. 내가 읽은 최고의 C 책이다.

감사 해요!