function definition is not allowed here {. 1 error generated

0

Dlaczego w tym oto kodzie w linii 27.1 (po mainie) program wyświetla mi błąd "function definition is not allowed here {. 1 error generated"???

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int f(int m)
{
    int y, j;
    time_t tt;
    y = time(&tt);
    srand(y);
    int tab1[m];
    for (j = 0; j < m; j++) {
        printf("%d \t", rand() % 90 + 10);
    }
    /*
int g(int n)
{
n=m;
for(n=0;n<m;n++)
{
  int tab[n]=tab[m];
  printf();
}
}
*/
    int main(void)
    {
        int m;
        printf("Podaj rozmiar tablicy.\n");
        scanf("%d", &m);
        f(m);
        return 0;
    }
}

I tak, funkcje f i g mają być przed mainem. Z góry dziękuję za pomoc.

3

Definiujesz main wewnątrz funkcji f

0
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 5
void f(int tab[])
{
srand((unsigned)time(NULL));
for(int j=0;j<N;++j)
{
  tab[j]=rand()%90+10;
}
}
void g(int tab[])
{
for(int j=0;j<N;++j)
{
  printf("%d \t",tab[j]);
}
}
void h(int tab[])
{
  for(int j=N-1;j>=0;--j)
  {
    printf("%d \t",tab[j]);
  }
}
int main(void)
{
  int k[]={0};
  printf("Podaj rozmiar tablicy.\n");
  
  f(k);
  printf("\n");
  printf("Liczby od początku do końca to:\n");
  g(k);
  printf("\n");
  printf("Liczby od końca do początku to:\n");
  h(k);
  return 0;
}

Teraz jak poprawiłem, to wyświetla mi w 15 linii nawias zamykający na zielono, nie wiem dlaczego (a właściwie to już nie, bo przepisałem kod na ghb czy jak mu tam, a był w replu). Ale pojawił się nowy problem - dlaczego teraz program wypisuje mi liczby od początku do końca, a na odwrót już nie? Wyświetla się "exited, segmentation fault". Chcę też uogólnić go dla każdej zmiennej "a", "b", "t" czy jakkolwiek ona by się miała nazywać, ale jak wpisuję "a" (bez cudzysłowu) zamiast 5, to mi wywala błąd, też nie wiem dlaczego...

1
irek5000 napisał(a):
  int k[]={0};

Taki zapis tworzy tablicę o liczbie elementów odpowiadającej temu, ile wartości podasz w klamrach - tworzysz zatem tablicę o rozmiarze 1 elementu.

2
irek5000 napisał(a):

czyli to ={0} jest zbędne, tak? Czy zamiast 0 dać a, które wcześniej zadeklaruję a potem wczytam?

Nie. W C, tablice mają stały rozmiar. Istnieją trzy możliwe zapisy:

  1. int nazwa[] = {a, b, c, d}; - tablica będzie miała taki rozmiar, ile podasz elementów w klamrach.
  2. int nazwa[WARTOSC_STALA] - tablica będzie miała rozmiar znany na etapie kompilacji.
  3. int nazwa[jakas_zmienna] - tablica będzie rozmiar równy wartości zmiennej jakas_zmienna, w momencie, gdy flow dojdzie do jej deklaracji.
irek5000 napisał(a):

Jak piszę #define N a, to mi wyskakuje, że "a not declared".

Makra w C pełnią funkcję po prostu podmianki tekstowej. Jak zrobisz #define N a, to wszędzie, gdzie używasz N jako identyfikatora, zostanie zamienione na a. W funkcjach f, g oraz h nie masz nigdzie zmiennej a, więc kompilator krzyczy, że a jest niezadeklarowane.

irek5000 napisał(a):

To jak to zadeklarować, żeby to się nie wyświetlało?

Możesz przekazywać rozmiar tablicy jako drugi argument funkcji.

0
irek5000 napisał(a):

To jak to zadeklarować, żeby to się nie wyświetlało?

Możesz przekazywać rozmiar tablicy jako drugi argument funkcji.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 5
void f(int tab[])
{
srand((unsigned)time(NULL));
for(int j=0;j<N;++j)
{
 tab[j]=rand()%90+10;
}
}
void g(int tab[])
{
for(int j=0;j<N;++j)
{
 printf("%d \t",tab[j]);
}
}
void h(int tab[])
{
 for(int j=N-1;j>=0;--j)
 {
   printf("%d \t",tab[j]);
 }
}
int main(void)
{
 int a;
 int k[a];
 printf("Podaj rozmiar tablicy.\n");
 scanf("%d",&a);
 f(k);
 printf("\n");
 printf("Liczby od początku do końca to:\n");
 g(k);
 printf("\n");
 printf("Liczby od końca do początku to:\n");
 h(k);
 return 0;
}

A jak to zrobić? Bo chwilowo mam tak i działa tylko dla 5, jak wpisuję 8, to i tak wyświetla 5 elementów, jak daję "a" to nie deklaruje a jak nie wpisuję nic, to wywala błąd przy średniku w funkcji f po makrze N...

1
irek5000 napisał(a):
int main(void)
{
 int a;
 int k[a];
 [...]
  1. Dodaj po prostu drugi argument do funkcji: void nazwa_funkcji(int tab[], int rozmiar) i wywołuj ją z dwoma argumentami: f(k, a).

  2. W tym zapisie, jaki podałeś, zmienna a jest niezainicjalizowana w momencie, gdy deklarujesz tablicę k. Najpierw ustaw jakąś wartość w a (np. przez scanf()), a dopiero potem zadeklaruj tablicę.

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