I think this will be an easy one, i think im missing something.
if (((int)row.Cells["Pareto"].Value <= 50) && (row.Cells["Pareto"].Value != null))
this code gives me the error that when casting cant be a number that is infinite.
Ive also tried:
if (((int)row.Cells["Pareto"].Value <= 50) && ((string)row.Cells["Pareto"].Value != null))
if (((int)row.Cells["Pareto"].Value <= 50) && (row.Cells["Pareto"].Value != ""))
any help would be great!
Im using winforms in visual studio 10 using C#.
error: «When casting from a number, the value must be less than infinite»
More of the Code if your interested:
foreach (DataGridViewRow row in dataGridView1.Rows)
{
//countpg
//countPg++;
pgtothold = Convert.ToSingle(row.Cells["Qty"].Value);
countPg += pgtothold;
//if (((int)row.Cells["Pareto"].Value <= 50) && (row.Cells["Pareto"].Value != null))
if ((Convert.ToDouble(row.Cells["Pareto"].Value)) && ((int)row.Cells["Pareto"].Value <= 50)
{
//top 50
//top++;
tempTop = Convert.ToSingle(row.Cells["Qty"].Value);
top += tempTop;
}
else
if (((int)row.Cells["Pareto"].Value > 50) && ((int)row.Cells["Pareto"].Value <= 100) && (row.Cells["Pareto"].Value != ""))
{
//50-100
tempMidt = Convert.ToSingle(row.Cells["Qty"].Value);
tmid += tempMidt;
}
else
Изучение программирования и логики программ может оказаться не простой задачей, спросите любого, кто прошел этот этап, того, кто сделал это. К несчастью, одни и те же проблемы возникают снова и снова, особенно у новичков. В этой статье я постарался собрать одни из наиболее распространенных проблем, с которыми вы непременно столкнетесь, если станете программистом.
1) Использование необъявленных переменных
int main() { cin >> y; cout << y; }
Допустим, вы написали этот код, компилируете программу и тут компилятор сообщает об ошибках. и тут у вас возникает вопрос: «Почему я получаю сообщение об ошибке?». Ответ предельно прост: «Ваш компилятор не знает, что означает y
. И перед тем как использовать y
, вы должны объявить его как переменную.» Ниже показан код, в котором исправлена данная ошибка.
int main() { int y; cin >> y; cout << y; }
2) Использование неинициализированных переменных
int ct; while(ct < 100) { cout << ct; }
Что можно ожидать от этого кода? Да все, что угодно. Мы объявили переменную ct
, но не инициализировали начальным значением, значит там содержится какое-то значение — мусор. Оно может быть огромным или очень маленьким. Поэтому могут быть два случая:
- если значение
ct
меньше 100, то программа попадет в цикл; - чаще всего
ct
огромное число, поэтому скорее всего программа не попадет в цикл.
И самое главное, вы не будете понимать почему это происходит. В C++ переменные неявно не инициализируются нулем, при объявлении. В приведенном выше фрагменте кода, количество может быть любое значение в диапазоне от типа данных int
. Это может, например, быть 7631, в таком случае, условие цикла никогда не будет истинным. Возможно, программа будет печатать цифры от -120 до 99, и это тоже признак ошибки. Поэтому, никогда не забывайте о начальной инициализации переменных.
3. Инициализация переменной мусорным значением
int num1, num2; int sum = num1 + num2; cout << "Введите два числа для суммирования: "; cin >> num1; cin >> num2; cout << "Сумма = " << sum;
Когда запустите программу, вас может удивить результат, например, такой:
CppStudio.com
Введите два числа для суммирования: 5 5 Сумма = 32767
Хотите узнать почему сумма равна 32767 ?
Часто начинающие программисты считают, что переменные и выражения работ — это как уравнения — если присвоить переменной результат операции с несколькими другими переменными (num1
, num2
, в данном примере), которые изменятся позже, предполагают, что значение переменной тоже изменится. C++ не работает таким образом! В примере программы, num1
и num2
не инициализируются перед выполнением операции сложения, поэтому сумма будет равна случайному значению.
Чтобы исправить эту ошибку, переместите операцию суммирования после ввода num1
и num2
.
int num1, num2; cout << "Введите два числа для суммирования: "; cin >> num1; cin >> num2; int sum = num1 + num2; cout << "Сумма = " << sum;
А вот и результат, если не верите, проверьте сами.
CppStudio.com
Введите два числа для суммирования: 5 5 Сумма = 10
4. Использование одного знака равенства для проверки равенства
char ch = 'Y'; while(ch = 'Y') { //какой-то код cout << "Продолжить? (Y/N)"; cin >> ch; }
«Почему никогда не заканчивается цикл?»
Если вы используете один знак равенства для проверки равенства, ваша программа будет вместо сравнения, присваивать значение в правой части выражения, переменной в левой части. В этом случае, значение 'Y'
, которое рассматривается как истинное всегда будет присваиваться переменной ch
. Таким образом, цикл никогда не закончится. Используйте ==
для проверки равенства, кроме того, чтобы избежать случайного присвоения, поменяйте местами переменную ch
и значение 'Y'
. Так, вы получите ошибку компиляции, если случайно использовали один знак равенства, поскольку вы не можете присвоить значение тому, что не является переменной.
char ch = 'Y'; while('Y' == ch) { //какой-то код cout << "Продолжить? (Y/N)"; cin >> ch; }
4. Необъявленная функция
int main() { print(); } void print() { //что-то печатаем }
«Почему я получаю ошибку о том, что программе неизвестна функция print
?»
Компилятор не знает, что такое print()
, так как определение функции print
выполнено после main
и не объявлен прототип. Всегда помните, нужно указать либо прототип функции, либо все определение функции выше строки, в которой будет вызов этой функции.
void print(); int main() { print(); } void print() { //что-то печатаем }
6) Лишние точка с запятой
int ix; for(ix = 0; ix < 100; ix++); cout << ix;
«Почему вывод равен 3476?»
Все дело в том, что вы поставили дополнительные точку с запятой. Помните, что точка с запятой не ставится, после определения, циклов, или функций. Если вы случайно поставите точку с запятой в любом из этих мест, ваша программа будет работать некорректно.
int ix; for(ix = 0; ix < 100; ix++) cout << ix;
7) Нарушение границ массива
int array[10]; //код... for(int ix = 1; ix <= 10; ix++) cout << array[ix];
«Почему вывод программы содержит неправильные значения?»
Элементы массива индексируются, начиная с 0, а значит, общая длинна на 1 меньше. Например, если у вас есть десять элементов массива, первый элемент находится в положении нуля, а последний элемент в позиции 9.
int array[10]; //код... for(int ix = 0; ix < 10; ix++) cout << array[ix];
В этом коде границы массива уже не нарушаются.
Я думаю, что это будет легко, я думаю, что я что-то упустил.
if (((int)row.Cells["Pareto"].Value <= 50) && (row.Cells["Pareto"].Value != null))
этот код дает мне ошибку, что при приведении не может быть бесконечным числом.
Я также попробовал:
if (((int)row.Cells["Pareto"].Value <= 50) && ((string)row.Cells["Pareto"].Value != null))
if (((int)row.Cells["Pareto"].Value <= 50) && (row.Cells["Pareto"].Value != ""))
любая помощь будет отличной!
Я использую winforms в Visual Studio 10 с использованием C#.
ошибка: «При приведении числа число должно быть меньше бесконечного»
Больше кодекса, если вы заинтересованы:
foreach (DataGridViewRow row in dataGridView1.Rows)
{
//countpg
//countPg++;
pgtothold = Convert.ToSingle(row.Cells["Qty"].Value);
countPg += pgtothold;
//if (((int)row.Cells["Pareto"].Value <= 50) && (row.Cells["Pareto"].Value != null))
if ((Convert.ToDouble(row.Cells["Pareto"].Value)) && ((int)row.Cells["Pareto"].Value <= 50)
{
//top 50
//top++;
tempTop = Convert.ToSingle(row.Cells["Qty"].Value);
top += tempTop;
}
else
if (((int)row.Cells["Pareto"].Value > 50) && ((int)row.Cells["Pareto"].Value <= 100) && (row.Cells["Pareto"].Value != ""))
{
//50-100
tempMidt = Convert.ToSingle(row.Cells["Qty"].Value);
tmid += tempMidt;
}
else
2012-01-26 16:10
3
ответа
Решение
Я предлагаю вам использовать:
var data = System.Convert.ToInt32(row.Cells["Pareto"].Value);
if( data <=50 )
{
----
}
значение не будет равно 0, если содержимое DBNull (если это приемлемо), поэтому ваш код будет выглядеть чище и безопаснее.
2012-01-26 16:14
if ((row.Cells["Pareto"].Value != null) && ((int)row.Cells["Pareto"].Value <= 50))
Я думаю, ты хочешь этого. Если вещь нулевая, она не оценивает остальную часть AND.
2012-01-26 16:12
Результат от datatable, скорее всего, имеет тип decimal. Так что попробуйте это:
if (((decimal)row.Cells["Pareto"].Value <= 50.0m) && (row.Cells["Pareto"].Value != null))
2013-04-03 19:52
В моих программах бесконечность обычно возникает, когда значение делится на ноль. Я становлюсь неопределенным, когда я делю нуль на ноль. Как вы проверяете бесконечные и неопределенные значения в С++?
В С++ бесконечность представлена как 1. # INF. Неопределенный — -1. # IND. Проблема заключается в том, как проверить, является ли переменная бесконечной или неопределенной. Проверка бесконечности относительно проста: вы найдете определение бесконечности в вашем конкретном С++. Для моего случая (VS2003) это std:: numeric_limits:: infinity(). Вы должны включить «ограничения», чтобы использовать его. Вы можете назначить это бесконечное значение переменной, и вы можете сравнить ее с некоторым значением, чтобы проверить, является ли это значение бесконечным.
Неопределенный немного сложнее, потому что вы не можете сравнивать неопределенное значение с каким-либо другим значением. Любое сравнение возвращает false. Вы можете использовать это свойство для определения неопределенного значения, сравнивая его с самим собой. Скажем, у вас есть двойная переменная, называемая aVal. В нормальных условиях aVal!= AVal возвращает false. Но если значение неопределенно, aIndVal!= AIndVal возвращает true. Эта странная ситуация отсутствует для бесконечных значений, т.е. AInfVal!= AInfVal всегда возвращает false.
Вот две функции, которые можно использовать для проверки неопределенных и бесконечных значений:
#include "limits.h"
#include "math.h"
bool isIndeterminate(const double pV)
{
return (pV != pV);
}
bool isInfinite(const double pV)
{
return (fabs(pV) == std::numeric_limits::infinity())
}
Есть ли лучшие способы для этих проверок, я что-то пропустил?
C# | ||
|
System.ArgumentNullException: «Значение не может быть неопределенным.
Имя параметра: text»
Помогите пожалуйста. Какое то время работает, потом начинаешь копировать текст(смотря сколько) вылетает через какое то время ошибка. Программа по таймеру ищет номер телефона в буфере, вроде все впорядке, проверку на текст сделал, интервал 500 ms. Может быть лучше сделать бесконечный цикл? While (true)? Просто я где — то слышал, что пока код в таймере не выполнится, он новый не начнет, а с циклом такое может быть. Буду очень признателен