‘path_to_obj_project_folder’프로그램에 진입 점에 적합한 정적 ‘Main’메소드가 없습니다.
C 언어의 제어 구조. 프로그램을 함수로 표현하기
동적 메모리 작업은 특별한 트릭을 사용하지 않는 한 많은 알고리즘에서 종종 병목 현상이 발생합니다.
이 기사에서는 이러한 기술 중 몇 가지를 살펴보겠습니다. 기사의 예는 new 및 delete 연산자가 오버로드되어 구문 구성이 최소화되고 프로그램 수정이 간단하다는 점에서 이 기사와 다릅니다(예: 이 예와 다름). 이 과정에서 발견된 함정도 설명되어 있습니다(물론 표준을 처음부터 끝까지 읽는 전문가는 놀라지 않을 것입니다).
0. 메모리에 대한 수동 작업이 필요합니까?
C++ 및 C#에 대한 간단한 테스트를 작성해 보겠습니다(C#은 개체를 세대로 나누고 크기가 다른 개체에 대해 서로 다른 풀을 사용하는 뛰어난 메모리 관리자로 유명합니다).
클래스 노드( 공개: Node* next; ); // . for (int i = 0; i
우선 OS나 C-runtime에서 가져온 큰 블록(페이지) 풀이 필요합니다. malloc 및 free 함수 위에 구성될 수 있지만 효율성을 높이기 위해(추가 추상화 계층을 건너뛰기 위해) VirtualAlloc/VirtualFree를 사용합니다. 이러한 함수는 4K의 배수인 블록에 메모리를 할당하고 64K의 배수인 블록에 프로세스 주소 공간을 예약합니다. 커밋 및 예약 옵션을 동시에 지정하여 한 번의 호출로 주소 공간을 예약하고 메모리 페이지를 할당하는 다른 수준의 추상화를 건너뜁니다.
인라인 size_t align(size_t x, size_t a) ( return ((x-1) | (a-1)) + 1; ) //#define align(x, a) ((((x)-1) | ( (a)-1)) + 1) 템플릿 class PagePool ( public: void* GetPage() ( void* page = VirtualAlloc(NULL, PageSize, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); pages.push_back(page); return page; ) ~PagePool() ( for (vector ::반복자 i = page.begin(); 나는 != 페이지.end(); ++i) ( VirtualFree(*i, 0, MEM_RELEASE); ) ) 개인: 벡터 페이지; );
그런 다음 주어진 크기의 블록 풀을 구성합니다.
BlockPool 클래스
주형 클래스 BlockPool: PagePool
( C# 프로그램에 진입 점에 적합한 정적 메인 방법이 없습니다 - 리뷰나라 public: BlockPool() : head(NULL) ( BlockSize = align(sizeof(T), Alignment); count = PageSize / BlockSize; ) void* AllocBlock() ( // todo: lock(this) if (!head) FormatNewPage(); void* tmp = head; head = *(void**)head; return tmp; ) void FreeBlock(void* tmp) ( // todo: lock(this) *(void**)tmp = head; 머리 = tmp; ) 개인: 무효* 머리, 크기_t 블록 크기, 크기_t 개수, 무효 FormatNewPage() ( 무효* tmp = GetPage(), 머리 = tmp, for(size_t i = 0, i) 클래스 BlockAlloc ( public: static void* operator new(size_t s) ( if (s != sizeof(T)) ( return::operator new(s); ) return pool.C# 프로그램에 진입 점에 적합한 정적 메인 방법이 없습니다 - 리뷰나라 AllocBlock(); ) 정적 무효 연산자 delete(void * m, size_t s) ( if (s != sizeof(T)) ( ::operator delete(m); ) else if (m != NULL) ( pool.FreeBlock(m); ) ) // 할 일: 구현 borisko" 주석에 따른 nothrow_t 오버로드 // http://habrahabr.ru/post/148657/#comment_5020297 // stl 컨테이너에 필요한 new 배치를 숨기지 마세요. static void* operator new(size_t, void * m) ( return m; ) // . 배치 누락에 대한 경고 삭제. static void operator delete(void*, void*) ( ) private: static BlockPool 수영장; ); 주형 블록 풀 블록 할당 ::수영장;
점검이 필요한 이유 설명 if (s != sizeof(T))
그들은 언제 일합니까? 그런 다음 클래스가 생성/삭제되면 기본 T에서 상속됩니다.
자손은 일반적인 new/delete를 사용하지만 BlockAlloc도 혼합될 수 있습니다. 따라서 프로그램에서 무언가를 깨뜨릴 염려 없이 어떤 클래스가 풀을 사용해야 하는지 쉽고 안전하게 결정할 수 있습니다. 다중 상속은 이 믹스인에서도 잘 작동합니다.
준비가 된. BlockAlloc에서 Node를 상속하고 테스트를 다시 실행합니다.
테스트 시간은 이제 120ms입니다. 5배 빨라집니다. 그러나 C#에서는 할당자가 여전히 더 좋습니다. 아마도 연결된 목록이 아닐 것입니다. (그러나 new 직후에 C# 프로그램에 진입 점에 적합한 정적 메인 방법이 없습니다 - 리뷰나라 delete를 호출하여 많은 메모리를 낭비하지 않고 데이터를 캐시에 맞추면 62ms를 얻습니다. 이상합니다. 해제된 로컬 변수를 반환하는 것처럼 .NET CLR과 똑같습니다. GC를 기다리지 않고 해당 풀로 즉시 이동)
2. 용기와 다채로운 내용물
후자의 수명이 부모의 수명보다 길지 않은 것처럼 많은 다른 자식 개체를 저장하는 클래스를 얼마나 자주 접합니까?
예를 들어 Node 및 Attribute 클래스로 채워진 XmlDocument 클래스와 노드 내부의 텍스트에서 가져온 c-string(char*)이 될 수 있습니다. 또는 디렉토리를 다시 읽을 때 한 번 로드되고 더 이상 변경되지 않는 파일 관리자의 파일 및 디렉토리 목록입니다.
서론에서 볼 수 있듯이 삭제는 새 것보다 비쌉니다. 기사의 두 번째 부분의 아이디어는 상위 개체와 연결된 큰 블록에서 하위 개체에 대한 메모리를 할당하는 것입니다. 부모 개체가 삭제되면 평소와 같이 소멸자가 자식에서 호출되지만 메모리는 반환될 필요가 없습니다. 메모리는 하나의 큰 블록에서 해제됩니다.
큰 블록에서 다른 크기의 청크를 잘라낼 수 있는 PointerBumpAllocator 클래스를 만들고 이전 블록이 소진되면 새 큰 블록을 할당할 수 있습니다.
PointerBumpAllocator 클래스
주형 class PointerBumpAllocator ( public: PointerBumpAllocator() : free(0) ( ) void* AllocBlock(size_t block) ( // todo: lock(this) block = align(block, Alignment); if (block > free) ( free = align (블록, PageSize); head = GetPage(free); ) void* tmp = head; head = (char*)head + 블록; free -= 블록; return tmp; ) ~PointerBumpAllocator() ( for (vector ::반복자 i = page.begin(); 나는 != 페이지.end(); ++i) ( VirtualFree(*i, 0, MEM_RELEASE); ) ) 비공개: void* GetPage(size_t 크기) ( void* 페이지 = VirtualAlloc(C# 프로그램에 진입 점에 적합한 정적 메인 방법이 없습니다 - 리뷰나라 NULL, 크기, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE), pages.push_back(페이지) ; 리턴 페이지; ) 벡터 페이지; 공허 * 머리; size_t 무료; ); typedef 포인터 범프 할당자<>기본 할당자;
마지막으로 오버로드된 new 및 delete가 지정된 할당자에 액세스하는 ChildObject 믹스인을 설명하겠습니다.
주형 struct ChildObject ( static void* operator new(size_t s, A& allocator) ( return allocator.AllocBlock(s); ) static void* operator new(size_t s, A* allocator) ( return allocator->AllocBlock(s); ) 정적 void operator delete(void*, size_t) ( ) // *1 static void operator delete(void*, A*) ( ) static void operator delete(void*, A&) ( ) private: static void* operator new(size_t s ); );
이 경우 자식 클래스에 믹스인을 추가하는 것 외에도 new에 대한 모든 호출을 수정해야 합니다(또는 "팩토리" 패턴 사용). new 연산자의 구문은 다음과 같습니다.
New(. 연산자를 위한 매개변수. ) ChildObject(. 생성자를 위한 매개변수. )
delete를 호출하기 위한 특별한 구문은 없으며 컴파일러는 객체를 만드는 데 사용된 새 연산자에 관계없이 표준 삭제(*1로 표시)를 호출합니다. 즉, 삭제 구문은 정상입니다.
노드 삭제;
ChildObject(또는 그 후속)의 생성자에서 예외가 발생하면 이 개체를 만드는 데 사용된 새 연산자의 서명과 일치하는 서명으로 delete가 호출됩니다(첫 번째 size_t 매개변수는 void*로 대체됨).
new 연산자를 private 섹션에 배치하면 할당자를 지정하지 않고 new를 호출할 수 없습니다.
Allocator-ChildObject 쌍을 사용하는 완전한 예를 보여 드리겠습니다.
클래스 XmlDocument: public DefaultAllocator ( public: ~XmlDocument() ( for (vector ::반복자 i = node.begin(); 나는 != node.end(); ++i) ( 삭제 (*i); ) ) 무효 AddNode(char* 내용, char* 이름) ( char* c = (char*)AllocBlock(strlen(content)+1); strcpy(c, 내용 ); char* n = (char*)AllocBlock(strlen(name)+1); strcpy(n, content); nodes.push_back(new(this) XmlNode(c, n)); ) 클래스 XmlNode: public ChildObject ( public: XmlNode(char* _content, char* _name) : content(_content), name(_name) ( ) private: char* content; char* name; ); 개인:벡터 노드; );
결론. 1.5년 전에 샌드박스용으로 쓴 글인데, 운영자님이 싫어하시더군요.
객체 지향 개발에 뛰어들기 전에, 우리는 C++ 프로그램의 메모리 관리에 대해 약간의 소홀함을 만들 필요가 있습니다. 런타임에 메모리를 할당하고 액세스하는 방법을 모르면 복잡한 프로그램을 작성할 수 없습니다.
C++에서 객체는 표준 라이브러리에서 함수를 호출하여 컴파일 타임에 정적으로 할당되거나 런타임에 동적으로 할당될 수 있습니다. 이러한 방법을 사용할 때의 주요 차이점은 효율성과 유연성입니다. 정적 할당은 프로그램이 실행되기 전에 메모리가 할당되기 때문에 더 효율적이지만 할당되는 개체의 유형과 크기를 미리 알아야 하기 때문에 훨씬 덜 유연합니다. 예를 들어, 일부 텍스트 파일의 내용을 문자열의 정적 배열에 배치하는 것은 전혀 쉬운 일이 아닙니다. 미리 크기를 알아야 합니다. 알 수 없는 수의 요소를 미리 저장하고 처리해야 하는 작업에는 일반적으로 동적 메모리 할당이 필요합니다.
지금까지 우리의 모든 예제는 정적 메모리 할당을 사용했습니다. 변수 정의가 ival이라고 가정 해 봅시다.
컴파일러가 int 변수를 저장할 만큼 충분히 큰 메모리 영역을 할당하고, 이름 ival을 이 영역과 연결하고, 거기에 값 1024를 배치합니다. 이 모든 것은 프로그램이 실행되기 전에 컴파일 시간에 수행됩니다.
ival 객체에는 두 개의 값이 연결되어 있습니다. 변수의 실제 값(이 경우 1024)과 해당 값이 저장된 메모리 위치의 주소입니다. 이 두 가지 수량 중 하나를 참조할 수 있습니다. 우리가 쓸 때:
int ival2 = ival + 1;
그런 다음 변수 ival에 포함된 값에 액세스합니다. 여기에 1을 추가하고 이 새 값인 1025로 ival2 변수를 초기화합니다. 변수가 있는 주소에 어떻게 액세스할 수 있습니까?
C++에는 객체의 주소를 저장하는 데 사용되는 내장 "포인터" 유형이 있습니다. ival 변수의 주소를 포함하는 포인터를 선언하려면 다음과 같이 작성합니다.
정수 *파인트; // int형 객체에 대한 포인터
&로 표시된 주소를 가져오는 특수 작업도 있습니다. 그 결과는 개체의 주소입니다. 다음 명령문은 포인터 pint를 변수 ival의 주소로 설정합니다.
정수 *파인트; pint = // pint는 주소 값 ival을 얻습니다.
다음 작업을 사용하여 주소에 파인트(이 경우에는 ival)가 포함된 개체를 참조할 수 있습니다. 역참조라고도 간접 주소 지정. 이 작업은 * 기호로 표시됩니다. 다음은 주소를 사용하여 ival에 간접적으로 추가하는 방법입니다.
*파인트 = *파인트 + 1; // 암시적으로 ival 증가
이 표현은 다음과 정확히 같은 역할을 합니다.
이발 = 이발 + 1; // 명시적으로 ival 증가
이 예제는 실제로 의미가 없습니다. 포인터를 사용하여 ival을 간접적으로 조작하는 것은 덜 효율적이고 덜 시각적입니다. 포인터에 대한 매우 기본적인 아이디어를 제공하기 위해 이 예제를 포함했습니다. 실제로 포인터는 동적으로 할당된 개체를 조작하는 데 가장 자주 사용됩니다.
정적 메모리 할당과 동적 메모리 할당의 주요 차이점은 다음과 같습니다.
- 정적 개체는 명명된 변수로 표시되며 이러한 개체에 대한 작업은 해당 이름을 사용하여 직접 수행됩니다. 동적 개체에는 고유한 이름이 없으며 포인터를 사용하여 간접적으로 작업이 수행됩니다.
- 정적 개체에 대한 메모리 할당 및 해제는 컴파일러에서 자동으로 수행됩니다. 프로그래머는 이것을 스스로 처리할 필요가 없습니다. 동적 개체에 대한 메모리 할당 및 해제는 전적으로 프로그래머의 책임입니다. 이것은 솔루션에서 실수하기 쉬운 상당히 복잡한 작업입니다. new 및 delete 연산자는 동적으로 할당된 메모리를 조작하는 데 사용됩니다.
new 연산자에는 두 가지 형식이 있습니다. 첫 번째 형식은 특정 유형의 단일 개체에 대한 메모리를 할당합니다.
int *pint = 새로운 int(1024);
여기서 new 연산자는 이름이 지정되지 않은 int 개체에 메모리를 할당하고 값 1024로 초기화하고 생성된 개체의 주소를 반환합니다. 이 주소는 파인트 포인터를 초기화하는 데 사용됩니다. 이러한 명명되지 않은 개체에 대한 모든 작업은 이 포인터를 역참조하여 수행됩니다. 동적 개체를 명시적으로 조작할 수 없습니다.
new 연산자의 두 번째 형식은 특정 유형의 요소로 구성된 지정된 크기의 배열에 대한 메모리를 할당합니다.
int *pia = 새로운 int;
이 예에서 메모리는 4개의 int 요소 배열에 할당됩니다. 불행히도, 이러한 형태의 new 연산자는 배열의 요소를 초기화하는 것을 허용하지 않습니다.
new 연산자의 두 형식이 동일한 포인터를 반환한다는 사실 때문에 약간의 혼란이 발생합니다. 이 예에서는 정수에 대한 포인터입니다. pint와 pia는 모두 정확히 동일하게 선언되지만, pint는 단일 int 객체를 가리키고 pia는 4개의 int 객체로 구성된 배열의 첫 번째 요소를 가리킵니다.
동적 개체가 더 이상 필요하지 않으면 할당된 메모리를 명시적으로 해제해야 합니다. 이것은 new와 마찬가지로 단일 객체와 배열의 두 가지 형식을 갖는 삭제 연산자를 사용하여 수행됩니다.
// 단일 객체 해제 delete pint; // 배열 해제 delete pia;
할당된 메모리를 해제하는 것을 잊어버리면 어떻게 됩니까? 메모리가 낭비되고 사용되지 않지만 포인터가 없기 때문에 시스템으로 반환할 수 없습니다. 이 현상은 특별한 이름을 받았습니다. 메모리 누수. 결국 프로그램은 메모리 부족으로 인해 충돌합니다(물론 충분히 오래 실행된다고 가정). 작은 누출은 감지하기 어렵지만 찾는 데 도움이 되는 유틸리티가 있습니다.
동적 메모리 할당 및 포인터 사용에 대한 간략한 개요는 아마도 답변보다 C# 프로그램에 진입 점에 적합한 정적 메인 방법이 없습니다 - 리뷰나라 더 많은 질문을 제기했을 것입니다. 섹션 8.4에서 제기된 문제에 대해 자세히 다룰 것입니다. 그러나 다음 섹션에서 디자인할 Array 클래스는 동적으로 할당된 메모리 사용을 기반으로 하기 때문에 이러한 다이그레션 없이는 할 수 없습니다.
연습 2.3
네 가지 개체의 차이점을 설명합니다.
(a) 정수 = 1024; (b) int *pi = (c) int *pi2 = new int(1024); (d) int *pi3 = 새로운 int;
연습 2.4
다음 코드 조각은 무엇을 합니까? 논리적 오류는 무엇입니까? (참고로 get-index 연산()은 포인터 pia에 올바르게 적용됩니다. 이 사실에 대한 설명은 3.9.2절에서 찾을 수 있습니다.)
int *pi = 새로운 int(10); int *pia = 새로운 int;
동안(*파이 네임스페이스 std 사용 int main(int argc, char* argv) ( int *ptrvalue = new int; // int 유형의 객체에 대한 동적 메모리 할당 *ptrvalue = 9; // 포인터를 통한 객체 초기화 //int *ptrvalue = new int (9); 동적 객체 cout 선언 시 즉시 초기화를 수행할 수 있습니다. // 헤더 파일에 // 헤더 파일에 // 헤더 파일에 time() 함수의 프로토타입을 포함합니다. #include // 헤더 파일에 setprecision() 함수의 프로토타입을 포함합니다. #include #포함 네임스페이스 std 사용 int main(int argc, char* argv) ( srand(time(0)); // 난수 생성 float *ptrarray = new float ; // 실수의 10개 요소 동적 배열 생성 for (int count = 0; 세다 . time(0) 함수는 난수 생성기에 임시 값을 시드하므로 숫자 발생의 임의성을 재현합니다(그림 2 참조).
배열 = 0.8 0.25 0.86 0.5 2.2 10 1.2 0.33 0.89 3.5 계속하려면 아무 키나 누르십시오. . .
어레이 작업이 완료되면 어레이가 삭제되어 스토리지에 할당된 메모리가 해제됩니다.
우리는 1차원 동적 배열을 만들고 작업하는 방법을 배웠습니다. 이제 2차원 동적 배열이 선언되는 방법을 보여주는 코드 조각을 살펴보겠습니다.
// 10개 요소가 있는 2차원 동적 배열 선언: float **ptrarray = new float* ; // 배열의 두 문자열 for (int count = 0; count #포함 #포함 #포함 #포함 #포함 네임스페이스 std 사용 int main(int argc, char* argv) ( srand(time(0)); // 난수 생성 // 실수의 10개 요소 2차원 배열의 동적 생성 float **ptrarray = new float* ; / / 배열의 두 문자열 for (int count = 0; count #포함 int main(void) ( int *block; // 메모리 블록에 대한 포인터 int n; // 배열 요소의 수 // 요소의 수를 입력합니다. printf("Size of array="); scanf("%d", &n); // 배열을 위한 메모리 할당 // malloc 함수는 void* 유형의 포인터를 반환합니다. // 자동으로 int* 유형으로 변환됩니다. block = malloc(n * sizeof(int)); // 배열에 숫자를 입력합니다. 배열 for(int i=0;i #포함 int main(void) ( int **table; // 포인터 배열에 대한 메모리 블록에 대한 포인터 int *rows; // 행에 대한 정보를 저장할 메모리 블록에 대한 포인터 int rowscount; // 행 수 int d; // 숫자 입력 // 행 수 입력 printf("Rows count="); scanf("%d", &rowscount); // 2차원 배열을 위한 메모리 할당 table = calloc(rowscount, sizeof( int*)); rows = malloc(sizeof(int )*rowscount); // 행을 통해 루프 for (int i = 0; i int *ptrVar = malloc(sizeof(int));
이 예에서 3행포인터 ptrVar에는 메모리 조각의 주소가 할당되며, 그 크기는 데이터 유형 int에 해당합니다. 자동으로 이 메모리 영역은 다른 프로그램에서 액세스할 수 없게 됩니다. 이는 할당된 메모리가 불필요해진 후에는 명시적으로 해제되어야 함을 의미합니다. 메모리가 명시적으로 해제되지 않으면 프로그램이 끝날 때 운영 체제에 대해 메모리가 해제되지 않습니다. 이를 메모리 누수라고 합니다. null 포인터를 전달하여 할당해야 하는 할당된 메모리의 크기를 결정할 수도 있습니다. 예를 들면 다음과 같습니다.
int *ptrVar = malloc(sizeof(*ptrVar));
무슨 일이야? sizeof(*ptrVar) 작업은 포인터가 가리키는 메모리 영역의 크기를 추정합니다. ptrVar는 int 유형의 메모리 조각에 대한 포인터이므로 sizeof()는 정수 크기를 반환합니다. 즉, 실제로 포인터 정의의 첫 번째 부분에 따라 두 번째 부분의 크기가 계산됩니다. 왜 우리가 그것을 필요로합니까? 이것은 포인터의 정의를 갑자기 변경해야 하는 경우 필요할 수 있습니다(예: int ). 그런 다음 포인터 정의의 두 부분에서 데이터 유형을 변경할 필요가 없습니다. 첫 번째 부분을 변경하는 것으로 충분합니다.
플로트 *ptrVar = malloc(sizeof(*ptrVar));
보시다시피, 이 표기법에는 하나의 매우 강력한 점이 있습니다. sizeof(float) 를 사용하여 malloc() 함수를 호출할 필요가 없습니다. 대신 float 유형에 대한 포인터를 malloc() 에 전달했습니다. 이 경우 할당된 메모리의 크기는 자동으로 결정됩니다!
이것은 포인터 정의에서 멀리 떨어진 메모리를 할당해야 하는 경우 특히 유용합니다.
부동 *ptrVar; /*. . . 100줄의 코드 */ . . . ptrVar = malloc(sizeof(*ptrVar));
sizeof() 연산과 함께 메모리 할당 구조를 사용한 경우 코드에서 포인터 정의를 찾고 해당 데이터 유형을 확인한 다음에만 메모리를 올바르게 할당할 수 있습니다.
할당된 메모리 할당 해제
메모리 해제는 free() 함수로 수행됩니다. 다음은 예입니다.
메모리를 해제한 후 포인터를 0으로 재설정하는 것이 좋습니다(예: *ptrVar = 0 으로 설정). 포인터에 0을 할당하면 포인터는 null이 됩니다. 즉, 포인터는 더 이상 아무 곳도 가리키지 않습니다. 항상 메모리를 해제한 후 포인터에 0을 할당하십시오. 그렇지 않으면 메모리를 해제한 후에도 포인터가 여전히 포인터를 가리키므로 이 메모리를 사용할 수 있는 다른 프로그램에 실수로 해를 끼칠 수 있지만 이에 대해 아무것도 모릅니다. 그러면 프로그램이 올바르게 작동한다고 생각할 것입니다.
추신: 비디오 편집을 좋아하는 C# 프로그램에 진입 점에 적합한 정적 메인 방법이 없습니다 - 리뷰나라 사람이라면 누구나 이 Windows 7 비디오 편집기에 관심을 가질 수 있습니다. 비디오 편집기는 Movavi라고 하며 누군가 이미 익숙하거나 사용하고 있을 수도 있습니다. 러시아어로 된 이 프로그램을 사용하면 카메라에서 비디오를 쉽게 추가하고 품질을 개선하며 아름다운 비디오 효과를 적용할 수 있습니다.
[C#] 프로그램에 진입 점에 적합한 정적 ‘메인’방법이 없습니다
‘path_to_obj_project_folder’프로그램에 진입 점에 적합한 정적 ‘Main’메소드가 없습니다.
프로젝트 속성을 변경하지 않고 클래스를 추가하고 다른 클래스를 폴더로 옮겼습니다. WPF 응용 프로그램 프로젝트이므로 모두 정상입니다. 진입 점은 App.xaml 파일이 전혀 수정되지 않은 위치에 있습니다.
다시 작동 시키려면 어떻게해야합니까?
답변
App.xaml 의 속성을 확인하십시오 . 은 Build Action 아직 ApplicationDefinition ?
답변
속성-> 프로젝트의 응용 프로그램에서 “출력 유형”은 콘솔 또는 Windows 응용 프로그램 대신 “클래스 라이브러리”여야합니다.
답변
누군가 같은 문제가있는 경우를 대비하여 …이 오류가 발생하여 App.xaml 파일에서 내 것으로 나타났습니다 . 리소스 C# 프로그램에 진입 점에 적합한 정적 메인 방법이 없습니다 - 리뷰나라 사전 태그 외부에 리소스가 있는데이 오류가 발생했습니다.
답변
필자의 경우 (응용 프로그램 네임 스페이스의 이름을 수동으로 바꾼 후) 프로젝트 속성에서 시작 개체를 다시 선택해야했습니다.
답변
VS 2010 (Beta 1)에서 시작된 다음 VS 2008로 이동 한 WPF 프로젝트에서 작업중인 경우이 문제를 해결할 수도 있습니다.
프로젝트 속성에서 .NET Framework 버전은 설정되지 않습니다 (VS 2008에서는 .NET 4.0이 유효하지 않기 때문에).
.NET 프레임 워크 (예 : .NET 3.5)를 설정하면 오류가 사라집니다.
답변
위의 모든 도움을 받아도 여전히 같은 오류가 발생하는 경우를 대비하여 :이 문제가 있었고 여기에 제공된 모든 해결책을 시도했으며 내 문제가 실제로 내 오류 목록의 다른 오류라는 것을 알았습니다. 누락 된 이미지가 스플래시 화면으로 설정되어 있습니다. 방금 올바른 경로로 변경 한 다음 모두 작동하기 시작했습니다)
"추석 대목 앞두고 막막…" 이마트 포항점 등 편의점 130여곳 태풍 피해
태풍 힌남노 제주-경남 강타하며 유통업계도 피해 이마트 포항점 일부 침수, 개점 못하고 복구 작업 편의점도 제주·경남 지역 점포 다수 태풍 피해
태풍 힌남노가 제주를 비롯한 경남 지역을 직격하면서 유통업계에서도 적잖은 피해가 발생했다. 추석 대목을 기대한 상황에서 피해가 발생하면서 유통업계는 피해 회복에 총력을 기울이는 모양새다.
이마트 관계자는 “고객과 직원의 안전을 위해 오늘 포항점을 개점하지 않기로 했다”며 “이후 피해상황을 파악, 복구에 최선을 다할 예정”이라고 말했다. 정확한 피해규모는 아직 추산되지 않았지만 포항점이 영업을 재개하기까지는 시간이 더 필요할 것으로 전망되고 있다.
GS리테일의 GS25도 이날 9시 기준 28개 점포가 태풍으로 인해 영업을 중단했다. 이 외에 한강공원 점포 등 진입통제로 인한 영업정지가 4개점, 정전은 31건으로 집계됐다. 코리아세븐의 세븐일레븐도 밤사이 부산, 경남, 제주의 30여개 점포에 피해가 발생했다.
편의점 업계는 가맹본부 비용으로 재산종합보험에 가입된 만큼 이번 수해에 대해 상품 등 피해금액 전부를 보상 받을 수 있어 점주들의 손실은 크지 않을 전망이다. 특히 GS25는 이 외에도 자연 재해로 인해 발생한 가맹 경영주의 개인 재산 피해를 지원하는 ‘특별재해지원금’ 제도를 운영 중이다. 지원 금액은 피해 1건당 최대 100만원 수준이다.
보도자료 및 기사제보 [email protected]
[자유민주·시장경제의 파수꾼 – 뉴데일리 newdaily.co.kr]
Copyrights ⓒ 2005 뉴데일리뉴스 - 무단전재, 재배포 금지
위치로 진입 점
제11호 태풍 '힌남노'가 휩쓸고 간 6일 오전 부산 수영구 수변공원 인근 한 편의점이 강풍으로 뜯겨져 나간 보도블록으로 인해 파손됐다. 부산=뉴시스
제11호 태풍 힌남노의 영향으로 대형마트, 편의점 등 유통업계의 피해가 잇따르고 있다.
6일 업계에 따르면 이마트 포항점 일부 매장이 침수돼 이날 영업을 중단했다. 이날 포항 지역은 오전 6시 45분 기준 12시간 강수량이 352㎜에 달했고 특히 오전 5시 전후 시간당 강수량이 81㎜를 넘을 정도로 비가 쏟아졌다. 이마트 관계자는 "오늘 매장 문을 닫고 태풍이 지나가고 피해 복구를 완료한 뒤 다시 문을 열 예정"이라고 밝혔다. 롯데백화점은 포항점 앞 도로가 한때 침수됐으나, 차수판 설치 등으로 매장 피해가 없어 정상 영업이 가능하다고 밝혔다.
편의점 업계도 남부 지방을 중심으로 태풍으로 인한 누수, 통신장애, 유리창 파손 등 피해가 이어졌다. CU는 이날 오전 8시 기준 태풍 피해 점포가 60점에 달했는데 이 중 절반이 남부 지역에 집중됐으며 일부 강원지역에서도 피해가 발생했다고 밝혔다. 대부분 태풍으로 인한 누수, 유리창 파손 등이다. GS25는 이날 오전 9시 기준 침수로 인해 영업을 중단한 점포가 28점에 달한다고 밝혔다. 이 가운데 4곳은 한강공원 점포로 진입 통제에 따른 영업 중단이다. 정전 피해 신고도 31건 접수됐다. 세븐일레븐은 태풍 피해를 입은 점포가 30곳으로 조사됐는데, 대부분 부산 지역에 피해가 집중됐다. 이마트24는 포항·경주·김해·울산의 14개 점포가 태풍 피해를 입었다고 밝혔다.
편의점 업계는 피해 점포가 신속하게 영업을 재개할 수 있도록 복구 지원에 집중할 계획이다. CU는 현재 피해 복구율이 40%에 달해 많은 점포가 영업을 재개하고 있으며 이마트24도 배수 작업 및 통신 장애 복구 작업을 진행 중이라고 밝혔다.
태풍으로 인한 피해 매장의 경우 재산종합보험에 가입돼 있어 피해 보상을 받을 수 있다. GS25는 이에 더해 경영주 재산 피해에 대해서는 상생 차원에서 운영하는 특별재해지원금 제도를 통해 피해 1건당 최대 100만 원까지 지원한다고 밝혔다.
0 개 댓글