• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

C++ wskaźniki odc 10

0 głosów
99 wizyt
pytanie zadane 9 marca 2017 w C i C++ przez Geralt_z_Rivii Nowicjusz (240 p.)

Cześć, przez przypadek przepisując pierwszy program z odcinka 10 dałem średnik po pętli for.
Zaowocowało to tym, że program wypisuje jedną liczbę, zamiast kilku. 
Nie rozumiem dlaczego, czy ktoś mógłby mi wytłumaczyć?

 

#include <iostream>

using namespace std;

int ile;

int main()
{
    cout << "Ile liczb w tablicy? ";
    cin>>ile;

    int *tablica;
    tablica = new int [ile];

    for(int i=0; i<ile; i++);
    {
        cout<<(int)tablica<<endl;
        tablica++;
    }

    delete [] tablica;
    tablica=NULL;

    return 0;
}

 

2 odpowiedzi

+3 głosów
odpowiedź 9 marca 2017 przez niezalogowany

Ten kod nie ma sensu:

t.cpp: In function ‘int main()’:
t.cpp:18:49: error: cast from ‘int*’ to ‘int’ loses precision [-fpermissive]
                                      cout<<(int)tablica<<endl;

Oraz zawiera błędy (tak, MZ napisał ten kod BŁĘDNIE, bo przy delete wskaźnik powinien wskazywać na początek tablicy)

Średnik powoduje, że sam for jest traktowany jako pojedyncza instrukcja, co dobrze widać w kodzie maszynowym dlaczego nie wykonywane są wszystkie inne:

   0x00000000004009b6 <+0>:	push   rbp
   0x00000000004009b7 <+1>:	mov    rbp,rsp
   0x00000000004009ba <+4>:	sub    rsp,0x20
   0x00000000004009be <+8>:	mov    esi,0x400b54
   0x00000000004009c3 <+13>:	mov    edi,0x6011a0
   0x00000000004009c8 <+18>:	call   0x400860 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@plt>
   0x00000000004009cd <+23>:	mov    esi,0x6012b4
   0x00000000004009d2 <+28>:	mov    edi,0x601080
   0x00000000004009d7 <+33>:	call   0x400870 <_ZNSirsERi@plt>
   0x00000000004009dc <+38>:	mov    eax,DWORD PTR [rip+0x2008d2]        # 0x6012b4 <ile>
   0x00000000004009e2 <+44>:	cdqe   
   0x00000000004009e4 <+46>:	movabs rdx,0x1fc0000000000000
   0x00000000004009ee <+56>:	cmp    rax,rdx
   0x00000000004009f1 <+59>:	ja     0x4009f9 <main()+67>
   0x00000000004009f3 <+61>:	shl    rax,0x2
   0x00000000004009f7 <+65>:	jmp    0x400a00 <main()+74>
   0x00000000004009f9 <+67>:	mov    rax,0xffffffffffffffff
   0x0000000000400a00 <+74>:	mov    rdi,rax
   0x0000000000400a03 <+77>:	call   0x400810 <_Znam@plt>
   0x0000000000400a08 <+82>:	mov    QWORD PTR [rbp-0x10],rax
   0x0000000000400a0c <+86>:	mov    rax,QWORD PTR [rbp-0x10]
   0x0000000000400a10 <+90>:	mov    QWORD PTR [rbp-0x8],rax
   0x0000000000400a14 <+94>:	mov    DWORD PTR [rbp-0x14],0x0
   0x0000000000400a1b <+101>:	mov    eax,DWORD PTR [rip+0x200893]        # 0x6012b4 <ile>
   0x0000000000400a21 <+107>:	cmp    DWORD PTR [rbp-0x14],eax
   0x0000000000400a24 <+110>:	jge    0x400a2c <main()+118>
   0x0000000000400a26 <+112>:	add    DWORD PTR [rbp-0x14],0x1
   0x0000000000400a2a <+116>:	jmp    0x400a1b <main()+101>
   0x0000000000400a2c <+118>:	mov    rax,QWORD PTR [rbp-0x10]
   0x0000000000400a30 <+122>:	mov    eax,DWORD PTR [rax]
   0x0000000000400a32 <+124>:	mov    esi,eax
   0x0000000000400a34 <+126>:	mov    edi,0x6011a0
   0x0000000000400a39 <+131>:	call   0x400800 <_ZNSolsEi@plt>
   0x0000000000400a3e <+136>:	mov    esi,0x4008a0
   0x0000000000400a43 <+141>:	mov    rdi,rax
   0x0000000000400a46 <+144>:	call   0x400890 <_ZNSolsEPFRSoS_E@plt>
   0x0000000000400a4b <+149>:	add    QWORD PTR [rbp-0x10],0x4
   0x0000000000400a50 <+154>:	cmp    QWORD PTR [rbp-0x8],0x0
   0x0000000000400a55 <+159>:	je     0x400a63 <main()+173>
   0x0000000000400a57 <+161>:	mov    rax,QWORD PTR [rbp-0x8]
   0x0000000000400a5b <+165>:	mov    rdi,rax
   0x0000000000400a5e <+168>:	call   0x400880 <_ZdaPv@plt>
   0x0000000000400a63 <+173>:	mov    QWORD PTR [rbp-0x10],0x0
   0x0000000000400a6b <+181>:	mov    eax,0x0
   0x0000000000400a70 <+186>:	leave  
   0x0000000000400a71 <+187>:	ret    

komentarz 9 marca 2017 przez tangarr Nałogowiec (38,920 p.)
Ten kod wyświetla wartość wskaźnika.
Twój warning oznacza, że pracujesz na systemie 64bitowym (więc wskaźniki też mają długość 64 bajtów) i typ int (32 bitowy) może nie pomieścić całej wartości.
+2 głosów
odpowiedź 9 marca 2017 przez tangarr Nałogowiec (38,920 p.)
Po wykonaniu pętli (czyli zwiększeniu i do ile) program wykonuje następną instrukcję (czyli blok kodu zaczynający się w 16 linijce).

Podobne pytania

0 głosów
3 odpowiedzi 118 wizyt
pytanie zadane 8 grudnia 2017 w C i C++ przez dretred Nowicjusz (180 p.)
+1 głos
2 odpowiedzi 121 wizyt
pytanie zadane 8 stycznia 2016 w C i C++ przez Wojtek Brzeziński Nowicjusz (170 p.)
0 głosów
1 odpowiedź 200 wizyt
Porady nie od parady
Publikując kody źródłowe korzystaj ze specjalnego bloczku koloryzującego składnię (przycisk z napisem code w edytorze). Nie zapomnij o ustawieniu odpowiedniego języka z rozwijanego menu oraz czytelnym formatowaniu kodu.Przycisk code

67,129 zapytań

114,075 odpowiedzi

241,792 komentarzy

47,030 pasjonatów

Przeglądających: 213
Pasjonatów: 14 Gości: 199

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...