Mentor for C self study wanted
Hello, I'm abaout to learn C (really learn it, not just to be able to tinker arround with). So I bought a book which has some practices in each chapter. Now I wrote the little programs and they were almost correct, but the things going wrog aren't explained in that book. Probably it has to do with the compiler, at least it was the case in one example. So I wanted to ask if somebody could be so kind and answer me occasional questions by private mail. The first one was for example the attached code: Why does it segfault? Thanks in advance, -Harry P.S. I will change comment language of course. I'm UTC -1 ___ freebsd-questions@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-questions To unsubscribe, send any mail to "[EMAIL PROTECTED]"
Re: Mentor for C self study wanted
On Tue, 23 Oct 2007 20:44:52 +0200 Harald Schmalzbauer <[EMAIL PROTECTED]> wrote: > The first one was for example the attached code: Why does it segfault? Mailman ate the attachment... Can't see it here. -cpghost. -- Cordula's Web. http://www.cordula.ws/ ___ freebsd-questions@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-questions To unsubscribe, send any mail to "[EMAIL PROTECTED]"
Re: Mentor for C self study wanted
In response to cpghost <[EMAIL PROTECTED]>: > On Tue, 23 Oct 2007 20:44:52 +0200 > Harald Schmalzbauer <[EMAIL PROTECTED]> wrote: > > > The first one was for example the attached code: Why does it segfault? > > Mailman ate the attachment... Can't see it here. I may be out of line, but I think if you're using FreeBSD as your learning platform, that it wouldn't be a problem to ask this list. Although, you'll have to include your code inline to get past the sanitizers. -- Bill Moran http://www.potentialtech.com ___ freebsd-questions@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-questions To unsubscribe, send any mail to "[EMAIL PROTECTED]"
Re: Mentor for C self study wanted
Am Dienstag, 23. Oktober 2007 22:24:54 schrieb Bill Moran: > In response to cpghost <[EMAIL PROTECTED]>: > > On Tue, 23 Oct 2007 20:44:52 +0200 > > > > Harald Schmalzbauer <[EMAIL PROTECTED]> wrote: > > > The first one was for example the attached code: Why does it segfault? > > > > Mailman ate the attachment... Can't see it here. > > I may be out of line, but I think if you're using FreeBSD as your > learning platform, that it wouldn't be a problem to ask this list. >> Harald Schmalzbauer wrote: > > Am Dienstag, 23. Oktober 2007 21:43:52 schrieben Sie: > >>> Hello Aryeh, > >>> > >>> I'm willing to pay fair fees, but are you interested in "micro payment" > >>> ;) ? > >> > >> For other reasons I love micro payments. > >> > >>> Serious, I'll have the one or other short question per week (I'm > >>> usually busy, just making spare time lessons from my book (UTC-1 spare > >>> time)). > >> > >> Just so I know what level to present on what is your background in CS > >> and programming? > > > > CS?? > > I'm able to solve problems analytically, but I don't know any language > > really well. > > I know bourne shell, csh, pascal, and basic. And a tiny bit asm, but > > that's been on ZX81. > > Although, you'll have to include your code inline to get past the > sanitizers. Thanks all, here was my example, just for completeness, I found mentors for my needs. Thanks a lot to all! #include void main() { short nnote; // Numerischen Notenwert einlesen printf("Bitte numerischen Schulnotenwert eingeben: "); scanf("%d",&nnote); switch (nnote) { case 1: printf("Die Note %d entspricht sehr gut.",nnote); break; case 2: printf("Die Note %d entspricht gut.",nnote); break; case 3: printf("Die Note %d entspricht befriedigend.",nnote); break; case 4: printf("Die Note %d entspricht ausreichend.",nnote); break; case 5: printf("Die Note %d entspricht mangelhaft.",nnote); break; case 6: printf("Die Note %d entspricht ungenügend.",nnote); break; default: printf("%d ist keine zulässige Schulnote!"); } printf("\n"); } P.S.: I found that declaring nnote as int soleves my problem, but I couldnÄt understand why. Another one was the result of default: nnote was -1077942208 instead of 9 for example. ___ freebsd-questions@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-questions To unsubscribe, send any mail to "[EMAIL PROTECTED]"
Re: Mentor for C self study wanted
Am Dienstag, 23. Oktober 2007 23:24:09 schrieb Harald Schmalzbauer: [*snip*] > > Although, you'll have to include your code inline to get past the > > sanitizers. > > Thanks all, > > here was my example, just for completeness, I found mentors for my needs. > > Thanks a lot to all! > > > #include > > void main() > { > short nnote; > > // Numerischen Notenwert einlesen > printf("Bitte numerischen Schulnotenwert eingeben: "); > scanf("%d",&nnote); > > switch (nnote) > { > case 1: printf("Die Note %d entspricht sehr gut.",nnote); > break; [snip] > default: printf("%d ist keine zulässige Schulnote!"); > } > printf("\n"); > } > > P.S.: > I found that declaring nnote as int soleves my problem, but I couldnÄt > understand why. > Another one was the result of default: nnote was -1077942208 instead of 9 > for example. Ok, the last one is a "typo", I forgot ...ote!",%d);. But interesting that ther's some output. Constant output ___ freebsd-questions@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-questions To unsubscribe, send any mail to "[EMAIL PROTECTED]"
Re: Mentor for C self study wanted
At 04:24 PM 10/23/2007, Harald Schmalzbauer wrote: Am Dienstag, 23. Oktober 2007 22:24:54 schrieb Bill Moran: > In response to cpghost <[EMAIL PROTECTED]>: > > On Tue, 23 Oct 2007 20:44:52 +0200 > > > > Harald Schmalzbauer <[EMAIL PROTECTED]> wrote: > > > The first one was for example the attached code: Why does it segfault? > > > > Mailman ate the attachment... Can't see it here. > > I may be out of line, but I think if you're using FreeBSD as your > learning platform, that it wouldn't be a problem to ask this list. >> Harald Schmalzbauer wrote: > > Am Dienstag, 23. Oktober 2007 21:43:52 schrieben Sie: > >>> Hello Aryeh, > >>> > >>> I'm willing to pay fair fees, but are you interested in "micro payment" > >>> ;) ? > >> > >> For other reasons I love micro payments. > >> > >>> Serious, I'll have the one or other short question per week (I'm > >>> usually busy, just making spare time lessons from my book (UTC-1 spare > >>> time)). > >> > >> Just so I know what level to present on what is your background in CS > >> and programming? > > > > CS?? > > I'm able to solve problems analytically, but I don't know any language > > really well. > > I know bourne shell, csh, pascal, and basic. And a tiny bit asm, but > > that's been on ZX81. > > Although, you'll have to include your code inline to get past the > sanitizers. Thanks all, here was my example, just for completeness, I found mentors for my needs. Thanks a lot to all! #include void main() { short nnote; // Numerischen Notenwert einlesen printf("Bitte numerischen Schulnotenwert eingeben: "); scanf("%d",&nnote); switch (nnote) { case 1: printf("Die Note %d entspricht sehr gut.",nnote); break; case 2: printf("Die Note %d entspricht gut.",nnote); break; case 3: printf("Die Note %d entspricht befriedigend.",nnote); break; case 4: printf("Die Note %d entspricht ausreichend.",nnote); break; case 5: printf("Die Note %d entspricht mangelhaft.",nnote); break; case 6: printf("Die Note %d entspricht ungenügend.",nnote); break; default: printf("%d ist keine zulässige Schulnote!"); } printf("\n"); } P.S.: I found that declaring nnote as int soleves my problem, but I couldnÄt understand why. Another one was the result of default: nnote was -1077942208 instead of 9 for example. if you check the man page on scanf: d Matches an optionally signed decimal integer; the next pointer must be a pointer to int. You shouldn't try to put a short into an int. Always declare the correct size for variables. Your segv is because scanf was trying to put an int where it won't fit. You will get the same result if you go off the end of an array. -Derek -- This message has been scanned for viruses and dangerous content by MailScanner, and is believed to be clean. MailScanner thanks transtec Computers for their support. ___ freebsd-questions@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-questions To unsubscribe, send any mail to "[EMAIL PROTECTED]"
Re: Mentor for C self study wanted
On Tue, 23 Oct 2007 23:24:09 +0200 Harald Schmalzbauer <[EMAIL PROTECTED]> wrote: > #include > > void main() > { > short nnote; ^ > // Numerischen Notenwert einlesen > printf("Bitte numerischen Schulnotenwert eingeben: "); > scanf("%d",&nnote); ^ > I found that declaring nnote as int soleves my problem, but I > couldnÄt understand why. > Another one was the result of default: nnote was -1077942208 instead > of 9 for example. There's a mismatch here: scanf("%d", ...) expects a pointer to int, while &nnote is a pointer to a short. Normally, an int occupies more bytes in memory than a short (typically sizeof(int) == 4 on 32bit platforms, and sizeof(int) == 8 on 64bit platforms; while typically sizeof(short) == 2). So scanf(3) tries to store the result into 4 bytes, but you've provided a pointer to only 2 bytes of memory. Where will the other 2 bytes be stored by scanf? In your example, short nnote is an automatic variable: i.e. it's stored on the stack. So the other 2 bytes will be also saved on the stack, on a place that's not reserved for this. There could be anything there, like, say, a part of the return address for the function, or it could be on some page in memory that's read-only or non-allocated. In either case, the program behaviour is undefined, and this normally means it dumps core. So either replace "short nnote" with "int nnote", OR change "%d" to the appropriate format string identifier for short int "%hd" (look up "man scanf" for a list of those identifiers), both in scanf and printf calls. -cpghost. -- Cordula's Web. http://www.cordula.ws/ ___ freebsd-questions@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-questions To unsubscribe, send any mail to "[EMAIL PROTECTED]"
Re: Mentor for C self study wanted
Derek Ragona wrote: At 04:24 PM 10/23/2007, Harald Schmalzbauer wrote: Am Dienstag, 23. Oktober 2007 22:24:54 schrieb Bill Moran: > In response to cpghost <[EMAIL PROTECTED]>: > > On Tue, 23 Oct 2007 20:44:52 +0200 > > > > Harald Schmalzbauer <[EMAIL PROTECTED]> wrote: > > > The first one was for example the attached code: Why does it segfault? > > > > Mailman ate the attachment... Can't see it here. > > I may be out of line, but I think if you're using FreeBSD as your > learning platform, that it wouldn't be a problem to ask this list. >> Harald Schmalzbauer wrote: > > Am Dienstag, 23. Oktober 2007 21:43:52 schrieben Sie: > >>> Hello Aryeh, > >>> > >>> I'm willing to pay fair fees, but are you interested in "micro payment" > >>> ;) ? > >> > >> For other reasons I love micro payments. > >> > >>> Serious, I'll have the one or other short question per week (I'm > >>> usually busy, just making spare time lessons from my book (UTC-1 spare > >>> time)). > >> > >> Just so I know what level to present on what is your background in CS > >> and programming? > > > > CS?? > > I'm able to solve problems analytically, but I don't know any language > > really well. > > I know bourne shell, csh, pascal, and basic. And a tiny bit asm, but > > that's been on ZX81. > > Although, you'll have to include your code inline to get past the > sanitizers. Thanks all, here was my example, just for completeness, I found mentors for my needs. Thanks a lot to all! #include void main() { short nnote; // Numerischen Notenwert einlesen printf("Bitte numerischen Schulnotenwert eingeben: "); scanf("%d",&nnote); switch (nnote) { case 1: printf("Die Note %d entspricht sehr gut.",nnote); break; case 2: printf("Die Note %d entspricht gut.",nnote); break; case 3: printf("Die Note %d entspricht befriedigend.",nnote); break; case 4: printf("Die Note %d entspricht ausreichend.",nnote); break; case 5: printf("Die Note %d entspricht mangelhaft.",nnote); break; case 6: printf("Die Note %d entspricht ungenügend.",nnote); break; default: printf("%d ist keine zulässige Schulnote!"); } printf("\n"); } P.S.: I found that declaring nnote as int soleves my problem, but I couldnÄt understand why. Another one was the result of default: nnote was -1077942208 instead of 9 for example. if you check the man page on scanf: d Matches an optionally signed decimal integer; the next pointer must be a pointer to int. You shouldn't try to put a short into an int. Always declare the correct size for variables. Your segv is because scanf was trying to put an int where it won't fit. You will get the same result if you go off the end of an array. -Derek It's well worth increasing the number of warnings enabled when writing C code, to catch any errors early on. -Wall catches this sort of mistake. Compiling your code gives the following output: > gcc -Wall test.c -o test test.c:4: warning: return type of 'main' is not 'int' test.c: In function 'main': test.c:9: warning: format '%d' expects type 'int *', but argument 2 has type 'short int *' -- Bruce Cran ___ freebsd-questions@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-questions To unsubscribe, send any mail to "[EMAIL PROTECTED]"
Re: Mentor for C self study wanted
cpghost wrote: There's a mismatch here: scanf("%d", ...) expects a pointer to int, while &nnote is a pointer to a short. Normally, an int occupies more bytes in memory than a short (typically sizeof(int) == 4 on 32bit platforms, and sizeof(int) == 8 on 64bit platforms; while typically sizeof(short) == 2). I think short and int stay the same on both 32 and 64 bit platforms, while it's only long that gets bumped to 8 bytes. At least that seems to be what happens on FreeBSD amd64. -- Bruce ___ freebsd-questions@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-questions To unsubscribe, send any mail to "[EMAIL PROTECTED]"
Re: Mentor for C self study wanted
On Tue, 23 Oct 2007 23:36:40 +0100 Bruce Cran <[EMAIL PROTECTED]> wrote: > cpghost wrote: > > > There's a mismatch here: scanf("%d", ...) expects a pointer to int, > > while &nnote is a pointer to a short. Normally, an int occupies more > > bytes in memory than a short (typically sizeof(int) == 4 on 32bit > > platforms, and sizeof(int) == 8 on 64bit platforms; while typically > > sizeof(short) == 2). > > I think short and int stay the same on both 32 and 64 bit platforms, > while it's only long that gets bumped to 8 bytes. At least that > seems to be what happens on FreeBSD amd64. Hmmm... yep, you're right, I'm wrong! I've switched compilers too often recently. Yes, on gcc sizeof(int) == 4 on both 32bit and 64bit. Thanks for pointing this out: I stay corrected. ;) -- Cordula's Web. http://www.cordula.ws/ ___ freebsd-questions@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-questions To unsubscribe, send any mail to "[EMAIL PROTECTED]"
Re: Mentor for C self study wanted
Am Dienstag, 23. Oktober 2007 23:24:09 schrieb Harald Schmalzbauer: > #include > > void main() > { > short nnote; > > // Numerischen Notenwert einlesen > printf("Bitte numerischen Schulnotenwert eingeben: "); > scanf("%d",&nnote); man 3 scanf (most important thing to look at with any such problem is the C-library documentation, which is excellent on FreeBSD) says that for "%d" the passed pointer has to be a pointer to "integer", which &nnote is not. &nnote is a pointer to short, which points to 2 bytes, whereas a pointer to integer is a pointer to 4 bytes of storage. Generally, nnote is reserved by the compiler on the stack (as it's a local variable) with two bytes (but this depends on your platform), and &nnote points to the beginning of this area. As you are probably running on a little-endian architecture, the layout that scanf presumes is (from low to high): ---> increasing addresses lsbyte 2 3 msbyte ^ |-- &nnote points here of which only the first two are interpreted as nnote by the rest of the program; the upper two are different stack content (probably a return address to the C initialization code calling main(), or a pushed stack pointer, or such, as your procedure defines no other locals, see below). Now, when scanf assigns the four bytes, it'll properly enter the lower two bytes of the integer into "lsbyte 2" (which is nnote, in the same byte order), but overwrite two bytes that are above it. When main() finishes, the (now broken) saved address (of which "3 msbyte" is the lower half) is popped, which leads to the SIGSEGV you're seeing. In case you were on big-endian, the result would be different (i.e., the order would be reversed, so that nnote would always be zero or minus one in case you entered small integral values in terms of absolute value), but effectively, the return address would be overwritten as well, breaking it. This is effectively what can be called a buffer-overflow. Just to finish this: the proper format would be "%hd", for which the flag "h" signifies that the pointer is a pointer to a "short int", also documented in man 3 scanf. Why aren't you seeing this behaviour with printf (i.e., why can you pass a short but still specify "%d")? Because C defines that functions that take a variable number of arguments (of which printf is one such) get each argument as type "long" (the type that's at least as big as a pointer on the current platform), so when passing a short as argument to a var-args function, the C-compiler inserts code which makes sure that the value is promoted to a long in the argument stack for printf. scanf is also a varargs function, but you're not passing the value of nnote, but rather a pointer to it, which (should) already be as wide as a long. Finally, looking at (parts of) the assembly that gcc generates (on a little-endian i386 machine): .globl main .type main, @function main: leal4(%esp), %ecx andl$-16, %esp pushl -4(%ecx) pushl %ebp ; Set up the pointer to the local frame (EBP on i386). All locals are ; relative to EBP in a function. movl%esp, %ebp ; ECX is the first (hidden) local. pushl %ecx subl$20, %esp subl$12, %esp pushl $.LC0 callprintf addl$16, %esp subl$8, %esp ; Load the effective address of EBP-6, i.e., nnote, into EAX, which ; is pushed for scanf. scanf will thus write its output on EBP-6 up to ; EBP-3, where EBP-4 and EBP-3 are part of the value that's been ; pushed in the "pushl %ecx" above. leal-6(%ebp), %eax pushl %eax pushl $.LC1 callscanf ... ; Restore the value at EBP-4 (i.e., the ECX that was pushed above) into ; ECX at function exit. This value has been corrupted by the integer ; assignment due to scanf. movl-4(%ebp), %ecx leave ; Restore the stack pointer from the (invalidated) %ecx, i.e. produce a ; bogus stack pointer. leal-4(%ecx), %esp ret This produces a segfault, after the return to the C initialization code, simply because the stack pointer is totally bogus. > P.S.: > I found that declaring nnote as int soleves my problem, but I couldnÄt > understand why. Everything clear now? ;-) -- Heiko Wundram Product & Application Development - Office Germany - EXPO PARK HANNOVER Beenic Networks GmbH Mailänder Straße 2 30539 Hannover Fon+49 511 / 590 935 - 15 Fax+49 511 / 590 935 - 29 Mobil +49 172 / 437 3 734 Mail [EMAIL PROTECTED] Beenic Networks GmbH - Sitz der Gesellschaft: Hannover Geschäftsführer: Jorge Delgado Registernummer: HRB 61869 Registergericht: Amtsgericht Hannover ___ freebsd-questions@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-questions To unsubscribe, send a
Re: Mentor for C self study wanted
Bruce Cran wrote: cpghost wrote: There's a mismatch here: scanf("%d", ...) expects a pointer to int, while &nnote is a pointer to a short. Normally, an int occupies more bytes in memory than a short (typically sizeof(int) == 4 on 32bit platforms, and sizeof(int) == 8 on 64bit platforms; while typically sizeof(short) == 2). I think short and int stay the same on both 32 and 64 bit platforms, while it's only long that gets bumped to 8 bytes. At least that seems to be what happens on FreeBSD amd64. -- Bruce No... you're only safe using int32, int64, etc. Just for grins try compiling a program like this: #include int main() { printf("%d\n", sizeof(int)); return 0; } ___ freebsd-questions@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-questions To unsubscribe, send any mail to "[EMAIL PROTECTED]"
Re: Mentor for C self study wanted
On Tue, 23 Oct 2007 23:24:09 +0200 Harald Schmalzbauer <[EMAIL PROTECTED]> wrote: > #include > > void main() > { > short nnote; > > // Numerischen Notenwert einlesen > printf("Bitte numerischen Schulnotenwert eingeben: "); > scanf("%d",&nnote); > > switch (nnote) > { > case 1: printf("Die Note %d entspricht sehr gut.",nnote); > break; > case 2: printf("Die Note %d entspricht gut.",nnote); > break; > case 3: printf("Die Note %d entspricht befriedigend.",nnote); > break; > case 4: printf("Die Note %d entspricht ausreichend.",nnote); > break; > case 5: printf("Die Note %d entspricht mangelhaft.",nnote); > break; > case 6: printf("Die Note %d entspricht ungenügend.",nnote); > break; > default: printf("%d ist keine zulässige Schulnote!"); ^ ^ No matching int for "%d" here. It'll print garbage. Change to: default: printf("%hd ist keine...!", nnote); > } > printf("\n"); > } > > P.S.: > I found that declaring nnote as int soleves my problem, but I > couldnÄt understand why. > Another one was the result of default: nnote was -1077942208 instead > of 9 for example. The reason for this is that the number of arguments after printf's format string MUST match the number of %-place holders (unless you're using exotic stuff like %n, of course). If printf misses some arguments, it will fetch them from a place that is implementation dependant (and that almost always means: you'll get garbage). Sorry for overlooking your second question... ;) -cpghost. -- Cordula's Web. http://www.cordula.ws/ ___ freebsd-questions@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-questions To unsubscribe, send any mail to "[EMAIL PROTECTED]"
Re: Mentor for C self study wanted
On 2007-10-23 23:24, Harald Schmalzbauer <[EMAIL PROTECTED]> wrote: > Thanks all, > here was my example, just for completeness, I found mentors for my > needs. > #include > > void main() > { > short nnote; > > // Numerischen Notenwert einlesen > printf("Bitte numerischen Schulnotenwert eingeben: "); > scanf("%d",&nnote); You are passing "%d" to scanf() so it expects to find enough 'storage' in its pointer argument for an 'int'. If 'short' happens to have a smaller size (as is commonly the case), scanf() will overwrite random memory locations after 'nnote'. On systems where 'nnote' is stored in the stack (because it's an automatic/local variable of main()), you are risking stack corruption (and a SEGFAULT *may* happen). It's also a very good idea to check the return code of scanf(): int nnote; if (scanf("%d", &nnote) != 1) { error; } > switch (nnote) > { > case 1: printf("Die Note %d entspricht sehr gut.",nnote); > break; > case 2: printf("Die Note %d entspricht gut.",nnote); > break; > case 3: printf("Die Note %d entspricht befriedigend.",nnote); > break; > case 4: printf("Die Note %d entspricht ausreichend.",nnote); > break; > case 5: printf("Die Note %d entspricht mangelhaft.",nnote); > break; > case 6: printf("Die Note %d entspricht ungen?gend.",nnote); > break; > default: printf("%d ist keine zul?ssige Schulnote!"); There's no `int' argument to the printf() call of the default clause. This will either cause printf() to print random garbage, or try to access memory regions which are unmapped and SEGFAULT. > P.S.: > I found that declaring nnote as int soleves my problem, but I couldn?t > understand why. > Another one was the result of default: nnote was -1077942208 instead > of 9 for example. It was never assigned to 9 :) ___ freebsd-questions@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-questions To unsubscribe, send any mail to "[EMAIL PROTECTED]"
Re: Mentor for C self study wanted
Harald Schmalzbauer wrote: > > #include > > void main() That's not a C program. :-) The return value of the main function of a valid C program must be int. And of course, your main function should end with "return 0;" or "exit(0);" (the latter requires "#include " at the top). By the way, I recommend you get a copy of the C standard and use it for reference. You can buy a digital copy (PDF) at http://webstore.ansi.org/ (Search for "9899-1999"), it's $30. Alternatively ask Google for "C99 draft" to get a free copy of a draft of the standard, which isn't very different from the final standard. You can also buy a hardcopy of the standard (i.e. a book), but it was ~ $300 last time I looked. Best regards Oliver -- Oliver Fromme, secnetix GmbH & Co. KG, Marktplatz 29, 85567 Grafing b. M. Handelsregister: Registergericht Muenchen, HRA 74606, Geschäftsfuehrung: secnetix Verwaltungsgesellsch. mbH, Handelsregister: Registergericht Mün- chen, HRB 125758, Geschäftsführer: Maik Bachmann, Olaf Erb, Ralf Gebhart FreeBSD-Dienstleistungen, -Produkte und mehr: http://www.secnetix.de/bsd "When your hammer is C++, everything begins to look like a thumb." -- Steve Haflich, in comp.lang.c++ ___ freebsd-questions@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-questions To unsubscribe, send any mail to "[EMAIL PROTECTED]"
Re: Mentor for C self study wanted
On Thu, Oct 25, 2007 at 05:02:00PM +0200, Oliver Fromme wrote: > Harald Schmalzbauer wrote: > > > > #include > > > > void main() > > That's not a C program. :-) > > The return value of the main function of a valid C program > must be int. And of course, your main function should > end with "return 0;" or "exit(0);" (the latter requires > "#include " at the top). > > By the way, I recommend you get a copy of the C standard > and use it for reference. You can buy a digital copy (PDF) > at http://webstore.ansi.org/ (Search for "9899-1999"), > it's $30. Alternatively ask Google for "C99 draft" to get > a free copy of a draft of the standard, which isn't very > different from the final standard. > > You can also buy a hardcopy of the standard (i.e. a book), > but it was ~ $300 last time I looked. That may be the price if you order a paper copy directly from ANSI/ISO, but the C standard has also been published as a regular book (ISBN 978-0-470-84573-8) which is not quite so expensive. For a beginner the standard itself is probably a bit too heavy-going. The book usually recommended is 'The C programming language, Second edition' by Kernighan and Ritchie. ( http://cm.bell-labs.com/cm/cs/cbook/ ) -- Erik Trulsson [EMAIL PROTECTED] ___ freebsd-questions@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-questions To unsubscribe, send any mail to "[EMAIL PROTECTED]"
Re: Mentor for C self study wanted
In response to Oliver Fromme <[EMAIL PROTECTED]>: > Harald Schmalzbauer wrote: > > > > #include > > > > void main() > > That's not a C program. :-) > > The return value of the main function of a valid C program > must be int. And of course, your main function should > end with "return 0;" or "exit(0);" (the latter requires > "#include " at the top). > > By the way, I recommend you get a copy of the C standard > and use it for reference. You can buy a digital copy (PDF) > at http://webstore.ansi.org/ (Search for "9899-1999"), > it's $30. Alternatively ask Google for "C99 draft" to get > a free copy of a draft of the standard, which isn't very > different from the final standard. > > You can also buy a hardcopy of the standard (i.e. a book), > but it was ~ $300 last time I looked. If we're recommending books, I can't say enough good things about the Kernighan and Richie C book: http://www.amazon.com/C-Programming-Language-2nd/dp/0131103628/ref=pd_bbs_2/105-1904293-7155604?ie=UTF8&s=books&qid=1193326006&sr=1-2 -- Bill Moran http://www.potentialtech.com ___ freebsd-questions@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-questions To unsubscribe, send any mail to "[EMAIL PROTECTED]"
Re: Mentor for C self study wanted
Erik Trulsson wrote: > Oliver Fromme wrote: > > By the way, I recommend you get a copy of the C standard > > and use it for reference. You can buy a digital copy (PDF) > > at http://webstore.ansi.org/ (Search for "9899-1999"), > > it's $30. Alternatively ask Google for "C99 draft" to get > > a free copy of a draft of the standard, which isn't very > > different from the final standard. > > > > You can also buy a hardcopy of the standard (i.e. a book), > > but it was ~ $300 last time I looked. > > That may be the price if you order a paper copy directly from ANSI/ISO, Yes. > but the C standard has also been published as a regular book > (ISBN 978-0-470-84573-8) which is not quite so expensive. OK, I didn't know about that one. Personally I chose to order the PDF copy (which was $15 a few years ago, IIRC, now it's $30) after working for some time with the free draft. > For a beginner the standard itself is probably a bit too heavy-going. Right, it's certainly not suitable as a tutorial or as an introduction for a beginner. But it's useful as a reference when you need to know the official details about a certain part of the language (e.g. where do sequence points occur, exactly?). > The book usually recommended is 'The C programming language, Second edition' > by Kernighan and Ritchie. ( http://cm.bell-labs.com/cm/cs/cbook/ ) Absolutely. (I just didn't mention it before because obviously Harald already has a beginner's book on the C programming language.) Best regards Oliver -- Oliver Fromme, secnetix GmbH & Co. KG, Marktplatz 29, 85567 Grafing b. M. Handelsregister: Registergericht Muenchen, HRA 74606, Geschäftsfuehrung: secnetix Verwaltungsgesellsch. mbH, Handelsregister: Registergericht Mün- chen, HRB 125758, Geschäftsführer: Maik Bachmann, Olaf Erb, Ralf Gebhart FreeBSD-Dienstleistungen, -Produkte und mehr: http://www.secnetix.de/bsd "Documentation is like sex; when it's good, it's very, very good, and when it's bad, it's better than nothing." -- Dick Brandon ___ freebsd-questions@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-questions To unsubscribe, send any mail to "[EMAIL PROTECTED]"
Re: Mentor for C self study wanted
On Thu, 25 Oct 2007 17:22:11 +0200 Erik Trulsson <[EMAIL PROTECTED]> wrote: > For a beginner the standard itself is probably a bit too heavy-going. > The book usually recommended is 'The C programming language, Second > edition' by Kernighan and Ritchie. > ( http://cm.bell-labs.com/cm/cs/cbook/ ) Yes, that's the *definitive* book! Add to it "The C Answer Book" by Tondo/Gimpel (title in german: "Das C Loesungsbuch"), with goes along with K&R 2nd Ed. and you have everything you need. -cpghost. -- Cordula's Web. http://www.cordula.ws/ ___ freebsd-questions@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-questions To unsubscribe, send any mail to "[EMAIL PROTECTED]"
Re: Mentor for C self study wanted
> Absolutely. (I just didn't mention it before because > obviously Harald already has a beginner's book on the > C programming language.) > Herald does in fact have one that sucks (it does a terrible job on type sizes for example [doesn't mention that they may very on different machines])... since he is paying me a small amount to help him in detail I am going to recommend K&R to him (with the caution is is meant for experienced programmers) -- Aryeh M. Friedman FloSoft Systems Developer, not Business, Friendly http://www.flosoft-systems.com ___ freebsd-questions@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-questions To unsubscribe, send any mail to "[EMAIL PROTECTED]"
Re: Mentor for C self study wanted
On 2007-10-25 Bill Moran wrote: > In response to Oliver Fromme <[EMAIL PROTECTED]>: > > > Harald Schmalzbauer wrote: > > > > > > #include > > > > > > void main() > > > > That's not a C program. :-) > > > > The return value of the main function of a valid C program > > must be int. And of course, your main function should > > end with "return 0;" or "exit(0);" (the latter requires > > "#include " at the top). > > > > By the way, I recommend you get a copy of the C standard > > and use it for reference. You can buy a digital copy (PDF) > > at http://webstore.ansi.org/ (Search for "9899-1999"), > > it's $30. Alternatively ask Google for "C99 draft" to get > > a free copy of a draft of the standard, which isn't very > > different from the final standard. > > > > You can also buy a hardcopy of the standard (i.e. a book), > > but it was ~ $300 last time I looked. > > If we're recommending books, I can't say enough good things > about the Kernighan and Richie C book: > http://www.amazon.com/C-Programming-Language-2nd/dp/0131103628/ref=pd_bbs_2/105-1904293-7155604?ie=UTF8&s=books&qid=1193326006&sr=1-2 > No doubt the most valuable book on programming I've ever read. Not only it teaches programming but also a style of thinking and designing. -- Bahman Movaqar You can't write poems about trees when the woods are full of policemen. -Bertolt Brecht ___ freebsd-questions@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-questions To unsubscribe, send any mail to "[EMAIL PROTECTED]"
Re: Mentor for C self study wanted
Am Donnerstag, 25. Oktober 2007 20:22:26 schrieb Aryeh M. Friedman: > > Absolutely. (I just didn't mention it before because > > obviously Harald already has a beginner's book on the > > C programming language.) > > Herald does in fact have one that sucks (it does a terrible job on type > sizes for example [doesn't mention that they may very on different Well, probably it's not that bad. First, thanks to all for your help. K&R has been laying arround here for at least 2 years. I hated it. It instructs me to use functions like printf without explaining it, and the examples are not really motivating. So every time I tried to write something on my own I was stoped by the simple printf, for example. I'm sure it's a very good book as a reference, but it couldn't motivate me as a real C beginner (not a bloody programming beginner though). So I bought two new books, the first, which I've started with, is "Markt+Technik, jetzt lerne ich C" (ISBN-13 978-3-8272-4210-5). Indeed, it hasn't made clear that short and int are different, they just explained short and long (and double long) and I thought short is a synonym for int. But it explains in some short sentences the most important behaviour/requirements for the functions we use. It still leaves me alone when it comes to compilers, but after only three evenings so far I think that I made real progress. Writing a simple practice just works :) And I already know that float x; x=10/3 is 3 not 3.. I can't remember reading that in the K&R in the first quarter of the book. I'm still quiet happy with it. The next book is O'Reillys C in a nutshell (ISBN 3-89721-344-3). I'll open it if I have structs and pointers practiced... And of course I'll "replay" the K&R if I have some more basics. Thanks, -Harry > machines])... since he is paying me a small amount to help him in detail > I am going to recommend K&R to him (with the caution is is meant for > experienced programmers) -- OmniSEC - UNIX und Windows Netzwerke - Sicher Harald Schmalzbauer Flintsbacher Str. 3 80686 München +49 (0) 89 18947781 +49 (0) 160 93860101 USt-IdNr.: DE253184753 signature.asc Description: This is a digitally signed message part.
Re: Mentor for C self study wanted
On Thu, 2007-10-25 at 23:19 +0200, Harald Schmalzbauer wrote: > Am Donnerstag, 25. Oktober 2007 20:22:26 schrieb Aryeh M. Friedman: > > > Absolutely. (I just didn't mention it before because > > > obviously Harald already has a beginner's book on the > > > C programming language.) > > > > Herald does in fact have one that sucks (it does a terrible job on type > > sizes for example [doesn't mention that they may very on different > > Well, probably it's not that bad. > > First, thanks to all for your help. > > K&R has been laying arround here for at least 2 years. I hated it. > It instructs me to use functions like printf without explaining it, and the > examples are not really motivating. So every time I tried to write something > on my own I was stoped by the simple printf, for example. YOU DARE NOT WORSHIP AT THE CHURCH OF K&R No, but seriously, it took me a good three years of picking up K&R and trying to get through the first chapter before I eventually started seeing why it's referred to as *the* book. > > I'm sure it's a very good book as a reference, but it couldn't motivate me as > a real C beginner (not a bloody programming beginner though). > But if it doesn't work for you, that's okay :) It *is* a good reference, though. There's annotation for the standard libraries in an appendix. > So I bought two new books, the first, which I've started with, > is "Markt+Technik, jetzt lerne ich C" (ISBN-13 978-3-8272-4210-5). > Indeed, it hasn't made clear that short and int are different, they just > explained short and long (and double long) and I thought short is a synonym > for int. > But it explains in some short sentences the most important > behaviour/requirements for the functions we use. It still leaves me alone > when it comes to compilers, but after only three evenings so far I think that > I made real progress. Writing a simple practice just works :) > And I already know that float x; x=10/3 is 3 not 3.. I can't remember > reading that in the K&R in the first quarter of the book. > I'm still quiet happy with it. > > The next book is O'Reillys C in a nutshell (ISBN 3-89721-344-3). I'll open it > if I have structs and pointers practiced... > If you've got the cash to spare, try out O'Reilly's "Practical C Programming". That book is very friendly, contains a tonne of great examples, and a lot of on the spot quizzes. I was sold on it when I read the rear cover. It says something like: "K&R teaches there are nine rules of precedence in C. We teach two: the first is that addition comes before subtraction, the second is use parentheses for everything else." That kind of simplicity isn't something you see everywhere. > And of course I'll "replay" the K&R if I have some more basics. > > Thanks, > > -Harry > > > machines])... since he is paying me a small amount to help him in detail > > I am going to recommend K&R to him (with the caution is is meant for > > experienced programmers) > > > ___ freebsd-questions@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-questions To unsubscribe, send any mail to "[EMAIL PROTECTED]"