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

przekazywanie tablic między funkcjami

Object Storage Arubacloud
0 głosów
477 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 (194,920 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 181 wizyt
0 głosów
2 odpowiedzi 2,991 wizyt
0 głosów
2 odpowiedzi 450 wizyt

92,547 zapytań

141,388 odpowiedzi

319,505 komentarzy

61,931 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...