Autor Zpráva
michal454454
Profil
Zdravím umí zde někdo programovat v C potřeboval bych vysvětlit pár věcí.. díky
Alphard
Profil
Určitě hodně lidí, je to snad první jazyk, který se učí na informatice. Nicméně, tohle fórum se zaměřuje na tvorbu webu. Programujete v C web?
Dotazy mimo téma diskuse nejsou žádoucí.
michal454454
Profil
a neporadil bys mi prosim mimo forum potřebuju něco k testu.. dik
Alphard
Profil
Když už jsi založil tohle vlákno, tak sem dej i ten dotaz, ať to tady má aspoň nějaký smysl.
michal454454
Profil
moc nechapu vstupni argumenty argc a ukazatele na ne argv
Alphard
Profil
Jednoduchý příklad je např. na wwwx.cs.unc.edu/~sparkst/howto/cpp_main.php.
#include <stdio.h>
int main( int argc, const char* argv[] )
{
    // Prints each argument on the command line.
    for( int i = 0; i < argc; i++ )
    {
        printf( "arg %d: %s\n", i, argv[i] );
    }
}

Do argc se předá počet argumentů a argv je pole pointrů na char, někdy se také uvádí char** argv.
Předpokládám, že problém s pochopením se týká spíš těch pointrů v argv. V C se standardně pracuje tak, že pointery ukazují na první znak znakového pole a funkce pro práci s řetězci čtou znaky tak dlouho, dokud nenarazí na \0. A když chceme mít pole řetězců, vytvoříme pole pointrů na první znaky jednotlivých řetězců, proto char** argv.
michal454454
Profil
a například u volani funkci u spojových seznamu treba u funkce
void dealokuj(SPOJAK **p)

nechapu potom to volani funkce.. přitom volani musím pouzit tu globalni promennou? ta lokalni je jen v te funkci to je ten pointer na pointer na spojak zejo? :)

ta cela funkce je nejak takto ne?
void dealokuj(SPOJAK **p){
SPOJAK *pom=p;
while(p->další != NULL){
p=p->další;
free (pom);
}
juriad
Profil
Ta funkce je úplně špatně.
SPOJAK je nějaký typedef. Očekával bych něco jako:
typedef struct spojak {
  int hodnota; // nebo jaký to má být datový typ
  struct spojak * dalsi; // odkaz na další prvek
} SPOJAK;

Pak funkce dealokuj bude vypadat:
void dealokuj(SPOJAK * p) {
  SPOJAK * tmp; // dočasná proměnná
  while (p != NULL) { // dokud něco existuje
    tmp = p->dalsi; // zapamatujeme odkaz na další prvek
    free(p); // uvolníme součaný prvek
    p = tmp; // přesuneme se na zapamatovaný
  }
}

Možná se ti bude lépe přemýšlet nad rekurentní variantou (nepoužívej):
void dealokuj(SPOJAK * p) {
  if (p == NULL) return; // máme hotovo
  SPOJAK * tmp = p->dalsi; // zapamatujeme si další prvek
  free(p); // zrušíme sebe
  dealokuj(tmp); // a pak zbytek
}

Nebo obdobně:
void dealokuj(SPOJAK * p) {
  if (p == NULL) return; // máme hotovo
  dealokuj(p->dalsi); // zrušíme zbytek
  free(p); // a pak i sebe
}
michal454454
Profil
a jaký je rozdíl mezi tou promennou SPOJAK *tmp a SPOJAK *p proc je jedna jako ten formalni vstupni argument a druha je primo ve funkci?
juriad
Profil
Funkci dealokuj předáváš jeden argument - ukazatel na prvek spojáku (to je ta struktura (typedef) SPOJAK).
Uvnitř té funkce si potřebuješ vytvořit dočasnou (lokální) proměnnou, kterou budeš používat jen uvnitř té funkce.
Funkce vyžaduje (z logického pohledu) jeden argument, ne dva a ne nula.
michal454454
Profil
a když tu funkci budu volat tak potrebuji teda ještě nekde mimo funkci globalni pointer na strukturu ne? abych ji pomoci jeho adresy mohl zavolat?
Alphard
Profil
Potřebujete ukazatel na první prvek, nemusí být globální.

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0