C pointre – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

C pointre – C / C++ – Fórum – Programujte.comC pointre – C / C++ – Fórum – Programujte.com

 

Poki
~ Anonymní uživatel
29 příspěvků
24. 9. 2015   #1
-
0
-

Zdravim,momentalne studujem pointre v C z jednej stranky a je tam priklad pouzitia pointrov.Nie je to moj kod.Ide o to,ze keby nebol pointer na premennu vysledok tak ten program funguje zle.Ale nechapem ze preco prave na premennu vysledok.Ak by sa to dalo nejako vysvetlit,dakujem :-))

#include <stdio.h>

    /* premenna vysledok je uz pozmenena na smernik */
int vydel( double delenec, double delitel, double *vysledok )
{

    if ( delitel == 0 )
        return 0;                   /* nulou neviem delit, vysledok funkcie je 0 - FALSE */

    *vysledok = delenec / delitel;  /* na adresu, na ktoru ukazuje premenna vysledok, uloz vysledok delenia */
    return 1;                       /* vrat 1 - TRUE */

}

int main()
{

    double vysledokDelenia = 0;

    if ( vydel( 121, 11, &vysledokDelenia ) == 1 )
        printf( "Vysledok delenia je %f\n", vysledokDelenia );    /* vypise sa 11 */
    else
        printf( "Delenia nulou\n" );

    return 0;

}
Nahlásit jako SPAM
IP: 78.98.6.–
BDS+3
Věrný člen
24. 9. 2015   #2
-
0
-

#1 Poki

nevím jestli chápu tvou otázku správně:

vysledek je v premennej protože funkce vrací 1 když se dělení podaří, pokud vrátí 0 tak hodnota vysledokDelenia zůstane nezměněná

dovysvětlení:

int vydel( double delenec, double delitel, double *vysledok )

double vysledokDelenia = 0;

vydel( 121, 11, &vysledokDelenia )

"*vysledok" je v tomto případě pouze odkaz na místo v paměti, kde se nachází vysledokDelenia

Nahlásit jako SPAM
IP: 185.69.69.–
W11 :)
Poki
~ Anonymní uživatel
29 příspěvků
24. 9. 2015   #3
-
0
-

Asi sme sa nepochopili,skusim to inak,preco by ten program bez toho pointru nefungoval?

Nahlásit jako SPAM
IP: 78.98.6.–
BDS+3
Věrný člen
24. 9. 2015   #4
-
0
-

#3 Poki
Fungoval, ale musel by být napsaný jinak, protože kdyby proměnná vysledek nebyla pointer, nemohla by funkce měnit hodnotu vysledokDelenia (protože by neznala její adresu)

Nahlásit jako SPAM
IP: 185.69.69.–
W11 :)
Poki
~ Anonymní uživatel
29 příspěvků
24. 9. 2015   #5
-
0
-

Aha,este jedna otazka . Ucim sa zatial len C,preco je tiez v tom argumente pointer?  

void halt( char *msg )              /* v pripade chyby zavolame tuto funkiu, kt. ukonci program */
{
    printf( "%s\n", msg );
    exit( EXIT_FAILURE );
}
Nahlásit jako SPAM
IP: 78.98.6.–
BDS+3
Věrný člen
24. 9. 2015   #6
-
0
-

#5 Poki
je to přece "adresa pole char" - aby funkce mohla z pole číst

#include <stdio.h>

void halt( char *msg )
{
    printf( "%s\n", msg );
    exit( EXIT_FAILURE );
}

int main()
{
  char m[4] = {"abc"};
  halt(m);
}
Nahlásit jako SPAM
IP: 185.69.69.–
W11 :)
KIIV
~ Moderátor
+43
God of flame
24. 9. 2015   #7
-
0
-

Samozrejme by tam melo byt " const char * " protoze nechces menit ten retezec a pokud bys to nahodou delal, tak to ohlasi chybu

Nahlásit jako SPAM
IP: 94.113.92.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Poki
~ Anonymní uživatel
29 příspěvků
24. 9. 2015   #8
-
0
-

Pfu no budem si to musiet nastudovat este ,pointre boli vzdy mojou slabsou strankou   

Nahlásit jako SPAM
IP: 78.98.6.–
petrph0
Newbie
27. 9. 2015   #9
-
0
-

Jestli tomu rozumím, tak ten  kód funguje správně, ale ptáš se na to proč by fungoval špatně kdyby tam ten pointer nebyl.

Odpověd je ta že když předávaš proměnnou jako parametr do funkce hodnotou (tj. bez pointeru), tak to funguje pouze v jednom směru-do funkce. Tedy do funkce se ti její  hodnota  přenese, ale jestli ten parametr pak v té funkci změníš, tak zpátky už se ta změněná hodnota do té původní proměnné  ve volající funkci main nepřenese.

Kdežto pokud tedy přenásíš do funkce s pomocí pointeru, tak ten pointer (protože pracuje s adresou té původní proměnné předané v parametru)- zajistí v té funkci že provedená změna hodnoty parametru se   zapíše právě  na adresu té původní proměnné ve  volající funkci main  čímž se ta změna přenese :)

Jinak, tedy pointery v C to je skutečně záhul na hlavu. Možná se vyplatí si při učení skoro kreslit šiplky kam co ukazuje.

Nahlásit jako SPAM
IP: 88.100.206.–
KIIV
~ Moderátor
+43
God of flame
27. 9. 2015   #10
-
0
-

#9 petrph
Zjednodusene receno v C se vzdy predavaji parametry hodnotou (tj. dela se kopie).

Pokud je v prototypu double vysledok, tak pri zavolani funkce vydel(..., ..., vysledokDeleni) se jen zkopiruje hodnota 0 do lokalni promenne vysledok a hodnota zanikne s koncem funkce.

Pokud je v prototypu double * vysledok, tak pri zavolani funkce vydel(..., ..., &vysledokDeleni) se zase jen zkopiruje hodnota, ale tentokrate je tou hodnotou adresa, kde je vysledokDeleni ulozen v pameti. Tim, pokud pouzije *vysledok = 1, tak meni hodnotu na adrese, kde je i vysledokDeleni. To jest zmeni se hodnota i mimo funkci. Nicmene pokud bude chtit nejak zmenit adresu, tak ta se ven uz opet nedostane, jelikoz je to jen kopie. (V tomto pripade by to ale nikdo necekal, ale u ruznych abstraktnich typu je to hodne oblibena chyba - menit adresu pointeru ale "zahadne" se jim nedostane ven.

No proste Poki by si mel dat par tydnu studia nejakeho assembleru - pak by pointery pochopit mel.

Nahlásit jako SPAM
IP: 94.113.92.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Kit+15
Guru
27. 9. 2015   #11
-
0
-

#10 KIIV
Jazyk C vlastně je jen vylepšeným assemblerem.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
KIIV
~ Moderátor
+43
God of flame
27. 9. 2015   #12
-
+1
-
Zajímavé
Kit +

#11 Kit
to byl taky primarni ucel. Kazdy samostatny druh procesoru mel jinaci instrukcni sadu, a tak programy nebyly prenositelne bez kompletniho prepsani. V C stacilo mit pro kazdy procesor prekladac.

Nahlásit jako SPAM
IP: 94.113.92.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Poki
~ Anonymní uživatel
29 příspěvků
28. 9. 2015   #13
-
0
-

Ak hovoris ze by som ich mal potom pochopit tak skusim assembler   

Nahlásit jako SPAM
IP: 87.197.31.–
petrph0
Newbie
28. 9. 2015   #14
-
0
-

Takhle razně bych to zase neviděl, ono totiž v assemblerů je podobnejch složitejch  problémů mnohem víc a ty by jsi musel zvládnout taky. Navíc tedy-jak bylo výše zmíněno, tak sady instrukcí assemblerů se pro různé typy procesorů lišej..

Ergo, tedy si myslím že když se naučíš Céčko-a k tomu si dobře ale  opravdu dobře- naučíš a hlavně pochopíš práci s pointerama v Céčku, uděláš líp. Teda, pokud se nechceš živi programováním v assembleru, nebo tedy i v Céčku-ale na týhle základní úrovni  (práce s porty, přímé přístupy do paměti,rezidentní programy a podobně..)

Nahlásit jako SPAM
IP: 2a00:1028:9193:38da:8d60:...–
KIIV
~ Moderátor
+43
God of flame
28. 9. 2015   #15
-
0
-

#14 petrph
muze si zkusit nejakej trivialni asm, treba pro PIC16Fxx. Je tam jen jeden indirect pointer a jeho vysledek se nacita zase z jineho registru. Nebo x51. Ale ty uz se mnohem lepe programuji v C.

Kazdopadne pro pochopeni, jak moc C usnadnuje praci oproti asm, tak to bohate staci. Aby vedel, ze kazda promenna musi byt nekde v pameti ulozena - to jest ma adresu. Ze procesory mivaji pro ty "pointerove" registry i extra instrukce jako pre/post increment/decrement a tak se mohou velice snadno pohybovat v poli (a pole je v C jen adresa na prvni prvek). 

Nahlásit jako SPAM
IP: 94.113.92.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Poki
~ Anonymní uživatel
29 příspěvků
28. 9. 2015   #16
-
0
-

Nikdy som nerobil s asemblerom tak mozno sprosta otazka ,ale ako citam tak je viac typov asembleru podla procesoru?

Nahlásit jako SPAM
IP: 78.98.18.–
Kit+15
Guru
28. 9. 2015   #17
-
0
-

#16 Poki
Správně. Proto se také assembler používá jen tam, kde je to skutečně nutné.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Poki
~ Anonymní uživatel
29 příspěvků
28. 9. 2015   #18
-
0
-

A podla coho sa to deli? AMD/Intel 32/64 bit??   

Nahlásit jako SPAM
IP: 78.98.18.–
petrph0
Newbie
28. 9. 2015   #19
-
0
-

#18 Poki
Jistě že a mnohem více a hlouběji. Abych to popsal obráceně, v podstatě každý nově vyyvinutý procesor může mít  něčím pozměněnou  sadou instrukcí v assembleru, protože hlavně  tím se liší od těch předešlých..

Ale abys nějak planě neteoretizoval, tak i tady na programujte.com je seriál programování v assembleru, tak se jen tak zběžně mrkni na pár lekcí, jestli je to to čemu se chceš věnovat..

Nahlásit jako SPAM
IP: 2a00:1028:9193:38da:d127:...–
Kit+15
Guru
28. 9. 2015   #20
-
0
-

#18 Poki
Pro každý procesor může být jiný nebo dokonce i několik různých assemblerů. Programování je v něm nevýhodné, neboť vytvořené programy nejdou jednoduše přenést na jiné procesory. Také ta pracnost neodpovídá výsledku.

V každém případě je zajímavé nakouknout, jak to ty procesory vlastně uvnitř dělají. Klidně si v tom napiš i pár zajímavých programů. Doporučuji naprogramovat si v assembleru jazyky Lisp nebo Forth. Můžeš nejprve zkusit i daleko jednodušší jazyk Waduzitdo, ale ten nemá moc praktického uplatnění. Pokud tohle zvládneš a bude tě to bavit, můžeš se tomu dál věnovat a stát se v tom odborníkem.

Moderní programovací jazyky úmyslně vývojáře omezují, aby v aplikacích udělal co nejméně chyb. Assembler tě nechá dělat úplné nesmysly a nebude to považovat za chybu. Je tedy mnohem obtížnější napsat v něm fungující aplikaci.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Poki
~ Anonymní uživatel
29 příspěvků
28. 9. 2015   #21
-
0
-

Tak uz som kedysi nejake clanky o asembleri pozeral ,tak kazdopadne to asi skusim sa s tym pohrat pochopit tomu,ale ze by som sa chcel tomu venovat,to urcite nie :-)) Znie to zaujimavo ze spravit v asm nejaky jazyk ,ale zaroven aj ako tazka vyzva:)) 

Nahlásit jako SPAM
IP: 78.98.18.–
kathleenrueb
~ Anonymní uživatel
1 příspěvek
29. 9. 2015   #22
-
0
-

C pointer is an important part in the programming language. I have struggled a lot to learn this concept. Some of the clarification provided here helped me to an idea about this concept. It is really helpful and informative to have an idea about it. Really good!

custom essay writing service

Nahlásit jako SPAM
IP: 117.247.203.–
petrph0
Newbie
29. 9. 2015   #23
-
0
-

#5 Poki
Jinak ještě k té otázce s 
void halt( char *msg )
Jde o to že v C je práce s textovými řetězci zavedena velice "úsporně" a přímo s ukazateli souvisí. Takže to chce skutečně dobře nastudovat a pochopit práci s ukazateli-a až potom začít studovat a zkoušet příklady s textovými řetězci, Což tedy je jak char * tak i char m[n].  Jinak se ti příklady  s řetězci budou mršit a hroutit a ani nebudeš vědět proč..
 

Nahlásit jako SPAM
IP: 2a00:1028:9193:38da:451e:...–
Poki
~ Anonymní uživatel
29 příspěvků
29. 9. 2015   #24
-
0
-

Este otázka ale mimo pointrov..každopádne ďakujem za pomoc ...píšem z mobilu ,nejde mi vložiť kod ...úloha je spočítať čísla 1^1 + 2^2 +3^3 ....+1000^1000 ...
Napisem už len for loop,importujem aj math.h

for(i=0;i

Zasláno z mobilního telefonu.

Nahlásit jako SPAM
IP: 78.98.18.–
Poki
~ Anonymní uživatel
29 příspěvků
29. 9. 2015   #25
-
0
-

Okej tak uz z PC nejak to blblo cez mobil .. kod :  

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main()
{
    double i;
    double sucet=0;
    for (i=0;i<=1000;i++)sucet+=pow(i,i);
    printf("%f",sucet);
}

Ale output mi hadze 1.#INF00 ...tam bude..prikladam aj obrazok z dlhsieho outputu(ak sa nacita),tu zas vypisujem uz iba jednotlive mocniny,nie sucet ..

Připojen obrázek.

Nahlásit jako SPAM
IP: 78.98.18.–
KIIV
~ Moderátor
+43
God of flame
29. 9. 2015   #26
-
0
-

Kdyz pouzijes %lf a double pouzivas, tak se dostanes az k mocnine 143. Nicmene ani double nema dostatecnou presnost (respektive velikost) na tak velka cisla.

Nahlásit jako SPAM
IP: 94.113.92.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Kit+15
Guru
29. 9. 2015   #27
-
0
-

#25 Poki
Výsledek je 

10003681991446951770953750112276467955677936806229346545837609881002\
34910747716194381428659099527845945869942643191290894720342979906407\
67964725986043423846803832604080969103761537037623771364851006311573\
29514617742467055842668657596018158436664428322845568803131145481515\
39190975398485496645576513465858582712336401166221956188173449531674\
10268890832176466302030669977040862534076609159502279137936809836930\
63756028138566463587737515587752134602257965798465833340073493586243\
42339332981334571237888809283103348760261360175950815609179464026871\
00524365210998086355214201424290343406856093657323107934219403186441\
39181012381510565092673935157603928424725013915940734630015218438110\
73767021711026307504695733467897821866906648469828346607412967395801\
79779168360983472243224195284535256468186824036956956619282555532355\
80780619975276899838488633747867893315815652520591726143394246009861\
43259233167583371070362625554531852054166117148858229508581589614337\
59446327755438051838092130121883632710223140733220110974010258021646\
92983317669206196460837907328076273606144280851715650062897285086889\
64226799647192582924058589530750674578385365561878559589685756225692\
34891474692281091391561983475411764835803581412867029415856566994208\
77362863909422415472260150044713306301130720427042889050421426281937\
71918594574302202147201188486345913190833752307476966010547423928871\
06311878302603638131903905200825207205793366671291894623331279369709\
40742241878720459709764443092427821877383202574900808243300749916986\
98239561125811127607863900355221737846690567707344074494145266662103\
83981284021630344847691395707235573271662709837224522304679291974725\
91131574258240648583314154009432782130429546350535740452099845122212\
64241903550178416824551412548637590007779082539288247751653566899882\
74959440589510258798553952770949351004954644542726561747839910718823\
86817712159042341193922474897510790859480559450988056179637229284695\
54263782217625160428008228845552540344494860195267115187092227766195\
75390721112664615014061474423397476527347561996431185285861416781966\
83401247304877101620067935299857588206536772743795633134954545266327\
18723482339494825759821076401694316043456512117937935456463521463021\
19772669498355892913235757618859497751663073421286386945616420552553\
67673112981371825114946494636630737592192130568235616677760937394257\
42883930712609962163464088038826569132032160692637206183085942987973\
68458427649178484311547207790040169259569411927355351102599126544603\
93662889217435813332000837171052411715046068835434188620240475521770\
55263424469501298905901938158245938633694105024815166679813689156668\
34119771347509438990488712679446890189385047505001120522574245555562\
57505602132303879103379839503332450206532389891155070138829562777638\
80795687210857196493893142656713105966275422144605988058939600603604\
22692140140209651929425048867029798339635327946045314237554226788198\
91974817897806789550937631936586036908984748269769065444739780174557\
20367929981796023041785852626797271283465789498383642350667978127819\
110846700

Možná to je ten důvod, proč to ten tvůj program nezvládá.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Poki
~ Anonymní uživatel
29 příspěvků
29. 9. 2015   #28
-
0
-

Haha,pekne cislo     tak to asi nepude no :) ale diky za pomoc

Nahlásit jako SPAM
IP: 78.98.18.–
petrph0
Newbie
29. 9. 2015   #29
-
0
-

Koukám na to... Skutečně máte za úkol spočítat mocniny jako tisíc na tisícou??? To se obáva´m že tak velké číslo ani pow nedokaze spocitat, ale ani typy double ani long double ulozit, tam je max 10 na 308...

Nahlásit jako SPAM
IP: 2a00:1028:9193:38da:d822:...–
Kit+15
Guru
29. 9. 2015   #30
-
0
-

#29 petrph
Možná je účelem té úlohy, aby se to nedalo spočítat jednoduše.

Jak vidíš, spočítat se to dá. Jen je na to potřebná knihovna pro práci s dlouhými čísly.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Poki
~ Anonymní uživatel
29 příspěvků
29. 9. 2015   #31
-
0
-

Nene,ja som si zle precital ulohu :)) ale samozrejme prisiel som na to az neskor,je to z ProjectEuler a mam ziskat poslednych 10 cislic toho cisla,ale ako to naprogramovat v Ccku to fakt neviem :)

Nahlásit jako SPAM
IP: 78.98.18.–
Kit+15
Guru
29. 9. 2015   #32
-
0
-
Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Poki
~ Anonymní uživatel
29 příspěvků
29. 9. 2015   #33
-
0
-

Nechapeme sa Kit . Project Euler je stranka na ktorej su rozne ulohy o programovani / matematike. Jedna z uloh je spocitat tie mocniny 1^1 + 2^2 + ...1000^1000 a potom ziskat poslednych 10 cislic tohto suctu ,t.j. cisla ktore si mi sem postol :)

Nahlásit jako SPAM
IP: 78.98.18.–
Kit+15
Guru
29. 9. 2015   #34
-
0
-

#33 Poki
Aha, takže ty potřebuješ spočítat to číslo 9110846700. Zkus po každém násobení udělat modulo 10^10. Tím se ti odstřihne předek a zůstane jen spodních 10 číslic.

Budeš potřebovat 64bitový integer, tedy long.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Poki
~ Anonymní uživatel
29 příspěvků
29. 9. 2015   #35
-
0
-

No v podstate ja potrebujem z toho tvojho mega cisla ziskat 9110846700. :) Neviem ci myslime to iste :)

Nahlásit jako SPAM
IP: 78.98.18.–
KIIV
~ Moderátor
+43
God of flame
29. 9. 2015   #36
-
0
-

#35 Poki
Kit te jen upozornuje na to, ze abys dostal poslednich par cislic nepotrebujes znat cele cislo

Nahlásit jako SPAM
IP: 94.113.92.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Poki
~ Anonymní uživatel
29 příspěvků
29. 9. 2015   #37
-
0
-

Teraz neviem co myslí tým po násobeni...myslíš volanie fcie pow? Alebo sa nechápeme už vôbec :X

Zasláno z mobilního telefonu.

Nahlásit jako SPAM
IP: 78.98.18.–
KIIV
~ Moderátor
+43
God of flame
29. 9. 2015   #38
-
0
-

#37 Poki
zalezitost asi minuty:

#include <iostream>
#include <cstdint>

int main(int argc, char** argv) {
  uint64_t sum=1;

  for (uint64_t i = 2; i<=1000; ++i) {
    uint64_t tmp = i;
    for (uint64_t j=2; (tmp!=0) && (j<=i); ++j) {
      tmp *= i;
      tmp = tmp%10000000000ULL;
    }
    sum += tmp;
  }
  std::cout << (sum%10000000000ULL) << std::endl;
}
Nahlásit jako SPAM
IP: 94.113.92.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Kit+15
Guru
29. 9. 2015   #39
-
0
-

#37 Poki
Ty používáš funkci pow()? Raději na ni zapomeň. Tato funkce je prakticky k ničemu a pro uvedený případ se vůbec nehodí.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 129 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý