In the Matter of Herb Schildt: a Detailed Analysis of "C: TheComplete Nonsense"

S

spinoza1111

The text is on wordpress at

http://spinoza1111.wordpress.com/20...hildt-an-analysis-of-c-the-complete-nonsense/

For your convenience in making comments, here is the same text in
ASCII format.

In the Matter of Herb Schildt: an Analysis of “C: the Complete
Nonsense”

Let’s now deconstruct Peter Seebach’s document “C: the Complete
Nonsense”, an attack on Herb Schildt’s first edition of “C: the
Complete Reference” which in becoming the sole source of subsequent
claims that Schildt wrote “bad books”, which unfairly damaged his good
name. Let’s examine it, line by line.

Note that the Amazon link to Schildt is not to the first edition
reviewed by Seebach. However, Seebach has failed to update “C: the
Complete Nonsense” to reflect fixes to errata, which is itself
indicative the malice which makes libel, actionable.

“C: The Complete Reference is a popular programming book, marred only
by the fact that it is largely tripe. Herbert Schildt has a knack for
clear, readable text, describing a language subtly but quite
definitely different from C.”

In fact, there was more than one C at the time “C: the Complete
Reference” and “C: the Complete Nonsense” were written and published
(circa 1995), and there remain more than one despite the C99
“standard”. This is because the standard was high jacked by vendors
who did not want to change compilers, since this would mean rehiring
expensive compiler developers. As a result, the standard left
significant parts of C undefined.

For example, because in the “old days” it was easiest for simple “one
pass” compilers (compilers which read the source text once) to emit
instructions to place the actual parameters of a subroutine call on
the stack, you could not expect a(b=0, b) to work like you’d expect it
to in a modern language. Other compilers were able to provide the
expected left to right evaluation. They were supporting different
languages neither with a solid claim to being the lingua franca except
to that sort of amateur folk linguist who knows only his own language,
and demonstrates for an “English only” society. Seebach seems to be
this unpleasant type of person with regards to his favorite languages.

Seebach wanted Schildt to describe the C that Seebach knew.

In addition, Peter Seebach has a knack for unclarity, in his solecism
“clear, readable text”. A careful writer would look up the meaning of
clarity in the dictionary, and finding that it means contributing to
understanding, would qualify “clarity” as “apparent”.

“This page aims to give people a good way to find out what’s wrong
with it.”

…as opposed to letting readers figure that out, as if a book were a
restaurant. This is what Theodore Adorno calls the “culinary”
approach; an only apparently democratic but actually autocratic mode
in which the prospective consumer is warned off a book as if the very
possibility of critical reading has been erased; in a programming
book, trying out code with typos and fixing it.

Furthermore, the document is about the first edition only and has not
been updated, which means that it is egregiously poor as any sort of
guide to people who want to buy Schildt’s fourth edition; because the
market “liked” Schildt, he’s gone to four editions.

“Don’t bother contacting the publisher; they apparently don’t feel
these errors are significant.”

We have learned from Seebach himself on comp.lang.c and
comp.lang.c.moderated that he contacted McGraw-Hill, and that McGraw
Hill actually offered him a temporary tech review job but they failed
to offer him enough money for his tastes. And as we shall see, the
errors are not that significant.

“The following is a partial list [1] of the errors I am aware of [2],
sorted by page number. I am not including everything [3]; just many
[4] of them.”

[1] Contradicts “currently known” below. Like Seebach’s solecism in
the use of “clear”, which means understandable and providing a clear
view of the truth, his slop-English allows him to lie to himself and
others. “Currently known” means in the absence of further
qualification, “these are all the known errors”.

[2] Implies that there are n errors and the list lists m<n. But what
are they? We have no idea.

[3] Why not?

[4] When he says "I am missing several hundred errors", this could
mean that Seebach wants people to join in a deliberate campaign to
destroy Herbert Schildt's reputation (which is civilly liable, that
is, libel) or that he somehow has determined that there are M~=~1000
errors, but he presents N=20. But in this context, N is not "many".

"I am missing several hundred errors [5]. Please write me if you think
you know of any I'm missing. [6] Please also write if you believe one
of these corrections is inadequate or wrong; I'd love to see it."

[5] This is a very disturbing statement, as above. Did he lose them?
Did he forget them? Or did he seek to form a cybernetic mob and gang
up on Herb Schildt?

[6] Very disturbing. Peter currently on comp.lang.c has a track record
of posting awful code as if he’s seeking assistance. Here, he seems to
be Open Sourcing, an Open Season, on Schildt’s reputation.

"Currently known:"

Followed by only 20 errors! So how many are there? Dozens? Hundreds?
20? Nobody knows. But here goes…

Page 19

Schildt: “In general, negative numbers are represented using the two’s
complement approach…”

Seebach: “This is not a C feature. It is a common implementation, but
it is specifically not required. (Binary is, but one’s complement is
not unheard of.)”

Negative numbers are not ALWAYS represented in twos complement
notation: but this is what the head of department said in my graduate
level class on computer architecture, that in general twos complement
is used. This was so students could understand error dumps.

Page 33

Seebach: “The following heading occurs: static Global Variables: no
such thing. A static variable outside of a function has file scope,
which is distinct from global scope.”

The important distinction in computer science is between variables
which are static and have global scope, and variables which are
allocated either at procedure startup or in blocks depending on the
language, and have local scope.

It is more important to learn this in general for all programming
languages so that one can learn new languages. However, Seebach has
boasted, in comp.lang.c, that he has not taken a single computer
science class, at the undergraduate or graduate level. Herb Schildt
has a Master’s in computer science.

p. 53

printf("%f", sizeof f);
printf("%d", sizeof(int));

Seebach: “Clearly wrong; sizeof is not a double or float. It is also
not an int; it is an unsigned integral type, thus, one of unsigned
char, unsigned short,unsigned int, or unsigned long.”

“The only safe way to do this is: printf(“%lu”, (unsigned long)
sizeof(int)); while this is larger, a clear explanation of why it is
required will go a long way towards helping people understand C.”

Although I do not know why Herb used %f and %d format codes, he did
know, as Seebach seems not to, that all ints are floats and all floats
are doubles in well-structured languages. Because at the time and
even, to an extent, now, C was almost as diverse of the languages of
China, Herb used the educated programmer’s maxim, which is to first
code as if the compiler writers and language designers knew at least
as much as the intelligent programmer, and fix problems later.

p. 53

“Seebach: The following code:

/* Write 6 integers to a disk file. */
void put_rec(int rec[6], FILE *fp)
{
int len;

len = fwrite(rec, sizeof rec, 1, fp);
if (len != 1) printf("write error");
}

is described as causing all of rec to be written, no matter what size
of array is being used.”

“Incorrect. As correctly noted elsewhere, when “int rec[6]” is an
argument to a function, it actually specifies a pointer-to-int, not an
array[6]-of-int. sizeof rec is sizeof(int *) here, and this code works
only if sizeof(int *) is precisely 6 times sizeof(int). (Not
impossible, but hardly likely.)”

“Further, who said fp was a disk file? fp could be stdout. (An
admitted nit.)”

The put_rec code was errata. Peter has said on comp.lang.c that McGraw
Hill offered him the chance to work collegially with Herb to fix
errata; he refused, he has said, because they didn’t offer enough
money. Because Schildt’s books were successful, he’s gone to several
editions, and has fixed most of the errata.

Page 59

Schildt: “This shorthand works for all the binary operators.”

Seebach: “No, it doesn’t. It doesn’t work for ‘.’, ‘->’, ‘&&’, or
‘||’. For that matter, it doesn’t work for the function call operator
or the array operator, both of which are, roughly, binary operators.

In college lectures which Seebach confesses he did not attend, “binary
operators” often is a verbal shorthand for “the commonly known binary
arithmetic operators, with logic operators being treated separately”.

The problem here is that adolescents fantasize that there can be
unambiguous language, whereas in what Jurgen Habermas, the German
“critical theorist” calls “civil discourse”, a common and grown-up
search for truth from which competition for gain is excluded, there
occurs a constant search among all participants, not only for
substantive consensus on a truth, but also for support for that common
consensus in the form of a common language, whose micro-rules vary in
a language game…what Wittgenstein said was a form of life, as well.

Put more simply, for the same reason we can use a noun as a verb in
“let me email you the email” and be understood perfectly, the human
brain, as opposed to a computer, has an unparalleled ability to parse
and reparse holistically and rapidly, while searching, not for the
most advantageous parse to the owner of the brain, but for the best
fit.

Therefore, in a college classroom, a teacher like Herb, who has just
introduced the arithmetical binary operators, and who plans to address
logical and other binary operators later, is understood by normal, and
attentive students.

However, Peter Seebach has said on comp.lang.c that he is “attention
disordered”. This would give him rights of charity save for the fact
that he on that forum has called people he doesn’t like “morons” and
“insane”, using a language which even Sarah Palin, of all people,
correctly recognizes as discriminatory and abusive.

Here, Peter, for personal advantage (in fact, I believe, to
dishonestly establish himself to be a clever programmer despite his
lack of academic background in computer science or any evidence of
programming in code swatches he has posted this year on comp.lang.c)
interrupts the flow of civil discourse in a virtual classroom and is
the bane, in fact of computer instructors: the student with a chip on
his shoulder who wants to show off his knowledge.

Page 63

Seebach: “If scanf fails, the variable guess is referenced before it
has been initialized; accessing an uninitialized object introduces
undefined behavior.”

Errata. Seebach was invited to work collegially on the sort of errata
which creeps into computer books when the publishers don’t allow the
authors post-PDF control, and he refused. Most of these errors were
fixed in subsequent editions.

Page 131

Schildt: “Memory allocated by C’s dynamic allocation functions is
obtained from the heap — the region of free memory that lies between
your program and its permanent storage area and the stack.”

Seebach: “C does not specify that there is a stack – only that
functions can call each other. The “heap” is a DOS term, and the
layout is not a part of the C language. It is not atypical for the
layout to be radically different, and certainly, there is no call for
describing a specific choice as ‘what happens’.”

Seebach lays an egg. Like a like a Maoist student during the Cultural
Revolution, he leaps up to admonish the teacher not to talk about
stacks as if it’s even possible to implement C’s runtime, or any
language runtime, without stacks.

He then surpasses this, and says “the ‘heap’ is a DOS term”. The
“heap” is most definitely not a DOS term: Seebach is ignorant of OO
languages which formalize a heap…and a stack. Here is where Seebach’s
lack of education is most obvious.

It is formally impossible, in fact, to implement a runtime with
support for recursive procedures (supported by all C compilers and
runtimes since day one) without a stack, that is, a LIFO data
structure. It is painfully possible to go without a stack, and save
and return general registers in work areas provided by the caller;
this was done on the IBM 360 in BAL in my direct experience. But it
does not work if a procedure calls itself directly or indirectly. Some
sort of LIFO stack, implemented in an unspecified way, is needed.

The only reason why the C99 standard document fails to use the word
“stack” that I can imagine is a long-standing American prejudice
against the stack, which surfaced both in the design of the IBM/360
(whose designers knew about stacks, probably, but used general
registers instead) and much later in the RISC kiddie’s hatred of
stacks.

Page 132

Schildt: “After the assignment, p points to the first 1000 bytes of
free memory.”

Seebach: “No, p points to at least 1000 bytes of allocated space,
which is not free memory. There is also no reason to assume it was the
‘first’ 1000 bytes; top-down allocation is not atypical, and further,
there’s no reason to assume this code fragment runs in isolation.”

Schildt like most good writers, tries to be conversational in
presenting difficult material. “Free” was a minor solecism.

But, far more perniciously, Seebach actually equates negative claims
with positive claims and often prefers, whether writing about Schildt
or C standards, the negative claim as being not only true, but also
easier to defend because harder to disprove by men of good will.

Seebach has blogged in public, circa 2000, his preference for George
Bush. He, like most former Bush supporters, has disclaimed further
support. Nonetheless, his support for Bush is interesting, because for
Bush’s henchman Karl Rove (a college dropout who like Seebach
considers himself a genius autodidact), it was only necessary to claim
that Saddam Hussein, in 2003, had weapons of mass destruction, and let
the (huge) antiwar movement try to “prove a negative”.

Therefore here and elsewhere, Seebach would “teach” C in a faux-Zen
way, beating students who conclude from the behavior of anyone
compiler and runtime that “C” works “this” way. To him, their
knowledge is Sophistry, but as an “expert” his is the larger
Sophistry. This is his false belief that C has been “standardized” by
negative truths to wit that various behaviors (order of evaluation of
actual parameters, when pre and post increment operators are
evaluated) when a language standard must actually be useful and
therefore, deterministic.

Schildt is like a competent high school geometry teacher who uses a
specific triangle with a specific metric to demonstrate the
Pythagorean theorem. Seebach, who isn’t paying attention and may be
autistic, is interrupting the class to ask whether the nonzero width
of the chalk marks should be accounted for.

This would be an intelligent question…in an “advanced” class. But in
computer science, there are no “advanced” classes in being a language
lawyer, since (1) being a language lawyer doesn’t help much in problem
solving for the most part and (2) Seebach is in a language where, even
after standardization and in the standard itself, the “law” is
“unspecified” in too many places.

Page 162

Seebach: “Functions are not of type void; functions are of various
types, called collectively the function types. A function may have a
return of type void, which means that its type is something like
‘function taking (…) and returning void’.”



Mr. Snoid is lost in the void. Herb knows very well that to return
“void” is to return nothing and not return anything. Syntactically, in
a way the student needs to know, the type of a void function is
“void”.

Both Seebach and Schildt are using reifying language, treating our
ideas about what electrons do in a computer as things. Peter would
renarrate the void function as returning something named “void”, which
does not exist, and Schildt’s language is better, since void functions
are something of a special [syntactical] type, which is not returned.

Page 163

Schildt: “You may also declare main() as void if it does not return a
value.”

Seebach: “Specifically untrue. ANSI mandates two declarations for
main, and says that main may have declarations compatible with those.
Both return int.”

C was not standardized at the time this book was written, it existed
in several different dialects. In fact, I discovered (on behalf, as it
happens, of John “A Beautiful Mind” Nash) that the Microsoft compiler,
which many of Schildt’s readers were using, is nonstandard at least as
regards the evaluation of compile-time constant expressions. While it
has become a Shibboleth or Secret Handshake among non-Microsoft
Illuminati that you must declare main as int, it’s actually better
style to make it void unless you have an important message, such as
“up yours!” to the OS.

But this shibboleth has become an article of faith amongst the anti-
Microsoft crowd who compensate for the meaninglessness of their lives
and general incompetence by fantasizing that they are Special, and the
OS gives a hoot.

Page 197

Seebach: “It is redundant to give a size of char in bytes as 1 as an
“assumption” – it’s the definition, sizeof() gives the size in
*chars*.”

Shibboleth. And here, Peter Seebach is here critiquing writing as a
technical editor when he gave evidence in the prologue above that he
can’t write with charity, clarity (the clarity of truth), coherence or
consistency.

Page 247

Seebach: “The stream fp is opened with mode “r”, the mode to open a
text file. Then, fseek is called on fp, with the 2nd argument not a
value returned by a previous call to ftell.”

“ANSI 7.9.9.2: For a text stream, either offset shall be zero, or
offset shall be a value returned by an earlier call to the ftell
function on the same stream and whence shall be SEEK_SET.”

“In other words, this is blatantly invalid.”

Genuine errata of the sort to be expected under deadline pressure.
Pompous and exhibitionist quotation from a standard doesn’t change
this.

Page 253

Schildt: “In most implementations, the operation fails if the file
specified in the open statement does not exist on the disk.”

Seebach: “To the best of my knowledge, POSIX (the standard for the
open() call) documents and requires the functionality of the O_CREAT
flag.”

But, the operation fails if the file does not exist on the disk.
Seebach’s point is “I’m real smart”.

Page 283

Schildt’s code:

#include string.h // corner chars deleted to format

char s1[] = "hello ";
char s2[] = "there.";

void main(void)
{
int p;
p = strcat(s1, s2);
}

Seebach: “It is correctly noted that this generates a warning. Not
mentioned is that it’s invalid; although s1[] is a modifiable array,
it is an array large enough to hold “hello ” (and the terminating null
byte), so it has room for 7 bytes. The strcat overflows the array,
producing undefined behavior.”

“(And, of course, the declaration of main is invalid.)”

Genuine errata. Seebach is not doing so good. Only 2/14 at this point.

Page 284

Seebach: “All of the header files are listed in capitals; the standard
specifies them in lower case. It is not required that a C compiler
reject all-caps, but nor is it required that it accept them.”

“But nor is it required”? A completely illiterate grammatical
solecism. How dare does Seebach pretend to be a tech editor? He was
offered a job finding errors. He found a few.

And furthermore, C should reject all-caps: it would do so if it were a
truly consistent language. But it as a real language in practice it
allows them because of Microsoft’s market power.

Page 314

Schildt: “However, since EOF is a valid integer value, you must use
feof() to check for end-of-file when working with binary files.”

Seebach: “Not merely a little bit untrue, but utterly wrong, and
specifically missing the point of the rule (correctly stated) about
returning the char as ‘unsigned char converted to int’ (actually
stated in the standard in 7.9.7.1, under fgetc()).”

“Since EOF is a negative integral constant, it can never compare equal
to any unsigned char. When you are reading from a binary file, the
values you get willnever compare equal to EOF, until getchar() returns
EOF because the file is empty.”

“This correlates with a mistake made in all of the examples where
loops break on ‘$’, ‘A’, or ‘ ‘ because the return from getchar() is
immediately put into a char variable.”
“This is a more serious flaw than many, because it results in poorly
written, inefficient code.”

“(Couple this with the consistent attempts to use feof() to see if the
next read will fail, when in fact feof() only returns true when the
previous read failed, and you get a completely wrong description of
the standard I/O library.)”

“Also, several of the programs given loop forever if an end of file is
reached, because EOF is not checked for in a loop.”

“(The astute reader will note that he is correct for implementations
in which char and int are the same size; I disregard this because:
This violates the spirit, if not the letter, of the standard. The
implementation he is discussing does not have this problem.”

“In such an environment, the “correct” thing to do is probably to use
fread and check for failure. feof() will still not warn you that your
next read will fail.)”

Probably Herb’s most serious error, but of the sort which creeps into
most computer books, including Seebach’s Apress title as he admits.
Software books disclaim warranty protection for the consumer in the
same way software warranties make this disclaimer.

Page 333

Seebach: “After

char str[80];

sprintf(str,"%s %d %c", "one", 2, 3);

it is asserted that str will contain ‘one 2 3’. This is incorrect; it
would contain “one 2 ^C”. (That’s ‘control C’ in ASCII, or a character
with the value 3)”

Errata. And grandstanding.

Page 348

Schildt: “This program checks each character read from stdin and
reports all uppercase letters:”.

Seebach: “He is wrong.”

#include ctype.h // corner chars deleted to format
#include stdio.h

void main(void)
{
char ch;

for (;;) {
ch = getchar();
if(ch == ' ') break;
if(isupper(ch)) printf("%c is uppercase\n", ch);
}
}

“The code works only if there are no uppercase letters following the
first space in the standard input stream; further, a file consisting
only of the word ‘hello’ will prevent this horribly broken code from
terminating – because it doesn’t check for EOF, only for a space.”

“Once again, even a slight clue about EOF would help a lot here.”

Errata. Most of Seebach’s points about EOF handling are valid, but
what’s broken is the way C, whether “standardized” or not, handles
EOF.

Constant is the tendency to make an inferential leap from error to
ignorance, and from special to general ignorance. It is adolescent.

Page 434

Schildt: “free() must only be called with a pointer that was
previously allocated with one of the dynamic allocation system’s
functions (either malloc(), realloc(), or calloc()).”

Seebach: “Also specifically untrue. ANSI states that free(NULL) is
valid and has no effect. (Also note that it must be called with a
pointer to space previously allocated, not with a pointer previously
allocated, and that the pointer must not have been already freed or
passed to realloc().)”

There is no sensible use for free(NULL) save in code generation with
the preprocessor or other tool: this fact is obscure and shouldn’t be
presented at this point. The latter part of Seebach’s comment is again
a Maoist attempt to prove that he’s smarter than the teacher. Herb is
giving advice that is practical and true which if followed, works.

Page 735

Seebach: “This is spectacularly wrong; the ‘corrected’ “

x = *p * (*p++);

“is EXACTLY equivalent in terms of C; as correctly noted earlier, the
order of evaluation IS NOT SPECIFIED.”

“The code is still invalid (p is used to determine *p on the left of
the *, as well as modified on the right), and the parentheses aren’t
affecting the code at all.”

“In this code, p can be incremented anywhere in the line; the only
requirement would be that the value of (*p++) be the same as the value
of (*p) before the increment. It is not specified whether the other *p
happens before or after the increment.”

“In fact, because the code modifies an object (p) and uses the value
of the object to do something other than determine the new value (The
first “*p”), it is invalid. Completely; a compiler is allowed to
reject the code, and many will produce surprising results from this
operation.”

“This is not merely wrong, it’s wrong while discussing the problem,
which is doubly bad.”

The order of evaluation is indeed specified in the variant behavior of
C compilers, whose writers, as mere programmers, were given no
guidance by the standard.

This was because C standardization occured after the “Reagan
Revolution” empowered private companies and computer thugs to use the
public good for private gain. In the C99 standard, Job One seems to
have been not making vendors rehire compiler developers so that their
stock price was maintained. The standard is useless to mere
programmers, who are considered serfs today.

At this point in “C: the Complete Nonsense”, Peter Seebach has
identified only 5 errata, of the sort that exist in all books unless
the publisher allows the authors to use a system to avoid errata. And
yet he writes at the end:

“There are dozens of others, and I’m sure there’s an effective
drinking game lurking in this book.”

In other words, Seebach Open Sources here an Open Season on Schildt
based on his malice. This is civilly actionable libel.

Seebach needs to remove this document, which is “hit” by Google higher
than Schildt’s book’s fourth edition, which dishonestly misdescribes
the current edition, and which is the source, as far as I can
determine, of all subsequent attacks on Schildt’s output. He needs to
replace it by an apology to Herb.

Seebach appears to me stuck at the level of the vicious adolescent. In
“You Are Not A Gadget”, Jaron Lanier (a musician, computer scientist,
and philosopher) writes that what he calls “drive-by anonymity”, the
marshalling of an assault on a Chosen target by anonymous posters can
indeed scale up, from the personal anguish caused Herb and his family
when his name was transformed, based exclusively on “C: the Complete
Nonsense” to “Bullschildt”, to the death threats received by Java
author Kathy Sierra, to the “tea party” attacks on Obama…and beyond.

But, you may say, Seebach is not anonymous. Lanier, in fact, misses
the social structure of enabling. In the case of Sierra, named, non-
anonymous bloggers at the defunct site www.meankids.org started in on
Sierra. This enabled anonymous bloggers in the same way anonymous
commenters say the most broad and overgeneralized things about all of
Schildt’s books, based on “C: the Complete Nonsense” and documents
which cite CTCN directly or indirectly, the “paper trail” seeming to
ignorant people a vast amount of real evidence.

Hitler was not anonymous; but his followers were, in many cases. And
Mike Godwin is wrong; the probability of comparision to Hitler in
online discussions “converges to unity” not because people are being
shrill and foolish, but because Hitler is our inner troll, as Lanier
calls it. He’s the face in the crowd in Munich in August 1914 baying
for war who yearns to be on the podium, and non-anonymous.

Actually I should have been able to deduce Fascism from the memory of
my childhood. It sent its emissaries there in advance, like a
conqueror into the most distant province, long before it arrived: my
school comrades. If the bourgeois class harbored since time immemorial
the dream of the wild popular community, the oppression of all by all,
then children with first names like Horst and Jürgen and last names
like Bergenroth, Bojunga and Eckhardt, theatrically staged the dream,
before the adults were historically ripe enough to realize it. I felt
the violence of the image of horror they were striving for so clearly,
that all happiness afterwards seemed to be revocable and borrowed. The
outbreak of the Third Reich did indeed surprise my political judgment,
yet not my fearful premonitions. So closely had all the motifs of the
permanent catastrophe brushed against me, so inextinguishably were the
warning signs of the German awakening burned into me, that I
recognized each one all over again in the features of the Hitler
dictatorship: and often it appeared to my foolish horror, as if the
total state had been invented solely against me, in order to inflict
on me what I had been hitherto spared in my childhood, that state’s
prehistory. The five patriots who attacked a single schoolmate, beat
him up and, when he complained to the teacher, defamed him as a
classroom snitch – aren’t they the same ones, who tortured prisoners,
in order to prove the foreigners wrong, who said that torture was
occurring? Whose hullaboo knew no end, when the smartest student made
a mistake – didn’t they surround the Jewish camp prisoner, grinning
and embarrassed, making fun of him, after he all too clumsily sought
to hang himself? Who couldn’t write a single decent sentence, but
found every one of mine too long – didn’t they abolish German
literature and replace it through their scribing [Schrifttum]? Many
covered their chests with mysterious insignia and wanted to become
naval officers in a landlocked country: they declared themselves
leaders of storm troopers and detachments, the legitimizers of
illegitimation. The involuted intelligent ones, who had as little
success in class as the gifted tinkerer without connections under
liberalism; who for that reason curried favor with their parents with
woodsaw work, or indeed drew for their own pleasure on drawing-boards
with colored inks during long afternoon days, helped the Third Reich
to its cruel efficiency and are being betrayed once again. Those
however who always defiantly stirred up trouble against the teacher
and, as one called it, disturbed the lesson, the day – indeed, the
hour – they graduated from high school, they sat down with the same
teachers at the same table with the same beer, as a confederation of
men, who were born followers, rebels, whose impatient blows of the
fist on the table already drummed the worship of the masters. They
need only stay put, to catch up with those who were promoted to the
next class, and revenge themselves on them. Since they, officials and
candidates for death sentences, have stepped visibly out of my dreams
and have expropriated my past life and my language, I don’t need to
dream of them any longer. In Fascism, the nightmare of childhood has
realized itself.

Theodore Wiesengrund Adorno, Minima Moralia, 1948
 
I

Ian Bush

This is what Theodore Adorno calls the “culinary”
approach;

This is the point that my laughing became out loud. I consider myself
a tolerant person, did I loose it before or after other sane people in
the group?

Ian
 
S

Seebs

This is the point that my laughing became out loud. I consider myself
a tolerant person, did I loose it before or after other sane people in
the group?

I didn't actually read it. Is it funny? I could totally go back and
read it, if it's actually funny.

-s
 
M

Morris Keesan

I didn't actually read it. Is it funny? I could totally go back and
read it, if it's actually funny.

It's not funny enough to bother reading the whole thing, but here's one
howler:

[regarding the use of %f and %d printf format specifiers for sizeof]
Although I do not know why Herb used %f and %d format codes, he did
know, as Seebach seems not to, that all ints are floats and all floats
are doubles in well-structured languages. Because at the time and
even, to an extent, now, C was almost as divers of the languages of
China, Herb used the educated programmer's maxim, which is to first
code as if the compiler writers and language designers knew at least
as much as the intelligent programmer, and fix problems later.

I have absolutely no idea what spinoza thinks he's saying here, especially
the part about "all ints are floats and all floats are doubles".

spinoza then, at the end, goes into one of his typical babbling rants
about "I am not a gadget", Hitler, Fascism, etc.

He does make one point which may be valid, if true: according to spinoza,
Schildt's book is in its 4th edition, with some errata fixed, and "C:
The Complete Nonsense" refers to the first edition.
A little research shows that Schildt's website refers to "C: The Complete
Reference" as having been "fully updated for the C99 standard". Schildt's
"Errata" page, however, links to errata for C++, C#, and Java books, but
contains no errata for any editions of any of his C books.
 
S

Seebs

It's not funny enough to bother reading the whole thing, but here's one
howler:
[regarding the use of %f and %d printf format specifiers for sizeof]
Although I do not know why Herb used %f and %d format codes, he did
know, as Seebach seems not to, that all ints are floats and all floats
are doubles in well-structured languages. Because at the time and
even, to an extent, now, C was almost as divers of the languages of
China, Herb used the educated programmer's maxim, which is to first
code as if the compiler writers and language designers knew at least
as much as the intelligent programmer, and fix problems later.
I have absolutely no idea what spinoza thinks he's saying here, especially
the part about "all ints are floats and all floats are doubles".

There certainly exist languages in which you can use numeric types and
expect automatic conversions.

The problem is that (and no one, I think, disputes that this design choice
causes some problems), in C, when you're passing stuff to the variadic part
of a variadic function, you don't know what types of objects you get except
insofar as the earlier arguments told you. Thus, passing "%f" and passing
an integer doesn't necessarily cause the integer to get converted to float;
what it does is "undefined behavior", of which the two most common forms
are:

1. You get random stack garbage because floats and integers are passed
differently.
2. You get a float-sized chunk of space which contained part of an integer,
or an integer, or an integer plus some other stuff, depending on their
respective sizes.

Either way, it's garbage.

My guess would be that the actual motivation was "there is a float object,
I'm typing quickly, I'll write %f". Because I've made that mistake; the
difference is that I recognize that it's a mistake and fix it.

Note that "in well-structured languages" is totally irrelevant; according
to Nilges, C is not a well-designed language, and a book purporting to be
about C which then relies on conventions or policies that only exist in other
languages is, as I said: Complete. Nonsense.

I'm glad to see that Nilges is continuing to support my theory that only
sheer madness can make C:TCR 3rd Edition look remotely coherent.
spinoza then, at the end, goes into one of his typical babbling rants
about "I am not a gadget", Hitler, Fascism, etc.
He does make one point which may be valid, if true: according to spinoza,
Schildt's book is in its 4th edition, with some errata fixed, and "C:
The Complete Nonsense" refers to the first edition.

No, he's not right. C:TCN is based on the THIRD edition, with I believe
one or two references back to things that have been fixed since the second.

e.g., the famous sizeof() example, in the 2nd edition, used <> instead of
!=. This was fixed in the 3rd edition (and the 4th edition "fixes" the
exercise making it factually correct but completely uninformative. D'oh!)
A little research shows that Schildt's website refers to "C: The Complete
Reference" as having been "fully updated for the C99 standard". Schildt's
"Errata" page, however, links to errata for C++, C#, and Java books, but
contains no errata for any editions of any of his C books.

I don't really care about errata for the 3rd edition at this point; the 4th
edition is somewhat improved, but still does crazy Pascal-style EOF handling
and in some cases appears to pass EOF to putchar() type functions due to
doing things in the wrong order. (Or possibly the flow is convoluted enough
that it sometimes doesn't. The flow is sufficiently confusing when you try
to use feof() as a loop control as to make it a bit tricky to be sure without
spending more time on it than I've wanted to.)

-s
 
S

spinoza1111

[I've snipped a few hundred lines of the usualspinoza1111nonsense.]

spinoza1111wrote:

In the Matter of Herb Schildt: an Analysis of “C: the Complete
Nonsense”
Let’s now deconstruct Peter Seebach’s document “C: the Complete
Nonsense”,

Your first error is...
an attack on Herb Schildt’s first edition of “C: the
Complete Reference” which in becoming the sole source of subsequent
claims that Schildt wrote “bad books”, which unfairly damaged his good
name.

...here. It is not the sole source of subsequent claims that Schildt
wrote bad books. Other sources include, for example, subsequent editions
of "C: The Complete Reference".

This is ridiculous. Perhaps in your country a man can be a witness
against himself? I am really glad you're some sort of temporary
programmer and not in politics, because you'd be a BNP nutcase.
As for the page being a response to the
first edition, ISTR that it is actually based on the third edition
(perhaps Seebs would clarify this point?).

I don't think he will, for part of reputation destruction is creating
confusion. For example, Peter and others like to retail stories about
weird coworkers and form hypotheses about what I might do in order to
pad their case, as Peter, it appears, has padded his resume.
Actually, C compilers almost invariably evaluate function parameters
right to left (although there is no requirement on them to do this). You
have been told this before.

....and sensible, well-educated programmers are surprised, because
elsewhere in C the comma is a useful operator for left to right
sequencing. The order of actual parameter evaluation is bizarre and
legacy.
No int is a float, and no float is a double.

....in C, in which sense is deliberately absent so that stupid people
like you can self-appear as experts.
<snip>




If by this you mean that it is contained in a published errata list,
please cite the relevant reference to an errata addendum in the book or
a Schildt-sanctioned errata Web page for the book. If you simply mean
Schildt was wrong, well, yes, he was.




Please cite the page numbers in those subsequent editions in which these
errors were fixed.

<snip>






No, a function that returns void has a type that includes "function
returning void" (but that isn't the whole story, since the type also
includes the parameter information).

Please don't play with words. You're not qualified and you'll cut
yourself.
The first edition was published in 1987, when the standardisation effort
was well under way. Note that it was the ANSI C Standard that formally
introduced the type "void" into the language.

....however, a major part of McGraw Hill's target demographic was not
using a standard compiler, and nobody was by definition before 1989.
John Nash wasn't using a "standard" compiler in 1992, although after I
switched him to the Borland compiler, his compiler was "more"
standard.

Therefore, it would have been absurd to publish on "standard C"
especially because it was so obvious that the standards effort was
comprised of vendor thugs and incompetent programmers who'd bought a
membership.
 
S

Seebs

I don't think he will, for part of reputation destruction is creating
confusion.

Which is funny, because I already posted a clear answer to that question
some hours ago. It is indeed based on the third edition. The second
had more errors, and I have never seen the first, but I've been told it
was even worse.

-s
 
S

spinoza1111

I didn't actually read it.  Is it funny?  I could totally go back and
read it, if it's actually funny.
It's not funny enough to bother reading the whole thing, but here's one
howler:
[regarding the use of %f and %d printf format specifiers for sizeof]
Although I do not know why Herb used %f and %d format codes, he did
know, as Seebach seems not to, that all ints are floats and all floats
are doubles in well-structured languages. Because at the time and
even, to an extent, now, C was almost as divers of the languages of
China, Herb used the educated programmer's maxim, which is to first
code as if the compiler writers and language designers knew at least
as much as the intelligent programmer, and fix problems later.
I have absolutely no idea what spinoza thinks he's saying here, especially
the part about "all ints are floats and all floats are doubles".

You wouldn't, because you don't know "programming languages"
independent of a set of facts about a specific programming language.
It's as if I'd decided to program all computers as if they were IBM
1401s, and apart from liking Rexx (which is based in part on the
legacy and internal IBM belief that all computers should support
decimal arithmetic with unlimited precision), I didn't.

If you like to learn from books, please read "Programming Language
Pragmatics" by Michael L. Scott (Morgan Kauffman). You need to learn
theoretic constructs such as the fact that in sensible programming
languages, numbers form a nested set down from double to short or
byte. You also need to learn that competent programmers try to write
sensible code based on these constructs, adapting their language to
their model rather than celebrating its mistakes.
There certainly exist languages in which you can use numeric types and
expect automatic conversions.
Correct.

The problem is that (and no one, I think, disputes that this design choice
Correct.

causes some problems), in C, when you're passing stuff to the variadic part
of a variadic function, you don't know what types of objects you get except
insofar as the earlier arguments told you.  Thus, passing "%f" and passing
an integer doesn't necessarily cause the integer to get converted to float;
what it does is "undefined behavior", of which the two most common forms
are:

1.  You get random stack garbage because floats and integers are passed
differently.
2.  You get a float-sized chunk of space which contained part of an integer,
or an integer, or an integer plus some other stuff, depending on their
respective sizes.

Either way, it's garbage.

Point taken. 6 errata out of 20 points but note that the maximum
number of errata will still be only 20, and you haven't addressed the
contradictory language at the beginning of the post.
My guess would be that the actual motivation was "there is a float object,
I'm typing quickly, I'll write %f".  Because I've made that mistake; the
difference is that I recognize that it's a mistake and fix it.

But our experience is that you DON'T fix or see trivial errors such as
off by one. However, it seems that here, and at most 20 other place
(and, probably more like 6), Herb ran out of time to test code which
was in the process of being transformed into a hard-to-change PDF.
This is common in software publishing, and it's why computer books
disclaim warranty.

Note that "in well-structured languages" is totally irrelevant; according
to Nilges, C is not a well-designed language, and a book purporting to be
about C which then relies on conventions or policies that only exist in other
languages is, as I said:  Complete.  Nonsense.

No, using a poorly structured language makes the search for good
structure even more important. This is why I developed "virtually
structured programming" for assembler and Fortran, and it is a point
made long ago by Brian Kernighan in The Elements of Programming Style.

My suspicion of any programmer who uses the mistakes of a language to
use his own poor practice is covering up his incompetence, and this
has been confirmed, for me, by your code here.

I'm glad to see that Nilges is continuing to support my theory that only
sheer madness can make C:TCR 3rd Edition look remotely coherent.

Petitio principii:

1. Nilges is mad

2. Therefore anything he says is wrong (a questionable assumption on
two bases: on the monkey/typewriter model, approximately 50% of what I
say is true, and on a Romantic basis, I might have special insight)

3. He thinks C:TCR is coherent

4. Therefore he's mad

Dweebach, CTCR is not at issue here: CTCN has to stand on its own
merits. It may be incoherent. I noticed long ago that many computer
books are semi-coherent, and I learned why: computer book publishing
is a business, not "truth".

But CTCN fails to make your case. It's self-contradictory, misuses
words such as "clarity", and is completely disorganized. To make your
case, you would have had to list the "hundreds" or "dozens" of errors
you refer to in CTCN. It is illogical to reason from 20 to 24 or 100.

No, he's not right.  C:TCN is based on the THIRD edition, with I believe
one or two references back to things that have been fixed since the second.

The book is in its fourth edition. Therefore, you are dishonest,
because you're telling people about the flaws, with page numbers, in
an edition that is out of print. Dishonest enough to believe that in
the above, you may be lying, and that CTCN is based on the first
edition. This is verifiable by checking page numbers.

It in fact appears that you posted a response to the first edition,
and failed to keep it up to date. You may have changed it (recently,
perhaps, in response to this thread) but you're still basically
dishonest. You were asked, and offered money, to be a tech editor and
have a real shot at accomplishing something (which my son accomplished
wrt to Stroustrup's book on C++ at the age of 13) but you refused.

This is because you are grandiose. You couldn't take trigonometry and
had to take calculus, and you wouldn't take computer science. There's
a disturbing pattern.

e.g., the famous sizeof() example, in the 2nd edition, used <> instead of
!=.  This was fixed in the 3rd edition (and the 4th edition "fixes" the
exercise making it factually correct but completely uninformative.  D'oh!)


I don't really care about errata for the 3rd edition at this point; the 4th
edition is somewhat improved, but still does crazy Pascal-style EOF handling
and in some cases appears to pass EOF to putchar() type functions due to
doing things in the wrong order.  (Or possibly the flow is convoluted enough
that it sometimes doesn't.  The flow is sufficiently confusing when you try
to use feof() as a loop control as to make it a bit tricky to be sure without
spending more time on it than I've wanted to.)

For each edition, you needed to inventory every error. Then, you
needed to form some sort of explanatory theory. Mine is that Microsoft
C is different and nonstandard, because C, if standardized would be a
new language.

You'd be laughed at since most computer books have under disclaimer of
warranty any number of errors, and you have said that your OWN book
will have errors. This is why you prefer the McCarthyite (and Fascist)
conspiracy theory that Schildt's books contain "hundreds" of errors
and their was a plot.

But you preferred a drive-by.
 
S

spinoza1111

This is the point that my laughing became out loud. I consider myself
a tolerant person, did I loose it before or after other sane people in

Your illiteracy is causing me to "loose" it. The fact is that Adorno
saw things which I saw emerge in computing, including subhumanity, and
the "culinary" belief that the consumer (or hive mind) has any
artistic, or here scientific, wisdom.
 
S

Seebs

I doubt that very much. Almost certainly he has to trim his CV
mercilessly to keep it down to a reasonable length. I know I do. There
is simply no room for padding.

Actually, for once, Nilges is entirely correct (though almost certainly
by coincidence).

I have maintained for some time a padded resume.

http://www.seebs.net/res-p.html

As the parent page says:

I was once told you can't get hired if you don't have a padded
resume. Here's mine.

Example listings:

Apple Computer
Product Tester (1988-present)
* Tested products after shipment.
* Funded company.

As you might expect, literally true...
Nilges was invited to provide evidence to support his wildly spurious
claim, but he refused.

Actually, it is the case that several of the errors cited were indeed
corrected in the 4th edition. I don't have any reason to believe that
Nilges has a copy of the 4th edition on which to base his claim, but
he happens to be right.
typename functionname(parameterlist) means that functionname is a
function that has the type "function taking parameterlist and returning
typename". It does not mean that functionname has the type typename. To
say that it does mean that is, at best, a spurious and ill-considered
shortcut and, at worst, ghastlily wrong.
Ayup.
On the contrary, it would have been absurd not to.

We can resolve this easily.

From the front cover of C:TCR 3rd Edition:
The One "Must Have"
Book on C --
A Comprehensive
Desktop Reference
Covers ANSI C

The spine says, in big letters (about the same size as the text "the
complete reference", but written in white-on-red to make it more
visible) "covers ANSI C". The back cover likewise asserts that the
book "Covers ANSI C".

The copyright date is 1995. According to the Preface:
When the second edition [of this book] was prepared, the ANSI C
standard had just been adopted. Today, standard C code is
simply a given. (And, with standardization the promise of truly
portable C code was finally fulfilled.)

The book claims repeatedly to cover, and focus on, ANSI C.

Whether it should or not, or whether it lives up to those claims, are
separate questions. However, as usual, Nilges is utterly and delusionally
wrong -- he has mistaken his own prejudices for those of his idol. In
fact, the C standard had been in widespread use for nearly six years
when the third edition was written.

-s
 
S

spinoza1111

Actually, for once, Nilges is entirely correct (though almost certainly
by coincidence).

I have maintained for some time a padded resume.

http://www.seebs.net/res-p.html

As the parent page says:

        I was once told you can't get hired if you don't have a padded
        resume. Here's mine.

Example listings:

        Apple Computer
        Product Tester (1988-present)
        * Tested products after shipment.
        * Funded company.

As you might expect, literally true...

This is quite a level of dishonesty. You might think you're fucking
around, and were your resume only to damage corporations, I wouldn't
necessarily have a problem with it.

However, people who padded their resumes at Bell-Northern Research
when I was there from 1981 to 1986 had of necessity to backstab
coworkers, such as a highly skilled programmer-manager whose reports
ganged up on her because she not only expected them to be on time, but
to submit structured code (which would not include switch statements
with fallthrough).

Listen, at 40, you need to grow up. You're damaging people and abusing
clc and clcm to pad your resume, and this harms people who are all I
care about. This situation is escalating; I have contacted Apress and
will take further steps as needed. You can END IT at any time by
removing "C: the Complete Nonsense" and replacing it with an apology.
Actually, it is the case that several of the errors cited were indeed
corrected in the 4th edition.  I don't have any reason to believe that
Nilges has a copy of the 4th edition on which to base his claim, but
he happens to be right.

Which is all the more reason for you to remove the web page. You need
to redo it for the fourth edition, and this time, we need to see all
of what you claim to be errors. If as you say the page was intended to
be a service to prospective buyers, they need you to do your homework
this time.

Furthermore, your new Web page must be a wiki or blog with open
comments because you simply do not know how to separate your opinions
from facts.

I understand that this is a lot of work. Alternatively, simply post an
apology at the original page site. If the site is pulled and an
apology is posted, I will no longer discuss this issue.

Wow, someone who can make an adverb out of ghastly telling Schildt how
to write. Ghastly.
On the contrary, it would have been absurd not to.

We can resolve this easily.

From the front cover of C:TCR 3rd Edition:
        The One "Must Have"
        Book on C --
        A Comprehensive
        Desktop Reference
        Covers ANSI C

The spine says, in big letters (about the same size as the text "the
complete reference", but written in white-on-red to make it more
visible) "covers ANSI C".  The back cover likewise asserts that the
book "Covers ANSI C".

The copyright date is 1995.  According to the Preface:
        When the second edition [of this book] was prepared, the ANSI C
        standard had just been adopted.  Today, standard C code is
        simply a given.  (And, with standardization the promise of truly
        portable C code was finally fulfilled.)

The book claims repeatedly to cover, and focus on, ANSI C.

Whether it should or not, or whether it lives up to those claims, are
separate questions.  However, as usual, Nilges is utterly and delusionally
wrong -- he has mistaken his own prejudices for those of his idol.  In
fact, the C standard had been in widespread use for nearly six years
when the third edition was written.

The book jacket was not under Herb's control, and it means partial
coverage because in 1995 C existed (and it exists today) in multiple
dialects.

You don't understand how a proper standard would work. It would not
have introduced "sequence points" nor would it have left actual
parameter evaluation undefined because then the standard is as a non-
deterministic finite automaton with respect to a DFA. Interesting from
a theoretical viewpoint but useless in practice.

It's like taking the mathematical union of English and Chinese such
that your language is "the set of all statements valid in English or
Chinese". This would be called "Chinglish" but for the fact that that
already names a creole with the vocabulary of English and the grammar
of Chinese. It's a useless definition in practice, a mathematical
stunt valid only in formal language theory.

I have no brief here for McGraw Hill's marketers who stamped "ansi" on
a lot of books to sell them, without getting author feedback, any more
for the treatment of authors by such companies and SAMS, which jailed
a friend of mine for setting up a critical web site. The issue is the
personal harm to Schildt, his reputation, and his family.
 
S

spinoza1111

Which is funny, because I already posted a clear answer to that question
some hours ago.  It is indeed based on the third edition.  The second
had more errors, and I have never seen the first, but I've been told it
was even worse.

Lack of diligence+malice+harm == libel.
 
S

spinoza1111

Actually, for once, Nilges is entirely correct (though almost certainly
by coincidence).

I have maintained for some time a padded resume.

http://www.seebs.net/res-p.html

As the parent page says:

        I was once told you can't get hired if you don't have a padded
        resume. Here's mine.

Example listings:

        Apple Computer
        Product Tester (1988-present)
        * Tested products after shipment.
        * Funded company.

As you might expect, literally true...

Hmm:

* It's OK for you to so obviously pad. I mean, ha ha, we all "get"
it: you've bought and used Apple computers and you've bought stock.
All of us in the in-group grok it.

* But it's also OK for you to waste, not the time of corporations (I
don't give a **** about corporations) but of HR people who are
punished for not finding enough candidates...who don't walk in like
you would walk in I'd hasard, in a dirty T-shirt, to fail a simple
(but o so flawed in your superior mind) test in C.

* It's also OK for you on the job to cover up for your lack of
programming skill to backstab coworkers.

OK, so my fat pal Adorno is off-topic. Jaron Lanier is a modern
computer scientist, and he charges clowns like you with a completely
exaggerated notion of your intellects coupled with what he calls the
ideology of VIOLATION.

What is the "ideology of violation"?

It is the belief of people who are, or in your case think they are, of
such "superior intellect" that they can play tricks on people who are
(often for racist reasons) considered by them to be of "inferior
intellect".

Jig's up, ASSHOLE. This situation is escalating. End.it.now. Remove
CTCN and post an apology for the harm you have done.
Nilges was invited to provide evidence to support his wildly spurious
claim, but he refused.

Actually, it is the case that several of the errors cited were indeed
corrected in the 4th edition.  I don't have any reason to believe that
Nilges has a copy of the 4th edition on which to base his claim, but
he happens to be right.
typename functionname(parameterlist) means that functionname is a
function that has the type "function taking parameterlist and returning
typename". It does not mean that functionname has the type typename. To
say that it does mean that is, at best, a spurious and ill-considered
shortcut and, at worst, ghastlily wrong.
Ayup.

On the contrary, it would have been absurd not to.

We can resolve this easily.

From the front cover of C:TCR 3rd Edition:
        The One "Must Have"
        Book on C --
        A Comprehensive
        Desktop Reference
        Covers ANSI C

The spine says, in big letters (about the same size as the text "the
complete reference", but written in white-on-red to make it more
visible) "covers ANSI C".  The back cover likewise asserts that the
book "Covers ANSI C".

The copyright date is 1995.  According to the Preface:
        When the second edition [of this book] was prepared, the ANSI C
        standard had just been adopted.  Today, standard C code is
        simply a given.  (And, with standardization the promise of truly
        portable C code was finally fulfilled.)

The book claims repeatedly to cover, and focus on, ANSI C.

Whether it should or not, or whether it lives up to those claims, are
separate questions.  However, as usual, Nilges is utterly and delusionally
wrong -- he has mistaken his own prejudices for those of his idol.  In
fact, the C standard had been in widespread use for nearly six years
when the third edition was written.

-s
 
S

spinoza1111

On Apr 4, 4:15 pm, Seebs <[email protected]> wrote:

This matter has become very time consuming, perhaps for all concerned.
Therefore, unilaterally, I'm going to declare a temporary "cease fire"
in order for people to have time to study my document and let cooler
heads prevail.

I will stop posting and reading until Sunday 11 April China time.

I still propose that Peter Seebach undertake to remove "C: the
Complete Nonsense" based on its lack of valid and sufficient content
in proportion to the damage it has done, and to replace it with an
apology for the considerable misunderstanding it has created. I waive
his having to apologize to me for the considerable harm he has done
me.

If Seebach undertakes to do both before 11 April, I would appreciate
his notifying me of this decision and undertaking by email to
(e-mail address removed).

If this is not done, I will have to continue this matter, with
escalation to the next level.

Edward G. Nilges
 
S

Seebs

You're not supposed to be shooting in the first place, bozo - you're
supposed to be learning.

Well, yes. But since he's the only person attacking, he's the only person
who can declare a "cease fire".
I don't see why anyone would want to do that. It's nonsense, and a waste
of time.

Exactly. It's not something anyone's going to bother "studying", because
even the first casual glance reveals it to be utter nonsense. It walks a
fine line between "wrong" and "not even wrong".
I doubt that very much.

Yeah, the guy who floods SRQ with garbage does the same thing, announces
that he's stopping for a while, then decides that he has to start posting
again anyway.

-s
 
J

John Bode

Which is funny, because I already posted a clear answer to that question
some hours ago.  It is indeed based on the third edition.  The second
had more errors, and I have never seen the first, but I've been told it
was even worse.

I had a copy of the 1st edition; it went into the trash by the end of
the semester. The main problem I had with it was that half of the
examples wouldn't compile, and half of the ones that did compile had
runtime problems. I asked one of my professors if the problem was me
or the book; he agreed that the book was the problem, and, in his
words, that Schildt didn't know the language half as well as he
claimed.

Part of the problem was that the book was *extremely* DOS-centric (I
was working on VMS, so of course CC would bail as soon as it saw
#include <conio.h>), but there were problems beyond that.

Shortly after that I got Harbison & Steele, 2nd edition, and even
though I couldn't immediately understand all of it, it quickly became
my primary reference.

I've thumbed through the 4th edition of C:TCR in bookstores; I haven't
found the kinds of egregious errors that riddled the 1st edition, but
that's not exactly a ringing endorsement.
 
B

blmblm

The text is on wordpress at

http://spinoza1111.wordpress.com/20...hildt-an-analysis-of-c-the-complete-nonsense/

For your convenience in making comments, here is the same text in
ASCII format.

FSVO "ASCII" (i.e., not the 7-bit version).
In the Matter of Herb Schildt: an Analysis of "C: the Complete
Nonsense

Let's now deconstruct Peter Seebach's document "C: the Complete
Nonsense", an attack on Herb Schildt's first edition of "C: the
Complete Reference" which in becoming the sole source of subsequent
claims that Schildt wrote "bad books", which unfairly damaged his good
name. Let's examine it, line by line.

Others have commented on various parts of critique. I'll try to
address only points that I don't think have been made already.

[ snip ]
p. 53

printf("%f", sizeof f);
printf("%d", sizeof(int));

Seebach: "Clearly wrong; sizeof is not a double or float. It is also
not an int; it is an unsigned integral type, thus, one of unsigned
char, unsigned short,unsigned int, or unsigned long."

"The only safe way to do this is: printf("%lu", (unsigned long)
sizeof(int)); while this is larger, a clear explanation of why it is
required will go a long way towards helping people understand C."

Although I do not know why Herb used %f and %d format codes, he did
know, as Seebach seems not to, that all ints are floats and all floats
are doubles in well-structured languages.

On many systems, of course, integers and floating-point values
are represented differently. In that sense, ints are *not*
floats, and even a claim that any int can be represented as,
or converted to, a float depends on the relative sizes of the
two types; if they are the same (as for example they are in Java
[*]), there will be some values that can be exactly represented
as ints but not as floats.

[*] Whether Java meets your criteria for "well-structured language" --
<shrug>

[ snip ]
Page 163

Schildt: "You may also declare main() as void if it does not return a
value."

Seebach: "Specifically untrue. ANSI mandates two declarations for
main, and says that main may have declarations compatible with those.
Both return int."

C was not standardized at the time this book was written, it existed
in several different dialects. In fact, I discovered (on behalf, as it
happens, of John "A Beautiful Mind" Nash) that the Microsoft compiler,
which many of Schildt's readers were using, is nonstandard at least as
regards the evaluation of compile-time constant expressions. While it
has become a Shibboleth or Secret Handshake among non-Microsoft
Illuminati that you must declare main as int, it's actually better
style to make it void unless you have an important message, such as
"up yours!" to the OS.

But this shibboleth has become an article of faith amongst the anti-
Microsoft crowd who compensate for the meaninglessness of their lives
and general incompetence by fantasizing that they are Special, and the
OS gives a hoot.

It may be that all(?) of the ways of invoking a program in a
Windows environment ignore its return value. This is not the
case in all operating systems:

Command shells for UNIX-like systems may (usually do?) provide
access to the return value via an environment variable, and some
shell scripts make use of it. Other mechanisms for invoking
programs (e.g., fork/exec*/waitpid) also provide access to the
return code.

And didn't JCL for the venerable IBM OS/VS operating system(s) use
the value returned by a called program to control execution flow?
That's how I remember it anyway.

To me it seems like good practice to write code that complies with
the requirements of as many environments as possible. <shrug>

[ snip ]
Hitler was not anonymous; but his followers were, in many cases. And
Mike Godwin is wrong; the probability of comparision to Hitler in
online discussions "converges to unity" not because people are being
shrill and foolish, but because Hitler is our inner troll, as Lanier
calls it. He's the face in the crowd in Munich in August 1914 baying
for war who yearns to be on the podium, and non-anonymous.

Actually I should have been able to deduce Fascism from the memory of
my childhood.

Your childhood? my, you must be older than I thought ....

[ snip ]
occurring?

but you remembered to double the "r" this time ....

[ snip ]
embarrassed

and here

[ snip ]
In Fascism, the nightmare of childhood has
realized itself.

Theodore Wiesengrund Adorno, Minima Moralia, 1948

*OH!* Those weren't your words, were they? Well, perhaps there
were quotation marks, or indentation, or something identifying this
text as a quotation in the version of this review posted at wordpress.
 
J

John Bode

[snip]
p. 53

printf("%f", sizeof f);
printf("%d", sizeof(int));

Seebach: “Clearly wrong; sizeof is not a double or float. It is also
not an int; it is an unsigned integral type, thus, one of unsigned
char, unsigned short,unsigned int, or unsigned long.”

“The only safe way to do this is: printf(“%lu”, (unsigned long)
sizeof(int)); while this is larger, a clear explanation of why it is
required will go a long way towards helping people understand C.”

Although I do not know why Herb used %f and %d format codes, he did
know, as Seebach seems not to, that all ints are floats and all floats
are doubles in well-structured languages.

It's not a matter of whether ints are subsets of floats. It's a matter
of how the printf() function expects conversion specifiers and the
types of the corresponding arguments to match. If you tell printf()
you're going to pass it a value of one type but actually pass a value
of a different type (with a different size and/or representation),
then you're not going to get the correct output.
Because at the time and
even, to an extent, now, C was almost as diverse of the languages of
China, Herb used the educated programmer’s maxim, which is to first
code as if the compiler writers and language designers knew at least
as much as the intelligent programmer, and fix problems later.

Don't waste the energy trying to defend this snippet; you'll hurt
yourself. This kind of error is just plain sloppiness/carelessness on
Schildt's part. Even at their most fractured (which was nowhere near
what you suggest), the various implementations of C defined the same
interface for printf(). printf("%f", sizeof f) wasn't going to work
*anywhere*.

This was an honest-to-God mistake on Schildt's part. Deal with it and
move on.
 
S

spinoza1111

Well, yes.  But since he's the only person attacking, he's the only person
who can declare a "cease fire".

No, I have agreement on the essentials from two others here.

Keep in mind that you and Heathfield et al. are of cardinality
approximately equal to 10e1 and that your consensus is for this reason
statistically meaningless.
Exactly.  It's not something anyone's going to bother "studying", because
even the first casual glance reveals it to be utter nonsense.  It walks a
fine line between "wrong" and "not even wrong".

That makes no sense. Is this why you failed to take computer science?
Did you take a first casual glance at the big textbook for CS101 and
decide it was nonsense?

Peter, I've done you the real courtesy you should have done Schildt,
of a thorough analysis of CTCN. If you felt as strongly as you do that
Schildt was in error in a special, extraordinary way, then like me,
you needed to post, in place of what you posted, a line by line, error
by error analysis. But it appears to me that you have a habit of
making "snap" judgements about people and books.
Yeah, the guy who floods SRQ with garbage does the same thing, announces
that he's stopping for a while, then decides that he has to start posting
again anyway.

Indeed, I have rejoined the discussion a little early to prevent
attacks on McClean and Navia, who have taken a position that software
and book authors shouldn't have to deal with trivial and poorly
written attacks.

And, once again: people who cannot make valid arguments on the Net
typically start raving about SOME OTHER poster or coworker. This is a
new form of the logical fallacy of argument from false analogy.

You can end this by removing CTCN and replacing it with an apology.
 
S

spinoza1111

Not for me. It took me a couple of hours last night to catch up with
about 400 clc articles posted over this last week or so, and a few
minutes to reply to a few of them.


You're not supposed to be shooting in the first place, bozo - you're
supposed to be learning.


I don't see why anyone would want to do that. It's nonsense, and a waste
of time.


I doubt that very much.

I was surprised to find a buy in so quickly from McClean and Navia,
and I would like to defend their good names as well as that of Schildt
and me.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,754
Messages
2,569,528
Members
45,000
Latest member
MurrayKeync

Latest Threads

Top