C언어 관련 문제인데 왜 에러가 날까요?
#include <stdio.h>
#include <math.h>#define MAXSIZE 50
#define EPS 1.0e-6int 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라는
에러가 나는데 이유를 모르겠어요. 배열 제대로 사용한거 같은데..
배열이 넘어오면 각 첨자의 maximum값을 C언어가 알수 있을까요 ?
배열이 넘어오면 각 첨자의 maximum값을 C언어가 알수 있을까요 ?
( residual을 아주 새로 작성하셔야 하겠지만, return도 빠졌네요. )
[quote="vacancy"]배열이 넘어오면 각 첨자의 maximum값
궁금한게 하나 있는데요, main()에서 어떤 함수를 부를때 이중배열을 파라미터로 지정하고 그 함수는 그 넘어오는 이중배열을 이중포인터로 받지 않고
A[][]이런식으로 받으면 새로운 배열이 만들어지면서 저 안에 넘어온 배열의
값이 복사되는건가요? 아니면 A에 단지 주소만 복사되나요?
A[][] 와 같은 형식으로는 파라메터를 받을 수 없습니다.받았다
A[][] 와 같은 형식으로는 파라메터를 받을 수 없습니다.
받았다고 가정하면 A[0][0]과 A[1][0]가 얼마나 떨어져 있는지
받은 함수측에서 알 도리가 없죠.
다음과 같이 고쳤는데요
이렇게 고쳤더니 이제는 segmentation fault에러가 나네요..
이유가 도대체 뭐죠?
인자들을 구조체로 정의해서 전달하세요. :wink: 이차원배열은 인
인자들을 구조체로 정의해서 전달하세요. :wink:
이차원배열은 인자로 넘길수가 없는걸로 알고있어요.
[quote="see2002"]인자들을 구조체로 정의해서 전달하세요.
그래서 residual함수에서 인자를 받을때 포인터로 받도록 고쳐봤는데
이상하게 seg fault에러가 나요.
int residual(double A[][MAXSIZE], double
int residual(double A[][MAXSIZE], double b[], double x[], int n);
이런식으로 선언해서 해보세요.
아님 다른 함수들(decomp, solve)처럼 하시던지요...
@ 근데 residual 함수는 무엇을 하는 것인가요?
이차원배열을 더블 포인터로 표현하지 않습니다. 이차원 배열은 그냥 일차원
이차원배열을 더블 포인터로 표현하지 않습니다. 이차원 배열은 그냥 일차원 배열이나 마찬가지지요(문자열을 일정크기로 분류하기위한 것이 이차원 배열입니다.),...
즉,더블 포인터(포인터의 포인터)는 주소값이 가리키는 곳의 값이 주소를 나타내고 이 값이 가리키는 곳의 값이 원하는 값임으로. 이차원 배열과는 좀 다른 개념입니다.
쉽게, 주소가 인덱스를 참조해 값을 가리키는 것이라고 생각하시면 쉬울거 같네요.
아래 함수를 바꾸시면 될꺼에요.
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;
}
}
댓글 달기