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 9 10 ... Dalje > >>

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

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Nedeljko
Nedeljko Stefanović

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



+2789 Profil

icon Re: Kod koji daje neočekivani rezultat25.01.2020. u 11:52 - pre 50 meseci
Citat:
Branimir Maksimovic: Nedeljko zaista ti nedostaje elementarna logika. Zemlja pod sankcijama, u ratu, a ti ces da postujes zakone nasih neprijatelja
tim pre sto je ono sto radis upravo zbog postupaka nasih neprijatelja. Smesno. Povlacim se iz diskusije.

Ono što ti ne shvataš je da ni u jednoj zemlji, pa ni našoj, ne važe zakoni drugih zemalja, već zakoni te zemlje. Ja pričam o tome da je krekovanje i tada bilo zabranjeno zakonima naše zemlje.

Američki zakoni nikada nisu važili kod nas jer je druga jurisdikcija u pitanju. Međutim, naši zakoni su tada takođe zabranjivali krekovanje.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

MajorFatal
Milija Jakic
opravljam oluke, 1337LAB
Bg

Član broj: 36595
Poruke: 1326
*.dynamic.vipmobile.rs.



+557 Profil

icon Re: Kod koji daje neočekivani rezultat25.01.2020. u 12:08 - pre 50 meseci
U potpunosti neočekivan rezultat da neko pristane na rečnik u kom "mi" imamo "neprijatelje" :)
Nemoj da pricas?
 
Odgovor na temu

chupcko
Negde
Beograd

Član broj: 5560
Poruke: 1141

Sajt: www.google.com


+63 Profil

icon Re: Kod koji daje neočekivani rezultat25.01.2020. u 18:46 - pre 50 meseci
Ovde je jedino neocekivana neozbiljnost nekih ucesnika diskusije. Nema vise primera koda koji daju neoceivani rezultat? Sve se svelo na standard :)

Evo vam nesto sto ce vas strucnjake da malo zbuni :))

Code:

[chupcko@main] 0 /home/chupcko > cat a.c 
#include <stdio.h>

int main(void)
{
  puts(sizeof 'a' == sizeof(char) ? "C++" : "C");
  return 0;
}
[chupcko@main] 0 /home/chupcko > gcc -o a a.c
[chupcko@main] 0 /home/chupcko > ./a
C
[chupcko@main] 0 /home/chupcko > g++ -o a a.c
[chupcko@main] 0 /home/chupcko > ./a
C++
[chupcko@main] 0 /home/chupcko > 

CHUPCKO
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

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



+2789 Profil

icon Re: Kod koji daje neočekivani rezultat25.01.2020. u 19:19 - pre 50 meseci
Pa, ovde je isto u pitanju samo standard.

Bukvalna vrednost 'a' je po C++ standardu tipa char, a po C standardu tipa int. Samo, za to se koristi makro __cplusplus.
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 rezultat25.01.2020. u 21:36 - pre 50 meseci
Za sta, za utvrdjivanje koliko je velika konstanta u memoriji? Zar to ne znaci da C++ nije nadskup C :), veoma neocekivano ...
CHUPCKO
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

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



+2789 Profil

icon Re: Kod koji daje neočekivani rezultat25.01.2020. u 22:46 - pre 50 meseci
Pa, to se zna odavno da C++ nije nadskup od C-a. Ti si dao primer koji se kompajlira sa oba kompajlera, ali daju različite rezultate. Evo primera koji se kompajlira C kompajlerom, ali ne i C++ kompajlerom.
Code (c):

void f()
{
}

int main()
{
     f(5);

     return 0;
}
 


Najstandardniji primer koji se kompajlira sa oba kompajlera, a daje različite rezultate je:
Code (cpp):

#include <stdio.h>

#ifdef __cplusplus
#include <iostream>
#endif

int main()
{
#ifdef __cplusplus
     std::cout << "C++" << std::endl;
#else
     printf("C\n");
#endif
     
     return 0;
}
 

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
*.dynamic.isp.telekom.rs.



+2789 Profil

icon Re: Kod koji daje neočekivani rezultat25.01.2020. u 22:51 - pre 50 meseci
Evo još jednog
Code (c):

#include <stdio.h>

#define __cplusplus

int main()
{
#ifdef __cplusplus
     printf("C++\n");
#else
     printf("C\n");
#endif
     
     return 0;
}
 


#define ne radi, tako da kada se kompajlira bilo kojim kompajlerom, rezultat je ispravan.

Code (cpp):

#include <stdio.h>

#undef __cplusplus

int main()
{
#ifdef __cplusplus
     printf("C++\n");
#else
     printf("C\n");
#endif
     
     return 0;
}
 


#undef ne radi, tako da kada se kompajlira bilo kojim kompajlerom, reyultat je ispravan.
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
*.dynamic.isp.telekom.rs.



+2789 Profil

icon Re: Kod koji daje neočekivani rezultat26.01.2020. u 08:39 - pre 50 meseci
Evo još jednog najstandardnijeg primera koda koji se kompajlira C kompajlerom, a ne kompajlira C++ kompajlerom.

Code (c):

int main()
{
#ifdef __cplusplus
#error Ne kompajliraj C++ kompajlerom, vec C kompajlerom!
#endif
     
     return 0;
}
 

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
*.dynamic.isp.telekom.rs.



+2789 Profil

icon Re: Kod koji daje neočekivani rezultat26.01.2020. u 10:32 - pre 50 meseci
Međutim, chupcko hoće primere gde se ne koristi makro __cplusplus. Rešenje je Google.

Write a C program that won't compile in C++ - GeeksforGeeks

Write a program that produces different results in C and C++ - GeeksforGeeks

Ipak, u svim tim primerima je C++ "u pravu", tj. bolje je ono što predviđa C++. Dakle, radi se o popravkama C-a, a ne o žrtvovanju ičega.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

Burgos
Nemanja Borić
Amazon Web Services
Berlin

Član broj: 12484
Poruke: 1947
2a02:8109:b6bf:d57a:19dc:fa7..

Sajt: stackoverflow.com/users/1..


+480 Profil

icon Re: Kod koji daje neočekivani rezultat26.01.2020. u 13:09 - pre 50 meseci
Postoje primeri nečega što je definisano u C-u, a nije u C++-u, i većina bi rekla da je "bolje" u C-u. Najpoznatiji primer je type punning kroz unije: u C-u jasno definisano, dok U C++-u ne - jasna su pravila kada počinje lifetime objekta, čitanje neaktivnog člana unije nije takav slučaj. Kao i reinterpret_cast niza karaktera pročitanog iz socketa u objekat radi deserijalizacije (vidi predlog za std::bless i promene u C++20).
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

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



+2789 Profil

icon Re: Kod koji daje neočekivani rezultat26.01.2020. u 14:08 - pre 50 meseci
Unije nisu objektno orjentisane i ne bi ih trebalo koristiti u C++ programima, osim za tipove koji nisu klasni (imaju trivijalan podrazumevani konstruktor, destruktor, bla bla) kao zamenu za reinterpret_cast, mada postoji reinterpret_cast kao zamena za unije.

Unije su tu samo radi obezbeđivanja kompatibilnosti unazad sa C kodom.

reinterpret_cast u objekat? Ne bi valjalo. Serijalizaciju i deserijalizaciju treba rešavati drugačije.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

Burgos
Nemanja Borić
Amazon Web Services
Berlin

Član broj: 12484
Poruke: 1947
2a02:8109:b6bf:d57a:19dc:fa7..

Sajt: stackoverflow.com/users/1..


+480 Profil

icon Re: Kod koji daje neočekivani rezultat26.01.2020. u 15:02 - pre 50 meseci
O tome se radi, type punning preko unije nije definisan čak ni za trivijalne tipove. Inače, ni templates, a ni primitivni tipovi nisu objektno orijentisani, pa se koriste :-). Unija ima svoje mesto - primitivna std::variant, i to je to.
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

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



+2789 Profil

icon Re: Kod koji daje neočekivani rezultat26.01.2020. u 16:11 - pre 50 meseci
template se uklapa u OOP, kao i prosti tipovi.

Daj mi use case za unije u C++ programima, a da nije legacy.
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 rezultat26.01.2020. u 16:28 - pre 50 meseci
Kao po obicaju Nedeljko ne kapira ono sto je bitno, u onom kodu je neocekivano da C nema konstante koje su tipa char :) barem stariji C.

A C++ i gluposti koje rade da nesto zabrane a opet omoguce je glupost koja ce ga ubiti kao jezik...
Unije postoje sa razlogom, pa cak ih je i paskal imao :) E sada sto zivite u doba kada je 32Gb memorije prosek, ko je vama kriv :)

CHUPCKO
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

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



+2789 Profil

icon Re: Kod koji daje neočekivani rezultat26.01.2020. u 17:51 - pre 50 meseci
Citat:
chupcko: Kao po obicaju Nedeljko ne kapira ono sto je bitno, u onom kodu je neocekivano da C nema konstante koje su tipa char :) barem stariji C.

Citat:
Nedeljko: Pa, ovde je isto u pitanju samo standard.

Bukvalna vrednost 'a' je po C++ standardu tipa char, a po C standardu tipa int. Samo, za to se koristi makro __cplusplus.

Nije mi baš jasno šta to Nedeljko ne kapira, ali chupcko ne kapira da C ima konstante koje su tipa char i da se pišu ovako:
Code (c):

const char ch = 'a';

a da je 'a' zapravi literal. U C-u će da radi i ovo:
Code (c):

(char)'a'

Unija je problematična jer nema garancije da se ispravno čita ono što tamo piše, odnosno da čitaš ispravno polje. Naravno, to može biti odgovornost programera. Kod OOP-a (za koji je C++ pravljen) je poenta da se što više provera vrši od strane sistema.

Za štednju memorije služi nasleđivanje. Niko ti ne brani da imaš pokazivač na strukturu tipa A, a iz te strukture izvedene razne druge strukture, pa da identifikuješ tip itd.

Navedi use case gde je unija značajna, a da imaš OOP.

Oćeš da rešavaš probelem C-ovski? Nema problema. One unije koje rade u C programima, radiće i u C++ programima.
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
*.dynamic.isp.telekom.rs.



+2789 Profil

icon Re: Kod koji daje neočekivani rezultat26.01.2020. u 17:55 - pre 50 meseci
Inače, postoji način da se napiči full featured OOP unija u C++ programu, ako se baš hoće, samo ima malo više da se kuca.
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 rezultat26.01.2020. u 19:57 - pre 50 meseci
Bezim iz diskusuje, previse gluposti se prica :)

Kada bude neki zanimljivi kod koji daje neocekivani rezultat ...
CHUPCKO
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

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



+2789 Profil

icon Re: Kod koji daje neočekivani rezultat27.01.2020. u 00:24 - pre 50 meseci
Bežiš ti iz diskusije iz drugih razloga.

Sada nešto što ne piše u standardu C-a. Najpre izvršimo ovaj program:
Code (c):

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

int main()
{
    size_t size = 5000000000UL;
     char *buf = (char*)malloc(size);
     
     for (size_t i = 0; i<size; ++i) {
          buf[i] = 255;
     }
     
    return 0;
}

Nakon što on završi sa radom, izvrši se ovaj program
Code (c):

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

int main()
{
    size_t size = 5000000000UL;
     char *buf = (char*)malloc(size);
     
     for (size_t i = 0; i<size; ++i) {
          if (buf[i] != 0) {
               printf("Nonzero byte found!\n");
               
               break;
          }
     }
     
    return 0;
}

Kako to da drugi program nije našao ništa od bajtova sa vrednošću 255, koje je posejao po memoriji prvi program?

Dakle, da pojasnim

$ cat fill.c
#include <stdlib.h>
#include <stdio.h>

int main()
{
size_t size = 5000000000UL;
char *buf = (char*)malloc(size);

for (size_t i = 0; i<size; ++i) {
buf[ i ] = 255;
}

return 0;
}
$ cat zero.c
#include <stdlib.h>
#include <stdio.h>

int main()
{
size_t size = 5000000000UL;
char *buf = (char*)malloc(size);

for (size_t i = 0; i<size; ++i) {
if (buf[ i ] != 0) {
printf("Nonzero byte found!\n");

break;
}
}

return 0;
}
$ gcc -o fill fill.c
$ gcc -o zero zero.c
$ ./fill
$ ./zero
$


Dakle, nije došlo do ispisa poruke "Nonzero byte found!". Zašto?
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

Burgos
Nemanja Borić
Amazon Web Services
Berlin

Član broj: 12484
Poruke: 1947
54.239.6.*

Sajt: stackoverflow.com/users/1..


+480 Profil

icon Re: Kod koji daje neočekivani rezultat27.01.2020. u 13:18 - pre 50 meseci
Citat:
Nedeljko:

Navedi use case gde je unija značajna, a da imaš OOP.


Pogledaj implementaciju Boost.Variant2:

https://github.com/boostorg/va...ude/boost/variant2/variant.hpp

Naravno da je moguća potpuno ista implementacija koristeći rekurzivno nasleđivanje kroz template parameter pack, samo što je onda veličina objekta jednaka sumi svih objekata + pading. Unija dolazi vrlo prigodna kao primitivni alat za građenje alata sa višim nivoom abstrakcije.

Citat:

Oćeš da rešavaš probelem C-ovski? Nema problema. One unije koje rade u C programima, radiće i u C++ programima.

[/quote]

Netačno, što je i poenta mog posta. Ovo radi u C-u, a nedefinisano je u C++-u:

Code:
float InverseSquareRoot(float x)
{
    union
    {
        float as_float;
        int32_t as_int;
    };
    float xhalf = 0.5f*x;
    as_float = x;
    as_int = 0x5f3759df - (as_int>>1);
    as_float = as_float*(1.5f - xhalf*as_float*as_float);
    return as_float;
}


https://stackoverflow.com/a/17799428/133707
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

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



+2789 Profil

icon Re: Kod koji daje neočekivani rezultat27.01.2020. u 14:54 - pre 50 meseci
Kod mene se ovo ne kompajlira ni gcc-om, ni clang-om. Kompajliranjem bilo sa g++, bilo sa clang++, radi savršeno.

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

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

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

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

Postavi temu Odgovori

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