|
그냥 아는대로만 답변 드릴께요.
일단 첫번째 질문은 이해하시고 계신 게 맞습니다. 두 변수가 가리키는 주소값이 같다면 결과도 같아야 합니다
그런데, 이상한 부분은 수정하신 소스의 아랫부분입니다
: test = gets(_FP.fn); /*변경 부분*/
: _FP.fp = test; /*변경 부분*/
이 내용은 _FP.fn의 위치에 문자열을 입력받은 후 그 첫 문자 위치 주소값을 test에 넣는다는 말인데, _FP.fn이 단지 포인터이고 할당된 값이 아니므로, 기존과 비슷하게 엉뚱한 메모리를 쓰게 되는 버그가 있는 걸로 보입니다. 또한 test의 경우에도 값이 변하지 않는 주소값이어야 하는데, test의 값을 강제로 바꾸고 있습니다. 배열로 선언한 부분의 메모리를 전혀 건드릴 것 같지 않습니다
_FP.fp = gets(test);
이렇게 하는 게 맞을 것 같은데요..아닌가요? (사실 _FP구조체 안에 fn이랑 fd가 왜 있는지 이해가 안 갑니다. 별다른 역할을 하는 것 같지 않은데요)
두번째 질문은...제가 윈도우즈 프로그래밍을 하지 않은지 꽤 오래 되어서 답변이 좀 애매하긴 한데요.
DLL이란 개념은 도스에는 없었습니다. 윈도우즈에서 적용하기 시작했다고 봐야죠(뭐..윈도우즈 이전에 다른 운영체제에서 사용했겠지만, 우리에겐 윈도우즈가 시작이라고 봐야겠죠)
LIB의 경우에는 도스건 뭐건간에 다 있는거니까..터보씨 책에도 나올 것 같습니다
문제는 DLL을 만들기 위해서...터보씨 도스용부터 할 것이냐의 문제인데...도스용은 이제 하지 마세요
최종 목적지가 VC++이라면 터보씨를 거치지 말고 그냥 VC++로 하세요. VC++을 쓰면 첫번째 질문 같은 부분도 그냥 디버깅 창으로 주소값을 볼 수 있으니까 간단해 집니다.
굳이 VC++로 할 필요가 없다면 터보씨++ 익스플로러(윈도우즈 용) 라고 최근에 나온 무료툴을 이용하시면 되겠습니다. 위치는 자유게시판에서 찾아보시면 되겠습니다.
VC++로 DLL을 구현하신다면 VC++책을 보시면 되겠습니다. 전 안 봤는데, 남들이 "VC++ 6 완전정복"이라는 검은 책이 좋다고 하더군요. 10년쯤 전엔 이상엽씨의 "VC++ 프로그래밍 바이블"이 젤 좋다고 했었는데, 검은 책이 더 좋다는 주위 평입니다
헤더파일은 에디터에서도 만드는 그냥 .c파일과 같은 텍스트 파일입니다. 음...그런 거에 대해서 작성하는 법이 나온 책이 있었는지는 저도 잘 모르겠습니다.
그럼..
서재호 님이 쓰신 글 :
: 답변 매번 감사드립니다..
: 제가 cc1234님의 답변을 잘 못 이해해서 괜한 질문을 드렸었네요. 말씀 그대로 파일 포인터는 파일의
: 포인터를 의미하는 것이지..메모리 주소를 가리키는 포인터가 아니였는데요..^^; 죄송합니당..
:
: 앞서 맨 처음 질문드린 소스 코드를 다음과 같이 수정하여 원하는 결과를 얻었네요..
: //TEXT VIEW PROGRAM
: #include <stdio.h>
: #include <conio.h>
: #include <stdlib.h>
: #define PARA_HAVE 2
: #define PARA_NONE 1
: int ch;
: struct FILE_POINTER{char *fp, *fn, *fd; } _FP;
: char test[40]; /*배열로 했을때 정확히 출력되는지 확인하기 위한 변수입니다..*/
: FILE *result;
: void scr_print(void);
:
:
: void main(int argc, char *argv[]){
: if(argc == PARA_HAVE){
: _FP.fn = argv[1];
: _FP.fp = _FP.fn;
: printf("\n");
: scr_print();
: }
: else if(argc == PARA_NONE){
: printf("\nInput File Name : ");
: // _FP.fp = gets(_FP.fn); /*주석 처리*/
: test = gets(_FP.fn); /*변경 부분*/
: _FP.fp = test; /*변경 부분*/
: clrscr();
: scr_print();
: }
: else exit(-1);
: }
: /*1. 상기와 같이 수정했을때 파라미터 값이 없는 상태로
: 실했을 경우에 파일명이 제대로 출력되던데요.
: 의문점이 아직도 남아 있는것이 전에 답변해 주신 것처럼
: _FP 구조체를 전역변수로 선언 했으므로 임의의 메모리가
: 깨지는 건 이해할 수 있었습니다. 하지만 포인터 변수 _FP를 이용하여, printf("%s", _FP.fp);
: 코드를 넣었을 경우와 배열변수 test를 이용하여 printf("%s", test);를 했을 때의 차이점을
: 모르겠네요. 제 생각인데.. test는 test[40]이란 변수의 포인터 이므로 test == _FP.fp 와
: 같다고 생각되는데 제 생각에 오류가 있는지요...
:
: 2. 질문 하나 더 드려도 될런지요.
: 제가 지금 visual c++를 목표로 turbo c compiler 부터 공부하고 있는데요. 사실
: library 및 dll 파일을 만들어 컴퓨터로 하드웨어 제어를 하려고 합니다.
: 지금은 'c 기초 플러스'란 책을 보고 있고, 다음에 c++ -> visual c++로 단계적으로
: 배우려 하는데.. 대체 library 와 헤더파일 만드는 법은 도무지 책에선 찾아볼 수 없더라구요..
: 혹시 참고할 만한 서적이 있을까요. turbo c++ 3.00_dos 로 공부하고 있는데 도움말 파일을
: 보니 나와 있긴 하는데.. 순전히 영어로 나와서 ^^;; 난감합니다..
: 어떤 걸 참고하면 만들 수 있을런지요.. lib dll 만드는 개념 잡기가 힘드네요...
: 좋은 하루 되시기 바랍니다.
:
: */
|