double[][]에서 double**로의 타입캐스팅

나그네나그네의 이미지

void f(const double ** d){
    printf("%g\n", d[0][0]);
}
int main(){
    double d[3][2] = .....;
    f((double **)d);
}

컴파일은 됩니다만, Segmentation fault를 일으킵니다. -_-;; 어떻게 해야 합니까?

klara의 이미지

배열과 포인터가 그대로 호환되는건 1차원 배열인 경우입니다. 2차원이상의 배열을, 단순히 포인터의 포인터로 형변환할 경우, []를 통한 포인터 연산은 실제 배열구조를 무시하고 무조건 자료형크기만큼씩만 뛰니까요.
2차원이상의 경우는 최고차를 제외한 부분의 배열크기를 명시적으로 적어주어야합니다.

이경우는 두가지 해결법이 있습니다.

1. d를 배열로 선언하지 말고 double **d로 선언하고 동적할당한다.
2. f의 인자를 double**대신에 double [][2]로 한다.

나그네나그네의 이미지

double ** d로 선언하고,
d = malloc(..)으로 대입했습니다.

그런데,
passing argument 1 of ‘f’ from incompatible pointer type
이라는 warning이 뜹니다. 함수 f의 인자에서 const를 떼 주니까 경고가 없어지는군요.

이것은 어떻게 해결할 수 없나요?

----------------
agidari.wordpress.com

crimsoncream의 이미지

의도하신건 f() 내에서는 d가 double d[][]로 해석되는걸 원하신 거 같은데 실제로는 double *d[]로 해석되니까
생기는 문제인 거 같은데 먼저 답변하신 분께서 말씀하신 2처럼 하셔도 되고 저 경우에는 이런 경우에는 1차원 array라고 생각하고 caller에서 column 수를 넘겨줘서 (d + (sizeof(double) * col) + row)를 해서 씁니다.
근데 1의 방법은 어디서 선언하고 어디서 동적할당 한단 말씀이신지.
=============================================================================================================
오늘 우리는 동지를 땅에 묻었습니다. 그러나 땅은 이제 우리들의 것입니다.
아직도 우리의 적은 강합니다. 그러나 우리는 그들보다 많습니다.
항상 많을 것입니다.

오늘 우리는 동지를 땅에 묻었습니다. 그러나 땅은 이제 우리들의 것입니다.
아직도 우리의 적은 강합니다. 그러나 우리는 그들보다 많습니다.
항상 많을 것입니다.

나그네나그네의 이미지

이렇게 짰었습니다.

void f(const double ** d){
printf("%g\n", d[0][0]);
}
int main(){
double ** d;
d = malloc(....)
d[0][0] = ..;
d[0][1] = ...;
....
f(d);
}

----------------
agidari.wordpress.com

crimsoncream의 이미지

main의 d가 어떻게 되는가는 별 상관이 없을 것 같아서 드렸던 질문인데 벌써 해보셨군요^^
간단하게 예제를 짜봤습니다. 다음 두개 코드의 차이를 이해하시면 제가 말씀드리고자 하는 봐를 이해하신겁니다.

#include <stdio.h>
 
void f(double **);
 
int
main ()
{
  static double d[3][2] = {{0,1}, {2,3}, {4,5}};
  double *d1[3];
  d1[0] = (double *)&d[0];
  d1[1] = (double *)&d[1];
  d1[2] = (double *)&d[2];
  f(d1);
}
 
void
f(d)
  double **d;
{
 printf("%g\n", d[0][0]);
}

그리고

#include <stdio.h>
#include <string.h>
 
void f(double **);
 
int
main ()
{
  double d[3][2] = {{0,1}, {2,3}, {4,5}};
  f((double **)d);
}
 
void
f(d)
  double **d;
{
 double dd[3][2];
 memcpy((double *)dd, d, sizeof(dd));
 printf("%g\n", dd[0][0]);
}

끝으로 저라면

#include <stdio.h>
 
#define GET(A,B,C,D) (*(A + (B * C) + D))
void f(double *, size_t);
 
int
main ()
{
  double d[3][2] = {{0,1}, {2,3}, {4,5}};
  f((double *)d, sizeof(d[0])/sizeof(d[0][0]));
}
 
void
f(d, l)
  double *d;
  size_t l;
{
 printf("%g\n", GET(d, l, 0, 0));
}

============================================================================================================
오늘 우리는 동지를 땅에 묻었습니다. 그러나 땅은 이제 우리들의 것입니다.
아직도 우리의 적은 강합니다. 그러나 우리는 그들보다 많습니다.
항상 많을 것입니다.

오늘 우리는 동지를 땅에 묻었습니다. 그러나 땅은 이제 우리들의 것입니다.
아직도 우리의 적은 강합니다. 그러나 우리는 그들보다 많습니다.
항상 많을 것입니다.

댓글 달기

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