Ожидаемая ошибка выражения при вызове функции в C

Другой вариант - передать поток в byte[] и использовать File.WriteAllBytes. Это должно сделать:

using (var stream = new MemoryStream())
{
    input.CopyTo(stream);
    File.WriteAllBytes(file, stream.ToArray());
}

Обертка его в методе расширения дает ему лучшее именование:

public void WriteTo(this Stream input, string file)
{
    //your fav write method:

    using (var stream = File.Create(file))
    {
        input.CopyTo(stream);
    }

    //or

    using (var stream = new MemoryStream())
    {
        input.CopyTo(stream);
        File.WriteAllBytes(file, stream.ToArray());
    }

    //whatever that fits.
}
0
задан Rozay 3 March 2019 в 22:11
поделиться

1 ответ

Как я отмечал в комментариях, вам нужно либо заменить num_sides в main() на 6, либо вам нужно определить и инициализировать переменную (int num_sides = 6;). Ваша функция жестко кодирует 6 как число сторон и игнорирует переданное значение (она просто использует параметр в качестве локальной переменной, игнорируя то, что было указано в качестве значения).

Устранение этих двух проблем приводит к следующему коду:

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

static int roll_die(int num_sides)
{
    int result = rand() % num_sides + 1;
    return result;
}

int main(void)
{
    srand((int)time(0));
    unsigned int counter, result, num1 = 0, num2 = 0, num3 = 0, num4 = 0, num5 = 0, num6 = 0;
    unsigned int num_rolls = 10000;
    for (counter = 0; counter <= num_rolls; counter++)
    {
        result = roll_die(6);
        if (result == 1)
            num1++;
        else if (result == 2)
            num2++;
        else if (result == 3)
            num3++;
        else if (result == 4)
            num4++;
        else if (result == 5)
            num5++;
        else if (result == 6)
            num6++;
        else
        {
            printf("Error occurred. \n");
            return 0;
        }
    }
    printf("Number of 1s rolled: %d \n", num1);
    printf("Number of 2s rolled: %d \n", num2);
    printf("Number of 3s rolled: %d \n", num3);
    printf("Number of 4s rolled: %d \n", num4);
    printf("Number of 5s rolled: %d \n", num5);
    printf("Number of 6s rolled: %d \n", num6);
}

Пример вывода:

Number of 1s rolled: 1670 
Number of 2s rolled: 1653 
Number of 3s rolled: 1656 
Number of 4s rolled: 1687 
Number of 5s rolled: 1696 
Number of 6s rolled: 1639 

Вы также должны использовать массив вместо 6 numX переменных. Например, использование int num[7] = { 0 }; позволит вам использовать значение, возвращаемое roll_die(), в качестве индекса в массиве. Это сжимает код следующим образом:

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

static int roll_die(int num_sides)
{
    return rand() % num_sides + 1;
}

int main(void)
{
    srand(time(0));
    unsigned num[7] = { 0 };
    unsigned num_rolls = 10000;
    int num_sides = 6;
    for (unsigned counter = 0; counter <= num_rolls; counter++)
        num[roll_die(num_sides)]++;
    for (int i = 1; i <= num_sides; i++)
        printf("Number of %ds rolled: %d \n", i, num[i]);
    return 0;
}

Пример вывода - можете ли вы обнаружить какие-либо отличия от предыдущего вывода, отличные от случайной последовательности? Их не должно быть!

Number of 1s rolled: 1705 
Number of 2s rolled: 1651 
Number of 3s rolled: 1653 
Number of 4s rolled: 1616 
Number of 5s rolled: 1631 
Number of 6s rolled: 1745 

И это облегчает обобщение для N-сторонних кубиков, например:

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

static int roll_die(int num_sides)
{
    return rand() % num_sides + 1;
}

int main(int argc, char **argv)
{
    int num_sides = 6;
    if (argc == 2)
    {
        num_sides = strtol(argv[1], 0, 0);
        if (num_sides < 2 || num_sides > 999)
        {
            fprintf(stderr, "Number of sides of %d is not in the range 2..999\n", num_sides);
            exit(EXIT_FAILURE);
        }
    }
    srand(time(0));

    unsigned num[num_sides + 1];
    for (int i = 1; i <= num_sides; i++)
        num[i] = 0;

    unsigned num_rolls = 10000;
    for (unsigned counter = 0; counter <= num_rolls; counter++)
        num[roll_die(num_sides)]++;

    for (int i = 1; i <= num_sides; i++)
        printf("Number of %ds rolled: %d \n", i, num[i]);

    return 0;
}

И, если эта программа называется [1113 ], тогда пробный прогон может выглядеть так:

$ ./die83 8
Number of 1s rolled: 1294 
Number of 2s rolled: 1197 
Number of 3s rolled: 1256 
Number of 4s rolled: 1228 
Number of 5s rolled: 1230 
Number of 6s rolled: 1222 
Number of 7s rolled: 1278 
Number of 8s rolled: 1296 
$
0
ответ дан Jonathan Leffler 3 March 2019 в 22:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: