Re: problem with malloc/realloc. Pls help.

2006-08-22 Thread Omololu
Thanks a lot, Igor  Mark. i was able to rectify the
code to fix the problem. Now it works. (i had to use a
pointer to a pointer to int, rather than just a
pointer to int in the subroutine)

thanks again. 

o.

--- Igor Peshansky [EMAIL PROTECTED] wrote:

 On Mon, 21 Aug 2006, Omololu wrote:
 
  Hi,
   i have the following code. it compiles with gcc
 in Cygwin but the
  contents of the array ifitQ that I get after the
 call to the subroutine
  readCharges2 is gibberish.
 
 This is expected behavior.  Read on.
 
  The code compiles with gcc under Linux and it runs
 correctly. it also
  compiles and runs correctly with windows visual
 studio. Pls help. The
  resuls i get with Cygwin is:
 
  isumNatms = 5
  rrr 13
  rrr 14
  rrr 15
  rrr 16
  *** 1628693268
  *** 1628693268
  *** 16
  *** 1034
 
  instead of:
  isumNatms = 5
  rrr 13
  rrr 14
  rrr 15
  rrr 16
  *** 13
  *** 14
  *** 15
  *** 16
 
  the code is:
 
 Ouch.  Indentation issues aside, you have a bug in
 this program.
 
  #include stdio.h
  #include stdlib.h
 
  void readCharges2(int *, int *, int *);
  int main()
  {
  static int *ifitQ;
  int *ipUniqAtms, *ipindexToFit;
  int j;
  int x,y;
  ipUniqAtms =x;
  ipindexToFit=y;
 ifitQ = (int *)
 malloc(sizeof(int));
 if(ifitQ==NULL){printf(Unable to allocate
 matrix ifitQ\n);
 exit(EXIT_FAILURE);}
 
 readCharges2(ifitQ,ipUniqAtms,ipindexToFit);
 
 Note that ifitQ is passed *by value*, and any
 changes you make to it
 inside readCharges2() will be lost when you come
 back to main.  So, you
 realloc it inside readCharges2(), and store values
 in the new array, but
 in main(), you print the values in the *old* array
 (which are, as you
 said, gibberish, as the memory has been released to
 the system).
 
 for(j=0; j *ipUniqAtms ; j++)
 {
printf(*** %d\n,ifitQ[j]);
 }
 
  return 0;
  }
 
  void readCharges2(int *ifitQ, int * ipUniqAtms,
 int * ipindexToFit)
  {
 int  j, isumNatms=0;
 isumNatms=5;
 printf(isumNatms = %d \n,isumNatms);
 ifitQ = (int *)
 realloc(ifitQ,isumNatms*sizeof(int));
 if(ifitQ==NULL){printf(Unable to allocate
 matrix ifitQ\n);
 exit(EXIT_FAILURE);}
 
 ifitQ[0]=13;
 ifitQ[1]=14;
 ifitQ[2]=15;
 ifitQ[3]=16;
  *ipUniqAtms =  4;
  *ipindexToFit =  3;
 for(j=0; j *ipUniqAtms ; j++)
 {
printf(rrr %d\n,ifitQ[j]);
 }
  }
 
 The reason it probably worked on Linux is because in
 Linux, realloc will
 try hard to keep the array at the same address if it
 can simply bump the
 size of the pointer.  Cygwin's realloc doesn't.
 HTH,
   Igor
 -- 
   http://cs.nyu.edu/~pechtcha/
   |\  _,,,---,,_  [EMAIL PROTECTED] |
 [EMAIL PROTECTED]
 ZZZzz /,`.-'`'-.  ;-;;,_  Igor Peshansky, Ph.D.
 (name changed!)
  |,4-  ) )-,_. ,\ (  `'-' old name: Igor
 Pechtchanski
 '---''(_/--'  `-'\_) fL   a.k.a
 JaguaR-R-R-r-r-r-.-.-.  Meow!
 
 Las! je suis sot... -Mais non, tu ne l'es pas,
 puisque tu t'en rends compte.
 But no -- you are no fool; you call yourself a
 fool, there's proof enough in
 that! -- Rostand, Cyrano de Bergerac
 


* SEEK GOD! ***

--
Unsubscribe info:  http://cygwin.com/ml/#unsubscribe-simple
Problem reports:   http://cygwin.com/problems.html
Documentation: http://cygwin.com/docs.html
FAQ:   http://cygwin.com/faq/



Re: problem with malloc/realloc. Pls help.

2006-08-21 Thread Igor Peshansky
On Mon, 21 Aug 2006, Omololu wrote:

 Hi,
  i have the following code. it compiles with gcc in Cygwin but the
 contents of the array ifitQ that I get after the call to the subroutine
 readCharges2 is gibberish.

This is expected behavior.  Read on.

 The code compiles with gcc under Linux and it runs correctly. it also
 compiles and runs correctly with windows visual studio. Pls help. The
 resuls i get with Cygwin is:

 isumNatms = 5
 rrr 13
 rrr 14
 rrr 15
 rrr 16
 *** 1628693268
 *** 1628693268
 *** 16
 *** 1034

 instead of:
 isumNatms = 5
 rrr 13
 rrr 14
 rrr 15
 rrr 16
 *** 13
 *** 14
 *** 15
 *** 16

 the code is:

Ouch.  Indentation issues aside, you have a bug in this program.

 #include stdio.h
 #include stdlib.h

 void readCharges2(int *, int *, int *);
 int main()
 {
 static int *ifitQ;
 int *ipUniqAtms, *ipindexToFit;
 int j;
 int x,y;
 ipUniqAtms =x;
 ipindexToFit=y;
ifitQ = (int *) malloc(sizeof(int));
if(ifitQ==NULL){printf(Unable to allocate matrix ifitQ\n);
exit(EXIT_FAILURE);}
 readCharges2(ifitQ,ipUniqAtms,ipindexToFit);

Note that ifitQ is passed *by value*, and any changes you make to it
inside readCharges2() will be lost when you come back to main.  So, you
realloc it inside readCharges2(), and store values in the new array, but
in main(), you print the values in the *old* array (which are, as you
said, gibberish, as the memory has been released to the system).

for(j=0; j *ipUniqAtms ; j++)
{
   printf(*** %d\n,ifitQ[j]);
}

 return 0;
 }

 void readCharges2(int *ifitQ, int * ipUniqAtms, int * ipindexToFit)
 {
int  j, isumNatms=0;
isumNatms=5;
printf(isumNatms = %d \n,isumNatms);
ifitQ = (int *) realloc(ifitQ,isumNatms*sizeof(int));
if(ifitQ==NULL){printf(Unable to allocate matrix ifitQ\n);
exit(EXIT_FAILURE);}

ifitQ[0]=13;
ifitQ[1]=14;
ifitQ[2]=15;
ifitQ[3]=16;
 *ipUniqAtms =  4;
 *ipindexToFit =  3;
for(j=0; j *ipUniqAtms ; j++)
{
   printf(rrr %d\n,ifitQ[j]);
}
 }

The reason it probably worked on Linux is because in Linux, realloc will
try hard to keep the array at the same address if it can simply bump the
size of the pointer.  Cygwin's realloc doesn't.
HTH,
Igor
-- 
http://cs.nyu.edu/~pechtcha/
  |\  _,,,---,,_[EMAIL PROTECTED] | [EMAIL PROTECTED]
ZZZzz /,`.-'`'-.  ;-;;,_Igor Peshansky, Ph.D. (name changed!)
 |,4-  ) )-,_. ,\ (  `'-'   old name: Igor Pechtchanski
'---''(_/--'  `-'\_) fL a.k.a JaguaR-R-R-r-r-r-.-.-.  Meow!

Las! je suis sot... -Mais non, tu ne l'es pas, puisque tu t'en rends compte.
But no -- you are no fool; you call yourself a fool, there's proof enough in
that! -- Rostand, Cyrano de Bergerac

--
Unsubscribe info:  http://cygwin.com/ml/#unsubscribe-simple
Problem reports:   http://cygwin.com/problems.html
Documentation: http://cygwin.com/docs.html
FAQ:   http://cygwin.com/faq/



Re: problem with malloc/realloc. Pls help.

2006-08-21 Thread Igor Peshansky
On Mon, 21 Aug 2006, Igor Peshansky wrote:

 On Mon, 21 Aug 2006, Omololu wrote:

  Hi,
   i have the following code. it compiles with gcc in Cygwin but the
  contents of the array ifitQ that I get after the call to the subroutine
  readCharges2 is gibberish.

 This is expected behavior.  Read on.

  The code compiles with gcc under Linux and it runs correctly. it also
  compiles and runs correctly with windows visual studio. Pls help. The
  resuls i get with Cygwin is:
 
  isumNatms = 5
  rrr 13
  rrr 14
  rrr 15
  rrr 16
  *** 1628693268
  *** 1628693268
  *** 16
  *** 1034
 
  instead of:
  isumNatms = 5
  rrr 13
  rrr 14
  rrr 15
  rrr 16
  *** 13
  *** 14
  *** 15
  *** 16
 
  the code is:

 Ouch.  Indentation issues aside, you have a bug in this program.

  #include stdio.h
  #include stdlib.h
 
  void readCharges2(int *, int *, int *);
  int main()
  {
  static int *ifitQ;
  int *ipUniqAtms, *ipindexToFit;
  int j;
  int x,y;
  ipUniqAtms =x;
  ipindexToFit=y;
 ifitQ = (int *) malloc(sizeof(int));
 if(ifitQ==NULL){printf(Unable to allocate matrix ifitQ\n);
 exit(EXIT_FAILURE);}
  readCharges2(ifitQ,ipUniqAtms,ipindexToFit);

 Note that ifitQ is passed *by value*, and any changes you make to it
 inside readCharges2() will be lost when you come back to main.  So, you
 realloc it inside readCharges2(), and store values in the new array, but
 in main(), you print the values in the *old* array (which are, as you
 said, gibberish, as the memory has been released to the system).

 for(j=0; j *ipUniqAtms ; j++)
 {
printf(*** %d\n,ifitQ[j]);
 }
 
  return 0;
  }
 
  void readCharges2(int *ifitQ, int * ipUniqAtms, int * ipindexToFit)
  {
 int  j, isumNatms=0;
 isumNatms=5;
 printf(isumNatms = %d \n,isumNatms);
 ifitQ = (int *) realloc(ifitQ,isumNatms*sizeof(int));
 if(ifitQ==NULL){printf(Unable to allocate matrix ifitQ\n);
 exit(EXIT_FAILURE);}
 
 ifitQ[0]=13;
 ifitQ[1]=14;
 ifitQ[2]=15;
 ifitQ[3]=16;
  *ipUniqAtms =  4;
  *ipindexToFit =  3;
 for(j=0; j *ipUniqAtms ; j++)
 {
printf(rrr %d\n,ifitQ[j]);
 }
  }

 The reason it probably worked on Linux is because in Linux, realloc will
 try hard to keep the array at the same address if it can simply bump the
 size of the pointer.  Cygwin's realloc doesn't.

s/pointer/memory block/.  Sorry for the typo.
Igor
-- 
http://cs.nyu.edu/~pechtcha/
  |\  _,,,---,,_[EMAIL PROTECTED] | [EMAIL PROTECTED]
ZZZzz /,`.-'`'-.  ;-;;,_Igor Peshansky, Ph.D. (name changed!)
 |,4-  ) )-,_. ,\ (  `'-'   old name: Igor Pechtchanski
'---''(_/--'  `-'\_) fL a.k.a JaguaR-R-R-r-r-r-.-.-.  Meow!

Las! je suis sot... -Mais non, tu ne l'es pas, puisque tu t'en rends compte.
But no -- you are no fool; you call yourself a fool, there's proof enough in
that! -- Rostand, Cyrano de Bergerac

--
Unsubscribe info:  http://cygwin.com/ml/#unsubscribe-simple
Problem reports:   http://cygwin.com/problems.html
Documentation: http://cygwin.com/docs.html
FAQ:   http://cygwin.com/faq/



Re: problem with malloc/realloc. Pls help.

2006-08-21 Thread Mark Fisher

On 8/21/06, Omololu wrote:

Hi,
 i have the following code. it compiles with gcc in Cygwin but the contents of
the array ifitQ that I get after the call to the subroutine readCharges2 is
gibberish.


looks like a passing by reference problem. if you add debug to look
at the address of ifitQ at all stages, you'll notice that the copy pointer
in readCharges2 gets changed, but that isn't the same pointer as in
the calling block.

see section 2.17 of http://www.lysator.liu.se/c/c-faq/c-2.html

i don't understand how linux is getting it right tbh.

--
Unsubscribe info:  http://cygwin.com/ml/#unsubscribe-simple
Problem reports:   http://cygwin.com/problems.html
Documentation: http://cygwin.com/docs.html
FAQ:   http://cygwin.com/faq/