Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [jQuery] Wartości zmiennej po wykonaniu pętli
Polik
post
Post #1





Grupa: Zarejestrowani
Postów: 87
Pomógł: 0
Dołączył: 11.12.2003

Ostrzeżenie: (0%)
-----


Witam!

Natrafiłem na bardzo irytujący problem, z którym męczę się już zbyt długo. Oto on (w skrócie):

mam dwie zmienne: tablica[] i mojaZmienna
przez pewien czas wykonuje pętle while i zmieniam w niej wartość zmiennej mojaZmienna ale przed każdą zmianą chcę sobie zapamiętać jej wartość więc podstawiam pod kolejne indeksy zmiennej tablica[] właśnie zmienną mojaZmienna. Poniżej taki pseudokodzik:

  1. //zmienne
  2. tablica[]
  3. mojaZmienna
  4.  
  5. //pętla
  6. while(warunek) {
  7. //chce zapamietac wartosc mojaZmienna w tej chwili
  8. tablica[kolejnyNumer] = mojaZmienna;
  9. //zmieniam wartosc moja zmienna
  10. mojaZmienna++;
  11. }


Problem w tym, że po zakończeniu pętli w każdej komórce tabeli[] zapisana jest ostatnia wartość zmiennej mojaZmienna zamiast kolejnych iteracji! Tak jakby w komórkach tabeli zapisywała się nie wartość lecz referencja do zmiennej mojaZmienna. Niestety nie znalazłem w necie odpowiedzi na to pytanie. Powiedzcie proszę co z tym zrobić żeby zaczęło działać poprawnie.

Pozdrawiam i będę wdzięczny za pomoc!
Go to the top of the page
+Quote Post
kamil4u
post
Post #2





Grupa: Zarejestrowani
Postów: 2 350
Pomógł: 512
Dołączył: 4.01.2009
Skąd: Wrocław / Świdnica

Ostrzeżenie: (0%)
-----


Podejrzewam, że kod jednak wygląda trochę inaczej niż tu zaprezentowałeś (IMG:style_emoticons/default/smile.gif)
Pokaż nam dokładniejszy kod - albo chociaż przykład, gdzie takie coś występuje.

Strzelam, że chodzi o przypisanie odpowiedniego zdarzenia np. http://forum.4programmers.net/Webmastering...onclick_w_petli - gdzie ostatnie rozwiązanie jest tym polecanym przeze mnie. Jak nie strzeliłem to pokaż kod, gdzie możemy popatrzeć jak to działa (IMG:style_emoticons/default/smile.gif)

Pozdrawiam

PS. Postaraj się na przyszłość nie dawać tagu jQuery, gdy pytasz o czysty JS, gdyż np. ja często omijam takie tematy - taka rada (IMG:style_emoticons/default/biggrin.gif)
Go to the top of the page
+Quote Post
Polik
post
Post #3





Grupa: Zarejestrowani
Postów: 87
Pomógł: 0
Dołączył: 11.12.2003

Ostrzeżenie: (0%)
-----


Ok, zamieszczam oryginalne źródło (poprzycinane w niektórych miejscach)

  1. var odleglosci = new Array();
  2. odleglosci = tabd;
  3. var tempik = { 'make' : 3, 'odleglosci' : odleglosci, 'opis' : 'Aktualna tablica odległości'};
  4. movie.push( tempik );
  5. var tempik = { 'make' : 4, 'odleglosci' : odleglosci, 'opis' : ''};
  6. movie.push( tempik );
  7.  
  8. ...
  9.  
  10. while(kolejka.length > 0) {
  11.  
  12. ...
  13.  
  14. var tempik = { 'make' : 7, 'first' : first, 'sasiady' : sasiady, 'opis' : 'Wybieramy z kolejki pierwszy element i badamy jego siąsiadów'};
  15. movie.push( tempik );
  16. var tempik = { 'make' : 8, 'first' : first, 'sasiady' : sasiady, 'opis' : ''};
  17. movie.push( tempik );
  18.  
  19. //przechodzimy po sasiadach wlasnie zdjetego elementu pierwszego z kolejki
  20. for(var j = 0; j < matrix[first].length; j++) {
  21.  
  22. //analizujemy tylko te elementy, które sa sasiadami elementu z kolejki czyli waga > 0
  23. if(matrix[first][j] > 0) {
  24.  
  25. //jezeli aktualnie najkrótsza droga w tablicy D jest wieksza od tej wlasnie badanej
  26. if(tabd[j] > (parseInt(tabd[first]) + parseInt(matrix[first][j])) || tabd[j] == 'oo') {
  27. tabd[j] = parseInt(tabd[first]) + parseInt(matrix[first][j]);
  28. poprzednik[j] = first;
  29.  
  30. var tempik = { 'make' : 9, 'vertex1' : first, 'vertex2' : j, 'opis' : 'Znalezniono, którszą drogę do wierzchołka ' + j + ' poprzez wierzchołek ' + first};
  31. movie.push( tempik );
  32. var tempik = { 'make' : 10, 'vertex1' : first, 'vertex2' : j, 'opis' : ''};
  33. movie.push( tempik );
  34.  
  35.  
  36. var odleglosci = new Array();
  37. odleglosci = tabd;
  38. var tempik = { 'make' : 3, 'odleglosci' : odleglosci, 'opis' : 'Tablica odległości zostaje zaktualizowana'};
  39. movie.push( tempik );
  40. var tempik = { 'make' : 4, 'odleglosci' : odleglosci, 'opis' : ''};
  41. movie.push( tempik );
  42. }
  43. else {
  44. var tempik = { 'make' : 11, 'vertex1' : first, 'vertex2' : j, 'opis' : 'Droga do wierzchołka ' + j + ' poprzez wierzchołek ' + first + ' jest dłuższa lub taka sama jak ta już znana'};
  45. movie.push( tempik );
  46. var tempik = { 'make' : 12, 'vertex1' : first, 'vertex2' : j, 'opis' : ''};
  47. movie.push( tempik );
  48. }
  49.  
  50. }
  51. }


i generalnie rozchodzi się o rzeczy w linijkach 1-6 i 36-41.

tablica tabd jest zdeklarowana na początku skryptu, globalnie dostępna dla każdej funkcji.
tempik jest zmienną tymczasową w której przechowuje array gdzie jedną z jego wartości jest tabd po kolejnych wykonaniach pętli.
po zakończeniu skryptu w zmiennej movie powinienem mieć "historię" m.in. zmiennej tabd - bo na niej mi najbardziej zależy.

Mam nadzieję, że jasno opisałem.

Ten post edytował Polik 19.05.2011, 07:08:48
Go to the top of the page
+Quote Post
kamil4u
post
Post #4





Grupa: Zarejestrowani
Postów: 2 350
Pomógł: 512
Dołączył: 4.01.2009
Skąd: Wrocław / Świdnica

Ostrzeżenie: (0%)
-----


Nadal nie do końca rozumiem kod (IMG:style_emoticons/default/smile.gif)
Ale przyszedł mi do głowy nowy pomysł - kopiując tablice, które w JS są obiektem robisz to chyba w sposób jak w linii 37:
Kod
odleglosci = tabd;
- jeśli taki był twój zamysł(, żeby skopiować) to źle to robisz, gdyż: http://kurs.browsehappy.pl/JavaScript/Obiekty -> Kopiowanie obiektów

Pozdrawiam i mam nadzieję, że to to (IMG:style_emoticons/default/smile.gif) - a jak nie to proszę daj jak najprostszy kod, gdzie można to zaobserwować - może być inny od tego, ważne, żeby było widać problem.
Go to the top of the page
+Quote Post
Polik
post
Post #5





Grupa: Zarejestrowani
Postów: 87
Pomógł: 0
Dołączył: 11.12.2003

Ostrzeżenie: (0%)
-----


Wielkie dzięki kamil4u link okazał się pomocny! Generalnie rozchodziło się o kopiowanie arraya.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.08.2025 - 01:49