MPI - Brak pierwszej litery tablicy

0

Witam, piszę program w MPI i napotkałem na problem który nwm z czym jest związany. Kod jest działający ale przy wczytaniu znaków do tablicy i próbie przekazania tej tablicy znakowej do funkcji sprawdzającej if_anagram nie wczytuje się pierwsza litera tablicy b[] a przed wczytaniem i próbą wyświetlenia wartość jest pobierana prawidłowo. Co robię źle?

Miejsce przekazywania w programie:

	char b[51] = { 0 };
	int j=0;
    for (int i=locstart; i<=locend; i++) {
       char c = chunk[i];
		
    if(c=='\n'){ 
		printf("Proces %d: %s\n", rank, b);
		//printf("%s\n", a);	   	
    	if(if_anagram(a,b)) printf("Wyraz %s jest anagramem!\n", b);
    	j=0;
	}
		else{
			b[j] = c;
			j++;
		}
	}

Funkcja sprawdzająca:

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; 
} 

Uruchomiony program:

title

0

Trochę to wczytywanie jest pogmatwane, dlatego musisz sprawdzić:

1.: Czy w tym miejscu char c = chunk[i]; zmienna c jest zawsze różna od zera, bo możliwe, że pierwszy znak z chunk[] jest zerem, które ostatecznie ląduje tutaj: b[j] = c;

2.: Czy zmienna locstart jest równa zero? Bo jeśli nie, to omijasz pierwszy element pobrany z chunk[]

3.: Czy samo chunk nie zawiera przypadkiem spacji, pustych/białych znaków, które gdzieś przypadkiem zaciągasz i zapisujesz do b[]?

0

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:

console.jpg

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;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1