c언어 2차원 배열과 포인터 관련 질문입니다..

SonaGius의 이미지

소스를 받았는데

void b(float *a){
 
}
 
main(){
    float a[10][20];
    b(a);
}

형태의 소스입니다. 이게 이상이 없는건지가 알고싶고, (비주얼 2005로 테스트 해보니까 안됩니다..)

혹 저게 컴파일러 별로 다르다면 가능한 도구가 무엇인지 알고 싶습니다.

[예상컨데 Turbo C로 작성된 프로그램 같습니다만, Turbo C로는 에러는 없는데 프로그램이 올바르게 수행되지 않습니다.]

긴 글 읽어주셔서 감사합니다!

whitelka의 이미지

함수인자는 포인터형인데 사용할때는 이중 포인터(2차원배열)을 사용했으니깐요..
b(a[0]) 이런식으로 사용하셔야 할듯
또는 b(*a)

luciell의 이미지

일단 소스부터..

// 1번
int array[3][3]={ {7,8,9} , {6,5,4} , {1,2,3} };
void array_print( int arr[ROWS][COLS] );
 
// 2번
int array[3][3]={ {7,8,9} , {6,5,4} , {1,2,3} };
void array_print( int *arr );

1번의 경우 array_print 안에서 arr[i][j] 형식으로도 쓸수잇지만 ( 이때 i,j 는 0 ~ 2 )
2번의 경우에은 array_print 안에서 arr[i] 형태로 쓸수잇습니다( 이때 i 는 0 ~ 8 )

저도 처음에 함수 인자로 이차원포인터로 **arr 이런식으로 넘기면 당연히 arr[][] 이런식으로 쓸수 있을지 알앗는데 잘 생각해보면

포인터라는 것은 메모리주소값을 가지고 있는아이입니다. 결국 포인터로 전달될시 배열이 1차원인지 2차원인지 함수는 알수가 없다는게 제 정답이었습니다.( 여러가지 방법으로 테스트 해보았어요 ^^; )

함수인자로 배열의 크기를 지정하지 않으시고 이차원포인터로 넘기시고 싶으셔도 저런 경우에는 이중포인터를 굳이 쓸 필요가 없다는것입니다.
( 참고로 컴파일러는 MacOSX gcc , VS2008 테스트 해보았습니다. )

네가 꿈을 꾸지 않는 한, 꿈은 절대 시작되지 않는단다.
언제나 출발은 바로 '여기'야 떄가 무르익으면, 그럴수 있는 조건이 갖춰지면,
하고 미루다 보면, 오느새 현실에 파묻혀 소망을 잃어버리지.
그러므로 무언가 '되기(be)' 위해서는 반드시 지금 이 순간 무언가를 '해야(do)'만 해
- Stuart Avery Gold 의 우화소설 Ping 중에서..

luciell의 이미지

void b(float *a){
 
}
 
main(){
    float a[10][20];
    b(a);
}

main 함수에서의 a 라는 변수는 a[0][0] 의 주소를 가지고 있기 때문에 컴파일 상의 문제는 전혀 없다고 봅니다.
혹시 다른곳 문제 때문에 컴파일이 안된건 아닌가요? 소스 전체를 올려주실수 있으시면 더 쉽게 찾을수 잇을텐데 말이지요..^^

네가 꿈을 꾸지 않는 한, 꿈은 절대 시작되지 않는단다.
언제나 출발은 바로 '여기'야 떄가 무르익으면, 그럴수 있는 조건이 갖춰지면,
하고 미루다 보면, 오느새 현실에 파묻혀 소망을 잃어버리지.
그러므로 무언가 '되기(be)' 위해서는 반드시 지금 이 순간 무언가를 '해야(do)'만 해
- Stuart Avery Gold 의 우화소설 Ping 중에서..

klara의 이미지

같은 질문을 새로 올리지 마세요.
http://kldp.org/node/123965
이전에 올린 질문에서 납득되지 않는게 있다면 그곳에서 계속 이야기 하시면 됩니다.
포럼형 게시판에서는 덧글을 새로달면 앞으로 올라오니까요.
토시하나 바꾸지 않고 완전히 똑같은 내용을 새로 올리면 결국 똑같은 내용의 답변이 반복되기만 할수 있습니다.

익명 사용자의 이미지

같은 질문을 새로 올린게 아니라
처음에 올릴때 두번 올라왔나 봅니다.

날짜를 확인!!

DarkSide의 이미지

C++ 에서는 저런게 허용되지 않죠.

C 문법에는 맞는다고 해도 결국은 런타임 에러가 나고 버그를 찾아 내기도 어렵기 때문에 원칙대로 하는게 좋을 듯 하네요.

익명 사용자의 이미지

어차피 지나간 얘기지만
어떻게 이게 문법상 문제가 없다고들 그렇게 '자신있게' 답하는건지 도저히 이해가 안됨...

문법상으로는 pointer to float랑 pointer to array of float랑 서로 호환이 안되는게 정답이고,

http://www.comeaucomputing.com/tryitout/

위의 온라인 컴파일러로 돌려봐도 당연히 호환 안되는 타입이라고 에러가 뜨고
내가 지금 없는 gcc 다시 깔아가면서 확인을 해봐도
incompatible pointer type 이라고 딱하니 경고가 뜨는데
한두 사람도 아니고 여럿이서 문법에 문제가 없는 거라는 답변을 하니
오히려 내가 헷갈릴 지경...

익명 사용자의 이미지

참고로 C++가 아니라 C에서도 마찬가지로 문법상 오류입니다.

익명 사용자의 이미지

문제는 예전에는 저렇게 많이 썼다는 사실.
오래전에 C 하시다가 C++로 넘어가신 분들은 맞는다고 생각할 수도.
C 에서는 포인터를 void* 로 바꾸면 마음대로 변형할 수 있기 때문에 저 코드가 문제는 있지만 돌리수는 있다는.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.