Форум программистов, компьютерный форум, киберфорум
Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
 Аватар для vlisp
1062 / 983 / 153
Регистрация: 10.08.2015
Сообщений: 5,342

Freebasic. Как объявить массив строк?

07.07.2018, 01:08. Показов 1918. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как на фб написать:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
const ModalResultStr: array[mrNone..mrLast] of shortstring = (
    'mrNone',
    'mrOk',
    'mrCancel',
    'mrAbort',
    'mrRetry',
    'mrIgnore',
    'mrYes',
    'mrNo',
    'mrAll',
    'mrNoToAll',
    'mrYesToAll',
    'mrClose');
?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.07.2018, 01:08
Ответы с готовыми решениями:

Объявить массив rs из 5 строк как двумерный символьный массив
Объявить массив rs из 5 строк как двумерный символьный массив. Инициализировать rs значениями “un”, “une”, “des”, “de”. char rs =...

Как правильно объявить массив строк c++
Подскажите пожалуйста, как реализовать: нужно корректно обьявить массив символов(неполучается) (точнее массив строк), который прога будет...

Как объявить массив строк и как к нему обращаться?
Как объявить массив строк и как к нему обращаться? Гугл сказал, что объявить так: char s А как обращаться, я не нашел/

19
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
07.07.2018, 03:11
Для юникодных строк и однобайтных:
PureBasic
1
2
3
4
5
6
7
8
Const Item1 = "asd"
Const Item2 = "dfv"
 
Dim Vector1(1) As WString Ptr = {@Item1, @Item2}
 
Dim Vector2(1) As WString Ptr = {@"irfjoeijr", @"dlkfmvld"}
 
Dim Vector3(1) As String = {"dfvdfv", "dfvdfv"}
0
 Аватар для vlisp
1062 / 983 / 153
Регистрация: 10.08.2015
Сообщений: 5,342
07.07.2018, 10:02  [ТС]
Цитата Сообщение от Замабувараев Посмотреть сообщение
Dim Vector1
так ведь задаются переменные? а мне нужно чтоб эта была константа
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
07.07.2018, 12:20
Цитата Сообщение от vlisp Посмотреть сообщение
а мне нужно чтоб эта была константа
Через Dim объявляются константные массивы, которые нельзя переопределить.
0
 Аватар для vlisp
1062 / 983 / 153
Регистрация: 10.08.2015
Сообщений: 5,342
07.07.2018, 15:31  [ТС]
Цитата Сообщение от Замабувараев Посмотреть сообщение
Через Dim объявляются константные массивы, которые нельзя переопределить.
но изменить элементы массива можно?
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
07.07.2018, 17:06
Чтобы было нельзя перезаписывать элементы в массиве — такого нет.

Но можно пойти другим путём: выделить требуемую память через VirtualAlloc, записать туда данные, затем наложить защиту ReadOnly на эту память. Пример:

PureBasic
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
#ifndef unicode
#define unicode
#endif
 
#include once "windows.bi"
 
Const ArrayLength As Integer = 1024
Const MaxAllocateMemoryLength As Integer = ArrayLength * SizeOf(WString)
 
' Выделить память под массив для чтения и записи
Dim wVector As WString Ptr Ptr = VirtualAlloc(0, MaxAllocateMemoryLength, MEM_COMMIT Or MEM_RESERVE, PAGE_READWRITE)
 
If wVector = 0 Then
    Print "Не могу выделить память"
    End 1
End If
 
' Заполнить элементы массива
wVector[0] = @"Привет, мир"
wVector[1] = @"Что это?"
 
' Наложить защиту «Только чтение» на память
wVector = VirtualAlloc(wVector, MaxAllocateMemoryLength, MEM_COMMIT, PAGE_READONLY)
 
If wVector = 0 Then
    Print "Не могу изменить защиту памяти"
    End 2
End If
 
' При попытке записи программа упадёт
wVector[0] = @"Это не сработает"
 
' Очистка
Dim bSuccess As Integer = VirtualFree(wVector, 0, MEM_RELEASE)
0
126 / 53 / 1
Регистрация: 26.10.2012
Сообщений: 89
08.07.2018, 15:31
Цитата Сообщение от Замабувараев Посмотреть сообщение
Чтобы было нельзя перезаписывать элементы в массиве — такого нет.
Почему нет? Вот так можно:

PureBasic
1
Dim Vector(1) As Const String = {"dfvdfv", "aaaaaaa"}
1
 Аватар для vlisp
1062 / 983 / 153
Регистрация: 10.08.2015
Сообщений: 5,342
08.07.2018, 17:30  [ТС]
Цитата Сообщение от stabud Посмотреть сообщение
Вот так можно:
В таком случае сам Vector можно заставить ссылаться на другие данные или он неизменяем?
0
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
09.07.2018, 11:43
Цитата Сообщение от vlisp Посмотреть сообщение
В таком случае сам Vector можно заставить ссылаться на другие данные или он неизменяем?
Скорее всего это решение на уровне компилятора. Т.е. переопределить чисто теоретически - можно.

PureBasic
1
Dim Vector(1) As Const String = {"dfvdfv", "aaaaaaa"}
=

Assembler
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
    .intel_syntax noprefix
 
.section .text
.balign 16
_fb_ctor__blabla:
push ebp
mov ebp, esp
sub esp, 56
.Lt_0002:
lea eax, [ebp-24]
mov dword ptr [ebp-56], eax
lea eax, [ebp-24]
mov dword ptr [ebp-52], eax
mov dword ptr [ebp-48], 24
mov dword ptr [ebp-44], 12
mov dword ptr [ebp-40], 1
mov dword ptr [ebp-36], 2
mov dword ptr [ebp-32], 0
mov dword ptr [ebp-28], 1
push 0
push 7
push offset _Lt_0005
push -1
lea eax, [ebp-24]
push eax
call _fb_StrInit@20
push 0
push 8
push offset _Lt_0006
push -1
lea eax, [ebp-12]
push eax
call _fb_StrInit@20
lea eax, [ebp-56]
push eax
call _fb_ArrayDestructStr@4
.Lt_0003:
mov esp, ebp
pop ebp
ret
 
.section .data
.balign 4
_Lt_0005:   .ascii  "dfvdfv\0"
.balign 4
_Lt_0006:   .ascii  "aaaaaaa\0"
 
.section .ctors
.int _fb_ctor__blabla
По коду понятно только то, что оно лежит в секции данных, и инициализируется функцией _fb_StrInit@20.
Какие атрибуты у этой секции данных - фиг его знает. У кого отладчик под рукой загоните туда *.exe-шник
и посмотрите.
0
Эксперт по электронике
6557 / 3185 / 334
Регистрация: 28.10.2011
Сообщений: 12,457
Записей в блоге: 7
09.07.2018, 12:16
Т. е. создается массив и в него копируются строки из секции data? Логичнее было бы создать массив указателей на строки в data секции. Это потребовало бы меньше памяти и меньше заняло бы времени на инициализацию.
1
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
09.07.2018, 15:51
Цитата Сообщение от vlisp Посмотреть сообщение
В таком случае сам Vector можно заставить ссылаться на другие данные или он неизменяем?
Данные, куда указывают элементы массива, могут лежать в страницах памяти, имеющих атрибут защиты ReadOnly.
Сам массив на момент его инициализации должен быть на страницах памяти ReadWrite. А после можно наложить защиту ReadOnly.
При попытке записи на страницы с атрибутом ReadOnly процессор генерирует прерывание, которое перехватывает операционная система и завершает зарвавшийся процесс.

Из режима ядра можно изменить атрибуты любой страницы, даже самого ядра.

Такой ответ подойдёт?
1
 Аватар для vlisp
1062 / 983 / 153
Регистрация: 10.08.2015
Сообщений: 5,342
09.07.2018, 16:01  [ТС]
Цитата Сообщение от Замабувараев Посмотреть сообщение
Такой ответ подойдёт?
Для меня это сложно. Например код на с++ не компилируется, если есть попытка изменить константный массив константных элементов. в паскале и с# можно менять элементы. во фрибейсике менять элементы нельзя,
конструкция arr1 = arr2 не работает, но константу в виде массива констант объявить не получается. в общем лабиринт
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
09.07.2018, 16:06
И если константный массив создаётся как локальная переменная, то есть в стэке потока, это значит, что у страницы памяти, где он лежит, атрибут защиты всегда ReadWrite, а то и ReadWriteExecute.

Добавлено через 2 минуты
Цитата Сообщение от vlisp Посмотреть сообщение
Например код на с++ не компилируется
Потому что это работает только на уровне исходного текста программы, но не после компиляции при выполнении.
0
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
10.07.2018, 01:59
Если не ошибаюсь, по умолчанию, секцию данных можно менять, секцию кода же нет.
В WinAPI вроде есть функции для снятия с кода протекции, но это слегка геморно.
В асмовом коде можно увидеть указатели, которые лежат в секции кода.

Вообще самое элегантное на мой взгляд решение - на уровне компилятора, не генерировать
никакого кода при попытке записи в данные массивы. Но тут судя по всему не так.

Кстати меняются сами данные - легко. При попытке втупую поменять - компилятор ругается.
PureBasic
1
2
3
4
5
6
7
DIM Vector(1) AS CONST STRING = {"dfvdfv", "aaaaaaa"}
 
DIM U AS CONST STRING PTR
U = SADD(Vector(1))
POKE U, ASC("*")
PRINT Vector(1)
SLEEP
Добавлено через 8 минут
Цитата Сообщение от locm Посмотреть сообщение
Логичнее было бы создать массив указателей на строки в data секции.
Вроде бы так и есть. Функция call _fb_StrInit@20 по идее создаёт лишь внутренние структуры.
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
10.07.2018, 09:36
Константый массив на момент выполнения программы может вообще не существовать. Компилятор вместо создания отдельной области памяти где хранятся указатели на секцию с данными может сразу же подсовывать сами данные из секции.
0
 Аватар для vlisp
1062 / 983 / 153
Регистрация: 10.08.2015
Сообщений: 5,342
10.07.2018, 10:32  [ТС]
мне как начинающему программисту нужны две вещи:
1) что бы данные в памяти нельзя было изменить
2) чтобы нельзя было заставить переменную ссылаться на другие данные
0
Эксперт по электронике
6557 / 3185 / 334
Регистрация: 28.10.2011
Сообщений: 12,457
Записей в блоге: 7
10.07.2018, 11:11
Цитата Сообщение от vlisp Посмотреть сообщение
что бы данные в памяти нельзя было изменить
Зачем?
0
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
10.07.2018, 13:15
Цитата Сообщение от vlisp Посмотреть сообщение
что бы данные в памяти нельзя было изменить
Вариант выше от Замабувараев должен подходить.

Цитата Сообщение от locm Посмотреть сообщение
Зачем?
Кстати да, зачем? Неужели шить ключи в экзешник?
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
10.07.2018, 16:24
Цитата Сообщение от Quiet Snow Посмотреть сообщение
Неужели шить ключи в экзешник?
Экзешник всегда можно отредактировать не запуская его.
А вот если античит, против читера, который правит память после запуска, то да, может пригодиться.
0
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
10.07.2018, 16:35
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Экзешник всегда можно отредактировать не запуская его.
Ну как бы да про это и речь. Потому вопрос в силе.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.07.2018, 16:35
Помогаю со студенческими работами здесь

Объявить массив? Запросто! Объявить массив массивов? А как это?
Доброго времени суток! Конечно, все знают, как объявить массив! int main () { int array; }

Объявить массив строк из n элементов по m символов в каждом
как обьявить строковый массив, чтобы в каждом элементе было m символов и массив состоял из n элементов???

Объявить массив mb как массив литерных указателей без указания количества элементов
Помогите решить такую задачу: Объявить массив mb как массив литерных указателей без указания количества элементов; инициализировать...

FreeBasic.Дана матрица целых чисел X(n,m) Упорядочить ее строки по возрастанию последних элементов строк
Помогите решить пожалуйста. Желательно побыстрее Дана матрица целых чисел X(n,m). Упорядочить ее строки по возрастанию последних...

Как объявить символьный массив и числовой массив?
Как объявить символьный массив и числовой массив? И как символ записать в символьный массив и как символ записать в числовой массив?


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru