• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

2 proste pytania dotyczące programowania

Object Storage Arubacloud
0 głosów
789 wizyt
pytanie zadane 16 maja 2016 w C i C++ przez niezalogowany
Witam mam 2 pytania które nurtują mnie od dawna, a nie zbyt wiem nawet jak zdobyć o tym informacje

1. gdy używamy wskaźnika możemy zrobić dynamiczną alokację pamięci i wygląda to tak

int *a= new int;

i teraz gdy po jakimś czasie nie będziemy potrzebowali już tej zmiennej ale tablicę to można potem zrobić

delete a;
a= new int[20];

albo coś takiego żeby nie robić nowego wskaźnika ale żeby usunąć tamtą zmienną i stworzyć na tym tablicę

2. Jak używamy fstream (albo bliźniacze do tego), to gdy zrobimy:

plik.close()

to można potem zrobić, żeby to miało sens:

plik.open("sciezka.txt");

czy lepiej zrobić nową zmienną.

 

Wiem że pytania trywialne ale nie wiem czy to dobra praktyka itp.

4 odpowiedzi

+1 głos
odpowiedź 16 maja 2016 przez niezalogowany
1. Tak, można tak zrobić

2. Tak, można tak zrobić
komentarz 16 maja 2016 przez Patrycjerz Mędrzec (192,320 p.)

Rozbudowana odpowiedź smiley

2
komentarz 16 maja 2016 przez Eryk Andrzejewski Mędrzec (164,260 p.)
for (int  i = 1; i <= 2; i++)
    std::cout << i << ". Tak, można tak zrobić\n";

 

komentarz 16 maja 2016 przez Patrycjerz Mędrzec (192,320 p.)

Hmm... wątpię, aby ci poszły polskie znaki cheeky

1
komentarz 16 maja 2016 przez Eryk Andrzejewski Mędrzec (164,260 p.)

Czemu mają nie pójść? Kłopoty z polskimi znakami diakrytycznymi to tylko na Wingrozie wink

Na Linuksie wszystko działa jak należy (Zarówno edytor jak i terminal korzystają z UTF-8)

komentarz 16 maja 2016 przez Patrycjerz Mędrzec (192,320 p.)

Działać działa, ale niby jakieś wielkości jest zmienna char w Linuksie? Wg Wikipedii polskie znaki w UTF-8 są kodowane jako dwa bajty, więc nie ma bata, aby to działało na zwykłych zasadach...

1
komentarz 16 maja 2016 przez Eryk Andrzejewski Mędrzec (164,260 p.)
Nie wiem, mi działa to się cieszę ;)
komentarz 16 maja 2016 przez niezalogowany
Polskie znaki na windowsie? Nic prostszego. Wystarczy linijka: setlocale(LC_ALL, ""); I zamiast cout używamy wcout(i przed cudzysłowiami dajemy L). I tyle ;)
komentarz 16 maja 2016 przez Eryk Andrzejewski Mędrzec (164,260 p.)
A na Linuksie nie trzeba takich pierdołów robić :P
0 głosów
odpowiedź 16 maja 2016 przez Patryk Krajewski Nałogowiec (26,170 p.)
przywrócone 16 maja 2016 przez Patryk Krajewski
1. Tak, ale, aby używać jej do tego co mówi nazwa bo potem się pogubisz w kodzie.

2. Tu tak samo.
0 głosów
odpowiedź 16 maja 2016 przez Radfler VIP (101,030 p.)
edycja 16 maja 2016 przez Radfler

1) W praktyce taka sytuacja nie powinna nigdy nastąpić. Albo alokujesz pojedynczy obiekt, albo tablicę. Poza tym w dzisiejszych czasach korzystamy z inteligentnych wskaźników shared_ptr,unique_ptr,observer_ptr:

#include <algorithm>
#include <memory>

void compute_something(std::size_t size) {

  auto storage = std::make_unique<int[]>(size);
  
  std::fill_n(storage.get(), size, 0);

  // praca i nic więcej
  
}

Robimy dobrze jedno działanie, nic poza tym.

2) Tu tak samo. Jeżeli masz sytuację, że otwierasz plik A w funkcji, po czym go zamykasz i otwierasz plik B wykorzystując tą samą zmienną, to wiedz że Twoja funkcja robi za dużo operacji na raz i powinieneś pomyśleć o jej rozbiciu.

komentarz 16 maja 2016 przez Patrycjerz Mędrzec (192,320 p.)

Czy tylko ja tutaj stosuje stałą referencję? Przecież nie trzeba wtedy kopiować niepotrzebnie zmiennej - może dla std::size_t nie ma to większego znaczenia, ale dla większych struktur danych już tak.

komentarz 16 maja 2016 przez Radfler VIP (101,030 p.)
edycja 16 maja 2016 przez Radfler

Ale po co tu stała referencja? Typ std::size_t to typ skalarny, arytmetyczny. Jego kopiowanie nic nie kosztuje, gdyż jest to pojedyncza instrukcja (http://pastebin.com/cXCLvnz0). Mało tego: funkcje biblioteki standardowej praktycznie w każdym miejscu przyjmują proste typy przez wartość.

komentarz 16 maja 2016 przez Patrycjerz Mędrzec (192,320 p.)
Hmm... a czyżby wykorzystanie (stałej) referencji powodowałoby wykonanie większej ilości instrukcji niż przekazanie argumentu przez wartość?
komentarz 16 maja 2016 przez Radfler VIP (101,030 p.)
Wydaje mi się, że dla typów skalarnych to nie ma znaczenia. W tym wypadku powinna zostać wygenerowana taka sama liczba instrukcji.
komentarz 16 maja 2016 przez Radfler VIP (101,030 p.)

Tak, dla typów prostych jest lepiej przekazywać przez wartość. Ładniej to wygląda, a i nic nie kosztuje (procesor też się przy tym nie zmęczy).

http://stackoverflow.com/questions/270408/is-it-better-in-c-to-pass-by-value-or-pass-by-constant-reference

Poza tym biblioteka standardowa dla prostych typów preferuje przesyłanie przez wartość (np, std::mem_fn, konstruktor std::bitset): http://bit.ly/1TSI6HQ http://bit.ly/1Xfvjow

Ugh... schowałeś

komentarz 16 maja 2016 przez Patrycjerz Mędrzec (192,320 p.)
Dzięki za odpowiedzi.

Przepraszam, że schowałem tamten komentarz, ale zacząłem go pisać przed zobaczeniem twojej najnowszej odpowiedzi, która rozwiała moje wątpliwości.
0 głosów
odpowiedź 16 maja 2016 przez jpacanowski VIP (101,940 p.)

Np. masz grę i gracz przeszedł jakiś level i chcesz załadować kolejny, to taki kod jest jak najbardziej OK.

ofstream level;

(...)
(...)

level.open("level-1.txt");
(...)
level.close();

(...)
(...)

level.open("level-2.txt");
(...)
level.close();

Ale takie coś to już zła praktyka, bo zmienna powinna coś o wczytywanym pliku mówić, bo jak kolega wyżej napisał - po prostu pogubisz się.

plik.open("sciezka.txt");
1
komentarz 16 maja 2016 przez niezalogowany
Z tym plik to byl przykład, ale chodziło mi o to co napisałeś :) bardzo fajnie to opisałeś:)

Podobne pytania

0 głosów
3 odpowiedzi 173 wizyt
pytanie zadane 13 listopada 2016 w Systemy operacyjne, programy przez Kondzix16 Początkujący (470 p.)
0 głosów
1 odpowiedź 184 wizyt
pytanie zadane 5 lipca 2016 w HTML i CSS przez R.orlinski Mądrala (5,490 p.)
0 głosów
3 odpowiedzi 648 wizyt
pytanie zadane 24 czerwca 2016 w C# przez niezalogowany

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...