Autor | Zpráva | ||
---|---|---|---|
Porod Profil * |
Ahoj mam jeden problem s chapanim tohoto prikladu:
#include <stdio.h> suma(double a, double b, double *c); main() { double a,b,c; printf("\nZadej cisla a, b : "); scanf("%lf %lf",&a,&b); suma(a,b,&c); printf("\n%f +%f =%f",a,b,c); return; } suma(double a, double b, double *p_c) { *p_c=a+b; return; } |
||
nightfish Profil |
#2 · Zasláno: 24. 3. 2008, 17:30:40
proc pri vyvolani funkce suma nemuzu mist &c zadat lib cislo chci li napr do *p_c vlozit cislo
protože funkce suma má jako třetí parametr odkaz na hodnotu typu double, do které se uloží výsledek součtu použití číselné konstanty na takovém místě je nesmyslné |
||
Porod Profil * |
Myslel jsem to takto:
#include <stdio.h> main() { double a,b; printf("\nZadej cisla a, b : "); scanf("%lf %lf",&a,&b); suma(a,b,2); printf("\n%f +%f",a,b); return; } suma(double a, double b, double *p_c) {double *l, s; *l=a+b; s=*p_c+2; return; } |
||
nightfish Profil |
#4 · Zasláno: 24. 3. 2008, 17:46:33
Nedari se to zprovozdnit
a co to má dělat? nějak to z toho kódu nemohu pochopit (ten původní jsem chápal, sečetla se v něm 2 čísla a vypsal se jejich výsledek) |
||
Porod Profil * |
#include <stdio.h> main() { double a,b; printf("\nZadej cisla a, b : "); scanf("%lf %lf",&a,&b); suma(a,b,2); return; } suma(double a, double b, double *p_c) { printf("%d%d%d",*p_c,a,b); return; } |
||
nightfish Profil |
#6 · Zasláno: 24. 3. 2008, 17:56:37
pouze vytisknout hodnotu *p_c ,a,b nic vic je to zbytecne slozite ale jde pouze o vytisknuti hodnoty *p_c,a,b ve funkci suma
přejmenoval jsem suma na vypis_cisla, protože ta funkce nic nesečítá #include <stdio.h> int main() { double a,b; printf("\nZadej cisla a, b : "); scanf("%lf %lf",&a,&b); vypis_cisla(a,b,2); return 0; } void vypis_cisla(double a, double b, double c) { printf("%f%f%f",c,a,b); return; } |
||
Timy Profil |
#7 · Zasláno: 24. 3. 2008, 17:56:53
Porod
Takže funkce suma() má vzít tři argumenty, sečíst první dva a vytisknout ty dvě čísla a výsledek? Jestli ano, k čemu je tam ten ukazatel? printf("%d%d%d",*p_c,a,b); %d se používá u integrů, ne u double. |
||
Porod Profil * |
Jeste pro zjedniduseni:
#include <stdio.h> main() {double a, b; a=1; b=2; suma(a,b,2); return; } suma(double a, double b, double *p_c) { printf("%f%f%f",*p_c,a,b); return; } |
||
Timy Profil |
#9 · Zasláno: 24. 3. 2008, 18:14:16
Porod
Když tam máš suma(double a, double b, double *p_c), znamená to, že musíš předat pointer, ukazatel, adresu. Předáváš tedy pouze adresu místa v paměti, kde je uložená ta hodnota. Když tomu předáš dvojku suma(a,b,2);, můžeš si to představit tak, že počítač sáhne do paměti, která je označená dvojkou, a až tam bude hledat nějaké číslo. Zkrátka komplilátor ti musí vyhodit chybu na špatný typ argumentu — očekáván je pointer a tys mu předal integer (nebo tak něco). |
||
Timy Profil |
Jo a použíej prosím pro výpis kódu pre a /pre (tlačítko označené dolarem). Ten tvůj výpis kódů je strašný.
— Moderátor (S): Použito <pre> pro formátování dřívejších výpisů kódu kolegy Poroda. — #include <stdio.h> main() { blabla(); } |
||
Porod Profil * |
#11 · Zasláno: 24. 3. 2008, 18:23:09
Pochopil jsem to tak ze do (double a, double b, double *p_c) musim predat adresy je tak spravne?
|
||
nightfish Profil |
#12 · Zasláno: 24. 3. 2008, 18:25:37
Porod
Pochopil jsem to tak ze do (double a, double b, double *p_c) musim predat adresy je tak spravne? ne když je u toho hvězdička (u parametru funkce), tak musíš předat adresu, pokud u toho není nic, tak musíš předat hodnotu |
||
Timy Profil |
#13 · Zasláno: 24. 3. 2008, 18:28:34 · Upravil/a: Timy
Porod
správné volání té funkce je suma(číslo, číslo, pointer na číslo); V tomto případě to číslo musí být konkrétně typu double. Takže třeba nějak takhle: #include <stdio.h> void suma(double a, double b, double *c) { printf("%f%f%f", a, b, *c); } main() { double a, b; double *c; a=1; b=2; *c=3; suma(a, b, c); suma(a, 5, c); /* melo by jit i toto */ suma(a, b, &a); return 0; } |
||
Porod Profil * |
#14 · Zasláno: 24. 3. 2008, 18:37:28
jo uz chapu dik.)
|
||
dekret Profil * |
#15 · Zasláno: 24. 3. 2008, 21:36:10
ahoj trapi me podobny pripad nechapu proc se musi do suma(a, b,& c); zadavat ta adresa & c proc se tam nemuze dat napr. *c v pravidlech je napsano ze se tam misi dat ta adresa ale proc kdyz logicky by to melo jit i s tim *c
#include <stdio.h> void suma(double a, double b, double *c) { printf("%f%f%f", a, b, *c); } main() { double a, b; double *c; a=1; b=2; *c=3; suma(a, b,& c); return 0; } |
||
Měsíček Profil |
#16 · Zasláno: 24. 3. 2008, 22:16:15
a zase odznova :)))
|
||
dekret Profil * |
#17 · Zasláno: 24. 3. 2008, 22:32:27
vysvetlete prosim nekdo proc tam musi byt ta adresa (vim ze do *c se tim ulozi ta adrea aby s tou adresoumohl pracovat ale proc do pointeru nejde ulozit nejake cislo kdyz normalne trba jde *c=3;)
|
||
Měsíček Profil |
#18 · Zasláno: 24. 3. 2008, 22:35:32
Bude lepší když začneš uvažovat a půjdeš pěkně od začátku.
|
||
dekret Profil * |
#19 · Zasláno: 24. 3. 2008, 22:41:47
chapu ukazatele ale ne to prebirani mezi funkcema
suma(a,b,2); suma(double a, double b, double *p_c) to znamena a se nacte do a b se nacte do b(resp. zkopiruje) a 2 by se melo taky zkopirovat do *p_c---je to to same jako *p_c=2; tak prene tenhle posledni radek ----jsem lama |
||
Timy Profil |
#20 · Zasláno: 24. 3. 2008, 23:15:41
dekret
Operátor * vezme adresu nějakého pointeru a vrátí ti to, na co ten pointer ukazuje. Kdežto operátor & ti vrátí adresu, kde je uložená hodnota proměnné. Takže když máš nějaký zápis int a=5;, tak &a ti vrátí adresu, kde je uložená proměnná a — kde je ta pětka. Když na tuhle adresu použiješ operátor *, dostaneš se zpátky na hodnotu a, na pětku. Příklad: int a; int *b; a=5; b=10; První přiřazení je v pohodě, ale druhé ne, protože se nesnažíš měnit hodnotu béčka, ale adresu béčka. Abys přistoupil k hodnotě, musíš použít *b=10. Teď mějme funkci, která bere jako argument ukazatel na int. funkce(a); funkce(b); Nyní je druhý zápis správně, protože předáváme adresu. V prvním zápise předáváme už přímo tu hodnotu, ne adresu. Adresu té hodnoty získáme právě použitím operátoru &: funkce(&b); Kapišto? |
||
Timy Profil |
#21 · Zasláno: 24. 3. 2008, 23:17:44 · Upravil/a: Timy
„a 2 by se melo taky zkopirovat do *p_c---je to to same jako *p_c=2; tak prene tenhle posledni radek“
Ne. On očekává, že mu předáš pointer. Takže když mu předáš dvojku, myslí si, že ta dvojka je adresa nějaké hodnoty. Zkrátka se pokouší hledat hodnotu v nějakém regálku pod štítkem „2“. Představ si to tak, že on neudělá *p_c=2, ale udělá p_c=2. |
||
dekret Profil * |
#22 · Zasláno: 25. 3. 2008, 04:31:40
jo dik Timy
|
||
dekret Profil * |
#23 · Zasláno: 26. 3. 2008, 17:58:43
V prvním zápise předáváme už přímo tu hodnotu, ne adresu
No prave a proc tedy nemuzu predat rovnou tu hodnotu?(vim ze to po me chce abych zadal adresu te hodnoty) |
||
Timy Profil |
#24 · Zasláno: 26. 3. 2008, 18:15:19
dekret
Proč se podepisuješ pod různými vlákny různě…? No prave a proc tedy nemuzu predat rovnou tu hodnotu? & vim ze to po me chce abych zadal adresu te hodnoty Tak tohle nechápu :-). Prostě to chce adresu, pointer. Kdybys to měl deklarované jako nějakou strukturu, musel bys té funkci předat strukturu, taky bys tomu prostě nemohl předat rovnou ty prvky… Já už nevím, jak ti to mám vysvětlit. Zkrátka to, co mu předáš, pro počítač představuje adresu. On neví, že už si mu předal hodnotu a nemá to jak zjistit. Podle definice funkce má přijít adresa a tak ji taky očekává. Takže když mu předáš dvojku, on se koukne do šuplíku označeného dvojkou a až tam hledá hodnotu, se kterou bude dále pracovat. Zpravidla tam najde nesmysl a program spadne. |
||
dekret Profil * |
#25 · Zasláno: 26. 3. 2008, 19:01:07
pointer je adresa kde je ulozena nejaka promenna napr *b=w;
a tomu muzu priradit adresu napr b=&d..tzn. ze d=w; tak proc nemuzu priradit hodnotu *b=w pri vyvolani ty funkce treba takhle vypis_cisla(a,b,2);--volam suma(double a, double b, double *p_c) dyt prece hodnotu a predavam do suma do a a b to sami tak proc to ten program nechape ze chci predat rovnou nejakou hodnotu do toho pointeru(*p_c=2) a az potom bych si treba urcil adresu toho pointeru napr p_c=&t nick mam jinej jinda pac nejsem sam kdo y tohodle pc pise do tohodle fora |
||
Timy Profil |
#26 · Zasláno: 26. 3. 2008, 21:46:23
dekret
„tak proc to ten program nechape ze chci predat rovnou nejakou hodnotu do toho pointeru“ A jak by to měl poznat, jestli mu předáváš hodnotu nebo pointer? Céčko je silně typový jazyk, z čehož vyplývá, že všechny typy argumentů musí být striktně dodržovány, jinak z toho akorát vzniká bordel. Funkce chce pointer, tak jí předej pointer. Tečka. Co na tom probůh nechápeš? |
||
Timy Profil |
#27 · Zasláno: 26. 3. 2008, 21:50:24
dekret
„dyt prece hodnotu a predavam do suma do a a b to sami“ Nechceš psát aspoň trochu česky? Do „a“ a „b“ hodnotu předávat můžeš, protože nejsou ve funkci definovány jako pointery. |
||
es Profil * |
#28 · Zasláno: 27. 3. 2008, 07:20:55
dekret
pointer je adresa kde je ulozena nejaka promenna napr *b=w; a tomu muzu priradit adresu napr b=&d..tzn. ze d=w; *b = w; // b = &d; // Z toho nevyplýva, že d = w, premenné d ani w neboli zmenené a každá obsahuje svoju hodnotu Treba rozlišovať rôzne použitia operátoru * v týchto príkazoch: int *pa = &x; *pa = x; |
||
dekret Profil * |
#29 · Zasláno: 27. 3. 2008, 08:15:48
dobre to mi staci dik ze jste si delali namahu
|
||
Časová prodleva: 16 let
|
0