2012-03-20 2 views
2

기본적으로 C 프로그래밍에 관한 수업을 들었습니다.이 수업에서는 리눅스 컴퓨터를 사용하여 코드를 작성하고 컴파일합니다.c 프로그래밍 문제 리눅스에서 Visual Studio 2010을 윈도우 7로 옮기기

아래의 프로그램은 첫 번째 과제의 일부로, 문제가없는 수업 중에 그것을 컴파일하여 실행했지만 집에 가져 가서 데려왔다. 비주얼 스튜디오 2010에서 컴파일 할 수 없다. 궁극적 인, 또는 MinGW 컴파일러와 일식 IDE.

내 코드가 작동하지 않는 두 운영 체제를 전환 할 때 몇 가지 일반적인 문제가 있습니까? 또는 나는 신인이 되려면 VS 2010 또는 Eclipse와 동의하지 않는 추악한 코드를 작성해야합니까?

VS 2010에서 가져온 오류 메시지를 수정하려는 시도는 쓸모없는 것처럼 보이므로 내 컴퓨터에서 빠져 나오는 것이 중요합니다. 나는 VS 2010을 C 코드를 컴파일하도록 설정 했으므로 문제는 아니라고 생각합니다. VS2010에서

오류 :

project1a.c (38) : 오류 C2143 : 구문 오류 : 누락 ';' 오류 C2065 : 'I': 선언되지 않은 식별자
project1a.c (44) : 오류 C2065 'userArray'선언되지 않은 식별자
project1a.c (44) '타입'
project1a.c (41) 전에 오류 C2065 'I': 선언되지 않은 식별자
project1a.c (44) : 오류 C2109 : 오류 C2065 : 첨자는 배열 또는 포인터 형
project1a.c (51)가 필요 'userArray'선언되지 않은 식별자를

가지 'i'의 여러 인스턴스가 있습니다.이 오류 중 선언되지 않은 식별자 오류

#include <stdio.h> 
#include <stdlib.h> 

int n; 
float total, avg; 

int sumavg(void); 

int main(void) 
{ 
    //First time scan for the value to be assigned to n. 
    printf("Hey, Enter a number or 999 to exit:> "); 
    scanf("%d", &n); 

    //if n == 999 then exit the program 
    while(n != 999) 
    { 
     //enter the sumavg function. 
     sumavg(); 

     //Try to run the program again. 
     printf("Hey, Enter a number or 999 to exit:> "); 
     scanf("%d", &n); 
    } 

    //exit program. 
    return EXIT_SUCCESS;  
} 

int sumavg(void) 
{ 


    //Define a number that will be used for the array size. 
    printf("Hey, now enter %d more numbers:>\n", n); 

    //Define the size of array using the number assigned to the variable "n". 
    int userArray[n], i; 

    //Construct the array, one position at a time using the for loop. 
    for (i = 0; i < n; i++) 
    { 
     //Assign a value to userArray[i] while i < n(the size of the array). 
     scanf("%d", &userArray[i]); 
    } 

    //Calculate the sum by looping through each position in the userArray[i]. 
    for (i = 0; i < n; i++) 
    { 
     //Take the current position in the array and add it to the variable: "total" 
     total += userArray[i]; 
    } 

    //Calculate the average 
    avg = total/n; 

    //Print the sum followed by the average 
    printf("Sum is: %.1lf\n", total); 
    printf("The average is: %.1lf\n", avg); 

    //reset total and avg in case future iterations are performed. 
    total = 0; 
    avg = 0; 
} 
+1

으로 변경해야할까요? –

+0

일부 컴파일러 경고/오류를 게시하십시오. – Mosby

+0

두 컴파일러에서 모두 가져 오는 오류 메시지를 게시 할 수 있습니까? 그것은 문제를 좁히는 데 도움이 될 것입니다. – Gangadhar

답변

6

문제 (내가 주를()의 혼동을 피하기 위해 이름을 바꾸는 게 좋을 것) 진입 점에서 같이 주를 호출 할 수 있습니다 MSVC는 C 코드를 컴파일 할 때 C99 만 지원하며 C90 만 지원합니다 (라이브러리의 경우는 제외). MSVC에서 지원하지 않는 C99 기능을 두 개 이상 사용하고 있습니다.

  • 큰 것은 '가변 길이 배열'입니다. 이 문제를 해결하려면 일반적으로 중요한 변경 사항을 코드에 적용해야합니다. 나중에 다시 보겠습니다.

  • 다른 하나는 명령문 C99 다른 종류 후의 블록 발생 선언 허용

'정상'문장 후에 발생할 선언이고; C90은 이것을 허용하지 않습니다. 모든 선언은 블록의 시작 부분에서 이루어져야합니다.그래서, 당신은 예를 들어 userArray를 선언 : C90에서 허용하고 (이 이런 종류의 일 때문에 C++를 컴파일하는 것은 C에서 지원하지 않을 경우 C 모드에서 컴파일 할 때 MSVC 그것에 대해 불평하지 않습니다

int sumavg(void) 
{ 
    //Define a number that will be used for the array size. 
    printf("Hey, now enter %d more numbers:>\n", n); 

    //Define the size of array using the number assigned to the variable "n". 
    int userArray[n], i; 

    //... 

++).

는 문제가 단지 블록의 시작 후 선언을 이동 해결하려면 :

int sumavg(void) 
{ 
    //Define the size of array using the number assigned to the variable "n". 
    int userArray[n], i; 

    //Define a number that will be used for the array size. 
    printf("Hey, now enter %d more numbers:>\n", n); 

    //... 

때때로 그 초기화하고 무엇을하지 rejigger 할 필요합니다.

가변 길이 배열을 사용하는 문제를 해결하려면 더 많은 작업이 필요합니다. 사용하지 않는

    total 이후
  • avg :

    int* userArray; 
    
    userArray = malloc(sizeof(int) * n); 
    

    몇 가지 다른 일을이 경우에 나는 당신이 int*userArray를 선언하고 malloc()를 사용하기위한 스토리지를 할당에 의해 얻을 수 있다고 생각 sumavg() 외부에서는 로컬 변수 여야합니다 (명시 적으로 0으로 초기화 됨)

  • 을 인수로 사용하는 대신 sumavg()으로 전달할 수 있습니다. 전역 변수
  • sumavg()int을 반환한다고 선언하지만 아무 것도 반환하지 않습니다. 신고 내용을 void
+0

아,이 답변의 깊이에 감사 드리며, 잘못된 점을 이해하는 데 도움이되었습니다. –

+0

Visual Studio에서 현대적인 C 표준 지원이 부족하다는 점을 감안하면 정말 좋은 대답이라고 생각합니다. –

-1

Visual Studio에는 "재미있는"엔트리 포인트가 있습니다. 메인뿐만 아니라). VS 내에서 올바른 종류의 프로젝트를 만들면 (예 : 콘솔 앱) 정확한 etrypoint가 생성됩니다.

당신은 당신의 코드를 리팩토링 중 하나를 진입 점에 당신의 "주"넣어 또는

관련 문제