Проблемы программирования c переходом с Linux на Visual Studio 2010 на Windows 7 - PullRequest
2 голосов
/ 20 марта 2012

По сути, я проходил урок по программированию на C, в котором мы используем Linux-машины для написания и компиляции нашего кода.

Приведенная ниже программа является частью нашего первого задания, я скомпилировал ее и запустил на Linux во время урока без проблем, но, забрав ее домой, я не могу на всю жизнь заставить ее скомпилировать в Visual Studio 2010 Ultimate или Eclipse IDE с компилятором MinGW.

Существует ли типичная проблема с переключением между двумя операционными системами, которая приводит к сбою моего кода? или я, будучи новичком, написал какой-то ужасный код, который просто не согласуется с VS 2010 или Eclipse?

Попытки исправить сообщения об ошибках, которые я получаю от VS 2010, кажутся бесполезными, поэтому я склоняюсь к тому, чего не хватает моему компьютеру. Я также настроил VS 2010 для компиляции кода на C, так что я не думаю, что это проблема.

ошибок от VS2010:

project1a.c (38): ошибка C2143: синтаксическая ошибка: отсутствует ';' перед «типом»
project1a.c (41): ошибка C2065: 'i': необъявленный идентификатор
project1a.c (44): ошибка C2065: 'userArray': необъявленный идентификатор
project1a.c (44): ошибка C2065: 'i': необъявленный идентификатор
project1a.c (44): ошибка C2109: для индекса требуется массив или тип указателя
project1a.c (51): ошибка C2065: '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;
}

Ответы [ 2 ]

6 голосов
/ 20 марта 2012

Проблема в том, что при компиляции кода C MSVC не поддерживает C99, только C90 (за исключением, может быть, нескольких библиотечных вещей).Вы используете как минимум две функции C99, которые не поддерживаются MSVC:

  • , большая из которых - «массивы переменной длины».Исправление этого, как правило, потребует значительных изменений в вашем коде, если вы используете их каким-либо существенным образом.Я вернусь к этому позже.

  • другой - это объявления, которые появляются после «нормальных» операторов

C99 разрешает выполнение объявленийв блоке после других видов операторов;C90 этого не допускает - все объявления должны появляться в начале блока.Итак, затем вы объявляете userArray, например:

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;

    //...

Это не разрешено в C90, и MSVC жалуется на это при компиляции в режиме C (не будет, если компилируется C ++, поскольку такого рода вещиподдерживается в C ++).

Чтобы решить эту проблему, переместите ваши объявления сразу после начала блока:

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);

    //...

Иногда для этого потребуется перенастроить инициализации, а что нет.

Для решения проблемы использования массивов переменной длины требуется больше работы.В этом случае я думаю, что вы можете обойтись, объявив userArray как int* и выделив для него хранилище, используя malloc():

int* userArray;

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

Несколько других вещей:

  • , поскольку total и avg не используются за пределами sumavg(), они должны быть локальными переменными (явно инициализированными в 0)
  • , возможно, вы захотите передать n в качестве аргументаsumavg() вместо использования глобальной переменной
  • вы объявляете sumavg() как возвращающее int, но ничего не возвращаете.Возможно, вам следует изменить объявление на void
0 голосов
/ 20 марта 2012

Полагаю, это потому, что Visual Studio имеет "забавные" точки входа (т.е. не только основные).Если вы создадите правильный тип проекта внутри VS (например, консольное приложение), он создаст правильную точку Etrypoint для вас.

Вы можете рефакторинг вашего кода, чтобы либо поместить все ваши «основные» в точку входа иливызовите ваш main как есть с точки входа (я бы предложил переименовать main (), чтобы избежать путаницы)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...