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;
}
proc pri vyvolani funkce suma nemuzu mist &c zadat lib cislo chci li napr do *p_c vlozit cislo
nightfish
Profil
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;
}
Nedari se to zprovozdnit tak jsem myslel ze chyba je u prirazeni 2 do *p_c
nightfish
Profil
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; 
} 
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
nightfish
Profil
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
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; 
}
jde mi o to jestli do *p_c muzu priradit to cislo 2(abych pozdeji mohl vytisknout ve funcki suma) nic vic vim ze to muzu udelat jednodusejc ale potrebuji vedet zda to jde i takhle
Timy
Profil
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 *
Pochopil jsem to tak ze do (double a, double b, double *p_c) musim predat adresy je tak spravne?
nightfish
Profil
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
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 *
jo uz chapu dik.)
dekret
Profil *
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
a zase odznova :)))
dekret
Profil *
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
Bude lepší když začneš uvažovat a půjdeš pěkně od začátku.
dekret
Profil *
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
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
„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 *
jo dik Timy
dekret
Profil *
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
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 *
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
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
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 *
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 *
dobre to mi staci dik ze jste si delali namahu

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

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