Kezdőoldal » Számítástechnika » Programozás » Ez így helyes? És miért...

Ez így helyes? És miért történik ez a furcsa dolog itt?

Figyelt kérdés

// main.cpp

#include <iostream>

#include <time.h>

#include <stdlib.h>

#include <algorithm>


using std::cout;

using std::endl;

using std::random_shuffle ;


typedef unsigned short int ushort;

typedef unsigned int uint;


int main(void) {

srand(ushort(time(0)));

ushort myArray[11];

for(ushort i = 1; i - 1 < 11; ++i)

myArray[i-1] = i;

random_shuffle(myArray, myArray+11);

for(ushort i = 0; i < 11; ++i)

cout << myArray[i] << " ";


return 0;

}


Abban asorban ahol a random_shuffle van ott a tömb elős elemének a címét és a tömb utolsó eleme után levő címet adtam át annak a függvénynek mert csak így veszi figyelembe a tömb utolsó elemét.

Miért működik ez így.


Mivel 0 kezdődik az indexelés ezért a tömb 10 eleme az utolsó.Nekem mégis 11 kell oda írnom ami már túlhaladja a tömböt.Mert csak a így veszi figyelembe a random_shuffle a tömb utolsó az az 10 elemét.Miért van ez így?


2012. nov. 23. 08:35
1 2
 1/13 A kérdező kommentje:

Legyetek szívesek még erre is válaszolni:

// main.cpp

#include <iostream>

#include <time.h>

#include <stdlib.h>

#include <algorithm>


using std::cout;

using std::endl;

using std::random_shuffle ;


typedef unsigned short int ushort;

typedef unsigned int uint;


inline const ptrdiff_t myrandom(const ptrdiff_t i) { return rand()%i; }


int main(void) {

srand(ushort(time(0)));

const ptrdiff_t (*const pMyrand) (const ptrdiff_t) = myrandom;

ushort myArray[11];


for(ushort i = 1; i - 1 < 11; ++i)

myArray[i-1] = i;


random_shuffle(myArray, myArray+11, pMyrand);

for(ushort i = 0; i < 11; ++i)

cout << myArray[i] << " ";


return 0;

}


Ebben a sorban "random_shuffle(myArray, myArray+11, pMyrand);" meghívom a myrandom függvényt aminek nem adok paraméterül semmit mégis lefordul miért?


A válasz biztosan a ptrdiff_t típusban rejlik igaz?

De akkor,hogy működik ez? Nem értem ezt a ptrdiff_t típust nagyon örülnék neki ha valaki elmagyarázná mert a talált angol leírásokból nem sikerült megértenem.


Annyit sikerült kitalálnom,hogy két mutatót kivon egymásból de ezt nem értem.

2012. nov. 23. 09:05
 2/13 A kérdező kommentje:

Olyan mintha a random_shuffle inicializálná a myrandom függvény argumentumát mindig a tömbben levő a legkisebbtől eggyel nagyobb értéktől a az egyel nagyobb legnagyobb értékig.Érdekes.


De nagyon furám működik ez a random_shuffle inicializál egy másik függvény egy argumentumát és a tömb utolsó utáni elemét kell neki átadni ahhoz hogy figyelembe vegye a tömbben levő utolsó elemet.

2012. nov. 23. 09:16
 3/13 iostream ***** válasza:
0%

Egy: tegyél több kérdőjelet, főleg a kérdéseid végére.

Kettő: MINDEN stl-es algoritmus így működik, az intervallumot az első eleme és az utolsó utáni eleme határozza meg. Különben hogy adnál meg egy üres intervallumot?

Három:

"const ptrdiff_t (*const pMyrand) (const ptrdiff_t) = myrandom;"

"random_shuffle(myArray, myArray+11, pMyrand);"


Itt nem hívod meg a myrandom függvényt, hiszen nincs mögötte a (). A függvényhívást szerintem te is tudod, hogy hogy néz ki, és nem így. A pMyrand egy függvénypointer, és mint ilyen, egy függvény címét tárolja. Azt adod át a random_shuffle-nek, és ő meg fogja ezt hívni. Semmi köze a ptrdiff típushoz, az csak egy int (vagy hasonló, long pl).

2012. nov. 23. 09:29
Hasznos számodra ez a válasz?
 4/13 A kérdező kommentje:

"Különben hogy adnál meg egy üres intervallumot?"

Ezt nem értem.

2012. nov. 23. 10:57
 5/13 iostream ***** válasza:
31%
Az algoritmusoknak úgy adod meg, hogy min dolgozzanak, hogy átadsz nekik egy intervallumot, és ezt az intervallumot az első és az utolsó utáni elemmel írod le. Na most képzeld el, hogy üres az intervallumod (ez előfordul). Hogy adod meg, úgy hogy az eddigi kódok gond nélkül fussanak tovább (kivéve néhány speciálisat, a legtöbb algoritmus gond nélkül működik üres intervallumra).
2012. nov. 23. 11:18
Hasznos számodra ez a válasz?
 6/13 A kérdező kommentje:

Nem nagyon értem még mindig,hogy mit akarsz ezzel mondani.

Bocsi. :(

2012. nov. 23. 11:24
 7/13 A kérdező kommentje:

"Az algoritmusoknak úgy adod meg, hogy min dolgozzanak, hogy átadsz nekik egy intervallumot, és ezt az intervallumot az első és az utolsó utáni elemmel írod le."


Ezt a mondatodat értem az utánalevőt nem.

2012. nov. 23. 11:25
 8/13 iostream ***** válasza:
0%

template<class InputIterator, class Function>

Function for_each(InputIterator first, InputIterator last, Function f)

{

for ( ; first!=last; ++first ) f(*first);

return f;

}


A legtöbb algoritmus hasonlóan néz ki. Addig megy, amíg a first nem egyenlő a lasttal. Ez biztosítja, hogy minden elemen végigmenjen. Emellett az üres intervallumnak milye nincs az intervallum eleje és a vége után közül?

2012. nov. 23. 12:25
Hasznos számodra ez a válasz?
 9/13 A kérdező kommentje:

"Emellett az üres intervallumnak milye nincs az intervallum eleje és a vége után közül?"


Ezt nem bírom megérteni.

De amúgy már értem hogy miért kell a tömb utolsó eleme utáni címet megadni.

De akár úgyis lehetne,hogy <= a tömb utolsó elemével és akkor nem kéne megadni a tömb utolsó utáni elemét.

2012. nov. 23. 12:55
 10/13 A kérdező kommentje:
butaságot írtam.
2012. nov. 23. 12:57
1 2

Kapcsolódó kérdések:




Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!