2015-01-04 1 views
1

나는 C을 처음 접하기 때문에 나와 함께하시기 바랍니다. 필자는 텍스트 파일 수를 열려면 파서를 쓰고 있는데, 문자 파일을 읽고 필요한 정보를 추출하려면 약 300KB를 각각 읽어야합니다. 처리에는 세 가지 단계가 있으며 각 문자열 덩어리에 대해 약 10 개의 서로 다른 함수가 필요합니다.함수 호출간에 큰 데이터 전달하지 않기

파일이 작지 않고 많은 파일이있을 수 있으므로 효율적이고 업계 표준을 충족하는 코드를 작성하려고합니다.

A) 중첩 된 함수 호출 :하자 내 main 기능 read_file 전화 get_lines, 다음 get_lines 전화 get_name 등 다음, read_file 호출 말을 나에게

이 내 옵션을 것 같다.

이 솔루션의 장점은 내 함수에 하나의 while 루프가있는 경우 직접 루프 내부에서 get_name 함수를 호출 할 수 있다는 것입니다. 그러나 get_lines 함수에서 데이터를 main으로 반환하면 다시 루프를 통해 데이터를 get_name으로 전달해야합니다.

여기에서 문제는 매우 체계적인 방식으로 이루어지지 않는다는 것입니다. 이 경우 내 주요 기능은 read_file 함수를 호출 한 다음 출력 데이터를 파일에 씁니다.

main 함수는 프로그램의 전체 실행을 제어해야합니다. 즉, 비즈니스 로직을 수행하는 함수를 호출 한 다음 데이터를 검색하여 다음 함수로 넘겨야한다는 의미입니다. 나는 바로 여기인가, 아니면 잘못된 가정인가?

B) 글로벌 변수 : 내가 글로벌 변수의 몇 가지를 정의 할 것이다 다음 난 그냥 다른 함수이 함수에서 약을 전달하는 필요없이 작동됩니다 이런 식으로.

함수의 수명이 다할 때 데이터를 반환 할 필요가 없기 때문에 더 효율적이어야합니다. 그러나 나는 일반적으로 글로벌 변수의 팬이 아니며 정적 유형의 동기화 환경에서도 마찬가지입니다. 하지만 불필요하게 걱정할 수도 있습니다.

C) 포인터 전달 주변 : 내게는 그것을 위해 가야하는 것처럼 보입니다. 그러나이 데이터는 함수 범위의 로컬이므로 와일드 포인터이 있습니다. static 키워드는 잘못된 포인터의 문제를 해결합니다. 그러나 그것은 경험이 많은 사람들이 어떤 이유로 그것을 사용하지 않으려 고 노력하고있는 것처럼 보입니다. 좋은 연습인지 아닌지 잘 모르겠습니다.

질문 : 나는 C에 대한 실제 경험이 없으므로 위의 솔루션에 대한 실제 장단점을 볼 수 없습니다. 예를 들어 static 키워드를 사용하고 포인터를 전달하면 전역 변수를 사용할 때 이점이 있습니까?

즉,이 특정 사례에서 각 방법의 장단점 목록은 확실히 3 가지 중 하나를 선택하는 데 도움이 될 것입니다.

+2

나는이 질문에 무엇이 잘못되었는지 알고 싶다. 문제를 해결하기 위해 최선을 다할 수 있습니다. – Mahdi

+0

너무 광범위/의견 기반. 실제 사례를 보여주고 구체적으로 설명하십시오. – 2501

+2

저는 블록에서 가장 큰 C 전문가는 아니지만 전역 변수에 대해 매력이없는 것을 보지 못합니다. 당신이주의하는 것처럼, 스택 대신에 힙에 저장되어있는 데이터를 희생시키면서 패스를 제거합니다 (각 액세스에 대해 약간 느립니다). 신중하게 사용하면 전역 변수는 코드의 가독성을 높이고 실행 속도 측면에서 비용이 거의 들지 않으면 서 디버깅을 단순화 할 수 있습니다. –

답변

1

문제의 글로벌 ans 로컬 정적 변수는 동일한 방식으로 동작합니다. 그들은 둘 다 특정 함수를 위해서 '전역'으로 간주하므로, 여러 호출에서 동시에 사용할 수는 없습니다 (여러 개의 동시 스레드에서 호출 됨).

질문에 대답하려면이 코드의 요구 사항과 최종 목표를 알아야합니다.

일부 작업의 경우 최종 데이터 세트가 필요합니다. 대용량 파일은 커지지 만 사용하기 전에 완료해야합니다. 예를 들어 파일 (또는 파일 집합)의 고유 한 단어 목록을 생각할 수 있습니다.

다른 작업에서는 반복 접근을 허용합니다. 반환 값을 확인할 때마다 함수를 여러 번 호출하고 처리 할 수 ​​있습니다. 특정 반환 값은 더 이상 데이터가 없다고 말하며이 시점에서 데이터를 호출하지 않아야합니다. 예 : fread과 같은 파일 읽기 기능 - 여러 번 호출하고 마지막으로 중지 한 위치에서 계속 읽을 때마다 읽습니다. 동일한 작업 과 같이 전체 데이터 세트를 구성하여 수행 할 수 있습니다. 필요한만큼 많은 메모리를 할당하고 전체 파일을 읽을 수 있습니다. 그것은 매우 다른, 덜 유연한 접근 방식입니다. 그러나 데이터를 처리하는 상위 수준의 작업에는 필요할 수 있습니다.

일부 작업에서는 두 가지 접근 방식을 모두 허용합니다. XML 파싱은 DOM 또는 SAX 일 수 있습니다. 그러나 어느 방법을 사용할 것인지 결정하는 상위 목표가 있습니다 (DOM은 사용하기가 더 쉽지만 SAX는 인터넷과 같이 느린 출처에서 데이터를 가져 오는 것이 선호되는 반면 SAX의 일부는 표시해야 함). 데이터가 아직 완전히로드되지 않은 상태).

+0

실제로 두 가지 옵션 중 하나를 두 옵션으로 병합했기 때문에 이것을 받아 들일 것입니다 :'static'과 _Global Variables_를 사용하고 thread-safety와 Reentrancy 문제를 알고 있고, 더 나은 코드를 작성하는 데 도움이 될 것입니다. 감사! – Mahdi

관련 문제