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

Zadanie C - błędny wynik

Object Storage Arubacloud
0 głosów
304 wizyt
pytanie zadane 30 sierpnia 2022 w C i C++ przez benny13 Obywatel (1,150 p.)

Cześć, mam pytanko. Czemu w poniższym zadaniu wychodzi mi błędny wynik tzn. mi wyszło 5,4 natomiast program drukuje kolejno 4,5.

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

void f(float * x, float * y) {
  * y = -- * x;
  x = y;
  ++ * x;
}
int main(void) {
  float * tab, * x;
  tab = (float * ) malloc(2 * sizeof(float));
  tab[0] = 5;
  x = & * (tab + 1);
  f(tab, x);
  printf("%.1f %.2f", tab[0], tab[1]);
  return 0;
}

 

1 odpowiedź

+1 głos
odpowiedź 30 sierpnia 2022 przez Whiskey_Taster Pasjonat (15,610 p.)
wybrane 30 sierpnia 2022 przez benny13
 
Najlepsza
void f(float * x, float * y) {
  * y = -- * x;
  x = y;
  ++ * x;
}

Mamy dwa wskaźniki, y oraz x. W pierwszej linii tej funkcji (linia nr 5 u Ciebie) do wartości y (czyli do pola w pamięci, na które wskazuje wskaźnik y) przypisujemy wartość pola, na którą wskazuje wskaźnik x, ale również pomniejszamy wartość tego pola o 1. W następnej linii mamy przypisanie - stąd teraz x wskazuje na y. Na koniec zwiększamy wartość znajdującą się w polu, na które wskazuje x

Mamy krótką analizę, to możemy działać. 
Do funkcji przekazujesz dwa wskaźniki: jeden wskazuje na początek tablicy, bo tab jest równoważny &tab[0] oraz x, który w rzeczywistości wskazuje na &tab[1]. (Tutaj pragnę nadmienić, że w linii 13 masz zbędne wyłuskanie i pobranie referencji, wystarczy x = (tab + 1)). 
Wobec tego, mamy f(&tab[0], &tab[1]). 
L:5 -> przypisanie: do tab[1] przypisujemy wartość -- *(tab) = --tab[0], więc dostajemy, że tab[1] = 4.0
L:6 -> teraz mówimy, że x = y, stąd w rzeczywistości mamy tab = (tab + 1)
L:7 -> zwiększamy wartość w polu, na które wskazuje x, ale x wskazuje na (tab + 1) Poprzednio, w L:5 tab[1] = 4.0, stąd w tej linii tab[1] = 5.0

Ostatecznie na koniec funkcji mamy: 
x = tab + 1, y = tab + 1, więc *x = *y = tab[1] = 5.0
I wszystko się zgadza. 

komentarz 30 sierpnia 2022 przez benny13 Obywatel (1,150 p.)
Dzięki wielkie, faktycznie teraz już wszystko się zgadza :)

Podobne pytania

0 głosów
1 odpowiedź 1,157 wizyt
0 głosów
1 odpowiedź 179 wizyt
+1 głos
3 odpowiedzi 338 wizyt
pytanie zadane 21 września 2021 w JavaScript przez Martita Bywalec (2,520 p.)

92,759 zapytań

141,679 odpowiedzi

320,443 komentarzy

62,102 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...