const 포인터을 리턴 받는 함수...인데 문제가..

akalia의 이미지

typedef struct test
{
 int count;
 const char* data;
} t_test;

const t_test* Depress1(const t_test* image)
{
 t_test* temp

 temp=(t_test*)image;

 .....


 return (const t_test*)temp;
}
와
const t_test* Depress2(const t_test* image)
{
 t_test temp

 temp=* image;

 .....



 return (const t_test*)&temp;
}

void fnDrawImage(int x, int y)
{
 draw( Depress, x, y);
 //draw(const t_test* data,int x, int y);

}

draw함수 에서 Depress1,2을 Depress 부분에 넣어서 리턴값을 받아서 화면에
그림을 그리는 함수입니다..

Depress1,2는 데이타의 압축을 풀어서 압축푼 데이타을 리턴해주는 함수이고요..

Depress1은 temp가 const t_test* image의 포인터을 받아서 그런지

char* str;
temp->data=str;

위에처럼 하니깐 실행시에 에러가 발생하더라고요..

그래서 데이타을 바꾸지 않고 함수을 실행해봣는데
Depress1을 이용하면 제대로 된 영상이 출력되는데 Depress2을
이용하면 영상이 출력이 안되더라구요..

그래서 Depress2에서
마지막부분에

image=(const t_test*)&temp;
return image;

이런 식으로 변경하여 실행해 봣더니 결과는 역시 아무 것도 출력이
안되더라구요..

결과적으로 보면 리턴 주소 값이 const 영역의 주소 이어야만 한다는 이야기가
되는데 .. 안되더라구요...

간단히 말씀 드려서 const 포인터의 주소값을 받아서 그 안의 data값을 변경하여
다시
const 포인터을 넘겨주는 방법은 위에것 말고는 없는건가요...?

좀 알려주세요..

seoleda의 이미지

akalia wrote:

간단히 말씀 드려서 const 포인터의 주소값을 받아서 그 안의 data값을 변경하여
다시
const 포인터을 넘겨주는 방법은 위에것 말고는 없는건가요...?

좀 알려주세요..

const 라는 한정자를 붙이는 이유는 "나는 이 변수를 변경하지 않겠다!!" 라고 명시적으로 컴파일러에 알리는 것입니다. 따라서 내용을 변경하시려고 하면서 const 한정자를 붙이는건 이상해 보입니다.

부연해서 설명하자면, const 한정자를 포인터에 사용시 2가지 위치에 사용이 가능합니다.

const int *a; 라고 한다면 이 의미는 *a의 내용을 변경하지 않겠다는 의미로써 *a=10; 과 같은 연산이 허용되지 않고요,
반면에, int *const a = &b; 이렇게 한다면, *a=10; 과 같은 연산은 허용되지만, a가 가르키는 b를 변경할 수 없습니다. 즉 a=&c; 와 같은 연산은 허용되지 않습니다. 아마도 akalia님이 하시려는게 이방법같습니다..

그리고 마지막으로 Depress2가 아무것도 안나오는 이유는 temp라는 변수는 함수가 종료하면 사라지는 변수입니다. 함수가 종료하고 나면 어떠한 값이 들어있을지 아무도 보장하지 못합니다. const 한정자와는 아무 상관이 없는 현상입니다. 구지 temp를 리턴 하시려면 static 으로 temp를 선언하면 됍니다.

akalia의 이미지

답변 감사 합니다...
말씀 하신데로 temp을 static 으로 하니깐 ... 적용이 되네요..ㅡ.ㅡ;;
이런 무지스러울수가...;;

한가지 더 궁굼한게 있는데요
위의 소스을 하다가 이상해서 질문드리는건데요..
const 연산자는 cast 연산이 적용이 안되나요..

const int* a;
int* temp;

temp=(int*) str;

이런 식으로 코딩을 한다면 temp의 데이타 형은 (const int*)형이 아닌
int* 형으로 변경이 가능한 건가요.

위의 소스을 변경하다가
temp=(t_test*) image; 한후
temp->count=4; 이런식으로 하니깐 에러가 나서
궁굼해서 이렇게 질문을 드립니다..

seoleda의 이미지

컴파일러가 그리 만만한게 아닙니다.

const t_test* Depress1(const t_test* image) 
{ 
 t_test* temp 
 temp=(t_test*)image; 
 ..... 
 return (const t_test*)temp; 
} 

여기서 잘 image 변수의 선언을 보시면, 난 image 변수의 내용을 변경하지 않겠다! 라고 얘기 했습니다.

const t_test* image;

그런데, akalia 님은 얄팍하게(?), *temp에 image의 주소를 넣어서 temp를 변경하려 하고 있습니다. 하지만, *temp는 이름만 다를뿐 image 와 같은 내용을 래퍼런스 하고 있습니다. temp를 고치는 것은 image를 고치는 것과 동일합니다. 즉
temp->count=4; 나 image->count=4;는 동일한 연산이 됨을 컴파일러가 감지하고, 불허하는 것입니다.

반면에 2번째는 temp는 포인터가 아니라 그냥 자동변수 입니다. 따라서, temp = *image; 에서 복사가 이루어 집니다. temp의 주소와 image의 주소가 다릅니다. 즉 여기서는 temp의 내용을 변경하는 것과 image의 내용을 변경하는 것은 별개입니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.