2010-01-27 10 views
0

저는 C++ 프로그래밍을 처음 사용합니다. 다음 인수를 사용하여 함수를 호출해야합니다. int Start (int argc, char ** argv).Visual C++에서 1D 포인터 배열 (char)을 2D 포인터 배열 (char)로 변환합니다.

아래 코드로 위의 함수를 호출하려고하면 런타임 예외가 발생합니다. 위의 문제를 해결하는 데 도움을 줄 수 있습니까?

char **Argument1=NULL; 

이 포인터 포인터, 당신이 필요로하는 것입니다 :

char * filename=NULL; 
char **Argument1=NULL; 
int Argument=0; 
int j = 0; 
int k = 0; 
int i=0; 

int Arg() 
{ 
filename = "Globuss -dc bird.jpg\0"; 

for(i=0;filename[i]!=NULL;i++) 
{ 
    if ((const char *)filename[i]!=" ") 
    { 
    Argument1[j][k++] = NULL; // Here I get An unhandled 
          // exception of type 
          //'System.NullReferenceException' 
          // occurred 
     j++; 
     k=0; 
    } 

    else 
    { 
     (const char)Argument1[j][k] = filename [j]; // Here I also i get exception 
     k++; 
     Argument++; 
    } 
} 

Argument ++; 
return 0; 
} 

Start (Argument,Argument1); 

답변

0

당신은 더 당신 배열에 메모리를 할당이없는 것으로 나타납니다, 당신은 단지 NULL 포인터

char * filename=NULL; 
char **Argument1=NULL; 
int Argument=0; 
int j = 0; 
int k = 0; 
int i=0; 

int Arg() 
{ 
filename = "Globuss -dc bird.jpg\0"; 

//I dont' know why you have 2D here, you are going to need to allocate 
//sizes for both parts of the 2D array 
**Argument1 = new char *[TotalFileNames]; 
for(int x = 0; x < TotalFileNames; x++) 
    Argument1[x] = new char[SIZE_OF_WHAT_YOU_NEED]; 

for(i=0;filename[i]!=NULL;i++) 
{ 
    if ((const char *)filename[i]!=" ") 
{ 
    Argument1[j][k++] = NULL; // Here I get An unhandled 
         // exception of type 
         //'System.NullReferenceException' 
         // occurred 
     j++; 
     k=0; 
    } 

    else 
    { 
     (const char)Argument1[j][k] = filename [j]; // Here I also i get exception 
     k++; 
     Argument++; 
    } 
    } 

    Argument ++; 
    return 0; 
    } 
+0

이것은 2D 배열이 필요하다고 가정하고 있지만 필요하지는 않습니다. 같은 여러 파일 이름을 저장하려는 경우 2D 배열이 필요합니다. [0] [ "두 파일"] [1] [ "하나의 파일"] [2] [ "세 개의 파일"] 을하지만 난 당신이 1 차원 배열을 할 생각 [F] [I] [L] [E] [] [O] [N] [E] – Craig

+0

안녕하세요 크레이그, 당신의 소중한 제안에 감사드립니다. 귀하의 제안을 시도했지만 동일한 예외가 발생했습니다. 내 주요 동기는 시작 (인수, ** 인수); fuction. –

+0

2 차원 배열이 어떻게 작동하는지 알고 있습니까? 저는 무례한 말을하는 것이 아닙니다. 그러나 여러분이 코드에서 원하는 것은 2 차원 배열로서 여러분이 코드에서 원하는 것으로 보이는 것은 [0] [f] [1] [1] [2] [3] [e]입니다. 두 개의 방을 많이 할당하고 있습니다. 원하는 경우 [0] [filename1] [1] [filename2], 루프에서 j ++을 제거하고 다른 파일 이름을 추가 할 때마다 증가시킵니다. – Craig

0

두 가지가 그것을 메모리의 일부 공간과 함께 할당합니다.

*Argument1 = new char[10]; 

for(i=0, i<10; ++i) Argument[i] = new char(); 

같은 스타일로 삭제하는 것을 잊지 마십시오.

0

먼저해야 할 문자열의 수를 찾는 것입니다. (즉, 실 거예요 빈 문자열) 내가 파일 이름에 적어도 하나 개의 단어가있을 것입니다 가정 위의 코드에서

int len = strlen(filename); 
int numwords = 1; 

for(i = 0; i < len; i++) { 
    if(filename[i] == ' ') { 
     numwords++; 
     // eating up all spaces to not count following ' ' 
     // dont checking if i exceeds len, because it will auto-stop at '\0' 
     while(filename[i] == ' ') i++; 
    } 
} 

: 그게 쉬운 같은 것을 함께 할. 이제 Argument1에 대한 메모리를 할당 할 수 있습니다. 그 후

Argument1 = new char *[numwords]; 

두 가지 옵션이 있습니다 :

  1. 사용 strtok를 (http://www.cplusplus.com/reference/clibrary/cstring/strtok/)
  2. 과 같이 할 수있는 문자열

분할 함수를 구현합니다

에게
int i,cur,last; 
for(i = last = cur = 0; cur < len; cur++) { 
    while(filename[last] == ' ') { // last should never be ' ' 
     last++; 
    } 

    if(filename[cur] == ' ') { 
     if(last < cur) { 
      Argument1[i] = new char[cur-last+1]; // +1 for string termination '\0' 
      strncpy(Argument1[i], &filename[last], cur-last); 
      last = cur; 
     } 
    } 
} 

위의 코드는 최적화되지 않았으므로 이해하기가 쉽습니다. 나는 또한 테스트하지 않았지만 제대로 작동 할 것입니다. 가정은 내가 만든 :

  1. 문자열이 널 (null) 적어도 한 단어가 문자열이
  2. 종료됩니다. P

    내가 코드에서 발견 어떤 실수 : 또한

메신저 문자열을 참조 할 때마다, 난 문자 배열을 의미 C/C++ "에서

  1. 의"에 대한 포인터입니다 const char 배열에 공백이 포함 된 배열. ""다른 것으로 비교하면 포인터를 비교할 것입니다. 그들은 다를지도 모릅니다. 이를 위해 strcmp (http://www.cplusplus.com/reference/clibrary/cstring/strcmp/)를 사용하십시오.
  2. 동적으로 메모리를 할당하는 방법을 배워야합니다. C에서는 malloc을 사용하여 malloc을 사용하거나, malloc 및 new (malloc 대신 new를 더 잘 사용)로 C++로 처리 할 수 ​​있습니다.내가 도움이

희망!

추신 : 내 코드에 오류가있는 경우 알려 주시면 고칠 수 있습니다.