DevProTalk

DevProTalk (http://www.devprotalk.com/index.php)
-   Programiranje (http://www.devprotalk.com/forumdisplay.php?f=23)
-   -   C++, alociranje memorije za strukturu (http://www.devprotalk.com/showthread.php?t=9477)

Dragi Tata 20. 12. 2010. 18:52

Citat:

Originalno napisao nn.nn (Napišite 93218)
^ A evo još jednog: http://translate.google.com/ :)

Претпостављам да се зезаш али да те неко не би схватио озбиљно, транслитерација и превођење су две сасвим различите ствари.

jablan 20. 12. 2010. 19:25

^ Izgleda šašavo, ali radi (hint: "prevedi" ćirilični tekst sa srpskog na hrvatski).

http://translate.google.com/#sr|hr|%D0%B4%D1%80%D0%B0%D0%B3%D0%B8%20%D1%82%D0% B0%D1%82%D0%B0



Dragi Tata 20. 12. 2010. 20:56

Citat:

Originalno napisao jablan (Napišite 93221)

Ето ти разлике између превођења и транслитерације :)

japan 20. 12. 2010. 21:09

A sa srpskog na srpski + Read phonetically? Ja bih rekao da je to transliteracija...?

bluesman 20. 12. 2010. 23:51

khm, khm ... "C++, alociranje memorije za strukturu"

misko_ 21. 12. 2010. 09:30

Citat:

Originalno napisao jablan (Napišite 93191)
Međutim, uvek možeš da "napipaš" vrednost polovljenjem intervala, pošto malloc vraća NULL ako ne uspe da alocira zadatu veličinu.

Da malloc možda i da, ali new C++ operator ne radi tako.
I to me zbunjuje jer i mnogim knjiga piše da je.
Evo što sam otkrio.

Prvo kod kompajiram sa g++ na RHEL sa:
[sasa@localhost my_code]$ g++ test.cpp -g -o test && ./test

Napisao sam sljedeći code:
Kôd:

#include <iostream>

int main(int argc, char *argv[])
{
    double * array;
    array = NULL;
    printf("PRVI ALLOC\n");

    array = new double[1000000000];

    if( NULL == array )
    {
        printf("Nije uspio alocirati.\n");
    }
}

Program se uredno komapjlira, ali kada ga pokrenemo dobijem ovo
Kôd:

[sasa@localhost my_code]$ g++ test.cpp -g -o test && ./test
PRVI ALLOC
terminate called after throwing an instance of 'std::bad_alloc'
  what():  St9bad_alloc
Aborted

Iz ovoga zakljucujem da se ovako treba raditi provjera alocirane memorije u C++.
Kôd:

#include <iostream>
int main(int argc, char *argv[])
{
    double * array;
    array = NULL;
    printf("PRVI ALLOC\n");

    try
    {
        array = new double[1000000000];
    }
    catch( std::bad_alloc )
    {
        printf("array ALOCIRANJE NIJE USPIJELO\n");
        exit( -5 );
    }
    catch(...)
    {
        printf("NESTO NIJE USPIJELO\n");
    }
}

Kada ovaj kode pokrenem i kompajliram, dobijem:
Kôd:

[sasa@localhost my_code]$ g++ test.cpp -g -o test && ./test
PRVI ALLOC
array ALOCIRANJE NIJE USPIJELO

U dosta knjiga će se naći da se nakon new treba sa if( NULL == p ) prvojeriti da li je memorija stvarno alocirana.
Iz ovoga moga eksperimenta je jasno da je to koncept koji više ne funkcionira.

Mene sada zanima, od kada se to izmjenilo?
I ako netko ima još kakvih dodatnih informacija može ih iznjeti u vezi ove tematike.

misko_ 21. 12. 2010. 09:36

Citat:

Originalno napisao jablan (Napišite 93212)
Off Topic: BTW, čovek Splićanin, a ti razvezao ćirilicom... :)

Off Topic:
snalazim se sa http://www.cirilicalatinica.com/
P.S. ja sam bio prva gneracija kada su izbacili cirilicu iz hrvatskih skola, pa se sada mucim, kako su me zeznuli.

Dragi Tata 21. 12. 2010. 16:37

OK, prelazim na latinicu da se čovek ne muči (BTW, originalan post je od nekog iz Smedereva - kasno sam ukapirao da dve različite osobe postavljaju pitanja u istoj temi).

Ukratko, objašnjenje je sledeće: operator new je vraćao NULL ako nema dovoljno memorije u davna vremena pre standardizacije jezika (1998) i knjige koje pominješ su verovatno napisane pre tog vremena. Danas new baca bad_alloc ako nema dovoljno memorije, kao što si i sam otkrio. Ako želiš da i dalje koristiš stari način sa NULL, onda moraš da radiš ovako:

Kôd:

array = new (nothrow) double[1000000000];
Obrati pažnju na "nothrow".

Dragi Tata 21. 12. 2010. 16:40

Citat:

Originalno napisao bluesman (Napišite 93228)
khm, khm ... "C++, alociranje memorije za strukturu"

Гледај ти своја посла - видиш да се лепо забављамо овде :D

morando 12. 04. 2011. 20:04

Da malo razbudim ovaj forum, a i da ne otvaram novu temu pošto je već vezano.:D

Imam problem sa kodom:
Kôd:

#include <iostream>
#include <new>

int main()
{
        int* iptr = new std::nothrow int;
        *iptr = 4;

        std::cout << "*iptr = " << *iptr << std::endl;

        std::cout << "Press enter to exit...";
        std::cin.get();
        return 0;
}

Koristim MVS express 2010 i na ovaj kod dobijam output:
Citat:

...main.cpp(6): error C2061: syntax error : identifier 'nothrow'
Čitao sam text sa ove stranice i lepo piše da treba samo uključiti "new" header gde je "nothrow" definisan. Gde sam pogrešio?

EDIT: Rešio, nisam stavio u zagrade.:1054:


Vreme je GMT +2. Trenutno vreme je 08:52.

Powered by vBulletin® Verzija 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Copyright © DevProTalk. All Rights Reserved.

Mišljenja, saveti, izjave, ponude ili druge informacije ili sadržaji nastali na Sajtu su vlasništvo onoga ko ih je kreirao, a ne DevProTalk.com, tako da ne morate da se oslanjate na njih.
Autori poruka su jedini odgovorni za ovakve sadržaje. DevProTalk.com ne garantuje tačnost, kompletnost ili upotrebnu vrednost informacija, stavova, saveta ili datih izjava. Ne postoje uslovi pod kojima bi mi bili odgovorni za štetu ili gubitak koji je posledica bilo čijeg oslanjanja na nepouzdane informacije, ili bilo kakve informacije nastale kroz komunikaciju između registrovanih članova.
Web sajt može sadržavati linkove na druge web sajtove na Internetu ili neke druge sadržaje. Ne kontrolišemo niti podržavamo te druge web sajtove, niti smo pregledali bilo kakve sadržaje na takvim sajtovima. Mi nećemo biti odgovorni za legalnost, tačnost ili prikladnost bilo kog sadržaja, oglasa, proizvoda, usluga ili informacije lociranim na ili distribuiranih kroz druge web sajtove, niti za bilo kakvu štetu nastalu kao posledica takvih informacija. DevProTalk.com drži i čuva druga prava vlasništva na web sajtu. Web sajt sadrže materijale zaštićene copyright-om, zaštitne znakove i druge informacije o pravu vlasništva ili softver. Članovi mogu poslatu informacije zaštićene pravima vlasništva njihovih nosilaca i ona ostaju zaštićena bez obzira da li su oni koji prenose te informacije to naveli ili ne. Osim informacija koje su u javnom vlasništvu ili za koje dobijete dozvolu, nemate pravo da kopirate, modifikujete ili na bilo koji način menjate, objavljujete, prenosite, distribuirate, izvršavate, prikazujete ili prodajte bilo koju informaciju zaštićenu pravima vlasništva. Slanjem informacija ili sadržaja na bilo koji deo DevProTalk.com, Vi automatski dozvoljavate i predstavljate garanciju da imate pravo da dozvolite DevProTalk.com ili članovima DevProTalk.com bespovratnu, kontinualnu, neograničenu, globalnu dozvolu da koriste, kopiraju, izvršavaju, prikazuju i distribuiraju takve informacije i sadržaje i da iz takvih sadžaja koriste bilo koji deo u bilo koje svrhe, kao i pravo i dozvolu da koriste gore navedene sadržaje. Svi zaštitni znakovi (trademarks), logotipi, oznake usluga, firme ili imena proizvoda koji se pominju na ovom web sajtu su vlasništvo kojim raspolažu njihovi vlasnici.