NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Pomoc(pole a pointery)

V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Jakub Sobinovsky:6.7.2017 22:56

Ahoj, pokúšam sa spraviť program ktorý mi pomocou pointerov naplní pole.Viete mi poradiť(nenapísať presne ako to má byť) kde robím chybu ? Je mi jasné že používať typ int na i je hlúposť pretože na typ int mame rezervované pole, urobiť I na typ double sa mi zdá byť trošku prasarna :D a naviac by to asi nebolo správne a aj tak by to nefungovalo. Ak by vedel niekto PORADIŤ tak by som vám bol moc vdačný, Ďakujem :)

#include<iostream>
using namespace std;

int main() {
        int *pole = new int[6];//Vytvorenie pola 5prvkov,Alokalizacia 5 intov
        int *p_pomocny = NULL;
         for(p_pomocny = pole; p_pomocny < pole + 6; p_pomocny++)
         {
                int i = 0;
                i++;
                *p_pomocny = i;
                 cout << *pole << endl;
                 cout << "Hodnota i: " << i  << endl;
         }





         delete[] pole;
    pole = NULL;
        return 0;
}
Editováno 6.7.2017 22:59
 
Odpovědět
6.7.2017 22:56
Avatar
Matej
Člen
Avatar
Odpovídá na Jakub Sobinovsky
Matej:6.7.2017 23:06

kazdy prvok pola bude 1 lebo vo for loope kazdui iteraciu deklarujes i s hodnotou 0 , potom ho incrementujes , a potom tu hodnotu hodis do pola.

Sprav si globalny counter , resp mimo for loope scope

 
Nahoru Odpovědět
6.7.2017 23:06
Avatar
Jakub Sobinovsky:6.7.2017 23:14

Jo to ma nenapadlo super.Len stále to akosi nefunguje :D To i som si deklaroval nad cyklus for.

#include<iostream>
using namespace std;
int main() {
        int *pole = new int[6];//Vytvorenie pola 5prvkov,Alokalizacia 5 intov
        int *p_pomocny = NULL;
        int i = 0;
         for(p_pomocny = pole; p_pomocny < pole + 6; p_pomocny++)
         {
                i++;
                *p_pomocny = i;
                 cout << *pole << endl;
                 cout << "Hodnota i: " << i  << endl;
         }
 
Nahoru Odpovědět
6.7.2017 23:14
Avatar
Odpovídá na Jakub Sobinovsky
Petr Štechmüller:6.7.2017 23:17

Ještě detail, nepouzivej k vymazání pointeru makro NULL. NULL je ve výsledku nula. Místo toho ma C++ klíčové slovo nullptr. NULL se by se melo používat spis v C.

Nahoru Odpovědět
6.7.2017 23:17
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Odpovídá na Jakub Sobinovsky
Petr Štechmüller:6.7.2017 23:20

A co konkrétně Ti na tom nefunguje? Možná se diviš, proč to vypisuje stále stejný číslo. Je to tím, zenedefinujes index v poli, který se ma vypsat.

Nahoru Odpovědět
6.7.2017 23:20
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Matej
Člen
Avatar
Odpovídá na Jakub Sobinovsky
Matej:6.7.2017 23:21

co ti tam presne nefunguje?

 
Nahoru Odpovědět
6.7.2017 23:21
Avatar
Jakub Sobinovsky:6.7.2017 23:45

No mam problém stým že mi to vypisuje stale to isté čislo ked nechám vypísať prvky pola

 
Nahoru Odpovědět
6.7.2017 23:45
Avatar
Jakub Sobinovsky:6.7.2017 23:47

A ako teda spravím aby mi vypisovalo každý prvok pola ? *pole[i] ? či to nie ?

 
Nahoru Odpovědět
6.7.2017 23:47
Avatar
Odpovídá na Jakub Sobinovsky
Petr Štechmüller:6.7.2017 23:55

Jo, musíš dereferencovat hodnotu na zadaném indexu. Správně by to mělo být:

*(pole[i])
Nahoru Odpovědět
6.7.2017 23:55
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Jakub Sobinovsky:7.7.2017 0:01

To mam napísať pri výpise v cykle ? Nie ?

 
Nahoru Odpovědět
7.7.2017 0:01
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na Jakub Sobinovsky
Martin Dráb:9.7.2017 14:57

Možná chceš spíše napsat:

cout << *p_pomocny << endl;

nebo, pokud chceš vypsat právě zaplněnou položku pole:

cout << pole[p_pomocny - pole] << endl;
Nahoru Odpovědět
9.7.2017 14:57
2 + 2 = 5 for extremely large values of 2
Avatar
Jakub Sobinovsky:9.7.2017 20:26

Už som to vyriešil tak že som pole vypísal pomocou for.Môžem to takto vypisovať keď pracujem s pointerami ?

for(int i = 0; i < 6; i++)
{
   pole[i];
}
Editováno 9.7.2017 20:27
 
Nahoru Odpovědět
9.7.2017 20:26
Avatar
Odpovídá na Jakub Sobinovsky
Radek Chalupa:9.7.2017 20:43

vyzkoušej a uvidíš:-) ...ale ano, můžeš, nebo můžeš místo pole[i] napsat *(pole+i);

Jinak když napíšeš pole, je to adresa počátku (typově int*), pole+i je adresa i-tého prvku v poli, tj jeho hodnotu získáš dereferencí (*(pole+i)).

Radek Chalupa

  • individuální konzultace, školení programování, (C/C++, C#, WinAPI, .NET, COM, ATL, MFC...)
  • vývoj software na zakázku

http://www.radekchalupa.cz

Editováno 9.7.2017 20:43
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
9.7.2017 20:43
Avatar
Jakub Sobinovsky:9.7.2017 23:37

Ďakujem za rady, čiže *(pole+i); je z hladiska rýchlosti programu lepšia alternatíva ako pole[i] ? Chápem to správne ? Robíte aj online poradenstvo ? Myslím to v tom zmysle že ak by som náhodou niečo nepochopil z "online návodov" vysvetlili by ste mi to cez skype ? Ak áno aká je cena ? Kľudne sa mi môžte ozvať do SZ. Ďakujem :)

 
Nahoru Odpovědět
9.7.2017 23:37
Avatar
Odpovídá na Jakub Sobinovsky
Neaktivní uživatel:10.7.2017 7:30

Doporučuju vyzkoušet zkompilovat obě varianty a prohlédnout vyslednej output hexem.

Editováno 10.7.2017 7:31
Nahoru Odpovědět
10.7.2017 7:30
Neaktivní uživatelský účet
Avatar
Odpovídá na Jakub Sobinovsky
Radek Chalupa:10.7.2017 10:21

Vyjde to nastejno, resp. striktně řečeno záleží jak to sestaví ten který kompilátor a linker. Samozřejmě výsledek (v assembleru a strojovém kódu) se bude lišit podle sestavení release vs debug. Kromě porovnání binárního kódu jak zmínil kolega výše, můžeš (v release sestavení nejlépe) dát na příslušné místo breakpoint a při zastavení zvolit "goto disassembly" (nebo něco podobného podle IDE které používáš) a uvidíš výsledek v assembleru.

Radek Chalupa

  • individuální konzultace, školení programování, (C/C++, C#, WinAPI, .NET, COM, ATL, MFC...)
  • vývoj software na zakázku

http://www.radekchalupa.cz

 
Nahoru Odpovědět
10.7.2017 10:21
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 16 zpráv z 16.