루프에서 배열 값 재설정

스테판 GM

그래서 나는 poll()몇 개의 gpio 핀을 읽는 데 사용 하고 있습니다. 그런 다음 이전에 읽은 값을 새로 읽은 값과 비교하여 변경되었는지 확인합니다. 값 읽기는 잘 작동합니다. 내 문제가 루프에있는 것 같습니다. 이것은 buffers루프의 시작 부분에서 재설정 된 것처럼 보이는 출력에서 ​​볼 수 있습니다 . 왜 이런 일이 발생합니까?

참고 :poll() 지연 시간이있는 인터럽트로 사용하지 않는 이유를 궁금해하는 사람은 -1하드웨어 문제로 인해 지원되지 않기 때문입니다.

암호

static const int num_buttons = 2;

void *routine(){

    struct pollfd pfd[num_buttons];
    int fds[num_buttons];
    const char gpioValLocations[num_buttons][256];
    int i;
    for (i = 0; i < num_buttons ; i++){
        sprintf(gpioValLocations[i], "/sys/class/gpio/gpio%d/value", gpios[i]);
    }
    char buffers[num_buttons][2];
    char prev_buffers[num_buttons][2];

    for (i = 0; i < num_buttons; i++){
        if ((fds[i]= open(gpioValLocations[i],O_RDONLY)) < 0) {
            LOGD("failed on 1st open");
            exit(1);
        }
        pfd[i].fd = fds[i];  
        pfd[i].events = POLLIN;
        lseek(fds[i], 0, SEEK_SET); 
        read(fds[i], buffers[i], sizeof buffers[i]);
    }

    for (;;) {

        LOGD("at top: prev:%d%d buff:%d%d", atoi(prev_buffers[0]), atoi(prev_buffers[1]), atoi(buffers[0]), atoi(buffers[1]));

        poll(pfd, num_buttons, 1);

        for (i = 0; i < num_buttons; i++) {
            if ((pfd[i].revents & POLLIN)) {

                /* copy current values to compare to next to detected change */
                strcpy(prev_buffers[i], buffers[i]);
                LOGD("in loop: prev:%d%d buff:%d%d",
                 atoi(prev_buffers[0]), atoi(prev_buffers[1]),
                 atoi(buffers[0]), atoi(buffers[1]));

                /* read new values */
               lseek(fds[i], 0, SEEK_SET);
               read(fds[i], buffers[i], sizeof buffers[i]);

                /* compare new to previous */
                if (atoi(prev_buffers[i]) != atoi(buffers[i])) {
//                  LOGD("change detected");
                }
            }
        }
    }
}

산출

at top: prev:00 buff:01
in loop: prev:01 buff:00
in loop: prev:00 buff:00
at top: prev:00 buff:01
in loop: prev:01 buff:00
in loop: prev:00 buff:00
chqrlie

이 줄은 위험 해 보입니다.

strcpy(prev_buffers[i], buffers[i]);

prev_buffers[i]길이는 2 바이트에 불과합니다. buffers[i]문자가 2 개 이상 이면 버퍼 오버플로가 발생하고 정의되지 않은 동작을 호출합니다.

또한 초기화해야합니다. buffers현재 단일 바이트 문자열이 아닌 임의의 정크로 시작 strcpy합니다. 이전을 저장하는 데 사용 하면 정의되지 않은 동작이 호출됩니다. memcpy()이전 내용을 저장하는 데 사용 하면 버퍼에서 null 종결자를 스캔하는 대신 2 바이트 만 복사하므로 위험이 적습니다. .NET Framework의 끝을 지나서 읽을 buffers[i]때와 끝을 지나서 쓸 때 정의되지 않은 동작을 호출 할 수 prev_buffers[i]있습니다.

read(fds[i], buffers[i], sizeof buffers[i]);ASCII 숫자와 널 종료자를 읽는 것이 확실 합니까? 그렇지 않은 경우 코드가 올바르지 않습니다.

컴파일되는 완전한 함수를 게시하면 더 많은 문제가있을 수 있습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

PHP에서 배열 값 재정렬

분류에서Dev

루프에서 for 배열 사용에서 특정 값을 얻는 방법

분류에서Dev

연관 배열의 값 재설정

분류에서Dev

루프에서 정의 된 차원으로 배열에 값 삽입

분류에서Dev

for 루프에서 일부 배열의 현재 값과 동일한 경우에만 입력 값 업데이트

분류에서Dev

루프의 루프에서 배열의 모든 값을 인쇄

분류에서Dev

재료 다중 선택에서 값을 설정하지 않는 양식 배열의 패치 값

분류에서Dev

PHP에서 foreach를 사용하여 연속적인 정수로 배열 값 재설정

분류에서Dev

PHP에서 foreach를 사용하여 연속적인 정수로 배열 값 재설정

분류에서Dev

PHP 루프에서 한 번 값 설정

분류에서Dev

재귀 지연 배열의 인덱스에서 값 재정의

분류에서Dev

sqlite의 특정 열 값에 대한 누계 재설정

분류에서Dev

특정 배열 값에 배열 결합

분류에서Dev

배열 열에서 평균 값 결정

분류에서Dev

for 루프로 배열에서 최대 값과 최소값 찾기

분류에서Dev

중첩 루프에서 변수를 다시 시작 값으로 재설정

분류에서Dev

C-while 루프를 떠난 후 재정의 된 배열의 값

분류에서Dev

배열 맵을 수정하는 방법은 루프에서 반복되는 값입니까?

분류에서Dev

PHP foreach 루프를 사용하여 JSON 배열에서 특정 반복 값 가져 오기

분류에서Dev

forEach 루프를 사용하여 Firebase에서 지정된 키와 값의 개체 배열을 만듭니다.

분류에서Dev

단일 foreach 루프에서 여러 배열의 값을 정렬하는 방법은 무엇입니까?

분류에서Dev

배열 배열의 값 재정렬

분류에서Dev

루프에서 PHP 설정 해제 배열

분류에서Dev

Android의 문자열 배열에 존재하는 특정 값 수

분류에서Dev

특정 시간 단계에서 데이터 프레임 열의 값 재설정 및 행 빼기

분류에서Dev

루프에서 나온 값을 배열에 할당

분류에서Dev

PHP에서 루프를 통해 배열에 값 푸시

분류에서Dev

PHP에서 루프를 통해 배열에 값 푸시

분류에서Dev

루프에서 배열에 값을 할당하지 못함

Related 관련 기사

  1. 1

    PHP에서 배열 값 재정렬

  2. 2

    루프에서 for 배열 사용에서 특정 값을 얻는 방법

  3. 3

    연관 배열의 값 재설정

  4. 4

    루프에서 정의 된 차원으로 배열에 값 삽입

  5. 5

    for 루프에서 일부 배열의 현재 값과 동일한 경우에만 입력 값 업데이트

  6. 6

    루프의 루프에서 배열의 모든 값을 인쇄

  7. 7

    재료 다중 선택에서 값을 설정하지 않는 양식 배열의 패치 값

  8. 8

    PHP에서 foreach를 사용하여 연속적인 정수로 배열 값 재설정

  9. 9

    PHP에서 foreach를 사용하여 연속적인 정수로 배열 값 재설정

  10. 10

    PHP 루프에서 한 번 값 설정

  11. 11

    재귀 지연 배열의 인덱스에서 값 재정의

  12. 12

    sqlite의 특정 열 값에 대한 누계 재설정

  13. 13

    특정 배열 값에 배열 결합

  14. 14

    배열 열에서 평균 값 결정

  15. 15

    for 루프로 배열에서 최대 값과 최소값 찾기

  16. 16

    중첩 루프에서 변수를 다시 시작 값으로 재설정

  17. 17

    C-while 루프를 떠난 후 재정의 된 배열의 값

  18. 18

    배열 맵을 수정하는 방법은 루프에서 반복되는 값입니까?

  19. 19

    PHP foreach 루프를 사용하여 JSON 배열에서 특정 반복 값 가져 오기

  20. 20

    forEach 루프를 사용하여 Firebase에서 지정된 키와 값의 개체 배열을 만듭니다.

  21. 21

    단일 foreach 루프에서 여러 배열의 값을 정렬하는 방법은 무엇입니까?

  22. 22

    배열 배열의 값 재정렬

  23. 23

    루프에서 PHP 설정 해제 배열

  24. 24

    Android의 문자열 배열에 존재하는 특정 값 수

  25. 25

    특정 시간 단계에서 데이터 프레임 열의 값 재설정 및 행 빼기

  26. 26

    루프에서 나온 값을 배열에 할당

  27. 27

    PHP에서 루프를 통해 배열에 값 푸시

  28. 28

    PHP에서 루프를 통해 배열에 값 푸시

  29. 29

    루프에서 배열에 값을 할당하지 못함

뜨겁다태그

보관