안녕하세요 스페로 입니다.
Point = atol(strncpy(Temp3, Line+24, 3)); // 이익포인트
Danga = atol(strncpy(Temp5, Line+16, 5)); // 단가
Panme = atol(strncpy(Temp3, Line+21, 3)); // 판매량
strncpy(rec[Cnt].Field01, Line+0, 6); // 거래번호
이렇게 4군대에서 워닝이 발생하는데요
이유인즉 char * strncpy( char * , const char * , size_t )
이게 원형입니다.
워닝의 내용은 두번째 인자가 char **이라서 워닝이 된겁니다.
즉 두번째 인자 Line+24가 문제조
static char *Line[MAXLEN];
Line + 24라고 하면
Line은 배열의 포인터 (배열의 이름또한 포인터 즉 ** 이중 포인터가 됩니다.)
Line + 24대신 Line[] 방식으로 물론 안에는 인덱스가 들어 가야 겟죠
그럼 문제 해결에 실마리가 되었다고 생각합니다.
로터스 님이 쓰신 글 :
: 이번에 기사 시험을 보는데, Visual C++ 로 신청했거든요?
: 근데 교재는 터보 C밖에 없네요. Visual로 컴파일 하는데 자꾸 warning이 뜨고..
: 물어볼 사람도 없고 답답하네요.
: 도움 주시면 감사하겠습니다. 아래는 소스입니다.
:
: --------------------------------------------------------------------------------------------
:
: #include <stdio.h>
: #include <stdlib.h>
: #include <string.h>
:
: #define MAXLEN 256
:
: struct RecForm {
: char Field01[7]; // 거래번호(6 바이트)
: long Field02; // 단가(5 바이트) * 판매량(3 바이트)
: } rec[1000];
:
: void main(int argc, char *argv[])
: {
: static char *Line[MAXLEN]; // 한 라인 저장
: int i, j, Cnt, Start, End; // 첨자(i,j,Cnt), 인수1, 인수2
: FILE *Infp, *Outfp; // 파일 포인터
:
: static char Temp3[4], Temp5[6]; // 숫자필드 임시저장
: long Danga, Panme, Point; // 단가, 판매량, 이익포인트
:
: static char ExTemp1[7]; // 거래번호 정렬시 사용
: long ExTemp2; // (단가*판매량) 정렬시 사용
:
: Start = atoi(argv[1]); // 첫번째 파라미터
: End = atoi(argv[2]); // 두번째 파라미터
:
: // 입력파일을 입력전용(텍스트 모드)으로 연다.
: Infp = fopen("abc0010.txt", "rt");
:
: Cnt = 0; // 구조체 위치변수 초기화
: // 입력부분(조건에 맞는 자료 배열에 저장)
: for(i = 1; i <= End; i++) {
: fgets(*Line, MAXLEN, Infp);
: if(i >= Start) {
: Point = atol(strncpy(Temp3, Line+24, 3)); // 이익포인트
: Danga = atol(strncpy(Temp5, Line+16, 5)); // 단가
: Panme = atol(strncpy(Temp3, Line+21, 3)); // 판매량
:
: if(Point >= 30) { // 이익포인트 30 이상
: Cnt++;
: strncpy(rec[Cnt].Field01, Line+0, 6); // 거래번호
: rec[Cnt].Field02 = Danga * Panme; // (단가*판매량)
: }
: }
: }
:
: // (단가*판매량)의 값에 따라 정렬
: for(i = 1; i <= Cnt-1; i++)
: for(j = i+1; j <= Cnt; j++)
: // 오름차순 정렬, 같은경우 거래번호의 오름차순 정렬
: if((rec[i].Field02 > rec[j].Field02) ||
: ((rec[i].Field02 == rec[j].Field02) &&
: (strcmp(rec[i].Field01, rec[j].Field01) > 0))) {
: strcpy(ExTemp1, rec[i].Field01); // 거래번호 교환
: strcpy(rec[i].Field01, rec[j].Field01);
: strcpy(rec[j].Field01, ExTemp1);
:
: ExTemp2 = rec[i].Field02; // (단가*판매량) 교환
: rec[i].Field02 = rec[j].Field02;
: rec[j].Field02 = ExTemp2;
: }
:
: // 입력파일을 닫는다.
: fclose(Infp);
:
: // 출력파일을 출력전용(텍스트모드)으로 연다.
: Outfp = fopen("ans1.txt", "wt");
: // 출력파일에 결과값을 출력한다. - 5번째 거래번호
: fprintf(Outfp, "%d %d %s\n", Start, End, rec[5].Field01);
: // 출력파일을 닫는다.
: fclose(Outfp);
: }
:
: ---------------------------------------------------------------------------------------------
:
: 컴파일 하면 다음과 같은 compile 결과가 뜹니다...
:
: Compiling...
: p1.c
: C:\C_IT\Data\p1.c(35) : warning C4047: 'function' : 'const char *' differs in levels of indirection from 'char ** '
: C:\C_IT\Data\p1.c(35) : warning C4024: 'strncpy' : different types for formal and actual parameter 2
: C:\C_IT\Data\p1.c(36) : warning C4047: 'function' : 'const char *' differs in levels of indirection from 'char ** '
: C:\C_IT\Data\p1.c(36) : warning C4024: 'strncpy' : different types for formal and actual parameter 2
: C:\C_IT\Data\p1.c(37) : warning C4047: 'function' : 'const char *' differs in levels of indirection from 'char ** '
: C:\C_IT\Data\p1.c(37) : warning C4024: 'strncpy' : different types for formal and actual parameter 2
: C:\C_IT\Data\p1.c(41) : warning C4047: 'function' : 'const char *' differs in levels of indirection from 'char ** '
: C:\C_IT\Data\p1.c(41) : warning C4024: 'strncpy' : different types for formal and actual parameter 2
:
: p1.obj - 0 error(s), 8 warning(s)
:
:
: 물론 소스에 잘못된 부분은 없구요... 단지 이게 Visual C++ 에서도 컴파일이 됐으면
: 좋겠네요. 어떻게 하면 warning이 안뜰까요?
: 도움 부탁드립니다....
|