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

Kod koji daje neočekivani rezultat

[es] :: Art of Programming :: Kod koji daje neočekivani rezultat

Strane: < .. 1 2 3 4 5 6 7 8 ... Dalje > >>

[ Pregleda: 107568 | Odgovora: 337 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

chupcko
Negde
Beograd

Član broj: 5560
Poruke: 1141

Sajt: www.google.com


+63 Profil

icon Re: Kod koji daje neočekivani rezultat10.01.2020. u 20:00 - pre 50 meseci
A mir u svetu neces ???

Mislim pa ko te sprecava da napises sam takvu funkciju :), ti bi barem trebao toliko da znas matematiku :).
CHUPCKO
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
109.72.51.23



+1064 Profil

icon Re: Kod koji daje neočekivani rezultat11.01.2020. u 06:44 - pre 50 meseci
Mislim da i ovo sto ima i sto je opste prihvaceno treba da zadovolji. Ne verujem da sad mozes iz rukava da izvuces nesto bolje u kraktkom vremenu.
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
*.dynamic.isp.telekom.rs.



+2789 Profil

icon Re: Kod koji daje neočekivani rezultat11.01.2020. u 08:18 - pre 50 meseci
Misim da Čupko odbija da prizna da ovaj kod ima samo umetničku vrednost i da potencira na rešenjima koja su neprenosiva na Windows.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

chupcko
Negde
Beograd

Član broj: 5560
Poruke: 1141

Sajt: www.google.com


+63 Profil

icon Re: Kod koji daje neočekivani rezultat11.01.2020. u 16:13 - pre 50 meseci
Ovi programi imaju vrednost da zezaju kvazi programere :), da ih natera da se zamisle ...

Evo jos jednog davno napisanog, moze jos malo da se skrati, ali necu da kazem gde :)


Code:

char*z="\220TE0\t\30\3!\22\201\26\32*\16&2\34,4";int c,h,p;x(x){for(c
^=1;1+x--;putchar(p<6?1:c));}y(y){for(p+=9;2+y--;x(0));p-=9;}main(int
i,char*_[]){for(p=4*puts("P5 95 44 1");p--;y(1))for(y(c=i=1);i<13;i++
)for(i==7&&y(3),h=0;h<8;h+=2)x(z[i[1[_]]-48]>>((i<7&&z[67-*1[_]]&1<<i
-1)?h:(6-h))&3);}/* ./a.out 8600037000312 | xv - ; : EAN-13 by CHP */


P.S. Jesu umetnost, svaki koji sam napisao je malo remenk delo :).
CHUPCKO
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
*.mediaworksit.net.



+2789 Profil

icon Re: Kod koji daje neočekivani rezultat13.01.2020. u 16:17 - pre 50 meseci
Kome ovo treba i zašto razmišljati o tome? Meni je danas trebalo ovo:

Treba da napravim matricu nekih podataka, pri čemu se broj vrsta i broj kolona računaju na osnovu nekih ulaznih podataka. Recimo da je u pitanju C. Jeste C++, ali problem je isti.

Kako implementirati bezbednu alokaciju?
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
*.mediaworksit.net.



+2789 Profil

icon Re: Kod koji daje neočekivani rezultat13.01.2020. u 17:46 - pre 50 meseci
Code (cpp):

typedef int *intP;

// ...

size_t a,b,c;

// Ovde se negde dodeljuju vrednosti promenljivama a, b i c.

size_t rows = a;
size_t cols = b+c;
size_t size = rows*cols;
int *data = new int[size];
int **matrix = new intP[rows];

for (size_t i = 0; i<rows; ++i) {
     matrix[i] = data+cols*i;
}

Šta ovde ne valja? Recimo da se negde obrađuje izuzetak koji može da baci operator new.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

chupcko
Negde
Beograd

Član broj: 5560
Poruke: 1141

Sajt: www.google.com


+63 Profil

icon Re: Kod koji daje neočekivani rezultat13.01.2020. u 21:03 - pre 50 meseci
Pa ti si jos u fazi zaradjivanja para pisanjem koda :))), pa nemas vremena da razmisljas o umetnosti, ti prolazis kroz decije bolesti programiranja :).

A sta ne valja u kodu, otkud znam, ko zna sta je trebalo, a ko zna sta si ti uradio :)))).
CHUPCKO
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
109.72.51.23



+1064 Profil

icon Re: Kod koji daje neočekivani rezultat13.01.2020. u 21:15 - pre 50 meseci
Citat:
Nedeljko:
Code (cpp):

typedef int *intP;

// ...

size_t a,b,c;

// Ovde se negde dodeljuju vrednosti promenljivama a, b i c.

size_t rows = a;
size_t cols = b+c;
size_t size = rows*cols;
int *data = new int[size];
int **matrix = new intP[rows];

for (size_t i = 0; i<rows; ++i) {
     matrix[i] = data+cols*i;
}

Šta ovde ne valja? Recimo da se negde obrađuje izuzetak koji može da baci operator new.


pa koristis vektor vektora, i onda nema da brines.
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
109.72.51.23



+1064 Profil

icon Re: Kod koji daje neočekivani rezultat13.01.2020. u 21:16 - pre 50 meseci
Citat:
chupcko:
Pa ti si jos u fazi zaradjivanja para pisanjem koda :))), pa nemas vremena da razmisljas o umetnosti, ti prolazis kroz decije bolesti programiranja :).

A sta ne valja u kodu, otkud znam, ko zna sta je trebalo, a ko zna sta si ti uradio :)))).


U C++ koristis klase koje implementiraju to gruntovanje i brigu.
Sto se tice zaradjivanja, to ide tek kad prodjes decje bolesti :P
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
*.ptt.rs.



+2789 Profil

icon Re: Kod koji daje neočekivani rezultat13.01.2020. u 21:36 - pre 50 meseci
Neee zna, neee zna, utata!

Ne valja računanje vrednosti size. Sabiranje i množenje mogu da daju prekoračenje usled koga je rezultat besmislen. Može biti čak i nesiguran.

Evo popravke:

Code (cpp):

typedef int *intP;

// ...

size_t a,b,c;

// Ovde se negde dodeljuju vrednosti promenljivama a, b i c.

size_t rows = a;
int **matrix = nullptr;

if (c<=(~static_cast<size_t>(0))-b) {
     size_t cols = b+c;

     if (rows==0 || cols<=(~static_cast<size_t>(0))/rows) {
          size_t size = rows*cols;
          int *data = new int[size];

          matrix = new intP[rows];

          for (size_t i = 0; i<rows; ++i) {
               matrix[i] = data+i*cols;
          }
     }
}

Savetujem vam čitanje man stranica.

$ man reallocarray

Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
109.72.51.23



+1064 Profil

icon Re: Kod koji daje neočekivani rezultat13.01.2020. u 22:13 - pre 50 meseci
Vece gluposti odavno ne procitah.
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
109.72.51.23



+1064 Profil

icon Re: Kod koji daje neočekivani rezultat13.01.2020. u 22:41 - pre 50 meseci
Ajde da ne ispadnem da nista nisam napisao:

Code:

#include <iostream>
#include <assert.h>

const unsigned MAX_MATRIX_SIZE = 1000;
int main() {
    unsigned cols = 5;
    unsigned rows = 10;
    assert(rows*cols < MAX_MATRIX_SIZE);
    int* arr = new int[rows*cols];
    int (&matrix)[rows][cols] = *decltype(&matrix)(arr);
    for (int i = 0;i<rows;++i){
        for (int j = 0;j<cols;++j){
            matrix[i][j]=i+j;
        }
    }
    for (int i = 0;i<rows;++i){
        for (int j = 0;j<cols;++j){
            std::cout<<matrix[i][j]<<"\t";
        }
        std::cout<<"\n";
    }
    delete[] arr;
}

 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
*.dynamic.isp.telekom.rs.



+2789 Profil

icon Re: Kod koji daje neočekivani rezultat14.01.2020. u 01:02 - pre 50 meseci
Stavi size_t umesto unsigned i 467443687 i 39463029637 umesto 5 i 10, pa da vidimo kako radi.



[Ovu poruku je menjao Nedeljko dana 14.01.2020. u 02:15 GMT+1]
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
Prikačeni fajlovi
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
109.72.51.23



+1064 Profil

icon Re: Kod koji daje neočekivani rezultat14.01.2020. u 01:13 - pre 50 meseci
Dobro, onda pojedinacno rows < MAX_SIZE && cols < MAX_SIZE
prevideo sam da mnozenje radi wraparound.
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
*.dynamic.isp.telekom.rs.



+2789 Profil

icon Re: Kod koji daje neočekivani rezultat14.01.2020. u 01:17 - pre 50 meseci
A šta ako imaš 64GB RAM-a i treba ponekad da imaš 2 reda sa 8e9 kolona ili 8e9 redova sa 2 kolone, kako kad?

Rekao si da veću glupost odavno nisi pročitao, a rešenje ti je pogrešno.

Sajber napadi se često zasnivaju na nepokrivenim slučajevima.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
109.72.51.23



+1064 Profil

icon Re: Kod koji daje neočekivani rezultat14.01.2020. u 01:30 - pre 50 meseci
U slucaju da ti treba toliko podataka prvo proveris da li imas dovoljno rama na raspolaganju.

BTW:
imas SIZE_MAX definisanu konstantu
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
*.dynamic.isp.telekom.rs.



+2789 Profil

icon Re: Kod koji daje neočekivani rezultat14.01.2020. u 01:58 - pre 50 meseci
Na koji način ćeš da izvršiš bezbednu alokaciju?

Naravno da alokacija neće uspeti ako nema dovoljno slobodne memorije. Taj slučaj se posebno obrađuje.

Međutim, ti moraš imati algoritam alokacije koji u slučaju da ima dovoljno slobodne memorije ispravno alocira, a u suprotnom ne alocira i to detektuje.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
109.72.51.23



+1064 Profil

icon Re: Kod koji daje neočekivani rezultat14.01.2020. u 02:03 - pre 50 meseci
Problem je overcommit. Alokacija ce uspeti cak i onda ako nema dovoljno memorije pa ce puci na prvom pristupu.
Bezbednu alokaciju mozes uraditi samo od sistema do sistema zbog toga.

edit:
overcommit ima svoju dobru stranu, pogotovo na serverima ali znatno otezava hendlovanje
alokacije. I da ne mora odmah da pukne nego u bilo kom trenutku kada sistem ostane bez
slobodnog prostora.
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
*.dynamic.isp.telekom.rs.



+2789 Profil

icon Re: Kod koji daje neočekivani rezultat14.01.2020. u 02:54 - pre 50 meseci
Rekao bih da ovo radi:
Code (c):

#include <inttypes.h>
#include <stdlib.h>
#include <stdio.h>

typedef int *intP;

typedef struct
{
    size_t rows;
    size_t cols;
    int **data;
} Matrix;

int add(size_t *ret, size_t x, size_t y)
{
    if (y<SIZE_MAX-x) {
        *ret = x+y;
       
        return 0;
    }
   
    return 1;
}

int mul(size_t *ret, size_t x, size_t y)
{
    if (x==0 || y<SIZE_MAX/x) {
        *ret = x*y;
       
        return 0;
    }
   
    return 1;
}

enum Error
{
    OK,
    FAIL,
    NO_OUT_ARG
};

int init_mat(Matrix *matrix, size_t rows, size_t cols)
{
    size_t size;
    int *data;    
   
    if (matrix==NULL) {
        return NO_OUT_ARG;
    }
   
    if (mul(&size, rows, cols)==OK) {
        data = (int*) malloc(size*sizeof(int));
       
        if (data) {
            matrix->data = (intP*) malloc(rows*sizeof(intP));
           
            if (matrix->data) {
                for (size_t i = 0; i<rows; ++i) {
                    matrix->data[i] = data+cols*i;
                }
               
                matrix->rows = rows;
                matrix->cols = cols;
               
                return OK;
            } else {
                free(data);
            }
        }
    } else {
        fprintf(stderr, "%lu * %lu is not %lu\n", rows, cols, rows*cols);
    }
   
    matrix->rows = 0;
    matrix->cols = 0;
    matrix->data = NULL;
   
    return FAIL;
}

int done_mat(Matrix *matrix) {
    if (matrix==NULL) {
        return NO_OUT_ARG;
    }
   
    free(matrix->data[0]);
    matrix->data = NULL;
    matrix->rows = 0;
    matrix->cols = 0;
}

int main() {
    size_t a = 39463029637lu, b = 467443680lu, c = 7lu;
    size_t cols;
    size_t rows = a;
    Matrix matrix;
   
    if (add(&cols, b, c)==OK) {
        if (init_mat(&matrix, rows, cols)==OK) {
            for (size_t i = 0; i<rows; ++i) {
                for (size_t j = 0; j<cols; ++j) {
                    matrix.data[i][j] = i+j;
                }
            }
           
            for (size_t i = 0; i<rows; ++i) {
                for (size_t j = 0; j<cols; ++j) {
                    if (j) {
                        printf(" ");
                    }
                   
                    printf("%d", matrix.data[i][j]);
                }
               
                printf("\n");
            }
           
            done_mat(&matrix);
        }
    } else {
        fprintf(stderr, "%lu + %lu is not %lu\n", b, c, b+c);
    }
}

Naravno, radi šta treba da radi. Ako ne može da se alocira, to se detektuje, a inače se alocira kako treba.

Nemoj da se vadiš.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
109.72.51.23



+1064 Profil

icon Re: Kod koji daje neočekivani rezultat14.01.2020. u 03:41 - pre 50 meseci
Ne radi.

stavi:
Code:

   size_t a = 100000000, b = 1000000000, c = 1000000000;


i dobija se:
Code:

~/examples >>> ./a.out                                                                                                                                                                                                      
~/examples >>>           



 
Odgovor na temu

[es] :: Art of Programming :: Kod koji daje neočekivani rezultat

Strane: < .. 1 2 3 4 5 6 7 8 ... Dalje > >>

[ Pregleda: 107568 | Odgovora: 337 ] > FB > Twit

Postavi temu Odgovori

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