36 / 36 / 4
Регистрация: 09.06.2008
Сообщений: 324
1

Функция, которая принимает буфер памяти

05.03.2009, 19:25. Показов 2591. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Код
Напишите функцию, которая принимает буфер памяти и возвращает число long. 
Известно, что передается некая структура и число, которое нужно извлечь, 
начинается с пятого байта.
Подскажите пожалуйста как зделать функцию, которая принимает буфер памяти... Хотя бы алгоритм или вспомагающие функции.

И как извлечь число начиная с пятого байта?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.03.2009, 19:25
Ответы с готовыми решениями:

Функция которая принимает событие компонента как параметр
У меня вот такой вопрос. Как я могу передать в функцию ,как параметр, событие и присвоить его...

Функция которая принимает в себя 3 числа
Доброе время суток, подскажите как сделать такой пример Описать функцию, которая принимает в...

Функция которая принимает любой класс
Здравствуйте программисты читаю книгу,и тут столкнулся с проблемой : void prins(int...

функция которая принимает указатель на массив структур
Привет нужна статическая функция которая принимает указатель на массив так вот в функции func...

14
683 / 232 / 16
Регистрация: 15.10.2007
Сообщений: 1,247
05.03.2009, 19:57 2
C
1
long f(char *p){}
объявление функции принимающей буфер памяти
0
17 / 17 / 0
Регистрация: 14.02.2009
Сообщений: 86
05.03.2009, 20:00 3
Цитата Сообщение от ABTOP Посмотреть сообщение
Код
Напишите функцию, которая принимает буфер памяти и возвращает число long. 
Известно, что передается некая структура и число, которое нужно извлечь, 
начинается с пятого байта.
Подскажите пожалуйста как зделать функцию, которая принимает буфер памяти... Хотя бы алгоритм или вспомагающие функции.

И как извлечь число начиная с пятого байта?
"Некую структуру" тебе скорее всего надо передавать в виде указателя на void. А чтобы получить указатель на 5 байт - можно попробовать прикастить void* к char*, у которого 5 байт можно получить обратившись к 5 элементу через индекс.

вот пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
 
void main()
{
    std::cout<< sizeof(char)<<std::endl;
    std::cout<< sizeof("AAaab")<<std::endl;
 
    const char mas[] = "AAaabddddddc";
    void* ptr = (void*)mas;
    char* charVar = (char*)ptr;
    std::cout<< charVar[4] <<std::endl;
}
как видно на консоле - размер sizeof("AAaab") равен 5 + 1 байт ( 1 - это конец строки). а обращение к charVar[4] выводит символ b.
Проблема только в том, что размер char в 1 байт кажется не документирован. я пробовал на VS 2003.
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
05.03.2009, 21:43 4
Нет. Стандарт, 5.3.3/1 гласит, что "sizeof(char), sizeof(signed char) and sizeof(unsigned char) are 1; ...."
0
176 / 168 / 27
Регистрация: 12.01.2009
Сообщений: 430
05.03.2009, 23:22 5
C++
1
2
3
4
5
long five(void* ptr)
{
    unsigned long lptr=5+unsigned long(ptr);
    return *((long*)lptr);
}
1
36 / 36 / 4
Регистрация: 09.06.2008
Сообщений: 324
07.03.2009, 15:55  [ТС] 6
Цитата Сообщение от Humanitis Посмотреть сообщение

Код C++
  1. <LI style="BACKGROUND: #ffffff">long five(void* ptr)<LI style="BACKGROUND: #f8f8f8">{<LI style="BACKGROUND: #ffffff">****unsigned long lptr=5+unsigned long(ptr);<LI style="BACKGROUND: #f8f8f8">****return *((long*)lptr);
  2. }

чесно говоря не думал что void* a принимает буфер памяти...


Цитата Сообщение от Humanitis Посмотреть сообщение

Код C++
  1. <LI style="BACKGROUND: #ffffff">long five(void* ptr)<LI style="BACKGROUND: #f8f8f8">{<LI style="BACKGROUND: #ffffff">****unsigned long lptr=5+unsigned long(ptr);<LI style="BACKGROUND: #f8f8f8">****return *((long*)lptr);
  2. }
идея конечно хорошая но как оно будет принимать начиная с 6 байта если я введу очень маленьное значение например 14.31 то оно будет крашиться.

передается некая структура и число - вот эта строка меня вводит в ступор.

может надо работать с буфером обмена?

Добавлено через 1 минуту 25 секунд
мдя... что-то не хочет код цытироваться...
0
176 / 168 / 27
Регистрация: 12.01.2009
Сообщений: 430
07.03.2009, 16:36 7
идея конечно хорошая но как оно будет принимать начиная с 6 байта если я введу очень маленьное значение например 14.31 то оно будет крашиться.
Не понял,что вы имели ввиду.
передается некая структура и число - вот эта строка меня вводит в ступор.
На самом деле звучит так
Известно, что передается некая структура. Число, которое нужно извлечь,
начинается с пятого байта.

например
C++
1
2
3
4
5
6
struct test
{
int *a;
long b;
 
};
При расположении структуры в памяти, число b будет расположенно начиная с 5 байта.
Все конечно зависит,от компилятора.
А может я ошибаюсь
0
36 / 36 / 4
Регистрация: 09.06.2008
Сообщений: 324
07.03.2009, 21:00  [ТС] 8
Цитата Сообщение от Humanitis Посмотреть сообщение
Не понял,что вы имели ввиду.
я зделал так... нахожу начало 5го байта стуктуры и начинаю читать но если число маленькое не в конце диапазона то программа крашиться потмоу что этот бит отсутствует...
0
176 / 168 / 27
Регистрация: 12.01.2009
Сообщений: 430
07.03.2009, 22:52 9
Э,может я конечно туплю последнее время. Но число любого типа будет занимать одно и тоже количество байт в памяти,независимо от своей величины
0
36 / 36 / 4
Регистрация: 09.06.2008
Сообщений: 324
08.03.2009, 21:38  [ТС] 10
Цитата Сообщение от Humanitis Посмотреть сообщение
Э,может я конечно туплю последнее время. Но число любого типа будет занимать одно и тоже количество байт в памяти,независимо от своей величины
Я с тобой согласен, а компилятор нет... Программа крашитсья и всё...
0
Maniac
Эксперт С++
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
09.03.2009, 04:07 11
Цитата Сообщение от CheshireCat Посмотреть сообщение
Нет. Стандарт, 5.3.3/1 гласит, что "sizeof(char), sizeof(signed char) and sizeof(unsigned char) are 1; ...."
Блин не по теме, но дай ссылку на "Стандарт"(если есть на русском)
0
36 / 36 / 4
Регистрация: 09.06.2008
Сообщений: 324
09.03.2009, 21:08  [ТС] 12
Как на С/С++ изменить значение адреса. Конкретнее на примере:
получаю адресс 0x0013FF78 и мне надо изменить а точнее прибавить к текущему значению 4 байта.. как это зделать?
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
09.03.2009, 22:17 13
0x0013FF78+4
0
36 / 36 / 4
Регистрация: 09.06.2008
Сообщений: 324
09.03.2009, 23:00  [ТС] 14
Цитата Сообщение от Vourhey Посмотреть сообщение
0x0013FF78+4
C
1
2
3
4
5
void f(void *v)
{
long *p= (v+0x5);
cout<<v<<" + 5 = "<<p<<endl;
};
а так оно не хочет работать ... Говорит что неизвестен размер void *.
0
683 / 232 / 16
Регистрация: 15.10.2007
Сообщений: 1,247
09.03.2009, 23:24 15
Цитата Сообщение от ABTOP Посмотреть сообщение
а так оно не хочет работать ... Говорит что неизвестен размер void *
c типом void * не допускаются матем вычисления
для начала
C
1
2
3
4
5
void f(void *v)
{
long *p= (long*)((unsigned char*)v+0x5);
cout<<v<<" + 5 = "<<p<<endl;
};
1
09.03.2009, 23:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.03.2009, 23:24
Помогаю со студенческими работами здесь

Функция которая принимает целое беззнаковое число.
Вообщем надо написать функцию которая принимает целое беззнаковое число и возвращает true, если...

функция, которая принимает радиус окружности и рисует окружность из звездочек
Напишите функцию, которая принимает радиус окружности и рисует окружность из звездочек:wall:

Функция которая принимает вектор указателей на числа и возвращает их сумму
Напиши ф-цию, которая принимает вектор указателей на unsigned long, складывает все числа, и...

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


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

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

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