Autor Zpráva
tomas3333
Profil
Tak mam tu taky skriptik, s ktorym sa asi nestretavate kazdy den. Ide o osemsmerovku. Upozornujem, ze este nie je dokoncena, zatial len vklada slova to tabulky (teda tie ostatne "zbytocne" pismena tam este nie su...) ale objavil sa problem. Funguje mi to na localhoste, ale ked som to uploadol na server, hodilo mi to fatal error:
Fatal error: Allowed memory size of 16777216 bytes exhausted (tried to allocate 24 bytes) in /DISK3/WWW/herniweb.cz/devnox/osemsmerovka.php on line 41.

Problem je v tom, ze skript tych 16 MB nepouzije, teda neviem, kde je chyba. Zdrojak:

<?php
# pouzite slova
$slova = Array("svihadlo", "kolo", "hlava", "komar", "svina","abeceda");
 
# velkost tabulky - xycount
$xc = 8;
$yc = 8;
 
# bunky tabulky
$tabulka = Array();
 for($y=1; $y<=$yc; $y++) {
   for($x=1; $x<=$xc; $x++) {
     $tabulka[$y][$x] = "";
   }
 }
 
# definovanie funkcii ###################################################################### ############################
 //funkcia, ktora definuje zmenu smeru a posunutie
 /*function smer() {
  global $rozmer_y, $rozmer_x, $zmena_y, $zmena_x, $novy_rozmer_x, $novy_rozmer_y, $i;
     if ($zmena_y == 0) {
      $novy_rozmer_y = $rozmer_y;
     } elseif ($zmena_y == "-") {
      $novy_rozmer_y = $rozmer_y-$i;
     } elseif ($zmena_y == "+") {
      $novy_rozmer_y = $rozmer_y+$i;
     }
     if ($zmena_x == 0) {
      $novy_rozmer_x = $rozmer_x;
     } elseif ($zmena_x == "-") {
      $novy_rozmer_x = $rozmer_x-$i;
     } elseif ($zmena_x == "+") {
      $novy_rozmer_x = $rozmer_x+$i;
     }
 }*/
 
 //funkcia, ktora zisti, ci dane slovo moze byt napisane v tomto smere
 function kontrola_smeru($zmena_y, $zmena_x) {
  global $rozmer_y, $rozmer_x, $tabulka, $slovo,$yc,$xc,$dane_pismeno,$bunka;
   //prechadzam kazdu bunku az do konca slova
   for ($i=1; $i <= strlen($slovo)-1; $i++) {
     //definujem zmenu smeru, smer ktorym ideme a posunutie
     if ($zmena_y === 0) {
      $novy_rozmer_y = $rozmer_y;
     } elseif ($zmena_y == "-") {
      $novy_rozmer_y = $rozmer_y-$i;
     } elseif ($zmena_y == "+") {
      $novy_rozmer_y = $rozmer_y+$i;
     }
     if ($zmena_x === 0) {
      $novy_rozmer_x = $rozmer_x;
     } elseif ($zmena_x == "-") {
      $novy_rozmer_x = $rozmer_x-$i;
     } elseif ($zmena_x == "+") {
      $novy_rozmer_x = $rozmer_x+$i;
     }
     
     //ak je rozmer mimo tabulku return false
     if ($novy_rozmer_y > $yc || $novy_rozmer_y < 1 || $novy_rozmer_x > $xc || $novy_rozmer_x < 1) {return false;}
     
     //definujem sucasnu bunku...
     $bunka = $tabulka[$novy_rozmer_y][$novy_rozmer_x];
     
     //...a zistim, ktore pismeno by sa v tej bunke malo nachadzat
     $dane_pismeno = substr($slovo, $i, 1);
     if (!empty($bunka)) {
      
      echo $slovo." ".$i." ".$dane_pismeno." vs. ".$bunka."<br />";
     }
     
     //ak nie je bunka prazdna, a zaroven sa v nej nenachadza rovnake pismeno, false
     if (!empty($bunka) && $dane_pismeno != $bunka) {
      return false;
     }
   }
 }
 
 //funkcia, ktora vlozi slovo do buniek
 function vloz_slovo($zmena_y, $zmena_x) {
  global $rozmer_y,$rozmer_x, $tabulka, $slovo, $prve_pismeno;
    
    //vlozim prve pismeno do bunky, ak tam este nie je
    if (empty($tabulka[$rozmer_y][$rozmer_x])) {
     $tabulka[$rozmer_y][$rozmer_x] = $prve_pismeno;
    }
    
    //vkladam slova
    for($i=1;$i<=strlen($slovo)-1;$i++) {
      //zmena smeru a posunutie
      if ($zmena_y === 0) {
        $novy_rozmer_y = $rozmer_y;
      } elseif ($zmena_y == "-") {
        $novy_rozmer_y = $rozmer_y-$i;
      } elseif ($zmena_y == "+") {
        $novy_rozmer_y = $rozmer_y+$i;
      }
      if ($zmena_x === 0) {
        $novy_rozmer_x = $rozmer_x;
      } elseif ($zmena_x == "-") {
        $novy_rozmer_x = $rozmer_x-$i;
      } elseif ($zmena_x == "+") {
        $novy_rozmer_x = $rozmer_x+$i;
      }
    
      //vlozenie pismena do bunky ak je empty
      if (empty($tabulka[$novy_rozmer_y][$novy_rozmer_x])) {
        $tabulka[$novy_rozmer_y][$novy_rozmer_x] = substr($slovo,$i,1);
      }
    }
 }
 
 //definovanie smerov
  $smery = Array();
   $smery['hore']['y'] = "-";
   $smery['hore']['x'] = 0;
   $smery['hore_vpravo']['y'] = "-";
   $smery['hore_vpravo']['x'] = "+";
   $smery['vpravo']['y'] = 0;
   $smery['vpravo']['x'] = "+";
   $smery['dole_vpravo']['y'] = "+";
   $smery['dole_vpravo']['x'] = "+";
   $smery['dole']['y'] = "+";
   $smery['dole']['x'] = 0;
   $smery['dole_vlavo']['y'] = "+";
   $smery['dole_vlavo']['x'] = "-";
   $smery['vlavo']['y'] = 0;
   $smery['vlavo']['x'] = "-";
   $smery['hore_vlavo']['y'] = "-";
   $smery['hore_vlavo']['x'] = "-";
    
 
# vytvaranie osemsmerovky ###################################################################### ########################
 
foreach ($slova as $slovo) {                                                     // foreach
  
  //zistim dlzku slova
  $dlzka_slova = strlen($slovo);
  
  $bunka_ok = false;
  $pouzite_bunky = Array();
  while ($bunka_ok !== true) {
    //vyberiem nahodnu bunku tabulky a skontrolujem ci bola pouzita
    //$bola_pouzita = true;
    
    //while ($bola_pouzita !== false) {
      $rozmer_x = rand(1, $xc);
      $rozmer_y = rand(1, $yc);
      //skontrolujem, ci sa tato bunka uz netestovala
      /*$p = 1;
      if (count($pouzite_bunky) == 0) {$bola_pouzita = false;} else { 
        foreach($pouzite_bunky as $pole) {
          if ($pole['y'] == $rozmer_y && $pole['x'] == $rozmer_x) {
            $bola_pouzita = true;
            break;
          }
        $p++;
        }
        if ($p == count($pouzite_bunky)) {
          $bola_pouzita = false;
        }
      }
    }*/
    
    $obsah_bunky = $tabulka[$rozmer_y][$rozmer_x];
    
    //zistim, ci je bunka prazdna alebo sa zacina na rovnake pismeno ako vybrane slovo
    // ak ano, zistim, ci je volny smer
    // ak nie, vyberiem inu bunku - opakujem cyklus
    $prve_pismeno = substr($slovo,0,1);
    if (empty($obsah_bunky) || $prve_pismeno == $obsah_bunky) {
      //zistim, ktore smery su volne
      //ak nie su ziadne volne smery, opakujem volbu - cyklus - vyberiem inu bunku
      //ak su volne smery, vyberiem nahodne jeden a vlozim tam slovo
      $vhodne_smery = Array();
         
         foreach ($smery as $smer => $pole) {
           if (kontrola_smeru($pole['y'], $pole['x']) !== false) {
             $vhodne_smery[$smer]['y'] = $pole['y'];
             $vhodne_smery[$smer]['x'] = $pole['x'];
           }
         }
         
         //pocet vhodnych smerov, ak 0, najdem inu bunku, inak vyberiem nahodne jeden z nich
         if (count($vhodne_smery) == 0) {
          $bunka_ok = false;
         } else {
           $nahodny_smer = array_rand($vhodne_smery);
           
           $pouzity_smer = Array();
           $pouzity_smer['y'] = $vhodne_smery[$nahodny_smer]['y'];
           $pouzity_smer['x'] = $vhodne_smery[$nahodny_smer]['x'];
          
            vloz_slovo($pouzity_smer['y'], $pouzity_smer['x']);  
           
           $bunka_ok = true;
         
         }
         
    } else {
      $bunka_ok = false;
    }
  
   //ak je nevhodna bunka, vlozim ju do pola, aby sa zbytocne neopakovala
   //ak sa nasla vhodna bunka, vynulujem pole
   /*if ($bunka_ok === false) {
     $pouzite_bunky[] = Array("y" => $rozmer_y, "x" => $rozmer_x);
   } else {
     $pouzite_bunky = Array();
   }*/
  }
 
}
 
# generovanie tabulky ###################################################################### ############################
 
echo "<table border='1'>";
 
  for($r=1; $r<=$yc; $r++) {
    echo "<tr>";
     
    for($s=1; $s<=$xc; $s++) {
      echo "<td>";
       echo $tabulka[$r][$s];
      echo "</td>";
    }
   
    echo "</tr>";
  } 
 
echo "</table>";
tomas3333
Profil
nejake navrhy/napady, nic?
grimword
Profil
ze by byl problem v tom, ze jsi preplnil povolenou velikost pameti?
tomas3333
Profil
je to dost mozne, az na to, ze 16 MB ten script nezaplni
skor by som potreboval nejake rady ako to optimalizovat alebo nieco...
nightfish
Profil
je to dost mozne, az na to, ze 16 MB ten script nezaplni
kdyby nezaplnil, nebyla by chybová hláška...

vypisuj si na různých místech výstup funkce memory_get_usage, pravděpodobně se ti podaří zjistit, kde té paměti ubývá nejvíc
tomas3333
Profil
no, mna k tomu nazoru, ze sa nezaplnil vedie localhost, kde s nastavenou memory 16 MB ide vsetko krasne, preto tu chybovu hlasku nechapem
tomas3333
Profil
vyriesene, chyba bola medzi kreslom a klavesnicou, ked som na server uploadoval staru kopiu suboru a nie tu co som skusal na localhoste...

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0