2015-03-18 4 views
0

У меня возникли проблемы с созданием простой программы. Программа запрашивает количество входящих значений для сбора (которое используется для создания массива соответствующего размера), собирает значения и вычисляет произведение всех чисел, позиция которых равна> = 1. Проблема заключается в том, что независимо от того, какой размер (т. е. который контролирует размер созданного массива), размер массива всегда указывается как 4. Например, если собрано 10 входов, создается массив размером 10, но проверка размера массива будет равна 4.Как определить размер массива?

Это код:

int main() { 

    double *aNumberArray = 0; 
    aNumberArray = askNumbers(); 

    int position = 0; 
    position = sizeof(aNumberArray); 

    for (int i = 0; i < position; i++) { 

     cout << aNumberArray[i] << endl; 
    } 

    cout << "The product of your numbers is " << productOfArray(aNumberArray, position) << endl; 

    delete[] aNumberArray; 
    return 0; 
} 


double *askNumbers() { 
    int size; 
    double *numbers ; 

    cout << "Product of the numbers which positions are n >= 1" << endl; 
    cout << "How many numbers would you like to multiply? "; 
    cin >> size; 

    numbers = new double[size]; 

    cout << "Type in your numbers: " << endl; 

    for (int i = 0; i < size; i++) { 

     cout << "Number " << i + 1 << ": "; 
     cin >> numbers[i]; 

    } 

    return numbers; 
} 

double productOfArray(const double anArray[], int size) { 

    const double number = 1; 
    double product = 0; 

    if (size >= 1) { 

     product = anArray[size] * (productOfArray(anArray, size - 1)); 

    } 
    else if (size == 0) 
     return number; 

    return product; 
} 
+6

Это ключ, что 'sizeof' не делать то, что вы думаете, что делает, и это время, чтобы сделать некоторые исследования. – chris

+0

sizeof не возвращает переменную int, указывающую, сколько элементов находится в массиве? – Silvestrini

+0

Нет, и он не задает массив вместо указателя. Это даже не приводит к 'int', а' size_t'. – chris

ответ

1
double *aNumberArray = 0; 
position = sizeof(aNumberArray); 

переменная aNumberArray является указатель, а не массив. Следовательно, его размер - это размер указателя (четыре в вашем случае).

Указатель не несет никакой информации о размере для основополагающей массива объектов, вы можете получить только размер указателя или размер указателя объекта один к.

Если вы хотите передать размер обратно, вы могли бы использовать что-то вроде:

double *askNumbers(int &size) { 
    double *numbers ; 

    cout << "Product of the numbers which positions are n >= 1" << endl; 
    cout << "How many numbers would you like to multiply? "; 
    cin >> size; 

    numbers = new double[size]; 

    //get numbers, blah blah blah 

    return numbers; 
} 

и назвать его:

double *aNumberArray = 0; 
int position; 
aNumberArray = askNumbers(position); 

Вы можете увидеть эффект с помощью следующего кода :

Когда вы компилируете ле и запустить, что вы можете увидеть, что размер действительно передается обратно, используя предложенный метод:

What size? 4 
0.000000 
3.141590 
6.283180 
9.424770 

Но вы могли бы также рассмотреть возможность стать «реальной» разработчик C++, а не гибрид C + разработчик (странная порода, которая, похоже, полностью не сделала переход). Вы можете сделать это с помощью коллекции, которые приходят со стандартной библиотекой, такие как вектор, который делает нести размер вместе с ним:

#include <iostream> 
#include <iomanip> 
#include <vector> 

std::vector<double> getArray() { 
    int sz; 
    std::cout << "What size? "; 
    std::cin >> sz; 
    std::vector<double> vect = std::vector<double>(sz); 
    for (int i = 0; i < sz; i++) 
     vect[i] = 3.14159 * i; 
    return vect; 

} 

int main(int argc, char *argv[]){ 
    std::vector<double> xyzzy = getArray(); 
    for (int i = 0; i < xyzzy.size(); i++) 
     std::cout << std::fixed << std::setw(6) << xyzzy[i] << '\n'; 
    return 0; 
} 

Это не выглядеть, что гораздо проще, но это я стану настолько, что ваша программа станет больше, и знание того, как ее использовать, сделает вашу жизнь намного проще в долгосрочной перспективе.

+0

Я вижу, так как я могу получить размер массива? Сделайте еще одну функцию, чтобы определить размер? – Silvestrini

+0

Это помогло. Спасибо за решение и руководство. Не забудьте проверить Vectors, так как это, вероятно, облегчает работу с массивами и указателями! – Silvestrini

Смежные вопросы