Register a SA Forums Account here!
JOINING THE SA FORUMS WILL REMOVE THIS BIG AD, THE ANNOYING UNDERLINED ADS, AND STUPID INTERSTITIAL ADS!!!

You can: log in, read the tech support FAQ, or request your lost password. This dumb message (and those ads) will appear on every screen until you register! Get rid of this crap by registering your own SA Forums Account and joining roughly 150,000 Goons, for the one-time price of $9.95! We charge money because it costs us money per month for bills, and since we don't believe in showing ads to our users, we try to make the money back through forum registrations.
 
  • Post
  • Reply
Dicky B
Mar 23, 2004

Hey aren't you the keyboard goop guy?

Adbot
ADBOT LOVES YOU

Good Will Punting
Aug 30, 2009

And as the curtain falls
Just know you did it all except lift weights
I have a practice question for a final exam tomorrow that I'm a little confused about. We're asked to write a class that does all the major operations on large integers. I'm not sure how to store said large integers. All the help on Google says that I should use string objects, but the professor makes it seem like he doesn't want us to use a string (or a vector). Should I store the integers in a regular array? This seems kinda like a pain in the rear end to manipulate.

TasteMyHouse
Dec 21, 2006

Dicky B posted:

Hey aren't you the keyboard goop guy?

what's this story

TasteMyHouse
Dec 21, 2006

Good Will Punting posted:

I have a practice question for a final exam tomorrow that I'm a little confused about. We're asked to write a class that does all the major operations on large integers. I'm not sure how to store said large integers. All the help on Google says that I should use string objects, but the professor makes it seem like he doesn't want us to use a string (or a vector). Should I store the integers in a regular array? This seems kinda like a pain in the rear end to manipulate.

What does the professor say that makes it seem that way?

Good Will Punting
Aug 30, 2009

And as the curtain falls
Just know you did it all except lift weights

TasteMyHouse posted:

What does the professor say that makes it seem that way?

The assignment was posted two weeks before the lesson on the string class & vectors.

Echoing the previous "Nobody can teach C++". He gives us notes/really easy examples then hand us problems like this with no gap between them and no guidance whatsoever. Not to say this is hard, but there are things left to figure out that throw me off. It would be fine if it was an actual project, but he pulls this on the exams too and expects us to write like 6 mini projects perfectly without any testing in 2.5 hours. It's loving infuriating, sorry for ranting.

Good Will Punting fucked around with this message at 02:32 on Aug 27, 2011

Dicky B
Mar 23, 2004

TasteMyHouse posted:

what's this story
:nws: http://forums.somethingawful.com/showthread.php?threadid=3221068

ValhallaSmith
Aug 16, 2005

Good Will Punting posted:

I have a practice question for a final exam tomorrow that I'm a little confused about. We're asked to write a class that does all the major operations on large integers. I'm not sure how to store said large integers. All the help on Google says that I should use string objects, but the professor makes it seem like he doesn't want us to use a string (or a vector). Should I store the integers in a regular array? This seems kinda like a pain in the rear end to manipulate.

Are you talking Big Numbers such as 200 digits of pi or just large integers that would fit in an int or int64? One is trivial the other is not. If its big numbers then strings would probably be the fastest(coding wise) way to do it. I'm not sure what the GMP does for its functions.

Good Will Punting
Aug 30, 2009

And as the curtain falls
Just know you did it all except lift weights
The example he gave is an integer of 25 digits.

TasteMyHouse
Dec 21, 2006

Good Will Punting posted:

The example he gave is an integer of 25 digits.

Just use strings

TasteMyHouse
Dec 21, 2006

well this explains what he IMed me

Only registered members can see post attachments!

ValhallaSmith
Aug 16, 2005

TasteMyHouse posted:

Just use strings

Comedy option: Program it on a vax emulator with 128 bit INTs.

nielsm
Jun 1, 2009



If you want proper big integer support with unlimited size numbers, strings or vectors is the only sensible solution.

There are three general ways I can think of how to handle it:

1. Working directly on strings
Simply looping over two strings doing arithmetics the way you were taught in grade school, one digit at a time.

2. List of regular integers
You can treat each machine integer as a single digit in base 232 and work on those. It's probably way faster than the string approach and possibly even easier to program. Or maybe work with 16 or 8 bit units so you don't have to get into 64 bit integer land.

3. Binary coded decimal
One 8 bit byte is treated as two 4 bit digits, where only values 0 to 9 are valid. Arithmetic is done on those. The x86 architecture actually has instructions to deal with BCD but I can't imagine your C++ compiler actually exposes it so it'll probably be really annoying to implement.

Note that in option 1, you would be using a string, and in options 2 and 3 you would be using a vector (or other dynamic array structure) of integers or chars.

I would suggest doing option 2.

TasteMyHouse
Dec 21, 2006

nielsm posted:


2. List of regular integers
You can treat each machine integer as a single digit in base 232 and work on those. It's probably way faster than the string approach and possibly even easier to program. Or maybe work with 16 or 8 bit units so you don't have to get into 64 bit integer land.

...

I would suggest doing option 2.

This will definitely be more performant but since it requires thinking in an unfamiliar arithmetical system it might be harder to think through the logic. Option one has the advantage of being dead simple -- just express in code basic elementary school arithmetic.

Do 2 if you're looking to stretch your mind, do 1 if you just want to get the job done quickly and easily.

Good Will Punting
Aug 30, 2009

And as the curtain falls
Just know you did it all except lift weights
Thanks for the help. I'm working through this, deciding to take the "get the job done quickly" approach because if something similar is asked on the exam, that's what I'll need to do. Pretty unfortunate.

Qwertycoatl
Dec 31, 2008

TasteMyHouse posted:

This will definitely be more performant but since it requires thinking in an unfamiliar arithmetical system it might be harder to think through the logic. Option one has the advantage of being dead simple -- just express in code basic elementary school arithmetic.

Do 2 if you're looking to stretch your mind, do 1 if you just want to get the job done quickly and easily.

It's not so bad really. It's pretty much exactly the same except that everywhere you write '10' you write '65536' instead.

nielsm
Jun 1, 2009



Qwertycoatl posted:

It's not so bad really. It's pretty much exactly the same except that everywhere you write '10' you write '65536' instead.

That's exactly what makes it hard. Thinking in different bases than what you were brought up with is a major paradigm shift and some people just can't wire their brains right for it, and writing correct code to solve a problem is drat near impossible if you don't understand the problem fully.
("Paradigm shift". Did I use that word right? I think it's appropriate here...?)

Good Will Punting
Aug 30, 2009

And as the curtain falls
Just know you did it all except lift weights
I understand recursion from math classes, but wow, the way it was explained in my class through Towers of Hanoi was piss poor. I've heard Stack Overflow suggested here, but is there anywhere less, specific I guess?, for me to continue my studies after this class is over? I don't really know where to go from here, I guess. The resources in the OP look a little advanced for where I'm at.

Jabor
Jul 16, 2010

#1 Loser at SpaceChem

Good Will Punting posted:

I understand recursion from math classes, but wow, the way it was explained in my class through Towers of Hanoi was piss poor. I've heard Stack Overflow suggested here, but is there anywhere less, specific I guess?, for me to continue my studies after this class is over? I don't really know where to go from here, I guess. The resources in the OP look a little advanced for where I'm at.

My best suggestion would be "Don't think you're somehow constrained to C or C++".

Learn Scheme or Haskell or F# or something if you really want to force yourself to grok recursion.

Metaconcert
Nov 28, 2010

"And my answer is when there are nine"

Good Will Punting posted:

Thanks for the help. I'm working through this, deciding to take the "get the job done quickly" approach because if something similar is asked on the exam, that's what I'll need to do. Pretty unfortunate.

Given that it's the final, this might not be something to look at immediately, but the Karatsuba algorithm is both a nice approach to computing the multiplication component and relatively easy to understand. There's a good chance you'll see it in a later class as well, so if you're feeling both driven and masochistic...

Also a recursive algorithm, as it happens.

roomforthetuna
Mar 22, 2005

I don't need to know anything about virii! My CUSTOM PROGRAM keeps me protected! It's not like they'll try to come in through the Internet or something!

Good Will Punting posted:

I understand recursion from math classes, but wow, the way it was explained in my class through Towers of Hanoi was piss poor. I've heard Stack Overflow suggested here, but is there anywhere less, specific I guess?, for me to continue my studies after this class is over? I don't really know where to go from here, I guess. The resources in the OP look a little advanced for where I'm at.
Towers of Hanoi is intrinsically a terrible example for recursion because it's a job that's not actually best-suited to recursion. Not even moderately well suited to recursion - if 10 random experienced programmers [who understand the Towers of Hanoi puzzle] were asked to write a Towers of Hanoi solver, with no constraints, I'd bet at least 9 of them would not use recursion.

Though to be fair it is tricky to come up with an example of a problem to which recursion is suited that isn't also too complicated to serve as an explanation.

shrughes
Oct 11, 2008

(call/cc call/cc)

roomforthetuna posted:

Towers of Hanoi is intrinsically a terrible example for recursion because it's a job that's not actually best-suited to recursion. Not even moderately well suited to recursion

What are you talking about, Towers of Hanoi is one of the most well-suited problems in existence when it comes to the applicability of recursive problem solving. If you want to figure out how to move the tower from peg A to peg B, you'll know that at some point you'll need to move the bottom disc from peg A to peg B (and by symmetry there's no sensible route to take that involves going via peg C) which means that you need to move all the other disks from peg A to peg C, first, and then move the bottom disc from A to B, and then, in the interest of completing the problem, move all the other disks from peg B to peg C. And you know that the subproblem can be treated independently because the bottom disc is bigger than the others and since it's not being moved it will always be beneath the other discs.

I remember when I was a kid, we'd play computer games on these green-screen computers from a previous epoch and one of them was Towers of Hanoi. Guess what, I had no clue how to solve the puzzle, but obviously one way was to keep track of all possible positions and all possible moves and consider a way to get to the finish, but that's way too complicated, and eventually I realized that you had to move disc #1 the opposite peg you wanted to move disc #2 to, and the same peg you wanted to move disc #3 to, and if you wanted to make your first move the decision would flip back and forth depending on how high the tower was, but the question knowing a solution and knowing exactly why the solution works and the question of how to make an implementation of a solution is easy when the problem is regarded recursively.

If 9 out of 10 programmers don't use recursion, it's because 90% of programmers are crap. They don't matter.

shrughes fucked around with this message at 02:29 on Aug 28, 2011

roomforthetuna
Mar 22, 2005

I don't need to know anything about virii! My CUSTOM PROGRAM keeps me protected! It's not like they'll try to come in through the Internet or something!
I certainly didn't mean they wouldn't use recursion because they don't understand it. But yeah, I suppose I'm wrong about it being horrible to solve ToH with recursion if you're solving the whole thing in one pass, which is what you'd be doing in a lesson context now I think about it that way.

I was thinking in game terms where you'd want to display the moves between solve-steps, in which context you only want to figure out the next move, not solve the whole thing in one call - using recursion to figure out the next move is a horrific solution. You don't need a lookahead to know what the next move is. (Unlike Chess, where recursion is a pretty good way to figure out a good move.)

Good Will Punting
Aug 30, 2009

And as the curtain falls
Just know you did it all except lift weights
Final exam was not bad!

Recursion didn't end up on it (neither did vectors, sadly) but I still plan on understanding the Towers of Hanoi problem. Conceptually, I get it clear as day. But I've spent quite some time trying to understand what the gently caress is going on in the C++ example we were given, and the way my teacher presents it is confusing as all hell. Maybe it's a poorly designed example, maybe there's something I'm missing, but it's really bugging me and if anyone is interested in explaining it step by step, I'd gladly trade a Plat upgrade for a detailed explanation of what's going on. Closure from this course and onto a more practical way of learning C++, if you will.

Eggnogium
Jun 1, 2010

Never give an inch! Hnnnghhhhhh!

Good Will Punting posted:

Final exam was not bad!

Recursion didn't end up on it (neither did vectors, sadly) but I still plan on understanding the Towers of Hanoi problem. Conceptually, I get it clear as day. But I've spent quite some time trying to understand what the gently caress is going on in the C++ example we were given, and the way my teacher presents it is confusing as all hell. Maybe it's a poorly designed example, maybe there's something I'm missing, but it's really bugging me and if anyone is interested in explaining it step by step, I'd gladly trade a Plat upgrade for a detailed explanation of what's going on. Closure from this course and onto a more practical way of learning C++, if you will.

If you understand it conceptually but not in C++ code, it could be because it's not that well suited to being translated into procedural code, since you can't actually see the disc relationships and positions. Try looking up a simple mathematical function that uses recursion, like factorial or the Fibonacci sequence.

TasteMyHouse
Dec 21, 2006

Good Will Punting posted:

Final exam was not bad!

Recursion didn't end up on it (neither did vectors, sadly) but I still plan on understanding the Towers of Hanoi problem. Conceptually, I get it clear as day. But I've spent quite some time trying to understand what the gently caress is going on in the C++ example we were given, and the way my teacher presents it is confusing as all hell. Maybe it's a poorly designed example, maybe there's something I'm missing, but it's really bugging me and if anyone is interested in explaining it step by step, I'd gladly trade a Plat upgrade for a detailed explanation of what's going on. Closure from this course and onto a more practical way of learning C++, if you will.

Can you post the code you're referring to?

roomforthetuna
Mar 22, 2005

I don't need to know anything about virii! My CUSTOM PROGRAM keeps me protected! It's not like they'll try to come in through the Internet or something!

roomforthetuna posted:

When using Visual C++ and its IDE, is there a way to make a resource file properly act dependent on data files that it includes? It doesn't seem to be done automatically as it would be for #includes, and manual dependency setting only seems to be a thing at the project level, not the file level.

It's pretty frustrating to update a dependent image file and then have it not changed when I test because I didn't explicitly rebuild the resources.
Repeating this question because I just wasted about 3 hours trying to figure out why my 3D data file was offset by 10 units from where I was expecting it to be (checking the source file, the conversion program, the converted file, the loading code...) only to find that the 3D data file was not offset by 10 units at all, it was the 3D data file that it used to be, two days ago, that had that offset, and the loving resource file was not recompiled because the resource compiler or whatever project dealy (I don't know what part of VC++ figures out dependencies and Google won't tell me) doesn't recognize RCDATA filenames as dependencies of resource files.

Maybe there's some way to trick it into thinking I #included the data files?

Edit: Aha, I can, brilliant. I stick at the top of the file
code:
#ifdef FUCK_YOU_I_JUST_WANT_THESE_TO_BE_DEPENDENCIES
#include "whateverfile.dat"
#include "anotherfile.jpg"
#endif
And then if those files change, the resources get recompiled. Semi-perfect solution! (The thing not ever being defined of course.)

roomforthetuna fucked around with this message at 00:49 on Aug 30, 2011

Good Will Punting
Aug 30, 2009

And as the curtain falls
Just know you did it all except lift weights

TasteMyHouse posted:

Can you post the code you're referring to?

Sorry, got lazy then lost power at some point.

code:
#include <iostream>
using namespace std;
void moveHanoi(int n, char source, char dest, char inter) {
  if (n == 1) // terminating case
   cout << "Move disk from " << source << " to " << dest << endl;
   else { // recursive calls
   moveHanoi(n-1, source, inter, dest);
   cout << "Move disk from " << source << " to " << dest << endl;
   moveHanoi(n-1, inter, dest, source);
} // end else
} // end function moveHanoi
void main() {
   cout << "This program solves the Towers of Hanoi problem" << endl;
   cout << "Enter the number of disks: ";
   int numberOfRings;
   cin >> numberOfRings;
   const char PEG_A = ’A’, PEG_B = ’B’, PEG_C = ’C’;
   moveHanoi(numberOfRings, PEG_A, PEG_C, PEG_B);
} // end function main

Jabor
Jul 16, 2010

#1 Loser at SpaceChem
If all the code samples you get given look like that, perhaps you should inform whoever writes them that it's not 1980 any more and we have screens larger than 80x24 characters, so they're actually allowed to use whitespace and indentation.

Here it is formatted a little cleaner, with better comments:

code:
#include <iostream>
using namespace std;

void moveHanoi(int n, char from, char to, char spare) {  
  if (n == 1) {
    //If we're only moving one disk, then we can just move it.
    cout << "Move disk from " << from << " to " << to << endl;

  } else {
    //Otherwise, we need to move all the smaller disks to the spare peg
    moveHanoi(n-1, from, spare, to);

    //Then we need to move the disk we're interested in
    cout << "Move disk from " << from << " to " << to << endl;

    //And finally move the rest of the stack back on top of it.
    moveHanoi(n-1, spare, to, from);
  }
}

void main() {
  int numberOfRings;
  const char PEG_A = ’A’, PEG_B = ’B’, PEG_C = ’C’;

  cout << "This program solves the Towers of Hanoi problem" << endl;
  cout << "Enter the number of disks: ";
  cin >> numberOfRings;
  
  moveHanoi(numberOfRings, PEG_A, PEG_C, PEG_B);
}

Sephiroth_IRA
Mar 31, 2010
Another newbie question:
code:
//This program has functions that accept structure variables
//as arguments.

#include <Iostream>
#include <iomanip>

using namespace std;

struct InvItem
{
       int partNum;
       char description[50];
       int onHand;
       float price;
};

//Function Prototypes
void getItem(InvItem&);     //Argument passed by reference
void showItem(InvItem);     //Argument passed by value.

int main()
{
    InvItem part;           //Creates a structure variable/instanced named part.
    
    getItem(part);
    showItem(part);
    system("PAUSE");
    return 0;
}

//*****************************************************************************
//Definition of function getItem.  This function uses
//a structure reference variable as its parameter.  It asks
//the user for data to store in the structure.
//*****************************************************************************

void getItem(InvItem &p)
{
     cout << "Enter the part number: ";
     cin >> p.partNum;
     cout << "Enter the part descritpion: ";
     cin.get();
     cin.getline(p.description, 50);      //Pointer
     cout << "Enter the quantity on hand: ";
     cin >> p.onHand;
     cout << "Enter the unit price: ";
     cin >> p.price;
}

//*****************************************************************************
//Definition of function showItem.  This function accepts
//an argument of the InvItem structure type.  The contents
//of the structure is displayed.
//*****************************************************************************

void showItem(InvItem p)
{
     cout << fixed << showpoint << setprecision(2);
     cout << "Part Number: " << p.partNum << endl;
     cout << "Description: " << p.description << endl;
     cout << "Units On Hand: " << p.onHand << endl;
     cout << "Price: $" << p.price << endl;
}

     
Just got into the section of my book where Structures are used as function arguments. The code compiles fine but I'm confused as to how the reference operator is being used in the first function. I haven't used very many pointers in the past few chapters.

I notice that the reference operator is used in the function prototype, so the function will be setup to pass information from getItem to the part instance(variable of InvItem). I'm just confused as to why it's necessary here and I'm having a difficult time wrapping my head around it. Not quite sure how to phrase my question beyond "Why or How does that work?"

Any wisdom would be appreciated.

Sephiroth_IRA fucked around with this message at 14:21 on Aug 30, 2011

TasteMyHouse
Dec 21, 2006

Orange_Lazarus posted:

Another newbie question:
code:
//This program has functions that accept structure variables
//as arguments.

#include <Iostream>
This may compile on Windows, or some other case-insensitive OS, but it's really a bad idea. this header is properly titled "iostream" and writing it the way you did will fail on most OSes.


quote:

I'm just confused as to why it's necessary here and I'm having a difficult time wrapping my head around it. Not quite sure how to phrase my question beyond "Why or How does that work?"

Any wisdom would be appreciated.

Do you understand the difference between pass-by-reference and pass-by-value?

if getItem() didn't pas by reference, the function would not receive the exact original variable that was passed into it -- instead, it would receive a local copy of it. the function would then fill this copy with values it got through cin, then when the function returned this copy would be thrown away like all other local variables. Since the variable is marked as a reference, the function doesn't get a copy -- it gets the very same variable as was declared in the calling function, so when the function returns the variable has all the changes that were made to it inside the function.

So, as to HOW this works -- internally this is usually just implemented with pointers by the compiler.

as to WHY you'd do that, and not, say, this:

code:

//snip

InvItem getItem()
{
     InvItem p;
     cout << "Enter the part number: ";
     cin >> p.partNum;
     cout << "Enter the part descritpion: ";
     cin.get();
     cin.getline(p.description, 50);      //Pointer
     cout << "Enter the quantity on hand: ";
     cin >> p.onHand;
     cout << "Enter the unit price: ";
     cin >> p.price;
     return p;
}


int main()
{
    InvItem part=getItem();
    showItem(part);
    system("PAUSE");
    return 0;
}

This is probably a lot clearer as to what's going on, and may even compile to roughly the same machine code. Doing things the other way (with pass by ref) you're a lot more certain that you're not wasting time constructing unnecessary temporary InvItems.

All this will change in C++ 11 with rvalue references, though :)

TasteMyHouse fucked around with this message at 14:42 on Aug 30, 2011

baby puzzle
Jun 3, 2011

I'll Sequence your Storm.
I never realize how hard it is to explain something until I actually try it.

code:
InvItem part;
getItem(part);
This lets getItem() provide us with data without making a copy of an InvItem.

If it wasn't passed by reference, p would be a copy of part, and part itself would remain unchanged.

I don't know if you are savvy with a debugger... But if you break before the call to getItem(), and also inside of getItem(), you will see that the address of part is the same as the address of p.

Sephiroth_IRA
Mar 31, 2010
Fantastic! Both replies were helpful and thanks for the tip about the case sensitivity of headers as well!

Speaking of problems I'd like to know what concepts you guys found most difficult to learn as you progressed. Did you find any supplemental reading helpful?

TasteMyHouse
Dec 21, 2006
read this whole drat thread :)

Reading through this thread is a bit depressing though. AvengingDentist got me so hyped up for Concepts and I was so disappointed to hear (years after the fact) that they were cancelled.

TasteMyHouse fucked around with this message at 17:40 on Aug 30, 2011

Slanderer
May 6, 2007
This question is surely due to fundamentally flawed understanding of the C preprocessor, which I regard in a manner not dissimilar to that which our ancient ancestors regarded lightning.

The code is essentially something like:

code:
enum PARTY_TYPES
{
  FIESTA = 0,
  SHINDIG,
  HOOTENANNY,
  NUM_PARTIES
};

#define NUM_PARTY_TYPES NUM_PARTIES - 1
I thought the preprocessor would do the defines first, so where is it getting the value of NUM_PARTIES from?

Dicky B
Mar 23, 2004

It's not. It's just replacing any instance of the string "NUM_PARTY_TYPES" with the string "NUM_PARTIES - 1". That expression is not evaluated until runtime.

Slanderer
May 6, 2007

Dicky B posted:

It's not. It's just replacing any instance of the string "NUM_PARTY_TYPES" with the string "NUM_PARTIES - 1". That expression is not evaluated until runtime.

Oh crap. Wow, I knew my C was rusty, but, poo poo. To completely forget how defines work? Goddamnit.

Thanks.

roomforthetuna
Mar 22, 2005

I don't need to know anything about virii! My CUSTOM PROGRAM keeps me protected! It's not like they'll try to come in through the Internet or something!

Slanderer posted:

Oh crap. Wow, I knew my C was rusty, but, poo poo. To completely forget how defines work? Goddamnit.
Relatedly, that particular #define is a horrific monster because, eg. (NUM_PARTY_TYPES*2) evaluates to 1 rather than the much-more-likely-intended 4. (Because it preprocesses out to "NUM_PARTIES - 1*2")

When you're #defining for constants with operators inside like that you should always enclose the values in braces.
#define NUM_PARTY_TYPES (NUM_PARTIES - 1)

(Though a const int is generally better than a #define anyway.)

more falafel please
Feb 26, 2005

forums poster

roomforthetuna posted:

Relatedly, that particular #define is a horrific monster because, eg. (NUM_PARTY_TYPES*2) evaluates to 1 rather than the much-more-likely-intended 4. (Because it preprocesses out to "NUM_PARTIES - 1*2")

When you're #defining for constants with operators inside like that you should always enclose the values in braces.
#define NUM_PARTY_TYPES (NUM_PARTIES - 1)

(Though a const int is generally better than a #define anyway.)

Also, why is it NUM_PARTIES - 1? That would be 2, when in fact there are 3 party types.

Slanderer
May 6, 2007
well, that was my bad, actually. I left out a line in the enum :


code:
enum PARTY_TYPES
{
  FIESTA = 0,
  SHINDIG,
  HOOTENANNY,
  NO_PARTY,
  NUM_PARTIES
};

Adbot
ADBOT LOVES YOU

raminasi
Jan 25, 2005

a last drink with no ice
What kinds of things can I expect
code:
try {
    // some calls to poorly-documented, exception-throwing libraries
}
catch (...) {
    // blah blah
}
to not catch? I have no idea what the library I'm calling into is throwing, but I want to be able to somewhat-gracefully deal with it, and the exception is slipping through somehow.

  • 1
  • 2
  • 3
  • 4
  • 5
  • Post
  • Reply