i like food Ответов: 2

Visual studio 2017 не показывает ошибок, но есть ошибки сборки.


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

Visual Studio делает это и для других консольных приложений, которые я тоже пытаюсь создать.

VS также показывает другие ошибки, просто не то, что вызывает ошибки сборки.

Вот этот код:

using System;
using System.Collections.Generic;

namespace ConsoleApp5
{
    class Program
    {
        static void Main()
        {
            int[] vals = {6, 5, 3, 1, 8, 7, 2, 4};
            //List<int> vals = new List<int> { 6, 5, 3, 1, 8, 7, 2, 4 };
            int n = 8;
            

            for (int i = 0; i < n; i++)//<= or <?
            {
                
                for (int j = 0; j < n - 1; j += 1 )
                {
                    if (vals[j] > vals[j + 1])
                    {
                        int x = vals[j];
                        int y = vals[j + 1];
                        vals[j] = y;
                        vals[j + 1] = x;
                        
                        //vals[j + 1] = vals[j];
                    }
                    
                }
            }

            foreach (int num in vals)
            {
                Console.WriteLine(vals[num]);
            }
            
            
            
            
        }
    }
}


Что я уже пробовал:

выключение и повторное включение VS,
снова и снова включаю и выключаю компьютер,
выключаю и снова включаю компьютер,
создание совершенно нового консольного приложения,

ни один из этих что-то изменилось.

Richard MacCutchan

Что это за сообщения об ошибках?

2 Ответов

Рейтинг:
15

OriginalGriff

Компиляция не означает, что ваш код верен! :смеяться:
Подумайте о процессе разработки как о написании электронного письма: успешная компиляция означает, что вы написали электронное письмо на правильном языке - например, на английском, а не на немецком, - а не то, что письмо содержало сообщение, которое вы хотели отправить.

Не все сообщения об ошибках появляются при компиляции - некоторые появляются при запуске кода, и он делает что-то глупое.

Итак, теперь вы входите во вторую стадию разработки (на самом деле это четвертая или пятая, но вы перейдете к более ранним стадиям позже): тестирование и отладка.

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

Input   Expected output    Actual output
  1            2                 1
  2            4                 4
  3            6                 9
  4            8                16
Тогда совершенно очевидно, что проблема заключается в бите, который удваивает его - он не прибавляет себя к себе или умножает его на 2, он умножает его на себя и возвращает квадрат входного сигнала.
Таким образом, вы можете посмотреть на код, и очевидно, что он находится где-то здесь:
private int Double(int value)
   {
   return value * value;
   }

Как только у вас появится идея, что может пойти не так, начните использовать отладчик, чтобы выяснить, почему. Поместите точку останова в первую строку метода и запустите приложение. Когда он достигнет точки останова, отладчик остановится и передаст управление вам. Теперь вы можете запускать свой код построчно (так называемый "одноступенчатый") и просматривать (или даже изменять) содержимое переменных по мере необходимости (черт возьми, вы даже можете изменить код и повторить попытку, если вам это нужно).
Подумайте о том, что должна делать каждая строка кода перед ее выполнением, и сравните это с тем, что она действительно делала, когда вы использовали кнопку "шаг вперед" для выполнения каждой строки по очереди. Он сделал то, что вы ожидали? Если да, то переходите к следующей строке.
Если нет, то почему? Чем это отличается?
Надеюсь, это поможет вам определить, в какой части этого кода есть проблема и в чем она заключается.
Это навык, и его стоит развивать, поскольку он помогает вам как в реальном мире, так и в развитии. И, как и все навыки, он только улучшается при использовании!

Я даже дам вам подсказку: что это значит? foreach сделать? Какую ценность он вкладывает в ДОУ num как он ходит по кругу? Если вы не уверены, используйте отладчик для проверки, и проблема yoru должна стать очевидной.


BillWoodruff

+5 Если бы только все вопрошающие могли прочитать это !

Рейтинг:
0

Richard MacCutchan

Это ваша последняя петля, которая является проблемой. Вы используете фактическое значение в массиве в качестве индекса в массиве:

foreach (int num in vals)
{
    Console.WriteLine(vals[num]);
}

Так и должно быть:
foreach (int num in vals)
{
    Console.WriteLine(num); // num is already the actual array item.
}


[редактировать]
Кстати, вам нужно узнать разницу между ошибками компиляции, компоновки и выполнения. То, что вы имели здесь, было ошибкой выполнения.
[/редактировать]


BillWoodruff

+5