-
-
Notifications
You must be signed in to change notification settings - Fork 182
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Make the switch to implementing own stubs easier #255
Merged
wolf99
merged 8 commits into
exercism:master
from
wolf99:smoothen-path-to-implementing-headers
Jan 8, 2018
Merged
Changes from all commits
Commits
Show all changes
8 commits
Select commit
Hold shift + click to select a range
479d5ed
Add header stub for isogram exercise
wolf99 3ebb086
Remove old example.h for isogram
wolf99 9c01f5b
Provide header for acronym exercise
wolf99 565dd7b
Provide header for pangram
wolf99 bc20689
Add hints.md for gigasecond
wolf99 5d5104d
Move hints.md to .meta dir, regenerate README.md
wolf99 ec88124
Update hints.md
ryanplusplus 6c2b1b4
Add hints.md, generate README.md
wolf99 File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
File renamed without changes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,124 @@ | ||
## Exercises without stub implementations | ||
|
||
Like the majority of C programs you will write, this exercise comes without any header file (`*.h`) or source file (`*.c`). | ||
|
||
|
||
### Add the required files | ||
|
||
You will need to create these yourself as part of the exercise. | ||
This is so that you get to practice deciding on and creating the program's interface yourself, which is an important part of programming in C. | ||
It does mean that when you first try to run the tests, they won't compile. | ||
They will give you an error similar to: | ||
|
||
```bash | ||
make: *** No rule to make target 'src/exercise_name.c', needed by 'tests.out'. Stop. | ||
``` | ||
|
||
This error occurs because the `makefile` attempts to use a file that hasn't been created yet (`exercise_name.c`). | ||
To resolve this error you will need to add a matching file to the `src` directory. | ||
For example, for the error above you would add a file called `exercise_name.c`. | ||
|
||
When you try to run the tests again you will get a slightly different error. | ||
|
||
```bash | ||
make: *** No rule to make target 'src/exercise_name.h', needed by 'tests.out'. Stop. | ||
``` | ||
|
||
Again the `makefile` still needs another file that has yet to be created (`exercise_name.h`). | ||
The solution to this error is similar to the last, add the matching file to the `src` directory. | ||
For example, for the above error you would add a file called `exercise_name.h` | ||
|
||
|
||
### Add the required declarations | ||
|
||
Running the tests a third time you see you will get new errors, similar to: | ||
|
||
```bash | ||
Compiling tests.out | ||
src/exercise_name.c:1:0: error: ISO C forbids an empty translation unit [-Werror=pedantic] | ||
cc1: all warnings being treated as errors | ||
test/test_exercise_name.c:13:1: error: unknown type name ‘bar_t’; did you mean ‘__bar_t’? | ||
bar_t b = foo(a, 2.5); | ||
^~~~~~ | ||
__bar_t | ||
test/test_exercise_name.c:15:14: error: storage size of fizz isn’t known | ||
struct baz fizz; | ||
^~~~ | ||
test/test_exercise_name.c:29:20: error: implicit declaration of function ‘foo’ [-Werror=implicit-function-declaration] | ||
bar_t b = foo_function(fizz, 2.5); | ||
``` | ||
|
||
This error means that you need to add function, type and variable decarations to the header file to match those the test file is attempting to use. | ||
In doing this you will need to look at the build errors and the test code to determine what needs to be declared in the header file. | ||
|
||
For example, for the error above you should declare a type named `bar_t`, a `struct` called `baz` and a function named `foo()`. | ||
Additionally we can tell from looking at the above errors that function `foo()` has two parameters. | ||
|
||
The first parameter is passed an argument of `fizz` and thus should have a type of `struct baz`. | ||
The second parameter is passed `2.5` and so could have one of two types, either `float` or `double`. | ||
You will need to look at the test code to determine which. | ||
|
||
The _names_ of the parameters are not determined by the test code and so are left up to you to decide, though in keeping with C programming practices they should be descriptive but not overly long. | ||
|
||
Further, we can see that the the return type expected by the test code is of the type `bar_t`. | ||
|
||
Putting this all together we end up with a function declaration that looks like the following: | ||
|
||
```c | ||
// The parameter names are not very good here they should be more descriptive in a real exercise. | ||
// We have decide on a double for the second parameter in this hypothetical example. | ||
bar_t foo(struct baz b, double d); | ||
``` | ||
|
||
You should continue to do this for any further similar errors. | ||
To check that you have correctly determined the required declaration, just run the tests again and analyse any errors similarly. | ||
|
||
Additionally, remember to add any includes to the header file any headers that it itself requires. | ||
|
||
|
||
### Include guards | ||
|
||
Before you are finished with the header file, you should add include guards. | ||
Include guards are used to help prevent the file from being included multiple times by accident. | ||
If the file _was_ included multiple times then the functions and other items would be declared twice; In C this is an error because the compiler thinks you are trying to declare another _different_ function that has the same name. | ||
|
||
To add include guards, add something similar to the following as the first two lines of the header: | ||
|
||
```c | ||
#ifndef EXERCISE_NAME_H | ||
#define EXERCISE_NAME_H | ||
``` | ||
|
||
And on the very last line: | ||
|
||
```c | ||
#endif | ||
``` | ||
|
||
|
||
### Add the required definitions | ||
|
||
Once the header file is complete you may still have build errors similar to the following: | ||
|
||
```bash | ||
Compiling tests.out | ||
src/exercise_name.c:1:0: error: ISO C forbids an empty translation unit [-Werror=pedantic] | ||
cc1: all warnings being treated as errors | ||
makefile:24: recipe for target 'tests.out' failed | ||
make: *** [tests.out] Error 1 | ||
``` | ||
|
||
This is because although you have _declared_ all the items you need to, they have not yet been _defined_. | ||
To define the needed items you need to add their implementation to the `exercise_name.c` file. | ||
For the function `foo()` from the previous example, this would look similar to: | ||
|
||
```c | ||
#include "exercise_name.h" | ||
|
||
bar_t foo(struct baz b, double d) | ||
{ | ||
// Your exercise code here | ||
} | ||
``` | ||
|
||
After having resolved these errors you should be ready to start making the tests pass! |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
File renamed without changes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,124 @@ | ||
## Exercises without stub implementations | ||
|
||
Like the majority of C programs you will write, this exercise comes without any header file (`*.h`) or source file (`*.c`). | ||
|
||
|
||
### Add the required files | ||
|
||
You will need to create these yourself as part of the exercise. | ||
This is so that you get to practice deciding on and creating the program's interface yourself, which is an important part of programming in C. | ||
It does mean that when you first try to run the tests, they won't compile. | ||
They will give you an error similar to: | ||
|
||
```bash | ||
make: *** No rule to make target 'src/exercise_name.c', needed by 'tests.out'. Stop. | ||
``` | ||
|
||
This error occurs because the `makefile` attempts to use a file that hasn't been created yet (`exercise_name.c`). | ||
To resolve this error you will need to add a matching file to the `src` directory. | ||
For example, for the error above you would add a file called `exercise_name.c`. | ||
|
||
When you try to run the tests again you will get a slightly different error. | ||
|
||
```bash | ||
make: *** No rule to make target 'src/exercise_name.h', needed by 'tests.out'. Stop. | ||
``` | ||
|
||
Again the `makefile` still needs another file that has yet to be created (`exercise_name.h`). | ||
The solution to this error is similar to the last, add the matching file to the `src` directory. | ||
For example, for the above error you would add a file called `exercise_name.h` | ||
|
||
|
||
### Add the required declarations | ||
|
||
Running the tests a third time you see you will get new errors, similar to: | ||
|
||
```bash | ||
Compiling tests.out | ||
src/exercise_name.c:1:0: error: ISO C forbids an empty translation unit [-Werror=pedantic] | ||
cc1: all warnings being treated as errors | ||
test/test_exercise_name.c:13:1: error: unknown type name ‘bar_t’; did you mean ‘__bar_t’? | ||
bar_t b = foo(a, 2.5); | ||
^~~~~~ | ||
__bar_t | ||
test/test_exercise_name.c:15:14: error: storage size of fizz isn’t known | ||
struct baz fizz; | ||
^~~~ | ||
test/test_exercise_name.c:29:20: error: implicit declaration of function ‘foo’ [-Werror=implicit-function-declaration] | ||
bar_t b = foo_function(fizz, 2.5); | ||
``` | ||
|
||
This error means that you need to add function, type and variable decarations to the header file to match those the test file is attempting to use. | ||
In doing this you will need to look at the build errors and the test code to determine what needs to be declared in the header file. | ||
|
||
For example, for the error above you should declare a type named `bar_t`, a `struct` called `baz` and a function named `foo()`. | ||
Additionally we can tell from looking at the above errors that function `foo()` has two parameters. | ||
|
||
The first parameter is passed an argument of `fizz` and thus should have a type of `struct baz`. | ||
The second parameter is passed `2.5` and so could have one of two types, either `float` or `double`. | ||
You will need to look at the test code to determine which. | ||
|
||
The _names_ of the parameters are not determined by the test code and so are left up to you to decide, though in keeping with C programming practices they should be descriptive but not overly long. | ||
|
||
Further, we can see that the the return type expected by the test code is of the type `bar_t`. | ||
|
||
Putting this all together we end up with a function declaration that looks like the following: | ||
|
||
```c | ||
// The parameter names are not very good here they should be more descriptive in a real exercise. | ||
// We have decide on a double for the second parameter in this hypothetical example. | ||
bar_t foo(struct baz b, double d); | ||
``` | ||
|
||
You should continue to do this for any further similar errors. | ||
To check that you have correctly determined the required declaration, just run the tests again and analyse any errors similarly. | ||
|
||
Additionally, remember to add any includes to the header file any headers that it itself requires. | ||
|
||
|
||
### Include guards | ||
|
||
Before you are finished with the header file, you should add include guards. | ||
Include guards are used to help prevent the file from being included multiple times by accident. | ||
If the file _was_ included multiple times then the functions and other items would be declared twice; In C this is an error because the compiler thinks you are trying to declare another _different_ function that has the same name. | ||
|
||
To add include guards, add something similar to the following as the first two lines of the header: | ||
|
||
```c | ||
#ifndef EXERCISE_NAME_H | ||
#define EXERCISE_NAME_H | ||
``` | ||
|
||
And on the very last line: | ||
|
||
```c | ||
#endif | ||
``` | ||
|
||
|
||
### Add the required definitions | ||
|
||
Once the header file is complete you may still have build errors similar to the following: | ||
|
||
```bash | ||
Compiling tests.out | ||
src/exercise_name.c:1:0: error: ISO C forbids an empty translation unit [-Werror=pedantic] | ||
cc1: all warnings being treated as errors | ||
makefile:24: recipe for target 'tests.out' failed | ||
make: *** [tests.out] Error 1 | ||
``` | ||
|
||
This is because although you have _declared_ all the items you need to, they have not yet been _defined_. | ||
To define the needed items you need to add their implementation to the `exercise_name.c` file. | ||
For the function `foo()` from the previous example, this would look similar to: | ||
|
||
```c | ||
#include "exercise_name.h" | ||
|
||
bar_t foo(struct baz b, double d) | ||
{ | ||
// Your exercise code here | ||
} | ||
``` | ||
|
||
After having resolved these errors you should be ready to start making the tests pass! |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The
;
could probably just be a.
, but I tried to take only a half step away from the em dash.