PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » PureBasic для Windows » Не работает код


Не работает код

Сообщений 1 страница 30 из 30

1

Код:
LABEL_START:

InputFileName$    = OpenFileRequester("Выберите файл для кодирования.", "","|*.*|", 0)
If  FileSize(InputFileName$)  < 1
  MessageRequester("Кодер.",  "Файл '" + GetFilePart(InputFileName$)  + "' не найден или нулевого размера.")
  End
EndIf

LABEL_SAVEFILE:
  OutputFileName$ = SaveFileRequester("Выберите результирующее имя файла.", "", "|*.*|",  0)
  If  FileSize(OutputFileName$) > -1
    If  MessageRequester("Кодер.",  "Файл назначения '" +  GetFilePart(OutputFileName$) + " 'уже существует. Перезаписать?",  #PB_MessageRequester_YesNo)  = #PB_MessageRequester_No
      Goto  LABEL_SAVEFILE
    EndIf
  EndIf
  
If  OutputFileName$ = ""
  End
EndIf

InputFile   = ReadFile(#PB_Any, InputFileName$)
If  InputFile   = 0
  MessageRequester("Кодер.",  "Невозможно открыть файл '" + GetFilePart(InputFileName$) + "' для чтения.")
  End
EndIf

OutputFile  = CreateFile(#PB_Any, OutputFileName$)
If  OutputFile  = 0
  MessageRequester("Кодер.",  "Невозможно создать файл '" + GetFilePart(OutputFileName$) + "' для записи.")
  End
EndIf

InputFileSize = Lof(InputFile)
*InputBuffer = AllocateMemory(InputFileSize)
If  *InputBuffer = 0
  MessageRequester("Кодер.",  "Невозможно выделить память для чтения входного файла.")
  End
EndIf

ReadData(InputFile, *InputBuffer,  InputFileSize)

OutputFileSize  = InputFileSize + SizeOf(Byte)

*OutputBuffer.Ascii = AllocateMemory(OutputFileSize)
If  *OutputBuffer = 0
  MessageRequester("Кодер.",  "Невозможно выделить память для записи результата.")
  End
EndIf

*FirstPointer.Ascii       = *InputBuffer
*SecondPointer.Ascii  = *InputBuffer + InputFileSize - SizeOf(Byte)

*ResultPointer.Ascii  = *OutputBuffer + SizeOf(Byte)

Repeat
  Select  State
    Case  0
      *ResultPointer\a = *FirstPointer\a
      *FirstPointer + SizeOf(Byte)
    Case 1
      *ResultPointer\a = *SecondPointer\a
      *SecondPointer  - SizeOf(Byte)
  EndSelect
  
  If  *FirstPointer = *SecondPointer
    *ResultPointer\a = *FirstPointer\a
    *OutputBuffer\a = State
    Break
  EndIf
  
  State = ~State
  
ForEver

WriteData(OutputFile, *OutputBuffer,  OutputFileSize)

FreeMemory(*InputBuffer)
FreeMemory(*OutputBuffer)
CloseFile(InputFile)
CloseFile(OutputFile)

If  MessageRequester("Кодер.",  "Ещё?", #PB_MessageRequester_YesNo) = #PB_MessageRequester_Yes
  Goto  LABEL_START
EndIf
End 0

По указателям не пашет - забивает нулями и всё.

0

2

State = ~State

Что это, отрицание нуля? Отрицание нуля даёт минус единицу, а не единицу.

0

3

0/1

Код:
State = Bool(Not State)

0/-1

Код:
State = ~State

Тогда "Case 1" заменить на "Case -1"

Ещё ситуация

Код:
If  *FirstPointer = *SecondPointer

выше над этим кодом в одной идет вычитание в другой прибавление и они должны сойтись, но существует условие при котором допустим в одном шаге цикла значения будут 6-5 в другом 5-6, то есть при чётном или нечётном числе ситуация будет бесконечной, пока указатель не выйдет за пределы программы. Может тут надо сравнения *FirstPointer > *SecondPointer или проверять делиться ли размер на 2 без остатка.

Отредактировано AZJIO (14.04.2024 10:28:31)

0

4

Ну тут типа оптимальный код. Я щас попробую ваще через Not, но у меня работало как то я сам удивлялска как, пока запись файла не перевёл на память и сброс памяти на диск.

0

5

Я даже написал

Код:
  If  State = 0
    State = 1
  Else
    State = 0
  EndIf

Так в результирующем файле - нули. Не пашет ваще и последняя версия пурика.

0

6

А чему должен быть равен State перед входом в цикл?
Не вижу, что бы переменная была инициализирована.

0

7

PSY написал(а):

Я даже написал

А зачем усложнять?

Код:
EnableExplicit
DisableDebugger

Define StartTime, i, State, t1, t2

StartTime = ElapsedMilliseconds()
For i = 0 To 100000000
	If  State = 0
    State = 1
	Else
    State = 0
	EndIf
Next
t1 = ElapsedMilliseconds() - StartTime


StartTime = ElapsedMilliseconds()
For i = 0 To 100000000
	State = Bool(Not State)
Next
t2 = ElapsedMilliseconds() - StartTime

EnableDebugger
Debug t1
Debug t2

Работает практически одинаково по скорости. "If" теоретически неявно выполняет Bool(), ему же надо получить логический результат подвыражения. И раз уж на то пошло, то излишнее приравнивание, можно без него

Код:
If State
	State = 0
Else
	State = 1
EndIf

Когда у State два состояния 0/1, то "Select" тут не выгоден, так как он 2 раза сравнивает. "If" делает одно сравнение.

Код:
State = -1
If State
	Debug #True
Else
	Debug #False
EndIf

То есть "Select" выполняет как бы вот такую конструкцию:

Код:
If State = 1
	Debug #True
ElseIf State = 0
	Debug #False
EndIf

Отредактировано AZJIO (14.04.2024 14:00:50)

0

8

"Select" тут не выгоден, так как он 2 раза сравнивает. "If" делает одно сравнение.

Оптимизатор же убирает все лишние сравнения.

0

9

Зачем вы все усложняете?
State=1-State.

0

10

egons
При условии что State не может быть например 32. Бывает поиск возвратил позицию 32, а тебе надо нашёл/не_нашёл. Хотя переключатель в таком плане не используется, но ещё пример: читается ini-файл, а там юзер решил поиграть и вместо 1 пишет 32 и посмотреть что будет.

0

11

AZJIO написал(а):

egons
При условии что State не может быть например 32. Бывает поиск возвратил позицию 32, а тебе надо нашёл/не_нашёл. Хотя переключатель в таком плане не используется, но ещё пример: читается ini-файл, а там юзер решил поиграть и вместо 1 пишет 32 и посмотреть что будет.

Логичный подход или пример высосан из пальца) А если некто внесет в .ini неверные данные? Это надо учитывать.

0

12

Да мне не категорична скорость тут, чё вы тут насчёт State, тут со времён версии LTS перестали работать указатели как надо, а при написании интепретатора своего и использовании вызово графики двухмерной - передаются извне значения, даже на них бы сработало, но происходит ошибка достпуа к памяти. Вы лучше скжаите  - почему нули пишутся. Я беру хоть фотку хоть видео - прогоняю через программу и в итоге нули там только.

0

13

С указателями, всё как было прекрасно, так и осталось.
А вот, что там в вашем цикле делается мне в голову не лезет.
Возьмите листок в клетку и хотя бы на 5 клетках покажите что собирались получить.

Код:
EnableExplicit

Define *InputBuffer.Ascii
Define *OutputBuffer.Ascii

Define *FirstPointer.Ascii
Define *SecondPointer.Ascii

*InputBuffer = AllocateMemory(100) 
FillMemory(*InputBuffer, 100, 1,  #PB_Ascii)

*OutputBuffer = AllocateMemory(100 + 1)
FillMemory(*OutputBuffer, 101, 0,  #PB_Ascii)

Define i
*FirstPointer = *InputBuffer
*SecondPointer = *OutputBuffer
For i = 0 To 100
	
	*SecondPointer\a = *FirstPointer\a
	
	*FirstPointer    = *InputBuffer + i
	*SecondPointer   = *OutputBuffer + i
	
Next	

ShowMemoryViewer(*OutputBuffer, 101)

FreeMemory(*InputBuffer)
FreeMemory(*OutputBuffer)

Отредактировано useful (15.04.2024 06:46:49)

0

14

Тут уже ранее говорилось о том что есть два указателя с начала и конца информации и мне надо их поочерёдно свести к середине при это записывая "лесенкой" (чередованием) информацию.

0

15

PSY написал(а):

Тут уже ранее говорилось о том что есть два указателя с начала и конца информации и мне надо их поочерёдно свести к середине при это записывая "лесенкой" (чередованием) информацию.

Очевидно же, что вы этого не делаете.
Хотите разобраться, покажите на 5 ячейках что хотите получить. Без указателей на двух массивах например.

PSY написал(а):

Тут уже ранее говорилось

В этой веткке не вижу. Код у вас не работает. Нужна помощь, пишите что хотели сделать.
На массивах с чётным (6 элементов) и с не чётным (5 элементов)  покажите и всё встанет на свои места.

p.s. то, что проблема не в указателях, а в алгоритме ОЧЕВИДНО.
p.p.s вообще без циклов с явными индексами для 5 и 6 элементов покажите.

==============
Или ещё проще покажите желаемый результат для строки 12345 и для строки 123456

Отредактировано useful (15.04.2024 10:30:30)

0

16

Уважаемый, вы походу не понимаете как работать с указателями. У меня там два указателя на начало и конец ифнормации и они сходятся в середину информации. Мне не нужны массивы, это долго. А сходятся они чередованием нуля и единицы переменной State, в зависимости от которой увеличивается первый указатель или уменьшается второй. Так как они с начала и конца информации соответственно, то они стремятся к середине. Когда происходит пересечние значений указаелей (они равны) то есть наступает условная середина и мы пишем значение памяти из любого указателя. Я могу привести пример с ExamineDerectory где обзвон директории не работает вообще. Хотя там простой цикл на одной самовызывающей процедуре. Я откатился до версии 5.70 (только такую нашёл) и там тот же глюк.

0

17

Моему первому указателю 45 лет. Откуда мне уметь то?

useful написал(а):

Или ещё проще покажите желаемый результат для строки 12345 и для строки 123456

ответ ждать? Или таки "сами с усами"?

Отредактировано useful (15.04.2024 10:53:04)

0

18

Мне лень чё-то доказывать на основе строк - вон врубите прорамму мою, напишите файл 12345 и там в выходном файле должна быть та информация, которую я хочу, но увы - кроме записи пустого буфера памяти там ничего нет.

0

19

Смешной вы человек! )))

*FirstPointer + SizeOf(Byte) есть
*SecondPointer  - SizeOf(Byte) есть

А где

*ResultPointer + SizeOf(Byte)

что бы там хоть что то менялось кроме первого байта.
Если всё время писать в один и тот же байт памяти то тут однозначно указатели ВИНОВАТЫ )))

Но это не отменяет моего вопроса по поводу чётного и не чётного количества байт в исходном файле и алгоритме это учитывающем.

p.s. "Если что то делать, то что то будет". Что то восточное. :flag:
Соответственно если в буфер не писать, а ждать, что само появится, то НЕТ.

Отредактировано useful (15.04.2024 11:20:58)

0

20

Если вы не умеете разбираться в доступных алгоритмах - не вините кого-то, а для начала - изучите. Там всё оптимально и логично.  В начала файла пишется ещё и флажок State для как раз чётного и нечётного прохода.

0

21

только прохода не случилось )))

Отредактировано useful (15.04.2024 11:24:26)

0

22

Короче, я накосячил, щас исправлю.

0

23

Там нужна проверка на чётнсть ещё. Но принцип такой што могло и писаться хотя бы чё есть. Мне как это родить то если я не вижу результата хотя бы и такой работы.

0

24

Как же я скучно живу

0

25

egons написал(а):

Как же я скучно живу

Аналогично.

Но "давайте не будем ему мешать, а просто понаблюдаем" (с) Николай Дроздов.

0

26

Код:
*ResultPointer + SizeOf(Byte) ;- *ResultPointer нужно увеличивать при каждой итерации 
...
State = Bool(Not State) ;- чтобы было 0 или 1

Рабочий вариант исходя из логики первого поста:

Код:
LABEL_START:

InputFileName$    = OpenFileRequester("Выберите файл для кодирования.", "","|*.*|", 0)
If  FileSize(InputFileName$)  < 1
  MessageRequester("Кодер.",  "Файл '" + GetFilePart(InputFileName$)  + "' не найден или нулевого размера.")
  End
EndIf

LABEL_SAVEFILE:
  OutputFileName$ = SaveFileRequester("Выберите результирующее имя файла.", "", "|*.*|",  0)
  If  FileSize(OutputFileName$) > -1
    If  MessageRequester("Кодер.",  "Файл назначения '" +  GetFilePart(OutputFileName$) + " 'уже существует. Перезаписать?",  #PB_MessageRequester_YesNo)  = #PB_MessageRequester_No
      Goto  LABEL_SAVEFILE
    EndIf
  EndIf
  
If  OutputFileName$ = ""
  End
EndIf

InputFile   = ReadFile(#PB_Any, InputFileName$)
If  InputFile   = 0
  MessageRequester("Кодер.",  "Невозможно открыть файл '" + GetFilePart(InputFileName$) + "' для чтения.")
  End
EndIf

OutputFile  = CreateFile(#PB_Any, OutputFileName$)
If  OutputFile  = 0
  MessageRequester("Кодер.",  "Невозможно создать файл '" + GetFilePart(OutputFileName$) + "' для записи.")
  End
EndIf

InputFileSize = Lof(InputFile)
*InputBuffer = AllocateMemory(InputFileSize)
If  *InputBuffer = 0
  MessageRequester("Кодер.",  "Невозможно выделить память для чтения входного файла.")
  End
EndIf

ReadData(InputFile, *InputBuffer,  InputFileSize)

OutputFileSize  = InputFileSize + SizeOf(Byte)

*OutputBuffer.Ascii = AllocateMemory(OutputFileSize)
If  *OutputBuffer = 0
  MessageRequester("Кодер.",  "Невозможно выделить память для записи результата.")
  End
EndIf

*FirstPointer.Ascii  = *InputBuffer
*SecondPointer.Ascii = *InputBuffer + InputFileSize - SizeOf(Byte)

*ResultPointer.Ascii = *OutputBuffer + SizeOf(Byte)

Repeat

  Select State
    Case  0
      *ResultPointer\a = *FirstPointer\a
      *FirstPointer + SizeOf(Byte)
    Case 1
      *ResultPointer\a = *SecondPointer\a
      *SecondPointer  - SizeOf(Byte)
  EndSelect

  *ResultPointer + SizeOf(Byte) ;- *ResultPointer нужно увеличивать при каждой итерации
  
  If  *FirstPointer = *SecondPointer
    *ResultPointer\a = *FirstPointer\a
    *OutputBuffer\a = State
    Break
  EndIf
  
  State = Bool(Not State) ;- чтобы было 0 или 1
  
ForEver

WriteData(OutputFile, *OutputBuffer,  OutputFileSize)

FreeMemory(*InputBuffer)
FreeMemory(*OutputBuffer)
CloseFile(InputFile)
CloseFile(OutputFile)

If  MessageRequester("Кодер.",  "Ещё?", #PB_MessageRequester_YesNo) = #PB_MessageRequester_Yes
  Goto  LABEL_START
EndIf
End 0

Отредактировано Webarion (15.04.2024 23:29:56)

0

27

Код:
*ResultPointer + SizeOf(Byte) ;- *ResultPointer нужно увеличивать при каждой итерации 
...
State = Bool(Not State) ;- чтобы было 0 или 1

Про это автору всё уже написали ранее, он же не читает, я вообще иногда думаю, что это бот.

Webarion написал(а):

Рабочий вариант исходя из логики первого поста:

И какова же по вашему логика на примере двух вариантов исходного массива "12345" и "123456"? Что ожидается в финале?

Не добившись ответа на этот вопрос всё бессмысленно.

Отредактировано useful (15.04.2024 19:48:31)

0

28

useful написал(а):

И какова же по вашему логика на примере двух вариантов исходного массива "12345" и "123456"? Что ожидается в финале?

При чётном количестве, например 123456, выход: первый байт=0, далее:  "162534"
При нечётном, 12345, выход: первый байт=1, далее:  "15243"

Программа первого поста написана именно так, за вычетом двух ошибок.

useful написал(а):

я вообще иногда думаю, что это бот.

Да и пусть... Если есть у меня время и интерес на этот пост или код, я посмотрю и отвечу. Нет такой возможности, я и отвечать не буду. А какие там изначальные намерения, это проблемы точно не мои.

Отредактировано Webarion (15.04.2024 22:59:20)

0

29

я и говорю - я тут накосячил. у меня вылетело при копировании сюда. у меня то собирало сначало файл - а потом и у меня вылетело. теперь свтоит попробовать то что выйдет из этого.

0

30

PSY написал(а):

я и говорю - я тут накосячил. у меня вылетело при копировании сюда. у меня то собирало сначало файл - а потом и у меня вылетело. теперь свтоит попробовать то что выйдет из этого.

Также обратите внимание, что при той конструкции, которую вы предложили — *ResultPointer + SizeOf(Byte), обязательно должно быть до If *FirstPointer = *SecondPointer, так как это необходимо и для последней записи внутри условия выхода из цикла. Расположение State = Bool(Not State), до или после этого условия зависит от того, что вам нужно, чтобы было в выдаче первого байта, в зависимости от чётного или нечётного рабочего размера файла.

0


Вы здесь » PureBasic - форум » PureBasic для Windows » Не работает код