Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/40: Рейтинг темы: голосов - 40, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 29.01.2014
Сообщений: 9
1

Передать указатель на массив

29.01.2014, 19:00. Показов 7163. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго всем времени суток.
У меня опыт в программинге МК. А сейчас стоит задача освоить ООП и конкретно C#. Так вот суть вопроса:

Есть класс, а в нём функция crc8_compute, возращающая значение типа байт... с двумя аргументами (один - байт, второй - массив байтов неопределённой длины). И вот теперь мне нужно вызвать эту функцию в другом классе...

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
    public class CRC8
    {
        byte[] crc8_tabl = new byte[] {
        0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65,
        157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220,
        35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98,
        190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255,
        70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7,
        219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154,
        101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36,
        248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185,
        140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205,
        17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80,
        175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 238,
        50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115,
        202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139,
        87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22,
        233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168,
        116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53
                               };
 
        unsafe public byte crc8_compute(byte * str, byte length)
        {
            byte crc8 = 0;
            while (length != 0)
            {
                crc8 = crc8_tabl[crc8 ^ *str++];
                --length;
            }
            return crc8;
        }
    }
Как это сделать? Вот я пытаюсь вызвать так:
C#
1
2
3
4
5
6
 int byteRecieved = 0x67d2;
                byte[] messByte = new byte[0x67];
 
unsafe{
                            byte sdfg = CRCclass.crc8_compute(messByte[0], (byte)(byteRecieved - 1));
                          }
И вот пишет, что "наиболее подходящий перегруженный метод ... имеет несколько недопустимых аргументов". Как же БЫТЬ???
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.01.2014, 19:00
Ответы с готовыми решениями:

Нужно передать в качестве параметра указатель на массив
Нужно передать в качестве параметра указатель на массив. Я так понимаю, есть несколько способов это...

Как правильно передать и получить указатель из нативной библиотеки?
Есть некий Сишный код (я опускаю __delc и прочее) с C# я абсолютно не знаком struct Block...

C# Подскажите как правильно передать указатель на структуру в функцию
Здравствуйте, возникли проблемы с переходом из С в С#, к сожалению синтаксис C# знаю плохо и сразу...

Массив: Подскажите, пожалуйста, как передать массив А в процедуру Arr?
Добрый день! Подскажите, пожалуйста, как передать массив А в процедуру Arr? using System;...

17
434 / 299 / 82
Регистрация: 11.12.2010
Сообщений: 1,209
29.01.2014, 19:24 2
Цитата Сообщение от Вадим78 Посмотреть сообщение
unsafe public
Вам обязательно нужен небезопасный код?
Может лучше так?
C#
1
 crc8_compute(out byte[] str, byte length)
или
C#
1
 crc8_compute(ref byte[] str, byte length)
Добавлено через 47 секунд
Цитата Сообщение от Вадим78 Посмотреть сообщение
byte sdfg = CRCclass.crc8_compute(messByte[0], (byte)(byteRecieved - 1));
а тут
C#
1
byte sdfg = CRCclass.crc8_compute(out messByte[0], (byte)(byteRecieved - 1));
или
C#
1
byte sdfg = CRCclass.crc8_compute(ref messByte[0], (byte)(byteRecieved - 1));
Добавлено через 28 секунд
http://msdn.microsoft.com/ru-ru/Library/ee332485
http://msdn.microsoft.com/ru-r... kc2c7.aspx
ref - это по ссылке но требует инициализации
0
Эксперт .NET
5534 / 4298 / 1217
Регистрация: 12.10.2013
Сообщений: 12,332
Записей в блоге: 2
29.01.2014, 19:28 3
А в чем суть задачи? CRC8 вычислить из массива байт? Так это можно и проще сделать, короткой функцией, без таблицы...
0
0 / 0 / 0
Регистрация: 29.01.2014
Сообщений: 9
29.01.2014, 19:44  [ТС] 4
Попробовал, но результат тот же. А небезопасный код, потому что в аргументе функции УКАЗАТЕЛЬ на массив. Я так понял, что в таких случаях использовать нужно unsafe... я новичёк, так что не пинайте. Может не так разобрался

Добавлено через 2 минуты
insite2012, Совершенно верно. Сам алгоритм отсюда http://www.vbnet.ru/forum/show.aspx?id=33392
Можете ссылку кинуть?
0
Эксперт .NET
5534 / 4298 / 1217
Регистрация: 12.10.2013
Сообщений: 12,332
Записей в блоге: 2
29.01.2014, 19:52 5
У меня есть проект на VB.Net. Сейчас на шарпе напишу и покажу...

Добавлено через 2 минуты
Вот. Полином - 0х8005, начальная КС - 0х00, выходной XOR - 0xFFFF. Измените как надо. Ну и под CRC8 подгоните, тут CRC16 вычисляется.
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
namespace CRC_Calculator
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            button1.Click+=new EventHandler(button1_Click);
        }
        string computeCRC16(List<byte> data)
        {
            uint temp=0;
            uint crc=0x00;
            uint poli = 0x8005;
            for (int i = 0; i < data.Count; i++)
            {
                temp = (uint)(data[i] * 0x100);
                crc = crc ^ temp;
                for (int j = 0; j <= 7; j++)
                {
                    if ((crc & 0x8000) > 0)
                        crc = ((crc << 1) ^ poli) & 0xffff;
                    else
                        crc = (crc << 1) & 0xffff;
                }
            }
            crc ^= 0xffff;
            return crc.ToString("X4");
        }
 
        void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog dialog = new OpenFileDialog();
            List<byte> data = new List<byte>();
            if (dialog.ShowDialog() == DialogResult.OK)
            {
                data.AddRange(System.IO.File.ReadAllBytes(dialog.FileName));
                textBox1.Text = computeCRC16(data);
            }
        }
    }
}
1
0 / 0 / 0
Регистрация: 29.01.2014
Сообщений: 9
29.01.2014, 20:15  [ТС] 6
string computeCRC16(List<byte> data)

Я правильно понял, что аргумент - это один байт (data)? Т.е. CRC16 расчитается от одно байта? У меня ведь массив
0
434 / 299 / 82
Регистрация: 11.12.2010
Сообщений: 1,209
29.01.2014, 20:19 7
Цитата Сообщение от Вадим78 Посмотреть сообщение
Я правильно понял, что аргумент - это один байт (data)? Т.е. CRC16 расчитается от одно байта? У меня ведь массив
Нет аргумент это список байтов.
Считай массив Отличие от массива в том что он фактически безразмерен.
0
Эксперт .NET
5534 / 4298 / 1217
Регистрация: 12.10.2013
Сообщений: 12,332
Записей в блоге: 2
29.01.2014, 20:30 8
Цитата Сообщение от Kill100 Посмотреть сообщение
Нет аргумент это список байтов.
Считай массив Отличие от массива в том что он фактически безразмерен.
Именно так. Мне нравятся листы, удобная штука, размер неограничен, контроль типов, все удобства...
0
434 / 299 / 82
Регистрация: 11.12.2010
Сообщений: 1,209
29.01.2014, 21:20 9
Цитата Сообщение от insite2012 Посмотреть сообщение
Именно так. Мне нравятся листы, удобная штука, размер неограничен, контроль типов, все удобства...
Жаль что размер у них ограничивается Int32 файл больше 3 гигов уже не скормить.
0
Эксперт .NET
5534 / 4298 / 1217
Регистрация: 12.10.2013
Сообщений: 12,332
Записей в блоге: 2
29.01.2014, 21:28 10
Цитата Сообщение от Kill100 Посмотреть сообщение
Жаль что размер у них ограничивается Int32 файл больше 3 гигов уже не скормить.
Да куда же Вам столько...
0
0 / 0 / 0
Регистрация: 29.01.2014
Сообщений: 9
10.02.2014, 17:23  [ТС] 11
Спасибо insite2012, всё получилось. Только с полиномами пришлось помучаться, пока результат стал совпадать с результатами калькуляторов. Вот, что получилось для CRC-8-Dallas/Maxim:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        byte computeCRC8(List<byte> data)
        {
            byte temp = 0;                       // x8 + x2 + x + 1            = 0x83 = 10000011  (CRC-8-CCITT)
            uint crc = 0;                        // x8 + x5 + x4 + 1           = 0x98 = 10011000  (CRC-8-DALLAS/MAXIM)
            byte poly = 0x31;                    // x8 + x7 + x6 + x4 + x2 + 1 = 0xEA = 11101010  (CRC-8)
            for (int i = 0; i < data.Count; i++)
            {
                temp = data[i];
                crc ^= temp;
                for (byte j = 0; j < 8; j++)
                {
                    if ((crc & 0x80) > 0)
                        crc = ((crc << 1) ^ poly) & 0xff;
                    else
                        crc = (crc << 1) & 0xff;
                }
            }
            return (byte)crc;              // X2 - кратность отображаемого числа
        }
0
74 / 74 / 30
Регистрация: 22.03.2013
Сообщений: 224
10.02.2014, 20:40 12
В общем насколько я знаю массивы в c# шарпе это объекты. Когда вы передаете массив в метод, то делается копия только указателя, так что просто пишем
C#
1
void SomeFunc(byte[] b){}
0
0 / 0 / 0
Регистрация: 29.01.2014
Сообщений: 9
13.02.2014, 19:58  [ТС] 13
Подскажите ещё момент.
Вот в этом коде, открывается диалог для сохранения данных из listView. Данные реально сохраняются
только в файле button4.txt (в папке проекта). А в файле, который я выбираю в диалоге - ничего нет!!!
Как же таГ???
Как это победить?

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
        private void button4_Click(object sender, EventArgs e)
        {
            //MessageBox.Show("Это кнопка для сохранения принятых данных");
 
            Stream myStream;
            SaveFileDialog saveFileDialog1 = new SaveFileDialog();
 
            saveFileDialog1.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
            saveFileDialog1.FilterIndex = 2;
            saveFileDialog1.RestoreDirectory = true;
 
            if (saveFileDialog1.ShowDialog() == DialogResult.OK)
            {
                var sb = new StringBuilder();
                foreach (ListViewItem str in listView1.Items)
                    sb.AppendLine(str.Text);
                System.IO.File.WriteAllText("button4.txt", sb.ToString());
 
                if ((myStream = saveFileDialog1.OpenFile()) != null)
                {
                    // Code to write the stream goes here.
 
                    myStream.Close();
                }
            }
0
434 / 299 / 82
Регистрация: 11.12.2010
Сообщений: 1,209
13.02.2014, 20:08 14
C#
1
 System.IO.File.WriteAllText("button4.txt", sb.ToString())
Замени на
C#
1
 System.IO.File.WriteAllText(saveFileDialog1.FileName, sb.ToString())
Добавлено через 5 минут
А в обще зачем вам myStream если вы его негде не используете. Ведь сей час можно сократить.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
                using (var saveFileDialog1 = new SaveFileDialog
                {
                    Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*",
                    FilterIndex = 2,
                    RestoreDirectory = true  
                })
                {
                    if (saveFileDialog1.ShowDialog() == DialogResult.OK)
                    {
                        var sb = new StringBuilder();
                        foreach (ListViewItem str in listView1.Items)
                            sb.AppendLine(str.Text);
                        System.IO.File.WriteAllText("button4.txt", sb.ToString());
                    }
                }
1
0 / 0 / 0
Регистрация: 29.01.2014
Сообщений: 9
14.02.2014, 17:35  [ТС] 15
Заменил - результат тот же... Пустой файл

Добавлено через 21 час 0 минут
Заработало, да не полностью... Без потока действительно работает. Но сохраняются только items
(значения первого столбца), а subitems не сохраняются.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
            SaveFileDialog saveFileDialog1 = new SaveFileDialog();
 
            saveFileDialog1.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
            saveFileDialog1.FilterIndex = 2;
            saveFileDialog1.RestoreDirectory = true;
 
            if (saveFileDialog1.ShowDialog() == DialogResult.OK)
            {
                var sb = new StringBuilder();
                foreach (ListViewItem str in listView1.Items)
                {
                    sb.AppendLine(str.Text);
                }
                System.IO.File.WriteAllText(saveFileDialog1.FileName, sb.ToString());
            }
И ещё... есть ли где-то в природе описание классов и методов (самых распространённых и используемых в написании простейших Forms)? А то как-то не могу я систематизировать знания... где что искать и в каком случае
0
434 / 299 / 82
Регистрация: 11.12.2010
Сообщений: 1,209
14.02.2014, 17:49 16
Цитата Сообщение от Вадим78 Посмотреть сообщение
а subitems не сохраняются.
C#
1
sb.AppendLine(str.Text);
Всё логично.
для этого вам надо не просто пробегать по списку но и заходить в субсписки. А пробегать и по всем его узлам.
то есть вы сей час проходите только по корневым узлам.
Цитата Сообщение от Вадим78 Посмотреть сообщение
есть ли где-то в природе описание классов и методов (самых распространённых и используемых в написании простейших Forms)
Скорее всего нет. Так как что использовать зависит от самой задачи. Универсальных элементов почти нет. (ну кроме кнопок, лейблов и текстовых полей). Остальное зависит от конкретной задачи.

Добавлено через 8 минут
C#
1
2
3
4
5
6
7
8
            foreach (ListViewItem item in listView1.Items)
            {
                 sb.AppendLine(item.Text);
                foreach (ListViewItem.ListViewSubItem subItem in item.SubItems)
                {
                     sb.AppendLine(subItem.Text);
                }
            }
1
0 / 0 / 0
Регистрация: 29.01.2014
Сообщений: 9
14.02.2014, 19:57  [ТС] 17
О, Господи... Неужели получилось!!!
Огромное спасибо. Но всё же... вот как конкретно вы знаете, что для того, чтоб сохранить инфо в файл, нужно использовать SaveFileDialog? Например в "Уотсон К., Нейгел К., Педерсен Я.Х., Рид Дж., Скиннер М. - Visual C#2010 полный курс -2011" об этом ни слова нет...
0
434 / 299 / 82
Регистрация: 11.12.2010
Сообщений: 1,209
14.02.2014, 23:04 18
Цитата Сообщение от Вадим78 Посмотреть сообщение
О, Господи... Неужели получилось!!!
Огромное спасибо. Но всё же... вот как конкретно вы знаете, что для того, чтоб сохранить инфо в файл, нужно использовать SaveFileDialog? Например в "Уотсон К., Нейгел К., Педерсен Я.Х., Рид Дж., Скиннер М. - Visual C#2010 полный курс -2011" об этом ни слова нет...
Так есть компонент с таким именем. На *панели элементов*->"Диалоговые окна". Когда в своё время просматривал список всех элементов обратил внимание
0
14.02.2014, 23:04
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.02.2014, 23:04
Помогаю со студенческими работами здесь

Указатель на массив
Добрый день, перекомпилирую код с С++ под С# и столкнулся с такой проблемой: в С++ можно просто...

Указатель на ступенчатый массив
Доброго времени суток. Я с указателями на C# не работал, так что мало что о них знаю, прошу сильно...

Если в класс нужно передать указатель на указатель на массив строк неизвестной длинны?
Как проинициализировать массив строк wchar_t * (произвольного размера) , если его нужно передать в...

Передать в dll указатель на массив
У меня есть DLL которая записывает массив в файл Для этого ей нужно передать указатель на этот...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru