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

C - help – C / C++ – Fórum – Programujte.comC - help – C / C++ – Fórum – Programujte.com

 

C
~ Anonymní uživatel
9 příspěvků
23. 11. 2015   #1
-
0
-

Zdravim ,mam nasledujuci kod  

#include <stddef.h>

int main(void)
{

    char *text = "Hello world!";
    char *u1 = text, *u2;
    size_t i = 0;
    ptrdiff_t diff;

    while(text[i]) i++;
    u2 = text+i;
    diff = u1 - u2;

    printf("size_t i = %Iu, ptrdiff_t diff = %Ii\n", i, diff);
    return 0;
}


Nerozumiem riadku  

u2 = text+i;


Mozem scitat char(string) a size_t?A ešte jedna vec  

diff = u1 - u2;


,takto mozem odpocitat 2 stringy aby som zistil rozdiel dlzky tychto stringov?Vďaka :-)

Nahlásit jako SPAM
IP: 78.98.1.–
Kit+15
Guru
23. 11. 2015   #2
-
0
-

#1 C
A já myslel, že chceš něco s helpem. Co má ten tvůj program s helpem společného?

Měl by ses učit C na něčem jiném, než na tomhle prasekódu.

Nesčítáš char s velikostí, ale hodnotu ukazatele s velikostí.

Tím rozdílem zjistíš délku vyhrazeného pole pro string, ale je to jen další prasárna, která se ti v budoucnu může krutě vymstít.

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.
C
~ Anonymní uživatel
9 příspěvků
23. 11. 2015   #3
-
0
-

Čo je na tom "prasárna"? :-)

Nahlásit jako SPAM
IP: 78.98.1.–
Kit+15
Guru
23. 11. 2015   #4
-
0
-

#3 C
Spoléhá se na to, že ukazatele u1 a u2 ukazují v paměti na dvě místa jdoucí za sebou a že jejich rozdíl něco znamená. Takhle se dnes nedá programovat, protože nikdy nevíš, kdy to po tobě někdo bude předělávat. Stačí, abys char vyměnil za int a celé se ti to rozsype.

Také se nauč pojmenovávat proměnné. Z názvů u1 a u2 nic nevyčteš.

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.
C
~ Anonymní uživatel
9 příspěvků
23. 11. 2015   #5
-
0
-

Aha,to nie je moj kod,je to zo stranky,len som tomu moc nechapal kedze zacinam s C,samozrejme by som takto ja premenne nikdy nepomenoval,diky za pomoc :-)

Nahlásit jako SPAM
IP: 78.98.1.–
C
~ Anonymní uživatel
9 příspěvků
23. 11. 2015   #6
-
0
-

Mozem este jednu otazku,ako tuto strukturu vypisem naraz nejako,da sa to ? :-)  

#include <stdio.h>
#include <string.h>
struct Books{
    char nameOfBook[100];
    int year;
};

void printStruct(struct Books *book);

int main(void)
{
    int i;
    struct Books Book[10],*book_pointer;

    strcpy(Book[0].nameOfBook,"Harry Potter");
    Book[0].year=2007;

    strcpy(Book[1].nameOfBook,"Hunger Games");
    Book[1].year=2015;

    book_pointer=&Book[2];
    strcpy(book_pointer->nameOfBook,"Karkulka");
    book_pointer->year=1997;

    for (i=0;i<3;i++) printStruct(&Book[i]);


}
void printStruct(struct Books *book){
    printf("%s--",book->nameOfBook);
    printf("%d",book->year);
    printf("\n");
}
Nahlásit jako SPAM
IP: 78.98.1.–
KIIV
~ Moderátor
+43
God of flame
24. 11. 2015   #7
-
0
-

Ten prvni kod je zrovna jeden z lepsich, protoze pouziva size_t nebo ptrdiff_t pro velikosti a rozdily pointeru. (V horsim by to byly inty)

Pole v C je 100% v pameti pekne v kuse a za sebou (nejsme v Jave, kde neni za sebou v pameti nic). A kdyz se u1 a u2 inicializuje ze stejneho pointeru, jen s jinym offsetem, neni duvod, proc by to nemelo hodit co ceka.

A u charu by to mely byt stejne cisla. U vetsich typu take, za predpokladu, ze se zmeni typy jak textu, tak u1, u2. Ale u poli typu int se moc nepouziva hodnota 0 jako konec, protoze 0 dava obvykle smysl.

A ke strukture: jak myslis naraz?

Jako: printf("%s--%d\n", book->nameOfBook, book->year); ??

 

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

Neviem ci to ide,ale napriklad v mojom kode mam funkciu na vypisanie tej struktury a potom to volam pre kazde zvlast,neviem ako sa to nazyva ,myslim toto  ,ze ci sa neda spravit nejaka fcia,do ktorej ako parameter dam celu strukturu a vypise sa ale to je blbost ,este by ma zaujimalo ake su vyhody pri strukturach ked do nich zapisujem udaje cez pointre  ako "normalne".A ako si mozem predstavit ze je v pamati ulozena taka struktura? :-)

book_pointer->year=1997 
    vsBook[0].year=2007;
struct Books Book[10]
for (i=0;i<3;i++) printStruct(&Book[i]);
Nahlásit jako SPAM
IP: 78.98.1.–
KIIV
~ Moderátor
+43
God of flame
24. 11. 2015   #9
-
0
-

#8 C
V pameti jsou prvky pole za sebou. U jednorozmerneho pole je pointer zamenitelny s tim polem. Ve tvem prikladu je samotny Book vlastne ukazatel na prvni prvek pole. Muzes tedy udelat   Book->year = ...  nebo  (Book+1)->year = ...  a znamena to totez jako  Book[0].year = ... a Book[1].year = ...

Totez plati pro pointer.

Jsou samozrejme jiste rozdily: pointer muzes menit -> pointerova aritmetika, pokud mas spravny typ, tak ++book_pointer posune aktualni pointer na dalsi knihu. U pole jde zase zjistit velikost.

 Ukazka tveho kodu pokazde trochu jinak pomoci posunu pointeru:

    int i;
    struct Books  Book[10];
    struct Books *book_ptr = Book;

    strcpy(book_ptr->nameOfBook, "Harry Potter");
    (book_ptr++)->year = 2007; // trosku neprehlednejsi zpusob posunu

    strcpy(book_ptr->nameOfBook, "Hunger Games");
    book_ptr->year = 2015;
    ++book_ptr;  // tady je to naprosto zrejme, ze se posouva na dalsi prvek

    // jiny zpusob indexace u pointeru -- je to to same jako book_ptr->...
    strcpy(book_ptr[0].nameOfBook,"Karkulka");
    book_ptr[0].year=1997;
    // bacha, tady neni zadna inkrementace pointeru, zustavame na 3. prvku!!

    for (i=0;i<3;i++) printStruct(Book + i); // i takto se da pracovat s pointerem
Nahlásit jako SPAM
IP: 94.113.92.–
Program vždy dělá to co naprogramujete, ne to co chcete...
C
~ Anonymní uživatel
9 příspěvků
24. 11. 2015   #10
-
0
-

A ma to nejaky vyznam pouzivat to tymi pointrami? Myslim to inkrementovanie,alebo je to len taka graficka uprava

Nahlásit jako SPAM
IP: 78.98.1.–
ondrej39+1
Věrný člen
24. 11. 2015   #11
-
0
-

#10 C
Co se práce s poli týče, pointerová aritmetika je přibližně o 30-40% rychlejší než standardní přístup pomocí indexů. Pokud ti jde o výkon, máš jeden z důvodů, proč pointery použít. Např. i iterátor pro std::vector je vlastně pointer.

Nahlásit jako SPAM
IP: 79.141.243.–
Inject all the dependencies!
C
~ Anonymní uživatel
9 příspěvků
24. 11. 2015   #12
-
0
-

Sorry,neviem čo je iterátor :-)

Nahlásit jako SPAM
IP: 78.98.1.–
KIIV
~ Moderátor
+43
God of flame
25. 11. 2015   #13
-
0
-

#12 C
Iteratory a vectory se te v C netykaji. To je az v C++

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

Vector viem čo je,mám aj nejaké skúsenosti s Cpp,ale neviem čo je to iterátor :-)

Nahlásit jako SPAM
IP: 78.98.1.–
KIIV
~ Moderátor
+43
God of flame
25. 11. 2015   #15
-
0
-

Je to specialni objekt urceny napriklad pro iteraci (prochazeni) skrz kontejnery. Ale jsou treba iteratory pro nacitani z ifstreamu, vypis do ofstreamu, uz jsem si je vyrabel i na pocitani poctu stejnych cisel v serazenych vektorech a tak. Taky se misto toho da pouzit i obycejny pointer.

Vetsina funkci z knihovny algorithm (respektive sablon funkci) iteratory ocekava a pokud maji prvky nejakou moznost srovnavani, tak se da usetrit spousta vlastniho kodu.

Nahlásit jako SPAM
IP: 94.113.92.–
Program vždy dělá to co naprogramujete, ne to co chcete...
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, 56 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ý