int spectrum( unsigned long * map, long N, char * file )
{
// В этой функции будем вычислять количество пикселей
// определённого цвета в общем массиве пикселей.
// Для этого создадим массив, в котором каждый элемент является
// парой "цвет: сколько раз встречается".
// Проверим два возможных подхода.
// В первом случае попробуем считывать пиксель из карты и
// проверять, записан ли он в список, если да - то инкрементируем счётчик,
// если же нет - добавляем элемент в конец списка
// и присваиваем счётчику значение 1.
// Если количество элементов массива N, количество цветов в нём n, то
// если, скажем, N = n, время выполнения можно высчитать,
// исходя из того, что на первую итерацию потребуется поиск
// по пустому массиву, а на итерацию i - поиск по массиву из i элементов
// Т.е. за проход цикла будет перебираться до N^2 элементов (N(N+1)/2).
// Если же цветов будет меньше, то сложность падает.
// Во втором случае считываем пиксель из карты и проходим всю карту
// в поисках таких же пикселей. Если находим такой же, инкрементируем
// счёьчик, иначе - записываем элемент в новый массив.
// После достижения последнего символа проходим новый массив так же.
// Если элементов N и цветов n, то если N = n при первой итерации
// придётся пройти N элементов, при каждой следующей N - i,
// где i - номер итерации. В таком случае потребуется до N^2/2 операций.
// Судя по всему, второй случай предпочтительнее,
// т.к. не потребуется N раз вызывать функцию поиска по списку,
// вместо этого потребуется n раз вызвать spectrum() рекурсивно,
// обрабатывая массив в итоге n раз.
int i, j;
/*
** Реализация второго случая.
*/
unsigned long arr[ N] ; // массив, в который будем записывать новые пиксели.
// понятно, что он даже чересчур большой
unsigned long pix; // первый пиксель
unsigned long ch = 0 ; // это будет счётчик
pix = map[ 0 ] ;
j = 0 ;
for ( i = 0 ; i < N; i++ ) {
// перебираем пиксели
if ( map[ i] != pix) {
// выписываем новые в заготовленный массив
arr[ j++ ] = map[ i] ;
}
else
// а для совпадающих инкрементируем счётчик
ch++;
}
printf ( "%10x, %10li, %10li \n " , pix
, ch
, N
) ; // вывод вроде
/*
0, 52488, 312750
1
400000, 11242, 260262
2
404040, 30558, 249020
3
40, 545, 218462
4
Segmentation fault (core dumped)
*/
if ( j > 0 ) {
printf ( "%d\n " , k
++ ) ; // выше в выводе цифры слева 1, 2, 3, 4 spectrum( arr, j, file) ; // вызываем рекурсивно с новым списком
}
return 0 ; // просто чтобы было
/*
** Segmentation fault для больших файлов.
** Судя по всему, переполняется call stack
** Либо кончается выделенная программе память, хз.
*/
}
aW50IHNwZWN0cnVtKCB1bnNpZ25lZCBsb25nICptYXAsIGxvbmcgTiwgY2hhciAqZmlsZSApCnsKICAgIC8vICDQkiDRjdGC0L7QuSDRhNGD0L3QutGG0LjQuCDQsdGD0LTQtdC8INCy0YvRh9C40YHQu9GP0YLRjCDQutC+0LvQuNGH0LXRgdGC0LLQviDQv9C40LrRgdC10LvQtdC5CiAgICAvLyAg0L7Qv9GA0LXQtNC10LvRkdC90L3QvtCz0L4g0YbQstC10YLQsCDQsiDQvtCx0YnQtdC8INC80LDRgdGB0LjQstC1INC/0LjQutGB0LXQu9C10LkuCiAgICAvLyAg0JTQu9GPINGN0YLQvtCz0L4g0YHQvtC30LTQsNC00LjQvCDQvNCw0YHRgdC40LIsINCyINC60L7RgtC+0YDQvtC8INC60LDQttC00YvQuSDRjdC70LXQvNC10L3RgiDRj9Cy0LvRj9C10YLRgdGPIAogICAgLy8gINC/0LDRgNC+0LkgItGG0LLQtdGCOiDRgdC60L7Qu9GM0LrQviDRgNCw0Lcg0LLRgdGC0YDQtdGH0LDQtdGC0YHRjyIuIAogICAgLy8gINCf0YDQvtCy0LXRgNC40Lwg0LTQstCwINCy0L7Qt9C80L7QttC90YvRhSDQv9C+0LTRhdC+0LTQsC4KICAgIC8vICDQkiDQv9C10YDQstC+0Lwg0YHQu9GD0YfQsNC1INC/0L7Qv9GA0L7QsdGD0LXQvCDRgdGH0LjRgtGL0LLQsNGC0Ywg0L/QuNC60YHQtdC70Ywg0LjQtyDQutCw0YDRgtGLINC4CiAgICAvLyAg0L/RgNC+0LLQtdGA0Y/RgtGMLCDQt9Cw0L/QuNGB0LDQvSDQu9C4INC+0L0g0LIg0YHQv9C40YHQvtC6LCDQtdGB0LvQuCDQtNCwIC0g0YLQviDQuNC90LrRgNC10LzQtdC90YLQuNGA0YPQtdC8INGB0YfRkdGC0YfQuNC6LAogICAgLy8gINC10YHQu9C4INC20LUg0L3QtdGCIC0g0LTQvtCx0LDQstC70Y/QtdC8INGN0LvQtdC80LXQvdGCINCyINC60L7QvdC10YYg0YHQv9C40YHQutCwIAogICAgLy8gINC4INC/0YDQuNGB0LLQsNC40LLQsNC10Lwg0YHRh9GR0YLRh9C40LrRgyDQt9C90LDRh9C10L3QuNC1IDEuCiAgICAvLyAg0JXRgdC70Lgg0LrQvtC70LjRh9C10YHRgtCy0L4g0Y3Qu9C10LzQtdC90YLQvtCyINC80LDRgdGB0LjQstCwIE4sINC60L7Qu9C40YfQtdGB0YLQstC+INGG0LLQtdGC0L7QsiDQsiDQvdGR0Lwgbiwg0YLQvgogICAgLy8gINC10YHQu9C4LCDRgdC60LDQttC10LwsIE4gPSBuLCDQstGA0LXQvNGPINCy0YvQv9C+0LvQvdC10L3QuNGPINC80L7QttC90L4g0LLRi9GB0YfQuNGC0LDRgtGMLCAKICAgIC8vICDQuNGB0YXQvtC00Y8g0LjQtyDRgtC+0LPQviwg0YfRgtC+INC90LAg0L/QtdGA0LLRg9GOINC40YLQtdGA0LDRhtC40Y4g0L/QvtGC0YDQtdCx0YPQtdGC0YHRjyDQv9C+0LjRgdC6IAogICAgLy8gINC/0L4g0L/Rg9GB0YLQvtC80YMg0LzQsNGB0YHQuNCy0YMsINCwINC90LAg0LjRgtC10YDQsNGG0LjRjiBpIC0g0L/QvtC40YHQuiDQv9C+INC80LDRgdGB0LjQstGDINC40LcgaSDRjdC70LXQvNC10L3RgtC+0LIKICAgIC8vICDQoi7QtS4g0LfQsCDQv9GA0L7RhdC+0LQg0YbQuNC60LvQsCDQsdGD0LTQtdGCINC/0LXRgNC10LHQuNGA0LDRgtGM0YHRjyDQtNC+IE5eMiDRjdC70LXQvNC10L3RgtC+0LIgKE4oTisxKS8yKS4KICAgIC8vICDQldGB0LvQuCDQttC1INGG0LLQtdGC0L7QsiDQsdGD0LTQtdGCINC80LXQvdGM0YjQtSwg0YLQviDRgdC70L7QttC90L7RgdGC0Ywg0L/QsNC00LDQtdGCLgogICAgLy8gINCS0L4g0LLRgtC+0YDQvtC8INGB0LvRg9GH0LDQtSDRgdGH0LjRgtGL0LLQsNC10Lwg0L/QuNC60YHQtdC70Ywg0LjQtyDQutCw0YDRgtGLINC4INC/0YDQvtGF0L7QtNC40Lwg0LLRgdGOINC60LDRgNGC0YMgCiAgICAvLyAg0LIg0L/QvtC40YHQutCw0YUg0YLQsNC60LjRhSDQttC1INC/0LjQutGB0LXQu9C10LkuINCV0YHQu9C4INC90LDRhdC+0LTQuNC8INGC0LDQutC+0Lkg0LbQtSwg0LjQvdC60YDQtdC80LXQvdGC0LjRgNGD0LXQvCAKICAgIC8vICDRgdGH0ZHRjNGH0LjQuiwg0LjQvdCw0YfQtSAtINC30LDQv9C40YHRi9Cy0LDQtdC8INGN0LvQtdC80LXQvdGCINCyINC90L7QstGL0Lkg0LzQsNGB0YHQuNCyLgogICAgLy8gINCf0L7RgdC70LUg0LTQvtGB0YLQuNC20LXQvdC40Y8g0L/QvtGB0LvQtdC00L3QtdCz0L4g0YHQuNC80LLQvtC70LAg0L/RgNC+0YXQvtC00LjQvCDQvdC+0LLRi9C5INC80LDRgdGB0LjQsiDRgtCw0Log0LbQtS4KICAgIC8vICDQldGB0LvQuCDRjdC70LXQvNC10L3RgtC+0LIgTiDQuCDRhtCy0LXRgtC+0LIgbiwg0YLQviDQtdGB0LvQuCBOID0gbiDQv9GA0Lgg0L/QtdGA0LLQvtC5INC40YLQtdGA0LDRhtC40LggCiAgICAvLyAg0L/RgNC40LTRkdGC0YHRjyDQv9GA0L7QudGC0LggTiDRjdC70LXQvNC10L3RgtC+0LIsINC/0YDQuCDQutCw0LbQtNC+0Lkg0YHQu9C10LTRg9GO0YnQtdC5IE4gLSBpLCAKICAgIC8vICDQs9C00LUgaSAtINC90L7QvNC10YAg0LjRgtC10YDQsNGG0LjQuC4g0JIg0YLQsNC60L7QvCDRgdC70YPRh9Cw0LUg0L/QvtGC0YDQtdCx0YPQtdGC0YHRjyDQtNC+IE5eMi8yINC+0L/QtdGA0LDRhtC40LkuCiAgICAvLyAg0KHRg9C00Y8g0L/QviDQstGB0LXQvNGDLCDQstGC0L7RgNC+0Lkg0YHQu9GD0YfQsNC5INC/0YDQtdC00L/QvtGH0YLQuNGC0LXQu9GM0L3QtdC1LCAKICAgIC8vICDRgi7Qui4g0L3QtSDQv9C+0YLRgNC10LHRg9C10YLRgdGPIE4g0YDQsNC3INCy0YvQt9GL0LLQsNGC0Ywg0YTRg9C90LrRhtC40Y4g0L/QvtC40YHQutCwINC/0L4g0YHQv9C40YHQutGDLCAKICAgIC8vICDQstC80LXRgdGC0L4g0Y3RgtC+0LPQviDQv9C+0YLRgNC10LHRg9C10YLRgdGPIG4g0YDQsNC3INCy0YvQt9Cy0LDRgtGMIHNwZWN0cnVtKCkg0YDQtdC60YPRgNGB0LjQstC90L4sCiAgICAvLyAg0L7QsdGA0LDQsdCw0YLRi9Cy0LDRjyDQvNCw0YHRgdC40LIg0LIg0LjRgtC+0LPQtSBuINGA0LDQty4KICAgIAogICAgaW50IGksIGo7CiAgICAKICAgIC8qCiAgICAqKiAg0KDQtdCw0LvQuNC30LDRhtC40Y8g0LLRgtC+0YDQvtCz0L4g0YHQu9GD0YfQsNGPLgogICAgKi8gICAgICAgCgogICAgdW5zaWduZWQgbG9uZyBhcnJbTl07IC8vICDQvNCw0YHRgdC40LIsINCyINC60L7RgtC+0YDRi9C5INCx0YPQtNC10Lwg0LfQsNC/0LjRgdGL0LLQsNGC0Ywg0L3QvtCy0YvQtSDQv9C40LrRgdC10LvQuC4KICAgIAkJCQkJICAvLyAg0L/QvtC90Y/RgtC90L4sINGH0YLQviDQvtC9INC00LDQttC1INGH0LXRgNC10YHRh9GD0YAg0LHQvtC70YzRiNC+0LkKICAgIHVuc2lnbmVkIGxvbmcgcGl4OwkgIC8vICDQv9C10YDQstGL0Lkg0L/QuNC60YHQtdC70YwJCiAgICB1bnNpZ25lZCBsb25nIGNoID0gMDsgLy8gINGN0YLQviDQsdGD0LTQtdGCINGB0YfRkdGC0YfQuNC6CgogICAgcGl4ID0gbWFwWzBdOwogICAgaiA9IDA7CiAgICBmb3IoIGkgPSAwOyBpIDwgTjsgaSsrICl7CiAgICAJLy8g0L/QtdGA0LXQsdC40YDQsNC10Lwg0L/QuNC60YHQtdC70LgKICAgICAgICBpZiggbWFwW2ldICE9IHBpeCl7CiAgICAgICAgCS8vINCy0YvQv9C40YHRi9Cy0LDQtdC8INC90L7QstGL0LUg0LIg0LfQsNCz0L7RgtC+0LLQu9C10L3QvdGL0Lkg0LzQsNGB0YHQuNCyCiAgICAgICAgICAgIGFycltqKytdID0gbWFwW2ldOwogICAgICAgIH0KICAgICAgICBlbHNlIAogICAgICAgIAkvLyDQsCDQtNC70Y8g0YHQvtCy0L/QsNC00LDRjtGJ0LjRhSDQuNC90LrRgNC10LzQtdC90YLQuNGA0YPQtdC8INGB0YfRkdGC0YfQuNC6CiAgICAgICAgICAgIGNoKys7CiAgICB9CiAgICBwcmludGYoIiUxMHgsICUxMGxpLCAlMTBsaSBcbiIsIHBpeCwgY2gsIE4pOwogICAgCS8vINCy0YvQstC+0LQg0LLRgNC+0LTQtSAKICAgIAkvKgogICAgCSAgICAgICAgICAJCQkgMCwgICAgICA1MjQ4OCwgICAgIDMxMjc1MCAKCQkJCQkxCgkJCQkJICAgIDQwMDAwMCwgICAgICAxMTI0MiwgICAgIDI2MDI2MiAKCQkJCQkyCgkJCQkJICAgIDQwNDA0MCwgICAgICAzMDU1OCwgICAgIDI0OTAyMCAKCQkJCQkzCgkJCQkJICAgICAgICA0MCwgICAgICAgIDU0NSwgICAgIDIxODQ2MiAKCQkJCQk0CgkJCQkJU2VnbWVudGF0aW9uIGZhdWx0IChjb3JlIGR1bXBlZCkKCQkqLwoJCQogICAgaWYoaiA+IDApewogICAgICAgIHByaW50ZigiJWRcbiIsIGsrKyk7IAkvLyDQstGL0YjQtSDQsiDQstGL0LLQvtC00LUg0YbQuNGE0YDRiyDRgdC70LXQstCwIDEsIDIsIDMsIDQKICAgICAgICBzcGVjdHJ1bShhcnIsIGosIGZpbGUpOwkvLyDQstGL0LfRi9Cy0LDQtdC8INGA0LXQutGD0YDRgdC40LLQvdC+INGBINC90L7QstGL0Lwg0YHQv9C40YHQutC+0LwKICAgIH0KICAgIHJldHVybiAwOwkvLyDQv9GA0L7RgdGC0L4g0YfRgtC+0LHRiyDQsdGL0LvQvgogICAgCiAgICAvKgogICAgKiogIFNlZ21lbnRhdGlvbiBmYXVsdCDQtNC70Y8g0LHQvtC70YzRiNC40YUg0YTQsNC50LvQvtCyLiAKICAgICoqICDQodGD0LTRjyDQv9C+INCy0YHQtdC80YMsINC/0LXRgNC10L/QvtC70L3Rj9C10YLRgdGPIGNhbGwgc3RhY2sKICAgICoqICDQm9C40LHQviDQutC+0L3Rh9Cw0LXRgtGB0Y8g0LLRi9C00LXQu9C10L3QvdCw0Y8g0L/RgNC+0LPRgNCw0LzQvNC1INC/0LDQvNGP0YLRjCwg0YXQty4KICAgICovCgp9
compilation info
prog.c: In function ‘spectrum’:
prog.c:53:5: warning: implicit declaration of function ‘printf’ [-Wimplicit-function-declaration]
printf("%10x, %10li, %10li \n", pix, ch, N);
^~~~~~
prog.c:53:5: warning: incompatible implicit declaration of built-in function ‘printf’
prog.c:53:5: note: include ‘<stdio.h>’ or provide a declaration of ‘printf’
prog.c:53:16: warning: format ‘%x’ expects argument of type ‘unsigned int’, but argument 2 has type ‘long unsigned int’ [-Wformat=]
printf("%10x, %10li, %10li \n", pix, ch, N);
^
prog.c:68:24: error: ‘k’ undeclared (first use in this function)
printf("%d\n", k++); // выше в выводе цифры слева 1, 2, 3, 4
^
prog.c:68:24: note: each undeclared identifier is reported only once for each function it appears in
stdout