Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Strony: 1
Istnieje jakis odpowiednik funkcji isSet() z PHP w C++ ?
A może ktoś ma jakiś pomysł jak coś takiego napisać ?
Ja dopiero zaczynam z C++ i przydałaby mi się taka funkcja.
Ostatnio edytowany przez Kiera (2008-05-18 12:18:02)
Offline
dla wskażników:
#define IS_SET(x) (x != NULL)
Ale nie mam pojęcia po co taka funkcja w C++. Tu zmienne trzeba deklarować, nie tworzą się same....
Offline
Deklarowac trzeba ale definiowac juz nie. Poprostu chce sprawdzic czy pewnej zmiennej int zostala przydzielona wartosc przez uzytkownika czy nie.
Offline
ale zmienna zadeklarowqana ma zawsze jakas wartosc ... i ciezko w ogolnosci ustalic czy jest ona z automaty (zazwyczaj to co bylo w pamieci) czy podana jawnie ... dlatego dobrym zwyczajem jest przypisywanie wartosci dla zmiennej ...
jezeli musisz sprawdzac czy uzytkownik ustawil a nie ma wartosci ktorej on nie uzywa bedziesz potrzebowal dodatkowej zmiennej kontrolnej ...
Offline
Dobra juz sobie poradzilem dodajac druga zmienna typu bool.
Offline
dodam jeszcze ze zeby to ladnie zrobic to warto wlozyc te dwie zmienne w jakas strukture
Offline
Ktoś może wie dlaczego kod napisany w geany i tam skompilowany
int main(int argc, char** argv) { using namespace std; int const N=1000; //wymiar float A[N][N],B[N][N],C[N][N]; //macierze for (int i=0;i<N;i++) for(int j=0;j<N;j++) C[i][j] = 0; //tutaj sie wywala. sprawdzilem. }
wywala dla wartosci N>=835:
./macierze_test Naruszenie ochrony pamięci
O co chodzi?
Wczoraj zrobilem na windows (dev-cpp) tablice 10kx10k bez problemu i robilem na nich dzialania aczkolwiek to byly dynamiczne.
Offline
O to już musisz zapytać jakiegoś znawcę g++. Przy deklaracji dwóch macierzy się nie wywala. Więc to kwestia kompilatora albo jakiegoś triku z pamięcią.
Offline
wklej wynik z valgrinda
przekompilowałem ten kod i program kończy się bez błedu
i na przyszłość nie pisz tak kodu, przyjdzie taki czas że nie połapiesz się jak ten kod działa lub dodasz coś pod c[i][j] i będziesz się dziwił dlaczego to się w pętli nie wykonuje.
int main(int argc, char** argv) { using namespace std; int const N=1000; //wymiar float A[N][N],B[N][N],C[N][N]; //macierze for (int i=0;i<N;i++) for(int j=0;j<N;j++) C[i][j] = 0; //tutaj sie wywala. sprawdzilem. }
a najlepiej tak
int main(int argc, char** argv) { using namespace std; int const N=1000; //wymiar float A[N][N],B[N][N],C[N][N]; //macierze for (int i=0;i<N;i++) { for(int j=0;j<N;j++) { C[i][j] = 0; //tutaj sie wywala. sprawdzilem. } } }
pozdrawiam
-----------------------------------------------------
Edit:
Dobra u mnie też się wywala, tylko przy trochę większej wartości N
==1054== Memcheck, a memory error detector. ==1054== Copyright (C) 2002-2007, and GNU GPL'd, by Julian Seward et al. ==1054== Using LibVEX rev 1732, a library for dynamic binary translation. ==1054== Copyright (C) 2004-2007, and GNU GPL'd, by OpenWorks LLP. ==1054== Using valgrind-3.2.3, a dynamic binary instrumentation framework. ==1054== Copyright (C) 2000-2007, and GNU GPL'd, by Julian Seward et al. ==1054== For more details, rerun with: -v ==1054== ==1054== Warning: client switching stacks? SP change: 0x7FF000300 --> 0x7FE227498 ==1054== to suppress, use: --max-stackframe=14519912 or greater ==1054== Invalid write of size 4 ==1054== at 0x400533: main (in /var/home/rbidas/forum) ==1054== Address 0x7FE22742C is just below the stack ptr. To suppress, use: --workaround-gcc296-bugs=yes ==1054== ==1054== Process terminating with default action of signal 11 (SIGSEGV) ==1054== Access not within mapped region at address 0x7FE22742C ==1054== at 0x400533: main (in /var/home/rbidas/forum) ==1054== ==1054== Invalid write of size 8 ==1054== at 0x48022D8: _vgnU_freeres (vg_preloaded.c:56) ==1054== Address 0x7FE227490 is on thread 1's stack ==1054== ==1054== Process terminating with default action of signal 11 (SIGSEGV) ==1054== Access not within mapped region at address 0x7FE227490 ==1054== at 0x48022D8: _vgnU_freeres (vg_preloaded.c:56) ==1054== ==1054== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 5 from 1) ==1054== malloc/free: in use at exit: 0 bytes in 0 blocks. ==1054== malloc/free: 0 allocs, 0 frees, 0 bytes allocated. ==1054== For counts of detected errors, rerun with: -v ==1054== All heap blocks were freed -- no leaks are possible. Segmentation fault
Tu masz wynik z valgrinda. Problem leży w stosie.
zrów tablice alokowane dynamicznie na stercie i będzie OK
int main(int argc, char** argv) { using namespace std; int const N=100100; //wymiar float **A = new float *[N]; float **B = new float *[N]; float **C = new float *[N]; for( int i=0; i<N; ++i ) { A[i] = new float [N]; B[i] = new float [N]; C[i] = new float [N]; } for (int i=0;i<N;i++) { for(int j=0;j<N;j++) { C[i][j] = 0; //tutaj sie wywala. sprawdzilem. } } }
Ostatnio edytowany przez Robot_ (2008-05-21 12:42:34)
Offline
Robot_ napisał(-a):
wklej wynik z valgrinda
Nawet nie umiem sie tym poslugiwac :)
Robot_ napisał(-a):
przekompilowałem ten kod i program kończy się bez błedu
i na przyszłość nie pisz tak kodu, przyjdzie taki czas że nie połapiesz się jak ten kod działa lub dodasz coś pod c[i][j] i będziesz się dziwił dlaczego to się w pętli nie wykonuje.
Wiem o tym. To pisalem na szybko.
Ilosc max elementow na stosie zalezy od OS'a czy od sprzetu ?
W WinXp ten sam progam wywalal sie przy N=400
Dzieki za pomoc.
Offline
Strony: 1