2016-03-20 16 views
-1

Bu program, bir txt dosyasının adını ve txt dosyasını işleyen bir .cpp kaynak dosyasının adını girmesini istediğim bir 'program' programıdır. bilgi. Daha sonra kaynak dosyayı başka bir metin dosyası çıkaran txt dosyasıyla birlikte derlerim. Bu yeni tekstil daha sonra beklenen çıktı ile karşılaştırıldı (ki ben de verilmiştim).Başka bir .cpp dosyasını çalıştırmak için sistem işlevini kullanma

Sistem işlevi, kullanıcıların bir C programından UNIX komutlarını çalıştırmasına izin verir.

: Ben kaynak kullanıcı ben

"_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

benim profesör tarafından sağlanan derlenmesi am kaynak dosya şuna benzer bir işlevi vardır belirten bir hata alıyorum

sağlar dosyasını derlemek çalışıyorum zaman

#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; 
} 

Yazdığım kod aşağıda görülebilir: Bu kod kullanıcıdan bilgileri alır ve sonra derler.

#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; 
} 

ben cevaplar

+5

Bir önceki sorunuzu, yeni bir soru göndermek yerine gerekli bilgileri içerecek şekilde düzenlemelisiniz. – MikeCAT

+0

@MikeCAT Yapılmış eleştiriyi takdir ediyorum, ancak ben hataların düzeltilmesi ve ödevimi tamamlama konusunda endişeleniyorum, scanf() işlev ailesinden herhangi birini çağırırken yığın taşması –

+0

'un nasıl kullanılacağını öğrenmekten daha önemlidir: 1) İşlemin başarılı olduğundan emin olmak için döndürülen değer (parametre değeri değil). 2) '% s' biçim belirtecini kullanırken, her zaman maksimum uzunluk değiştiricisini (giriş arabelleğinin uzunluğundan daha az olan) kullanın, böylece kullanıcı giriş arabelleğini değiştiremez ve bu da tanımlanamayan davranışlarla sonuçlanabilir ve bir seg hatası olayı. Bir örnek olarak, bu: 'scanf ("% s ", srcfile);' olmalıdır: "eğer (1! = Scanf ("% 199s ", srcfile)) {/// error ve exit}} – user3629249

cevap

0

Soru: İki ana işleviyle iki c programını çalıştırabilir misiniz? Cevap: Evet. Bunu yapmak için, programı iki ana işlevle ayrı ayrı derlemek için terminali kullanmanız gerekir. Ancak eğer birbirleriyle etkileşirlerse Korkarım ki şimdi bunun için bir çözümüm yok. Bu özel durumda burada nasıl yaptım. Terminale gittim ve yazdım. Bu durumda Ben gcc -o MyProgram ana yazdı bundan sonra Sonra sistem fonksiyonunu

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

kullanarak başka bir program çalıştırır bir programı çalıştırın. o Bu benim ana yöntem yüzden terminalde de o programı derlemek gerekmez başka kaynak dosyasını derleme Bu durumda

./Myprogram 

yazarak çalıştırabilirsiniz MyProgram isimli çalıştırılabilir yaratacaktır. Bu programı derlediğimde, aynı dizinde bir output.txt dosyası oluşturulabilir ve kaynak dosyaları da bu dosya içerisinde yer alır.

0

Eğer C için giriş noktasıdır bir main işlevi yoktur derlemek çalıştığınız dosya içinde gönderdiniz çözümü arıyorsanız programları. Bu, bu dosyayı tek başına bir yürütülebilir dosya haline getirmenin aslında mümkün olmadığı anlamına gelir.

Eğer işlevin ismi notmain ise, main işlevine sahip başka bir kaynak dosya yazmanız ve notmain numaralı telefonu çağırmanız gerekir. Bu ikinci main, programınız için değil, programınızın derlediği yürütülebilir dosyaya ait olacaktır. Üç kaynak dosyanız olabilir:

  • Derleme programınız derleme işlemini gerçekleştirir.
  • etkili bir does sarıcı dosyasının bir tür:

    int main(int argc, char *argv[]) { 
        notmain(argc, argv); 
    } 
    
  • Ve nihayet programı not vermeye.

Ayrıca her iki notmain fonksiyonunu extern veya paylaşmak için bir başlık sağlamayı gerekir. Grader programınız daha sonra sarıcı main'u derler ve kaynak dosyası birlikte derecelendirilir.

+0

Bir projede iki ana yönteme sahip olamıyorum @ cormac-obrien –

+0

@Varun Rao 'notmain()' öğesini 'main()' olarak değiştirmeyi deneyin ve "çalışıyor" ifadesini deneyin. _Then_ "Bir projede iki ana yönteme sahip olamam" kısıtlamasıyla ilgilenebiliriz. – chux

+0

Bunu birkaç saat önce test ettim, iki ana yöntemin ayrı ayrı derlenmediği sürece çalışmazlar. @chux –

İlgili konular