Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: C-käännös localhostilla

Sivun loppuun

JayC [19.01.2005 09:46:04]

#

Väsäilin ohjelmaa joka kääntää annetun c-koodin ja tarkistaa koodin oikeellisuuden. Ohjelma koostuu kahdesta osasta, sivu.php, joka sisältää lomakkeen koodin kirjoitusta varten, sekä plop.php, joka käsittelee lomakkeen sisällön.

Homma toimii unix-palvelimella vallan mainiosti, mutta omalla koneella en saanut sitä toimimaan. Ohjelma.c kyllä tallentuu levylle, mutta käännös ei toimi. Asensin koneelle kääntäjäksi DJGPP:n ja koodin kääntäminen komentoikkunassa onnistuu hyvin. Mutta tuon php-skriptin kautta käännös ei toimi. Missä mahtaa olla vika? Käyttiksenä Windows XP Pro.

sivu.php

<html>
<font size="+2">Ohjelmointitehtävät</font><br><br>
Tehtävä 1: Kirjoita ohjelma, joka tulostaa näytölle tekstin: "Hello"<br>
<FORM method="post" action="plop.php">
<TEXTAREA name="koodi" rows="12" cols="50"></TEXTAREA>
<p><input type='submit' value='Vastaa'></p>
</FORM>
</html>

plop.php:

<?php
$ff = fopen("ohjelma.c", "w");
        fwrite($ff, stripcslashes($_POST["koodi"]));
fclose($ff);
echo '<pre>';

// Outputs all the result of shellcommand "ls", and returns
// the last output line into $last_line. Stores the return value
// of the shell command in $retval.
$last_line = system('gpp c:\palvelin\ohjelma.c -o c:\palvelin\ohjelma.exe 2>virhe', $retval);
// Printing additional info
echo '
</pre>
<hr />Käännös palautti: ' . $retval;

if ($retval == 0) {
//Käännös onnistui
   system('ohjelma > temp');
   system('diff -b tulos temp', $retu);
   echo ' <hr />Vertailu palautti ' . $retu;
   if ($retu == 0) {
     //Ohjelman ajaminen onnistui
     echo '<P>Ohjelman ajo onnistui';
   } else {
     echo '<P>Ohjelma tulosti<pre>';
     system('cat temp');
     echo '</pre><P>Kun sen olisi pitanyt tulostaa<P><pre>';
     system('cat tulos');
     echo '</pre>';
   }
} else {
//Käännöksessä virheitä
   echo '<hr />Virheitä: <pre>';
   system('cat virhe');
   echo '</pre>';
}
echo '<pre>';

?>

pistemies [19.01.2005 12:23:14]

#

Minulla ainakin windows tekee ylimääräisiä rivejä tiedostoon. Olen saanut ne pois rtrim-funktiolla

JayC [19.01.2005 12:53:57]

#

Pekka Mansikka kirjoitti:

Minulla ainakin windows tekee ylimääräisiä rivejä tiedostoon. Olen saanut ne pois rtrim-funktiolla

Siis mihin tiedostoon tässä tapauksessa? Ohjelma.c tallentuu ihan oikein, eli siihen ei ainakaan mitään ylimääräisiä rivejä tule.

Tämä meneekin mielenkiintoiseksi. Kokeilin ohjelmaa toisella unix-palvelimella, eikä toiminut. Eli yhdellä palvelimella toimii, toisella ei... Tuo palvelin, jolla käännös toimii, on kouluni sisäisessä verkossa. Voisiko käyttöoikeuksilla olla jotain tekemistä tämän kanssa? Eli oikeudet ei riitä tuon käännösprosessin suorittamiseen php:lla muissa kuin tuossa intranetin palvelimessa? Tämä on siis täyttä newbie-arvailua...

Blaze [19.01.2005 16:36:28]

#

system -funktio rajotetaan tiettyyn hakemistoon, jos PHP:n safe mode on päällä. Kannattaa myös huomata, että sulla pitää olla sillä Windows-koneellaki nuo Unix-ohjelmat (diff, cat), jotta tuo toimii oikein.

JayC [20.01.2005 07:58:58]

#

Eipä ole PHP:n safe mode päällä. Pitäisiköhän suosiolla asentaa Linux niin saisi homman toimimaan, vai saako diff:n ja cat:n toimimaan Windows-koneellakin? Koneella olisi muutakin käyttöä eli pitäisin kyllä XP:n käyttiksenä jos vaan mahdollista.

Blaze [20.01.2005 13:33:39]

#

Asentamalla Cygwin-ympäristön saat Unix-työkalut Windows-koneeseen.

JayC [20.01.2005 14:05:48]

#

Loistavaa, täytyy asentaa ja testata. En tiedä auttaako kuitenkaan tuohon varsinaiseen ongelmaan, eli tuon system-funktion suorittamiseen.

JayC [21.01.2005 14:11:51]

#

Nyt on cygwin asennettuna ja hyvin tuntuvat Unix-komennot toimivan. Ja c-koodi kääntyy hyvin gcc:llä, mutta ei tuon plop.php:n kautta. Pitäisikö tuota plop.php:tä muuttaa jotenkin (paitsi gpp-kääntäjän tilalle gcc) vai pitäisikö sen toimia tuollaisenaan cygwinin kanssa?

JayC [21.01.2005 17:52:56]

#

No niin, nyt löytyi vika. Eli kaikkiin system-komentoihin piti vain lisätä cmd tyyliin:

system('cmd gpp c:\palvelin\ohjelma.c -o c:\palvelin\ohjelma.exe 2>virhe', $retval);

Nyt toimii kaikki kuten pitääkin. Kiitoksia vinkeistä, etenkin tuosta cygwinistä.

JayC [24.01.2005 09:17:44]

#

Iloitsinpa liian aikaisin. Käännös kyllä palauttaa arvon 0, mutta koodin kääntämisen sijaan tapahtuu vain komentoikkunan avautuminen. Jostakin syystä system-komento tuntuu toimivan ainostaan cmd:n kanssa, eli system:llä ei pysty tekemään muuta kuin avaamaan komentoikkunan. Miksi näin? Tein tällaisen simppeli php-pätkän jolla testailin eri system-käskyjen suorittamista:

<?php
system('gpp c:\palvelin\ohjelma.c -o c:\palvelin\ohjelma.exe');
?>

"gpp c:\palvelin\ohjelma.c -o c:\palvelin\ohjelma.exe" toimii kyllä mainiosti Windowsin "Run"-ikkunassa, mutta system:n kautta tulee vain virheilmoitus "The system cannot execute the specified program."

Ja kuten aiemmin todettua, PHP:n safe_mode ei ole päällä.

Blaze [24.01.2005 13:57:56]

#

Hmm... Koitahan tehä "cmd /C gpp blah", tuon /C -vivun pitäis laittaa komentotulkin ajamaan tuo parametrina tuleva komento.

JayC [25.01.2005 09:52:46]

#

Ei vaikutusta. Nyt kun tuo cygwin on asennettuna ajattelin kokeilla jos käännös onnistuisi paremmin gcc:llä. Kun tuo gpp ei jostain syystä toimi system-komennolla. No, gcc toimii kyllä muuten, mutta seuraa virheilmoitus:

ohjelma.c:1: stdio.h: No such file or directory

Kokeiln gcc:llä kääntämistä command promptissa ja huomasin että käännös onnistuu vain tietyssä hakemistossa (c:/DJGPP/bin tai c:/cygwin/bin). Muutin ympäristömuuttujiin INCLUDE-hakemistoksi c:/DJGPP/bin, mutta mikään ei muuttunut. Ympäristömuuttujista tuo ongelma ymmärtääkseni johtuu...

JayC [25.01.2005 12:28:21]

#

Menin siitä mistä aita on matalin ja laitoin koko höskän tuonne c:/cygwin/bin:iin ja tein siitä juurihakemiston Apachelle. Ja nyt vihdoinkin toimii kuten pitääkin.

sooda [25.01.2005 12:31:17]

#

Siis laitoitko ton hakemiston INCLUDE-ympäristömuuttujaan? PATH olisi se oikea. Sieltä haetaan ajettavia ohjelmia joille ei anneta suoraa polkua.

JayC [25.01.2005 13:52:04]

#

Kokeilin sekä INCLUDEa että PATHia. Ei vaikutusta...


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta