[+] tablice dynamiczne c++

Potrzebujesz pomocy z C, C++, perl, python, itp.
AdeBe
Junior Member
Posty: 825
Rejestracja: 01 grudnia 2007, 14:41

Post autor: AdeBe »

Słuchaj ludzi! Biblioteka STL załatwi to za Ciebie dużo szybciej i lepiej. Uwierz mi, że więcej czasu spędzisz na wymyślanie własnego rozwiązania, niż na naukę jednego tylko elementu z tej biblioteki. Vectory są wspaniałym wynalazkiem
skotik87
Posty: 98
Rejestracja: 05 kwietnia 2007, 00:20
Lokalizacja: Krakow

Post autor: skotik87 »

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;
} 
mlyczek
Junior Member
Posty: 979
Rejestracja: 02 sierpnia 2006, 19:17

Post autor: mlyczek »

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?

Kod: Zaznacz cały

rek[i].imie = "Jan";
? Jakie błędy wywala Ci przy w/w wczytywaniu?
skotik87
Posty: 98
Rejestracja: 05 kwietnia 2007, 00:20
Lokalizacja: Krakow

Post autor: skotik87 »

wrzucilem caly pliczek do zalacznika na ktorym to testuje. najlepiej jak sam to uruchomisz to wtedy dokladnie zobaczysz. w strukturze wszystko jest na int bo narazie to musze zobaczyc jak to dziala, a pozniej bede sie dopiero bawil z reszta
mlyczek
Junior Member
Posty: 979
Rejestracja: 02 sierpnia 2006, 19:17

Post autor: mlyczek »

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).

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.
skotik87
Posty: 98
Rejestracja: 05 kwietnia 2007, 00:20
Lokalizacja: Krakow

Post autor: skotik87 »

mlyczek wielki browar dla ciebie za oswiecenie mnie ;p takiej odpowiedzi oczekiwalem. dobrze to wytlumaczyles przynajmniej w porownaniu z kolesiem na mojej uczelni hehe teraz sie biore za sortowanie (juz widze ze sporo bedzie trzeba zmienic), zapis i odczyt z/do pliku dziala tak jak powinien.
mlyczek
Junior Member
Posty: 979
Rejestracja: 02 sierpnia 2006, 19:17

Post autor: mlyczek »

[quote="skotik87"]mlyczek wielki browar dla ciebie za oswiecenie mnie ]

no browara nie musisz mi dawać :P ale w końcu studiuje się informatykę, no i zainteresowania też się ma to można od czasu do czasu komuś pomóc.
skotik87
Posty: 98
Rejestracja: 05 kwietnia 2007, 00:20
Lokalizacja: Krakow

Post autor: skotik87 »

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++.

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);
	}
}
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..
mlyczek
Junior Member
Posty: 979
Rejestracja: 02 sierpnia 2006, 19:17

Post autor: mlyczek »

Wypisujesz jakieś śmieszne znaki np. tutaj

Kod: Zaznacz cały

printf("%c", 201);
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", '-');
skotik87
Posty: 98
Rejestracja: 05 kwietnia 2007, 00:20
Lokalizacja: Krakow

Post autor: skotik87 »

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.
printf("%c", '-');
tak, ale to niezbyt ladnie wyglada, wolalbym ze znakami ascci. ale jak sie nie da to trudno
ODPOWIEDZ