프로그래밍

 3198, 1/160 회원가입  로그인  
   yonggari306
   c 코드 오류해결좀 도와주세요

http://www.hackerschool.org/HS_Boards/zboard.php?AllArticle=true&no=2811 [복사]


1부터 9까지 수를 사용합니다.
중복되지않게 2개의 수를 곱한 경우 2가지
3개의 수를 곱한경우 4가지
를 각각 구해서 같은 경우를 비교하는 코드입니다.
'오류' 를 찾기 하시면 바로 오류가 발생하는 코드로 갈 수 있습니다.

아래는 오류 내용
0x00f81cd5에 첫째 예외가 있습니다. 0xC0000005: 0xa3f2fc20 위치를 기록하는 동안 액세스 위반이 발생했습니다.
0x00f81cd5에 처리되지 않은 예외가 있습니다. 0xC0000005: 0xa3f2fc20 위치를 기록하는 동안 액세스 위반이 발생했습니다.

이걸 코딩하면서 한번 발생한 적이 잇는 오류인데 어디서 잘못된지 찾을수가 없습니다.
해결좀 도와주셨으면 해서 글을 올렸습니다.

#include<stdio.h>
void twice(int *sav,int *cnt);
void twice1(int *arr,int *sav,int *cnt);
void thrice1(int *arr,int *sav,int *cnt);
void compare(int *sav1,int *sav2);
void thrice(int *sav,int *cnt);
void delol(int *sav,int *cnt);
void print(int *sav,int *cnt);
void lineup(int *sav,int *cnt);

void main()
{
        int arr[500]={0,};
        int cnt=0;
        
        
        twice(arr,&cnt);
        thrice(arr,&cnt);
        delol(arr,&cnt);
        lineup(arr,&cnt);
        print(arr,&cnt);

}
void twice(int *sav,int *cnt)
{
        int i,j;
        int c;
        c=*cnt;
        for(i=1;i<9;i++)
        {
                for(j=1;j<=9;j++)
                {
                        if(j>i)
                        {
                                sav[c]=i*j;
                                c++;
                        }
                }
        }
        *cnt=c;
        
}
void thrice(int *sav,int *cnt)
{
        int i,j,k;
        int c;
        c=*cnt;
        
        for(i=1;i<8;i++)
        {
                for(j=1;j<9;j++)
                {
                        if(j<i)
                        {
                                for(k=1;k<=9;k++)
                                {
                                        sav[c]=i*j*k;
                                        c++;
                                }
                        }
                }
        }
        *cnt=c;
        
}
void delol(int *sav,int *cnt)
{
        int i,j,k;
        int c;
        c=*cnt;

        for(i=0;i<=c;i++)
        {
                for(j=i+1;j<=c;j++)
                {
                                if(sav[i]==sav[j])
                                {
                                        sav[j]=0;
                                        for(k=j+1;k<=c;k++)
                                        {
                                                sav[k-1]=sav[k];
                                        }
                                        c--;
                                }
                }
        }
        *cnt=c;
}

void lineup(int *sav,int *cnt)
{
        int i,j;
        int temp;
        int c;
        c=*cnt;

        for(i=0;i<=c;i++)
        {
                for(j=i+1;j<=c;j++)
                {
                        if(sav[i]>sav[j])
                        {
                                temp=sav[i];
                                sav[i]=sav[j];
                                sav[j]=temp;
                        }
                        
                }
        }
        *cnt=c;
}

void print(int *sav,int *cnt)//약수가 5인경우 필터링
{
        int i,j;
        int arr[100]={0,};
        int arr2[7];
        int q=0;
        int *c;
        int cnt1,cnt2;
        c=cnt;
        int count=0;
        for(i=1;i<=*c;i++)
        {
                //printf("%-4d-",sav[i]);
                for(j=1;j<=9;j++)
                {
                        if(sav[i]%j==0)
                        {
                                //printf("%3d",j);
                                if(j<10)
                                {        
                                        if(j==5)
                                                count=0;
                                        arr2[count]=j;
                                        count++;
                                        
                                }
                                        
                        }
                }
                /*if(count!=0)
                {
                        printf("\nCount - %d",count);
                        printf("\n");
                        
                }*/
                if(count>=7)
                {
                        int two[7],three[7];
                        int sav1[42],sav2[210];
                                cnt1=0;
                                cnt2=0;
                                twice1(sav1,two,&cnt1);
                                thrice1(sav2,three,&cnt2);
                                compare(sav1,sav2);

                        
                }
                count=0;

        }
        
        /*for(i=0;i<q;i++)
        {
                printf("%4d - %-2d개\n",arr[i],index[i]);
                
        }*/
        printf("\n\n\n\n\n\n\n\n\n\n");
}

void twice1(int *arr,int *sav,int *cnt)
{
        int i,j;
        int c;
        c=*cnt;
        for(i=0;i<6;i++)
        {
                for(j=i+1;j<7;j++)
                {
                                sav[c]=arr[i]*arr[j];
                                c++;
                }
        }
        
        
}
void thrice1(int *arr,int *sav,int *cnt)
{
        int i,j,k;
        int c;
        c=*cnt;
        
        for(i=0;i<5;i++)
        {
                for(j=i+1;j<6;j++)
                {
                                for(k=j+1;k<7;k++)
                                {
★☆오류                                sav[c]=arr[i]*(arr[j])*(arr[k]);
                                        c++;
                                }
                        
                }
        }
        
        
}


void compare(int *sav1,int *sav2)
{
        int cnt1=0,cnt2=0;
        int i,j;
        for(i=0;i<41;i++)
        {
                for(j=i+1;j<42;j++)
                {
                        if(sav1[i]==sav1[j])
                        {
                                cnt1++;
                                sav1[j]=0;
                                if(cnt1>=2)
                                        printf("%d\n",sav1[i]);
                        }
                }
        }
        for(i=0;i<209;i++)
        {
                for(j=i+1;j<210;j++)
                {
                        if(sav2[i]==sav2[j])
                        {
                                cnt2++;
                                sav2[j]=0;
                                if(cnt2>=4)
                                        printf("%d\n",sav2[i]);
                        }
                }
        }
}


  Hit : 4589     Date : 2010/12/21 01:40



    
sedcreta 저 죄송하지만...해결은 못해드리구 질문만 할게요~

C가 정수형 변수인데...번지를 받을수있나요???
2010/12/21  
dawon15 void thrice1(int *arr,int *sav,int *cnt)
{
int i,j,k;
int c;
c=*cnt;

for(i=0;i<5;i++)
{
for(j=i+1;j<6;j++)
{
for(k=j+1;k<7;k++)
{
★☆오류 sav[c]=arr[i]*(arr[j])*(arr[k]);
c++;
}
}
}
}


코드를 차근차근 보시면 답은 나오긴 하지만
조금 복잡한데 ...
포인터라도 공부하고 계신 건가요?

쨋든

thirce1 함수 안에서 sav 그 이전 함수에서 int[7] 이였죠?
그래서 마지막 중첩 루프 (for(k=j+1;k<7;k++))가 k가 7보다 작을 경우죠
그리고 그 안에서 c 를 1 증가하는데

음
코드 따라가면서 설명해드릴께요

1. for(i=0;i<5;i++) {
for(j=i+1;j<6;j++) {
for(k=j+1;k<7;k++) { // 여기까지 오면 k는 2고 부터 sav[4] 까지 어떠한 값이 저장되어있습니다.
sav[c]=arr[i]*(arr[j])*(arr[k]);
c++; // 그동안 c는 5가 됩니다
}
}
}
2. for(i=0;i<5;i++) {
for(j=i+1;j<6;j++) { // 여기서 j 가 1 증가
for(k=j+1;k<7;k++) { // k는 3
sav[c]=arr[i]*(arr[j])*(arr[k]); // sav[5] 에 뭔가 저장
c++; // c는 6이 되고
}
}
}

3. 2번 스텝 반복 (k는 4, sav[6]에 뭔가 저장, c는 7)

4. for(i=0;i<5;i++) {
for(j=i+1;j<6;j++) {
for(k=j+1;k<7;k++) { // k는 5
sav[c]=arr[i]*(arr[j])*(arr[k]); // sav[7] -- 할당되지 않은 메모리. 저장 불가. 런타임 에러
c++;
}
}
}


대략 이런 상황입니다.

사실 이 외에도 논리적인 오류가 있는 것 같은데
일단 그 부분은 생략하도록 할게요.
2010/12/22