Solved

Using qsort()

Posted on 2006-07-01
8
358 Views
Last Modified: 2008-03-03
Hi

I'm having trouble using qsort(). I've tried for a while now & just cant master it.

My code (I've left my debugs in)

int compare( const void *a, const void *b)
      {
      printf("OK C\n");
                return *(char*)a - *(char*)b;
      }

void sorting()
      {
        char *a="string";
        printf("OK A\n");
        qsort(a,strlen(a),1,compare);
        printf("OK B\n");
                 }

The compiler keeps spitting out  OKA OKC OKC then  a segmentation fault(core dumped).

Any ideas??
0
Comment
Question by:Benjamin_Barrett
  • 5
  • 3
8 Comments
 

Author Comment

by:Benjamin_Barrett
ID: 17023830
I forgot to add that the segmentation fault suggests to me that its a pointer issue,  somewhere in compare() .....
0
 
LVL 16

Expert Comment

by:PaulCaswell
ID: 17023919
Hi Benjamin_Barrett,

Just in case, you may like to try:

                return *((char*)a) - *((char*)b);

I cant see anything else wrong. I'll try it.

Paul
0
 

Author Comment

by:Benjamin_Barrett
ID: 17023932
Thanks for your quick response Paul

I tried your suggestion but I still get the same output.

I'll keep trying

Thanks

Benjamin
0
 

Author Comment

by:Benjamin_Barrett
ID: 17024001
Well I tried changing the declaration & intialization of a(the string to sort) to....

char a[10] = "string";

instead of

char *a="string";


And it works!

Clearly this is a pointer issue...Im a Java programmer trying to learn better  C,  so  pointers are a bit heavy going for me.

Any advice on why this worked & how to get it working with a pointer as an argument?
0
U.S. Department of Agriculture and Acronis Access

With the new era of mobile computing, smartphones and tablets, wireless communications and cloud services, the USDA sought to take advantage of a mobilized workforce and the blurring lines between personal and corporate computing resources.

 
LVL 16

Accepted Solution

by:
PaulCaswell earned 500 total points
ID: 17024009
Hi Benjamin_Barrett,

I found it, and that's exactly what I would have suggested.

The problem is that:

char * s = "A String";

puts the string in protected memory and therefore the first attempt that qsort makes to swap two of the characters results in an access violation.

Your method makes the string into an array of bytes that is changeable.

Paul
0
 
LVL 16

Expert Comment

by:PaulCaswell
ID: 17024041
Hi Benjamin_Barrett,

FYI: To turn a char [] into a char*, just use &array[0].

Paul
0
 

Author Comment

by:Benjamin_Barrett
ID: 17024044
Excellent, thats why "OK C" was outputted twice before the fault

Ok, can you help me abit more....

If I have a pointer as an arg, how do I convert it to a non pointer?

I've tried doing declaring a string then making it equal the pointer...

char *a ="test";

char b[5] = a; || char b[5] = &a;

but no dice.

Any suggestions?

Just to let you know Im disappearing for lunch now, so no stress.

Benjamin
0
 

Author Comment

by:Benjamin_Barrett
ID: 17024407
Brilliant Paul!

You only need to access the address of the first element of the array to get the whole thing....

Thank you kindly for your help.

Benjamin

PS We posted @ the same time before, so I just got your last reply
0

Featured Post

Problems using Powershell and Active Directory?

Managing Active Directory does not always have to be complicated.  If you are spending more time trying instead of doing, then it's time to look at something else. For nearly 20 years, AD admins around the world have used one tool for day-to-day AD management: Hyena. Discover why

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
How to design, and implement simple interface 5 134
Problem in finding output of a program 11 101
UPD maximums on Red Hat 6 110
outlook office 365 8 85
Preface I don't like visual development tools that are supposed to write a program for me. Even if it is Xcode and I can use Interface Builder. Yes, it is a perfect tool and has helped me a lot, mainly, in the beginning, when my programs were small…
This is a short and sweet, but (hopefully) to the point article. There seems to be some fundamental misunderstanding about the function prototype for the "main" function in C and C++, more specifically what type this function should return. I see so…
Video by: Grant
The goal of this video is to provide viewers with basic examples to understand and use for-loops in the C programming language.
The goal of this video is to provide viewers with basic examples to understand and use switch statements in the C programming language.

863 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

23 Experts available now in Live!

Get 1:1 Help Now