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: 64109 | Odgovora: 169 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

chupcko
Ima
Beograd

Član broj: 5560
Poruke: 1133

Sajt: www.google.com


+63 Profil

icon Re: Kod koji daje neočekivani rezultat10.01.2020. u 20:00 - pre 5 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
Senior Software Engineer

Član broj: 64947
Poruke: 4434
109.72.51.*



+921 Profil

icon Re: Kod koji daje neočekivani rezultat11.01.2020. u 06:44 - pre 5 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.
press any key to continue or any other to quit....
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

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



+2707 Profil

icon Re: Kod koji daje neočekivani rezultat11.01.2020. u 08:18 - pre 5 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
Ima
Beograd

Član broj: 5560
Poruke: 1133

Sajt: www.google.com


+63 Profil

icon Re: Kod koji daje neočekivani rezultat11.01.2020. u 16:13 - pre 5 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: 8347
*.mediaworksit.net.



+2707 Profil

icon Re: Kod koji daje neočekivani rezultat13.01.2020. u 16:17 - pre 5 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: 8347
*.mediaworksit.net.



+2707 Profil

icon Re: Kod koji daje neočekivani rezultat13.01.2020. u 17:46 - pre 5 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
Ima
Beograd

Član broj: 5560
Poruke: 1133

Sajt: www.google.com


+63 Profil

icon Re: Kod koji daje neočekivani rezultat13.01.2020. u 21:03 - pre 5 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
Senior Software Engineer

Član broj: 64947
Poruke: 4434
109.72.51.*



+921 Profil

icon Re: Kod koji daje neočekivani rezultat13.01.2020. u 21:15 - pre 5 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.

press any key to continue or any other to quit....
 
Odgovor na temu

Branimir Maksimovic
Senior Software Engineer

Član broj: 64947
Poruke: 4434
109.72.51.*



+921 Profil

icon Re: Kod koji daje neočekivani rezultat13.01.2020. u 21:16 - pre 5 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

press any key to continue or any other to quit....
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

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



+2707 Profil

icon Re: Kod koji daje neočekivani rezultat13.01.2020. u 21:36 - pre 5 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
Senior Software Engineer

Član broj: 64947
Poruke: 4434
109.72.51.*



+921 Profil

icon Re: Kod koji daje neočekivani rezultat13.01.2020. u 22:13 - pre 5 meseci
Vece gluposti odavno ne procitah.
press any key to continue or any other to quit....
 
Odgovor na temu

Branimir Maksimovic
Senior Software Engineer

Član broj: 64947
Poruke: 4434
109.72.51.*



+921 Profil

icon Re: Kod koji daje neočekivani rezultat13.01.2020. u 22:41 - pre 5 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;
}


press any key to continue or any other to quit....
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

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



+2707 Profil

icon Re: Kod koji daje neočekivani rezultat14.01.2020. u 01:02 - pre 5 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
Senior Software Engineer

Član broj: 64947
Poruke: 4434
109.72.51.*



+921 Profil

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

press any key to continue or any other to quit....
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

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



+2707 Profil

icon Re: Kod koji daje neočekivani rezultat14.01.2020. u 01:17 - pre 5 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
Senior Software Engineer

Član broj: 64947
Poruke: 4434
109.72.51.*



+921 Profil

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

BTW:
imas SIZE_MAX definisanu konstantu
press any key to continue or any other to quit....
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

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



+2707 Profil

icon Re: Kod koji daje neočekivani rezultat14.01.2020. u 01:58 - pre 5 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
Senior Software Engineer

Član broj: 64947
Poruke: 4434
109.72.51.*



+921 Profil

icon Re: Kod koji daje neočekivani rezultat14.01.2020. u 02:03 - pre 5 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.
press any key to continue or any other to quit....
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

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



+2707 Profil

icon Re: Kod koji daje neočekivani rezultat14.01.2020. u 02:54 - pre 5 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
Senior Software Engineer

Član broj: 64947
Poruke: 4434
109.72.51.*



+921 Profil

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

stavi:
Code:

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


i dobija se:
Code:

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




press any key to continue or any other to quit....
 
Odgovor na temu

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

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

[ Pregleda: 64109 | Odgovora: 169 ] > FB > Twit

Postavi temu Odgovori

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