Skocz do zawartości
Zamknięcie Forum PC LAB

Szanowny Użytkowniku,

Informujemy, że za 30 dni tj. 30 listopada 2024 r. serwis internetowy Forum PC LAB zostanie zamknięty.

Administrator Serwisu Forum PC LAB - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie: wypowiada całość usług Serwisu Forum PC LAB z zachowaniem miesięcznego okresu wypowiedzenia.

Administrator Serwisu Forum PC LAB informuje, że:

  1. Z dniem 29 listopada 2024 r. zakończy się świadczenie wszystkich usług Serwisu Forum PC LAB. Ważną przyczyną uzasadniającą wypowiedzenie jest zamknięcie Serwisu Forum PC LAB
  2. Dotychczas zamowione przez Użytkownika usługi Serwisu Forum PC LAB będą świadczone w okresie wypowiedzenia tj. do dnia 29 listopada 2024 r.
  3. Po ogłoszeniu zamknięcia Serwisu Forum od dnia 30 października 2024 r. zakładanie nowych kont w serwisie Forum PC LAB nie będzie możliwe
  4. Wraz z zamknięciem Serwisu Forum PC LAB, tj. dnia 29 listopada 2024 r. nie będzie już dostępny katalog treści Forum PC LAB. Do tego czasu Użytkownicy Forum PC LAB mają dostęp do swoich treści w zakładce "Profil", gdzie mają możliwość ich skopiowania lub archiwizowania w formie screenshotów.
  5. Administrator danych osobowych Użytkowników - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie zapewnia realizację praw podmiotów danych osobowych przez cały okres świadczenia usług Serwisu Forum PC LAB. Szczegółowe informacje znajdziesz w Polityce Prywatności

Administrator informuje, iż wraz z zamknięciem Serwisu Forum PC LAB, dane osobowe Użytkowników Serwisu Forum PC LAB zostaną trwale usunięte ze względu na brak podstawy ich dalszego przetwarzania. Proces trwałego usuwania danych z kopii zapasowych może przekroczyć termin zamknięcia Forum PC LAB o kilka miesięcy. Wyjątek może stanowić przetwarzanie danych użytkownika do czasu zakończenia toczących się postepowań.

Temat został przeniesiony do archiwum

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

Matt91111

[C] Zapisywanie do tablicy przez wskaźnik

Rekomendowane odpowiedzi

Program się nie sypie :E, tylko czemu do tablicy to nie chcę zapisywać?

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

#define WLK_TABLICY 2

void wczytaj_liczby(int wielkosc, float* liczby);

int main()
{
  float liczby[WLK_TABLICY];

  wczytaj_liczby( (sizeof(liczby) / sizeof(liczby[0])) , liczby);

  int i = 0;
  for(;i < WLK_TABLICY; i++, printf("%.2f \n", i));

  return 0;
}

void wczytaj_liczby(int wielkosc, float* liczby) {
  int i = 0;

  for(i = 0; i<wielkosc; i++) {
     printf("Wprowadz liczbe %d z %d: \n", i+1, wielkosc);

     scanf("%f", &liczby[i]);
  }
}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Zaczynasz się robić nudny :thumbdown:

 

WARNINGI!

Niestety masz rację ;)

 

Teraz leci bez ostrzeżeń, debuger pokazuje, że wszystkie elementy tablicy zostały prawidłowo ustawione, a pierwsza wartość tablicy nie jest wyświetlana poprawnie, iteracja leci od zera i nwm z jakiego powodu pierwsza wyświetlana wartość jest zawsze równa "0.00" :hmm:

for(i = 0;i < WLK_TABLICY; i++, printf("%.2f \n", liczby[i]));

 

Poprawiony kod:

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

#define WLK_TABLICY 4

void wczytaj_liczby(int wielkosc, float* liczby);

int main()
{
  float liczby[WLK_TABLICY];

  wczytaj_liczby( (sizeof(liczby) / sizeof(liczby[0])) , liczby);

  int i = 0;
  for(i = 0;i < WLK_TABLICY; i++, printf("%.2f \n", liczby[i]));

  return 0;
}

void wczytaj_liczby(int wielkosc, float* liczby) {
  int i = 0;

  for(i = 0; i<wielkosc; i++) {
     printf("Wprowadz liczbe %d z %d: \n", i+1, wielkosc);

     scanf("%f", &liczby[i]);
  }
}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dlaczego tego wypisującego fora tak przekombinowałeś? :(

 

Zobacz co Ci wypisze ta sama pętla z dodatkowym, "diagnostycznym" dodatkiem:

for(i = 0;i < WLK_TABLICY; i++, printf("[%d] = %.2f \n", i, liczby[i]));

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dlaczego tego wypisującego fora tak przekombinowałeś? :(

 

Zobacz co Ci wypisze ta sama pętla z dodatkowym, "diagnostycznym" dodatkiem:

for(i = 0;i < WLK_TABLICY; i++, printf("[%d] = %.2f \n", i, liczby[i]));

Faktycznie nie było to potrzebne :kwasny: i++ leci przecież przed printf

 

a tak właściwie to nie powinno to wybuchnąć po przekroczeniu zakresu tablicy :E ?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

masz

 

#define WLK_TABLICY 2
void wczytaj_liczby(int wielkosc, float* liczby);

 

a wywołujesz

   wczytaj_liczby( WTF --> (sizeof(liczby) / sizeof(liczby[0])) <-- WTF , liczby);

 

 

to żeś se życie skomplikował :E

 

   wczytaj_liczby( WLK_TABLICY , liczby);

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

a tak właściwie to nie powinno to wybuchnąć po przekroczeniu zakresu tablicy :E ?

C/C++ nie sprawdza zakresów tablic, ze względów wydajnościowych. System operacyjny sprawdza czy proces nie sięga poza swoją pamięć, ale jak wyjedziesz poza zakres tylko trochę jest duża szansa, że wciąż będziesz w swojej pamięci, tylko np trafisz w inne zmienne albo już przydzielone, ale jeszcze nie użyte miejsce.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

masz

 

#define WLK_TABLICY 2
void wczytaj_liczby(int wielkosc, float* liczby);

 

a wywołujesz

   wczytaj_liczby( WTF --> (sizeof(liczby) / sizeof(liczby[0])) <-- WTF , liczby);

 

 

to żeś se życie skomplikował :E

 

   wczytaj_liczby( WLK_TABLICY , liczby);

Fixed :E wiem wiem jak to wygląda, ale z dugiej strony się zastanawiam czy tego nie powrzucać w każdym wywołaniu funkcji. Pani doktor napewno doceni starania :cool:

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

a pytanie na serio - piszesz w gołym C bo to na uczelnię czy sam się uczysz i jesteś masochistą :E ?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

a pytanie na serio - piszesz w gołym C bo to na uczelnię czy sam się uczysz i jesteś masochistą :E ?

Nie jestem aż takim masochistą żeby się C uczyć 50% ostatnich problemów wiąże się z tym że nie mogłem użyć cywilizowanych typów, kontenerów etc. std::vector, std::string oraz tego że g++ mi wyrzuca zawsze błędy przy niezgodności typów :( ale od przyszłego semestru jest szansa, że nie będę tak postów nabijał bo na C++ przechodzimy i rzucamy w cholere to dziadostwo :D

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

nie no - należy wiedzieć jak obchodzić się z operacjami low-level bo w C++ też się zdecydowanie przydają

 

ciekawe kiedy zaczniesz kompilować bardziej skomplikowane programy z włączonymi agresywnymi optymalizacjami i odkryjesz magiczny świat undefined behaviour oraz pisać swoje funkcje typu memcpy i zastanawiać się dlaczego ta funkcja z biblioteki standardowej jest średnio 8+ raza szybsza od własnej :E

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

nie no - należy wiedzieć jak obchodzić się z operacjami low-level bo w C++ też się zdecydowanie przydają

 

ciekawe kiedy zaczniesz kompilować bardziej skomplikowane programy z włączonymi agresywnymi optymalizacjami i odkryjesz magiczny świat undefined behaviour oraz pisać swoje funkcje typu memcpy i zastanawiać się dlaczego ta funkcja z biblioteki standardowej jest średnio 8+ raza szybsza od własnej :E

No też się trochę cieszę, że wiem od kuchni jak wygląda przydzielanie pamięci ale wole użyć new niż memalloc, realloc. Najbardziej mi klas brakowało i przeładowania funkcji i przydzielanie pamięci też jest uciążliwe, nie wspominając o kontroli typów. W c++ to może kilka razy program położyłem bo kompilator rzucał we mnie błędami a w C to w 50% zaczynam dostrzegać że coś je nie tak jak się program kładzie.

A własna funkcja do przydzielania pamięci to pewnie przez WinAPI będzie rozwiązana?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

na pewnym etapie zawsze musisz odwołać się do systemu aby przydzielić pamięć - cały trik polega na tym aby zrobić to lepiej niż malloc

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

@Matt91111

Szczerze, to lepiej po chwilowym nurkowaniu w C będzie Ci się zainteresować wysokopoziomowymi kwestiami. Chociażby w poruszanym temacie alokacji pamięci i zarządzania zasobami - jak pisać program bez użycia new i delete ;) Bo poza jednostkowymi przypadkami ręczne zarządzanie pamięcią nie przynosi żadnego zysku, a tworzy tylko okazję do wycieków i innych głupich błędów.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...