Sprawdziłem i pierwszy znak z chunk[]
nie jest 0. Ale nie podoba mi się adresacja w locstart
i locend
i nie wiem dlaczego tak się dzieje. Jak by to można było poprawić? I co wgl zmienić w tej pętli żeby już po napotkaniu białego znaku przekazywał tablicę do funkcji if_anagram
.
Zrzut ekranu:
Dorzucam cały kod dla jasności:
#include <stdio.h>
#include <mpi.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <stdbool.h>
#include <conio.h>
bool if_anagram(char *a, char *b)
{
printf("uruchomiona\n");
printf("%s \n", a);
printf("%s \n", b);
int dl1 = strlen(a), dl2 = strlen(b);
if(dl1!=dl2) return false;
if(strcmp(a,b) == 0) return false;
int licz[0x100]={};
for(int i=0;i<dl1;i++)
licz[(unsigned char) a[i]]++;
for(int i=0;i<dl1;i++)
licz[(unsigned char) b[i]]--;
for(int i=0;i<256;i++)
if(licz[i]!=0)
return false;
return true;
}
void parprocess(MPI_File *in, char *a, const int rank, const int size, const int overlap) {
MPI_Offset globalstart;
int mysize;
char *chunk;
//Wczytywanie odpowiedniej ilosci pliku do porcji 'chunk',
//która zaczyna się od lokalizacji 'globalstart' i posiada rozmiar 'mysize'
{
MPI_Offset globalend;
MPI_Offset filesize;
// obliczanie kto co czyta z pliku
MPI_File_get_size(*in, &filesize);
filesize--;
mysize = filesize/size;
globalstart = rank * mysize;
globalend = globalstart + mysize-1;
if (rank == size-1) globalend = filesize-1;
//dodanie zakładki na końcu każdej porcji
if (rank != size-1)
globalend += overlap;
mysize = globalend - globalstart + 1;
// alokowanie pamięci dla porcji
chunk = malloc( (mysize + 1)*sizeof(char));
// każdy proces czyta swoją porcję
MPI_File_read_at_all(*in, globalstart, chunk, mysize, MPI_CHAR, MPI_STATUS_IGNORE);
chunk[mysize] = '\0';
}
// obliczanie dla każdego procesu rzeczywistego rozpoczęcia i zakończenia(wliczając zakladkę)
int locstart=0, locend=mysize-1;
if (rank != 0) {
while(chunk[locstart] != '\n') locstart++;
locstart++;
}
if (rank != size-1) {
locend-=overlap;
while(chunk[locend] != '\n') locend++;
}
printf("Proces: %d locstart %d \n", rank+1, locstart);
printf("Proces: %d locend %d \n", rank+1, locend);
// Każdy proces pobiera znaki ze swojej porcji i umieszcza
// je w tablicy do momentu natrafienia na pusty znak.
// Tablica ze słowem przekazywana jest do funkcji if_anagram
char b[51] = { 0 };
int j=0;
for (int i=locstart; i<=locend; i++) {
char c = chunk[i];
if(c=='\n'){
printf("Koniec\n");
printf("Proces %d: %s\n", rank+1, b);
//printf("%s\n", a);
//if(if_anagram(a,b)) printf("Wyraz %s jest anagramem!\n", b);
j=0;
}
else{
if(isspace (c))
printf("Przerwa\n");
else{
printf(" Litera: %s\n", isalpha (c) ? "tak" : "nie");
b[j] = c;
j++;
}
}
}
}
int main(int argc, char** argv) {
MPI_File in;
int rank, size;
const int overlap = 100;
char a[51];
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
if (argc != 3) {
if (rank == 0) fprintf(stderr, "Wpisz poprawnie: %s plik słowo\n", argv[0]);
MPI_Finalize();
exit(1);
}
MPI_File_open(MPI_COMM_WORLD, argv[1], MPI_MODE_RDONLY, MPI_INFO_NULL, &in);
strcpy(a, argv[2]);
parprocess(&in, a, rank, size, overlap);
MPI_File_close(&in);
MPI_Finalize();
return 0;
}