Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.c > #75150

Re: Program to sort three integers

From "Bill Davy" <Bill@SynectixLtd.com>
Newsgroups comp.lang.c
Subject Re: Program to sort three integers
Date 2015-11-06 18:30 +0000
Message-ID <da49tmFrah7U1@mid.individual.net> (permalink)
References <8dcd1ed2-2734-4cff-b013-d713a33100ed@googlegroups.com> <n1ilap$85f$1@dont-email.me>

Show all headers | View raw


"Richard Heathfield" <rjh@cpax.org.uk> wrote in message 
news:n1ilap$85f$1@dont-email.me...
> On 06/11/15 16:20, Alla _ wrote:
>> Hello!
>>
>> Here is the description of the task:
>>
>> Write a function called sort() to sort three integers into ascending 
>> order. (This function is not to be implemented with arrays.)
>
> Okay, let's start off by implementing it correctly, so that we have 
> something to compare against:
>
> #include <stdio.h>
>
> void swap(int *left, int *right)
> {
>   int tmp = *left;
>   *left = *right;
>   *right = tmp;
> }
>
> void sort(int *a, int *b, int *c)
> {
>   if(*a > *b)
>   {
>     swap(a, b);
>   }
>   /* The value at *a is now smaller than that at *b */
>   if(*b > *c)
>   {
>     swap(b, c);
>   }
>   /* The value at *c is now definitely the biggest, but *b
>      could now hold a value smaller than *a, so check again. */
>   if(*a > *b)
>   {
>     swap(a, b);
>   }
> }
>
> int main(void)
> {
>   int i = 3;
>   int j = 1;
>   int k = 9; /* your own data */
>
>   printf("Before: %d %d %d\n", i, j, k);
>
>   sort(&i, &j, &k);
>
>   printf(" After: %d %d %d\n", i, j, k);
>
>   return 0;
> }
>
> Result:
>
> Before: 3 1 9
>  After: 1 3 9
>
> So now let's take a look at your code:
>
> <snip>
>
>> Allas-MacBook-Pro:ch10 Alla$ gcc -Wall -Wextra -std=c99 -pedantic -o 
>> ex10-8 ex10-8.c
>
> When I compiled this, I was told:
>
> alla.c: In function ‘sort’:
> alla.c:72:11: warning: ‘value_3’ is used uninitialized in this function 
> [-Wuninitialized]
>      printf("%i %i %i\n", *value_1, *value_2, *value_3);
>            ^
> alla.c:72:11: warning: ‘value_2’ is used uninitialized in this function 
> [-Wuninitialized]
> alla.c:72:11: warning: ‘value_1’ is used uninitialized in this function 
> [-Wuninitialized]
>
> And that's your problem right there.
>
> If you kick it hard enough, the compiler will give you all kinds of useful 
> information.
>
>> Allas-MacBook-Pro:ch10 Alla$ ./ex10-8
>> Bus error: 10
>>
>> Second version has printf within the main function, also compiles, and
>> produces the same bus error.
>>
>> 1)
>> // Program to sort three integers using pointers
>>
>> #include <stdio.h>
>>
>> void sort (int* a, int* b, int* c);
>>
>> int main(void)
>> {
>>      int one = 3;
>>      int two = 1;
>>      int three = 9;
>>
>>      sort(&one, &two, &three);
>>
>>      return 0;
>> }
>>
>> void sort (int* a, int* b, int* c)
>> {
>>      int* value_1;
>>      int* value_2;
>>      int* value_3;
>
> These are pointers-to-int. You can use them for pointing to ints, but at 
> present you haven't pointed them anywhere. Their values are 
> "indeterminate", which means we don't know what those values are. That is, 
> we have no guarantee that they are pointing anywhere useful or safe.
>
>>      if (*a < *b)
>>      {
>>          if (*a < *c)
>>          {
>>              *value_1 = *a;
>
> So, here, we take the value of the int pointed to by a, and copy it 
> into... where? value_1 isn't pointing to any int that we own. This is 
> almost certainly the reason for your "bus error". Whatever indeterminate 
> value is scribbled into that object is not aligned correctly for 
> addressing an int. (It may not be this one, of course - it might be 
> *value_2 or *value_3, but certainly at least one of these is the culprit.)
>
> Never Write Through A Pointer Unless You Know Where It Is Pointing!
>
>> 2)
>> // Program to sort three integers using pointers
>
> <snip>
>
>>      int* value_1;
>>      int* value_2;
>>      int* value_3;
>>
>>      if (*a < *b)
>>      {
>>          if (*a < *c)
>>          {
>>              *value_1 = *a;
>
> Same problem.
>
>> Truly unexpected: by now I should have already been able to solve
>> such easy tasks.
>
> You made it too complicated, that's all. Why did you make value_1, 
> value_2, and value_3 pointers? What was wrong with making them ints?
>
>> I am doing my best to get too disappointed with
>> myself, and I do hope for your patience and help.
>
> You're doing fine, but you need to go slower and listen more.
>
>> Another important issue which both versions have revealed again:
>> I do not understand how to make a function return several values;
>
> Neither do I. If you find out, let me know.
>
> Actually, there is a way, using an aggregate data structure, or better 
> still a pointer to it, but I wouldn't bother worrying about that for now. 
> At present, you have more important things to worry about.
>
> -- 
> Richard Heathfield
> Email: rjh at cpax dot org dot uk
> "Usenet is a strange place" - dmr 29 July 1999
> Sig line 4 vacant - apply within

void Sort2(int *pa, int *pb)
    {
    if ( *pa > *pb )
        {
        const  int tmp = *pa;
        *pa = *pb;
        *pb = temp;
        }
    // *pb now greater than or equal to *pb
    }

void Sort3(int *p1, int *pb, int *pc)
    {
    Sort2(pa,pb); Sort2(pb,pc); // Biggest now in *pc
    Sort2(pa,pb). // Smallest in *pa
    }

If later you need a SortN(...) then it might be worth optimisng things.

Back to comp.lang.c | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread


Thread

Program to sort three integers Alla _ <modelling.data@gmail.com> - 2015-11-06 08:20 -0800
  Re: Program to sort three integers Eric Sosman <esosman@comcast-dot-net.invalid> - 2015-11-06 11:32 -0500
    Re: Program to sort three integers Alla _ <modelling.data@gmail.com> - 2015-11-07 00:20 -0800
      Re: Program to sort three integers Ben Bacarisse <ben.usenet@bsb.me.uk> - 2015-11-07 11:04 +0000
  Re: Program to sort three integers "Osmium" <r124c4u102@comcast.net> - 2015-11-06 10:34 -0600
  Re: Program to sort three integers "Rick C. Hodgin" <rick.c.hodgin@gmail.com> - 2015-11-06 08:37 -0800
    Re: Program to sort three integers supercat@casperkitty.com - 2015-11-06 10:36 -0800
      Re: Program to sort three integers Richard Heathfield <rjh@cpax.org.uk> - 2015-11-06 19:17 +0000
        Re: Program to sort three integers supercat@casperkitty.com - 2015-11-06 11:30 -0800
        Re: Program to sort three integers Alla _ <modelling.data@gmail.com> - 2015-11-07 01:01 -0800
      Re: Program to sort three integers "Rick C. Hodgin" <rick.c.hodgin@gmail.com> - 2015-11-06 11:48 -0800
        Re: Program to sort three integers David Brown <david.brown@hesbynett.no> - 2015-11-06 23:15 +0100
          Re: Program to sort three integers "Rick C. Hodgin" <rick.c.hodgin@gmail.com> - 2015-11-06 14:39 -0800
          Re: Program to sort three integers Keith Thompson <kst-u@mib.org> - 2015-11-06 15:57 -0800
      Re: Program to sort three integers Nick Bowler <nbowler@draconx.ca> - 2015-11-06 22:33 +0000
  Re: Program to sort three integers Ben Bacarisse <ben.usenet@bsb.me.uk> - 2015-11-06 16:39 +0000
    Re: Program to sort three integers Alla _ <modelling.data@gmail.com> - 2015-11-07 00:22 -0800
  Re: Program to sort three integers Richard Heathfield <rjh@cpax.org.uk> - 2015-11-06 16:45 +0000
    Re: Program to sort three integers "Bill Davy" <Bill@SynectixLtd.com> - 2015-11-06 18:30 +0000
    Re: Program to sort three integers Keith Thompson <kst-u@mib.org> - 2015-11-06 11:36 -0800
      Re: Program to sort three integers Bartc <bc@freeuk.com> - 2015-11-06 19:50 +0000
        Re: Program to sort three integers Keith Thompson <kst-u@mib.org> - 2015-11-06 12:52 -0800
          Re: Program to sort three integers Jorgen Grahn <grahn+nntp@snipabacken.se> - 2015-11-09 13:36 +0000
            Re: Program to sort three integers David Brown <david.brown@hesbynett.no> - 2015-11-09 15:41 +0100
          Re: Program to sort three integers raltbos@xs4all.nl (Richard Bos) - 2015-11-10 16:56 +0000
            Re: Program to sort three integers Keith Thompson <kst-u@mib.org> - 2015-11-10 09:11 -0800
            Re: Program to sort three integers supercat@casperkitty.com - 2015-11-10 09:15 -0800
            Re: Program to sort three integers Les Cargill <lcargill99@comcast.com> - 2015-11-10 19:37 -0600
      Re: Program to sort three integers asetofsymbols@gmail.com - 2015-11-06 11:52 -0800
        Re: Program to sort three integers Bartc <bc@freeuk.com> - 2015-11-06 20:01 +0000
          Re: Program to sort three integers asetofsymbols@gmail.com - 2015-11-06 12:21 -0800
          Re: Program to sort three integers "Osmium" <r124c4u102@comcast.net> - 2015-11-06 14:23 -0600
      Re: Program to sort three integers Ben Bacarisse <ben.usenet@bsb.me.uk> - 2015-11-06 20:58 +0000
      Re: Program to sort three integers Mark Storkamp <mstorkamp@yahoo.com> - 2015-11-06 16:04 -0600
        Re: Program to sort three integers Mark Storkamp <mstorkamp@yahoo.com> - 2015-11-06 16:08 -0600
          Re: Program to sort three integers Ben Bacarisse <ben.usenet@bsb.me.uk> - 2015-11-06 22:49 +0000
            Re: Program to sort three integers Tim Rentsch <txr@alumni.caltech.edu> - 2015-11-10 16:04 -0800
              Re: Program to sort three integers Ben Bacarisse <ben.usenet@bsb.me.uk> - 2015-11-11 21:51 +0000
          Re: Program to sort three integers bartekltg <bartekltg@gmail.com> - 2015-11-11 23:50 +0100
        Re: Program to sort three integers Ben Bacarisse <ben.usenet@bsb.me.uk> - 2015-11-06 22:52 +0000
          Re: Program to sort three integers Ben Bacarisse <ben.usenet@bsb.me.uk> - 2015-11-07 01:17 +0000
      Re: Program to sort three integers Alla _ <modelling.data@gmail.com> - 2015-11-07 01:24 -0800
        Re: Program to sort three integers Chad <cdalten@gmail.com> - 2015-11-07 02:04 -0800
    Re: Program to sort three integers Alla _ <modelling.data@gmail.com> - 2015-11-07 00:57 -0800
  Re: Program to sort three integers Barry Schwarz <schwarzb@dqel.com> - 2015-11-06 10:14 -0800
    Re: Program to sort three integers Richard Heathfield <rjh@cpax.org.uk> - 2015-11-06 18:27 +0000
  Re: Program to sort three integers Tim Rentsch <txr@alumni.caltech.edu> - 2015-11-06 11:22 -0800
    Re: Program to sort three integers Alla _ <modelling.data@gmail.com> - 2015-11-07 01:15 -0800
  Re: Program to sort three integers Malcolm McLean <malcolm.mclean5@btinternet.com> - 2015-11-07 00:57 -0800
  Re: Program to sort three integers bartekltg <bartekltg@gmail.com> - 2015-11-10 02:07 +0100

csiph-web