Nie, kompilator przyczepił się do Twojej tablicy
int koszyk[ile_p]
Alokacja pamięci na tablicę jest w momencie wejścia do funkcji main (o ile się nie mylę). Za to zmienna ile_p nie ma przydzielonej wartości przez Ciebie w momencie wejścia do funkcji, a ma losową wartość, jakiegoś śmiecia. Stąd nie wiadomo, co tam jest i kompilator najwidoczniej się buntuje. Code Blocks za to jest słabszy, więc dopuszcza taką możliwość. Jak chcesz tak zrobić, to zalecam alokację dynamiczną.
EDIT: Możesz jeszcze zrobić tak
#include <iostream>
#include <numeric>
#include "FunkcjeApki.h"
using namespace std;
const int ile_p = 5; //wpisz tutaj ilosc obiektow produkt, ktorymi chcesz operowac w programie.
int main()
{
string wybor; //nawiguje uzytkownika po sklepie
bool czy_lista = 0; //zmienna sprawdzajaca czy program jest w funkcji wyswietl_nazwy()
int koszyk[ile_p]; //alokacja pamieci na ID produktow do kupienia
produkt lista[ile_p]; //alokacja pamieci na obiekty produkt
// v tu dodawaj kolejne produkty(nazwa, ilosc, cena, ID) v
lista[0].podaj_dane("Jablko", 20, 2, 9);
lista[1].podaj_dane("Chleb", 10, 5, 4);
lista[2].podaj_dane("Marchew", 40, 2, 5);
lista[3].podaj_dane("Mleko", 10, 3, 6);
lista[4].podaj_dane("Hot-dog", 50, 3, 8);
// ^ tu dodawaj kolejne produkty(nazwa, ilosc, cena, ID) ^
while (1) {
cout << "Witaj w sklepie, przejdz do listy produktow (L) albo do koszyka (K)" << endl;
cin >> wybor;
nawigacja(ile_p, lista, koszyk, wybor, czy_lista);
}
return 0;
}
Jaka różnica? Ano taka, że zmienna statyczna jest inicjalizowana przed wejściem do funkcji main() i ma ona w zasięgu funkcję main(). Stąd jest dostępna "od ręki" i wszystko gra. Kwestia tego, jak chcesz to zrobić należy do Ciebie.