Задать вопрос
Ответы пользователя по тегу C
  • Как решить проблему с вводом двумерного массива?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Как вам уже сказали, вы не выделяете массив нужного размера. Можно вместо int a[1][1] делать int a[100][100], например, если вам известно, что массив не будет больше 100 строк и столбцов. Но, по хорошему, это надо обработать и, если пользователь ввел row == 101, то надо завершиться, сообщив пользователю о слишком большой размерности.
    Ответ написан
    Комментировать
  • Как исправить странные ошибки Си-кода?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Куча не иницализированных локальных переменных. Эти переменные не обнуляются в языке Си. Там какой-то мусор. Может быть и 0, но это как повезет.
    number - вы там присваиваете rotor[number] что-то, а чему оно равно? i в цикле, как Rsa97 сказал.

    И вообще, вы с алгоритмом перемудрили. Вы случайно генерируете число, пока не найдете новое число в массиве.
    Есть более элегантное решение:
    Заполните массив числами от 0 до 74 подряд. Потом перемешайте его, как написанно в вики. Или можно совместить изначальное заполнение и перемешивание. Буквально, вся функция filling становится:
    void filling(int rotor[], int randvalue)
    {
      srand(randvalue);
      for(int i = 0; i < 75; ++i) {
        int j  = rand() % (i+1);
        rotor[i] = rotor[j];
        rotor[j] = i;
      }
    }
    Ответ написан
    Комментировать
  • Реализация двусвязного списка с элементами конкретного типа?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    К сожалению, в C не завезли шаблоны. И, если вы хотите хранить разные типы в одном списке или использовать один код для реализации списков разных типов, то придется работать с указателями, а значит выделать память где-то придется.

    Можно в функции добавления элемента принимать указатель и размер, выделять новую память и копировать.
    Это что-то вроде вашего предложения, но работает для всех типов.

    Можно 2 функции сделать для оптимизации: одна будет копировать и вызываться должна для локальных переменных, а вторая не будет копировать, а будет брать ответственность за переданный указатель. Но тут можно легко ошибиться - при вызове второй функции надо переданный указатель сразу забыть. Иначе можно его 2 раза потом удалить, или использовать после удаления.

    Если же вы собираетесь только инты хранить - то лучше переписать список: храните не указатель на data, а сразу int.
    Ответ написан
    Комментировать