Сблъсквам се със странен проблем. Написах проста c програма (два изходни файла, съответните секции показани по-долу). Когато стартирам програмата (a.c има основната функция), получавам изхода (тъй като броят пъти, в които извиквам „процес“, е голям, отпечатвам последните няколко разпечатки от изхода на екрана):
ключ: 'Q'
ключ: 'A'
1
ключ: 'A'
ключ: 'A'
1
ключ: 'A'
ключ: 'A'
1
ключ: 'A'
ключ: 'A'
ключ: 'C'
Грешка в сегментирането (ядрото е изхвърлено)
a.c
void process(int* hash, char* input, int number_of_ac) {
int value, i = 0;
for(; i ‹ number_of_ac; i++) {
value = get_value(hash, input[i) ]);
printf("1\n");
инкрементна_стойност(хеш, вход[i]);
}
}
b.c
int get_value(int* hash, char key) {
printf("key: '%c'\n", key);
return hash[get_index(key)];
}
< br>
void increment_value(int* hash, char key) {
int value = get_value(hash, key);
hash[get_index(key)] = ++value;
}
Въпросът ми конкретно е (крайната цел е да се опитам да отстраня грешки защо получавам грешка при сегментиране при голям брой извиквания на „процес“, а не при по-малък брой повиквания), не трябва ли да виждам разпечатка като това:
ключ: 'Q'
1
ключ: 'A'
1
ключ: 'A'
1
ключ: 'A'
и т.н.
< br>
Защо виждам отпечатък от две букви, преди отново да видя 1? Това проблем с пренареждане на буфера ли е при отпечатването на моите отчети на екрана? Или по някакъв начин моята c програма е многопоточна зад сцената?
Между другото, точно същата програма работи на моя лаптоп с МНОГО ПО-ГОЛЯМ набор от входни данни:
Linux ubuntu 3.8.0-25-generic #37-Ubuntu SMP четвъртък, 6 юни 20:47:07 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
Но той прекъсва с грешката на сегментирането по-горе при много по-малък вход на друга машина:
Linux x.y.z 2.6.32-279.19.1.el6.cny6.7068.x86_64 #1 SMP Mon Mar 11 08:59:43 CDT 2013 x86_64 x86_64 x86_64 GNU/Linux
Някакви идеи? Оценявам помощта ви!
increment_value
извикваget_value
и вие извиквате всеки от тях всеки път през вашия цикъл, не бих очаквал да видя резултатите, които очаквате да видите. Бих очаквал да видя нещо по-близко до това, което всъщност виждате.printf
на ключа ще се появи два пъти за всяка итерация на цикъл, аprintf
на1
само веднъж. - person lurker   schedule 17.07.2013