2014-09-25 3 views
0

배열의 모든 요소의 위치를 ​​오른쪽으로 1 씩 이동하여 새 개체를 삽입하려고 시도했는데 예상대로 작동하지 않는 경우이 코드의 문제점 ? edit : 첫 번째 요소를 새 obj로 바꾸고 배열의 첫 번째 인덱스로 이동하는 내용을 삽입 할 때 마지막 요소를 삭제합니다. 배열 i (이 루프 isize - 1로 갈 때 i = 0C 배열, 요소가 예상대로 작동하지 않음

for(j = *size-1; j > i-1; j--) 

배열 현재 14 가장 외부 루프

for(i = 0; i < *size; i++){ 
     if((obj.ID < array[i].ID) || (obj.ID < array[i].ID)){ 
     size_t j; 
     for(j = *size-1; j > i-1; j--){ 
      array[j] = array[j-1];//array[j+1] = array[j]; 
     } 
     array[i] = obj.ID; 
     *size = *size + 1; 
     return array; 
     } 
    } 
+0

당신은 당신의 변수와 종류의 많은 정의가 누락 ... 당신은 적어도 당신이 그것을 호출하는 방법의 전체 기능, 일반적으로 예를 제공한다 (전달하는 매개 변수 변수의 정의 포함). 그리고 나서 "예상대로 작동하지 않습니다"는 당신이 기대하는 것과 당신이 보는 것을 말하지 않습니다. – hyde

+0

'(obj.ID

+0

@Michael Burr 그는 신뢰성을 위해이 작업을 수행합니다 :) 실수로 첫 번째 서브 표현식이 false이면 두 번째 하위 표현식이 결과를 다시 확인합니다. :) –

답변

0

부호없는 정수의 랩 어라운드.

for(j = *size-1; j > i-1; j--){ 

jsize_t 너무 j > i-1 확실히 2 종류의 부호를 비교 유형이다. 처음에는 i=0 이래로 비교는 j > some_very_large_unsigned_value입니다.

확인되지 않은 해결책은 양면에 1을 더할 수 있습니다. 사전에

또한
for(j = *size-1; j+1 > i; j--){ 
     array[j] = array[j-1]; 
    } 
    // or simply 
    for(j = *size; j-- > i;){ 
     array[j] = array[j-1]; 
    } 

증가 크기 :

if (*size >= 1020) Handle_TooMany();   
    *size = *size + 1; 
    for(j = *size; j-- > i;){ 
     array[j] = array[j-1]; 
    } 
+0

솔루션이 효과를 발휘했습니다! 내가 이해할 수없는 유일한 것은 두 번째 for 루프 구문입니다. 조금 설명 할 수 있을까요? –

+0

또한 마지막 요소가 누락되었습니다 –

+0

@ user2038460'j = * size-1'에서 1을 뺀 것이 아니라'j = * size'를 수행하십시오. 이제'j'는 코드가 비교할 때 하나 더 높습니다. 그래서 코드는'j> i'가하기 때문에'j + 1> i'로 이전처럼 1을 더할 필요가 없습니다. 그러나'for()'루프의 본문은 감소 된 값을 필요로하므로'j--> i'를 수행합니다. – chux

0

첫번째 반복있다 1,020 개체에 대한 용량을 갖는다 값 포함), 마지막 반복에서 j가 0이되면 할당 문은 다음과 같이 보입니다.

문제가있는 곳

0

코드가 나에게별로 의미가 없습니다. 당신이하고 싶은 일이 모든 요소를 ​​하나씩 오른쪽으로 옮기는 것이라면, 가장 먼저 신경 써야 할 것은 마지막 요소에 일어날 일입니다. 그것을 잃어 버려야합니까? 배열을 키워야 하나? 후자는 배열이 malloc을 사용하여 동적으로 할당 된 경우에만 수행 할 수 있습니다.

길이가 narray 배열의 마지막 요소 (위치 n - 1)를 잃어버린다고 가정 해 봅시다. 다음은 우리가 이동할 수있는 방법입니다.

배열 끝에서 시작하여 시작 부분으로 이동한다는 점에 유의하십시오. (그렇지 않으면 어떻게 될지 상상해보십시오.)

최대 성능을 얻으려면자가 감기 루프 대신 memmove을 사용하는 것이 좋지만 수동으로 시작하는 것부터 시작하면 더 나은 이해를 얻을 수 있습니다.

업데이트 : 마지막 요소가 삭제되지 않도록

어떻게 당신이 그것을 만들 것 .. 수

복사가 동일한 경우, 루프 시작하는 것을 제외? out n - 1 대신 n으로 출력하십시오. 그러나 배열 크기가 최소한 n + 1 이상인 경우에만 작동합니다. 미리 요소의 최대 개수를 알고 있다면, 충분히 큰 배열을 앞에 만들 수 있습니다. 그러나 종종 동적 메모리를 사용해야 할 때가 있습니다.

당신은 나중에 당신이 경우에

int * tmp = realloc(buffer, m * sizeof(int)); 
if (tmp == NULL) 
    { 
    fprintf(stderr, "error: out of memory\n"); 
    abort(); 
    } 
else 
    { 
    buffer = tmp; 
    /* 'buffer' can now hold 'm' integers. */ 
    } 

통해이 m 요소를 보관 유지 할 수 있어야하는

int * buffer = malloc(n * sizeof(int)); 
if (buffer == NULL) 
    { 
    fprintf(stderr, "error: out of memory\n"); 
    abort(); 
    } 

를 통해 유형 intn 변수를 유지하고 다시 크기를 충분히 큰 버퍼를 할당 할 수

이것은 매우 비효율적이므로 크기를 하나 하나 변경하지 마십시오.대신, 두 개의 분리 된 변수의 현재 용량의 트랙과 현재 사용 크기을 유지하고 당신이 더 이상 버퍼를 필요로하지 않는 한 항상주고, 2

배를 용량을 다시 조정 시스템 :

free(buffer); 

나는 최근에 또 다른 질문에 대한 답변과 같은 동적 배열을 관리 a working example을 기록했다. 아마 당신도 유용 할 것입니다.

+0

어떻게하면 마지막 요소가 삭제되지 않도록 할 수 있습니까? .. 가능하다면 –

+0

훌륭한 지침! –

관련 문제