• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

przekazywanie tablic między funkcjami

VPS Starter Arubacloud
0 głosów
522 wizyt
pytanie zadane 3 marca 2017 w C i C++ przez Aleksander Początkujący (360 p.)

Proszę o wytłumaczenie paru błędów:

1.error: expected primary-expression before ']' token|

2.{

In function 'int wylosujLiczby(int*, int, int, int)':|

In function 'int wypiszLiczby(int*, int)':|

In function 'int wylosujLiczby(int*, int, int, int)':|

}

#include <iostream>
#include <cstdlib>
#include <time.h>

using namespace std;
int wylosujLiczby(int tab[],int i,int p1,int p2)
{
    srand(time(NULL));
    int a;
    do{

    tab[a]=rand()%(p2-p1)+p1;
    a++;
    }while(a<i);
    return tab[];
}
int wypiszLiczby(int tablica[],int l)
{
    int i;
    do
    {
    int l;
    cout <<tablica[l];
    l++;
    }while(i<l);
}
int obliczSume(int tablica[],int l)
{
    int i,wynik;
    do
    {

    wynik=tablica[i]+wynik;
    i++;
    }while(i<l);
return wynik;
}
int main()
{

    int tablica[ 999 ];
    wylosujLiczby( tablica, 999, 4, 10 );
    wypiszLiczby( tablica, 999 );
    int iSuma = obliczSume( tablica, 999 );
    std::cout << "Suma liczb wynosi: " << iSuma << std::endl;
    return 0;
}

 

komentarz 3 marca 2017 przez Aleksander Początkujący (360 p.)
pierwszy error pojawia sie przy: return tab[];
1
komentarz 3 marca 2017 przez j23 Mędrzec (195,220 p.)
edycja 3 marca 2017 przez j23

A po co funkcja  wylosujLiczby w ogóle coś zwraca? Wywal tego returna, a funkcja niech będzie void.

wypiszLiczby powinna coś zwrócić, a nie zwraca. Jeśli nie wiesz, co ma zwrócić, to jak wyżej - zrób ją void.

 

1 odpowiedź

0 głosów
odpowiedź 3 marca 2017 przez Dexterim Dyskutant (8,370 p.)
wybrane 3 marca 2017 przez Aleksander
 
Najlepsza
Pierwsza rzecz generator licz losowych nie powinien znajdować się w funkcji tylko w funkcji main bo inaczej Ci będzie losowało jedną i tą samą liczbę.

Druga rzecz która powtarza się prawie w każdej z Twoich funkcji inicjalizujesz zmienna bez przypisania jej wartości po czym później zwiększasz jej wartość. Operujesz na zmiennych nie wiedząc co one w sobie maja

Po trzecie sprawdź co Twoje funkcje zwracają w funkcji wylosujLiczny zwracasz wskaznik na tablice intów a nie int. W wypisz liczby nic nie zwracasz a masz napisane int. Poczytaj coś więcej o funkcjach. Dodatkowo w funkcji wypisz liczby przesłaniasz sobie l które też nie jest zainicjalizowane żadną wartością
komentarz 3 marca 2017 przez draghan VIP (106,230 p.)

Pierwsza rzecz generator licz losowych nie powinien znajdować się w funkcji tylko w funkcji main bo inaczej Ci będzie losowało jedną i tą samą liczbę.

Bzdura. Z każdym wywołaniem srand() będzie podane inne ziarno do inicjalizacji. Pomimo tego inicjalizację i tak powinno się przeprowadzać jednokrotnie.
C++ posiada własne narzędzia generacji liczb (pseudo)losowych, które polecam użyć (nagłówek random).

Druga rzecz która powtarza się prawie w każdej z Twoich funkcji inicjalizujesz zmienna bez przypisania jej wartości po czym później zwiększasz jej wartość.

Inicjalizacja to nadanie początkowej wartości.

komentarz 6 marca 2017 przez Dexterim Dyskutant (8,370 p.)

Porównaj sobie działanie tych dwóch funkcji :)

#include<iostream>
#include<ctime>
#include<cstdlib>

void show(){
	//srand(time(NULL));
	std::cout<< rand()%40<<" ";
}

int main(){
	srand(time(NULL));
	for(int i = 0 ; i < 20 ; i++)
		show();
}

i

#include<iostream>
#include<ctime>
#include<cstdlib>

void show(){
	srand(time(NULL));
	std::cout<< rand()%40<<" ";
}

int main(){
	for(int i = 0 ; i < 20 ; i++)
		show();
}

 

komentarz 6 marca 2017 przez draghan VIP (106,230 p.)

Widzę, że nieprecyzyjnie się wyraziłem - nie z każdym wywołaniem srand(), tylko z każdym wywołaniem srand() o innym argumencie.
Robisz za mało testów, żeby cokolwiek tu pokazać. Funkcja time() zazwyczaj zwraca liczbę związaną z sekundami, więc dla jasności powinieneś dać szansę ziarnu się zmienić, czekając co najmniej sekundę między wywołaniami.

#include <cstdlib>
#include <ctime>
#include <iostream>
#include <chrono>
#include <thread>


int get_random()
{
    srand(time(NULL));
    return rand();
}

int main()
{
    using namespace std::chrono_literals;
    for(auto i = 0u; i < 5; ++i)
    {
        std::cout<<get_random()<<' ';
        std::this_thread::sleep_for(1s);
    }
}

Jak pisałem, nie ma to i tak za bardzo sensu, bo mechanizm pseudolosowości z C nie jest za dobrym generatorem. Polecam obejrzeć to wystąpienie Stephana Lavavej.

komentarz 6 marca 2017 przez Dexterim Dyskutant (8,370 p.)
Przedstawiasz teraz inny sposób losowania liczb. Pokazałem jedynie,że sposób w którym autor pytania skorzystał z srand() nie zawsze może się udać. Chyba tyle w temacie ;) Tak robię za mało testów ale to pokazuje,że sprawność działania rand zalezy od czasu wykonania funkcji.
komentarz 6 marca 2017 przez draghan VIP (106,230 p.)

Przedstawiasz teraz inny sposób losowania liczb. Pokazałem jedynie,że sposób w którym autor pytania skorzystał z srand() nie zawsze może się udać.

Tak, pokazałem "inny sposób", który należałoby wykorzystać, jeśli ma się zamiar zrobić coś porządnie. Sposób, w jaki autor wykorzystał srand() jest oczywiście nieprawidłowy w kontekście zastosowania i tego nie negowałem.
Moim celem było pokazanie, że Ty napisałeś nieprawdę, mówiąc o tym że iteracyjne wywołanie {srand(time(NULL)); return rand();} w efekcie da zawsze ten sam wynik.

"Chyba tyle w temacie ;)"

komentarz 6 marca 2017 przez Dexterim Dyskutant (8,370 p.)
Oczywiście mógłbym się czepiać szczegółów w Twojej wypowiedzi ale tak jak napisałem

Tyle w temacie :)
komentarz 6 marca 2017 przez draghan VIP (106,230 p.)

Oczywiście mógłbym się czepiać szczegółów w Twojej wypowiedzi ale tak jak napisałem

Ja jestem jak najbardziej za. Polemika rozwija, a tutaj nikogo tym nie krzywdzimy. Więc jeśli masz czas i ochotę, nie widzę przeciwwskazań.

komentarz 6 marca 2017 przez Dexterim Dyskutant (8,370 p.)
Owszem jak ma coś wnieść w rozwój, ale jak będziemy się czepiać za słówka to nie ma sensu problem został rozwiązany i tego należy sie trzymać :D

Podobne pytania

0 głosów
2 odpowiedzi 222 wizyt
0 głosów
2 odpowiedzi 3,215 wizyt
0 głosów
2 odpowiedzi 565 wizyt

93,028 zapytań

141,991 odpowiedzi

321,294 komentarzy

62,375 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...