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.539 pregleda

Najnovija ↓

Re: Kod koji daje neočekivani rezultat 25.01.2020. u 12:52 · pre 82 meseca #101
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.
Potpis
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
Sviđa mi se1
Re: Kod koji daje neočekivani rezultat 25.01.2020. u 19:46 · pre 82 meseca #103
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 > 
Potpis
CHUPCKO
Re: Kod koji daje neočekivani rezultat 25.01.2020. u 20:19 · pre 82 meseca #104
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.
Potpis
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
Re: Kod koji daje neočekivani rezultat 25.01.2020. u 23:46 · pre 82 meseca #106
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;
}
 
Potpis
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
Re: Kod koji daje neočekivani rezultat 25.01.2020. u 23:51 · pre 82 meseca #107
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.
Potpis
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
Re: Kod koji daje neočekivani rezultat 26.01.2020. u 09:39 · pre 82 meseca #108
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;
}
 
Potpis
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
Re: Kod koji daje neočekivani rezultat 26.01.2020. u 11:32 · pre 82 meseca #109
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.
Potpis
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
Re: Kod koji daje neočekivani rezultat 26.01.2020. u 14:09 · pre 82 meseca #110
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).
Re: Kod koji daje neočekivani rezultat 26.01.2020. u 15:08 · pre 82 meseca #111
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.
Potpis
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
Re: Kod koji daje neočekivani rezultat 26.01.2020. u 16:02 · pre 82 meseca #112
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.
Re: Kod koji daje neočekivani rezultat 26.01.2020. u 17:11 · pre 82 meseca #113
template se uklapa u OOP, kao i prosti tipovi.

Daj mi use case za unije u C++ programima, a da nije legacy.
Potpis
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
Re: Kod koji daje neočekivani rezultat 26.01.2020. u 17:28 · pre 82 meseca #114
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 :)
Potpis
CHUPCKO
Re: Kod koji daje neočekivani rezultat 26.01.2020. u 18:51 · pre 82 meseca #115
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.
Potpis
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
Re: Kod koji daje neočekivani rezultat 26.01.2020. u 18:55 · pre 82 meseca #116
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.
Potpis
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
Re: Kod koji daje neočekivani rezultat 27.01.2020. u 01:24 · pre 82 meseca #118
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?
Potpis
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
Re: Kod koji daje neočekivani rezultat 27.01.2020. u 14:18 · pre 82 meseca #119
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
Re: Kod koji daje neočekivani rezultat 27.01.2020. u 15:54 · pre 82 meseca #120
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.
Potpis
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
Odgovori
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme