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

question-closed C++ inicjalizacja dużej stałej tablicy

VPS Starter Arubacloud
0 głosów
920 wizyt
pytanie zadane 17 lutego 2019 w C i C++ przez dawid2002 Mądrala (5,190 p.)
zamknięte 24 lutego 2019 przez dawid2002
Witam! Zastanawiam się jak zainicjalizować dużą stałą tablice , mającą przykładowo 10 000 elementów. Jak taką tablicę zainicjalizować skoro ma mnóstwo elementów więc inicjalizator (czyli zapisanie wartości w nawiasach klamrowych) odpada więc co zrobić aby ta stała tablica została zainicjalizowana tymi samymi wartościami?

Z góry dziękuje za pomoc!
komentarz zamknięcia: znam już odpowiedź
komentarz 17 lutego 2019 przez dawid2002 Mądrala (5,190 p.)

UWAGA: Mi chodzi o inicjalizację tej tablicy a nie o przypisanie.

Piszę o tym bo co niektórzy nie umieją czytać ze zrozumieniem pisząc mi o tych nieszczęsnych pętlach!

komentarz 18 lutego 2019 przez mokrowski Mędrzec (155,460 p.)
Nie wiem czy zdajesz sobie sprawę że kod w C++, nawet nie wiem jak zaawansowany, będzie przełożony na język asemblera. Przypisanie do tablicy (nawet jeśli je wykonasz), będzie przełożone na pętlę kopiującą dane z jednej przestrzeni do drugiej. Jeśli dodasz optymalizację, pętla może ew. się skrócić lub mogą być użyte instrukcje SIMD. Produkcyjnie nie ma to więc większego sensu. Pozostaje wyłącznie zabawa.
komentarz 18 lutego 2019 przez dawid2002 Mądrala (5,190 p.)
Generalnie dodam że chodziło mi o zwykłe tablice z modyfikatorem const.

Oraz jeszcze ważna sprawa dziękuje za wszystkie komentarze i odpowiedzi. Widzę że temat zrobił się szeroki i jest wiele pomysłów na zainicjalizowanie takiej (dużej) stałej tablicy. Jeśli ktoś ma jeszcze jakiś pomysł to może w odpowiedzi przedstawić kolejny pomysł!

3 odpowiedzi

0 głosów
odpowiedź 17 lutego 2019 przez vector Dyskutant (9,200 p.)
wybrane 17 lutego 2019 przez dawid2002
 
Najlepsza

Według standardu c++ tablice mogą być inicjalizowane jedynie(*) literałami znakowymi oraz listami inicjalizacyjnymi z klamerkami (brace-enclosed initializer list).

Inicjalizacja literałami znakowymi odpada z oczywistych względów.

Inicjalizacja listami inicjalizacyjnymi z klamerkami jest problematyczna, bo nie da się użyć szablonów do wygenerowania odpowiedniej listy. Jedyne rozwiązanie jakie przychodzi mi do głowy to użycie preprocesora

#define DUP2(x) x, x
#define DUP4(x) DUP2(x), DUP2(x)
#define DUP8(x) DUP4(x), DUP4(x)
#define DUP16(x) DUP8(x), DUP8(x)
#define DUP32(x) DUP16(x), DUP16(x)
#define DUP64(x) DUP32(x), DUP32(x)
#define DUP128(x) DUP64(x), DUP64(x)
#define DUP256(x) DUP128(x), DUP128(x)
#define DUP512(x) DUP256(x), DUP256(x)
// ...

#include <stdio.h>

int main(void) {
    const int array[1000] = {
        DUP512(10),
        DUP256(10),
        DUP128(10),
        DUP64(10),
        DUP32(10),
        DUP8(10)
    };

    for (int i = 0; i < 1000; ++i) {
        printf("%d\n", array[i]);
    }

    return 0;
}

Nie jest to najpiękniejsze rozwiązanie, ale jakoś działa. Na upartego dałoby się nawet generować stałe tablice trochę ogólniej: const T[N] = {f(0), f(1), ..., f(N)}; za pomocą preprocesora, ale to nie rozwiązuje wszystkich przypadków.

Anyway, nie widzę powodu aby chcieć robić takie rzeczy.

 

(*) Istnieje więcej możliwych inicjalizacji tablicy, ale w tym przypadku jedynie te dwie inicjalizacje mają jakiekolwiek znaczenie.

komentarz 17 lutego 2019 przez dawid2002 Mądrala (5,190 p.)

Dzięki za pomoc! Masz ode mnie naj yes

komentarz 17 lutego 2019 przez mokrowski Mędrzec (155,460 p.)
edycja 18 lutego 2019 przez mokrowski

...bo nie da się użyć szablonów do wygenerowania odpowiedniej listy.

A pewnie że się da z użyciem foldingu i std::integer_sequence ( https://en.cppreference.com/w/cpp/utility/integer_sequence ), tylko po co? I tak kompilator potraktuje to jak zechce po podaniu przełączników optymalizacji.

BTW, jakie konsekwencje ma pomysł z makrami, warto zerknąć  https://godbolt.org/z/7UtB2P .

komentarz 18 lutego 2019 przez vector Dyskutant (9,200 p.)

Wiem że da się zrobić coś takiego za pomocą templatek

#include <bits/stdc++.h>

template <std::size_t...s>
void func(std::integer_sequence<std::size_t, s...>) {
    const int arr[] = {s...};

    for (int i = 0; i < sizeof...(s); ++i) {
        printf("%d\n", arr[i]);
    }
}

int main() {
    func(std::make_index_sequence<10>());
    return 0;
}

ale to nie jest satysfakcjonujące bo trzeba robić funkcję/strukturę aby móc odpakować sekwencję z integer_sequence, oczekuję aby dało się zrobić wprost:

const int array[1000] = repeat(1000, 0); // tworzy tablice 1000 elementową 0

z tego co się orientuje to nie da się napisać takiego repeat bez użycia preprocesora. Ponadto szablony mają wadę, tylko wyrażenia czasu kompilacji można z nimi użyć czyli coś w stylu

int a;
cin >> a;
const int array[] = repeat(1000, a);

już by nie zadziało. dawid2002 chyba pytał o tablice const a nie constexpr więc ogólnie szablony raczej odpadają. w tym przypadku

+1 głos
odpowiedź 17 lutego 2019 przez profesorek96 Szeryf (91,420 p.)
Zastosować np. pętle for i przeliterować po każdym elemencie i tablicy.
komentarz 17 lutego 2019 przez dawid2002 Mądrala (5,190 p.)

Czyli w sensie jak to zrobić? Bo jak zrobiłem tak:

const int tab[1000];

for(int i=0; i<1000; ++i)
     tab[i] = 0;

To kompilator wyrzucił 2 błędy że nie zainicjalizowałem tab i dodatkowo chciałem przypisać wartość do stałego elementu tej tablicy.

Ja chce zainicjalizować tą tablice a nie przypisać po kolei wartość tym szufladkom.

Jeśli wiesz jak to zrobić to przyślij mi kod.

+1 głos
odpowiedź 17 lutego 2019 przez DarthMazut Bywalec (2,990 p.)
const int n = 100; // ilosc elementow twojej tablicy
	
int tab[n];
	
for(int i = 0; i < n; i++)
{
	tab[i] = 0; //liczba jaka chcesz uzupelnic tablice
}
	
const vector<int> vec(tab, tab + n);
//stały wektor 'vec' - możesz go używać jak tablicy

 

komentarz 17 lutego 2019 przez dawid2002 Mądrala (5,190 p.)
Dzięki , jest to dobry sposób (choć ja sam wymyśliłem podobny z operatorem const_cast) ale bardziej mi chodziło o bezpośrednią inicjalizacje tablicy.

Podobne pytania

0 głosów
2 odpowiedzi 435 wizyt
0 głosów
3 odpowiedzi 2,522 wizyt
pytanie zadane 31 lipca 2018 w C i C++ przez Ptaszor3 Użytkownik (900 p.)
0 głosów
2 odpowiedzi 209 wizyt
pytanie zadane 25 lutego 2020 w JavaScript przez matedoo Nowicjusz (210 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...