C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[74702] Re:정적 배열 최대 크기 질문
빌더(TWx) [builder] 3561 읽음    2017-12-25 15:29
초보 님이 쓰신 글 :
: 누가 배열로 얼마까지 버퍼를 잡아둘수 있나? 고 여쭤보셔서
:
: 사용환경은 XE8 입니다.
:
: #include <vcl.h>
: #pragma hdrstop
:
: #include "Main.h"
: //---------------------------------------------------------------------------
: #pragma package(smart_init)
: #pragma resource "*.dfm"
: TForm3 *Form3;
:
: AnsiString Tmp[30000000];
: //---------------------------------------------------------------------------
: __fastcall TForm3::TForm3(TComponent* Owner)
:     : TForm(Owner)
: {
: }
: //---------------------------------------------------------------------------
:
: 이렇게 하니 컴파일은 되는데
:
: tmp크기를 40000000 으로 잡으니 Link 에러가 나오고
: 1억부터는 그냥  [ilink32 Error] Fatal: Out of memory 로 나오네요
:
: 이게 좀 재밌는게..
: #define MAX 2100000000
: AnsiString Tmp[MAX];
:
: 이렇게 하면 아무 문제 없이  컴파일이 되네요..
: 1억으로도 안되던게 21억을집어넣으니깐 되는데 22억은 안되네요 .
:
: 왜 이런건지 설명해주실분 계실런지요?
:
: 물론 이렇게 배열 잡아서 코딩하는것도 나쁘지만 이런 배열을 써야 한다면  동적 메모리로 잡아야 하겠죠?;
:
:


답변:


컴파일러가 허용하는 정적배열의 최대치를 알아내려면 BYTE tmp[xxxx] 형태로 해야죠.
C++빌더에서 AnsiString은 AnsiStringT<0> 로 인스턴스 되어지는 템플릿 클래스이고
문자셋 Encoding을 위한 클래스 내부 변수를 포함하기 때문 입니다.

AnsiStringT<0> 으로 템블릿 인자로 0이 주어지되게 되면 OS 디폴트 코드페이지를 사용.


그리고...

#define 신텍스로 Numeric Constant 값을 정의할 때... 다음과 같은 식으로 명시적으로 정의하지 않으면
큰 수에 대해서 Numeric Overflow가 발생해서 값이 짤리게 됩니다.

#define MAX 100000000UL  // UL 로 명시적으로 지정해 주지 않으면 Numeric Overflow가 발생하면서 값이 짤림.




+ -

관련 글 리스트
74700 정적 배열 최대 크기 질문 초보 3484 2017/12/22
74702     Re:정적 배열 최대 크기 질문 빌더(TWx) 3561 2017/12/25
74705         Re:Re:정적 배열 최대 크기 질문 재야의 초수 3537 2017/12/27
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.