Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Problem s povratnom vrijednosti funkcije

[es] :: C/C++ programiranje :: Problem s povratnom vrijednosti funkcije

[ Pregleda: 2289 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

--ja--

Član broj: 4387
Poruke: 232
*.adsl.net.t-com.hr.

ICQ: 132872590


+3 Profil

icon Problem s povratnom vrijednosti funkcije20.06.2009. u 23:43 - pre 179 meseci
Pokušavam generirati 8-bajtni niz slučajnih brojeva, međutim imam problem da mi povratna vrijednost funkcije ne odgovara onome što je u samoj funkciji izgenerirano. Gdje je problem?

Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <stdint.h>

uint64_t getChallenge() {
    uint64_t buffer;
    int generated;
    int bytesLeft = sizeof(buffer);
    
    int copySize = sizeof(generated) > sizeof(buffer) ? sizeof(buffer) : sizeof(generated);

    while (bytesLeft > 0) {
        generated=rand();
        if (copySize > bytesLeft) {
            copySize = bytesLeft;
        }
        printf("bytesleft %d : generated: %d : copysize %d : oduzeto %d\n",
                bytesLeft, generated, copySize, (sizeof(buffer) - bytesLeft));
        memcpy((&buffer + (sizeof(buffer) - bytesLeft)), &generated, copySize);
        bytesLeft -= copySize;

    }
    printf ("FUNK: %d %d\n", (unsigned int) buffer, (unsigned int) * (&buffer + 4));
    return buffer;    
}

int main(int argc, char *argv[]) {
    uint64_t tmp;
    int i;

    srand(time(NULL));
    for (i = 0; i < 1000; i++) {
        tmp = getChallenge();
        printf("MAIN: %d %d\n", (unsigned int) tmp, (unsigned int) *(&tmp + 4));
    }
}


Napomena: Na sistemu na kojem testiram sizeof(int) = 4, odatle onaj &tmp+4 u printf funkciji. Taj poziv naravno tu neće stajati jednom kad funkcija proradi kako treba.

Unaprijed zahvaljujem!
Marko
http://www.dropbox.com/referrals/NTQ0MTI2NDc5
https://www.agronomija.info/
Failure is not an option. It comes bundled with your Microsoft product.
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Problem s povratnom vrijednosti funkcije21.06.2009. u 16:50 - pre 179 meseci
Napravio si duplu grešku, s tim što u funkciji dva minusa prividno daju plus (ali samo prividno). Kada inkrementiraš pointere (kao što su &buffer i &tmp) onda ih inkrementiraš za veličinu njihovog tipa, a ne za jedan bajt.

Prva greška je kad radiš memcpy, gde kopiraš drugi random na potpuno neko levo mesto (vidi u memoriji dok debaguješ korak po korak).
Druga greška je kad ispisuješ buffer u funkciji, gde lepo pokupiš drugi random sa njegovog potpuno levog mesta (i prividno dobiješ ono što se očekuje).
Treća greška je kad ispisuješ tmp u main-u, gde se na gore navedenom potpuno levom mestu nalazi potpuno levi broj.

memcpy treba da izgleda ovako:
Code:
memcpy(((char*)&buffer + (sizeof(buffer) - bytesLeft)), &generated, copySize);

printf treba da izgleda ovako:
Code:
printf ("FUNK: %d %d\n", (unsigned int) buffer, *((unsigned int*)&buffer + 1));

ili ovako, ako printf podržava I64 ekstenziju (Visual Studio podržava):
Code:
printf ("FUNK: %I64x\n", buffer);


I još jedna napomena, rand funkcija ne koristi ceo int opseg, nego vraća maksimalnu vrednost RAND_MAX=0x7fff.
 
Odgovor na temu

--ja--

Član broj: 4387
Poruke: 232
*.adsl.net.t-com.hr.

ICQ: 132872590


+3 Profil

icon Re: Problem s povratnom vrijednosti funkcije21.06.2009. u 18:41 - pre 179 meseci
Aaaa kreten! Eto šta se dogodi kad nešto dugo ne koristiš. Naravno da znam, sad kad kažeš, da se uvećavanjem pointera za jedan adresa na koju pokazuje pomiče za sizeof tog tipa, pa to sam non stop koristio za iteriranje po kojekakvim poljima.
E sad castati to u (char *) da dobijem pomak po bajtovima se vjerojatno ne bih sjetio.

Što se tiče RAND_MAX, na mom sistemu on iznosi 0x7FFFFFFF, ali čitajući sinoć po netu saznao sam da je najviše što smijem očekivati od rand funkcije 15 bitova.

Tu generiranu vrijednost neću nigdje ispisivati, petljao sam s printf-ovima samo da vidim što se događa. Svejedno, dobro je znati kako ispisati ako ubuduće zatreba.

Puno hvala na pomoći!
http://www.dropbox.com/referrals/NTQ0MTI2NDc5
https://www.agronomija.info/
Failure is not an option. It comes bundled with your Microsoft product.
 
Odgovor na temu

[es] :: C/C++ programiranje :: Problem s povratnom vrijednosti funkcije

[ Pregleda: 2289 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.