2016-03-20 2 views
-1

Эта программа является программой a'grader, где я просто прошу пользователя ввести имя файла txt и исходный файл .cpp, который обрабатывает txt-файл и получает его Информация. Затем я компилирую исходный файл вместе с файлом txt, который выводит другой текстовый файл. Этот новый текстиль затем сравнивается с ожидаемым результатом (который мне также дал.).Использование системной функции для запуска другого .cpp-файла

Системная функция позволяет пользователям запускать команды UNIX из программы на языке C. Когда я пытаюсь скомпилировать исходный файл пользователь предоставляет

я получаю ошибку о том, что

"_main", referenced from: implicit entry/start for main executable.
clang: error: linker command failed with exit code 1 (use -v to see invocation)
sh: ./myProg: No such file or directory

Исходный файл, который я компилляции при условии, мой профессор имеет одну функцию, которая выглядит следующим образом:

#include <stdio.h> 
#include <stdlib.h> 
#define MAX_VALUES 3 
#define OUTPUT_LINES 5 

int notmain(int argc, char **argv) 
{ 
/* 
* argv is just the file name 

*/ 
//printf(argv[1]); 
int values[MAX_VALUES]; 
int i, j; 


FILE *inputFile; 
char name [20]="input.txt"; // I have included this piece of code to see if there is a correct output from the source file provided by the user. 
if ((inputFile = fopen(name, "r")) == NULL) { 
    printf("Error opening input file.\n\n"); 
    exit(1); 
} 
for(i = 0; i < MAX_VALUES; i++) 
    fscanf(inputFile, "%d", &values[i]); 
for(i = 0; i < OUTPUT_LINES; i++){ 
    for (j=0; j < MAX_VALUES; j++) 
     printf("%d ", values[j]*(i+1) + j); 
    printf("\n"); 
} 
return 0; 
} 

Код, который я написал, приведен ниже: Этот код принимает информацию от пользователя, а затем компилирует его.

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#define NUM_LINES 5 

int main(){ 
    char srcfile[200]; 
    char inpfile[200]; 
    char resultfile[200]; 

    printf("Please enter the name of the source file: \n"); 
    scanf("%s",srcfile); 
    printf("Please enter the name of the input file: \n"); 
    scanf("%s",inpfile); 
    printf("Please enter the name of the expected result file: \n"); 
    scanf("%s",resultfile); 

    char test1 [100]="gcc -o myProg "; 
    char test2 [100]="./myProg "; 

    strcat(test2,inpfile); 
    strcat(test2," > "); 
    strcat(test2,resultfile); 
    strcat(test1,srcfile); 
    printf("%s\n",test1); //these are just tests 
    printf("%s",test2); //these are just tests 

    if (system(test1)) { 
     printf("There is an error compiling the program "); 
    } 

    if (system(test2)!= 0) { 
     printf("There is an error running the executable"); 
    } 

    return 0; 
} 

Если вы ищете решение, которое я разместил его в ответах

+5

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

+0

@MikeCAT я ценю критику, но я больше беспокоюсь об исправлении ошибки и выполнении моего задания, а не об обучении использованию правильного этикета при переполнении стека –

+0

при вызове любого из функций функций scanf(): 1) всегда проверяйте возвращаемое значение (не значение параметра), чтобы гарантировать успешную работу. 2) При использовании спецификатора формата «% s» всегда используйте модификатор максимальной длины (то есть один меньше длины входного буфера), чтобы пользователь не мог перехватить входной буфер, что приведет к неопределенному поведению и может привести к событие сбоя seg. В качестве примера, это: 'scanf ("% s ", srcfile);' должно быть: 'if (1! = Scanf ("% 199s ", srcfile)) {/// ошибка обработки и выход}' – user3629249

ответ

0

Вопрос: Можете ли вы запустить две программы c с двумя основными функциями? Ответ: Да. Для этого вам нужно использовать терминал для компиляции программы с двумя основными функциями отдельно. Однако, если они взаимодействуют друг с другом, я боюсь, что у меня нет решения для этого. Теперь в этом конкретном случае вот как я это сделал. Я пошел в терминал и написал. В этом случае я запустить одну программу, которая запускает другую программу, используя системную функцию

gcc -c main.c (this compiles the main function). 

Тогда после того, что я написал НКУ -o MyProgram основной.о Это создаст исполняемый файл с именем MyProgram, который вы можете запустить, написав

./Myprogram 

В этом случае мой основной метод компилирует другой исходный файл, так что я не нужен скомпилировать эту программу, а также в терминале. Когда я скомпилировал эту программу, он создал файл output.txt в том же каталоге, в котором исполняемый файл и исходные файлы находятся.

0

Файл, который вы пытаетесь скомпилировать не имеет main функцию, которая является точкой входа для C программы. Это означает, что на самом деле невозможно создать этот файл только в исполняемом файле.

Если имя функции должно быть notmain, тогда вам нужно будет написать другой исходный файл с функцией main и вызовы notmain. Этот второй main будет принадлежать исполняемому файлу, который ваша программа компилирует, а не вашей программе. У вас будет три исходных файла:

  • Ваша программа для грейдера, которая обрабатывает компиляцию.
  • Этакий файла упаковщика, который эффективно делает:

    int main(int argc, char *argv[]) { 
        notmain(argc, argv); 
    } 
    
  • И, наконец, программа градуированными.

Вам также понадобится extern функция notmain или предоставить заголовок для публикации. Затем ваша программа-грейдер скомпилирует обертку main и исходный файл, подлежащий сортировке вместе.

+0

Я не могу иметь два основных метода в проекте @ cormac-obrien –

+0

@Varun Rao Попробуйте изменить 'notmain()' на 'main()' и проверить, работает ли это ". _Then_ мы можем решить ограничение «Я не могу иметь два основных метода в проекте». – chux

+0

Я проверил это пару часов назад, когда два основных метода не работают, если вы их не компилируете отдельно @chux –

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