Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 337 odgovora
  • 168.535 pregleda

Najnovija ↓

Re: Kod koji daje neočekivani rezultat 11.01.2020. u 09:18 · pre 82 meseca #63
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.
Potpis
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
Re: Kod koji daje neočekivani rezultat 11.01.2020. u 17:13 · pre 82 meseca #64
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 :).
Potpis
CHUPCKO
Re: Kod koji daje neočekivani rezultat 13.01.2020. u 17:17 · pre 82 meseca #65
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?
Potpis
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
Re: Kod koji daje neočekivani rezultat 13.01.2020. u 18:46 · pre 82 meseca #66
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.
Potpis
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
Re: Kod koji daje neočekivani rezultat 13.01.2020. u 22:03 · pre 82 meseca #67
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 :)))).
Potpis
CHUPCKO
Re: Kod koji daje neočekivani rezultat 13.01.2020. u 22:15 · pre 82 meseca #68
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.
Re: Kod koji daje neočekivani rezultat 13.01.2020. u 22:16 · pre 82 meseca #69
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
Re: Kod koji daje neočekivani rezultat 13.01.2020. u 22:36 · pre 82 meseca #70
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
Potpis
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
Re: Kod koji daje neočekivani rezultat 13.01.2020. u 23:41 · pre 82 meseca #72
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;
}

Re: Kod koji daje neočekivani rezultat 14.01.2020. u 02:02 · pre 82 meseca
izmenjeno 1 put, poslednji put Nedeljko 14.01.2020. u 02:15
  1. Nedeljko14.01.2020. u 02:15zapis iz teksta poruke
#73
Stavi size_t umesto unsigned i 467443687 i 39463029637 umesto 5 i 10, pa da vidimo kako radi.
Potpis
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
Re: Kod koji daje neočekivani rezultat 14.01.2020. u 02:17 · pre 82 meseca #75
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.
Potpis
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
Re: Kod koji daje neočekivani rezultat 14.01.2020. u 02:58 · pre 82 meseca #77
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.
Potpis
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
Re: Kod koji daje neočekivani rezultat 14.01.2020. u 03:03 · pre 82 meseca #78
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.
Re: Kod koji daje neočekivani rezultat 14.01.2020. u 03:54 · pre 82 meseca #79
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š.
Potpis
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
Re: Kod koji daje neočekivani rezultat 14.01.2020. u 04:41 · pre 82 meseca #80
Ne radi.

stavi:
Code:

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


i dobija se:
Code:

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



Odgovori
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme