Proč je syntaxe programovacích jazyků tak složitá?

Re:Proč je syntaxe programovacích jazyků tak složitá?
« Odpověď #105 kdy: 25. 12. 2018, 20:19:52 »
rozhodne nesúhlasím.

Citace
Mně teda spíš než pojmenování proměnných vadí ten dvojí způsob zápisu return NULL;, který musí druhý programátor rozluštit a zamyslet se, zda je to bug nebo zamýšlené chování.

čože? ja tam nikde nevidím dvojí způsob zápisu return NULL; Druhý if nieje kontrola na NULL ale na prázdnu hodnotu,... rozdiel:


Aha, takže je to tedy bug. '\0' má numerickou hodnotu nula, takže výsledek return NULL a return '\0' je stejný - vyzkoušej si to. (Pro hnidopichy: je stejný za předpokladu, že makro NULL je definováno jako nula.) Předpokládám, že spíš než return '\0' bylo myšleno return "". Vzhedem k tomu, že ten kód jinak vrací pointer na dynamicky alokovanou paměť by ale i to bylo špatně.

ne neni to stejný.... ani zdaleka. skus odstraniť overenie na NULL, a predaj ten metóde parameter NULL, nepôjde to.
Zatiaľ čo NULL znamená NULL teda nič. Tak prázdna hodnota znamená že je niekde v pamäti miesto, kde je premenná s prázdnou hodnotou. A '\0' je v podstate zakončenie stringu, ktorá je v C reprezentovaná poľom znakov.

Protoze ti to umozni veci pojmenovat.

a čo z toho pomenovania mám? to je jak kdybych si prišiel do mcdonaldu a pomenoval by som každú časť hamburgera ktorý si chem kúpiť... namiesto teda "chcem kurací hamburger" by som povedal "chcem dolnú časť žemle hamburgeru na ňom kurací rezeň, a na ňom hornú časť žemle hamburgeru". Abstrakce k hovnu.

Protoze pak neni ta metoda ten chliv, co jsi poslal, ale neco, co se da precist a pochopit.


Mlocik97

  • *****
  • 949
  • Ubunťák, JS dev.
    • Zobrazit profil
    • E-mail

Mlocik97

  • *****
  • 949
  • Ubunťák, JS dev.
    • Zobrazit profil
    • E-mail
Re:Proč je syntaxe programovacích jazyků tak složitá?
« Odpověď #107 kdy: 25. 12. 2018, 20:21:50 »
Protoze pak neni ta metoda ten chliv, co jsi poslal, ale neco, co se da precist a pochopit.

naopak... môj kód je omnoho prehladnejší než 99% zdrojákov v Pythone nejakých zmysluplnejších projektov.
« Poslední změna: 25. 12. 2018, 20:26:07 od Gabriel Mlocik »

Neviditelný

Re:Proč je syntaxe programovacích jazyků tak složitá?
« Odpověď #108 kdy: 25. 12. 2018, 20:27:33 »
rozhodne nesúhlasím.

Citace
Mně teda spíš než pojmenování proměnných vadí ten dvojí způsob zápisu return NULL;, který musí druhý programátor rozluštit a zamyslet se, zda je to bug nebo zamýšlené chování.

čože? ja tam nikde nevidím dvojí způsob zápisu return NULL; Druhý if nieje kontrola na NULL ale na prázdnu hodnotu,... rozdiel:


Aha, takže je to tedy bug. '\0' má numerickou hodnotu nula, takže výsledek return NULL a return '\0' je stejný - vyzkoušej si to. (Pro hnidopichy: je stejný za předpokladu, že makro NULL je definováno jako nula.) Předpokládám, že spíš než return '\0' bylo myšleno return "". Vzhedem k tomu, že ten kód jinak vrací pointer na dynamicky alokovanou paměť by ale i to bylo špatně.

ne neni to stejný.... ani zdaleka. skus odstraniť overenie na NULL, a predaj ten metóde parameter NULL, nepôjde to.
Zatiaľ čo NULL znamená NULL teda nič. Tak prázdna hodnota znamená že je niekde v pamäti miesto, kde je premenná s prázdnou hodnotou. A '\0' je v podstate zakončenie stringu, ktorá je v C reprezentovaná poľom znakov.
Aha, zřejmě jsme se nepochopili. Pokud odstraním NULL kontrolu a předám funkci NULL pointer, samozřejmě to spadne. Pokud té funkci ale předám řetězec nulové délky (ta druhá kontrola), funkce b_e taky vrátí NULL. Z kódu není zřejmé, zda jsi to tak chtěl je to typický Cčkový bug.

Mlocik97

  • *****
  • 949
  • Ubunťák, JS dev.
    • Zobrazit profil
    • E-mail
Re:Proč je syntaxe programovacích jazyků tak složitá?
« Odpověď #109 kdy: 25. 12. 2018, 20:34:38 »
Aha, zřejmě jsme se nepochopili. Pokud odstraním NULL kontrolu a předám funkci NULL pointer, samozřejmě to spadne. Pokud té funkci ale předám řetězec nulové délky (ta druhá kontrola), funkce b_e taky vrátí NULL. Z kódu není zřejmé, zda jsi to tak chtěl je to typický Cčkový bug.

nerozumíš tomu... prečítaj si toto PDF... NULL vs '\0' je ako když ti dá niekto do ruky prázdnu krabicu a v druhej ruke by si nič nemal, a niekto ti povedal, porovnaj to... samozrejme že v rukách nedržíš to isté "akože nič (jak bys to pojmenoval)". A skus si výsledok b_e nekde vypsať... týmto kódom:

Kód: [Vybrat]
int main(int argc, char const *argv[]) {
        unsigned char* b_ev = b_e(argv[1]);
if (b_ev != NULL) {
size_t k = strlen((char*)b_ev);
for (size_t i = 0; i < k; i++) {
printf("%x", (unsigned int)b_ev);
}
printf("\n");
} else {
printf("NULL\n");
}
free(b_ev);
b_ev = NULL;
}

v jednom prípade ti do konzole vypíše NULL v druhom zas prázdny riadok. p.s. to je taky môj kód. Rozdiel je teda
Kód: [Vybrat]
./aa
Kód: [Vybrat]
./a ""
« Poslední změna: 25. 12. 2018, 20:37:17 od Gabriel Mlocik »


Kit

Re:Proč je syntaxe programovacích jazyků tak složitá?
« Odpověď #110 kdy: 25. 12. 2018, 20:36:17 »
Pokud odstraním NULL kontrolu a předám funkci NULL pointer, samozřejmě to spadne. Pokud té funkci ale předám řetězec nulové délky (ta druhá kontrola), funkce b_e taky vrátí NULL. Z kódu není zřejmé, zda jsi to tak chtěl je to typický Cčkový bug.

Proč bys měl předávat funkci NULL pointer, když vyžaduje instanci třídy? Proč by nějaká funkce měla vracet NULL, když má vracet instanci třídy?

Mlocik97

  • *****
  • 949
  • Ubunťák, JS dev.
    • Zobrazit profil
    • E-mail
Re:Proč je syntaxe programovacích jazyků tak složitá?
« Odpověď #111 kdy: 25. 12. 2018, 20:44:12 »
Protoze pak neni ta metoda ten chliv, co jsi poslal, ale neco, co se da precist a pochopit.

takže podľa tebe je jednoduchšie povedať "chcem dolnú časť žemle hamburgeru na ňom kurací rezeň, a na ňom hornú časť žemle hamburgeru" než "chcem kurací hamburger", to je teda fajn logika. Čitatelnejšie to o nič nieje, a ani to nepotrebuješ. Predsa si hamburger kupuješ ako celok. Obsah hamburgeru zaujíma len zamestnanca mcdonalda, ktorý ale vytvára celistvý "produkt" teda hamburger.
« Poslední změna: 25. 12. 2018, 20:48:35 od Gabriel Mlocik »

Neviditelný

Re:Proč je syntaxe programovacích jazyků tak složitá?
« Odpověď #112 kdy: 25. 12. 2018, 20:47:47 »
Aha, zřejmě jsme se nepochopili. Pokud odstraním NULL kontrolu a předám funkci NULL pointer, samozřejmě to spadne. Pokud té funkci ale předám řetězec nulové délky (ta druhá kontrola), funkce b_e taky vrátí NULL. Z kódu není zřejmé, zda jsi to tak chtěl je to typický Cčkový bug.

nerozumíš tomu... prečítaj si toto PDF... NULL vs '\0' je ako když ti dá niekto do ruky prázdnu krabicu a v druhej ruke by si nič nemal, a niekto ti povedal, porovnaj to... samozrejme že v rukách nedržíš to isté "akože nič (jak bys to pojmenoval)". A skus si výsledok b_e nekde vypsať... týmto kódom:

Kód: [Vybrat]
int main(int argc, char const *argv[]) {
        unsigned char* b_ev = b_e(argv[1]);
if (b_ev != NULL) {
size_t k = strlen((char*)b_ev);
for (size_t i = 0; i < k; i++) {
printf("%x", (unsigned int)b_ev);
}
printf("\n");
} else {
printf("NULL\n");
}
free(b_ev);
b_ev = NULL;
}

v jednom prípade ti do konzole vypíše NULL v druhom zas prázdny riadok. p.s. to je taky môj kód. Rozdiel je teda
Kód: [Vybrat]
./aa
Kód: [Vybrat]
./a ""

Mně ten kód vypíše NULL pro oba případy, což by podle mě měl.

Pokud odstraním NULL kontrolu a předám funkci NULL pointer, samozřejmě to spadne. Pokud té funkci ale předám řetězec nulové délky (ta druhá kontrola), funkce b_e taky vrátí NULL. Z kódu není zřejmé, zda jsi to tak chtěl je to typický Cčkový bug.

Proč bys měl předávat funkci NULL pointer, když vyžaduje instanci třídy? Proč by nějaká funkce měla vracet NULL, když má vracet instanci třídy?
V Cčku žádné třídy nejsou, NULL jako indikace neexistující či neplatné hodnoty se tam běžně používá a v kódu se s tím má počítat.

Mlocik97

  • *****
  • 949
  • Ubunťák, JS dev.
    • Zobrazit profil
    • E-mail
Re:Proč je syntaxe programovacích jazyků tak složitá?
« Odpověď #113 kdy: 25. 12. 2018, 20:52:41 »
Neviditelný, prečítaj si http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1124.pdf sekci 6.3.2.3, §3

resp. aký je rozdiel medzi

Kód: [Vybrat]

a

Kód: [Vybrat]
00000000
« Poslední změna: 25. 12. 2018, 20:59:16 od Gabriel Mlocik »

Neviditelný

Re:Proč je syntaxe programovacích jazyků tak složitá?
« Odpověď #114 kdy: 25. 12. 2018, 20:57:39 »
Neviditelný, prečítaj si http://c-faq.com/null/ptrtest.html a http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1124.pdf sekci 6.3.2.3, §3

Ach jo, já vím, jak to funguje. Zkompiluj si kód níže a podívej se na výsledek. Pokud to nekompiluješ nějakým prazvláštním kompilátorem, musí to fungovat tak, jak říkám:

Kód: [Vybrat]
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

unsigned char* b_e(const char* text) {
  if (text == NULL) {
    return NULL;
  }
  if (text[0] == '\0') {
    return '\0';
  }
  size_t k = strlen(text);
  unsigned char* t = (unsigned char*)calloc((k+1), sizeof(char));
  int b[k][8];
  for (size_t i = 0; i < k; i++) {
    for (size_t j = 8, m = 0; j > 0; j--, m++) {
      b[i][m] = (text[i] & (1 << (j-1))? 1 : 0);
    }
  }
  for (size_t i = 0; i < k; i++) {
    for (size_t j = 0; j < 4; j = (j+2)) {
      int d;
      d = b[i][j];
      b[i][j] = b[i][j+1];
      b[i][j+1] = d;
    }
  }
  for (size_t i = 0; i < k; i++) {
    for (size_t j = 4; j < 8; j++) {
      b[i][j] = (b[i][j]^b[i][j-4]);
    }
  }
  int x[k];
  for (size_t i = 0; i < k; i++) {
    int d = 0;
    for (size_t j = 0; j < 8; j++) {
      if (b[i][j] == 1) {
        d = d * 2 + 1;
      } else if (b[i][j] == 0) {
        d *= 2;
      }
    }
    x[i] = d;
  }
  for (size_t i = 0; i < k; i++) {
    t[i] = (unsigned char)x[i];
  }
  t[k] = '\0';

  return t;
};

void prn(const char *in)
{
  unsigned char *ret = b_e(in);

  printf("Input ptr: %p\n", (void *)in);

  if (ret == NULL)
    printf("NULL INPUT\n");
  else {
    printf("%p\n", (void *)ret);
    free(ret);
  }
}

int main(int argc, char const* argv[]) {
  (void)argc; (void)argv;

  const char* none = NULL;
  const char *empty = "";
  const char empty2[] = { '\0' };
  const char *valid = "abcde";

  prn(none);
  prn(empty);
  prn(empty2);
  prn(valid);

  return 0;
}

Mně to vrátí

Kód: [Vybrat]
Input ptr: (nil)
NULL INPUT
Input ptr: 0x5582cd85901e
NULL INPUT
Input ptr: 0x7ffd5eff2417
NULL INPUT
Input ptr: 0x5582cd85901f
0x5582ce11d670

Mlocik97

  • *****
  • 949
  • Ubunťák, JS dev.
    • Zobrazit profil
    • E-mail
Re:Proč je syntaxe programovacích jazyků tak složitá?
« Odpověď #115 kdy: 25. 12. 2018, 21:00:28 »
nerozumieš tomu.... konec debaty. Když nedokážeš porozumieť ani tomuto:
https://stackoverflow.com/questions/1296843/what-is-the-difference-between-null-0-and-0
tak je to tragické.

Kit

Re:Proč je syntaxe programovacích jazyků tak složitá?
« Odpověď #116 kdy: 25. 12. 2018, 21:01:15 »
No a to je ešte horšie než end... pretože si pak nemôžem uživateľsky prispôsobiť formátovanie kódu. A okrem toho čo je odsadenie? pojem jasnej, ale z pohladu súboru to niekde sú 2 medzery, niekde 4 medzery, niekde tab, niekde inde zas neco jiného. A najmä miešať kombinácie odsadenia je niečo čo si koleduje o problém, a zas ak by sa nemiešali, no neviem jak by sis zarovnal pod sebe zložitejšie kódy, trebárs už u parametrov funkcií musí to byť docela problém, mať tie parametre rozpísané na viac riadkov. Ak to i samotný jazyk / kompilér vie zhltnúť ok, ale čo uživateľ. Jak rozozná čo je odsadenie/zarovnanie a čo ukončenie nejakého bloku kódu.... proste to je chaos.

V Pythonu je formátování kódu součástí syntaxe, stejně jako u formátu YAML. Prostě si na to zvykni nebo používej jiný jazyk. V rámci jednoho bloku smí být odsazení jen jednoho typu - doporučuje se však používat důsledně 4 mezery. Nebudeš mít problémy při práci v týmu. U formálních parametrů si odsazování hlídat nemusíš, tam jsou podstatné čárky a uzavírací závorka.

príklad z wikipedie:
Kód: [Vybrat]
def qsort(L):
    if L == []:
        return []
    pivot = L[0]
    return (qsort([x for x in L[1:] if x < pivot]) +
            [pivot] +
            qsort([x for x in L[1:] if x >= pivot]))

len pár riadkov kódu a už mi trvá dobrú sekundu zistiť ťo posledné 3 riadky vlastne predstavujú, a čo všetko pod return patrí. A když by za tím pokračoval kód (teda kdby to nebyl return), a kdyby toho kódu bolo 100 riadkov, tak som totálne z toho... by mi proste trvalo niekoľko sekúnd len pochopiť čo pod čo patrí.

Quicksort asi programovat nebudeš - nemá to praktický význam. Kromě toho je ten příklad blbě. Po troše zkušeností zjistíš, že binární operátor na konci bude znamenat na následujícím řádku, podobně jako neuzavřená závorka. Nejsem však příznivcem zalamování, totéž se dá zapsat i bez něho:
Kód: [Vybrat]
def qsort(L):
    if L == []:
        return []
    pivot = L[0]
    left = qsort([x for x in L[1:] if x < pivot])
    right = qsort([x for x in L[1:] if x >= pivot])
    return left + [pivot] + right
Sice je to stále blbě, ale už je to bez zalamování.

lopata

Re:Proč je syntaxe programovacích jazyků tak složitá?
« Odpověď #117 kdy: 25. 12. 2018, 21:03:20 »
nerozumíš tomu... prečítaj si toto PDF... NULL vs '\0' je ako když ti dá niekto do ruky prázdnu krabicu a v druhej ruke by si nič nemal,
Bohužel tomu nerozumíš ty, Mlociku. V C je NULL typicky to stejné jako '\0'. Mimochodem máš tam typovou chybu, vracet char tam, kde se očekává pointer, v modernějších jazycích než je C z dobrých důvodů nelze. V C to projde jen díky tomu, že provádí implicitní konverze. Začni raději s Pythonem, tam se ti nepodaří střelit se takhle snadno do vlastní nohy.

Neviditelný

Re:Proč je syntaxe programovacích jazyků tak složitá?
« Odpověď #118 kdy: 25. 12. 2018, 21:08:41 »
nerozumieš tomu.... konec debaty. Když nedokážeš porozumieť ani tomuto:
https://stackoverflow.com/questions/1296843/what-is-the-difference-between-null-0-and-0
tak je to tragické.
Tvůj kód přeložený dvěma překladači (Clang 7 a GCC 8.2) vrací výstup, který odporuje tvému tvrzení a tomu nerozumím? Co vypíše ten můj zkušební kód tobě?

Např. v C++14 by se ta funkce b_e, jak je napsána teď nepřeložila vůbec.

Mlocik97

  • *****
  • 949
  • Ubunťák, JS dev.
    • Zobrazit profil
    • E-mail
Re:Proč je syntaxe programovacích jazyků tak složitá?
« Odpověď #119 kdy: 25. 12. 2018, 21:12:27 »
ja když predám funkci b_e prázdny string, tak to vráti prázdny string a teda aj vypíše prázdny riadok... v prípade že mu predám NULL tak vypíše NULL.