[+] tablice dynamiczne c++
wrocilem z browarka i jakos zaczelo mi to wszystko chodzic ;p jaki bedzie najlepszy sposob na wczytywanie danych w funkcji?? probowalem to robic na kilka sposobow i zaden mi nie dziala. jezeli jest to stala wartosc to dziala, a jezeli sam chce ja podac to kupa. chce to wczytywac tak jak to robilem wczesniej, czyli cos tego typu:
Kod: Zaznacz cały
for(int i=0;i<n;++i)
{
cout << "imie: ";
cin >> rek[i].imie;
cout << "nazwisko: ";
cin >> rek[i].nazwisko;
cout << "telefon: ";
cin >> rek[i].telefon;
}
Nie wiemy nic o tym jakiego typu jest rek (czyli jakie pola w sobie zawiera), więc nie bardzo mogę wywnioskować co w powyższym jest źle. Może n jest większe od rozmiaru rek i wychodzi Ci pętla poza zakres? Tą stałą wartość jak odajesz? ? Jakie błędy wywala Ci przy w/w wczytywaniu?
Kod: Zaznacz cały
rek[i].imie = "Jan";
no więc tak, program wywala się, bo do funkcji wektor przekazywany jest przez wartość, czyli vector a w Twojej funkcji stworz, to jest kopia vectora a z funkcji main, czyli wszystkie działania przeprowadzone w funkcji stworz sa robione na tej kopii lokalnej, ktora po zakonczeniu funkcji jest kasowana. Ty później chcesz ten vector a wypisać, ale on jest pusty, bo nic do niego nie dodałeś, dlatego program się wywala, bo odwołujesz się do pamięci, w której nic nie ma.
Program możnaby dużo lepiej napisać, ograniczę się jednak tylko do funkcji dla Ciebie kluczowej, teraz powinno to działać (mi działa).
A więc krótko o funkcji. Najpierw tworze sobie nową zmienna typu rekord, do wczytywania danych. Do niej wczytuje po kolei dane i później dodaję ją do vectora a.push_back(temp). Reszta jest jasna.
Najważniejszą zmianą w tej funkcji jest dodanie & przed a w nagłówku funkcji. Jest to dosyć trudne pojęcie w c++ (przynajmniej na początku), ale stanowi o jego mocy. W skrócie do funkcji przekazywany jest adres vectora a w pamieci, więc teraz wszystkie odwołania do a w funkcji nie odnoszą się do kopii lokalnej, ale do adresu parametru jej przekazanej, więc elementy dodawane są do vectora a z funkcji main (trochę nieszczęśliwie dobrałeś sobie oznaczenia, lepiej nie oznaczać zmiennych lokalnych i argumentow funkcji tymi samymi literkami, bo może to komplikować czytanie programu i narzucać myślenie, że to ta sama zmienna.
Mam nadzieję, ze nie zamieszałem za bardzo zmiany są tylko w w/w funkcji, wiec nie załączam ponownie tego pliku, bo wygląda on identycznie za wyjątkiem tego co tu napisałem.
Program możnaby dużo lepiej napisać, ograniczę się jednak tylko do funkcji dla Ciebie kluczowej, teraz powinno to działać (mi działa).
Kod: Zaznacz cały
void stworz(vector<rekord> &a, int n)
{
rekord temp;
for(int i=0;i<n;++i)
{
cout << "imie: ";
cin >> temp.imie;
cout << "nazwisko: ";
cin >> temp.nazwisko;
cout << "telefon: ";
cin >> temp.telefon;
a.push_back(temp);
}
}
A więc krótko o funkcji. Najpierw tworze sobie nową zmienna typu rekord, do wczytywania danych. Do niej wczytuje po kolei dane i później dodaję ją do vectora a.push_back(temp). Reszta jest jasna.
Najważniejszą zmianą w tej funkcji jest dodanie & przed a w nagłówku funkcji. Jest to dosyć trudne pojęcie w c++ (przynajmniej na początku), ale stanowi o jego mocy. W skrócie do funkcji przekazywany jest adres vectora a w pamieci, więc teraz wszystkie odwołania do a w funkcji nie odnoszą się do kopii lokalnej, ale do adresu parametru jej przekazanej, więc elementy dodawane są do vectora a z funkcji main (trochę nieszczęśliwie dobrałeś sobie oznaczenia, lepiej nie oznaczać zmiennych lokalnych i argumentow funkcji tymi samymi literkami, bo może to komplikować czytanie programu i narzucać myślenie, że to ta sama zmienna.
Mam nadzieję, ze nie zamieszałem za bardzo zmiany są tylko w w/w funkcji, wiec nie załączam ponownie tego pliku, bo wygląda on identycznie za wyjątkiem tego co tu napisałem.
to ja zrobie jeszcze malego oftopa. baza juz dziala chodz nie dokonca. ale nie w tym problem. probowalem ja jakos upiekszyc i jest zonk pod g++.
brakuje mi funkcji gotoxy, ale znalazlem cos takiego jak jest wyzej. wiec ok. ale jak chce narysowac ramke ze znakow ascii to wypisuje mi glupoty. pod builderem na winshicie dziala tak ja powinno.
i moje pytanie czy jest jakas mozliwosc narysowania takiej ramki(lini) nie koniecznie ze znakow asciii zeby to jakos dzialalo?? wole kompilowac pod linuchem ale chyba bede zmuszony przejsc na buildera z tego powodu..
Kod: Zaznacz cały
void gotoxy(int x, int y)
{
char essq[100];
char xstr[100];
char ystr[100];
sprintf(xstr, "%d", x);
sprintf(ystr, "%d", y);
essq[0] = '\0';
strcat(essq, "\033[");
strcat(essq, ystr);
strcat(essq, "d");
strcat(essq, "\033[");
strcat(essq, xstr);
strcat(essq, "G");
printf("%s", essq);
}
void ramka()
{int x1=1, x2=75, y1=1,y2=21;
int i;
for (i=x1; i<=x2; i++)
{
gotoxy(i,y1);
printf("%c", 205);
gotoxy(i,y2);
printf("%c", 205);
}
gotoxy(75,1);
printf("%c", 187);
gotoxy(1,1);
printf("%c", 201);
gotoxy(1,21);
printf("%c", 200);
gotoxy(75,21);
printf("%c", 188);
for (i=y1+1; i<y2; i++)
{
gotoxy(x1,i);
printf("%c", 186);
gotoxy(x2,i);
printf("%c", 186);
}
}
i moje pytanie czy jest jakas mozliwosc narysowania takiej ramki(lini) nie koniecznie ze znakow asciii zeby to jakos dzialalo?? wole kompilowac pod linuchem ale chyba bede zmuszony przejsc na buildera z tego powodu..
Wypisujesz jakieś śmieszne znaki np. tutaj
nie bardzo wiem, jaki znak chciałeś tu wypisać, no i po co wypisywać znaki po ich kodach zamiast normalnie, czyli dla -, dajesz
Kod: Zaznacz cały
printf("%c", 201);
Kod: Zaznacz cały
printf("%c", '-');
dokladnie to chcialem zrobic cos takiego pod g++
http://img220.imageshack.us/my.php?imag ... hotgk8.jpg
ale cos czytalem ze z rozszerzonymi znakami ascii to nie da rady.
http://img220.imageshack.us/my.php?imag ... hotgk8.jpg
ale cos czytalem ze z rozszerzonymi znakami ascii to nie da rady.
tak, ale to niezbyt ladnie wyglada, wolalbym ze znakami ascci. ale jak sie nie da to trudnoprintf("%c", '-');