Ваш вопрос о неинициализированных переменных хорошо освещен в комментариях и других ответах; Этот ответ для вашего второго вопроса, о неожиданном выводе из getAverage()
.
Вы определяете balance
как массив double
, но getAverage()
ожидает массив int
. Когда я изменяю:
double getAverage(int arr[], int size) { ... }
на:
double getAverage(double arr[], int size) { ... }
, я получаю ожидаемый результат: 215.2. Неявное преобразование типов [1] в вашем исходном коде вызывает неожиданное поведение.
Кроме того, я не знаю, какой компилятор вы используете, но когда я скомпилировал ваш оригинальный код [2], gcc
выдал это предупреждение:
warning: incompatible pointer types passing 'double [5]' to parameter of type 'int *'
... который мертв поддавайся тому, что назревает проблема. Если ваш компилятор не генерирует это предупреждение, или если у вас есть предупреждения, которые подавлены, или если они записаны в файл или что-то, что вы не просматриваете, я рекомендую снова сделать их видимыми; уделение внимания предупреждениям компилятора спасло меня от неисчислимых часов горя.
[1] «преобразование типов», возможно, не лучший термин здесь; преобразование типов обычно не вызывает затруднений, хотя есть некоторые ошибки; здесь происходит то, что байты, составляющие значение double
, читаются как int
, и структура байтов этих двух типов данных очень различна; вот почему при выводе вашего исходного кода создается впечатление, что он имеет дело с такими сумасшедшими большими числами: например, байты, используемые для представления «17» в виде двойного числа, когда читается как int
, становятся очень, очень разными числами. Хуже того, проходя через байты, составляющие массив значений double
, как если бы это был массив значений int
, он, вероятно, даже не смотрит на элементы массива на соответствующих границах элементов. Короче говоря, несоответствие типов вызывает хаос.
[2] Под «исходным кодом» я подразумеваю ваш код с достаточным количеством служебного кода для его компиляции, например, include
прагмы и тело main()
; Я в целом согласен с другими комментариями о предоставлении полного, минимального примера.
Вам нужно будет обратиться к третьей стороне. Я успешно использовал данные Melissa для проверки адреса, они также предлагают подтверждение по телефону, но я не использовал их
http://www.melissadata.com/listservices/resphoneverify.htm
Если получаю 100% правильный номер телефона имеет решающее значение, я бы посмотрел на службу, которая действительно позвонила бы по номеру, предоставила бы проверочный код и заставила бы пользователя подтвердить этот код на сайте. Это PIA с точки зрения пользователей, но это наиболее полный путь, который вы можете выбрать. Быстрый поиск в Google привел к появлению этого сайта http://www.phoneconfirm.com , который, кажется, делает то, что я упоминал. Я уверен, что есть и другие.
Если вы не можете / не хотите обращаться к третьей стороне, я не могу представить, чтобы написать что-то подобное самому было бы невозможно.
всегда можно было использовать с хорошим старым военным дозвонщиком
Однажды я сделал что-то подобное. Ага, для телемаркетеров. И да, это тревожит мою совесть по сей день.
Он был основан на модуле app_amd.c (Обнаружение автоответчика), который был сторонней надстройкой для Asterisk и, как ни странно, можно найти в их основном дереве сейчас. С помощью E1 / T1 вы также можете различать плохие номера, занятость и многие другие коды состояния. Посмотрите это, это может помочь.
Я считаю, что система CTI, использующая службу вызовов ISDN, может быстро вернуть код состояния, указывающий, что номер действителен / недействителен перед пунктом назначения начинает звонить.
Один из поставщиков - Katalina systems, их продукт называется VoiceGuide, и у них есть модуль дозвона, который может дать вам то, что вы хотите. см. www.voiceguide.com.
Просто экспортируйте список звонков в номеронабиратель (файл csv) и просмотрите статус звонка после обработки.
Если список очень большой, это может оправдать покупку системы для этого. Скорость звонка зависит от количества установленных / доступных линий. Вам могут потребоваться некоторые пользовательские изменения, чтобы прервать вызов после получения статуса. Каталина должна быть в состоянии помочь. Я не уверен, могут ли соединительные линии VoIP предоставить вам полный доступ к статусу линии.