CO538 Anonymous Questions and Answers |
This page lists the various questions and answers. To submit a question, use the anonymous questions page. You may find the keyword index and/or top-level index useful for locating past questions and answers.
We have taken the liberty of making some minor typographical corrections to some of the questions as originally put. Although most of the questions here will have been submitted anonymously, this page also serves to answer some questions of general interest to those on the course.
When asking questions, please do not simply paste in your code and ask what is wrong with it, as these types of question are hard to answer in a public forum (resulting in either no answer, or an answer which will only be of use to the person asking the question). In many cases, a question about code can be formulated in general terms. For example, if you have an `IF' block that results in an `incorrect indentation' error, you might ask, ``what is the correct syntax for an occam `if' statement ?''. Questions of this form are easier to answer, and are meaningful to all.
Questions that are not suitable for these public pages (i.e. those that contain assignment-specific code), should be mailed to your seminar-leader.
I am having trouble with step 3 of the assessment. I am trying to have a variable that is set to either 1 or -1, and then the one of the numbers within pairs is multiplied by this number before the addition takes place (having the effect of subtraction).
My trouble comes in where to create and initialise the variable (call it `b'). At the moment I have it in my monitor process...
[snip code]
but when I compile, it whinges on the line marked that `b' is not declared. Doesn't the declaration at the top of the PROC last throughout the process ?? If not, how can I introduce the `b' variable without it being reset to one each time the process is run??
The rule with variable declarations in occam is that they are visible in the process following the declaration, and only that process.
For a good description of this, which relates directly to the error in your code, see Question 3 (2000). You should have gotten an error about incorrect indentation in that code too..
Keywords: q4
Can you tell me why I get the following error message ?
black.hole(interrupt) -- type mismatch for parameter 1 in call of black.hole
The PROC header for `black.hole' is:
PROC black.hole (CHAN OF BYTE in)
The only reasonable explanation is that you're trying to pass a channel parameter that's not a `CHAN OF BYTE'. If you need an INT `black.hole', this can be easily created by modifying the existing `black.hole', but make sure you call yours something different (like `int.black.hole', for example). The source for the existing `black.hole' can be found on raptor in:
/usr/local/courses/co516/libsrc/utils.occ
(or, from windows, `\\raptor\files\courses\...').
Keywords: type-mismatch
Are we allowed to create a process called `my.prefix', and replace the standard `PROC prefix (...)' within `my.numbers' / `my.integrate' with the new `PROC my.prefix (...)' ?
Yes, in theory there's no problem with doing that. However, for this assessment, there shouldn't be a need to do this, but that depends on how you go about modifying the various process networks.
Keywords: q4
How is it possible that If I run the process (without inputting anything) at a certain point I start getting negative numbers for the 2nd and 3rd column ?
This is quite possibly normal behaviour. In standard 32-bit 2's complement signed arithmetic:
1500000000 PLUS 1500000000 = -1294967296
In occam, you must use the `PLUS' operator to get this behaviour. The standard `+' operator will cause a run-time error when this happens, which is generally what you want.
You might want to consider slowing the output down with a suitable delay. See Question 13 (2000) for how to do this. In relation to Q4, the initial values output by the program should be correct, until something overflows that is. If the output goes negative very early on, then something is probably wrong -- check the values!
Keywords: overflow , negative-numbers
Referrers: Question 26 (2003)
I have now got a completed version of q4. However, in this monitor process...
[snip code]
.... it will only reset `I' or `P' if I press the key twice and it pauses it inbetween each key press. How come it is doing this as it is only the `S' case that asks for a second input? Also, typing in N twice causes the program to deadlock, yet I can't think of why. Any suggestions?
You have an ALT guard of the form:
in ? y BYTE x: SEQ in ? x ... do something based on `x'
Before getting to the `do something based on `x'' bit, two inputs will happen on "in". Remember that in an ALT, input guards do perform the input before the guarded process runs. The correct guard/process would be something like:
in ? y ... do something based on `y'
Keywords: q4 , alternation
Could you tell me why the following cose is outputting negative numbers?
[snip code]
I really dont understand what's wrong with it!
See the answer to Question 24 (2003). That should explain it.
Keywords: negative-numbers
I'm having some problems with the new pairs process. This is what I've done:
[snip code]
It doesn't seem to be doing anything. Any suggestion ?
This appears to be a common mistake -- you're instancing the `plus' and `minus' PROCs from inside another component, that results in your component behaving like either `plus' or `minus' respectively. However, once called, these PROCs never return, as they have WHILE TRUE loops.
If you want a single component to take care of the addition/subtraction, you have to engineer (program) it that way -- i.e. a single self-contained PROC, not one that instances other PROCs. If you do want to re-use the existing `plus' and `minus' PROCs, they have to be engineered into a suitable parallel network -- i.e. instanced directly under a PAR, not from sequential code.
Keywords: q4 , process-networks
Referrers: Question 29 (2003)
The compiler doesn't seem to like the following code:
[modified code] PROC layout.max.chans (...) WHILE TRUE [max.chans]INT n: ... SEQ process that reads values in PAR then writes them out PRI ALT int x: ... guard and process :
With an error of the form:
layout.max.chans(...) -- layout.max.chans is not declared
This isn't the real error. `layout.max.chans' isn't considered declared because the compiler couldn't parse/compile it. I see what you're trying to do, but this isn't necessarily the best place to do it.
If you really want to modify `layout.max.chans', the errors are incorrect indentation at the `PRI ALT' and `int x:' isn't a valid declaration. The first error is likely a missing `SEQ', or mis-placement of the `PRI ALT'. See Question 1 (2000) for more details on this. The second is easy -- `int' should be `INT', and the guard should be indented at the same level as the declaration, with the guarded process indented under that.
Keywords: undeclared , incorrect-indentation
I'm having trouble with getting the `pairs' process to toggle adding and subtracting. The following code compiles but doesn't do much, the only effect being that an input on the control line stops any other keypresses getting through. Ive tried declaring `subtract' in various places to no avail. Thanks.
[snip code]
See the answer to Question 27 (2003) for a brief description of the problem. Your code contains the process networks for both versions of pairs, but once running, these will never terminate -- they contain `WHILE TRUE' loops. You need to modify the process network itself -- not `wrap' the networks up in other code, as that won't work.
Keywords: q4
my program keeps aborting when i run it, it shows this ...
KROC: Range error / STOP executed (signal 11) KROC: Fatal error code 1, core dumped Abort (core dumped)
what is wrong here?
This is the result of a run-time error in your occam program. These errors are caused by one of the following:
However, the error doesn't tell you where or exactly what the error is. Post-mortem debugging is available in KRoC, but only for the Linux version at the moment -- you can use `gonzo' for this. Compiling with the `-d' flag will turn on debugging such that when the program crashes, it'll display a more useful error message (including the file-name and line-number where the error occurred).
See also the answer to Question 70 (2000).
Keywords: range-error , stop
Referrers: Question 31 (2012) , Question 47 (2003) , Question 72 (2003) , Question 86 (2003)
I'm a bit confused about the `out.int' and `out.string' PROCs in `layout.max.chans' in Q4. Are they already defined somewhere, because I can't seem to find them. Or are we meant to define these two PROCs ?
They are defined elsewhere -- in `course.lib' to be precise, so you must not define them yourself -- doing so will result in linker errors when it finds two copies of each (one from the course library and one from your code).
These two PROCs just write INTs or BYTE-arrays to a BYTE channel, aligning in the given `field' (2nd parameter). Writing `out.string' is easy, `out.int' less so. You can find the code for these on raptor in:
/usr/local/courses/co516/libsrc/utils.occ
Keywords: out.int , out.string , q4
Just a small question, what is the bell character? i.e. the one that makes the terminal bleep? I was told it was BELL, but if thats true do we have to output it one letter at a time ?
No; `BELL' is a BYTE constant. Please refer to Question 13 (2003).
This is one of the statements under a PRI ALT in my code:
BYTE y: in ? y out ! y
When I compile it tells me that `y' is not declare on the second line. However, I have exactly the same piece of code in another PROC with a `z' instead of a `y' and yet it compiles ok. Any ideas ?
If that's a guard of a PRI ALT, there's nothing wrong with it. Thus, the error must be elsewhere. Errors above that, but possibly still inside the PRI ALT, might be confusing the compiler when it gets to this point. The first error output by the compiler is generally the most relevant -- others may simply be a cascade effect.
Keywords: alternation , variable-scope
[snip code]
I'm probably missing something really obvious, but why is this not giving any output? There is nothing coming in through the input channel, but yet when I attatch it to a tested output module nothing comes out.
Look carefully at the PROC heading for `replace':
PROC replace (CHAN OF INT in, control, out)
and note the ordering of the `in' and `control' channel parameters.
Keywords: q4
I have:
VAL INT state IS 0:
I'm hoping this is like an external field in Java, but I can't work out how to alter the value of state. ``state := 1'' and many other ways I can't get to work. How can I alter the value, or is there another way or storing a value outside of a proc.
In occam, the only way you can make a variable global to a PROC is to have it in-scope. The `VAL' qualifier in occam effectively means constant, so your `state' isn't actually a variable -- it's a constant equal to zero. Removing the `VAL' won't work either, since occam does not permit variables to be declared at the outermost level.
You can do this sort of thing, but it probably won't work in the way you expect it to.. e.g.:
PROC thing (...) INT state: PROC fiddle.state (VAL INT new.state) state := new.state : ... body of `thing' :
In this code, the PROC `fiddle.state' has access to the `state' variable. However, the compiler's alias and parallel usage checking might prevent you from using `state' in the `body of `thing'' -- depending on usage of `fiddle.state'. In short, this is generally not a good way forward.
If you need a state variable for a PROC, just declare it inside the PROC and initialise suitably, e.g.:
PROC thing (...) INT state: SEQ state := 0 -- default state ... body of `thing' :
Only useful if the `body of `thing'' is long-lived, however.
Keywords: global-variables
To suspend screen output, would directing the `out.int' and `out.string' to a `black.hole' be appropriate ? I have tried this but it doesn't seem to work, am I going in the right direction or completely off.
Re-directing the output to a `black.hole' won't suspend it -- it'll gobble it up, like a black-hole. To suspend the output you need to stop the flow of data, which is often simpler than re-directing it. See the model answer for question 3 (on raptor) for an idea of how to do this.
I've tried to install KRoC onto my computer at home running Mandrake Linux. I ran the `build' script, so it should be installed according to the installation instructions. But yet it still doesn't recognise the 'kroc' command. Sorry I'm new to linux, what have I done wrong (or more likely not done)?
You suggest correctly that it's something which you've not done. Before you can use kroc, you need to source the setup file. More than likely, this will be something like:
mandrake$ source /path/to/kroc/bin/setup.sh
replace `/path/to/kroc/' with the directory where you installed KRoC to -- which will be the source tree if you just hit return at the first question it asks you (about where to install).
Once that file has been sourced, the `kroc' command should work.
Keywords: mandrake-linux , linux
Do we have to use the replace function provided for q4 ?
I have a working q4 but it does not use the replace function. That ok?
In theory, yes. However, if your solution would have been more efficient using `replace' you may lose marks based on that. However, if your solution is succinct and correct, no marks will be lost.
Keywords: q4
I've done the third mod and it works fine. However, someone has just mentioned that you didn't want us to modify the `plus' process. Is this true ?
The question says:
'p' ==> the first 'p' zaps the adder process within pairs so that it becomes a subtractor, taking the numbers arriving directly from the delta process away from those arriving from the tail. In this state, the modified pairs becomes a `differentiator', undoing the `integration' effect of the process immediately upstream so that we see the natural numbers sequence. A second 'p' toggles the process back to its original state. Subsequent 'p's toggle between the two states.
There is not a single `right' way to do this. The first line seems to imply that you should modify the adder process, though there is a neat solution that doesn't.
Keywords: q4
delta (g, h, c[0])
this is in my main q4 proc. `g' is the input coming from numbers, `c[0]' is an output which will go to layout.max.chans and `h' is an output which will go into integrate. I know numbers gives an output as I've tested it with an output module, but as soon as I attatch the output from number to the input of this delta neither `h' or `c[0]' give any outputs when tested with the same output module.
I can't for the life of me see what I've done wrong! I've checked that all channels are connected correctly over and over so its not that either. Any ideas?
Two numbers must be output by the `numbers' process before any proper output appears. Since all the output is done via `layout.max.chans', that must input from each of its channels before anything will be displayed on the screen. Thus, if any of those input channels are unconnected, nothing will happen -- the `layout.max.chans' process will wait for input forever -- the `max.chans' constant defines how many channels should be `layed-out'. Similarly, if your pairs process doesn't output after two inputs, things will deadlock -- `layout.max.chans' will be waiting for that final input and the remainer of the network will probably be blocked on output.
Keywords: q4
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 Unported License. |