OldComp.cz

Komunitní diskuzní fórum pro fanoušky historických počítačů


Právě je 19.04.2024, 05:26

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]




Odeslat nové téma Odpovědět na téma  [ Příspěvků: 39 ]  Přejít na stránku Předchozí  1, 2, 3  Další
Autor Zpráva
PříspěvekNapsal: 26.07.2020, 12:08 
Offline
Kecálek

Registrován: 08.11.2019, 17:24
Příspěvky: 131
Bydliště: Beroun
Has thanked: 32 times
Been thanked: 8 times
Busy píše:
Jakub píše:
Nemuzes misto pole pointeru alokovat pointer na pole, ktere ma rozmer tebou nactene cislo Y? Neco v tomto duchu:
Kód:
#include <stdio.h>
#include <stdlib.h>

int main()
{
   int x, y;
   scanf("%d%d", &x, &y);
   int (*a)[y] = malloc(x * y * sizeof(int));

   for (int i = 0; i < x; i++)
      for (int j = 0; j < y; j++)
         printf("a[%d][%d]: %p\n", i, j, &a[i][j]);

   return 0;
}
To vyzera zaujimavo, ale nedari sa mi to rozbehat:
Kód:
>gcc pole2.cpp
pole2.cpp: In function 'int main()':
pole2.cpp:8: error: invalid conversion from 'void*' to 'int (*)[(((unsigned int)(((int)y) + -0x000000001)) + 1)]'
Nemal by to byt iba warning ? To sa mi nejak nezda. Co vlastne realne vadi tomu kompileru ? Nedari sa mi najst vhodne pretypovanie aby mi to zozral.


V C muzes pretypovat void * na cokoliv a zpet. V C++ ne. Tak bud to prekladej jako C anebo to spravne pretypuj takto:

Kód:
int (*a)[y] = (int (*)[y])malloc(x * y * sizeof(int));


Nahoru
 Profil  
 
PříspěvekNapsal: 26.07.2020, 12:30 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3661
Bydliště: Bratislava
Has thanked: 373 times
Been thanked: 795 times
ub880d píše:
na moje pocudovanie, netreba ani malloc:
Kód:
...
   int x, y;
   scanf("%d%d", &x, &y);
   int a[x][y];
Tak toto ma dostalo :) Ako stara skola som myslel, ze rozmery pola musia byt konstanty zname uz v case prekladu, ale evidentne, zase na moje pocudovanie nemusia. Tak to je prijemne prekvapenie ! Vdaka za napad :)
Este pozriem aky kod to vlastne vygenerovalo - ci to naozaj pristupuje do pola klasickym sposobom [x*w+y].
ub880d píše:
otazka ale je, ako to je prenositelne medzi roznymi kompilermi...
Kedze to funguje uz v staruckom historickom MinGW 4.4.0 tak predpokladam, ze pri modernych a aktualnych kompileroch problemy nebudu.


Nahoru
 Profil  
 
PříspěvekNapsal: 26.07.2020, 13:13 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3661
Bydliště: Bratislava
Has thanked: 373 times
Been thanked: 795 times
Taaakze, napokon u mna zvitazilo toto riesenie:
Kód:
int main()
{
   int x, y;
   scanf("%d%d", &x, &y);
   int (*a)[y] = (int (*)[y])malloc(x * y * sizeof(int));

   for (int i = 0; i < x; i++)
      for (int j = 0; j < y; j++)
         a[i][j]=i*y+j;
         
   for (int i = 0; i < x; i++)
      for (int j = 0; j < y; j++)
         printf("a[%d][%d]: %p, val=%d\n", i, j, &a[i][j], a[i][j]);

   return 0;
}
Po skompilovani a zdisaseblovani kodu pekne vidno ako to prvok pola urcuje stylom (x*w+y), co je presne to co som chcel. Takto vyzera disasemblovany kod, znovu prepisany do cecka:
Kód:
  scanf("%d%d", &size_xx, &size_yy);
  memory = malloc(4 * size_xx * size_yy);
  for ( i = 0; i < size_xx; ++i )
  {
    for ( j = 0; j < size_yy; ++j )
    {
      ebx_ = size_yy - 1;
      *((_DWORD *)memory + size_yy * i + j) = j + i * size_yy;
    }
  }
  for ( k = 0; k < size_xx; ++k )
  {
    for ( l = 0; l < size_yy; ++l )
      printf(
        "a[%d][%d]: %p, val=%d\n",
        k,
        l,
        (char *)memory + 4 * (ebx_ + 1) * k + 4 * l,
        *((_DWORD *)memory + (ebx_ + 1) * k + l));
  }
Druhe riesenie s priamou definiciou pola ako lokalnej premennej
Kód:
   int x, y;
   scanf("%d%d", &x, &y);
   int a[x][y];
sice funguje tiez, a tiez sa prvky pola adresuju klasickym sposobom (x*w+y) co je velmi dobre, avsak pole sa (podla ocakavania) vytvara na zasobniku (co je velmi zle) a obsluzny kod je celkove zlozitejsi.

Ze sa pole vytvara na zasobniku je zle preto, lebo v mojom konkretnom pripade moze to pole kludne zaberat aj tri gigabajty (co je tiez dovod preco ho vlastne nechcem alokovat natvrdo staticky). Nebol by sice problem alokovat trojgigovy zasobnik, v tomto pripade je uz asi fakt lepsi ten malloc v prvom rieseni.

Takze tymto by som sa vam chcel vsetkym podakovat za vyriesenie mojho problemu :)


Nahoru
 Profil  
 
PříspěvekNapsal: 26.07.2020, 15:18 
Offline
Radil

Registrován: 14.10.2013, 23:12
Příspěvky: 342
Has thanked: 261 times
Been thanked: 25 times
rozumim a omlouvam se, jen mi prislo trosku protimluv chtit dynamicky alokovane pole bez pointeru :-)

Panda38 píše:
JohnBlbec píše:
tohle je sice c++, ale kdyz nahradis new za malloc a poresis delete na konci, tak mas dynamicky alokovanou matici matice[ROW][COL]
Kód:
    int** matice = new int*[COL];
    for(int i = 0; i < ROW; ++i)
      *(matice + i) = new int[COL];
 ...
To je pole pointerů, kterému se chtěl Busy vyhnout. Chce lineární pole, kde se offset prvku počítá jednoduchým násobením. K čemuž má nejblíž buď #define POLE(x,y) v C, nebo přetížení operátoru [] v C++ ( int* & Matrix::operator [](const int &index) const { return &mat[index * cols]; } ... tedy jedno lineární pole alokované s malloc, operátor [] vrací adresy řádků které spočítá násobením, druhý [] přičte sloupec ).


Nahoru
 Profil  
 
PříspěvekNapsal: 26.07.2020, 15:55 
Offline
Pan Štábní
Uživatelský avatar

Registrován: 24.05.2018, 22:32
Příspěvky: 1975
Bydliště: Most, Praha
Has thanked: 870 times
Been thanked: 699 times
Asi pozdě, ale kdyby přece jen - dynamická matice v C++ (připraveno pro VC2005):
Kód:
#include <stdio.h>
#include <stdlib.h>

// dynamicky alokovana matice
template <class entry> class cMatrix
{
private:

   int   m_Rows; // pocet radku matice
   int m_Cols;   // pocet sloupcu matice
   entry* m_Data; // data matice

   // vytvoreni matice
   void Init(int rows, int cols)
   {
      m_Data = (entry*)malloc(rows*cols*sizeof(entry));
      if (m_Data == NULL) exit(1);
      m_Rows = rows;
      m_Cols = cols;
   }

   // zruseni matice
   void Term()
   {
      free(m_Data);
      m_Data = NULL;
   }

public:

   // const pristup k matici
   inline int Rows() const { return m_Rows; }
   inline int Cols() const { return m_Cols; }
   inline entry Data(int inx) const { return m_Data[inx]; }

   // konstruktor
   cMatrix()
   {
      m_Rows = 0;
      m_Cols = 0;
      m_Data = NULL;
   }

   cMatrix(int rows, int cols)
   {
      m_Data = NULL;
      this->Init(rows, cols);
   }

   // destruktor
   virtual ~cMatrix()
   {
      this->Term();
   }

   // nastaveni rozmeru matice
   void Setup(int rows, int cols)
   {
      this->Term();
      this->Init(rows, cols);
   }

   // pristup k prvku matice ve tvaru m[radek][sloupec]
   entry* operator[](const int& row) { return &m_Data[row*m_Cols]; }
};

int main(int argc, char* argv[])
{
   // testovaci matice
#define ROWS 5   // pocet radku
#define COLS 3   // pocet sloupcu
   cMatrix<double> a(ROWS,COLS);

   // naplneni matice
   int row, col;
   for (row = 0; row < ROWS; row++)
      for (col = 0; col < COLS; col++)
         a[row][col] = row*10 + col;

   // kontrolni vypis
   for (row = 0; row < ROWS; row++)
      for (col = 0; col < COLS; col++)
         printf("a%d%d = %.0f (linear %.0f)\n",
            row, col, a[row][col], a.Data(row*COLS+col));
/*
a00 = 0 (linear 0)
a01 = 1 (linear 1)
a02 = 2 (linear 2)
a10 = 10 (linear 10)
a11 = 11 (linear 11)
a12 = 12 (linear 12)
a20 = 20 (linear 20)
a21 = 21 (linear 21)
a22 = 22 (linear 22)
a30 = 30 (linear 30)
a31 = 31 (linear 31)
a32 = 32 (linear 32)
a40 = 40 (linear 40)
a41 = 41 (linear 41)
a42 = 42 (linear 42)
*/
   return 0;
}

_________________
i++ (INC) increment
i-- (DEC) decrement
i@@ (EXC) excrement


Nahoru
 Profil  
 
PříspěvekNapsal: 05.08.2020, 12:12 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3661
Bydliště: Bratislava
Has thanked: 373 times
Been thanked: 795 times
Panda38 píše:
Asi pozdě, ale kdyby přece jen - dynamická matice v C++ (připraveno pro VC2005):
Vdaka za toto zaujimave riesenie ! Definicie klasu vyzeraju komplikovane, ale samotne pouzitie v programe je krasne jednoduche.
Trosku som sa aj na toto riesenie pozrel. V klasickom gcc mi skompilovat neslo ani s pouzitim -lstdc++
Kód:
>gcc -Os -s -Wall  -lstdc++ Vselico.cpp
ccm8zgl1.o:Vselico.cpp:(.text$_ZN7cMatrixIiED0Ev[cMatrix<int>::~cMatrix()]+0x2b): undefined reference to `operator delete(void*)'
ccm8zgl1.o:Vselico.cpp:(.rdata$_ZTI7cMatrixIiE[typeinfo for cMatrix<int>]+0x0): undefined reference to `vtable for __cxxabiv1::__class_type_info'
collect2: ld returned 1 exit status
g++ to sice uz skompilovalo, ale vyplulo prisernu 244kB opachu, ktovie kolko milionov roznych kniznich si tam muselo prilinkovat kvoli jednemu pretazeniu zatvoriek :(

Skusil som teda aj VC2015 a to spravilo prijemny a sympaticky 10kB exac :)
(s optimalizaciami dokonca okolo 9kB)
Ale zial vygenerovany kod kvoli pouzitiu objektov a pretazeni vyzera doslova priiiiiserne...

Trosku som si upravil main - pridal tam vypis adresy na ktorej je ulozena dana hodnota:
Kód:
main(void)
{
   int rows, cols;
   scanf("%d%d", &rows, &cols);

   cMatrix<int> a(rows, cols);

   // naplneni matice
   int i,j,cnt = 0;
   for (i = 0; i < rows; i++)
      for (j = 0; j < cols; j++)
         a[i][j] = cnt++;

   // kontrolni vypis
   for (i = 0; i < rows; i++)
      for (j = 0; j < cols; j++)
         printf("a[%u][%u] = %u  Adr: %u\n",
            i, j, a[i][j], (unsigned int)&(a[i][j]));
}
Po skompilovani, zdisasemblovani a konverzii nazad do cecka kod vyzera takto:
Kód:
  scanf("%d%d", &rows, &cols);
  cMatrix_int_constructor(&this, rows, cols);
  not_used = 0;
  cnt = 0;
  for ( i = 0; i < rows; ++i )
  {
    for ( j = 0; j < cols; ++j )
    {
      temp_ptr1 = cMatrix_int_operator(&this, &i);
      temp_ptr1[j] = cnt++;
    }
  }
  for ( i = 0; i < rows; ++i )
  {
    for ( j = 0; j < cols; ++j )
    {
      temp_ptr2 = cMatrix_int_operator(&this, &i);
      address = (int)&temp_ptr2[j];
      temp_ptr3 = cMatrix_int_operator(&this, &i);
      printf("a[%u][%u] = %u  Adr: %u\n", i, j, temp_ptr3[j], address);
    }
  }
  cMatrix_int_destructor(&this);
cMatrix_int_constructor je normalne volanie funkcie s dost zlozitym objektovym kodom ktory sa doslova "hemzi" samymi this-mi, ale samotne `gro` robi presne to co som ocakaval:
Kód:
 this->m_Data = (int *)malloc(4 * cols * rows);
Co ma ale nepotesilo, bol samotny pristup do pola. Sklada sa najprv z volania funkcie cMatrix_int_operator, co su vlastne tie pretazene zatvorky []. Funkcia ktora ma dva parametre (this = pointer na klasu, i = prva suradnica), a telo funkcie vyzera takto:
Kód:
return &this->m_Data[this->m_Cols * *i];
No a potom sa spravi samotny pristup do pameti temp_ptr3[j].

Takze ono to sice funguje na principe riadok * dlzka_stlpca + stlpec, avsak kedze je to objektove, musi si vsetko adresovat cez pointer na klasu, co je kopec dalsich (z pohladu programatora) zbytocnych pristupov do pameti.

Zhrnute a podciarknute, na nacitanie jedneho prvu z pola su potrebne 4 pristupy do pameti a jedno volanie funkcie. Funkcia by sa dala skompilovat in-line (a pri zapnuti optimalizacie sa tak aj stalo), ale objektovy pristup cez klasu proste tie pristupy do pameti potrebuje. Takze z hladiska celkovej efektivity, je to este horsie, nez klasicke riesenie s polom pointerov, ktore ukazuju na jednotlive riadky tabulky. A tudy cesta nevede ! :(

Poucenie: Objektovy pristup principialne nie je vhodny pre aplikacie, kde velmi zalezi na efektivite kodu.


Nahoru
 Profil  
 
PříspěvekNapsal: 05.08.2020, 14:07 
Offline
Pan Štábní
Uživatelský avatar

Registrován: 24.05.2018, 22:32
Příspěvky: 1975
Bydliště: Most, Praha
Has thanked: 870 times
Been thanked: 699 times
Pouziti pointeru na objekt je stejne jako pointer na strukturu - to je z toho duvodu, aby si funkce mohla z objektu (resp. ze struktury v C) nacist informace o velikosti matice. Kdyz bude objekt globalni promennou, inline funkce se pointeru vyhne a nacte rozmery primo.

Kod g++ se podstatne zkrati relaxaci - tj. vypustenim casti knihoven ktere se v kodu nepouzivaji.

_________________
i++ (INC) increment
i-- (DEC) decrement
i@@ (EXC) excrement


Nahoru
 Profil  
 
PříspěvekNapsal: 05.08.2020, 14:38 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3661
Bydliště: Bratislava
Has thanked: 373 times
Been thanked: 795 times
Panda38 píše:
Pouziti pointeru na objekt je stejne jako pointer na strukturu - to je z toho duvodu, aby si funkce mohla z objektu (resp. ze struktury v C) nacist informace o velikosti matice. Kdyz bude objekt globalni promennou, inline funkce se pointeru vyhne a nacte rozmery primo.
Ale stale treba z tejto struktury / klasy nacitavat informacie o nej a ci sa bude do pameti pristupovat cez pointer (register) alebo cez absolutnu adresu, je z hladiska efektivnosti nepodstatny rozdiel. Nacitavaniu z pameti sa tym aj tak nevyhneme.
Panda38 píše:
Kod g++ se podstatne zkrati relaxaci - tj. vypustenim casti knihoven ktere se v kodu nepouzivaji.
Skusal som potom aj to, prejavilo sa to, z 244 kB sa to skratilo na cca 57kB, ale aj tak, voci VC a jeho 10kB je to stale priserne moc :)


Nahoru
 Profil  
 
PříspěvekNapsal: 05.08.2020, 16:41 
Offline
Pan Generální
Uživatelský avatar

Registrován: 23.03.2014, 20:13
Příspěvky: 2779
Has thanked: 226 times
Been thanked: 602 times
Busy píše:
g++ to sice uz skompilovalo, ale vyplulo prisernu 244kB opachu

Ale to je přece samozřejmé: http://programujte.com/clanek/2006030305-rozhovor-s-bjarne-stroustrupem/ :lol:

Zkusil bych po kompilaci stripnout ladící informace, to ještě pár KB ukousne.

_________________
Plesnivý sýr z Tesca, zatuchlé kuřecí řízky z Albertu, oslizlé hovězí a myší trus z Lidlu.
Nákup potravinářské inspekce v ČR, říjen 2023.


Nahoru
 Profil  
 
PříspěvekNapsal: 05.08.2020, 17:41 
Offline
Pan Štábní
Uživatelský avatar

Registrován: 24.05.2018, 22:32
Příspěvky: 1975
Bydliště: Most, Praha
Has thanked: 870 times
Been thanked: 699 times
Busy píše:
Skusal som potom aj to, prejavilo sa to, z 244 kB sa to skratilo na cca 57kB, ale aj tak, voci VC a jeho 10kB je to stale priserne moc :)
Pozor VC defaultne pouziva dynamicke knihovny. Musi se prepnout na staticke aby to bylo porovnatelne.

_________________
i++ (INC) increment
i-- (DEC) decrement
i@@ (EXC) excrement


Nahoru
 Profil  
 
PříspěvekNapsal: 06.08.2020, 11:28 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3661
Bydliště: Bratislava
Has thanked: 373 times
Been thanked: 795 times
Panda38 píše:
Busy píše:
Skusal som potom aj to, prejavilo sa to, z 244 kB sa to skratilo na cca 57kB, ale aj tak, voci VC a jeho 10kB je to stale priserne moc :)
Pozor VC defaultne pouziva dynamicke knihovny. Musi se prepnout na staticke aby to bylo porovnatelne.
Jedinu "nestandartnu" kniznicu, ktoru ten 10kB exac potrebuje pre svoj beh, je vcruntime140.dll. Co som ale disasembloval kod toho 10kB exacu, tak vsetky objektove operacie (konstruktor, funkcia pretazeneho operatora [], destruktor) su uz v nom staticky prilinkovane.

Neobjektovu verziu dynamicky alokovaneho 2D pola (z mojho prispevku vyssie) skompilovalo g++ na 5kB exac. Naozaj nevidim ziadny padny dovod, preco by to len kvoli pouzitiu objektov malo zrazu narast az na 57 kB. Predpokladam, ze tam staticky placlo celu objektovu kniznicu bez ohladu na to co z nej skutocne treba.


Nahoru
 Profil  
 
PříspěvekNapsal: 06.08.2020, 12:15 
Offline
Pan Štábní

Registrován: 11.11.2013, 10:29
Příspěvky: 1200
Has thanked: 363 times
Been thanked: 304 times
Porad nevim, ceho se vlastne snazis dosahnout? Prece s 'dynamickym alokovanim' nema kompilator co delat. Ten jenom vyrobi kod, ktery to umozni. V programu zavolas alokator a ten vrati pointer na pole a do zadne pameti jeste nepristupujes. Potom, kdyz k ni pristupujes, tak pouzijes iterator, aby jsis ukazal na patricny prvek a teprve potom pristoupis do pameti pro zapis/cteni k danemu prvku. Pokud pouzijes objektovy jazyk (C++, C#, Java), muzes nektere akce schovat do konstruktoru/destruktoru/iteratoru, pokud pouzijes 'klasiku' (jazyk C, ASM), pouzijes tyto funkce primo (a mozna se tomu bude rikat trochu jinak), ale bude to principialne stale to same. V kazdem pripade ti kompilator pripravi takovy kod do binarky.
Velikost vysledneho kodu je docela jina kapitola a tady bych ji nesmichaval, protoze pak je to o necem jinem. A linkovani knihoven nebo debug informaci uz vubec ne.

Citace:
Za starých dobrých časů - ve "zlaté éře" počítačů bylo snadné odlišit muže od chlapců (v literatuře označených "Opravdoví muži" a "Pojídači koláčů").

Koukni do nejake ucebnice programovani pro 1. tridu programovani, ne do knihy 'Mistrem sveta v programovani za tyden.'

_________________
Sharp MZ-800++, MZ-1500++, MZ-2500++, SM-B-80T, MK-14_replica, HP-85, ZX-80+replica, ZX81, ZX-Spectrum+replica++, PMI-80+replica, SAM coupe++, PMD-85-2A+3, Didaktik-M, SORD-M5, TI-57, TI-59+PC-100, TI99/4A, ZetaV2+ppp, ZX-uno, Petr


Nahoru
 Profil  
 
PříspěvekNapsal: 06.08.2020, 13:07 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3661
Bydliště: Bratislava
Has thanked: 373 times
Been thanked: 795 times
Mikes21 píše:
Porad nevim, ceho se vlastne snazis dosahnout?
Pisem to v mojom uplne prvom komentari.
Chcem mat dvojrozmerne pole int pole[X][Y], pricom hodnoty X a Y v case kompilacie este nie su zname, a chcem toto pole v zdrojaku adresovat klasickym indexovym sposbom, napr. data = pole[X][Y] pricom kompiler toto skompiluje tak, aby sa interator, ktorym ukazujem na patricny prvok, vypocital sposobom riadok * dlzka_stlpca + stlpec , t.j. tak isto ako pri staticky pevne definovanom poli, len s tym, ze dlzka_stlpca nebude konstanta znama uz pocas prekladu, ale tato hodnota sa bude brat z nejakej premennej (registra).

Uvahy o dlzke vyslednej binarky su len takou temou pomimo navyse, ale netykaju sa povodneho hlavneho problemu.


Nahoru
 Profil  
 
PříspěvekNapsal: 06.08.2020, 19:57 
Offline
Pan Štábní

Registrován: 11.11.2013, 10:29
Příspěvky: 1200
Has thanked: 363 times
Been thanked: 304 times
Aha, takze kdyz ho chces dynamicky alokovat, tak ho na zactu alokuj. Uz jsi ho alokoval? To je funkce malloc() a ta vraci pointer. To je pro tebe v poradku?
Ted uz musez pristupovat k prvkum pole. To uz jsme tu probirali, na konkretni prvek pristoupis pomoci "riadok * dlzka_stlpca + stlpec". Tim mu dodas informace, ktere kompilator jeste nemuze znat, ale program pri behu ano. Pak si muzes delat s prvkem co chces. Jak bude vypadat presny zapis toho pristupu k prvkum uz se tady probiralo. To je taky v pohode?
A nakonec pamet obsazenou dynamickym polem dealokujes. To jsi sice nechtel delat, ale NEdelat to je cesta do pekel. Ale, podle vlastniho uvazeni, to udelej nebo ne. Je to taky v pohode?
Tyhle veci za tebe IMHO nikdo v C neudela. Jak uz jsem psal, nemas konstruktor, destruktor ani pretezovani operatoru a konstanty nemuzes pouzit, kdyz je pri kompilaci neznas. Jine reseni neni, nebo ano?
Je takto problem vyresen, nebo jeste zbyva nejake dalsi ale?

_________________
Sharp MZ-800++, MZ-1500++, MZ-2500++, SM-B-80T, MK-14_replica, HP-85, ZX-80+replica, ZX81, ZX-Spectrum+replica++, PMI-80+replica, SAM coupe++, PMD-85-2A+3, Didaktik-M, SORD-M5, TI-57, TI-59+PC-100, TI99/4A, ZetaV2+ppp, ZX-uno, Petr


Nahoru
 Profil  
 
PříspěvekNapsal: 06.08.2020, 21:10 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3661
Bydliště: Bratislava
Has thanked: 373 times
Been thanked: 795 times
Mikes21 píše:
Je takto problem vyresen, nebo jeste zbyva nejake dalsi ale?
Obavam ze nie celkom rozumiem, co tym celym vlastne myslis. Problem je uz davno vyrieseny, riesenie priniesol Jakub, vid jeho prispevok z 24.07.2020. Nasledne som ja jeho riesenie podrobil analyze (moj prispevok zo dna 26.07.2020) a overil som, ze toto riesenie mi plne vyhovuje.

Ale ked si to uz takto napisal, tak jedna upresnujuca poznamka:
Mikes21 píše:
na konkretni prvek pristoupis pomoci "riadok * dlzka_stlpca + stlpec"
A toto prave nechcem ! Uz som to tu viackrat v diskusii zdoraznoval, ze kvoli prehladnosti a citatelnosti chcem v zdrojaku pouzivat obvyklu zauzivanu syntax pole[x][y] - to znamena, ze nechcem ja ako programator pisat pole[x*w+y] ale vyslovene a doslova chcem pisat dva indexy v dvoch hranatych zatvorkach - pole[x][y].


Nahoru
 Profil  
 
Zobrazit příspěvky za předchozí:  Seřadit podle  
Odeslat nové téma Odpovědět na téma  [ Příspěvků: 39 ]  Přejít na stránku Předchozí  1, 2, 3  Další

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 8 návštevníků


Nemůžete zakládat nová témata v tomto fóru
Nemůžete odpovídat v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete přikládat soubory v tomto fóru

Hledat:
Přejít na:  
Založeno na phpBB® Forum Software © phpBB Group
Český překlad – phpBB.cz