Локальная переменная c ошибка

I am trying to create a function but I’m getting an error message.

public int[] genericSearch(int searchWidth, int startingRadius, int width, int height, Bitmap bitmap)
{
    //Generic function for finding the best path from a certain range
    if (startingRadius == -1)
        startingRadius = bitmap.Height() / 2;

Cannot use local variable ‘startingRadius’ before it is declared.

The same problem occurs for the bitmap variable as well. Normally in c++ this type of declaration would work; however, I am unsure why it is not working here.

Grant Winney's user avatar

Grant Winney

64.9k12 gold badges114 silver badges164 bronze badges

asked Jul 30, 2013 at 0:13

user1084113's user avatar

1

In visual studio. Sometimes when you declare a variable again (a second time). It will give this error. For example, this will sometimes throw the exception you mentioned:

 1.  int startingRadius = 0;
 2.  startingRadius = 5; <-- Exception thrown here.
 3.  
 4.  int startingRadius = 0;

Obviously this is incorrect anyway. So removing the second declaration (on line 4) will solve the problem.

Note: The exception you would ordinarily expect would be A local variable named 'startingRadius' is already defined in this scope. But for some reason, the exception you mentioned is shown sometimes.

answered Jan 11, 2014 at 15:59

gunwin's user avatar

gunwingunwin

4,5285 gold badges37 silver badges59 bronze badges

2

You are missing a closing brace for your method but otherwise this code can compile on my machine… (changed Height to a property as well)

public int[] genericSearch(int searchWidth, int startingRadius, int width, int height,Bitmap bitmap)
         {
         //Generic function for finding the best path from a certain range
             if (startingRadius == -1)
                 startingRadius = bitmap.Height / 2;
         }

answered Jul 30, 2013 at 0:18

Kevin's user avatar

KevinKevin

4,55623 silver badges35 bronze badges

It sounds like you have a misplaced } or misspelled variable names. I can’t really tell without seeing the full code.

The error message is basically telling you that you have a local variable that you are trying to use which has not been declared. Which suggests that the if (startingRadius == 1) code is actually inside a different method than the method you have declared.

answered Jul 30, 2013 at 0:20

Stephen's user avatar

StephenStephen

4716 silver badges16 bronze badges

For me it helped to delete to local variable at all and create a new with different name…

Originally:

string butterfly;

butterfly = "butterfly with error"; <-- gives error

UPDTE:

Delete all the existing «butterfly»s and create new with new very similar name

string butterfly2;

butterfly2 = "butterfly without error" <-- worked for me perfectly.

*First tried:

  1. clean and rebuild project — didn’t help
  2. restart whole program(IDE) — didn’t help*

answered Oct 19, 2020 at 10:57

Karl Mõttus's user avatar

1

Change the variable name for example «butterfly» to «Butterfly» and declare it
under public partial class Form1 : Form
{
This is exactly where you have to declare it. It will then have scope for the entire class.
It worked for me.

answered Jun 14, 2022 at 16:25

user3559041's user avatar

Даже если я ввожу значение переменной заранее, оно мне выдаёт предупреждение: Переменной «speed» присвоено значение, но оно ни разу не использовано. Ошибка в строке float speed = speed * 0.75f;
Вот код:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerMovement : MonoBehaviour
{
    float horAxis;
    public float speed;
    Rigidbody2D rb2d;
    bool isGrounded;
    int jumps;
    public Vector2 jumpForce;
    void Start()
    {
        isGrounded = true;
        rb2d = GetComponent<Rigidbody2D>();
    }

    void Update()
    {
        horAxis = Input.GetAxis("Horizontal");

        if(isGrounded == true)
        {
            jumps = 1;
        }

        if (Input.GetKey(KeyCode.LeftControl))
        {
            float speed = speed * 0.75f;
        }
    }
    private void FixedUpdate()
    {
        rb2d.velocity = new Vector2(horAxis * speed, rb2d.velocity.y);
        if (jumps == 1 && Input.GetKeyDown(KeyCode.Space))
        {
            isGrounded = false;
            rb2d.AddForce(jumpForce, ForceMode2D.Force);
            jumps = 0;
        }
    }

    private void OnCollisionEnter2D(Collision2D collision)
    {
        if (collision.gameObject.tag == "Ground")
        {
            isGrounded = true;
        }
    }
}

задан 7 июл 2021 в 7:02

ekstoza's user avatar

1

float speed — объявление новой переменной с указанным именем и типом

speed — использование уже объявленной переменной

Видимо надо speed = speed * 0.75f;

ответ дан 7 июл 2021 в 7:13

Алексей Шиманский's user avatar

Алексей ШиманскийАлексей Шиманский

72.3k11 золотых знаков87 серебряных знаков173 бронзовых знака

float speed = speed * 0.75f;

Тут объявили новую локальную переменную, и не использовали её.

Создавая её в Update вы могли бы использовать её только там, поэтому обращаясь к speed в другом месте вы бы обращались не к данной переменной а к полю speed где переменная объявлялась.

От этого и выходит что данная переменная никогда и ни кем не использовалась.

Решение:

speed = speed * 0.75f

либо

speed *= 0.75f

ответ дан 7 июл 2021 в 7:39

Alemkhan Utepkaliev's user avatar

При написании программы на языке C# можно встретиться с ошибкой компиляции «Использование локальной переменной которой не присвоено значение». Попробуем разобраться, как исправить эту ошибку.

Рассмотрим пример:

using System;

public class Program

{

public static void Main()

{

int number;

Console.WriteLine(number);

}

}

В данном примере мы объявили переменную number типа int, но не присвоили ей значение, поэтому получаем ошибку «Использование локальной переменной которой не присвоено значение» (на английском «Use of unassigned local variable»).

Чтобы исправить ошибку, достаточно присвоить значение переменной number:

using System;

public class Program

{

public static void Main()

{

int number;

number = 2;

Console.WriteLine(number);

}

}

Ошибка «Использование локальной переменной которой не присвоено значение должна исчезнуть.

#include <iostream>
#include<math.h>
using namespace std;

int main()
{
	setlocale(LC_ALL, "Ukrainian");
	float y, x, t, z, k;
	cout << "Введіть k:";
	cin >> k;
	if ((k <= 10) && (0 < k))
		z = abs(sin(k));
	else z = 10;
	y = pow(x, k * 1) + fabs(pow(sin(x), 2) + sqrt(1 + pow(sin(x), 3)));
	x = (3 * z + tan(t*z)) / (t + 1);
	t = (z) / (1 + exp(k));
	cout << "k=" << k << "z=" << z << "y=" << y << "x=" << x << "t=" << t << endl;
	return 0;
}


  • Вопрос задан

    17 нояб. 2022

  • 113 просмотров

Переменная x при определении не инициализируется. Впервые в коде встречается в этой строке:

y = pow(x, k * 1) + fabs(pow(sin(x), 2) + sqrt(1 + pow(sin(x), 3)));

Т.е. вы что-то пытаетесь вычислить используя данные из переменной х. Какое значение имеет переменная x в этом выражении? Т.к. вы не задаете значение переменной в программе до использования переменной, то переменная содержит любое произвольное значение, мусор.
С переменной t все аналогично.

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

попробуйте вот так:

float y = 0, x = 0, t = 0, z = 0, k = 0;//при создании задавайте значение поумолчанию

или так так:
float y, x = 0, t = 0, z, k;

с++ не задает переменным значение по умолчанию, если это не структура или класс с конструктором (я упрощаю)
в переменной будет записан какой-то мусор, оставшийся от работы компьютера.

6375b2975432d407708901.png

Пригласить эксперта

Совет на будущее как правильно решать подобные проблемы. Берёте этот Error C4700 и идёте в гугл. Попутно узнаёте много нового.


  • Показать ещё
    Загружается…

05 июн. 2023, в 05:33

2000 руб./за проект

05 июн. 2023, в 02:07

3000 руб./за проект

05 июн. 2023, в 01:07

2000 руб./в час

Минуточку внимания

#c# #tryparse #unassigned-variable

#c# #попробуйте проанализировать #неназначенная переменная

Вопрос:

После поиска я, похоже, не могу понять, почему компилятор C # жалуется, что локальная переменная dteDest не назначена в строке

 if (dteSrc == dteDest) {
 

Ошибка исчезнет, если я заменю строку

 DateTime dteSrc, dteDest;
 

с

 DateTime dteSrc, dteDest = DateTime.MinValue;
 

Насколько я вижу, код никогда не достигнет строки сравнения, если dteDest не инициализирован DateTime .Попробуйте проанализировать, для чего это параметр out.

Моя логика:

  1. Если currentDataObj равно null, то booHaveOrigDate равно false, а первый if завершается ошибкой
  2. Если currentDataObj не равен null, но не может быть преобразован в DateTime, тогда booHaveOrigDate равно false, а первый if завершается ошибкой
  3. Дата-время.TryParse вернет false, если он не может преобразовать в DateTime это вместе с amp;amp; означает, что dteDest никогда не будет использоваться.

Простой пример кода

 void StrangeLogic(object srcData, object currentDataObj) {
   DateTime dteSrc, dteDest;

   bool booHaveNewDate = DateTime.TryParse(srcData.ToString(), out dteSrc);
   bool booHaveOrigDate = (currentDataObj != null) 
                          amp;amp; DateTime.TryParse(currentDataObj.ToString(), out dteDest);

   if (booHaveNewDate amp;amp; booHaveOrigDate) {
      if (dteSrc == dteDest) { 
          // Get a "use of unassignned local variable 'dteDest' 
          // unless dteDest = DateTime.MinValue beforehand
      }
   }
}
 

Также, если я изменю строку

 bool booHaveNewDate = DateTime.TryParse(srcData.ToString(), out dteSrc);
 

к следующему

 bool booHaveNewDate = (srcData != null) amp;amp; DateTime.TryParse(srcData.ToString(), out dteSrc);
 

затем компилятор жалуется, что srcDate также не назначен.

Может ли кто-нибудь указать мне правильное направление на то, чего мне не хватает — я не имею в виду проверку параметров и т. Д. Меня беспокоит, почему логика компилятора кажется обманутой использованием общей функции TryParse?

Дополнительная информация

Даже расширение логики по-прежнему выдает ту же ошибку (использование неназначенной локальной переменной)

 bool booHaveOrigDate;
if (currentDataObj != null) 
   booHaveOrigDate = DateTime.TryParse(currentDataObj.ToString(), out dteDest); 
else 
   booHaveOrigDate = false;

if (booHaveOrigDate) {
    if (dteSrc == dteDest) {
 

Похоже, что это то, что компилятор делает с проверкой null (currentDataObj != null), что мешает ему правильно определить, что dteDest не будет доступен, если не назначен

Измените его на этот код и никаких проблем (кроме возможных.toString() для нулевого объекта

 bool booHaveOrigDate = DateTime.TryParse(currentDataObj.ToString(), out dteDest); 
if (booHaveOrigDate) {
    if (dteSrc == dteDest) {
 

Ответ №1:

Ваша замена неверна, она должна быть:

 DateTime dteSrc = DateTime.MinValue, dteDest = DateTime.MinValue;
 

Однако вы должны использовать возвращаемую переменную TryParse , которая является bool, чтобы увидеть, сработал ли tryparse вместо этого, если ваш booHaveNewDate:

 DateTime dteSrc, dteDest;

if(DateTime.TryParse(srcData.ToString(), out dteSrc) amp;amp; DateTime.TryParse(currentDataObj.ToString(), out dteDest))
{
  if (dteSrc == dteDest) { 
      // Do your stuff here
  }
}
 

Теперь вам не нужно назначать даты в самом начале.

** Вы должны протестировать этот код перед использованием, он не является производственным кодом и может содержать ошибки

Комментарии:

1. Спасибо за отзыв, я проиллюстрировал то, что компилятор жалуется на переменную dteSrc только тогда, когда я меняю строку, чтобы включить «(srcData != null) amp;amp; » в строку «bool booHaveNewDate = DateTime. Попробуйте проанализировать (srcData. toString(), out dteSrc); «. В противном случае он не жалуется на dteSrc. Извините, объяснение не было ясным в нижней части исходного вопроса.

2. Компилятор не может следовать вашей логике. Он просто недостаточно умен, чтобы следовать всем путям кода. Вы можете обмануть его, назначив им сначала переписать ваш код, чтобы он понимал ваш код. Строка (srcData != null) делает невозможным для компилятора увидеть, что происходит.

3. Конечно, этот код просто завершится ошибкой, если currentDataObj имеет значение null — эта проверка является основной причиной проблемы. Пропущенный чек на самом деле мало что решает.

4. Изначально у меня был такой код, но мне нужно было использовать результат теста TryParse в коде, который не был показан в примере. Ошибка появилась только тогда, когда я изменил ее на код, который я опубликовал. Кажется, это добавление «(currentDataObj != null) amp;amp;» перед анализом TryParse, который мешает синтаксическому анализу компилятора

5. Насколько я понимаю, сначала потребуется нулевой тест, чтобы убедиться, что . Метод toString() не завершается ошибкой при вызове TryParse

Ответ №2:

Компилятор формально корректен, присвоение dteDest (в качестве out параметра) является условным. В глазах компилятора этого может и не произойти. Компилятор не «понимает» логику, которая следует из TryParse() .

Здесь аналогичная ситуация:

 int f(int x)
{
   int r;

   if (x <= 5)  r = 1;
   if (x >  5)  r = 2;

   return r;  // error: use of uninitialized var
}
 

С другой стороны, кажется немного более логичным инициализировать с помощью

   DateTime dteSrc = default(DateTime), dteDest = default(DateTime);
 

хотя это то же значение (DateTime.MinValue).

Комментарии:

1. Но не будет ли возвращаемое значение TryParse обрабатывать случай, когда преобразование завершается неудачно (вместо того, чтобы просто использовать DateTime. Разбор)

2. Да, поскольку составитель не оценивает код, он не «понимает», что «если (x <= 5) r = 1; если (x> 5) r = 2; » совпадает с «если (x <= 5) r = 1; иначе r = 2;» или»r = x <= 5? 1 : 2;»

Ответ №3:

Я могу ошибаться, но я не думаю, что компилятор пытается так тщательно проанализировать ваш код при сообщении об этой ошибке. В настоящее время я пытаюсь найти какой-либо источник для подтверждения моей теории. В то же время, я предполагаю, что это дизайнерское решение, потому что, если человеку требуется больше пары секунд, чтобы увидеть, что переменная не будет использоваться перед инициализацией, вероятно, лучшим решением для кодирования будет просто инициализировать ее нулем для начала, чтобы избежать путаницы.

Редактировать:

Ну, я немного осмотрелся, и хотя я нашел пару примеров людей, говорящих по сути то же самое, что и я, я не могу найти никакой официальной документации, подтверждающей это. Вот ответы, которые я нашел, хотя:

«Компилятор имеет полное право не знать вашу логику».

http://www.pcreview.co.uk/forums/use-unassigned-local-variable-error-t3067479.html

«… когда есть структура потока управления, он не может оценить ситуацию, потому что он не выполняет код, поэтому он не знает, присваиваются ли значения».

http://bytes.com/topic/c-sharp/answers/917965-why-am-i-getting-unassigned-local-variable-errors

Комментарии:

1. Спасибо, там есть несколько отличных моментов. Однако, похоже, это связано с тем фактом, что dteDest может быть неназначен, потому что он используется только тогда, когда оператор «DateTime. Попробуйте проанализировать (currentDataObj. toString(), out dteDest)», который является выходным параметром is. Его вводят в заблуждение, добавляя нулевой тест как часть логики

Ответ №4:

dteDest не будет иметь установленного значения, если currentDataObj == null

Это сработает, если вы измените свою строку на:

 bool booHaveOrigDate = DateTime.TryParse(currentDataObj != null ? currentDataObj.ToString() : string.Empty, out dteDest);
 

Комментарии:

1. Но ты не можешь позвонить ToString() дальше null .

2. Логический результат нулевого теста и дата-время. TryParse используется в «if (booHaveNewDate amp;amp; booHaveOrigDate) {«, который должен маскировать, не назначен ли dteSrc или dteDest

3. Если currentDataObj не назначен, он будет использовать строку. Пусто для TryParse, который вернет false и установит dteDest в MinValue .

Ответ №5:

логика компилятора, похоже, обманута использованием обычной функции TryParse

На приведенный выше вопрос проще всего ответить тем фактом, что когда компилятор компилирует ваш код, он не смотрит на то, что этот метод делает внутри, он просто смотрит на подпись. Он знает, что может возвращать логическое значение, которое может быть true или false, и он знает, что он устанавливает значение dteDest .

На самом деле это не ваша проблема. Проблема заключается в том, что следующая строка:

 bool booHaveOrigDate = (currentDataObj != null) 
          amp;amp; DateTime.TryParse(currentDataObj.ToString(), out dteDest);
 

Использует amp;amp; оператор, который не будет оценивать вторую часть, если первая часть имеет значение false. Это называется оценкой короткого замыкания и работает по теории, что если первая часть false, то не имеет значения, какова вторая часть — общий результат всегда будет false.

Таким образом, в этом случае dteDest никогда не устанавливается, и компилятор чувствует, что это проблема, даже если вы посмотрите на логику и скажете, что код никогда не будет выполняться, если он не установлен.

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

Комментарии:

1. Я точно понимаю, что вы имеете в виду, и это очень логично. Я обновил исходное содержимое quesiton разделом «Дополнительная информация», в котором показано расширенное if / else, которое все еще обманывает компилятор.

2. Возможно, я слишком много колебался. Важным моментом является то, что существует путь кода, в котором dteDest не задан. Это не имеет значения ни о чем другом, просто компилятор при просмотре всех путей в коде видит тот, который может привести к использованию объекта до его назначения. Он вообще не рассматривает, какая логика использует какие пути. Я вижу, как вы считаете это глупым, я был бы склонен согласиться в таком простом случае. Однако именно так работает компилятор. Если вы хотите углубиться в детали проектирования компилятора, я бы предложил задать отдельный конкретный вопрос.

Понравилась статья? Поделить с друзьями:

Не пропустите эти материалы по теме:

  • Яндекс еда ошибка привязки карты
  • Локальная и глобальная ошибка
  • Ложь это не ошибка не случайность это
  • Ложь работа над ошибками
  • Ложь ошибка недоразумение

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии