CyberForum.ru - Форум программистов и сисадминов
Вернуться   Форум программистов и сисадминов CyberForum.ru > Форум программистов > Форум Delphi

Ответ Создать новую тему
 
Старый 01.02.2012, 12:39   #1
Sophos
Форумчанин
 
Аватар для Sophos
 
Регистрация: 04.01.2010
Сообщений: 177
Репутация: 81 (58)
По умолчанию Расположение элементов двумерного массива в памяти

Приветствую!

Задача: создать модуль ведения логов.
Задача была выполнена, но в процессе добавления дополнительных возможностей я столкнулся с некоторой трудностью. В данный момент я пишу вывод табличных данным в лог по элементам двумерного массива:

Код Delphi
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
Procedure WriteLogTable(Const Line : String; Var FirstElem : Integer; W, H : Integer); OverLoad;
Var
 S : String;
 Empty : String;
 HeaderFooter : String;
 P : PInteger;
 I : Integer;
 J : Integer;
Begin
 Empty := '';
 HeaderFooter := '';
 For J := 0 to W - 1 do
  HeaderFooter := HeaderFooter + '+-------------';
 HeaderFooter := HeaderFooter + '+';
 For J := 0 To Length(Line) do
  Empty := Empty + ' ';
 _WriteLog(Empty + ' ' + HeaderFooter, 0, FALSE, 0.0, TRUE, FALSE, FALSE, FALSE);
 
 P := @FirstElem;
 For I := 0 To H - 1 Do
  Begin
   S := '';
   For J := 0 to W - 1 do
    Begin
     S := S + ' | ';
     If Integer(P^) < 0 Then S := S + IntToStr(P^, 10)
                        Else S := S + IntToStr(P^, 11);
     If J = W - 1 Then S := S + ' |';
     Inc(P);
    End;
   Inc(P, W);
   If I = 0 Then S := Line + ':' + S
            Else S := Empty + S;
   _WriteLog(S, 0, FALSE, 0.0, TRUE, FALSE, FALSE, FALSE);
  End;
 
 _WriteLog(Empty + ' ' + HeaderFooter, 0, FALSE, 0.0, TRUE, FALSE, FALSE, FALSE);
End;
Такой вариант работает с Integer, правда мне не понятно, почему следует добавлять Inc(P, W), ведь я думал, что двумерный массив располагается в памяти как одномерный, длиной W*H.

Но проблема в другом: не работает код записи Boolean :

Код Delphi
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
Procedure WriteLogTable(Const Line : String; Var FirstElem : Boolean; W, H : Integer); OverLoad;
Var
 S : String;
 Empty : String;
 HeaderFooter : String;
 P : PBoolean;
 I : Integer;
 J : Integer;
Begin
 Empty := '';
 HeaderFooter := '';
 For J := 0 to W - 1 do
  HeaderFooter := HeaderFooter + '+---';
 HeaderFooter := HeaderFooter + '+';
 For J := 0 To Length(Line) do
  Empty := Empty + ' ';
 _WriteLog(Empty + ' ' + HeaderFooter, 0, FALSE, 0.0, TRUE, FALSE, FALSE, FALSE);
 
 P := @FirstElem;
 For I := 0 To H - 1 Do
  Begin
   S := '';
   For J := 0 to W - 1 do
    Begin
     S := S + ' | ';
     S := S + IntToStr(Integer(P^),0);
     If J = W - 1 Then S := S + ' |';
     Inc(P);
    End;
   Inc(P, 10);
   If I = 0 Then S := Line + ':' + S
            Else S := Empty + S;
   _WriteLog(S, 0, FALSE, 0.0, TRUE, FALSE, FALSE, FALSE);
  End;
 
 _WriteLog(Empty + ' ' + HeaderFooter, 0, FALSE, 0.0, TRUE, FALSE, FALSE, FALSE);
End;
Причем работает он выборочно - в зависимости от ширины массива. Если Ширина равна 3, то Inc(P) в после каждой строки приходится делать на 13 байт, если 4, то на 12, 5 - 11 и т.д.

Вопрос - почему так?
Sophos вне форума
Другие темы раздела
Вывод текста в программе Delphi
Здравствуйте. Мне требуется создать программу клавиатурный тренажёр. Я примерно знаю как вывести одну букву требуемую для нажатия, но как вывести всё слово или несколько слов и желательно, чтоб подсвечивалась нужная буква?. Вывод текста в программе
Delphi только начало, а что дальше? Delphi
В общем встал очень интересный вопрос. Я студент, еще много не понимаю. И так перейдем к делу. За 5 лет учебы в университете я получаю квалификации "инженер по информационным технологиям" выучиваю более 5-ти языков (Assembler Win32, MS Visual C++, MS Visual Basic, Borland Delphi, Borland C++.... Delphi только начало, а что дальше?
Старый 03.02.2012, 13:17   #21
murderer
Форумчанин
 
Регистрация: 06.10.2010
Сообщений: 1,519
Репутация: 848 (756)
По умолчанию Re: Расположение элементов двумерного массива в памяти

спасибо. А как получить границы образа?
Сначала выходим на заголовок MZ через GetModuleHandle(0) (ЕМНИП это даже не обязательно - в delphi есть глобальная переменная HInstance). Оттуда находим PE-заголовок - там всё есть.

Добавлено через 5 минут
Может быть передавать массив через Variant?
murderer вне форума
Старый 03.02.2012, 13:27   #22
Mawrat
Модератор
 
Регистрация: 19.09.2009
Адрес: г. Самара
Сообщений: 5,104
Репутация: 7196 (3078)
По умолчанию Re: Расположение элементов двумерного массива в памяти

Цитата Сообщение от murderer Посмотреть сообщение
Может быть передавать массив через Variant?
Через Variant можно передавать вариантные массивы. Судя по условию, это здесь не подойдёт, видимо...
Mawrat вне форума
Старый 03.02.2012, 15:21   #23
murderer
Форумчанин
 
Регистрация: 06.10.2010
Сообщений: 1,519
Репутация: 848 (756)
По умолчанию Re: Расположение элементов двумерного массива в памяти

Может быть пригодится
Код Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function GetVarDestination(x: pointer): string;
var
mbi: MEMORY_BASIC_INFORMATION;
begin
  if (dword(x)>HInstance)and(dword(x)<HInstance+pdword(HInstance+pdword(HInstance+60)^+80)^) then
    result:='Глобальная переменная'
  else
  begin
    VirtualQuery(@x,mbi,sizeof(mbi));
    if (dword(x)>dword(mbi.AllocationBase))and(dword(x)<dword(mbi.AllocationBase)+pdword(HInstance+pdword(HInstance+60)^+96)^) then
      result:='Локальная переменная'
    else
      result:='Динамическая переменная';
  end;
end;
Поясню смещения
60 - поле OffsetToPEHeader заголовка MZ
80 - поле ImageSize заголовка PE
96 - поле StackReserveSize заголовка PE
murderer вне форума
Старый 03.02.2012, 15:31   #24
Mawrat
Модератор
 
Регистрация: 19.09.2009
Адрес: г. Самара
Сообщений: 5,104
Репутация: 7196 (3078)
По умолчанию Re: Расположение элементов двумерного массива в памяти

Цитата Сообщение от murderer Посмотреть сообщение
Может быть пригодится
Спасибо! Да - полезный код.
Mawrat вне форума
После регистрации реклама в сообщениях будет скрыта
Старый 03.02.2012, 15:35   #25
murderer
Форумчанин
 
Регистрация: 06.10.2010
Сообщений: 1,519
Репутация: 848 (756)
По умолчанию Re: Расположение элементов двумерного массива в памяти

Насчёт определения локальной переменной не уверен, возможно не правильно.
murderer вне форума
Ответ Создать новую тему

Похожие темы
Тема Автор
С++ для начинающих Динамическое выделение памяти для двумерного массива
нужна помощь вот тело программы, не могу сделать динамическое выделение памяти для первого двумерного массива. второй массив получается через среднее арифметического строк первого, после сортируется. Ошибка "Run-Time Check Failure #3 - The variable 'i' is being used without being initialized" ...
Captain_ru
С++ для начинающих Выделение динамической памяти для двумерного массива.
#include <iostream> int main() { setlocale( LC_ALL,"Russian" ); int N, M; std::cout << "Введите кол-во строк в массиве: "; std::cin >> N; std::cout << "Введите кол-во столбцов в массиве: ";
neske
C для начинающих С. Динамическое выделение памяти для двумерного массива
Здравствуйте! В следующей программе я пытаюсь выделить динамически память для двумерного массива. Размерности массива задаются в качестве аргументов командной строки. В процессе выполнения программы вылетает исключение. Не подскажите, где моя ошибка? #include <stdio.h> #include <stdlib.h>...
PMike
Pascal (Паскаль) Как располагаются в памяти элементы одномерного массива? Двумерного массива?
1. Дайте определение массива. 2. В каком разделе (разделах) программы допустимо описание данных типа массив? 3. Какие типы данных недопустимы для компонентов массива? Какие допустимы? 4. Дайте определение индекса. Какие типы данных можно использовать при описании индекса? 5. Какой массив...
Гаичка
Pascal (Паскаль) Освобождение памяти из под двумерного массива
Привет всем. Помогите справиться с такой вот проблемой: Есть динамический массив следующего вида: TypeTVector = Array of integer; TArray = Array of ^TVector; TArrayPtr = ^TArray;var inPArr:TArrayPtr;Подскажите, пожалуйста как правильно освободить память. Пробовал такой алгоритмfor i:=1...
hunter128
Опции темы

Текущее время: 01:38. Часовой пояс GMT +4.

Компьютерный форум программистов и сисадминов
Powered by vBulletin® Version 3.8.7 PL2
Copyright ©2000 - 2012, vBulletin Solutions, Inc.
Рейтинг@Mail.ru Яндекс.Метрика