Вычисление корней квадратного уравнения: как исправить ошибку? - C (СИ)

Узнай цену своей работы

Формулировка задачи:

вот ошибка: $ gcc main.c -o main /tmp/ccl2U91G.o: In function `main': main.c.text+0xc8): undefined reference to `rootsearch' collect2: error: ld returned 1 exit status
//main.c
 
#include 
#include "rootsearch.h"
 
int main() {
 
        //p,q - переменные для корней; a,b,c - коэффициенты
        double p=0, q=0, a=0, b=0, c=0;
 
        //numberofroots - счетчик корней
        int numberofroots=0;
 
        //ввод коэффициентов
        scanf("a = %f \n", a);
        scanf("b = %f \n", b);
        scanf("c = %f \n", c);
 
        //поиск корней
        numberofroots=rootsearch(a,b,c,p,q);

        //вывод нужного количества корней
        if (numberofroots==0) {
                printf("%s \n", "уравнение не имеет корней");
        } else {
                printf("p = %f \n",p);
                if (numberofroots==2) {
                        printf("q = %f \n",q);
                }
        }
}
//rootsearch.h
 
int rootsearch(double a, double b, double c, double p, double q);
//rootsearch.c
 
#include 
#include "rootsearch.h"
 
int rootsearch (double a, double b, double c, double p, double q) {
 
        //если первый коэффициент нулевой
        if (a == 0) {
                p = - c / b;
                rootsearch = 1;
        } else {
        //если первый коэффициент не нулевой
 
                double d = 0;
 
                //нахождение дискриминанта
                d = b * b - 4 * a * c;
 
                //вычисление корней через дискриминант и запись результатов
                if (d < 0) {
                        return 0;
                } else {
                        if (d == 0) {
                                return 1;
                                p = - b / (2 * a);
                        } else {
                                return 2;
                                p = (- b + sqrt(d)) / (2 * a);
                                q = (-b - sqrt(d)) / (2 * a);
                        }
                }
        }
}
старался писать хороший код(с комментариями и т.д.), буду рад критике. пробовал гуглить ошибку, ничего не нашел. заранее спасибо за помошь

Решение задачи: «Вычисление корней квадратного уравнения: как исправить ошибку?»

textual
Листинг программы
objects = main.o rootsearch.o
CXX = g++
CC = gcc
CFLAGS = -Wall -Wextra -Werror -Os -gdwarf-2
CXXFLAGS = -Wall -Wextra -Werror -Os -gdwarf-2
LDFLAGS = 
all:	$(objects)
	$(CXX) $(objects) $(LDFLAGS) -o main
clean:
	rm -f *.o
	rm -f main
%.o: %.c
	mkdir -p build
	$(CC) -c $(CFLAGS) $< -o $@
%.o: %.cpp
	$(CXX) -c $(CXXFLAGS) $< -o $@

Объяснение кода листинга программы

  1. objects = main.o rootsearch.o — это список объектов, которые нужно собрать. В данном случае, программа состоит из двух файлов: main.c и rootsearch.c.
  2. CXX = g++ — это настройка, которая указывает компилятору, что мы собираем программу на C++, а не на C.
  3. CC = gcc — это настройка, которая указывает компилятору, что мы собираем программу на C, а не на C++.
  4. CFLAGS = -Wall -Wextra -Werror -Os -gdwarf-2 — это настройки компилятора для языка C. Здесь мы включаем все предупреждения, отключаем оптимизацию и включаем отладку.
  5. CXXFLAGS = -Wall -Wextra -Werror -Os -gdwarf-2 — это настройки компилятора для языка C++. Здесь мы включаем все предупреждения, отключаем оптимизацию и включаем отладку.
  6. LDFLAGS = — это настройки линковщика. Здесь нет никаких значений, потому что мы не используем внешние библиотеки.
  7. all: $(objects) — это цель, которую выполняет компилятор. Здесь мы просто указываем, что должны быть собраны все объекты.
  8. clean: rm -f *.o — это цель, которую выполняет компилятор при очистке. Здесь мы удаляем все объектные файлы.
  9. %.o: %.c — это правило для сборки объектных файлов из исходных файлов. Здесь мы указываем, что для каждого файла .c должен быть создан соответствующий файл .o.
  10. %.o: %.cpp — это правило для сборки объектных файлов из исходных файлов. Здесь мы указываем, что для каждого файла .cpp должен быть создан соответствующий файл .o.
  11. mkdir -p build — это команда для создания директории build, если она еще не существует.
  12. $(CC) -c $(CFLAGS) $< -o $@ — это команда для компиляции исходного файла и создания соответствующего объектного файла. Здесь мы используем компилятор C и включаем все настройки компилятора.
  13. $(CXX) -c $(CXXFLAGS) $< -o $@ — это команда для компиляции исходного файла и создания соответствующего объектного файла. Здесь мы используем компилятор C++ и включаем все настройки компилятора.
  14. objects = main.o rootsearch.o — это список объектов, которые нужно собрать. В данном случае, программа состоит из двух файлов: main.c и rootsearch.c.
  15. CXX = g++ — это настройка, которая указывает компилятору, что мы собираем программу на C++, а не на C.
  16. CC = gcc — это настройка, которая указывает компилятору, что мы собираем программу на C, а не на C++.
  17. CFLAGS = -Wall -Wextra -Werror -Os -gdwarf-2 — это настройки компилятора для языка C. Здесь мы включаем все предупреждения, отключаем оптимизацию и включаем отладку.
  18. CXXFLAGS = -Wall -Wextra -Werror -Os -gdwarf-2 — это настройки компилятора для языка C++. Здесь мы включаем все предупреждения, отключаем оптимизацию и включаем отладку.
  19. LDFLAGS = — это настройки линковщика. Здесь нет никаких значений, потому что мы не используем внешние библиотеки.
  20. all: $(objects) — это цель, которую выполняет компилятор. Здесь мы просто указываем, что должны быть собраны все объекты.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 3.667 из 5
Похожие ответы