finally got pointer syntax correct for F pointing to a common multi-dim array

git-svn-id: svn://anubis/gvsu@166 45c1a28c-8058-47b2-ae61-ca45b979098e
This commit is contained in:
josh 2008-09-26 16:23:45 +00:00
parent 5696656386
commit 86e44617bf

View File

@ -20,12 +20,15 @@ typedef struct
vector<char> * s; vector<char> * s;
vector<char> * t; vector<char> * t;
int id; int id;
void * matrix;
} SMArg; } SMArg;
void usage(char * prog); void usage(char * prog);
void * similarityMatrix(void * arg); void * calcSimMatrixThread(void * arg);
bool readFile(char * fileName, vector<char> & v); bool readFile(char * fileName, vector<char> & v);
pthread_barrier_t barrier;
/* Print basic usage information */ /* Print basic usage information */
void usage(char * prog) void usage(char * prog)
{ {
@ -62,6 +65,8 @@ int main(int argc, char * argv[])
usage(argv[0]); usage(argv[0]);
pthread_t * threads = new pthread_t[num_threads]; pthread_t * threads = new pthread_t[num_threads];
int * similarityMatrix = new int[files[0].size() * files[1].size()];
pthread_barrier_init(&barrier, NULL, num_threads);
for (int i = 0; i < num_threads; i++) for (int i = 0; i < num_threads; i++)
{ {
@ -69,8 +74,9 @@ int main(int argc, char * argv[])
arg->s = &files[0]; arg->s = &files[0];
arg->t = &files[1]; arg->t = &files[1];
arg->id = i; arg->id = i;
arg->matrix = similarityMatrix;
int ret = pthread_create(&threads[i], NULL, &similarityMatrix, arg); int ret = pthread_create(&threads[i], NULL, &calcSimMatrixThread, arg);
if (ret) if (ret)
{ {
cerr << "Error " << ret << " when creating thread!" << endl; cerr << "Error " << ret << " when creating thread!" << endl;
@ -83,6 +89,8 @@ int main(int argc, char * argv[])
pthread_join(threads[i], NULL); pthread_join(threads[i], NULL);
} }
pthread_barrier_destroy(&barrier);
delete[] threads; delete[] threads;
return 0; return 0;
} }
@ -102,43 +110,43 @@ bool readFile(char * fileName, vector<char> & v)
return true; return true;
} }
/* Compute the similarity matrix between two character arrays */ /* Compute portions of the similarity matrix between two character arrays */
void * similarityMatrix(void * arg) void * calcSimMatrixThread(void * arg)
{ {
SMArg * smarg = (SMArg *) arg; SMArg * smarg = (SMArg *) arg;
int s_size = smarg->s->size(); int s_size = smarg->s->size();
int t_size = smarg->t->size(); int t_size = smarg->t->size();
int F[s_size][t_size]; int (*F)[s_size][t_size] = (int (*) [s_size][t_size]) smarg->matrix;
int max_x = 0, max_y = 0, max_val = 0; int max_x = 0, max_y = 0, max_val = 0;
for (int i = 0; i < t_size; i++) /* set first row to 0's */ for (int i = 0; i < t_size; i++) /* set first row to 0's */
F[0][i] = 0; (*F)[0][i] = 0;
for (int i = 0; i < s_size; i++) /* set first column to 0's */ for (int i = 0; i < s_size; i++) /* set first column to 0's */
F[i][0] = 0; (*F)[i][0] = 0;
for (int i = 1; i < s_size; i++) for (int i = 1; i < s_size; i++)
{ {
for (int j = 1; j < t_size; j++) for (int j = 1; j < t_size; j++)
{ {
/* Compute the value for the matrix */ /* Compute the value for the matrix */
F[i][j] = (*F)[i][j] =
max( max(
max( max(
F[i][j-1] - 2, (*F)[i][j-1] - 2,
F[i-1][j-1] + (*F)[i-1][j-1] +
(eq(smarg->s->at(i), smarg->t->at(j)) ? 1 : -1) (eq(smarg->s->at(i), smarg->t->at(j)) ? 1 : -1)
), ),
max( max(
F[i-1][j] - 2, (*F)[i-1][j] - 2,
0 0
) )
); );
/* See if we found a new maximum value */ /* See if we found a new maximum value */
if (F[i][j] > max_val) if ((*F)[i][j] > max_val)
{ {
max_val = F[i][j]; max_val = (*F)[i][j];
max_x = i; max_x = i;
max_y = j; max_y = j;
} }
else if (F[i][j] == max_val) else if ((*F)[i][j] == max_val)
{ {
/* If we found a value the same as our current maximum /* If we found a value the same as our current maximum
* value, see if it has a greater i+j value */ * value, see if it has a greater i+j value */