ďťż

Ładny brzuch

Mam 2 problemy:
1)
Napisalem program okienkowy, w którym można dodawac adresy i numery tel roznych osob..
Chce żeby zapisywal informacje do pliku podczas zamkniecia
I dodalem taki kod:
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action) { AnsiString wpisstr[9]; for(int y=0; y<10; y++) { if(wpis[y]==true) { wpisstr[y]="1"; } else { wpisstr[y]="0"; } } MemoDane->Clear(); for(int i=0; i<10; i++)                        //wrzucamy wszystko do {                                              //memodane (wzsystkie dane) zeby przy zapisie wszystkie sie zapisaly do pliku MemoDane->Lines->Strings[i]=wpisstr[i]; MemoDane->Lines->Strings[i+10]=telefon[i]; MemoDane->Lines->Strings[i+20]=mail[i]; MemoDane->Lines->Strings[i+30]=gg[i]; } MemoDane->Lines->SaveToFile("dane.txt"); ListOsoby->Items->SaveToFile("osoby.txt"); }
Jednak gdy skompiluje program,
Dodam poszczególne osoby, a nastepnie zamkne, to pojawia mi się taki komunikat:

project d:/kontakty/project2.exe faulted with the message acces violation at 0x01193c18: write of address 0xed6236c0’ Process stopped. Use Step or Run to continue I moge kliknac tylko ok, a pod tym pojawia mi sie okienko CPU, które kompletnie nie wiem do czego sluzy… jest duzo roznych cyferek tam… jakies bardziej zaawansowane narzedzie do zarzadzania prockiem pewnie. Ktoś może mi powiedzieć do czego to okienko służy?

2)
Jednak jeżeli uruchomie program poprzez klikniecie na Project2.exe, to wszystko dziala…
No może prawie wszystko, bo w pliku dane.txt zapisuje mi tylko jeden znak – cyfre „1” tak jakby przerywalo petle na poleceniu
MemoDane->Lines->Strings[i+10]=telefon[i];

Czy macie jakies pomysly na rozwiazanie ktoregos z tych problemow (I ew. wskazanie przyczyny pierwszego)

pozdrawiam



Po pierwsze to tworzysz tablicę
AnsiString wpisstr[9];
a później masz pętlę iteracyjną od 0 do 9.
W efekcie zakres zostaje przekroczony.
Użytkownik Chmurek edytował ten post 20 luty 2006, 15:42
no tak
a jak powinno być?
10 elementów tablica, 10 elementów w pętli... elementy tablicy sa od 0 numerowane...
chyba, ze cos zle zrozumialem...
Użytkownik Ka-lolek edytował ten post 20 luty 2006, 19:24
AnsiString wpisstr[9];
Ja tu widzę dziewiątkę. ;)




no tak
a jak powinno być?
10 elementów tablica, 10 elementów w pętli... elementy tablicy sa od 0 numerowane...
chyba, ze cos zle zrozumialem...

Co Ty wymyślasz, tablica[9] zawiera 9 elementów, bo pierwszy ma indeks 0 :> To jest tablica statyczna, w przypadku tablic znaków zerio na końcu jest potrzebne do wyciągnięcia ich długości...
Użytkownik Cyrkiel edytował ten post 20 luty 2006, 21:33
AnsiString to klasa przechowująca tekst.
WpisującAnsiString tablica[9]; nie tworzymy jednego obiektu klasy przechowującego tekst o długości dziewięciu znaków, lecz tablicę dziewięciu obiektów klas. Dziewięciu.
W przypadku char jest tak samo przecież.
char tablica[9];
stworzy nam tablicę dziewięciu znaków z czego ostatni powinniśmy wyzerować, jeśli chcemy mieć ciąg tekstowy.
Użytkownik Chmurek edytował ten post 20 luty 2006, 21:08
aha... zapomnialem o NULL'u:)

@Chmurek
czy aby na pewno char tablica[9]
tworzy tablice dzieięcioelementową i ostatni trzeba wyzerować? nie jest tak, że tworzy dziesięć elementów i ostatni jest pusty?

w int przynajmniej jest tak, ze jak napisze int tablica[9]
to moge tam przechowac 10 liczb...
czyli w char tablica [9] bede mogl przechowywac 9 znakow+NULL
z Twojej wypowiedzi wnioskuje, ze 8+NULL:)

edit
co do moich pytan, to pierwszy problem rozwiazany...
do pliku dane niestety nadal zapisuje tylko jedynke;(
Użytkownik Ka-lolek edytował ten post 20 luty 2006, 21:36
Nie ma znaczenia jaki jest typ. Tablica zawsze ma tyle elementów tego typu ile podasz w nawiasie. Czyli w tym wypadku 9 - od 0 do 8.
Jeśli napiszesz na przykład
int a[9]; a[9] = 5;
To wykraczasz poza zakres.
Takie coś się oczywiście skompiluje i nawet prawdopodobnie będzie działać, ale po pierwsze wartość ta nie będzie w żaden sposób zabezpieczona przed nadpisaniem przez inny program czy instrukcję z Twojego programu.
Po drugie można w ten sposób wejść na już zarezerwowany obszar pamięci, a wtedy każdy szanujący się system powinien wywalić program, który tak zrobi.
Jeśli nie wierzysz to wpisz takie coś:
int a[9]; a[15] = 5;
Też prawdpodobnie zadziała, a chyba nie powiesz, że nie jest to wyjście za zakres? ;)
Użytkownik Chmurek edytował ten post 20 luty 2006, 21:49
no to właśnie o tym mówię;)

bo napisałeś :


KODchar tablica[9];

stworzy nam tablicę dziewięciu znaków z czego ostatni powinniśmy wyzerować, jeśli chcemy mieć ciąg tekstowy.

a przecież ten kod stworzy tablice 10ciu znaków z czego ostatni powinniśmy wyzerować:) tak ja zinterpretowałem to zdanie:)

Dziewięciu. Dziewięciu. Dziewięciu. ;)
Naprawdę - ten kod stworzy tablice dziewięciu znaków.
Dowód:
char a[9]; cout << sizeof(a) << endl;
Użytkownik Chmurek edytował ten post 20 luty 2006, 21:53
jest 9 ale w tej tablicy jest tez NULL
Użytkownik Ka-lolek edytował ten post 20 luty 2006, 22:19
Gdzie Ty tu widzisz jakieś NULL?
To zero na końcu należy dopisać w tym wypadku pod indeksem 8. Przecież sizeof pokazał Ci ile bajtów masz zarezerowane. Dziewięć. Czyli możesz zapisać tam dziewięć znaków albo osiem znaków i zero kończące.

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • zsf.htw.pl
  •