Czemu nie działa program na wskaźnikach innym sposobem?

Czemu nie działa program na wskaźnikach innym sposobem?
N3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 420
0

Witam, chciałem spytać dlaczego program działa pierwszym sposobem a już w dwóch kolejnych pokazuje błędy.

I sposób:

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

int main()
{
    float wynik[10];
    float *wskaznik = &wynik;
    int i,n;
    for(i = 0,n = 1; i < 10; i++,n++)
    {
       *(wskaznik+i)  = 2 * (4 * n * n) / (2 * n - 1) * (2 * n + 1);
       printf("%5.1f\n",*(wskaznik+i));
    }
}
 

W II i III sposobie podam tylko linijki kodu tylko w tych których go zmodyfikowałem.
II sposób:

Kopiuj
for(i = 0,n = 1; i < 10; i++,n++)
    {
       *(wskaznik++)  = 2 * (4 * n * n) / (2 * n - 1) * (2 * n + 1);
       printf("%5.1f\n",*(wskaznik));
    }

III sposób:

Kopiuj
 for(i = 0,n = 1; i < 10; i++,n++)
    {
       wskaznik[i]  = 2 * (4 * n * n) / (2 * n - 1) * (2 * n + 1);
       printf("%5.1f\n",wskaznik[i]);
    }
Zellus
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 474
1

Trzeci przykład też działa normalnie :)
W drugim zamień *(wskaznik++) na *(++wskaznik). Poczytaj o post i pre inkrementacji. Edit: Przenieś postinkrementację do printf
Generalnie post inkrementacja najpierw zwraca liczbę, potem zwiększa ją o jeden. Dodatkowo: dlatego wszędzie gdzie się da, najlepiej stosować preinkrementację, po prostu jest szybsza. Tak jak tutaj

Kopiuj
 for(i = 0,n = 1; i < 10; i++,n++)

</del> for(i = 0,n = 1; i < 10; ++i,++n)

Kopiuj
http://ideone.com/drdcCH

<b>Edit:</b> Aha, błąd jest taki:
```cpp
float *wskaznik = &wynik[0];

Albo

Kopiuj
float *wskaznik = wynik; 

Iaczej żaden kod nie chciał mi się skompilować, a zapomniałem o tym pisząc post :D
Generalnie float tablica[] to jest ten sam typ co float* wskaznik.

//Jeszcze ze 100 razy zeedytuję ten post i w końcu napiszę to co chciałem... :/

N3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 420
0

nie rozumiem czemu II sposób ma nie działać. Przy postinkrementacji zaczyna od indeksu 0, a przecież chcę do indeksu 0 najpierw pisać pierwszy wynik.

Zellus
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 474
0

Wiesz, masz trochę racji. Z tym tylko że wtedy modyfikujesz zerowy element, a wypisujesz pierwszy :) W moim kodzie jest więc mały błąd.
Powinieneś postinkrementować w printf

twonek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2500
1
  1. jak najbardziej działa: http://ideone.com/WtRteh
Kopiuj
printf("%5.1f\n", *(wskaznik-1));
N3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 420
0

dobra dzięki już wiem jaki błąd robiłem.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.