[PHP] grote inversefunctie werkt niet, php instellingen?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb een programma dat van een puntenwolk de buitenste coordinaten pakt en in de database zet. Vervolgens moeten die buitenste coordinaten op volgorde gezet worden, zodat met behulp van imagepolygon de puntenwolk grafisch gemaakt kan worden. Hiervoor heb ik een while loop die alle puntenwolken stuk voor stuk doorloopt. In de while loop wordt de functie 'volgende' aangeroepen, die voor elk punt de volgende kan pakken... Deze herhaalt zichzelf net zo lang totdat hij alle buitenste coordinaten heeft gehad.

Dit gaat in de meeste gevallen goed en levert mooie polygonen op. De gevallen waarin het niet goed gaat zijn de puntenwolken met meer dan 75 buitenste coordinaten. Hierbij zegt internet explorer ' gereed' en maakt ie de while loop ook niet meer af: de rest van de puntenwolken pakt ie dus niet meer..

Ik denk dat dit in de php instellingen moet zitten, ik heb de time limit al op 0 gezet, maar dat helpt niet.. Iemand anders een idee?

Acties:
  • 0 Henk 'm!

Verwijderd

Voeg een was debuguitvoer toe om de waarde van verschillende variabelen op verschillende plekken te inspecteren.

Op die manier kun je de locatie van de fout proberen te bepalen, en de fout zelf volgt dan waarschijnlijk vanzelf wel.

(Het kan ook Memory Limit Exceeded zijn met een host die foutmeldingen onderdrukt -- je zou er het log eens op na kunnen slaan)

[ Voor 22% gewijzigd door Verwijderd op 11-01-2005 14:44 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Waardes al gecheckt, dat gaat wel goed... Mocht dat fout gaan wordt het ook afgevangen en zou de while loop gewoon met de volgende puntenwolk door moeten gaan.. Dus lijkt me daar niet in te zitten...

Hoe werkt dat met de memory limit exceeded.. waar kan ik die log vinden, want in errors.txt komt geen foutmelding te staan, of bedoel je iets anders?

Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 14:28
Je kan sowieso bovenaan je script met ini_set() display errors aanzetten en verder met de functie error_reporting op E_ALL de waarschuwingen tonen.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
error reporting had ik al aan. ini_set(' display_errors', ' 0' ) heb ik nu ook toegevoegd, maar nog steeds geen foutmelding, en weer na de 75e waarde ' gereed'...

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Inmiddels ook de Memory Limit in php.ini groter gezet, maar opzelfde moment houdt ie er mee op....

Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 14:28
ini_set(' display_errors', ' 0' ) waarom die 0? We willen ze net wel zien. Ook het loggen aanzetten lijkt me wel een handig idee om te debuggen.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
goed punt. Display error op 1 gezet, nog steeds zelfde probleem. In de log verschijnt ook geen foutmelding... Bij mijn laptop geeft ie 'page cannot be displayd' en bij mijn desktop zegt ie gewoon gereed en laat ie alles zien tot hoe ver ie was... Bij beide computers wil ie dus niet doorgaan met de whileloop, terwijl dat dus niet kan volgens de code...

Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 18-09 14:42
IE timed gewoon out omdat het te lang duurd voordat output wordt ontvangen.
Zet eens in je whileloop;
PHP:
1
echo "<!-- Script leeft nog.. //-->\n";


zo krijgt IE toch output, en blijft ie wel doorladen

Of als je al dingen output, gebruik dan flush() om deze naar de browser te beuken

Het script klinkt overigens interressant. Heb je een demo online die ik kan bewonderen? (niet de soruce ;) Het resultaat)

[ Voor 45% gewijzigd door frickY op 12-01-2005 09:33 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
in het script staat al dat u output moet geven bij elke volgende, zodat ik hem ook in de gaten kan houden of alles wel goed gaat. Flush helpt ook niet, komt nog steeds geen foutmelding. Bij alles tot 75 waarden blijft het prima gaan, komt ie daarboven dan stopt ie ermee? De functie die de volgende kiest, delete ook de huidige waarde uit de tabel. Kan het daarmisschien in zitten? dat ie niet 75 waardes achterelkaar kan deleten of zo???

Kortom: nergens wordt een fout gegeven, en ik denk dus dat het ergens in de php instellingen moet zitten...

demo is nog niet online, omdat het nog een testfase is... komt misschien nog wel..

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
deleten heb ik er maar even uitgegooid, zonder dat is de kans op fouten iets groter.. maar nu blijft het probleem als nog het zelfde...

Is het misschien iets dat een inverse functie ( die zichzelf steeds opnieuw aanroept) maar maximaal 75 keer aangeroepen mag worden of zo, omdat anders php denkt dat ie in een eindeloze loop zit (wat dus niet zo is) ???

Ik kan in php.ini ook nergens een waarde van 75 vinden ...

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ik heb nu ook een identieke functie volgendetwee(x, y, id) aan volgende(x,y, id) geschreven, zodat volgende(x,y,id) bij het vinden van een volgende nu volgendetwee aanroept, en volgendetwee roept dan weer volgende aan..
Op deze manier blijft het probleem het zelfde, na 75 buitenste waarden stopt de hele pagina ermee, zonder maar iets te melden...

BTW: dit geld voor elke puntenwolk groter dan 75 buitenste waardes, ik heb al heel veel verschillende id's geprobeerd.. bij kleiner gaat het gewoon goed en klopt alles...

Het lijkt me niet dat het een bepaalde tijd is waar de while op wacht, want als ik volgende uitgebreider maak of korter heeft dat geen effect, het blijft de 75e waarde waarbij hij stopt....

Maar een 2e inverse functie lost het ook niet op...

Kan iemand me helpen?

Acties:
  • 0 Henk 'm!

Verwijderd

Post anders eens je while loop?

Hoe haal je die waardes uit de database en hoeveel queries voer je uit, toch geen 75?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
De while loop ziet er zo uit:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//gaat alle gebieden door, soort motor om hoekcooridnaten te doorlopen
 $query = mysql_query("SELECT id FROM naamgebieden WHERE id > 2");
 while ($rond = mysql_fetch_array($query)){
   $id = $rond['id'] ;
   echo "<br> DIT GAAT OM GEBIED MET ID: " . $id;
        
   // dit stukje pakt de hoogste y coordinaat : let op, eigenlijk omgekeerd, laagste cijfer, maar in plaatje dus hoogste pixel
   $queryhoogsteycoordinaat = mysql_query("SELECT x, y, richting FROM omtrekgebieden WHERE id LIKE '$id' ORDER BY y DESC LIMIT 1 ");
   $hyc = mysql_fetch_array($queryhoogsteycoordinaat); 
   $xeerste = $hyc['x'];
   $yeerste = $hyc['y'] ;
   $result = mysql_query("SELECT count(*) FROM omtrekgebieden WHERE id LIKE '$id' ");
   $aantalwaarden = mysql_result($result, 0);
   volgende($id, $xeerste, $yeerste, $aantalwaarden);
 }//end of while


en die roept dus volgende aan, die er (verkort, want het is een behoorlijk ingewikkelde functie) zo uit ziet :

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
    function volgende($id, $x, $y, $i) {
      //erg lang gedeelte dat alle mogelijkheden afgaat, die de richting van de vorigecoordinaat naar nu bepaald
    //voegt ook de hoeken, als het om een hoek gaat toe aan de database
    //gedeelte is hier dus voor de overzichtelijkheid maar weggelaten..
        if ( $richtingnu == "leeg") {
          echo "<br> HIER GAAT UT FOUT MET ALLES, heeft namelijk geen richting meer";
          flush(); 
        } 
       else {
          echo "<br> heeft in elk geval een richting";
          if ($i > 0) {
            echo "<br> hij voert nu volgende opnieuw uit met " . $id . " en x is " . $xje . " en y " . $ytje . " richtingnu " . $richtingnu;
            $i = $i - 1;
            echo "<br> i is" . $i;
            flush();
            volgende($id, $xje, $ytje, $i);
          }//end of if
          //else: klaar, eerste opnieuw erin, zodat ie ook echt rond is
          else {
             echo "<br> hij is klaar";
             flush();
         }// end of else
       }//end of else

    }//end of function volgende      


Als ie nu dus 75 x of vaker de functie volgende aanroept gaat het fout... bij minder dan 75 gaat het goed, en pakt ie de id van het volgende gebied. Ook is dan met de hoeken een mooie kloppende polygoon te maken..

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
of is er misschien een alternatieve manier om zich zelf aan te roepen? want ik denk dat daar ergens het probleem in zit, dat ie dat niet vaker dan 75 x kan..

Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 14:28
Zit er niet een fout in de data waardoor je bij het 75e item in een eindeloze loop komt?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
lijkt me niet.. dan zou die sowieso een echo moeten geven, en dan heel vaak, en niet zeggen dat ie gereed is..

Bovendien doet ie het bij elke verschillende puntenwolk van meer dan 75 waardes... Dan zou bij elke puntenwolk de 75e waarde fout moeten zijn... zou erg toevallig zijn..

Acties:
  • 0 Henk 'm!

  • Knutselsmurf
  • Registratie: December 2000
  • Laatst online: 20-09 22:57

Knutselsmurf

LED's make things better

Het lijkt er sterk op, dater een limiet zit aan het aantal recursieve aanroepen.

Uit je verhaal maak ik op, dat je een convex-hull wilt maken van een set punten. Daar zijn wel algorithmen voor te vinden die niet recursief zijn.

- This line is intentionally left blank -


Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 14:28
Dan zou er dus nooit een recursieve functie kunnen zijn met meer dan 75 aanroepen? Lijkt me wel een erg extreme beperking en niet echt haalbaar binnen een programmeertaal wel?
edit: bewijs dat het inderdaad onzin is dat er ene beperking zit op het aantal recursieve aanroepen:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?PHP

//code to test:
//    Has PHP a limit in the number of loops a function should make?

echo 'starting tests...<p>';
function recurse($i=0){
    echo $i.'<br>';
    if($i<1000) {
        recurse($i+1);
    }
}
recurse();
?>


edit:
Waar slaat dit op? "SELECT count(*) FROM omtrekgebieden WHERE id LIKE '$id' " Lijkt me een vrij zware operatie die je niet zomaar wilt doen, zeker niet in een lus.

Graag ook dit stuk van de code:
//voegt ook de hoeken, als het om een hoek gaat toe aan de database
//gedeelte is hier dus voor de overzichtelijkheid maar weggelaten..

[ Voor 81% gewijzigd door djluc op 12-01-2005 15:37 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ik heb elke mogelijke richting nu een aparte functie gegeven, en nu werkt ie wel, ook bij puntenwolken met meer dan 75 buitenste coordinaten..

waar het probleem dus precies in zat is vaag.. maar het werkt in elk geval.. Bedankt allemaal

Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 14:28
Zou je eens de code kunnen posten? Ik vind het namelijk maar een vaag probleem en wil weleens weten wat er niet klopt.

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Waarom eigenlijk een recursieve convex hull functie terwijl die ook heel erg makkelijk iteratief te implementeren is?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1