Skocz do zawartości

Temat został przeniesiony do archiwum

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

SignX

[c++] uproszczenie deklarowania tablicy

Rekomendowane odpowiedzi

Nie jestem pewny czy dobrze to nazwałem w tytule ,ale juz tlumacze o co mi chodzi.

Mianowicie mam jakąs tablice :

char plansza[W][s] = {{'-','-' , '  ','*'} ,
                                    {'-',0xC9} };

, a nastepnie funkcje rysuj, która ja wyrysowuje.

Moje pytanie brzmi czy dało rade by zapisać owa tablice w sposób :

char tab = {"-- *"
           "-0xC9"};

Dziekuje za pomoc!

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Można, np. tak:

	char plansza2[][5] = {
	"-- *",
	"-\xC9" 
};

 

Jednego wymiaru tablicy nie trzeba określać, gdyż kompilator sam go ustali - widzi ile jest napisów w tablicy.

Drugi wymiar jest konieczny do ustalenia i w tym przypadku nie może wynieść 4: napisy wewnątrz " " zawierają bajt zerowy na końcu.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Chyba,ze ktoś miałby jakiś inny "cwany" sposób na takie rozwiazanie(moze jakos magicznie z pliku wczytac,niestety nie mam pojecia jak) ,ponieważ moja gorna ramka zajmuje sporo miejsca

char plansza[W][s] ={{naroznik_lewy_g,kr,kr,kr,kr,kr,kr,kr,kr,kr,kr,kr,kr,kr,kr,kr,kr,kr,kr,kr,kr,kr,kr,kr,kr,kr,kr,kr,kr,kr,kr,kr,kr,kr,kr,kr,kr,kr,kr,kr,kr,kr,kr,kr,kr,kr,kr,kr,kr,kr,kr,kr,kr,kr,kr,naroznik_prawy_g,'   ', naroznik_lewy_g,kr,kr,kr,naroznik_prawy_g} ,
                 {'  ','  ','  ','  ','  ','  ','  ',naroznik_lewy_g} };

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Przepraszam,za moj poprzedni post, nie zauwazyłem odp.

Miałbym jeszcze pytanie,ponieważ funkcje , które zwracaja wskazniki/tablice to moja pieta achillesowa, mogłby ktoś mi powiedziec co robie źle. Program miałby zastąpić żmudne wypisywanie "kr" n-razy. Pomyslalem,ze owa funkcja moglaby po prostu zwracać tablice znaków.

 

funkcja :

 char rysuj(char znak, int n)
{
   char tab[n];
       for (int i =0 ; i< n ; i++)
       {
       tab[i] = {'znak'};
       }
           return *tab;
 };

wywołanie :

 
char zn = 'a';
rysuj(zn, 5);
   cout << rysuj;

. Kompiluje sie,lecz wyswietla sie po prostu 1.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Twoja "funkcja" przede wszystkim nie jest poprawnym zapisem w c++. Rozchodzi się o

char tab[n];

Niektóre kompilatory pozwalają co prawda na użycie zmiennej do określenia rozmiaru tablicy, jednak formalnie takie coś jest illegal. Słowo kluczowe jeżeli chcesz więcej poszukać: VLA.

 

 

Tablica określania w ten sposób jest "lokalna" dla funkcji, i przestaje istnieć gdy funkcja w której była obecna się kończy.

 

Do wypisania kilku takich samych znaków najlepiej użyć jednego z konstruktorów typu std::string:

cout << string(5, zn);

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dziekuje po raz kolejny za pomoc! Tylko,ze jakbym chciał użyć tego w mojej "planszy" zamiast tych n razy wypisanych "kr,kr,kr(...)".

Wpisując oczywiście string(5, zn), jako wyraz tablicy nie działa.

Spróbowałem rownież

char a[11] = string(10,'a');

i jako elemnt w tablice wpisac a,ale nawet na logike mi się wydaje coś nie tak, bo jak to tablicy statycznej, jako element dodać kolejna tablice statyczna,która ponadto składa się z 10 elementów.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

No tak, bo obiekt typu string jest czymś troszkę bardziej złożonym, i nie można go trywialnie przypisać do tablicy bądź jej elementu ;)

 

Do wypełnienia tablicy konkretnymi wartościami możesz użyć std::fill bądź std::fill_n z biblioteki algorithm.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Znalazłem kod, który rozumiem

long kwota[] = { 120, 1650000, 5200, 190000123 };
for( int i = 0; i < 4; i++ )
{
   cout << "Rachunek nr ";
   cout.width( 2 );
   cout.fill( '*' );
   cout << i << " opiewa na sume :";
   cout.width( 10 );
   cout.fill( '_' );
   cout << kwota[ i ] << " DM\n";
}

, niestety nie wiem jak go użyc do mojej tablicy w której żmudnie wypisuje spacje, czy \xCD. Dziekuje serdeczne za chęci i tak.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Nie o ten fill mi chodziło ;) Celowo linkowałem żeby nie było niejednoznaczności! :P

 

char tab[11];
fill(tab, tab+10, 'a');

albo, przykładowe użycie fill_n

fill_n(tab, 10, 'a');

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Miałbym kolejne pytanko, jeśli już mam narysowaną ową plansze i chciałbym w nia pisać obiekt [3][3],mam funkcje,która wypisuje owy obiekt,ale jest on tak na prawde pod "plansza". Zdaje sobie sprawe, ze powinien byc jakis if ktory zastepuje ' ' i wpisuje tam owy obiekt. Mógłbym prosic o pomoc,dziekuje!

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Popracuj nad wyrażaniem się, bo ledwo Cię rozumiem ;) Mieszasz detale implementacyjne z abstrakcją, i ciężko wyczuć o co dokładnie chodzi.

 

Jeżeli do "rysowania" używasz strumieni, to nie istnieje sposób na "cofnięcie się" i nadrukowanie na starym obszarze czegoś. Można to robić jedynie w zakresie linii, póki sam nie zrobisz "entera", albo okno konsoli samo na skutek przepełnienia tego nie zrobi. Są znaki specjalne do cofania o jeden znak i do początku wiersza.

 

Jeżeli chcesz mieć większą kontrolę nad konsolą to musisz znaleźć bibliotekę która Ci to umożliwi. Korzystanie z winapi może być nieprzyjemne, dlatego poszukałbym czegoś robiącego za "nakładkę" i opcjonalnie wieloplatformowego.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Przepraszam, bede starał się podawać przykłady. Chciałem dokładnie to co Pan wyjaśnił,a mianowicie do stoworzego przeze mnie pustego "labiryntu" , chciałbym wpisac w roznych miejscach np. literkę C.

Przykład:

 

mam [-------] "-" odpowiada spacją.

<------->

<------->

[-------]

a oczekiwałbym np. aby wpisać do tablicy ową literę "c",czyli :

[c-----]

<----c->

<---c-->

[c---c-]. Postaram się poszukać już rano,mam nadzieję,że coś znajdę.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Nie wiem za co przepraszasz, po prostu musisz się drugi raz produkować by dostać odpowiedź :P btw, na forum nie ma żadnej hierarchii i zwykle się zwraca "na Ty" ;)

 

"-" odpowiada spacją.

Litości :E

 

Zakładam że piszesz pod windowsem. Jeżeli jednak linux, to jak mawia mój kolega, "radź sobie sam" :P

#include "Windows.h"

I później w kodzie:

//ustawienie odniesienia do konsoli
HANDLE  console;
console = GetStdHandle(STD_OUTPUT_HANDLE);

//zmiana pozycji kursora
COORD pos = {0,0};
SetConsoleCursorPosition(console, pos);

 

Wszystkich innych rzeczy na temat funkcji do obsługi konsoli dowiesz się stąd. Można szpanować kolorkami :D

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Myślałem ze rozgryzę to sam,ale jednak nie wyszło.

Chodziło mi o to jak napisać funkcję ,aby ona sama(funkcja) przy starcie gry(czyli tak na prawde po wyrysowaniu mojej mapy) rozmieszczala na mapie dane literki w nieokreslonym scisle miejscu (coś jak puzzle) , a potem bd mial funkcje,która obsluguje już gracza,ktory ma za pomoca komend zlozyc te literki do kupy.

Przykład : mam nadzieję,ze tym razem to wyjasnie dobrze.

Jak mamy ta mape(na która rysowanie funkcji juz posiadam)

[ - - ]

[- ]

[ ]

[- - - -]

[- -]

te minusiki to jakies tam przeszkody,na ktorych lietrki nie powinny sie znalesc. Wraz z tym rysowaniem mapy chciałbym ,żeby jakaś tam funkcja wypełniała ją(mapę) np. 5 literkami, ale zeby za każda grą były załadowane(literki) w innym punkcie niż poprzednio. Niestety nie mam pojecia jak to inaczej wytlumaczyc :(

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Odnoszę wrażenie, że cały program próbujesz upakować do jednej linijki :E

Podziel wszystko na części: jedną, odpowiedzialną za ponowne wypisywanie całej planszy, drugą, odpowiedzialną za obsługę wejścia od użytkownika, i ostatecznie trzecią, która będzie logiką aplikacji.

 

Zgaduję że próbujesz zrobić coś na rodzaj odkrywania par kart. Takie rzeczy rozbija się na wiele funkcji, inaczej zwariujesz ;)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Nie chciałem zawrzeć wszystkiego w jednej funkcji oczywiście :D

 

Ale nie miałem pomysłu jak się za to zabrać. Sens mojej "gry" miał polegać na łączeniu rozsypanych po mapie literek w słowo. Napisałem inny program z mniejsza mapą,aby spróbować rozwiązać problem w mniejszej skali i bez przeszkód.

 

#include <iostream>

using namespace std;

   class Map{
public:
   char mapa[11][11] = {
   "**********",
   "*        *",
   "*        *",
   "*        *",
   "*        *",
   "*        *",
   "*        *",
   "*        *",
   "*        *",
   "**********",

       };
   void draw(){
   for(int y=0;y<11;y++){
       for(int x=0;x<11;x++){
           cout<< mapa[y][x];
       }
               cout << "\n";
   }
}
   };

int main()
{
   Map mapa;

   mapa.draw();


   for(int i=0 ; i < 11 ; i++){
       for(int j= 0 ; j<11 ; j++)
       {
           if(mapa[j][i] == " " )
               cout << "x" ;
       }
   }
return 0;
}

Wywala mi bład "|52|error: no match for 'operator[]' in 'mapa[j]' ". Takze postaram sie wytlumaczyc o co mi chodziło. Nie mam pojecia niestety jak skopiowac owa mape i działać na kopii(przesłać ją jako referencje,ale do jakiej funkcji draw(?) ).

Tak jak poprzednio chciałem wszystkie białe znaki zamienić na znaki "x".

Nie wiem czy to coś pomoze,ale mam tez funkcje rysowania alternatywna

void rysowanie(){
   for (int i=0; i < 10 ; i++ ){
       for(int j =0 ; j<10 ; j++){
           if (i==0 || i==9)
               cout << '*' ;
           else if(j==0 || j==9) {
               cout << '*';}
           else cout << ' ' ; 
   }
   cout << endl;
   }
   }

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

zamień

if(mapa[j][i] == " " )

 

na

if(mapa.mapa[j][i] == ' ' )

 

pomijam fakt czemu tu dałeś klasę, dodatkowo w klasie nie powinno się inicjalizować w ten sposób (chodzi o mape) - albo rób to przez konstruktor albo daj static

 

co do reszty to nie ogarniam o co Ci chodzi :E

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dziekuje za pomoc, chociaż mi się kompiluje :D.

Może obrazkowo to wytlumaczę , potrzebuje otrzymac --> 18993937038094386873.png.

Mam samą ramkę i męczę się ,żeby zamienić 7 spacji z tablicy(mapy), na znaki które narysowałem czyli " \a\ \b i \1".

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

czym kompilujesz?

bo aż musiałem to sprawdzić bo przed C++11 to jest niedozwolone - po dodaniu -std=c++11 (w przypadku gcc) przejdzie

 

dwa - proponuję włączyć sobie wszystkie warningi i pedantyczne sprawdzanie poprawności - w przyszłości oszczędzi sporo czasu i bólu szukania bugów

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Miałbym jeszcze pytanko, jak tą poprawnosc wlaczyc to jest jakis plugin?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

W ustawieniach kompilatora poszukaj opcji

-Wall

-Wfatal-errors

 

Pierwsze pokazuje większość warningów - miejsca które nie są jednoznaczne dla kompilatora, albo takie w których mogłeś popełnić błąd.

Druga opcja ogranicza ilość błędów kompilacji zawsze do tego pierwszego - bardzo często jest tak, że kolejne błędy wynikają z pierwszego...

 

Flagę -pedantic możesz sobie darować, no chyba że koniecznie chcesz wiedzieć kiedy używasz nadmiarowych średników albo innych rzeczy tego typu.

 

Jeżeli chodzi o najnowszy standard języka to spróbuj ustawić -std=gnu++1y a jeżeli ten nie będzie dostępny to -std=gnu++11.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dziękuje za dotychczasowa pomoc!! Nareszcie coś mi wyszło ! :)

Program rysuje mi już mape z wypełnionymi literkami, mam tylko 2 pytania :

-jak zrobić zeby przypisać np. literce K losowe miejsce za kazdym razem kiedy uruchomimy program na nowo?

-porzebowałbym,aby zamiast samej literki K, stała tam tablica[3][3], tak jak przedstawiłem to na poprzednim obrazu z painta. Wrzucam moj kod:

#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <ctime>

using namespace std;

const int H = 21;
const int W = 21;

class Map
{
public:
   char mapa[H][W] =
   {
       "********************",
       "*                  *",
       "*                  *",
       "*                  *",
       "*                  *",
       "*                  *",
       "*                  *",
       "*                  *",
       "*                  *",
       "*                  *",
       "*                  *",
       "*                  *",
       "*                  *",
       "*                  *",
       "*                  *",
       "*                  *",
       "*                  *",
       "*                  *",
       "*                  *",
       "********************",
   };
   void draw()
   {
       for(int y=0; y<H; y++)
       {
           for(int x=0; x<W; x++)
           {
               cout<< mapa[y][x];
           }
           cout << "\n";
       }
   }
};

int main()
{
   srand( time( NULL ) );

   Map mapa;

  // mapa.draw();

   char tab_klon[H][W];



   memcpy(*tab_klon,*mapa.mapa,sizeof(mapa.mapa));

   for (int i=0 ; i<H ; i++){
       for(int j =0 ; j<W; j++)
       {
           cout << tab_klon[i][j];
       }
       cout <<"\n";
   }

   for(int i=0 ; i < H ; i++)
   {
       for(int j= 0 ; j<W ; j++)
       {
           if(i==1 && j==5 && tab_klon[i][j] == ' ' )
               {tab_klon[i][j] ={'k'};}
              else if(i==2 && j == 3 &&tab_klon[i][j] == ' ' )
              {
                  tab_klon[i][j] = {'a'};
              }

       }
   }

    for (int i=0 ; i<H ; i++){
       for(int j =0 ; j<W; j++)
       {
           cout << tab_klon[i][j];
       }
       cout <<"\n";
   }

   memcpy(*mapa.mapa,*tab_klon,sizeof(tab_klon));

   mapa.draw();


   return 0;

}

 

Apropo pkt 2 , wymyslilem cos takiego

if(i%H == rand() %20  && j%H == rand() %20  && tab_klon[i][j] == ' ' )

. Niestety nie jest to idealnie, bo zdarza się,ze literki k, w ogóle nie ma albo sa np. 2 :(

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Przede wszystkim to przekombinowałeś rysowanie ;) Po co wypisujesz znak po znaku, skoro plansza to tablica normalnie kończących się napisów? :D

void draw()
{
   for(int y=0; y<H; y++)
cout << mapa[y] << endl;
}

 

Druga sprawa to zmiana wartości w tablicy. tab_klon[j]={'a'} może w praktyce robi dokładnie to czego oczekujesz, ale stoi za tym grubsza filozofia która kiedyś może się odbić rykoszetem; w skrócie: jeżeli masz dwuwymiarową tablicę char'ów i odnosisz się oboma indeksami, to przypisanie powinno wyglądać tak: tab_klon[j]='a'.

 

Do ustawienia wartości K i A w obecnym kodzie nie potrzebujesz się męczyć pętlami ;)

tab_klon[1][5]='k';
tab_klon[2][3]='a';

 

Podobnie możesz łatwo losować ich położenie.

 

Z obecnego kodu w ogóle to nie wynika, stąd pytanie: po co wprowadzasz kopię (owy klon) tablicy? Cały czas możesz operować na oryginale (mapa.mapa).

 

Do umieszczenia na planszy bloku X na Y takich samych liter rozsądnie będzie do klasy mapa dodać metodę która to robi ;)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Błedy poprawione, szczerze nie wiem czemu działam na kopii, myślałem,że "dmucham na zimne". Nie wiem niestety jak wydzielić pozycję losową.

Miałbym też kolejne pytanie, nie wiem czy nie za dużo pytam , ale podobno "kto pyta nie bładzi".

Chciałbym sterować z poziomu konsolii pozycją literki K. To znaczy,jeśli gracz wpisze w konsoli : "kd" oznaczać będzie , ze literka K przesunie się o 1 jednostkę w prawo. Pobranie pozycji literki raczej jakoś wymysle , ale jak napisać sterownie?

dziekuje!!

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

  • Tematy

  • Odpowiedzi

    • Tak bo sterownikami NV zmienia nawet ustawienia z biosu i może dla każdej modele z generacji wbić ustawienia i nawet tak robili głupole 🤣 Ty to trzymaj się krzywej bo jeszcze popsujesz karte jak 460
    • @_rdk_A zebrało się, bo generalnie jestem może nie przeciwnikiem kupna nówek, ale orędownikiem wykorzystania sprzętu aż faktycznie padnie a nie zmian w imię wypełnienia ego entuzjasty. Wolę korzystać ze sprzętu używanego, jeżeli jest sprawny, niż wydawać cenę MSRP + podatek od nowości na nówki, które zwyczajnie nie są tego warte. Teraz wpadł mi w ręce 3070 w nietuzinkowej wersji ichill x4 w dobrej kasie. To nie znaczy że złomuję poprzedniego 2060s, mam z jakieś 2-3 kompy na starszych gen gdzie ta karta będzie jak znalazł. A jak nie, to ją sprzedam za jakieś rozsądne pieniądze żeby komuś posłużyła kolejne 2-3 lata. Ergo chcialbym powrotu do tego co było kiedyś, nowe GPU co dwa-trzy lata, ale z odpowiednim przyrostem wydajności i za rozsądniejszą kwotę. To co się dzisiaj dzieje w kategoriach sprzętu jest dla mnie nie do zaakceptowania. Dojdzie do tego, że jak ze smartfonami będą dwie premiery flagowców w tym samym roku  
    • Święta racja Sned Sam u siebie swego czasu montowałem z palca komplet wentylatorów w obudowie i potem zaskoczony, że komputer słyszalny. W końcu zabrałem się za testowanie i obecnie (w zależności od obudowy i systemu chłodzenia  karty i procesora) mam tylko jeden wentylator wywiewowy 140mm BQ z tyłu, a na przodzie nie ma nic Jak montuje na przodzie dwa 140mm BQ to temperatura na GPU i procesorze spadają około 2 stC więc gra nie warta świeczki. Ten tylny wentylator wymusza napływ powietrza z zewnątrz poprzez siatkę na froncie i w ten sposób jest wymuszony obieg w środku budy. No i ta cisza, bo tylny wentylator stoi na chłodnicy od GPU. To jeszcze nic... tylny wentylator w delikatny sposób wyciąga ciepło z radiatora na procesorze, bo jest od niego zaledwie 2cm Teraz jak piszę i w tle leci film, wentylatory stoją, bo kręcą od 40stC tył i od 50stC procesor. Jak się w środku nieco podniesie temperatura (mowa o idle) to pierwszy startuje tylny na chłodnicy 140mm BQ a jak to za mało, to zaczyna kręcić na procesorze. Pod obciążeniem wiadomo oba lecą na swoich krzywych z FC. Tak, że zanim zaczniemy montować najmocniejsze wentylatory do obudowy, warto porobić testy na własną rękę zanim napchamy za dużo i całkowicie niepotrzebnie  
    • Dlatego był 300 zł droższy 😜
  • Aktywni użytkownicy

×
×
  • Dodaj nową pozycję...