В дополнение к тому, что str1
недостаточно длинен для вашей цели, у вас есть дополнительная серьезная проблема, связанная с гонками данных, связанными с этой переменной. Он будет использоваться потоками, выполняющими вашу параллельную секцию, что приведет к тому, что они будут перебирать все данные друг друга или, что еще хуже. Неудивительно, что это проявляется в том, что некоторые комбинации имеют тенденцию пропускаться.
Но это должно быть довольно легко решить. Лучшая практика для объявлений переменных - помещать их в самую узкую область, которая позволяет им служить своей цели. Вы используете этот массив только внутри самого внутреннего l oop вашего l oop гнезда, и вы не полагаетесь на него, чтобы сохранить его значение при итерациях, поэтому вы должны объявить его внутри этого l oop. Это будет иметь дополнительный эффект предотвращения проблем, связанных с совместным использованием c, так что это полная победа. Что-то вроде этого:
void compare2(char *str) //str = 2 character string pass from main(). (for e.g. "aa")
{
int flag = 0;
#pragma omp parallel for collapse(2)
for (int i = 0; i < strlen(alphabet); i++) {
for (int j = 0; j < strlen(alphabet) && flag == 0; j++) {
if(flag) {
continue;
}
char str1[3] = { alphabet[i], alphabet[j] };
printf("%s\n", str1);
if (strcmp(str1, str) == 0) {
printf("Match found %d!\n", omp_get_thread_num());
flag = 1;
}
}
}
}