qsort

R

Ron Ford

qsort() is a function in C's Standard library, available
for use in all hosted implementations.

What's an "intrinsic?"

An intrinsic is something that comes with the food in a given syntax.

One of my intrinsics is that I like Hillary. Your mileage may vary.

I don't see qsort in K&R as I leaf through or in the index. Did I
photograph the wrong target when I thought to have read of qsort in K&R?
 
V

vippstar

An intrinsic is something that comes with the food in a given syntax.

No it's not.
One of my intrinsics is that I like Hillary. Your mileage may vary.
Nonsense.

I don't see qsort in K&R as I leaf through or in the index. Did I
photograph the wrong target when I thought to have read of qsort in K&R?

Photograph the wrong target? nonsense.
Which K&R? See Appendix B in K&R2.
 
R

Ron Ford

No it's not.


Photograph the wrong target? nonsense.
Which K&R? See Appendix B in K&R2.

So we have vippstar, who broke his clc cherry to respond to me.

The appendices in K&R are numbered.

Your tjas are too.
 
R

Ron Ford

If by "number" you mean A, B, and C then yes. My own K&R second edition
shows nice "qsort function" and "qsort library function" lines in the
index at the end of the book.

I see it now, beginning §4.10.

Dankenstein,
 
R

Richard Bos

What's an "intrinsic?"

The term is used in Fortran and elsewhere; it means that the
function in question is an intrinsic part of the language in
contrast to being part of a library.[/QUOTE]

"A" library, or _the_ Standard Library? Languages which use the term
"intrinsic" usually don't distinguish between those two. C does.
So, no, qsort is not an intrinsic; if it were you wouldn't need
to include stdlib.h nor would you need to link in the standard
library.

OTOH, qsort _is_ an intrinsic; if it weren't, you couldn't depend on it
existing in every conforming hosted implementation, on any system.
Nor could you write your own qsort and use it, either by omitting to
include stdlib.h, or by simply replacing qsort in the standard library.

Guess what: despite the shoot-your-own-foot permission some
implementations may give you, the Standard doesn't guarantee that you
can do that, either.

Richard
 
C

Chris Torek

You can have intrinsics and still have a standard library. Some
languages do. Regardless, if something is an intrinsic you don't
need a library to get it.

That last seems like an odd statement to me, given that (e.g.) the
Fortran systems I have used have relied on a library (the one
automatically included by the "fort" or "f66" or "f77" or whatever
front-end command) to supply the code for most of the various
intrinsics.

(For that matter, the "standard C library" normally does not require
special link options when using the usual front-end commands. The
"-lm" flag to cc/gcc is the glaring annoying exception to this rule.)
Guess what: despite the shoot-your-own-foot permission some
implementations may give you, the Standard doesn't guarantee that you
can [use your own qsort], either.

Quite true, but beside the point. It is not even potentially
possible for intrinsics, since they aren't in libraries.

Again, in a number of those Fortran systems, it was easy to use
your own code for intrinsics, simply by adding the appropriate
object or library file to the link line (as the default Fortran
library was linked at the end). As in C, this was rarely if ever
officially supported, and sometimes the call you expected got
short-circuited, so (just as with C systems) you had to know what
you were doing. But it was more than just "potentially possible":
sometimes we even did it (to use special instructions, or work
around an implementation bug).
 
R

Ron Ford

That last seems like an odd statement to me, given that (e.g.) the
Fortran systems I have used have relied on a library (the one
automatically included by the "fort" or "f66" or "f77" or whatever
front-end command) to supply the code for most of the various
intrinsics.

(For that matter, the "standard C library" normally does not require
special link options when using the usual front-end commands. The
"-lm" flag to cc/gcc is the glaring annoying exception to this rule.)

Thanks, Chris, there is definitely a useful contrast here between C and the
common extension that is fortran. I'm reconfiguring my mingw C capability
but think I can call qsort from another syntax. Since C is likely to be
under the hood of many syntaxes that can call C, I wanted to see how to do
this thing that I think is important.

Calling it from a place without every C99 guarantee is a bit of a trick:

%- > Is qsort an intrinsic for C?
%-
%- Yes, but despite the name it isn't guaranteed to
%- implement quicksort.
%-
%- The advantage is that it can sort an array of any kind
%- of data structure given a pointer to the array (usual
%- for C), the length, the length of each array element
%- (which must be in contiguous storage), and a comparison
%- function. The comparison function is given pointers to
%- two elements and returns a positive, zero, or negative
%- value if the first is greater then, equal to, or less
%- than the second. With the appropriate compare function
%- the array can be an array of pointers, or structures
%- containing pointers.
%-
%- To do that in Fortran 2003 might also require a routine
%- to copy such array elements.

Is Glen (quoted) correct?

Guess what: despite the shoot-your-own-foot permission some
implementations may give you, the Standard doesn't guarantee that you
can [use your own qsort], either.

Quite true, but beside the point. It is not even potentially
possible for intrinsics, since they aren't in libraries.

Again, in a number of those Fortran systems, it was easy to use
your own code for intrinsics, simply by adding the appropriate
object or library file to the link line (as the default Fortran
library was linked at the end). As in C, this was rarely if ever
officially supported, and sometimes the call you expected got
short-circuited, so (just as with C systems) you had to know what
you were doing. But it was more than just "potentially possible":
sometimes we even did it (to use special instructions, or work
around an implementation bug).

I guess the notion of keyword is less sacred in the non C world. They say
you just change what the linker finds first.
 
C

Chris Torek

Thanks, Chris, there is definitely a useful contrast here between C and the
common extension that is fortran. I'm reconfiguring my mingw C capability
but think I can call qsort from another syntax. Since C is likely to be
under the hood of many syntaxes that can call C, I wanted to see how to do
this thing that I think is important.

I have no idea what you mean by this, so I will ignore it.
Calling it from a place without every C99 guarantee is a bit of a trick:

%- > Is qsort an intrinsic for C?
%-
%- Yes, but despite the name it isn't guaranteed to
%- implement quicksort.
%-
%- The advantage is that it can sort an array of any kind
%- of data structure given a pointer to the array (usual
%- for C), the length, the length of each array element
%- (which must be in contiguous storage), and a comparison
%- function. The comparison function is given pointers to
%- two elements and returns a positive, zero, or negative
%- value if the first is greater then, equal to, or less
%- than the second. With the appropriate compare function
%- the array can be an array of pointers, or structures
%- containing pointers.
%-
%- To do that in Fortran 2003 might also require a routine
%- to copy such array elements.

Is Glen (quoted) correct?

I assume by "(quoted)" you refer to the statements marked "%-"
here.

The first statement (that it is an "intrinsic") is correct *if*
"intrinsic" means, as I would assume in this case, "the compiler
is allowed to recognize the name, and make assumptions about it,
e.g., replacing the call with inline code so that no library routine
is called". The part of the statement that says it is not guaranteed
to implement (Hoare's) Quick Sort is true unconditionally.

(If "intrinsic" means "something that need not use normal function
call syntax" -- as is true of Fortran's power operator, for instance,
even though A**B may call a library routine -- then this part of the
statement is false. There may be several other things people mean
by the word "intrinsic", depending on what language(s) they have
used. For instance, SNOBOL's string operations and success/fail
behavior could be considered its "intrinsics". Under most of these
meanings, I believe C's qsort() would not be an "intrinsic".)

The second part of the statement, about the advantage, is true.
(But there is a constraint on the comparison function: it must be
consistent. That is, the result of (*compar)(A,B) must stay the
same from call to call when A and B indicate the same element,
even if that element moves within the array.)

The third part of the statement, concerning Fortran 2003: I have
no idea. The last time I used Fortran was pre-1990.

[Regarding substituting for "library"-section functions, i.e., stuff
described in section 7 of the C Standard:]
I guess the notion of keyword is less sacred in the non C world.
They say you just change what the linker finds first.

Be careful when talking with "them". :)

As was the case with Fortran through the 1980s at least, this only
*sometimes* works. For instance, with gcc:

#include <stdio.h>

int main(void) {
printf("hello world\n");
return 0;
}

does not always call the library printf() routine. (Sometimes it
calls the library puts() routine, depending on optimization options.)

Similarly, "calls" to sqrt() or memcpy() can be replaced, under
some conditions, with inline instructions. So attempts to subvert
the library need not work, and -- unless you know what you are
doing, or verify quite carefully -- some *do* not work, on real
systems.

That said, I do not know of any C implementations that modify calls
to qsort(). Of course, this does not guarantee that none exist.
(Among other things, to cross comp.lang.c threads a bit, I have
never seen or used a [full] C99 implementation. Perhaps one of
those -- several are rumored to exist -- might substitute some
qsort() calls, for instance.)
 
K

Kenny McCormack

Eric Sosman said:
Yes, but this isn't comp.lang.fortran nor alt.st.elsewhere.
Also, you will find that the word "intrinsic" appears nowhere in
the C Standard, not even in non-normative text. I asked the
question to learn what "Ron Ford" thought the word meant, but
learned instead that "Ron Ford" is not worth paying any heed to.

Just how old are you? 8? 10? 12?

Don't you think now might be a good time to do some growing up?

The nice thing about growing up is that you might be able to hold down a
job. Then, you might actually be able to afford a place of your own.
Then (and this is the good part), you won't have to worry anymore about
mommy taking away your computer privileges.
 
K

Kenny McCormack

Richard Harter said:
Quite true; still it isn't really necessary in comp.lang.c to
pretend that the rest of the world doesn't exist. If someone
asks if you can do closures in C, it's not much of an answer to
say that closures aren't defined in the standard.

It is the only acceptable answer here.
 
A

Antoninus Twink

Don't you think now might be a good time to do some growing up?

The nice thing about growing up is that you might be able to hold down
a job.

If you believe his email address, Sossman is employed by Sun. I wonder
what they'd make to someone conducting a hate campaign against Jacob
Navia with their company's name stamped all over it.
 

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

Similar Threads


Members online

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,009
Latest member
GidgetGamb

Latest Threads

Top