Powiedzmy, że potrzebuje zmienne:
a0 a1 a2 ... a1000
a ogólniej mówiąc - chce utworzyc zmienną o nazwie ai
gdzie i
jest liczbą naturalną. Nie można tego zrobić poprzez operator##
, a przynajmniej ja nie widzę takiej możliwości. Wiem, że istnieją tablice, ale ja sobie ubzdurałem, że chcę zmienne. Da się to zrealizować?
@_13th_Dragon Tak, wiem, ale trzeba podać konkretną wartość, dla:
#define costam(x) a ## x int i = 19; int costam(i);
dostane ai
, a chcę a19
.
@Shalom proponuje nie krytykować niczego, czego nie rozumiesz dogłębnie. Mógłbym wytłumaczyć sens mojego działania, ale nie o to chodzi. Więc jeśli nie znasz odpowiedzi na moje pytanie - daruj sobie tak infantylne i bijące idiotyzmem na kilometry komentarze. Dziękuję ;)
Ewentualnie propozycja numer 2 jeśli Twoje ambicje nie pozwalają Ci czasem zatrzymac głupoty dla siebie - zapytaj, po co mi to. Może odpowiem. Może zrozumiesz.
@pingwindyktator Ani @Shalom ani @_13th_Dragon nie nazwali Cie idiotą
Tak. Należy uderzać głową o ścianę aż do utraty przytomności. Proces powtarzać aż wybijesz sobie takie pomysły z głowy
Wydaje mi się że autor miał na myśli że to jest nie najlepszy sposób xd niezależnie od tego czemu ma to służyć ;)
Chcą Ci pomóc i poświęcają na to swój prywatny czas więc proszę nie rzucaj się na wszystkich dookoła tylko to uszanuj ;) Jeśli nie wiesz czemu @Shalom napisał tak a nie inaczej to w następnym poście wytłumacz dokładnie do czego chciałeś to użyć i poproś o wytłumaczenie dlaczego uważa że jest to głupi pomysł i tyle ;)
@pingwindyktator nie chciałem żebyś poczuł się urażony, ale bardzo powszechną sytuacją na forum, szczególnie wśród początkujących i średnio-zaawansowanych, jest pytanie "jak zrobić XYZ" gdzie XYZ to jakaś bardzo dziwna i karkołomna operacja. W rzeczywistości jednak autorzy tych tematów wcale nie potrzebują takiego dziwnego rozwiązania, tylko akurat na takie dziwne rozwiązanie wpadli. W praktyce rozwiązanie ich problemu jest trywialne i nie wymaga wcale cudów na kiju, ale oni zamiast spytać "jak rozwiązać taki a taki problem" pytają "jak wykonać pewną karkołomną operację która jest mi potrzebna".
Przykład takiego dziwnego pomysłu:
- Nieznajomość zagadnienia baz danych i utworzenie np. kilkudziesięciu / kilkuset tabel, po jednej dla każdego użytkownika, bo autor nie umiał zrobić powiązania 1:n i jednej tabeli z użytkownikami. Pytanie na forum nie dotyczyło poprawnego schematu bazy, tylko "jak jednym zapytaniem wybrać loginy użytkowników z tych 100 tabel"
Takie rzeczy są tu na porządku dziennym i jeśli twoje pytanie nie było "czysto akademickie" to jestem pewien że zalicza się do kategorii o której wspomniałem powyżej -> próba zaimplementowania dziwnego pomysłu, podczas gdy poprawne rozwiązanie wcale nie wymaga takich cudów.
@pingwindyktator wytłumacz po co? Tablice stworzone są właśnie w takim celu, aby łatwo było przechodzić "po zmiennych" pętlami. Jak chcesz zadeklarować 100 zmiennych to sobie je zadeklaruj metodą Kopiego Pejsta później 100 razy wykonuj na nich obliczenia a na końcu 100 razy wypisz...
Na dobrą sprawę mógłbyś zrobić to makrami, ale po co jak w skompilowanym programie nazwa i tak jest porzucana - to jest rzucanie sobie kłód pod nogi.
A co, jeśli moje pytanie sprowadza się do "chce znać możliwości języka"? Rozumiem, ze nie wpadliście na to i uznajecie, że kazdy, kto jest poza pierwszą dziesiątką w "rankingu" forum ma bezsensowne pomysły, ktore nadają się jedynie do krytyki?
Jak już musisz to sobie jakimś zewnętrznym skryptem wygeneruj ten 1000 zmiennych. Zgodnie z moją wiedzą nie jest to możliwe wewnątrz języka.
Pingwin napisał, że wie o istnieniu tablic, a zadał tylko pytanie o możliwość implementacji tego.
Ktoś kto ma trochę oleju w głowie i tak nie będzie próbował tak robić na 100 zmiennych więc nie zjeżdzałbym go, odpowiedź masz od Dragona lepszej nie znajdziesz.
Preprocesor działa w fazie kompilacji; Gdy już będziesz miał te zmienne, możesz się doń odwoływać podobnie w przypadku tablicy;
#include <iostream>
using namespace std;
auto main() -> signed int ??<
int a0 = 1, a1 = 2, a2 = 3;
cout << &a0 << " " << &a1 << " " << &a2 << endl;
cout << (&a0+1) << ": " << *(&a0+1);
??>
Przykładowe wyjście:
0xbfb1ae44 0xbfb1ae48 0xbfb1ae4c
0xbfb1ae48: 2
@_13th_Dragon faktycznie miałeś rację. Da się.
@pingwindyktator: http://coliru.stacked-crooked.com/a/bd50776afc00ddd7
Rozumiem, że jest to możliwe tylko dzięki preprocesorowi, czyli przed kompilacja? W trakcie działania programu nie?
W trakcie dzialania programu nie istnieje pojecie identyfikatora zmiennej.