Шаблонная программа продолжает выходить из строя

#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; . Это не должно проходить компиляцию.