Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Rekomendowane odpowiedzi

Opublikowano

Witam, mam problem z pewnym kodem, otóż chciałem pobrac kolor wszystkich pikseli.

 

Niestety przy próbie uruchomienia programu wyskakuje windowsowksi "Wystąpił problem z aplikacją i zostanie ona zamknięta".

 

Kilka minut debugowania i wiem że aplikacja crashuje się przy próbie deklaracji tablicy.

 

Wszystko działa dobrze jak zmniejszę nieco rozmiar tablicy.

 

 

To jest ukryta treść, proszę

 

Wydaję mi się to dziwne że przy stosunkowo małej tablicy (1024x768) aplikacja wywala się.Przecież to tylko 768 KB ram'u. Czy jest na to jakieś rozwiązanie ?

liczylem na barce lecz ona niemogla wygrac.

Przez kibicow ktorzy przy rzutach roznych wolnych swiecili w messiego laserami

Opublikowano

Zadeklaraj globalnie, poza funkcją main, tj. zaraz po includach.

 

Deklarując wewnątrz funkcji zapisujesz dane na stosie.

A stos jest malutki ( w porównaniu do pamięci, w której zapisywane są dane globalne ).

Ta sygnatura jest pusta.

Opublikowano

No tak, masz rację nie pomyślałem o czymś tak oczywistym.

 

 

 

Dzięki !

 

 

EDIT:

Mam jeszcze jedno pytanie.

 

Czy jest jakaś różnica między czasem dostępu do zmiennych lokalnych i globalnych ?

liczylem na barce lecz ona niemogla wygrac.

Przez kibicow ktorzy przy rzutach roznych wolnych swiecili w messiego laserami

Opublikowano

Wszystko dzieje się w obrębie pamięci wirtualnej (i stos i sekcja danych ze zmiennymi) także jeśli nawet jest różnica to nie ma żadnego znaczenia. No może być coś z tym czasem jeśli akurat ta strona pamięci będzie w tej kości RAM, która działa jakimś cudem wolniej od innych, jeszcze wiele innych teorii można ułożyć ale jak wspomniałem to naprawdę rzeczy, którymi niewarto zaprzątać sobie głowy :E

YOU MUST DIE

- Ganon, Koridai

Opublikowano

Nie jestem do końca pewien jak działa stos w ASM.

Jeśli ASM ma dostęp do każdego elementu stosu jedncześnie ( a raczej ma ) to nie ma żadnej różnicy.

 

Jeśli musialby coś przesuwać, przestawiać, coś by się na stosie zasłaniało -> to wtedy do globalnych szybciej.

 

Ale raczej ma dostęp do każdego elementu stosu jednocześnie.

 

Tak "na pewno" to musisz spytać t3ixa albo Osamy.

 

Być może działa to też zupełnie inaczej niż to sobie wyobrażam - ale to już pewniej kwestie metod przekładania danego języka na kod maszynowy.

Ta sygnatura jest pusta.

Opublikowano

A jeżeli chcę wczytac duuuży plik, i nie znam dokładnie jego rozmiaru, do tablicy to czy muszę deklarowac tablice po 20mb ramu ? Bo chciałbym to zrobic dynamicznie czyli poznac wielkosc pliku i wtedy stworzyc odpowiednią tablice bez konieczności deklarowania ogromnych tablic "na wszelki wypadek".

 

 

Bo w main nie stworzę tablicy o odpowiedniej wielkości.

liczylem na barce lecz ona niemogla wygrac.

Przez kibicow ktorzy przy rzutach roznych wolnych swiecili w messiego laserami

Opublikowano

Jeśli nie chcesz korzystać z pomocy kompilatora i opierać się na samym winapi to pomoże Ci tutaj funkcja VirtualAlloc. Rozszerzoną funkcją VirtualAllocEx możesz alokować pamięć dla innego procesu. Funkcja zwraca adres pod którym zaalokował dane. Wystarczy tylko wskaźnik by móc z tych danych korzystać ;)

YOU MUST DIE

- Ganon, Koridai

Opublikowano

A jeżeli chcę wczytac duuuży plik, i nie znam dokładnie jego rozmiaru, do tablicy to czy muszę deklarowac tablice po 20mb ramu ? Bo chciałbym to zrobic dynamicznie czyli poznac wielkosc pliku i wtedy stworzyc odpowiednią tablice bez konieczności deklarowania ogromnych tablic "na wszelki wypadek".

 

 

Bo w main nie stworzę tablicy o odpowiedniej wielkości.

 

Kto używa tablicy? Użyj vectora... Tablica to pozostałość C, zostawiona dla kompatybilności wstecznej :)

 

Różnica pomiędzy lokalnymi a globalnymi jest taka, że globalne nigdy nie będą dawane do rejestrów procesora.

 

Aha, niektóre kompilatory alokują zmienne globalne na heap'ie, czasami na dnie stosu. Zależy to od wielu czynników. Jednak zazwyczaj ni tu, ni tam. Najczęście w data segment.

 

Mam nadzieję, że wszystko wyjaśniłem xD

RAsfepN.png
Opublikowano
A jeżeli chcę wczytac duuuży plik

Jeszcze nie przerabiałem dokładnie operacji wejścia wyjścia, ale pliki wczytuje się do bufora w porcjach po kilkaset - kilka tysięcy bajtów.

 

Zaś po samych plikach porusza się za pomocą wskaźników.

 

Oczywiście jeśli potrzebujesz w czasie rzeczywistym operować na 20MB danych, to 20MB idzie do RAMu.

 

Ale jeśli szukasz tylko jakieś informacji, to jeździsz wskaźnikiem, wczytując porcjami.

 

Zaś do dynamicznej alokacji pamięci służą keywords new oraz delete -> a VirtualAlloc to chyba słabe wyjście, bo uzależnione od OS'a...

 

@UP

Nie odpowiedziałeś w końcu, czy jest gdzieś szybciej, czy nie ma żadnej różnicy? :P

 

@EDIT:

Prosty i fajny (IMHO), dobrze ukomentowany, przykład samopowiększającego się stosu (dynamiczna alokacja):

http://pl.wikibooks.org/wiki/Struktury_danych/Implementacje_w_C%2B%2B/Stosy

Ta sygnatura jest pusta.

×
×
  • Dodaj nową pozycję...