powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Эмуляция указателей в С-шарп
42 сообщений из 42, показаны все 2 страниц
Эмуляция указателей в С-шарп
    #39815829
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мне нужно отладить некоторые довольно сложные алгоритмы которые бегут в эмбедед системе. На таргете это делать неудобно и муторно а в шарпе GUI и все дела.

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


получаю значение по указателю
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
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;
}


и записываю значению по указателю
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
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; 
    }
}



Как мне сэмулировать это на С-шарп?
...
Рейтинг: 0 / 0
Эмуляция указателей в С-шарп
    #39815831
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Эмуляция указателей в С-шарп
    #39815840
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVosttjenya7,

https://habr.com/ru/post/84076/
фига се! я хотел упростить жизнь а не сойти с ума :)
...
Рейтинг: 0 / 0
Эмуляция указателей в С-шарп
    #39815851
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
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
что ему не нравиться?
...
Рейтинг: 0 / 0
Эмуляция указателей в С-шарп
    #39815853
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если это продолжение этой темы , то ты еще забыл упомянуть про union, которому в C# нет аналогов.

ИМХО проще всего забыть про указатели и сделать с помощью BitConverter .
...
Рейтинг: 0 / 0
Эмуляция указателей в С-шарп
    #39815856
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
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 на С и вызывать её.
...
Рейтинг: 0 / 0
Эмуляция указателей в С-шарп
    #39815868
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tstring в C# только для чтения, нельзя там буквы менять. Используй массивы.


Код: c#
1.
2.
3.
4.
5.
string Коля = "Коля";
                fixed(char* str = Коля)
                {
                    str[0] = 'Т';
                }
...
Рейтинг: 0 / 0
Эмуляция указателей в С-шарп
    #39815869
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima Tjenya7
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
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 на С и вызывать её.
спасибо. попробую.
...
Рейтинг: 0 / 0
Эмуляция указателей в С-шарп
    #39815879
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЕсли это продолжение этой темы , то ты еще забыл упомянуть про union, которому в C# нет аналогов.

Есть десантные войска и нет задач не выполнимых.
Код: c#
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.
    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);
...
Рейтинг: 0 / 0
Эмуляция указателей в С-шарп
    #39815888
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зачем эмулировать, если есть просто unsafe код с указателями.
...
Рейтинг: 0 / 0
Эмуляция указателей в С-шарп
    #39815911
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fkthatЗачем эмулировать, если есть просто unsafe код с указателями.
о! то что доктор прописал! :)
...
Рейтинг: 0 / 0
Эмуляция указателей в С-шарп
    #39815915
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fkthatЗачем эмулировать, если есть просто unsafe код с указателями.
Error CS0227 Unsafe code may only appear if compiling with /unsafe
...
Рейтинг: 0 / 0
Эмуляция указателей в С-шарп
    #39815919
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7fkthatЗачем эмулировать, если есть просто unsafe код с указателями.
Error CS0227 Unsafe code may only appear if compiling with /unsafe
В гугле забанили? Error CS0227

В свойствах проекта поставь галку "Разрешить небезопасный код"
...
Рейтинг: 0 / 0
Эмуляция указателей в С-шарп
    #39815972
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
так работает - с локальной переменной
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
public unsafe int* ParseVar(/*string var, ref byte var_type, ref byte data_type*/)
{
       int* ptr;
       int test;

       ptr = &test; 
          
       return ptr;
}


но если я подставляю глобальную переменную
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
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
...
Рейтинг: 0 / 0
Эмуляция указателей в С-шарп
    #39815979
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7,

Да, указатели можно использовать только внутри конструкции fixed . Потому что может в любой момент сработать мусорщик, переместить указуемый объект в другое место и указатель станет неправильным. Fixed на время запрещает мусорщику перемещать объект на который указывает указатель.
...
Рейтинг: 0 / 0
Эмуляция указателей в С-шарп
    #39815983
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fkthatjenya7,

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

так работает
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
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;
     }

}
...
Рейтинг: 0 / 0
Эмуляция указателей в С-шарп
    #39815987
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВ
Код: c#
1.
2.
3.
4.
5.
string Коля = "Коля";
                fixed(char* str = Коля)
                {
                    str[0] = 'Т';
                }



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

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
var s1 = "Foo";
var s2 = "Foo";

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

Console.WriteLine(s2);
...
Рейтинг: 0 / 0
Эмуляция указателей в С-шарп
    #39815995
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"), но он этого не умеет (хотя, вполне возможно, что какой-нибудь решарпер такое даже делает, но не пользуюсь, поэтому точно не знаю).
...
Рейтинг: 0 / 0
Эмуляция указателей в С-шарп
    #39816001
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fkthatjenya7так работает
Нет. Потому что "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.
...
Рейтинг: 0 / 0
Эмуляция указателей в С-шарп
    #39816016
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7но после *ptr = 5; я вижу в Params.motor_rt_params[0].position - 5.
А в другой раз можешь увидеть вообще непонятно что, если мусорщик кучу уплотнит.
...
Рейтинг: 0 / 0
Эмуляция указателей в С-шарп
    #39816019
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7но после *ptr = 5; ...
Это можно написать в С/С++, хотя лучше union как я уже советовал, но не делай такого в C#. Это даже для С нездорово, но С это правильно поймет, а C# это совсем другой язык, тут так нельзя. Если можешь сделать DLL, то лучше сделай.
...
Рейтинг: 0 / 0
Эмуляция указателей в С-шарп
    #39816027
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кстати, для справки :)
если открыть окно Memory 1 или 2,3,4 в строке адреса можно вводить адрес памяти в hex, можно вводить и имена переменных, методов и т.д. Всё это поддерживается и в QuickWatch и скорее всего в прочих окнах отладчика, с unsafe операторами
для локальных переменных знач. типа (в стеке) &varName
для переменной ссылочного типа на объект просто имя переменной varName.
первые x байт в открывшейся области памяти, это TypeHandler, дальше кишки объекта в куче,
не забываем, что если получить адрес переменной через &varName, это будет стек и смотреть надо наверх, а не вниз
бывает полезно, но не особо, чтоб уж так :)
...
Рейтинг: 0 / 0
Эмуляция указателей в С-шарп
    #39816057
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7,

а что просто на плюсах проект не завести? и хоть заотлаживайся, вывод в консоль и вперёд
...
Рейтинг: 0 / 0
Эмуляция указателей в С-шарп
    #39816150
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kealon(Ruslan)jenya7,

а что просто на плюсах проект не завести? и хоть заотлаживайся, вывод в консоль и вперёд
в плюсах нет оконных приложений. не понятно как визуальные компоненты добавлять.
...
Рейтинг: 0 / 0
Эмуляция указателей в С-шарп
    #39816158
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7kealon(Ruslan)jenya7,

а что просто на плюсах проект не завести? и хоть заотлаживайся, вывод в консоль и вперёд
в плюсах нет оконных приложений. не понятно как визуальные компоненты добавлять.тогда дельфи)))
Как ты совмещаешь несовместимое? ГУИ и низкоуровневое?
Так не бывает.
...
Рейтинг: 0 / 0
Эмуляция указателей в С-шарп
    #39816173
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7,

А зачем тебе для отладки обязательно оконное приложение?
...
Рейтинг: 0 / 0
Эмуляция указателей в С-шарп
    #39816174
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7kealon(Ruslan)jenya7,

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

и сочинять ничего не придётся, плюсовый компилятор поддерживает с "из коропки"
...
Рейтинг: 0 / 0
Эмуляция указателей в С-шарп
    #39816193
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)консоли с лихвой хватит
А лучше даже вообще не консоль, а брать сразу Xunit/Nunit или что-то подобное и писать под ним тесты - это вот уже будет по-взрослому.
...
Рейтинг: 0 / 0
Эмуляция указателей в С-шарп
    #39816198
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Получается автор, ты две страницы не туда. Скрипач-ГУИ не нужен.
...
Рейтинг: 0 / 0
Эмуляция указателей в С-шарп
    #39816207
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7kealon(Ruslan)jenya7,

а что просто на плюсах проект не завести? и хоть заотлаживайся, вывод в консоль и вперёд
в плюсах нет оконных приложений. не понятно как визуальные компоненты добавлять.
Не поверишь, но оконные приложения есть даже в ассемблере. Microsoft Office на чем по твоему написан?
...
Рейтинг: 0 / 0
Эмуляция указателей в С-шарп
    #39816208
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Эмуляция указателей в С-шарп
    #39816216
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВMicrosoft Office на чем по твоему написан?
Ну уж я думаю, хоть и не целиком на том же шарпе, но и не на ассемблере, это точно :)) Тут уже разговор о другом - начешуя вообще для тестов гуи (а то даже и консольное приложение). ТС собирается сидеть, и каждый тест вводя руками данные и тыкая мышкой запускать?
...
Рейтинг: 0 / 0
Эмуляция указателей в С-шарп
    #39816342
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fkthatjenya7,

А зачем тебе для отладки обязательно оконное приложение?
изменять параметры в ран тайм. эмулировать показания разных датчиков ну и тому подобное.
...
Рейтинг: 0 / 0
Эмуляция указателей в С-шарп
    #39816349
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot kealon(Ruslan)]jenya7пропущено...
гуи? консоли с лихвой хватит
и тестить это гораздо удобнее, сравнил дифом модельный вывод и текущий, совпадает - значит всё работает

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

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

Я конечно не знаю чем вы занимаетесь и что вы програмируете. А вот у нас для отладки создаются приложения с десятками компонентов ввода вывода. Правда в основном на LabView но мне не хочется с ним заморачиваться. Хотя LabView очень крут.
...
Рейтинг: 0 / 0
Эмуляция указателей в С-шарп
    #39816373
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7Я конечно не знаю чем вы занимаетесь и что вы програмируетемы здесь для того чтобы делится опытом
Я прикладник и выношу операции с указателями и вставками ассемблера в отдельные библиотеки.
То есть не мешаю с гуи.

jenya7вот у нас для отладки создаются приложения с десятками компонентов ввода выводану и покажите скрины или аналоги. Не нобелевка же.
...
Рейтинг: 0 / 0
Эмуляция указателей в С-шарп
    #39816407
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123jenya7вот у нас для отладки создаются приложения с десятками компонентов ввода выводану и покажите скрины или аналоги. Не нобелевка же.
не знаю насколько я могу светить экранами. я не уверен насколько они classified.
...
Рейтинг: 0 / 0
Эмуляция указателей в С-шарп
    #39816447
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7не знаю насколько я могу светить экранами. я не уверен насколько они classified.гугле аналогов нет? Везет нам нам на изобретателей новых подходов)....куда никто не ходил.
Замазать же можете...черными квадратами)
...
Рейтинг: 0 / 0
Эмуляция указателей в С-шарп
    #39816462
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7,

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

а jenya7изменять параметры в ран тайм. эмулировать показания разных датчиков ну и тому подобное.составьте варианты входных данных и всё, не вижу где гуи здесь нужен
...
Рейтинг: 0 / 0
Эмуляция указателей в С-шарп
    #39816490
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123jenya7не знаю насколько я могу светить экранами. я не уверен насколько они classified.гугле аналогов нет? Везет нам нам на изобретателей новых подходов)....куда никто не ходил.
Замазать же можете...черными квадратами)
тебя в гугле тоже забанили?
http://www.ni.com/ru-ru/shop/labview/labview-details.html
...
Рейтинг: 0 / 0
Эмуляция указателей в С-шарп
    #39816493
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatЕвгенийВMicrosoft Office на чем по твоему написан?
Тут уже разговор о другом - начешуя вообще для тестов гуи (а то даже и консольное приложение). ТС собирается сидеть, и каждый тест вводя руками данные и тыкая мышкой запускать?
Потому как через визуальную составляющую человек воспринимает львиную долю информации. Проще сообразить, что пошло не так и проще поменять вручную.
Ну дурачки же придумали такие клевые штуки !
...
Рейтинг: 0 / 0
Эмуляция указателей в С-шарп
    #39816576
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВPetro123пропущено...
гугле аналогов нет? Везет нам нам на изобретателей новых подходов)....куда никто не ходил.
Замазать же можете...черными квадратами)
тебя в гугле тоже забанили?
http://www.ni.com/ru-ru/shop/labview/labview-details.html то есть он пишет свой рукописный labView. Так?
...
Рейтинг: 0 / 0
Эмуляция указателей в С-шарп
    #39816581
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВ,
Раз вы все знаете за автора.
Причем к сабжу это?
https://ru.wikipedia.org/wiki/LabVIEW
...
Рейтинг: 0 / 0
42 сообщений из 42, показаны все 2 страниц
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Эмуляция указателей в С-шарп
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]