C언어 관련 문제인데 왜 에러가 날까요?

geneven의 이미지

Quote:
#include <stdio.h>
#include <math.h>

#define MAXSIZE 50
#define EPS 1.0e-6

int solve(double A[], double b[], int nmax, int n, double x[]);
int decomp(double A[], int nmax, int n);
int residual(double A[][], double b[], double x[], int n);

int main()
{
int i, j, nmax = MAXSIZE;
int n = 3, chkerr = 0;
double A[MAXSIZE][MAXSIZE], b[MAXSIZE], x[MAXSIZE];

A[0][0] = 1.; A[0][1] = -3.; A[0][2] = 1.; A[0][3] = 7.;
A[1][0] = 1.; A[1][1] = 2.; A[1][2] = 5.; A[1][3] = 1.;
A[2][0] = 4.; A[2][1] = 1.; A[2][2] = -2.; A[2][3] = 0.;
A[3][0] = 1.; A[3][1] = 6.; A[3][2] = 2.; A[3][3] = 3.;

b[0] = 9.; b[1] = 33.; b[2] = 8.; b[3] = 41.;

printf("\n A equation in augmented form\n\n");

printf(" ");
for(j = 0; j <= n; j++)
printf(" j=%d", j);
printf(" | vector\n");
for(i = 0; i <= n; i++){
printf(" i=%d", i);
for(j = 0; j <= n; j++)
printf(" %5.0f", A[i][j]);
printf(" |%5.0f\n", b[i]);
}
residual(A, b, x, n);

chkerr = decomp((double *)A, nmax, n);
chkerr = solve((double *)A, b, nmax, n, x);

printf("\n Solution by LU-decomposition\n\n");
for(i = 0; i <= n; i++)
printf(" x[%d]=%10.7e\n", i , x[i]);
printf("\n Success ? 0(YES): 1, 999(NO) -> %d\n", chkerr);


}

int decomp(double A[], int nmax, int n)
{
int i, j, k;
double w, y[MAXSIZE];

if(n > (MAXSIZE-1))
return(999);

for(i = 0; i < n; i++){
if(fabs(A[i+i*nmax]) <= EPS)
return(1);
for(j = i+1; j <= n; j++){
w = A[i+j*nmax];
if(i != 0)
for(k = 0; k < i; k++)
w -= A[k+j*nmax]*A[i+k*nmax];
A[i+j*nmax] = w/A[i+i*nmax];
}
for(j = i+1; j <= n; j++){
w = A[j+(i+1)*nmax];
for(k = 0; k <= i; k++)
w -= A[k+(i+1)*nmax]*A[j+k*nmax];
A[j+(i+1)*nmax] = w;
}
}
}

int residual(double A[][], double b[], double x[], int n)
{
int i, j;
double y[MAXSIZE], w = 0.;

for(i = 0; i <= n; i++){
for(j = 0; j <= n; j++)
w = A[i][j]*x[j]+w;
y[i] = w;
}
}

int solve(double A[], double b[], int nmax, int n, double x[])
{
int i, j, k;
double w, y[MAXSIZE];

if(n > (MAXSIZE-1))
return(999);
y[0] = b[0];
for(i = 1; i <= n; i++){
w = b[i];
for(j = 0; j < i; j++)
w -= A[j+i*nmax]*y[j];
y[i] = w;
}

x[n] = y[n]/A[n+n*nmax];
for(i = n-1; i >= 0; i--){
w = y[i];
for(j = i+1; j <= n; j++)
w -= A[j+i*nmax]*x[j];
x[i] = w/A[i+i*nmax];
}
return(0);
}

A는 이중배열이고 residual함수로 넘기거든요?
근데 이거 컴파일하면 저기 빨간색 밑줄친 부분에서
invalid use of array with unspecified bounds라는
에러가 나는데 이유를 모르겠어요. 배열 제대로 사용한거 같은데..

vacancy의 이미지

배열이 넘어오면 각 첨자의 maximum값을 C언어가 알수 있을까요 ?

( residual을 아주 새로 작성하셔야 하겠지만, return도 빠졌네요. )

geneven의 이미지

vacancy wrote:
배열이 넘어오면 각 첨자의 maximum값을 C언어가 알수 있을까요 ?

( residual을 아주 새로 작성하셔야 하겠지만, return도 빠졌네요. )

궁금한게 하나 있는데요, main()에서 어떤 함수를 부를때 이중배열을 파라미터로 지정하고 그 함수는 그 넘어오는 이중배열을 이중포인터로 받지 않고
A[][]이런식으로 받으면 새로운 배열이 만들어지면서 저 안에 넘어온 배열의
값이 복사되는건가요? 아니면 A에 단지 주소만 복사되나요?

void func(int A[][])
{
...
}

main()
{
   int B[][];
   func(B);
}
vacancy의 이미지

A[][] 와 같은 형식으로는 파라메터를 받을 수 없습니다.

받았다고 가정하면 A[0][0]과 A[1][0]가 얼마나 떨어져 있는지
받은 함수측에서 알 도리가 없죠.

geneven의 이미지

#include <stdio.h>
#include <math.h>

#define MAXSIZE 50
#define EPS 1.0e-6

int solve(double A[], double b[], int nmax, int n, double x[]);
int decomp(double A[], int nmax, int n);
int residual(double **A, double b[], double x[], int n);


int main()
{
	int i, j, nmax = MAXSIZE;
	int n = 3, chkerr = 0;
	double A[MAXSIZE][MAXSIZE], b[MAXSIZE], x[MAXSIZE];	
	
	A[0][0] = 1.; A[0][1] = -3.; A[0][2] = 1.; A[0][3] = 7.;
	A[1][0] = 1.; A[1][1] = 2.; A[1][2] = 5.; A[1][3] = 1.;
	A[2][0] = 4.; A[2][1] = 1.; A[2][2] = -2.; A[2][3] = 0.;
	A[3][0] = 1.; A[3][1] = 6.; A[3][2] = 2.; A[3][3] = 3.;
	
	b[0] = 9.; b[1] = 33.; b[2] = 8.; b[3] = 41.;
		
	printf("\n        A equation in augmented form\n\n");

	printf("      ");
	for(j = 0; j <= n; j++)
		printf("    j=%d", j);
	printf("   |  vector\n");
	for(i = 0; i <= n; i++){
		printf("  i=%d", i);
		for(j = 0; j <= n; j++)
			printf("  %5.0f", A[i][j]);
		printf("    |%5.0f\n", b[i]);
	}
	residual((double **)A, b, x, n);
	
	chkerr = decomp((double *)A, nmax, n); 
	chkerr = solve((double *)A, b, nmax, n, x);
	
	printf("\n Solution by LU-decomposition\n\n");
	for(i = 0; i <= n; i++)
		printf("      x[%d]=%10.7e\n", i , x[i]);
	printf("\n Success ? 0(YES): 1, 999(NO) -> %d\n", chkerr);
	

	
}

int decomp(double A[], int nmax, int n)
{
	int i, j, k;
	double w, y[MAXSIZE];
	
	if(n > (MAXSIZE-1))
		return(999);
	
	for(i = 0; i < n; i++){
		if(fabs(A[i+i*nmax]) <= EPS)
			return(1);
		for(j = i+1; j <= n; j++){
			w = A[i+j*nmax];
			if(i != 0)
				for(k = 0; k < i; k++)
					w -= A[k+j*nmax]*A[i+k*nmax];
				A[i+j*nmax] = w/A[i+i*nmax];
		}
		for(j = i+1; j <= n; j++){
			w = A[j+(i+1)*nmax];
			for(k = 0; k <= i; k++)
				w -= A[k+(i+1)*nmax]*A[j+k*nmax];
			A[j+(i+1)*nmax] = w;
		}
	}
}

int residual(double **A, double b[], double x[], int n)
{
	int i, j;
	double y[MAXSIZE], w = 0.;
	
	for(i = 0; i <= n; i++){
		for(j = 0; j <= n; j++)
			w = A[i][j]*x[j]+w;
		y[i] = w;
	}
}
	
	

int solve(double A[], double b[], int nmax, int n, double x[])
{
	int i, j, k;
	double w, y[MAXSIZE];

	if(n > (MAXSIZE-1))
		return(999);
	y[0] = b[0];
	for(i = 1; i <= n; i++){
		w = b[i];
		for(j = 0; j < i; j++)
			w -= A[j+i*nmax]*y[j];
		y[i] = w;
	}
	
	x[n] = y[n]/A[n+n*nmax];
	for(i = n-1; i >= 0; i--){
		w = y[i];
		for(j = i+1; j <= n; j++)
			w -= A[j+i*nmax]*x[j];
		x[i] = w/A[i+i*nmax];
	}
	return(0);
}

이렇게 고쳤더니 이제는 segmentation fault에러가 나네요..
이유가 도대체 뭐죠?

see2002의 이미지

인자들을 구조체로 정의해서 전달하세요. :wink:
이차원배열은 인자로 넘길수가 없는걸로 알고있어요.

struct arglist
{
    double A[길이][길이];
    double b[길이];
    double x[길이];
    int n;
};
geneven의 이미지

see2002 wrote:
인자들을 구조체로 정의해서 전달하세요. :wink:
이차원배열은 인자로 넘길수가 없는걸로 알고있어요.
struct arglist
{
    double A[길이][길이];
    double b[길이];
    double x[길이];
    int n;
};

그래서 residual함수에서 인자를 받을때 포인터로 받도록 고쳐봤는데
이상하게 seg fault에러가 나요.

yui의 이미지

int residual(double A[][MAXSIZE], double b[], double x[], int n);

이런식으로 선언해서 해보세요.
아님 다른 함수들(decomp, solve)처럼 하시던지요...

@ 근데 residual 함수는 무엇을 하는 것인가요?

icarus0604의 이미지

이차원배열을 더블 포인터로 표현하지 않습니다. 이차원 배열은 그냥 일차원 배열이나 마찬가지지요(문자열을 일정크기로 분류하기위한 것이 이차원 배열입니다.),...
즉,더블 포인터(포인터의 포인터)는 주소값이 가리키는 곳의 값이 주소를 나타내고 이 값이 가리키는 곳의 값이 원하는 값임으로. 이차원 배열과는 좀 다른 개념입니다.
쉽게, 주소가 인덱스를 참조해 값을 가리키는 것이라고 생각하시면 쉬울거 같네요.

아래 함수를 바꾸시면 될꺼에요.
int residual(double *A, double b[], double x[], int n)
{
int i, j;
double y[MAXSIZE], w = 0.;

for(i = 0; i <= n; i++){
for(j = 0; j <= n; j++) {
w = A[(i*MAXSIZE)+j]*x[j]+w;
}
y[i] = w;
}
}

댓글 달기

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