[C] Problem z kompilatorem i tablicami

0

Witam, mam problem z kompilatorem, np na ideone albo codechef (gcc 6.3) wszystko działa tak jak powinno, lecz jak próbuję odpalić ten kod w np terminalu, albo w VS to od razu crushuje.
Może używam czegoś co jest dozwolone tylko w jakichś kompilatorach, więc proszę o pomoc co to takiego :D
input to N, a potem N liczb

#include <stdio.h>

int main(void)
{
    int N, x, a;
    int y, max = 0;
    scanf("%d", &N);
    int tab[N];
    int tablica[1000000];
    int tabk[N];
    for (int i = 1; i < N + 1; i++) {
        scanf("%d", &x);
        tablica[i] = x;
        tab[i] = tab[i - 1] + tablica[i];
    }
    for (int i = 1; i < N + 1; i++) {
        for (int i = 1; i < N + 1; i++) {
            if (tab[i] >= (tab[N] - tab[i]) && y < tab[N] - tab[i]) {
                y = (tab[N] - tab[i]);
            }
            else if (tab[i] < (tab[N] - tab[i]) && y < tab[i]) {
                y = tab[i];
            }
        }
        tabk[i] = y;
        y = 0;
        a = tablica[1];
        for (int i = 1; i < N; i++) {
            tablica[i] = tablica[i + 1];
        }
        tablica[N] = a;
        for (int i = 1; i < N + 1; i++) {
            tab[i] = tab[i - 1] + tablica[i];
        }
    }
    for (int i = 1; i < N; i++) {
        if (tabk[i] > max) {
            max = tabk[i];
        }
    }
    printf("%d", max);
    return 0;
}
1

int tab[N]; Może być tak(powinno tak być, dla portable kodu), że rozmiar tablicy musi być znany na etapie kompilacji.

0
lion137 napisał(a):

int tab[N]; Może być tak(powinno tak być, dla portable kodu), że rozmiar tablicy musi być znany na etapie kompilacji.

Właśnie nie pomaga, też o tym myślałem.

1

Jakbyś opisał co ten kod ma robić, etc., To byłoby łatwiej.

0
lion137 napisał(a):

Jakbyś opisał co ten kod ma robić, etc., To byłoby łatwiej.
Już się robi, myslałem, że to będzie coś oczywistego czego nie widzę.

http://prntscr.com/py4lfm
i z tego mam wyznaczyc najwieksza odleglosc pomiedzy tymi z tym, że jak jest droga tak jakby z prawej strony "okręgu" to jest i z lewej i bierzemy tą krótszą.
https://prnt.sc/py4o7g
I wtedy w kodzie przypisywalem tą najdłuższą to tabk, pokolei dla odleglosci z A1, potem z A2 itd.
Mam nadzieję, że zrozumiesz heh

#include <stdio.h>

int main(void) {
int N,x,a;
int y,max=0;
scanf("%d", &N);
int tab[1000000];
int tablica[1000000];
int tabk[1000000];
for(int i = 1; i<N+1; i++)
	{
		scanf("%d", &x);
		tablica[i]=x; //utworzenie tablicy z kolejnych elementow
		tab[i]=tab[i-1]+tablica[i]; //stworzenie tablicy ktora jest powiekszona o kazdy kolejny wyraz z poprzedniej
	}
for (int i = 1; i<N+1; i++)
{
	for(int i = 1; i<N+1; i++)
		{
			if(tab[i]>=(tab[N]-tab[i]) && y<tab[N]-tab[i]) //jeśli np lewa strona kolka jest wieksza 
					{
						y=(tab[N]-tab[i]); //to przypisujemy wartosc z prawej strony(mniejszą)
					}
			else if(tab[i]<(tab[N]-tab[i]) && y<tab[i])
				{
					y=tab[i];
				}
		}
	tabk[i]=y;
	y=0;
	a=tablica[1];
		for(int i = 1; i<N; i++)
			{
				tablica[i]=tablica[i+1];  //tutaj shuffle tablicy zeby pierwszy wyraz poszedl na koniec a reszta zmienila miejsce o 1
			}
		tablica[N]=a;
		for(int i = 1; i<N+1; i++)
		{
		tab[i]=tab[i-1]+tablica[i]; //shuffle drugiej tablicy
		}
}
for(int i = 1;i<N;i++)
{
	if (tabk[i]>max)
		{
			max=tabk[i];
		}
}
printf("%d",max);
return 0;
}
0

Odkryłem, że w niektórych kompilatorach jak zmieniłem rozmiar tablic na 100000(kazdej) to wszystko działa, a jak był rozmiar 1000 to nie działało.
Jest ktoś w stanie wytłumaczyć dlaczego?

0
pablo3451 napisał(a):

Odkryłem, że w niektórych kompilatorach jak zmieniłem rozmiar tablic na 100000(kazdej) to wszystko działa, a jak był rozmiar 1000 to nie działało.
Jest ktoś w stanie wytłumaczyć dlaczego?

Pewnie nikt...

1

Zmień na static int tab... i sprawdź raz jeszcze.

0
_13th_Dragon napisał(a):

Zmień na static int tab... i sprawdź raz jeszcze.

Pomogło, wielkie dzięki! Takie to proste było.

1
pablo3451 napisał(a):

Odkryłem, że w niektórych kompilatorach jak zmieniłem rozmiar tablic na 100000(kazdej) to wszystko działa, a jak był rozmiar 1000 to nie działało.
Jest ktoś w stanie wytłumaczyć dlaczego?

Miszmasz rzeczy typu: wersja standardu, wersja kompilatora, rozszerzenia danego kompilatora względem danej wersji ANSI C,
gatunek zioła jaki palili programiści w danym czasie i cechy zarządzania pamięcią danego systemu operacyjnego i platformy sprzętowej

Pisząc kod w C i chcąc uniknąć drapania się po głowie zastanawiając się nad tego typu kwestiami jak:
0. Czy w ogóle wiesz co robisz.

  1. Na jakiej wersji standardu C ma to działać
  2. Czy ma to działać też w innych wersjach kompilatorów na innych platformach.
  3. Czy to co robisz jest w ogóle sprecyzowane w standardzie, czy też podpada pod zachowania niezdefiniowane i za każdym wykonaniem kodu będzie się kończyć różnymi wynikami dla tego samego przypadku wejściowego.
0
Satanistyczny Awatar napisał(a):
pablo3451 napisał(a):

Odkryłem, że w niektórych kompilatorach jak zmieniłem rozmiar tablic na 100000(kazdej) to wszystko działa, a jak był rozmiar 1000 to nie działało.
Jest ktoś w stanie wytłumaczyć dlaczego?

Miszmasz rzeczy typu: wersja standardu, wersja kompilatora, rozszerzenia danego kompilatora względem danej wersji ANSI C,
gatunek zioła jaki palili programiści w danym czasie i cechy zarządzania pamięcią danego systemu operacyjnego i platformy sprzętowej

Pisząc kod w C i chcąc uniknąć drapania się po głowie zastanawiając się nad tego typu kwestiami jak:
0. Czy w ogóle wiesz co robisz.

  1. Na jakiej wersji standardu C ma to działać
  2. Czy ma to działać też w innych wersjach kompilatorów na innych platformach.
  3. Czy to co robisz jest w ogóle sprecyzowane w standardzie, czy też podpada pod zachowania niezdefiniowane i za każdym wykonaniem kodu będzie się kończyć różnymi wynikami dla tego samego przypadku wejściowego.

Wezmę to sobie do serca hah

2
pablo3451 napisał(a):
_13th_Dragon napisał(a):

Zmień na static int tab... i sprawdź raz jeszcze.

Pomogło, wielkie dzięki! Takie to proste było.

Nie pomogło nadal masz szajs w kodzie. Teraz jedynie stos nie gwałcisz na czarno.

0
_13th_Dragon napisał(a):
pablo3451 napisał(a):
_13th_Dragon napisał(a):

Zmień na static int tab... i sprawdź raz jeszcze.

Pomogło, wielkie dzięki! Takie to proste było.

Nie pomogło nadal masz szajs w kodzie. Teraz jedynie stos nie gwałcisz na czarno.

Przynajmniej na razie nie jestem w stanie tego lepiej napisać, bo po prostu nie umiem.

#include <stdio.h>
 
int main(void) {
int N,x,a;
int y,max=0;
scanf("%d", &N);
static int tab[100001];
static int tablica[100001];
static int tabk[100001];
for(int i = 1; i<N+1; i++)
    {
        scanf("%d", &x);
        tablica[i]=x;
        tab[i]=tab[i-1]+tablica[i];
    }
for (int i = 1; i<N+1; i++)
{
    for(int i = 1; i<N+1; i++)
        {
            if(tab[i]>=(tab[N]-tab[i]) && y<tab[N]-tab[i])
                    {
                        y=(tab[N]-tab[i]);
                    }
            else if(tab[i]<(tab[N]-tab[i]) && y<tab[i])
                {
                    y=tab[i];
                }
        }
    tabk[i]=y;
    y=0;
    a=tablica[1];
        for(int i = 1; i<N; i++)
            {
                tablica[i]=tablica[i+1];
            }
        tablica[N]=a;
        for(int i = 1; i<N+1; i++)
        {
        tab[i]=tab[i-1]+tablica[i];
        }
}
for(int i = 1;i<N;i++)
{
    if (tabk[i]>max)
        {
            max=tabk[i];
        }
}
printf("%d",max);
return 0;
}

A przy tym jak sprawdzam sobie jakieś przypadki to działa w każdym.

1
int tab[N];
...
for (int i = 1; i < N + 1; i++) {
    ...
    tab[i] = tab[i - 1] + tablica[i]; <- tu wychodzisz poza tablicę
}

Rezerwujesz miejsce na N elementów. Indeksowanych od 0 do N-1. Jak wpisujesz N elementów ale od 1 to na ostatni zabraknie miejsca.
Podobne błędy masz niżej.
Zadeklaruj na początku int tab[N+1]; i powinno działać.

0
Delor napisał(a):
int tab[N];
...
for (int i = 1; i < N + 1; i++) {
    ...
    tab[i] = tab[i - 1] + tablica[i]; <- tu wychodzisz poza tablicę
}

Rezerwujesz miejsce na N elementów. Indeksowanych od 0 do N-1. Jak wpisujesz N elementów ale od 1 to na ostatni zabraknie miejsca.
Podobne błędy masz niżej.
Zadeklaruj na początku int tab[N+1]; i powinno działać.

#include <stdio.h>
 
int main(void) {
int N,x,a;
int y,max=0;
scanf("%d", &N);
int tab[N+1];
int tablica[N];
int tabk[N];
tab[0]=0;
for(int i = 1; i<N+1; ++i)
    {
        scanf("%d", &x);
        tablica[i]=x;
        tab[i]=tab[i-1]+tablica[i];
    }
for (int i = 1; i<N+1; ++i)
{
    for(int i = 1; i<N+1; ++i)
        {
            if(tab[i]>=(tab[N]-tab[i]) && y<tab[N]-tab[i])
                    {
                        y=(tab[N]-tab[i]);
                    }
            else if(tab[i]<(tab[N]-tab[i]) && y<tab[i])
                {
                    y=tab[i];
                }
        }
    tabk[i]=y;
    y=0;
    a=tablica[1];
        for(int i = 1; i<N; ++i)
            {
                tablica[i]=tablica[i+1];
            }
        tablica[N]=a;
        for(int i = 1; i<N+1; ++i)
        {
        tab[i]=tab[i-1]+tablica[i];
        }
}
for(int i = 1;i<N;++i)
{
    if (tabk[i]>max)
        {
            max=tabk[i];
        }
}
printf("%d",max);
return 0;
}

Zmieniłem wszędzie na preinkrementacje, dodałem wartość tab[0]=0 i to co mówiłeś żeby nie wychodziło za tablice.
Wygląda na to, że działa tak jak powinno. Masz jeszcze jakieś uwagi do kodu? Z tego co widzę to poza te inne tablice nie wychodzę.

1

W pozostałych tablicach też wychodzisz poza zakres.

0

Tak, teraz widzę, to mam po prostu pozmieniać teraz każdą na [N+1]? Bo bardziej nie wychodzę, więc chyba tak.

1
for (int i = 1; i<N+1; ++i)
{
    for(int i = 1; i<N+1; ++i)

To specjalnie tak? Nie gubisz się którego i gdzie używasz? W pętlach wewnętrznych wartość i z zewnętrznej zostanie przysłonięta.

0
Delor napisał(a):
for (int i = 1; i<N+1; ++i)
{
    for(int i = 1; i<N+1; ++i)

To specjalnie tak? Nie gubisz się którego i gdzie używasz? W pętlach wewnętrznych wartość i z zewnętrznej zostanie przysłonięta.

Specjalnie, przynajmnei na razie się nie gubię, ale tak jak mówisz, lepiej byłoby przypisać inną, dzięki wielkie.

0

Czyżby szukałeś najdłuższej z najkrótszych dróg?

0
_13th_Dragon napisał(a):

Czyżby szukałeś najdłuższej z najkrótszych dróg?

Tak

0
pablo3451 napisał(a):
_13th_Dragon napisał(a):

Czyżby szukałeś najdłuższej z najkrótszych dróg?

Tak

na pewno :D

0

To pewnie będzie najlepszy sposób, wrócę do domu to spróbuje napisać. Dzięki

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