Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WinForms, .Net Framework Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 Эмуляция указателей в С-шарп  [new]
jenya7
Member

Откуда:
Сообщений: 1159
Мне нужно отладить некоторые довольно сложные алгоритмы которые бегут в эмбедед системе. На таргете это делать неудобно и муторно а в шарпе GUI и все дела.

В оригинальном коде я беру указатель переменной
case VAR_TYPE_FLSW: return &motor_rt_params[num].flimsw_state; break;
case VAR_TYPE_RLSW: return &motor_rt_params[num].rlimsw_state; break;

получаю значение по указателю
int32_t SCRIPT_GetVar(data_type_t *obj, uint8_t data_type)
{
    switch (data_type)
    {
        case DATA_TYPE_U8:  return obj->u8;  break;
        case DATA_TYPE_S16: return obj->i16; break;
        case DATA_TYPE_U16: return obj->u16; break; 
        case DATA_TYPE_S32: return obj->i32; break;
        case DATA_TYPE_U32: return obj->u32; break; 
    }
    
    return 0;
}

и записываю значению по указателю
void SCRIPT_SetVar(void *var, int32_t val, uint8_t data_type)
{
    switch (data_type)
    {
        case DATA_TYPE_U8:  *((uint8_t *)var)  = val; break;
        case DATA_TYPE_S16: *((int16_t *)var)  = val; break;
        case DATA_TYPE_U16: *((uint16_t *)var) = val; break; 
        case DATA_TYPE_S32: *((int32_t *)var)  = val; break; 
        case DATA_TYPE_U32: *((uint32_t *)var) = val; break; 
    }
}


Как мне сэмулировать это на С-шарп?
21 май 19, 14:25    [21889765]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция указателей в С-шарп  [new]
hVostt
Member

Откуда:
Сообщений: 15624
jenya7,

https://habr.com/ru/post/84076/
21 май 19, 14:30    [21889768]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция указателей в С-шарп  [new]
jenya7
Member

Откуда:
Сообщений: 1159
hVostt
jenya7,

https://habr.com/ru/post/84076/

фига се! я хотел упростить жизнь а не сойти с ума :)
21 май 19, 14:39    [21889783]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция указателей в С-шарп  [new]
jenya7
Member

Откуда:
Сообщений: 1159
public struct Token
{
    public string name;
    public TokenType type;
}

 bool LEXER_GetToken(string expr, ref Token token, ref int exp_idx)
{
    int i = 0;
    token.name[i++] = expr[exp_idx++];
}


на строчке token.name[i++] = expr[exp_idx++]; ругается
Error CS0200 Property or indexer 'string.this[int]' cannot be assigned to -- it is read only
что ему не нравиться?
21 май 19, 15:00    [21889795]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция указателей в С-шарп  [new]
Dima T
Member

Откуда:
Сообщений: 13838
Если это продолжение этой темы , то ты еще забыл упомянуть про union, которому в C# нет аналогов.

ИМХО проще всего забыть про указатели и сделать с помощью BitConverter.
21 май 19, 15:05    [21889799]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция указателей в С-шарп  [new]
Dima T
Member

Откуда:
Сообщений: 13838
jenya7
public struct Token
{
    public string name;
    public TokenType type;
}

 bool LEXER_GetToken(string expr, ref Token token, ref int exp_idx)
{
    int i = 0;
    token.name[i++] = expr[exp_idx++];
}


на строчке token.name[i++] = expr[exp_idx++]; ругается
Error CS0200 Property or indexer 'string.this[int]' cannot be assigned to -- it is read only
что ему не нравиться?

string в C# только для чтения, нельзя там буквы менять. Используй массивы.

PS Не самая хорошая идея в C# отлаживать С-ишный код. Как вариант может сделать DLL на С и вызывать её.
21 май 19, 15:13    [21889803]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция указателей в С-шарп  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4748
Dima T
string в C# только для чтения, нельзя там буквы менять. Используй массивы.


string Коля = "Коля";
                fixed(char* str = Коля)
                {
                    str[0] = 'Т';
                }
21 май 19, 15:27    [21889820]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция указателей в С-шарп  [new]
jenya7
Member

Откуда:
Сообщений: 1159
Dima T
jenya7
public struct Token
{
    public string name;
    public TokenType type;
}

 bool LEXER_GetToken(string expr, ref Token token, ref int exp_idx)
{
    int i = 0;
    token.name[i++] = expr[exp_idx++];
}


на строчке token.name[i++] = expr[exp_idx++]; ругается
Error CS0200 Property or indexer 'string.this[int]' cannot be assigned to -- it is read only
что ему не нравиться?

string в C# только для чтения, нельзя там буквы менять. Используй массивы.

PS Не самая хорошая идея в C# отлаживать С-ишный код. Как вариант может сделать DLL на С и вызывать её.

спасибо. попробую.
21 май 19, 15:27    [21889821]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция указателей в С-шарп  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4748
Dima T
Если это продолжение этой темы , то ты еще забыл упомянуть про union, которому в C# нет аналогов.

Есть десантные войска и нет задач не выполнимых.
    public enum uint8_t
    {
       DATA_TYPE_U8,
       DATA_TYPE_S16,
       DATA_TYPE_U16,
       DATA_TYPE_S32,
       DATA_TYPE_U32,
    }
    [StructLayout(LayoutKind.Sequential, Size = 8)]
    public unsafe struct data_type_t
    {
        public uint8_t vt;
        public unsafe sbyte u8
        {
            get
            {
                fixed( data_type_t* tmp = &this)
                {
                    return *((sbyte*)((void*)tmp)+4);
                }
            }
            set
            {
                fixed (data_type_t* tmp = &this)
                {
                    *((sbyte*)((void*)tmp)+4) = value;
                    vt = uint8_t.DATA_TYPE_U8;
                }
            }
        }

    }
data_type_t dat = default(data_type_t);

                dat.u8 = 111;
                Console.WriteLine(dat.u8);
21 май 19, 15:49    [21889839]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция указателей в С-шарп  [new]
fkthat
Member

Откуда:
Сообщений: 1163
Зачем эмулировать, если есть просто unsafe код с указателями.
21 май 19, 15:56    [21889854]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция указателей в С-шарп  [new]
jenya7
Member

Откуда:
Сообщений: 1159
fkthat
Зачем эмулировать, если есть просто unsafe код с указателями.

о! то что доктор прописал! :)
21 май 19, 16:32    [21889886]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция указателей в С-шарп  [new]
jenya7
Member

Откуда:
Сообщений: 1159
fkthat
Зачем эмулировать, если есть просто unsafe код с указателями.

Error CS0227 Unsafe code may only appear if compiling with /unsafe
21 май 19, 16:39    [21889891]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция указателей в С-шарп  [new]
Dima T
Member

Откуда:
Сообщений: 13838
jenya7
fkthat
Зачем эмулировать, если есть просто unsafe код с указателями.

Error CS0227 Unsafe code may only appear if compiling with /unsafe

В гугле забанили? Error CS0227

В свойствах проекта поставь галку "Разрешить небезопасный код"
21 май 19, 16:45    [21889897]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция указателей в С-шарп  [new]
jenya7
Member

Откуда:
Сообщений: 1159
так работает - с локальной переменной
public unsafe int* ParseVar(/*string var, ref byte var_type, ref byte data_type*/)
{
       int* ptr;
       int test;

       ptr = &test; 
          
       return ptr;
}

но если я подставляю глобальную переменную
public unsafe int* ParseVar(/*string var, ref byte var_type, ref byte data_type*/)
{
       int* ptr;

       ptr = &glob_var;
          
       return ptr;
}

получаю
Error CS0212 You can only take the address of an unfixed expression inside of a fixed statement initializer
21 май 19, 18:05    [21889979]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция указателей в С-шарп  [new]
fkthat
Member

Откуда:
Сообщений: 1163
jenya7,

Да, указатели можно использовать только внутри конструкции fixed. Потому что может в любой момент сработать мусорщик, переместить указуемый объект в другое место и указатель станет неправильным. Fixed на время запрещает мусорщику перемещать объект на который указывает указатель.
21 май 19, 18:18    [21889987]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция указателей в С-шарп  [new]
jenya7
Member

Откуда:
Сообщений: 1159
fkthat
jenya7,

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


так работает
public unsafe int* ParseVar()
{ 

     fixed (int* ptr= &Params.motor_rt_params[0].position) { return ptr; }
          
 }

private void buttonRun_Click(object sender, EventArgs e)
{     
     unsafe
      {
                int *ptr = parser.ParseVar();
                *ptr = 5;
     }

}
21 май 19, 18:22    [21889991]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция указателей в С-шарп  [new]
fkthat
Member

Откуда:
Сообщений: 1163
ЕвгенийВ
string Коля = "Коля";
                fixed(char* str = Коля)
                {
                    str[0] = 'Т';
                }


Так можно отстрелить себе ногу из-за "интернирования" строк.

var s1 = "Foo";
var s2 = "Foo";

fixed (char* p = s1)
{
    *p = 'B';
}

Console.WriteLine(s2);
21 май 19, 18:25    [21889995]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция указателей в С-шарп  [new]
fkthat
Member

Откуда:
Сообщений: 1163
jenya7
так работает

Нет. Потому что "After the code in the statement is executed, any pinned variables are unpinned and subject to garbage collection. Therefore, do not point to those variables outside the fixed statement." Неплохо бы было, если бы компилятор отлавливал подобные ляпы (еще такой же типичный ляп - это вернуть из метода переменную объявленную в "using"), но он этого не умеет (хотя, вполне возможно, что какой-нибудь решарпер такое даже делает, но не пользуюсь, поэтому точно не знаю).
21 май 19, 18:43    [21890004]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция указателей в С-шарп  [new]
jenya7
Member

Откуда:
Сообщений: 1159
fkthat
jenya7
так работает

Нет. Потому что "After the code in the statement is executed, any pinned variables are unpinned and subject to garbage collection. Therefore, do not point to those variables outside the fixed statement." Неплохо бы было, если бы компилятор отлавливал подобные ляпы (еще такой же типичный ляп - это вернуть из метода переменную объявленную в "using"), но он этого не умеет (хотя, вполне возможно, что какой-нибудь решарпер такое даже делает, но не пользуюсь, поэтому точно не знаю).

но после *ptr = 5; я вижу в Params.motor_rt_params[0].position - 5.
21 май 19, 18:52    [21890012]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция указателей в С-шарп  [new]
fkthat
Member

Откуда:
Сообщений: 1163
jenya7
но после *ptr = 5; я вижу в Params.motor_rt_params[0].position - 5.

А в другой раз можешь увидеть вообще непонятно что, если мусорщик кучу уплотнит.
21 май 19, 19:42    [21890033]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция указателей в С-шарп  [new]
Dima T
Member

Откуда:
Сообщений: 13838
jenya7
но после *ptr = 5; ...

Это можно написать в С/С++, хотя лучше union как я уже советовал, но не делай такого в C#. Это даже для С нездорово, но С это правильно поймет, а C# это совсем другой язык, тут так нельзя. Если можешь сделать DLL, то лучше сделай.
21 май 19, 20:00    [21890040]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция указателей в С-шарп  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3404
кстати, для справки :)
если открыть окно Memory 1 или 2,3,4 в строке адреса можно вводить адрес памяти в hex, можно вводить и имена переменных, методов и т.д. Всё это поддерживается и в QuickWatch и скорее всего в прочих окнах отладчика, с unsafe операторами
для локальных переменных знач. типа (в стеке) &varName
для переменной ссылочного типа на объект просто имя переменной varName.
первые x байт в открывшейся области памяти, это TypeHandler, дальше кишки объекта в куче,
не забываем, что если получить адрес переменной через &varName, это будет стек и смотреть надо наверх, а не вниз
бывает полезно, но не особо, чтоб уж так :)
21 май 19, 20:30    [21890056]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция указателей в С-шарп  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 4947
jenya7,

а что просто на плюсах проект не завести? и хоть заотлаживайся, вывод в консоль и вперёд
21 май 19, 22:45    [21890101]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция указателей в С-шарп  [new]
jenya7
Member

Откуда:
Сообщений: 1159
kealon(Ruslan)
jenya7,

а что просто на плюсах проект не завести? и хоть заотлаживайся, вывод в консоль и вперёд

в плюсах нет оконных приложений. не понятно как визуальные компоненты добавлять.
22 май 19, 08:18    [21890229]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция указателей в С-шарп  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
jenya7
kealon(Ruslan)
jenya7,

а что просто на плюсах проект не завести? и хоть заотлаживайся, вывод в консоль и вперёд

в плюсах нет оконных приложений. не понятно как визуальные компоненты добавлять.
тогда дельфи)))
Как ты совмещаешь несовместимое? ГУИ и низкоуровневое?
Так не бывает.
22 май 19, 08:32    [21890244]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция указателей в С-шарп  [new]
fkthat
Member

Откуда:
Сообщений: 1163
jenya7,

А зачем тебе для отладки обязательно оконное приложение?
22 май 19, 08:55    [21890262]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция указателей в С-шарп  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 4947
jenya7
kealon(Ruslan)
jenya7,

а что просто на плюсах проект не завести? и хоть заотлаживайся, вывод в консоль и вперёд

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

зачем для
jenya7
Мне нужно отладить ...
гуи? консоли с лихвой хватит
и тестить это гораздо удобнее, сравнил дифом модельный вывод и текущий, совпадает - значит всё работает

и сочинять ничего не придётся, плюсовый компилятор поддерживает с "из коропки"
22 май 19, 08:56    [21890265]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция указателей в С-шарп  [new]
fkthat
Member

Откуда:
Сообщений: 1163
kealon(Ruslan)
консоли с лихвой хватит

А лучше даже вообще не консоль, а брать сразу Xunit/Nunit или что-то подобное и писать под ним тесты - это вот уже будет по-взрослому.
22 май 19, 09:33    [21890296]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция указателей в С-шарп  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
Получается автор, ты две страницы не туда. Скрипач-ГУИ не нужен.
22 май 19, 09:37    [21890301]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция указателей в С-шарп  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4748
jenya7
kealon(Ruslan)
jenya7,

а что просто на плюсах проект не завести? и хоть заотлаживайся, вывод в консоль и вперёд

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

Не поверишь, но оконные приложения есть даже в ассемблере. Microsoft Office на чем по твоему написан?
22 май 19, 09:55    [21890317]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция указателей в С-шарп  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4748
https://docs.microsoft.com/ru-ru/cpp/mfc/mfc-and-atl?view=vs-2019
22 май 19, 09:56    [21890318]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция указателей в С-шарп  [new]
fkthat
Member

Откуда:
Сообщений: 1163
ЕвгенийВ
Microsoft Office на чем по твоему написан?

Ну уж я думаю, хоть и не целиком на том же шарпе, но и не на ассемблере, это точно :)) Тут уже разговор о другом - начешуя вообще для тестов гуи (а то даже и консольное приложение). ТС собирается сидеть, и каждый тест вводя руками данные и тыкая мышкой запускать?
22 май 19, 10:12    [21890334]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция указателей в С-шарп  [new]
jenya7
Member

Откуда:
Сообщений: 1159
fkthat
jenya7,

А зачем тебе для отладки обязательно оконное приложение?

изменять параметры в ран тайм. эмулировать показания разных датчиков ну и тому подобное.
22 май 19, 12:26    [21890548]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция указателей в С-шарп  [new]
jenya7
Member

Откуда:
Сообщений: 1159
[quot kealon(Ruslan)]
jenya7
пропущено...
гуи? консоли с лихвой хватит
и тестить это гораздо удобнее, сравнил дифом модельный вывод и текущий, совпадает - значит всё работает

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


Petro123
Получается автор, ты две страницы не туда. Скрипач-ГУИ не нужен.


Я конечно не знаю чем вы занимаетесь и что вы програмируете. А вот у нас для отладки создаются приложения с десятками компонентов ввода вывода. Правда в основном на LabView но мне не хочется с ним заморачиваться. Хотя LabView очень крут.
22 май 19, 12:34    [21890560]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция указателей в С-шарп  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
jenya7
Я конечно не знаю чем вы занимаетесь и что вы програмируете
мы здесь для того чтобы делится опытом
Я прикладник и выношу операции с указателями и вставками ассемблера в отдельные библиотеки.
То есть не мешаю с гуи.

jenya7
вот у нас для отладки создаются приложения с десятками компонентов ввода вывода
ну и покажите скрины или аналоги. Не нобелевка же.
22 май 19, 12:46    [21890588]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция указателей в С-шарп  [new]
jenya7
Member

Откуда:
Сообщений: 1159
Petro123
jenya7
вот у нас для отладки создаются приложения с десятками компонентов ввода вывода
ну и покажите скрины или аналоги. Не нобелевка же.

не знаю насколько я могу светить экранами. я не уверен насколько они classified.
22 май 19, 13:09    [21890635]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция указателей в С-шарп  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
jenya7
не знаю насколько я могу светить экранами. я не уверен насколько они classified.
гугле аналогов нет? Везет нам нам на изобретателей новых подходов)....куда никто не ходил.
Замазать же можете...черными квадратами)
22 май 19, 13:36    [21890690]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция указателей в С-шарп  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 4947
jenya7,

автотесты гуи это конечно хорошо, но каким боком они к вам - непонятно

а
jenya7
изменять параметры в ран тайм. эмулировать показания разных датчиков ну и тому подобное.
составьте варианты входных данных и всё, не вижу где гуи здесь нужен
22 май 19, 13:43    [21890715]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция указателей в С-шарп  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4748
Petro123
jenya7
не знаю насколько я могу светить экранами. я не уверен насколько они classified.
гугле аналогов нет? Везет нам нам на изобретателей новых подходов)....куда никто не ходил.
Замазать же можете...черными квадратами)

тебя в гугле тоже забанили?
http://www.ni.com/ru-ru/shop/labview/labview-details.html
22 май 19, 14:07    [21890755]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция указателей в С-шарп  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4748
fkthat
ЕвгенийВ
Microsoft Office на чем по твоему написан?

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

Потому как через визуальную составляющую человек воспринимает львиную долю информации. Проще сообразить, что пошло не так и проще поменять вручную.
Ну дурачки же придумали такие клевые штуки!
22 май 19, 14:12    [21890761]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция указателей в С-шарп  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
ЕвгенийВ
Petro123
пропущено...
гугле аналогов нет? Везет нам нам на изобретателей новых подходов)....куда никто не ходил.
Замазать же можете...черными квадратами)

тебя в гугле тоже забанили?
http://www.ni.com/ru-ru/shop/labview/labview-details.html
то есть он пишет свой рукописный labView. Так?
22 май 19, 15:14    [21890872]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция указателей в С-шарп  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
ЕвгенийВ,
Раз вы все знаете за автора.
Причем к сабжу это?
https://ru.wikipedia.org/wiki/LabVIEW
22 май 19, 15:27    [21890881]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / WinForms, .Net Framework Ответить