2014-04-23 64 views
-3

任何人都可以HELLP我,因为我不知道什么是错的我觉得我做错了什么。在Makefile的Cuz着运行它,我得到错误Ç编程的Makefile在Linux

方案:drevoProcesov.c`

#include <sys/types.h>` 
#include <sys/wait.h> 
#include <unistd.h> 
#include <stdlib.h> 
#include <stdio.h>` 

void izpis() 
{ 
printf("PID: %d PPID: %d \n", getpid(), getppid()); 
} 

int main(int argc, char *argv[]) 
{ 
    /*levo*/ 
    if(fork()==0) 
    { 
      if(fork()==0) 
      { 
        if(fork()==0) 
        { 
          izpis(); 
          exit(0);      
        }    
        else 
        { 
          wait(0);  
          izpis();      
        } 
        exit(0); 
      } 
      else 
      { 
        wait(0); 
        wait(0); 
        wait(0); 
        izpis(); 
      } 
    }  
    /*desno*/ 
    else 
    { 
      wait(0); 
      if(fork()==0) 
      { 
        if(fork()==0) 
        { 
          izpis(); 
          exit(0); 
        } 
        else 
        { 
          wait(0); 
          if(fork()==0) 
          { 
            izpis(); 
            exit(0); 
          } 
          else 
          { 
            wait(0); 
            if(fork()==0) 
            { 
              izpis(); 
              exit(0); 
            } 
            else 
            { 
              wait(0); 
              izpis(); 
            } 
          } 
        } 
        exit(0); 
      } 
      else 
      { 
        wait(0); 
        izpis(); 
      } 
    } 
    return 0; 

}

MAKEFILE

CC=gcc 
LDFLAGS=-lm -g3 -lpthread -Wall 
TARGET=drevoProcesov 
all: $(TARGET) 

clean: 
rm -rf $(TARGET) 
rm -rf *.o 

THIS IS的错误,我得到:drevoProcesov。 Ç

./drevoProcesov.c: line 7: syntax error near unexpected token `(' 
./drevoProcesov.c: line 7: `void izpis()' 

PROGRAM 2 vsotast.c

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/types.h> 
#include <unistd.h> 
#include <sys/wait.h> 

int *vsota; 

int main(int argc,char *argv[]) { 

if (argc != 2) { 
    printf("Napaka v podajanju argumentov!\nPrimer: ./vsotast 5\n"); 
    return -1; 
} 

int n = atoi(argv[1]); 

vsota = (int *)malloc(sizeof(int)); 
*vsota = 0; 

int ret; 
for (int i=0; i<n; i++) 
{ 
    ret = fork(); 
    if (ret== 0) { 
    *vsota = (*vsota + (i+1)); 

    //printf("VSOTA: %d; I+1: %d\n",*vsota, i+1); 

    /*if (i == n-1) 
     printf("Vsota, ki so jo izračunali sinovi: %d\n", *vsota);*/ 

    exit(0); 
    } else { 
    wait(&ret); 
    }  
} 

int sum = ((n*(1+n))/(2)); 

printf("Vsota, ki so jo izračunali sinovi: %d\n", *vsota); 
printf("Vsota, ki jo izračunal oce: %d\n",sum); 

free(vsota); 

return 0; 
} 

MAKEFILE 2

CC = gcc 
LDFLAGS = -lm -g3 -lpthread -Wall 
CFLAGS = -g 
TARGET = vsotast 

all: $(TARGET) 

clean: 
rm -rf $(TARGET) 
rm -rf *.o 

THIS IS ERROR我获得:vsotast.c

gcc -g -lm -g3 -lpthread -Wall vsotast.c -o vsotast 
vsotast.c: In function ‘main’: 
vsotast.c:22:4: error: ‘for’ loop initial declarations are only allowed in C99 mode 
for (int i=0; i<n; i++) 
^ 
vsotast.c:22:4: note: use option -std=c99 or -std=gnu99 to compile your code 
+0

字符是你的代码的一部分,还是他们是复制粘贴错误? – cdhowie

回答

1

vsotast.c误差是由于声明是n的事实OT允许之前C99一for循环的表情,让你无论是需要启用C99模式或将宣告走出for表达的:

int i; 
for (i = 0; i < n; i++) 
+0

事实上,他/她甚至不能这样做,因为在一个“传统的”C变量声明中应该在代码指令之前发生(即在if(argc!= 2){'之前),因此切换到'C99' '-std = C11'如果GCC足够新鲜:))这里是最好的选择:) – user3159253

+0

@ user3159253这是真的,但事实是编译器没有抱怨int ret;声明告诉我它是不在其关心的模式中。但我会同意,明确使用支持这些特性的C版本将是首选解决方案。 – cdhowie

0

不是一个完整的答案,只是(长)的想法:

  1. 正确缩进Makefile。这对他们至关重要。
  2. 编译器错误都几乎没有什么瓦特/ Makefile文件 - 如果编译器然后运行你创建了一个或多或少正确Makefile,问题是在你的代码:)

在这种特殊情况下有问题的字符串是

for (int i=0; i<n; i++) 

是C,不是C++,你不能对语句中声明循环变量只是里面,除非你通过-std=c99标志编译器(在Makefile使用CFLAGS本)