• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed linux - "naruszenie ochrony pamięci (zrzut pamięci)"

VPS Starter Arubacloud
0 głosów
2,414 wizyt
pytanie zadane 21 grudnia 2020 w C i C++ przez komboboost0 Użytkownik (570 p.)
zamknięte 21 grudnia 2020 przez komboboost0

Cześć. Napisałem program który ma obliczać liczbę pi. Przy niektórych argumentach program działa jak należy (np. 10 oraz 3), jednak przy innych wyskakuje błąd (np. 10 oraz 4) - "naruszenie ochrony pamięci (zrzut pamięci)".

#include <stdlib.h>
#include <stdio.h>
#include <float.h>
#include <string.h>
#include <pthread.h>
#include <time.h>

double pi = 1;

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

void* piSum(void* arg) {
    	char *args = (char*)arg ;
    	char* p = strtok(args, " ");
    	char* array[3];

    	for (int i = 0; p != NULL; i++)
    	{
        	array[i] = p;
        	p = strtok(NULL, " ");
    	}

    	unsigned long thread = atoi(array[0]);
    	unsigned long w = atoi(array[1]);
    	unsigned long zakres = atoi(array[2]);
    	unsigned long zakresN = atoi(array[3]);

    	pthread_t self = pthread_self();

        unsigned long first = 1 + ((thread-1) * zakres);
    	double iloczyn = 1;
    	if (thread == 1) {
        	fprintf(stdout, "thread:%lxd\tsize=%ld\tfirst=%d\n", self, zakres, 1);
        	for (unsigned long index = 1; index <= zakres; index++) {
            		double nawias = 2 * index;
            		iloczyn *= (nawias * nawias) / ((nawias - 1) * (nawias + 1));
        	}
    	}
    	else if (thread < w) {
        	fprintf(stdout, "thread:%lxd\tsize=%ld\tfirst=%ld\n", self, zakres, first);
        	for (unsigned long index = first ; index < first + zakres; index++) {  		
                    double nawias = 2 * index;
            		iloczyn *= (nawias * nawias) / ((nawias - 1) * (nawias + 1));
        	}
    	}
    	else if(thread == w){
        	fprintf(stdout, "thread:%lxd\tsize=%ld\tfirst=%ld\n", self, zakresN, first);
        	for (unsigned long index = first; index < first + zakresN; index++) {
            		double nawias = 2 * index;
            		iloczyn *= (nawias * nawias) / ((nawias - 1) * (nawias + 1));
        	}
    	}

	fprintf(stdout, "thread:%lxd\tprod=%.20f\n", self, iloczyn);

	pthread_mutex_lock(&mutex);
	pi = pi * iloczyn;
	pthread_mutex_unlock(&mutex);

	pthread_exit(0);
}

int main(int argc, char* argv[]){
	unsigned long n = atoi(argv[1]);
	unsigned long w = atoi(argv[2]);
	int boolFlag = 0;
	if(n <= 1 || n >= 1000000000){
		fprintf(stderr, "n musi spelniac warunek 1<n<1000000000\n");
		boolFlag = 1;
	}
	if(w <= 1 || w >= 100){
		fprintf(stderr, "w musi spelniac warunek 1<w<100\n");
		boolFlag = 1;
	}

	if(boolFlag) return 0;
    	unsigned long reszta = n % w;
    	unsigned long zakres = 0;
    	unsigned long zakresN = 0;

    	if (reszta) {
        	zakres = (n - reszta) / w;
        	zakresN = zakres + reszta;
    	}
    	else {
		zakres = n / w;
        zakresN = zakres;
    	}
    	pthread_t threads[w];
    	char data[w][20];
        clock_t t1 = clock();
    	for (unsigned long i = 1; i <= w; i++)
    	{
        	sprintf(data[i], "%ld %ld %ld %ld", i, w, zakres, zakresN);
        	pthread_create(&threads[i], NULL, piSum, data[i]);
    	}
    	for (int i = 1; i <= w; i++) {
        	pthread_join(threads[i], NULL);
    	}
        clock_t t2 = clock();
        double time_s = ((double)t2 - (double)t1) / CLOCKS_PER_SEC;
    	printf("w /threads pi = %.20f\ttime=%f\n", pi*2, time_s);
        
        pi = 1;
        t1 = clock();
        for (int i = 1; i <= n; i++){
            double nawias = 2 * i;
            pi *= (nawias * nawias) / ((nawias - 1) * (nawias + 1));
        }
        t2 = clock();
        time_s = time_s = ((double)t2 - (double)t1) / CLOCKS_PER_SEC;
        printf("wo/threads pi = %.20f\ttime=%f\n", pi*2, time_s);
return 0;
}

O co może chodzić? Pierwszy raz spotykam się z takim błędem.

komentarz zamknięcia: Rozwiązałem problem samodzielnie.
1
komentarz 21 grudnia 2020 przez overcq Pasjonat (21,540 p.)

Może najpierw popraw błędy...

untitled.c:26:38: warning: array index 3 is past the end of the array (which contains 3 elements) [-Warray-bounds]
        unsigned long zakresN = atoi(array[3]);
                                     ^     ~
untitled.c:15:9: note: array 'array' declared here
        char* array[3];
        ^
untitled.c:111:25: warning: multiple unsequenced modifications to 'time_s' [-Wunsequenced]
        time_s = time_s = ((double)t2 - (double)t1) / CLOCKS_PER_SEC;
               ~        ^
2 warnings generated.

 

komentarz 21 grudnia 2020 przez komboboost0 Użytkownik (570 p.)
Pozbyłem się ich, ale błąd z pierwszego postu wstępuje nadal :/
komentarz 21 grudnia 2020 przez komboboost0 Użytkownik (570 p.)
Już sobie poradziłem. Problemem była linijka

char data[w][20];

Wystarczyło podmienić na

char data[w + 1][20];

Podobne pytania

0 głosów
1 odpowiedź 160 wizyt
pytanie zadane 23 stycznia 2023 w C i C++ przez sergion Nowicjusz (150 p.)
0 głosów
0 odpowiedzi 240 wizyt
pytanie zadane 13 kwietnia 2019 w C i C++ przez hidden55 Początkujący (270 p.)
0 głosów
2 odpowiedzi 1,193 wizyt
pytanie zadane 24 października 2016 w C i C++ przez Kapi2222 Obywatel (1,220 p.)

92,453 zapytań

141,262 odpowiedzi

319,087 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...