Страница: 1 | 2 | 3 | 
		
		 
			   
			 
			 
			 
			 
			
 
  
		
     
  
    
Вопрос: Копия строки ?
     
    
Добавлено: 22.12.08 22:17
     
      
  
				
			  
					 
			
				 
    
		
       
    
Автор вопроса:  
    
 Lapex
      
       
  
Доброе время суток!
 
    
Имеется функция, на вход которой передается указатель на строку ASCIIZ. Функция должна произвести манипуляции со строкой и вернуть указатель на измененную строку, при этом оригинальная строка не должна измениться.
Я так понимаю, чтобы не портить оригинальную строку - мне нужно создать копию строки и работать с этой копией, но к сожалению я не доконца понимаю механизм создания копии строки в памяти.
  LOCAL lpDest AS ASCIIZ PTR
  LOCAL nLen AS LONG
  nLen = LEN(@lpSource) + 1
  CopyMemory BYVAL lpDest,  BYVAL lpSource, BYVAL nLen ' ???
... 
Этот код вызывает ошибку: "Память не может быть Writetten".
Возможно моя идея изначально не верна, пожалуйста подскажите, что нужно для моего случая. 
				
		
		
					 
			
				 
  
		
     
  
    
Ответы
     
    
Всего ответов: 37
     
      
  
		
	  
			 
	
		 
    
       
    
Номер ответа: 1 
      
Автор ответа:
 Father
![]()
![]()
Вопросов: 0
Ответов: 159
      
 Профиль |  | #1
       
Добавлено:  22.12.08 23:14
       
    
       
  
Идея верна, только память в байтах выделить надо.
 
    
		
	  
			 
	
		 
    
       
    
Номер ответа: 2 
      
Автор ответа:
 Lapex
![]()
![]()
![]()
![]()
![]()
![]()
Вопросов: 6
Ответов: 56
      
 Профиль |  | #2
       
Добавлено:  22.12.08 23:33
       
    
       
  
Спасибо огромное! То, что нужно!
 
    
		
	  
			 
	
		 
    
       
    
Номер ответа: 3 
      
Автор ответа:
 alex
![]()
![]()
![]()
![]()
![]()
Вопросов: 84
Ответов: 453
      
 Профиль |  | #3
       
Добавлено:  23.12.08 12:56
       
    
       
  
CopyMemory - очень медленная API функция. Для копирования строк лучше использовать операторы PEEK и POKE, они сразу компилируюся в ассемблерные инструкции и работают намного быстрее.
 
    
		
	  
			 
	
		 
    
       
    
Номер ответа: 4 
      
Автор ответа:
 Lapex
![]()
![]()
![]()
![]()
![]()
![]()
Вопросов: 6
Ответов: 56
      
 Профиль |  | #4
       
Добавлено:  23.12.08 15:52
       
    
       
  
Спасибо!
 
    
Заменил: 
на:
Работает!
		
	  
			 
	
		 
    
       
    
Номер ответа: 5 
      
Автор ответа:
 Lapex
![]()
![]()
![]()
![]()
![]()
![]()
Вопросов: 6
Ответов: 56
      
 Профиль |  | #5
       
Добавлено:  25.12.08 09:52
       
    
       
  
У меня еще один вопрос, по копированию строки в памяти.
 
    
При копировании ASCIIZ-строк большой длины (больше 32Мб)- копия строки обрезается до 32Мб (33554432 байт), что это за магическое число, размер страницы памяти? и возможно ли перепрыгнуть этот барьер или лучше этого не делать? 
		
	  
			 
	
		 
    
       
    
Номер ответа: 6 
      
Автор ответа:
 Lapex
![]()
![]()
![]()
![]()
![]()
![]()
Вопросов: 6
Ответов: 56
      
 Профиль |  | #6
       
Добавлено:  25.12.08 12:26
       
    
       
  
Мда, поторопился я, скорее всего дело не в процессе копирования строки. Оказывается, что в переданном в функцию указателе - строка уже имеет обрезанный размер?!  
    
 
		
	  
			 
	
		 
    
       
    
Номер ответа: 7 
      
Автор ответа:
 Lapex
![]()
![]()
![]()
![]()
![]()
![]()
Вопросов: 6
Ответов: 56
      
 Профиль |  | #7
       
Добавлено:  25.12.08 14:22
       
    
       
  
Вообщем я понял, что ограничение на длину строки наложил тип ASCIIZ (max=33554432 байт), получается, если в параметре передан указатель на строку c размером выше 32Mb - я никак не смогу обработать эту строку?
 
    
		
	  
			 
	
		 
    
       
    
Номер ответа: 8 
      
Автор ответа:
 Father
![]()
![]()
Вопросов: 0
Ответов: 159
      
 Профиль |  | #8
       
Добавлено:  25.12.08 14:54
       
    
       
  
Инструкция по эксплуатции PB:
 
    
STATIC и GLOBAL  строки ASCIIZ могут быть вплоть до 16,777,216 байтов.
Хочешь больше - просто объявляй массив байт.
		
	  
			 
	
		 
    
       
    
Номер ответа: 9 
      
Автор ответа:
 Lapex
![]()
![]()
![]()
![]()
![]()
![]()
Вопросов: 6
Ответов: 56
      
 Профиль |  | #9
       
Добавлено:  25.12.08 16:37
       
    
       
  
Мне очень стыдно, но что-то я не соображу 
    
, если можно примерчик.
		
	  
			 
	
		 
    
       
    
Номер ответа: 10 
      
Автор ответа:
 Father
![]()
![]()
Вопросов: 0
Ответов: 159
      
 Профиль |  | #10
       
Добавлено:  26.12.08 03:08
       
    
       
  
я PB не люблю, но приблизительно так
 
    
Просто запомни, что строки это массив байт в памяти, а адрес строки (указатель) есть адрес первого по счету (нулевого) элемента массива. В каждом элементе масива хранится ASCII-код символа. Последний элемент массива - Ноль. Называется нуль-терминатором.
		
	  
			 
	
		 
    
       
    
Номер ответа: 11 
      
Автор ответа:
 Lapex
![]()
![]()
![]()
![]()
![]()
![]()
Вопросов: 6
Ответов: 56
      
 Профиль |  | #11
       
Добавлено:  26.12.08 10:51
       
    
       
  
Протестировал этот код, но к сожелению ситуация не изменилась:
 
    
И еще, я не понимаю этого:
		
	  
			 
	
		 
    
       
    
Номер ответа: 12 
      
Автор ответа:
 alex
![]()
![]()
![]()
![]()
![]()
Вопросов: 84
Ответов: 453
      
 Профиль |  | #12
       
Добавлено:  26.12.08 10:56
       
    
       
  
На надо насиловать свой мозг "массивами байт" и прочей VB-шной шизофренией. Для нормальных людей есть API функции: HeapAlloc и HeapFree. Их и используй для хранения данных
 
    
		
	  
			 
	
		 
    
       
    
Номер ответа: 13 
      
Автор ответа:
 Lapex
![]()
![]()
![]()
![]()
![]()
![]()
Вопросов: 6
Ответов: 56
      
 Профиль |  | #13
       
Добавлено:  26.12.08 11:54
       
    
       
  
Возможно я ошибаюсь, но мне кажется здесь проблема не в способе выделения буфера для данных, а в самом типе ASCIIZ. 
    
		
	  
			 
	
		 
    
       
    
Номер ответа: 14 
      
Автор ответа:
 Father
![]()
![]()
Вопросов: 0
Ответов: 159
      
 Профиль |  | #14
       
Добавлено:  26.12.08 12:21
       
    
       
  
Значит врет функция LEN.
 
    
MSGBOX STR$(lstrlen (@pszStr))
		
	  
			 
	
		 
    
       
    
Номер ответа: 15 
      
Автор ответа:
 Lapex
![]()
![]()
![]()
![]()
![]()
![]()
Вопросов: 6
Ответов: 56
      
 Профиль |  | #15
       
Добавлено:  26.12.08 12:42
       
    
       
  
Ух ты, а ведь действительно LEN врет.
 
    
Спасибо!