Nieprawidłowy dostęp do pamięci w tablicy typu wyliczeniowego

0

Witam mam do napisania funkcję zadanie z codewars.
link

#include <stddef.h>

enum Direction { LEFT, RIGHT };

size_t count_rotations (size_t n, const enum Direction directions[n])
{
  int result = 0;
  int count;
  
  if(directions[0]==LEFT)     
    count=1;
  if(directions[0]==RIGHT)
    count=-1;

    
  for(int i=1;i<n;i++)
  {
    enum Direction prev=directions[i-1];
    if((directions[i]==LEFT)&&prev==LEFT)
    {
      count++;
      if(count==4)
        result++ , count=0;
    }
    if((directions[i]==RIGHT)&&prev==RIGHT)
    {
      count--;
      if(count==-4)
        result++, count=0;
    }
  }
	return result;
}

ten fragment kodu powoduje błąd

 if(directions[0]==LEFT)     
    count=1;
  if(directions[0]==RIGHT)
    count=-1;

nieprawidłowy dostęp do pamięci dlaczego tak się dzieje i jak to naprawić?

0

Kod sam w sobie jest ok, zależy jak jest używany. Musisz wrzucić całość.

1

Zakladajac ze wejscie ktore dostajesz jest poprawne (a pewnie jest), jak to wejscie powinno wygladac zeby directions[0] powodowalo UB? To powinienes wiedziec. A jesli po zastanowieniu sie ciagle nie wiesz, to po prostu zajrzyj do danych testowych i zobacz na ktorych sie sypie. Po naprawieniu tego, beda inne bledy do naprawienia.

0

Tak btw.

size_t count_rotations (size_t n, const enum Direction directions[n])

Osobiście miałem z tego niezłą rozkminię, i zasięgnąłem języka nawet u kogoś ;-)

int test(  size_t n, arr[n] ) 

Po co tak robić? arr[n] i tak przechodzi w *arr i n jest stracone. Dla mnie to jest tożsame z []
W teorii kompilator może sprawdzić, czy to n mieści się w przekazanej macierzy.
Trochę naciągane, tylko tyle się dowiedziałem. Może ktoś ma coś więcej do dodania?

prędzej już

int test(  size_t n, arr[][n] ) 

Przy tym przynajmniej zadziała sizeof *arr
i obchodzimy [][]

1
ksh napisał(a):

Tak btw.

size_t count_rotations (size_t n, const enum Direction directions[n])

Osobiście miałem z tego niezłą rozkminię, i zasięgnąłem języka nawet u kogoś ;-)

int test(  size_t n, arr[n] ) 

Po co tak robić? arr[n] i tak przechodzi w *arr i n jest stracone. Dla mnie to jest tożsame z []
W teorii kompilator może sprawdzić, czy to n mieści się w przekazanej macierzy.
Trochę naciągane, tylko tyle się dowiedziałem. Może ktoś ma coś więcej do dodania?

prędzej już

int test(  size_t n, arr[][n] ) 

Przy tym przynajmniej zadziała sizeof *arr
i obchodzimy [][]

A uruchom sobie na gcc

#include <stdio.h>
int f(size_t n, int arr[(printf("test\n"), n)]) {

}

int main() {
    int arr[2];
    f(2, arr);
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1