Types of Errors in C
Overview
An error in the C language is an issue that arises in a program, making the program not work in the way it was supposed to work or may stop it from compiling as well.
If an error appears in a program, the program can do one of the following three things: the code will not compile, the program will stop working during execution, or the program will generate garbage values or incorrect output. There are five different types of errors in C Programming like Syntax Error, Run Time Error, Logical Error, Semantic Error, and Linker Error.
Scope
- This article explains errors and their types in C Programming Language.
- This article covers the explanation and examples for each type of error in C Programming Language (syntax error, run time error, logical error, semantic error, linker error).
Introduction
Let us say you want to create a program that prints today’s date. But instead of writing printf in the code, you wrote print. Because of this, our program will generate an error as the compiler would not understand what the word print means. Hence, today’s date will not print. This is what we call an error. An error is a fault or problem in a program that leads to abnormal behavior of the program. In other words, an error is a situation in which the program does something which it was not supposed to do. This includes producing incorrect or unexpected output, stopping a program that was running, or hindering the code’s compilation. Therefore it is important to remove all errors from our code, this is known as debugging.
How to Read an Error in C?
In order to resolve an error, we must figure out how and why did the error occur. Whenever we encounter an error in our code, the compiler stops the code compilation if it is a syntax error or it either stops the program’s execution or generates a garbage value if it is a run time error.
Syntax errors are easy to figure out because the compiler highlights the line of code that caused the error. Generally, we can find the error’s root cause on the highlighted line or above the highlighted line.
For example:
#include <stdio.h> int main() { int var = 10 return 0; }
Output:
error: expected ',' or ';' before 'return' 4 | return 0;
As we can see, the compiler shows an error on line 4 of the code. So, in order to figure out the problem, we will go through line 4 and a few lines above it. Once we do that, we can quickly determine that we are missing a semi-colon (;) in line 4. The compiler also suggested the same thing.
Other than the syntax errors, run time errors are often encountered while coding. These errors are the ones that occur while the code is being executed.
Let us now see an example of a run time error:
#include<stdio.h> void main() { int var; var = 20 / 0; printf("%d", var); }
Output:
warning: division by zero [-Wdiv-by-zero] 6 | var = 20 / 0;
As we can see, the compiler generated a warning at line 6 because we are dividing a number by zero.
Sometimes, the compiler does not throw a run time error. Instead, it returns a garbage value. In situations like these, we have to figure out why did we get an incorrect output by comparing the output with the expected output. In other cases, the compiler does not display any error at all. The program execution just ends abruptly in cases like these.
Let us take another example to understand this kind of run time error:
#include <stdio.h> #include <stdlib.h> int main() { int arr[1]; arr[0] = 10; int val = arr[10000]; printf("%d", val); return 0; }
Output:
In the above code, we are trying to access the 10000th element but the size of array is only 1 therefore there is no space allocated to the 10000th element, this is known as segmentation fault.
Types of Errors in C
There are five different types of errors in C.
- Syntax Error
- Run Time Error
- Logical Error
- Semantic Error
- Linker Error
1. Syntax Error
Syntax errors occur when a programmer makes mistakes in typing the code’s syntax correctly or makes typos. In other words, syntax errors occur when a programmer does not follow the set of rules defined for the syntax of C language.
Syntax errors are sometimes also called compilation errors because they are always detected by the compiler. Generally, these errors can be easily identified and rectified by programmers.
The most commonly occurring syntax errors in C language are:
- Missing semi-colon (;)
- Missing parenthesis ({})
- Assigning value to a variable without declaring it
Let us take an example to understand syntax errors:
#include <stdio.h> void main() { var = 5; // we did not declare the data type of variable printf("The variable is: %d", var); }
Output:
error: 'var' undeclared (first use in this function)
If the user assigns any value to a variable without defining the data type of the variable, the compiler throws a syntax error.
Let’s see another example:
#include <stdio.h> void main() { for (int i = 0;) { // incorrect syntax of the for loop printf("Scaler Academy"); } }
Output:
error: expected expression before ')' token
A for loop needs 3 arguments to run. Since we entered only one argument, the compiler threw a syntax error.
2. Runtime Error
Errors that occur during the execution (or running) of a program are called RunTime Errors. These errors occur after the program has been compiled successfully. When a program is running, and it is not able to perform any particular operation, it means that we have encountered a run time error. For example, while a certain program is running, if it encounters the square root of -1 in the code, the program will not be able to generate an output because calculating the square root of -1 is not possible. Hence, the program will produce an error.
Runtime errors can be a little tricky to identify because the compiler can not detect these errors. They can only be identified once the program is running. Some of the most common run time errors are: number not divisible by zero, array index out of bounds, string index out of bounds, etc.
Runtime errors can occur because of various reasons. Some of the reasons are:
- Mistakes in the Code: Let us say during the execution of a while loop, the programmer forgets to enter a break statement. This will lead the program to run infinite times, hence resulting in a run time error.
- Memory Leaks: If a programmer creates an array in the heap but forgets to delete the array’s data, the program might start leaking memory, resulting in a run time error.
- Mathematically Incorrect Operations: Dividing a number by zero, or calculating the square root of -1 will also result in a run time error.
- Undefined Variables: If a programmer forgets to define a variable in the code, the program will generate a run time error.
Example 1:
// A program that calculates the square root of integers #include <stdio.h> #include <math.h> int main() { for (int i = 4; i >= -2; i--) { printf("%f", sqrt(i)); printf("n"); } return 0; }
Output:
2.000000 1.732051 1.414214 1.000000 0.000000 -1.#IND00 -1.#IND00
**In some compilers, you may also see this output: **
2.000000 1.732051 1.414214 1.000000 0.000000 -nan -nan
In the above example, we used a for loop to calculate the square root of six integers. But because we also tried calculating the square root of two negative numbers, the program generated two errors (the IND written above stands for «Indeterminate»). These errors are the run time errors.
-nan is similar to IND.Example 2:
#include<stdio.h> void main() { int var = 2147483649; printf("%d", var); }
Output:
This is an integer overflow error. The maximum value an integer can hold in C is 2147483647. Since in the above example, we assigned 2147483649 to the variable var, the variable overflows, and we get -2147483647 as the output (because of the circular property).
3. Logical Error
Sometimes, we do not get the output we expected after the compilation and execution of a program. Even though the code seems error free, the output generated is different from the expected one. These types of errors are called Logical Errors. Logical errors are those errors in which we think that our code is correct, the code compiles without any error and gives no error while it is running, but the output we get is different from the output we expected.
In 1999, NASA lost a spacecraft due to a logical error. This happened because of some miscalculations between the English and the American Units. The software was coded to work for one system but was used with the other.
For Example:
#include <stdio.h> void main() { float a = 10; float b = 5; if (b = 0) { // we wrote = instead of == printf("Division by zero is not possible"); } else { printf("The output is: %f", a/b); } }
Output:
INF signifies a division by zero error. In the above example, at line 8, we wanted to check whether the variable b was equal to zero. But instead of using the equal to comparison operator (==), we use the assignment operator (=). Because of this, the if statement became false and the value of b became 0. Finally, the else clause got executed.
4. Semantic Error
Errors that occur because the compiler is unable to understand the written code are called Semantic Errors. A semantic error will be generated if the code makes no sense to the compiler, even though it is syntactically correct. It is like using the wrong word in the wrong place in the English language. For example, adding a string to an integer will generate a semantic error.
Semantic errors are different from syntax errors, as syntax errors signify that the structure of a program is incorrect without considering its meaning. On the other hand, semantic errors signify the incorrect implementation of a program by considering the meaning of the program.
The most commonly occurring semantic errors are: use of un-initialized variables, type compatibility, and array index out of bounds.
Example 1:
#include <stdio.h> void main() { int a, b, c; a * b = c; // This will generate a semantic error }
Output:
error: lvalue required as left operand of assignment
When we have an expression on the left-hand side of an assignment operator (=), the program generates a semantic error. Even though the code is syntactically correct, the compiler does not understand the code.
Example 2:
#include <stdio.h> void main() { int arr[5] = {5, 10, 15, 20, 25}; int arraySize = sizeof(arr)/sizeof(arr[0]); for (int i = 0; i <= arraySize; i++) { printf("%d n", arr[i]); } }
Output:
In the above example, we printed six elements while the array arr only had five. Because we tried to access the sixth element of the array, we got a semantic error and hence, the program generated a garbage value.
5. Linker Error
Linker is a program that takes the object files generated by the compiler and combines them into a single executable file. Linker errors are the errors encountered when the executable file of the code can not be generated even though the code gets compiled successfully. This error is generated when a different object file is unable to link with the main object file. We can run into a linked error if we have imported an incorrect header file in the code, we have a wrong function declaration, etc.
For Example:
#include <stdio.h> void Main() { int var = 10; printf("%d", var); }
Output:
undefined reference to `main'
In the above code, as we wrote Main() instead of main(), the program generated a linker error. This happens because every file in the C language must have a main() function. As in the above program, we did not have a main() function, the program was unable to run the code, and we got an error. This is one of the most common type of linker error.
Conclusion
- There are 5 different types of errors in C programming language: Syntax error, Runtime error, Logical error, Semantic error, and Linker error.
- Syntax errors, linker errors, and semantic errors can be identified by the compiler during compilation. Logical errors and run time errors are encountered after the program is compiled and executed.
- Syntax errors, linker errors, and semantic errors are relatively easy to identify and rectify compared to the logical and run time errors. This is so because the compiler generates these 3 (syntax, linker, semantic) errors during compilation itself, while the other 2 errors are generated during or after the execution.
Improve Article
Save Article
Improve Article
Save Article
Variables: A variable is the name given to a memory location. It is the basic unit of storage in a program.
- The value stored in a variable can be changed during program execution.
- A variable is only a name given to a memory location, all the operations done on the variable effects that memory location.
- All the variables must be declared before use.
How to declare variables?
We can declare variables in common languages (like C, C++, Java etc) as follows:
where: datatype: Type of data that can be stored in this variable. variable_name: Name given to the variable. value: It is the initial value stored in the variable.
How to avoid errors while creating variables?
- The identifier is undeclared: In any programming language, all variables have to be declared before they are used. If you try to use the name of a such that hasn’t been declared yet, an “undeclared identifier” compile-error will occur.
Example:
#include <stdio.h>
int
main()
{
printf
(
"%d"
, x);
return
0;
}
Compile Errors:
prog.c: In function 'main': prog.c:5:18: error: 'x' undeclared (first use in this function) printf("%d", x); ^ prog.c:5:18: note: each undeclared identifier is reported only once for each function it appears in
- No initial value is given to the variable: This error commonly occurs when the variable is declared, but not initialized. It means that the variable is created but no value is given to it. Hence it will take the default value then. But in C language, this might lead to error as this variable can have a garbage value (or 0) as its default value. In other languages, 0 will be its default value.
Example:
#include <stdio.h>
int
main()
{
int
x;
printf
(
"%d"
, x);
return
0;
}
Output:
0
- Using variable out of its Scope: Scope of a variable is the part of the program where the variable is accessible. Like C/C++, in Java, all identifiers are lexically (or statically) scoped, i.e.scope of a variable can be determined at compile time and independent of the function call stack.
Example:
#include <stdio.h>
int
main()
{
{
int
x = 5;
}
printf
(
"%d"
, x);
return
0;
}
Compile Errors:
prog.c: In function 'main': prog.c:5:18: error: 'x' undeclared (first use in this function) printf("%d", x); ^ prog.c:5:18: note: each undeclared identifier is reported only once for each function it appears in
How to Correct the above code: Declare the variable x before using it in the outer scope. Or you can use the already defined variable x in its own scope
Example:
#include <stdio.h>
int
main()
{
{
int
x = 5;
printf
(
"%d"
, x);
}
return
0;
}
Output:
5
- Creating a variable with an incorrect type of value: This arises due to the fact that values are implicitly or explicitly converted into another type. Sometimes this can lead to Warnings or errors.
Example:
#include <stdio.h>
int
main()
{
char
* x;
int
i = x;
printf
(
"%d"
, x);
return
0;
}
Warning:
prog.c: In function 'main': prog.c:7:13: warning: initialization makes integer from pointer without a cast [-Wint-conversion] int i = x; ^
Очень часто начинающие программисты впадают в суеверный ужас, когда видят, что компилятор нашел в тексте программы ошибку, но не понимают, в чем она заключается.
А если помножить этот факт на незнание английского языка («чего там ему не нравится?..») и слабое владение синтаксисом C++ («хм, а может, тут нужна точка с запятой…»), то проблема принимает масштаб катастрофы.
Тот факт, что компилятор в силу своих ограниченных возможностей изо всех сил старается объяснить, что конкретно неверно, не спасает ситуацию. Как быть, если гуглить неохота, а спросить не у кого?
В этом посте на правах копипаста с последующим переводом, дополнениями и исправлениями приведу описание наиболее распространенных сообщений об ошибках и предупреждений компилятора. Неприятность кроется в том факте, что разные компиляторы ругаются на одинаковые ошибки по-разному, а некоторые даже не замечают то, что другие принимают за ошибку. Все зависит от совести разработчиков компилятора, даты его выпуска, и др.
В качестве компилятора возьмем g++, который, в частности, может использоваться в среде Code::Blocks. Версия gcc (куда входит g++) для ОС Windows зовется MinGW. По ходу я буду давать аналоги ошибок из лексикона русскоязычной Microsoft Visual C++.
Итак, частые ошибки:
undeclared identifier
1) Пример
doy.cpp: In function 'int main()':
doy.cpp:25: 'DayOfYear' undeclared (first use this function)
doy.cpp:25: (Each undeclared identifier is reported only once for each function it appears in.)
doy.cpp:25: parse error before ';' token
2) Смысл
Использован идентификатор DayOfYear
, но компилятор не нашел его объявления. Он не знает, что такое DayOfYear
.
3) Когда бывает
- Вы забыли включить какой-то заголовочный файл (
#include...
) - Вы где-то ошиблись в написании идентификатора (при объявлении или использовании)
- Вы вообще забыли, что эту переменную надо объявить
Попытавшись скомпилировать это в Microsoft Visual C++, вы увидите:
error C2065: DayOfYear: необъявленный идентификатор
cout undeclared
1) Пример
xyz.cpp: In function 'int main()':
xyz.cpp:6: 'cout' undeclared (first use this function)
xyz.cpp:6: (Each undeclared identifier is reported only once for each function it appears in.)
2) Смысл
Суперклассика. Без комментариев.
3) Когда бывает
- Вы забыли включить
<iostream>
- Вы забыли написать
using namespace std;
jump to case label
1) Пример
switch.cpp: In function 'int main()':
switch.cpp:14: jump to case label
switch.cpp:11: crosses initialization of 'int y'
2) Смысл
Смысл туманен
3) Когда бывает
Вы попытались объявить и инициализировать переменную (объект, указатель и т.п.) в метке case оператора выбора switch. Правилами C++ это запрещено.
В Microsoft Visual C++ эта ошибка зовется
error C2360: пропуск инициализации 'y' из-за метки 'case'
Выход: заключите операторы этого case’а в фигурные скобки {}.
multi-line string / unterminated string
1) Пример
Программка
#include <iostream>
using namespace std;
int main()
{
cout << "Bob is my buddy;
cout << "and so is Mary" << endl;
}
вызовет бурную реакцию компилятора:
string.cpp:7:12: warning: multi-line string literals are deprecated
string.cpp: In function 'int main()':
string.cpp:7: 'so' undeclared (first use this function)
string.cpp:7: (Each undeclared identifier is reported only once for each function it appears in.)
string.cpp:7: parse error before 'Mary'
string.cpp:8:28: warning: multi-line string literals are deprecated
string.cpp:8:28: missing terminating " character
string.cpp:7:12: possible start of unterminated string literal
2) Смысл
Компилятор думает, что мы хотим создать строковую константу с содержащимся в ней переносом строки, что-то типа
"Hello
world!"
что не поддерживается языком. Также делается предположение о том, что мы, возможно, забыли поставить кавычки в конце первой строки. Собственно, так оно и есть.
3) Когда бывает
Когда не соблюдается правильное количество и положение кавычек в строковых литералах. Надо быть внимательнее.
Microsoft Visual C++ со свойственной ему детской непосредственностью, отметит, что нельзя делать переносы в строках и возмутится, где точка с запятой:
error C2001: newline в константе
error C2146: синтаксическая ошибка: отсутствие ";" перед идентификатором "cout"
comparison between signed and unsigned integer expressions
1) Пример
xyz.cpp: In function 'int main()':
xyz.cpp:54: warning: comparison between signed and unsigned integer expressions
2) Смысл
Это — предупреждение компилятора, которое говорит о том, что мы пытаемся сравнить (==, и т.д.) целочисленное выражение (может принимать положительные, отрицательные значения и 0) и беззнаковое целочисленное выражение (может быть только положительным, либо 0).
3) Когда бывает
Собственно, тогда и бывает. Напомню, что тип int
по умолчанию знаковый, а некоторые функции (например, vector::size()
) возвращают unsigned int
.
К примеру, следующий на первый взгляд безобидный код вызовет описываемое предупреждение:
for (int i = 0; i < grades.size(); i++)
{
// ...
}
Следует помнить, что в памяти знаковые и беззнаковые типы имеют разные внутренние представления, поэтому надо быть чертовски осторожными с указателями.
В Microsoft Visual C++ предупреждение выглядит так:
warning C4018: <: несоответствие типов со знаком и без знака
suggest parentheses around assignment used as truth value
1) Пример
xyz.cpp: In function `int main()':
xyz.cpp:54: warning: suggest parentheses around assignment used as truth value
2) Смысл
Тоже классика. Компилятор предполагает (и в 99% случаев прав), что вы по ошибке включили в скобки в качестве условия для if/while/for вместо условного выражения выражение присваивания.
3) Когда бывает
Чаще всего — в if
‘ах, когда вместо "=="
используется "="
if (length = maxLength)
вместо
if (length == maxLength)
Заминка в том, что это не ошибка, т.к. в скомпилированной программе (если мы проигнорируем предупреждение) выражение присваивания (которое возвращает значение правого аргумента) во всех случаях, кроме тех, когда оно вернет 0
, будет преобразовано к true
.
Ссылки для дальнейшего изучения
Ошибки построения Microsoft Visual C++
GCC Compiler error messages
GCC Warnings
P.S. Следует отметить, что кроме ошибок стадии компиляции встречаются (гораздо реже) ошибки препроцессора (например, если не найден заголовочный файл <iostram>
), ошибки стадии компоновки (можно избежать, если научиться пользоваться средой программирования) и — самый гнусный тип ошибок! — ошибки стадии выполнения. Т.н. runtime error. С ними может справиться только голова программиста, вооруженная отладчиком.
ASORGOO 0 / 0 / 0 Регистрация: 11.01.2020 Сообщений: 47 |
||||
1 |
||||
29.05.2021, 17:05. Показов 1732. Ответов 4 Метки си (Все метки)
Здравствуй форум. Столкнулся с такой проблемой:
__________________
0 |
2083 / 918 / 428 Регистрация: 17.11.2018 Сообщений: 2,405 |
|
29.05.2021, 17:48 |
2 |
0 |
0 / 0 / 0 Регистрация: 11.01.2020 Сообщений: 47 |
|
29.05.2021, 18:16 [ТС] |
3 |
Так то да, это работающий код, но он на C++. А я писал на Си. Хоть вроде сильных отличий между языками и кодами нет, anyway не работает
0 |
analogov net 2083 / 918 / 428 Регистрация: 17.11.2018 Сообщений: 2,405 |
||||
29.05.2021, 18:30 |
4 |
|||
Решение
А я писал на Си. ASORGOO, вот на Си:
Код Введите имя файла:test.txt test.txt имеет атрибут только на чтение test.txt - cкрытый файл test.txt - системный файл test.txt - каталог test.txt - архивный файл Process returned 0 (0x0) execution time : 39.208 s Добавлено через 1 минуту
1 |
0 / 0 / 0 Регистрация: 11.01.2020 Сообщений: 47 |
|
29.05.2021, 19:04 [ТС] |
5 |
Весьма благодарю вас
0 |
-
07-02-2013
#1
Registered User
‘a’ undeclared (first use in this function) Error
Hello Programmers, I am trying to make a program that will allow a user to enter their name, from this point, three options should be present for the user to choose, then from that point, two more options should be present. I have if else statements in a switch case and I get the «undeclared» error for the a in the first » if(specificage == a) «. Does anyone know the fix to this, it is the only error I get. I’m new to programming, sorry if I sound like a rookie. Run it if you need, thanks!
NOTE: I use Code::Blocks.Here is the code:
Code:
#include <stdio.h> #include <string.h> int main() { char name[50]; char ageclass[50]; char specificage[50]; printf("Please enter your name: "); fgets(name, 50, stdin); printf("Hello %s", name); printf("Are you a:n"); printf("1. Minorn"); printf("2. Adultn"); printf("3. Senior Citizenn"); printf("Answer(1, 2, or 3): "); fgets(ageclass, 50, stdin); switch (ageclass[50]) { case'1': { printf("You are between the ages of:n"); printf("a. 0-12n"); printf("b. 13-18n"); printf("Answer(a or b): "); fgets(specificage, 50, stdin); if(specificage == a) { printf("You are a young minor."); } else { printf("You are an older minor."); } } case'2': { printf("You are between the ages of:n"); printf("a. 19-50n"); printf("b. 51-65n"); printf("Answer(a or b): "); fgets(specificage, 50, stdin); if(specificage == a) { printf("You are a young adult."); } else { printf("You are an older adult."); } } case'3': { printf("You are between the ages of:n"); printf("a. 66-90n"); printf("b. 91-110n"); printf("Answer(a or b): "); fgets(specificage, 50, stdin); if(specificage == a) { printf("You are a young senior citizen."); } else { printf("You are an older senior citizen."); } } } getchar(); return 0; }
Last edited by critixal; 07-02-2013 at 05:49 PM.
-
07-02-2013
#2
Registered User
Don’t reply, issue resolved!
-
07-02-2013
#3
Registered User
You have two problems. First
Code:
if(specificage == a)
a here is treated as a variable. If you want to check that the user input the letter a, you need to put single quotes around it: ‘a’. If you want a string containing one character, the letter a, use double quotes: «a»
Second, specificage is a char array/string. You can’t compare strings with ==. You can compare individual characters in the string/array with ==, or use strcmp/strncmp:
Code:
if (strcmp(specificage, "some string") == 0) // strcmp returns 0 if they're equal // or if (specificage[3] == 'q') // check that the 4th (remember, arrays in C start at 0) character is a 'q'
I’m guessing you were more interested in the second example.
Two more notes:
1. fgets leaves the newline character (remember, the user pressed enter after ‘a’ or ‘b’). If I enter «foo» followed by enter, the string fgets gives back contains «foon». If you do strcmp, it will not match «foo», since the n is significant. If you need to get rid of it, use the strchr trick here: FAQ > Get a line of text from the user/keyboard (C) — Cprogramming.com.
2. The user may enter uppercase ‘A’ or ‘B’ for some reason, your program should handle it. Easy enough, use the toupper() or tolower() functions before comparing (remember to #include <ctype.h>)
-
07-02-2013
#4
Registered User
Originally Posted by anduril462
You have two problems. First
Code:
if(specificage == a)
a here is treated as a variable. If you want to check that the user input the letter a, you need to put single quotes around it: ‘a’. If you want a string containing one character, the letter a, use double quotes: «a»
Second, specificage is a char array/string. You can’t compare strings with ==. You can compare individual characters in the string/array with ==, or use strcmp/strncmp:
Code:
if (strcmp(specificage, "some string") == 0) // strcmp returns 0 if they're equal // or if (specificage[3] == 'q') // check that the 4th (remember, arrays in C start at 0) character is a 'q'
I’m guessing you were more interested in the second example.
Two more notes:
1. fgets leaves the newline character (remember, the user pressed enter after ‘a’ or ‘b’). If I enter «foo» followed by enter, the string fgets gives back contains «foon». If you do strcmp, it will not match «foo», since the n is significant. If you need to get rid of it, use the strchr trick here: FAQ > Get a line of text from the user/keyboard (C) — Cprogramming.com.
2. The user may enter uppercase ‘A’ or ‘B’ for some reason, your program should handle it. Easy enough, use the toupper() or tolower() functions before comparing (remember to #include <ctype.h>)Oh, actually this helped a lot, I will make these changes, thank you tons!
Could you check out my other post, the more recent one, thanks! It involves the same program.Last edited by critixal; 07-02-2013 at 06:33 PM.
|
|||||||||||||
|
- Forum
- Beginners
- Undeclared (First Use This Function)?
Undeclared (First Use This Function)?
I’m trying to write a program that asks for the x and y coordinates of a point, then outputs which quadrant that point would be located under. However, my variable int qrant is not working in my functions. I receive the error message «‘qrant’ undeclared (first use this function)» in the main part of my program. Any help — even not related to this exact problem — would be appreciated. Thanks.
|
|
You never declared
qrant
in
main()
.
Thanks. I had never seen the error message so I was really confused!
Topic archived. No new replies allowed.