Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Przekroczona pamiec
Forum PHP.pl > Forum > Przedszkole
JakubBab
Witam,

Robie sobie zadanka z PHP znalezione na nacie i calkiem zacnie mi idzie a tu przy zad 4 booom - blad ->

  1. Allowed memory size of 134217728 bytes exhausted (tried to allocate 36 bytes) in C:\xampp\htdocs\oop\Zadania\zadanie4.php on line 63


Nie sa to zadne powazne obliczenia wiec powod piszczy w kodzie - patrz. sugestia php (line 63). Gdyby szanowni koledzy mogli zerknac i zasugerowac zmianny (+ wytlumaczenie dlaczego) to bede bardzo wdzieczny. Tresc zadania i kod razem z programikiem testujacym ponizej.

  1. <?php
  2.  
  3. /* Napisac funkcje o nazwie WyswietlLiczby_ObliczSrednia (o 4 paramentrach: $ilosc1, $ilosc2, $zakres1, $zakres2) wczytujacy do tablicy $tab utworzonej wewnatrz funkcji losowa ilosc liczb (ilosc elementow od $ilosc1 do $ilosc2).
  4. Kazdy element tablicy ma byc losowa liczba z zakresu od $zakres1 do $zakres2.
  5. Nastepnie funkcja ma wyswietlic te liczby w tabeli o grobosci linii 1 (tylko pojedyncza kolumna). Ostatecznie funckja ma zwrocic srednia arytmetyczna liczb z tej tablicy.
  6.  */
  7. ?>
  8. <html>
  9. <form method="post" action="">
  10.  
  11. <table>
  12. <tr><td>Number 1</td><td align="center"><input type="text" name="ilejeden" size="3"/></td></tr>
  13. <tr><td>Number 2</td><td align="center"><input type="text" name="iledwa" size="3"/></td></tr>
  14. <tr><td>random1</td><td align="center"><input type="text" name="random1" size="3"/></td></tr>
  15. <tr><td>random2</td><td align="center"><input type="text" name="random2" size="3"/></td></tr>
  16. <tr><td colspan="2" align="center"><input type="submit" value="oblicz" /></td>
  17. </table>
  18. </html>
  19.  
  20. <?php
  21.  
  22. @$zakres1=$_POST['ilejeden'];
  23. @$zakres2=$_POST['iledwa'];
  24. @ $ilosc1 =$_POST['random1'];
  25. @$ilosc2 = $_post['random2'];
  26.  
  27. if(!isset($zakres1,$zakres2, $ilosc)){}
  28. if ($ilosc1 == 0 && $ilosc2 == 0){die("Uzupelnij wszystkie pola");}{echo "Ponizej liczby losowe z zakresu 1 i zakresu 2";}
  29.  
  30. function WyswietlLiczby_ObliczSrednia($zakres1, $zakres2, $ilosc1, $ilosc2){
  31.  
  32. global $ilosc1;
  33. global $ilosc2;
  34. global $lacznaIlosci;
  35.  
  36. $tab = array();
  37.  
  38. $range= array();
  39.  
  40. $numery= range(1,10);
  41.  
  42.  
  43.  
  44. for ($i=0; $i<=$zakres1; $i++){
  45. for ($i=0; $i<=$zakres2; $i++){
  46.  
  47. $position = $i*10;
  48. foreach ($numery as $ii => $numer){
  49. $position ++;
  50. if($position<=$zakres1)
  51. if($position<=$zakres2)
  52. $range[] = $numer;
  53. }
  54. }
  55. }
  56.  
  57. for ($i=0; $i<=$ilosc1; $i++){
  58. for ($i=0; $i<=$ilosc2; $i++){
  59. $position1 = $i*10;
  60. foreach ($range as $kopiaRange){
  61. $tup[] = $kopiaRange;
  62. $position++;
  63. if ($position1 <=$zakres1)
  64. if ($position1 <=$zakres2)
  65. $tab[] = $tup;
  66. }
  67. }
  68. }
  69.  
  70. $lacznaIlosci = mt_rand($ilosc1,$ilosc2);
  71.  
  72.  
  73.  
  74. return array_rand($tab, $lacznaIlosci);
  75.  
  76.  
  77. }
  78.  
  79.  
  80. echo json_encode (WyswietlLiczby_ObliczSrednia($zakres1, $zakres2, $ilosc1, $ilosc2));
  81.  
  82. ?>

Fred1485
Na początek usuń wszystkie tłumienia błędów bo absolutnie ich się nie powinno używać. Global też nie jest dobrą praktyką.
Randallmaster
Błąd można rozwiązać zwiększając poprostu pamięć w php.ini lub w samym pliku php ini_set('memory_limit', '256M');

Natomiast patrząc na twój kod:

  1. for ($i=0; $i<=$ilosc1; $i++){
  2. for ($i=0; $i<=$ilosc2; $i++){
  3. $position1 = $i*10;
  4. foreach ($range as $kopiaRange){
  5. $tup[] = $kopiaRange;
  6. $position++;
  7. if ($position1 <=$zakres1)
  8. if ($position1 <=$zakres2)
  9. $tab[] = $tup;
  10. }
  11. }
  12. }


pętla pętli w pętli? To tak samo jak używanie if else if else…. taki kod zemści się na tobie smile.gif Spróbuj to zapisać w łatwiejszy i czytelniejszy sposób.
redeemer
Co jest dziwnego w zagnieżdżonych pętlach? Tutaj akurat są one zbędne, ale to nie jest nic nadzwyczajnego.

Kod
Napisac funkcje o nazwie WyswietlLiczby_ObliczSrednia (o 4 paramentrach: $ilosc1, $ilosc2, $zakres1, $zakres2) wczytujacy do tablicy $tab utworzonej wewnatrz funkcji losowa ilosc liczb (ilosc elementow od $ilosc1 do $ilosc2).
Kazdy element tablicy ma byc losowa liczba z zakresu od $zakres1 do $zakres2.
Nastepnie funkcja ma wyswietlic te liczby w tabeli o grobosci linii 1 (tylko pojedyncza kolumna). Ostatecznie funckja ma zwrocic srednia arytmetyczna liczb z tej tablicy.

@JakubBab: Namieszałeś coś strasznie, poprawny algorytm powinien wyglądać mniej więcej tak:
  1. // "generowanie" tablicy $tab
  2. for($i=0; $i < abs($ilosc2-$ilosc1); $i++) {
  3. $tab[] = mt_rand($zakres1, $zakres2);
  4. }
  5.  
  6. // "srednia"
  7. $srednia = array_sum($tab) / count($tab);
Pominąłem wyświetlanie.

JakubBab
@ redeemer Dzieki za pomoc, smiga!

Teraz jeszcze chwila na zastanowienie sie nad logika tego co napisales :] ...i przyswojenie wiedzy

ph34r.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.