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

Как сдвинуть указатель на double на 4 байта? - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Структура в структуре http://www.cyberforum.ru/cpp-beginners/thread638711.html
Подскажите пожалуйста! Вот для начала немного кода: struct r2 { // ... }; struct somestruct { struct r2; // ... };
C++ Как вписать в переменную текст, размер которой превышает 4096 байтов написал скрипт , который сохрянает введенный текст в файл . и я смотрю , кайдый файл 4096 байтов . как решить проблему ? #include <iostream> using namespace std; main() { FILE * fo; fo = fopen("D:\\vagaa\\pop.txt","wt"); char text; cin.getline(text, 1024); http://www.cyberforum.ru/cpp-beginners/thread638698.html
Неопределенный массив C++
Как мне задать массив в котором может быть любое количество информации. То есть изначально она не известна. Я буду из файла в этот массив заносить символы и их количество может меняться...
C++ Что использовать с указателями? 0, NULL, nullptr?
NULL в WinDef.h описан как #define NULL 0. То есть в случае использования как с указателями, так и другими переменными разницы 0. Про nullptr только час назад узнал, даёт ли он какие-либо реальные преимущества? Но, вообщем-то, главный вопрос: что использовать?
C++ Упрощение кода http://www.cyberforum.ru/cpp-beginners/thread638678.html
Можно ли как нибудь сократить или упростить код? cin>>answer; if ((answer!="y") && (answer!="n")) { while ((answer!="y") && (answer!="n")) { cout<<"Введите верное значение: "; cin>>answer; }
C++ Как создать полноценное приложение на WinApi с различными элементами (textbox.) подскажите книгу Как создать полноценное приложение на WinApi с различными элементами(checkbox, textbox, button и тд) и как обрабатывать события от них, подскажите книгу. подробнее

Показать сообщение отдельно
alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.08.2012, 01:47  [ТС]     Как сдвинуть указатель на double на 4 байта?
Дают вот такие примеры к заданию:
Код
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
double ** ConstructArray()
{
double ** p=NULL;
int N, M; // количество строк, элементов в строке
// вводим корректное количество строк
do
{
printf("\nProgram makes an array of N rows.\n");
printf("Please, enter N (1<=N<=10): ");
scanf("%d", &N);
}while(N<1 || N>10);
// выделяем память
p=(double **)malloc( sizeof(double *)*N + sizeof(int));
 
// запоминаем в «минус первом» элемент вектора указателя на строки
((int *)p)[0]=N;
// сдвигаем указатель
((int *)p)++;
// Организуем построчный ввод
for(int i=0; i<N; i++)
{/
/ вводим корректное количество элементов в строке
do
{
printf("\nEnter M - number of elements in %d-th row (1<=M<=10): ", i);
scanf("%d", &M);
}while(M<1 || M>10);
// выделяем память
p[i]=(double *)malloc( M*sizeof(double) + sizeof(int));
// записываем в -1 элемент
((int *)(p[i]))[0]=M;
// сдвигаем указатель
((int *)(p[i]))++;                          // ВОТ это никак не делается!!!
for(int j=0; j<M; j++) // вводим элементы
{
double m;
do
{
printf("\nEnter A[%d][%d] (1<=A[%d][%d]<=10): ", i, j, i, j);
scanf("%lf", &m);
}while(m<1 || m>10);
p[i][j]=m;
}
}return p; // вернуть указатель на сконструированный массив
}
И как это сделать (33 строка)?

Добавлено через 1 минуту
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Эм, ну можно сделать (double*)((int*)(*p)++), тогда *p, он же p[0], сдвинется на размер одного int, а потом преобразуется обратно в double*. Не, не прокатит по идее. ++ требует lvalue, а приведение возвращает rvalue.

Проблема в том, что у вас int четыре байта, а у кого-то другого он может быть равен двум. Или восьми. Потому-то и говорю, что с этим шаманством надо поаккуратнее.
По заданию, нужно именно на int сдвинуть. Это я вопрос так задал.

Добавлено через 8 минут
Там идея такая (упрощая), что создаётся динамический массив размером на несколько double и один int. В начало массива записывается int, потом указатель сдвигается на величину int и записываются значения double.

Добавлено через 8 минут
Вот так проходит: (double*)((int*)(*p) + 1); Через инкремент - никак.
 
Текущее время: 18:31. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru