Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.94
ABTOP
36 / 36 / 2
Регистрация: 09.06.2008
Сообщений: 324
#1

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

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

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

И как извлечь число начиная с пятого байта?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.03.2009, 19:25     Функция, которая принимает буфер памяти
Посмотрите здесь:

Функция которая принимает целое беззнаковое число. C++
Функция которая принимает любой класс C++
Функция не принимает значение C++
C++ Функция F1, которая не принимает и не возвращает значений, но выводит на экран любое сообщение
C++ Функция не принимает аргументы
Функция не принимает параметр C++
C++ Функция не принимает 5 аргументов
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Mecid
678 / 227 / 4
Регистрация: 15.10.2007
Сообщений: 1,247
05.03.2009, 19:57     Функция, которая принимает буфер памяти #2
C
1
long f(char *p){}
объявление функции принимающей буфер памяти
Night_Light
17 / 17 / 2
Регистрация: 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.
CheshireCat
Эксперт С++
2891 / 1240 / 78
Регистрация: 27.05.2008
Сообщений: 3,345
05.03.2009, 21:43     Функция, которая принимает буфер памяти #4
Нет. Стандарт, 5.3.3/1 гласит, что "sizeof(char), sizeof(signed char) and sizeof(unsigned char) are 1; ...."
Humanitis
172 / 164 / 6
Регистрация: 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);
}
ABTOP
36 / 36 / 2
Регистрация: 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 секунд
мдя... что-то не хочет код цытироваться...
Humanitis
172 / 164 / 6
Регистрация: 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 байта.
Все конечно зависит,от компилятора.
А может я ошибаюсь
ABTOP
36 / 36 / 2
Регистрация: 09.06.2008
Сообщений: 324
07.03.2009, 21:00  [ТС]     Функция, которая принимает буфер памяти #8
Цитата Сообщение от Humanitis Посмотреть сообщение
Не понял,что вы имели ввиду.
я зделал так... нахожу начало 5го байта стуктуры и начинаю читать но если число маленькое не в конце диапазона то программа крашиться потмоу что этот бит отсутствует...
Humanitis
172 / 164 / 6
Регистрация: 12.01.2009
Сообщений: 430
07.03.2009, 22:52     Функция, которая принимает буфер памяти #9
Э,может я конечно туплю последнее время. Но число любого типа будет занимать одно и тоже количество байт в памяти,независимо от своей величины
ABTOP
36 / 36 / 2
Регистрация: 09.06.2008
Сообщений: 324
08.03.2009, 21:38  [ТС]     Функция, которая принимает буфер памяти #10
Цитата Сообщение от Humanitis Посмотреть сообщение
Э,может я конечно туплю последнее время. Но число любого типа будет занимать одно и тоже количество байт в памяти,независимо от своей величины
Я с тобой согласен, а компилятор нет... Программа крашитсья и всё...
ISergey
Maniac
Эксперт С++
1347 / 880 / 52
Регистрация: 02.01.2009
Сообщений: 2,645
Записей в блоге: 1
09.03.2009, 04:07     Функция, которая принимает буфер памяти #11
Цитата Сообщение от CheshireCat Посмотреть сообщение
Нет. Стандарт, 5.3.3/1 гласит, что "sizeof(char), sizeof(signed char) and sizeof(unsigned char) are 1; ...."
Блин не по теме, но дай ссылку на "Стандарт"(если есть на русском)
ABTOP
36 / 36 / 2
Регистрация: 09.06.2008
Сообщений: 324
09.03.2009, 21:08  [ТС]     Функция, которая принимает буфер памяти #12
Как на С/С++ изменить значение адреса. Конкретнее на примере:
получаю адресс 0x0013FF78 и мне надо изменить а точнее прибавить к текущему значению 4 байта.. как это зделать?
Vourhey
Почетный модератор
6474 / 2249 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
09.03.2009, 22:17     Функция, которая принимает буфер памяти #13
0x0013FF78+4
ABTOP
36 / 36 / 2
Регистрация: 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 *.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.03.2009, 23:24     Функция, которая принимает буфер памяти
Еще ссылки по теме:

Функция не принимает 0 аргументов C++
Функция, которая на вход принимает строку и в качестве результата возвращает ее копию C++
функция, которая принимает высоту треугольника и выводит на экран прямоугольный треугольник C++
функция, которая принимает радиус окружности и рисует окружность из звездочек C++
C++ Как правильно заполнить буфер памяти?

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

Или воспользуйтесь поиском по форуму:
Mecid
678 / 227 / 4
Регистрация: 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;
};
Yandex
Объявления
09.03.2009, 23:24     Функция, которая принимает буфер памяти
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru