Thursday, September 16, 2010

CS106B, Libraries, and following along with the Videos

I was able to sucessfully complete the Free CS106A course - Programming-methodology- available online from Stanford University and was excited to start the second course in the series - CS106B - Programming Abstractions. The first course was fantastic and I learned a lot including learning a new programming language, Java, which I had very little experience with. I had a bit more experience with C and some C++ but not enough that I would consider myself to be a developer. Well... getting back into the C/C++ world, starting CS106B, reminded me just what a nightmare using Visual Studio could be.

For starters, when I reviewed the material I needed for the course, I had no end of trouble tracking down the text book. For the CS106A course I was able to go to Amazon.com and order - "The Art & Science of Java" by Eric Roberts which was expensive but invaluable when taking this class online. I was hoping something similar would be available for this course. While there was something available called "Programming Abstractions in C" it was made clear that the course would actually use a new version that had been updated for C++. I searched all over until I finally found it available for download on scribd. It cost money for me to sign up for the day to download the text but at the time I felt it was totally worth it! ($5 for a textbook... what a bargain!). However, later I found that the reader is available free for download from the CS106B website.

Now that I had the text, I was excited to dive in and start! I watched the first 4 videos online, read the first 3 chapters and got ready to boot up my development environment and dig in! Of course things didn't go smoothly. For starters, the CS106B Windows libraries that you download for the course are built into an installer which requires that you have VS2005 installed on your machine. My machine had 2008 and 2005 installed but the installer still refused to run and after various attempts to dig the files out of the installer manually I went looking elsewhere for the libraries. I tried various ways of getting the libraries and making them work with the programs downloaded with the lecture videos to no avail. Linker errors galor! Oh Visual Studio how I love thee! :)

Finally I stepped back and started fresh and came up with the following steps to get these older programs (circa 2006) with the new libraries from the 2010 class:

Steps to Make CS106B projects Work with new Libraries

Assumes you’ve already downloaded the Full set of materials and unzipped the seven programming assignments into their own folders.

1.) Download one of the latest projects from the Stanford CS106B Website:

http://www.stanford.edu/class/cs106b/spring/assignments/assn-0-narcissism-pc.zip

2.) Unzip the project and find its subdirectory \CS106. This is the folder that contains all the library (CS106CPPLib.lib) and header files for the CS106 program.

3.) Copy this folder as a subdirectory to one of your assignment folders (ex. C:\Assignment1\CS106.

4.) Startup Visual Studio2008 and click File->New->Project… When given the choice choose to create a new Console program.

5.) You’ll then be presented with a new project with multiple files including stdafx.h, stdafx.cpp and similarly named files for whatever you named your project when prompted earlier. DELETE/ REMOVE all these files from the project.

6.) Right click the Source File Folder and choose Add->Existing Item… Choose the first assignment file (Assign1warmup.cpp).

7.) If you compile at this point you’ll realize that it’s still looking for the stdafx.h precompiled header. Let’s fix that. Go to Project->Assignment1 Properties… (or whatever your project might be named). Go to the option in the “tree” menu for Configuration Properties->C/C++->Pre-Compiled Headers . Under the option for Create/Use Precompiled header, choose the drop down option for Not Using Precompiled headers.

8.) While you’re in this section, take the time now to also select the location for the header files for this project. Under the Configuration Properties->C/C++->General section choose the Additional Include Directories option and use the … to browse and select the CS106 folder that you copied to your project folder earlier.

9.) One last thing you should change here is in the Configuration Properties->C/C++->Code Generation section. Change the default (which I believe is for a Multi-Threaded Debug .DLL) to just Multi-Threaded Debug (or just Multi-Threaded if you are doing your release build).

10.) Lastly, we’ll need to let the linker know where to find the CS106 library file. To do that you’ll need to make 2 additional settings. One is in the Configuration Properties->Linker->General section where you can select the location of your additional library files in the section titled appropriately enough – “Additional Library Directories”. You’ll also need to add your library to the project through the “Additional Dependencies” section which is under Configuration Properties->Linker->Input. Just type in CS106CPPLIB.lib.

Note: I found that there seems to be some difference in the menus you get and the settings that get saved depending on what your selection is at the moment in the solution Explorer Window. I originally made all my changes while I was selecting the actual source file, but there were no linker menus at that point. I had to move up to the Source File Folder level to get additional menus where I could set my linker options. Also important to note is that if you make your settings at the lower level (ie. Cpp file) they seem to supersede whatever is set in the level above it.

At this point the project should correctly build with the selection of the Build->Rebuild Solution command.

Happy programming!

Some may wonder why I didn't just use the new sample programs with the updated materials. The main reason is that I didn't have access to the online videos related to those classes. If the CS106B videos are anything like the CS106A classes there will likely be references made to the assignments during the lectures to help make certain things more clear. Also, with the new assignments I really wasn't sure at what point I should "take them on" during the course since it seemed possible that they might address different material in the newer classes or at the very least approach things in a different order or time frame. I may try some of the updated projects after the course or along the way but for now I'm satisfied that I can now use the assignments that came with the lecture videos.

Hope this helps someone else who may have similar problems.