#c #crash
#c #сбой
Вопрос:
Моя программа скомпилируется и запустится нормально, но она вылетает, когда я в программе. Есть идеи, почему?
template<class T>
T findFeq (T arr1[], T target, T arrSize);
template<class T>
T findFreq (T arr1[], T target, T arrSize){
int count = 0;
for(int i = 0; i < arrSize; i ){
if (target == arr1[i])
count ;
}
return count;
}
#include "Ex1.h"
#include <iostream>
using namespace std;
void fillIntArray(int arr1[], int arrSize, intamp; spacesUsed);
void fillDoubleArray(double arr1[], int arrSize, intamp; spacesUsed);
int main(){
const int SIZE = 1000;
int itarget = 42;
double dTarget = 42.0;
int ispacesUsed;
double dspacesUsed;
int iArray[SIZE];
double dArray[SIZE];
fillIntArray(iArray,SIZE,ispacesUsed);
cout << findFreq(iArray,itarget,ispacesUsed) << endl;
fillDoubleArray(dArray,SIZE,dspacesUsed);
cout << findFreq(dArray,dTarget,dspacesUsed) << endl;
return 0;
}
void fillIntArray(int arr1[], int arrSize, intamp; spacesUsed){
int maxSize;
cout << "How many numbers shall i put into the Array? ";
cin >> maxSize;
for (int i = 0; i < maxSize; i ){
arr1[i] = (rand()% 100);
spacesUsed ;
}
}
void fillDoubleArray(double arr1[], int arrSize, intamp; spacesUsed){
int maxSize,i = 0;
cout << "How many numbers shall i put into the Array? ";
cin >> maxSize;
while (i < maxSize){
cout << "Enter number to put in Array: ";
cin >> arr1[i];
i ;
}
}
Комментарии:
1. Запустите ее в отладчике или с помощью такого инструмента, как valgrind. Очевидно, что шаблоны не приводят к сбою вашей программы напрямую, поскольку они создаются во время компиляции, а не во время выполнения. Если вы не можете разобраться с этим с помощью отладчика, попробуйте свести это к более простому примеру и покажите нам, какие ошибки вы получаете.
Ответ №1:
Существует несколько проблем. Но проблема, которая вызовет сбой, заключается в,
for (int i = 0; i < maxSize; i )
Только представьте, что если вы введете maxSize
больше arrSize
? Буфер переполнится, и это приведет либо к неопределенному поведению, либо к сбою. То же самое применимо для while
цикла, предназначенного для заполнения double
массива.
В примечании сбоку измените подпись для findFeq
на:
template<class T>
T findFeq (T arr1[], T target, unsigned int arrSize); // arrSize must be of integer type
Ответ №2:
Проблемы:
-
maxSize
может быть больше, чемSIZE
—> array out of bounds -
T findFeq (T arr1[], T target, size_t arrSize); —> размер массива не должен зависеть от типа T
- fillDoubleArray(DArray,SIZE,dspacesUsed); —> это опасно, 3-й аргумент
sdpacesUsed
должен быть int, а не double amp; . Это не должно проходить компиляцию.