Autor | Zpráva | ||
---|---|---|---|
michal454454 Profil |
#1 · Zasláno: 14. 4. 2015, 17:21:07
Zdravím umí zde někdo programovat v C potřeboval bych vysvětlit pár věcí.. díky
|
||
Alphard Profil |
#2 · Zasláno: 14. 4. 2015, 17:25:41
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 |
#3 · Zasláno: 14. 4. 2015, 17:49:02
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 |
#5 · Zasláno: 14. 4. 2015, 18:59:09
moc nechapu vstupni argumenty argc a ukazatele na ne argv
|
||
Alphard Profil |
#6 · Zasláno: 14. 4. 2015, 19:25:09
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 |
#9 · Zasláno: 14. 4. 2015, 20:13:37
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 |
#11 · Zasláno: 14. 4. 2015, 20:22:27
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 |
#12 · Zasláno: 14. 4. 2015, 20:25:23
Potřebujete ukazatel na první prvek, nemusí být globální.
|
||
Časová prodleva: 9 let
|
0