Форум программистов, компьютерный форум, киберфорум
Java
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 12.08.2014
Сообщений: 130
1

Указатель Шредингера

28.01.2018, 16:54. Показов 560. Ответов 21
Метки нет (Все метки)

В классе, указатель(waitData) почему то одновременно и null и не null. Как такое может быть?
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
public class NetworkStream implements Runnable
{
    private DatagramSocket outSocket;
    private byte []waitData=null;
    private String dest;
    private int port;
    private boolean stop=false;
    
    private long MakeStump()
    {
        return System.currentTimeMillis() / 1000L;
    }
    
    public NetworkStream(DatagramSocket outS,String dest,int port)
    {
        this.outSocket = outS;
        this.dest=dest;
        this.port=port;
    }
    public void PutData(byte []data)
    {
        if(waitData==null)
        {
            ByteBuffer buffer = ByteBuffer.allocate(data.length+9);
            buffer.put((byte) 1);//VID
            buffer.putLong(this.MakeStump());
            buffer.put(data, 0, data.length);
            System.out.println(String.valueOf(data.length+9)+" - "+String.valueOf(buffer.position()));
            buffer.position(0);
            this.waitData=new byte[data.length+9];
            buffer.get(waitData);
        }
    }
    @Override
    public void run() {
        // TODO Auto-generated method stub
        
        for(;;)
        {
            if(waitData!=null)
            {
                System.out.println("!!!");
                try 
                {
                    DatagramPacket sendPacket = new DatagramPacket(this.waitData,this.waitData.length,InetAddress.getByName(this.dest),this.port);
                    this.outSocket.send(sendPacket);
                    this.waitData=null;
                    System.out.println(String.valueOf(this.waitData.length));
                } 
                catch (Exception e) {
                    // TODO Auto-generated catch block
                    System.out.println(e.getMessage());
                }
            }
            if(this.stop)
            {
                this.outSocket.close();
                return;
            }
        }
    }
    public void Stop()
    {
        this.stop=true;
    }
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.01.2018, 16:54
Ответы с готовыми решениями:

Как получить ссылку на указатель или указатель на указатель в массиве?
В процессе реализации сортировки пузырьком натолкнулся на такую проблему: как поменять значения...

Ур-е Шрёдингера и ГАмильтониан
Товарищи, здравствуйте. Потихоньку пытаюсь разобраться с квантовой механикой (естественно, ничего...

Пакет шредингера
anth@anth:~$ sudo apt-get install sqlmap Чтение списков пакетов... Готово Построение дерева...

Уравнение Шредингера
Частица массой m находится в одномерном потенциальном поле U(x) в стационарном состоянии, для...

21
Эксперт Java
2379 / 2208 / 561
Регистрация: 28.12.2010
Сообщений: 8,636
28.01.2018, 17:48 2
Цитата Сообщение от yotsi Посмотреть сообщение
Как такое может быть?
очеь просто. Такого быть не может.
0
0 / 0 / 0
Регистрация: 12.08.2014
Сообщений: 130
28.01.2018, 18:27  [ТС] 3
Цитата Сообщение от KEKCoGEN Посмотреть сообщение
очеь просто. Такого быть не может.
А что есть?
0
277 / 226 / 93
Регистрация: 27.06.2016
Сообщений: 639
28.01.2018, 18:31 4
yotsi, так у вас ещё и с outSocket такая же проблема. Доказательств предоставляю ровно столько же, сколько и вы, держите:
0
0 / 0 / 0
Регистрация: 12.08.2014
Сообщений: 130
28.01.2018, 18:52  [ТС] 5
Цитата Сообщение от alex white Посмотреть сообщение
yotsi, так у вас ещё и с outSocket такая же проблема. Доказательств предоставляю ровно столько же, сколько и вы, держите:
Пишите яснее.Для сокета есть обработка исключений.Просто для разных потоков одна и таже переменная, которая почему то и null и не null.Хотя она должна быть глобальна.
0
277 / 226 / 93
Регистрация: 27.06.2016
Сообщений: 639
28.01.2018, 19:04 6
Цитата Сообщение от yotsi Посмотреть сообщение
Просто для разных потоков одна и таже переменная, которая почему то и null и не null.
А сразу сказать это нельзя было? Сделайте её volatile, правда не удивлюсь, что у вас могут быть и другие проблемы с разделяемым доступом к ней. Контекста ноль дали, получаете ответы, которых заслуживаете.
0
Эксперт Java
378 / 370 / 114
Регистрация: 30.06.2010
Сообщений: 1,445
28.01.2018, 19:06 7
yotsi, Все логично, разные потоки - разные переменные. В 48 строке гарантированный NPE, если исключать крайние случаи гонок
0
alex white
28.01.2018, 19:07
  #8

Не по теме:

LeX, а, то есть она у него еще и не разделяемая, вообще красота тогда

0
0 / 0 / 0
Регистрация: 12.08.2014
Сообщений: 130
28.01.2018, 19:10  [ТС] 9
Цитата Сообщение от alex white Посмотреть сообщение
А сразу сказать это нельзя было? Сделайте её volatile, правда не удивлюсь, что у вас могут быть и другие проблемы с разделяемым доступом к ней. Контекста ноль дали, получаете ответы, которых заслуживаете.
Контекст?Поясните? По коду ведь видно что я пытаюсь через сеть отсылать поток данных, и естественно что в другом потоке.Так почему переменная которая должна быть глобальная (и даже выполнять ф-цию для конечного автомата) не ведет себя как глобальная ?
0
277 / 226 / 93
Регистрация: 27.06.2016
Сообщений: 639
28.01.2018, 19:24 10
yotsi, я не вижу в вашем коде ни единого создания потока. А знать, создают ли потоки какие-либо функции связанные с сокетами никто вам не обязан (а знаете ли это вы, тот еще вопрос).

Добавлено через 3 минуты
Цитата Сообщение от yotsi Посмотреть сообщение
this.waitData=null;
System.out.println(String.valueOf(this.waitData.length));
А это что?
Вы у nullа length выводите...

Добавлено через 40 секунд
yotsi, ах да, вам это выше уже указали...
0
0 / 0 / 0
Регистрация: 12.08.2014
Сообщений: 130
28.01.2018, 19:45  [ТС] 11
Цитата Сообщение от alex white Посмотреть сообщение
LeX, а, то есть она у него еще и не разделяемая, вообще красота тогда
как вы предлагаете передавать данные между нитями ?
0
277 / 226 / 93
Регистрация: 27.06.2016
Сообщений: 639
28.01.2018, 19:49 12
yotsi, вы NPE на 48 строке исправили?
0
0 / 0 / 0
Регистрация: 12.08.2014
Сообщений: 130
28.01.2018, 19:57  [ТС] 13
Цитата Сообщение от alex white Посмотреть сообщение
yotsi, вы NPE на 48 строке исправили?
Ну КОНЕЧНО это ж ведь жаба, оно и так в этом случае случае плюет - "null" в аутпут.
0
277 / 226 / 93
Регистрация: 27.06.2016
Сообщений: 639
28.01.2018, 20:02 14
yotsi,
https://ideone.com/e2bltJ
0
0 / 0 / 0
Регистрация: 12.08.2014
Сообщений: 130
28.01.2018, 20:16  [ТС] 15
Цитата Сообщение от alex white Посмотреть сообщение
https://ideone.com/e2bltJ
Я очень рад вашей инициативе но плевало "null" из catch ...
0
277 / 226 / 93
Регистрация: 27.06.2016
Сообщений: 639
28.01.2018, 20:20 16
yotsi, стек-трэйс покажите
0
0 / 0 / 0
Регистрация: 12.08.2014
Сообщений: 130
28.01.2018, 20:38  [ТС] 17
Цитата Сообщение от alex white Посмотреть сообщение
yotsi, стек-трэйс покажите
Вопрос не в том кто прав.А почему указатель измененный в одном потоке не изменился в другом.Ну или как обмениватся данными между нитями в джава, что бы потенциально избежать таких ситуаций.А код я кардинально переделал, оно все в одном потоке дергаетсья.Но всеравно задача
обмениватся данными между нитями в джава, что бы потенциально избежать таких ситуаций
актуальна для меня
0
277 / 226 / 93
Регистрация: 27.06.2016
Сообщений: 639
28.01.2018, 20:43 18
yotsi, опять же, потоков не вижу. Но если вы передали указатель функции, которая запихнет его в другой поток, он не должен меняться. Потому что вы передали значение указателя, которое было на тот момент времени, а не само "состояние". Null - это просто null, он сам по себе не меняется.
0
0 / 0 / 0
Регистрация: 12.08.2014
Сообщений: 130
28.01.2018, 22:30  [ТС] 19
Цитата Сообщение от alex white Посмотреть сообщение
yotsi, опять же, потоков не вижу. Но если вы передали указатель функции, которая запихнет его в другой поток, он не должен меняться. Потому что вы передали значение указателя, которое было на тот момент времени, а не само "состояние". Null - это просто null, он сам по себе не меняется.
java так далека от плюсов?? Указатель или адрес или нифига, если адрес то слать если нифига, то и нифига не слать, такой себе конечный автомат. Так что никак и как сделать что бы так ?
0
277 / 226 / 93
Регистрация: 27.06.2016
Сообщений: 639
28.01.2018, 22:40 20
yotsi, чего? Ссылки Java близки к указателям плюсов, но при этом далеки от ссылок в плюсах и в Java нет операции взятия адреса. Так что вы не можете переназначить ссылку через косвенную адресацию (попробуйте свапнуть два объекта через функцию - это невозможно).
Они просто копируются. Так что изменять состояние можно только напрямую. Если ссылка является полем объекта - передавайте объект и в функции меняйте это поле. Если это элемент массива - ну вы поняли.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.01.2018, 22:40

А почему нельзя передавать в ф-ю добавления элемента в стек один указатель? Почему нужен именно указатель на указатель?
Вот код ф-ии добавления элемента в стек: void push1(Node **top, int d) { // top...

Стационарное уравнение Шредингера
#include "stdafx.h" #include <complex> #include<iostream> #include<cmath> #include<iomanip>...

Численное решение уравнения Шредингера
По работе столкнулся со следующей задачей. Необходимо численно решить уравнение Шредингера для...

Решение уравнения Шредингера на Pascal
Ребят, пожалуйста помогите, курсовая горит. Решите пожалуйста уравнение Шредингера на языке Pascal...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru