473,320 Members | 1,993 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,320 software developers and data experts.

Unpredictable program behavior ..

Hi all , i am supposed to create a program that performs a specific
operation to a 2-D matrix whose elements are positive (or zero ).
This operation is repeated T times on the matrix and only the final
matix is needed . The operation to be perormed is
V(t,x,y)=1/2*(sqrt(V(t-1,x-1,y))+sqrt(V(t-1,x-1,y))) . The problem iis
that i have (or i think i have ) created a correct program that
performs this operation but something happens that i cannot understand
.. The final matrix is the same regardless the value of T . That means
that the final matrix is the same for T=10 and T=1000 !!! The code i
have managed to write so far is the following :

/********** VERSION FOR ONE PROCESSOR *****/

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <math.h>

#define T 2000
#define X 10
#define Y 10

/* TODO ... to pass these values from the command line ... */

double **CreateMatrix(int,int);
void DestroyMatrix(double **,int);
void InitializeMatrix(double **,int,int);
void CopyMatrix(double **,double **,int,int);

/* The following function is for DEBUG purposes only */

void PrintMatrix(double **,int,int);

int main(void)
{
double **currentMatrix; // Initialization ??? cast to NULL
???
double **tempMatrix; // Initialization ???
double tempValue;
int t,x,y;
for(t=1; t<T; t++)
{
currentMatrix=CreateMatrix(X,Y);
InitializeMatrix(currentMatrix,X,Y);
/* printf("Matrix Created .... \n"); */
if(t==1)
{
tempMatrix=CreateMatrix(X,Y);
InitializeMatrix(tempMatrix,X,Y);
}
for(x=1; x<X; x++)
{
for(y=1; y<Y; y++)
{
if((x==1) && (y==1))
{
tempValue=(double)1;
}
if((x==1) && (y>1))
{

tempValue=(double)1+(double)sqrt(tempMatrix[y-1][x]);
}
if((y==1) && (x>1))
{

tempValue=(double)sqrt(tempMatrix[y][x-1]);
}
if((x>1) && (y>1))
{

tempValue=(double)sqrt(tempMatrix[y][x-1])+(double)sqrt(tempMatrix[y-1][x]);
}

currentMatrix[y][x]=((double)tempValue)/((double)2);
}
}
/* printf("After changing the matrix ..... \n"); */
/* PrintMatrix(currentMatrix,Y,X); */
if(t!= T-1)
{
/* printf("You reached so far .... !!\n"); */
CopyMatrix(tempMatrix,currentMatrix,Y,X);
/* printf("Now printing the old matrix..... \n");
*/
/* PrintMatrix(tempMatrix,Y,X); */
DestroyMatrix(currentMatrix,Y);
}
} /* end of the triple loop ... */
for(int tempi=0; tempi<Y ; tempi++)
{
for(int tempj=0; tempj<X; tempj++)
{
printf(" %f ",currentMatrix[tempi][tempj]);
}
printf("\n");
}

DestroyMatrix(currentMatrix,Y);
DestroyMatrix(tempMatrix,Y);
return 0;
}
double ** CreateMatrix(int X_dim,int Y_dim)
{
double **retdouble=malloc(Y_dim*(sizeof(double *)));
if(retdouble == NULL)
{
printf("Error Allocating memory ..... \n");
exit(EXIT_FAILURE);
}
for (int k=0; k<Y_dim; k++)
{
retdouble[k]=malloc(X_dim*(sizeof(double)));
if(retdouble[k]==NULL)
{
printf("Error Allocating memory ... \n");
exit(EXIT_FAILURE);
}
}
return retdouble;
}

void DestroyMatrix(double ** matrix,int Y_dim)
{
for(int i=0; i<Y_dim; i++)
{
free(matrix[i]);
}
free(matrix);
}

void InitializeMatrix(double **matrix,int X_dim,int Y_dim)
{
for(int i=0; i<Y_dim; i++)
{
for(int j=0; j<X_dim; j++)
{
matrix[i][j]=0;
}
}
}

void CopyMatrix(double **target,double **source,int Y_dim,int X_dim)
{
for (int i=0; i<Y_dim; i++)
{
for(int j=0; j<X_dim; j++)
{
target[i][j]=source[i][j];
}
}
}
void PrintMatrix(double **dest,int Y_dim,int X_dim)
{
for(int tempi=0; tempi<Y_dim ; tempi++)
{
for(unsigned short tempj=0; tempj<X_dim; tempj++)
{
printf(" %f ",dest[tempi][tempj]);
}
printf("\n");
}
}

The program simply creates two matrices dynamically , currentMartix
for the current operation and tempMatrix for the last operation ...
After all the elements of the current matrix have changed according to
the mathematical formula i wrote before they are going to be copied
to the tempMatrix and then the currentMatrix is going to be erased ...
This is performed T times ..

(Sorry for my english )
Nov 13 '05 #1
3 1617
On Sat, 06 Dec 2003 17:27:17 +0200, Andrew
<af********************@yahoo.com> wrote:
Hi all , i am supposed to create a program that performs a specific
operation to a 2-D matrix whose elements are positive (or zero ).
This operation is repeated T times on the matrix and only the final
matix is needed . The operation to be perormed is
V(t,x,y)=1/2*(sqrt(V(t-1,x-1,y))+sqrt(V(t-1,x-1,y))) . The problem iis
that i have (or i think i have ) created a correct program that
performs this operation but something happens that i cannot understand
. The final matrix is the same regardless the value of T . That means
I ran your code with T defined as 5 and determined from the debugger
that tempMatrix[1] had three non-zero values. Ran it again with T
defined as 100 and tempMatrix had nine non-zero values. Something
else must be the problem. Keep reading.
that the final matrix is the same for T=10 and T=1000 !!! The code i
have managed to write so far is the following :

/********** VERSION FOR ONE PROCESSOR *****/

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <math.h>

#define T 2000
#define X 10
#define Y 10

/* TODO ... to pass these values from the command line ... */

double **CreateMatrix(int,int);
void DestroyMatrix(double **,int);
void InitializeMatrix(double **,int,int);
void CopyMatrix(double **,double **,int,int);

/* The following function is for DEBUG purposes only */

void PrintMatrix(double **,int,int);

int main(void)
{
double **currentMatrix; // Initialization ??? cast to NULL
???
There is no need since you initialize it immediately during execution.
Some like to do it as a matter of style.
double **tempMatrix; // Initialization ???
double tempValue;
int t,x,y;
for(t=1; t<T; t++)
You are aware that this will only execute the loop T-1 times, not T?
{
currentMatrix=CreateMatrix(X,Y);
It is a little confusing that you pass the parameters as X and Y when
you reference the matrix as y and x.
InitializeMatrix(currentMatrix,X,Y);
/* printf("Matrix Created .... \n"); */
if(t==1)
{
tempMatrix=CreateMatrix(X,Y);
InitializeMatrix(tempMatrix,X,Y);
}
for(x=1; x<X; x++)
{
for(y=1; y<Y; y++)
{
if((x==1) && (y==1))
You seem to be ignoring row and column 0 here.
{
tempValue=(double)1;
The cast is irrelevant. 1 is an int and would be converted to double
automatically. If you want an indication in the source line that you
are not dealing with integers, 1.0 would be preferable.
}
if((x==1) && (y>1))
{

tempValue=(double)1+(double)sqrt(tempMatrix[y-1][x]);
sqrt returns a double so that cast is completely superfluous.
}
if((y==1) && (x>1))
{

tempValue=(double)sqrt(tempMatrix[y][x-1]);
}
if((x>1) && (y>1))
{

tempValue=(double)sqrt(tempMatrix[y][x-1])+(double)sqrt(tempMatrix[y-1][x]);
}

currentMatrix[y][x]=((double)tempValue)/((double)2);
You really are in love with casts, aren't you? Why? What do you
think they accomplish?
}
}
/* printf("After changing the matrix ..... \n"); */
/* PrintMatrix(currentMatrix,Y,X); */
if(t!= T-1)
{
/* printf("You reached so far .... !!\n"); */
CopyMatrix(tempMatrix,currentMatrix,Y,X);
This copies currentMatrix to tempMatrix.
/* printf("Now printing the old matrix..... \n");
*/
/* PrintMatrix(tempMatrix,Y,X); */
DestroyMatrix(currentMatrix,Y);
This completely frees currentMatrix in preparation for reallocating it
during the next iteration through the loop.

It would have been simpler to merely reinitialize currentMatrix.
}
} /* end of the triple loop ... */
for(int tempi=0; tempi<Y ; tempi++)
{
for(int tempj=0; tempj<X; tempj++)
{
printf(" %f ",currentMatrix[tempi][tempj]);
Can you guess which parameter above no longer exists. You are
invoking undefined behavior.
}
printf("\n");
}

DestroyMatrix(currentMatrix,Y);
You cannot free memory that has already been freed. More undefined
behavior.
DestroyMatrix(tempMatrix,Y);
return 0;
}
double ** CreateMatrix(int X_dim,int Y_dim)
{
double **retdouble=malloc(Y_dim*(sizeof(double *)));
if(retdouble == NULL)
{
printf("Error Allocating memory ..... \n");
exit(EXIT_FAILURE);
}
for (int k=0; k<Y_dim; k++)
Unless you happen to have a C99 compiler, declaring variables inside
the for statement is a non-standard extension.
{
retdouble[k]=malloc(X_dim*(sizeof(double)));
if(retdouble[k]==NULL)
{
printf("Error Allocating memory ... \n");
A different error message would be nice to distinguish between the two
different allocations.
exit(EXIT_FAILURE);
}
}
return retdouble;
}

void DestroyMatrix(double ** matrix,int Y_dim)
{
for(int i=0; i<Y_dim; i++)
{
free(matrix[i]);
}
free(matrix);
}

void InitializeMatrix(double **matrix,int X_dim,int Y_dim)
{
for(int i=0; i<Y_dim; i++)
{
for(int j=0; j<X_dim; j++)
{
matrix[i][j]=0;
}
}
}

void CopyMatrix(double **target,double **source,int Y_dim,int X_dim)
{
for (int i=0; i<Y_dim; i++)
{
for(int j=0; j<X_dim; j++)
{
target[i][j]=source[i][j];
}
}
}
void PrintMatrix(double **dest,int Y_dim,int X_dim)
{
for(int tempi=0; tempi<Y_dim ; tempi++)
{
for(unsigned short tempj=0; tempj<X_dim; tempj++)
I give up. Why is this index different from all other indices?
{
printf(" %f ",dest[tempi][tempj]);
Since your values are doubles, wouldn't you like to print them as
doubles instead of floats?
}
printf("\n");
}
}

The program simply creates two matrices dynamically , currentMartix
for the current operation and tempMatrix for the last operation ...
After all the elements of the current matrix have changed according to
the mathematical formula i wrote before they are going to be copied
to the tempMatrix and then the currentMatrix is going to be erased ...
This is performed T times ..

(Sorry for my english )


Why? It was understandable.
<<Remove the del for email>>
Nov 13 '05 #2
Barry Schwarz wrote:
On Sat, 06 Dec 2003 17:27:17 +0200, Andrew
<af********************@yahoo.com> wrote:

#include <malloc.h>


Additional comment: <malloc.h> is not a standard header. Use <stdlib.h>
for all your mallocing needs.

-Kevin
--
My email address is valid, but changes periodically.
To contact me please use the address from a recent posting.

Nov 13 '05 #3
On 6 Dec 2003 22:20:29 GMT, Barry Schwarz <sc******@deloz.net> wrote:

Mr. Schwarz thank you very-very much for reading/commenting/executing
my code . I can now remove all the unnecessary operations and make it
run faster . It doesn't matter if the loop(s) are executed T or T-1
times because i am creating a parallel version of the program ( for
more than one processors , actually 16 ) and I must ensure that the
final matrix is the same with that calculated from the one processor
program . We even ignore the boundary conditions (for X=0 and Y=0 )
we need them only to compute the V(t,1,y) and V(t,x,1) values...

Anyway a friend of mine is getting the same results with this program
so I think I don't make something wrong with the algorithm ... I will
optimize my code to get faster execution times following your remakrs
..
Thanks again !!

Nov 13 '05 #4

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

50
by: strutsng | last post by:
I want if "a C program is a standard C++ program, but not vice versa" is a correct statement? In a C++ program, we can use standard C libraries. However, we cannot use C++ libraries inside C...
54
by: bnp | last post by:
Hi, I took a test on C. there was an objective question for program output type. following is the program: main() { char ch; int i =2;
38
by: vashwath | last post by:
Might be off topic but I don't know where to post this question.Hope some body clears my doubt. The coding standard of the project which I am working on say's not to use malloc.When I asked my...
40
by: findmadhav | last post by:
I need a program in C (something like a TSR) which will automatically press the function key F6, say about every 5 seconds. Can anyone provide me with an exe of such a program? Thanks in advance.
8
by: sami.jan | last post by:
Hi I am using the xlC_r compiler on AIX 5.2 - this program crashes with a segmentation fault (core dumped) - I compile with a command: xlC_r filename.C - no switches or anything...
8
by: Andrea | last post by:
I wrote this code: void * xmalloc (size_t size){ register void *value = OPENSSL_malloc(size); if (value == 0) printf("virtual memory exhausted"); return value; } int _chooseTSK(char*...
73
by: Rajeet Dalawal | last post by:
Good day group. I was asked in an interview to explain the behavior of this program. void main() { char *s = "abc"; int *i = (int *) s; printf("%x", *i); }
13
by: bintom | last post by:
Is there any reason why the following C++ code behaves as it does ? int i; i=1; cout << (++i)++; Output: 2 i=1; cout << ++(++i); Output: 3
8
by: bintom | last post by:
Why doe the following C++ code behaves as it does? int i; i=1; cout << (++i)++; Output: 2 i=1; cout << ++(++i); Output: 3 i=1; cout << (i++)++; Output: Error. LValue required...
0
by: ryjfgjl | last post by:
ExcelToDatabase: batch import excel into database automatically...
0
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 6 Mar 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM). In this month's session, we are pleased to welcome back...
1
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 6 Mar 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM). In this month's session, we are pleased to welcome back...
0
by: Vimpel783 | last post by:
Hello! Guys, I found this code on the Internet, but I need to modify it a little. It works well, the problem is this: Data is sent from only one cell, in this case B5, but it is necessary that data...
0
by: ArrayDB | last post by:
The error message I've encountered is; ERROR:root:Error generating model response: exception: access violation writing 0x0000000000005140, which seems to be indicative of an access violation...
1
by: PapaRatzi | last post by:
Hello, I am teaching myself MS Access forms design and Visual Basic. I've created a table to capture a list of Top 30 singles and forms to capture new entries. The final step is a form (unbound)...
0
by: Defcon1945 | last post by:
I'm trying to learn Python using Pycharm but import shutil doesn't work
0
by: af34tf | last post by:
Hi Guys, I have a domain whose name is BytesLimited.com, and I want to sell it. Does anyone know about platforms that allow me to list my domain in auction for free. Thank you
0
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 3 Apr 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome former...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.